SUBROUTINE splitexbc(fileheader,nx,ny,nz) 1,5 IMPLICIT NONE CHARACTER (LEN=80) :: fileheader INCLUDE 'mp.inc' INTEGER nx,ny,nz INTEGER :: nxlg, nylg, nzlg ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: lenstr CHARACTER (LEN=10) :: filetail CHARACTER (LEN=128) :: filename INTEGER :: fi, fj, i, j, k INTEGER :: nxin, nyin, nzin REAL :: dxin,dyin,dzin,ctrlatin,ctrlonin INTEGER :: ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd INTEGER :: qcbcrd,qrbcrd,qibcrd,qsbcrd,qhbcrd,idummy INTEGER :: old_v CHARACTER (LEN=15) :: ctime REAL, ALLOCATABLE :: a3dlg(:,:,:), a3dsm(:,:,:) INTEGER, ALLOCATABLE :: ounit(:) INTEGER, ALLOCATABLE :: ffi(:), ffj(:) INTEGER :: ierr INTEGER :: nfields, fcnt INTEGER :: ii,jj,iiend INTEGER :: unit0, maxunit PARAMETER (unit0=110,maxunit=60) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! if ( mp_opt > 0 ) then write(6,*) 'splitexbc: not MP ready' call arpsstop('splitexbc: not MP ready', 1) return endif nxlg = (nx-3)*nproc_x+3 nylg = (ny-3)*nproc_y+3 nzlg = nz ALLOCATE(a3dlg(nxlg,nylg,nzlg)) ALLOCATE(a3dsm(nx,ny,nz)) 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 ! !----------------------------------------------------------------------- ! ! Split the original data file into indivdual files for the ! processors to read. ! !----------------------------------------------------------------------- ! 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 ! !----------------------------------------------------------------------- ! ! Since T3D processors only support COS and IEEE double precision ! format, we have to translate the files into COS format. ! !----------------------------------------------------------------------- ! WRITE (filename, '(a,a,2i2.2)') & fileheader(1:lenstr),'_',ffi(ii),ffj(ii) 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 the dimensions of data in the file and check against ! the dimensions passed to this subroutine. ! !----------------------------------------------------------------------- ! READ (10) & nxin,nyin,nzin,dxin,dyin,dzin,ctrlatin,ctrlonin 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("splitexbc: mismatch", 1) END IF DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii)) & nx,ny,nz,dxin,dyin,dzin,ctrlatin,ctrlonin END DO ! !----------------------------------------------------------------------- ! ! Read/write header info. ! !----------------------------------------------------------------------- ! READ (10) ctime DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii)) ctime END DO old_v = 0 ! In case that the EXBC files are of an earlier ! version that does not contain water and ice variables, ! set old_v to 1. Otherwise, set it to 0. IF( old_v == 1 ) THEN READ (10) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii)) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd,qvbcrd END DO qcbcrd = 0 qrbcrd = 0 qibcrd = 0 qsbcrd = 0 qhbcrd = 0 ELSE READ (10) ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd, & qvbcrd,qcbcrd,qrbcrd,qibcrd,qsbcrd, & qhbcrd,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy DO ii=1+(jj-1)*maxunit,iiend WRITE (ounit(ii)) & ubcrd,vbcrd,wbcrd,ptbcrd,prbcrd, & qvbcrd,qcbcrd,qrbcrd,qibcrd,qsbcrd, & qhbcrd,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy END DO END IF nfields = 6 IF (qcbcrd > 0) nfields = nfields + 1 IF (qrbcrd > 0) nfields = nfields + 1 IF (qibcrd > 0) nfields = nfields + 1 IF (qsbcrd > 0) nfields = nfields + 1 IF (qhbcrd > 0) nfields = nfields + 1 ! !----------------------------------------------------------------------- ! ! Read in the global data, and write out appropriate sections into ! each processors file. ! !----------------------------------------------------------------------- ! DO fcnt = 1,nfields READ (10) 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)) a3dsm END DO END DO CLOSE (10) DO ii=1+(jj-1)*maxunit,iiend CLOSE (ounit(ii)) END DO END DO ! jj RETURN END SUBROUTINE splitexbc