[cig-commits] commit 1968 by bangerth to /var/svn/dealii/aspect
dealii.demon at gmail.com
dealii.demon at gmail.com
Wed Oct 16 09:09:14 PDT 2013
Revision 1968
Add the beginning of a testsuite.
A trunk/aspire/tests/CMakeLists.txt
D trunk/aspire/tests/Makefile
A trunk/aspire/tests/run_test.cmake
A trunk/aspire/tests/simple_1/
A trunk/aspire/tests/simple_1/screen-output
A trunk/aspire/tests/simple_1.prm
A trunk/aspire/tests/simple_2/
A trunk/aspire/tests/simple_2/screen-output
A trunk/aspire/tests/simple_2.prm
A trunk/aspire/tests/simple_3/
A trunk/aspire/tests/simple_3/screen-output
A trunk/aspire/tests/simple_3.prm
http://www.dealii.org/websvn/revision.php?repname=Aspect+Repository&path=%2F&rev=1968&peg=1968
Diff:
Copied: trunk/aspire/tests/CMakeLists.txt (from rev 1963, trunk/aspect/tests/CMakeLists.txt)
===================================================================
--- trunk/aspire/tests/CMakeLists.txt (rev 0)
+++ trunk/aspire/tests/CMakeLists.txt 2013-10-16 16:08:59 UTC (rev 1968)
@@ -0,0 +1,107 @@
+################### top matter ################
+FIND_PACKAGE(Perl)
+
+MACRO(SET_IF_EMPTY _variable _value)
+ IF("${${_variable}}" STREQUAL "")
+ SET(${_variable} ${_value})
+ ENDIF()
+ENDMACRO()
+
+############################3
+
+ADD_CUSTOM_TARGET(tests)
+
+SET_IF_EMPTY(DEAL_II_DIFF "$ENV{DEAL_II_DIFF}")
+SET_IF_EMPTY(DEAL_II_DIFF "numdiff -a 1e-6 -q -s \" \t\n:\"")
+
+
+FILE(GLOB _tests *.prm)
+FOREACH(_test ${_tests})
+ GET_FILENAME_COMPONENT(_test ${_test} NAME_WE)
+ MESSAGE(STATUS "Adding test ${_test}")
+
+ IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_test}.cc)
+ ADD_LIBRARY(${_test} SHARED EXCLUDE_FROM_ALL ${_test}.cc)
+ DEAL_II_SETUP_TARGET(${_test})
+ SET(_testdepends ${_test})
+ ELSE()
+ SET(_testdepends)
+ ENDIF()
+
+ FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/output-${_test})
+ ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/screen-output
+ COMMAND aspire ${CMAKE_CURRENT_SOURCE_DIR}/${_test}.prm
+ > ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/screen-output
+ COMMAND ${PERL_EXECUTABLE} -pi
+ ${CMAKE_CURRENT_SOURCE_DIR}/normalize.pl
+ ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/*
+ DEPENDS aspire ${CMAKE_CURRENT_SOURCE_DIR}/${_test}.prm ${_testdepends}
+ )
+
+ ADD_CUSTOM_TARGET(${_test}.run
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/screen-output
+ )
+
+
+ ADD_CUSTOM_TARGET(tests.${_test})
+
+
+ # for each of the output files saved in the source directory for
+ # this test, create targets that
+ # - create a 'output.notime' file
+ # - diff this file with the saved one and save the result
+ FILE(GLOB _outputs ${CMAKE_CURRENT_SOURCE_DIR}/${_test}/[a-zA-Z0-9]*)
+ FOREACH(_output ${_outputs})
+ GET_FILENAME_COMPONENT(_output ${_output} NAME)
+
+ # create the output.notime target
+ ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.notime
+ COMMAND
+ cat ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}
+ | egrep -v '^\|'
+ > ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.notime
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/screen-output
+ )
+
+ # create the target that compares the .notime with the saved file
+ ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.diff
+ COMMAND
+ if (diff ${CMAKE_CURRENT_SOURCE_DIR}/${_test}/${_output}
+ ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.notime
+ > ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.diff) \; then
+ : \;
+ else
+ mv ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.diff
+ ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.diff.failed \;
+ echo "******* Error during diffing output results for ${_test}/${_output}" \;
+ echo "******* Results are stored in ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.diff.failed" \;
+ echo "******* Diffs are:" \;
+ cat ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.diff.failed \;
+ false \;
+ fi
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_test}/${_output}
+ ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.notime
+ )
+
+ # add the target for this output file to the dependencies of this test
+ ADD_CUSTOM_TARGET(${_test}.${_output}.diff
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/output-${_test}/${_output}.diff
+ )
+ ADD_DEPENDENCIES(tests.${_test}
+ ${_test}.${_output}.diff)
+ ENDFOREACH()
+
+ # add this test to the dependencies of the overall 'tests' target
+ # and declare it to ctest
+ ADD_DEPENDENCIES(tests tests.${_test})
+ ADD_TEST(NAME ${_test}
+ COMMAND
+ ${CMAKE_COMMAND}
+ -DBINARY_DIR=${CMAKE_BINARY_DIR}
+ -DTESTNAME=tests.${_test}
+ -DERROR="Test ${_test} failed"
+ -P ${CMAKE_SOURCE_DIR}/tests/run_test.cmake
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ )
+ENDFOREACH()
+
Copied: trunk/aspire/tests/run_test.cmake (from rev 1963, trunk/aspect/tests/run_test.cmake)
===================================================================
--- trunk/aspire/tests/run_test.cmake (rev 0)
+++ trunk/aspire/tests/run_test.cmake 2013-10-16 16:08:59 UTC (rev 1968)
@@ -0,0 +1,15 @@
+EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND}
+ --build ${BINARY_DIR} --target ${TESTNAME}
+ RESULT_VARIABLE _result_code
+ OUTPUT_VARIABLE _output
+ )
+
+IF("${_result_code}" STREQUAL "0")
+ MESSAGE("${TESTNAME}: success.")
+
+ELSE()
+
+ MESSAGE("*** ${ERROR}: ***")
+ MESSAGE(${_output})
+ MESSAGE(FATAL_ERROR "*** Test aborted.")
+ENDIF()
Added: trunk/aspire/tests/simple_1/screen-output
===================================================================
Added: trunk/aspire/tests/simple_1.prm
===================================================================
--- trunk/aspire/tests/simple_1.prm (rev 0)
+++ trunk/aspire/tests/simple_1.prm 2013-10-16 16:08:59 UTC (rev 1968)
@@ -0,0 +1,1050 @@
+# Listing of Parameters
+# ---------------------
+# A list of names of additional shared libraries that should be loaded upon
+# starting up the program. The names of these files can contain absolute or
+# relative paths (relative to the directory in which you call ASPECT). In
+# fact, file names that are do not contain any directory information (i.e.,
+# only the name of a file such as <myplugin.so> will not be found if they are
+# not located in one of the directories listed in the LD_LIBRARY_PATH
+# environment variable. In order to load a library in the current directory,
+# use <./myplugin.so> instead.
+#
+# The typical use of this parameter is to so that you can implement additional
+# plugins in your own directories, rather than in the ASPECT source
+# directories. You can then simply compile these plugins into a shared library
+# without having to re-compile all of ASPECT. See the section of the manual
+# discussing writing extensions for more information on how to compile
+# additional files into a shared library.
+set Additional shared libraries =
+
+# In computations, the time step $k$ is chosen according to $k = c \min_K
+# rac{h_K}{\|u\|_{\infty,K} p_T}$ where $h_K$ is the diameter of cell $K$,
+# and the denominator is the maximal magnitude of the velocity on cell $K$
+# times the polynomial degree $p_T$ of the temperature discretization. The
+# dimensionless constant $c$ is called the CFL number in this program. For
+# time discretizations that have explicit components, $c$ must be less than a
+# constant that depends on the details of the time discretization and that is
+# no larger than one. On the other hand, for implicit discretizations such as
+# the one chosen here, one can choose the time step as large as one wants (in
+# particular, one can choose $c>1$) though a CFL number significantly larger
+# than one will yield rather diffusive solutions. Units: None.
+set CFL number = 1.0
+
+# The relative tolerance up to which the linear system for the composition
+# system gets solved. See 'linear solver tolerance' for more details.
+set Composition solver tolerance = 1e-12
+
+# The number of space dimensions you want to run this program in. ASPECT can
+# run in 2 and 3 space dimensions.
+set Dimension = 2
+
+# The end time of the simulation. Units: seconds
+set End time = 800 # default: 1e300
+
+# A relative tolerance up to which the linear Stokes systems in each time or
+# nonlinear step should be solved. The absolute tolerance will then be the
+# norm of the right hand side of the equation times this tolerance. A given
+# tolerance value of 1 would mean that a zero solution vector is an acceptable
+# solution since in that case the norm of the residual of the linear system
+# equals the norm of the right hand side. A given tolerance of 0 would mean
+# that the linear system has to be solved exactly, since this is the only way
+# to obtain a zero residual.
+#
+# In practice, you should choose the value of this parameter to be so that if
+# you make it smaller the results of your simulation do not change any more
+# (qualitatively) whereas if you make it larger, they do. For most cases, the
+# default value should be sufficient. However, for cases where the static
+# pressure is much larger than the dynamic one, it may be necessary to choose
+# a smaller value.
+set Linear solver tolerance = 1e-7
+
+# The kind of scheme used to resolve the nonlinearity in the system.
+set Nonlinear solver scheme = IMPES
+
+# As explained in the ASPECT paper (Kronbichler, Heister, and Bangerth, GJI
+# 2012) we first try to solve the Stokes system in every time step using a
+# GMRES iteration with a poor but cheap preconditioner. By default, we try
+# whether we can converge the GMRES solver in 30 such iterations before
+# deciding that we need a better preconditioner. This is sufficient for simple
+# problems with constant viscosity and we never need the second phase with the
+# more expensive preconditioner. On the other hand, for more complex problems,
+# and in particular for problems with strongly varying viscosity, the 30 cheap
+# iterations don't actually do very much good and one might skip this part
+# right away. In that case, this parameter can be set to zero, i.e., we
+# immediately start with the better but more expensive preconditioner.
+set Number of cheap Stokes solver steps = 0 # default: 30
+
+# The name of the directory into which all output files should be placed. This
+# may be an absolute or a relative path.
+set Output directory = output
+
+# A flag indicating whether the computation should be resumed from a
+# previously saved state (if true) or start from scratch (if false).
+set Resume computation = false
+
+# The start time of the simulation. Units: years if the 'Use years in output
+# instead of seconds' parameter is set; seconds otherwise.
+set Start time = 0
+
+# The mathematical equations that describe thermal convection only determine
+# the pressure up to an arbitrary constant. On the other hand, for comparison
+# and for looking up material parameters it is important that the pressure be
+# normalized somehow. We do this by enforcing a particular average pressure
+# value at the surface of the domain, where the geometry model determines
+# where the surface is. This parameter describes what this average surface
+# pressure value is supposed to be. By default, it is set to zero, but one may
+# want to choose a different value for example for simulating only the volume
+# of the mantle below the lithosphere, in which case the surface pressure
+# should be the lithostatic pressure at the bottom of the lithosphere.
+# For more information, see the section in the manual that discusses the
+# general mathematical model.
+set Surface pressure = 0
+
+# The relative tolerance up to which the linear system for the temperature
+# system gets solved. See 'linear solver tolerance' for more details.
+set Temperature solver tolerance = 1e-12
+
+# The size of the time step of the simulation.
+set Time step = 1e-1 # default: 1.0
+
+# How frequently in timesteps to output timing information. This is generally
+# adjusted only for debugging and timing purposes.
+set Timing output frequency = 100
+
+# Mantle convection simulations are often focused on convection dominated
+# systems. However, these codes can also be used to investigate systems where
+# heat conduction plays a dominant role. This parameter indicates whether the
+# simulator should also use heat conduction in determining the length of each
+# time step.
+set Use conduction timestep = false
+
+
+subsection Boundary compositional model
+ subsection Function
+ # Sometimes it is convenient to use symbolic constants in the expression
+ # that describes the function, rather than having to use its numeric value
+ # everywhere the constant appears. These values can be defined using this
+ # parameter, in the form `var1=value1, var2=value2, ...'.
+ #
+ # A typical example would be to set this runtime parameter to
+ # `pi=3.1415926536' and then use `pi' in the expression of the actual
+ # formula. (That said, for convenience this class actually defines both
+ # `pi' and `Pi' by default, but you get the idea.)
+ set Function constants =
+
+ # The formula that denotes the function you want to evaluate for
+ # particular values of the independent variables. This expression may
+ # contain any of the usual operations such as addition or multiplication,
+ # as well as all of the common functions such as `sin' or `cos'. In
+ # addition, it may contain expressions like `if(x>0, 1, -1)' where the
+ # expression evaluates to the second argument if the first argument is
+ # true, and to the third argument otherwise. For a full overview of
+ # possible expressions accepted see the documentation of the fparser
+ # library.
+ #
+ # If the function you are describing represents a vector-valued function
+ # with multiple components, then separate the expressions for individual
+ # components by a semicolon.
+ set Function expression = 0; 0
+
+ # The name of the variables as they will be used in the function,
+ # separated by commas. By default, the names of variables at which the
+ # function will be evaluated is `x' (in 1d), `x,y' (in 2d) or `x,y,z' (in
+ # 3d) for spatial coordinates and `t' for time. You can then use these
+ # variable names in your function expression and they will be replaced by
+ # the values of these variables at which the function is currently
+ # evaluated. However, you can also choose a different set of names for the
+ # independent variables at which to evaluate your function expression. For
+ # example, if you work in spherical coordinates, you may wish to set this
+ # input parameter to `r,phi,theta,t' and then use these variable names in
+ # your function expression.
+ set Variable names = x,y,t
+ end
+
+end
+
+
+subsection Boundary temperature model
+ # Select one of the following models:
+ #
+ # `constant': Implementation of a model in which the boundary temperature
+ # values are constant throughout the whole boundary.
+ #
+ # `box': A model in which the temperature is chosen constant on all the
+ # sides of a box.
+ #
+ # `function': Implementation of a model in which the boundary temperature
+ # values are given by a function.
+ set Model name = constant # default:
+
+
+ subsection Box
+ # Temperature at the bottom boundary (at minimal z-value). Units: K.
+ set Bottom temperature = 0
+
+ # Temperature at the left boundary (at minimal x-value). Units: K.
+ set Left temperature = 1
+
+ # Temperature at the right boundary (at maximal x-value). Units: K.
+ set Right temperature = 0
+
+ # Temperature at the top boundary (at maximal x-value). Units: K.
+ set Top temperature = 0
+ end
+
+ subsection Constant
+ # Constant temperature value.
+ set Temperature = 300
+ end
+
+ subsection Function
+ # Sometimes it is convenient to use symbolic constants in the expression
+ # that describes the function, rather than having to use its numeric value
+ # everywhere the constant appears. These values can be defined using this
+ # parameter, in the form `var1=value1, var2=value2, ...'.
+ #
+ # A typical example would be to set this runtime parameter to
+ # `pi=3.1415926536' and then use `pi' in the expression of the actual
+ # formula. (That said, for convenience this class actually defines both
+ # `pi' and `Pi' by default, but you get the idea.)
+ set Function constants =
+
+ # The formula that denotes the function you want to evaluate for
+ # particular values of the independent variables. This expression may
+ # contain any of the usual operations such as addition or multiplication,
+ # as well as all of the common functions such as `sin' or `cos'. In
+ # addition, it may contain expressions like `if(x>0, 1, -1)' where the
+ # expression evaluates to the second argument if the first argument is
+ # true, and to the third argument otherwise. For a full overview of
+ # possible expressions accepted see the documentation of the fparser
+ # library.
+ #
+ # If the function you are describing represents a vector-valued function
+ # with multiple components, then separate the expressions for individual
+ # components by a semicolon.
+ set Function expression = 0
+
+ # The name of the variables as they will be used in the function,
+ # separated by commas. By default, the names of variables at which the
+ # function will be evaluated is `x' (in 1d), `x,y' (in 2d) or `x,y,z' (in
+ # 3d) for spatial coordinates and `t' for time. You can then use these
+ # variable names in your function expression and they will be replaced by
+ # the values of these variables at which the function is currently
+ # evaluated. However, you can also choose a different set of names for the
+ # independent variables at which to evaluate your function expression. For
+ # example, if you work in spherical coordinates, you may wish to set this
+ # input parameter to `r,phi,theta,t' and then use these variable names in
+ # your function expression.
+ set Variable names = x,y,t
+
+ # minimum temperature on the boundary
+ set min =
+ end
+
+end
+
+
+subsection Boundary velocity model
+ subsection Axisymmetric jetflow apparatus
+ # Uniform coflow $U_c$. Units: $m/s$.
+ set Uniform flow = 1
+ end
+
+ subsection Function
+ # Sometimes it is convenient to use symbolic constants in the expression
+ # that describes the function, rather than having to use its numeric value
+ # everywhere the constant appears. These values can be defined using this
+ # parameter, in the form `var1=value1, var2=value2, ...'.
+ #
+ # A typical example would be to set this runtime parameter to
+ # `pi=3.1415926536' and then use `pi' in the expression of the actual
+ # formula. (That said, for convenience this class actually defines both
+ # `pi' and `Pi' by default, but you get the idea.)
+ set Function constants =
+
+ # The formula that denotes the function you want to evaluate for
+ # particular values of the independent variables. This expression may
+ # contain any of the usual operations such as addition or multiplication,
+ # as well as all of the common functions such as `sin' or `cos'. In
+ # addition, it may contain expressions like `if(x>0, 1, -1)' where the
+ # expression evaluates to the second argument if the first argument is
+ # true, and to the third argument otherwise. For a full overview of
+ # possible expressions accepted see the documentation of the fparser
+ # library.
+ #
+ # If the function you are describing represents a vector-valued function
+ # with multiple components, then separate the expressions for individual
+ # components by a semicolon.
+ set Function expression = 0; 0
+
+ # The name of the variables as they will be used in the function,
+ # separated by commas. By default, the names of variables at which the
+ # function will be evaluated is `x' (in 1d), `x,y' (in 2d) or `x,y,z' (in
+ # 3d) for spatial coordinates and `t' for time. You can then use these
+ # variable names in your function expression and they will be replaced by
+ # the values of these variables at which the function is currently
+ # evaluated. However, you can also choose a different set of names for the
+ # independent variables at which to evaluate your function expression. For
+ # example, if you work in spherical coordinates, you may wish to set this
+ # input parameter to `r,phi,theta,t' and then use these variable names in
+ # your function expression.
+ set Variable names = x,y,t
+ end
+
+end
+
+
+subsection Checkpointing
+ # The number of timesteps between performing checkpoints. If 0 and time
+ # between checkpoint is not specified, checkpointing will not be performed.
+ # Units: None.
+ set Steps between checkpoint = 0
+
+ # The wall time between performing checkpoints. If 0, will use the
+ # checkpoint step frequency instead. Units: Seconds.
+ set Time between checkpoint = 0
+end
+
+
+subsection Compositional fields
+ # A list of integers smaller than or equal to the number of compositional
+ # fields. All compositional fields in this list will be normalized before
+ # the first timestep. The normalization is implemented in the following way:
+ # First, the sum of the fields to be normalized is calculated at every point
+ # and the global maximum is determined. Second, the compositional fields to
+ # be normalized are divided by this maximum.
+ set List of normalized fields =
+
+ # The number of fields that will be advected along with the flow field,
+ # excluding velocity, pressure and temperature.
+ set Number of fields = 3 # default: 0
+end
+
+
+subsection Compositional initial conditions
+ # Select one of the following models:
+ #
+ # `function': Composition is given in terms of an explicit formula
+ set Model name = function
+
+
+ subsection Function
+ # Sometimes it is convenient to use symbolic constants in the expression
+ # that describes the function, rather than having to use its numeric value
+ # everywhere the constant appears. These values can be defined using this
+ # parameter, in the form `var1=value1, var2=value2, ...'.
+ #
+ # A typical example would be to set this runtime parameter to
+ # `pi=3.1415926536' and then use `pi' in the expression of the actual
+ # formula. (That said, for convenience this class actually defines both
+ # `pi' and `Pi' by default, but you get the idea.)
+ set Function constants =
+
+ # The formula that denotes the function you want to evaluate for
+ # particular values of the independent variables. This expression may
+ # contain any of the usual operations such as addition or multiplication,
+ # as well as all of the common functions such as `sin' or `cos'. In
+ # addition, it may contain expressions like `if(x>0, 1, -1)' where the
+ # expression evaluates to the second argument if the first argument is
+ # true, and to the third argument otherwise. For a full overview of
+ # possible expressions accepted see the documentation of the fparser
+ # library.
+ #
+ # If the function you are describing represents a vector-valued function
+ # with multiple components, then separate the expressions for individual
+ # components by a semicolon.
+ set Function expression = 0.5; 0.5; 0 # default: 0
+
+ # The name of the variables as they will be used in the function,
+ # separated by commas. By default, the names of variables at which the
+ # function will be evaluated is `x' (in 1d), `x,y' (in 2d) or `x,y,z' (in
+ # 3d) for spatial coordinates and `t' for time. You can then use these
+ # variable names in your function expression and they will be replaced by
+ # the values of these variables at which the function is currently
+ # evaluated. However, you can also choose a different set of names for the
+ # independent variables at which to evaluate your function expression. For
+ # example, if you work in spherical coordinates, you may wish to set this
+ # input parameter to `r,phi,theta,t' and then use these variable names in
+ # your function expression.
+ set Variable names = x,y,t
+ end
+
+end
+
+
+subsection Discretization
+ # The polynomial degree to use for the advection variables. Units: None.
+ set Advection polynomial degree = 2
+
+ # The polynomial degree to use for the velocity variables in the Stokes
+ # system. The polynomial degree for the pressure variable will then be one
+ # less in order to make the velocity/pressure pair conform with the usual
+ # LBB (Babuska-Brezzi) condition. In other words, we are using a Taylor-Hood
+ # element for the Stoeks equations and this parameter indicates the
+ # polynomial degree of it. Units: None.
+ set Stokes velocity polynomial degree = 2
+
+ # Set to true if the problem is axisymmetric and the flow in it should be
+ # solved in an $r,z$ coordinate system rather than the usual x,y coordinate
+ # system. This obviously only makes sense if we are in dimension 2.
+ set Use axisymmetric discretization = false
+
+ # Whether to use a Stokes discretization that is locally conservative at the
+ # expense of a larger number of degrees of freedom (true), or to go with a
+ # cheaper discretization that does not locally conserve mass, although it is
+ # globally conservative (false).
+ #
+ # When using a locally conservative discretization, the finite element space
+ # for the pressure is discontinuous between cells and is the polynomial
+ # space $P_{-q}$ of polynomials of degree $q$ in each variable separately.
+ # Here, $q$ is one less than the value given in the parameter ``Stokes
+ # velocity polynomial degree''. As a consequence of choosing this element,
+ # it can be shown if the medium is considered incompressible that the
+ # computed discrete velocity field $\mathbf u_h$ satisfies the property
+ # $\int_{\partial K} \mathbf u_h
More information about the CIG-COMMITS
mailing list