The main documentation of the Initialize_Base_Multi_Mesh Procedure contains additional explanation of this code listing.
subroutine Initialize_Base_Multi_Mesh (Mesh, NDimensions, Geometry, &
Uniformity, Orthogonality, Structure, AMR, Shape, &
NNodes_Vector, NCells_Vector, NFaces_Vector, &
Coordinates_Nodes_PE, Nodes_of_Cells_PE, Mesh_Name, status)
! Use associations.
use Caesar_Flags_Module, only: initialized_flag
! ~~~~~~~~~~~~~~~~
! Input variables.
! ~~~~~~~~~~~~~~~~
! Mesh type information.
type(integer), intent(in) :: NDimensions ! Number of Dimensions.
type(character,*), intent(in) :: Geometry ! Mesh geometry.
type(character,*), intent(in) :: Uniformity ! Uniform or Nonuniform.
type(character,*), intent(in) :: Orthogonality ! Orthogonal or
! Nonorthogonal.
type(character,*), intent(in) :: Structure ! Structured or
! Unstructured.
type(logical), intent(in) :: AMR ! Adaptive Mesh Refinement.
type(character,*), intent(in) :: Shape ! Cell shape.
! Structure length vectors, which give numbers for all PEs.
type(integer,1) :: NNodes_Vector ! Number of nodes.
type(integer,1) :: NCells_Vector ! Number of cells.
type(integer,1) :: NFaces_Vector ! Number of faces.
! Mesh coordinates and indices.
! The coordinates of the nodes on this PE.
type(real,2) :: Coordinates_Nodes_PE
! The nodes for the cells on this PE.
type(integer,2) :: Nodes_of_Cells_PE
type(character,*), intent(in), optional :: Mesh_Name ! Mesh name.
! ~~~~~~~~~~~~~~~~~
! Output variables.
! ~~~~~~~~~~~~~~~~~
! Multi_Mesh to be initialized.
type(Multi_Mesh_type), intent(inout) :: Mesh
type(Status_type), intent(out), optional :: status ! Exit status.
! ~~~~~~~~~~~~~~~~~~~
! Internal variables.
! ~~~~~~~~~~~~~~~~~~~
type(Status_type), dimension(20) :: allocate_status ! Allocation Status.
type(Status_type) :: consolidated_status ! Consolidated Status.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
! Mesh type info is valid.
VERIFY(NDimensions .InInterval. (/1, 3/),5)
VERIFY(Geometry .InSet. Geometry_Options,5)
VERIFY(Uniformity .InSet. Uniformity_Options,5)
VERIFY(Orthogonality .InSet. Orthogonality_Options,5)
VERIFY(Structure .InSet. Structure_Options,5)
VERIFY(Valid_State(AMR),5)
VERIFY(Shape .InSet. Shape_Options,5)
! Mesh length vectors are correct length.
VERIFY(SIZE(NNodes_Vector) == NPEs,5)
VERIFY(SIZE(NCells_Vector) == NPEs,5)
VERIFY(SIZE(NFaces_Vector) == NPEs,5)
! Input arrays are correct size.
VERIFY(SIZE(Coordinates_Nodes_PE,1) == NDimensions,5)
VERIFY(SIZE(Coordinates_Nodes_PE,2) == NNodes_Vector(this_PE),5)
VERIFY(SIZE(Nodes_of_Cells_PE,1) == NCells_Vector(this_PE),5)
VERIFY(SIZE(Nodes_of_Cells_PE,2) == 2**NDimensions,5)
! Set up internals.
if (PRESENT(Mesh_Name)) Mesh%Name = Mesh_Name
! Set Mesh type information.
Mesh%NDimensions = NDimensions
Mesh%Geometry = Geometry
Mesh%Uniformity = Uniformity
Mesh%Orthogonality = Orthogonality
Mesh%Structure = Structure
Mesh%AMR = AMR
Mesh%Shape = Shape
! Mesh scalar info.
Mesh%NCells_total = SUM(NCells_Vector)
Mesh%NCells_PE = NCells_Vector(this_PE)
Mesh%Last_Cell_PE = SUM(NCells_Vector(1:this_PE))
Mesh%First_Cell_PE = Mesh%Last_Cell_PE - Mesh%NCells_PE + 1
Mesh%Range_Cells_PE = (/ Mesh%First_Cell_PE, Mesh%Last_Cell_PE /)
Mesh%NNodes_total = SUM(NNodes_Vector)
Mesh%NNodes_PE = NNodes_Vector(this_PE)
Mesh%Last_Node_PE = SUM(NNodes_Vector(1:this_PE))
Mesh%First_Node_PE = Mesh%Last_Node_PE - Mesh%NNodes_PE + 1
Mesh%Range_Nodes_PE = (/ Mesh%First_Node_PE, Mesh%Last_Node_PE /)
Mesh%NFaces_total = SUM(NFaces_Vector)
Mesh%NFaces_PE = NFaces_Vector(this_PE)
Mesh%Last_Face_PE = SUM(NFaces_Vector(1:this_PE))
Mesh%First_Face_PE = Mesh%Last_Face_PE - Mesh%NFaces_PE + 1
Mesh%Range_Faces_PE = (/ Mesh%First_Face_PE, Mesh%Last_Face_PE /)
select case (Mesh%Shape)
! Type 1 meshes.
case ('Tetrahedral', 'Triangular')
Mesh%Nodes_per_Cell = NDimensions+1
Mesh%Nodes_per_Face = NDimensions
Mesh%Faces_per_Cell = NDimensions+1
! Type 2 meshes:
case ('Segmented', 'Quadrilateral', 'Hexahedral')
Mesh%Nodes_per_Cell = 2**NDimensions
Mesh%Nodes_per_Face = 2**(NDimensions-1)
Mesh%Faces_per_Cell = 2*NDimensions
! Type N meshes.
case ('Polygonal', 'Polyhedral')
Mesh%Nodes_per_Cell = 0
Mesh%Nodes_per_Face = 0
Mesh%Faces_per_Cell = 0
end select
! Segmented is either Type 1 or Type 2.
! Allocations and initializations.
call Initialize (allocate_status)
call Initialize (consolidated_status)
! Set up mesh structures.
call Initialize (Mesh%Node_Structure, NNodes_Vector, 'Nodes', &
allocate_status(1))
call Initialize (Mesh%Cell_Structure, NCells_Vector, 'Cells', &
allocate_status(2))
call Initialize (Mesh%Face_Structure, NFaces_Vector, 'Faces', &
allocate_status(3))
! Set Mesh coordinates.
call Initialize (Mesh%Coordinates_Nodes_DV, Mesh%Node_Structure, &
2, 'Coordinates of Nodes', status, NDimensions)
Mesh%Coordinates_Nodes_DV = Coordinates_Nodes_PE
! Set Mesh indices.
call Initialize (Mesh%Nodes_of_Cells_Index, Mesh%Node_Structure, &
Mesh%Cell_Structure, &
Many_of_One_Array=Nodes_of_Cells_PE, &
status=allocate_status(4))
! Consolidate and handle status.
consolidated_status = allocate_status
if (PRESENT(status)) then
WARN_IF(Error(consolidated_status), 5)
status = consolidated_status
else
VERIFY(Normal(consolidated_status), 5)
end if
call Finalize (consolidated_status)
call Finalize (allocate_status)
! Set initialization flag.
Mesh%Initialized = initialized_flag
! Verify guarantees.
VERIFY(Valid_State(Mesh),5) ! Mesh is now valid.
return
end subroutine Initialize_Base_Multi_Mesh