All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project does not adhere to Semantic Versioning.
- A new cmake option
-DINSTALL_EXAMPLES=ONcan now be used to install the example programs from the src directory withmake install. By default this option is disable, i.e. the example programs are not installed as before. - A new function
adaptivelyProjectFunctionToGridhas been added which projects a given function to a finite element grid that it adaptively refines until the projection error is below a given threshold.
- dune-dpg now requires at least version 2.9 of the Dune core modules and has been tested to be compatible with version 2.11.
- The deprecated spaces
PQkDGRefinedDGBasis,PQkSubsampledDGNodalBasis,PQkDGSubsampledDGNodalBasis,PQkFaceNodalBasisandPQkTraceNodalBasishave been removed. Instead they should be used under their new names starting with Lagrange... .
- We now provide a guix.scm file to easily set up a build environment
with
guix shell. See INSTALL.md for more information.
- dune-dpg now requires at least version 2.7.1 of the Dune core modules and has been tested to be compatible with version 2.11.
changeGridViewnow works onNormalizedBasis,InnerProductandBilinearForm.
- refinedglobalbasis.hh still contained a fallback for the deprecated
BasisBuildernamespace, which we've renamed in 0.4 toBasisFactoryin accordance with a rename in dune-functions 2.6. This lastBasisBuildernamespace has now been removed. - When building against dune-localfunctions 2.10, the interpolate methods of dune-dpg's LocalInterpolation classes only accept functions that are callables with one argument, returning the evaluation. The old f.evaluate(x, y) interface has been removed in dune-localfunctions 2.10 and is thus not supported anymore.
- The ASTI example programs now have a -t argument that logs the runtime of the dpg solver for each iteration and direction.
- ASTI: Logging the runtime of the scattering approximation has been disabled unless the -t option has been given.
- The amount of memory allocations for evaluating local functions has been drastically reduced by re-using the std::vector that holds those local function evaluations. This lead to more than 30% of runtime reduction for the example from Felix' thesis.
- Implemented RefinedLocalView::bound() as required by the LocalView concept as of dune-functions 2.9.
- Updated URL of dune-subgrid Git repository in our documentation.
- Fixed compilation with dune-localfunction < 2.8.
- We now require a C++17-compatible compiler, e.g. GCC 7 or later.
- dune-dpg now requires at least version 2.7 of the Dune core modules and has been tested to be compatible with version 2.8.
- The
DoerflerMarkingfunction now usesstd::stable_sortinstead ofstd::sortto remove a source of potential non-determinism when there are elements with the same error estimates and only one of them gets marked. - Fix last remaining compilation warnings given by GCC 8.
- Small optimization of
intersectSubGrids: If the maxLevel of both subgrids is different, we only need to iterate until the smaller maxLevel. - ASTI: we now have one canonical definition of the test space inner product. Previously we used different definitions depending on whether we used normalized or unnormalized spaces.
- Rename all PQk... spaces to Lagrange... .
This adds the new spaces
LagrangeDGRefinedDGBasis,LagrangeSubsampledDGBasis,LagrangeDGSubsampledDGBasis,LagrangeFaceBasisandLagrangeTraceBasis. The old PQk... names of these spaces remain as deprecated typedefs. - Large parts of our code have been refactored for readability and to better adhere to modern C++ practices.
- The spaces
PQkDGRefinedDGBasis,PQkSubsampledDGNodalBasis,PQkDGSubsampledDGNodalBasis,PQkFaceNodalBasisandPQkTraceNodalBasishave been deprecated. All those spaces are now available under a name starting with Lagrange... . - When building against dune-functions >= 2.8, we do not provide any
NodeIndexSets anymore, as those were deprecated in dune-functions 2.8. Instead there is a newindicesfunction in eachPreBasis.
bindLocalIndexSetsandgetLocalIndexSetshave been removed, as IndexSets have been deprecated in dune-functions 2.6.
- Added references to Felix’ thesis and our ASTI Math. Comp. paper to the README.
- dune-dpg has been made compatible with the 2.7.0 release of the Dune core modules.
- All plotting scripts have been made compatible with Python 3.
- The dependency for dune-subgrid has been lowered to version 2.6 which should contain all the commits required by dune-dpg.
- When setting a custom output directory for the asti_* example programs, we don't append a timestamp to this directory anymore.
- The descriptions of example programs and how to run them have all been moved to doc/experiments.md.
- FindBoostHana.cmake now correctly uses the
BOOST_INCLUDEDIRvariable. It can thus find Boost::Hana now if you have a non-standard Boost include path, provided that you specify it with-DBOOST_INCLUDEDIR=…when invoking cmake. - The
OptimalTestBasisclass has been fixed. It went unnoticed for a long time, that this class didn't compile as none of our test programs is using it anymore.
- Added description of how to plot the condition number of the discrete trial to test space mapping to experiments.md.
- ASTI: use the same test inner product independent of whether we are using unnormalized or normalized spaces.
- ErrorPlotter: actually plot the error and not its square.
- Fixed plots that had the x label cut off at the bottom.
- A simpler interface to create (bi)linear forms and inner products
has been added. This tries to be less verbose than the old interface
and allows to easily use both constant coefficients and ones that
are
GridViewFunctions. You can find examples of using the new interfaces in our example programs and in the commit notes of commit a7104b565f35c735336fda764e95d68a97258b8d. - The radiative transfer code described in Felix’ thesis has been merged. You can use the example program asti_checkerboard_normalized to recreate the results in his thesis. See doc/experiments.md for more details.
- You can now normalize the basis functions in a GlobalBasis with
respect to a given inner product by using
NormalizedBasisorNormalizedRefinedBasis. DPGSystemAssemblergained a new methodapplyHomogeneousDirichletBoundarywith a simpler interface thanapplyDirichletBoundary.- A new
ConstrainedLocalViewwas added that provides the indexing methods ofConstrainedLocalIndexSetlikeDefaultLocalViewnow provides indexing methods in dune-functions 2.6. - FunctionPlotter can now be used to plot functions defined over a finite element space with local grid refinement. This is useful to plot data defined in the test search space.
- dune-dpg now requires Version 2.6 of the Dune core modules. This allowed us to remove a lot of fallback code, making our code more readable and easier to maintain.
- You can now use
GridViewFunctions as coefficients in integral terms. The quadrature order needed by a grid view function is queried by our matrix and vector assembly routines via the type traitrequiredQuadratureOrder<LocalFunction>::value. If you write your own GridViewFunction, make sure to specializerequiredQuadratureOrderfor itsLocalFunction. - Our own textbook implementation of the Cholesky decomposition has been replaced with the one implemented in Eigen which seems to be much more robust when the matrix is very badly conditioned.
- The
interpolatemethod of all localfunctions can now be called with a function object f that implementsf(x)instead of thef.evaluate(x,y)interface. This is in accordance with changes in dune-localfunctions 2.7. iterateOverLocalIndexSethas been renamed toiterateOverLocalIndices.- The
BasisBuildernamespace has been renamed toBasisFactoryin accordance with a rename in dune-functions 2.6. (Since we never use the members of this namespace, this rename will probably not affect you.)
- The
localIndexSet()method ofConstrainedGlobalBasishas been marked as deprecated.
- The workarounds for missing dune-subgrid functionality have been removed as everything is now implemented in SubGrid itself. Be sure to use at least commit 5706c70d8c4472f39e5bd61d1de1caf22381b8b9 of dune-subgrid which implements all required methods in the SubGrid class.
- The version of
make_LinearFunctionalTermwith domainOfIntegration template argument, that has been deprecated in 0.3, has been removed. - The old
ErrorTools::DoerflerMarkingfunction which could choose between two residuals and which was deprecated in 0.3 has been removed.
- New
ErrorTools::l2normfunction to compute the L_2 norm of a finite element function. - New
ErrorPlotterclass to plot error estimators. - New global bases
HangingNodeLagrangeP2BasisandHangingNodeBernsteinP2Basisimplementing P2 elements with hanging nodes. Since we only handle hanging nodes of order one, you have to make sure that neighboring cells in the grid do not vary in level by more than one. This can be assured by using dune-subgrid which by default limits the difference in level to maximally one. since dune-subgrid does not implement the whole grid interface, we defined missing functionality indune/dpg/subgrid_workarounds.hh. - Since the new hanging node bases do not fit the GlobalBasis interface
as their index set does not implement DefaultIndexSet, we introduce a
new
ConstrainedGlobalBasisinterface. Use the auxiliary functionsiterateOverLocalIndexSetandaddToGlobalMatrixto conveniently handle index sets from both interfaces. - Add a Bernstein polynomial basis under the name
BernsteinPkLocalFiniteElementwith corresponding global basesBernsteinBasis,BernsteinDGBasis,BernsteinDGRefinedDGBasisandHangingNodeBernsteinP2Basis. They can be used as a more stable replacement for the standard Lagrange basis. - New functions to save grid functions before adaptive refinement and to
restore them to the refined grid, namely
attachDataToGridandrestoreDataToRefinedGrid. - New function
BoundaryTools::getBoundaryMaskthat marks the boundary DoFs of a global basis. This works likeBoundaryTools::getInflowBoundaryMaskbut marks the complete boundary instead of only the inflow boundary and might be useful to define the boundary of an elliptical problem. - New
SkeletalLinearFunctionalTermthat can be used to implement the second alternative for handling boundary values as given in Broersen, Dahmen, Stevenson Remark 3.6. - New
SpaceTupleViewclass to use part of a tuple of spaces as a space tuple pointer. This is used e.g. in our saddle point problem example to define test and trial spaces as part of the same tuple of spaces. - New option to use a least squares solver instead of Cholesky by defining the preprocessor variable DUNE_DPG_USE_LEAST_SQUARES_INSTEAD_OF_CHOLESKY. This might help on strongly refined grids, where the Gramian in the trial to test map is so ill-conditioned that we cannot compute the Cholesky decomposition anymore. This has been observed when locally refining the unit square domain 19 times.
plot_solution.ccnow implements adaptive grid refinements. The old version on a fixed grid from v0.2.1 has been moved toplot_solution_simple.cc.
- We now require version 2.5 of the DUNE core modules and a fully C++14 compatible compiler, e.g. GCC-6. dune-dpg is fully forward-compatible to the upcoming 2.6 release of the DUNE core modules.
SystemAssembler,RhsAssembler,BilinearForm,LinearFormandInnerProductnow try to share spaces. This allows the user to update all spaces at once after refining the grid. To make this sharing of spaces possible, the interfaces of those classes now takeshared_ptrs to tuples of spaces. To create suchshared_ptrs to tuples, you can use the new functionmake_space_tuple.- the example programs plot_solution and dune_dpg_error now require dune-subgrid to compile as they use the new hanging node bases for the trace variables now.
BoundaryTools::getInflowBoundaryValuehas been renamed toBoundaryTools::getBoundaryValueas it also works for other boundary values. Additionally, it now takes a single boundary value function instead of a tuple of functions. SincegetBoundaryValuetakes only a single FE space, it didn’t make any sense to pass multiple boundary value functions to it.- Replace all usage of Boost::Fusion and MPL with C++14 metaprogramming. In many places we now use functions from dune/common/hybridutilities.hh or dune/common/tupleutility.hh instead. In the remaining places, where we needed to do some more complicated type computations, we now use Boost Hana. Thus our Boost dependency has been increased to Boost 1.63 or newer.
- ErrorTools: The element-wise operations are now marked as private.
- ErrorTools: Mark all methods as static. In the future, we might make ErrorTools a namespace instead of a class.
ErrorToolsandBoundaryToolsare not constructible anymore.ErrorTools::DoerflerMarkingcan now be called asDoerflerMarking(grid, ratio, errorEstimates)whereerrorEstimatesis astd::vector<std::tuple<EntitySeed, double>>&&where each entry gives the seed of an element and its squared error estimate. You can use Dörfler marking with your own error estimators or use the functionErrorTools::squaredCellwiseResidualto compute the error estimates.ErrorTools::computeL2errornow takes the exact solution directly instead of having it wrapped in astd::tuple.LinearFunctionalTermnow also works with a refined solution space.- We now check in a static_assert that
defineCharacteristicFacesis not called with refined spaces. - Using DUNE 2.6 will use the more efficient
indicesinterface which was recently added to dune-functions. This should give faster access to global indices, especially if you are using theOptimalTestBasisclass. - The boundaryValue argument of the
applyDirichletBoundaryToMatrixmethod of DPGAssembler and SaddlepointAssembler has been removed as it was never used in this method. - README, INSTALL: Mention dune-uggrid instead of ug.
- Remove some noise from the API documentation and add some more documentation for previously undocumented things.
ReferenceRefinementCachenow gets shared between refined spaces.- INSTALL.md: Improve documentation of non-standard search paths.
BoundaryTools::getBoundaryValuewas mixing up local and global functions, thus giving wrong results. This has now been fixed.- The computation of
unitOuterNormalon faces of refined finite elements was wrong and has been fixed. - Fix wrong indices when using
LinearFunctionalTermwith more than one test space. - Fix indices in
IntegralTermandLinearFunctionalTermwhen both spaces are refined. - Fix a bug in the computation of
splitPointused in the travel distance weighted inner product. This bug might have manifested in your code by throwing an error from the Cholesky solver that said that the matrix is not symmetrical positive definite.
- The old
ErrorTools::DoerflerMarkingfunction which could choose between two residual has been deprecated. Instead use the new function described in the Changed section. There is now a functionErrorTools::squaredCellwiseResidual(...)that computes the squared residual from the oldDoerflerMarkingfunction. Thus you can replace your old function call withErrorTools::DoerflerMarking(grid, ratio, ErrorTools::squaredCellwiseResidual(...)).
- Remove the
make_DPGLinearForm,make_DPG_LinearFormandmake_Saddlepoint_LinearFormfunctions, usemake_LinearForminstead. - Remove the
refinedReferenceElementmethod of refined global basis nodes. As a replacement, a new methodrefinedReferenceElementGridViewhas been added that directly returns the leafGridView. - Remove the
updatemethod fromBufferedTestspaceCoefficientMatrixandUnbufferedTestspaceCoefficientMatrix. - Remove the
clonemethod from all local bases. This method was never used and has been removed from all the local bases in dune-localfunctions 2.6. - Make the auxiliary class
computeIndexa private member. This should have never been a part of the public dune-dpg API. - Remove
PQkTransportBasisandTransportQuadratureRule. Our code did not work with this basis for a long time so obviously nobody was using it. This allowed us to simplify the internalChooseQuadratureinterface. - Remove some unused auxiliary types.
- Lower Boost requirements to 1.56 and document that 1.60 and 1.61 cause compilation errors.
- Fix compilation with GCC 6.
- Improve the INSTALL instructions:
- Fix instructions for MacOS.
- Fix URL for UG 3.12.1.
- Describe how to use Boost 1.59 from a non-standard include path.
- Add the possibility to cache the test space coefficient matrices with the newly introduced GeometryBuffer class when using a uniform grid and constant coefficients.
- Add LinearForm to better describe the rhs functions. This allows more easily to modify the rhs than the previous tuple of functions.
- Implement the travel distance weighted inner product from Broersen, Dahmen and Stevenson, 2015.
- Add a function to do adaptive grid refinements with Dörfler marking. This is not used in our examples yet. See function DoerflerMarking in dune/dpg/errortools.hh
- Add new aposteriori error indicator ||u-lifting(theta)||_L_2^2 + conforming residual(lifting(theta))^2 used by Broersen, Dahmen and Stevenson.
- New replaceTestSpaces function to easily create BilinearForm, InnerProduct and LinearForm for computation of a posteriori errors.
- scripts/run_convergence_test.sh now takes a list of grid resolutions as argument.
- Add .editorconfig to define indentations, etc (see http://editorconfig.org for more information)
- Split SystemAssembler into DPGSystemAssembler and SaddlepointSystemAssembler.
- Compute near optimal test spaces like in Roberts 2014. This gives a significant speedup and simplifies the interface of make_DPGSystemAssembler.
- Add new test program to profile the runtime difference between buffered and unbuffered test space coefficient matrices.
- CMake now complains if Boost Fusion is older than 1.59.
- Bump CMake dependency to 2.8.12 to be compatible with latest Dune requirements.
- Remove now unused template parameter FormulationType from BilinearForm.
- Add dummy implementation for partial() in local bases for newer versions of dune-localfunctions.
- Improve documentation in INSTALL and README.
- Completely rewritten build instructions can now be found in INSTALL.
- Describe the example programs more detailedly in README.
- plot_solution gained additional parameters c, betaX and betaY that are used to specify the parameters of the transport problem to solve.
- Renamed variables in plot_solution to be compatible with the paper.
- Boost Fusion is now marked as a required dependency and will not appear under unfound packages in cmake.
- Don’t try to install the removed header pqksubsamplednodalbasis.hh.
- Fixed remaining pedantic warnings (except for the deprecation warnings generated by dune-grid which are out of our control).
- dune-dpg has been made compatible with Dune 2.4.1.
- The definition of BOOST_FUSION_INVOKE_PROCEDURE_MAX_ARITY has been moved to config.h.cmake.
- Consistently name tuples of spaces, localViews etc. with plural s to distinguish them from single objects.
- A bug in the computation of the right hand side for refined test spaces has been fixed. This also fixed the wrong results we were getting from the a posteriori estimator when using refined a posteriori test spaces.
- Added some missing #includes and removed unused ones.
- Fixed a lot of pedantic warnings like signed–unsigned comparison and unused variables.
- initial release, compatible with Dune 2.4.0