C
SUBROUTINE MODEL(A,B)
DIMENSION A(*),B(*)
C +------------------------------------------------------------------
C !
C ! This routine drives the model timesteps and output files
C !
C +------------------------------------------------------------------
C
include 'rcommons.h'
DIMENSION NNFM(MAXGRDS)
C
C Start the model
C
IF(TIME.EQ.TIMMAX) RETURN
C
C Compute the number of timesteps to run the model
C
IF(RUNTYPE.EQ.'HISTORY')THEN
NTSTEPS=INT((TIMMAX-TIMSTR+0.5*DTLONG)/DTLONG)
ELSE
NTSTEPS=INT((TIMMAX+0.5*DTLONG)/DTLONG)
ENDIF
C
BEGTIME=TIME
DO NG=1,NGRIDS
NNFM(NG)=1
NCNT(NG)=0
ENDDO
C
DO ISTP=1,NTSTEPS
C
C CPU timing information
C
CALL TIMING(1,T1)
C
C Loop through all grids and advance them a 'DTLONG' timestep.
C
NGRID=1
CALL NEWGRID(A)
C
30 ISSTP=MOD(NCNT(NGRID),NDTRAT)+1
TIME=BEGTIME+FLOAT(NCNT(NGRID))*DTL
TIMEM=TIME+.001
C
C Timestep driver for all time differencing schemes
C
CALL TIMESTEP (A,B)
timestep
C
NCNT(NGRID)=NCNT(NGRID)+1
NGBEGUN(NGRID)=1
TIME=BEGTIME+FLOAT(NCNT(NGRID))*DTL
TIMEM=TIME+.001
C
40 NNFM(NGRID)=NNFM(NGRID)+1
IF (NNFM(NGRID).GT.NGRIDS) GO TO 50
IF (NXTNEST(NNFM(NGRID)).NE.NGRID) GO TO 40
NGRID=NNFM(NGRID)
CALL NEWGRID(A)
45 ISSTP=MOD(NCNT(NGRID),NDTRAT)+1
CALL PRGINTRP(NGRID,0,A,B)
GO TO 30
C
50 NNFM(NGRID)=1
IF (NGRID.EQ.1) GO TO 80
IF(NCNT(NGRID).LT.NCNT(NXTNEST(NGRID))*NDTRAT)THEN
GO TO 30
ENDIF
c
ifm=ngrid
CALL NSTFEED(A)
icm=ngrid
dtlcm=dtl
ngrid=ifm
call newgrid(a)
CALL MOVENEST(dtlcm,a)
ngrid=icm
call newgrid(a)
c
GO TO 40
C
80 CONTINUE
C
IF(MOD(ISTP,ISTPFL).EQ.0.OR.IFLAG.EQ.1)THEN
CALL TIMING(2,T2)
PRINT 200, ISTP,TIME,T2-T1
200 FORMAT(' Timestep no.',I5,' Model time(sec)=',F10.2
+ ,3X,'CPU time(sec)=',F8.3)
ENDIF
C
DO NGRID=1,NGRIDS
CALL NEWGRID(A)
C
IF(MOD(TIMEM,FRQPRT).LT.DTLONG.OR.IFLAG.EQ.1)THEN
CALL PRTOUT(A)
ENDIF
C
IF(MOD(TIMEM,FRQIST).LT.DTLONG.OR.IFLAG.EQ.1)THEN
CALL ENRGTC(1,A)
ENDIF
C
IF(MOD(TIMEM,FRQIPR).LT.DTLONG.OR.IFLAG.EQ.1)THEN
CALL ENRGTC(2,A)
ENDIF
C
ENDDO
C
IF(MOD(TIMEM,FRQANL).LT.DTLONG.OR.istp.eq.ntsteps
+ .OR.IFLAG.EQ.1)THEN
if(nlevel(ngrid).ge.2.and.icloud(ngrid).lt.0)
+ call thermo('PAST','NOMICRO',a)
CALL ANLWRT('no',A)
ENDIF
C
IF(MOD(TIMEM,FRQHIS).LT.DTLONG.OR.istp.eq.ntsteps
+ .OR.IFLAG.EQ.1)THEN
CALL HISWRT('no',A)
ENDIF
C
IF(INITIAL.EQ.2.AND.TIME.GE.VTIME(NVARF+1)
+ .AND.TIMEM.LT.TIMMAX) THEN
NGRID=1
CALL NEWGRID(A)
NVARF=NVARF+1
VARFIL1=VARFIL(NVARF)
VARFIL2=VARFIL(NVARF+1)
VTIME1=VTIME(NVARF)
VTIME2=VTIME(NVARF+1)
RUNTYPE='HISTORY'
CALL INITV(A,ifileok)
if(ifileok.eq.1)
+ print*,'Switching varfiles on grid-',ngrid
do ngr=2,ngrids
ngrid=ngr
call newgrid(a)
call initv(a,ifileok)
if(ifileok.eq.1) then
print*,'Switching varfiles on grid-',ngrid
endif
call vfintrp(ngr,a,ifileok)
if(ifileok.eq.0) then
print*,'Interpolating varfiles on grid-',ngrid
endif
end do
ENDIF
C
IF(IFLAG.EQ.1)STOP 'IFLAG'
C
ENDDO
C
RETURN
END
C
C ******************************************************************
C
|