From: bangerth Date: Mon, 24 Jul 2006 14:00:10 +0000 (+0000) Subject: Remove old tex/html version of introduction X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba4ac6a2405c1f585631a30b4ba254d9892fd7bb;p=dealii-svn.git Remove old tex/html version of introduction git-svn-id: https://svn.dealii.org/trunk@13418 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/examples/step-18/doc/intro.html b/deal.II/examples/step-18/doc/intro.html deleted file mode 100644 index 22a9f287ba..0000000000 --- a/deal.II/examples/step-18/doc/intro.html +++ /dev/null @@ -1,1538 +0,0 @@ - -

Introduction

- -

-[A higher quality version of the introduction is available as a PDF -file by clicking here] -

- - -

-This tutorial program is another one in the series on the elasticity problem -that we have already started with step-8 and step-17. It extends it into two -different directions: first, it solves the quasistatic but time dependent -elasticity problem for large deformations with a Lagrangian mesh movement -approach. Secondly, it shows some more techniques for solving such problems -using parallel processing with PETSc's linear algebra. In addition to this, we -show how to work around the main bottleneck of step-17, namely that we -generated graphical output from only one process, and that this scaled very -badly with larger numbers of processes and on large problems. Finally, a good -number of assorted improvements and techniques are demonstrated that have not -been shown yet in previous programs. - -

-As before in step-17, the program runs just as fine on a single sequential -machine as long as you have PETSc installed. Information on how to tell -deal.II about a PETSc installation on your system can be found in the deal.II -README file, which is linked to from the main documentation page -doc/index.html in your installation of deal.II, or on the deal.II -webpage http://www.dealii.org/. - -

- -

-Quasistatic elastic deformation -

- -

- -

-Motivation of the model -

- -

-In general, time-dependent small elastic deformations are described by the -elastic wave equation -

-
- - - -
$\displaystyle \rho \frac{\partial^2 \vec u}{\partial t^2} + c \frac{\partial \vec u}{\partial t} - \div ( C \varepsilon(\vec u)) = \vec f$   in $ \Omega$ -$\displaystyle ,$ -(1)
-

-where -$ \vec u=\vec u (\vec x,t)$ - is the deformation of the body, $ \rho$ - -and $ c$ - the density and attenuation coefficient, and $ \vec f$ - external forces. -In addition, initial conditions -

-
- - - -
$\displaystyle \vec u(\cdot, 0) = \vec u_0(\cdot)$   on $ \Omega$ -$\displaystyle ,$ -(2)
-

-and Dirichlet (displacement) or Neumann (traction) boundary conditions need -to be specified for a unique solution: -

-
- - - - - - - - - - - - -
$\displaystyle \vec u(\vec x,t)$$\displaystyle = \vec d(\vec x,t) \qquad$ on -$ \Gamma_D\subset\partial\Omega$ -$\displaystyle ,$ -(3)
$\displaystyle \vec n \ C \varepsilon(\vec u(\vec x,t))$$\displaystyle = \vec b(\vec x,t) \qquad$ on -$ \Gamma_N=\partial\Omega\backslash\Gamma_D$ -$\displaystyle .$ -(4)
-

-In above formulation, -$ \varepsilon(\vec u)= \tfrac 12 (\nabla \vec u + \nabla
-\vec u^T)$ - is the symmetric gradient of the displacement, also called the -strain. $ C$ - is a tensor of rank 4, called the stress-strain - tensor that contains knowledge of the elastic strength of the material; its -symmetry properties make sure that it maps symmetric tensors of rank 2 -(``matrices'' of dimension $ d$ -, where $ d$ - is the spatial dimensionality) onto -symmetric tensors of the same rank. We will comment on the roles of the strain -and stress tensors more below. For the moment it suffices to say that we -interpret the term -$ \div ( C \varepsilon(\vec u))$ - as the vector with -components -$ \tfrac \partial{\partial x_j} C_{ijkl} \varepsilon(\vec u)_{kl}$ -, -where summation over indices $ j,k,l$ - is implied. - -

-The quasistatic limit of this equation is motivated as follows: each small -perturbation of the body, for example by changes in boundary condition or the -forcing function, will result in a corresponding change in the configuration -of the body. In general, this will be in the form of waves radiating away from -the location of the disturbance. Due to the presence of the damping term, -these waves will be attenuated on a time scale of, say, $ \tau$ -. Now, assume -that all changes in external forcing happen on times scales that are -much larger than $ \tau$ -. In that case, the dynamic nature of the change is -unimportant: we can consider the body to always be in static equilibrium, -i.e. we can assume that at all times the body satisfies -

-
- - - - - - - - - - - - - - - - - - -
$\displaystyle - \div ( C \varepsilon(\vec u))$$\displaystyle = \vec f$ in $ \Omega$ -$\displaystyle ,$ -(5)
$\displaystyle \vec u(\vec x,t)$$\displaystyle = \vec d(\vec x,t) \qquad$ on $ \Gamma_D$ -$\displaystyle ,$ -(6)
$\displaystyle \vec n \ C \varepsilon(\vec u(\vec x,t))$$\displaystyle = \vec b(\vec x,t) \qquad$ on $ \Gamma_N$ -$\displaystyle .$ -(7)
-

-Note that the differential equation does not contain any time derivatives any -more - all time dependence is introduced through boundary conditions and a -possibly time-varying force function -$ \vec f(\vec x,t)$ -. The changes in -configuration can therefore be considered as being stationary -instantaneously. An alternative view of this is that $ t$ - is not really a time -variable, but only a time-like parameter that governs the evolution of the -problem. - -

-While these equations are sufficient to describe small deformations, computing -large deformations is a little more complicated. To do so, let us first -introduce a tensorial stress variable $ \sigma$ -, and write the differential -equations in terms of the stress: -

-
- - - - - - - - - - - - - - - - - - -
$\displaystyle - \div\sigma$$\displaystyle = \vec f$ in $ \Omega(t)$ -$\displaystyle ,$ -(8)
$\displaystyle \vec u(\vec x,t)$$\displaystyle = \vec d(\vec x,t) \qquad$ on -$ \Gamma_D\subset\partial\Omega(t)$ -$\displaystyle ,$ -(9)
$\displaystyle \vec n \ C \varepsilon(\vec u(\vec x,t))$$\displaystyle = \vec b(\vec x,t) \qquad$ on -$ \Gamma_N=\partial\Omega(t)\backslash\Gamma_D$ -$\displaystyle .$ -(10)
-

-Note that these equations are posed on a domain $ \Omega(t)$ - that -changes with time, with the boundary moving according to the -displacements -$ \vec u(\vec x,t)$ - of the points on the boundary. To -complete this system, we have to specify the incremental relationship between -the stress and the strain, as follows: -

-
- - - -
$\displaystyle \dot\sigma = C \varepsilon (\dot{\vec u}),$ -(11)
-

-where a dot indicates a time derivative. Both the stress $ \sigma$ - and the -strain -$ \varepsilon(\vec u)$ - are symmetric tensors of rank 2. - -

- -

-Time discretization -

- -

-Numerically, this system is solved as follows: first, we discretize -the time component using a backward Euler scheme. This leads to a -discrete equilibrium of force at time step $ n$ -: -

-
- - - -
$\displaystyle -\div\sigma^n = f^n,$ -(12)
-

-where -

-
- - - -
$\displaystyle \sigma^n = \sigma^{n-1} + C \varepsilon (\Delta \vec u^n),$ -(13)
-

-and -$ \Delta \vec u^n$ - the incremental displacement for time step -$ n$ -. In addition, we have to specify initial data -$ \vec u(\cdot,0)=\vec u_0$ -. -This way, if we want to solve for the displacement increment, we -have to solve the following system: -

-
- - - - - - - - - - - - - - - - - - -
$\displaystyle - \div C \varepsilon(\Delta\vec u^n)$$\displaystyle = \vec f + \div\sigma^{n-1}$ in -$ \Omega(t_{n-1})$ -$\displaystyle ,$ -(14)
$\displaystyle \Delta \vec u^n(\vec x,t)$$\displaystyle = \vec d(\vec x,t_n) - \vec d(\vec x,t_{n-1}) \qquad$ on -$ \Gamma_D\subset\partial\Omega(t_{n-1})$ -$\displaystyle ,$ -(15)
$\displaystyle \vec n \ C \varepsilon(\Delta \vec u^n(\vec x,t))$$\displaystyle = \vec b(\vec x,t_n)-\vec b(\vec x,t_{n-1}) \qquad$ on -$ \Gamma_N=\partial\Omega(t_{n-1})\backslash\Gamma_D$ -$\displaystyle .$ -(16)
-

-The weak form of this set of equations, which as usual is the basis for the -finite element formulation, reads as follows: find -$ \Delta \vec u^n \in
-\{v\in H^1(\Omega(t_{n-1}))^d: v\vert _{\Gamma_D}=\vec d(\cdot,t_n) - \vec d(\cdot,t_{n-1})\}$ - -such that -

