From 01ad676a1b3bf23c82ab3680257e61d4561ccd24 Mon Sep 17 00:00:00 2001 From: bangerth Date: Sun, 27 May 2007 02:01:17 +0000 Subject: [PATCH] Finally add Yaqi's tutorial program, as step-28. Change references to it. git-svn-id: https://svn.dealii.org/trunk@14709 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/base/include/base/parameter_handler.h | 2 +- deal.II/deal.II/include/grid/grid_generator.h | 2 +- deal.II/deal.II/include/grid/tria.h | 2 +- deal.II/deal.II/include/grid/tria_accessor.h | 8 +- deal.II/examples/step-28/Makefile | 154 ++ deal.II/examples/step-28/doc/data-q1 | 10 + deal.II/examples/step-28/doc/data-q2 | 10 + deal.II/examples/step-28/doc/data-q3 | 10 + deal.II/examples/step-28/doc/data-q4 | 10 + deal.II/examples/step-28/doc/data-q5 | 10 + deal.II/examples/step-28/doc/data-q6 | 15 + deal.II/examples/step-28/doc/gnuplot.1 | 26 + deal.II/examples/step-28/doc/intro.dox | 1 + deal.II/examples/step-28/doc/intro.tex | 634 +++++ deal.II/examples/step-28/doc/results.dox | 500 ++++ .../step-28/doc/step-28.convergence.png | Bin 0 -> 12445 bytes .../step-28/doc/step-28.error-vs-dofs.png | Bin 0 -> 5494 bytes .../step-28/doc/step-28.error-vs-time.png | Bin 0 -> 5413 bytes .../step-28/doc/step-28.grid-0.9.order2.png | Bin 0 -> 33134 bytes .../step-28/doc/step-28.grid-1.9.order2.png | Bin 0 -> 40513 bytes .../doc/step-28.solution-0.9.order2.png | Bin 0 -> 16578 bytes .../doc/step-28.solution-1.9.order2.png | Bin 0 -> 14160 bytes deal.II/examples/step-28/step-28.cc | 2347 +++++++++++++++++ 23 files changed, 3734 insertions(+), 7 deletions(-) create mode 100644 deal.II/examples/step-28/Makefile create mode 100644 deal.II/examples/step-28/doc/data-q1 create mode 100644 deal.II/examples/step-28/doc/data-q2 create mode 100644 deal.II/examples/step-28/doc/data-q3 create mode 100644 deal.II/examples/step-28/doc/data-q4 create mode 100644 deal.II/examples/step-28/doc/data-q5 create mode 100644 deal.II/examples/step-28/doc/data-q6 create mode 100644 deal.II/examples/step-28/doc/gnuplot.1 create mode 100644 deal.II/examples/step-28/doc/intro.dox create mode 100644 deal.II/examples/step-28/doc/intro.tex create mode 100644 deal.II/examples/step-28/doc/results.dox create mode 100755 deal.II/examples/step-28/doc/step-28.convergence.png create mode 100644 deal.II/examples/step-28/doc/step-28.error-vs-dofs.png create mode 100644 deal.II/examples/step-28/doc/step-28.error-vs-time.png create mode 100755 deal.II/examples/step-28/doc/step-28.grid-0.9.order2.png create mode 100755 deal.II/examples/step-28/doc/step-28.grid-1.9.order2.png create mode 100755 deal.II/examples/step-28/doc/step-28.solution-0.9.order2.png create mode 100755 deal.II/examples/step-28/doc/step-28.solution-1.9.order2.png create mode 100644 deal.II/examples/step-28/step-28.cc diff --git a/deal.II/base/include/base/parameter_handler.h b/deal.II/base/include/base/parameter_handler.h index fe205aecf5..37eb5e4dfb 100644 --- a/deal.II/base/include/base/parameter_handler.h +++ b/deal.II/base/include/base/parameter_handler.h @@ -772,7 +772,7 @@ namespace Patterns * * The ParameterHandler class is discussed in detail in the @ref * step_19 "step-19" example program, and is used in more realistic - * situation in @ref step_22 "step-22". + * situation in @ref step_28 "step-28". * *

Declaring entries

* diff --git a/deal.II/deal.II/include/grid/grid_generator.h b/deal.II/deal.II/include/grid/grid_generator.h index bad47a009b..1ac18b4633 100644 --- a/deal.II/deal.II/include/grid/grid_generator.h +++ b/deal.II/deal.II/include/grid/grid_generator.h @@ -268,7 +268,7 @@ class GridGenerator * * @note For an example of the * use of this function see the - * @ref step_22 "step-22" + * @ref step_28 "step-28" * tutorial program. */ template diff --git a/deal.II/deal.II/include/grid/tria.h b/deal.II/deal.II/include/grid/tria.h index 0c92e0b520..b98c15cd1b 100644 --- a/deal.II/deal.II/include/grid/tria.h +++ b/deal.II/deal.II/include/grid/tria.h @@ -849,7 +849,7 @@ namespace internal * This material_id may be set upon construction of a * triangulation (through the CellData data structure), or later * through use of cell iterators. For a typical use of this - * functionality, see the @ref step_22 "step-22" tutorial + * functionality, see the @ref step_28 "step-28" tutorial * program. The functions of the GridGenerator namespace typically * set the material ID of all cells to zero. When reading a * triangulation, the material id must be specified in the input diff --git a/deal.II/deal.II/include/grid/tria_accessor.h b/deal.II/deal.II/include/grid/tria_accessor.h index afe9f67b19..26bfa2b015 100644 --- a/deal.II/deal.II/include/grid/tria_accessor.h +++ b/deal.II/deal.II/include/grid/tria_accessor.h @@ -3439,8 +3439,8 @@ class CellAccessor : public TriaObjectAccessor * cell. * * For a typical use of this - * function, see the @ref step_22 - * "step-22" tutorial program. + * function, see the @ref step_28 + * "step-28" tutorial program. */ unsigned char material_id () const; @@ -3449,8 +3449,8 @@ class CellAccessor : public TriaObjectAccessor * cell. * * For a typical use of this - * function, see the @ref step_22 - * "step-22" tutorial program. + * function, see the @ref step_28 + * "step-28" tutorial program. */ void set_material_id (const unsigned char new_material_id) const; diff --git a/deal.II/examples/step-28/Makefile b/deal.II/examples/step-28/Makefile new file mode 100644 index 0000000000..c620808460 --- /dev/null +++ b/deal.II/examples/step-28/Makefile @@ -0,0 +1,154 @@ +# $Id: Makefile,v 1.20 2005/11/23 15:54:25 wolf Exp $ + + +# For the small projects Makefile, you basically need to fill in only +# four fields. +# +# The first is the name of the application. It is assumed that the +# application name is the same as the base file name of the single C++ +# file from which the application is generated. +target = project + +# The second field determines whether you want to run your program in +# debug or optimized mode. The latter is significantly faster, but no +# run-time checking of parameters and internal states is performed, so +# you should set this value to `on' while you develop your program, +# and to `off' when running production computations. +debug-mode = on + + +# As third field, we need to give the path to the top-level deal.II +# directory. You need to adjust this to your needs. Since this path is +# probably the most often needed one in the Makefile internals, it is +# designated by a single-character variable, since that can be +# reference using $D only, i.e. without the parentheses that are +# required for most other parameters, as e.g. in $(target). +D = ../../ + + +# The last field specifies the names of data and other files that +# shall be deleted when calling `make clean'. Object and backup files, +# executables and the like are removed anyway. Here, we give a list of +# files in the various output formats that deal.II supports. +clean-up-files = *gmv *gnuplot *gpl *eps *pov + + + + +# +# +# Usually, you will not need to change something beyond this point. +# +# +# The next statement tell the `make' program where to find the +# deal.II top level directory and to include the file with the global +# settings +include $D/common/Make.global_options + + +# Since the whole project consists of only one file, we need not +# consider difficult dependencies. We only have to declare the +# libraries which we want to link to the object file, and there need +# to be two sets of libraries: one for the debug mode version of the +# application and one for the optimized mode. Here we have selected +# the versions for 2d. Note that the order in which the libraries are +# given here is important and that your applications won't link +# properly if they are given in another order. +# +# You may need to augment the lists of libraries when compiling your +# program for other dimensions, or when using third party libraries +libs.g = $(lib-deal2-2d.g) \ + $(lib-lac.g) \ + $(lib-base.g) +libs.o = $(lib-deal2-2d.o) \ + $(lib-lac.o) \ + $(lib-base.o) + + +# We now use the variable defined above which switch between debug and +# optimized mode to select the set of libraries to link with. Included +# in the list of libraries is the name of the object file which we +# will produce from the single C++ file. Note that by default we use +# the extension .g.o for object files compiled in debug mode and .o for +# object files in optimized mode (or whatever the local default on your +# system is instead of .o). +ifeq ($(debug-mode),on) + libraries = $(target).g.$(OBJEXT) $(libs.g) +else + libraries = $(target).$(OBJEXT) $(libs.o) +endif + + +# Now comes the first production rule: how to link the single object +# file produced from the single C++ file into the executable. Since +# this is the first rule in the Makefile, it is the one `make' selects +# if you call it without arguments. +$(target) : $(libraries) + @echo ============================ Linking $@ + @$(CXX) -o $@$(EXEEXT) $^ $(LIBS) $(LDFLAGS) + + +# To make running the application somewhat independent of the actual +# program name, we usually declare a rule `run' which simply runs the +# program. You can then run it by typing `make run'. This is also +# useful if you want to call the executable with arguments which do +# not change frequently. You may then want to add them to the +# following rule: +run: $(target) + @echo ============================ Running $< + @./$(target)$(EXEEXT) + + +# As a last rule to the `make' program, we define what to do when +# cleaning up a directory. This usually involves deleting object files +# and other automatically created files such as the executable itself, +# backup files, and data files. Since the latter are not usually quite +# diverse, you needed to declare them at the top of this file. +clean: + -rm -f *.$(OBJEXT) *~ Makefile.dep $(target)$(EXEEXT) $(clean-up-files) + + +# Since we have not yet stated how to make an object file from a C++ +# file, we should do so now. Since the many flags passed to the +# compiler are usually not of much interest, we suppress the actual +# command line using the `at' sign in the first column of the rules +# and write the string indicating what we do instead. +./%.g.$(OBJEXT) : + @echo ==============debug========= $( $@ \ + || (rm -f $@ ; false) + @if test -s $@ ; then : else rm $@ ; fi + + +# To make the dependencies known to `make', we finally have to include +# them: +include Makefile.dep + + diff --git a/deal.II/examples/step-28/doc/data-q1 b/deal.II/examples/step-28/doc/data-q1 new file mode 100644 index 0000000000..c06f6d7eac --- /dev/null +++ b/deal.II/examples/step-28/doc/data-q1 @@ -0,0 +1,10 @@ + 0 2450 0.907410259645 4.077380000000 + 1 4289 0.907042395776 10.572393000000 + 2 8225 0.906937183449 25.223165000000 + 3 14757 0.906900660844 53.679839000000 + 4 26236 0.906886610239 108.345529000000 + 5 62804 0.906857043552 253.919398000000 + 6 86389 0.906844968762 466.115140000000 + 7 165629 0.906839125266 900.314131000000 + 8 301264 0.906836698748 1776.255968000000 + 9 444166 0.906835969493 3026.378920000000 diff --git a/deal.II/examples/step-28/doc/data-q2 b/deal.II/examples/step-28/doc/data-q2 new file mode 100644 index 0000000000..df6c0e0665 --- /dev/null +++ b/deal.II/examples/step-28/doc/data-q2 @@ -0,0 +1,10 @@ + 0 9522 0.906841960371 17.634319000000 + 1 15428 0.906837901031 33.703876000000 + 2 23566 0.906836075928 65.945975000000 + 3 33930 0.906835500110 120.341705000000 + 4 60358 0.906835001796 246.337551000000 + 5 86798 0.906834858174 403.059725000000 + 6 98538 0.906834824060 545.820023000000 + 7 117254 0.906834787555 734.265375000000 + 8 147302 0.906834761604 1014.816724000000 + 9 194442 0.906834746216 1366.371280000000 diff --git a/deal.II/examples/step-28/doc/data-q3 b/deal.II/examples/step-28/doc/data-q3 new file mode 100644 index 0000000000..4b9d50616c --- /dev/null +++ b/deal.II/examples/step-28/doc/data-q3 @@ -0,0 +1,10 @@ + 0 21218 0.906835491999 91.037161000000 + 1 34067 0.906834908620 131.201055000000 + 2 35069 0.906834859254 187.733460000000 + 3 50476 0.906834817384 279.669484000000 + 4 73375 0.906834783106 408.506898000000 + 5 90529 0.906834744225 590.097292000000 + 6 114417 0.906834730885 852.591387000000 + 7 151059 0.906834726355 1161.735390000000 + 8 215292 0.906834723745 1576.734300000000 + 9 275614 0.906834722268 2160.737518000000 diff --git a/deal.II/examples/step-28/doc/data-q4 b/deal.II/examples/step-28/doc/data-q4 new file mode 100644 index 0000000000..15a4abe16c --- /dev/null +++ b/deal.II/examples/step-28/doc/data-q4 @@ -0,0 +1,10 @@ + 0 37538 0.906834753543 373.753181000000 + 1 64160 0.906834728274 517.920264000000 + 2 88822 0.906834726164 1138.467927000000 + 3 157266 0.906834722755 2460.279981000000 + 4 175774 0.906834722205 4364.633475000000 + 5 227672 0.906834721746 4964.747243999999 + 6 264428 0.906834721654 5461.831674999999 + 7 328106 0.906834721515 6010.156317000000 + 8 395036 0.906834721416 12474.065654000000 + 9 455498 0.906834721380 19863.514286999998 diff --git a/deal.II/examples/step-28/doc/data-q5 b/deal.II/examples/step-28/doc/data-q5 new file mode 100644 index 0000000000..c4aa83ff28 --- /dev/null +++ b/deal.II/examples/step-28/doc/data-q5 @@ -0,0 +1,10 @@ + 0 58482 0.906834731399 1121.873449000000 + 1 97921 0.906834723230 1409.121780000000 + 2 98655 0.906834723009 2989.811479000000 + 3 131934 0.906834722626 3469.306585000000 + 4 188259 0.906834722379 4011.864103000000 + 5 255493 0.906834721986 4578.781919000000 + 6 271824 0.906834721755 10632.535608000000 + 7 307409 0.906834721567 11699.187453000000 + 8 316691 0.906834721509 12528.627359000000 + 9 363748 0.906834721439 13773.087172000000 diff --git a/deal.II/examples/step-28/doc/data-q6 b/deal.II/examples/step-28/doc/data-q6 new file mode 100644 index 0000000000..4c5094d228 --- /dev/null +++ b/deal.II/examples/step-28/doc/data-q6 @@ -0,0 +1,15 @@ + 0 84050 0.906834722842531 3184.047951000000012 + 1 140828 0.906834721670094 3965.101212999999916 + 2 158782 0.906834721605666 8725.235561999999845 + 3 230198 0.906834721530541 16501.528386000001774 + 4 320258 0.906834721476372 18215.300853000000643 + 5 385470 0.906834721418083 21774.706741000001784 + 6 438090 0.906834721389658 25271.607131000000663 + 7 462942 0.906834721380828 27951.595711000001756 + 8 502434 0.906834721371133 33127.243892999998934 + 9 522814 0.906834721367467 36477.579565000000002 + 10 552538 0.906834721365696 39634.395656000000599 + 11 570310 0.906834721364977 43278.281700999999885 + 12 593214 0.906834721364745 47564.244135000000824 + 13 654882 0.906834721363022 53225.507492000004277 + 14 716338 0.906834721360716 60232.646245000003546 diff --git a/deal.II/examples/step-28/doc/gnuplot.1 b/deal.II/examples/step-28/doc/gnuplot.1 new file mode 100644 index 0000000000..42a47f1d78 --- /dev/null +++ b/deal.II/examples/step-28/doc/gnuplot.1 @@ -0,0 +1,26 @@ +set term png +set logsc xy +set da sty lp + +set ylabel "Error" + +set output "error-vs-dofs.png" +set xlabel "Degrees of freedom" + +pl "data-q1" us 2:(abs($3-0.906834721360716)) title "Q1 elements", \ + "data-q2" us 2:(abs($3-0.906834721360716)) title "Q2 elements", \ + "data-q3" us 2:(abs($3-0.906834721360716)) title "Q3 elements", \ + "data-q4" us 2:(abs($3-0.906834721360716)) title "Q4 elements", \ + "data-q5" us 2:(abs($3-0.906834721360716)) title "Q5 elements", \ + "data-q6" us 2:(abs($3-0.906834721360716)) title "Q6 elements" + + +set output "error-vs-time.png" +set xlabel "Time in seconds" + +pl "data-q1" us 4:(abs($3-0.906834721360716)) title "Q1 elements", \ + "data-q2" us 4:(abs($3-0.906834721360716)) title "Q2 elements", \ + "data-q3" us 4:(abs($3-0.906834721360716)) title "Q3 elements", \ + "data-q4" us 4:(abs($3-0.906834721360716)) title "Q4 elements", \ + "data-q5" us 4:(abs($3-0.906834721360716)) title "Q5 elements", \ + "data-q6" us 4:(abs($3-0.906834721360716)) title "Q6 elements" diff --git a/deal.II/examples/step-28/doc/intro.dox b/deal.II/examples/step-28/doc/intro.dox new file mode 100644 index 0000000000..f693a95d3c --- /dev/null +++ b/deal.II/examples/step-28/doc/intro.dox @@ -0,0 +1 @@ +

Introduction

