In class Mesh/ParMesh:
* Move the serial implementation of UniformRefinement3D to a new
method: UniformRefinement3D_base. The implementations of the virtual
method UniformRefinement3D (which now have no parameters) use the
new UniformRefinement3D_base method.
* In UniformRefinement3D_base, implemented two algorithms for choosing
how to split the middle octahedron when refining a tetrahedron by
cutting off its four corner tets. (These four tets have the same
shape as the original tet and half the edge-length.) The choice of
the algorithm is hard-coded in a const variable for now.
* Add an optional parameter to UniformRefinement which is used to
choose how to refine tet-only meshes: the default choice is to use
the new algorithm defined by UniformRefinement3D; the second option
is to use the old default - call LocalRefinement (marking all
elements) to perform 3 levels of bisection. The new algorithm
always produces elements with better shape (aspect ratio) than the
old default (at least for the meshes in the data/ directory and a
few other meshes).
* Make the method Finalize virtual - its implementation in parallel
requires updates in the ParMesh data.
* Add a consistency check in ParMesh::ReorientTetMesh that verifies
the assumption made in the method about the update of the shared
triangles.
* Simplify implementation of some methods in class ParMesh by
separating common code in a new protected method: FinalizeParTopo.
Other updates:
* In the examples and miniapps, when using a tet-only mesh which is
first refined uniformly and then locally, it is now necessary to
call the method Mesh::Finalize(true) (which is now virtual) in order
to mark the elements for local refinement after the uniform
refinement.
* In example 12p, use better random seed values.
* In examples 3/3p, add a sample run with order=2 on a tet mesh - this
will test the methods {Mesh,ParMesh}::ReorientTetMesh. Previously,
these were only tested by one sample run in example 4p.
* In the mesh-explorer miniapp, add a refinement option to perform
uniform refinement of tet-only meshes using bisection.
* In the MFEM_LOCATION macro print the <file> and <line> location
using a standard format: <file>:<line>, as used by most compilers
when reporting warnings and errors.
* Remove FIXME comments about mesh format v1.0.1.
List of changes and additions:
* In class Mesh:
* Replaced the data fields BaseGeom, BaseBdrGeom, and BaseFaceGeom
with a new data field: mesh_geoms that is a bitwise mask for all
Geometry::Types found in the (local) Mesh including entities of
lower dimensions.
* The new data field mesh_geoms is set by the method SetMeshGen.
* Removed the (protected) method InitBaseGeom.
* Add new methods: HasGeometry, GetNumGeometries, and GetGeometries
that can be used to query the content of mesh_geoms. Also, added
class Mesh::GeometryList that can simplify such queries too.
* The methods GetFaceBaseGeometry, GetElementBaseGeometry, and
GetBdrElementBaseGeometry no longer have a default value for
their input parameter (the entity index) and accept only values
within their respective ranges.
* Removed the parameter of the method GetRefinementTransforms.
* Updated the methods PrepareNodeReorder and DoNodeReorder to
support mixed meshes.
* In parallel, the data field meshgen is now required to represent
information about the global mesh - updated relevant ParMesh
methods.
* Made any required changes outside of class Mesh due to the above
changes.
* Made various tweaks and improvements in the following methods:
CheckBdrElementOrientation, Mixed2DUniformRefinement,
Mixed3DUniformRefinement, UniformRefinement, and
GeneralRefinement.
* Updated the method PrintCharacteristics to print the types of
elements, boundary elements and faces used in the mesh.
* In the method ReadInlineMesh, replace remaining "pri" strings
with "wedge".
* In the mesh reader method ReadGmshMesh, recover the term "prism"
in the comments - it was replaced, unintentionally, I assume,
by "wedge".
* Add support for refinement of curvilinear mixed meshes:
* In class FiniteElementSpace, updated the methods:
GetLocalRefinementMatrices, GetLocalDerefinementMatrices,
RefinementMatrix, RefinementMatrix_main, as well as class
RefinementOperator to support mixed meshes.
* Add two new meshes: star-mixed-p2.mesh and fichera-mixed-p2.mesh
which represent examples of quadratic mixed meshes in 2D and 3D,
respectively.
* Add sample runs in ex1/ex1p using the new quadratic mixed meshes.
* In class Geometry:
* In the enumeration Type: removed the constant MIXED and added
new constant: NUM_GEOMETRIES.
* Add new static data field: DimStart[] that indexes the Types by
dimension: the Types of dimension 'd' are given by the range
[ DimStart[d], DimStart[d+1] ).
* In class ParNCMesh, added method GetGhostFaceGeometry that,
for now, returns Geometry::SQUARE.
* Update the return type of the method DofOrderForOrientation in
class FiniteElementCollection (and all derived classes) from
'int *' to 'const int *'.
* Removed the virtual method Element::GetRefinementFlag and made
the only relevant derived version (in class Tetrahedron),
non-virtual.
* In class Tetrahedron, added method Init.
* Added FIXME comments for some outstanding issues.
* In the mesh-explorer miniapp:
* Added option to enable or disable the 'refine' parameter when
reading a mesh from file.
* In the 'jitter' menu option, ask the user if the boundary
nodes should be moved or not.
* In the 'Print sub-element stats' menu option, count and print
bad/inverted elements by their Geometry::Type as well.
* Removed the fixed low-order finite element classes for wedges.
* Replace more cases of 'int' variables with 'Geometry::Type',
mainly in class FiniteElement and its derived classes.
* Use constants from BasisType (instead of Quadrature1D) in the
parameters of the *WedgeElement finite element classes.
* Impose ordering on the construction of some global objects by
moving them into the same translation unit: specifically, moved
the objects 'TriangleFE', 'TetrahedronFE', 'WedgeFE', and
'Geometries' into fem/fe.cpp.
* In switchs on 'Geometry::Type', move the 'Geometry::PRISM' case
last - just to follow the order in the enumeration.
* Add a new method CoarseFineTransformations::GetPointMatrices
that simplifies some code that uses CoarseFineTransformations.
* Removed the 'INVALID' and 'MIXED' constants from the enum
Element::Type.
* Remove the static method Element::GeometryType.
* Tweak some doxygen comments in the classes Embedding and
CoarseFineTransformations.
* Generate an error if the method Wedge::GetNFaces is called:
its parameter 'nFaceVertices' does not make sense for wedges.
Added two new functions to Mesh:
> Bisection(int, HashTable<Hashed2> &)
> BdrBisection(int, HashTable<Hashed2> &)
which are adapted to the new data structure.
Added also an overload to Element::NeedRefinement with HashTable<Hashed2> and implemented it for Tetrahedron and Triangle.
Rewrote the tetrahedron case in LocalRefinement by changing the DSTable v_to_v to an HashMap<Hashed2> object.