From 48c2798843f91aed31a115610e8f278ed175944c Mon Sep 17 00:00:00 2001 From: wolf Date: Wed, 22 Dec 1999 21:28:11 +0000 Subject: [PATCH] Add step-4. git-svn-id: https://svn.dealii.org/trunk@2112 0785d39b-7218-0410-832d-ea1e28bc413d --- .../examples/step-by-step/step-4/Makefile | 120 ++++ .../examples/step-by-step/step-4/step-4.cc | 546 ++++++++++++++++++ .../chapter-2.step-by-step/navbar.html | 6 + .../step-4.data/grid-3d.jpg | Bin 0 -> 37140 bytes .../step-4.data/solution-3d.jpg | Bin 0 -> 34352 bytes .../chapter-2.step-by-step/step-4.intro | 3 + .../chapter-2.step-by-step/step-4.results | 23 + .../tutorial/chapter-2.step-by-step/toc.html | 8 + deal.II/examples/step-4/Makefile | 120 ++++ deal.II/examples/step-4/step-4.cc | 546 ++++++++++++++++++ 10 files changed, 1372 insertions(+) create mode 100644 deal.II/deal.II/Attic/examples/step-by-step/step-4/Makefile create mode 100644 deal.II/deal.II/Attic/examples/step-by-step/step-4/step-4.cc create mode 100644 deal.II/doc/tutorial/chapter-2.step-by-step/step-4.data/grid-3d.jpg create mode 100644 deal.II/doc/tutorial/chapter-2.step-by-step/step-4.data/solution-3d.jpg create mode 100644 deal.II/doc/tutorial/chapter-2.step-by-step/step-4.intro create mode 100644 deal.II/doc/tutorial/chapter-2.step-by-step/step-4.results create mode 100644 deal.II/examples/step-4/Makefile create mode 100644 deal.II/examples/step-4/step-4.cc diff --git a/deal.II/deal.II/Attic/examples/step-by-step/step-4/Makefile b/deal.II/deal.II/Attic/examples/step-by-step/step-4/Makefile new file mode 100644 index 0000000000..9212069420 --- /dev/null +++ b/deal.II/deal.II/Attic/examples/step-by-step/step-4/Makefile @@ -0,0 +1,120 @@ +# $Id$ +# Copyright W. Bangerth, University of Heidelberg, 1998 + +# Template for makefiles for the examples subdirectory. In principle, +# everything should be done automatically if you set the target file +# here correctly: +target = step-4 + +# All dependencies between files should be updated by the included +# file Makefile.dep if necessary. Object files are compiled into +# the archives ./Obj.a and ./Obj.g.a. By default, the debug version +# is used to link. It you don't like that, change the following +# variable to "off" +debug-mode = on + +# If you want your program to be linked with extra object or library +# files, specify them here: +user-libs = + +# To run the program, use "make run"; to give parameters to the program, +# give the parameters to the following variable: +run-parameters = + +# To execute additional action apart from running the program, fill +# in this list: +additional-run-action = + +# To specify which files are to be deleted by "make clean" (apart from +# the usual ones: object files, executables, backups, etc), fill in the +# following list +delete-files = *gpl *inp *history + + + + +############################################################################### +# Internals + +#deal include base path +D = ../../../.. + +include $D/common/Make.global_options + +# get lists of files we need +cc-files = $(filter-out *%, $(shell echo *.cc)) +o-files = $(cc-files:.cc=.o) +go-files = $(cc-files:.cc=.go) +h-files = $(filter-out *%, $(shell echo *.h)) +lib-h-files = $(filter-out *%, $(shell echo ../../include/*/*.h)) + +# list of libraries needed to link with +libs = ./Obj.a -ldeal_II_2d -llac -lbase +libs.g = ./Obj.g.a -ldeal_II_3d.g -llac.g -lbase.g + + +# check whether we use debug mode or not +ifeq ($(debug-mode),on) +libraries = $(libs.g) +flags = $(CXXFLAGS.g) +endif + +ifeq ($(debug-mode),off) +libraries = $(libs) +flags = $(CXXFLAGS) +endif + + + +# make rule for the target +$(target) : $(libraries) + @echo ============================ Linking $@ + @$(CXX) $(flags) -o $@ $^ $(user-libs) + +# rule how to run the program +run: $(target) + $(target) $(run-parameters) + $(additional-run-action) + + +# rule to make object files +%.go : %.cc + @echo ============================ Compiling with debugging information: $< + @echo $(CXX) ... -c $< -o $@ + @$(CXX) $(CXXFLAGS.g) -c $< -o $@ +%.o : %.cc + @echo ============================ Compiling with optimization: $< + @echo $(CXX) ... -c $< -o $@ + @$(CXX) $(CXXFLAGS) -c $< -o $@ + + +# rules which files the libraries depend upon +Obj.a: ./Obj.a($(o-files)) +Obj.g.a: ./Obj.g.a($(go-files)) + + +clean: + -rm -f *.o *.go *~ Makefile.dep Obj.a Obj.g.a $(target) $(delete-files) + + + +.PHONY: clean + + +#Rule to generate the dependency file. This file is +#automagically remade whenever needed, i.e. whenever +#one of the cc-/h-files changed. Make detects whether +#to remake this file upon inclusion at the bottom +#of this file. +# +#use perl to generate rules for the .go files as well +#as to make rules not for tria.o and the like, but +#rather for libnumerics.a(tria.o) +Makefile.dep: $(cc-files) $(h-files) $(lib-h-files) + @echo ============================ Remaking Makefile + @perl $D/common/scripts/Make_dep.pl ./Obj $(INCLUDE) $(cc-files) \ + > Makefile.dep + + +include Makefile.dep + diff --git a/deal.II/deal.II/Attic/examples/step-by-step/step-4/step-4.cc b/deal.II/deal.II/Attic/examples/step-by-step/step-4/step-4.cc new file mode 100644 index 0000000000..901bfa6e10 --- /dev/null +++ b/deal.II/deal.II/Attic/examples/step-by-step/step-4/step-4.cc @@ -0,0 +1,546 @@ +/* $Id$ */ + + // The first few (many?) include + // files have already been used in + // the previous example, so we will + // not explain their meaning here + // again. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + // This is new, however: in the + // previous example we got some + // unwanted output from the linear + // solvers. If we want to suppress + // it, we have to include this file + // and add a line somewhere to the + // program; in this program, it was + // added to the main function. +#include + + + + + + + + + +template +class LaplaceProblem +{ + public: + LaplaceProblem (); + void run (); + + private: + void make_grid_and_dofs (); + void assemble_system (); + void solve (); + void output_results (); + + Triangulation triangulation; + FEQ1 fe; + DoFHandler dof_handler; + + SparseMatrixStruct sparsity_pattern; + SparseMatrix system_matrix; + + Vector solution; + Vector system_rhs; +}; + + + // In the following, we declare two + // more classes, which will represent + // the functions of the + // dim-dimensional space denoting the + // right hand side and the + // non-homogeneous Dirichlet boundary + // values. + // + // Each of these classes is derived + // from a common, abstract base class + // Function, which declares the + // common interface which all + // functions have to follow. In + // particular, concrete classes have + // to overload the `value' function, + // which takes a point in + // dim-dimensional space as + // parameters and shall return the + // value at that point as a `double' + // variable. +template +class RightHandSide : public Function +{ + public: + virtual double value (const Point &p, + const unsigned int component) const; +}; + + + +template +class BoundaryValues : public Function +{ + public: + virtual double value (const Point &p, + const unsigned int component) const; +}; + + + + + // We wanted the right hand side + // function to be 4*(x**4+y**4) in + // 2D, or 4*(x**4+y**4+z**4) in + // 3D. Unfortunately, this is not as + // elegantly feasible dimension + // independently as much of the rest + // of this program, so we have to do + // it using a small + // loop. Fortunately, the compiler + // knows the size of the loop at + // compile time, i.e. the number of + // times the body will be executed, + // so it can optimize away the + // overhead needed for the loop and + // the result will be as fast as if + // we had used the formulas above + // right away. + // + // Note that the different + // coordinates of the point are + // accessed using the () operator. +template +double RightHandSide::value (const Point &p, + const unsigned int) const +{ + double return_value = 0; + for (unsigned int i=0; i +double BoundaryValues::value (const Point &p, + const unsigned int) const +{ + return p.square(); +}; + + + + + // This is the constructor of the + // LaplaceProblem class. It + // associates the DoFHandler to the + // triangulation just as in the + // previous example. +template +LaplaceProblem::LaplaceProblem () : + dof_handler (triangulation) +{}; + + + + // Grid creation is something + // inherently dimension + // dependent. However, as long as the + // domains are sufficiently similar + // in 2D or 3D, the library can + // abstract for you. In our case, we + // would like to again solve on the + // square [-1,1]x[-1,1] in 2D, or on + // the cube [-1,1]x[-1,1]x[-1,1] in + // 3D; both can be termed + // ``hyper_cube'', so we may use the + // same function in whatever + // dimension we are. Of course, the + // functions that create a hypercube + // in two and three dimensions are + // very much different, but that is + // something you need not care + // about. Let the library handle the + // difficult things. + // + // Likewise, associating a degree of + // freedom with each vertex is + // something which certainly looks + // different in 2D and 3D, but that + // does not need to bother you. This + // function therefore looks exactly + // like in the previous example, + // although it performs actions that + // in their details are quite + // different. The only significant + // difference is the number of cells + // resulting, which is much higher in + // three than in two space + // dimensions! +template +void LaplaceProblem::make_grid_and_dofs () +{ + GridGenerator::hyper_cube (triangulation, -1, 1); + triangulation.refine_global (4); + + cout << " Number of active cells: " + << triangulation.n_active_cells() + << endl + << " Total number of cells: " + << triangulation.n_cells() + << endl; + + dof_handler.distribute_dofs (fe); + + cout << " Number of degrees of freedom: " + << dof_handler.n_dofs() + << endl; + + sparsity_pattern.reinit (dof_handler.n_dofs(), + dof_handler.n_dofs(), + dof_handler.max_couplings_between_dofs()); + DoFTools::make_sparsity_pattern (dof_handler, sparsity_pattern); + sparsity_pattern.compress(); + + system_matrix.reinit (sparsity_pattern); + + solution.reinit (dof_handler.n_dofs()); + system_rhs.reinit (dof_handler.n_dofs()); +}; + + + + // Unlike in the previous example, we + // would now like to use a + // non-constant right hand side + // function and non-zero boundary + // values. Both are tasks that are + // readily achieved with a only a few + // new lines of code in the + // assemblage of the matrix and right + // hand side. + // + // More interesting, though, is they + // way we assemble matrix and right + // hand side vector dimension + // independently: there is simply no + // difference to the pure + // two-dimensional case. Since the + // important objects used in this + // function (quadrature formula, + // FEValues) depend on the dimension + // by way of a template parameter as + // well, they can take care of + // setting up properly everything for + // the dimension for which this + // function is compiled. By declaring + // all classes which might depend on + // the dimension using a template + // parameter, the library can make + // nearly all work for you and you + // don't have to care about most + // things. +template +void LaplaceProblem::assemble_system () +{ + QGauss3 quadrature_formula; + + // We wanted to have a non-constant + // right hand side, so we use an + // object of the class declared + // above to generate the necessary + // data. Since this right hand side + // object is only used in this + // function, we only declare it + // here, rather than as a member + // variable of the LaplaceProblem + // class, or somewhere else. + const RightHandSide right_hand_side; + + // Compared to the previous + // example, in order to evaluate + // the non-constant right hand side + // function we now also need the + // quadrature points on the cell we + // are presently on (previously, + // they were only needed on the + // unit cell, in order to compute + // the values and gradients of the + // shape function, which are + // defined on the unit cell + // however). We can tell the + // FEValues object to do for us by + // giving it the update_q_points + // flag: + FEValues fe_values (fe, quadrature_formula, + UpdateFlags(update_values | + update_gradients | + update_q_points | + update_JxW_values)); + + // Note that the following numbers + // depend on the dimension which we + // are presently using. However, + // the FE and Quadrature classes do + // all the necessary work for you + // and you don't have to care about + // the dimension dependent parts: + const unsigned int dofs_per_cell = fe.dofs_per_cell; + const unsigned int n_q_points = quadrature_formula.n_quadrature_points; + + FullMatrix cell_matrix (dofs_per_cell, dofs_per_cell); + Vector cell_rhs (dofs_per_cell); + + vector local_dof_indices (dofs_per_cell); + + // Note here, that a cell is a + // quadrilateral in two space + // dimensions, but a hexahedron in + // 3D. In fact, the + // active_cell_iterator data type + // is something different, + // depending on the dimension we + // are in, but to the outside world + // they look alike and you will + // probably never see a difference + // although they are totally + // unrelated. + DoFHandler::active_cell_iterator cell = dof_handler.begin_active(), + endc = dof_handler.end(); + for (; cell!=endc; ++cell) + { + fe_values.reinit (cell); + cell_matrix.clear (); + cell_rhs.clear (); + + // Now we have to assemble the + // local matrix and right hand + // side. This is done exactly + // like in the previous + // example, but now we revert + // the order of the loops + // (which we can safely do + // since they are independent + // of each other) and merge the + // loops for the local matrix + // and the local vector as far + // as possible; this makes + // things a bit faster. + for (unsigned int q_point=0; q_pointget_dof_indices (local_dof_indices); + for (unsigned int i=0; i boundary_values; + VectorTools::interpolate_boundary_values (dof_handler, + 0, + BoundaryValues(), + boundary_values); + MatrixTools::apply_boundary_values (boundary_values, + system_matrix, + solution, + system_rhs); +}; + + + // Solving the linear system of + // equation is something that looks + // almost identical in most + // programs. In particular, it is + // dimension independent, so this + // function is mostly copied from the + // previous example. +template +void LaplaceProblem::solve () +{ + SolverControl solver_control (1000, 1e-12); + PrimitiveVectorMemory<> vector_memory; + SolverCG<> cg (solver_control, vector_memory); + cg.solve (system_matrix, solution, system_rhs, + PreconditionIdentity()); + + // We have made one addition, + // though: since we suppress output + // from the linear solvers, we have + // to print the number of + // iterations by hand. + cout << " " << solver_control.last_step() + << " CG iterations needed to obtain convergence." + << endl; +}; + + + + // This function also does what the + // respective one did in the previous + // example. No changes here for + // dimension independentce either. +template +void LaplaceProblem::output_results () +{ + DataOut data_out; + + data_out.attach_dof_handler (dof_handler); + data_out.add_data_vector (solution, "solution"); + + data_out.build_patches (); + + // Only difference to the previous + // example: write output in GMV + // format, rather than for gnuplot. + ofstream output ("solution.gmv"); + data_out.write_gmv (output); +}; + + + + // This is the function which has the + // top-level control over + // everything. Apart from one line of + // additional output, it is the same + // as for the previous example. +template +void LaplaceProblem::run () +{ + cout << "Solving problem in " << dim << " space dimensions." << endl; + + make_grid_and_dofs(); + assemble_system (); + solve (); + output_results (); +}; + + + + // And this is the main function. It + // also looks mostly like in the + // previous example: +int main () +{ + // In the previous example, we had + // the output from the linear + // solvers about the starting + // residual and the number of the + // iteration where convergence was + // detected. This can be suppressed + // like this: + deallog.depth_console (0); + // The rationale here is the + // following: the deallog + // (i.e. deal-log, not de-allog) + // variable represents a stream to + // which some parts of the library + // write output. It redirects this + // output to the console and if + // required to a file. The output + // is nested in a way that each + // function can use a prefix string + // (separated by colons) for each + // line of output; if it calls + // another function, that may also + // use its prefix which is then + // printed after the one of the + // calling function. Since output + // from functions which are nested + // deep below is usually not as + // important as top-level output, + // you can give the deallog + // variable a maximal depth of + // nested output for output to + // console and file. The depth zero + // which we gave here means that no + // output is written. + + // After having done this + // administrative stuff, we can go + // on just as before: define one of + // these top-level objects and + // transfer control to it: +// LaplaceProblem<2> laplace_problem_2d; +// laplace_problem_2d.run (); + + LaplaceProblem<3> laplace_problem_3d; + laplace_problem_3d.run (); + return 0; +}; diff --git a/deal.II/doc/tutorial/chapter-2.step-by-step/navbar.html b/deal.II/doc/tutorial/chapter-2.step-by-step/navbar.html index 7307d29ed0..fbb14abf65 100644 --- a/deal.II/doc/tutorial/chapter-2.step-by-step/navbar.html +++ b/deal.II/doc/tutorial/chapter-2.step-by-step/navbar.html @@ -42,6 +42,12 @@ Step 3

