SUBROUTINE splitdump(fileheader,nx,ny,nz) 2,8 IMPLICIT NONE INCLUDE 'mp.inc' CHARACTER (LEN=80) :: fileheader INTEGER :: nx,ny,nz INTEGER :: nxlg, nylg, nzlg ! !----------------------------------------------------------------------- ! ! Variables to read in data from the data dumps ! !----------------------------------------------------------------------- ! CHARACTER (LEN=40) :: fmtver CHARACTER (LEN=80) :: runname, cmnt CHARACTER (LEN=10) :: tmunit CHARACTER (LEN=12) :: label INTEGER :: nocmnt REAL :: curtim INTEGER :: i01, i02, i03, i04, i05, i06, i07, i08, i09, i10 INTEGER :: i11, i12, i13, i14, i15, i16, i17, i18, i19, i20 REAL :: r01, r02, r03, r04, r05, r06, r07, r08, r09, r10 REAL :: r11, r12, r13, r14, r15, r16, r17, r18, r19, r20 ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: lenstr CHARACTER (LEN=10) :: filetail CHARACTER (LEN=128) :: filename INTEGER :: fi, fj, i, j, k INTEGER :: nxin, nyin, nzin REAL, ALLOCATABLE :: xlg(:), ylg(:), z(:) REAL, ALLOCATABLE :: xsm(:), ysm(:) REAL, ALLOCATABLE :: a3dlg(:,:,:), a3dsm(:,:,:) REAL, ALLOCATABLE :: a2dlg(:,:), a2dsm(:,:) REAL, ALLOCATABLE :: ai2dlg(:,:), ai2dsm(:,:) INTEGER, ALLOCATABLE :: ounit(:) INTEGER, ALLOCATABLE :: ffi(:), ffj(:) INTEGER :: ierr INTEGER :: ii,jj,iiend INTEGER :: unit0, maxunit PARAMETER (unit0=110,maxunit=60) !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! if ( mp_opt > 0 ) then write(6,*) 'splitdump: not MP ready' call arpsstop('splitdump: not MP ready', 1) return endif nxlg = (nx-3)*nproc_x+3 nylg = (ny-3)*nproc_y+3 nzlg = nz ALLOCATE(xlg(nxlg)) ALLOCATE(ylg(nylg)) ALLOCATE( ALLOCATE(xsm(nx)) ALLOCATE(ysm(ny)) ALLOCATE(a3dlg(nxlg,nylg,nzlg)) ALLOCATE(a3dsm(nx,ny,nz)) ALLOCATE(a2dlg(nxlg,nylg)) ALLOCATE(a2dsm(nx,ny)) ALLOCATE(ai2dlg(nxlg,nylg)) ALLOCATE(ai2dsm(nx,ny)) ALLOCATE(ounit(nproc_x*nproc_y)) ALLOCATE(ffi(nproc_x*nproc_y)) ALLOCATE(ffj(nproc_x*nproc_y)) lenstr = 0 100 lenstr = lenstr + 1 IF (fileheader(lenstr:lenstr) /= " ") GO TO 100 lenstr = lenstr - 1 ! !----------------------------------------------------------------------- ! ! Open the split files. ! !----------------------------------------------------------------------- ! CALL asnctl ('NEWLOCAL', 1, ierr) DO fj=1,nproc_y DO fi=1,nproc_x ii = fi+nproc_x*(fj-1) ffi(ii) = fi ffj(ii) = fj ounit(ii) = unit0 + ii END DO END DO DO jj = 1,1+(nproc_x*nproc_y-1)/maxunit iiend = MIN(jj*maxunit,nproc_x*nproc_y) DO ii=1+(jj-1)*maxunit,iiend WRITE (filename, '(a,a,2i2.2)') & fileheader(1:lenstr),'_',ffi(ii),ffj(ii) ! !----------------------------------------------------------------------- ! ! For compatibility with the Cray data formats. The processors ! read their data in COS format. ! !----------------------------------------------------------------------- ! CALL asnfile(filename, '-F f77 -N ieee', ierr) OPEN (UNIT=ounit(ii), FILE=filename, FORM='unformatted') END DO CALL asnfile(fileheader(1:lenstr), '-F f77 -N ieee', ierr) OPEN (UNIT=10, FILE=fileheader(1:lenstr), FORM='unformatted') ! !----------------------------------------------------------------------- ! ! Read/write header info. ! !----------------------------------------------------------------------- ! READ (10,ERR=320,END=320) fmtver DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) fmtver END DO READ (10,ERR=320,END=320) runname DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) runname END DO READ (10,ERR=320,END=320) nocmnt DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) nocmnt END DO IF ( nocmnt > 0 ) THEN DO i = 1,nocmnt READ (10,ERR=320,END=320) cmnt DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) cmnt END DO END DO END IF READ (10,ERR=320,END=320) curtim,tmunit DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) curtim,tmunit END DO ! !----------------------------------------------------------------------- ! ! Read/write the dimensions of data in binary file and check against ! the dimensions passed to BINREAD. ! !----------------------------------------------------------------------- ! READ (10,ERR=320,END=320) nxin,nyin,nzin IF ((nxin /= nxlg).OR.(nyin /= nylg).OR.(nzin /= nzlg)) THEN WRITE (*,*) "ERROR: mismatch in sizes." WRITE (*,*) "nxin,nyin,nzin: ",nxin,nyin,nzin WRITE (*,*) "nxlg,nylg,nzlg: ",nxlg,nylg,nzlg call arpsstop("splitdump: mismatch", 1) END IF DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) nx,ny,nz END DO ! !----------------------------------------------------------------------- ! ! Read/write in flags for different data groups ! !----------------------------------------------------------------------- ! READ (10,ERR=320,END=320) & i01, i02, i03, i04, i05, & i06, i07, i08, i09, i10, & i11, i12, i13, i14, i15, & i16, i17, i18, i19, i20 DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) & i01, i02, i03, i04, i05, & i06, i07, i08, i09, i10, & i11, i12, i13, i14, i15, & i16, i17, i18, i19, i20 END DO READ (10,ERR=320,END=320) & r01, r02, r03, r04, r05, & r06, r07, r08, r09, r10, & r11, r12, r13, r14, r15, & r16, r17, r18, r19, r20 DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) & r01, r02, r03, r04, r05, & r06, r07, r08, r09, r10, & r11, r12, r13, r14, r15, & r16, r17, r18, r19, r20 END DO IF (i10 == 1) THEN READ (10,ERR=320,END=320) & i01, i02, i03, i04, i05, & i06, i07, i08, i09, i10, & i11, i12, i13, i14, i15, & i16, i17, i18, i19, i20 DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) & i01, i02, i03, i04, i05, & i06, i07, i08, i09, i10, & i11, i12, i13, i14, i15, & i16, i17, i18, i19, i20 END DO READ (10,ERR=320,END=320) & r01, r02, r03, r04, r05, & r06, r07, r08, r09, r10, & r11, r12, r13, r14, r15, & r16, r17, r18, r19, r20 DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) & r01, r02, r03, r04, r05, & r06, r07, r08, r09, r10, & r11, r12, r13, r14, r15, & r16, r17, r18, r19, r20 END DO END IF ! !---------------------------------------------------------------------- ! ! For every 1-, 2-, or 3-d set of data in the input file, read in ! the array and then write out each processor's section of the data. ! !---------------------------------------------------------------------- ! 400 CONTINUE READ (10,ERR=320,END=310) label DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) label END DO IF (label(10:10) == "1") THEN IF (label(12:12) == "1") THEN ! 1-d x ! !---------------------------------------------------------------------- ! ! x. ! !---------------------------------------------------------------------- ! READ (10,ERR=320,END=310) xlg DO ii=1+(jj-1)*maxunit,iiend DO i = 1,nx xsm(i) = xlg(i+(ffi(ii)-1)*(nx-3)) END DO WRITE (ounit(ii),ERR=340) xsm END DO ELSE IF (label(12:12) == "2") THEN ! 1-d y ! !---------------------------------------------------------------------- ! ! y. ! !---------------------------------------------------------------------- ! READ (10,ERR=320,END=310) ylg DO ii=1+(jj-1)*maxunit,iiend DO j = 1,ny ysm(j) = ylg(j+(ffj(ii)-1)*(ny-3)) END DO WRITE (ounit(ii),ERR=340) ysm END DO ELSE IF (label(12:12) == "3") THEN ! 1-d z ! !---------------------------------------------------------------------- ! ! z. ! !---------------------------------------------------------------------- ! READ (10,ERR=320,END=310) z DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii),ERR=340) z END DO ELSE GO TO 330 END IF ELSE IF (label(10:10) == "2") THEN IF (label(9:9) == "r") THEN ! 2-d real ! !---------------------------------------------------------------------- ! ! 2-d real array. ! !---------------------------------------------------------------------- ! READ (10,ERR=320,END=310) a2dlg DO ii=1+(jj-1)*maxunit,iiend fi = ffi(ii) fj = ffj(ii) DO j = 1,ny DO i = 1,nx a2dsm(i,j) = a2dlg(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3)) END DO END DO WRITE (ounit(ii),ERR=340) a2dsm END DO ELSE IF (label(9:9) == "i") THEN ! 2-d integer ! !---------------------------------------------------------------------- ! ! 2-d integer array. ! !---------------------------------------------------------------------- ! READ (10,ERR=320,END=310) ai2dlg DO ii=1+(jj-1)*maxunit,iiend fi = ffi(ii) fj = ffj(ii) DO j = 1,ny DO i = 1,nx ai2dsm(i,j) = ai2dlg(i+(fi-1)*(nx-3),j+(fj-1)*(ny-3)) END DO END DO WRITE (ounit(ii),ERR=340) ai2dsm END DO ELSE GO TO 330 END IF ELSE IF (label(10:10) == "3") THEN ! 3-d ! !---------------------------------------------------------------------- ! ! 3-d real array. ! !---------------------------------------------------------------------- ! READ (10,ERR=320,END=310) a3dlg DO ii=1+(jj-1)*maxunit,iiend fi = ffi(ii) fj = ffj(ii) DO k = 1,nz DO j = 1,ny DO i = 1,nx a3dsm(i,j,k) = & a3dlg(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), k) END DO END DO END DO WRITE (ounit(ii),ERR=340) a3dsm END DO ELSE GO TO 330 END IF GO TO 400 ! !----------------------------------------------------------------------- ! ! Error free finish. Close files and return. ! !---------------------------------------------------------------------- ! 310 CONTINUE CLOSE (10) DO ii=1+(jj-1)*maxunit,iiend CLOSE (ounit(ii)) END DO END DO ! jj RETURN ! !----------------------------------------------------------------------- ! ! Error during read. ! !---------------------------------------------------------------------- ! 320 CONTINUE WRITE(6,'(/a/)') ' Error reading data in SPLITDUMP' call arpsstop("splitdump: 320 continue", 1) ! !---------------------------------------------------------------------- ! ! Error with the label. ! !---------------------------------------------------------------------- ! 330 CONTINUE WRITE(6,'(a,a)') ' Error with label in SPLITDUMP:',label call arpsstop("splitdump: 330 continue", 1) ! !---------------------------------------------------------------------- ! ! Error with write. ! !---------------------------------------------------------------------- ! 340 CONTINUE WRITE(6,'(a,a)') ' Error with write in SPLITDUMP.' call arpsstop("splitdump: 340 continue", 1) END SUBROUTINE splitdump