The main documentation of the Initialize_Uniform_Multi_Mesh Procedure contains additional explanation of this code listing.
subroutine Initialize_Uniform_Multi_Mesh (Mesh, NDimensions, Lengths, &
NCells_X_total, NCells_Y_total, &
NCells_Z_total, Mesh_Name, status)
! Input variables.
type(integer), intent(in) :: NDimensions ! Number of Dimensions.
type(real,1,np), intent(in) :: Lengths ! Physical extent of the
! domain in each direction.
! Total number of cells in the X-, Y-, and Z-directions.
type(integer), intent(in) :: NCells_X_total
type(integer), intent(inout), optional :: NCells_Y_total
type(integer), intent(inout), optional :: NCells_Z_total
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(character,name_length) :: Shape ! Cell shape.
type(character,name_length) :: Geometry ! Cell geometry (Cartesian).
type(character,name_length) :: Uniformity ! Set to "Uniform".
type(character,name_length) :: Orthogonality ! Set to "Orthogonal".
type(character,name_length) :: Structure ! Set to "Structured".
type(logical) :: AMR ! Set to false.
type(Status_type), dimension(20) :: allocate_status ! Allocation Status.
type(Status_type) :: consolidated_status ! Consolidated Status.
type(integer) :: NPEs_X ! Number of PEs in X.
type(integer) :: NPEs_Y ! Number of PEs in Y.
type(integer) :: NPEs_Z ! Number of PEs in Z.
! Structure length vectors, which give numbers for all PEs.
type(integer,1) :: NCells_Vector ! Number of cells.
type(integer,1) :: NCells_X_Vector ! Number of cells in the X direction.
type(integer,1) :: NCells_Y_Vector ! Number of cells in the Y direction.
type(integer,1) :: NCells_Z_Vector ! Number of cells in the Z direction.
type(integer,1) :: NFaces_Vector ! Number of faces.
type(integer,1) :: NNodes_Vector ! Number of nodes.
type(integer,1) :: NNodes_X_Vector ! Number of nodes in the X direction.
type(integer,1) :: NNodes_Y_Vector ! Number of nodes in the Y direction.
type(integer,1) :: NNodes_Z_Vector ! Number of nodes in the Z direction.
! Location of this_PE in the PE-mesh.
type(integer) :: this_PE_X, this_PE_Y, this_PE_Z
type(integer) :: node, pe_x, pe_y, pe_z ! Loop parameters.
! Offsets - starting points for this PE.
type(real) :: Offset_PE_X, Offset_PE_Y, Offset_PE_Z ! 1st node coordinates.
! 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
! The cells for the cells (that is, across each face) on this PE.
type(integer,2) :: Cells_of_Cells_PE
! Face Flags for Structured Meshes.
type(integer,2) :: Flag_Faces_of_Cells
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
! Mesh type info is valid.
VERIFY(NDimensions .InInterval. (/1, 3/),5)
VERIFY(SIZE(Lengths) == NDimensions,5) ! Lengths is correct size.
! Allocations and initializations.
call Initialize (allocate_status)
call Initialize (consolidated_status)
! Generate the connectivity.
call Gen_StructureMesh_Connectivity (NDimensions, Lengths, &
NCells_X_total, NCells_Y_total, NCells_Z_total, Shape, Structure, AMR, &
NPEs_X, NPEs_Y, NPEs_Z, this_PE_X, this_PE_Y, this_PE_Z, &
NNodes_Vector, NCells_Vector, NFaces_Vector, &
NCells_X_Vector, NCells_Y_Vector, NCells_Z_Vector, &
NNodes_X_Vector, NNodes_Y_Vector, NNodes_Z_Vector, &
Nodes_of_Cells_PE, Cells_of_Cells_PE, Flag_Faces_of_Cells, &
allocate_status(1))
! Set mesh type info for a Uniform Mesh.
Geometry = 'Cartesian'
Uniformity = 'Uniform'
Orthogonality = 'Orthogonal'
! Set Offsets for coordinates on this PE.
if (this_PE_X == 1) then
Offset_PE_X = zero
else
Offset_PE_X = SUM(NCells_X_Vector(1:this_PE_X-1)) * &
Lengths(1) / NCells_X_total
end if
if (NDimensions >= 2) then
if (this_PE_Y == 1) then
Offset_PE_Y = zero
else
Offset_PE_Y = SUM(NCells_Y_Vector(1:this_PE_Y-1)) * &
Lengths(2) / NCells_Y_total
end if
end if
if (NDimensions == 3) then
if (this_PE_Z == 1) then
Offset_PE_Z = zero
else
Offset_PE_Z = SUM(NCells_Z_Vector(1:this_PE_Z-1)) * &
Lengths(3) / NCells_Z_total
end if
end if
! Set Node Coordinates on this PE.
call Initialize (Coordinates_Nodes_PE, NDimensions, &
NNodes_Vector(this_PE), allocate_status(2))
node = 1
do pe_z = 1, NNodes_Z_Vector(this_PE_Z)
do pe_y = 1, NNodes_Y_Vector(this_PE_Y)
do pe_x = 1, NNodes_X_Vector(this_PE_X)
Coordinates_Nodes_PE(1,node) = &
Offset_PE_X + (pe_x-1) * Lengths(1) / NCells_X_total
if (NDimensions >= 2) then
Coordinates_Nodes_PE(2,node) = &
Offset_PE_Y + (pe_y-1) * Lengths(2) / NCells_Y_total
end if
if (NDimensions == 3) then
Coordinates_Nodes_PE(3,node) = &
Offset_PE_Z + (pe_z-1) * Lengths(3) / NCells_Z_total
end if
! Increment node.
node = node + 1
end do
end do
end do
VERIFY((node-1)==NNodes_Vector(this_PE),5)
! Initialize the Multi-Mesh object.
call 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, &
allocate_status(3))
! Set Mesh%Cells_of_Cells_Index and Mesh%Flag_Faces_of_Cells.
call Initialize (Mesh%Cells_of_Cells_Index, Mesh%Cell_Structure, &
Mesh%Cell_Structure, &
Many_of_One_Array=Cells_of_Cells_PE, &
status=allocate_status(4))
call Initialize (Mesh%Flag_Faces_of_Cells, NCells_Vector(this_PE), &
NDimensions*2, allocate_status(5))
Mesh%Flag_Faces_of_Cells = Flag_Faces_of_Cells
! Set Uniform-mesh specific variables.
! Set physical dimensions of the mesh (Lengths).
call Initialize (Mesh%Lengths, NDimensions, allocate_status(6))
Mesh%Lengths = Lengths
! Set volume for all cells.
select case (NDimensions)
case (1)
! Suppressed Y, Z.
Mesh%Volume_All_Cells = Lengths(1) / NCells_X_total
case (2)
! Suppressed Z.
Mesh%Volume_All_Cells = Lengths(1) / NCells_X_total * &
Lengths(2) / NCells_Y_total
case (3)
Mesh%Volume_All_Cells = Lengths(1) / NCells_X_total * &
Lengths(2) / NCells_Y_total * &
Lengths(3) / NCells_Z_total
end select
! Set area for all faces (3 types in 3-D).
call Initialize (Mesh%Area_All_Faces, NDimensions, allocate_status(7))
select case (NDimensions)
case (1)
! Suppressed Y, Z.
Mesh%Area_All_Faces(1) = one
case (2)
! Suppressed Z.
Mesh%Area_All_Faces(1) = Lengths(2) / NCells_Y_total
Mesh%Area_All_Faces(2) = Lengths(1) / NCells_X_total
case (3)
Mesh%Area_All_Faces(1) = Lengths(2) / NCells_Y_total * &
Lengths(3) / NCells_Z_total
Mesh%Area_All_Faces(2) = Lengths(1) / NCells_X_total * &
Lengths(3) / NCells_Z_total
Mesh%Area_All_Faces(3) = Lengths(1) / NCells_X_total * &
Lengths(2) / NCells_Y_total
end select
! Finalize temporary variables.
call Finalize (Cells_of_Cells_PE, allocate_status(8))
call Finalize (Coordinates_Nodes_PE, allocate_status(9))
call Finalize (Flag_Faces_of_Cells, allocate_status(10))
call Finalize (NCells_Vector, allocate_status(11))
call Finalize (NCells_X_Vector, allocate_status(12))
call Finalize (NCells_Y_Vector, allocate_status(13))
call Finalize (NCells_Z_Vector, allocate_status(14))
call Finalize (NFaces_Vector, allocate_status(15))
call Finalize (NNodes_Vector, allocate_status(16))
call Finalize (NNodes_X_Vector, allocate_status(17))
call Finalize (NNodes_Y_Vector, allocate_status(18))
call Finalize (NNodes_Z_Vector, allocate_status(19))
call Finalize (Nodes_of_Cells_PE, allocate_status(20))
! 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)
end subroutine Initialize_Uniform_Multi_Mesh