Finite Element Method Usage Tips

Introduction

The aim of this tutorial is to point out possible issues when using the finite element method with NDSolve and offer best practices to avoid potential issues.

Load the finite element package.
In[14]:=
Click for copyable input

Monitoring the Solution Progress of Nonlinear Stationary Partial Differential Equations

The solution of partial differential equations can be time consuming. This is particularly true for large-scale nonlinear PDEs. To monitor the solution process of nonlinear PDEs, EvaluationMonitor and StepMonitor can be used. In the following example, a nonlinear PDE is solved and the number of function evaluations, steps and Jacobian evaluations is monitored. In this specific example, a Pause command has been added to slow the solution process down for better inspection. In a scenario where the PDE solution process is slow per se, the use of Pause is, of course, not needed.

Set up an nonlinear PDE and a boundary condition.
In[2]:=
Click for copyable input
Solve the equation while monitoring the number of function evaluations, steps and Jacobian evaluations.
In[4]:=
Click for copyable input
Out[4]=

Monitoring Progress of Time Integration of Transient Partial Differential Equations

Time integration of partial differential equations can take time. This is especially true if the boundary conditions or coefficients are time dependent or if the PDE region at hand is three dimensional. An easy way to monitor progress of an integration of a transient PDE is by using an EvaluationMonitor.

Using the EvaluationMonitor within NDSolve works as in other cases. Here is an example wave equation with a time-dependent Dirichlet condition.

Specify an ellipsoidal region with a circular hole in one focal point.
In[5]:=
Click for copyable input
Create and visualize a mesh of the region.
In[8]:=
Click for copyable input
Out[9]=
Specify a transient Dirichlet boundary condition on the circular hole that is active until time .
In[12]:=
Click for copyable input
Time-integrate the PDE while monitoring the progress.
In[14]:=
Click for copyable input
Out[14]=

Solving Memory-Intensive PDEs

The amount of memory needed by NDSolve to solve a particular problem with the finite element method is proportional to the number of equations and the space dimension in which you are operating. For coupled systems in 3D, the amount of memory provided by the underlying hardware can be a barrier. The following section identifies easy-to-use options to alleviate this potential barrier.

During the finite element analysis there are two key memory bottlenecks. The first is the creation of the discretization and the second is the solution (LinearSolve) of the system of equations. NDSolve provides options to both mesh generation and the LinearSolve step that have an effect on the memory requirement during discretization and solving. As a rough estimate, the number of coordinates in the internal generated mesh multiplied by the spatial dimension gives the degrees of freedom (number of rows and columns) of the discretized system matrix to be generated.

As an example, consider a stress operator from elastostatics. The stress operator is a system of three coupled PDEs in 3D space. Since the main focus of this section is to create a large system of equations, no additional information about the PDE itself is presented.

Define the stress operator, a Young's modulus, and a Poisson ratio.
In[2]:=
Click for copyable input

A series of measurements illustrates how various options influence the solution time and the amount of memory needed to find a solution. For this purpose, a helper function is implemented. The function receives as input any number of NDSolve options and returns the time and the amount of memory in MB needed to solve the PDE. It is also instructive to get a feeling for the size of the system matrices NDSolve internally establishes. The size of the system matrices is its degrees of freedom, or in other words, the number of rows and columns in the system matrices.

Create a helper function that calls NDSolve with options. The measured time, memory needed, and degrees of freedom to find the solution are printed.
In[3]:=
Click for copyable input

The default settings in NDSolve are set up such that the solution is accurate and found fairly efficiently. To make this example applicable for a larger class of computers, tetrahedron elements are used. The use of these results in smaller system matrices.

Calling NDSolve with settings that enforce tetrahedron elements in the mesh.
In[4]:=
Click for copyable input

With the default setting, NDSolve with a finite element discretization will call LinearSolve with "Pardiso" as the solver method. This will route to a direct solver that is very accurate but has a high requirement of available memory.

Visualize the deformed structure.
In[17]:=
Click for copyable input
Out[19]=

