1639 lines
78 KiB
Plaintext
1639 lines
78 KiB
Plaintext
Finite Element Discretization Library
|
||
__
|
||
_ __ ___ / _| ___ _ __ ___
|
||
| '_ ` _ \ | |_ / _ \| '_ ` _ \
|
||
| | | | | || _|| __/| | | | | |
|
||
|_| |_| |_||_| \___||_| |_| |_|
|
||
|
||
http://mfem.org
|
||
|
||
|
||
Version 4.1.1 (development)
|
||
===========================
|
||
|
||
Meshing improvements
|
||
--------------------
|
||
- The graph linear ordering library Gecko, previously an external dependency, is
|
||
now included directly in MFEM. As a result, Mesh::GetGeckoElementOrdering is
|
||
always available. The interface has also been improved, see for example the
|
||
mesh-explorer miniapp.
|
||
|
||
- Added support for finite difference-based gradient and Hessian approximation
|
||
in the TMOP mesh optimization algorithms. This improves the accuracy of the
|
||
Hessian for r-adaptivity using discrete fields, and allows use of skewness
|
||
and orientation based metrics.
|
||
|
||
- Added support for r-adaptivity with more than one discrete field. This allows
|
||
the user to specify different discrete functions for controlling the
|
||
size, aspect-ratio, orientation, and skew of elements in the mesh.
|
||
|
||
- Added TMOP capability for approximate tangential mesh relaxation.
|
||
|
||
- Added support for reading periodic meshes in Gmsh format (version 2.2). See
|
||
for example the periodic-annulus-sector and periodic-torus-sector files in
|
||
the data directory.
|
||
|
||
Performance improvements
|
||
------------------------
|
||
- Added support for explicit vectorization in the high-performance templated
|
||
code, which can now take advantage of specific intrinsics classes on the
|
||
following architectures:
|
||
- x86 (SSE/AVX/AVX2/AVX512),
|
||
- Power8 & Power9 (VSX),
|
||
- BG/Q (QPX).
|
||
These are now enabled by default, and can be disabled with MFEM_USE_SIMD=NO.
|
||
See the new file linalg/simd.hpp and the new directory linalg/simd.
|
||
|
||
Improved GPU capabilities
|
||
-------------------------
|
||
- Added support for Chebyshev accelerated polynomial smoother on GPU.
|
||
|
||
Discretization improvements
|
||
---------------------------
|
||
- Added support for matrix-free interpolation and restriction operators between
|
||
continuous H1 finite element spaces of different order on the same mesh or
|
||
with the same order on uniformly refined meshes.
|
||
|
||
- Added support for simplices in GSLIB-FindPoints.
|
||
|
||
- Added support for H1 and L2 element matrix assembly in the mass, convection,
|
||
diffusion, transpose, and the face DG trace integrators. This is compatible
|
||
with GPU device execution and is illustrated in Example 9/9p, see the option
|
||
'-ea'. When enabled, this level of assembly stores independent dense matrices
|
||
for the elements, and independent dense matrices for the faces in the DG case.
|
||
|
||
- Added new partial assembly kernels for H(div) bilinear forms, as well as
|
||
VectorFEDivergenceIntegrator.
|
||
|
||
- Improved the documentation of the GridFunction GetValue and GetVectorValue
|
||
methods. Expanded the GetValue and GetVectorValue methods which accept an
|
||
ElementTransformation argument to support evaluation on boundary elements
|
||
and, in the continuous field case, arbitrary mesh edges and faces.
|
||
|
||
- Added new coefficient and vector coefficient classes for QuadratureFunctions.
|
||
Additionaly, new LinearForm integrators were also added which make use of
|
||
these new QuadratureFunction coefficient classes.
|
||
|
||
Linear and nonlinear solvers
|
||
----------------------------
|
||
- Added power method to iteratively estimate the largest eigenvalue and the
|
||
corresponding eigenvector of an operator.
|
||
|
||
- Added initial support for h- and p-multigrid solvers and preconditioners for
|
||
matrix-based and matrix-free discretizations with basic GPU capability.
|
||
|
||
- Added a new IterativeSolverMonitor class that allows to monitor the residual
|
||
and solution during the solving process of an IterativeSolver after every
|
||
iteration.
|
||
|
||
- Block arrays of parallel matrices can now be merged into a single parallel
|
||
matrix with the function HypreParMatrixFromBlocks. This could be useful for
|
||
solving block systems with parallel direct solvers such as STRUMPACK.
|
||
|
||
- In SLISolver, changed the residual inner product from (Br,r) to (Br,Br) so the
|
||
solver can work with non-SPD preconditioner B.
|
||
|
||
New and updated examples and miniapps
|
||
-------------------------------------
|
||
- Added a new example, Example 25/25p, to demonstrate the use of a Perfectly
|
||
Matched Layer (PML) for the simulation of electromagnetic wave propagation.
|
||
The example defines and solves several indefinite Maxwell problems.
|
||
|
||
- Added a new Example 26/26p to demonstrate the construction of a matrix-free
|
||
geometric and p-multigrid preconditioner for the Laplace problem.
|
||
|
||
- Added a new example, Example 27/27p, to demonstrate the enforcement of
|
||
various boundary conditions with the Laplace operator. The example shows the
|
||
procedures for applying Dirichlet, Neumann (both homogeneous and
|
||
inhomogeneous), Robin, and periodic boundary conditions with either H1 or DG
|
||
discretizations.
|
||
|
||
- Added a simple meshing miniapp, Twist, which demonstrates MFEM's strategy of
|
||
stitching together opposite surfaces of a mesh to create a topologically
|
||
periodic mesh.
|
||
|
||
- Added a new meshing miniapp, Minimal Surface, which solves Plateau's problem:
|
||
the Dirichlet problem for the minimal surface equation.
|
||
|
||
- Added partial assembly support to examples 4/4p and 5/5p, with diagonal
|
||
preconditioning.
|
||
|
||
- Added a new test problem in example 24/24p, demonstrating a mixed bilinear
|
||
form for H(div) and L_2, with partial assembly support.
|
||
|
||
Improved testing
|
||
----------------
|
||
- Added a GitLab pipeline that automates PR testing on supercomputing systems
|
||
and Linux clusters at Lawrence Livermore National Lab (LLNL). This can be
|
||
triggered only by LLNL developers, see .gitlab-ci.yml, the .gitlab directory
|
||
and the updated CONTRIBUTING.md file.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added support for ADIOS2 for parallel I/O with ParaView visualization. The
|
||
classes adios2stream and ADIOS2DataCollection are introduced in mfem as the
|
||
interfaces to generate ADIOS2 Binary Pack (BP4) directory datasets for the
|
||
entire spatial and temporal data. In addition, ADIOS2 allows for setting a
|
||
user-defined number of data substreams/subfiles. See examples 5, 9, 12, 16.
|
||
|
||
- The integration order used in the ComputeLpError and ComputeElementLpError
|
||
methods of class GridFunction has been increased.
|
||
|
||
- Various other simplifications, extensions, and bugfixes in the code.
|
||
|
||
|
||
Version 4.1, released on March 10, 2020
|
||
=======================================
|
||
|
||
Starting with this version, the MFEM open source license is changed to BSD-3.
|
||
|
||
Improved GPU capabilities
|
||
-------------------------
|
||
- Added initial support for AMD GPUs based on HIP: a C++ runtime API and kernel
|
||
language that can run on both AMD and NVIDIA hardware.
|
||
|
||
- Added support for Umpire, a resource management library that allows the
|
||
discovery, provision, and management of memory on machines with multiple
|
||
memory devices like NUMA and GPUs, see https://github.com/LLNL/Umpire.
|
||
|
||
- GPU acceleration is now available in 3 additional examples: 3, 9 and 24.
|
||
|
||
- Improved RAJA backend and multi-GPU MPI communications.
|
||
|
||
- Added a "debug" device designed specifically to aid in debugging GPU code by
|
||
following the "device" code path (using separate host/device memory spaces and
|
||
host <-> device transfers) without any GPU hardware.
|
||
|
||
- Added support for matrix-free diagonal smoothers on GPUs.
|
||
|
||
- The current list of available device backends is: "ceed-cuda", "occa-cuda",
|
||
"raja-cuda", "cuda", "hip", "debug", "occa-omp", "raja-omp", "omp",
|
||
"ceed-cpu", "occa-cpu", "raja-cpu", and "cpu".
|
||
|
||
- The MFEM memory manager now supports different memory types, associated with
|
||
the following memory backends:
|
||
* Default host memory, using standard C++ new and delete,
|
||
* CUDA pointers, using cudaMalloc and HIP pointers, using hipMalloc,
|
||
* Managed CUDA/HIP memory (UVM), using cudaMallocManaged/hipMallocManaged,
|
||
* Umpire-managed memory, including memory pools,
|
||
* 32- or 64-byte aligned memory, using posix_memalign (WIN32 also supported),
|
||
* Debug memory with mmap/mprotect protection used by the new "debug" device.
|
||
|
||
libCEED support
|
||
---------------
|
||
- Added support for libCEED, the portable library for high-order operator
|
||
evaluation developed by the Center for Efficient Exascale Discretizations in
|
||
the Exascale Computing Project, https://github.com/CEED/libCEED.
|
||
|
||
- This initial integration includes Mass and Diffusion integrators. libCEED GPU
|
||
backends can be used without specific MFEM configuration, however it is highly
|
||
recommended to use the "cuda" build option to minimize memory transfers.
|
||
|
||
- Both CPU and GPU modes are available as MFEM device backends (ceed-cpu and
|
||
ceed-cuda), using some of the best performing CPU and GPU backends from
|
||
libCEED, see the sample runs in examples 1 and 6.
|
||
|
||
- NOTE: The current default libCEED GPU backend (ceed-cuda) uses atomics and
|
||
therefore is non-deterministic.
|
||
|
||
Partial assembly and matrix-free discretizations
|
||
------------------------------------------------
|
||
- The support for matrix-free methods on both CPU and GPU devices based on a
|
||
partially assembled operator decomposition was extended to include:
|
||
* DG integrators, (for now only in the Gauss-Lobatto basis), see Example 9,
|
||
* H(curl) bilinear forms, see Example 3,
|
||
* vector mass and vector diffusion bilinear integrators,
|
||
* convection integrator with improved performance,
|
||
* gradient and vector divergence integrators for Stokes problems,
|
||
* initial partial assembly mode for NonlinearForms.
|
||
|
||
- Diagonals of partially assembled operators can now be computed efficiently.
|
||
See the new methods AssembleDiagonal in BilinearForm, AssembleDiagonalPA in
|
||
BilinearFormIntegrator and the implementations in fem/bilininteg_*.cpp.
|
||
|
||
- In many examples, the partial assembly algorithms provide significantly
|
||
improved performance, particularly in high-order 3D runs on GPUs.
|
||
|
||
Meshing improvements
|
||
--------------------
|
||
- The algorithms for mesh element numbering were changed to have significantly
|
||
better caching and parallel partitioning properties. Both initial (see e.g.
|
||
Mesh::GetHilbertElementOrdering) and ordering after uniform refinement were
|
||
improved. NOTE: new ordering can have a round-off effect on solver results.
|
||
|
||
- Added support for non-conforming AMR on both prisms and tetrahedra, including
|
||
coarsening and parallel load balancing. Anisotropic prism refinement is only
|
||
available in the serial version at the moment.
|
||
|
||
- The TMOP mesh optimization algorithms were extended to support r-adaptivity.
|
||
Target matrices can now be constructed either via a given analytical function
|
||
(e.g. spatial dependence of size, aspect ratio, etc., for each element) or via
|
||
a (Par)GridFunction specified on the original mesh.
|
||
|
||
- The TMOP algorithms were also improved to support non-conforming AMR meshes.
|
||
|
||
- Added support for creating refined versions of periodic meshes, making use of
|
||
the new L2ElementRestriction class. This class also allows for computing
|
||
geometric factors on periodic meshes using partial assembly.
|
||
|
||
Discretization improvements
|
||
---------------------------
|
||
- Added support for GSLIB-FindPoints, a general high-order interpolation utility
|
||
that can robustly evaluate a GridFunction in an arbitrary collection of points
|
||
in physical space. See INSTALL for details on building MFEM with GSLIB, and
|
||
miniapps/gslib for examples of how to use this feature.
|
||
|
||
- Added support for complex-valued finite element operators and fields using a
|
||
2x2 block structured linear system to mimic complex arithmetic. New classes
|
||
include: ComplexGridFunction, SesquilinearForm, ComplexLinearForm, and their
|
||
parallel counterparts.
|
||
|
||
- Added second order derivatives of NURBS shape functions.
|
||
|
||
- Added support for serendipity elements of arbitrary order on affinely-mapped
|
||
square elements. Basis functions for these elements can be visualized using
|
||
an option in the display-basis miniapp.
|
||
|
||
- Two integrators related to Stokes problems, (Q grad u, v) and (Q div v, u),
|
||
where u and the components of v are in H1, were added/modified to support full
|
||
and partial assembly modes. See the new GradientIntegrator and the updated
|
||
VectorDivergenceIntegrator classes in fem/bilininteg.hpp, as well as the PA
|
||
kernels in fem/bilininteg_gradient.cpp and fem/bilininteg_divergence.cpp.
|
||
|
||
- Added a nonlinear vector valued convection integrator (Q u \cdot grad u, v)
|
||
where u_i and v_i are in H1. This form occurs e.g. in the Navier-Stokes
|
||
equations. The integrator supports the partial assembly mode for its
|
||
action. In full assembly mode we also provide the GetGradient method that
|
||
computes the linearized version of the integrator.
|
||
|
||
- Added a new method, MixedBilinearForm::FormRectangularLinearSystem, that can
|
||
be used to impose boundary conditions on the non-square off-diagonal blocks of
|
||
a block operator (similar to FormLinearSystem in the square case).
|
||
|
||
Linear and nonlinear solvers
|
||
----------------------------
|
||
- Added support for Ginkgo, a high-performance linear algebra library for GPU
|
||
and manycore nodes, with a focus on sparse solution of linear systems. For
|
||
more details see linalg/ginkgo.hpp and the example code in examples/gingko.
|
||
|
||
- Added support for HiOp, a lightweight HPC solver for nonlinear optimization
|
||
problems, see class HiOpNLPOptimizer and the example codes in examples/hiop.
|
||
|
||
- Added a general interface for specifying and solving nonlinear constrained
|
||
optimization problems through the new classes OptimizationProblem and
|
||
OptimizationSolver, see linalg/solver.hpp.
|
||
|
||
- Added a block ILU(0) preconditioner for DG-type discretizations. Example 9
|
||
(DG advection) now takes advantage of this for implicit time integration.
|
||
|
||
- New time integrators: Adams-Bashforth, Adams-Moulton and several integrators
|
||
for 2nd order ODEs, see the new Example 23.
|
||
|
||
- Added a LinearSolve(A,X) convenience method to solve dense linear systems. In
|
||
the trivial cases, i.e., square matrices of size 1 or 2, the system is solved
|
||
directly, otherwise, LU factorization is employed.
|
||
|
||
New and updated examples and miniapps
|
||
-------------------------------------
|
||
- Added a collection of 7 playful miniapps in miniapps/toys that illustrate the
|
||
meshing and visualization features of the library in more relaxed settings.
|
||
The toys include simulations of cellular automata, Rubik's cube, Mandelbrot
|
||
set, a tool to convert any image to mfem mesh, and more.
|
||
|
||
- Added 8 new example codes:
|
||
* Example 22/22p demonstrates the use of the new complex-valued finite element
|
||
operators by defining and solving a family of time-harmonic PDEs related to
|
||
damped harmonic oscillators.
|
||
* Example 23 solves a simple 2D/3D wave equation with the new second order
|
||
time integrators.
|
||
* Example 24/24p demonstrates usage of mixed finite element spaces in bilinear
|
||
forms. Partial assembly is supported in this example.
|
||
* A version of Example 1 in examples/ginkgo demonstrating the use of the
|
||
Gingko interface to solve a linear system.
|
||
* A version of Example 9/9p in examples/hiop demonstrating the nonlinear
|
||
constrained optimization interface and use of the SLBQP and HiOp solvers.
|
||
|
||
- Added two new miniapps: Find Points and Field Diff in miniapps/gslib that show
|
||
how GSLIB-FindPoints can be used to interpolate a (Par) GridFunction in an
|
||
arbitrary number of physical space points in 2D and 3D. The GridFunction must
|
||
be in H1 and in the same space as the mesh that is used to find the points.
|
||
|
||
- Added a simple miniapp, Get Values, that extracts field values at a set of
|
||
points, from previously saved data via DataCollection classes.
|
||
|
||
- Several examples and miniapps were updated:
|
||
* Added device support in Example 3/3p and Example 9/9p.
|
||
* Example 1/1p and Example 3/3p now use diagonal preconditioning in partial
|
||
assembly mode.
|
||
* Example 9/9p now supports implicit time integration, using the new block
|
||
ILU(0) solvers as preconditioners for the linear system.
|
||
* The mesh-optimizer and pmesh-optimizer miniapps now include the new
|
||
r-adaptivity capabilities of TMOP. They were also updated to support mesh
|
||
optimization on non-conforming AMR meshes.
|
||
* New options to reorder and partition the mesh and boundary attribute
|
||
visualization (key 'b') are now available in the mesh-explorer miniapp.
|
||
|
||
- Collected object files from the miniapps/common directory into a new library,
|
||
libmfem-common for the convenience of application developers. The new library
|
||
is now used in several miniapps in the electromagnetic and tools directories.
|
||
|
||
Improved testing
|
||
----------------
|
||
- Added a large number of unit tests in the tests/unit directory, including
|
||
several parallel unit tests.
|
||
|
||
- Added a new directory, tests/scripts, with several shell scripts that perform
|
||
simple checks on the code including: code styling, documentation formatting,
|
||
proper use of .gitignore, and preventing the accidental commit of large files.
|
||
|
||
- It is recommended that developers run the above tests scripts (via the runtest
|
||
script) before pushing to GitHub. See the README file in tests/scripts.
|
||
|
||
- The Travis CI settings have been updated to include an initial Checks stage
|
||
which currently runs the code-style, documentation and gitignore test scripts,
|
||
as well as a final stage for optional checks/tests which currently runs the
|
||
branch-history script.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added support for output in the ParaView XML format. Both low-order and
|
||
high-order Lagrange elements are supported. Output can be in ASCII or binary
|
||
format. The binary output can be compressed if MFEM is compiled with zlib
|
||
support (MFEM_USE_ZLIB). See the new ParaViewDataCollection class and the
|
||
updated Examples 5/5p and 9/9p.
|
||
|
||
- Upgraded the SUNDIALS interface to utilize SUNDIALS 5.0. This necessitated a
|
||
complete rework of the interface and requires changes at the application
|
||
level. Example usage of the new interface can be found in examples/sundials.
|
||
|
||
- Switched from gzstream to zstr for the implementation of zlib-compressed C++
|
||
output stream. The build system definition now uses MFEM_USE_ZLIB instead of
|
||
MFEM_USE_GZSTREAM, but the code interface (e.g. ofgzstream) remains the same.
|
||
|
||
- Various other simplifications, extensions, and bugfixes in the code.
|
||
|
||
API changes
|
||
-----------
|
||
- In the enum classes MemoryType and MemoryClass, "CUDA" was renamed to "DEVICE"
|
||
which now denotes either "CUDA" or "HIP" depending on the build configuration.
|
||
In the same enum classes, "CUDA_UVM" was renamed to "MANAGED".
|
||
|
||
|
||
Version 4.0, released on May 24, 2019
|
||
=====================================
|
||
|
||
Unlike previous MFEM releases, this version requires a C++11 compiler.
|
||
|
||
GPU support
|
||
-----------
|
||
- Added initial support for hardware devices, such as GPUs, and programming
|
||
models, such as CUDA, OCCA, RAJA and OpenMP.
|
||
|
||
- The GPU/device support is based on MFEM's new backends and kernels working
|
||
seamlessly with a new lightweight device/host memory manager. The kernels can
|
||
be implemented either in OCCA, or as a simple wrapper around for-loops, which
|
||
can then be dispatched to RAJA and native backends. See the files forall.hpp
|
||
and mem_manager.hpp in the general/ directory for more details.
|
||
|
||
- Several of the MFEM example codes (ex1, ex1p, ex6, and ex6p) can now take
|
||
advantage of GPU acceleration with the backend selectable at runtime. Many of
|
||
the linear algebra and finite element operations (e.g. partially assembled
|
||
bilinear forms) have been extended to take advantage of kernel acceleration by
|
||
simply replacing loops with the MFEM_FORALL() macro.
|
||
|
||
- In addition to native CUDA kernels, the library currently supports OCCA, RAJA
|
||
and OpenMP kernels, which could be mixed and matched in different parts of the
|
||
same application. We plan on adding support for more programming models and
|
||
devices in the future, without the need for significant modifications in user
|
||
code. The list of current backends is: "occa-cuda", "raja-cuda", "cuda",
|
||
"occa-omp", "raja-omp", "omp", "occa-cpu", "raja-cpu", and "cpu".
|
||
|
||
- GPU-related limitations:
|
||
* Hypre preconditioners are not yet available in GPU mode, and in particular
|
||
hypre must be built in CPU mode.
|
||
* Only constant coefficients are currently supported on GPUs.
|
||
* Optimized element assembly, and matrix-free bilinear forms are not
|
||
implemented yet. Element batching is currently ignored.
|
||
* In device mode, full assembly is performed on the host (but the matvec
|
||
action is performed on the device).
|
||
* Partial assembly kernels are not implemented yet for simplices.
|
||
|
||
Discretization improvements
|
||
---------------------------
|
||
- Partial assembled finite element operators are now available in the core
|
||
library, based on the new classes PABilinearFormExtension, ElementRestriction,
|
||
DofToQuad and GeometricFactors (associated with the classes BilinearForm,
|
||
FiniteElementSpace, FiniteElement and Mesh, respectively). The kernels for
|
||
partial assembled Setup/Assembly and Action/Mult are implemented in the
|
||
BilinearFormIntegrator methods AssemblePA and AddMultPA.
|
||
|
||
- Added support for a general "low-order refined"-to-"high-order" transfer of
|
||
GridFunction data from a "low-order refined" (LOR) space defined on a refined
|
||
mesh to a "high-order" (HO) finite element space defined on a coarse mesh. See
|
||
the new classes InterpolationGridTransfer and L2ProjectionGridTransfer and the
|
||
new LOR Transfer miniapp: miniapps/tools/lor-transfer.cpp.
|
||
|
||
- Added element flux, and flux energy computation in class ElasticityIntegrator,
|
||
allowing for the use of Zienkiewicz-Zhu type error estimators with the
|
||
integrator. For an illustration of this addition, see the new Example 21.
|
||
|
||
- Added support for derefinement of vector (RT + ND) spaces.
|
||
|
||
- Added a variety of coefficients which are sums or products of existing
|
||
coefficients as well as grid function coefficients which return the
|
||
divergence, gradient, or curl of their GridFunctions.
|
||
|
||
Support for wedge elements and meshes with mixed element types
|
||
--------------------------------------------------------------
|
||
- Added support for wedge-shaped mesh elements of arbitrary order (with Geometry
|
||
type PRISM) which have two triangular faces and three quadrilateral faces.
|
||
Several examples of such meshes can be found in the data/ directory.
|
||
|
||
- Added support for mixed meshes containing triangles and quadrilaterals in 2D
|
||
or tetrahedra, wedges, and hexahedra in 3D. This includes support for uniform
|
||
refinement of such meshes. Several examples of such meshes can be found in the
|
||
data/ directory.
|
||
|
||
- Added H1 and L2 finite elements of arbitrary order for Wedge elements.
|
||
|
||
- Added support for reading and writing linear and quadratic meshes containing
|
||
wedge elements in VTK mesh format. Several examples of such meshes can be
|
||
found in the data/ directory.
|
||
|
||
Other meshing improvements
|
||
--------------------------
|
||
- Improved the uniform refinement of tetrahedral meshes (also part of the
|
||
uniform refinement of mixed 3D meshes). The previous refinement algorithm is
|
||
still available as an option in Mesh::UniformRefinement. Both can be used in
|
||
the updated Mesh Explorer miniapp.
|
||
|
||
- The local tetrahedral mesh refinement algorithm in serial and in parallel now
|
||
follows precisely the paper:
|
||
|
||
D. Arnold, A. Mukherjee, and L. Pouly, "Locally Adapted Tetrahedral Meshes
|
||
Using Bisection", SIAM J. Sci. Comput. 22 (2000), 431–448.
|
||
|
||
This guarantees that the shape regularity of the elements will be preserved
|
||
under refinement.
|
||
|
||
- The TMOP mesh optimization algorithms were extended to support user-defined
|
||
space-dependent limiting terms. Improved the TMOP objective functions by more
|
||
accurate normalization of the different terms.
|
||
|
||
- Added support for parallel communication groups on non-conforming meshes.
|
||
|
||
- Improved parallel partitioning of non-conforming meshes. If the coarse mesh
|
||
elements are ordered as a sequence of face-neighbors, the parallel partitions
|
||
are now guaranteed to be continuous. To that end, inline quadrilateral and
|
||
hexahedral meshes are now by default ordered along a space-filling curve.
|
||
|
||
- A boundary in a NURBS mesh can now be connected with another boundary. Such a
|
||
periodic NURBS mesh is a simple way to impose periodic boundary conditions.
|
||
|
||
- Added support for reading linear and quadratic 2D quadrilateral and triangular
|
||
Cubit meshes.
|
||
|
||
New and updated examples and miniapps
|
||
-------------------------------------
|
||
- Added a new meshing miniapp, Toroid, which can produce a variety of torus
|
||
shaped meshes by twisting a stack of wedges or hexahedra.
|
||
|
||
- Added a new meshing miniapp, Extruder, that demonstrates the capability to
|
||
produce 3D meshes by extruding 2D meshes.
|
||
|
||
- Added a simple miniapp, LOR Transfer, for visualizing the actions of the
|
||
transfer operators between a high-order and a low-order refined spaces.
|
||
|
||
- Added a new example, Example 20/20p, that solves a system of 1D ODEs derived
|
||
from a Hamiltonian. The example demonstrates the use of the variable order,
|
||
symplectic integration algorithm implemented in class SIAVSolver.
|
||
|
||
- Added a new example, Example 21/21p, that illustrates the use of AMR to solve
|
||
a linear elasticity problem. This is an extension of Example 2/2p.
|
||
|
||
New and improved solvers and preconditioners
|
||
--------------------------------------------
|
||
- Added support for parallel ILU preconditioning via hypre's Euclid solver.
|
||
|
||
- Added support for STRUMPACK v3 with a small API change in the class
|
||
STRUMPACKSolver, see "API changes" below.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added unit tests based on the Catch++ library in the test/ directory.
|
||
|
||
- Renamed the option MFEM_USE_OPENMP to MFEM_USE_LEGACY_OPENMP. This legacy
|
||
option is deprecated and planned for removal in a future release. The original
|
||
option name, MFEM_USE_OPENMP, is now used to enable the new OpenMP backends in
|
||
the new kernels.
|
||
|
||
- In SparseMatrix added the option to perform MultTranspose() by matvec with
|
||
computed and stored transpose matrix. This is required for deterministic
|
||
results when using devices such as CUDA and OpenMP.
|
||
|
||
- Altered the way FGMRES counts its iterations so that it matches GMRES.
|
||
|
||
- Various other simplifications, extensions, and bugfixes in the code.
|
||
|
||
- Construct abstract parallel rectangular truedof-to-truedof operators via
|
||
Operator::FormDiscreteOperator().
|
||
|
||
API changes
|
||
-----------
|
||
- In multiple places, use Geometry::Type instead of int, where appropriate.
|
||
- In multiple places, use Element::Type instead of int, where appropriate.
|
||
- The Mesh methods GetElementBaseGeometry and GetBdrElementBaseGeometry no
|
||
longer have a default value for their parameter, they only work with an
|
||
explicitly given index.
|
||
- In class Mesh, added methods useful for queries regarding the types of
|
||
elements present in the mesh: HasGeometry, GetNumGeometries, GetGeometries,
|
||
and class Mesh::GeometryList.
|
||
- The struct CoarseFineTransformations (returned by the Mesh method
|
||
GetRefinementTransforms) now stores the embedding matrices separately for each
|
||
Geometry::Type.
|
||
- In class ParMesh, replaced the method GroupNFaces with two new methods:
|
||
GroupNTriangles and GroupNQuadrilaterals. Also, replaced GroupFace with two
|
||
methods: GroupTriangle and GroupQuadrilateral.
|
||
- In class ParMesh, made the two RefineGroups methods protected.
|
||
- Removed the virtual method Element::GetRefinementFlag, it is only used by the
|
||
derived class Tetrahedron.
|
||
- Added new methods: Array::CopyTo, Tetrahedron::Init.
|
||
- In class STRUMPACKSolver, the method SetMC64Job() was replaced by the new
|
||
methods: DisableMatching(), EnableMatching(), and EnableParallelMatching().
|
||
|
||
|
||
Version 3.4, released on May 29, 2018
|
||
=====================================
|
||
|
||
More general and efficient mesh adaptivity
|
||
------------------------------------------
|
||
- Added support for PUMI, the Parallel Unstructured Mesh Infrastructure from
|
||
https://scorec.rpi.edu/pumi. PUMI is an unstructured, distributed mesh data
|
||
management system that is capable of handling general non-manifold models and
|
||
effectively supports automated adaptive analysis. PUMI enables for the first
|
||
time support for parallel unstructured modifications of MFEM meshes.
|
||
|
||
- Significantly reduced MPI communication in the construction of the parallel
|
||
prolongation matrix in ParFiniteElementSpace, for much improved parallel
|
||
scaling of non-conforming AMR on hundreds of thousands of MPI tasks. The
|
||
memory footprint of the ParNCMesh class has also been reduced.
|
||
|
||
- In FiniteElementSpace, the fully assembled refinement matrix is now replaced
|
||
by default by a specialized refinement operator. The operator option is both
|
||
faster and more memory efficient than using the fully assembled matrix. The
|
||
old approach is still available and can be enabled, if needed, using the new
|
||
method FiniteElementSpace::SetUpdateOperatorType().
|
||
|
||
Discretization improvements
|
||
---------------------------
|
||
- Added support for a general "high-order"-to-"low-order refined" transfer of
|
||
GridFunction and true-dof data from a "high-order" finite element space
|
||
defined on a coarse mesh, to a "low-order refined" space defined on a refined
|
||
mesh. The new methods, GetTransferOperator and GetTrueTransferOperator in the
|
||
FiniteElementSpace classes, work in both serial and parallel and support
|
||
matrix-based as well as matrix-free transfer operator representations. They
|
||
use a new method, GetTransferMatrix, in the FiniteElement class similar to
|
||
GetLocalInterpolation, that allows the coarse FiniteElement to be different
|
||
from the fine FiniteElement.
|
||
|
||
- Added class ComplexOperator, that implements the action of a complex operator
|
||
through the equivalent 2x2 real formulation. Both symmetric and antisymmetric
|
||
block structures are supported.
|
||
|
||
- Added classes for general block nonlinear finite element operators (deriving
|
||
from BlockNonlinearForm and ParBlockNonlinearForm) enabling solution of
|
||
nonlinear systems with multiple unknowns in different function spaces. Such
|
||
operators have assemble-based action and also support assembly of the gradient
|
||
operator to enable inversion with Newton iteration.
|
||
|
||
- Added variable order NURBS: for each space each knot vector in the mesh can
|
||
have a different order. The order information is now part of the finite
|
||
element space header in the NURBS mesh output, so NURBS meshes in the old
|
||
format need to be updated.
|
||
|
||
- In the classes NonlinearForm and ParNonlinearForm, added support for
|
||
non-conforming AMR meshes; see also the "API changes" section.
|
||
|
||
- New specialized time integrators: symplectic integrators of orders 1-4 for
|
||
systems of first order ODEs derived from a Hamiltonian and generalized-alpha
|
||
ODE solver for the filtered Navier–Stokes equations with stabilization. See
|
||
classes SIASolver and GeneralizedAlphaSolver in linalg/ode.hpp.
|
||
|
||
- Inherit finite element classes from the new base class TensorBasisElement,
|
||
whenever the basis can be represented by a tensor product of 1D bases.
|
||
|
||
- Added support for elimination of boundary conditions in block matrices.
|
||
|
||
New and updated examples and miniapps
|
||
-------------------------------------
|
||
- Added a new serial and parallel example (ex19) that solves the quasi-static
|
||
incompressible hyperelastic equations. The example demonstrates the use of
|
||
block nonlinear forms as well as custom block preconditioners.
|
||
|
||
- Added a new serial example (ex23) to demonstrate the use of second order
|
||
time integration to solve the wave equation.
|
||
|
||
- Added a new electromagnetics miniapp, Maxwell, for simulating time-domain
|
||
electromagnetics phenomena as a coupled first order system of equations.
|
||
|
||
- A simple local refinement option has been added to the mesh-explorer miniapp
|
||
(menu option 'r', sub-option 'l') that selects elements for refinement based
|
||
on their spatial location - see the function 'region()' in the source file.
|
||
|
||
- Added a set of miniapps specifically focused on Isogeometric Analysis (IGA) on
|
||
NURBS meshes in the miniapps/nurbs directory. Currently the directory contains
|
||
variable order NURBS versions of examples 1, 1p and 11p.
|
||
|
||
- Added PUMI versions of examples ex1, ex1p, ex2 and ex6p in a new examples/pumi
|
||
directory. The new examples demonstrate the PUMI APIs for parallel and serial
|
||
mesh loading (ex1 and ex1p), applying BCs using classification (ex2), and
|
||
performing parallel mesh adaptation (ex6p).
|
||
|
||
- Added two new miniapps related to DataCollection I/O in miniapps/tools:
|
||
load-dc.cpp can be used to visualize fields saved via DataCollection classes;
|
||
convert-dc.cpp demonstrates how to convert between MFEM's different concrete
|
||
DataCollection options.
|
||
|
||
- Example 10p with its SUNDIALS and PETSc versions have been updated to reflect
|
||
the change in the behavior of the method ParNonlinearForm::GetLocalGradient()
|
||
(see the "API changes" section) and now works correctly on non-conforming AMR
|
||
meshes. Example 10 and its SUNDIALS version have also been updated to support
|
||
non-conforming ARM meshes.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Documented project workflow and provided contribution guidelines in the new
|
||
top-level file, CONTRIBUTING.md.
|
||
|
||
- Added (optional) Conduit Mesh Blueprint support of MFEM data for both in-core
|
||
and I/O use cases. This includes a new ConduitDataCollection that provides
|
||
json, simple binary, and HDF5-based I/O. Support requires Conduit >= v0.3.1
|
||
and VisIt >= v2.13.1 will read the new Data Collection outputs.
|
||
|
||
- Added a new developer tool, config/sample-runs.sh, that extracts the sample
|
||
runs from all examples and miniapps and runs them. Optionally, it can save the
|
||
output from the execution to files, allowing comparison between different
|
||
versions and builds of the library.
|
||
|
||
- Support for building a shared version of the MFEM library with GNU make.
|
||
|
||
- Added a build option, MFEM_USE_EXCEPTIONS=YES, to throw an exception instead
|
||
of calling abort on mfem errors.
|
||
|
||
- When building with the GnuTLS library, switch to using X.509 certificates for
|
||
secure socket authentication. Support for the previously used OpenPGP keys has
|
||
been deprecated in GnuTLS 3.5.x and removed in 3.6.0. For secure communication
|
||
with the visualization tool GLVis, a new set of certificates can be generated
|
||
using the latest version of the script 'glvis-keygen.sh' from GLVis.
|
||
|
||
- Upgraded MFEM to support Axom 0.2.8. Prior versions are no longer supported.
|
||
|
||
API changes
|
||
-----------
|
||
- Introduced a new enum, Matrix::DiagonalPolicy, that replaces the integer
|
||
parameters in many methods that perform elimination of rows and/or columns in
|
||
matrices. Some examples of such methods are:
|
||
* class SparseMatrix: EliminateRow(), EliminateCol(), EliminateRowCol(), ...
|
||
* class BilinearForm: EliminateEssentialBC(), EliminateVDofs(), ...
|
||
* class StaticCondensation: EliminateReducedTrueDofs()
|
||
* class BlockMatrix: EliminateRowCol()
|
||
Calling these methods with an explicitly given (integer) constants, will now
|
||
generate compilation errors, please use one of the new enum constants instead.
|
||
|
||
- Modified the virtual method AbstractSparseMatrix::EliminateZeroRows() and its
|
||
implementations in derived classes, to accept an optional 'threshold'
|
||
parameter, replacing previously hard-coded threshold values.
|
||
|
||
- In the classes NonlinearForm and ParNonlinearForm:
|
||
* The method GetLocalGradient() no longer imposes boundary conditions. The
|
||
motivation for the change is that, in the case of non-conforming AMR,
|
||
performing the elimination at the local level is incorrect - it must be
|
||
applied at the true-dof level.
|
||
* The method SetEssentialVDofs() is now deprecated.
|
||
|
||
|
||
Version 3.3.2, released on Nov 10, 2017
|
||
=======================================
|
||
|
||
High-order mesh optimization
|
||
----------------------------
|
||
- Added support for mesh optimization via node-movement based on the Target-
|
||
Matrix Optimization Paradigm (TMOP) developed by P.Knupp et al. A variety of
|
||
mesh quality metrics, with their first and second derivatives have been
|
||
implemented. The combination of targets & quality metrics is used to optimize
|
||
the physical node positions, i.e., they must be as close as possible to the
|
||
shape, size and/or alignment of their targets. The optimization of arbitrary
|
||
high-order meshes in 2D, 3D, serial and parallel is supported.
|
||
|
||
- The new Mesh Optimizer miniapp can be used to perform mesh optimization with
|
||
TMOP in serial and parallel versions. The miniapp also demonstrates the use of
|
||
nonlinear operators and their coupling to Newton methods for solving
|
||
minimization problems.
|
||
|
||
New and improved solvers and preconditioners
|
||
--------------------------------------------
|
||
- MFEM is now included in the xSDK project, the Extreme-scale Scientific
|
||
Software Development Kit, as of xSDK-0.3.0. Various changes were made to
|
||
comply with xSDK's community policies, https://xsdk.info/policies, including:
|
||
xSDK-specific options in CMake, support for user-provided MPI communicators,
|
||
runtime API for version number, and the ability to disable/redirect output.
|
||
For more details, see general/globals.hpp and in particular the mfem::err and
|
||
mfem::out streams replacing std::err and std::out respectively.
|
||
|
||
- Added (optional) support for the STRUMPACK parallel sparse direct solver and
|
||
preconditioner. STRUMPACK uses Hierarchically Semi-Separable (HSS) compression
|
||
in a fully algebraic manner, with interface similar to SuperLU_DIST. See
|
||
http://portal.nersc.gov/project/sparse/strumpack for more details.
|
||
|
||
- Added a block lower triangular preconditioner based (only) on the actions of
|
||
each block, see class BlockLowerTriangularPreconditioner.
|
||
|
||
- Added an optional operator in LOBPCG to projects vectors onto a desired
|
||
subspace (e.g. divergence-free). Other small changes in LOBPCG include the
|
||
ability to set the starting vectors and support for relative tolerance.
|
||
|
||
- The Newton solver supports an optional scaling factor, that can limit the
|
||
increment in the Newton step, see e.g. the Mesh Optimizer miniapp.
|
||
|
||
- Updated MFEM integration to support the new SUNDIALS 3.0.0 interface.
|
||
|
||
New and updated examples and miniapps
|
||
-------------------------------------
|
||
- Added a new serial and parallel example (ex18) that solves the transient Euler
|
||
equations on a periodic domain with explicit time integrators. In the process
|
||
extended the NonlinearForm class to allow for integrals over faces and
|
||
exchanging face-neighbor data in parallel.
|
||
|
||
- Added a new meshing miniapp, Shaper, that can be used to resolve complicated
|
||
material interfaces by mesh refinement, e.g. as a tool for initial mesh
|
||
generation from prescribed "material()" function. Both conforming and
|
||
non-conforming (isotropic and anisotropic) refinements are supported.
|
||
|
||
- Added a new meshing miniapp, Mesh Optimizer, that demonstrates the use of TMOP
|
||
for mesh optimization (serial and parallel version.)
|
||
|
||
- Added SUNDIALS version of Example 16/16p.
|
||
|
||
Discretization improvements
|
||
---------------------------
|
||
- Added a FindPoints method of the Mesh and ParMesh classes that returns the
|
||
elements that contain a given set of points, together with the coordinates of
|
||
the points in the reference space of the corresponding element. In parallel,
|
||
if a point is shared by multiple processors, only one of them will mark that
|
||
point as found. Note that the current implementation of this method is not
|
||
optimal and/or 100% reliable. See the mesh-explorer miniapp for an example.
|
||
|
||
- Added a new class InverseElementTransformation, that supports a number of
|
||
algorithms for inversion of general ElementTransformations. This class can be
|
||
used as a more flexible and extensible alternative to ElementTransformation's
|
||
TransformBack method. It is also used in the FindPoints methods as a tunable
|
||
and customizable inversion algorithm.
|
||
|
||
- Memory optimizations in the NCMesh class, which now uses 50% less memory than
|
||
before. The average cost of an element in a uniformly refined mesh (including
|
||
the refinement hierarchy, but excluding the temporary face_list and edge_list)
|
||
is now only about 290 bytes. This also makes the class faster.
|
||
|
||
- Added the ability to integrate delta functions on the right-hand side (by
|
||
sampling the test function at the center of the delta coefficient). Currently
|
||
this is supported in the DomainLFIntegrator, VectorDomainLFIntegrator and
|
||
VectorFEDomainLFIntegrator classes.
|
||
|
||
- Added five new linear interpolators in fem/bilininteg.cpp to compute products
|
||
of scalar and vector fields or products with arbitrary coefficients.
|
||
|
||
- Added matrix coefficient support to CurlCurlIntegrator.
|
||
|
||
- Extend the method NodalFiniteElement::Project for VectorCoefficient to work
|
||
with arbitrary number of vector components.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added a .gitignore file that ignores all files erased by "make distclean",
|
||
i.e. the files that can be generated from the source but we don't want to
|
||
track in the repository, as well as a few platform-specific files.
|
||
|
||
- Added Linux, Mac and Windows CI testing on GitHub with Travis CI and Appveyor.
|
||
|
||
- Added a new macro, MFEM_VERSION, defined as a single integer of the form
|
||
(major*100 + minor)*100 + patch. The convention is that an even number
|
||
(i.e. even patch number) denotes a "release" version, while an odd number
|
||
denotes a "development" version. See config/config.hpp.in.
|
||
|
||
- Added an option for building in parallel without a METIS dependency. This is
|
||
used for example the Laghos miniapp, https://github.com/CEED/Laghos.
|
||
|
||
- Modified the installation layout: all headers, except the master headers
|
||
(mfem.hpp and mfem-performance.hpp), are installed in <PREFIX>/include/mfem;
|
||
the master headers are installed in both <PREFIX>/include/mfem and in
|
||
<PREFIX>/include. The mfem configuration and testing makefiles (config.mk and
|
||
test.mk) are installed in <PREFIX>/share/mfem, instead of <PREFIX>.
|
||
|
||
- Add three more options for MFEM_TIMER_TYPE.
|
||
|
||
- Support independent number of digits for cycle and rank in DataCollection.
|
||
|
||
- Converted Sidre usage from "asctoolkit" to "axom" namespace.
|
||
|
||
- Various small fixes and styling updates.
|
||
|
||
API changes
|
||
-----------
|
||
- The methods GetCoeff of VectorArrayCoefficient and MatrixArrayCoefficient now
|
||
return a pointer to Coefficient (instead of reference). Note that NULL pointer
|
||
is a valid entry for these two classes - it is treated as the zero function.
|
||
|
||
- When building with PETSc, the required PETSc version is now 3.8.0. Newer
|
||
versions may work too, as long as there are no interface changes in PETSc.
|
||
|
||
- The class GeometryRefiner now uses the enum in Quadrature1D for its type
|
||
specification. In particular, this will affect older versions of GLVis. A
|
||
simple upgrade to the latest version of GLVis should resolve this issue.
|
||
|
||
|
||
Version 3.3, released on Jan 28, 2017
|
||
=====================================
|
||
|
||
FEM <-> linear system interface for action-only linear operators
|
||
----------------------------------------------------------------
|
||
- Added a new class, ConstrainedOperator, which can impose essential boundary
|
||
conditions using only the action, Mult(), of a given square linear Operator.
|
||
|
||
- Added a FormLinearSystem + RecoverFEMSolution functionality for square linear
|
||
Operators that are available only through their action. This includes all
|
||
necessary transformations, such as: parallel assembly, conforming constraints
|
||
for non-conforming AMR and eliminating boundary conditions. (Hybridization and
|
||
static condensation are not supported.) See examples in miniapps/performance.
|
||
|
||
Matrix-free preconditioning and low-order-refined spaces
|
||
--------------------------------------------------------
|
||
- The HPC examples in miniapps/performance now support efficient preconditioning
|
||
in matrix-free mode based on applying a standard (e.g. AMG) preconditioner to
|
||
a sparsified version of the operator. The sparsification is obtained by
|
||
rediscretizing with a low-order refined spaces, currently at the high-order
|
||
degrees of freedom.
|
||
|
||
- New mesh constructors support the creation of low-order-refined version of a
|
||
given mesh, both in serial and in parallel. These are illustrated in the HPC
|
||
examples in miniapp/performance (option -pc lor), as well as in mesh-explorer
|
||
miniapp, which now supports Gauss-Lobatto refinement and uniform refinement,
|
||
both for any factor > 1.
|
||
|
||
Comprehensive PETSc and SUNDIALS interfaces
|
||
-------------------------------------------
|
||
- Added support for many linear and nonlinear solvers, preconditioners, time
|
||
integrators and other features from the PETSc suite (version 3.8 or higher of
|
||
the PETSc dev branch is required). The new features include:
|
||
* support for PETSc matrices in MATAIJ, MATIS, MATSHELL and MATNEST formats.
|
||
* PETSc linear solvers can take any mfem Operator and support user-defined
|
||
monitoring routines (see examples/petsc/ex1p).
|
||
* BDDC preconditioners for H1, H(curl) and H(div), including with static
|
||
condensation/hybridization, FieldSplit preconditioner for BlockOperators.
|
||
* PETSc non-linear solvers can take any mfem Operator that implements the
|
||
GetGradient() method.
|
||
* PETSc ODE solvers are supported for mfem's TimeDependentOperators.
|
||
The use of these features is illustrated in the new examples/petsc directory.
|
||
|
||
- Added a new class, OperarorHandle, that provides a common interface for
|
||
global, matrix-type operators to be used in bilinear forms, gradients of
|
||
nonlinear forms, static condensation, hybridization, etc.
|
||
The following backends are currently supported:
|
||
* HYPRE parallel sparse matrix (HYPRE_PARCSR)
|
||
* PETSC globally assembled parallel sparse matrix (PETSC_MATAIJ)
|
||
* PETSC parallel matrix assembled on each processor (PETSC_MATIS)
|
||
|
||
- Added support for the time integrators and non-linear solvers from the CVODE,
|
||
ARKODE and KINSOL libraries of the SUNDIALS suite (version 2.7 or higher of
|
||
SUNDIALS is required). The use of these features is illustrated in the new
|
||
examples/sundials directory.
|
||
|
||
Scalable parallel mesh support
|
||
------------------------------
|
||
- Introduced a new mesh format (v1.2) that can describe/recover MFEM parallel
|
||
meshes. This way, computations can start directly in parallel without serial
|
||
refinement and splitting. Non-conforming meshes are currently supported only
|
||
in serial.
|
||
|
||
General quadrature and nodal finite element basis types
|
||
-------------------------------------------------------
|
||
- Added support for different numerical quadrature schemes and finite element
|
||
basis points. Different basis points can be selected via optional integer
|
||
argument(s) to the finite element collection constructor of type BasisType:
|
||
* H1 elements can use GaussLobatto (default), Positive, or ClosedUniform;
|
||
* L2 elements can use GaussLegendre (default), GaussLobatto, Positive,
|
||
ClosedUniform, OpenUniform or OpenHalfUniform;
|
||
* RT can now use open basis that is GaussLegendre (default), GaussLobatto,
|
||
ClosedUniform, OpenUniform, or OpenHalfUniform, and closed basis that is
|
||
GaussLobatto (default) or ClosedUniform;
|
||
* ND elements can use the same BasisType's as RT elements.
|
||
|
||
- GaussLegendre, GaussLobatto, ClosedUniform, OpenUniform, and OpenHalfUniform
|
||
integration rules can be directly constructed with an optional parameter of
|
||
type Quadrature1D:
|
||
IntegrationRules gl(0, Quadrature1D::GaussLobatto);
|
||
const IntegrationRule *ir = gl(Geometry::SEGMENT, 5); // 4pt 1D rule
|
||
The global IntRules object continues to use GaussLegendre.
|
||
|
||
New integrators for common families of operators
|
||
------------------------------------------------
|
||
- Added MixedScalarIntegrator and 7 derived classes for integrating products of
|
||
two scalar basis functions and optional scalar coefficients.
|
||
|
||
- Added MixedVectorIntegrator and 16 derived classes for integrating the inner
|
||
product of two vector basis functions with optional scalar, vector, or matrix
|
||
coefficients.
|
||
|
||
- Added MixedScalarVectorIntegrator and 13 derived classes for integrating the
|
||
product of a scalar basis function with the inner product of a vector basis
|
||
function with a vector coefficient. In 2D the inner product can optionally be
|
||
replaced with a cross product.
|
||
|
||
- Added a new class DGElasticityIntegrator that supports a few types of DG
|
||
formulations for linear elasticity and a new linear form integrator,
|
||
DGElasticityDirichletLFIntegrator, that implements non-homogeneous BCs.
|
||
|
||
- Added support for DG spaces in class VectorBoundaryLFIntegrator.
|
||
|
||
- In classes BilinearForm and LinearForm, added support for boundary face
|
||
integrators applied to a subset of the boundary, see AddBdrFaceIntegrator.
|
||
|
||
New and updated examples and miniapps
|
||
-------------------------------------
|
||
- Sixteen new serial and parallel example codes that demonstrate:
|
||
* solution of a time-dependent nonlinear heat equation (Example 16/16p)
|
||
* DG formulations of static linear elasticity (Example 17/17p)
|
||
* the use of PETSc solvers and preconditioners (Examples 1p, 2p, 3p, 4p, 5p,
|
||
6p, 9p and 10p in examples/petsc)
|
||
* the use of SUNDIALS time integrators and nonlinear solvers (Examples 9/9p
|
||
and 10/10p in examples/sundials)
|
||
|
||
- The HPC examples in miniapps/performance now have a -mf/--matrix-free option
|
||
illustrating optimized "partial assembly" operator evaluation. This is now the
|
||
default in these examples, to switch to optimized matrix assembly instead use
|
||
the -asm/--assembly option.
|
||
|
||
- Added a new electromagnetic miniapp, Joule, illustrating the simulation of
|
||
transient magnetics and joule heating. This is a comprehensive miniapp that
|
||
uses finite element spaces and solvers for the whole de Rham sequence.
|
||
|
||
- Added a simple miniapp, display-basis, for displaying the various types
|
||
of finite element basis functions within single elements. This is part of
|
||
the new miniapps/tools directory.
|
||
|
||
- Rewrote the Volta and Tesla solver classes to avoid using linear algebra
|
||
objects when possible. This greatly simplifies the code, reduces memory
|
||
requirements, and eliminates unnecessary computation. It also fixed a bug
|
||
with divergence cleaning in the Tesla miniapp.
|
||
|
||
- Added an option to Example 9/9p to save a binary visualization file using the
|
||
Conduit mesh blueprint/hdf5 format.
|
||
|
||
Improved building options
|
||
-------------------------
|
||
- Added a new CMake build system, that can be used as an alternative to the GNU
|
||
make-based build system (e.g. for out-of-source building). For more details,
|
||
see the INSTALL file and the config/cmake directory.
|
||
|
||
- Added support for out-of-source builds with GNU make, see the INSTALL file.
|
||
|
||
Improved file output
|
||
--------------------
|
||
- Added on-the-fly compression of file streams input and output via gzstream,
|
||
see the MFEM_USE_GZSTREAM option.
|
||
|
||
- Added experimental support for an HDF5-based output file format following the
|
||
Conduit (https://github.com/LLNL/conduit) mesh blueprint specification for
|
||
visualization and/or restart capability. This functionality is aimed primarily
|
||
at user of LLNL's axom project (Sidre component) that run problems at extreme
|
||
scales. Users desiring a small scale binary format may want to look at the
|
||
gzstream functionality instead.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added optional support for software-based higher-precision arithmetic with
|
||
the MPFR library. When MFEM_USE_MPFR is enabled, the 1D quadrature rules will
|
||
be computed precisely, at least for rules with up to 65-points.
|
||
|
||
- Better support for METIS version 5 and above.
|
||
|
||
- Provide an informative backtrace in mfem_error based on the cross-platform
|
||
libunwind library (requires MFEM_USE_LIBUNWIND=YES).
|
||
|
||
- In class SparseMatrix, added methods PrintInfo and CheckFinite.
|
||
|
||
- GMRESSolver and MINRESSolver now support the same print levels as CGSolver.
|
||
|
||
- Added method MemoryUsage to the classes Stack and MemAlloc.
|
||
|
||
- Improved Doxygen formatting of code comments.
|
||
|
||
- Various other simplifications, extensions, and bugfixes in the code.
|
||
|
||
|
||
Version 3.2, released on Jun 30, 2016
|
||
=====================================
|
||
|
||
Dynamic AMR with parallel load balancing, derefinement of non-conforming meshes
|
||
-------------------------------------------------------------------------------
|
||
- Parallel non-conforming meshes can now be load balanced at any time by calling
|
||
ParMesh::Rebalance(). Elements of the mesh are redistributed in such a way
|
||
that each processor gets approximately the same number of elements (plus minus
|
||
one element). Partitioning is done by splitting a sequence of space-filling
|
||
(Hilbert) curves defined on the refinement octrees.
|
||
|
||
- Isotropically refined non-conforming meshes can now be derefined, both in
|
||
serial and in parallel, based on a per-element error measure and a
|
||
derefinement threshold. See the class ThresholdDerefiner.
|
||
|
||
- Following an arbitrary mesh change (uniform/general conforming/non-conforming
|
||
refinement, derefinement, load balancing), the FiniteElementSpace and
|
||
associated GridFunctions can be updated by interpolating or redistributing the
|
||
previous function values based on the new state of the mesh. (Internally this
|
||
is implemented through a transformation matrix that is constructed in the
|
||
FiniteElementSpace.) The user interface is quite simple:
|
||
|
||
pmesh.Rebalance(); // or GeneralRefinement, or GeneralDerefinement
|
||
fespace.Update(); // calculate a transformation matrix (by default)
|
||
x.Update(); // apply the transformation to the GridFunction
|
||
z.Update(); // apply it again
|
||
|
||
- New abstractions are available for error estimation and general mesh
|
||
operations such as refinement and derefinement. See the base classes
|
||
ErrorEstimator and MeshOperator and their descendants.
|
||
|
||
- The above features are illustrated in the new Example 15 (see also Example 6).
|
||
|
||
Tensor-based high-performance FEM operator assembly and evaluation
|
||
------------------------------------------------------------------
|
||
- Added support for high-performance, tensor-based efficient assembly and
|
||
evaluation of high-order operators.
|
||
|
||
- A number of new header files have been added to the fem/, linalg/ and mesh/
|
||
directories. They start with the prefix "t" to indicate the (heavy) use of C++
|
||
templating, similar to how the prefix "p" denotes "parallel". All the code for
|
||
the new HPC FE assembly/evaluation algorithms is fully implemented in these
|
||
header files. Note that the new interface is optional and only enabled if the
|
||
mfem-performance.hpp header is included instead of mfem.hpp. This is an
|
||
initial, reference implementation.
|
||
|
||
- Similarly to the serial-to-parallel (ex1.cpp-to-ex1p.cpp) transition, an
|
||
existing MFEM-based applications has to be transitioned to the new HPC
|
||
interface. This is illustrated in two new example codes which are the
|
||
high-performance versions of Example 1/1p. See miniapps/performance.
|
||
|
||
- The new interface reduces local operator assembly/evaluation to batched small
|
||
dense tensor contraction operations. For high performance, the sizes of these
|
||
contractions should be known at compile time, so the BilinearForm object needs
|
||
to have detailed knowledge about the mesh, the finite element space, the
|
||
quadrature rule and the integrator to be assembled. This required a new
|
||
interface, that supports a subset of the current (general) coefficients and
|
||
bilinear form integrators, including variable coefficients and mass and
|
||
diffusion integrators. It is possible to use the old and the new HPC interface
|
||
side-by-side, see the HPC version of Example 1/1p in miniapps/performance.
|
||
|
||
Advanced FEM on parallel non-conforming meshes
|
||
----------------------------------------------
|
||
- Added support for discontinuous Galerkin methods on parallel non-conforming
|
||
meshes, see Examples 9p and 14p.
|
||
|
||
- Added support for hybridization on parallel non-conforming meshes, see
|
||
Example 4p.
|
||
|
||
New and improved linear solvers
|
||
-------------------------------
|
||
- Added a wrapper for the real-valued, double precision solver in SuperLU_DIST
|
||
which is a sparse direct solver for distributed memory architectures. As such
|
||
it can only be enabled along with MFEM_USE_MPI. When MFEM is configured with
|
||
MFEM_USE_SUPERLU, one also needs to alter the version of METIS, since SuperLU
|
||
requires ParMETIS (which comes packaged with a serial version of METIS). See
|
||
http://http://crd-legacy.lbl.gov/~xiaoye/SuperLU for SuperLU_DIST details.
|
||
|
||
- Added a wrapper for the KLU solver in SuiteSparse see
|
||
http://faculty.cse.tamu.edu/davis/suitesparse.html for details of KLU.
|
||
If MFEM was configured with MFEM_USE_SUITESPARSE, one must now also link
|
||
against the klu and btf libraries in SuiteSparse, see config/defaults.mk.
|
||
|
||
New and updated examples and miniapps
|
||
-------------------------------------
|
||
- Four new serial and parallel example codes that demonstrate:
|
||
* high-performance finite element operator assembly/evaluation (Example 1/1p
|
||
in miniapps/performance)
|
||
* adaptive refinement, derefinement and load balancing (in parallel) on
|
||
non-conforming meshes (Example 15/15p)
|
||
|
||
- Examples 4p now supports hybridization on non-conforming meshes.
|
||
|
||
- Examples 9p and 14p now work on non-conforming meshes.
|
||
|
||
- Example 11p now has optional support for the SuperLU parallel direct solver.
|
||
|
||
- Added several new options and example runs in the Volta and Tesla miniapps,
|
||
including support for Halbach arrays of permanent magnets.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added "check" and "test" targets to the top-level makefile. The former does a
|
||
quick check by running Example 1/1p, while the latter does a more thorough
|
||
verification of the build by running all example codes and miniapps.
|
||
|
||
- Added support for 2D and 3D meshes generated by Gmsh (http://gmsh.info), both
|
||
in ASCII and binary formats.
|
||
|
||
- Added a reader for Cubit meshes in the Genesis (NetCDF) format. Currently
|
||
supported are linear and quadratic tet and hex meshes.
|
||
|
||
- Added support for boundary bilinear form integrators when using hybridization.
|
||
|
||
- Added support for Robin boundary conditions for DG in BoundaryMassIntegrator.
|
||
|
||
- Moved all reference element connectivity descriptions, such as element-edge,
|
||
element-face, etc. to the template class Geometry::Constants<Geometry::Type>.
|
||
|
||
- Added support for secure socket communications in class socketstream based on
|
||
the GnuTLS library, see INSTALL for more details.
|
||
|
||
- Renamed config/user.mk.in to config/defaults.mk and moved all the default
|
||
build settings from the makefile there.
|
||
|
||
- Added configurable variables AR, ARFLAGS, and RANLIB in the build system. The
|
||
defaults for Mac OS X will suppress the "has no symbols" warnings.
|
||
|
||
- Various other simplifications, extensions, and bugfixes in the code.
|
||
|
||
API changes
|
||
-----------
|
||
- Changes in class Mesh
|
||
* Two-level state functionality was removed, including: UseTwoLevelState(int),
|
||
SetState(int), GetState(), GetNumFineElems(int), GetRefinementType(int),
|
||
GetFineElem(int, int) and GetFineElemTrans(int, int).
|
||
|
||
- Changes in class FiniteElementSpace
|
||
* BuildElementToDofTable() is now protected, and it is always called.
|
||
* GlobalRestrictionMatrix(FiniteElementSpace*, int) was removed, but the
|
||
prolongation operator can still be accessed via GetUpdateOperator() after
|
||
mesh refinement and a call to Update(true).
|
||
|
||
- Changes in methods related to non-conforming meshes and spaces
|
||
* The methods LinearForm::ConformingAssemble, BilinearForm::ConformingAssemble
|
||
and GridFunction::ConformingProlongate/ConformingProject are now hidden
|
||
inside (Par)BilinearForm::FormLinearSystem and RecoverFEMSolution.
|
||
* The conforming prolongation/restriction matrices can still be accessed via
|
||
FiniteElementSpace::GetConformingProlongation()/GetConformingRestriction().
|
||
|
||
- Changes in classes GridFunction and ParGridFunction
|
||
* Renamed Update((Par)FiniteElementSpace*, Vector&, int) to MakeRef.
|
||
* Renamed Update((Par)FiniteElementSpace*) to SetSpace.
|
||
|
||
|
||
Version 3.1, released on Feb 16, 2016
|
||
=====================================
|
||
|
||
Substantially improved non-conforming adaptive mesh refinement
|
||
--------------------------------------------------------------
|
||
- Added support for parallel non-conforming mesh refinement, including a new
|
||
example code with adaptive mesh refinement for the Laplace problem (Example
|
||
6p). Most of the example codes can now work on non-conforming meshes in serial
|
||
and in parallel.
|
||
|
||
- Added simple ZZ-type error estimators, including an anisotropic one in serial,
|
||
and one based on Raviart-Thomas flux projection in parallel, to the AMR
|
||
examples 6 and 6p. These seem to perform quite reasonably, even for
|
||
higher-order discretizations on 2D, 3D and surface meshes.
|
||
|
||
- The MFEM mesh format has a new version(1.1) that supports non-conforming
|
||
meshes. The format is an extension of 1.0 that includes a vertex_parents and
|
||
an optional coarse_elements section. See the example meshes amr-quad.mesh,
|
||
amr-hex.mesh and fichera-amr.mesh in the data/ directory.
|
||
|
||
- Added support for DG discretizations on non-conforming meshes in serial. See
|
||
the sample runs in Example 14.
|
||
|
||
- A new function, ParGridFunction::ParallelProject() directly returns a hypre
|
||
vector restricted to the true degrees of freedom (and supports non-conforming
|
||
meshes). In most cases, this should be preferred to the ParallelAverage()
|
||
function.
|
||
|
||
- When using non-conforming meshes, the essential boundary condition elimination
|
||
has to be applied at the end of the (parallel) assembly. Furthermore, in
|
||
serial, the bilinear form needs to call ConformingAssemble() after assembly
|
||
and the solution should call ConformingProlongate() after the solve (these are
|
||
not necessary in parallel). Note that these could also be handled
|
||
automatically by the new FEM <-> linear system interface, see below.
|
||
|
||
General finite element spaces and solvers on surfaces/skeletons
|
||
---------------------------------------------------------------
|
||
- Added support for arbitrary high-order finite element spaces on the mesh
|
||
skeleton (the faces, edges, and vertices between mesh elements) that are the
|
||
traces of the H1 and H(curl) spaces defined on the mesh. With the previously
|
||
existing H(div) trace space, the full de Rham sequence on the skeleton is now
|
||
supported.
|
||
|
||
- Updated integrators and discrete interpolators to work correctly for H(curl)
|
||
and H(div) spaces defined on surface meshes, or the mesh skeleton.
|
||
|
||
Hybridization, static condensation and a new FEM <-> linear system interface
|
||
----------------------------------------------------------------------------
|
||
- The BilinearForm/ParBilinearForm classes now support static condensation, as
|
||
well as hybridization (based on given constraint space and trace integrator).
|
||
These are illustrated in Examples 1-4.
|
||
|
||
- Added a new interface for transitioning between the finite element objects and
|
||
their corresponding linear algebra objects, which supports abstracts
|
||
transformations such as: parallel assembly, eliminating boundary conditions,
|
||
applying conforming constraints for non-conforming AMR, hybridization, static
|
||
condensation, back substitution, etc. Changed several of the example codes
|
||
accordingly.
|
||
|
||
New eigensolvers and improved solvers
|
||
-------------------------------------
|
||
- Added support for the scalable Locally Optimal Block Preconditioned Conjugate
|
||
Gradient (LOBPCG) eigenvalue solver and the Auxiliary-space Maxwell
|
||
Eigensolver (AME) from hypre.
|
||
|
||
- Added 3 new example codes to demonstrate the LOBPCG and AME applications to
|
||
the Laplace (Example 11p), Elasticity (Example 12p) and Maxwell (Example 13p)
|
||
eigenproblems.
|
||
|
||
- Updated the HypreAMS and HypreADS solvers to work for H(curl) and H(div)
|
||
problems defined on surface meshes, or the mesh skeleton.
|
||
|
||
- Added support for a discretization-enhanced version of hypre's BoomerAMG
|
||
designed specifically for linear elasticity problems, see Example 2p.
|
||
|
||
- The HypreAMS solver can now be used to solve singular curl-curl problems.
|
||
|
||
New and updated examples
|
||
------------------------
|
||
- Six new serial and parallel example codes that demonstrate:
|
||
* parallel conforming and non-conforming adaptive mesh refinement (Example 6p)
|
||
* hypre's LOBPCG eigensolver for the Laplace eigenproblem (Example 11p)
|
||
* hypre's LOBPCG eigensolver for the elasticity eigenproblem (Example 12p)
|
||
* hypre's AME eigensolver for the Maxwell eigenproblem (Example 13p)
|
||
* DG diffusion discretizations for the Laplace equation (Example 14/14p)
|
||
|
||
- Examples 1-4 now support static condensation, and Example 4/4p supports H(div)
|
||
hybridization, leading to much improved solve times. These examples also
|
||
illustrate the new interface for linear system assembly (see also Examples 6
|
||
and 7).
|
||
|
||
- Significantly improved the DPG preconditioner in Example 8p, which is now
|
||
scalable in parallel and uses the HypreADS solver to precondition the
|
||
interfacial block as an H(div) problem reduced to the mesh skeleton.
|
||
|
||
- Example 7/7p has a new option, -amr, showcasing simple local conforming and
|
||
non-conforming mesh refinements.
|
||
|
||
- Example 3/3p now works in both 2D and 3D.
|
||
|
||
New miniapps
|
||
------------
|
||
- Electromagnetic miniapps:
|
||
* Volta - simple electrostatics simulation code.
|
||
* Tesla - simple magnetostatics simulation code.
|
||
See also the README file in miniapps/electromagnetics.
|
||
|
||
- Meshing miniapps:
|
||
* Mobius Strip - generate various Mobius strip-like meshes.
|
||
* Klein Bottle - generate three types of Klein bottle surfaces.
|
||
* Mesh Explorer - visualize and manipulate meshes.
|
||
See also the README file in miniapps/meshing.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Moved MFEM from Google Code to GitHub. New website: http://mfem.org.
|
||
|
||
- Formatted the code with Artistic Style, see the "make style" target.
|
||
|
||
- Added support for 64-bit integers in global size variables, enabling
|
||
simulations with >2B unknowns. (This requires that hypre is configured with
|
||
the --enable-bigint option.)
|
||
|
||
- Added optional support for the Gecko graph reordering library.
|
||
|
||
- Updated the implementation of some operations in DenseMatrix for better
|
||
auto-vectorization. Added a new class LUFactors that computes LU factorization
|
||
(with pivoting) and perform various operations with the factored data.
|
||
|
||
- Various other simplifications, extensions, and bugfixes in the code.
|
||
|
||
|
||
Version 3.0, released on Jan 26, 2015
|
||
=====================================
|
||
|
||
Improved documentation and build system
|
||
---------------------------------------
|
||
- Added interactive example documentation in examples/README.html. This should
|
||
be the starting point for new users interested in MFEM's features.
|
||
|
||
- New Doxygen-based code documentation. Due to its size, users are expected to
|
||
build this documentation themselves by typing make in the doc/ directory.
|
||
(Alternatively, the pre-build documentation can be browsed online).
|
||
|
||
- New build system, based on GNU make which consists of configuration and build
|
||
steps: "make config; make". The MFEM build options are exported, and can be
|
||
included in external makefiles. Library installation is also supported. See
|
||
"make help" and the INSTALL file for details.
|
||
|
||
- To build the examples use 'make' or 'make -j <np>' in the examples/ directory.
|
||
Based on the current MFEM configuration this will build the serial or the
|
||
parallel examples using the same config options as the library.
|
||
|
||
New and updated examples
|
||
------------------------
|
||
- Six new serial/parallel example codes that demonstrate:
|
||
* mixed pressure-velocity FEM for Darcy (Example 5)
|
||
* non-conforming adaptive mesh refinement for Laplace (Example 6)
|
||
* Laplace problem on a surface (Example 7)
|
||
* Discontinuous Petrov-Galerkin (DPG) for Laplace (Example 8)
|
||
* Discontinuous Galerkin (DG) time-dependent advection (Example 9)
|
||
* time-dependent implicit nonlinear elasticity (Example 10)
|
||
|
||
- Added command line options to all examples and modified several of the serial
|
||
ones to optionally use the serial direct solver UMFPACK.
|
||
|
||
- Simplified the elimination of Dirichlet boundary conditions in parallel.
|
||
|
||
- Grouped and documented the example code features in examples/README.html
|
||
|
||
Serial non-conforming adaptive mesh refinement
|
||
----------------------------------------------
|
||
- Added support for general, isotropic and anisotropic, local non-conforming
|
||
mesh refinement (using hanging nodes) in 2D and 3D, on quadrilateral,
|
||
triangular and hexahedral meshes. High-order curved and surface meshes are
|
||
also supported.
|
||
|
||
- The current implementation supports serial meshes (see example 6). Extension
|
||
to parallel meshes is in active development.
|
||
|
||
- The mesh is refined with Mesh::GeneralRefinement. The non-conforming mesh is
|
||
represented as a mesh that is "cut" along non-conforming edges and faces in
|
||
the internal NCMesh class. The only thing the user has to do to obtain a
|
||
continuous solution is to call BilinearForm::ConformingAssemble and
|
||
GridFunction::ConformingProlongate before and after solving the linear system.
|
||
The finite element space and grid functions are then updated with
|
||
FiniteElementSpace::UpdateAndInterpolate().
|
||
|
||
Time-dependent problems, non-linear operators and ODE integrators
|
||
-----------------------------------------------------------------
|
||
- Added new abstract base class TimeDependentOperator and a set of explicit
|
||
Runge-Kutta time integration classes in linalg/ode.?pp.
|
||
|
||
- Added classes for diagonally implicit Runge-Kutta (DIRK) time integrators
|
||
based on the ImplicitSolve() method of TimeDependentOperator.
|
||
|
||
- Extended all coefficient classes to be optionally time-dependent.
|
||
|
||
- Added classes for general nonlinear finite element operators (deriving from
|
||
NonlinearForm/ParNonlinearForm). Such operators have assemble-based action and
|
||
also support assembly of the gradient operator to enable inversion with Newton
|
||
iteration.
|
||
|
||
Discontinuous Galerkin and Discontinuous Petrov-Galerkin methods
|
||
----------------------------------------------------------------
|
||
- Added support Discontinuous Galerkin (DG) face integrators in parallel by
|
||
extending ParMesh with information for face-neighboring processors. Added DG
|
||
support in ParFiniteElementSpace, ParBilinearForm and ParGridFunction.
|
||
|
||
- Introduced a new class of integrators for forms defined on the faces of the
|
||
mesh (including interior and boundary faces), mainly intended for hybrid
|
||
methods like HDG and DPG that employ facet (numerical trace) spaces.
|
||
|
||
Block systems and rectangular operators
|
||
---------------------------------------
|
||
- Added classes BlockOperator, BlockVector and BlockMatrix for handling block
|
||
systems with different components (e.g., pressure and velocity).
|
||
|
||
- New abstract class AbstractSparseMatrix, between Matrix and SparseMatrix
|
||
|
||
- Modified class Operator to have two separate sizes: "height" and "width" for
|
||
the output and input sizes, respectively. The Size method was removed.
|
||
|
||
- For backward compatibility, the method Size is still present in the classes
|
||
DenseMatrix (returns width as before), SparseMatrix (returns height as
|
||
before), DenseMatrixInverse (square matrix) and BilinearForm (square matrix).
|
||
|
||
Linear and non-linear solvers
|
||
-----------------------------
|
||
- New abstract class Solver, with sub-classes for sparse smoothers, dense matrix
|
||
inverse, iterative solvers (Krylov methods and Newton) and the hypre solvers.
|
||
All Krylov methods were consolidated in linalg/solver.cpp and extended to work
|
||
in parallel.
|
||
|
||
- Added several new classes of solvers and smoothers:
|
||
* serial sparse direct solvers from the SuiteSparse library (UMFPACK)
|
||
* HypreSmoother, giving access to the parallel ParCSR smoothers in hypre
|
||
* polynomial smoothers: Chebyshev, Taubin and FIR
|
||
* stationary linear iteration (SLI)
|
||
* quadratic single linearly-constrained optimization problems with bounds
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Wrapped all classes/functions/objects in a namespace called "mfem".
|
||
|
||
- Automated the creation of quadrature rules to enable on-demand generation of
|
||
arbitrary order rules for all geometries 1D/2D/3D geometries.
|
||
|
||
- Added support for saving collections of grid functions in format suitable for
|
||
visualization with VisIt (visit.llnl.gov). See examples 5 and 9.
|
||
|
||
- Added support for 1D, surface and topologically periodic meshes, as well as a
|
||
simple inline mesh format. See the data/ directory for examples.
|
||
|
||
- Added support for serial mesh optimization using the Mesquite mesh quality
|
||
improvement toolkit (see mesh/mesquite.?pp and INSTALL for details).
|
||
|
||
- Made sure that MFEM can work in parallel with empty processors and with any
|
||
MPI communicator.
|
||
|
||
- Improved high-order Bernstein basis support.
|
||
|
||
- Support for high-resolution timers (e.g. POSIX clocks).
|
||
|
||
- Improved error messages with several macros, such as MFEM_ABORT, MFEM_VERIFY,
|
||
MFEM_ASSERT, MFEM_WARNING, etc.
|
||
|
||
- Improved portability for Windows (Visual Studio) and Mac OS X.
|
||
|
||
- Various simplifications, extensions, and bugfixes in the code.
|
||
|
||
|
||
Version 2.0, released on Nov 18, 2011
|
||
=====================================
|
||
|
||
Arbitrary order finite element spaces
|
||
-------------------------------------
|
||
- Added support for arbitrary high-order finite element spaces through the new
|
||
classes H1_FECollection, L2_FECollection, RT_FECollection and ND_FECollection.
|
||
These are based on a number of new FiniteElement sub-classes H1_*, L2_*, RT_*
|
||
and ND_* elements of arbitrary order on all types of reference elements.
|
||
|
||
- The classes implement H1-conforming, L2-discontinuous, H(div)-conforming
|
||
Raviart-Thomas and H(curl)-conforming Nedelec elements on triangular,
|
||
quadrilateral, tetrahedral and hexahedral meshes. The only restriction on the
|
||
order of the spaces is the availability of the required quadrature rules.
|
||
|
||
NURBS meshes and discretization spaces
|
||
--------------------------------------
|
||
- Added a collection of classes for serial and parallel meshes and
|
||
discretization spaces using Non-uniform rational B-splines (NURBS) basis
|
||
functions (files mesh/nurbs.?pp).
|
||
|
||
- The Mesh class supports the NURBS-specific refinement functions: KnotInsert
|
||
and DegreeElevate. Example NURBS meshes can found in the 'data' directory with
|
||
file names *-nurbs.mesh including an exact non-degenerate disc
|
||
(disc-nurbs.mesh) and exact non-degenerate ball (ball-nurbs.mesh).
|
||
|
||
- We can handle arbitrary NURBS or standard, non-NURBS, finite element spaces on
|
||
NURBS meshes. However, a NURBS finite element space requires an underlying
|
||
NURBS mesh. Refinement of parallel NURBS meshes is not supported yet.
|
||
|
||
Discrete gradient, curl, etc. matrices
|
||
--------------------------------------
|
||
- Added a new class, DiscreteLinearOperator, that facilitates the construction
|
||
of matrix representations for linear operators like gradient, curl, embedding,
|
||
projection, etc. The corresponding local "interpolators" are similar to
|
||
bilinear form integrators and derive from base class DiscreteInterpolator.
|
||
Current interpolators include GradientInterpolator, IdentityInterpolator,
|
||
CurlInterpolator and DivergenceInterpolator.
|
||
|
||
- Also available is a parallel version of DiscreteLinearOperator, which
|
||
assembles parallel topological matrices (such as the discrete gradient, curl,
|
||
etc.) in hypre's ParCSR format.
|
||
|
||
New integrators
|
||
---------------
|
||
- New linear (r.h.s.) integrator VectorFEBoundaryFluxLFIntegrator for
|
||
assembling (u, v.n) on the boundary for scalar u and v in an RT space.
|
||
|
||
- New bilinear integrator VectorFECurlIntegrator for assembling (curl u, v) for
|
||
u in a ND space and v in an RT space.
|
||
|
||
New and updated examples
|
||
------------------------
|
||
- Added a new serial/parallel Example code 4/4p, which solves a 2D or 3D H(Div)
|
||
diffusion problem using the Raviart-Thomas finite elements. In parallel, the
|
||
linear system is solved with the brand-new Auxiliary-space Divergence Solver
|
||
(ADS) in hypre.
|
||
|
||
- Modified Example 1 to use isoparametric discretization (use the FE space from
|
||
the mesh) including NURBS meshes and spaces. Updated Example 2 to support
|
||
arbitrary order spaces. Updated all examples to work with NURBS meshes and
|
||
spaces, as well as to not use projection onto discontinuous polynomial spaces
|
||
for visualization (this is now handled directly in GLVis when necessary).
|
||
|
||
- In all examples, switched to a uniform "solution" socket data type instead of
|
||
the various previous "*_gf_data" data types.
|
||
|
||
- In the parallel examples, switched to parallel mesh and solution output, as
|
||
well as to the new parallel socket format in place of PrintAsOne/SaveAsOne.
|
||
|
||
New hypre solvers
|
||
-----------------
|
||
- The parallel MFEM build now requires hypre 2.8.0b or newer.
|
||
|
||
- Extended HypreAMS and HypreADS to support (arbitrary) high-order ND/RT spaces,
|
||
by internally constructing the high-order ParDiscreteLinearOperator gradient,
|
||
curl and interpolation matrices. This makes the linear solve in Example 3p and
|
||
4p significantly faster than before. Extended the HypreAMS object to also work
|
||
for 2D H(div) problems.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added new class socketstream implementing two-way tcp/ip socket communications
|
||
in the framework of C++ streams. Added new class socketserver implementing
|
||
tcp/ip server functionality: listen on a given port for incoming connections,
|
||
and accept them by assigning the new connection to a socketstream. These new
|
||
classes are meant to replace the classes isockstream and osockstream. They
|
||
allow MFEM code to update the mesh and solution via a single socket connection
|
||
to a GLVis window.
|
||
|
||
- Added new Mesh and GridFunction constructors that combine multiple Mesh and
|
||
GridFunction objects into one object. These are used in GLVis to visualize
|
||
data saved in parallel. Removed obsolete code related to reading of parallel
|
||
disjoint meshes.
|
||
|
||
- Added more quadrature rules on triangles and tetrahedra.
|
||
|
||
- Basic experimental OpenMP support (disabled by default). When enabled, OpenMP
|
||
code is used for local matrix assembly, sparse matrix-vector product, and some
|
||
vector operations.
|
||
|
||
- Added support for METIS 5.0 (not the default, see INSTALL).
|
||
|
||
- Various simplifications, extensions, and bugfixes in the code.
|
||
|
||
|
||
Version 1.2, released on Apr 08, 2011
|
||
=====================================
|
||
|
||
Parallel MPI-based version of the library based on hypre
|
||
--------------------------------------------------------
|
||
- New MPI parallel version of the library based on the ParCSR parallel matrix
|
||
format from hypre and the metis graph partitioning library. This version
|
||
supports parallel local refinement and parallel curved meshes, as well as
|
||
several solvers from hypre.
|
||
|
||
New serial and parallel examples
|
||
--------------------------------
|
||
- Added a new example code describing an electromagnetic diffusion problem
|
||
discretized with lowest order Nedelec finite elements (Example 3).
|
||
|
||
- Added parallel versions of all examples codes (files ex1p.cpp, ex2p.cpp and
|
||
ex3p.cpp) based on hypre's BoomerAMG and AMS preconditioners.
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added support for saving and reading linear and curved quadratic meshes in VTK
|
||
format. The format is automatically recognized when opening a mesh file, and
|
||
the boundary is reconstructed based on the actual domain boundary.
|
||
|
||
- The 'data' directory now contains a collection of various mesh files in the
|
||
MFEM and VTK formats, including curved meshes and the mesh files that were
|
||
previously in the 'examples' directory.
|
||
|
||
- Updated the default integration rule order for most of the linear form
|
||
integrators.
|
||
|
||
- Added support for cubic hex elements.
|
||
|
||
- Bugfixes in the face orientation of 3D RT0 elements and in the VectorFEDomain
|
||
linear form integrator.
|
||
|
||
- Various small fixes and styling updates.
|
||
|
||
|
||
Version 1.1, released on Sep 13, 2010
|
||
=====================================
|
||
|
||
New MFEM format for general meshes
|
||
----------------------------------
|
||
- New MFEM mesh v1.0 format with uniform structure for any dimension and support
|
||
for curved meshes including in 3D. Class Mesh will recognize and read the new
|
||
format (in addition to all previously used formats) and Mesh::Print uses the
|
||
new format by default. The old print function was renamed to Mesh::PrintXG.
|
||
|
||
New elasticity example
|
||
----------------------
|
||
- Added an example code for linear elasticity with (high-order) vector finite
|
||
elements (Example 2).
|
||
|
||
Miscellaneous
|
||
-------------
|
||
- Added Mesh::PrintVTK and GridFunction::SaveVTK methods for output in VTK
|
||
format.
|
||
|
||
- Implemented GeometryRefiner::Refine for CUBE and TETRAHEDRON geometries. This
|
||
allows for saving curved meshes in the VTK format.
|
||
|
||
- Added SConstruct file for mfem/examples.
|
||
|
||
- Various small fixes and styling updates.
|
||
|
||
|
||
Version 1.0, released on Jul 21, 2010
|
||
=====================================
|
||
|
||
- Uploaded to http://mfem.googlecode.com.
|
||
|
||
- Initial release.
|