-
- - - -
\begin{gather*}\begin{split}(C \varepsilon(\Delta\vec u^n), \varepsilon(\varphi)...
-...in H^1(\Omega(t_{n-1}))^d: \vec v\vert _{\Gamma_D}=0\}. \end{split}\end{gather*} -(17)
-

-We note that, for simplicity, in the program we will always assume that there -are no boundary forces, i.e.  -$ \vec b = 0$ -, and that the deformation of the -body is driven by body forces $ \vec f$ - and prescribed boundary displacements -$ \vec d$ - alone. It is also worth noting that when integrating by parts, we -would get terms of the form -$ (C \varepsilon(\Delta\vec u^n), \nabla \varphi
-)_{\Omega(t_{n-1})}$ -, but that we replace it with the term involving the -symmetric gradient -$ \varepsilon(\varphi)$ - instead of -$ \nabla\varphi$ -. Due to -the symmetry of $ C$ -, the two terms are equivalent, but the symmetric version -avoids a potential for round-off to render the resulting matrix slightly -non-symmetric. - -

-The system at time step $ n$ -, to be solved on the old domain - -$ \Omega(t_{n-1})$ -, has exactly the form of a stationary elastic -problem, and is therefore similar to what we have already implemented -in previous example programs. We will therefore not comment on the -space discretization beyond saying that we again use lowest order -continuous finite elements. - -

-There are differences, however: - -

    -
  1. We have to move (update) the mesh after each time step, in order to be - able to solve the next time step on a new domain; - -

    -

  2. -
  3. We need to know -$ \sigma^{n-1}$ - to compute the next incremental - displacement, i.e. we need to compute it at the end of the time step - to make sure it is available for the next time step. Essentially, - the stress variable is our window to the history of deformation of - the body. -
  4. -
-These two operations are done in the functions move_mesh and -update_quadrature_point_history in the program. While moving -the mesh is only a technicality, updating the stress is a little more -complicated and will be discussed in the next section. - -

- -

-Updating the stress variable -

- -

-As indicated above, we need to have the stress variable $ \sigma^n$ - available -when computing time step $ n+1$ -, and we can compute it using -

-
- - - -
$\displaystyle \sigma^n = \sigma^{n-1} + C \varepsilon (\Delta \vec u^n).$ -(18)
-

-There are, despite the apparent simplicity of this equation, two questions -that we need to discuss. The first concerns the way we store $ \sigma^n$ -: even -if we compute the incremental updates -$ \Delta \vec u^n$ - using lowest-order -finite elements, then its symmetric gradient -$ \varepsilon(\Delta\vec u^n)$ - is -in general still a function that is not easy to describe. In particular, it is -not a piecewise constant function, and on general meshes (with cells that are -not rectangles parallel to the coordinate axes) or with non-constant -stress-strain tensors $ C$ - it is not even a bi- or trilinear function. Thus, it -is a priori not clear how to store $ \sigma^n$ - in a computer program. - -

-To decide this, we have to see where it is used. The only place where we -require the stress is in the term - -$ (\sigma^{n-1},\varepsilon(\varphi))_{\Omega(t_{n-1})}$ -. In practice, we of -course replace this term by numerical quadrature: -

