The main documentation of the Dump_XMGrace DV and MV Vector Procedures contains additional explanation of this code listing.
define([DUMP_XMGrace_VARIABLE_ROUTINE],[ subroutine Dump_XMGrace_$1_Vector (Variable, Mesh, Coordinate, unit, & Xmin, Xmax, Ymin, Ymax, Zmin, Zmax, & status) ! Input variables. type($1_Vector_type), intent(in) :: Variable ! Variable to be output. type(Multi_Mesh_type), intent(inout) :: Mesh ! Mesh to be output. type(character,1) :: Coordinate ! X, Y or Z (for output). type(integer), intent(in) :: unit ! XMGrace output unit. ! Limits on the points to be output. type(real), intent(in) :: Xmin, Xmax, Ymin, Ymax, Zmin, Zmax ! Output variable. type(Status_type), intent(out), optional :: status ! Exit status. ! Internal variables. type(integer) :: XMGrace_Locus_Number ! XMGrace Locus: 0-Cells, 1-Nodes, ! 2-Faces. type(real,2) :: Coordinates_Cells_PE ! Coordinates of cells on the PE. type(real,2) :: Coordinates_Cells_Total ! Coordinates of all cells. type(integer) :: cell ! Cell number loop variable. type(integer) :: dim ! Dimension loop variable. type(real,1) :: Variable_PE ! BNV of the variable on each PE. type(real,1) :: Variable_Total ! BNV of the total variable on the IO_PE. type(Status_type) :: consolidated_status ! Consolidated Status. type(Status_type), dimension(8) :: dump_status ! Status vector. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(Mesh),5) ! Mesh is valid. VERIFY(Valid_State(Variable),5) ! Variable is valid. ! Allocations and initializations. call Initialize (dump_status) call Initialize (consolidated_status) ! Toggle on Variable Locus to initialize temporaries. select case (Locus(Variable)) case ("Cells") XMGrace_Locus_Number = 0 call Initialize (Variable_PE, Mesh%NCells_PE, dump_status(1)) call Initialize (Variable_Total, Mesh%NCells_Total, dump_status(2)) call Initialize (Coordinates_Cells_PE, Mesh%NDimensions, & Mesh%NCells_PE, dump_status(3)) call Initialize (Coordinates_Cells_Total, Mesh%NDimensions, & Mesh%NCells_Total, dump_status(4)) call Get_Coordinates_Cells (Coordinates_Cells_PE, Mesh) do dim = 1, Mesh%NDimensions call Assemble (Coordinates_Cells_Total(dim,:), & Coordinates_Cells_PE(dim,:)) end do case ("Nodes") XMGrace_Locus_Number = 1 call Initialize (Variable_PE, Mesh%NNodes_PE, dump_status(1)) call Initialize (Variable_Total, Mesh%NNodes_Total, dump_status(2)) VERIFY(.false.,1) ! Node-based variables cannot be output to XMGrace ! until a Get_Coordinates_Nodes procedure is written. case ("Faces") XMGrace_Locus_Number = 2 call Initialize (Variable_PE, Mesh%NFaces_PE, dump_status(1)) call Initialize (Variable_Total, Mesh%NFaces_Total, dump_status(2)) VERIFY(.false.,1) ! Face-based variables cannot be output to XMGrace ! until the mesh is defined by faces instead of cells. case default VERIFY(.false.,1) ! XMGrace variable output is only available for ! mesh-based variables with a Locus of Cells, ! Nodes or Faces. end select ! Move data to the IO_PE and output. Variable_PE = Variable call Assemble (Variable_Total, Variable_PE) if (this_is_IO_PE .AND. XMGrace_Locus_Number==0) then write (unit,*) write (unit,*) '# ', Coordinate, ' ', TRIM(Name(Variable)) do cell = 1, Mesh%NCells_Total ! InInterval wouldn't work here. Not sure why, maybe explore later. if (Coordinates_Cells_Total(1,cell) >= Xmin .AND. & Coordinates_Cells_Total(1,cell) <= Xmax .AND. & Coordinates_Cells_Total(2,cell) >= Ymin .AND. & Coordinates_Cells_Total(2,cell) <= Ymax .AND. & Coordinates_Cells_Total(3,cell) >= Zmin .AND. & Coordinates_Cells_Total(3,cell) <= Zmax) then select case (Coordinate) case ("X") write (unit,*) Coordinates_Cells_Total(1,cell), & Variable_Total(cell) case ("Y") write (unit,*) Coordinates_Cells_Total(2,cell), & Variable_Total(cell) case ("Z") write (unit,*) Coordinates_Cells_Total(3,cell), & Variable_Total(cell) end select end if end do end if ! Clean up temporary vectors. call Finalize (Variable_PE, dump_status(5)) call Finalize (Variable_Total, dump_status(6)) if (XMGrace_Locus_Number==0) then call Finalize (Coordinates_Cells_PE, dump_status(7)) call Finalize (Coordinates_Cells_Total, dump_status(8)) end if ! 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_XMGrace_$1_Vector ]) fortext([Type], [Mathematic Distributed],[ DUMP_XMGrace_VARIABLE_ROUTINE(Type) ])