One way to reduce the memory consumption is to have NDSolve generate a mesh with fewer elements.

Instruct NDSolve to use a smaller mesh.
In[20]:=
Click for copyable input

This has reduced both solution time and memory requirements at the price of accuracy. How many elements a mesh needs to represent an accurate solution is problem dependent. A good method is to start with a coarse mesh and refine until the solutions stop differing substantially.

Visualize the difference of the computed results at a cross section.
In[21]:=
Click for copyable input
Out[22]=
Visualize the difference of node distances as an Image3D rescaled to the range of 0 to 0.01.
In[23]:=
Click for copyable input
Out[25]=

A way to further reduce the amount of memory needed for computing the solution is to use a mesh that is only first-order accurate.

Instruct NDSolve to use a first-order-accurate mesh.
In[26]:=
Click for copyable input
Visualize the difference of the computed results at a cross section.
In[27]:=
Click for copyable input
Out[28]=
Visualize the difference of node distances as an Image3D rescaled to the range of 0 to 0.01.
In[29]:=
Click for copyable input
Out[31]=

This has reduced both solution time and memory requirements at the price of accuracy. Making use of a first-order mesh results in much smaller system matrices, which can be solved more efficiently. Using a first-order mesh may significantly reduce accuracy.

The options discussed above can also be combined. A more in-depth treatise of options that can be given to NDSolve can be found in the finite element tutorials.

Extrapolation of Solution Domains

Interpolation functions in the Wolfram Language will extrapolate if they are queried outside of their domain. In a finite element analysis, this is not wanted, since the extrapolation will almost certainly not give the physically correct value. The interpolation functions NDSolve returns from a finite element analysis will return Indeterminate as an extrapolation value. This behavior can be switched off.

This shows the solution domain.
In[38]:=
Click for copyable input
Out[40]=

The following PDE is going to be solved over the solution domain.

In[41]:=
Click for copyable input
This solves the equation.
In[42]:=
Click for copyable input

The resulting interpolation function can be queried at points that do not belong to the solution domain. This will result in a warning message and Indeterminate as an extrapolated value.

In[43]:=
Click for copyable input
Out[43]=

To change the behavior, you can have the interpolation function return an extrapolation value and quiet the warning message.

This solves the equation but gives extrapolation values for query points outside the solution domain.
In[44]:=
Click for copyable input

A query point outside the solution domain now returns an extrapolation value and no warning message.

In[45]:=
Click for copyable input
Out[45]=

The "DefaultExtrapolationHandler" system option can be set to change the default behavior.

In[46]:=
Click for copyable input
Out[46]=

Stabilization of Convection-Dominated Equations

Consider a convection-diffusion type of equation.

Details about the coefficients can be found in InitializePDECoefficients.

In a situation where the convective component becomes large, the solution of the PDE may become unstable, as shown in the following example.

Specify a convection-diffusion equation operator.
In[34]:=
Click for copyable input
Out[35]=
Specify boundary conditions.
In[36]:=
Click for copyable input
Specify a region and a mesh.
In[37]:=
Click for copyable input
Out[38]=
Solve a convection-diffusion equation with a large convective component.
In[39]:=
Click for copyable input
Out[39]=

The message indicates that the solution may not be stable. The Péclet number is a dimensionless number and expresses the ratio between convection and diffusion of a physical quantity. The Péclet number is computed as

where is the convective component, is a minimum element diameter, and is the diffusion coefficient. If the Péclet number is larger than the mesh order, then the stability of the solution may become a concern and the message is given.

Visualize the solution of a convection-diffusion equation with a large convective component.
In[40]:=
Click for copyable input
Out[40]=

The result is disastrous. There are a few things that can be done in such situations. First, however, investigate how the Péclet number is computed.

Compute the minimal diameter of the mesh elements.
In[41]:=
Click for copyable input
Out[41]=
Compute the Péclet number from the convection and diffusion coefficients and the minimal element diameter.
In[42]:=
Click for copyable input
Out[42]=

Note that the instability also has to do with the boundary conditions specified.

