The main documentation of the Dump_XMGrace_Multi_Mesh Procedure contains additional explanation of this code listing.
! Set number of Mathematic Vectors and Distributed Vectors allowed ! in the call line. This can be changed here and it will change all ! necessary code to match. This makes use of the replicate m4 macros. ! Setting this to a number greater than 6 triggers errors on compilers ! that limit lines to 132 characters (like Absoft). define(REP_NUMBER, 6) subroutine Dump_XMGrace_Multi_Mesh (Filename, Mesh, Coordinate, & Xmin, Xmax, Ymin, Ymax, Zmin, Zmax & REP_ARGS([Variable[]i[]_MV]) & REP_ARGS([Variable[]i[]_DV]) & , status) ! Input variables. type(character,*), intent(in) :: Filename ! Output filename. type(Multi_Mesh_type), intent(inout) :: Mesh ! Mesh to be output. type(character,1), intent(in) :: Coordinate ! X, Y or Z (for output). ! Output Mathematic_Vector variables. REP_DECLARE([type(Mathematic_Vector_type), optional], [Variable[]i[]_MV]) ! Output Distributed_Vector variables. REP_DECLARE([type(Distributed_Vector_type), optional], [Variable[]i[]_DV]) ! Limits on the points to be output. type(real), intent(in), optional :: Xmin, Xmax, Ymin, Ymax, Zmin, Zmax ! Output variable. type(Status_type), optional :: status ! Consolidated Status. ! Internal variables. type(integer) :: XMGrace_Status ! XMGrace file open status. type(integer) :: unit ! XMGrace output unit. ! Actual limits on the points to be output. type(real) :: A_Xmin, A_Xmax, A_Ymin, A_Ymax, A_Zmin, A_Zmax ! Status vector. type(Status_type), dimension(2+2*REP_NUMBER) :: dump_status type(Status_type) :: consolidated_status ! Consolidated Status. ifelse(COMPILER, Lahey, [ type(character,256) :: Error_Message ! String for compiler error message. ]) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(Mesh),5) ! Mesh is valid. ! Variable#_(DV|MV) is valid. define([VERIFY_VARIABLE],[ if (PRESENT(Variable$1_$2)) then VERIFY(Valid_State(Variable$1_$2),5) end if ]) fortext([Type], [DV MV], [ forloop([Var],[1],[REP_NUMBER],[ VERIFY_VARIABLE(Var,Type) ]) ]) ! Allocations and initializations. call Initialize (dump_status) call Initialize (consolidated_status) ! Set actual variables. if (PRESENT(Xmin)) then A_Xmin = Xmin else A_Xmin = -HUGE(one) end if if (PRESENT(Xmax)) then A_Xmax = Xmax else A_Xmax = HUGE(one) end if if (PRESENT(Ymin)) then A_Ymin = Ymin else A_Ymin = -HUGE(one) end if if (PRESENT(Ymax)) then A_Ymax = Ymax else A_Ymax = HUGE(one) end if if (PRESENT(Zmin)) then A_Zmin = Zmin else A_Zmin = -HUGE(one) end if if (PRESENT(Zmax)) then A_Zmax = Zmax else A_Zmax = HUGE(one) end if ! Open XMGrace file for writing. unit = 19 if (this_is_IO_PE) then open (UNIT=unit, FILE=Filename, STATUS='new', IOSTAT=XMGrace_Status) end if call Broadcast (XMGrace_Status) if (XMGrace_Status > 0) then if (this_is_IO_PE) then ifelse(COMPILER, Lahey, [ call IOSTAT_MSG (XMGrace_Status, Error_Message) write (6,*) 'Dump_XMGrace_Multi_Mesh: IOSTAT message = ', & TRIM(Error_Message) ]) write (6,*) 'Dump_XMGrace_Multi_Mesh: XMGrace_Status = ', XMGrace_Status write (6,*) 'Dump_XMGrace_Multi_Mesh: File open error -- ', & 'requested XMGrace file may already exist.' end if dump_status(1) = 'File Error' end if ! Write out variables. define([CALL_DUMP_XMGrace_VARIABLE],[ pushdef([TYPE], [$2]) ifelse(TYPE, [Mathematic], [ pushdef([VARIABLE], [Variable$1_MV]) pushdef([DUMPNUMBER], [2+$1]) ],[ pushdef([VARIABLE], [Variable$1_DV]) pushdef([DUMPNUMBER], [2+REP_NUMBER+$1]) ]) pushdef([Dump_XMGrace_TYPE_Vector], expand(Dump_XMGrace_TYPE_Vector)) if (PRESENT(VARIABLE)) then call Dump_XMGrace_TYPE_Vector (VARIABLE, Mesh, Coordinate, unit, & A_Xmin, A_Xmax, & A_Ymin, A_Ymax, & A_Zmin, A_Zmax, & dump_status(DUMPNUMBER)) end if popdef([Dump_XMGrace_TYPE_Vector]) popdef([DUMPNUMBER]) popdef([VARIABLE]) popdef([TYPE]) ]) fortext([Type], [Mathematic Distributed], [ forloop([Var],[1],[REP_NUMBER],[ CALL_DUMP_XMGrace_VARIABLE(Var,Type) ]) ]) ! Close XMGrace file. if (this_is_IO_PE) then close (UNIT=unit, IOSTAT=XMGrace_Status) end if call Broadcast (XMGrace_Status) if (XMGrace_Status > 0) dump_status(2) = 'File 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) ! Format statements. !100 format (a,5(:,i11)) !101 format ((1pg15.8,4(:,1pg16.8))) ! Verify guarantees - none. return end subroutine Dump_XMGrace_Multi_Mesh