Package: pyelmer
pyelmerProject descriptionThe pyelmer package provides a simple object-oriented way to set upElmer FEMsimulations from python.Some utility-functions for pre-processing using thegmsh python API, execution of ElmerGrid and ElmerSolver, and some post-processing routines are provided.Prerequisitespyelmer requires Python >= 3.7. To run simulations, an Elmer executable is needed. As pyelmer was developed to be used with gmsh, an installation of this package is required (even though it may also be used without gmsh). Simulation settings, solver, and materials are stored in yaml-files. Therefore pyelmer depends on pyyaml. Furthermore, matplotlib is used for visualization.The required packages should be installed automatically when installing pyelmer. If you encounter any problems, try to run:pipinstall--upgradegmsh
pipinstall--upgradepyyaml
pipinstall--upgradematplotlibInstallationYou can install pyelmer using pip:pipinstallpyelmerBasic principlesThe basic working principle of pyelmer is the representation of sif-file entries in dictionaries. Each section of the sif-file is represented by instances of the classesSolverEquationMaterialBodyBoundaryComponentBodyForceInitialConditionThe parameters of e.g. a material are stored inmaterial.data={'Density':1.1885,'Heat Capacity':1006.4,'Heat Conductivity':0.025873}An object of the classSimulationis used to manage all members of the sif-file:importpyelmer.elmeraselmer# simulation objectsim=elmer.Simulation()# create material and add it to simair=elmer.Material(sim,'air')air.data={# material data here}# add solvers, equations, bodies, ...heat_solver=elmer.Solver(sim,'heat')heat_solver.data={# solver data here}# ...# write sif-filesim.write_sif('./simulation_directory/')ExamplesThe following example shows the setup of a simple heat transfer simulation. The domain consists of two quadratic bodies stacked on top of each other, the lower one is water and the upper one is air. At the bottom a constant temperature of 80°C, and at the top a constant temperature of 20°C is set. You may consider this as a very simple model of the heat distribution when boiling water in a pot:The example uses the OpenCASCADE geometry kernel of gmsh. Note, that you may also use the build-in "geo-style" kernel in python. Alternatively, it is also possible to manually set the body-ids of the mesh created with the tool of your choice.importosimportgmshfrompyelmerimportelmerfrompyelmerimportexecutefrompyelmer.postimportscan_logfilefromobjectgmshimportadd_physical_group,get_boundaries_in_box################ set up working directorysim_dir="./simdata"ifnotos.path.exists(sim_dir):os.mkdir(sim_dir)################ geometry modeling using gmshgmsh.initialize()gmsh.option.setNumber("General.Terminal",1)gmsh.model.add("heat-transfer-2d")factory=gmsh.model.occ# main bodieswater=factory.addRectangle(0,0,0,1,1)air=factory.addRectangle(0,1,0,1,1)# create connection between the two bodiesfactory.synchronize()factory.fragment([(2,water)],[(2,air)])# add physical groupsfactory.synchronize()ph_water=add_physical_group(2,[water],"water")ph_air=add_physical_group(2,[air],"air")# detect boundariesline=get_boundaries_in_box(0,0,0,1,0,0,2,water)ph_bottom=add_physical_group(1,[line],"bottom")line=get_boundaries_in_box(0,2,0,1,2,0,2,air)ph_top=add_physical_group(1,[line],"top")# create meshgmsh.model.mesh.setSize(gmsh.model.getEntities(0),0.1)gmsh.model.mesh.generate(2)# show mesh & exportgmsh.fltk.run()# comment this line out if your system doesn't support the gmsh GUIgmsh.write(sim_dir+"/case.msh")################ elmer setupelmer.data_dir="./data"sim=elmer.load_simulation("2D_steady")air=elmer.load_material("air",sim)water=elmer.load_material("water",sim)solver_heat=elmer.load_solver("HeatSolver",sim)solver_output=elmer.load_solver("ResultOutputSolver",sim)eqn=elmer.Equation(sim,"main",[solver_heat])T0=elmer.InitialCondition(sim,"T0",{"Temperature":273.15})bdy_water=elmer.Body(sim,"water",[ph_water])bdy_water.material=waterbdy_water.initial_condition=T0bdy_water.equation=eqnbdy_air=elmer.Body(sim,"air",[ph_air])bdy_air.material=airbdy_air.initial_condition=T0bdy_air.equation=eqnbndry_bottom=elmer.Boundary(sim,"bottom",[ph_bottom])bndry_bottom.data.update({"Temperature":353.15})# 80 °Cbndry_top=elmer.Boundary(sim,"top",[ph_top])bndry_top.data.update({"Temperature":293.15})# 20 °Csim.write_startinfo(sim_dir)sim.write_sif(sim_dir)############### execute ElmerGrid & ElmerSolverexecute.run_elmer_grid(sim_dir,"case.msh")execute.run_elmer_solver(sim_dir)################ scan log for errors and warningserr,warn,stats=scan_logfile(sim_dir)print("Errors:",err)print("Warnings:",warn)print("Statistics:",stats)The pre-defined materials and solvers can be found in the directory pyelmer/examples/2D_heat_transfer/data. An alternative version of this example, without using the pre-defined materials and solvers, can be found in the examples folder.Advanced examplesAdditional examples can be found on GitHub in the examples directory:Simplified 2D crystal growth3D Electrostatic CapacitanceGeometry generationSome utility functions for the geometry generation with gmsh are provided in pyelmer/gmsh.py (e.g. add_physical_group, get_boundaries_in_box used in the example). An advanced object-oriente gmsh interface using the OpenCASCADE kernel, which facilitates the detection of the boundaries is used in crystal_growth_2d.py.Note, that it may also be worth tryingpygmsh, which is build on top of the rather complicatedgmsh python APIused in this example.Video tutorialsThere are two video tutorial on pyelmer (using deprecated solver-specific keywords):Heating up waterCrystal growthA presentation from the elmer webinar series (using these two examples) can be foundhere.Backward compatibilityIn earlier versions of pyelmer solver-specific keywords were used, for maintainability reasons these are not included any longer. For the old implementation with solver-specific keywords use:importpyelmer.elmerkwaselmer# instead of# from pyelmer import elmerDocumentationTo get an overview of the program have a look atpyelmer's Read the Docs page. In case of questions please open an issue!Licensepyelmer is published under theGPLv3 license.ReferencingIf you use pyelmer in your research, we would be grateful if you cite us using the information providedhere.AcknowledgementsThis projecthas received funding from the European Research Council (ERC) under the European Union's Horizon 2020 research and innovation programme (grant agreement No 851768).ContributionAny help to improve this package is very welcome!