SUBROUTINE joindumps (fileheader,nx,ny,nz) 3,3 IMPLICIT NONE INCLUDE 'mp.inc' INTEGER :: nx,ny,nz INTEGER :: nxlg, nylg, nzlg ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! CHARACTER (LEN=80) :: fileheader INTEGER :: lenstr CHARACTER (LEN=10) :: filetail CHARACTER (LEN=128) :: filename INTEGER :: fi, fj, i, j, k INTEGER :: nxin, nyin, nzin 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 INTEGER :: ierr LOGICAL :: fexist REAL, ALLOCATABLE :: xlg(:), ylg(:), z(:) REAL, ALLOCATABLE :: xsm(:), ysm(:) REAL, ALLOCATABLE :: a3dlg(:,:,:), a3dsm(:,:,:) REAL, ALLOCATABLE :: a2dlg(:,:), a2dsm(:,:) INTEGER, ALLOCATABLE :: ai2dlg(:,:), ai2dsm(:,:) INTEGER, ALLOCATABLE :: i0(:,:), j0(:,:) INTEGER, ALLOCATABLE :: iunit(:) INTEGER, ALLOCATABLE :: ffi(:), ffj(:) INTEGER :: ii,jj,iiend INTEGER :: unit0, maxunit PARAMETER (unit0=110,maxunit=60) INTEGER :: joff, junit0 PARAMETER(junit0=11) CHARACTER (LEN=128) :: outfile CHARACTER (LEN=128) :: outfile_old ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! nxlg = nproc_x*(nx-3)+3 nylg = nproc_y*(ny-3)+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(i0(nproc_x,nproc_y)) ALLOCATE(j0(nproc_x,nproc_y)) ALLOCATE(iunit(nproc_x*nproc_y)) ALLOCATE(ffi(nproc_x*nproc_y)) ALLOCATE(ffj(nproc_x*nproc_y)) joff = 0 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 IF (fi == 1) THEN i0(fi,fj) = 1 ELSE i0(fi,fj) = 2 END IF IF (fj == 1) THEN j0(fi,fj) = 1 ELSE j0(fi,fj) = 2 END IF ii = fi+nproc_x*(fj-1) ffi(ii) = fi ffj(ii) = fj iunit(ii) = unit0 + ii END DO END DO DO k = 1,nz DO j = 1,nylg DO i = 1,nxlg a3dlg(i,j,k) = 0.0 END DO END DO END DO DO j = 1,nylg DO i = 1,nxlg a2dlg(i,j) = 0.0 ai2dlg(i,j) = 0 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 ! !----------------------------------------------------------------------- ! ! For compatibility with the Cray data formats. The processors ! read their data in COS format. ! !----------------------------------------------------------------------- ! WRITE(filename, '(a,a,2i2.2)') & fileheader(1:lenstr),'_',ffi(ii),ffj(ii) INQUIRE (FILE=filename, EXIST=fexist) IF ( .NOT. fexist) THEN WRITE (6,*) 'Parts of ',fileheader,' were not found' WRITE (6,*) 'No file joining is done for this time.' WRITE (6,*) 'Program continues.' WRITE (6,*) RETURN END IF CALL asnfile(filename, '-F f77 -N ieee', ierr) OPEN (UNIT=iunit(ii),FILE=trim(filename),FORM='unformatted') END DO outfile_old(1:128) = outfile(1:128) IF ( iiend == nproc_x*nproc_y ) THEN WRITE(outfile, '(a)') fileheader(1:lenstr) ELSE WRITE(outfile, '(a,a,i3.3)') & fileheader(1:lenstr),'_tmp',iiend END IF CALL asnfile(outfile, '-F f77 -N ieee', ierr) OPEN (UNIT=junit0+joff,FILE=outfile,FORM='unformatted') IF (joff > 0 ) OPEN (UNIT=junit0+joff-1,FILE=outfile_old,FORM='unformatted') ! !----------------------------------------------------------------------- ! ! Read/write header info ! !----------------------------------------------------------------------- ! DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) fmtver END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) fmtver DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) runname END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) runname DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) nocmnt END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) nocmnt IF ( nocmnt > 0 ) THEN DO i=1,nocmnt DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) cmnt END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) cmnt END DO END IF DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) curtim,tmunit END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) curtim,tmunit ! !----------------------------------------------------------------------- ! ! Read/write dimensions of data in binary file and check against ! the dimensions passed to BINREAD ! !----------------------------------------------------------------------- ! DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) nxin,nyin,nzin END DO IF ((nxin /= nx).OR.(nyin /= ny).OR.(nzin /= nz)) THEN WRITE (*,*) "ERROR: missmatch in sizes." WRITE (*,*) "nxin,nyin,nzin",nxin,nyin,nzin WRITE (*,*) "nx,ny,nz",nx,ny,nz STOP END IF IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) nxlg,nylg,nzlg ! !----------------------------------------------------------------------- ! ! Read/write flags for different data groups. ! !----------------------------------------------------------------------- ! DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) & i01, i02, i03, i04, i05, & i06, i07, i08, i09, i10, & i11, i12, i13, i14, i15, & i16, i17, i18, i19, i20 END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) & 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 READ (iunit(ii)) & r01, r02, r03, r04, r05, & r06, r07, r08, r09, r10, & r11, r12, r13, r14, r15, & r16, r17, r18, r19, r20 END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) & r01, r02, r03, r04, r05, & r06, r07, r08, r09, r10, & r11, r12, r13, r14, r15, & r16, r17, r18, r19, r20 IF (i10 == 1) THEN DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) & i01, i02, i03, i04, i05, & i06, i07, i08, i09, i10, & i11, i12, i13, i14, i15, & i16, i17, i18, i19, i20 END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) & 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 READ (iunit(ii)) & r01, r02, r03, r04, r05, & r06, r07, r08, r09, r10, & r11, r12, r13, r14, r15, & r16, r17, r18, r19, r20 END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) & r01, r02, r03, r04, r05, & r06, r07, r08, r09, r10, & r11, r12, r13, r14, r15, & r16, r17, r18, r19, r20 END IF ! !---------------------------------------------------------------------- ! ! For every 1-, 2-, or 3-d set of data in the input file, read in ! the arrays from each processor's file and write out the ! combined data. ! !---------------------------------------------------------------------- ! 400 CONTINUE DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii),END=310) label END DO IF (iiend == nproc_x*nproc_y) WRITE (junit0+joff) label IF (label(10:10) == "1") THEN IF (label(12:12) == "1") THEN ! 1-d x ! !---------------------------------------------------------------------- ! ! x. ! !---------------------------------------------------------------------- ! IF (joff > 0 ) READ (junit0+joff-1) xlg DO ii=1+(jj-1)*maxunit,iiend fi = ffi(ii) fj = ffj(ii) READ (iunit(ii)) xsm IF (fj == 1) THEN DO i=1,nx xlg(i+(fi-1)*(nx-3)) = xsm(i) END DO END IF END DO WRITE (junit0+joff) xlg ELSE IF (label(12:12) == "2") THEN ! 1-d y ! !---------------------------------------------------------------------- ! ! y. ! !---------------------------------------------------------------------- ! IF (joff > 0 ) READ (junit0+joff-1) ylg DO ii=1+(jj-1)*maxunit,iiend fi = ffi(ii) fj = ffj(ii) READ (iunit(ii)) ysm IF (fi == 1) THEN DO j=1,ny ylg(j+(fj-1)*(ny-3)) = ysm(j) END DO END IF END DO WRITE (junit0+joff) ylg ELSE IF (label(12:12) == "3") THEN ! 1-d z ! !---------------------------------------------------------------------- ! ! z. ! !---------------------------------------------------------------------- ! IF (joff > 0 ) READ (junit0+joff-1) z DO ii=1+(jj-1)*maxunit,iiend READ (iunit(ii)) z END DO WRITE (junit0+joff) z 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. ! !---------------------------------------------------------------------- ! IF (joff > 0 ) READ (junit0+joff-1) a2dlg DO ii=1+(jj-1)*maxunit,iiend fi = ffi(ii) fj = ffj(ii) READ (iunit(ii)) a2dsm DO j=j0(fi,fj),ny DO i=i0(fi,fj),nx a2dlg(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3)) = a2dsm(i,j) END DO END DO END DO WRITE (junit0+joff) a2dlg ELSE IF (label(9:9) == "i") THEN ! 2-d integer ! !---------------------------------------------------------------------- ! ! 2-d integer array. ! !---------------------------------------------------------------------- ! IF (joff > 0 ) READ (junit0+joff-1) ai2dlg DO ii=1+(jj-1)*maxunit,iiend fi = ffi(ii) fj = ffj(ii) READ (iunit(ii)) ai2dsm DO j=j0(fi,fj),ny DO i=i0(fi,fj),nx ai2dlg(i+(fi-1)*(nx-3),j+(fj-1)*(ny-3)) = ai2dsm(i,j) END DO END DO END DO WRITE (junit0+joff) ai2dlg ELSE GO TO 330 END IF ELSE IF (label(10:10) == "3") THEN ! 3-d ! !---------------------------------------------------------------------- ! ! 3-d real array. ! !---------------------------------------------------------------------- ! IF (joff > 0 ) READ (junit0+joff-1) a3dlg DO ii=1+(jj-1)*maxunit,iiend fi = ffi(ii) fj = ffj(ii) READ (iunit(ii)) a3dsm DO k = 1,nz DO j=j0(fi,fj),ny DO i=i0(fi,fj),nx a3dlg(i+(fi-1)*(nx-3), j+(fj-1)*(ny-3), k) = & a3dsm(i,j,k) END DO END DO END DO END DO WRITE (junit0+joff) a3dlg ELSE GO TO 330 END IF GO TO 400 ! !----------------------------------------------------------------------- ! ! Error free finish. Close files and return. ! !---------------------------------------------------------------------- ! 310 CONTINUE DO ii=1+(jj-1)*maxunit,iiend CLOSE (iunit(ii)) END DO CLOSE (junit0+joff) IF (joff > 0) THEN CLOSE (junit0+joff-1,STATUS='delete') END IF joff = joff + 1 END DO RETURN ! !----------------------------------------------------------------------- ! ! Error during read. ! !---------------------------------------------------------------------- ! ! 320 CONTINUE ! WRITE(6,'(/a/)') ' Error reading data in JOINDUMPS' ! STOP 320 ! !---------------------------------------------------------------------- ! ! Error with the label. ! !---------------------------------------------------------------------- ! 330 CONTINUE WRITE(6,'(a,a)') ' Error with label in JOINDUMPS:',label STOP 330 ! !---------------------------------------------------------------------- ! ! Error with write. ! !---------------------------------------------------------------------- ! ! 340 CONTINUE ! WRITE(6,'(a,a)') ' Error with write in JOINDUMPS.' ! STOP 340 END SUBROUTINE joindumps