diff --git a/deal.II/examples/step-28/doc/intro.tex b/deal.II/examples/step-28/doc/intro.tex new file mode 100644 index 0000000000..4516336213 --- /dev/null +++ b/deal.II/examples/step-28/doc/intro.tex @@ -0,0 +1,634 @@ +\documentclass{article} +\usepackage{amssymb,amsmath} +\makeatletter +\newcommand{\rmnum}[1]{\romannumeral #1} +\newcommand{\Rmnum}[1]{\expandafter\@slowromancap\romannumeral #1@} +\makeatother +\begin{document} + +What is new in this example: +\begin{enumerate} +\item Solve multigroup neutron diffusion problem with multiple different meshes +\item Solve an eigenvalue problem +\item Setting up complicated material properties for nuclear fuel assemblies +\end{enumerate} + +\subsection{Introduction} + +In this example, we intend to solve the multigroup diffusion approximation of +the neutron transport equation. Essentially, the way to view this is as follows: In a +nuclear reactor, neutrons are speeding around at different energies, get +absorbed or scattered, or start a new fission +event. If viewed at long enough length scales, the movement of neutrons can be +considered a diffusion process. + +A mathematical description of this would group neutrons into energy bins, and +consider the balance equations for the neutron fluxes in each of these +bins, or energy groups. The scattering, absorption, and fission events would +then be operators within the diffusion equation describing the neutron +fluxes. Assume we have energy groups $g=1,\ldots,G$, where by convention we +assume that the neutrons with the highest energy are in group 1 and those with +the lowest energy in group $G$. Then the neutron flux of each group satisfies the +following equations: +\begin{eqnarray*} +\frac 1{v_g}\frac{\partial \phi_g(x,t)}{\partial t} +&=& +\nabla \cdot(D_g(x) \nabla \phi_g(x,t)) +- +\Sigma_{r,g}(x)\phi_g(x,t) +\\ +&& \qquad ++ +\chi_g\sum_{g'=1}^G\nu\Sigma_{f,g'}(x)\phi_{g'}(x,t) ++ +\sum_{g'\ne g}\Sigma_{s,g'\to g}(x)\phi_{g'}(x,t) ++ +s_{\mathrm{ext},g}(x,t) +\end{eqnarray*} +augmented by appropriate boundary conditions. Here, $v_g$ is the velocity of +neutrons within group $g$. In other words, the change in +time in flux of neutrons in group $g$ is governed by the following +processes: +\begin{itemize} +\item Diffusion $\nabla \cdot(D_g(x) \nabla \phi_g(x,t))$. Here, $D_g$ is the + (spatially variable) diffusion coefficient. +\item Absorption $\Sigma_{r,g}(x)\phi_g(x,t)$ (note the + negative sign). The coefficient $\Sigma_{r,g}$ is called the \textit{removal + cross section}. +\item Nuclear fission $\chi_g\sum_{g'=1}^G\nu\Sigma_{f,g'}(x)\phi_{g'}(x,t)$. + The production of neutrons of energy $g$ is + proportional to the flux of neutrons of energy $g'$ times the + probability $\Sigma_{f,g'}$ that neutrons of energy $g'$ cause a fission + event times the number $\nu$ of neutrons produced in each fission event + times the probability that a neutron produced in this event has energy + $g$. $\nu\Sigma_{f,g'}$ is called the \textit{fission cross section} and + $\chi_g$ the \textit{fission spectrum}. We will denote the term + $\chi_g\nu\Sigma_{f,g'}$ as the \textit{fission distribution cross + section} in the program. +\item Scattering $\sum_{g'\ne g}\Sigma_{s,g'\to g}(x)\phi_{g'}(x,t)$ + of neutrons of energy $g'$ producing neutrons + of energy $g$. $\Sigma_{s,g'\to g}$ is called the \textit{scattering cross + section}. The case of elastic, in-group scattering $g'=g$ exists, too, but + we subsume this into the removal cross section. The case $g'g$ corresponds to up-scattering: a neutron gains energy in + a scattering event from the thermal motion of the atoms surrounding it; + up-scattering is therefore only an important process for neutrons with + kinetic energies that are already on the same order as the thermal kinetic + energy (i.e. in the sub $eV$ range). +\item An extraneous source $s_{\mathrm{ext},g}$. +\end{itemize} + +For realistic simulations in reactor analysis, one may want to split the +continuous spectrum of neutron energies into many energy groups, often up to +100. However, if neutron energy spectra are known well enough for some type of +reactor (for example Pressurized Water Reactors, PWR), it is possible to obtain +satisfactory results with only 2 energy groups. + +In the program shown in this tutorial program, we provide the structure to +compute with as many energy groups as desired. However, to keep computing +times moderate and in order to avoid tabulating hundreds of coefficients, we +only provide the coefficients for above equations for a two-group simulation, +i.e. $g=1,2$. We do, however, consider a realistic situation by assuming that +the coefficients are not constant, but rather depend on the materials that are +assembled into reactor fuel assemblies in rather complicated ways (see +below). + + +\subsection{The eigenvalue problem} + +If we consider all energy groups at once, we may write above equations in the +following operator form: +\begin{equation} +\frac 1v \frac{\partial \phi}{\partial t} += +-L\phi ++ +F\phi ++ +X\phi ++ +s_{\mathrm{ext}}, +\end{equation} +where $L,F,X$ are sinking, fission, and scattering operators, +respectively. $L$ here includes both the diffusion and removal terms. Note +that $L$ is symmetric, whereas $F$ and $X$ are not. + +It is well known that this equation admits a stable solution if all +eigenvalues of the operator $-L+F+X$ are negative. This can be readily seen by +multiplying the equation by $\phi$ and integrating over the domain, leading to +\begin{equation} + \frac 1{2v} \frac{\partial}{\partial t} \|\phi\|^2 = ((-L+F+X)\phi,\phi). +\end{equation} +Stability means that the solution does not grow, i.e. we want the left hand +side to be less than zero, which is the case if the eigenvalues of the +operator on the right are all negative. For obvious reasons, it is +not very desirable if a nuclear reactor produces neutron fluxes that grow +exponentially, so eigenvalue analyses are the bread-and-butter of nuclear +engineers. The main point of the program is therefore to consider the +eigenvalue problem +\begin{equation} + (L-F-X) \phi = \lambda \phi, +\end{equation} +where we want to make sure that all eigenvalues are positive. Note that $L$, +being the diffusion operator plus the absorption (removal), is positive +definite; the condition that all eigenvalues are positive therefore means that +we want to make sure that fission and inter-group scattering are weak enough +to not shift the spectrum into the negative. + +In nuclear engineering, one typically looks at a slightly different +formulation of the eigenvalue problem. To this end, we do not just multiply +with $\phi$ and integrate, but rather multiply with $\phi(L-X)^{-1}$. We then +get the following evolution equation: +\begin{equation} + \frac 1{2v} \frac{\partial}{\partial t} \|\phi\|^2_{(L-X)^{-1}} = ((L-X)^{-1}(-L+F+X)\phi,\phi). +\end{equation} +Stability is the guaranteed if the eigenvalues of the following problem are +all negative: +\begin{equation} + (L-X)^{-1}(-L+F+X)\phi = \lambda_F \phi, +\end{equation} +which is equivalent to the eigenvalue problem +\begin{equation} + (L-X)\phi = \frac 1{\lambda_F+1} F \phi. +\end{equation} +The typical formulation in nuclear engineering is to write this as +\begin{equation} + (L-X) \phi = \frac 1{k_{\mathrm{eff}}} F \phi, +\end{equation} +where $k_{\mathrm{eff}}=\frac 1{\lambda^F+1}$. +Intuitively, $k_{\mathrm{eff}}$ is something like the multiplication +factor for neutrons per typical time scale and should be less than or equal to +one for stable operation of a reactor: if it is less than one, the chain reaction will +die down, whereas nuclear bombs for example have a $k$-eigenvalue larger than +one. A stable reactor should have $k_{\mathrm{eff}}=1$. + +[For those who wonder how this can be achieved in practice without +inadvertently getting slightly larger than one and triggering a nuclear bomb: +first, fission processes happen on different time scales. While most neutrons +are releases very quickly after a fission event, a small number of neutrons +are only released by daughter nuclei after several further decays, up to 10-60 +seconds after the fission was initiated. If one is therefore slightly beyond +$k_{\mathrm{eff}}=1$, one therefore has many seconds to react until all the +neutrons created in fission re-enter the fission cycle. Nevertheless, control +rods in nuclear reactors absorbing neutrons -- and therefore reducing +$k_{\mathrm{eff}}$ -- are designed in such a way that they are all the way in +the reactor in at most 2 seconds. + +One therefore has on the order of 10-60 seconds to regulate the nuclear reaction +if $k_{\mathrm{eff}}$ should be larger than one for some time, as indicated by +a growing neutron flux. Regulation can be achieved by continuously monitoring +the neutron flux, and if necessary increase or reduce neutron flux by moving +neutron-absorbing control rods a few millimeters into or out of the +reactor. On a longer scale, the water cooling the reactor contains boron, a +good neutron absorber. Every few hours, boron concentrations are adjusted by +adding boron or diluting the coolant. + +Finally, some of the absorption and scattering reactions have some +stability built in; for example, higher neutron fluxes result in locally +higher temperatures, which lowers the density of water and therefore reduces +the number of scatterers that are necessary to moderate neutrons from high to +low energies before they can start fission events themselves.] + +In this tutorial program, we solve above $k$-eigenvalue problem for two energy +groups, and we are looking for the largest multiplication factor +$k_{\mathrm{eff}}$, which is proportional to the inverse of the minimum +eigenvalue plus one. To solve the eigenvalue problem, we generally +use a modified version of the \emph{inverse power method}. The algorithm looks +like this: + +\begin{enumerate} +\item Initialize $\phi_g$ and $k_{\mathrm{eff}}$ with $\phi_g^{(0)}$ + and $k_{\mathrm{eff}}^{(0)}$ and let $n=1$. + +\item Define the so-called \textit{fission source} by + \begin{equation} + s_f^{(n-1)}(x) + = + \frac{1}{k_{\mathrm{eff}}^{(n-1)}} + \sum_{g'=1}^G\nu\Sigma_{f,g'}(x)\phi_{g'}^{(n-1)}(x). + \end{equation} + +\item Solve for all group fluxes $\phi_g,g=1,\ldots,G$ using + \begin{equation} + -\nabla \cdot D_g\nabla \phi_g^{(n)} + + + \Sigma_{r,g}\phi_g^{(n)} + = + \chi_g s_f^{(n-1)} + + + \sum_{g'< g} \Sigma_{s,g'\to g} \phi_{g'}^{(n)} + + + \sum_{g'> g}\Sigma_{s,g'\to g}\phi_{g'}^{(n-1)}. + \end{equation} + +\item Update + \begin{equation} + k_{\mathrm{eff}}^{(n)} + = + \sum_{g'=1}^G + \int_{\Omega}\nu\Sigma_{f,g'}(x) + \phi_{g'}^{(n)}(x)dx. + \end{equation} + +\item Compare $k_{\mathrm{eff}}^{(n)}$ with $k_{\mathrm{eff}}^{(n-1)}$. + If the change greater than a prescribed tolerance then set $n=n+1$ repeat + the iteration starting at step 2, otherwise end the iteration. +\end{enumerate} + +Note that in this scheme, we do not solve group fluxes exactly in each power +iteration, but rather consider previously compute $\phi_{g'}^{(n)}$ only for +down-scattering events $g' + \alpha_1 + \displaystyle{\max_{\substack{1\le g\le G\\K\in {\mathbb T}_g}} + \frac{\eta_{g,K}}{\|\phi_g\|_\infty}} +\end{equation} +and coarsen the cells where +\begin{equation} + \frac{\eta_{g,K}}{\|\phi_g\|_\infty} + < + \alpha_2 + \displaystyle{\max_{\substack{1\le g\le G\\K\in {\mathbb T}_g}} + \frac{\eta_{g,K}}{\|\phi_g\|_\infty}}. +\end{equation} +We chose $\alpha_1=0.3$ and $\alpha_2=0.01$ in the code. Note that this will, +of course, lead to different meshes for the different energy groups. + +The strategy above essentially means the following: If for energy group $g$ +there are many cells $K\in {\mathbb T}_g$ on which the error is large, for +example because the solution is globally very rough, then many cells will be +above the threshold. On the other hand, if there are a few cells with large +and many with small errors, for example because the solution is overall rather +smooth except at a few places, then only the few cells with large errors will +be refined. Consequently, the strategy allows for meshes that track the global +smoothness properties of the corresponding solutions rather well. + + +\subsubsection{Assembling terms on different meshes} + +As pointed out above, the multigroup refinement strategy results in +different meshes for the different solutions $\phi_g$. So what's the problem? +In essence it goes like this: in step 3 of the eigenvalue iteration, we have +form the weak form for the equation to compute $\phi_g^{(n)}$ as usual by +multiplication with test functions $\varphi_g^i$ defined on the mesh for +energy group $g$; in the process, we have to +compute the right hand side vector that contains terms of the following form: +\begin{equation} + F_i = \int_\Omega f(x) \varphi_g^i(x) \phi_{g'}(x) \ dx, +\end{equation} +where $f(x)$ is one of the coefficient functions $\Sigma_{s,g'\to g}$ or +$\nu\chi_g\Sigma_{f,g'}$ used in the right hand side +of eigenvalue equation. The difficulty now is that $\phi_{g'}$ is defined on +the mesh for energy group $g'$, i.e. it can be expanded as +$\phi_{g'}(x)=\sum_j\phi_{g'}^j \varphi_{g'}^j(x)$, with basis functions +$\varphi_{g'}^j(x)$ defined on mesh $g'$. The contribution to the right hand +side can therefore be written as +\begin{equation} + F_i = \sum_j \left\{\int_\Omega f(x) \varphi_g^i(x) \varphi_{g'}^j(x) + \ dx \right\} \phi_{g'}^j , +\end{equation} +On the other hand, the test functions $\varphi_g^i(x)$ are defined on mesh +$g$. This means that we can't just split the integral $\Omega$ into integrals +over the cells of either mesh $g$ or $g'$, since the respectively other basis +functions may not be defined on these cells. + +The solution to this problem lies in the fact that both the meshes for $g$ and +$g'$ are derived by adaptive refinement from a common coarse mesh. We can +therefore always find a set of cells, which we denote by ${\mathbb T}_g \cap +{\mathbb T}_{g'}$, that satisfy the following conditions: +\begin{itemize} +\item the union of the cells covers the entire domain, and +\item a cell $K \in {\mathbb T}_g \cap {\mathbb T}_{g'}$ is active on at least + one of the two meshes. +\end{itemize} +A way to construct this set is to take each cell of coarse mesh and do the +following steps: (i) if the cell is active on either ${\mathbb T}_g$ or +${\mathbb T}_{g'}$, then add this cell to the set; (ii) otherwise, i.e. if +this cell has children on both meshes, then do step (i) for each of the +children of this cell. In fact, deal.II has a function +\texttt{GridTools::get\_finest\_common\_cells} that computes exactly this set +of cells that are active on at least one of two meshes. + +With this, we can write above integral as follows: +\begin{equation} + F_i + = + \sum_{K \in {\mathbb T}_g \cap {\mathbb T}_{g'}} + \sum_j \left\{\int_K f(x) \varphi_g^i(x) \varphi_{g'}^j(x) + \ dx \right\} \phi_{g'}^j. +\end{equation} + In the code, we +compute the right hand side in the function +\texttt{NeutronDiffusionProblem::assemble\_rhs}, where (among other things) we +loop over the set of common most refined cells, calling the function +\texttt{NeutronDiffusionProblem::assemble\_common\_cell} on each pair of +these cells. + +By construction, there are now three cases to be considered: +\begin{itemize} +\item[(i)] The cell $K$ is active on both meshes, i.e. both the basis + functions $\varphi_g^i$ as well as $\varphi_{g'}^j$ are defined on $K$. +\item[(ii)] The cell $K$ is active on mesh $g$, but not $g'$, i.e. the + $\varphi_g^i$ are defined on $K$, whereas the $\varphi_{g'}^j$ are defined + on children of $K$. +\item[(iii)] The cell $K$ is active on mesh $g'$, but not $g$, with opposite + conclusions than in (ii). +\end{itemize} + +To compute the right hand side above, we then need to have different code for +these three cases, as follows: +\begin{itemize} +\item[(i)] If the cell $K$ is active on both meshes, then we can directly + evaluate the integral. In fact, we don't even have to bother with the basis + functions $\varphi_{g'}$, since all we need is the values of $\phi_{g'}$ at + the quadrature points. We can do this using the + \texttt{FEValues::get\_function\_values} function. This is done directly in + the \texttt{NeutronDiffusionProblem::assemble\_common\_cell} function. + +\item[(ii)] If the cell $K$ is active on mesh $g$, but not $g'$, then the + basis functions $\varphi_{g'}^j$ are only defined either on the children + $K_c,0\le c<2^{\texttt{dim}}$, or on children of these children if cell $K$ + is refined more than once more on mesh $g'$. + + Let us assume for a second that $K$ is only once more refined on mesh $g'$ + than on mesh $g$. Using the fact that we use embedded finite element spaces + where each basis function on one mesh can be written as a linear combination + of basis functions on the next refined mesh, we can expand the restriction + of $\phi_g^i$ to child cell $K_c$ into the basis functions defined on that + child cell (i.e. on cells on which the basis functions $\varphi_{g'}^l$ are + defined): + \begin{equation} + \phi_g^i|_{K_c} = B_c^{il} \varphi_{g'}^l|_{K_c}. + \end{equation} + Here, and in the following, summation over indices appearing twice is + implied. The matrix $B_c$ is the matrix that interpolated data from a cell + to its $c$-th child. + + Then we can write the contribution of cell $K$ to the right hand side + component $F_i$ as + \begin{eqnarray*} + F_i|_K + &=& + \left\{ \int_K f(x) \varphi_g^i(x) \varphi_{g'}^j(x) + \ dx \right\} \phi_{g'}^j + \\ + &=& + \left\{ + \sum_{0\le c<2^{\texttt{dim}}} + B_c^{il} \int_{K_c} f(x) \varphi_{g'}^l(x) \varphi_{g'}^j(x) + \ dx \right\} \phi_{g'}^j. + \end{eqnarray*} + In matrix notation, this can be written as + \begin{eqnarray*} + F_i|_K + = + \sum_{0\le c<2^{\texttt{dim}}} + F_i|_{K_c}, + \qquad + \qquad + F_i|_{K_c} = B_c^{il} M_{K_c}^{lj} \phi_{g'}^j + = (B_c M_{K_c})^{il} \phi_{g'}^j, + \end{eqnarray*} + where $M_{K_c}^{lj}=\int_{K_c} f(x) \varphi_{g'}^l(x) \varphi_{g'}^j(x)$ is + the weighted mass matrix on child $c$ of cell $K$. + + The next question is what happens if a child $K_c$ of $K$ is not + active. Then, we have to apply the process recursively, i.e. we have to + interpolate the basis functions $\varphi_g^i$ onto child $K_c$ of $K$, then + onto child $K_{cc'}$ of that cell, onto child $K_{cc'c''}$ of that one, etc, + until we find an active cell. We then have to sum up all the contributions + from all the children, grandchildren, etc, of cell $K$, with contributions + of the form + \begin{equation} + F_i|_{K_{cc'}} = (B_cB_{c'} M_{K_{cc'}})^{ij} \phi_{g'}^j, + \end{equation} + or + \begin{equation} + F_i|_{K_{cc'c''}} = (B_c B_{c'} B_{c''}M_{K_{cc'c''}})^{ij} + \phi_{g'}^j, + \end{equation} + etc. We do this process recursively, i.e. if we sit on cell $K$ and see that + it has children on grid $g'$, then we call a function + \texttt{assemble\_case\_2} with an identity matrix; the function will + multiply it's argument from the left with the prolongation matrix; if the + cell has further children, it will call itself with this new matrix, + otherwise it will perform the integration. + +\item[(iii)] The last case is where $K$ is active on mesh $g'$ but not mesh + $g$. In that case, we have to express basis function $\varphi_{g'}^j$ in + terms of the basis functions defined on the children of cell $K$, rather + than $\varphi_g^i$ as before. This of course works in exactly the same + way. If the children of $K$ are active on mesh $g$, then + leading to the expression + \begin{eqnarray*} + F_i|_K + &=& + \left\{ \int_K f(x) \varphi_g^i(x) \varphi_{g'}^j(x) + \ dx \right\} \phi_{g'}^j + \\ + &=& + \left\{ + \sum_{0\le c<2^{\texttt{dim}}} + \int_{K_c} f(x) \varphi_{g'}^i(x) B_c^{jl} \varphi_{g'}^l(x) + \ dx \right\} \phi_{g'}^j. + \end{eqnarray*} + In matrix notation, this expression now reads as + \begin{eqnarray*} + F_i|_K + = + \sum_{0\le c<2^{\texttt{dim}}} + F_i|_{K_c}, + \qquad + \qquad + F_i|_{K_c} = M_{K_c}^{il} B_c^{jl} \phi_{g'}^j + = + (M_{K_c} B_c^T)^{ij} \phi_{g'}^j, + \end{eqnarray*} + and correspondingly for cases where cell $K$ is refined more than once on + mesh $g$: + \begin{equation} + F_i|_{K_{cc'}} = (M_{K_{cc'}} B_{c'}^T B_c^T)^{ij} \phi_{g'}^j, + \end{equation} + or + \begin{equation} + F_i|_{K_{cc'c''}} = (M_{K_{cc'c''}} B_{c''}^T B_{c'}^T B_c^T)^{ij} + \phi_{g'}^j, + \end{equation} + etc. In other words, the process works in exactly the same way as before, + except that we have to take the transpose of the prolongation matrices and + need to multiply it to the mass matrix from the other side. +\end{itemize} + + +The expressions for cases (ii) and (iii) can be understood as repeatedly +interpolating either the left or right basis functions in the scalar product +$(f \varphi_g^i, \varphi_{g'}^j)_K$ onto child cells, and then finally +forming the inner product (the mass matrix) on the final cell. To make the +symmetry in these cases more obvious, we can write them like this: for case +(ii), we have +\begin{equation} + F_i|_{K_{cc'\cdots c^{(k)}}} + = [B_c B_{c'} \cdots B_{c^{(k)}} M_{K_{cc'\cdots c^{(k)}}}]^{ij} + \phi_{g'}^j, +\end{equation} +whereas for case (iii) we get +\begin{equation} + F_i|_{K_{cc'\cdots c^{(k)}}} + = [(B_c B_{c'} \cdots B_{c^{(k)}} M_{K_{cc'\cdots c^{(k)}}})^T]^{ij} + \phi_{g'}^j, +\end{equation} + + + +\subsection{Description of the test case} + +A nuclear reactor core is composed of different types of assemblies. An +assembly is essentially the smallest unit that can be moved in and out of a +reactor, and is usually rectangular or square. However, assemblies are not +fixed units, as they are assembled from a complex lattice of different fuel +rods, control rods, and instrumentation elements that are held in place +relative to each other by spacers that are permanently attached to the rods. +To make things more complicated, there are different kinds of assemblies that +are used at the same time in a reactor, where assemblies differ in the type +and arrangement of rods they are made up of. + +Obviously, the arrangement of assemblies as well as the arrangement of rods +inside them affect the distribution of neutron fluxes in the reactor (a fact +that will be obvious by looking at the solution shown below in the results +sections of this program). Fuel rods, for example, differ from each other in +the enrichment of U-235 or Pu-239. Control rods, on the other hand, have zero +fission, but nonzero scattering and absorption cross sections. + +This whole arrangement would make the description or spatially dependent +material parameters very complicated. It will not become much simpler, but we +will make one approximation: we merge the volume inhabited by each cylindrical +rod and the surrounding water into volumes of quadratic cross section into +so-called ``pin cells'' for which homogenized material data are obtained with +nuclear database and knowledge of neutron spectrum. The homogenization makes +all material data piecewise constant on the solution domain for a reactor with +fresh fuel. Spatially dependent material parameters are then looked up for the +quadratic assembly in which a point is located, and then for the quadratic pin +cell within this assembly. + +In this tutorial program, we simulate a quarter of a reactor consisting of $4 +\times 4$ assemblies. We use symmetry (Neumann) boundary conditions to reduce +the problem to one quarter of the domain, and consequently only simulate a +$2\times 2$ set of assemblies. Two of them will be UO${}_2$ fuel, the other +two of them MOX fuel. Each of these assemblies consists of $17\times 17$ rods +of different compositions. In total, we therefore create a $34\times 34$ +lattice of rods. To make things simpler later on, we reflect this fact by +creating a coarse mesh of $34\times 34$ cells (even though the domain is a +square, for which we would usually use a single cell). In deal.II, each cell +has a \texttt{material\_id} which one may use to associated each cell with a +particular number identifying the material from which this cell's volume is +made of; we will use this material ID to identify which of the 8 different +kinds of rods that are used in this testcase make up a particular cell. Note +that upon mesh refinement, the children of a cell inherit the material ID, +making it simple to track the material even after mesh refinement. + +The arrangement of the rods will be clearly visible in the images shown in +the results section. The cross sections for materials and for both energy +groups are taken from a OECD/NEA benchmark problem. The detailed configuration +and material data is given in the code. + + +\subsection{What the program does (and how it does that)} + +As a coarse overview of what exactly the program does, here is the basic +layout: starting on a coarse mesh that is the same for each energy group, we +compute inverse eigenvalue iterations to compute the $k$-eigenvalue on a given +set of meshes. We stop these iterations when the change in the eigenvalue +drops below a certain tolerance, and then write out the meshes and solutions +for each energy group for inspection by a graphics program. Because the meshes +for the solutions are different, we have to generate a separate output file +for each energy group, rather than being able to add all energy group +solutions into the same file. + +After this, we evaluate the error indicators as explained in one of the sections +above for each of the meshes, and refine and coarsen the cells of each mesh +independently. Since the eigenvalue iterations are fairly expensive, we don't +want to start all over on the new mesh; rather, we use the SolutionTransfer +class to interpolate the solution on the previous mesh to the next one upon +mesh refinement. A simple experiment will convince you that this is a lot +cheaper than if we omitted this step. After doing so, we resume our eigenvalue +iterations on the next set of meshes. + +The program is controlled by a parameter file, using the ParameterHandler +class already mentioned in the step-19 example program. We will show a +parameter file in the results section of this section. For the moment suffice +it to say that it controls the polynomial degree of the finite elements used, +the number of energy groups (even though all that is presently implemented are +the coefficients for a 2-group problem), the tolerance where to stop the +inverse eigenvalue iteration, and the number of refinement cycles we will do. + +\end{document} diff --git a/deal.II/examples/step-28/doc/results.dox b/deal.II/examples/step-28/doc/results.dox new file mode 100644 index 0000000000..f7a468d988 --- /dev/null +++ b/deal.II/examples/step-28/doc/results.dox @@ -0,0 +1,500 @@ +

Results

+ + +The output of this program consist of the console output, a file +named ``convergence_table'' to record main results of mesh iteration, the eps +files including the grids, and the solutions given in gnuplot format. + +When we set Polynomial_Order to 2, we got following console output: +@code +Cycle 0: + Numbers of active cells: 1156 1156 + Numbers of degrees of freedom: 4761 4761 +Iter number:1 k_eff=319.375676634307 flux ratio=6.836246075631 max_thermal=1.433899030144 +Iter number:2 k_eff=0.834072546055 flux ratio=5.204601882141 max_thermal=0.004630925876 +Iter number:3 k_eff=0.862826188043 flux ratio=4.645051765984 max_thermal=0.005380396338 +Iter number:4 k_eff=0.877887920967 flux ratio=4.318030683875 max_thermal=0.006005512201 +Iter number:5 k_eff=0.887161559547 flux ratio=4.256596788174 max_thermal=0.006639443035 +Iter number:6 k_eff=0.893254525197 flux ratio=4.296498905676 max_thermal=0.007161016401 +Iter number:7 k_eff=0.897386466621 flux ratio=4.323736110066 max_thermal=0.007541125053 +Iter number:8 k_eff=0.900235644733 flux ratio=4.342491852394 max_thermal=0.007813654241 +Iter number:9 k_eff=0.902217719823 flux ratio=4.355367629620 max_thermal=0.008007335384 +Iter number:10 k_eff=0.903602785157 flux ratio=4.364212965582 max_thermal=0.008144201718 +Iter number:11 k_eff=0.904572678811 flux ratio=4.370302672219 max_thermal=0.008240563668 +Iter number:12 k_eff=0.905252379018 flux ratio=4.374506018233 max_thermal=0.008308245052 +Iter number:13 k_eff=0.905728767660 flux ratio=4.377414535866 max_thermal=0.008355707257 +Iter number:14 k_eff=0.906062594755 flux ratio=4.379431495993 max_thermal=0.008388956163 +Iter number:15 k_eff=0.906296449777 flux ratio=4.380832749068 max_thermal=0.008412232394 +Iter number:16 k_eff=0.906460217413 flux ratio=4.381807689696 max_thermal=0.008428519956 +Iter number:17 k_eff=0.906574868174 flux ratio=4.382486812297 max_thermal=0.008439913928 +Iter number:18 k_eff=0.906655112098 flux ratio=4.382960306180 max_thermal=0.008447883119 +Iter number:19 k_eff=0.906711262646 flux ratio=4.383290664907 max_thermal=0.008453456292 +Iter number:20 k_eff=0.906750547146 flux ratio=4.383521281424 max_thermal=0.008457353551 +Iter number:21 k_eff=0.906778027984 flux ratio=4.383682335660 max_thermal=0.008460078740 +Iter number:22 k_eff=0.906797249757 flux ratio=4.383794844804 max_thermal=0.008461984300 +Iter number:23 k_eff=0.906810693563 flux ratio=4.383873459628 max_thermal=0.008463316724 +Iter number:24 k_eff=0.906820095658 flux ratio=4.383928400683 max_thermal=0.008464248386 +Iter number:25 k_eff=0.906826670830 flux ratio=4.383966802041 max_thermal=0.008464899825 +Iter number:26 k_eff=0.906831268888 flux ratio=4.383993645532 max_thermal=0.008465355326 +Iter number:27 k_eff=0.906834484255 flux ratio=4.384012411177 max_thermal=0.008465673822 +Iter number:28 k_eff=0.906836732678 flux ratio=4.384025530521 max_thermal=0.008465896521 +Iter number:29 k_eff=0.906838304919 flux ratio=4.384034702833 max_thermal=0.008466052239 +Iter number:30 k_eff=0.906839404318 flux ratio=4.384041115801 max_thermal=0.008466161120 +Iter number:31 k_eff=0.906840173074 flux ratio=4.384045599636 max_thermal=0.008466237253 +Iter number:32 k_eff=0.906840710623 flux ratio=4.384048734710 max_thermal=0.008466290487 +Iter number:33 k_eff=0.906841086501 flux ratio=4.384050926767 max_thermal=0.008466327710 +Iter number:34 k_eff=0.906841349329 flux ratio=4.384052459477 max_thermal=0.008466353737 +Iter number:35 k_eff=0.906841533109 flux ratio=4.384053531173 max_thermal=0.008466371936 +Iter number:36 k_eff=0.906841661615 flux ratio=4.384054280525 max_thermal=0.008466384662 +Iter number:37 k_eff=0.906841751471 flux ratio=4.384054804489 max_thermal=0.008466393560 +Iter number:38 k_eff=0.906841814301 flux ratio=4.384055170858 max_thermal=0.008466399781 +Iter number:39 k_eff=0.906841858234 flux ratio=4.384055427034 max_thermal=0.008466404132 +Iter number:40 k_eff=0.906841888954 flux ratio=4.384055606159 max_thermal=0.008466407174 +Iter number:41 k_eff=0.906841910434 flux ratio=4.384055731409 max_thermal=0.008466409301 +Iter number:42 k_eff=0.906841925454 flux ratio=4.384055818987 max_thermal=0.008466410788 +Iter number:43 k_eff=0.906841935956 flux ratio=4.384055880225 max_thermal=0.008466411828 +Iter number:44 k_eff=0.906841943300 flux ratio=4.384055923044 max_thermal=0.008466412555 +Iter number:45 k_eff=0.906841948435 flux ratio=4.384055952984 max_thermal=0.008466413064 +Iter number:46 k_eff=0.906841952025 flux ratio=4.384055973920 max_thermal=0.008466413419 +Iter number:47 k_eff=0.906841954536 flux ratio=4.384055988559 max_thermal=0.008466413668 +Iter number:48 k_eff=0.906841956291 flux ratio=4.384055998794 max_thermal=0.008466413842 +Iter number:49 k_eff=0.906841957518 flux ratio=4.384056005952 max_thermal=0.008466413963 +Iter number:50 k_eff=0.906841958377 flux ratio=4.384056010956 max_thermal=0.008466414048 +Iter number:51 k_eff=0.906841958977 flux ratio=4.384056014456 max_thermal=0.008466414108 +Iter number:52 k_eff=0.906841959397 flux ratio=4.384056016902 max_thermal=0.008466414149 +Iter number:53 k_eff=0.906841959690 flux ratio=4.384056018613 max_thermal=0.008466414178 +Iter number:54 k_eff=0.906841959895 flux ratio=4.384056019810 max_thermal=0.008466414199 +Iter number:55 k_eff=0.906841960039 flux ratio=4.384056020646 max_thermal=0.008466414213 +Iter number:56 k_eff=0.906841960139 flux ratio=4.384056021231 max_thermal=0.008466414223 +Iter number:57 k_eff=0.906841960209 flux ratio=4.384056021640 max_thermal=0.008466414230 +Iter number:58 k_eff=0.906841960258 flux ratio=4.384056021926 max_thermal=0.008466414235 +Iter number:59 k_eff=0.906841960292 flux ratio=4.384056022126 max_thermal=0.008466414238 +Iter number:60 k_eff=0.906841960316 flux ratio=4.384056022266 max_thermal=0.008466414240 +Iter number:61 k_eff=0.906841960333 flux ratio=4.384056022364 max_thermal=0.008466414242 +Iter number:62 k_eff=0.906841960345 flux ratio=4.384056022432 max_thermal=0.008466414243 +Iter number:63 k_eff=0.906841960353 flux ratio=4.384056022480 max_thermal=0.008466414244 +Iter number:64 k_eff=0.906841960359 flux ratio=4.384056022513 max_thermal=0.008466414245 +Iter number:65 k_eff=0.906841960363 flux ratio=4.384056022537 max_thermal=0.008466414245 +Iter number:66 k_eff=0.906841960366 flux ratio=4.384056022553 max_thermal=0.008466414245 +Iter number:67 k_eff=0.906841960368 flux ratio=4.384056022564 max_thermal=0.008466414246 +Iter number:68 k_eff=0.906841960369 flux ratio=4.384056022572 max_thermal=0.008466414246 +Iter number:69 k_eff=0.906841960370 flux ratio=4.384056022578 max_thermal=0.008466414246 +Iter number:70 k_eff=0.906841960371 flux ratio=4.384056022582 max_thermal=0.008466414246 +Cycle 1: + Numbers of active cells: 1156 2380 + Numbers of degrees of freedom: 4761 10667 +Iter number:1 k_eff=0.906838267472 flux ratio=4.385474405124 max_thermal=0.008463675976 +Iter number:2 k_eff=0.906837892433 flux ratio=4.385486158840 max_thermal=0.008463675386 +Iter number:3 k_eff=0.906837848258 flux ratio=4.385487761080 max_thermal=0.008463681343 +Iter number:4 k_eff=0.906837849549 flux ratio=4.385488316617 max_thermal=0.008463685560 +Iter number:5 k_eff=0.906837859133 flux ratio=4.385488608157 max_thermal=0.008463688398 +Iter number:6 k_eff=0.906837869078 flux ratio=4.385488780872 max_thermal=0.008463690308 +Iter number:7 k_eff=0.906837877437 flux ratio=4.385488887750 max_thermal=0.008463691599 +Iter number:8 k_eff=0.906837883930 flux ratio=4.385488955514 max_thermal=0.008463692477 +Iter number:9 k_eff=0.906837888778 flux ratio=4.385488999282 max_thermal=0.008463693077 +Iter number:10 k_eff=0.906837892317 flux ratio=4.385489027995 max_thermal=0.008463693490 +Iter number:11 k_eff=0.906837894865 flux ratio=4.385489047078 max_thermal=0.008463693775 +Iter number:12 k_eff=0.906837896682 flux ratio=4.385489059900 max_thermal=0.008463693972 +Iter number:13 k_eff=0.906837897972 flux ratio=4.385489068591 max_thermal=0.008463694108 +Iter number:14 k_eff=0.906837898882 flux ratio=4.385489074523 max_thermal=0.008463694203 +Iter number:15 k_eff=0.906837899524 flux ratio=4.385489078594 max_thermal=0.008463694269 +Iter number:16 k_eff=0.906837899975 flux ratio=4.385489081400 max_thermal=0.008463694315 +Iter number:17 k_eff=0.906837900292 flux ratio=4.385489083340 max_thermal=0.008463694347 +Iter number:18 k_eff=0.906837900514 flux ratio=4.385489084686 max_thermal=0.008463694369 +Iter number:19 k_eff=0.906837900670 flux ratio=4.385489085620 max_thermal=0.008463694385 +Iter number:20 k_eff=0.906837900779 flux ratio=4.385489086270 max_thermal=0.008463694396 +Iter number:21 k_eff=0.906837900855 flux ratio=4.385489086723 max_thermal=0.008463694404 +Iter number:22 k_eff=0.906837900909 flux ratio=4.385489087039 max_thermal=0.008463694409 +Iter number:23 k_eff=0.906837900946 flux ratio=4.385489087259 max_thermal=0.008463694413 +Iter number:24 k_eff=0.906837900972 flux ratio=4.385489087413 max_thermal=0.008463694415 +Iter number:25 k_eff=0.906837900990 flux ratio=4.385489087521 max_thermal=0.008463694417 +Iter number:26 k_eff=0.906837901003 flux ratio=4.385489087596 max_thermal=0.008463694418 +Iter number:27 k_eff=0.906837901012 flux ratio=4.385489087648 max_thermal=0.008463694419 +Iter number:28 k_eff=0.906837901018 flux ratio=4.385489087685 max_thermal=0.008463694420 +Iter number:29 k_eff=0.906837901023 flux ratio=4.385489087710 max_thermal=0.008463694420 +Iter number:30 k_eff=0.906837901026 flux ratio=4.385489087728 max_thermal=0.008463694421 +Iter number:31 k_eff=0.906837901028 flux ratio=4.385489087741 max_thermal=0.008463694421 +Iter number:32 k_eff=0.906837901030 flux ratio=4.385489087749 max_thermal=0.008463694421 +Iter number:33 k_eff=0.906837901031 flux ratio=4.385489087755 max_thermal=0.008463694421 +Iter number:34 k_eff=0.906837901031 flux ratio=4.385489087760 max_thermal=0.008463694421 +Cycle 2: + Numbers of active cells: 1156 4219 + Numbers of degrees of freedom: 4761 18805 +Iter number:1 k_eff=0.906836032131 flux ratio=4.385463219198 max_thermal=0.008463744346 +Iter number:2 k_eff=0.906835885276 flux ratio=4.385464355771 max_thermal=0.008463756043 +Iter number:3 k_eff=0.906835925468 flux ratio=4.385465086805 max_thermal=0.008463765603 +Iter number:4 k_eff=0.906835957285 flux ratio=4.385465633530 max_thermal=0.008463771996 +Iter number:5 k_eff=0.906835986095 flux ratio=4.385465985078 max_thermal=0.008463776366 +Iter number:6 k_eff=0.906836010004 flux ratio=4.385466206119 max_thermal=0.008463779390 +Iter number:7 k_eff=0.906836028489 flux ratio=4.385466348192 max_thermal=0.008463781494 +Iter number:8 k_eff=0.906836042190 flux ratio=4.385466442031 max_thermal=0.008463782961 +Iter number:9 k_eff=0.906836052101 flux ratio=4.385466505347 max_thermal=0.008463783987 +Iter number:10 k_eff=0.906836059171 flux ratio=4.385466548687 max_thermal=0.008463784704 +Iter number:11 k_eff=0.906836064172 flux ratio=4.385466578622 max_thermal=0.008463785205 +Iter number:12 k_eff=0.906836067692 flux ratio=4.385466599413 max_thermal=0.008463785556 +Iter number:13 k_eff=0.906836070164 flux ratio=4.385466613899 max_thermal=0.008463785801 +Iter number:14 k_eff=0.906836071896 flux ratio=4.385466624011 max_thermal=0.008463785972 +Iter number:15 k_eff=0.906836073108 flux ratio=4.385466631076 max_thermal=0.008463786092 +Iter number:16 k_eff=0.906836073957 flux ratio=4.385466636016 max_thermal=0.008463786176 +Iter number:17 k_eff=0.906836074550 flux ratio=4.385466639471 max_thermal=0.008463786235 +Iter number:18 k_eff=0.906836074965 flux ratio=4.385466641887 max_thermal=0.008463786276 +Iter number:19 k_eff=0.906836075255 flux ratio=4.385466643577 max_thermal=0.008463786305 +Iter number:20 k_eff=0.906836075458 flux ratio=4.385466644759 max_thermal=0.008463786325 +Iter number:21 k_eff=0.906836075600 flux ratio=4.385466645585 max_thermal=0.008463786339 +Iter number:22 k_eff=0.906836075699 flux ratio=4.385466646163 max_thermal=0.008463786349 +Iter number:23 k_eff=0.906836075769 flux ratio=4.385466646568 max_thermal=0.008463786356 +Iter number:24 k_eff=0.906836075817 flux ratio=4.385466646850 max_thermal=0.008463786360 +Iter number:25 k_eff=0.906836075851 flux ratio=4.385466647048 max_thermal=0.008463786364 +Iter number:26 k_eff=0.906836075875 flux ratio=4.385466647186 max_thermal=0.008463786366 +Iter number:27 k_eff=0.906836075891 flux ratio=4.385466647283 max_thermal=0.008463786368 +Iter number:28 k_eff=0.906836075903 flux ratio=4.385466647351 max_thermal=0.008463786369 +Iter number:29 k_eff=0.906836075911 flux ratio=4.385466647398 max_thermal=0.008463786370 +Iter number:30 k_eff=0.906836075917 flux ratio=4.385466647431 max_thermal=0.008463786370 +Iter number:31 k_eff=0.906836075921 flux ratio=4.385466647454 max_thermal=0.008463786371 +Iter number:32 k_eff=0.906836075924 flux ratio=4.385466647470 max_thermal=0.008463786371 +Iter number:33 k_eff=0.906836075926 flux ratio=4.385466647482 max_thermal=0.008463786371 +Iter number:34 k_eff=0.906836075927 flux ratio=4.385466647489 max_thermal=0.008463786371 +Iter number:35 k_eff=0.906836075928 flux ratio=4.385466647495 max_thermal=0.008463786371 +Iter number:36 k_eff=0.906836075928 flux ratio=4.385466647499 max_thermal=0.008463786371 +Cycle 3: + Numbers of active cells: 1507 6133 + Numbers of degrees of freedom: 6629 27301 +Iter number:1 k_eff=0.906835269231 flux ratio=4.385403797661 max_thermal=0.008463904814 +Iter number:2 k_eff=0.906835336040 flux ratio=4.385404137890 max_thermal=0.008463908915 +Iter number:3 k_eff=0.906835394509 flux ratio=4.385404254946 max_thermal=0.008463912078 +Iter number:4 k_eff=0.906835430587 flux ratio=4.385404329325 max_thermal=0.008463914341 +Iter number:5 k_eff=0.906835453664 flux ratio=4.385404388953 max_thermal=0.008463915964 +Iter number:6 k_eff=0.906835468672 flux ratio=4.385404437567 max_thermal=0.008463917123 +Iter number:7 k_eff=0.906835478615 flux ratio=4.385404475817 max_thermal=0.008463917947 +Iter number:8 k_eff=0.906835485309 flux ratio=4.385404504893 max_thermal=0.008463918530 +Iter number:9 k_eff=0.906835489870 flux ratio=4.385404526447 max_thermal=0.008463918942 +Iter number:10 k_eff=0.906835493002 flux ratio=4.385404542148 max_thermal=0.008463919232 +Iter number:11 k_eff=0.906835495166 flux ratio=4.385404553451 max_thermal=0.008463919436 +Iter number:12 k_eff=0.906835496666 flux ratio=4.385404561520 max_thermal=0.008463919579 +Iter number:13 k_eff=0.906835497709 flux ratio=4.385404567248 max_thermal=0.008463919680 +Iter number:14 k_eff=0.906835498435 flux ratio=4.385404571298 max_thermal=0.008463919750 +Iter number:15 k_eff=0.906835498941 flux ratio=4.385404574153 max_thermal=0.008463919800 +Iter number:16 k_eff=0.906835499294 flux ratio=4.385404576162 max_thermal=0.008463919834 +Iter number:17 k_eff=0.906835499541 flux ratio=4.385404577572 max_thermal=0.008463919858 +Iter number:18 k_eff=0.906835499713 flux ratio=4.385404578562 max_thermal=0.008463919875 +Iter number:19 k_eff=0.906835499833 flux ratio=4.385404579256 max_thermal=0.008463919887 +Iter number:20 k_eff=0.906835499917 flux ratio=4.385404579742 max_thermal=0.008463919895 +Iter number:21 k_eff=0.906835499976 flux ratio=4.385404580083 max_thermal=0.008463919901 +Iter number:22 k_eff=0.906835500017 flux ratio=4.385404580321 max_thermal=0.008463919905 +Iter number:23 k_eff=0.906835500046 flux ratio=4.385404580488 max_thermal=0.008463919908 +Iter number:24 k_eff=0.906835500066 flux ratio=4.385404580604 max_thermal=0.008463919910 +Iter number:25 k_eff=0.906835500080 flux ratio=4.385404580686 max_thermal=0.008463919911 +Iter number:26 k_eff=0.906835500090 flux ratio=4.385404580743 max_thermal=0.008463919912 +Iter number:27 k_eff=0.906835500097 flux ratio=4.385404580783 max_thermal=0.008463919913 +Iter number:28 k_eff=0.906835500101 flux ratio=4.385404580811 max_thermal=0.008463919914 +Iter number:29 k_eff=0.906835500105 flux ratio=4.385404580831 max_thermal=0.008463919914 +Iter number:30 k_eff=0.906835500107 flux ratio=4.385404580844 max_thermal=0.008463919914 +Iter number:31 k_eff=0.906835500109 flux ratio=4.385404580854 max_thermal=0.008463919914 +Iter number:32 k_eff=0.906835500110 flux ratio=4.385404580860 max_thermal=0.008463919914 +Iter number:33 k_eff=0.906835500111 flux ratio=4.385404580865 max_thermal=0.008463919914 +Cycle 4: + Numbers of active cells: 2734 10732 + Numbers of degrees of freedom: 12263 48095 +Iter number:1 k_eff=0.906834846364 flux ratio=4.385381150927 max_thermal=0.008463963132 +Iter number:2 k_eff=0.906834885938 flux ratio=4.385381403919 max_thermal=0.008463966541 +Iter number:3 k_eff=0.906834926531 flux ratio=4.385381460228 max_thermal=0.008463969391 +Iter number:4 k_eff=0.906834951140 flux ratio=4.385381536948 max_thermal=0.008463971436 +Iter number:5 k_eff=0.906834967134 flux ratio=4.385381607000 max_thermal=0.008463972881 +Iter number:6 k_eff=0.906834977868 flux ratio=4.385381661804 max_thermal=0.008463973895 +Iter number:7 k_eff=0.906834985190 flux ratio=4.385381702101 max_thermal=0.008463974604 +Iter number:8 k_eff=0.906834990235 flux ratio=4.385381730930 max_thermal=0.008463975099 +Iter number:9 k_eff=0.906834993731 flux ratio=4.385381751290 max_thermal=0.008463975445 +Iter number:10 k_eff=0.906834996164 flux ratio=4.385381765579 max_thermal=0.008463975687 +Iter number:11 k_eff=0.906834997860 flux ratio=4.385381775578 max_thermal=0.008463975856 +Iter number:12 k_eff=0.906834999045 flux ratio=4.385381782564 max_thermal=0.008463975973 +Iter number:13 k_eff=0.906834999873 flux ratio=4.385381787442 max_thermal=0.008463976056 +Iter number:14 k_eff=0.906835000452 flux ratio=4.385381790849 max_thermal=0.008463976113 +Iter number:15 k_eff=0.906835000856 flux ratio=4.385381793228 max_thermal=0.008463976153 +Iter number:16 k_eff=0.906835001140 flux ratio=4.385381794889 max_thermal=0.008463976182 +Iter number:17 k_eff=0.906835001338 flux ratio=4.385381796049 max_thermal=0.008463976201 +Iter number:18 k_eff=0.906835001476 flux ratio=4.385381796860 max_thermal=0.008463976215 +Iter number:19 k_eff=0.906835001573 flux ratio=4.385381797427 max_thermal=0.008463976224 +Iter number:20 k_eff=0.906835001641 flux ratio=4.385381797823 max_thermal=0.008463976231 +Iter number:21 k_eff=0.906835001688 flux ratio=4.385381798099 max_thermal=0.008463976236 +Iter number:22 k_eff=0.906835001721 flux ratio=4.385381798293 max_thermal=0.008463976239 +Iter number:23 k_eff=0.906835001744 flux ratio=4.385381798428 max_thermal=0.008463976241 +Iter number:24 k_eff=0.906835001760 flux ratio=4.385381798523 max_thermal=0.008463976243 +Iter number:25 k_eff=0.906835001772 flux ratio=4.385381798589 max_thermal=0.008463976244 +Iter number:26 k_eff=0.906835001780 flux ratio=4.385381798635 max_thermal=0.008463976245 +Iter number:27 k_eff=0.906835001785 flux ratio=4.385381798667 max_thermal=0.008463976246 +Iter number:28 k_eff=0.906835001789 flux ratio=4.385381798690 max_thermal=0.008463976246 +Iter number:29 k_eff=0.906835001792 flux ratio=4.385381798706 max_thermal=0.008463976246 +Iter number:30 k_eff=0.906835001794 flux ratio=4.385381798717 max_thermal=0.008463976246 +Iter number:31 k_eff=0.906835001795 flux ratio=4.385381798724 max_thermal=0.008463976246 +Iter number:32 k_eff=0.906835001796 flux ratio=4.385381798730 max_thermal=0.008463976247 +Iter number:33 k_eff=0.906835001796 flux ratio=4.385381798734 max_thermal=0.008463976247 +Cycle 5: + Numbers of active cells: 3928 15598 + Numbers of degrees of freedom: 17501 69297 +Iter number:1 k_eff=0.906834756419 flux ratio=4.384853631027 max_thermal=0.008464995625 +Iter number:2 k_eff=0.906834805316 flux ratio=4.384853670539 max_thermal=0.008464997340 +Iter number:3 k_eff=0.906834826349 flux ratio=4.384853696977 max_thermal=0.008464998471 +Iter number:4 k_eff=0.906834837235 flux ratio=4.384853725424 max_thermal=0.008464999257 +Iter number:5 k_eff=0.906834843989 flux ratio=4.384853750658 max_thermal=0.008464999812 +Iter number:6 k_eff=0.906834848438 flux ratio=4.384853770680 max_thermal=0.008465000204 +Iter number:7 k_eff=0.906834851444 flux ratio=4.384853785717 max_thermal=0.008465000479 +Iter number:8 k_eff=0.906834853502 flux ratio=4.384853796687 max_thermal=0.008465000673 +Iter number:9 k_eff=0.906834854923 flux ratio=4.384853804560 max_thermal=0.008465000809 +Iter number:10 k_eff=0.906834855908 flux ratio=4.384853810156 max_thermal=0.008465000904 +Iter number:11 k_eff=0.906834856593 flux ratio=4.384853814111 max_thermal=0.008465000971 +Iter number:12 k_eff=0.906834857071 flux ratio=4.384853816895 max_thermal=0.008465001018 +Iter number:13 k_eff=0.906834857404 flux ratio=4.384853818850 max_thermal=0.008465001050 +Iter number:14 k_eff=0.906834857636 flux ratio=4.384853820222 max_thermal=0.008465001073 +Iter number:15 k_eff=0.906834857799 flux ratio=4.384853821183 max_thermal=0.008465001089 +Iter number:16 k_eff=0.906834857912 flux ratio=4.384853821856 max_thermal=0.008465001100 +Iter number:17 k_eff=0.906834857991 flux ratio=4.384853822327 max_thermal=0.008465001108 +Iter number:18 k_eff=0.906834858047 flux ratio=4.384853822657 max_thermal=0.008465001114 +Iter number:19 k_eff=0.906834858085 flux ratio=4.384853822888 max_thermal=0.008465001117 +Iter number:20 k_eff=0.906834858113 flux ratio=4.384853823049 max_thermal=0.008465001120 +Iter number:21 k_eff=0.906834858132 flux ratio=4.384853823162 max_thermal=0.008465001122 +Iter number:22 k_eff=0.906834858145 flux ratio=4.384853823241 max_thermal=0.008465001123 +Iter number:23 k_eff=0.906834858154 flux ratio=4.384853823296 max_thermal=0.008465001124 +Iter number:24 k_eff=0.906834858161 flux ratio=4.384853823335 max_thermal=0.008465001125 +Iter number:25 k_eff=0.906834858165 flux ratio=4.384853823362 max_thermal=0.008465001125 +Iter number:26 k_eff=0.906834858168 flux ratio=4.384853823380 max_thermal=0.008465001126 +Iter number:27 k_eff=0.906834858170 flux ratio=4.384853823394 max_thermal=0.008465001126 +Iter number:28 k_eff=0.906834858172 flux ratio=4.384853823403 max_thermal=0.008465001126 +Iter number:29 k_eff=0.906834858173 flux ratio=4.384853823409 max_thermal=0.008465001126 +Iter number:30 k_eff=0.906834858174 flux ratio=4.384853823414 max_thermal=0.008465001126 +Cycle 6: + Numbers of active cells: 4486 17755 + Numbers of degrees of freedom: 19933 78605 +Iter number:1 k_eff=0.906834797396 flux ratio=4.384850615384 max_thermal=0.008465007174 +Iter number:2 k_eff=0.906834814661 flux ratio=4.384850631692 max_thermal=0.008465007547 +Iter number:3 k_eff=0.906834818206 flux ratio=4.384850637654 max_thermal=0.008465007740 +Iter number:4 k_eff=0.906834820171 flux ratio=4.384850642364 max_thermal=0.008465007876 +Iter number:5 k_eff=0.906834821415 flux ratio=4.384850646407 max_thermal=0.008465007974 +Iter number:6 k_eff=0.906834822244 flux ratio=4.384850649675 max_thermal=0.008465008044 +Iter number:7 k_eff=0.906834822807 flux ratio=4.384850652188 max_thermal=0.008465008093 +Iter number:8 k_eff=0.906834823192 flux ratio=4.384850654060 max_thermal=0.008465008128 +Iter number:9 k_eff=0.906834823457 flux ratio=4.384850655427 max_thermal=0.008465008153 +Iter number:10 k_eff=0.906834823641 flux ratio=4.384850656411 max_thermal=0.008465008170 +Iter number:11 k_eff=0.906834823769 flux ratio=4.384850657114 max_thermal=0.008465008182 +Iter number:12 k_eff=0.906834823858 flux ratio=4.384850657613 max_thermal=0.008465008191 +Iter number:13 k_eff=0.906834823919 flux ratio=4.384850657966 max_thermal=0.008465008197 +Iter number:14 k_eff=0.906834823962 flux ratio=4.384850658214 max_thermal=0.008465008201 +Iter number:15 k_eff=0.906834823992 flux ratio=4.384850658389 max_thermal=0.008465008204 +Iter number:16 k_eff=0.906834824013 flux ratio=4.384850658512 max_thermal=0.008465008206 +Iter number:17 k_eff=0.906834824028 flux ratio=4.384850658598 max_thermal=0.008465008207 +Iter number:18 k_eff=0.906834824038 flux ratio=4.384850658659 max_thermal=0.008465008208 +Iter number:19 k_eff=0.906834824046 flux ratio=4.384850658701 max_thermal=0.008465008209 +Iter number:20 k_eff=0.906834824051 flux ratio=4.384850658731 max_thermal=0.008465008209 +Iter number:21 k_eff=0.906834824054 flux ratio=4.384850658752 max_thermal=0.008465008210 +Iter number:22 k_eff=0.906834824057 flux ratio=4.384850658766 max_thermal=0.008465008210 +Iter number:23 k_eff=0.906834824058 flux ratio=4.384850658776 max_thermal=0.008465008210 +Iter number:24 k_eff=0.906834824059 flux ratio=4.384850658783 max_thermal=0.008465008210 +Iter number:25 k_eff=0.906834824060 flux ratio=4.384850658788 max_thermal=0.008465008210 +Cycle 7: + Numbers of active cells: 5434 21370 + Numbers of degrees of freedom: 23979 93275 +Iter number:1 k_eff=0.906834695333 flux ratio=4.384848325238 max_thermal=0.008465012709 +Iter number:2 k_eff=0.906834781972 flux ratio=4.384848347736 max_thermal=0.008465013711 +Iter number:3 k_eff=0.906834782962 flux ratio=4.384848354071 max_thermal=0.008465013889 +Iter number:4 k_eff=0.906834784295 flux ratio=4.384848360506 max_thermal=0.008465014025 +Iter number:5 k_eff=0.906834785267 flux ratio=4.384848365788 max_thermal=0.008465014122 +Iter number:6 k_eff=0.906834785953 flux ratio=4.384848369732 max_thermal=0.008465014190 +Iter number:7 k_eff=0.906834786435 flux ratio=4.384848372568 max_thermal=0.008465014237 +Iter number:8 k_eff=0.906834786773 flux ratio=4.384848374574 max_thermal=0.008465014271 +Iter number:9 k_eff=0.906834787009 flux ratio=4.384848375984 max_thermal=0.008465014294 +Iter number:10 k_eff=0.906834787174 flux ratio=4.384848376972 max_thermal=0.008465014310 +Iter number:11 k_eff=0.906834787289 flux ratio=4.384848377663 max_thermal=0.008465014322 +Iter number:12 k_eff=0.906834787370 flux ratio=4.384848378146 max_thermal=0.008465014330 +Iter number:13 k_eff=0.906834787426 flux ratio=4.384848378484 max_thermal=0.008465014335 +Iter number:14 k_eff=0.906834787466 flux ratio=4.384848378720 max_thermal=0.008465014339 +Iter number:15 k_eff=0.906834787493 flux ratio=4.384848378885 max_thermal=0.008465014342 +Iter number:16 k_eff=0.906834787512 flux ratio=4.384848379000 max_thermal=0.008465014344 +Iter number:17 k_eff=0.906834787526 flux ratio=4.384848379081 max_thermal=0.008465014345 +Iter number:18 k_eff=0.906834787535 flux ratio=4.384848379137 max_thermal=0.008465014346 +Iter number:19 k_eff=0.906834787542 flux ratio=4.384848379176 max_thermal=0.008465014347 +Iter number:20 k_eff=0.906834787547 flux ratio=4.384848379204 max_thermal=0.008465014347 +Iter number:21 k_eff=0.906834787550 flux ratio=4.384848379223 max_thermal=0.008465014348 +Iter number:22 k_eff=0.906834787552 flux ratio=4.384848379237 max_thermal=0.008465014348 +Iter number:23 k_eff=0.906834787554 flux ratio=4.384848379246 max_thermal=0.008465014348 +Iter number:24 k_eff=0.906834787555 flux ratio=4.384848379253 max_thermal=0.008465014348 +Iter number:25 k_eff=0.906834787556 flux ratio=4.384848379257 max_thermal=0.008465014348 +Cycle 8: + Numbers of active cells: 6856 27001 + Numbers of degrees of freedom: 30285 117017 +Iter number:1 k_eff=0.906834743244 flux ratio=4.384846479257 max_thermal=0.008465017253 +Iter number:2 k_eff=0.906834753823 flux ratio=4.384846519298 max_thermal=0.008465017557 +Iter number:3 k_eff=0.906834756845 flux ratio=4.384846524675 max_thermal=0.008465017731 +Iter number:4 k_eff=0.906834758500 flux ratio=4.384846529782 max_thermal=0.008465017851 +Iter number:5 k_eff=0.906834759516 flux ratio=4.384846533887 max_thermal=0.008465017934 +Iter number:6 k_eff=0.906834760177 flux ratio=4.384846537011 max_thermal=0.008465017993 +Iter number:7 k_eff=0.906834760619 flux ratio=4.384846539312 max_thermal=0.008465018034 +Iter number:8 k_eff=0.906834760921 flux ratio=4.384846540972 max_thermal=0.008465018062 +Iter number:9 k_eff=0.906834761129 flux ratio=4.384846542155 max_thermal=0.008465018083 +Iter number:10 k_eff=0.906834761274 flux ratio=4.384846542991 max_thermal=0.008465018097 +Iter number:11 k_eff=0.906834761374 flux ratio=4.384846543580 max_thermal=0.008465018106 +Iter number:12 k_eff=0.906834761444 flux ratio=4.384846543993 max_thermal=0.008465018113 +Iter number:13 k_eff=0.906834761493 flux ratio=4.384846544282 max_thermal=0.008465018118 +Iter number:14 k_eff=0.906834761527 flux ratio=4.384846544485 max_thermal=0.008465018121 +Iter number:15 k_eff=0.906834761551 flux ratio=4.384846544627 max_thermal=0.008465018124 +Iter number:16 k_eff=0.906834761567 flux ratio=4.384846544726 max_thermal=0.008465018125 +Iter number:17 k_eff=0.906834761579 flux ratio=4.384846544795 max_thermal=0.008465018127 +Iter number:18 k_eff=0.906834761587 flux ratio=4.384846544844 max_thermal=0.008465018127 +Iter number:19 k_eff=0.906834761593 flux ratio=4.384846544878 max_thermal=0.008465018128 +Iter number:20 k_eff=0.906834761597 flux ratio=4.384846544901 max_thermal=0.008465018128 +Iter number:21 k_eff=0.906834761599 flux ratio=4.384846544918 max_thermal=0.008465018129 +Iter number:22 k_eff=0.906834761601 flux ratio=4.384846544930 max_thermal=0.008465018129 +Iter number:23 k_eff=0.906834761603 flux ratio=4.384846544938 max_thermal=0.008465018129 +Iter number:24 k_eff=0.906834761604 flux ratio=4.384846544944 max_thermal=0.008465018129 +Iter number:25 k_eff=0.906834761604 flux ratio=4.384846544947 max_thermal=0.008465018129 +Cycle 9: + Numbers of active cells: 9166 35416 + Numbers of degrees of freedom: 40087 154355 +Iter number:1 k_eff=0.906834746805 flux ratio=4.384846149270 max_thermal=0.008465018800 +Iter number:2 k_eff=0.906834739570 flux ratio=4.384846071221 max_thermal=0.008465018869 +Iter number:3 k_eff=0.906834742439 flux ratio=4.384846070361 max_thermal=0.008465018998 +Iter number:4 k_eff=0.906834743795 flux ratio=4.384846072627 max_thermal=0.008465019087 +Iter number:5 k_eff=0.906834744601 flux ratio=4.384846075162 max_thermal=0.008465019149 +Iter number:6 k_eff=0.906834745118 flux ratio=4.384846077315 max_thermal=0.008465019194 +Iter number:7 k_eff=0.906834745462 flux ratio=4.384846078976 max_thermal=0.008465019225 +Iter number:8 k_eff=0.906834745695 flux ratio=4.384846080201 max_thermal=0.008465019246 +Iter number:9 k_eff=0.906834745854 flux ratio=4.384846081084 max_thermal=0.008465019262 +Iter number:10 k_eff=0.906834745964 flux ratio=4.384846081712 max_thermal=0.008465019272 +Iter number:11 k_eff=0.906834746041 flux ratio=4.384846082157 max_thermal=0.008465019280 +Iter number:12 k_eff=0.906834746094 flux ratio=4.384846082469 max_thermal=0.008465019285 +Iter number:13 k_eff=0.906834746131 flux ratio=4.384846082689 max_thermal=0.008465019289 +Iter number:14 k_eff=0.906834746157 flux ratio=4.384846082842 max_thermal=0.008465019291 +Iter number:15 k_eff=0.906834746175 flux ratio=4.384846082950 max_thermal=0.008465019293 +Iter number:16 k_eff=0.906834746188 flux ratio=4.384846083025 max_thermal=0.008465019294 +Iter number:17 k_eff=0.906834746197 flux ratio=4.384846083078 max_thermal=0.008465019295 +Iter number:18 k_eff=0.906834746203 flux ratio=4.384846083115 max_thermal=0.008465019296 +Iter number:19 k_eff=0.906834746207 flux ratio=4.384846083141 max_thermal=0.008465019296 +Iter number:20 k_eff=0.906834746210 flux ratio=4.384846083159 max_thermal=0.008465019296 +Iter number:21 k_eff=0.906834746213 flux ratio=4.384846083171 max_thermal=0.008465019297 +Iter number:22 k_eff=0.906834746214 flux ratio=4.384846083180 max_thermal=0.008465019297 +Iter number:23 k_eff=0.906834746215 flux ratio=4.384846083186 max_thermal=0.008465019297 +Iter number:24 k_eff=0.906834746216 flux ratio=4.384846083191 max_thermal=0.008465019297 +Cycle 10: + Numbers of active cells: 10594 41197 + Numbers of degrees of freedom: 45467 179469 +Iter number:1 k_eff=0.906780038935 flux ratio=4.384864081404 max_thermal=0.008464912703 +Iter number:2 k_eff=0.906833758951 flux ratio=4.384869346165 max_thermal=0.008465298273 +Iter number:3 k_eff=0.906834914205 flux ratio=4.384864425562 max_thermal=0.008465215350 +Iter number:4 k_eff=0.906835274876 flux ratio=4.384858287964 max_thermal=0.008465154357 +Iter number:5 k_eff=0.906835297124 flux ratio=4.384853804292 max_thermal=0.008465112059 +Iter number:6 k_eff=0.906835209298 flux ratio=4.384850953669 max_thermal=0.008465083180 +Iter number:7 k_eff=0.906835102972 flux ratio=4.384849195436 max_thermal=0.008465063473 +Iter number:8 k_eff=0.906835009160 flux ratio=4.384848100961 max_thermal=0.008465049973 +Iter number:9 k_eff=0.906834935068 flux ratio=4.384847404790 max_thermal=0.008465040684 +Iter number:10 k_eff=0.906834879514 flux ratio=4.384846951907 max_thermal=0.008465034267 +Iter number:11 k_eff=0.906834838999 flux ratio=4.384846651620 max_thermal=0.008465029821 +Iter number:12 k_eff=0.906834809916 flux ratio=4.384846449558 max_thermal=0.008465026733 +Iter number:13 k_eff=0.906834789237 flux ratio=4.384846312108 max_thermal=0.008465024585 +Iter number:14 k_eff=0.906834774618 flux ratio=4.384846217876 max_thermal=0.008465023089 +Iter number:15 k_eff=0.906834764321 flux ratio=4.384846152915 max_thermal=0.008465022045 +Iter number:16 k_eff=0.906834757086 flux ratio=4.384846107956 max_thermal=0.008465021317 +Iter number:17 k_eff=0.906834752010 flux ratio=4.384846076754 max_thermal=0.008465020809 +Iter number:18 k_eff=0.906834748452 flux ratio=4.384846055055 max_thermal=0.008465020454 +Iter number:19 k_eff=0.906834745960 flux ratio=4.384846039944 max_thermal=0.008465020207 +Iter number:20 k_eff=0.906834744216 flux ratio=4.384846029409 max_thermal=0.008465020033 +Iter number:21 k_eff=0.906834742995 flux ratio=4.384846022060 max_thermal=0.008465019912 +Iter number:22 k_eff=0.906834742141 flux ratio=4.384846016929 max_thermal=0.008465019828 +Iter number:23 k_eff=0.906834741544 flux ratio=4.384846013347 max_thermal=0.008465019768 +Iter number:24 k_eff=0.906834741126 flux ratio=4.384846010844 max_thermal=0.008465019727 +Iter number:25 k_eff=0.906834740834 flux ratio=4.384846009095 max_thermal=0.008465019698 +Iter number:26 k_eff=0.906834740629 flux ratio=4.384846007873 max_thermal=0.008465019678 +Iter number:27 k_eff=0.906834740486 flux ratio=4.384846007019 max_thermal=0.008465019664 +Iter number:28 k_eff=0.906834740386 flux ratio=4.384846006422 max_thermal=0.008465019654 +Iter number:29 k_eff=0.906834740316 flux ratio=4.384846006004 max_thermal=0.008465019647 +Iter number:30 k_eff=0.906834740267 flux ratio=4.384846005712 max_thermal=0.008465019642 +Iter number:31 k_eff=0.906834740233 flux ratio=4.384846005508 max_thermal=0.008465019639 +Iter number:32 k_eff=0.906834740209 flux ratio=4.384846005366 max_thermal=0.008465019637 +Iter number:33 k_eff=0.906834740193 flux ratio=4.384846005266 max_thermal=0.008465019635 +Iter number:34 k_eff=0.906834740181 flux ratio=4.384846005196 max_thermal=0.008465019634 +Iter number:35 k_eff=0.906834740173 flux ratio=4.384846005148 max_thermal=0.008465019633 +Iter number:36 k_eff=0.906834740167 flux ratio=4.384846005113 max_thermal=0.008465019632 +Iter number:37 k_eff=0.906834740163 flux ratio=4.384846005090 max_thermal=0.008465019632 +Iter number:38 k_eff=0.906834740160 flux ratio=4.384846005073 max_thermal=0.008465019632 +Iter number:39 k_eff=0.906834740158 flux ratio=4.384846005061 max_thermal=0.008465019632 +Iter number:40 k_eff=0.906834740157 flux ratio=4.384846005053 max_thermal=0.008465019631 +Iter number:41 k_eff=0.906834740156 flux ratio=4.384846005047 max_thermal=0.008465019631 +Iter number:42 k_eff=0.906834740155 flux ratio=4.384846005044 max_thermal=0.008465019631 +Cycle 11: + Numbers of active cells: 11749 47074 + Numbers of degrees of freedom: 50261 204523 +Iter number:1 k_eff=0.906805395149 flux ratio=4.384872231023 max_thermal=0.008464861813 +Iter number:2 k_eff=0.906833353627 flux ratio=4.384863725577 max_thermal=0.008465049652 +Iter number:3 k_eff=0.906834008279 flux ratio=4.384854144970 max_thermal=0.008465027770 +Iter number:4 k_eff=0.906834374542 flux ratio=4.384849413955 max_thermal=0.008465020786 +Iter number:5 k_eff=0.906834559132 flux ratio=4.384847412067 max_thermal=0.008465018746 +Iter number:6 k_eff=0.906834648393 flux ratio=4.384846595090 max_thermal=0.008465018343 +Iter number:7 k_eff=0.906834691266 flux ratio=4.384846266355 max_thermal=0.008465018450 +Iter number:8 k_eff=0.906834712193 flux ratio=4.384846137013 max_thermal=0.008465018681 +Iter number:9 k_eff=0.906834722750 flux ratio=4.384846088708 max_thermal=0.008465018907 +Iter number:10 k_eff=0.906834728325 flux ratio=4.384846072840 max_thermal=0.008465019094 +Iter number:11 k_eff=0.906834731426 flux ratio=4.384846069459 max_thermal=0.008465019237 +Iter number:12 k_eff=0.906834733245 flux ratio=4.384846070461 max_thermal=0.008465019343 +Iter number:13 k_eff=0.906834734362 flux ratio=4.384846072648 max_thermal=0.008465019420 +Iter number:14 k_eff=0.906834735076 flux ratio=4.384846074842 max_thermal=0.008465019475 +Iter number:15 k_eff=0.906834735545 flux ratio=4.384846076677 max_thermal=0.008465019514 +Iter number:16 k_eff=0.906834735859 flux ratio=4.384846078098 max_thermal=0.008465019542 +Iter number:17 k_eff=0.906834736073 flux ratio=4.384846079156 max_thermal=0.008465019561 +Iter number:18 k_eff=0.906834736220 flux ratio=4.384846079925 max_thermal=0.008465019575 +Iter number:19 k_eff=0.906834736321 flux ratio=4.384846080478 max_thermal=0.008465019585 +Iter number:20 k_eff=0.906834736391 flux ratio=4.384846080872 max_thermal=0.008465019591 +Iter number:21 k_eff=0.906834736440 flux ratio=4.384846081150 max_thermal=0.008465019596 +Iter number:22 k_eff=0.906834736474 flux ratio=4.384846081347 max_thermal=0.008465019599 +Iter number:23 k_eff=0.906834736498 flux ratio=4.384846081485 max_thermal=0.008465019602 +Iter number:24 k_eff=0.906834736515 flux ratio=4.384846081582 max_thermal=0.008465019603 +Iter number:25 k_eff=0.906834736526 flux ratio=4.384846081650 max_thermal=0.008465019604 +Iter number:26 k_eff=0.906834736534 flux ratio=4.384846081698 max_thermal=0.008465019605 +Iter number:27 k_eff=0.906834736540 flux ratio=4.384846081731 max_thermal=0.008465019606 +Iter number:28 k_eff=0.906834736544 flux ratio=4.384846081755 max_thermal=0.008465019606 +Iter number:29 k_eff=0.906834736547 flux ratio=4.384846081771 max_thermal=0.008465019606 +Iter number:30 k_eff=0.906834736549 flux ratio=4.384846081783 max_thermal=0.008465019607 +Iter number:31 k_eff=0.906834736550 flux ratio=4.384846081791 max_thermal=0.008465019607 +Iter number:32 k_eff=0.906834736551 flux ratio=4.384846081796 max_thermal=0.008465019607 +Iter number:33 k_eff=0.906834736552 flux ratio=4.384846081800 max_thermal=0.008465019607 +@endcode + +We see that power iteration does converge faster after cycle 0 due to the initialization +with solution from last mesh iteration. +The contents of ``convergence_table'' are, +@code +0 4761 4761 0.906841960371 4.384056022582 +1 4761 10667 0.906837901031 4.385489087760 +2 4761 18805 0.906836075928 4.385466647499 +3 6629 27301 0.906835500111 4.385404580865 +4 12263 48095 0.906835001796 4.385381798734 +5 17501 69297 0.906834858174 4.384853823414 +6 19933 78605 0.906834824060 4.384850658788 +7 23979 93275 0.906834787556 4.384848379257 +8 30285 117017 0.906834761604 4.384846544947 +9 40087 154355 0.906834746216 4.384846083191 +10 45467 179469 0.906834740155 4.384846005044 +11 50261 204523 0.906834736552 4.384846081800 +@endcode +The meanings of coloms are: number of mesh iteration, numbers of degrees of + freedom of fast energy group, numbers of DoFs of thermal group, converged +k-effective and the ratio between maximum of fast flux and maximum of thermal one. + +The grids of fast and thermal energy groups at mesh iteration #9 are shown +in following figure. + +@image html step-28.grid-0.9.order2.png +@image html step-28.grid-1.9.order2.png + +We see that the grid of thermal group is much finner than the one of fast group. +The solutions on these grids are, (Note: flux are normalized with total fission +source equal to 1) + +@image html step-28.solution-0.9.order2.png +@image html step-28.solution-1.9.order2.png + +Then we plot the convergence data with polynomial order being equal to 1,2 and 3. + +@image html step-28.convergence.png + +The estimated ``exact'' k-effective = 0.906834721253 which is simply from last +mesh iteration of polynomial order 3 minus 2e-10. We see that h-adaptive calculations +deliver an algebraic convergence. And the higher polynomial order is, the faster mesh +iteration converges. In our problem, we need smaller number of DoFs to achieve same +accuracy with higher polynoimal order. diff --git a/deal.II/examples/step-28/doc/step-28.convergence.png b/deal.II/examples/step-28/doc/step-28.convergence.png new file mode 100755 index 0000000000000000000000000000000000000000..65619bf273bbc02a2d626cf5c7dc41aa0f867039 GIT binary patch literal 12445 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 T(#tm*TM5=-yDR&yHO&1#golW% literal 0 HcmV?d00001 diff --git a/deal.II/examples/step-28/doc/step-28.error-vs-time.png b/deal.II/examples/step-28/doc/step-28.error-vs-time.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f8924cd43161eb2fb56997bbb0213648435f25 GIT binary patch literal 5413 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 literal 0 HcmV?d00001 diff --git a/deal.II/examples/step-28/doc/step-28.grid-0.9.order2.png b/deal.II/examples/step-28/doc/step-28.grid-0.9.order2.png new file mode 100755 index 0000000000000000000000000000000000000000..439a916ca12b092ab3a10bd3313c66936a4ab04f GIT binary patch literal 33134 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%0A_Fp9x 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 QCjl=_Rb3Udl4Z#M0cxWxX#fBK literal 0 HcmV?d00001 diff --git a/deal.II/examples/step-28/doc/step-28.solution-0.9.order2.png b/deal.II/examples/step-28/doc/step-28.solution-0.9.order2.png new file mode 100755 index 0000000000000000000000000000000000000000..a01e2381da4a1836bfe0858899103795f5d84412 GIT binary patch literal 16578 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 YRvU|LEi3T;pdRp9Mp^ooBq;Fz08_c|i2wiq literal 0 HcmV?d00001 diff --git a/deal.II/examples/step-28/doc/step-28.solution-1.9.order2.png b/deal.II/examples/step-28/doc/step-28.solution-1.9.order2.png new file mode 100755 index 0000000000000000000000000000000000000000..aa5431851eb46577da66442304db3c40ef4bff98 GIT binary patch literal 14160 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + + // We use the next include file to + // access block vectors which provide + // us a convenient way to manage + // solution and right hand side + // vectors of all energy groups: +#include + + // This include file is for + // transferring solutions from one + // mesh to another different mesh. We + // use it when we are initializing + // solutions after each mesh + // iteration: +#include + + // When integrating functions defined + // on one mesh against shape + // functions defined on a different + // mesh, we need a function @p + // get_finest_common_cells (as + // discussed in the introduction) + // which is defined in the following + // header file: +#include + + // Here are two more C++ standard + // headers that we use to define list + // data types as well as to fine-tune + // the output we generate: +#include +#include + + // The last step is as in all + // previous programs: +using namespace dealii; + + + // @sect3{Material data} + + // First up, we need to define a + // class that provides material data + // (including diffusion coefficients, + // removal cross sections, scattering + // cross sections, fission cross + // sections and fission spectra) to + // the main class. + // + // The parameter to the constructor + // determines for how many energy + // groups we set up the relevant + // tables. At present, this program + // only includes data for 2 energy + // groups, but a more sophisticated + // program may be able to initialize + // the data structures for more + // groups as well, depending on how + // many energy groups are selected in + // the parameter file. + // + // For each of the different + // coefficient types, there is one + // function that returns the value of + // this coefficient for a particular + // energy group (or combination of + // energy groups, as for the + // distribution cross section + // $\chi_g\nu\Sigma_{f,g'}$ or + // scattering cross section + // $\Sigma_{s,g'\to g}$). In addition + // to the energy group or groups, + // these coefficients depend on the + // type of fuel or control rod, as + // explained in the introduction. The + // functions therefore take an + // additional parameter, @p + // material_id, that identifies the + // particular kind of rod. Within + // this program, we use + // n_materials=8 + // different kinds of rods. + // + // Except for the scattering cross + // section, each of the coefficients + // therefore can be represented as an + // entry in a two-dimensional array + // of floating point values indexed + // by the energy group number as well + // as the material ID. The Table + // class template is the ideal way to + // store such data. Finally, the + // scattering coefficient depends on + // both two energy group indices and + // therefore needs to be stored in a + // three-dimensional array, for which + // we again use the Table class, + // where this time the first template + // argument (denoting the + // dimensionality of the array) of + // course needs to be three: +class MaterialData +{ + public: + MaterialData (const unsigned int n_groups); + + double get_diffusion_coefficient (const unsigned int group, + const unsigned int material_id) const; + double get_removal_XS (const unsigned int group, + const unsigned int material_id) const; + double get_fission_XS (const unsigned int group, + const unsigned int material_id) const; + double get_fission_dist_XS (const unsigned int group_1, + const unsigned int group_2, + const unsigned int material_id) const; + double get_scattering_XS (const unsigned int group_1, + const unsigned int group_2, + const unsigned int material_id) const; + double get_fission_spectrum (const unsigned int group, + const unsigned int material_id) const; + + private: + const unsigned int n_groups; + const unsigned int n_materials; + + Table<2,double> diffusion; + Table<2,double> sigma_r; + Table<2,double> nu_sigma_f; + Table<3,double> sigma_s; + Table<2,double> chi; +}; + + // The constructor of the class is + // used to initialize all the + // material data arrays. It takes the + // number of energy groups as an + // argument (an throws an error if + // that value is not equal to two, + // since at presently only data for + // two energy groups is implemented; + // however, using this, the function + // remains flexible and extendible + // into the future). In the member + // initialization part at the + // beginning, it also resizes the + // arrays to their correct sizes. + // + // At present, material data is + // stored for 8 different types of + // material. This, as well, may + // easily be extended in the future. +MaterialData::MaterialData (const unsigned int n_groups) + : + n_groups (n_groups), + n_materials (8), + diffusion (n_materials, n_groups), + sigma_r (n_materials, n_groups), + nu_sigma_f (n_materials, n_groups), + sigma_s (n_materials, n_groups, n_groups), + chi (n_materials, n_groups) +{ + switch (n_groups) + { + case 2: + { + for (unsigned int m=0; mEnergyGroup class} + + // The first interesting class is the + // one that contains everything that + // is specific to a single energy + // group. To group things that belong + // together into individual objects, + // we declare a structure that holds + // the Triangulation and DoFHandler + // objects for the mesh used for a + // single energy group, and a number + // of other objects and member + // functions that we will discuss in + // the following sections. + // + // The main reason for this class is + // as follows: for both the forward + // problem (with a specified right + // hand side) as well as for the + // eigenvalue problem, one typically + // solves a sequence of problems for + // a single energy group each, rather + // than the fully coupled + // problem. This becomes + // understandable once one realizes + // that the system matrix for a + // single energy group is symmetric + // and positive definite (it is + // simply a diffusion operator), + // whereas the matrix for the fully + // coupled problem is generally + // nonsymmetric and not definite. It + // is also very large and quite full + // if more than a few energy groups + // are involved. + // + // Let us first look at the equation + // to solve in the case of an + // external right hand side (for the time + // independent case): + // @f{eqnarray*} + // -\nabla \cdot(D_g(x) \nabla \phi_g(x)) + // + + // \Sigma_{r,g}(x)\phi_g(x) + // = + // \chi_g\sum_{g'=1}^G\nu\Sigma_{f,g'}(x)\phi_{g'}(x) + // + + // \sum_{g'\ne g}\Sigma_{s,g'\to g}(x)\phi_{g'}(x) + // + + // s_{\mathrm{ext},g}(x) + // @f} + // + // We would typically solve this + // equation by moving all the terms + // on the right hand side with $g'=g$ + // to the left hand side, and solving + // for $\phi_g$. Of course, we don't + // know $\phi_{g'}$ yet, since the + // equations for those variables + // include right hand side terms + // involving $\phi_g$. What one + // typically does in such situations + // is to iterate: compute + // @f{eqnarray*} + // -\nabla \cdot(D_g(x) \nabla \phi^{(n)}_g(x)) + // &+& + // \Sigma_{r,g}(x)\phi^{(n)}_g(x) + // \\ &=& + // \chi_g\sum_{g'=1}^{g-1}\nu\Sigma_{f,g'}(x)\phi^{(n)}_{g'}(x) + // + + // \chi_g\sum_{g'=g}^G\nu\Sigma_{f,g'}(x)\phi^{(n-1)}_{g'}(x) + // + + // \sum_{g'\ne g, g'g}\Sigma_{s,g'\to g}(x)\phi^{(n-1)}_{g'}(x) + // + + // s_{\mathrm{ext},g}(x) + // @f} + // + // In other words, we solve the + // equation one by one, using values + // for $\phi_{g'}$ from the previous + // iteration $n-1$ if $g'\ge g$ and + // already computed values for + // $\phi_{g'}$ from the present + // iteration if $g' +class EnergyGroup +{ + public: + + // @sect5{Public member functions} + // + // The class has a good number of + // public member functions, since + // its the way it operates is + // controlled from the outside, + // and therefore all functions + // that do something significant + // need to be called from another + // class. Let's start off with + // book-keeping: the class + // obviously needs to know which + // energy group it represents, + // which material data to use, + // and from what coarse grid to + // start. The constructor takes + // this information and + // initializes the relevant + // member variables with that + // (see below). + // + // Then we also need functions + // that set up the linear system, + // i.e. correctly size the matrix + // and its sparsity pattern, etc, + // given a finite element object + // to use. The + // setup_linear_system + // function does that. Finally, + // for this initial block, there + // are two functions that return + // the number of active cells and + // degrees of freedom used in + // this object -- using this, we + // can make the triangulation and + // DoF handler member variables + // private, and do not have to + // grant external use to it, + // enhancing encapsulation: + EnergyGroup (const unsigned int group, + const MaterialData &material_data, + const Triangulation &coarse_grid, + const FiniteElement &fe); + + void setup_linear_system (); + + unsigned int n_active_cells () const; + unsigned int n_dofs () const; + + // Then there are functions that + // assemble the linear system for + // each iteration and the present + // energy group. Note that the + // matrix is independent of the + // iteration number, so only has + // to be computed once for each + // refinement cycle. The + // situation is a bit more + // involved for the right hand + // side that has to be updated in + // each inverse power iteration, + // and that is further + // complicated by the fact that + // computing it may involve + // several different meshes as + // explained in the + // introduction. To make things + // more flexible with regard to + // solving the forward or the + // eigenvalue problem, we split + // the computation of the right + // hand side into a function that + // assembles the extraneous + // source and in-group + // contributions (which we will + // call with a zero function as + // source terms for the + // eigenvalue problem) and one + // that computes contributions to + // the right hand side from + // another energy group: + void assemble_system_matrix (); + void assemble_ingroup_rhs (const Function &extraneous_source); + void assemble_cross_group_rhs (const EnergyGroup &g_prime); + + // Next we need a set of + // functions that actually + // compute the solution of a + // linear system, and do + // something with it (such as + // computing the fission source + // contribution mentioned in the + // introduction, writing + // graphical information to an + // output file, computing error + // indicators, or actually + // refining the grid based on + // these criteria and thresholds + // for refinement and + // coarsening). All these + // functions will later be called + // from the driver class + // NeutronDiffusionProblem, + // or any other class you may + // want to implement to solve a + // problem involving the neutron + // flux equations: + void solve (); + + double get_fission_source () const; + + void output_results (const unsigned int cycle) const; + + void estimate_errors (Vector &error_indicators) const; + + void refine_grid (const Vector &error_indicators, + const double refine_threshold, + const double coarsen_threshold); + + // @sect5{Public data members} + // + // As is good practice in object + // oriented programming, we hide + // most data members by making + // them private. However, we have + // to grant the class that drives + // the process access to the + // solution vector as well as the + // solution of the previous + // iteration, since in the power + // iteration, the solution vector + // is scaled in every iteration + // by the present guess of the + // eigenvalue we are looking for: + public: + + Vector solution; + Vector solution_old; + + + // @sect5{Private data members} + // + // The rest of the data members + // are private. Compared to all + // the previous tutorial + // programs, the only new data + // members are an integer storing + // which energy group this object + // represents, and a reference to + // the material data object that + // this object's constructor gets + // passed from the driver + // class. Likewise, the + // constructor gets a reference + // to the finite element object + // we are to use. + // + // Finally, we have to apply + // boundary values to the linear + // system in each iteration, + // i.e. quite frequently. Rather + // than interpolating them every + // time, we interpolate them once + // on each new mesh and then + // store them along with all the + // other data of this class: + private: + + const unsigned int group; + const MaterialData &material_data; + + Triangulation triangulation; + const FiniteElement &fe; + DoFHandler dof_handler; + + SparsityPattern sparsity_pattern; + SparseMatrix system_matrix; + + Vector system_rhs; + + std::map boundary_values; + ConstraintMatrix hanging_node_constraints; + + + // @sect5{Private member functionss} + // + // There is one private member + // function in this class. It + // recursively walks over cells + // of two meshes to compute the + // cross-group right hand side + // terms. The algorithm for this + // is explained in the + // introduction to this + // program. The arguments to this + // function are a reference to an + // object representing the energy + // group against which we want to + // integrate a right hand side + // term, an iterator to a cell of + // the mesh used for the present + // energy group, an iterator to a + // corresponding cell on the + // other mesh, and the matrix + // that interpolates the degrees + // of freedom from the coarser of + // the two cells to the finer + // one: + private: + + void + assemble_cross_group_rhs_recursive (const EnergyGroup &g_prime, + const typename DoFHandler::cell_iterator &cell_g, + const typename DoFHandler::cell_iterator &cell_g_prime, + const FullMatrix prolongation_matrix); +}; + + + // @sect4{Implementation of the EnergyGroup class} + + // The first few functions of this + // class are mostly + // self-explanatory. The constructor + // only sets a few data members and + // creates a copy of the given + // triangulation as the base for the + // triangulation used for this energy + // group. The next two functions + // simply return data from private + // data members, thereby enabling us + // to make these data members + // private. +template +EnergyGroup::EnergyGroup (const unsigned int group, + const MaterialData &material_data, + const Triangulation &coarse_grid, + const FiniteElement &fe) + : + group (group), + material_data (material_data), + fe (fe), + dof_handler (triangulation) +{ + triangulation.copy_triangulation (coarse_grid); + dof_handler.distribute_dofs (fe); +} + + + +template +unsigned int +EnergyGroup::n_active_cells () const +{ + return triangulation.n_active_cells (); +} + + + +template +unsigned int +EnergyGroup::n_dofs () const +{ + return dof_handler.n_dofs (); +} + + + + // @sect5{EnergyGroup::setup_linear_system} + // + // The first "real" function is the + // one that sets up the mesh, + // matrices, etc, on the new mesh or + // after mesh refinement. We use this + // function to initialize sparse + // system matrices, and the right + // hand side vector. If the solution + // vector has never been set before + // (as indicated by a zero size), we + // also initialize it and set it to a + // default value. We don't do that if + // it already has a non-zero size + // (i.e. this function is called + // after mesh refinement) since in + // that case we want to preserve the + // solution across mesh refinement + // (something we do in the + // EnergyGroup::refine_grid + // function). +template +void +EnergyGroup::setup_linear_system () +{ + const unsigned int n_dofs = dof_handler.n_dofs(); + + hanging_node_constraints.clear (); + DoFTools::make_hanging_node_constraints (dof_handler, + hanging_node_constraints); + hanging_node_constraints.close (); + + system_matrix.clear (); + + sparsity_pattern.reinit (n_dofs, n_dofs, + dof_handler.max_couplings_between_dofs()); + DoFTools::make_sparsity_pattern (dof_handler, sparsity_pattern); + hanging_node_constraints.condense (sparsity_pattern); + sparsity_pattern.compress (); + + system_matrix.reinit (sparsity_pattern); + + system_rhs.reinit (n_dofs); + + if (solution.size() == 0) + { + solution.reinit (n_dofs); + solution_old.reinit(n_dofs); + solution_old = 1.0; + solution = solution_old; + } + + + // At the end of this function, we + // update the list of boundary + // nodes and their values, by first + // clearing this list and the + // re-interpolating boundary values + // (remember that this function is + // called after first setting up + // the mesh, and each time after + // mesh refinement). + // + // To understand the code, it is + // necessary to realize that we + // create the mesh using the + // GridGenerator::subdivided_hyper_rectangle + // function (in + // NeutronDiffusionProblem::initialize_problem) + // where we set the last parameter + // to true. This means that + // boundaries of the domain are + // "colored", i.e. the four (or + // six, in 3d) sides of the domain + // are assigned different boundary + // indicators. As it turns out, the + // bottom boundary gets indicator + // zero, the top one boundary + // indicator one, and left and + // right boundaries get indicators + // two and three, respectively. + // + // In this program, we simulate + // only one, namely the top right, + // quarter of a reactor. That is, + // we want to interpolate boundary + // conditions only on the top and + // right boundaries, while do + // nothing on the bottom and left + // boundaries (i.e. impose natural, + // no-flux Neumann boundary + // conditions). This is most easily + // generalized to arbitrary + // dimension by saying that we want + // to interpolate on those + // boundaries with indicators 1, 3, + // ..., which we do in the + // following loop (note that calls + // to + // VectorTools::interpolate_boundary_values + // are additive, i.e. they do not + // first clear the boundary value + // map): + boundary_values.clear(); + + for (unsigned int i=0; i(), + boundary_values); +} + + + + // @sect5{EnergyGroup::assemble_system_matrix} + // + // Next we need functions assembling + // the system matrix and right hand + // sides. Assembling the matrix is + // straightforward given the + // equations outlined in the + // introduction as well as what we've + // seen in previous example + // programs. Note the use of + // cell->material_id() to get at + // the kind of material from which a + // cell is made up of. Note also how + // we set the order of the quadrature + // formula so that it is always + // appropriate for the finite element + // in use. + // + // Finally, note that since we only + // assemble the system matrix here, + // we can't yet eliminate boundary + // values (we need the right hand + // side vector for this). We defer + // this to the EnergyGroup::solve + // function, at which point all the + // information is available. +template +void +EnergyGroup::assemble_system_matrix () +{ + const QGauss quadrature_formula(fe.degree + 1); + + FEValues fe_values (fe, quadrature_formula, + update_values | update_gradients | + update_JxW_values); + + 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); + + std::vector local_dof_indices (dofs_per_cell); + + typename DoFHandler::active_cell_iterator + cell = dof_handler.begin_active(), + endc = dof_handler.end(); + + for (; cell!=endc; ++cell) + { + cell_matrix = 0; + + fe_values.reinit (cell); + + const double diffusion_coefficient + = material_data.get_diffusion_coefficient (group, cell->material_id()); + const double removal_XS + = material_data.get_removal_XS (group,cell->material_id()); + + for (unsigned int q_point=0; q_pointget_dof_indices (local_dof_indices); + + for (unsigned int i=0; iEnergyGroup::assemble_ingroup_rhs} + // + // As explained in the documentation + // of the EnergyGroup class, we + // split assembling the right hand + // side into two parts: the ingroup + // and the cross-group + // couplings. First, we need a + // function to assemble the right + // hand side of one specific group + // here, i.e. including an extraneous + // source (that we will set to zero + // for the eigenvalue problem) as + // well as the ingroup fission + // contributions. (In-group + // scattering has already been + // accounted for with the definition + // of removal cross section.) The + // function's workings are pretty + // standard as far as assembling + // right hand sides go, and therefore + // does not require more comments + // except that we mention that the + // right hand side vector is set to + // zero at the beginning of the + // function -- something we are not + // going to do for the cross-group + // terms that simply add to the right + // hand side vector. +template +void EnergyGroup::assemble_ingroup_rhs (const Function &extraneous_source) +{ + system_rhs.reinit (dof_handler.n_dofs()); + + const QGauss quadrature_formula (fe.degree + 1); + + const unsigned int dofs_per_cell = fe.dofs_per_cell; + const unsigned int n_q_points = quadrature_formula.n_quadrature_points; + + FEValues fe_values (fe, quadrature_formula, + update_values | update_q_points | + update_JxW_values); + + Vector cell_rhs (dofs_per_cell); + std::vector extraneous_source_values (n_q_points); + std::vector solution_old_values (n_q_points); + + std::vector local_dof_indices (dofs_per_cell); + + typename DoFHandler::active_cell_iterator + cell = dof_handler.begin_active(), + endc = dof_handler.end(); + + for (; cell!=endc; ++cell) + { + cell_rhs = 0; + + fe_values.reinit (cell); + + const double fission_dist_XS + = material_data.get_fission_dist_XS (group, group, cell->material_id()); + + extraneous_source.value_list (fe_values.get_quadrature_points(), + extraneous_source_values); + + fe_values.get_function_values (solution_old, solution_old_values); + + cell->get_dof_indices (local_dof_indices); + + for (unsigned int q_point=0; q_pointEnergyGroup::assemble_cross_group_rhs} + // + // The more interesting function for + // assembling the right hand side + // vector for the equation of a + // single energy group is the one + // that couples energy group $g$ and + // $g'$. As explained in the + // introduction, we first have to + // find the set of cells common to + // the meshes of the two energy + // groups. First we call + // get_finest_common_cells to + // obtain this list of pairs of + // common cells from both + // meshes. Both cells in a pair may + // not be active but at least one of + // them is. We then hand each of + // these cell pairs off to a function + // tha computes the right hand side + // terms recursively. + // + // Note that ingroup coupling is + // handled already before, so we exit + // the function early if $g=g'$. +template +void EnergyGroup::assemble_cross_group_rhs (const EnergyGroup &g_prime) +{ + if (group == g_prime.group) + return; + + const std::list::cell_iterator, + typename DoFHandler::cell_iterator> > + cell_list + = GridTools::get_finest_common_cells (dof_handler, + g_prime.dof_handler); + + typename std::list::cell_iterator, + typename DoFHandler::cell_iterator> > + ::const_iterator + cell_iter = cell_list.begin(); + + for (; cell_iter!=cell_list.end(); ++cell_iter) + { + FullMatrix unit_matrix (fe.dofs_per_cell); + for (unsigned int i=0; ifirst, + cell_iter->second, + unit_matrix); + } +} + + + + // @sect5{EnergyGroup::assemble_cross_group_rhs_recursive} + // + // This is finally the function that + // handles assembling right hand side + // terms on potentially different + // meshes recursively, using the + // algorithm described in the + // introduction. The function takes a + // reference to the object + // representing energy group $g'$, as + // well as iterators to corresponding + // cells in the meshes for energy + // groups $g$ and $g'$. At first, + // i.e. when this function is called + // from the one above, these two + // cells will be matching cells on + // two meshes; however, one of the + // two may be further refined, and we + // will call the function recursively + // with one of the two iterators + // replaced by one of the children of + // the original cell. + // + // The last argument is the matrix + // product matrix $B_{c^{(k)}}^T + // \cdots B_{c'}^T B_c^T$ from the + // introduction that interpolates + // from the coarser of the two cells + // to the finer one. If the two cells + // match, then this is the identity + // matrix -- exactly what we pass to + // this function initially. + // + // The function has to consider two + // cases: that both of the two cells + // are not further refined, i.e. have + // no children, in which case we can + // finally assemble the right hand + // side contributions of this pair of + // cells; and that one of the two + // cells is further refined, in which + // case we have to keep recursing by + // looping over the children of the + // one cell that is not active. These + // two cases will be discussed below: +template +void +EnergyGroup:: +assemble_cross_group_rhs_recursive (const EnergyGroup &g_prime, + const typename DoFHandler::cell_iterator &cell_g, + const typename DoFHandler::cell_iterator &cell_g_prime, + const FullMatrix prolongation_matrix) +{ + // The first case is that both + // cells are no further refined. In + // that case, we can assemble the + // relevant terms (see the + // introduction). This involves + // assembling the mass matrix on + // the finer of the two cells (in + // fact there are two mass matrices + // with different coefficients, one + // for the fission distribution + // cross section + // $\chi_g\nu\Sigma_{f,g'}$ and one + // for the scattering cross section + // $\Sigma_{s,g'\to g}$). This is + // straight forward, but note how + // we determine which of the two + // cells is ther finer one by + // looking at the refinement level + // of the two cells: + if (!cell_g->has_children() && !cell_g_prime->has_children()) + { + const QGauss quadrature_formula (fe.degree+1); + const unsigned int n_q_points = quadrature_formula.n_quadrature_points; + + FEValues fe_values (fe, quadrature_formula, + update_values | update_JxW_values); + + if (cell_g->level() > cell_g_prime->level()) + fe_values.reinit (cell_g); + else + fe_values.reinit (cell_g_prime); + + const double fission_dist_XS + = material_data.get_fission_dist_XS (group, g_prime.group, + cell_g_prime->material_id()); + + const double scattering_XS + = material_data.get_scattering_XS (g_prime.group, group, + cell_g_prime->material_id()); + + FullMatrix local_mass_matrix_f (fe.dofs_per_cell, + fe.dofs_per_cell); + FullMatrix local_mass_matrix_g (fe.dofs_per_cell, + fe.dofs_per_cell); + + for (unsigned int q_point=0; q_pointvmult + // function, or the product with the + // transpose matrix using Tvmult. + // After doing so, we transfer the + // result into the global right hand + // side vector of energy group $g$. + Vector g_prime_new_values (fe.dofs_per_cell); + Vector g_prime_old_values (fe.dofs_per_cell); + cell_g_prime->get_dof_values (g_prime.solution_old, g_prime_old_values); + cell_g_prime->get_dof_values (g_prime.solution, g_prime_new_values); + + Vector cell_rhs (fe.dofs_per_cell); + Vector tmp (fe.dofs_per_cell); + + if (cell_g->level() > cell_g_prime->level()) + { + prolongation_matrix.vmult (tmp, g_prime_old_values); + local_mass_matrix_f.vmult (cell_rhs, tmp); + + prolongation_matrix.vmult (tmp, g_prime_new_values); + local_mass_matrix_g.vmult_add (cell_rhs, tmp); + } + else + { + local_mass_matrix_f.vmult (tmp, g_prime_old_values); + prolongation_matrix.Tvmult (cell_rhs, tmp); + + local_mass_matrix_g.vmult (tmp, g_prime_new_values); + prolongation_matrix.Tvmult_add (cell_rhs, tmp); + } + + std::vector local_dof_indices (fe.dofs_per_cell); + cell_g->get_dof_indices (local_dof_indices); + + for (unsigned int i=0; immult), and then hand the + // result off to this very same + // function again, but with the + // cell that has children replaced + // by one of its children: + else + for (unsigned int child=0; child::children_per_cell;++child) + { + FullMatrix new_matrix (fe.dofs_per_cell, fe.dofs_per_cell); + fe.get_prolongation_matrix(child).mmult (new_matrix, + prolongation_matrix); + + if (cell_g->has_children()) + assemble_cross_group_rhs_recursive (g_prime, + cell_g->child(child), cell_g_prime, + new_matrix); + else + assemble_cross_group_rhs_recursive (g_prime, + cell_g, cell_g_prime->child(child), + new_matrix); + } +} + + + // @sect5{EnergyGroup::get_fission_source} + // + // In the (inverse) power iteration, + // we use the integrated fission + // source to update the + // $k$-eigenvalue. Given its + // definition, the following function + // is essentially self-explanatory: +template +double EnergyGroup::get_fission_source () const +{ + const QGauss quadrature_formula (fe.degree + 1); + const unsigned int n_q_points = quadrature_formula.n_quadrature_points; + + FEValues fe_values (fe, quadrature_formula, + update_values | update_JxW_values); + + std::vector solution_values (n_q_points); + + double fission_source = 0; + + typename DoFHandler::active_cell_iterator + cell = dof_handler.begin_active(), + endc = dof_handler.end(); + for (; cell!=endc; ++cell) + { + fe_values.reinit (cell); + + const double fission_XS + = material_data.get_fission_XS(group, cell->material_id()); + + fe_values.get_function_values (solution, solution_values); + + for (unsigned int q_point=0; q_pointEnergyGroup::solve} + // + // Next a function that solves the + // linear system assembled + // before. Things are pretty much + // standard, except that we delayed + // applying boundary values until we + // get here, since in all the + // previous functions we were still + // adding up contributions the right + // hand side vector. +template +void +EnergyGroup::solve () +{ + hanging_node_constraints.condense (system_rhs); + MatrixTools::apply_boundary_values (boundary_values, + system_matrix, + solution, + system_rhs); + + SolverControl solver_control (system_matrix.m(), + 1e-12*system_rhs.l2_norm()); + SolverCG<> cg (solver_control); + + PreconditionSSOR<> preconditioner; + preconditioner.initialize(system_matrix, 1.2); + + cg.solve (system_matrix, solution, system_rhs, preconditioner); + + hanging_node_constraints.distribute (solution); +} + + + + // @sect5{EnergyGroup::estimate_errors} + // + // Mesh refinement is split into two + // functions. The first estimates the + // error for each cell, normalizes it + // by the magnitude of the solution, + // and returns it in the vector given + // as an argument. The calling + // function collects all error + // indicators from all energy groups, + // and computes thresholds for + // refining and coarsening cells. +template +void EnergyGroup::estimate_errors (Vector &error_indicators) const +{ + KellyErrorEstimator::estimate (dof_handler, + QGauss (fe.degree + 1), + typename FunctionMap::type(), + solution, + error_indicators); + error_indicators /= solution.linfty_norm(); +} + + + + // @sect5{EnergyGroup::refine_grid} + // + // The second part is to refine the + // grid given the error indicators + // compute in the previous function + // and error thresholds above which + // cells shall be refined or below + // which cells shall be + // coarsened. Note that we do not use + // any of the functions in + // GridRefinement here, + // but rather set refinement flags + // ourselves. + // + // After setting these flags, we use + // the SolutionTransfer class to move + // the solution vector from the old + // to the new mesh. The procedure + // used here is described in detail + // in the documentation of that + // class: +template +void EnergyGroup::refine_grid (const Vector &error_indicators, + const double refine_threshold, + const double coarsen_threshold) +{ + typename Triangulation::active_cell_iterator + cell = triangulation.begin_active(), + endc = triangulation.end(); + + for (unsigned int cell_index=0; cell!=endc; ++cell, ++cell_index) + if (error_indicators(cell_index) > refine_threshold) + cell->set_refine_flag (); + else if (error_indicators(cell_index) < coarsen_threshold) + cell->set_coarsen_flag (); + + SolutionTransfer soltrans(dof_handler); + + triangulation.prepare_coarsening_and_refinement(); + soltrans.prepare_for_coarsening_and_refinement(solution); + + triangulation.execute_coarsening_and_refinement (); + dof_handler.distribute_dofs (fe); + + solution.reinit (dof_handler.n_dofs()); + soltrans.interpolate(solution_old, solution); + + solution_old.reinit (dof_handler.n_dofs()); + solution_old = solution; +} + + + // @sect5{EnergyGroup::output_results} + // + // The last function of this class + // outputs meshes and solutions after + // each mesh iteration. This has been + // shown many times before. The only + // thing worth pointing out is the + // use of the + // Utilities::int_to_string + // function to convert an integer + // into its string + // representation. The second + // argument of that function denotes + // how many digits we shall use -- if + // this value was larger than one, + // then the number would be padded by + // leading zeros. +template +void +EnergyGroup::output_results (const unsigned int cycle) const +{ + { + const std::string filename = std::string("grid-") + + Utilities::int_to_string(group,1) + + "." + + Utilities::int_to_string(cycle,1) + + ".eps"; + std::ofstream output (filename.c_str()); + + GridOut grid_out; + grid_out.write_eps (triangulation, output); + } + + { + const std::string filename = std::string("solution-") + + Utilities::int_to_string(group,1) + + "." + + Utilities::int_to_string(cycle,1) + + ".gmv"; + + DataOut data_out; + + data_out.attach_dof_handler (dof_handler); + data_out.add_data_vector (solution, "solution"); + data_out.build_patches (); + + std::ofstream output (filename.c_str()); + data_out.write_gmv (output); + } +} + + + + // @sect3{The NeutronDiffusionProblem class template} + + // This is the main class of the + // program, not because it implements + // all the functionality (in fact, + // most of it is implemented in the + // EnergyGroup class) + // but because it contains the + // driving algorithm that determines + // what to compute and when. It is + // mostly as shown in many of the + // other tutorial programs in that it + // has a public run + // function and private functions + // doing all the rest. In several + // places, we have to do something + // for all energy groups, in which + // case we will spawn threads for + // each group to let these things run + // in parallel if deal.II was + // configured for multithreading. + // + // The biggest difference to previous + // example programs is that we also + // declare a nested class that has + // member variables for all the + // run-time parameters that can be + // passed to the program in an input + // file. Right now, these are the + // number of energy groups, the + // number of refinement cycles, the + // polynomial degree of the finite + // element to be used, and the + // tolerance used to determine when + // convergence of the inverse power + // iteration has occurred. In + // addition, we have a constructor of + // this class that sets all these + // values to their default values, a + // function + // declare_parameters + // that described to the + // ParameterHandler class already + // used in @ref step_19 "step-19" + // what parameters are accepted in + // the input file, and a function + // get_parameters that + // can extract the values of these + // parameters from a ParameterHandler + // object. +template +class NeutronDiffusionProblem +{ + public: + class Parameters + { + public: + Parameters (); + + static void declare_parameters (ParameterHandler &prm); + void get_parameters (ParameterHandler &prm); + + unsigned int n_groups; + unsigned int n_refinement_cycles; + + unsigned int fe_degree; + + double convergence_tolerance; + }; + + + + NeutronDiffusionProblem (const Parameters ¶meters); + ~NeutronDiffusionProblem (); + + void run (); + + private: + // @sect5{Private member functions} + + // There are not that many member + // functions in this class since + // most of the functionality has + // been moved into the + // EnergyGroup class + // and is simply called from the + // run() member + // function of this class. The + // ones that remain have + // self-explanatory names: + void initialize_problem(); + + void refine_grid (); + + double get_total_fission_source () const; + + + // @sect5{Private member variables} + + // Next, we have a few member + // variables. In particular, + // these are (i) a reference to + // the parameter object (owned by + // the main function of this + // program, and passed to the + // constructor of this class), + // (ii) an object describing the + // material parameters for the + // number of energy groups + // requested in the input file, + // and (iii) the finite element + // to be used by all energy + // groups: + const Parameters ¶meters; + const MaterialData material_data; + FE_Q fe; + + // Furthermore, we have (iv) the + // value of the computed + // eigenvalue at the present + // iteration. This is, in fact, + // the only part of the solution + // that is shared between all + // energy groups -- all other + // parts of the solution, such as + // neutron fluxes are particular + // to one or the other energy + // group, and are therefore + // stored in objects that + // describe a single energy + // group: + double k_eff; + + // Finally, (v), we have an array + // of pointers to the energy + // group objects. The length of + // this array is, of course, + // equal to the number of energy + // groups specified in the + // parameter file. + std::vector*> energy_groups; +}; + + + // @sect4{Implementation of the NeutronDiffusionProblem::Parameters class} + + // Before going on to the + // implementation of the outer class, + // we have to implement the functions + // of the parameters structure. This + // is pretty straightforward and, in + // fact, looks pretty much the same + // for all such parameters classes + // using the ParameterHandler + // capabilities. We will therefore + // not comment further on this: +template +NeutronDiffusionProblem::Parameters::Parameters () + : + n_groups (2), + n_refinement_cycles (5), + fe_degree (2), + convergence_tolerance (1e-12) +{} + + + +template +void +NeutronDiffusionProblem::Parameters:: +declare_parameters (ParameterHandler &prm) +{ + prm.declare_entry ("Number of energy groups", "2", + Patterns::Integer (), + "The number of energy different groups considered"); + prm.declare_entry ("Refinement cycles", "5", + Patterns::Integer (), + "Number of refinement cycles to be performed"); + prm.declare_entry ("Finite element degree", "2", + Patterns::Integer (), + "Polynomial degree of the finite element to be used"); + prm.declare_entry ("Power iteration tolerance", "1e-12", + Patterns::Double (), + "Inner power iterations are stopped when the change in k_eff falls " + "below this tolerance"); +} + + + +template +void +NeutronDiffusionProblem::Parameters:: +get_parameters (ParameterHandler &prm) +{ + n_groups = prm.get_integer ("Number of energy groups"); + n_refinement_cycles = prm.get_integer ("Refinement cycles"); + fe_degree = prm.get_integer ("Finite element degree"); + convergence_tolerance = prm.get_double ("Power iteration tolerance"); +} + + + + + // @sect4{Implementation of the NeutronDiffusionProblem class} + + // Now for the + // NeutronDiffusionProblem + // class. The constructor and + // destructor have nothing of much + // interest: +template +NeutronDiffusionProblem:: +NeutronDiffusionProblem (const Parameters ¶meters) + : + parameters (parameters), + material_data (parameters.n_groups), + fe (parameters.fe_degree) +{} + + + +template +NeutronDiffusionProblem::~NeutronDiffusionProblem () +{ + for (unsigned int group=0; groupNeutronDiffusionProblem::initialize_problem} + // + // The first function of interest is + // the one that sets up the geometry + // of the reactor core. This is + // described in more detail in the + // introduction. + // + // The first part of the function + // defines geometry data, and then + // creates a coarse mesh that has as + // many cells as there are fuel rods + // (or pin cells, for that matter) in + // that part of the reactor core that + // we simulate. As mentioned when + // interpolating boundary values + // above, the last parameter to the + // GridGenerator::subdivided_hyper_rectangle + // function specifies that sides of + // the domain shall have unique + // boundary indicators that will + // later allow us to determine in a + // simple way which of the boundaries + // have Neumann and which have + // Dirichlet conditions attached to + // them. +template +void NeutronDiffusionProblem::initialize_problem() +{ + const unsigned int rods_per_assembly_x = 17, + rods_per_assembly_y = 17; + const double pin_pitch_x = 1.26, + pin_pitch_y = 1.26; + const double assembly_height = 200; + + const unsigned int assemblies_x = 2, + assemblies_y = 2, + assemblies_z = 1; + + const Point bottom_left = Point(); + const Point upper_right = (dim == 2 + ? + Point (assemblies_x*rods_per_assembly_x*pin_pitch_x, + assemblies_y*rods_per_assembly_y*pin_pitch_y) + : + Point (assemblies_x*rods_per_assembly_x*pin_pitch_x, + assemblies_y*rods_per_assembly_y*pin_pitch_y, + assemblies_z*assembly_height)); + + std::vector n_subdivisions; + n_subdivisions.push_back (assemblies_x*rods_per_assembly_x); + if (dim >= 2) + n_subdivisions.push_back (assemblies_y*rods_per_assembly_y); + if (dim >= 3) + n_subdivisions.push_back (assemblies_z); + + Triangulation coarse_grid; + GridGenerator::subdivided_hyper_rectangle (coarse_grid, + n_subdivisions, + bottom_left, + upper_right, + true); + + + // The second part of the function + // deals with material numbers of + // pin cells of each type of + // assembly. Here, we define four + // different types of assembly, for + // which we describe the + // arrangement of fuel rods in the + // following tables. + // + // The assemblies described here + // are taken from the benchmark + // mentioned in the introduction + // and are (in this order): + //
    + //
  1. 'UX' Assembly: UO2 fuel assembly + // with 24 guide tubes and a central + // Moveable Fission Chamber + //
  2. 'UA' Assembly: UO2 fuel assembly + // with 24 AIC and a central + // Moveable Fission Chamber + //
  3. 'PX' Assembly: MOX fuel assembly + // with 24 guide tubes and a central + // Moveable Fission Chamber + //
  4. 'R' Assembly: a reflector. + //
+ // + // Note that the numbers listed + // here and taken from the + // benchmark description are, in + // good old Fortran fashion, + // one-based. We will later + // subtract one from each number + // when assigning materials to + // individual cells to convert + // things into the C-style + // zero-based indexing. + const unsigned int n_assemblies=4; + const unsigned int + assembly_materials[n_assemblies][rods_per_assembly_x][rods_per_assembly_y] + = { + { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 5, 1, 1, 5, 1, 1, 7, 1, 1, 5, 1, 1, 5, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } + }, + { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 8, 1, 1, 8, 1, 1, 7, 1, 1, 8, 1, 1, 8, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } + }, + { + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, + { 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2 }, + { 2, 3, 3, 3, 3, 5, 3, 3, 5, 3, 3, 5, 3, 3, 3, 3, 2 }, + { 2, 3, 3, 5, 3, 4, 4, 4, 4, 4, 4, 4, 3, 5, 3, 3, 2 }, + { 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2 }, + { 2, 3, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5, 3, 2 }, + { 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2 }, + { 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2 }, + { 2, 3, 5, 4, 4, 5, 4, 4, 7, 4, 4, 5, 4, 4, 5, 3, 2 }, + { 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2 }, + { 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2 }, + { 2, 3, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5, 3, 2 }, + { 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2 }, + { 2, 3, 3, 5, 3, 4, 4, 4, 4, 4, 4, 4, 3, 5, 3, 3, 2 }, + { 2, 3, 3, 3, 3, 5, 3, 3, 5, 3, 3, 5, 3, 3, 3, 3, 2 }, + { 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } + }, + { + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, + { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 } + } + }; + + // After the description of the + // materials that make up an + // assembly, we have to specify the + // arrangement of assemblies within + // the core. We use a symmetric + // pattern that in fact only uses + // the 'UX' and 'PX' assemblies: + const unsigned int core[assemblies_x][assemblies_y][assemblies_z] + = {{{0}, {2}}, {{2}, {0}}}; + + // We are now in a position to + // actually set material IDs for + // each cell. To this end, we loop + // over all cells, look at the + // location of the cell's center, + // and determine which assembly and + // fuel rod this would be in. (We + // add a few checks to see that the + // locations we compute are within + // the bounds of the arrays in + // which we have to look up + // materials.) At the end of the + // loop, we set material + // identifiers accordingly: + for (typename Triangulation::active_cell_iterator + cell = coarse_grid.begin_active(); + cell!=coarse_grid.end(); + ++cell) + { + const Point cell_center = cell->center(); + + const unsigned int tmp_x = int(cell_center[0]/pin_pitch_x); + const unsigned int ax = tmp_x/rods_per_assembly_x; + const unsigned int cx = tmp_x - ax * rods_per_assembly_x; + + const unsigned tmp_y = int(cell_center[1]/pin_pitch_y); + const unsigned int ay = tmp_y/rods_per_assembly_y; + const unsigned int cy = tmp_y - ay * rods_per_assembly_y; + + const unsigned int az = (dim == 2 + ? + 0 + : + int (cell_center[dim-1]/assembly_height)); + + Assert (ax < assemblies_x, ExcInternalError()); + Assert (ay < assemblies_y, ExcInternalError()); + Assert (az < assemblies_z, ExcInternalError()); + + Assert (core[ax][ay][az] < n_assemblies, ExcInternalError()); + + Assert (cx < rods_per_assembly_x, ExcInternalError()); + Assert (cy < rods_per_assembly_y, ExcInternalError()); + + cell->set_material_id(assembly_materials[core[ax][ay][az]][cx][cy] - 1); + } + + // With the coarse mesh so + // initialized, we create the + // appropriate number of energy + // group objects and let them + // initialize their individual + // meshes with the coarse mesh + // generated above: + energy_groups.resize (parameters.n_groups); + for (unsigned int group=0; group (group, material_data, + coarse_grid, fe); +} + + + // @sect5{NeutronDiffusionProblem::get_total_fission_source} + // + // In the eigenvalue computation, we + // need to calculate total fission + // neutron source after each power + // iteration. The total power then is + // used to renew k-effective. + // + // Since the total fission source is + // a sum over all the energy groups, + // and since each of these sums can + // be computed independently, we + // actually do this in parallel. One + // of the problems is that the + // function in the + // EnergyGroup class + // that computes the fission source + // returns a value. If we now simply + // spin off a new thread, we have to + // later capture the return value of + // the function run on that + // thread. The way this can be done + // is to use the return value of the + // Threads::spawn function, which is + // of type Threads::Thread@ + // if the function spawned returns a + // double. We can the later ask this + // object for the returned value + // (when doing so, the + // Threads::Thread@::return_value + // function first waits for the + // thread to finish). + // + // The way this function then works + // is to first spawn one thread for + // each energy group we work with, + // then one-by-one collecting the + // returned values of each thread and + // return the sum. +template +double NeutronDiffusionProblem::get_total_fission_source () const +{ + std::vector > threads; + for (unsigned int group=0; group::get_fission_source) ()); + + double fission_source = 0; + for (unsigned int group=0; groupNeutronDiffusionProblem::refine_grid} + // + // The next function lets the + // individual energy group objects + // refine their meshes. Much of this, + // again, is a task that can be done + // independently in parallel: first, + // let all the energy group objects + // calculate their error indicators + // in parallel, then compute the + // maximum error indicator over all + // energy groups and determine + // thresholds for refinement and + // coarsening of cells, and then ask + // all the energy groups to refine + // their meshes accordingly, again in + // parallel. +template +void NeutronDiffusionProblem::refine_grid () +{ + std::vector n_cells (parameters.n_groups); + for (unsigned int group=0; groupn_active_cells(); + + BlockVector group_error_indicators(n_cells); + + { + Threads::ThreadGroup<> threads; + for (unsigned int group=0; group::estimate_errors) + (group_error_indicators.block(group)); + threads.join_all (); + } + + const float max_error = group_error_indicators.linfty_norm(); + const float refine_threshold = 0.3*max_error; + const float coarsen_threshold = 0.01*max_error; + + { + Threads::ThreadGroup<> threads; + for (unsigned int group=0; group::refine_grid) + (group_error_indicators.block(group), + refine_threshold, + coarsen_threshold); + threads.join_all (); + } +} + + + // @sect5{NeutronDiffusionProblem::run} + // + // Finally, this is the function + // where the meat is: iterate on a + // sequence of meshes, and on each of + // them do a power iteration to + // compute the eigenvalue. + // + // Given the description of the + // algorithm in the introduction, + // there is actually not much to + // comment on: +template +void NeutronDiffusionProblem::run () +{ + std::cout << std::setprecision (12) << std::fixed; + + double k_eff_old = k_eff; + + Timer timer; + timer.start (); + + for (unsigned int cycle=0; cyclesolution *= k_eff; + } + + for (unsigned int group=0; groupsetup_linear_system (); + + std::cout << " Numbers of active cells: "; + for (unsigned int group=0; groupn_active_cells() + << ' '; + std::cout << std::endl; + std::cout << " Numbers of degrees of freedom: "; + for (unsigned int group=0; groupn_dofs() + << ' '; + std::cout << std::endl << std::endl; + + + Threads::ThreadGroup<> threads; + for (unsigned int group=0; group::assemble_system_matrix) + (); + threads.join_all (); + + double max_old = 0; + + // indicate this is a eigenvalue problem + unsigned int isour = 0; + // store relative error between two + // successive power iterations + double error; + + unsigned int iteration = 1; + do + { + for (unsigned int group=0; groupassemble_ingroup_rhs (ZeroFunction()); + + for (unsigned int bgroup=0; bgroupassemble_cross_group_rhs (*energy_groups[bgroup]); + + energy_groups[group]->solve (); + } + + if (isour==1) + { + double max_current = 0; + for (unsigned int group=0; groupsolution.linfty_norm()); + + energy_groups[group]->solution_old = energy_groups[group]->solution; + } + + error = fabs(max_current-max_old)/max_current; + max_old = max_current; + } + else + { + k_eff = get_total_fission_source(); + error = fabs(k_eff-k_eff_old)/fabs(k_eff); + std::cout << " Iteration " << iteration + << ": k_eff=" << k_eff + << std::endl; + k_eff_old=k_eff; + + for (unsigned int group=0; groupsolution_old = energy_groups[group]->solution; + energy_groups[group]->solution_old /= k_eff; + } + } + + ++iteration; + } + while((error > parameters.convergence_tolerance) + && + (iteration < 500)); + + for (unsigned int group=0; groupoutput_results (cycle); + + std::cout << std::endl; + std::cout << " Cycle=" << cycle + << ", n_dofs=" << energy_groups[0]->n_dofs() + energy_groups[1]->n_dofs() + << ", k_eff=" << k_eff + << ", time=" << timer() + << std::endl; + + + std::cout << std::endl << std::endl; + } +} + + + + // @sect3{The main() function} + // + // The last thing in the program in + // the main() + // function. The structure is as in + // most other tutorial programs, with + // the only exception that we here + // handle a parameter file. To this + // end, we first look at the command + // line arguments passed to this + // function: if no input file is + // specified on the command line, + // then use "project.prm", otherwise + // take the filename given as the + // first argument on the command + // line. + // + // With this, we create a + // ParameterHandler object, let the + // NeutronDiffusionProblem::Parameters + // class declare all the parameters + // it wants to see in the input file + // (or, take the default values, if + // nothing is listed in the parameter + // file), then read the input file, + // ask the parameters object to + // extract the values, and finally + // hand everything off to an object + // of type + // NeutronDiffusionProblem + // for computation of the eigenvalue: +int main (int argc, char ** argv) +{ + const unsigned int dim = 2; + + try + { + deallog.depth_console (0); + + std::string filename; + if (argc < 2) + filename = "project.prm"; + else + filename = argv[1]; + + + ParameterHandler parameter_handler; + + NeutronDiffusionProblem::Parameters parameters; + parameters.declare_parameters (parameter_handler); + + parameter_handler.read_input (filename); + + parameters.get_parameters (parameter_handler); + + + NeutronDiffusionProblem neutron_diffusion_problem (parameters); + neutron_diffusion_problem.run (); + } + catch (std::exception &exc) + { + std::cerr << std::endl << std::endl + << "----------------------------------------------------" + << std::endl; + std::cerr << "Exception on processing: " << std::endl + << exc.what() << std::endl + << "Aborting!" << std::endl + << "----------------------------------------------------" + << std::endl; + + return 1; + } + catch (...) + { + std::cerr << std::endl << std::endl + << "----------------------------------------------------" + << std::endl; + std::cerr << "Unknown exception!" << std::endl + << "Aborting!" << std::endl + << "----------------------------------------------------" + << std::endl; + return 1; + } + + return 0; +} + -- 2.39.5