The main documentation of the Dump_CGNS_Multi_Mesh Procedure contains additional explanation of this code listing.
ifdef([USE_CGNSLIB],[ subroutine Dump_CGNS_Multi_Mesh (Mesh, Filename, status) ! Input variables. type(Multi_Mesh_type), intent(in) :: Mesh ! Mesh to be output. type(character,*), intent(in) :: Filename ! Output filename. ! Output variable. type(Status_type), optional :: status ! Consolidated Status. ! Internal variables. type(integer) :: CGNS_Base_Index ! CGNS base index number. type(integer) :: CGNS_File_Index ! CGNS file index number. type(integer) :: CGNS_Zone_Index ! CGNS zone index number. type(integer) :: CGNS_Status ! CGNS status. type(Status_type) :: consolidated_status ! Consolidated Status. type(character,10), dimension(3) :: Coordinate_Name ! Coordinate names. type(Status_type), dimension(13) :: dump_status ! Status vector. type(integer) :: Element_Type ! Element type number. type(integer) :: Section_Number ! Section number. ! Included CGNS setup file. include (../../../external/CGNSLib/cgnslib_f.h) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(Mesh),5) ! Mesh is valid. ! Allocations and initializations. call Initialize (dump_status) call Initialize (consolidated_status) ! Open CGNS file for writing, get CGNS_File_Index. if (this_is_IO_PE) then call CG_Open_f (Filename, MODE_WRITE, CGNS_File_Index, CGNS_Status) end if if (CGNS_Status == ERROR) dump_status(1) = 'CGNS Error' ! Write CGNS Base information (dimensionality info), get CGNS_Base_Index. if (this_is_IO_PE) then call CG_Base_Write_f (CGNS_File_Index, 'Caesar Base', & Mesh%NDimensions, Mesh%NDimensions, & CGNS_Base_Index, CGNS_Status) end if if (CGNS_Status == ERROR) dump_status(2) = 'CGNS Error' ! ### Add if-check on "structured" here eventually. ! Write CGNS Zone information (mesh dimension info), get CGNS_Zone_Index. if (this_is_IO_PE) then call CG_Zone_Write_f (CGNS_File_Index, CGNS_Base_Index, Name_Name, & (/ Mesh%NNodes_total, Mesh%NCells_total, 0 /), & Unstructured, CGNS_Zone_Index, CGNS_Status) end if if (CGNS_Status == ERROR) dump_status(3) = 'CGNS Error' ! Define Coordinate Names. if (Mesh%Geometry == 'Cartesian') then Coordinate_Name(1) = 'CoordinateX' Coordinate_Name(2) = 'CoordinateY' Coordinate_Name(3) = 'CoordinateZ' else if (Mesh%Geometry == 'Cylindrical') then Coordinate_Name(1) = 'CoordinateR' Coordinate_Name(2) = 'CoordinateZ' else if (Mesh%Geometry == 'Spherical') then Coordinate_Name(1) = 'CoordinateR' end if ! Define DataType parameter. ifdef([SINGLE],[ define([CGNS_DataType],[RealSingle]) ],[ define([CGNS_DataType],[RealDouble]) ]) ! Write CGNS Zone coordinates (node coordinates), ! after assembling on the IO PE. call Initialize (Coordinates_Nodes_AV, Mesh%Node_Structure, & 2, 'Coordinates of Nodes', dump_status(4), & Mesh%NDimensions) call Initialize (Coordinates_Nodes_BNV, Mesh%NDimensions, & Mesh%NNodes_total, dump_status(5)) Coordinates_Nodes_AV = Mesh%Coordinates_Nodes_DV Coordinates_Nodes_BNV = Coordinates_Nodes_AV if (this_is_IO_PE) then do dim = 1, Mesh%NDimensions call CG_Coord_Write_f (CGNS_File_Index, CGNS_Base_Index, & CGNS_Zone_Index, CGNS_DataType, & Coordinate_Name(dim), & Coordinates_Nodes_BNV(dim,:), & dim, CGNS_Status) end do end if call Finalize (Coordinates_Nodes_BNV, dump_status(6)) call Finalize (Coordinates_Nodes_AV, dump_status(7)) if (CGNS_Status == ERROR) dump_status(8) = 'CGNS Error' ! Write CGNS Elements Connectivity (mesh connectivity), ! after assembling on the IO PE. if (this_is_IO_PE) then Index_Size = Mesh%NCells_total else Index_Size = 0 end if call Initialize (Nodes_of_Cells_Index_Val_PE, Mesh%NCells_PE, & Mesh%Nodes_per_Cell, dump_status(9)) call Initialize (Nodes_of_Cells_Index_Val_Total, Index_Size, & Mesh%Nodes_per_Cell, dump_status(10)) Nodes_of_Cells_Index_Val_PE = Mesh%Nodes_of_Cells_Index do node = 1, Mesh%Nodes_per_Cell call Assemble (Nodes_of_Cells_Index_Val_Total(:,node), & Nodes_of_Cells_Index_Val_PE(:,node)) end do call Initialize (CGNS_Elements, Mesh%Nodes_per_Cell, Index_Size, & dump_status(11)) do cell = 1, Mesh%NCells select case (Mesh%Shape) ! Select on Mesh%Shape. case ('Segmented') Element_Type = BAR_2 CGNS_Elements(:,cell) = Nodes_of_Cells_Index_Val_Total(cell,:) case ('Triangular') Element_Type = TRI_3 ! Note: it is unclear what order the nodes are in for triangles ! in CGNS format. It is assumed that the order is counterclockwise. CGNS_Elements(:,cell) = Nodes_of_Cells_Index_Val_Total(cell,:) case ('Quadrilateral') Element_Type = QUAD_4 ! Note: it is unclear what order the nodes are in for quadrilaterals ! in CGNS format. It is assumed that the order is counterclockwise. CGNS_Elements(1,cell) = Nodes_of_Cells_Index_Val_Total(cell,1) CGNS_Elements(2,cell) = Nodes_of_Cells_Index_Val_Total(cell,2) CGNS_Elements(3,cell) = Nodes_of_Cells_Index_Val_Total(cell,4) CGNS_Elements(4,cell) = Nodes_of_Cells_Index_Val_Total(cell,3) case ('Polygonal') VERIFY(.false.,0) ! Not implemented yet. case ('Tetrahedral') Element_Type = TETRA_4 CGNS_Elements(:,cell) = Nodes_of_Cells_Index_Val_Total(cell,:) case ('Hexahedral') Element_Type = HEXA_8 CGNS_Elements(1,cell) = Nodes_of_Cells_Index_Val_Total(cell,1) CGNS_Elements(2,cell) = Nodes_of_Cells_Index_Val_Total(cell,2) CGNS_Elements(3,cell) = Nodes_of_Cells_Index_Val_Total(cell,4) CGNS_Elements(4,cell) = Nodes_of_Cells_Index_Val_Total(cell,3) CGNS_Elements(5,cell) = Nodes_of_Cells_Index_Val_Total(cell,5) CGNS_Elements(6,cell) = Nodes_of_Cells_Index_Val_Total(cell,6) CGNS_Elements(7,cell) = Nodes_of_Cells_Index_Val_Total(cell,8) CGNS_Elements(8,cell) = Nodes_of_Cells_Index_Val_Total(cell,7) case ('Polyhedral') VERIFY(.false.,0) ! Not implemented yet. end select end do if (this_is_IO_PE) then call CG_Section_Write_f (CGNS_File_Index, CGNS_Base_Index, & CGNS_Zone_Index, 'VolumeElements', & Element_Type, 1, Mesh%NCells, 0, & CGNS_Elements, S, CGNS_Status) end if call Finalize (Nodes_of_Cells_Index_Val_PE, dump_status(12)) if (CGNS_Status == ERROR) dump_status(12) = 'CGNS Error' ! Close CGNS file. if (this_is_IO_PE) then call CG_Close_f (CGNS_File_Index, CGNS_Status) end if if (CGNS_Status == ERROR) dump_status(13) = 'CGNS Error' ! Consolidate and handle status. consolidated_status = dump_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 (dump_status) ! Verify guarantees - none. return end subroutine Dump_CGNS_Multi_Mesh ])