Commit Graph
104 Commits
Author SHA1 Message Date
Veselin Dobrev 798ded1f55 Merge branch 'master' into memory-dev 2019-05-22 23:53:04 -07:00
Veselin Dobrev 40378a046b Introduce a new Memory class for handling host + device allocations
and transfers.

The Memory class is now used by some MFEM classes (like Array and
Vector) which can be used on the Device. Such classes now provide
methods to access the underlying Memory object, e.g. GetMemory.

Updated ex1/ex1p and ex6/ex6p to not need to enable/disable the
Device at specific points -- the Device is now enabled just at the
start. Also, the same examples can now run on Device (e.g. -d cuda)
without the partial assembly option (-pa) -- full assembly will
be still done on CPU but the sparse matrix action and vector
operations will be done using the Device.

Reverted changes in class DenseMatrix related to using the Device.
At this point, DenseMatrix operations are only used for small matrices
and using the Device in this case is not a good option.
2019-05-16 14:53:39 -07:00
Tzanio 5b00c3d0e6 Merge branch 'master' into stefanozampini/small-improvements
Conflicts:
	fem/bilininteg.hpp
2019-05-15 11:38:18 -07:00
camierjs 6e82bd6ada Update new nodes before rebalancing 2019-04-19 17:01:07 -07:00
Veselin Dobrev b750de4608 In ParMesh::Rebalance(), check for nodes before checking for
parallel FE space.
2019-04-11 13:53:58 -07:00
Veselin Dobrev 14f063d608 In ParMesh::Rebalance, make sure the mesh nodes use a ParGridFunction. 2019-04-11 12:36:29 -07:00
camierjs 2020335b50 Renaming + free functions in mfem namespace 2019-04-09 18:17:00 -07:00
camierjs 8411c70cb6 make style 2019-04-04 14:01:46 -07:00
Will Pazner a5ecb742a0 Revert to using new and delete
Also rename mm::malloc to mm::New and mm::free to mm::Delete.
2019-04-04 13:44:10 -07:00
Tzanio Kolev d9917cb13f Merge branch 'master' into okina 2019-03-29 09:33:16 -07:00
Andrew T. Barker 7af1ef647c pmesh: delete faces_tbl in UniformRefinement3D() 2019-03-22 10:03:31 -07:00
Stefano Zampini c7eeca7c51 WIP: specify partitioning for NCMesh 2019-03-18 11:34:24 +03:00
camierjs eb68f79ee2 MM sanitized 2019-02-28 12:47:09 -08:00
camierjs 842a59f6dc Merge branch 'master' into okina 2019-02-27 16:14:32 -08:00
Veselin Dobrev 169b0e679b In ParMesh::NonconformingRefinement, delete face-neighbor-data so
that it can be reconstructed correctly when needed.

This should resolve GitHub issue #739.
2019-02-12 17:11:44 -08:00
Tzanio 677b6f8aad Merge branch 'master' into okina
Conflicts:
	fem/bilinearform.hpp
	fem/pbilinearform.hpp
	makefile
2018-12-18 10:07:49 -08:00
Jakub Červený 588548b13d WIP fix order of shared entities in ParMesh compatibility groups. 2018-11-16 17:30:50 +01:00
camierjs 668ad9c5ac ex1p host mode through memory manager 2018-11-01 10:21:09 -07:00
Veselin Dobrev 9032dd3c9a Fix a bug in ParMesh::PrintAsOne
Reported by: @Dan2997925
2018-10-23 16:34:34 -07:00
Jakub Cerveny 52a3e70765 Removed unused parameter in ParMesh::FindSharedVertices. 2018-10-18 17:46:59 -07:00
Jakub Cerveny cc9df02fe5 Merge branch 'master' into cut-mesh-groups-dev-3 2018-10-12 17:03:22 +02:00
Tzanio b1537b5648 Small edits 2018-10-10 17:54:26 -07:00
Veselin Dobrev da2fb88a17 Improved uniform refinement of tetrahedral meshes
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.
2018-09-27 21:04:58 -07:00
Veselin Dobrev 46d92466fa Simplify the uniform-refinement mesh methods.
In the classes Mesh and ParMesh:

* Small optimization in Mixed3DUniformRefinement for hex-only meshes.
* In Mixed3DUniformRefinement, use marker array instead of std::map.
* Rename the methods Mixed{2D,3D}UniformRefinement to
  UniformRefinement{2D,3D}.
* Remove the methods {Quad,Hex,Wedge}UniformRefinement and use
  UniformRefinement{2D,3D} instead. In terms of performance, the
  difference was negligible.
