Skip to content
Snippets Groups Projects
spawn_model2.f90 59.4 KiB
Newer Older
  • Learn to ignore specific revisions
  •   ALLOCATE(TDTRELFRC(0))
      ALLOCATE(XTHREL(0,0,0,0))
      ALLOCATE(XRVREL(0,0,0,0))
    END IF
    !
    !        4.11  Turbulent fluxes for 2D (Modif MT)                                    
    !
    !
    IF (LUV_FLX) THEN
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: XUV_FLX1 IS SET TO ',XUV_FLX1,' SO XVU_FLUX WILL BE SPAWN'
      ALLOCATE(XVU_FLUX_M(IIU,IJU,IKU))
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF XVU_FLUX_M  MADE'
    ELSE
      ALLOCATE(XVU_FLUX_M(0,0,0))
    END IF
    !
    IF (LTH_FLX) THEN
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: XTH_FLX IS SET TO ',XTH_FLX,' SO XVTH_FLUX and XWTH_FLUX WILL BE SPAWN'
      ALLOCATE(XVTH_FLUX_M(IIU,IJU,IKU))
      ALLOCATE(XWTH_FLUX_M(IIU,IJU,IKU))
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF XVTH_FLUX_M and XWTH_FLUX_M  MADE'
    ELSE
      ALLOCATE(XVTH_FLUX_M(0,0,0))
      ALLOCATE(XWTH_FLUX_M(0,0,0))
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !*       5.     INITIALIZE ALL THE MODEL VARIABLES
    !	        ----------------------------------
    !
    !*       5.1    Bikhardt interpolation coefficients computation :
    !
    CALL INI_BIKHARDT_n(NDXRATIO,NDYRATIO,2)
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZMISC = ZTIME2 - ZTIME1
    !
    !*       5.2    Spatial and Temporal grid (for MODD_GRID2 and MODD_TIME2) :
    !
    CALL SECOND_MNH(ZTIME1)
    !
    
    IF(NPROC.GT.1)THEN
            CALL GO_TOMODEL_ll(2, IINFO_ll)
            CALL GET_FEEDBACK_COORD_ll(NXOR_TMP,NYOR_TMP,NXEND_TMP,NYEND_TMP,IINFO_ll) !phys domain
    ELSE
            NXOR_TMP = NXOR
            NYOR_TMP = NYOR
            NXEND_TMP= NXEND
            NYEND_TMP = NYEND
    ENDIF
    XZS=0.
    
    CALL SPAWN_GRID2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,                    &
                      XLONORI,XLATORI,XXHAT,XYHAT,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2, &
                      XZS,XZSMT,ZZS_LS,ZZSMT_LS,TDTMOD,TDTCUR                     )
    
    CALL MPPDB_CHECK2D(ZZS_LS,"SPAWN_MOD2:ZZS_LS",PRECISION)
    CALL MPPDB_CHECK2D(ZZSMT_LS,"SPAWN_MOD2:ZZSMT_LS",PRECISION)
    CALL MPPDB_CHECK2D(XZS,"SPAWN_MOD2:XZS",PRECISION)
    CALL MPPDB_CHECK2D(XZSMT,"SPAWN_MOD2:XZSMT",PRECISION)
    !
    
    CALL SECOND_MNH(ZTIME2)
    !
    ZGRID2 = ZTIME2 - ZTIME1
    !
    !*       5.3    Calculation of the grid
    !
    ZTIME1 = ZTIME2
    !
    IF (LCARTESIAN) THEN
    
      CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,ZZS_LS,LSLEVE,XLEN1,XLEN2,ZZSMT_LS,XDXHAT,XDYHAT,ZZZ_LS,ZJ)
      CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS   ,LSLEVE,XLEN1,XLEN2,XZSMT   ,XDXHAT,XDYHAT,XZZ   ,ZJ)
    
      CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,ZZS_LS,LSLEVE,XLEN1,XLEN2,ZZSMT_LS,&
    
                       XLATORI,XLONORI,XMAP,XLAT,XLON,XDXHAT,XDYHAT,ZZZ_LS,ZJ)
    
      CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS   ,LSLEVE,XLEN1,XLEN2,XZSMT   ,&
    
                       XLATORI,XLONORI,XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ   ,ZJ)
    END IF
    !
    !*       5.4  Compute the metric coefficients
    !
    
    CALL ADD3DFIELD_ll( TZFIELDS_ll, XZZ, 'SPAWN_MODEL2::XZZ' )
    
    CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
    CALL CLEANLIST_ll(TZFIELDS_ll)
    !
    
    CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
    !
    
    CALL MPPDB_CHECK3D(XDXX,"spawnmod2-beforeupdate_metrics:XDXX",PRECISION)
    CALL MPPDB_CHECK3D(XDYY,"spawnmod2-beforeupdate_metrics:XDYY",PRECISION)
    CALL MPPDB_CHECK3D(XDZX,"spawnmod2-beforeupdate_metrics:XDZX",PRECISION)
    CALL MPPDB_CHECK3D(XDZY,"spawnmod2-beforeupdate_metrics:XDZY",PRECISION)
    !
    CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)
    !
    CALL MPPDB_CHECK3D(XDXX,"spawnmod2-aftrupdate_metrics:XDXX",PRECISION)
    CALL MPPDB_CHECK3D(XDYY,"spawnmod2-aftrupdate_metrics:XDYY",PRECISION)
    CALL MPPDB_CHECK3D(XDZX,"spawnmod2-aftrupdate_metrics:XDZX",PRECISION)
    CALL MPPDB_CHECK3D(XDZY,"spawnmod2-aftrupdate_metrics:XDZY",PRECISION)
    !$
    
    !
    !*       5.5    3D Reference state variables :
    !
    
                 XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY,   &
                 XREFMASS,XMASS_O_PHI0,XLINMASS,       &
    
                 XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ)
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZMISC = ZMISC + ZTIME2 - ZTIME1
    !
    !*       5.6    Prognostic variables and Larger scale fields :
    !
    ZTIME1 = ZTIME2
    !
    !* horizontal interpolation
    !
    ALLOCATE(ZTHVT(IIU,IJU,IKU))
    ALLOCATE(ZHUT(IIU,IJU,IKU))
    !
    
    IF (GNOSON) THEN
      CALL SPAWN_FIELD2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,CTURB,            &
    
                     XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XZWS,XATC,              &
    
                     XSRCT,XSIGS,                                                  &
    
                     XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,                      &
    
                     XDTHFRC,XDRVFRC,XTHREL,XRVREL,                                &
                     XVU_FLUX_M,XVTH_FLUX_M,XWTH_FLUX_M            )
    
      CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 after SPAWN_FIELD2:XUT",PRECISION)
    
      CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 before SPAWN_FIELD2:XUT",PRECISION)
    
      CALL SPAWN_FIELD2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,CTURB,            &
    
                     XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XZWS,XATC,              &
    
                     XSRCT,XSIGS,                                                  &
    
                     XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,                      &
    
                     XDTHFRC,XDRVFRC,XTHREL,XRVREL,                                &                 
                     XVU_FLUX_M, XVTH_FLUX_M,XWTH_FLUX_M,                          &
    
                     IIB2,IJB2,IIE2,IJE2,                                          &
                     IIB1,IJB1,IIE1,IJE1                                           )
    
      CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 after SPAWN_FIELD2:XUT",PRECISION)
    
    CALL MPPDB_CHECK3D(XUT,"SPAWN_MOD2aftFIELD2:XUT",PRECISION)
    CALL MPPDB_CHECK3D(XVT,"SPAWN_MOD2aftFIELD2:XVT",PRECISION)
    !$
    
    !* correction of positivity
    !
    IF (SIZE(XLSRVM,1)>0)      XLSRVM   = MAX(0.,XLSRVM)
    IF (SIZE(XRT,1)>0)         XRT      = MAX(0.,XRT)
    IF (SIZE(ZHUT,1)>0)        ZHUT     = MIN(MAX(ZHUT,0.),100.)
    IF (SIZE(XTKET,1)>0)       XTKET    = MAX(XTKEMIN,XTKET)
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZFIELD2 = ZTIME2 - ZTIME1
    !
    ZTIME1  = ZTIME2
    !
    !* vertical interpolation
    !
    
    ZZS_MAX = ABS( MAXVAL(XZS(:,:)))
    
    CALL MPI_ALLREDUCE(ZZS_MAX, ZZS_MAX_ll, 1, MNHREAL_MPI, MPI_MAX,  &
    
                         NMNH_COMM_WORLD,IINFO_ll)
    IF ( (ZZS_MAX_ll>0.) .AND. (NDXRATIO/=1 .OR. NDYRATIO/=1) )  THEN
    
      CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 before VER_INTERP_FIELD:XUT",PRECISION)
    
      CALL VER_INTERP_FIELD (CTURB,NRR,NSV,ZZZ_LS,XZZ,                             &
                   XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,                          &
                   XSRCT,XSIGS,                                                    &
                   XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM                                 )
    
      !
      CALL MPPDB_CHECK3D(XUT,"SPAWN_M2aftVERINTER:XUT",PRECISION)
      CALL MPPDB_CHECK3D(XVT,"SPAWN_M2aftVERINTER:XVT",PRECISION)
      CALL MPPDB_CHECK3D(XWT,"SPAWN_M2aftVERINTER:XWT",PRECISION)
      CALL MPPDB_CHECK3D(ZHUT,"SPAWN_M2aftVERINTER:ZHUT",PRECISION)
      CALL MPPDB_CHECK3D(XTKET,"SPAWN_M2aftVERINTER:XTKET",PRECISION)
      CALL MPPDB_CHECK3D(XSRCT,"SPAWN_M2aftVERINTER:XSRCT",PRECISION)
    
    ENDIF
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZVER = ZTIME2 - ZTIME1
    !
    !*       5.7    Absolute pressure :
    !
    ZTIME1 = ZTIME2
    !
    CALL SPAWN_PRESSURE2(NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,   &
    
                         ZZZ_LS,XZZ,ZTHVT,XPABST                    )
    
    !
    IF (.NOT.GNOSON) THEN
      ALLOCATE(ZWORK3D(IIUSON,IJUSON,IKU))
    
      XPABST(IIB2:IIE2,IJB2:IJE2,:) = ZWORK3D(IIB1:IIE1,IJB1:IJE1,:)
      DEALLOCATE(ZWORK3D)
    END IF
    !
    IF (NVERB>=2) THEN
    
      IK4000 = COUNT(XZHAT(:)<4000.)
      IIJ = MAXLOC(        SUM(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IK4000),3),                  &
                    MASK=COUNT(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IKE)                         &
                               >=MAXVAL(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IKE))-0.01,DIM=3 )  &
                          >=1                                                   )           &
    
            + JPHEXT
      WRITE(ILUOUT,*) ' '
      WRITE(ILUOUT,*) 'humidity     (I=',IIJ(1),';J=',IIJ(2),')'
      DO JK=IKB,IKE
    
        WRITE(ILUOUT,'(F6.2," %")') ZHUT(IIJ(1),IIJ(2),JK)
    
      END DO
    END IF
    !*       5.8    Retrieve model thermodynamical variables :
    !
    ALLOCATE(ZSUMRT(IIU,IJU,IKU))
    ZSUMRT(:,:,:) = 0.
    IF (NRR==0) THEN
      XTHT(:,:,:) = ZTHVT(:,:,:)
    ELSE
      IF (NDXRATIO/=1 .OR. NDYRATIO/=1) THEN
    
        XRT(:,:,:,1) = SM_PMR_HU(XPABST(:,:,:),                                 &
    
                                 ZTHVT(:,:,:)*(XPABST(:,:,:)/XP00)**(XRD/XCPD), &
                                 ZHUT(:,:,:),XRT(:,:,:,:),KITERMAX=100          )
      END IF
      !
      DO JRR=1,NRR
        ZSUMRT(:,:,:) = ZSUMRT(:,:,:) + XRT(:,:,:,JRR)
      END DO
      XTHT(:,:,:) = ZTHVT(:,:,:)/(1.+XRV/XRD*XRT(:,:,:,1))*(1.+ZSUMRT(:,:,:))
    
      CALL MPPDB_CHECK3D(XTHT,"SPAWN_MOD2:XTHT",PRECISION)
    
    END IF
    !
    DEALLOCATE (ZHUT)
    !
    CALL SECOND_MNH(ZTIME2)
    ZPRESSURE2=ZTIME2-ZTIME1
    !
    !*       5.9   Large Scale field for lbc treatment:
    !
    !
    
    !*       5.9.1 West-East LB zones
    !
    !
    !JUAN A REVOIR TODO_JPHEXT
    ! <<<<<<< spawn_model2.f90
      MPPDB_CHECK_LB = .TRUE.
      CALL MPPDB_CHECK3D(XUT,"SPAWN_MOD2 before lbc treatment:XUT",PRECISION)
      CALL MPPDB_CHECK3D(XVT,"SPAWN_MOD2 before lbc treatment:XVT",PRECISION)
      MPPDB_CHECK_LB = .FALSE.
      YLBTYPE = 'LBU'
      CALL SET_LB_FIELD_ll( YLBTYPE, XUT, XLBXUM, XLBYUM, IIB, IJB, IIE, IJE, 1, 0, 0, 0 )
      ! copy XUT(IIB:IIB+NRIMX,:,:) instead of XUT(IIB-1:IIB-1+NRIMX,:,:) in XLBXUM
      CALL SET_LB_FIELD_ll( YLBTYPE, XVT, XLBXVM, XLBYVM, IIB, IJB, IIE, IJE, 0, 0, 1, 0 )
      ! copy XVT(:,IJB:IJB+NRIMY,:) instead of XVT(:,IJB-1:IJB-1+NRIMY,:) in XLBYVM
      CALL SET_LB_FIELD_ll( YLBTYPE, XWT, XLBXWM, XLBYWM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
      CALL SET_LB_FIELD_ll( YLBTYPE, XTHT, XLBXTHM, XLBYTHM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
      IF (HTURB /= 'NONE') THEN
        CALL SET_LB_FIELD_ll( YLBTYPE, XTKET, XLBXTKEM, XLBYTKEM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
      ENDIF
      IF (NRR >= 1) THEN
        DO JRR =1,NRR
          CALL SET_LB_FIELD_ll( YLBTYPE, XRT(:,:,:,JRR), XLBXRM(:,:,:,JRR), XLBYRM(:,:,:,JRR), IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
        END DO
      END IF
      IF (NSV /= 0) THEN
        DO JSV = 1, NSV
          CALL SET_LB_FIELD_ll( YLBTYPE, XSVT(:,:,:,JSV), XLBXSVM(:,:,:,JSV), XLBYSVM(:,:,:,JSV), IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
        END DO
    !!$=======
    !!$!
    !!$XLBXUM(1:NRIMX+JPHEXT,:,:)         = XUT(2:NRIMX+JPHEXT+1,:,:)
    !!$XLBXUM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XUT(IIE+1-NRIMX:IIE+JPHEXT,:,:)
    !!$IF( .NOT. L2D ) THEN
    !!$  XLBYUM(:,1:NRIMY+JPHEXT,:)         = XUT(:,1:NRIMY+JPHEXT,:)
    !!$  XLBYUM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XUT(:,IJE+1-NRIMY:IJE+JPHEXT,:)
    !!$END IF
    !!$!
    !!$!*       5.9.2  V variable
    !!$!
    !!$!
    !!$XLBXVM(1:NRIMX+JPHEXT,:,:)         = XVT(1:NRIMX+JPHEXT,:,:)
    !!$XLBXVM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XVT(IIE+1-NRIMX:IIE+JPHEXT,:,:)
    !!$IF( .NOT. L2D ) THEN
    !!$  XLBYVM(:,1:NRIMY+JPHEXT,:)         = XVT(:,2:NRIMY+JPHEXT+1,:)
    !!$  XLBYVM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XVT(:,IJE+1-NRIMY:IJE+JPHEXT,:)
    !!$END IF
    !!$!
    !!$!*       5.9.3  W variable
    !!$!
    !!$!
    !!$XLBXWM(1:NRIMX+JPHEXT,:,:)         = XWT(1:NRIMX+JPHEXT,:,:)
    !!$XLBXWM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XWT(IIE+1-NRIMX:IIE+JPHEXT,:,:)
    !!$IF( .NOT. L2D ) THEN
    !!$  XLBYWM(:,1:NRIMY+JPHEXT,:)         = XWT(:,1:NRIMY+JPHEXT,:)
    !!$  XLBYWM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XWT(:,IJE+1-NRIMY:IJE+JPHEXT,:)
    !!$END IF
    !!$!
    !!$!*       5.9.4  TH variable
    !!$!
    !!$!
    !!$XLBXTHM(1:NRIMX+JPHEXT,:,:)         = XTHT(1:NRIMX+JPHEXT,:,:)
    !!$XLBXTHM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XTHT(IIE+1-NRIMX:IIE+JPHEXT,:,:)
    !!$IF( .NOT. L2D ) THEN
    !!$  XLBYTHM(:,1:NRIMY+JPHEXT,:)         = XTHT(:,1:NRIMY+JPHEXT,:)
    !!$  XLBYTHM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XTHT(:,IJE+1-NRIMY:IJE+JPHEXT,:)
    !!$END IF
    !!$!
    !!$!*       5.9.5  TKE variable
    !!$!
    !!$!
    !!$IF (HTURB /= 'NONE') THEN
    !!$  XLBXTKEM(1:NRIMX+JPHEXT,:,:)         = XTKET(1:NRIMX+JPHEXT,:,:)
    !!$  XLBXTKEM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XTKET(IIE+1-NRIMX:IIE+JPHEXT,:,:)
    !!$  IF( .NOT. L2D ) THEN
    !!$    XLBYTKEM(:,1:NRIMY+JPHEXT,:)         = XTKET(:,1:NRIMY+JPHEXT,:)
    !!$    XLBYTKEM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XTKET(:,IJE+1-NRIMY:IJE+JPHEXT,:)
    !!$>>>>>>> 1.3.2.4.2.2.2.6.2.3.2.6.2.1
    
    ! <<<<<<< spawn_model2.f90
      CALL MPPDB_CHECKLB(XLBXUM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN",PRECISION,'LBXU',NRIMX)
      CALL MPPDB_CHECKLB(XLBXVM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBXVM",PRECISION,'LBXU',NRIMX)
      CALL MPPDB_CHECKLB(XLBXWM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBXWM",PRECISION,'LBXU',NRIMX)
      CALL MPPDB_CHECKLB(XLBYUM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYUM",PRECISION,'LBYV',NRIMY)
      CALL MPPDB_CHECKLB(XLBYVM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYVM",PRECISION,'LBYV',NRIMY)
      CALL MPPDB_CHECKLB(XLBYWM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYWM",PRECISION,'LBYV',NRIMY)
    !!$=======
    !!$!*       5.9.6  moist variables
    !!$!
    !!$IF (NRR >= 1) THEN
    !!$  DO JRR =1,NRR  
    !!$    XLBXRM(1:NRIMX+JPHEXT,:,:,JRR)         = XRT(1:NRIMX+JPHEXT,:,:,JRR)
    !!$    XLBXRM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:,JRR) = XRT(IIE+1-NRIMX:IIE+JPHEXT,:,:,JRR)
    !!$    IF( .NOT. L2D ) THEN
    !!$      XLBYRM(:,1:NRIMY+JPHEXT,:,JRR)         = XRT(:,1:NRIMY+JPHEXT,:,JRR)
    !!$      XLBYRM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:,JRR) = XRT(:,IJE+1-NRIMY:IJE+JPHEXT,:,JRR)
    !!$    END IF
    !!$  END DO
    !!$END IF
    !!$!
    !!$!*       5.9.7  scalar variables
    !!$!
    !!$IF (NSV /= 0) THEN
    !!$  DO JSV = 1, NSV
    !!$    XLBXSVM(1:NRIMX+JPHEXT,:,:,JSV)         = XSVT(1:NRIMX+JPHEXT,:,:,JSV)
    !!$    XLBXSVM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:,JSV) = XSVT(IIE+1-NRIMX:IIE+JPHEXT,:,:,JSV)
    !!$    IF( .NOT. L2D ) THEN
    !!$      XLBYSVM(:,1:NRIMY+JPHEXT,:,JSV)         = XSVT(:,1:NRIMY+JPHEXT,:,JSV)
    !!$      XLBYSVM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:,JSV) = XSVT(:,IJE+1-NRIMY:IJE+JPHEXT,:,JSV)
    !!$    END IF
    !!$  END DO
    !!$ENDIF
    !!$>>>>>>> 1.3.2.4.2.2.2.6.2.3.2.6.2.1
    
    !
    !*       5.10 Surface precipitation computation
    !
    IF (SIZE(XINPRR) /= 0 ) THEN
      IF (GNOSON) &
        CALL SPAWN_SURF2_RAIN (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,   &
    
                  XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,    &
    
                  XACPRR,XINPRS,XACPRS,XINPRG,XACPRG,&
                  XINPRH,XACPRH )
      IF (.NOT.GNOSON) &
        CALL SPAWN_SURF2_RAIN (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,  &
    
               XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,      &
    
               XACPRR,XINPRS,XACPRS,XINPRG,XACPRG,XINPRH,XACPRH,         &
    
               IIB2,IJB2,IIE2,IJE2,                                      &
               IIB1,IJB1,IIE1,IJE1                                       )
    ENDIF
    !
    !*       5.11   Total mass of dry air Md computation :
    !
    ZTIME1 = ZTIME2
    !
    ALLOCATE(ZRHOD(IIU,IJU,IKU))
    ZRHOD(:,:,:)=XPABST(:,:,:)/(XPABST(:,:,:)/XP00)**(XRD/XCPD) &
                /(XRD*ZTHVT(:,:,:)*(1.+ZSUMRT(:,:,:)))
    
    !$20140709
      CALL MPPDB_CHECK3D(ZRHOD,"SPAWN_MOD2:ZRHOD",PRECISION)
      CALL MPPDB_CHECK3D(XPABST,"SPAWN_MOD2:XPABST",PRECISION)
      CALL MPPDB_CHECK3D(ZSUMRT,"SPAWN_MOD2:ZSUMRT",PRECISION)
    !$20140710 until here all ok after UPHALO(XZZ)
    
    CALL TOTAL_DMASS(ZJ,ZRHOD,XDRYMASST)
    
    !
    DEALLOCATE (ZRHOD)
    DEALLOCATE (ZSUMRT,ZTHVT)
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZMISC = ZMISC + ZTIME2 - ZTIME1
    !
    !*       5.12 Deallocation of model 1 variables : 
    !
    ZTIME1 = ZTIME2
    !
    CALL DEALLOCATE_MODEL1(3)
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZMISC = ZMISC + ZTIME2 - ZTIME1
    !
    !*       5.13 Anelastic correction : 
    !
    CALL SECOND_MNH(ZTIME1)
    !
    IF (.NOT. L1D) THEN
    
      CALL ANEL_BALANCE_n
    
      CALL BOUNDARIES (                                                 &
                0.,CLBCX,CLBCY,NRR,NSV,1,                               &
                XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,   &
                XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,   &
                XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,   &
                XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,   &
    
                XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT            )
    
    END IF
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZANEL = ZTIME2 - ZTIME1
    !
    !
    !
    !-------------------------------------------------------------------------------
    !
    !*	 6.    WRITE THE FMFILE
    !	       ---------------- 
    !
    CALL SECOND_MNH(ZTIME1)
    !
    INPRAR = 22 + 2*(4+NRR+NSV) ! 22 = number of grid variables + reference state
                                ! variables +dimension variables
                                ! 2*(4+NRR+NSV) = number of prognostic variables
                                ! at time t and t-dt
    IF ( ( LEN_TRIM(HSPAFILE) /= 0 ) .AND. ( ADJUSTL(HSPAFILE) /= ADJUSTL(CINIFILE) ) ) THEN
      CMY_NAME(2)=HSPAFILE
    ELSE
      CMY_NAME(2)=ADJUSTL(ADJUSTR(CINIFILE)//'.spa'//ADJUSTL(HSPANBR))
      IF (.NOT.GNOSON)   &
         CMY_NAME(2)=ADJUSTL(ADJUSTR(CINIFILE)//'.spr'//ADJUSTL(HSPANBR))
    END IF
    !
    
    CALL IO_File_add2list(TZFILE,CMY_NAME(2),'MNH','WRITE',KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB)
    
    !
    IF (LBAL_ONLY) THEN  ! same relation with its DAD for model2 and for model1
      NDXRATIO_ALL(2) = NDXRATIO_ALL(1)
      NDYRATIO_ALL(2) = NDYRATIO_ALL(1)
      NXOR_ALL(2)     = NXOR_ALL(1)
      NYOR_ALL(2)     = NYOR_ALL(1)
      NXEND_ALL(2)    = NXEND_ALL(1)
      NYEND_ALL(2)    = NYEND_ALL(1)
      CDAD_NAME(2)    = CDAD_NAME(1)
      IF (CDADSPAFILE == '' ) THEN
        IF (NDXRATIO_ALL(1) == 1 .AND. NDYRATIO_ALL(1) == 1 &
          .AND. NXOR_ALL(1) == 1 .AND. NYOR_ALL(1) == 1 ) THEN
          ! for spawning with ratio=1 
          ! if the DAD of model 1 is itself, the DAD of model 2 also.
          CDAD_NAME(2)=CMY_NAME(2)
        ENDIF
      ENDIF
      ! case of model with DAD
      IF (CDADSPAFILE /='') CDAD_NAME(2)=CDADSPAFILE
    ELSE
      CDAD_NAME(2)=CMY_NAME(1) ! model 1 becomes the DAD of model 2 (spawned one)
    ENDIF
    !
    
    CALL IO_Header_write(TZFILE,HDAD_NAME=CDAD_NAME(2))
    
    CALL WRITE_LFIFM_n(TZFILE,CDAD_NAME(2))
    
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZWRITE = ZTIME2 - ZTIME1
    !
    !-------------------------------------------------------------------------------
    !
    !*       7.      Surface variables :
    !
    ZTIME1 = ZTIME2
    !
    
    CALL SPAWN_SURF(HINIFILE,HINIFILEPGD,TZFILE,OSPAWN_SURF)
    
    !
    CALL SECOND_MNH(ZTIME2)
    !
    ZSURF2 = ZTIME2 - ZTIME1
    !
    !-------------------------------------------------------------------------------
    !
    !*	 8.    CLOSES THE FMFILE
    !	       ----------------- 
    !
    
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !*       9.    PRINTS ON OUTPUT-LISTING
    !              ------------------------
    !
    WRITE(ILUOUT,FMT=9900) XZHAT(1)
    !
    DO JLOOP = 2,IKU
     WRITE(ILUOUT,FMT=9901) JLOOP,XZHAT(JLOOP),XZHAT(JLOOP)-XZHAT(JLOOP-1)
    END DO
    !
    IF (NVERB >= 5) THEN
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERV,LUSERC=',LUSERV,LUSERC 
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERR,LUSERI,LUSERS=',LUSERR,LUSERI,LUSERS
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERG,LUSERH,NSV=',LUSERG,LUSERH,NSV
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: NRR=',NRR
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: NVERB=',NVERB
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: XLON0,XLAT0,XBETA=',XLON0,XLAT0,XBETA
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: LCARTESIAN=',LCARTESIAN
      IF(LCARTESIAN) THEN
        WRITE(ILUOUT,*) 'SPAWN_MODEL2: No map projection used.'
      ELSE
        WRITE(ILUOUT,*) 'SPAWN_MODEL2: XRPK,XLONORI,XLATORI=',XRPK,XLONORI,XLATORI
        IF (ABS(XRPK) == 1.) THEN
          WRITE(ILUOUT,*) 'SPAWN_MODEL2: Polar stereo used.'
        ELSE IF (XRPK == 0.) THEN
          WRITE(ILUOUT,*) 'SPAWN_MODEL2: Mercator used.'
        ELSE
          WRITE(ILUOUT,*) 'SPAWN_MODEL2: Lambert used, cone factor=',XRPK 
        END IF
      END IF
    END IF
    !
    IF (NVERB >= 10) THEN
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: IIB, IJB, IKB=',IIB,IJB,IKB
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: IIU, IJU, IKU=',IIU,IJU,IKU
    END IF
    !
    IF(NVERB >= 10) THEN                               !Value control
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XZS values:'
      WRITE(ILUOUT,*) XZS(1,IJU),XZS((IIU-1)/2,IJU),XZS(IIU,IJU)  
      WRITE(ILUOUT,*) XZS(1,(IJU-1)/2),XZS((IIU-1)/2,(IJU-1)/2),XZS(IIU,(IJU-1)/2)  
      WRITE(ILUOUT,*) XZS(1,1)      ,XZS((IIU-1)/2,1)      ,XZS(IIU,1)  
    END IF
    !
    IF(NVERB >= 10) THEN       !Value control
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XUT values:'
      WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
                       &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
      DO JKLOOP=1,IKU
        WRITE(ILUOUT,*) 'JK = ',JKLOOP
        WRITE(ILUOUT,*) XUT(1,IJU/2,JKLOOP),XUT(IIU/2,1,JKLOOP),       &
                        XUT(IIU/2,IJU/2,JKLOOP),XUT(IIU/2,IJU,JKLOOP), &
                        XUT(IIU,IJU/2,JKLOOP)
      END DO
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XVT values:'
      WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
                       &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
      DO JKLOOP=1,IKU
        WRITE(ILUOUT,*) 'JK = ',JKLOOP
        WRITE(ILUOUT,*) XVT(1,IJU/2,JKLOOP),XVT(IIU/2,1,JKLOOP),       &
                        XVT(IIU/2,IJU/2,JKLOOP),XVT(IIU/2,IJU,JKLOOP), &
                        XVT(IIU,IJU/2,JKLOOP)
      END DO
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XWT values:'
      WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
                       &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
      DO JKLOOP=1,IKU
        WRITE(ILUOUT,*) 'JK = ',JKLOOP
        WRITE(ILUOUT,*) XWT(1,IJU/2,JKLOOP),XWT(IIU/2,1,JKLOOP),       &
                        XWT(IIU/2,IJU/2,JKLOOP),XWT(IIU/2,IJU,JKLOOP), &
                        XWT(IIU,IJU/2,JKLOOP)
      END DO
      WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XTHT values:'
      WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
                       &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
      DO JKLOOP=1,IKU
        WRITE(ILUOUT,*) 'JK = ',JKLOOP
        WRITE(ILUOUT,*) XTHT(1,IJU/2,JKLOOP),XTHT(IIU/2,1,JKLOOP),       &
                        XTHT(IIU/2,IJU/2,JKLOOP),XTHT(IIU/2,IJU,JKLOOP), &
                        XTHT(IIU,IJU/2,JKLOOP)
      END DO
      IF(NRR >= 1) THEN
        WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XRT values:'
        WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
                         &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
        DO JKLOOP=1,IKU
          WRITE(ILUOUT,*) 'JK = ',JKLOOP
          WRITE(ILUOUT,*) XRT(1,IJU/2,JKLOOP,1),XRT(IIU/2,1,JKLOOP,1),       &
                          XRT(IIU/2,IJU/2,JKLOOP,1),XRT(IIU/2,IJU,JKLOOP,1), &
                          XRT(IIU,IJU/2,JKLOOP,1)
        END DO
      END IF
      !
      IF (LUV_FLX) THEN
        WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XVU_FLUX(IIU/2,2,:)=',XVU_FLUX_M(IIU/2,2,:)
      END IF
      !
      IF (LTH_FLX) THEN
        WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XVTH_FLUX(IIU/2,2,:)=',XVTH_FLUX_M(IIU/2,2,:)
        WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XWTH_FLUX(IIU/2,2,:)=',XWTH_FLUX_M(IIU/2,2,:)
      END IF
      !
    END IF
    !
    WRITE(ILUOUT,*) 'SPAWN_MODEL2: SPAWN_MODEL2 ENDS CORRECTLY.'
    !
    CALL SECOND_MNH (ZEND)
    !
    ZTOT        = ZEND - ZSTART          ! for computing time analysis
    !
    ZALL = ZGRID2 + ZSURF2 + ZMISC + ZFIELD2 + ZVER + ZPRESSURE2 + ZANEL + ZWRITE
    !
    ZPERCALL  = 100.*ZALL/ZTOT
    !
    ZPERCGRID2  = 100.*ZGRID2/ZTOT
    ZPERCSURF2  = 100.*ZSURF2/ZTOT
    ZPERCMISC   = 100.*ZMISC/ZTOT
    ZPERCFIELD2 = 100.*ZFIELD2/ZTOT
    ZPERCVER    = 100.*ZVER/ZTOT
    ZPERCPRESSURE2 = 100.*ZPRESSURE2/ZTOT
    ZPERCANEL   = 100.*ZANEL/ZTOT
    ZPERCWRITE  = 100.*ZWRITE/ZTOT
    !
    WRITE(ILUOUT,*)
    WRITE(ILUOUT,*) ' ------------------------------------------------------------ '
    WRITE(ILUOUT,*) '|                                                            |'
    WRITE(ILUOUT,*) '|           COMPUTING TIME ANALYSIS in SPAWN_MODEL2          |'
    WRITE(ILUOUT,*) '|                                                            |'
    WRITE(ILUOUT,*) '|------------------------------------------------------------|'
    WRITE(ILUOUT,*) '|                     |                   |                  |'
    WRITE(ILUOUT,*) '|    ROUTINE NAME     |     CPU-TIME      |   PERCENTAGE %   |'
    WRITE(ILUOUT,*) '|                     |                   |                  |'
    WRITE(ILUOUT,*) '|---------------------|-------------------|------------------|'
    WRITE(ILUOUT,*) '|                     |                   |                  |'
    WRITE(UNIT=ILUOUT,FMT=1) ZGRID2 ,ZPERCGRID2
    WRITE(UNIT=ILUOUT,FMT=3) ZFIELD2,ZPERCFIELD2
    WRITE(UNIT=ILUOUT,FMT=8) ZVER,ZPERCVER
    WRITE(UNIT=ILUOUT,FMT=7) ZPRESSURE2,ZPERCPRESSURE2
    WRITE(UNIT=ILUOUT,FMT=2) ZSURF2 ,ZPERCSURF2
    WRITE(UNIT=ILUOUT,FMT=4) ZANEL  ,ZPERCANEL
    WRITE(UNIT=ILUOUT,FMT=5) ZWRITE ,ZPERCWRITE
    WRITE(UNIT=ILUOUT,FMT=9) ZMISC  ,ZPERCMISC
    WRITE(UNIT=ILUOUT,FMT=6) ZTOT   ,ZPERCALL
    WRITE(ILUOUT,*) ' ------------------------------------------------------------ '
    !
    !                  FORMATS
    !                  -------
    !
    1  FORMAT(' |    SPAWN_GRID2      |     ',F8.3,'      |     ',F8.3,'     |')
    3  FORMAT(' |    SPAWN_FIELD2     |     ',F8.3,'      |     ',F8.3,'     |')
    8  FORMAT(' |  VER_INTERP_FIELD   |     ',F8.3,'      |     ',F8.3,'     |')
    7  FORMAT(' |  SPAWN_PRESSURE2    |     ',F8.3,'      |     ',F8.3,'     |')
    2  FORMAT(' |    SPAWN_SURF2      |     ',F8.3,'      |     ',F8.3,'     |')
    4  FORMAT(' |   ANEL_BALANCE2     |     ',F8.3,'      |     ',F8.3,'     |')
    5  FORMAT(' |      WRITE          |     ',F8.3,'      |     ',F8.3,'     |')
    9  FORMAT(' |   MISCELLANEOUS     |     ',F8.3,'      |     ',F8.3,'     |')
    6  FORMAT(' |    SPAWN_MODEL2     |     ',F8.3,'      |     ',F8.3,'     |')
    !
    !
    
    !
    9900  FORMAT(' K = 001    ZHAT = ',E14.7)
    9901  FORMAT(' K = ',I3.3,'    ZHAT = ',E14.7,'    DZ = ' ,E14.7)
    !
    !-------------------------------------------------------------------------------
    !
    !
    ! Switch back to model index of calling routine
    CALL GOTO_MODEL(IMI)
    !
    END SUBROUTINE SPAWN_MODEL2