model


ここでは,


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