+ +
  • +

    + Step 4 +

    +
  • Back to the tutorial index diff --git a/deal.II/doc/tutorial/chapter-2.step-by-step/step-4.data/grid-3d.jpg b/deal.II/doc/tutorial/chapter-2.step-by-step/step-4.data/grid-3d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da8b54fe383db661d42b9715fe561105a2aa484a GIT binary patch literal 37140 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�a#$@D;|rSG$XvJ<(!W5`CoEyn`$3V7#xAx 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 literal 0 HcmV?d00001 diff --git a/deal.II/doc/tutorial/chapter-2.step-by-step/step-4.intro b/deal.II/doc/tutorial/chapter-2.step-by-step/step-4.intro new file mode 100644 index 0000000000..1518606e43 --- /dev/null +++ b/deal.II/doc/tutorial/chapter-2.step-by-step/step-4.intro @@ -0,0 +1,3 @@ + +

    Introduction

    + diff --git a/deal.II/doc/tutorial/chapter-2.step-by-step/step-4.results b/deal.II/doc/tutorial/chapter-2.step-by-step/step-4.results new file mode 100644 index 0000000000..4c30e00b53 --- /dev/null +++ b/deal.II/doc/tutorial/chapter-2.step-by-step/step-4.results @@ -0,0 +1,23 @@ + +

    Results

    + +The output of the program looks as follows: +
    +
    +...
    +
    +
    + + +

    + + + + + +
    +solution-3d + +grid-3d +
    +

    diff --git a/deal.II/doc/tutorial/chapter-2.step-by-step/toc.html b/deal.II/doc/tutorial/chapter-2.step-by-step/toc.html index 2e05de8a0d..42b75b9e5c 100644 --- a/deal.II/doc/tutorial/chapter-2.step-by-step/toc.html +++ b/deal.II/doc/tutorial/chapter-2.step-by-step/toc.html @@ -57,6 +57,14 @@ At present, the following programs exist: problem. Object-orientation. Assembling matrices and vectors. Boundary values. + +

    Step 4
    +
    What's new: This example is programmed in a + way that it is independent of the dimension for which we want to + solve Laplace's equation; we will solve the equation in 2D and + 3D, although the program is exactly the same. Non-constant right + hand side function. Non-homogeneous boundary values. +
    diff --git a/deal.II/examples/step-4/Makefile b/deal.II/examples/step-4/Makefile new file mode 100644 index 0000000000..9212069420 --- /dev/null +++ b/deal.II/examples/step-4/Makefile @@ -0,0 +1,120 @@ +# $Id$ +# Copyright W. Bangerth, University of Heidelberg, 1998 + +# Template for makefiles for the examples subdirectory. In principle, +# everything should be done automatically if you set the target file +# here correctly: +target = step-4 + +# All dependencies between files should be updated by the included +# file Makefile.dep if necessary. Object files are compiled into +# the archives ./Obj.a and ./Obj.g.a. By default, the debug version +# is used to link. It you don't like that, change the following +# variable to "off" +debug-mode = on + +# If you want your program to be linked with extra object or library +# files, specify them here: +user-libs = + +# To run the program, use "make run"; to give parameters to the program, +# give the parameters to the following variable: +run-parameters = + +# To execute additional action apart from running the program, fill +# in this list: +additional-run-action = + +# To specify which files are to be deleted by "make clean" (apart from +# the usual ones: object files, executables, backups, etc), fill in the +# following list +delete-files = *gpl *inp *history + + + + +############################################################################### +# Internals + +#deal include base path +D = ../../../.. + +include $D/common/Make.global_options + +# get lists of files we need +cc-files = $(filter-out *%, $(shell echo *.cc)) +o-files = $(cc-files:.cc=.o) +go-files = $(cc-files:.cc=.go) +h-files = $(filter-out *%, $(shell echo *.h)) +lib-h-files = $(filter-out *%, $(shell echo ../../include/*/*.h)) + +# list of libraries needed to link with +libs = ./Obj.a -ldeal_II_2d -llac -lbase +libs.g = ./Obj.g.a -ldeal_II_3d.g -llac.g -lbase.g + + +# check whether we use debug mode or not +ifeq ($(debug-mode),on) +libraries = $(libs.g) +flags = $(CXXFLAGS.g) +endif + +ifeq ($(debug-mode),off) +libraries = $(libs) +flags = $(CXXFLAGS) +endif + + + +# make rule for the target +$(target) : $(libraries) + @echo ============================ Linking $@ + @$(CXX) $(flags) -o $@ $^ $(user-libs) + +# rule how to run the program +run: $(target) + $(target) $(run-parameters) + $(additional-run-action) + + +# rule to make object files +%.go : %.cc + @echo ============================ Compiling with debugging information: $< + @echo $(CXX) ... -c $< -o $@ + @$(CXX) $(CXXFLAGS.g) -c $< -o $@ +%.o : %.cc + @echo ============================ Compiling with optimization: $< + @echo $(CXX) ... -c $< -o $@ + @$(CXX) $(CXXFLAGS) -c $< -o $@ + + +# rules which files the libraries depend upon +Obj.a: ./Obj.a($(o-files)) +Obj.g.a: ./Obj.g.a($(go-files)) + + +clean: + -rm -f *.o *.go *~ Makefile.dep Obj.a Obj.g.a $(target) $(delete-files) + + + +.PHONY: clean + + +#Rule to generate the dependency file. This file is +#automagically remade whenever needed, i.e. whenever +#one of the cc-/h-files changed. Make detects whether +#to remake this file upon inclusion at the bottom +#of this file. +# +#use perl to generate rules for the .go files as well +#as to make rules not for tria.o and the like, but +#rather for libnumerics.a(tria.o) +Makefile.dep: $(cc-files) $(h-files) $(lib-h-files) + @echo ============================ Remaking Makefile + @perl $D/common/scripts/Make_dep.pl ./Obj $(INCLUDE) $(cc-files) \ + > Makefile.dep + + +include Makefile.dep + diff --git a/deal.II/examples/step-4/step-4.cc b/deal.II/examples/step-4/step-4.cc new file mode 100644 index 0000000000..901bfa6e10 --- /dev/null +++ b/deal.II/examples/step-4/step-4.cc @@ -0,0 +1,546 @@ +/* $Id$ */ + + // The first few (many?) include + // files have already been used in + // the previous example, so we will + // not explain their meaning here + // again. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + // This is new, however: in the + // previous example we got some + // unwanted output from the linear + // solvers. If we want to suppress + // it, we have to include this file + // and add a line somewhere to the + // program; in this program, it was + // added to the main function. +#include + + + + + + + + + +template +class LaplaceProblem +{ + public: + LaplaceProblem (); + void run (); + + private: + void make_grid_and_dofs (); + void assemble_system (); + void solve (); + void output_results (); + + Triangulation triangulation; + FEQ1 fe; + DoFHandler dof_handler; + + SparseMatrixStruct sparsity_pattern; + SparseMatrix system_matrix; + + Vector solution; + Vector system_rhs; +}; + + + // In the following, we declare two + // more classes, which will represent + // the functions of the + // dim-dimensional space denoting the + // right hand side and the + // non-homogeneous Dirichlet boundary + // values. + // + // Each of these classes is derived + // from a common, abstract base class + // Function, which declares the + // common interface which all + // functions have to follow. In + // particular, concrete classes have + // to overload the `value' function, + // which takes a point in + // dim-dimensional space as + // parameters and shall return the + // value at that point as a `double' + // variable. +template +class RightHandSide : public Function +{ + public: + virtual double value (const Point &p, + const unsigned int component) const; +}; + + + +template +class BoundaryValues : public Function +{ + public: + virtual double value (const Point &p, + const unsigned int component) const; +}; + + + + + // We wanted the right hand side + // function to be 4*(x**4+y**4) in + // 2D, or 4*(x**4+y**4+z**4) in + // 3D. Unfortunately, this is not as + // elegantly feasible dimension + // independently as much of the rest + // of this program, so we have to do + // it using a small + // loop. Fortunately, the compiler + // knows the size of the loop at + // compile time, i.e. the number of + // times the body will be executed, + // so it can optimize away the + // overhead needed for the loop and + // the result will be as fast as if + // we had used the formulas above + // right away. + // + // Note that the different + // coordinates of the point are + // accessed using the () operator. +template +double RightHandSide::value (const Point &p, + const unsigned int) const +{ + double return_value = 0; + for (unsigned int i=0; i +double BoundaryValues::value (const Point &p, + const unsigned int) const +{ + return p.square(); +}; + + + + + // This is the constructor of the + // LaplaceProblem class. It + // associates the DoFHandler to the + // triangulation just as in the + // previous example. +template +LaplaceProblem::LaplaceProblem () : + dof_handler (triangulation) +{}; + + + + // Grid creation is something + // inherently dimension + // dependent. However, as long as the + // domains are sufficiently similar + // in 2D or 3D, the library can + // abstract for you. In our case, we + // would like to again solve on the + // square [-1,1]x[-1,1] in 2D, or on + // the cube [-1,1]x[-1,1]x[-1,1] in + // 3D; both can be termed + // ``hyper_cube'', so we may use the + // same function in whatever + // dimension we are. Of course, the + // functions that create a hypercube + // in two and three dimensions are + // very much different, but that is + // something you need not care + // about. Let the library handle the + // difficult things. + // + // Likewise, associating a degree of + // freedom with each vertex is + // something which certainly looks + // different in 2D and 3D, but that + // does not need to bother you. This + // function therefore looks exactly + // like in the previous example, + // although it performs actions that + // in their details are quite + // different. The only significant + // difference is the number of cells + // resulting, which is much higher in + // three than in two space + // dimensions! +template +void LaplaceProblem::make_grid_and_dofs () +{ + GridGenerator::hyper_cube (triangulation, -1, 1); + triangulation.refine_global (4); + + cout << " Number of active cells: " + << triangulation.n_active_cells() + << endl + << " Total number of cells: " + << triangulation.n_cells() + << endl; + + dof_handler.distribute_dofs (fe); + + cout << " Number of degrees of freedom: " + << dof_handler.n_dofs() + << endl; + + sparsity_pattern.reinit (dof_handler.n_dofs(), + dof_handler.n_dofs(), + dof_handler.max_couplings_between_dofs()); + DoFTools::make_sparsity_pattern (dof_handler, sparsity_pattern); + sparsity_pattern.compress(); + + system_matrix.reinit (sparsity_pattern); + + solution.reinit (dof_handler.n_dofs()); + system_rhs.reinit (dof_handler.n_dofs()); +}; + + + + // Unlike in the previous example, we + // would now like to use a + // non-constant right hand side + // function and non-zero boundary + // values. Both are tasks that are + // readily achieved with a only a few + // new lines of code in the + // assemblage of the matrix and right + // hand side. + // + // More interesting, though, is they + // way we assemble matrix and right + // hand side vector dimension + // independently: there is simply no + // difference to the pure + // two-dimensional case. Since the + // important objects used in this + // function (quadrature formula, + // FEValues) depend on the dimension + // by way of a template parameter as + // well, they can take care of + // setting up properly everything for + // the dimension for which this + // function is compiled. By declaring + // all classes which might depend on + // the dimension using a template + // parameter, the library can make + // nearly all work for you and you + // don't have to care about most + // things. +template +void LaplaceProblem::assemble_system () +{ + QGauss3 quadrature_formula; + + // We wanted to have a non-constant + // right hand side, so we use an + // object of the class declared + // above to generate the necessary + // data. Since this right hand side + // object is only used in this + // function, we only declare it + // here, rather than as a member + // variable of the LaplaceProblem + // class, or somewhere else. + const RightHandSide right_hand_side; + + // Compared to the previous + // example, in order to evaluate + // the non-constant right hand side + // function we now also need the + // quadrature points on the cell we + // are presently on (previously, + // they were only needed on the + // unit cell, in order to compute + // the values and gradients of the + // shape function, which are + // defined on the unit cell + // however). We can tell the + // FEValues object to do for us by + // giving it the update_q_points + // flag: + FEValues fe_values (fe, quadrature_formula, + UpdateFlags(update_values | + update_gradients | + update_q_points | + update_JxW_values)); + + // Note that the following numbers + // depend on the dimension which we + // are presently using. However, + // the FE and Quadrature classes do + // all the necessary work for you + // and you don't have to care about + // the dimension dependent parts: + const unsigned int dofs_per_cell = fe.dofs_per_cell; + const unsigned int n_q_points = quadrature_formula.n_quadrature_points; + + FullMatrix cell_matrix (dofs_per_cell, dofs_per_cell); + Vector cell_rhs (dofs_per_cell); + + vector local_dof_indices (dofs_per_cell); + + // Note here, that a cell is a + // quadrilateral in two space + // dimensions, but a hexahedron in + // 3D. In fact, the + // active_cell_iterator data type + // is something different, + // depending on the dimension we + // are in, but to the outside world + // they look alike and you will + // probably never see a difference + // although they are totally + // unrelated. + DoFHandler::active_cell_iterator cell = dof_handler.begin_active(), + endc = dof_handler.end(); + for (; cell!=endc; ++cell) + { + fe_values.reinit (cell); + cell_matrix.clear (); + cell_rhs.clear (); + + // Now we have to assemble the + // local matrix and right hand + // side. This is done exactly + // like in the previous + // example, but now we revert + // the order of the loops + // (which we can safely do + // since they are independent + // of each other) and merge the + // loops for the local matrix + // and the local vector as far + // as possible; this makes + // things a bit faster. + for (unsigned int q_point=0; q_pointget_dof_indices (local_dof_indices); + for (unsigned int i=0; i boundary_values; + VectorTools::interpolate_boundary_values (dof_handler, + 0, + BoundaryValues(), + boundary_values); + MatrixTools::apply_boundary_values (boundary_values, + system_matrix, + solution, + system_rhs); +}; + + + // Solving the linear system of + // equation is something that looks + // almost identical in most + // programs. In particular, it is + // dimension independent, so this + // function is mostly copied from the + // previous example. +template +void LaplaceProblem::solve () +{ + SolverControl solver_control (1000, 1e-12); + PrimitiveVectorMemory<> vector_memory; + SolverCG<> cg (solver_control, vector_memory); + cg.solve (system_matrix, solution, system_rhs, + PreconditionIdentity()); + + // We have made one addition, + // though: since we suppress output + // from the linear solvers, we have + // to print the number of + // iterations by hand. + cout << " " << solver_control.last_step() + << " CG iterations needed to obtain convergence." + << endl; +}; + + + + // This function also does what the + // respective one did in the previous + // example. No changes here for + // dimension independentce either. +template +void LaplaceProblem::output_results () +{ + DataOut data_out; + + data_out.attach_dof_handler (dof_handler); + data_out.add_data_vector (solution, "solution"); + + data_out.build_patches (); + + // Only difference to the previous + // example: write output in GMV + // format, rather than for gnuplot. + ofstream output ("solution.gmv"); + data_out.write_gmv (output); +}; + + + + // This is the function which has the + // top-level control over + // everything. Apart from one line of + // additional output, it is the same + // as for the previous example. +template +void LaplaceProblem::run () +{ + cout << "Solving problem in " << dim << " space dimensions." << endl; + + make_grid_and_dofs(); + assemble_system (); + solve (); + output_results (); +}; + + + + // And this is the main function. It + // also looks mostly like in the + // previous example: +int main () +{ + // In the previous example, we had + // the output from the linear + // solvers about the starting + // residual and the number of the + // iteration where convergence was + // detected. This can be suppressed + // like this: + deallog.depth_console (0); + // The rationale here is the + // following: the deallog + // (i.e. deal-log, not de-allog) + // variable represents a stream to + // which some parts of the library + // write output. It redirects this + // output to the console and if + // required to a file. The output + // is nested in a way that each + // function can use a prefix string + // (separated by colons) for each + // line of output; if it calls + // another function, that may also + // use its prefix which is then + // printed after the one of the + // calling function. Since output + // from functions which are nested + // deep below is usually not as + // important as top-level output, + // you can give the deallog + // variable a maximal depth of + // nested output for output to + // console and file. The depth zero + // which we gave here means that no + // output is written. + + // After having done this + // administrative stuff, we can go + // on just as before: define one of + // these top-level objects and + // transfer control to it: +// LaplaceProblem<2> laplace_problem_2d; +// laplace_problem_2d.run (); + + LaplaceProblem<3> laplace_problem_3d; + laplace_problem_3d.run (); + return 0; +}; -- 2.39.5