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 |