Feel++ Toolboxes in Python
1. Getting started with toolboxes in Python
Feel++ toolboxes are availabe as python modules. The following toolboxes are available:
Toolbox |
Python Module |
fluid mechanics |
feelpp.toolboxes.fluid |
heat transfert |
feelpp.toolboxes.heat |
solid mechanics |
feelpp.toolboxes.solid |
electric |
feelpp.toolboxes.electric |
hdg |
feelpp.toolboxes.hdg |
The following example shows how to use the fluid toolbox in python: We start with import feelpp, the heat toolboxes and start feelpp environment.
import feelpp
from feelpp.toolboxes.core import *
from feelpp.toolboxes.heat import *
app = feelpp.Environment(["myapp"], opts= toolboxes_options("heat"),config=feelpp.localRepository("")) (1)
1 | The first argument is the name of the application, the second argument is the directory below feelppdb that will be created in the current directory. The directory will contain the results of the simulation. |
Then we continue with the definition of the model and the heat toolbox.
case=feelpp.download( "github:{repo:feelpp,path:toolboxes/heat/cases/Building/ThermalBridgesENISO10211/", worldComm=app.worldCommPtr() )[0] (1)
casedfile=case+'/case2.cfg'
feelpp.Environment.setConfigFile(casefile) (2)
f = heat(dim=2, order=1) (3)
if not f.isStationary(): (4)
f.setTimeFinal(10*f.timeStep())
[ok,meas]=simulate(f) (5)
f.checkResults() (6)
1 | Download the case from the feelpp repository |
2 | Set the configuration file |
3 | Create the heat toolbox in 2D with order 1 finite elements |
4 | If the model is not stationary, set the final time to 10 times the time step |
5 | Simulate the model |
6 | Check the results |
Details
heat(2,1) [modelProperties] Loading Model Properties : "/scratch/jupyter/feelppdb/downloads/ThermalBridgesENISO10211/case2.json" 0 heat KSP Residual norm 1.812720e+03 1 heat KSP Residual norm 9.989990e-10 +--------------------------------------------------------------------------------------------------------------------------------+ | Checkers : heat | +--------------------------------------------------------------------------------------------------------------------------------+ | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | check | name | measure | reference | error | tolerance | | | +===========+====================================================+==============+==============+==============+==============+ | | | [success] | Normal_Heat_Flux_bottom | 9.317351e+00 | 9.500000e+00 | 1.960305e-02 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointA_field_temperature | 7.067795e+00 | 7.100000e+00 | 4.556565e-03 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointB_field_temperature | 7.612815e-01 | 8.000000e-01 | 5.085967e-02 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointC_field_temperature | 7.900707e+00 | 7.900000e+00 | 8.954821e-05 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointD_field_temperature | 6.278234e+00 | 6.300000e+00 | 3.466902e-03 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointE_field_temperature | 8.274854e-01 | 8.000000e-01 | 3.435681e-02 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointF_field_temperature | 1.640809e+01 | 1.640000e+01 | 4.935425e-04 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointG_field_temperature | 1.633449e+01 | 1.630000e+01 | 2.116074e-03 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointH_field_temperature | 1.676604e+01 | 1.680000e+01 | 2.025570e-03 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Points_pointI_field_temperature | 1.833338e+01 | 1.830000e+01 | 1.824001e-03 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Statistics_CheckGeneric_Heat-Flux_top_integrate | 2.046351e-03 | 0.000000e+00 | 2.046351e-03 | 5.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Statistics_CheckGeneric_Heat-Flux_bottom_integrate | 1.775801e-01 | 0.000000e+00 | 1.775801e-01 | 5.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Statistics_Check_Heat-Flux_bottom_integrate | 1.775801e-01 | 0.000000e+00 | 1.775801e-01 | 5.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Statistics_Check_Heat-Flux_top_integrate | 2.046351e-03 | 0.000000e+00 | 2.046351e-03 | 5.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Statistics_Inward-Heat-Flux_V2_bottom_integrate | 9.317351e+00 | 9.500000e+00 | 1.960305e-02 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | | | [success] | Statistics_Inward-Heat-Flux_bottom_integrate | 9.494932e+00 | 9.500000e+00 | 5.338099e-04 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | +--------------------------------------------------------------------------------------------------------------------------------+ +--------------------------------------------------------------------------------------------------------------------------------+ ... | | [success] | Statistics_Inward-Heat-Flux_bottom_integrate | 9.494932e+00 | 9.500000e+00 | 5.338099e-04 | 1.000000e-01 | | | +-----------+----------------------------------------------------+--------------+--------------+--------------+--------------+ | +--------------------------------------------------------------------------------------------------------------------------------+
if ok: (1)
meas = f.postProcessMeasures().values() (2)
try:
import pandas as pd
df=pd.DataFrame([meas]) (3)
print(df)
except ImportError:
print("cannot import pandas, no problem it was just a test")
else:
print("error during simulation, cannot proceed with data analysis")
1 | Check if the simulation was successful |
2 | Get the measures |
3 | Print the measures in a pandas dataframe |
Results
Normal_Heat_Flux_bottom Points_pointA_field_temperature \ 0 9.317351 7.067795 Points_pointB_field_temperature Points_pointC_field_temperature \ 0 0.761281 7.900707 Points_pointD_field_temperature Points_pointE_field_temperature \ 0 6.278234 0.827485 Points_pointF_field_temperature Points_pointG_field_temperature \ 0 16.408094 16.334492 Points_pointH_field_temperature Points_pointI_field_temperature \ 0 16.766039 18.333379 Statistics_CheckGeneric_Heat-Flux_bottom_integrate \ 0 0.17758 Statistics_CheckGeneric_Heat-Flux_top_integrate \ 0 0.002046 Statistics_Check_Heat-Flux_bottom_integrate \ 0 0.17758 Statistics_Check_Heat-Flux_top_integrate \ 0 0.002046 Statistics_Inward-Heat-Flux_V2_bottom_integrate \ 0 9.317351 Statistics_Inward-Heat-Flux_bottom_integrate 0 9.494932
2. The Simulate function
The function simulate
takes any toolbox as input and simulate it. The function returns a tuple with a boolean and a dictionary. The boolean is true if the simulation was successful and the dictionary contains the measures.
Here is the implementation of the function simulate
:
has_tqdm = False
try:
from tqdm import tqdm
has_tqdm = True
except ImportError:
pass
def simulate(toolbox, export=True, buildModelAlgebraicFactory=True, data=None, verbose=0):
"""simulate a toolbox
simulate execute the toolbox in steady or transient case and export the results
Parameters:
toolbox -- a toolbox which has been configured
Returns:
a tuple (status,results) where status is a boolean(True if success, False otherwise) and results is a dictionary provided by the PostProcessing step
Example::
fppc.Environment.setConfigFile('toolboxs/laplace/l-shape/l-shape.cfg')
toolbox = toolboxs.toolboxs(dim=2)
[success,measures]=simulate(toolbox)
import pandas as pd
df = pd.DataFrame(measures)
print(df.head())
"""
toolbox.init(buildModelAlgebraicFactory)
if verbose > 0:
toolbox.printAndSaveInfo()
meas=[]
if toolbox.isStationary():
toolbox.solve()
if export:
toolbox.exportResults()
if not toolbox.postProcessMeasures().empty():
meas.append(toolbox.postProcessMeasures().values())
else:
if not toolbox.doRestart():
toolbox.exportResults(toolbox.timeInitial())
toolbox.startTimeStep()
#while not toolbox.timeStepBase().isFinished():
if has_tqdm:
steps = tqdm(range(int(toolbox.timeStepBase().timeFinal()/toolbox.timeStepBase().timeStep())))
else:
steps = range(int(toolbox.timeStepBase().timeFinal()/toolbox.timeStepBase().timeStep()))
for step in steps:
if fppc.Environment.isMasterRank() and verbose > 0:
print("============================================================\n")
print("time simulation: {}s/{}s with step: {}".format(toolbox.time(), toolbox.timeFinal(), toolbox.timeStep()))
print("============================================================\n")
toolbox.solve()
if not toolbox.postProcessMeasures().empty():
meas.append(toolbox.postProcessMeasures().values())
if export:
toolbox.exportResults()
toolbox.updateTimeStep()
return [toolbox.checkResults(), meas]
This is one possible implementation. Feel free to propose another one. |