Specified boundary conditions.
In[43]:=
Click for copyable input
Out[43]=

The boundary conditions at and specify a value for the dependent variable that inhibits the flow of in that direction. They are blocking the "outflow".

Inspect the vector field of .
In[44]:=
Click for copyable input
Out[44]=

Not enforcing Dirichlet conditions on and will also avoid the instability.

Stable boundary conditions.
In[45]:=
Click for copyable input

Now, the boundary conditions may not always be chosen. One way to improve the stability of the solution is to add so-called artificial diffusion. This artificial diffusion is then added to the diffusive term in order to stabilize the PDE.

Estimate the amount of artificial diffusion needed.
In[46]:=
Click for copyable input
Out[48]=
Verify that the addition of the artificial diffusion would return a stable result.
In[49]:=
Click for copyable input
Out[49]=

Note that the newly computed Péclet number is smaller than the mesh order.

Use artificial diffusion (AD) to solve a convection-dominated PDE.
In[51]:=
Click for copyable input
Visualize the solution of a convection-diffusion equation with a large convective component.
In[52]:=
Click for copyable input
Out[52]=
Visualize a cross section of the solution.
In[24]:=
Click for copyable input
Out[24]=

This is already much better. The additional diffusion smears out the solution to some extent. To further improve this, the artificial diffusion can be made to follow the streamline of . This, however, will only work if the flow field is divergence free. This method is called streamline upwind PetrovGalerkin (SUPG).

Test if the flow field is divergence free.
In[21]:=
Click for copyable input
Out[21]=
A tuning parameter is set to the minimal mesh diameter.
In[53]:=
Click for copyable input
Use a streamline upwind artificial diffusion (SUPG) to solve a convection-dominated PDE.
In[54]:=
Click for copyable input
Visualize the solution computed with SUPG.
In[57]:=
Click for copyable input
Out[57]=
Compare the pure artificial diffusion to the streamline upwind diffusion.
In[55]:=
Click for copyable input
Out[55]=

The SUPG solution is less diffusive for than the solution computed with pure artificial diffusion.

The disadvantage with these methods is that the PDE is modified. This may not always be a good approach. As an alternative, the mesh can be modified. For more information about mesh generation, please consult "Element Mesh Generation".

Generate and visualize a mesh with a refined boundary.
In[58]:=
Click for copyable input
Out[59]=
Solve a convection-diffusion equation with a large convective component on a predefined mesh.
In[60]:=
Click for copyable input
Visualize the solution of a convection-diffusion equation with a large convective component.
In[61]:=
Click for copyable input
Out[61]=
Visualize a cross section of the solution.
In[62]:=
Click for copyable input
Out[62]=

The solution is improved compared to the previous examples, at the cost of some additional computational time. In principal, it would be sufficient to only refine the right and top boundaries of the mesh. This would then decrease the computational time.

Stabilization of Convection-Dominated Time-Dependent Equations

The following section shows how numerical instabilities can come up in convection dominant time dependent equations. This section show how the use of artificial diffusion to minimize numerical instabilities caused by the lack of diffusion.

As an example consider a coupled first order sound wave equation.

The equation has two dependent variables and . Since there is no diffusion term in the system, the solution of the PDE may become unstable.

To solve the system specify the coefficients and , and then set up the wave equation PDE operator.

Setup a wave equation.
In[2]:=
Click for copyable input

As boundary conditions, sinusoidal sound sources of angular frequency are placed at the left boundary.

Setup boundary conditions.
In[4]:=
Click for copyable input

Since this is a time-dependent PDE, initial conditions must be specified.

Specify initial conditions.
In[6]:=
Click for copyable input

To solve the wave equation, the wavelength of a sound wave needs to be resolved by a sufficiently fine mesh in order to get an accurate numerical solution. Set the grid size to be at least sixty times smaller than the sound wavelength.

