! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSAGR ###### !###### ARPS Adaptive Grid Refinement ###### !###### ###### !###### Developed by ###### !###### William C. Skamarock (NCAR/MMM) ###### !###### ###### !###### AND ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! PROGRAM agri,24 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! 3-D ADAPTIVE MODEL INTERFACE ! ! This is the main driver and includes the top level data read/write ! routines. Only the interface routines are in this directory, ! the solver and user supplied I/O and plotting routines are ! elsewhere. ! ! The include files that go along with the interface are ! ! agrialloc.inc -- common block and size for main storage array. ! grddsc.inc -- common block for variable descriptions. ! agrigrid.inc -- parameters describing the number of variables, ! constants, etc. for any grid. ! manage.inc -- storage management common block. ! nodal.inc -- common block containing grid location and ! relationship information, along with some ! adaptive grid timing parameters. ! agricpu.inc -- common block containing the timing statistics for ! various components of the interface and solver code. ! agricst.inc -- Common blocks containing the character strings ! for runnames etc. ! Common block containing the logicals controlling ! diagnostic output. ! Common block containing the timing statistics for ! various components of the interface and solver code. ! Common block to pass parameter defining the ! order of spatial interpolations. ! ! Data definitions for node and rnode are in nodal.inc. ! ! The input file should be in unit 7. ! ! !----------------------------------------------------------------------- ! ! AUTHOR: William C. Skamarock (NCAR/MMM) and Ming Xue (CAPS/OU) ! ! For information contact Bill Skamarock at (303) 497-8893 ! or skamaroc@mmm.ucar.edu ! ! ! MODIFICATIONS: ! ! 10/30/1992 (William C. Skamarock and Ming Xue) ! ! 08/??/1995 (E.J. Adlerman) ! Used ARPS 4.0.22 as the solver ! ! 03/27/1997 (Yuhe Liu) ! 1. Fully upgraded to ARPS 4.2.4; ! 2. Moved the AGRI input parameters into arps.input by creating ! a new namelist, &arpsagr and added documentation for the ! parameters in the new namelist; ! 3. Rewrote the makefile, makefile.agri, in order to be controled ! by makearps script ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INCLUDE 'nodal.inc' INCLUDE 'agrialloc.inc' INCLUDE 'agrigrid.inc' INCLUDE 'agricpu.inc' INCLUDE 'agricst.inc' ! !----------------------------------------------------------------------- ! ! Include file for global constants used by ARPS. ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'bndry.inc' ! !----------------------------------------------------------------------- ! ! Define the namelist, &arpsagr, for ARPS AGR ! !----------------------------------------------------------------------- ! NAMELIST /arpsagr/ runold, rstime, nxc, nyc, nzc, & levfix, intrat, intratt, & intrpodr, kcheck, & verbose1, verbose2, verbose3, & verbose4, verbose5, verbose6, & rstart,rstdump,grdsrt, & nfinelv, ngrdnew, & ixc,jyc,ixln,jyln,gangle INTEGER :: iout(6) INTEGER :: nstart,nstop INTEGER :: i, lv INTEGER :: nx,ny,nz ! Actual dimension sizes INTEGER :: ii,ir,mptr INTEGER :: igtint,igtrel ! Functions to return the pointers to the ! integer or real constant array REAL :: timeend REAL :: tstopnew REAL :: f_cputime, dtbase LOGICAL :: iexist ! character*80 cstfile ! not used ! logical resetcon ! not used INTEGER :: iorder ! not used REAL :: cut ! not used REAL :: relcut ! not used REAL :: cdist ! not used INTEGER :: nstyps ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! WRITE(6,'(/ 16(/5x,a)//)') & '###############################################################', & '###############################################################', & '##### #####', & '##### Welcome to #####', & '##### #####', & '##### Adaptive Grid Refinement Interface (AGRI) #####', & '##### #####', & '##### For #####', & '##### #####', & '##### The Advanced Regional Prediction System (ARPS) #####', & '##### #####', & '##### Developed by #####', & '##### Center for Analysis and Prediction of Storms #####', & '##### University of Oklahoma #####', & '##### #####', & '###############################################################', & '###############################################################' mptr = 1 ! Set the grid number to 1 for base grid. mgrid = mptr nestgrd = 1 ! Set the grid nesting flag to 1, i.e. nesting. ! !----------------------------------------------------------------------- ! ! Call prtcpu(0,6) to initialize the cpu statistics ! !----------------------------------------------------------------------- ! CALL prtcpu(0,6) cpu_simulation = f_cputime() ! !----------------------------------------------------------------------- ! ! open the graphics stuff for test version ! !----------------------------------------------------------------------- ! ! call xdevic ! !----------------------------------------------------------------------- ! ! set storage highwater counter ! !----------------------------------------------------------------------- ! ihighwater = 0 ! !----------------------------------------------------------------------- ! ! set up units for io ! !----------------------------------------------------------------------- ! CALL iosetup ! !----------------------------------------------------------------------- ! ! read in headline info and dump back out to standard output ! !----------------------------------------------------------------------- ! ! READ(5,arpsagr) ! now read by initpara. !----------------------------------------------------------------------- ! ! Read in ARPS model configuration parameters ! !----------------------------------------------------------------------- ! CALL initpara(nxc,nyc,nzc,nstyps) IF( nstyps /= 4 ) THEN WRITE (6,'(a,i4,a,i4)') 'ARPS AGR always assumes nstyps <= 4.' ENDIF nmlntho = 80 CALL gtlfnkey( runold, nmlntho ) IF ( nfinelv > nfinelv_max ) THEN WRITE (6,'(a,i4,a,i4)') & 'The number of new grid levels should not be greater ', & 'than ',nfinelv_max,', Reset it set to ',nfinelv_max nfinelv = nfinelv_max ELSE IF ( nfinelv < 0 ) THEN WRITE (6,'(a,i4,a,i4)') & 'The number of new grid levels should not be negative. ', & 'Reset it set to ',0 nfinelv = 0 END IF lfine = nfinelv + 1 mxnest = nfinelv + 1 IF ( nfinelv > 0 ) THEN DO lv=1,nfinelv IF ( ngrdnew(lv) < 0 ) THEN ngrdnew(lv) = 0 WRITE (6,'(a)') & 'The number of new grid should not be less ', & 'than 0, Reset it set to 0' ELSE IF ( ngrdnew(lv) > ngrdnew_max ) THEN ngrdnew(lv) = ngrdnew_max WRITE (6,'(a,i4,a,i4)') & 'The number of new grid should not be greater ', & 'than ',ngrdnew_max,', Reset it set to ',ngrdnew_max END IF END DO END IF DO lv=nfinelv+1,nfinelv_max ngrdnew(lv) = 0 END DO ! WRITE(6,'(/1x,a)') '&arpsagr' ! WRITE (6,'(3x,a)') 'runold = '''//runold(1:nmlntho)//''',' ! WRITE (6,'(3x,a,f16.4,a)') 'rstime = ', rstime, ',' ! WRITE (6,'(3x,a,l3,a)') 'verbose1 = ', verbose1, ',' ! WRITE (6,'(3x,a,l3,a)') 'verbose2 = ', verbose2, ',' ! WRITE (6,'(3x,a,l3,a)') 'verbose3 = ', verbose3, ',' ! WRITE (6,'(3x,a,l3,a)') 'verbose4 = ', verbose4, ',' ! WRITE (6,'(3x,a,l3,a)') 'verbose5 = ', verbose5, ',' ! WRITE (6,'(3x,a,l3,a)') 'verbose6 = ', verbose6, ',' ! WRITE (6,'(3x,a,l3,a)') 'rstart = ', rstart, ',' ! WRITE (6,'(3x,a,l3,a)') 'rstdump = ', rstdump, ',' ! WRITE (6,'(3x,a,l3,a)') 'grdsrt = ', grdsrt, ',' ! WRITE (6,'(3x,a,i4,a)') 'nxc = ', nxc, ',' ! WRITE (6,'(3x,a,i4,a)') 'nyc = ', nyc, ',' ! WRITE (6,'(3x,a,i4,a)') 'nzc = ', nzc, ',' ! WRITE (6,'(3x,a,i4,a)') 'levfix = ', levfix, ',' ! WRITE (6,'(3x,a,i4,a)') 'intrat = ', intrat, ',' ! WRITE (6,'(3x,a,i4,a)') 'intratt = ', intratt, ',' ! WRITE (6,'(3x,a,i8,a)') 'kcheck = ', kcheck, ',' ! WRITE (6,'(3x,a,i4,a)') 'intrpodr = ', intrpodr, ',' ! WRITE (6,'(3x,a,i4,a)') 'nfinelv = ', nfinelv, ',' ! IF ( nfinelv > 0 ) THEN ! DO lv=1,nfinelv ! WRITE (6,'(3x,a,i2.2,a,i4,a)') & ! 'ngrdnew(',lv,') = ', ngrdnew(lv), ',' ! DO i=1,ngrdnew(lv) ! WRITE (6,'(3x,a,i2.2,a,i2.2,a,f5.1,a,i2.2,a,i2.2,a,f5.1, & ! & 3X,a,i2.2,a,i2.2,a,f5.1,a,i2.2,a,i2.2,a,f5.1, & ! & 3X,a,i2.2,a,i2.2,a,f5.1,a)') & ! 'ixc(',i,',',lv,') = ',ixc(i,lv), & ! ',jyc(',i,',',lv,')=',jyc(i,lv), & ! ',ixln(',i,',',lv,')=',ixln(i,lv), & ! ',jyln(',i,',',lv,')=',jyln(i,lv), & ! ',gangle(',i,',',lv,')= ',gangle(i,lv),',' ! END DO ! END DO ! END IF ! runnew = runname nmlnthn = lfnkey tstopnew = tstop ! to prevent overwrite the value from restart IF ( hdmpfmt == 5 .OR. hdmpfmt == 9 ) THEN WRITE(6,'(a,i2/a)') & ' ARPSAGRI does not support hidtory dump format ', & hdmpfmt, ' Reset hdmpfmt to 10 as GRIB format' hdmpfmt = 10 END IF IF ( lbcopt == 2 ) THEN lexbc = 1 END IF ! !----------------------------------------------------------------------- ! ! If we are restart this run from data from a previous run, ! check if restart data is correct and bring in the data. ! ! In this case there is no need to initialize the data structure ! !----------------------------------------------------------------------- ! IF (rstart) THEN ! !----------------------------------------------------------------------- ! ! Read in restart data at time timestart for all grids. ! !----------------------------------------------------------------------- ! CALL rstrdwr(1,rstime) dtbig = possk(1) ! Use the same big time step in restart file ! !----------------------------------------------------------------------- ! ! Initialize arrays that store the lookup table data. ! !----------------------------------------------------------------------- ! CALL initlktb END IF IF ( lexbc == 1 ) THEN CALL setexbcptr( nxc,nyc,nzc ) END IF iorder = 2 ! not used tol = 0.1 ! not used cut = 0.1 ! not used relcut = 0.1 ! not used cdist = 0.1 ! not used bzone = 0.1 ! not used IF (rstart) THEN CALL resett CALL stst3 ! !----------------------------------------------------------------------- ! ! If we're not restarting, but rather starting from the coarse ! grid only, we need to initialize the data structure and perform ! the initial gridding. Note, the timestep sizes and ! temporal refinement ratio can be changed on the fly. ! The spatial step sizes and refinement ratios can also be ! changed on the fly. Note that here we only change these ! values in the adaptive grid structure, the user is responsible ! for making any changes in the real and integer solver constants ! through the use of resetcon and the reset-constants file ! !----------------------------------------------------------------------- ! ELSE CALL stgrid CALL stst1 CALL domain( nxc,nyc,nzc ,tstart ) CALL stst2 END IF dtbase = possk(1) ! !----------------------------------------------------------------------- ! ! set new fine grids if needed ! !----------------------------------------------------------------------- ! IF(grdsrt) THEN IF(verbose5)PRINT*,'regrid at restart. To call regrid etc...' CALL regrid( levfix,.true. ) END IF ! !----------------------------------------------------------------------- ! ! Set the io times to number of coarse grid timesteps ! !----------------------------------------------------------------------- ! iout(1) = nint(tfmtprt/possk(1)) IF ( iout(1) == 0 ) iout(1)=-1 iout(2) = nint(thisdmp/possk(1)) IF ( iout(2) == 0 ) iout(2)=-1 iout(3) = nint(trstout/possk(1)) IF ( iout(3) == 0 ) iout(3)=-1 iout(4) = nint(tmaxmin/possk(1)) IF ( iout(4) == 0 ) iout(4)=-1 iout(5) = nint(tplots/possk(1)) IF ( iout(5) == 0 ) iout(5)=-1 iout(6) = nint(tstrtdmp/possk(1)) IF ( iout(6) == 0 ) iout(6)=-1 ! !----------------------------------------------------------------------- ! ! Reset certain parameters using values from the solver for the ! base grid. The values read in from the interface input file ! are superceded. ! !----------------------------------------------------------------------- ! nx = node(5,mptr) ny = node(6,mptr) nz = node(14,mptr) ii = igtint(mptr,1) ir = igtrel(mptr,1) ! ! Retrieve constant values from the constant arrays, and feed ! the values into parameters in globcst.inc of ARPS model. ! CALL getcnts(nx,ny,nz, a(ii),nsint, a(ir),nsreal) IF ( lbcopt /= 2 .AND. lexbc == 1 ) THEN WRITE (6,'(a/a)') & ' Warning: model configured NOT to use the external boundary', & ' condition. Some space may be wasted.' ELSE IF ( lbcopt == 2 .AND. lexbc /= 1 ) THEN WRITE (6,'(a/a/a/a)') & ' Error: model configured to use the external boundary ', & ' condition, but no space was allocated to EXBC arrays.', & ' Check parameter lexbc in arpsagri and lbcopt in ', & ' boundary_condition_options. Program stopped.' STOP END IF runname = runnew lfnkey = nmlnthn IF ( .NOT.rstart ) THEN iout(1) = nfmtprt iout(2) = nhisdmp iout(3) = nrstout iout(4) = nmaxmin iout(5) = nplots iout(6) = nstrtdmp ELSE tstart = rstime ! Use the restart time for tstart nfmtprt = iout(1) nhisdmp = iout(2) nrstout = iout(3) nmaxmin = iout(4) nplots = iout(5) nstrtdmp= iout(6) tfmtprt = MAX(iout(1)*dtbase, 0.0) thisdmp = MAX(iout(2)*dtbase, 0.0) trstout = MAX(iout(3)*dtbase, 0.0) tmaxmin = MAX(iout(4)*dtbase, 0.0) tplots = MAX(iout(5)*dtbase, 0.0) tstrtdmp= MAX(iout(6)*dtbase, 0.0) tstop = tstopnew ! ! note: here we changed the parameters for the base grid only. ! The parameters for the other grids should also be ! changed accordingly. The full implementation of this function ! is done in the change_constant step. ! END IF WRITE(6,'(1x,a,i3)') 'For grid ',mptr WRITE(6,'(1x,a,i3)') 'nfmtprt: ',nfmtprt WRITE(6,'(1x,a,i3)') 'nhisdmp: ',nhisdmp WRITE(6,'(1x,a,i3)') 'nrstout: ',nrstout WRITE(6,'(1x,a,i3)') 'nmaxmin: ',nmaxmin WRITE(6,'(1x,a,i3)') 'nplots: ',nplots WRITE(6,'(1x,a,f10.3)') 'tfmtprt: ',tfmtprt WRITE(6,'(1x,a,f10.3)') 'thisdmp: ',thisdmp WRITE(6,'(1x,a,f10.3)') 'trstout: ',trstout WRITE(6,'(1x,a,f10.3)') 'tmaxmin: ',tmaxmin WRITE(6,'(1x,a,f10.3)') 'tplots: ',tplots WRITE(6,'(1x,a,f10.3)') 'tstop: ',tstop WRITE(6,'(1x,a,f10.3)') 'tstrtdmp:',tstrtdmp CALL strcnts(nx,ny,nz, a(ii),nsint, a(ir),nsreal) nstart= nint( tstart/possk(1) ) nstop = nint( tstop /possk(1) ) ! !----------------------------------------------------------------------- ! ! reset the constants in the solver constants data if necessary ! !----------------------------------------------------------------------- ! ! if( resetcon ) call chgcst( cstfile ) ! !----------------------------------------------------------------------- ! ! Print out some I/O control information: ! !----------------------------------------------------------------------- ! WRITE(6,*) ' Adaptive model run ',runname(1:lfnkey) IF( rstart ) WRITE(6,*) ' Restart from run ',runold(1:nmlntho) WRITE(6,102) tstart,nstart, tstop,nstop WRITE(6,103) tol,iorder,kcheck,bzone,cut,relcut, & cdist,mxnest,intrat,intratt, & hxposs(1),hyposs(1),possk(1) ! !----------------------------------------------------------------------- ! ! output the grid structure ! !----------------------------------------------------------------------- ! CALL outtre( mstart,.true.,.false. ) ! !----------------------------------------------------------------------- ! ! output initial data ! !----------------------------------------------------------------------- ! CALL usrout1( 1,lfine,1 ) ! !----------------------------------------------------------------------- ! ! Dump out restart data at initial time. ! !----------------------------------------------------------------------- ! IF(.false.) THEN WRITE(6,'('' DUMPING RESTRART DATA AT INITIAL TIME='',F10.2)') & tstart CALL rstrdwr(2,tstart) END IF ! !----------------------------------------------------------------------- ! ! Call tick to perform time integration ... ! !----------------------------------------------------------------------- ! CALL tick( iout,nstart, nstop ) ! !----------------------------------------------------------------------- ! ! End of time integration. ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! ! dump out restart data if wanted ! !----------------------------------------------------------------------- IF (rstdump) THEN WRITE(6,'('' DUMPING RESTART DATA '')') timeend = AMAX1(0.,possk(1)*nstop) CALL rstrdwr(2,timeend) END IF ! !----------------------------------------------------------------------- ! ! close graphics stuff ! !----------------------------------------------------------------------- ! ! call xgrend ! ! !----------------------------------------------------------------------- ! ! Print out some run time information. ! !----------------------------------------------------------------------- ! WRITE(6,*) ' alloc dimension was ',lstore WRITE(6,*) ' maximum alloc used was ',ihighwater WRITE(6,104) ! !----------------------------------------------------------------------- ! ! Print the cpu statistics ! !----------------------------------------------------------------------- ! cpu_simulation = f_cputime() - cpu_simulation CALL prtcpu(1,6) 102 FORMAT(//, & ' timing parameters ',//, & ' start time ',e12.5,' number of steps ',i6,/, & ' stop time ',e12.5,' number of steps ',i6,/, & ' output1 interval ',e12.5,' number of steps ',i6,/, & ' output2 interval ',e12.5,' number of steps ',i6,/, & ' output3 interval ',e12.5,' number of steps ',i6,/, & ' output4 interval ',e12.5,' number of steps ',i6,/, & ' output5 interval ',e12.5,' number of steps ',i6 ) 103 FORMAT(///, & ' mesh refinement parameters ',//, & ' error tol ',e12.5,/, & ' order of integrator ',i9,/, & ' error checking interval ',i9,/, & ' buffer zone size ',e12.5,/, & ' volume cutoff ratio ',e12.5,/, & ' relative vol. cutoff ',e12.5,/, & ' cluster seperation ',e12.5,/, & ' max. refinement level ',i9,/, & ' refine ratio, spatial ',i9,/, & ' refine ratio, temporal ',i9,/, & ' base delta x ',e12.5,/, & ' base delta y ',e12.5,/, & ' base delta t ',e12.5,//) 104 FORMAT(' ------ END OF MR INTEGRATION -------- ') 105 FORMAT(//,' changing real and integer constants in the ',/, & ' solver constants file ',/) STOP END PROGRAM agri ! SUBROUTINE rstrdwr(i,time) 4,8 ! !----------------------------------------------------------------------- ! ! Reads in or dumps out all the data for a restart ! ! i = 1 for read in stuff ! = 2 for write out stuff ! !----------------------------------------------------------------------- ! IMPLICIT NONE INCLUDE 'agrigrid.inc' INCLUDE 'manage.inc' INCLUDE 'grddsc.inc' INCLUDE 'nodal.inc' INCLUDE 'agrialloc.inc' INCLUDE 'agricst.inc' INCLUDE 'globcst.inc' REAL :: time INTEGER :: i CHARACTER (LEN=80) :: filenm,runnami,filenmi,machsti REAL :: dum, timei, hzposs INTEGER :: igtunit, nmlnthi, iunit ,length INTEGER :: nsinti,nsreali, & nx1di,ny1di,nz1di, & nxy2di,nxz2di,nyz2di, & nxyz3di,nexbc3di,lstorei ! !----------------------------------------------------------------------- ! ! To read in restart data. ! !----------------------------------------------------------------------- ! IF(i == 1) THEN WRITE(6,*) ' restart read from run ',runold(1:nmlntho), & ' at time ',time ! CALL mkflnm( runold(1:nmlntho),' ','.t',time,0,filenm,length ) iunit = igtunit( dum ) CALL fexist( filenm,length,.true.,.false. ) OPEN( UNIT=iunit,FILE=filenm(1:length),FORM='unformatted', & STATUS='old') IF(verbose3) WRITE(6,*) ' constants file is ',filenm(1:length), & ', io through unit ',iunit REWIND(iunit) ! ! read in the rnuname and ! variable numers and see if they're the same as ! what this program wants ! READ(iunit) runnami,filenmi,machsti,nmlnthi,timei PRINT*,' runnami,filenmi,machsti,nmlnthi,timei', & runnami,filenmi,machsti,nmlnthi,timei IF( (runnami(1:nmlnthi) /= runold(1:nmlntho)) .OR. & (filenmi(1:length) /= filenm(1:length)) .OR. & (nmlntho /= nmlnthi ) ) THEN WRITE(6,'(/2x,a,/2x,a/)' ) & 'Warning: Inconsistencies found between restart', & 'file internal info and the input specifications.' WRITE(6,*) ' runname error in restart ' WRITE(6,*) ' input runname ',runold(1:nmlntho) WRITE(6,*) ' runname in restart file ',runnami(1:nmlnthi) WRITE(6,*) ' input file ',filenm(1:length) WRITE(6,*) ' input file internal name ',filenmi(1:80) WRITE(6,*) ' time given for restart ',time WRITE(6,*) ' time in restart file ',timei ! stop ELSE WRITE(6,*) ' time in restart file ',timei END IF READ(iunit) nsinti,nsreali, & nx1di,ny1di,nz1di, & nxy2di,nxz2di,nyz2di, & nxyz3di,nexbc3di,lstorei IF( (nsint /= nsinti) .OR. (nsreal /= nsreal) .OR. & (nx1d /= nx1di) .OR. (ny1d /= ny1di) .OR. & (nz1d /= nz1di) .OR. & (nxy2d /= nxy2di) .OR. (nxz2d /= nxz2di) .OR. & (nyz2d /= nyz2di) .OR. & (nxyz3d /= nxyz3di) .OR. (nexbc3d /= nexbc3di) ) THEN WRITE(6,'('' ERROR - GRID VARIABLES DIFFER IN NUMBER '')') WRITE(6,101) nsint,nsinti,nsreal,nsreali, & nx1d,nx1di,ny1d,ny1di,nz1d,nz1di, & nxy2d,nxy2di,nxz2d,nxz2di,nyz2d,nyz2di, & nxyz3d,nxyz3di,nexbc3d,nexbc3di STOP END IF ! ! output storage size information ! WRITE(6,'('' STORE SIZE DATA '', & & /,'' the INPUT storage size was '',i12, & & /,'' the PROGRAM storage size is '',i12 )') & lstorei,lstore ! ! stop if storage size not large enough ! IF(lstorei > lstore) THEN WRITE(6,'('' STORAGE TOO SMALL, ERROR STOP '')') STOP END IF ! ! now bring in all the restart data ! first the nodal data ! IF(verbose3) WRITE(6,'('' READING IN NODAL DATA '')') READ(iunit) rnode,node,lstart,newstl,llist,lback,tol,bzone, & mstart,ndfree,intrat,intratt, & lfine,kcheck,mxnest,hxposs, & hyposs,hzposs,possk,ncheck,levmlt ! ! management data ! IF(verbose3) WRITE(6,'('' READING IN MANAGEMENT DATA '')') READ(iunit) lfree,lenf,idimf ! ! read in the grid description data ! IF(verbose3) WRITE(6,'('' READING IN GRID DESCRIPTION DATA '')') READ(iunit) stgxy,stgxz,stgyz,stgxyz,stgexbc, & idmxy,idmxz,idmyz,idmxyz,idmexbc, & ipkxy,ipkxz,ipkyz,ipkxyz,ipkexbc, & inixy,inixz,iniyz,inixyz,iniexbc, & iupxy,iupxz,iupyz,iupxyz,iupexbc, & ibdxy,ibdxz,ibdyz,ibdxyz,ibdexbc ! ! read in the grid storage information ! IF(verbose3) WRITE(6,'('' READING IN GRID STORAGE DATA '')') READ(iunit) ipint,ipreal,ips1d, & ipx,ipy,ipz,ipxy,ipxz,ipyz,ipxyz,ipexbc READ(iunit) ntemp CLOSE(UNIT=iunit,STATUS='keep') IF(verbose3) WRITE(6,*) ' closed ',filenm(1:length), & ' on unit ',iunit CALL retnunit( iunit ) ! ! finally, read in the grid data ! IF(verbose3) WRITE(6,'('' READING IN GRID DATA '')') CALL readall( time ) WRITE(6,'('' RESTART READ COMPLETE '')') ELSE IF( i == 2 ) THEN ! !----------------------------------------------------------------------- ! ! To dump out restart data. ! !----------------------------------------------------------------------- ! WRITE(6,'(1x,a,a,a,f10.2,a)') & ' Restart dump for run ',runname(1:lfnkey), & ' at time ',time,' (s).' CALL mkflnm( runname(1:lfnkey),' ','.t',time,0,filenm,length ) iunit = igtunit( dum ) CALL fexist( filenm,length,.false.,.true. ) WRITE(6,'(1x,a)') & ' Restart dump file: '//filenm(1:length) OPEN( UNIT=iunit,FILE=filenm(1:length),FORM='unformatted', & STATUS='new') IF(verbose3) WRITE(6,*) ' constants file is ',filenm(1:length), & ', io through unit ',iunit IF(verbose3) WRITE(6,'('' DUMPING RUNNAME AND STORE PARAMETERS '')') ! machst = ' CRAY YMP at NCAR ' machst = ' UNKNOWN ' WRITE(iunit) runname,filenm,machst,lfnkey,time WRITE(iunit) nsint,nsreal, & nx1d,ny1d,nz1d, & nxy2d,nxz2d,nyz2d, & nxyz3d,nexbc3d,ntemp IF(verbose3) WRITE(6,'('' DUMPING NODEL DATA '')') WRITE(iunit) rnode,node,lstart,newstl,llist,lback,tol,bzone, & mstart,ndfree,intrat,intratt, & lfine,kcheck,mxnest,hxposs, & hyposs,hzposs,possk,ncheck,levmlt IF(verbose3) WRITE(6,'('' DUMPING MANAGEMENT DATA '')') WRITE(iunit) lfree,lenf,idimf IF(verbose3) WRITE(6,'('' DUMPING GRID DESCRIPTION DATA '')') WRITE(iunit) stgxy,stgxz,stgyz,stgxyz,stgexbc, & idmxy,idmxz,idmyz,idmxyz,idmexbc, & ipkxy,ipkxz,ipkyz,ipkxyz,ipkexbc, & inixy,inixz,iniyz,inixyz,iniexbc, & iupxy,iupxz,iupyz,iupxyz,iupexbc, & ibdxy,ibdxz,ibdyz,ibdxyz,ibdexbc IF(verbose3) WRITE(6,'('' DUMPING GRID STORAGE DATA '')') WRITE(iunit) ipint,ipreal,ips1d, & ipx,ipy,ipz,ipxy,ipxz,ipyz,ipxyz,ipexbc WRITE(iunit) ntemp CLOSE(UNIT=iunit,STATUS='keep') ! ! For PSC Cray, save the restart file in FAR, and ! delete the file if saved sucessfully. ! IF(verbose3) WRITE(6,*) ' closed ',filenm(1:length), & ' on unit ',iunit CALL retnunit( iunit ) IF(verbose3) WRITE(6,'('' DUMPING GRID DATA '')') CALL dmpall( time ) WRITE(6,'('' RESTART DUMP COMPLETE '')') END IF ! ! we're done here ! RETURN 101 FORMAT(' in dataset in program ', & ' nsint ',i10,3X,i10, & ' nsreal ',i10,3X,i10, & ' nx1d ',i10,3X,i10, & ' ny1d ',i10,3X,i10, & ' nz1d ',i10,3X,i10, & ' nxy2d ',i10,3X,i10, & ' nxz2d ',i10,3X,i10, & ' nyz2d ',i10,3X,i10, & ' nxyz3d ',i10,3X,i10, & ' nexbc3d ',i10,3X,i10 ) END SUBROUTINE rstrdwr SUBROUTINE readst(a,m,iunit) REAL :: a(m) READ(iunit) a RETURN END SUBROUTINE readst SUBROUTINE writst(a,m,iunit) REAL :: a(m) WRITE(iunit) a RETURN END SUBROUTINE writst