How should [the finite element method (FEM) framework in the language](https://www.wolfram.com/language/core-areas/finite-element-method/) be extended to be more useful? With the release of version 12.0 all fundamental FEM solvers (linear, nonlinear, stationary, transient, harmonic, parametric, eigensolver) are implemented. As many of you know I am a developer of the FEM in Mathematica. As such I do not have questions about the language or framework to ask here; my primary purpose on this site is to help you make the most of the FEM framework. However, I would like to give people on this site that are **actively using the FEM framework** a voice in what you think could be useful extensions/improvements for the framework. What are suggestions for improvement or missing functionality that you think would make your work with the FEM easier? When you write an answer, please try to be as specific as you can, possibly show code that illustrates the problem. Limit your answer to **one** item, multiple entries are of course OK. Try to be reasonable. Suggestions do not need to be complicated; it can be as simple as tutorial XYZ should have a sentence about ZZZ. With up votes given to various suggestions I will hopefully get an idea what is useful to most people and can prioritize accordingly. Also, please understand that I can not give a commitment that everything requested will/can be implemented and it may take some time before things requested actually see the light of day in the product. **Update 12.1:** I'd like to point point out additions to the FEM framework that fix or alleviate the requests put forward here. - FEM Programming tutorial extensions. Here I added more examples of how to make use of the low level functions. For example there is a new section on [Transient PDEs with Nonlinear Transient Coefficients](https://reference.wolfram.com/language/FEMDocumentation/tutorial/FiniteElementProgramming.html#675160945) with this you can model phase change for example. Another new section [Transient PDEs with Integral Coefficients](https://reference.wolfram.com/language/FEMDocumentation/tutorial/FiniteElementProgramming.html#2023832548) shows how to solve transient integral PDEs. These additions are to alleviate [this request](https://mathematica.stackexchange.com/a/199177/18437). - There is a new tutorial [NDSolve Options for Finite Elements](https://reference.wolfram.com/language/FEMDocumentation/tutorial/FiniteElementOptions.html) on all possible options for the stationary finite element solver. The time dependent options will follow in a future version. This is to alleviate [this](https://mathematica.stackexchange.com/a/199177/18437) and in particular [this](https://mathematica.stackexchange.com/a/199301/18437) request. Where the second one is not fully fulfilled because it lacks specific application examples. This will remain the case until I get customer examples that I can share. - [OpenCascaseLink](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html). The link provides an initial interface to [OpenCascade's](https://www.opencascade.com/content/overview) Computer Aided Design (CAD) engine. Among many features there is also a [new boundary mesh generator](https://reference.wolfram.com/language/FEMDocumentation/ref/ToBoundaryMesh.html#1039792269) called "OpenCascade" that works well for 3D symbolic boolean regions. It's not the default yet depending on how it behaves in the wild it may become the default in a future version. What also may be of interest is the capability to read and write some STEP files (AP203/AP214). This addition is to alleviate [this request](https://mathematica.stackexchange.com/a/199307/18437) and partially [this](https://mathematica.stackexchange.com/a/199405/18437) one. - PDE model tutorial extensions. The [PDEModels Overview](https://reference.wolfram.com/language/PDEModels/tutorial/PDEModelsOverview.html) shows the current PDE models available. We now have tutorials for [Acoustics](https://reference.wolfram.com/language/PDEModels/tutorial/PDEModelsOverview.html#662628835) and [HeatTransfer](https://reference.wolfram.com/language/PDEModels/tutorial/PDEModelsOverview.html#706049171). Additionally, there are application examples model from Acoustics, Fluid Dynamics, Heat Transfer and Multiphysics. These are long modeling examples. Also you find links to short documentation examples on this overview page. This is certainly something we will see more of in the future. These additions are to start to address [this](https://mathematica.stackexchange.com/a/199405/18437) request. - Iterative solvers. This was not explicitly requested here, but I could imagine this is of interest to some people here too. Both the [FEM Options tutorial](https://reference.wolfram.com/language/FEMDocumentation/tutorial/FiniteElementOptions.html#649434559) and the [FEM Usage Tips tutorial](https://reference.wolfram.com/language/FEMDocumentation/tutorial/FiniteElementBestPractice.html#1100428117) have sections on how to make use the iterative solvers. **Update 12.1.1:** - A new [Mass Transport PDE model tutorial](https://reference.wolfram.com/language/PDEModels/tutorial/MassTransport/MassTransport.html#509267359) has been added. Accompanying the tutorial two application examples have been added: [Microscale Simulation of Catalyst Deactivation](https://reference.wolfram.com/language/PDEModels/tutorial/MassTransport/ModelCollection/CatalystDeactivation.html) and [Catalytic Converter](https://reference.wolfram.com/language/PDEModels/tutorial/MassTransport/ModelCollection/CatalyticConverter.html) - The [OpenCascadeLink](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html) got a few updates and is [now available from the Wolfram GitHub page](https://github.com/WolframResearch/OpenCascadeLink) **Update 12.2:** - At the [Virtual Wolfram Technology conference 2020](https://www.wolfram.com/events/technology-conference/2020/) I held a FEM Meetup where I discussed questions and suggestions collected on this page. You can see the **[Video of the FEM Meetup 2020](https://vimeo.com/user24678594/review/513966021/48746ddafc)**. - We started to implement a PDE modeling framework (**Overview [Video](https://www.youtube.com/watch?v=xwTyCeX6ekI)**). The purpose of this is to make PDE setup easier. The framework consists of [basic PDE terms](https://reference.wolfram.com/language/guide/PDEModeling.html) that can be combined to more extensive 'PDE components' to make PDE models from various fields of physics. Currently implemented are [Acoustics](https://reference.wolfram.com/language/guide/AcousticPDEModels.html), [HeatTransfer](https://reference.wolfram.com/language/guide/HeatTransferPDEModels.html) and [MassTransport](https://reference.wolfram.com/language/guide/MassTransportPDEModels.html). What is new is that each of those are accompanied by area specific boundary conditions that evaluate to the proper `NeumannValue` or `DirichletCondition`. This is how something then looks like: vars = {p[t, x], t, {x}}; pars = <|"Material" -> Entity["Element", "Tungsten"]|>; AcousticPDEComponent[vars, pars] == AcousticAbsorbingValue[x == 1, vars, pars] - All in all 32 (!) new reference pages with details about the PDE terms and components. - There is a new mass transport model about [Gas Absorption](https://reference.wolfram.com/language/PDEModels/tutorial/MassTransport/ModelCollection/GasAbsorption.html) and all other PDE modeling related tutorial and monographs have been updated to make use of the PDE modeling framework and some got new sections like the [Interphase Mass Transfer](https://reference.wolfram.com/language/PDEModels/tutorial/MassTransport/MassTransport.html#157812412) - The [OpenCascadeLink](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html) got a few updates, bug fixes and documentation improvements. For example, OCL can now deal with `TransformedRegion` and got a `Torus` graphics primitive. **Update 12.3:** - The "OpenCascade" boundary mesh generator is now the default for boolean regions in 3D. - The [OpenCascadeLink](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html) has been improved and extended. Example CAD models have been added. A CAD model of [simple book shelf bracket](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/BookShelfBracket.html) and a CAD model a complicated [Helical bevel gear](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/HelicalBevelGear.html) are available. - Working with multimaterials in PDEComponents has been made easier. This now works: HeatTransferPDEComponent[{T[t, x, y], t, {x, y}}, <| "Material" -> {{y <= 1, Entity["Element", "Tungsten"]}, {y > 1, Entity["Element", "Titanium"]}}|>] - As requested in comments under [this](https://mathematica.stackexchange.com/a/235747/18437) answer, convex hull and Delaunay meshes can now also be generated `ToBoundaryMesh["Coordinates" -> pts]` and `ToElementMesh["Coordinates" -> pts]` **Update 13.0:** - The [PDE modeling framework](https://reference.wolfram.com/language/guide/PDEModeling.html) has been extended by the field of linear elastic [SolidMechanics](https://reference.wolfram.com/language/guide/SolidMechanicsPDEModels.html); There is a [SolidMechanics monograph](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/SolidMechanics.html) and a [verification notebook](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/SolidMechanicsVerificationTests.html) and a set of companion functions to set up the [SolidMechanicsPDEComponent](https://reference.wolfram.com/language/ref/SolidMechanicsPDEComponent.html), compute the [SolidMechanicsStrain](https://reference.wolfram.com/language/ref/SolidMechanicsStrain.html) and [SolidMechanicsStress](https://reference.wolfram.com/language/ref/SolidMechanicsStress.html) and boundary conditions. Here is a [recording of a Solid Mechanics presentation](https://www.youtube.com/watch?v=9Xs_Ki_HTJE). - There are two new electromagnetics models: [Single aperture scalar diffraction](https://reference.wolfram.com/language/PDEModels/tutorial/Electromagnetics/ModelCollection/SingleApertureScalarDiffraction.html) and [MultipleApertureVectorDiffraction](https://reference.wolfram.com/language/PDEModels/tutorial/Electromagnetics/ModelCollection/MultipleApertureVectorDiffraction.html) - There is the new element type [PrismElement](https://reference.wolfram.com/language/FEMDocumentation/ref/PrismElement.html) - [ElementMeshRegionProduct](https://reference.wolfram.com/language/FEMDocumentation/ref/ElementMeshRegionProduct.html) does the same as RegionProduct just for ElementMesh. - [ToGradedMesh](https://reference.wolfram.com/language/FEMDocumentation/ref/ToGradedMesh.html) generates graded (anisotropic) meshes 1D and is to be used with [ElementMeshRegionProduct](https://reference.wolfram.com/language/FEMDocumentation/ref/ElementMeshRegionProduct.html) - There is a speed improvement when using interpolating functions as PDE coefficients. If these interpolating functions are based on the same `ElementMesh` as the PDE is to be solved over, then a speed up is attained. For example running this code: mesh = ToElementMesh[Rectangle[], MaxCellMeasure -> 0.0005]; fun = ElementMeshInterpolation[mesh, Sqrt[Total[mesh["Coordinates"]^2, {2}]]]; RepeatedTiming[ sol = NDSolveValue[{-Laplacian[u[x, y], {x, y}] + fun[x, y]*u[x, y] ==1, DirichletCondition[u[x, y] == 0, x == 0]}, u, Element[{x, y}, mesh]];] Takes about 0.16 seconds with version 12.3.1 and 0.08 seconds in version 13.0. (and 0.04 seconds with the coefficient `Sqrt[x^2+y^2]`). So using interpolating functions (with the same mesh) is much more performant then before. **Update 13.1:** The [PDE modeling framework](https://reference.wolfram.com/language/guide/PDEModeling.html) has been extended further: - The linear elastic [SolidMechanics monograph](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/SolidMechanics.html) has been extended. The paragraphs added or modified are marked as such. - The [SolidMechanicsPDEComponent](https://reference.wolfram.com/language/ref/SolidMechanicsPDEComponent.html) has been extended to allow for hyperelastic material models. Specifically, a St. Venant-Kirchhoff and a neo-Hookean model have been implemented. There is a new monograph on [Hyperelasticity](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/Hyperelasticity.html) that explains how these models work and shows how to add your own models. - The [SolidMechanicsPDEComponent](https://reference.wolfram.com/language/ref/SolidMechanicsPDEComponent.html) has been extended to handle [Rayleigh Damping](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/SolidMechanics.html#371069182). - The basic xyzPDETerms and the [MassTransportPDEComponent](https://reference.wolfram.com/language/ref/MassTransportPDEComponent.html) and [HeatTransferPDEComponent](https://reference.wolfram.com/language/ref/HeatTransferPDEComponent.html) now accept a parameter `<|"RegionSymmetry"->"Axisymmetric"|>` that generates the PDE for a truncated cylindrical coordinate system to make use of axisymmetric geometries. Other xyzPDEComponents will follow suite in the next releases. - Besides the ref pages there are three new models that show case the use of this: [Spherical Capacitor](https://reference.wolfram.com/language/PDEModels/tutorial/Electromagnetics/ModelCollection/SphericalCapacitor.html), [Thermal Analysis of a Disc Brake](https://reference.wolfram.com/language/PDEModels/tutorial/HeatTransfer/ModelCollection/DiskBrake.html) and [Radial Effects in a Tubular Reactor](https://reference.wolfram.com/language/PDEModels/tutorial/Multiphysics/ModelCollection/TubularReactor.html) - There is a new multi material model: [Heat Conduction in a Multilayer Sphere](https://reference.wolfram.com/language/PDEModels/tutorial/HeatTransfer/ModelCollection/MultilayerSphereHeatTransfer.html) [ParametricFunction](https://reference.wolfram.com/language/ref/ParametricFunction.html) can now take an option during function evaluation when the FEM is used. This is useful to give the solver needs an updated initial seed to find the solution of a highly nonlinear problem. Here is a pseudo code: The parametric function is constructed as usual pfun = ParametricNDSolve[FEMModel, {u[x, ...], ..}, Element[{x, ..}, mesh], p]; Previously, one could not give an option when the pfun is evaluated and you can now. pfun[pNew, "InitialSeeding" -> {u[x, ..] == oldUSolution, ..}] This is useful for solving extremely nonlinear PDEs where the solution can not be found in one go. You can then iterate to the solution like show in the following: {uSolution, ..} = {0 &, ..}; Do[ pNew = step*pMax/nsteps; {uSolution, ..} = pfun[pNew, "InitialSeeding" -> {u[x, ..] == uSolution, ..}]; , {step, 1, nsteps, 1}] All this is explained and showcased in a section on the [Hyperleastic Material Models](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/Hyperelasticity.html#725517312). One caveat: You can not use symbolic expressions for the restart of the initial seed, as that would mess up analysis that ParametricNDSolve does when called. When you use `ClearSystemCache[]` then the FEM case will also be cleared [in some cases](https://mathematica.stackexchange.com/a/263595/18437) this can reduce the memory footprint. **Update 13.2:** One of the most important updates in 13.2 is actually a system wide improvement. Consider this code: NDSolveValue[{Laplacian[u[x, y], {x, y}] == 1}, u[x, y], {x, y} \[Element] Disk[]] [![enter image description here][1]][1] [![enter image description here][2]][2] [![enter image description here][3]][3] Note the circle-i [![enter image description here][4]][4] at the end of two of the three messages. This information link is only present **iff** the error message given has a message reference page. If you click on the circle-i, it will take you to the respective message reference page. There you will find hints for isolating and solving the issue at hand. Again, this circle-i is only issued if there is such a message ref page. This should help to better understand why NDSolve issued a message and how to fix it. Kudos go to the FrontEnd team for implementing this for me. The [PDE modeling framework](https://reference.wolfram.com/language/guide/PDEModeling.html) has been extended further: - Almost all PDEComponents and PDETerms now support "RegionSymmetry"->"Axisymmetric". The only exception is the [SolidMechanicsPDEComponent](https://reference.wolfram.com/language/ref/SolidMechanicsPDEComponent.html) which will provide "RegionSymmetry" support in the next version (13.3) - The [SolidMechanics monograph](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/SolidMechanics.html#788136181) now has a section explaining the minimal number of constraints needed for solid mechanics modeling. - The [SolidMechanicsPDEComponent](https://reference.wolfram.com/language/ref/SolidMechanicsPDEComponent.html) now supports Kirchhoff stresses. - A new acoustics model, the [Helmholtz Resonator](https://reference.wolfram.com/language/PDEModels/tutorial/Acoustics/ModelCollection/HelmholtzResonator.html) has been added. Here is a **[Video on the usage of axisymmetry and hyperelasticity](https://www.youtube.com/watch?v=UCE39PX_MCU&list=PLxn-kpJHbPx3h-ds28_c7o1ZH2umfY0kL&index=81)** A new workflow for creating finite element [meshes from elevation data](https://reference.wolfram.com/language/FEMDocumentation/tutorial/ElementMeshCreation.html#329657088) (contours) has been added. [![enter image description here][5]][5] [OpenCascadeLink](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html) has been updated to use OpenCascade 7.6.0 - now supports for [closed B-spline conversions](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html#1493296553) as long as the knots and weights are set to Automatic. - now allows for [surface mesh simplifications](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html#1602751398) (elimination of unnecessary edges and faces) after boolean options. - now allows [shape simplifications](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html#493342858) - now provides [shape healing](https://reference.wolfram.com/language/OpenCascadeLink/tutorial/UsingOpenCascadeLink.html#1954420993) capabilities **Overview presentation:** If you'd like to get a very rough overview of the FEM functionality in version 13.2 have a look at the [PDE Modeling overview talk](https://www.youtube.com/watch?v=jfU4LNv5KXY) I gave. **Update 13.3:** The [PDE modeling framework](https://reference.wolfram.com/language/guide/PDEModeling.html) has been extended further: - The [SolidMechanicsPDEComponent](https://reference.wolfram.com/language/ref/SolidMechanicsPDEComponent.html) now supports axisymmetric models. - The [SolidMechanicsPDEComponent](https://reference.wolfram.com/language/ref/SolidMechanicsPDEComponent.html) now supports the nearly incompressible Yeoh material model. The [Hyperelasticity](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/Hyperelasticity.html) monograph has been extended to explain the Yeoh model and build the infrastructure for more hyperelastic materials to be added. The following PDE model application examples have been added to the [PDEModels Overview](https://reference.wolfram.com/language/PDEModels/tutorial/PDEModelsOverview.html): - A [Passive Dew Condenser](https://reference.wolfram.com/language/PDEModels/tutorial/Multiphysics/ModelCollection/PassiveDewCondenser.html) (Fluid Dynamics + Heat Transfer) - A [Contactless Anemometer](https://reference.wolfram.com/language/PDEModels/tutorial/HeatTransfer/ModelCollection/Anemometer.html) (Heat Transfer) - A [Quantum Ring](https://reference.wolfram.com/language/PDEModels/tutorial/Physics/ModelCollection/QuantumRing.html) makes the first example in the new 'Physics' category. This section also showcases two more elaborate documentation examples: One on [Avoided Crossings](https://reference.wolfram.com/language/ref/NDEigensystem.html#1691751085) and one on [Eigenfunction clustering](https://reference.wolfram.com/language/ref/NDEigensystem.html#746193771) - In the solid mechanics domain, there is the [Biaxial Tensile Test of Hyperelastic Tissue](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/ModelCollection/BiaxialTensileTestHyperelasticTissue.html) and the [Layered Vascular Vessel with Yeoh Constitutive Model](https://reference.wolfram.com/language/PDEModels/tutorial/StructuralMechanics/ModelCollection/VascularVessel.html) both featuring hyperelastic material models. The [Disc Brake](https://reference.wolfram.com/language/PDEModels/tutorial/HeatTransfer/ModelCollection/DiscBrake.html) has been updated and now also features an axisymmetric solid mechanics model. Note, that the parameter `ModelFunction` has been renamed to `SolidMechanicsModelFunction`. The same rename holds true for the parameters `ModelForm` which was renamed to `SolidMechanicsModelForm` Old code will continue to work, but you should be aware of this change. Further more functionality to compute `ElasticEnergy` has been added. Updates for the FEM code include the following: It has be come simpler to specify mesh elements with markers. Previously, each element needed it's own marker. There is now a simplification if each element uses the same marker the the marker needs to be specified only once. This now works: Needs["NDSolve`FEM`"] bmesh = ToBoundaryMesh[ "Coordinates" -> {{0, 0}, {1, 0}, {1, 1}, {0, 1}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}}, 1], LineElement[{{4, 1}}, 2]}]; [1]: https://i.sstatic.net/FJb86.png [2]: https://i.sstatic.net/VjFLK.png [3]: https://i.sstatic.net/h8Txb.png [4]: https://i.sstatic.net/v8Sjd.png [5]: https://i.sstatic.net/QdIql.png