-
- - - -
$\displaystyle (\sigma^{n-1},\varepsilon(\varphi))_{\Omega(t_{n-1})} = \sum_{K\s...
-...athbb{T}}} \sum_q w_q \ \sigma^{n-1}(\vec x_q) : \varepsilon(\varphi(\vec x_q),$ -(19)
-

-where $ w_q$ - are the quadrature weights and $ \vec x_q$ - the quadrature points on -cell $ K$ -. This should make clear that what we really need is not the stress - -$ \sigma^{n-1}$ - in itself, but only the values of the stress in the quadrature -points on all cells. This, however, is a simpler task: we only have to provide -a data structure that is able to hold one symmetric tensor of rank 2 for each -quadrature point on all cells (or, since we compute in parallel, all -quadrature points of all cells that the present MPI process ``owns''). At the -end of each time step we then only have to evaluate -$ \varepsilon(\Delta \vec u^n(\vec x_q))$ -, multiply it by the stress-strain tensor $ C$ -, and use the -result to update the stress -$ \sigma^n(\vec x_q)$ - at quadrature point $ q$ -. - -

-The second complication is not visible in our notation as chosen above. It is -due to the fact that we compute -$ \Delta u^n$ - on the domain -$ \Omega(t_{n-1})$ -, -and then use this displacement increment to both update the stress as well as -move the mesh nodes around to get to -$ \Omega(t_n)$ - on which the next increment -is computed. What we have to make sure, in this context, is that moving the -mesh does not only involve moving around the nodes, but also making -corresponding changes to the stress variable: the updated stress is a variable -that is defined with respect to the coordinate system of the material in the -old domain, and has to be transferred to the new domain. The reason for this -can be understood as follows: locally, the incremental deformation -$ \Delta\vec u$ - can be decomposed into three parts, a linear translation (the constant part -of the displacement increment field in the neighborhood of a point), a -dilational -component (that part of the gradient of the displacement field that has a -nonzero divergence), and a rotation. A linear translation of the material does -not affect the stresses that are frozen into it - the stress values are -simply translated along. The dilational or compressional change produces a -corresponding stress update. However, the rotational component does not -necessarily induce a nonzero stress update (think, in 2d, for example of the -situation where -$ \Delta\vec u=(y, -x)^T$ -, with which -$ \varepsilon(\Delta \vec u)=0$ -). Nevertheless, if the the material was pre-stressed in a certain -direction, then this direction will be rotated along with the material. To -this end, we have to define a rotation matrix -$ R(\Delta \vec u^n)$ - that -describes, in each point the rotation due to the displacement increments. It -is not hard to see that the actual dependence of $ R$ - on -$ \Delta \vec u^n$ - can -only be through the curl of the displacement, rather than the displacement -itself or its full gradient (as mentioned above, the constant components of -the increment describe translations, its divergence the dilational modes, and -the curl the rotational modes). Since the exact form of $ R$ - is cumbersome, we -only state it in the program code, and note that the correct updating formula -for the stress variable is then -

-
- - - -
$\displaystyle \sigma^n = R(\Delta \vec u^n)^T [\sigma^{n-1} + C \varepsilon (\Delta \vec u^n)] R(\Delta \vec u^n).$ -(20)
-

- -

-Both stress update and rotation are implemented in the function -update_quadrature_point_history of the example program. - -

- -

-Parallel graphical output -

- -

-In the step-17 example program, the main bottleneck for parallel computations -was that only the first processor generated output for the entire domain. -Since generating graphical output is expensive, this did not scale well when -large numbers of processors were involved. However, no viable ways around this -problem were implemented in the library at the time, and the problem was -deferred to a later version. - -

-This functionality has been implemented in the meantime, and this is the time -to explain its use. Basically, what we need to do is let every process -generate graphical output for that subset of cells that it owns, write them -into separate files and have a way to merge them later on. At this point, it -should be noted that none of the graphical output formats known to the author -of this program allows for a simple way to later re-read it and merge it with -other files corresponding to the same simulation. What deal.II therefore -offers is the following: When you call the DataOut::build_patches -function, an intermediate format is generated that contains all the -information for the data on each cell. Usually, this intermediate format is -then further processed and converted into one of the graphical formats that we -can presently write, such as gmv, eps, ucd, gnuplot, or a number of other -ones. Once written in these formats, there is no way to reconstruct the -necessary information to merge multiple blocks of output. However, the base -classes of DataOut also allow to simply dump the intermediate format -to a file, from which it can later be recovered without loss of information. - -

-This has two advantages: first, simulations may just dump the intermediate -format data during run-time, and the user may later decide which particular -graphics format she wants to have. This way, she does not have to re-run the -entire simulation if graphical output is requested in a different format. One -typical case is that one would like to take a quick look at the data with -gnuplot, and then create high-quality pictures using GMV or OpenDX. Since both -can be generated out of the intermediate format without problem, there is no -need to re-run the simulation. - -

-In the present context, of more interest is the fact that in contrast to any -of the other formats, it is simple to merge multiple files of intermediate -format, if they belong to the same simulation. This is what we will do here: -we will generate one output file in intermediate format for each processor -that belongs to this computation (in the sequential case, this will simply be -a single file). They may then later be read in and merged so that we can -output a single file in whatever graphical format is requested. - -

-The way to do this is to first instruct the DataOutBase class to -write intermediate format rather than in gmv or any other graphical -format. This is simple: just use -data_out.write_deal_II_intermediate. We will write to a file -called solution-TTTT.TTTT.d2 if there is only one processor, or -files solution-TTTT.TTTT.NNN.d2 if this is really a parallel -job. Here, TTTT.TTTT denotes the time for which this output has -been generated, and NNN the number of the MPI process that did this. - -

-The next step is to convert this file or these files into whatever -format you like. The program that does this is the step-19 tutorial program: -for example, for the first time step, call it through -

-../step-19/step-19 solution-0001.0000.*.d2 solution-0001.0000.gmv - -
-to merge all the intermediate format files into a single file in GMV -format. More details on the parameters of this program and what it can do for -you can be found in the documentation of the step-19 tutorial program. - -

- -

-Overall structure of the program -

- -

-The overall structure of the program can be inferred from the run() -function that first calls do_initial_timestep() for the first time -step, and then do_timestep() on all subsequent time steps. The -difference between these functions is only that in the first time step we -start on a coarse mesh, solve on it, refine the mesh adaptively, and then -start again with a clean state on that new mesh. This procedure gives us a -better starting mesh, although we should of course keep adapting the mesh as -iterations proceed - this isn't done in this program, but commented on below. - -

-The common part of the two functions treating time steps is the following -sequence of operations on the present mesh: - -

- -

-With this general structure of the code, we only have to define what case we -want to solve. For the present program, we have chosen to simulate the -quasistatic deformation of a vertical cylinder for which the bottom boundary -is fixed and the top boundary is pushed down at a prescribed vertical -velocity. However, the horizontal velocity of the top boundary is left -unspecified - one can imagine this situation as a well-greased plate pushing -from the top onto the cylinder, the points on the top boundary of the cylinder -being allowed to slide horizontally along the surface of the plate, but forced -to move downward by the plate. The inner and outer boundaries of the cylinder -are free and not subject to any prescribed deflection or traction. In -addition, gravity acts on the body. - -

-The program text will reveal more about how to implement this situation, and -the results section will show what displacement pattern comes out of this -simulation. - -

- -

-Possible directions for extensions -

- -

-The program as is does not really solve an equation that has many applications -in practice: quasi-static material deformation based on a purely elastic law -is almost boring. However, the program may serve as the starting point for -more interesting experiments, and that indeed was the initial motivation for -writing it. Here are some suggestions of what the program is missing and in -what direction it may be extended: - -

- -

-Plasticity models. -

The most obvious extension is to use a more -realistic material model for large-scale quasistatic deformation. The natural -choice for this would be plasticity, in which a nonlinear relationship between -stress and strain replaces equation ([*]). Plasticity -models are usually rather complicated to program since the stress-strain -dependence is generally non-smooth. The material can be thought of being able -to withstand only a maximal stress (the yield stress) after which it starts to -``flow''. A mathematical description to this can be given in the form of a -variational inequality, which alternatively can be treated as minimizing the -elastic energy -

-
- - - -
$\displaystyle E(\vec u) = (\varepsilon(\vec u), C\varepsilon(\vec u))_{\Omega} - (\vec f, \vec u)_{\Omega} - (\vec b, \vec u)_{\Gamma_N},$ -(24)
-

-subject to the constraint -

-
- - - -
$\displaystyle f(\sigma(\vec u)) \le 0$ -(25)
-

-on the stress. This extension makes the problem to be solved in each time step -nonlinear, so we need another loop within each time step. - -

-Without going into further details of this model, we refer to the excellent -book by Simo and Hughes on ``Computational Inelasticity'' for a -comprehensive overview of computational strategies for solving plastic -models. Alternatively, a brief but concise description of an algorithm for -plasticity is given in an article by S. Commend, A. Truty, and Th. Zimmermann, -titled ``Stabilized finite elements applied to -elastoplasticity: I. Mixed displacement-pressure formulation'' -(Computer Methods in Applied Mechanics and Engineering, vol. 193, -pp. 3559-3586, 2004). - -

- -

-Stabilization issues. -

The formulation we have chosen, i.e. using -piecewise (bi-, tri-)linear elements for all components of the displacement -vector, and treating the stress as a variable dependent on the displacement is -appropriate for most materials. However, this so-called displacement-based -formulation becomes unstable and exhibits spurious modes for incompressible or -nearly-incompressible materials. While fluids are usually not elastic (in most -cases, the stress depends on velocity gradients, not displacement gradients, -although there are exceptions such as electro-rheologic fluids), there are a -few solids that are nearly incompressible, for example rubber. Another case is -that many plasticity models ultimately let the material become incompressible, -although this is outside the scope of the present program. - -

-Incompressibility is characterized by Poisson's ratio -

-
- - - -
$\displaystyle \nu = \frac{\lambda}{2(\lambda+\mu)},$ -   
-

-where -$ \lambda,\mu$ - are the Lamé constants of the material. -Physical constraints indicate that -$ -1\le \nu\le \tfrac 12$ - (the condition -also follows from mathematical stability considerations). If $ \nu$ - -approaches $ \tfrac 12$ -, then the material becomes incompressible. In that -case, pure displacement-based formulations are no longer appropriate for the -solution of such problems, and stabilization techniques have to be employed -for a stable and accurate solution. The book and paper cited above give -indications as to how to do this, but there is also a large volume of -literature on this subject; a good start to get an overview of the topic can -be found in the references of the paper by -H.-Y. Duan and Q. Lin on ``Mixed finite elements of least-squares type for -elasticity'' (Computer Methods in Applied Mechanics and Engineering, vol. 194, -pp. 1093-1112, 2005). - -

- -

-Refinement during timesteps. -

In the present form, the program -only refines the initial mesh a number of times, but then never again. For any -kind of realistic simulation, one would want to extend this so that the mesh -is refined and coarsened every few time steps instead. This is not hard to do, -in fact, but has been left for future tutorial programs or as an exercise, if -you wish. The main complication one has to overcome is that one has to -transfer the data that is stored in the quadrature points of the cells of the -old mesh to the new mesh, preferably by some sort of projection scheme. This -is only slightly messy in the sequential case; in fact, the functions -FETools :: get_projection_from_quadrature_points_matrix will do -the projection, and the FiniteElement :: get_restriction_matrix and -FiniteElement :: get_prolongation_matrix functions will do the -transfer between mother and child cells. However, it becomes complicated -once we run the program in parallel, since then each process only stores this -data for the cells it owned on the old mesh, and it may need to know the -values of the quadrature point data on other cells if the corresponding cells -on the new mesh are assigned to this process after subdividing the new mesh. A -global communication of these data elements is therefore necessary, making the -entire process a little more unpleasant. - -

- -

-Ensuring mesh regularity. -

At present, the program makes no attempt -to make sure that a cell, after moving its vertices at the end of the time -step, still has a valid geometry (i.e. that its Jacobian determinant is -positive and bounded away from zero everywhere). It is, in fact, not very hard -to set boundary values and forcing terms in such a way that one gets distorted -and inverted cells rather quickly. Certainly, in some cases of large -deformation, this is unavoidable with a mesh of finite mesh size, but in some -other cases this should be preventable by appropriate mesh refinement and/or a -reduction of the time step size. The program does not do that, but a more -sophisticated version definitely should employ some sort of heuristic defining -what amount of deformation of cells is acceptable, and what isn't. - -

- -

-Compiling the program -

- -

-Finally, just to remind everyone: the program runs in 3d (see the definition -of the elastic_problem variable in main(), unlike almost -all of the other example programs. While the compiler doesn't care what -dimension it compiles for, the linker has to know which library to link with. -And as explained in other places, this requires slight changes to the Makefile -compared to the other tutorial programs. In particular, everywhere where the -2d versions of libraries are mentioned, one needs to change this to 3d, -although this is already done in the distributed version of the Makefile. -Conversely, if you want to run the program in 2d (after making the necessary -changes to accommodate for a 2d geometry), you have to change the Makefile -back to allow for 2d. diff --git a/deal.II/examples/step-18/doc/intro.pdf b/deal.II/examples/step-18/doc/intro.pdf deleted file mode 100644 index d03b5a01be..0000000000 Binary files a/deal.II/examples/step-18/doc/intro.pdf and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro.tex b/deal.II/examples/step-18/doc/intro.tex deleted file mode 100644 index 0bc030bd3a..0000000000 --- a/deal.II/examples/step-18/doc/intro.tex +++ /dev/null @@ -1,666 +0,0 @@ -\documentclass{article} -\usepackage{amsmath} -\usepackage{amsfonts} -\renewcommand{\vec}[1]{\mathbf{#1}} -\renewcommand{\div}{\mathrm{div}\ } -\begin{document} - -This tutorial program is another one in the series on the elasticity problem -that we have already started with step-8 and step-17. It extends it into two -different directions: first, it solves the quasistatic but time dependent -elasticity problem for large deformations with a Lagrangian mesh movement -approach. Secondly, it shows some more techniques for solving such problems -using parallel processing with PETSc's linear algebra. In addition to this, we -show how to work around the main bottleneck of step-17, namely that we -generated graphical output from only one process, and that this scaled very -badly with larger numbers of processes and on large problems. Finally, a good -number of assorted improvements and techniques are demonstrated that have not -been shown yet in previous programs. - -As before in step-17, the program runs just as fine on a single sequential -machine as long as you have PETSc installed. Information on how to tell -deal.II about a PETSc installation on your system can be found in the deal.II -README file, which is linked to from the main documentation page -\texttt{doc/index.html} in your installation of deal.II, or on the deal.II -webpage \texttt{http://www.dealii.org/}. - - -\subsection*{Quasistatic elastic deformation} - -\subsubsection*{Motivation of the model} - -In general, time-dependent small elastic deformations are described by the -elastic wave equation -\begin{gather} - \rho \frac{\partial^2 \vec u}{\partial t^2} - + c \frac{\partial \vec u}{\partial t} - - \div ( C \varepsilon(\vec u)) = \vec f - \qquad - \text{in $\Omega$}, -\end{gather} -where $\vec u=\vec u (\vec x,t)$ is the deformation of the body, $\rho$ -and $c$ the density and attenuation coefficient, and $\vec f$ external forces. -In addition, initial conditions -\begin{align} - \vec u(\cdot, 0) = \vec u_0(\cdot) - \qquad - \text{on $\Omega$}, -\end{align} -and Dirichlet (displacement) or Neumann (traction) boundary conditions need -to be specified for a unique solution: -\begin{align} - \vec u(\vec x,t) &= \vec d(\vec x,t) - \qquad - &&\text{on $\Gamma_D\subset\partial\Omega$}, - \\ - \vec n \ C \varepsilon(\vec u(\vec x,t)) &= \vec b(\vec x,t) - \qquad - &&\text{on $\Gamma_N=\partial\Omega\backslash\Gamma_D$}. -\end{align} -In above formulation, $\varepsilon(\vec u)= \tfrac 12 (\nabla \vec u + \nabla -\vec u^T)$ is the symmetric gradient of the displacement, also called the -\textit{strain}. $C$ is a tensor of rank 4, called the \textit{stress-strain - tensor} that contains knowledge of the elastic strength of the material; its -symmetry properties make sure that it maps symmetric tensors of rank 2 -(``matrices'' of dimension $d$, where $d$ is the spatial dimensionality) onto -symmetric tensors of the same rank. We will comment on the roles of the strain -and stress tensors more below. For the moment it suffices to say that we -interpret the term $\div ( C \varepsilon(\vec u))$ as the vector with -components $\tfrac \partial{\partial x_j} C_{ijkl} \varepsilon(\vec u)_{kl}$, -where summation over indices $j,k,l$ is implied. - -The quasistatic limit of this equation is motivated as follows: each small -perturbation of the body, for example by changes in boundary condition or the -forcing function, will result in a corresponding change in the configuration -of the body. In general, this will be in the form of waves radiating away from -the location of the disturbance. Due to the presence of the damping term, -these waves will be attenuated on a time scale of, say, $\tau$. Now, assume -that all changes in external forcing happen on times scales that are -much larger than $\tau$. In that case, the dynamic nature of the change is -unimportant: we can consider the body to always be in static equilibrium, -i.e.~we can assume that at all times the body satisfies -\begin{align} - - \div ( C \varepsilon(\vec u)) &= \vec f - &&\text{in $\Omega$}, - \\ - \vec u(\vec x,t) &= \vec d(\vec x,t) - \qquad - &&\text{on $\Gamma_D$}, - \\ - \vec n \ C \varepsilon(\vec u(\vec x,t)) &= \vec b(\vec x,t) - \qquad - &&\text{on $\Gamma_N$}. -\end{align} -Note that the differential equation does not contain any time derivatives any -more -- all time dependence is introduced through boundary conditions and a -possibly time-varying force function $\vec f(\vec x,t)$. The changes in -configuration can therefore be considered as being stationary -instantaneously. An alternative view of this is that $t$ is not really a time -variable, but only a time-like parameter that governs the evolution of the -problem. - -While these equations are sufficient to describe small deformations, computing -large deformations is a little more complicated. To do so, let us first -introduce a tensorial stress variable $\sigma$, and write the differential -equations in terms of the stress: -\begin{align} - - \div \sigma &= \vec f - &&\text{in $\Omega(t)$}, - \\ - \vec u(\vec x,t) &= \vec d(\vec x,t) - \qquad - &&\text{on $\Gamma_D\subset\partial\Omega(t)$}, - \\ - \vec n \ C \varepsilon(\vec u(\vec x,t)) &= \vec b(\vec x,t) - \qquad - &&\text{on $\Gamma_N=\partial\Omega(t)\backslash\Gamma_D$}. -\end{align} -Note that these equations are posed on a domain $\Omega(t)$ that -changes with time, with the boundary moving according to the -displacements $\vec u(\vec x,t)$ of the points on the boundary. To -complete this system, we have to specify the incremental relationship between -the stress and the strain, as follows: -\begin{align} - \label{eq:stress-strain} - \dot\sigma = C \varepsilon (\dot{\vec u}), -\end{align} -where a dot indicates a time derivative. Both the stress $\sigma$ and the -strain $\varepsilon(\vec u)$ are symmetric tensors of rank 2. - - -\subsubsection*{Time discretization} - -Numerically, this system is solved as follows: first, we discretize -the time component using a backward Euler scheme. This leads to a -discrete equilibrium of force at time step $n$: -\begin{gather} - -\div \sigma^n = f^n, -\end{gather} -where -\begin{gather} - \sigma^n = \sigma^{n-1} + C \varepsilon (\Delta \vec u^n), -\end{gather} -and $\Delta \vec u^n$ the incremental displacement for time step -$n$. In addition, we have to specify initial data $\vec u(\cdot,0)=\vec u_0$. -This way, if we want to solve for the displacement increment, we -have to solve the following system: -\begin{align} - - \div C \varepsilon(\Delta\vec u^n) &= \vec f + \div \sigma^{n-1} - &&\text{in $\Omega(t_{n-1})$}, - \\ - \Delta \vec u^n(\vec x,t) &= \vec d(\vec x,t_n) - \vec d(\vec x,t_{n-1}) - \qquad - &&\text{on $\Gamma_D\subset\partial\Omega(t_{n-1})$}, - \\ - \vec n \ C \varepsilon(\Delta \vec u^n(\vec x,t)) &= \vec b(\vec x,t_n)-\vec b(\vec x,t_{n-1}) - \qquad - &&\text{on $\Gamma_N=\partial\Omega(t_{n-1})\backslash\Gamma_D$}. -\end{align} -The weak form of this set of equations, which as usual is the basis for the -finite element formulation, reads as follows: find $\Delta \vec u^n \in -\{v\in H^1(\Omega(t_{n-1}))^d: v|_{\Gamma_D}=\vec d(\cdot,t_n) - \vec d(\cdot,t_{n-1})\}$ -such that -\begin{gather} - \begin{split} - \label{eq:linear-system} - (C \varepsilon(\Delta\vec u^n), \varepsilon(\varphi) )_{\Omega(t_{n-1})} - = - (\vec f, \varphi)_{\Omega(t_{n-1})} - -(\sigma^{n-1},\varepsilon(\varphi))_{\Omega(t_{n-1})} - \\ - +(\vec b(\vec x,t_n)-\vec b(\vec x,t_{n-1}), \varphi)_{\Gamma_N} - \\ - \forall \varphi \in \{\vec v\in H^1(\Omega(t_{n-1}))^d: \vec - v|_{\Gamma_D}=0\}. - \end{split} -\end{gather} -We note that, for simplicity, in the program we will always assume that there -are no boundary forces, i.e.~$\vec b = 0$, and that the deformation of the -body is driven by body forces $\vec f$ and prescribed boundary displacements -$\vec d$ alone. It is also worth noting that when integrating by parts, we -would get terms of the form $(C \varepsilon(\Delta\vec u^n), \nabla \varphi -)_{\Omega(t_{n-1})}$, but that we replace it with the term involving the -symmetric gradient $\varepsilon(\varphi)$ instead of $\nabla\varphi$. Due to -the symmetry of $C$, the two terms are equivalent, but the symmetric version -avoids a potential for round-off to render the resulting matrix slightly -non-symmetric. - -The system at time step $n$, to be solved on the old domain -$\Omega(t_{n-1})$, has exactly the form of a stationary elastic -problem, and is therefore similar to what we have already implemented -in previous example programs. We will therefore not comment on the -space discretization beyond saying that we again use lowest order -continuous finite elements. - -There are differences, however: -\begin{enumerate} - \item We have to move (update) the mesh after each time step, in order to be - able to solve the next time step on a new domain; - - \item We need to know $\sigma^{n-1}$ to compute the next incremental - displacement, i.e.~we need to compute it at the end of the time step - to make sure it is available for the next time step. Essentially, - the stress variable is our window to the history of deformation of - the body. -\end{enumerate} -These two operations are done in the functions \texttt{move\_mesh} and -\texttt{update\_\-quadrature\_\-point\_history} in the program. While moving -the mesh is only a technicality, updating the stress is a little more -complicated and will be discussed in the next section. - - -\subsubsection*{Updating the stress variable} - -As indicated above, we need to have the stress variable $\sigma^n$ available -when computing time step $n+1$, and we can compute it using -\begin{gather} - \label{eq:stress-update} - \sigma^n = \sigma^{n-1} + C \varepsilon (\Delta \vec u^n). -\end{gather} -There are, despite the apparent simplicity of this equation, two questions -that we need to discuss. The first concerns the way we store $\sigma^n$: even -if we compute the incremental updates $\Delta\vec u^n$ using lowest-order -finite elements, then its symmetric gradient $\varepsilon(\Delta\vec u^n)$ is -in general still a function that is not easy to describe. In particular, it is -not a piecewise constant function, and on general meshes (with cells that are -not rectangles parallel to the coordinate axes) or with non-constant -stress-strain tensors $C$ it is not even a bi- or trilinear function. Thus, it -is a priori not clear how to store $\sigma^n$ in a computer program. - -To decide this, we have to see where it is used. The only place where we -require the stress is in the term -$(\sigma^{n-1},\varepsilon(\varphi))_{\Omega(t_{n-1})}$. In practice, we of -course replace this term by numerical quadrature: -\begin{gather} - (\sigma^{n-1},\varepsilon(\varphi))_{\Omega(t_{n-1})} - = - \sum_{K\subset {\mathbb{T}}} - (\sigma^{n-1},\varepsilon(\varphi))_K - \approx - \sum_{K\subset {\mathbb{T}}} - \sum_q - w_q \ \sigma^{n-1}(\vec x_q) : \varepsilon(\varphi(\vec x_q), -\end{gather} -where $w_q$ are the quadrature weights and $\vec x_q$ the quadrature points on -cell $K$. This should make clear that what we really need is not the stress -$\sigma^{n-1}$ in itself, but only the values of the stress in the quadrature -points on all cells. This, however, is a simpler task: we only have to provide -a data structure that is able to hold one symmetric tensor of rank 2 for each -quadrature point on all cells (or, since we compute in parallel, all -quadrature points of all cells that the present MPI process ``owns''). At the -end of each time step we then only have to evaluate $\varepsilon(\Delta \vec -u^n(\vec x_q))$, multiply it by the stress-strain tensor $C$, and use the -result to update the stress $\sigma^n(\vec x_q)$ at quadrature point $q$. - -The second complication is not visible in our notation as chosen above. It is -due to the fact that we compute $\Delta u^n$ on the domain $\Omega(t_{n-1})$, -and then use this displacement increment to both update the stress as well as -move the mesh nodes around to get to $\Omega(t_n)$ on which the next increment -is computed. What we have to make sure, in this context, is that moving the -mesh does not only involve moving around the nodes, but also making -corresponding changes to the stress variable: the updated stress is a variable -that is defined with respect to the coordinate system of the material in the -old domain, and has to be transferred to the new domain. The reason for this -can be understood as follows: locally, the incremental deformation $\Delta\vec -u$ can be decomposed into three parts, a linear translation (the constant part -of the displacement increment field in the neighborhood of a point), a -dilational -component (that part of the gradient of the displacement field that has a -nonzero divergence), and a rotation. A linear translation of the material does -not affect the stresses that are frozen into it -- the stress values are -simply translated along. The dilational or compressional change produces a -corresponding stress update. However, the rotational component does not -necessarily induce a nonzero stress update (think, in 2d, for example of the -situation where $\Delta\vec u=(y, -x)^T$, with which $\varepsilon(\Delta \vec -u)=0$). Nevertheless, if the the material was pre-stressed in a certain -direction, then this direction will be rotated along with the material. To -this end, we have to define a rotation matrix $R(\Delta \vec u^n)$ that -describes, in each point the rotation due to the displacement increments. It -is not hard to see that the actual dependence of $R$ on $\Delta \vec u^n$ can -only be through the curl of the displacement, rather than the displacement -itself or its full gradient (as mentioned above, the constant components of -the increment describe translations, its divergence the dilational modes, and -the curl the rotational modes). Since the exact form of $R$ is cumbersome, we -only state it in the program code, and note that the correct updating formula -for the stress variable is then -\begin{gather} - \label{eq:stress-update+rot} - \sigma^n - = - R(\Delta \vec u^n)^T - [\sigma^{n-1} + C \varepsilon (\Delta \vec u^n)] - R(\Delta \vec u^n). -\end{gather} - -Both stress update and rotation are implemented in the function -\texttt{update\_\-quadrature\_\-point\_history} of the example program. - - -\subsection*{Parallel graphical output} - -In the step-17 example program, the main bottleneck for parallel computations -was that only the first processor generated output for the entire domain. -Since generating graphical output is expensive, this did not scale well when -large numbers of processors were involved. However, no viable ways around this -problem were implemented in the library at the time, and the problem was -deferred to a later version. - -This functionality has been implemented in the meantime, and this is the time -to explain its use. Basically, what we need to do is let every process -generate graphical output for that subset of cells that it owns, write them -into separate files and have a way to merge them later on. At this point, it -should be noted that none of the graphical output formats known to the author -of this program allows for a simple way to later re-read it and merge it with -other files corresponding to the same simulation. What deal.II therefore -offers is the following: When you call the \texttt{DataOut::build\_patches} -function, an intermediate format is generated that contains all the -information for the data on each cell. Usually, this intermediate format is -then further processed and converted into one of the graphical formats that we -can presently write, such as gmv, eps, ucd, gnuplot, or a number of other -ones. Once written in these formats, there is no way to reconstruct the -necessary information to merge multiple blocks of output. However, the base -classes of \texttt{DataOut} also allow to simply dump the intermediate format -to a file, from which it can later be recovered without loss of information. - -This has two advantages: first, simulations may just dump the intermediate -format data during run-time, and the user may later decide which particular -graphics format she wants to have. This way, she does not have to re-run the -entire simulation if graphical output is requested in a different format. One -typical case is that one would like to take a quick look at the data with -gnuplot, and then create high-quality pictures using GMV or OpenDX. Since both -can be generated out of the intermediate format without problem, there is no -need to re-run the simulation. - -In the present context, of more interest is the fact that in contrast to any -of the other formats, it is simple to merge multiple files of intermediate -format, if they belong to the same simulation. This is what we will do here: -we will generate one output file in intermediate format for each processor -that belongs to this computation (in the sequential case, this will simply be -a single file). They may then later be read in and merged so that we can -output a single file in whatever graphical format is requested. - -The way to do this is to first instruct the \texttt{DataOutBase} class to -write intermediate format rather than in gmv or any other graphical -format. This is simple: just use -\texttt{data\_out.write\_deal\_II\_intermediate}. We will write to a file -called \texttt{solution-TTTT.TTTT.d2} if there is only one processor, or -files \texttt{solution-TTTT.TTTT.NNN.d2} if this is really a parallel -job. Here, \texttt{TTTT.TTTT} denotes the time for which this output has -been generated, and \texttt{NNN} the number of the MPI process that did this. - -The next step is to convert this file or these files into whatever -format you like. The program that does this is the step-19 tutorial program: -for example, for the first time step, call it through -\begin{center} - \texttt{../step-19/step-19 solution-0001.0000.*.d2 solution-0001.0000.gmv} -\end{center} -to merge all the intermediate format files into a single file in GMV -format. More details on the parameters of this program and what it can do for -you can be found in the documentation of the step-19 tutorial program. - - - -\subsection*{Overall structure of the program} - -The overall structure of the program can be inferred from the \texttt{run()} -function that first calls \texttt{do\_initial\_timestep()} for the first time -step, and then \texttt{do\_timestep()} on all subsequent time steps. The -difference between these functions is only that in the first time step we -start on a coarse mesh, solve on it, refine the mesh adaptively, and then -start again with a clean state on that new mesh. This procedure gives us a -better starting mesh, although we should of course keep adapting the mesh as -iterations proceed -- this isn't done in this program, but commented on below. - -The common part of the two functions treating time steps is the following -sequence of operations on the present mesh: -\begin{itemize} -\item \texttt{assemble\_system ()} [via \texttt{solve\_timestep ()}]: - This first function is also the most interesting one. It assembles the - linear system corresponding to the discretized version of equation - \eqref{eq:linear-system}. This leads to a system matrix $A_{ij} = \sum_K - A^K_{ij}$ built up of local contributions on each cell $K$ with entries - \begin{gather} - A^K_{ij} = (C \varepsilon(\varphi_j), \varepsilon(\varphi_i))_K; - \end{gather} - In practice, $A^K$ is computed using numerical quadrature according to the - formula - \begin{gather} - A^K_{ij} = \sum_q w_q [\varepsilon(\varphi_i(\vec x_q)) : C : - \varepsilon(\varphi_j(\vec x_q))], - \end{gather} - with quadrature points $\vec x_q$ and weights $w_q$. We have built these - contributions before, in step-8 and step-17, but in both of these cases we - have done so rather clumsily by using knowledge of how the rank-4 tensor $C$ - is composed, and considering individual elements of the strain tensors - $\varepsilon(\varphi_i),\varepsilon(\varphi_j)$. This is not really - convenient, in particular if we want to consider more complicated elasticity - models than the isotropic case for which $C$ had the convenient form - $C_{ijkl} = \lambda \delta_{ij} \delta_{kl} + \mu (\delta_{ik} \delta_{jl} - + \delta_{il} \delta_{jk})$. While we in fact do not use a more complicated - form than this in the present program, we nevertheless want to write it in a - way that would easily allow for this. It is then natural to introduce - classes that represent symmetric tensors of rank 2 (for the strains and - stresses) and 4 (for the stress-strain tensor $C$). Fortunately, deal.II - provides these: the \texttt{SymmetricTensor} class template - provides a full-fledged implementation of such tensors of rank \texttt{rank} - (which needs to be an even number) and dimension \texttt{dim}. - - What we then need is two things: a way to create the stress-strain rank-4 - tensor $C$ as well as to create a symmetric tensor of rank 2 (the strain - tensor) from the gradients of a shape function $\varphi_i$ at a quadrature - point $\vec x_q$ on a given cell. At the top of the implementation of this - example program, you will find such functions. The first one, - \texttt{get\_stress\_strain\_tensor}, takes two arguments corresponding to - the Lam\'e constants $\lambda$ and $\mu$ and returns the stress-strain tensor - for the isotropic case corresponding to these constants (in the program, we - will choose constants corresponding to steel); it would be simple to replace - this function by one that computes this tensor for the anisotropic case, or - taking into account crystal symmetries, for example. The second one, - \texttt{get\_strain} takes an object of type \texttt{FEValues} and indices - $i$ and $q$ and returns the symmetric gradient, i.e. the strain, - corresponding to shape function $\varphi_i(\vec x_q)$, evaluated on the cell - on which the \texttt{FEValues} object was last reinitialized. - - Given this, the innermost loop of \texttt{assemble\_system} computes the - local contributions to the matrix in the following elegant way (the variable - \texttt{stress\_strain\_tensor}, corresponding to the tensor $C$, has - previously been initialized with the result of the first function above): - \begin{verbatim} -for (unsigned int i=0; i - eps_phi_i = get_strain (fe_values, i, q_point), - eps_phi_j = get_strain (fe_values, j, q_point); - - cell_matrix(i,j) - += (eps_phi_i * stress_strain_tensor * eps_phi_j - * - fe_values.JxW (q_point)); - } - \end{verbatim} - It is worth noting the expressive power of this piece of code, and to - compare it with the complications we had to go through in previous examples - for the elasticity problem. (To be fair, the \texttt{SymmetricTensor} class - template did not exist when these previous examples were written.) For - simplicity, \texttt{operator*} provides for the (double summation) product - between symmetric tensors of even rank here. - - Assembling the local contributions - \begin{gather} - \begin{split} - f^K_i &= - (\vec f, \varphi_i)_K -(\sigma^{n-1},\varepsilon(\varphi_i))_K - \\ - &\approx - \sum_q - w_q \left\{ - \vec f(\vec x_q) \cdot \varphi_i(\vec x_q) - - \sigma^{n-1}_q : \varepsilon(\varphi_i(\vec x_q)) - \right\} - \end{split} - \end{gather} - to the right hand side of \eqref{eq:linear-system} is equally - straightforward (note that we do not consider any boundary tractions $\vec - b$ here). Remember that we only had to store the old stress in the - quadrature points of cells. In the program, we will provide a variable - \texttt{local\_quadrature\_points\_data} that allows to access the stress - $\sigma^{n-1}_q$ in each quadrature point. With this the code for the right - hand side looks as this, again rather elegant: - \begin{verbatim} -for (unsigned int i=0; i &old_stress - = local_quadrature_points_data[q_point].old_stress; - - cell_rhs(i) += (body_force_values[q_point](component_i) * - fe_values.shape_value (i,q_point) - - - old_stress * - get_strain (fe_values,i,q_point)) - * - fe_values.JxW (q_point); - } - } - \end{verbatim} - Note that in the multiplication $\vec f(\vec x_q) \cdot \varphi_i(\vec - x_q)$, we have made use of the fact that for the chosen finite element, only - one vector component (namely \texttt{component\_i}) of $\varphi_i$ is - nonzero, and that we therefore also have to consider only one component of - $\vec f(\vec x_q)$. - - This essentially concludes the new material we present in this function. It - later has to deal with boundary conditions as well as hanging node - constraints, but this parallels what we had to do previously in other - programs already. - -\item \texttt{solve\_linear\_problem ()} [via \texttt{solve\_timestep ()}]: - Unlike the previous one, this function is not really interesting, since it - does what similar functions have done in all previous tutorial programs -- - solving the linear system using the CG method, using an incomplete LU - decomposition as a preconditioner (in the parallel case, it uses an ILU of - each processor's block separately). It is virtually unchanged - from step-17. - -\item \texttt{update\_quadrature\_point\_history ()} [via - \texttt{solve\_timestep ()}]: Based on the displacement field $\Delta \vec - u^n$ computed before, we update the stress values in all quadrature points - according to \eqref{eq:stress-update} and \eqref{eq:stress-update+rot}, - including the rotation of the coordinate system. - -\item \texttt{move\_mesh ()}: Given the solution computed before, in this - function we deform the mesh by moving each vertex by the displacement vector - field evaluated at this particular vertex. - -\item \texttt{output\_results ()}: This function simply outputs the solution - based on what we have said above, i.e. every processor computes output only - for its own portion of the domain, and this can then be later merged by an - external program. In addition to the solution, we also compute the norm of - the stress averaged over all the quadrature points on each cell. -\end{itemize} - -With this general structure of the code, we only have to define what case we -want to solve. For the present program, we have chosen to simulate the -quasistatic deformation of a vertical cylinder for which the bottom boundary -is fixed and the top boundary is pushed down at a prescribed vertical -velocity. However, the horizontal velocity of the top boundary is left -unspecified -- one can imagine this situation as a well-greased plate pushing -from the top onto the cylinder, the points on the top boundary of the cylinder -being allowed to slide horizontally along the surface of the plate, but forced -to move downward by the plate. The inner and outer boundaries of the cylinder -are free and not subject to any prescribed deflection or traction. In -addition, gravity acts on the body. - -The program text will reveal more about how to implement this situation, and -the results section will show what displacement pattern comes out of this -simulation. - -\subsection*{Possible directions for extensions} - -The program as is does not really solve an equation that has many applications -in practice: quasi-static material deformation based on a purely elastic law -is almost boring. However, the program may serve as the starting point for -more interesting experiments, and that indeed was the initial motivation for -writing it. Here are some suggestions of what the program is missing and in -what direction it may be extended: - -\paragraph*{Plasticity models.} The most obvious extension is to use a more -realistic material model for large-scale quasistatic deformation. The natural -choice for this would be plasticity, in which a nonlinear relationship between -stress and strain replaces equation \eqref{eq:stress-strain}. Plasticity -models are usually rather complicated to program since the stress-strain -dependence is generally non-smooth. The material can be thought of being able -to withstand only a maximal stress (the yield stress) after which it starts to -``flow''. A mathematical description to this can be given in the form of a -variational inequality, which alternatively can be treated as minimizing the -elastic energy -\begin{gather} - E(\vec u) = - (\varepsilon(\vec u), C\varepsilon(\vec u))_{\Omega} - - (\vec f, \vec u)_{\Omega} - (\vec b, \vec u)_{\Gamma_N}, -\end{gather} -subject to the constraint -\begin{gather} - f(\sigma(\vec u)) \le 0 -\end{gather} -on the stress. This extension makes the problem to be solved in each time step -nonlinear, so we need another loop within each time step. - -Without going into further details of this model, we refer to the excellent -book by Simo and Hughes on ``Computational Inelasticity'' for a -comprehensive overview of computational strategies for solving plastic -models. Alternatively, a brief but concise description of an algorithm for -plasticity is given in an article by S. Commend, A. Truty, and Th. Zimmermann, -titled ``Stabilized finite elements applied to -elastoplasticity: I. Mixed displacement-pressure formulation'' -(Computer Methods in Applied Mechanics and Engineering, vol. 193, -pp. 3559--3586, 2004). - - -\paragraph*{Stabilization issues.} The formulation we have chosen, i.e. using -piecewise (bi-, tri-)linear elements for all components of the displacement -vector, and treating the stress as a variable dependent on the displacement is -appropriate for most materials. However, this so-called displacement-based -formulation becomes unstable and exhibits spurious modes for incompressible or -nearly-incompressible materials. While fluids are usually not elastic (in most -cases, the stress depends on velocity gradients, not displacement gradients, -although there are exceptions such as electro-rheologic fluids), there are a -few solids that are nearly incompressible, for example rubber. Another case is -that many plasticity models ultimately let the material become incompressible, -although this is outside the scope of the present program. - -Incompressibility is characterized by Poisson's ratio -\begin{gather*} - \nu = \frac{\lambda}{2(\lambda+\mu)}, -\end{gather*} -where $\lambda,\mu$ are the Lam\'e constants of the material. -Physical constraints indicate that $-1\le \nu\le \tfrac 12$ (the condition -also follows from mathematical stability considerations). If $\nu$ -approaches $\tfrac 12$, then the material becomes incompressible. In that -case, pure displacement-based formulations are no longer appropriate for the -solution of such problems, and stabilization techniques have to be employed -for a stable and accurate solution. The book and paper cited above give -indications as to how to do this, but there is also a large volume of -literature on this subject; a good start to get an overview of the topic can -be found in the references of the paper by -H.-Y. Duan and Q. Lin on ``Mixed finite elements of least-squares type for -elasticity'' (Computer Methods in Applied Mechanics and Engineering, vol. 194, -pp. 1093--1112, 2005). - - -\paragraph*{Refinement during timesteps.} In the present form, the program -only refines the initial mesh a number of times, but then never again. For any -kind of realistic simulation, one would want to extend this so that the mesh -is refined and coarsened every few time steps instead. This is not hard to do, -in fact, but has been left for future tutorial programs or as an exercise, if -you wish. The main complication one has to overcome is that one has to -transfer the data that is stored in the quadrature points of the cells of the -old mesh to the new mesh, preferably by some sort of projection scheme. This -is only slightly messy in the sequential case; in fact, the functions -\texttt{FETools} \texttt{::} \texttt{get\_projection\_from\_quadrature\_points\_matrix} will do -the projection, and the \texttt{FiniteElement} \texttt{::} \texttt{get\_restriction\_matrix} and -\texttt{FiniteElement} \texttt{::} \texttt{get\_prolongation\_matrix} functions will do the -transfer between mother and child cells. However, it becomes complicated -once we run the program in parallel, since then each process only stores this -data for the cells it owned on the old mesh, and it may need to know the -values of the quadrature point data on other cells if the corresponding cells -on the new mesh are assigned to this process after subdividing the new mesh. A -global communication of these data elements is therefore necessary, making the -entire process a little more unpleasant. - - -\paragraph*{Ensuring mesh regularity.} At present, the program makes no attempt -to make sure that a cell, after moving its vertices at the end of the time -step, still has a valid geometry (i.e. that its Jacobian determinant is -positive and bounded away from zero everywhere). It is, in fact, not very hard -to set boundary values and forcing terms in such a way that one gets distorted -and inverted cells rather quickly. Certainly, in some cases of large -deformation, this is unavoidable with a mesh of finite mesh size, but in some -other cases this should be preventable by appropriate mesh refinement and/or a -reduction of the time step size. The program does not do that, but a more -sophisticated version definitely should employ some sort of heuristic defining -what amount of deformation of cells is acceptable, and what isn't. - - -\subsection*{Compiling the program} - -Finally, just to remind everyone: the program runs in 3d (see the definition -of the \texttt{elastic\_problem} variable in \texttt{main()}, unlike almost -all of the other example programs. While the compiler doesn't care what -dimension it compiles for, the linker has to know which library to link with. -And as explained in other places, this requires slight changes to the Makefile -compared to the other tutorial programs. In particular, everywhere where the -2d versions of libraries are mentioned, one needs to change this to 3d, -although this is already done in the distributed version of the Makefile. -Conversely, if you want to run the program in 2d (after making the necessary -changes to accommodate for a 2d geometry), you have to change the Makefile -back to allow for 2d. - -\end{document} diff --git a/deal.II/examples/step-18/doc/intro/img1.png b/deal.II/examples/step-18/doc/intro/img1.png deleted file mode 100644 index 4f85ec9084..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img1.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img10.png b/deal.II/examples/step-18/doc/intro/img10.png deleted file mode 100644 index d4f762bbfc..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img10.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img100.png b/deal.II/examples/step-18/doc/intro/img100.png deleted file mode 100644 index 074293292d..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img100.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img101.png b/deal.II/examples/step-18/doc/intro/img101.png deleted file mode 100644 index 60d2b91105..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img101.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img11.png b/deal.II/examples/step-18/doc/intro/img11.png deleted file mode 100644 index edf440bcf9..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img11.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img12.png b/deal.II/examples/step-18/doc/intro/img12.png deleted file mode 100644 index 897795f8bc..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img12.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img13.png b/deal.II/examples/step-18/doc/intro/img13.png deleted file mode 100644 index e24e3a6c29..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img13.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img14.png b/deal.II/examples/step-18/doc/intro/img14.png deleted file mode 100644 index 18f848a3b5..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img14.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img15.png b/deal.II/examples/step-18/doc/intro/img15.png deleted file mode 100644 index 646de73fd4..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img15.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img16.png b/deal.II/examples/step-18/doc/intro/img16.png deleted file mode 100644 index abfc0473d3..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img16.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img17.png b/deal.II/examples/step-18/doc/intro/img17.png deleted file mode 100644 index 71e902470b..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img17.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img18.png b/deal.II/examples/step-18/doc/intro/img18.png deleted file mode 100644 index 4044e4d13b..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img18.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img19.png b/deal.II/examples/step-18/doc/intro/img19.png deleted file mode 100644 index bee30fa41f..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img19.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img2.png b/deal.II/examples/step-18/doc/intro/img2.png deleted file mode 100644 index dbf2486876..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img2.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img20.png b/deal.II/examples/step-18/doc/intro/img20.png deleted file mode 100644 index b17e0d9b2e..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img20.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img21.png b/deal.II/examples/step-18/doc/intro/img21.png deleted file mode 100644 index 59f19b9476..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img21.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img22.png b/deal.II/examples/step-18/doc/intro/img22.png deleted file mode 100644 index 51bc83c6dd..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img22.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img23.png b/deal.II/examples/step-18/doc/intro/img23.png deleted file mode 100644 index 37de84a542..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img23.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img24.png b/deal.II/examples/step-18/doc/intro/img24.png deleted file mode 100644 index 50bf784172..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img24.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img25.png b/deal.II/examples/step-18/doc/intro/img25.png deleted file mode 100644 index 92f8d26d44..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img25.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img26.png b/deal.II/examples/step-18/doc/intro/img26.png deleted file mode 100644 index 91695bc5bc..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img26.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img27.png b/deal.II/examples/step-18/doc/intro/img27.png deleted file mode 100644 index d1adfec4b5..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img27.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img28.png b/deal.II/examples/step-18/doc/intro/img28.png deleted file mode 100644 index 27dee45bdb..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img28.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img29.png b/deal.II/examples/step-18/doc/intro/img29.png deleted file mode 100644 index de071a3ae1..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img29.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img3.png b/deal.II/examples/step-18/doc/intro/img3.png deleted file mode 100644 index fbd9219f0e..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img3.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img30.png b/deal.II/examples/step-18/doc/intro/img30.png deleted file mode 100644 index cc088f8067..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img30.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img31.png b/deal.II/examples/step-18/doc/intro/img31.png deleted file mode 100644 index 52d702af1e..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img31.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img32.png b/deal.II/examples/step-18/doc/intro/img32.png deleted file mode 100644 index df422c0b27..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img32.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img33.png b/deal.II/examples/step-18/doc/intro/img33.png deleted file mode 100644 index 4a0ae7d8cb..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img33.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img34.png b/deal.II/examples/step-18/doc/intro/img34.png deleted file mode 100644 index 4a0ae7d8cb..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img34.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img35.png b/deal.II/examples/step-18/doc/intro/img35.png deleted file mode 100644 index 96f95c6216..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img35.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img36.png b/deal.II/examples/step-18/doc/intro/img36.png deleted file mode 100644 index 404f319a00..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img36.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img37.png b/deal.II/examples/step-18/doc/intro/img37.png deleted file mode 100644 index e65e53a072..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img37.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img38.png b/deal.II/examples/step-18/doc/intro/img38.png deleted file mode 100644 index 71f20f386c..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img38.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img39.png b/deal.II/examples/step-18/doc/intro/img39.png deleted file mode 100644 index 3ccaa26cd9..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img39.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img4.png b/deal.II/examples/step-18/doc/intro/img4.png deleted file mode 100644 index 82a35db95c..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img4.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img40.png b/deal.II/examples/step-18/doc/intro/img40.png deleted file mode 100644 index 7309f7ecc1..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img40.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img41.png b/deal.II/examples/step-18/doc/intro/img41.png deleted file mode 100644 index 64019e29db..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img41.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img42.png b/deal.II/examples/step-18/doc/intro/img42.png deleted file mode 100644 index 42ff48a260..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img42.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img43.png b/deal.II/examples/step-18/doc/intro/img43.png deleted file mode 100644 index 8a5fc6c6ad..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img43.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img44.png b/deal.II/examples/step-18/doc/intro/img44.png deleted file mode 100644 index 24f793de1a..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img44.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img45.png b/deal.II/examples/step-18/doc/intro/img45.png deleted file mode 100644 index 457a2eea24..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img45.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img46.png b/deal.II/examples/step-18/doc/intro/img46.png deleted file mode 100644 index 71e3511039..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img46.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img47.png b/deal.II/examples/step-18/doc/intro/img47.png deleted file mode 100644 index 660e1f7a9e..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img47.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img48.png b/deal.II/examples/step-18/doc/intro/img48.png deleted file mode 100644 index 4752bb803a..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img48.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img49.png b/deal.II/examples/step-18/doc/intro/img49.png deleted file mode 100644 index 2ce876f00f..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img49.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img5.png b/deal.II/examples/step-18/doc/intro/img5.png deleted file mode 100644 index 095ea46829..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img5.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img50.png b/deal.II/examples/step-18/doc/intro/img50.png deleted file mode 100644 index 6208f147f1..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img50.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img51.png b/deal.II/examples/step-18/doc/intro/img51.png deleted file mode 100644 index a7412b9f18..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img51.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img52.png b/deal.II/examples/step-18/doc/intro/img52.png deleted file mode 100644 index a1369cbfc8..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img52.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img53.png b/deal.II/examples/step-18/doc/intro/img53.png deleted file mode 100644 index 11b7c77c30..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img53.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img54.png b/deal.II/examples/step-18/doc/intro/img54.png deleted file mode 100644 index b4019faf2d..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img54.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img55.png b/deal.II/examples/step-18/doc/intro/img55.png deleted file mode 100644 index 964a5b666a..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img55.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img56.png b/deal.II/examples/step-18/doc/intro/img56.png deleted file mode 100644 index 48e64e60b2..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img56.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img57.png b/deal.II/examples/step-18/doc/intro/img57.png deleted file mode 100644 index 6b14e28499..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img57.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img58.png b/deal.II/examples/step-18/doc/intro/img58.png deleted file mode 100644 index 1ea0e6a1b7..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img58.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img59.png b/deal.II/examples/step-18/doc/intro/img59.png deleted file mode 100644 index 0308bdfb3b..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img59.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img6.png b/deal.II/examples/step-18/doc/intro/img6.png deleted file mode 100644 index d704ea28ab..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img6.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img60.png b/deal.II/examples/step-18/doc/intro/img60.png deleted file mode 100644 index 01cd7abc69..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img60.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img61.png b/deal.II/examples/step-18/doc/intro/img61.png deleted file mode 100644 index 839a8a8a29..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img61.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img62.png b/deal.II/examples/step-18/doc/intro/img62.png deleted file mode 100644 index f7daf45ebb..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img62.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img63.png b/deal.II/examples/step-18/doc/intro/img63.png deleted file mode 100644 index d247f1dc67..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img63.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img64.png b/deal.II/examples/step-18/doc/intro/img64.png deleted file mode 100644 index 3b4318b6ca..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img64.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img65.png b/deal.II/examples/step-18/doc/intro/img65.png deleted file mode 100644 index c5a2088762..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img65.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img66.png b/deal.II/examples/step-18/doc/intro/img66.png deleted file mode 100644 index 4d1fcb84bd..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img66.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img67.png b/deal.II/examples/step-18/doc/intro/img67.png deleted file mode 100644 index f60a2bde1e..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img67.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img68.png b/deal.II/examples/step-18/doc/intro/img68.png deleted file mode 100644 index 25ac13b2fb..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img68.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img69.png b/deal.II/examples/step-18/doc/intro/img69.png deleted file mode 100644 index 3ca0181deb..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img69.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img7.png b/deal.II/examples/step-18/doc/intro/img7.png deleted file mode 100644 index 72c7d4979e..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img7.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img70.png b/deal.II/examples/step-18/doc/intro/img70.png deleted file mode 100644 index 8db096591f..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img70.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img71.png b/deal.II/examples/step-18/doc/intro/img71.png deleted file mode 100644 index c69666acc8..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img71.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img72.png b/deal.II/examples/step-18/doc/intro/img72.png deleted file mode 100644 index 9e0d0b001b..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img72.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img73.png b/deal.II/examples/step-18/doc/intro/img73.png deleted file mode 100644 index a2fb06cfa2..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img73.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img74.png b/deal.II/examples/step-18/doc/intro/img74.png deleted file mode 100644 index 784daab071..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img74.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img75.png b/deal.II/examples/step-18/doc/intro/img75.png deleted file mode 100644 index 1b231e7c8a..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img75.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img76.png b/deal.II/examples/step-18/doc/intro/img76.png deleted file mode 100644 index 933552a581..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img76.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img77.png b/deal.II/examples/step-18/doc/intro/img77.png deleted file mode 100644 index 040bda610c..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img77.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img78.png b/deal.II/examples/step-18/doc/intro/img78.png deleted file mode 100644 index ae00dc154a..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img78.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img79.png b/deal.II/examples/step-18/doc/intro/img79.png deleted file mode 100644 index 53c2a77bce..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img79.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img8.png b/deal.II/examples/step-18/doc/intro/img8.png deleted file mode 100644 index 09bf5c4114..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img8.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img80.png b/deal.II/examples/step-18/doc/intro/img80.png deleted file mode 100644 index cadb86bf8c..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img80.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img81.png b/deal.II/examples/step-18/doc/intro/img81.png deleted file mode 100644 index 18a99a6aa1..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img81.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img82.png b/deal.II/examples/step-18/doc/intro/img82.png deleted file mode 100644 index 4a5f786f15..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img82.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img83.png b/deal.II/examples/step-18/doc/intro/img83.png deleted file mode 100644 index 40d0d76ca9..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img83.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img84.png b/deal.II/examples/step-18/doc/intro/img84.png deleted file mode 100644 index 53b52139ad..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img84.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img85.png b/deal.II/examples/step-18/doc/intro/img85.png deleted file mode 100644 index e125080e8d..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img85.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img86.png b/deal.II/examples/step-18/doc/intro/img86.png deleted file mode 100644 index 928e241142..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img86.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img87.png b/deal.II/examples/step-18/doc/intro/img87.png deleted file mode 100644 index 16160fda82..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img87.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img88.png b/deal.II/examples/step-18/doc/intro/img88.png deleted file mode 100644 index b4b97f19c4..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img88.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img89.png b/deal.II/examples/step-18/doc/intro/img89.png deleted file mode 100644 index 344be488d3..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img89.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img9.png b/deal.II/examples/step-18/doc/intro/img9.png deleted file mode 100644 index 4a0ae7d8cb..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img9.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img90.png b/deal.II/examples/step-18/doc/intro/img90.png deleted file mode 100644 index 37de0c2c2d..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img90.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img91.png b/deal.II/examples/step-18/doc/intro/img91.png deleted file mode 100644 index b4667df342..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img91.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img92.png b/deal.II/examples/step-18/doc/intro/img92.png deleted file mode 100644 index f602f9496b..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img92.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img93.png b/deal.II/examples/step-18/doc/intro/img93.png deleted file mode 100644 index 70addbf6e9..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img93.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img94.png b/deal.II/examples/step-18/doc/intro/img94.png deleted file mode 100644 index 99aaee1866..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img94.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img95.png b/deal.II/examples/step-18/doc/intro/img95.png deleted file mode 100644 index 420b776da8..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img95.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img96.png b/deal.II/examples/step-18/doc/intro/img96.png deleted file mode 100644 index 48fbbd7df8..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img96.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img97.png b/deal.II/examples/step-18/doc/intro/img97.png deleted file mode 100644 index 5614d58f22..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img97.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img98.png b/deal.II/examples/step-18/doc/intro/img98.png deleted file mode 100644 index ffc82543e5..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img98.png and /dev/null differ diff --git a/deal.II/examples/step-18/doc/intro/img99.png b/deal.II/examples/step-18/doc/intro/img99.png deleted file mode 100644 index 23bf8a4cd4..0000000000 Binary files a/deal.II/examples/step-18/doc/intro/img99.png and /dev/null differ