MODULE arpdebugging USE dom_oce, Only: nldi, nlei, nldj, nlej, nimpp, njmpp, mig, mjg, narea IMPLICIT none INTERFACE dump_array MODULE PROCEDURE dump_iarray, dump_rarray END INTERFACE PUBLIC dump_array CONTAINS SUBROUTINE dump_rarray(count, name, field1, field2, withHalos, & toGlobal, atStep) IMPLICIT none INTEGER, INTENT(in) :: count ! What timestep we're on CHARACTER (LEN=*), INTENT(in) :: name ! Root of filename to create REAL, INTENT(in), DIMENSION(:,:) :: field1 REAL, INTENT(in), DIMENSION(:,:), OPTIONAL :: field2 LOGICAL, INTENT(in), OPTIONAL :: withHalos LOGICAL, INTENT(in), OPTIONAL :: toGlobal INTEGER, INTENT(in), OPTIONAL :: atStep ! Locals INTEGER :: ji, jj CHARACTER (len=4) :: crank,ccount LOGICAL :: lwithHalos, ltoGlobal INTEGER :: ibound, jbound INTEGER, DIMENSION(2) :: shape1, shape2 CHARACTER (LEN=13), PARAMETER :: fmt_var = "(2I4,2E18.10)" IF(PRESENT(atStep))THEN ! If this isn't the desired time-step to dump then don't IF(count /= atStep)RETURN END IF IF(PRESENT(field2))THEN shape1= SHAPE(field1) shape2 = SHAPE(field2) IF( ANY(MASK=shape1.ne.shape2) )THEN WRITE (*,*) 'dump_rarray: ERROR: SHAPEs of field1 and field2 do not match - not dumping arrays' RETURN END IF END IF lwithHalos = .false. IF(present(withHalos))lwithHalos = withHalos ! By default we convert to global coordinates rather than those local ! to this process ltoGlobal = .true. IF(present(toGlobal))ltoGlobal = toGlobal WRITE(crank,FMT="(I4)") narea-1 WRITE(ccount,FMT="(I4)") count OPEN(UNIT=997, FILE=TRIM(ADJUSTL(name))//"_step_"//TRIM(ADJUSTL(ccount))//"_pe_"//TRIM(ADJUSTL(crank))//".dat", & STATUS='REPLACE', ACTION='WRITE', IOSTAT=ji) IF(ji.ne.0)THEN WRITE (*,*) "ARPDBG - FAILED to open "//name//" dump file on "//crank//", call number "//ccount RETURN END IF IF(.not. lwithHalos)THEN IF(PRESENT(field2))THEN DO jj=nldj,nlej,1 DO ji=nldi,nlei,1 WRITE(997,FMT=fmt_var) mig(ji),mjg(jj), & field1(ji,jj),field2(ji,jj) END DO END DO ELSE IF(ltoGlobal)THEN DO jj=nldj,nlej,1 DO ji=nldi,nlei,1 WRITE(997,FMT=fmt_var) mig(ji),mjg(jj), & field1(ji,jj) END DO END DO ELSE DO jj=nldj,nlej,1 DO ji=nldi,nlei,1 WRITE(997,FMT=fmt_var) ji,jj, field1(ji,jj) END DO END DO END IF END IF ELSE ibound = UBOUND(field1, 1) jbound = UBOUND(field1, 2) IF(PRESENT(field2))THEN IF(ltoGlobal)THEN DO ji=1,ibound,1 DO jj=1,jbound,1 WRITE(997,FMT=fmt_var) mig(ji), mjg(jj), & field1(ji,jj),field2(ji,jj) END DO WRITE(997,*) END DO ELSE DO ji=1,ibound,1 DO jj=1,jbound,1 WRITE(997,FMT=fmt_var) ji, jj, field1(ji,jj), field2(ji,jj) END DO WRITE(997,*) END DO END IF ELSE IF(ltoGlobal)THEN DO ji=1,ibound,1 DO jj=1,jbound,1 WRITE(997,FMT=fmt_var) mig(ji), mjg(jj), field1(ji,jj) END DO WRITE(997,*) END DO ELSE DO ji=1,ibound,1 DO jj=1,jbound,1 WRITE(997,FMT=fmt_var) ji, jj, field1(ji,jj) END DO WRITE(997,*) END DO END IF END IF END IF CLOSE(997) END SUBROUTINE dump_rarray SUBROUTINE dump_iarray(count, name, field1, field2, withHalos, & toGlobal, atStep) IMPLICIT none INTEGER, INTENT(in) :: count ! What timestep we're on CHARACTER (LEN=*), INTENT(in) :: name ! Root of filename to create INTEGER, INTENT(in), DIMENSION(:,:) :: field1 INTEGER, INTENT(in), DIMENSION(:,:), OPTIONAL :: field2 LOGICAL, INTENT(in), OPTIONAL :: withHalos LOGICAL, INTENT(in), OPTIONAL :: toGlobal INTEGER, INTENT(in), OPTIONAL :: atStep ! Locals INTEGER :: ji, jj CHARACTER (len=4) :: crank,ccount LOGICAL :: lwithHalos, ltoGlobal INTEGER :: ibound, jbound INTEGER, DIMENSION(2) :: shape1, shape2 CHARACTER (LEN=13), PARAMETER :: fmt_var = "(2I4,(I6))" IF(PRESENT(atStep))THEN ! If this isn't the desired time-step to dump then don't IF(count /= atStep)RETURN END IF IF(PRESENT(field2))THEN shape1= SHAPE(field1) shape2 = SHAPE(field2) IF( ANY(MASK=shape1.ne.shape2) )THEN WRITE (*,*) 'dump_iarray: ERROR: SHAPEs of field1 and field2 do not match - not dumping arrays' RETURN END IF END IF lwithHalos = .false. IF(present(withHalos))lwithHalos = withHalos ! By default we convert to global coordinates rather than those local ! to this process ltoGlobal = .true. IF(present(toGlobal))ltoGlobal = toGlobal WRITE(crank,FMT="(I4)") narea-1 WRITE(ccount,FMT="(I4)") count OPEN(UNIT=997, FILE=TRIM(ADJUSTL(name))//"_step_"//TRIM(ADJUSTL(ccount))//"_pe_"//TRIM(ADJUSTL(crank))//".dat", & STATUS='REPLACE', ACTION='WRITE', IOSTAT=ji) IF(ji.ne.0)THEN WRITE (*,*) "ARPDBG - FAILED to open "//name//" dump file on "//crank//", call number "//ccount RETURN END IF IF(.not. lwithHalos)THEN IF(PRESENT(field2))THEN DO jj=nldj,nlej,1 DO ji=nldi,nlei,1 WRITE(997,FMT=fmt_var) mig(ji),mjg(jj), & field1(ji,jj),field2(ji,jj) END DO END DO ELSE DO jj=nldj,nlej,1 DO ji=nldi,nlei,1 WRITE(997,FMT=fmt_var) mig(ji),mjg(jj), & field1(ji,jj) END DO END DO END IF ELSE ibound = UBOUND(field1, 1) jbound = UBOUND(field1, 2) IF(PRESENT(field2))THEN DO ji=1,ibound,1 DO jj=1,jbound,1 WRITE(997,FMT=fmt_var) mig(ji), mjg(jj), & field1(ji,jj),field2(ji,jj) END DO WRITE(997,*) END DO ELSE DO ji=1,ibound,1 DO jj=1,jbound,1 WRITE(997,FMT=fmt_var) mig(ji), mjg(jj), field1(ji,jj) END DO WRITE(997,*) END DO END IF END IF CLOSE(997) END SUBROUTINE dump_iarray END MODULE arpdebugging