PROGRAM splitfiles,18
!
!-----------------------------------------------------------------------
!
! Variable Declarations. (Local Variables)
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: nx,ny,nz,nstyps,nzsoil
INTEGER :: nztmp
INTEGER nxsm,nysm
INTEGER :: exbcvarsz ! add by wyh
INTEGER :: i
INTEGER :: istat ! Flag set by open statement on the status
! of file opening
! existence
INTEGER :: numfiles
INTEGER :: lfname
CHARACTER (LEN=80) :: filename
REAL, ALLOCATABLE :: buf_r(:,:,:)
REAL, ALLOCATABLE :: buf_rsoil4d(:,:,:,:)
INTEGER, ALLOCATABLE :: buf_i(:,:,:)
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE:: buf_i16(:,:,:,:)
INTEGER sstat
integer mp_opt_save
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! Global constants and parameters, most of them specify the
! model run options.
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
!-----------------------------------------------------------------------
!
! Control parameters defining the boundary condition types.
!
!-----------------------------------------------------------------------
INCLUDE 'bndry.inc'
!-----------------------------------------------------------------------
!
! Universal physical constants such as gas constants.
!
!-----------------------------------------------------------------------
INCLUDE 'phycst.inc'
!-----------------------------------------------------------------------
!
! External boundary parameters and variables.
!
!-----------------------------------------------------------------------
INCLUDE 'exbc.inc'
!-----------------------------------------------------------------------
!
! Nudging
!
!-----------------------------------------------------------------------
INCLUDE 'nudging.inc'
!-----------------------------------------------------------------------
!
! Message passing variables.
!
!-----------------------------------------------------------------------
INCLUDE 'mp.inc'
!
!-----------------------------------------------------------------------
!
! namelist Declarations:
!
!-----------------------------------------------------------------------
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!-----------------------------------------------------------------------
!
! Read the input file to check what input options, which need input
! data files have been set.
!
!-----------------------------------------------------------------------
CALL initpara
(nx, ny, nz, nzsoil,nstyps)
nproc_x = nproc_x_in
nproc_y = nproc_y_in
! Undo what initpara() did so we don't do this twice and get the wrong answers.
if ( mp_opt > 0 ) then
nx = ( nx - 3 ) * nproc_x + 3;
ny = ( ny - 3 ) * nproc_y + 3;
endif
! Convert to processor nx & ny (initpara thinks we're in non-MP mode)
IF (nx /= nproc_x*int((nx-3)/nproc_x)+3) THEN
nx = nproc_x*int((nx-3)/nproc_x+0.9999999999999) + 3
IF (myproc == 0) THEN
WRITE (6,*) "WARNING: adjusting nx to fit on ",nproc_x," processors:"
WRITE(6,'(5x,a,i5)') " new nx =",nx
ENDIF
ENDIF
IF (ny /= nproc_y*int((ny-3)/nproc_y)+3) THEN
ny = nproc_y*int((ny-3)/nproc_y+0.9999999999999) + 3
IF (myproc == 0) THEN
WRITE (6,*) "WARNING: adjusting ny to fit on ",nproc_y," processors:"
WRITE(6,'(5x,a,i5)') " new ny =",ny
ENDIF
ENDIF
nxsm = (nx - 3)/nproc_x + 3
nysm = (ny - 3)/nproc_y + 3
IF ((inifmt == 3) .or. (ternfmt == 3) .or. (exbcfmt == 3) .or. &
(soilfmt == 3) .or. (sfcfmt == 3)) THEN ! HDF format used
ALLOCATE(buf_r(nxsm,nysm,nz))
ALLOCATE(buf_rsoil4d(nxsm,nysm,nzsoil,0:nstyps))
ALLOCATE(buf_i(nxsm,nysm,nz))
! ALLOCATE(buf_i16(nxsm,nysm,nzsoil,0:nstyps))
!
! We need to allocated a 4D array so that "tsoil" and "qsoil" will fit.
! Although "nzsoil" is the third dimension there, it isn't big enough
! for other variables. Historically, "nz" has been used, however, if
! "nzsoil" is larger than "nz", that isn't good either.
!
! All of this can be controlled. What can't be controlled is the size
! used by the "em" files. It is controlled by "nstyp" in the "EM" input
! file, not the "nstyp" in the input to "splitfiles". The "EM" value
! of "nstyp" has always been 9, so this may never be a problem.
!
nztmp = nz
if ( nzsoil > nztmp ) nztmp = nzsoil
ALLOCATE(buf_i16(nxsm,nysm,nztmp,0:nstyps))
ENDIF
!-----------------------------------------------------------------------
!
! Split the initial data files
!
!-----------------------------------------------------------------------
IF (initopt == 3) THEN
WRITE (6, *) 'Splitting initial history dump files...'
IF (inifmt == 1) THEN
CALL splitdump
(inifile,nxsm,nysm,nz,nzsoil)
CALL splitdump
(inigbf,nxsm,nysm,nz,nzsoil)
ELSE IF (inifmt == 3) THEN
CALL split_hdf
(inifile,nxsm,nysm,nz,nzsoil,nstyps,buf_r, &
buf_rsoil4d,buf_i,buf_i16,sstat)
CALL split_hdf
(inigbf,nxsm,nysm,nz,nzsoil,nstyps,buf_r, &
buf_rsoil4d,buf_i,buf_i16,sstat)
ELSE
WRITE (6, *) 'File not in binary format. Not split'
END IF
!------------- add by wyh for split restart files ---------------------
ELSE IF (initopt == 2) THEN
IF (lbcopt == 2) THEN
exbcvarsz = 22
ELSE
exbcvarsz = 1
END IF
WRITE (6, *) 'Splitting restart file...'
CALL splitrestart
(rstinf,nxsm,nysm,nz,nzsoil, nstyps, exbcvarsz)
!----------------------------------------------------------------------
END IF
!
!-----------------------------------------------------------------------
!
! Split the terrain data file
!
!-----------------------------------------------------------------------
IF (ternopt == 2) THEN
WRITE (6, *) 'Splitting terrain file...'
IF (ternfmt == 3) THEN
CALL split_hdf
(terndta,nxsm,nysm,1,1,1,buf_r,buf_rsoil4d, &
buf_i,buf_i16,sstat)
ELSE
CALL splitterrain
(terndta,nxsm,nysm)
ENDIF
END IF
!-----------------------------------------------------------------------
!
! Split the surface and soil data files
!
!-----------------------------------------------------------------------
IF (sfcdat == 2 .or. sfcdat == 3 ) THEN
WRITE (6, *) 'Splitting surface data file...'
IF (sfcfmt == 3) THEN
CALL split_hdf
(sfcdtfl,nxsm,nysm,1,1,1,buf_r,buf_rsoil4d, &
buf_i,buf_i16,sstat)
ELSE
CALL splitsoil
(sfcdtfl,nxsm,nysm,nstyps)
ENDIF
END IF
IF ((soilinit == 2 .or. soilinit == 3 ) .AND. (initopt == 3)) THEN
WRITE (6, *) 'Splitting soil data file...'
IF (soilfmt == 3) THEN
CALL split_hdf
(soilinfl,nxsm,nysm,1,nzsoil,nstyps,buf_r, &
buf_rsoil4d,buf_i,buf_i16,sstat)
ELSE
CALL splitsoilini
(soilinfl,nxsm,nysm,nzsoil,nstyps)
ENDIF
END IF
!-----------------------------------------------------------------------
!
! Split the external boundary data files
!
!-----------------------------------------------------------------------
IF (lbcopt == 2) THEN
WRITE (6, *) 'Splitting EXBC files...'
numfiles = nint((tstop - tstart - dtbig)/tintvebd) + 10
! Go past the end in case an exbc
! file past the end time is needed.
CALL ctim2abss
( year,month,day,hour,minute,second, abstinit)
abststop = abstinit + nint(tstop)
!
! We will need to turn off "mpi_opt" when getbcfn() is called, as that routine
! will want to try to read the split file which doesn't exist.
!
mp_opt_save = mp_opt
DO i = 1, numfiles+1
abstfcst = abstinit + (i-1) * tintvebd + nint(tstart)
mp_opt = 0
CALL getbcfn
(abstfcst, exbcname, tinitebd, tintvebd, &
filename, lfname, istat)
mp_opt = mp_opt_save ! Restore the value
!wdt update: filename -> filename(1:lfname) in loop below
IF (istat == 0) THEN
IF (exbcfmt == 3) THEN
CALL split_hdf
(filename(1:lfname),nxsm,nysm,nz,1,1, &
buf_r,buf_rsoil4d,buf_i,buf_i16,sstat)
ELSE
CALL splitexbc
(filename(1:lfname)//' ',nxsm,nysm,nz)
ENDIF
END IF
END DO
END IF
!-----------------------------------------------------------------------
!
! Split the "incr" files.
!
!-----------------------------------------------------------------------
IF (nudgopt == 1 ) THEN
WRITE (6,*) 'splitting incr file'
CALL split_hdf
(incrfnam,nxsm,nysm,nz,nzsoil,nstyps,buf_r, &
buf_rsoil4d,buf_i,buf_i16,sstat)
ENDIF
IF ((inifmt == 3) .or. (ternfmt == 3) .or. (exbcfmt == 3) .or. &
(soilfmt == 3) .or. (sfcfmt == 3)) THEN ! HDF format used
DEALLOCATE(buf_r)
DEALLOCATE(buf_rsoil4d)
DEALLOCATE(buf_i)
DEALLOCATE(buf_i16)
ENDIF
call arpsstop
("Normal Finish", 0)
END PROGRAM splitfiles