Calculate the upper bound of the mesh cell size.
In[7]:=
Click for copyable input
Out[7]=
To meet the mesh requirement, set the grid size .
In[8]:=
Click for copyable input
Out[9]=
Solve the system of equations.
In[10]:=
Click for copyable input
Out[10]=
Visualize the solution of the dependent variable at time .
In[11]:=
Click for copyable input
Out[11]=

The ripples in the solution come from a numerical instability. To improve the stability, artificial diffusion can be added to the PDE system.

Note that the Péclet number can be used to estimate the required artificial diffusion only if the PDE contains a single dependent variable. Since there is now a system of equations with two unknown variables, a diffusion coefficient must be manually picked.

Set up a diffusion coefficient .
In[13]:=
Click for copyable input
Out[14]=

is a manually chosen parameter that controls the effect of artificial diffusion. Since the PDE is modified when adding artificial diffusion, users should carefully pick the value of ϵ between 1 and 10 that stabilizes the solution without reducing the fidelity.

Solve the system of equations with additional artificial diffusion terms for each equation.
In[15]:=
Click for copyable input
Out[15]=
Visualize the solution of dependent variable at time .
In[16]:=
Click for copyable input
Out[16]=

Note that the stability has improved with artificial diffusion. Next, the numerical results are compared to the analytical result.

Set up the analytical solution.
In[17]:=
Click for copyable input
Compare the unstabilized and stabilized solutions to the analytical solution.
In[18]:=
Click for copyable input
Out[19]=

Since the PDE is modified, adding artificial diffusion will smooth out the gradient change of the solution. That is why it produces a larger error at the front of the wave.

Inspect the front of the wave.
In[20]:=
Click for copyable input
Out[20]=

The Coefficient Form of a PDE

In this example, the importance of the coefficient form of PDEs for the finite element method is demonstrated. The coefficient form for a single dependent variable PDE is given in equation (1).

Details about the coefficients can be found in InitializePDECoefficients.

The PDE is defined in . Here is the dependent variable for which a solution is sought. The coefficients , , , and are scalars; , , and are vectors; and is an × matrix.

The key point of this example is that this equation (and coupled versions of it) is in essence the only equation the finite element method can solve. To emphasize this point, consider the simpler equation (2).

Set up the equation and its coefficients. As a spatial domain for the PDE, is used, and the time integration will be set up to stop at . The diffusion coefficient is set to 1, which will internally get transformed to the identity matrix. For the damping coefficient , a piecewise continuous function is used that has the value of 1 for values of , and 2 otherwise.

Specify the coefficient and set the equation (3) up.
In[2]:=
Click for copyable input
Solve the equation enforcing the Finite Element Method as a solver.
In[4]:=
Click for copyable input
Out[4]=
Plot the solution at .
In[5]:=
Click for copyable input
Out[5]=

One could be tempted to reformulate equation (4) in the following manner.

Set up equation (5).
In[6]:=
Click for copyable input
Solve the equation.
In[7]:=
Click for copyable input
Out[7]=
Plot the solution at .
In[8]:=
Click for copyable input
Out[8]=
Plot the difference of solution 1 and solution 2.
In[9]:=
Click for copyable input
Out[9]=

Clearly, solution 1 and solution 2 differ. To investigate what happens, write a little helper function that extracts the actually parsed PDE coefficients from NDSolve data structures. For more information on the internal workings of the finite element method, please consult the Finite Element Programming tutorial.

Specify a helper function to extract PDE coefficients.
In[10]:=
Click for copyable input
Inspect the PDE coefficients from equation (6).
In[11]:=
Click for copyable input
Out[11]=

The coefficients for equation (7) look as expected.

Inspect the PDE coefficients from equation (8).
In[12]:=
Click for copyable input
Out[12]=

The coefficients for equation (9) come as a surprise. The coefficient got pulled into the diffusion coefficient . Why is that? The key is to understand that the finite element method can only solve this type of equation.

Note that there is no coefficient in front of the term . To get equations of the type to work, is reset to and is adjusted to get rid of the derivative caused by . Here is an example.

In[13]:=
Click for copyable input
Out[15]=

Following the same procedure for the equation (10), you get:

