The main documentation of the Get_Volume_Cells_Multi_Mesh Procedure contains additional explanation of this code listing.
subroutine Get_Volume_Cells_Multi_Mesh (Volume_Cells, Mesh) ! Input variable. type(Multi_Mesh_type), intent(inout) :: Mesh ! Mesh object. ! Input/Output variable. type(real,1) :: Volume_Cells ! Volume_Cells BNV. ! Internal variable. ! BNV of coordinates of nodes of cells. type(real,3) :: Coordinates_Nodes_of_Cells !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(Mesh),5) ! Mesh is valid. VERIFY(Valid_State(Volume_Cells),5) ! Volume_Cells is valid. VERIFY(Mesh%NCells_PE == SIZE(Volume_Cells),5) ! Correct dimensions. ! Get Coordinates of the Nodes if needed. if (Mesh%Uniformity == "Nonuniform") then call Initialize (Coordinates_Nodes_of_Cells, Mesh%NDimensions, & Mesh%NCells_PE, Mesh%Nodes_per_Cell) call Get_Coordinates_Nodes_of_Cells (Coordinates_Nodes_of_Cells, Mesh) end if ! Set the cell volumes. if (Mesh%Uniformity == "Uniform") then ! For a uniform mesh, all volumes are the same. Volume_Cells = Mesh%Volume_All_Cells else if (Mesh%Orthogonality == "Orthogonal") then ! For an orthogonal mesh, the volume may be calculated from the ! product of 1, 2 or 3 orthogonal edge lengths. select case (Mesh%NDimensions) case (1) ! Suppressed Y, Z. Volume_Cells = ( Coordinates_Nodes_of_Cells(1,:,2) & ! Delta X - - Coordinates_Nodes_of_Cells(1,:,1) ) ! Nodes 1 & 2 case (2) ! Suppressed Z. Volume_Cells = ( Coordinates_Nodes_of_Cells(1,:,2) & ! Delta X - - Coordinates_Nodes_of_Cells(1,:,1) ) * & ! Nodes 1 & 2 ( Coordinates_Nodes_of_Cells(2,:,3) & ! Delta Y - - Coordinates_Nodes_of_Cells(2,:,1) ) ! Nodes 1 & 3 case (3) Volume_Cells = ( Coordinates_Nodes_of_Cells(1,:,2) & ! Delta X - - Coordinates_Nodes_of_Cells(1,:,1) ) * & ! Nodes 1 & 2 ( Coordinates_Nodes_of_Cells(2,:,3) & ! Delta Y - - Coordinates_Nodes_of_Cells(2,:,1) ) * & ! Nodes 1 & 3 ( Coordinates_Nodes_of_Cells(3,:,5) & ! Delta Z - - Coordinates_Nodes_of_Cells(3,:,1) ) ! Nodes 1 & 5 end select else ! Coding for other mesh types not implemented yet. VERIFY(.false.,1) end if ! Finalize temporaries. if (Mesh%Uniformity == "Nonuniform") then call Finalize (Coordinates_Nodes_of_Cells) end if ! Verify guarantees. VERIFY(Valid_State(Mesh),5) ! Mesh is valid. VERIFY(Valid_State(Volume_Cells),5) ! Volume_Cells still valid. return end subroutine Get_Volume_Cells_Multi_Mesh