2018-09-20 20:17:30 -07:00
Jakub Cerveny 200c906e3c Merge branch 'master' into cut-mesh-groups-dev-3 2018-09-19 20:32:26 +02:00
Veselin Dobrev 0f828353da Rework the changes in the parallel mesh format methods in ParMesh.
The goal was to preserve the parallel format from 'master' while
supporting the new features in this branch, prism-dev/prism-dev-dev-2.
2018-09-18 14:42:42 -07:00
Jakub Cerveny b995f44a41 Added GetConformingSharedStructures call to ParMesh::NonconformingDerefinement. 2018-09-18 21:16:08 +02:00
Veselin Dobrev e47d652a88 Bugfix in the ParMesh constructor from serial Mesh.
The issue was: in the transition from serial to parallel mesh, a
shared triangle face was rotated (marked for bisection refinement)
if its processor-local adjacent element was a tetrahedron with a
non-zero refinement flag. This led to inconsistent shared triangles
in the two neighbor processors when the other adjacent element was
a wedge.

The solution is to apply the shared triangle rotation only when
we have a tet-only mesh (globally).
2018-09-16 16:40:06 -07:00
Veselin Dobrev f9694c3c2b Simplified data structures in class ParMesh
In class ParMesh:

* Introduced internal struct's Vert3 and Vert4 holding 3 and 4
  integers, respectively.

* Replaced 'shared_faces' with two separate arrays 'shared_trias'
  and 'shared_quads' with types Array<Vert3> and Array<Vert4>,
  respectively.

* Removed the arrays 'stria_lface', 'squad_lface', 'stria_sface',
  'squad_sface', and 'sface_stype'.

* Restore the array 'sface_lface' used previously. Shared face
  indices are shred triangle / quad indices offset by 0 / "number
  of shared triangles", respectively.

* Made the two RefineGroups methods protected.

* Added two new protected methods: UniformRefineGroups2D and
  UniformRefineGroups3D. These two methods simplify the
  implementations of almost all uniform-refinement methods in
  the class.

* Fixed a bug in ReorderTetMesh that was causing ex8p to fail with
  fichera-mixed.mesh.

* Updated the implementations of all ParMesh methods as necessary
  due to the above changes.

In class Triangle, add a static method MarkEdge that works on a
given array of 3 indices.

In class Array, add a method CopyTo - implemented using std::copy.
2018-09-16 14:30:09 -07:00
Jakub Cerveny 3506544b42 ParNCMesh cannot take prescribed partitioning (at the moment).
Reorganized and added a warning.
2018-09-16 20:42:13 +02:00
Jakub Cerveny 132cd5d316 Fixed merging errors, removed TODOs. 2018-09-16 20:41:15 +02:00
Jakub Cerveny 2bec165a83 Trying to reorder refactored methods to minimize diff to master. 2018-09-16 19:19:10 +02:00
Jakub Cerveny b11335c3ab ParMesh compatibility: creating shared_edges, shared_faces. 2018-09-14 20:20:55 +02:00
Jakub Cerveny b4d3473dab Conforming groups (ParallelAverage) seem to work for linear elements. 2018-09-14 16:45:15 +02:00
Veselin Dobrev 4f059c1898 Merge branch 'prism-dev' into prism-dev-dev-2 2018-09-12 21:46:11 -07:00
Stowell, Mark L 5cce8731af Bugfix: missing indirection in element lookup 2018-09-12 21:17:27 -07:00
Veselin Dobrev 7c0b8c3147 Merge branch 'prism-dev' into prism-dev-dev-2 2018-09-12 17:31:49 -07:00
Stowell, Mark L 74813abf09 Merging group_stria and group_squad within ParMesh::ExchangeFaceNbrData when necessary 2018-09-11 15:18:25 -07:00
Veselin Dobrev 0d6d850e09 Updates related to wedge/prism elements and mixed meshes.
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.
2018-09-10 14:22:14 -07:00
Stowell, Mark L 40a9f507e0 Merge remote-tracking branch 'origin/master' into prism-dev 2018-09-08 14:55:18 -07:00
Jakub Cerveny b9626e8f2b ParMesh: some const correctness and minor stuff. 2018-09-07 17:22:39 +02:00
Jakub Červený 9ff338c6e4 Cosmetic changes done while studying the branch. 2018-08-30 14:44:18 +02:00
Jakub Červený 1e9c62eb8d make style 2018-08-29 16:45:10 +02:00
Jakub Červený 450dc4cd8b Implemented ParNCMesh copy constructor, enabled copying NC ParMesh. 2018-08-28 13:42:52 +02:00
Robert W. Anderson b6df5d2805 add declarations needed for merged code 2018-08-27 16:10:29 -07:00
Robert W. Anderson c6f0d84b31 cherry pick 5caee from branch 2018-08-27 16:04:36 -07:00
Robert W. Anderson 3a8c0ddc5e merge eba6d48 from branch and resolve conflicts 2018-08-27 16:03:29 -07:00
Stowell, Mark L 960ba8a8c2 Changing "pri" to "wedge" or "wdg" is several places. 2018-08-27 14:23:11 -07:00
Stowell, Mark L a47d70cfba make style 2018-08-17 21:51:33 -07:00
Stowell, Mark L 1e100b3f26 Merge remote-tracking branch 'origin/master' into prism-dev
# Conflicts:
#	mesh/pmesh.cpp
2018-08-17 21:51:16 -07:00