In[16]:=
Click for copyable input
Out[16]=

This is effectively the same as explicitly specifying . Mathematically, because of the discontinuity, the coefficient is like a Dirac delta function, which would be omitted in the time integration anyway.

In[17]:=
Click for copyable input
Inspect the PDE coefficients.
In[18]:=
Click for copyable input
Out[18]=

For time-dependent PDEs with a discontinuous diffusion coefficient, it is best to arrange the equations such that the coefficient is eliminated from the diffusion term.

Formal Partial Differential Equations

Formal partial differential equations are equations that have Inactive components. This section explains when PDE need to be inactive. To start with an example, a plane stress operator is defined. For Young's modulus and Poisson's ratio, values for steel are used.

Define a plane stress operator.
In[67]:=
Click for copyable input

The first eigenvalue and eigenfunction of a beam held fixed at the left with length 10 meters and height 0.7 meters are computed.

Compute the eigenfunctions for a beam.
In[69]:=
Click for copyable input
Compute resonant frequency from the eigenvalue.
In[71]:=
Click for copyable input
Out[71]=

As a means of comparison, the first resonance frequency utilizing EulerBernoulli beam theory is computed analytically.

In[72]:=
Click for copyable input
Out[73]=

Compare the difference in results; about half the difference is attributable to the different theoretical approaches.

In[74]:=
Click for copyable input
Out[74]=

This is expected.

Next, the Active version of the PDE is inspected and the resulting resonance frequency is computed.

In[75]:=
Click for copyable input
Out[77]=

The above result is wrong. What happened? In short, the non-inactive version cannot account for unsymmetric coefficients. Looking at the original inactive PDE of the four coefficient matrices, two, the off-diagonal ones, are not symmetric.

In[78]:=
Click for copyable input
Out[78]=

In other words, even before NDEigensystem (and other related functions like NDSolve) can parse the PDE in its intended form, it will have evaluated.

In[79]:=
Click for copyable input
Out[79]=
In[80]:=
Click for copyable input
Out[80]=
In[81]:=
Click for copyable input
Out[81]=

From the evaluated PDE, there is no way to recover the antisymmetric coefficients. For this reason Inactive has been introduced. For antisymmetric coefficients, the Inactive version of the PDE is a must.

To inspect the coefficients that have been parsed, NDSolve`ProcessEquations can be used.

In[82]:=
Click for copyable input
Out[83]=

A second example where an inactive form of the equation is needed is nonlinear PDEs that have a derivative of the dependent variable in the diffusion coefficient, like the following PDE.

.

The diffusion coefficient is nonlinear because it contains the dependent variable .

Set up the equation.
In[65]:=
Click for copyable input
Solve the nonlinear equation.
In[66]:=
Click for copyable input
Out[66]=

If the equation at hand is not in inactive form, NDSolve will not be able to solve the PDE.

Solving the activated nonlinear equation results in a message.
In[67]:=
Click for copyable input

Currently NDSolve cannot solve stationary PDEs that have a higher than first-order derivative involving the dependent variable in any of the coefficients. This is explained as follows: The activated operator needs to match the coefficient form . As a first step, the diffusion coefficient is set as .

In[68]:=
Click for copyable input
Out[68]=

Inserting the diffusion coefficient in the coefficient form results in the following.

In[69]:=
Click for copyable input
Out[69]=

The remaining term is compensated by also setting in the coefficient form.

In[70]:=
Click for copyable input
Out[70]=

However, evaluating returns a higher than first-order derivative in the coefficient, which the finite element method in NDSolve currently cannot solve.

In[13]:=
Click for copyable input
Out[13]=

NeumannValue and Formal Partial Differential Equations

This section explains the interaction between formal partial differential equations and Neumann values. In the stationary case, a partial differential equation can be expressed as follows:

Details about the coefficients can be found in InitializePDECoefficients.

On the other hand, generalized Neumann boundary values specify a value . The value prescribes a flux over the outward normal on some part of the boundary:

The derivation of the Neumann boundary value is outlined in Partial Differential Equations and Boundary Conditions. It is important to note that the coefficients , , and in equation (11) are not specified directly by the use of NeumannValue. The coefficients , , and are specified in equation (12). The use of NeumannValue will replace with the value of on the boundary.

Now, the usage of Div and Grad alone is not enough to fully specify equation (13). Consider the specification of

and its corresponding Neumann value:

Consider a case where is given as , is the identity matrix and is a zero vector. Note that the evaluation of the divergence results in

where is and is the divergence of , in this example. Equations (14) and (15) are equivalent.

Verify that the preceding equations are equivalent.
In[15]:=
Click for copyable input
Out[16]=

The evaluation poses a problem, however. Even though the equations are equivalent, the Neumann specifications are not. The corresponding Neumann value for equation (16) has implicitly changed to

To illustrate this further, a helper function is created that parses a PDE and extracts the PDE coefficient data from the finite element data, as explained in "Finite Element Programming".

Create a helper function that generates the NDSolve finite element data and extracts the PDE coefficient data.
In[17]:=
Click for copyable input
Set up the PDE and extract the PDE coefficient data.
In[18]:=
Click for copyable input
Out[20]=

PDECoefficientData is a data structure that contains the parsed PDE coefficients.

The diffusion coefficient is a matrix with .
In[21]:=
Click for copyable input
Out[21]=
The convection coefficient is .
In[22]:=
Click for copyable input
Out[22]=
The reaction coefficient has the value of .
In[23]:=
Click for copyable input
Out[23]=
No conservative convection coefficient is present.
In[24]:=
Click for copyable input
Out[24]=

During evaluation, the coefficient split into a and term. The proper mechanism to input differential equations where coefficients are evaluated prematurely is by either Inactivate or directly through the use of Inactive.

Inactivate a PDE.
In[25]:=
Click for copyable input
Out[25]=
Extract the PDE coefficient data.
In[26]:=
Click for copyable input
Out[26]=
The diffusion coefficient is .
In[27]:=
Click for copyable input
Out[27]=
The conservative convection coefficient is .
In[28]:=
Click for copyable input
Out[28]=
No convection coefficient is present.
In[29]:=
Click for copyable input
Out[29]=
No reaction coefficient is present.
In[30]:=
Click for copyable input
Out[30]=

If a γ term is present one might use the following inactive PDE:

Inactivate a PDE with a term.
In[31]:=
Click for copyable input
Out[32]=
Extract the PDE coefficient data.
In[33]:=
Click for copyable input
Out[33]=
The load derivative coefficient is .
In[34]:=
Click for copyable input
Out[34]=

The following example illustrates the difference in meaning of an active and inactive PDE with respect to Neumann values, from a practical perspective. The example shows a diffusion confined in a region subject to a biasing potential .

Specify a rectangular region with a hole inside.
In[103]:=
Click for copyable input
Specify a biasing potential and its gradient .
In[104]:=
Click for copyable input

Dirichlet boundary conditions are set up at the top and bottom () of the region with a potential of 1 and 0, respectively.

Specify Dirichlet boundary conditions at .
In[106]:=
Click for copyable input

At the remaining two sides () natural boundary conditions (Neumann zero) apply. This means zero flux across these two edges.

The PDE to be modeled is given by:

and its corresponding Neumann value at is

Specify the inactive PDE.
In[107]:=
Click for copyable input
Out[107]=
Solve the inactive PDE.
In[115]:=
Click for copyable input
Inspect the PDE coefficients.
In[116]:=
Click for copyable input
Out[117]=

First the satisfaction of the Neumann values at is inspected.

Plotting the normal derivative of the inactive operator over the edges with the Neumann zero value implicitly specified. The normal derivative is in the direction of .
In[118]:=
Click for copyable input
Out[118]=

With zero flux boundary conditions at (no flux across these two edges) and no source terms, the flux into the box at should be the same as the flux out of the box at .

Plotting the normal derivative of the inactive operator over the edges with the Dirichlet condition. The normal derivative is in the direction of .
In[119]:=
Click for copyable input
Out[119]=

The flux into the box is roughly the same as the flux out of the box. As a comparison, the activated PDE is solved.

Solve the activated PDE.
In[120]:=
Click for copyable input
Investigate the PDE coefficients.
In[121]:=
Click for copyable input
Out[122]=

The coefficient is parsed as a convection and a reaction coefficient.

Investigate the convection and reaction coefficients.
In[123]:=
Click for copyable input
Out[123]=

In the activated case, the boundary condition computed is .

Plotting the normal derivative of the activated operator over the edges with the Dirichlet condition. The normal derivative is in the direction of .
In[124]:=
Click for copyable input
Out[124]=

Efficient Evaluation of PDE Coefficients

The coefficients in a PDE need not be constants. In this example, the diffusion coefficient depends on the position in a simulation region.

It is important to understand the evaluation order of the coefficients specified because it can have an effect on the performance of the simulation. First, a mesh with an internal boundary is generated.

Create a mesh with an internal boundary and a fine resolution.
In[3]:=
Click for copyable input
Visualize the internal boundary.
In[5]:=
Click for copyable input
Out[5]=

Once the mesh is set up, the PDE with an unspecified diffusion coefficient is set up.

Set up a Poisson partial differential equation.
In[8]:=
Click for copyable input
Set up a boundary condition.
In[18]:=
Click for copyable input

The diffusion coefficient is set up in such a way that in the inner region the value of the diffusion coefficient , while outside of that region the diffusion coefficient .

Set up a coefficient that has different values in different parts of the region.
In[9]:=
Click for copyable input
Out[12]=
Solve the equation with boundary conditions and measure the time needed.
In[13]:=
Click for copyable input
Out[13]=

The simulation worked as expected. Look more closely at the diffusion coefficient and note that the branches of the If statement are not evaluated.

Inspect the coefficient.
In[14]:=
Click for copyable input
Out[14]=

The reason that the If statement does not evaluate its branch arguments is that the If statement has attributes set that prevent the evaluation.

Inspect the attributes of If.
In[15]:=
Click for copyable input
Out[15]=

The fact that the If statement in diffusion coefficient does not have its branch arguments evaluated means that in every call the variables have to be looked up. As a consequence, the If statement cannot be compiled and will use the standard evaluator, which will be slower in this case.

When creating a coefficient function that has all its arguments evaluated, With can be useful.

Create a coefficient with values evaluated.
In[16]:=
Click for copyable input
Out[16]=

Note that now the If statement has all arguments evaluated.

Set up a Poisson partial differential equation with the new coefficient.
In[17]:=
Click for copyable input
Out[19]=
Inspect the speedup.
In[20]:=
Click for copyable input
Out[20]=

For small examples like this one, this may not be much of an issuebut as soon as the simulation becomes larger, fully evaluated coefficients are something to think about.

The Relation between NeumannValue and Boundary Derivatives

The following example explains the relation of a NeumannValue and boundary derivatives, and is set up such that the parameters are easy to modify. First, the region is specified.

Specify a region.
In[14]:=
Click for copyable input
Out[15]=

Here is the PDE to be solved.

The PDE has one dependent variable . Note that since this is a one-dimensional system, the diffusion coefficient is a 1×1 matrix, which can be specified as a number.

Set up the PDE operator.
In[4]:=
Click for copyable input
Out[5]=

Dirichlet boundary conditions specify a value for the dependent variable .

Neumann values are specified by the following form.

Next, the boundary conditions are set up.

Specify boundary conditions for the equation.
In[6]:=
Click for copyable input
In[8]:=
Click for copyable input
Solve the system of equations.
In[11]:=
Click for copyable input
Out[11]=
Compute the analytical solution using DSolveValue.
In[12]:=
Click for copyable input
Out[12]=

Note how in the DSolveValue formulation of the equation, the generalized Neumann boundary equation has to be given explicitly, and how the coefficients match those in the PDE.

To compare the analytical result to the numerical result, make a plot of the difference between the two.

Plot the difference between the analytical and numerical solutions.
In[13]:=
Click for copyable input
Out[13]=

Ordering of Dependent Variable Names

In some cases, when analyzing coupled systems of PDEs, the finite element method as implemented in NDSolve may return what seem to be unexpected results. This section explains when this happens and presents solutions to avoid the problem. In the last section, a more in-depth explanation is presented.

First a system of equations with appropriate boundary conditions and a region are set up.

Specify a region.
In[125]:=
Click for copyable input
Specify a system of three equations.
In[126]:=
Click for copyable input
Specify accompanying boundary conditions.
In[127]:=
Click for copyable input
Specify the PDE system.
In[128]:=
Click for copyable input

The dependent variables for this example are u, v and w. The system is solved and a visualization of the dependent variable w is given.

Solve the system and visualize the dependent variable w.
In[129]:=
Click for copyable input
Out[130]=

In a second experiment, the dependent variable name w is changed to p and the system of equations is solved yet again.

Solve the system with dependent w replaced with p and visualize a dependent variable p.
In[131]:=
Click for copyable input
Out[132]=

The result is unexpected. Before explaining in detail what happens, a way to enforce the expected behavior is presented.

NDSolve offers a finite element method option to specify an interpolation order that should be used for the dependent variables during the discretization of the PDE. The specification of the interpolation order will implicitly enforce the same ordering of the equations and the dependent variables.

Specify the interpolation order of the dependent variables and plot the solution of p.
In[135]:=
Click for copyable input
Out[136]=

Generally, specifying the same interpolation order for each dependent variable is fine. In this specific case, the equations are fluid flow equations (Stoke's flow), and stabilization can be enforced if the pressure variable's Interpolation order is one less than the interpolation order for the velocities u and v.

To investigate this behavior further, an NDSolve state object is created.

Create an NDSolve state object.
In[137]:=
Click for copyable input

Note that the ordering of the dependent variables in the FEMMethodData in the FiniteElementData is {p,u,v}.

Inspect the dependent variables in the state object.
In[138]:=
Click for copyable input
Out[138]=

Inspecting the diffusion and convection coefficients of the PDECoefficientData reveals the structure of the coupled PDE coefficients.

Display the coupled PDEs' diffusion coefficients.
In[139]:=
Click for copyable input
Out[139]//MatrixForm=
Display the coupled PDEs' convection coefficients.
In[140]:=
Click for copyable input
Out[140]//MatrixForm=

When the finite element interpolation order method option is set, the coefficient structure is adjusted to the canonical order of the dependent variables.

Create a NDSolve state object.
In[141]:=
Click for copyable input
Display the coupled PDEs' diffusion coefficients.
In[142]:=
Click for copyable input
Out[142]//MatrixForm=
Display the coupled PDEs' convection coefficients.
In[143]:=
Click for copyable input
Out[143]//MatrixForm=

In fact, reordering the equations' input to match the canonical order of the dependent variables also gives the expected result.

Solve the coupled PDE with different equation ordering.
In[144]:=
Click for copyable input
Out[145]=

A remaining question is, why can this reordering not happen automatically?

The inherent challenge is that the boundary conditions specified can only be applied to diagonal components of the coefficients. The reason is that the way the boundary conditions are entered causes the information about how a specific boundary condition relates to a specific equation in the PDE to be lost.

Inspect the internal data of the parsed boundary conditions.
In[146]:=
Click for copyable input
Out[147]=

Here each sublist has two parts. The first part indicates the row and column in which the second partthe boundary conditionwill be applied during the discretization.

Another option is to associate the Dirichlet boundary conditions with the respective equation to which they are related.

Create a system of coupled PDEs that have Dirichlet boundary conditions associated with them.
In[148]:=
Click for copyable input
Solve the coupled PDE and visualize part of the solution.
In[149]:=
Click for copyable input
Out[150]=

In summary, the best option is to specify the interpolation order.

Specify the interpolation order of the dependent variables and plot the solution of p.
In[151]:=
Click for copyable input
Out[152]=