Skip to content
Snippets Groups Projects
ini_modeln.f90 86.9 KiB
Newer Older
  • Learn to ignore specific revisions
  •   NSIZELBYV_ll=0
      NSIZELBXTKE_ll=0
      NSIZELBXR_ll=0
      NSIZELBXSV_ll=0
      NSIZELBYTKE_ll=0
      NSIZELBYR_ll=0
      NSIZELBYSV_ll=0
      ALLOCATE(XLBXUM(0,0,0))
      ALLOCATE(XLBYUM(0,0,0))
      ALLOCATE(XLBXVM(0,0,0))
      ALLOCATE(XLBYVM(0,0,0))
      ALLOCATE(XLBXWM(0,0,0))
      ALLOCATE(XLBYWM(0,0,0))
      ALLOCATE(XLBXTHM(0,0,0))
      ALLOCATE(XLBYTHM(0,0,0))
      ALLOCATE(XLBXTKEM(0,0,0))
      ALLOCATE(XLBYTKEM(0,0,0))
      ALLOCATE(XLBXRM(0,0,0,0))
      ALLOCATE(XLBYRM(0,0,0,0))
      ALLOCATE(XLBXSVM(0,0,0,0))
      ALLOCATE(XLBYSVM(0,0,0,0))
    !
    ELSEIF( L2D ) THEN                         ! 2D case
    !
      NSIZELBY_ll=0
      NSIZELBYV_ll=0
      NSIZELBYTKE_ll=0
      NSIZELBYR_ll=0
      NSIZELBYSV_ll=0
      ALLOCATE(XLBYUM(0,0,0))
      ALLOCATE(XLBYVM(0,0,0))
      ALLOCATE(XLBYWM(0,0,0))
      ALLOCATE(XLBYTHM(0,0,0))
      ALLOCATE(XLBYTKEM(0,0,0))
      ALLOCATE(XLBYRM(0,0,0,0))
      ALLOCATE(XLBYSVM(0,0,0,0))
    !
    
      CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,  &
           IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
    
           IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
    !
      IF ( LHORELAX_UVWTH ) THEN
    
        NSIZELBX_ll=2*NRIMX+2*JPHEXT
        NSIZELBXU_ll=2*NRIMX+2*JPHEXT
    
        ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,IKU))
        ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,IKU))
        ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,IKU))
        ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,IKU))
      ELSE
    
        NSIZELBX_ll=2*JPHEXT      ! 2
        NSIZELBXU_ll=2*(JPHEXT+1) ! 4
    
        ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,IKU))
        ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,IKU))
        ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,IKU))
        ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,IKU))
      END IF
    !
      IF (CTURB /= 'NONE') THEN
        IF ( LHORELAX_TKE) THEN
    
          NSIZELBXTKE_ll=2* NRIMX+2*JPHEXT
    
          ALLOCATE(XLBXTKEM(IISIZEXF,IJSIZEXF,IKU))
        ELSE
    
          NSIZELBXTKE_ll=2*JPHEXT  ! 2
    
          ALLOCATE(XLBXTKEM(IISIZEX2,IJSIZEX2,IKU))
        END IF
      ELSE
        NSIZELBXTKE_ll=0
        ALLOCATE(XLBXTKEM(0,0,0))
      END IF
      !
      IF ( NRR > 0 ) THEN
        IF (LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI    &
             .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH               &
           ) THEN
    
          NSIZELBXR_ll=2* NRIMX+2*JPHEXT
    
          ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,IKU,NRR))
        ELSE
    
          NSIZELBXR_ll=2*JPHEXT  ! 2
    
          ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,IKU,NRR))
        ENDIF
      ELSE
        NSIZELBXR_ll=0
        ALLOCATE(XLBXRM(0,0,0,0))
      END IF
      !
      IF ( NSV > 0 ) THEN
        IF ( ANY( LHORELAX_SV(:)) ) THEN
    
          NSIZELBXSV_ll=2* NRIMX+2*JPHEXT
    
          ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,IKU,NSV))
        ELSE
    
          NSIZELBXSV_ll=2*JPHEXT  ! 2
    
          ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,IKU,NSV))
        END IF
      ELSE
        NSIZELBXSV_ll=0
        ALLOCATE(XLBXSVM(0,0,0,0))
      END IF
    !
    ELSE                                   ! 3D case
    !
    !
    
      CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,               &
                        IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
                        IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
      CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY,               &
                        IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, &
                        IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2)
    
    !
    ! check if local domain not to small for NRIMX NRIMY
    !
      IF ( CLBCX(1) /= 'CYCL' )  THEN
    
            WRITE(*,'(A,I8,A/A,2I8,/A)') "Processor=", IP-1, &
    
                 " :: INI_MODEL_n ERROR:  ( NRIMX  > IDIMX )  ", &
                 " Local domain to small for relaxation NRIMX,IDIMX ", &
                 NRIMX,IDIMX ,&
    
                 " change relaxation parameters or number of processors "
            !callabortstop
            CALL ABORT
    
         END IF
      END IF
      IF ( CLBCY(1) /= 'CYCL' ) THEN
    
            WRITE(*,'(A,I8,A/A,2I8,/A)') "Processor=", IP-1, &
    
                 " :: INI_MODEL_n ERROR:  ( NRIMY > IDIMY )  ", &
                 " Local domain to small for relaxation NRIMY,IDIMY ", &
                 NRIMY,IDIMY ,&
    
                 " change relaxation parameters or number of processors "
            !callabortstop
            CALL ABORT
    
         END IF
      END IF
    IF ( LHORELAX_UVWTH ) THEN
    
        NSIZELBX_ll=2*NRIMX+2*JPHEXT
        NSIZELBXU_ll=2*NRIMX+2*JPHEXT
        NSIZELBY_ll=2*NRIMY+2*JPHEXT
        NSIZELBYV_ll=2*NRIMY+2*JPHEXT
    
        ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,IKU))
        ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,IKU))
        ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,IKU))
        ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,IKU))
        ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,IKU))
        ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,IKU))
        ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,IKU))
        ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,IKU))
      ELSE
    
        NSIZELBX_ll=2*JPHEXT  ! 2
        NSIZELBXU_ll=2*(JPHEXT+1) ! 4
        NSIZELBY_ll=2*JPHEXT  ! 2
        NSIZELBYV_ll=2*(JPHEXT+1) ! 4
    
        ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,IKU))
        ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,IKU))
        ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,IKU))
        ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,IKU))
        ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,IKU))
        ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,IKU))
        ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,IKU))
        ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,IKU))
      END IF
      !
      IF (CTURB /= 'NONE') THEN
        IF ( LHORELAX_TKE) THEN
    
          NSIZELBXTKE_ll=2*NRIMX+2*JPHEXT
          NSIZELBYTKE_ll=2*NRIMY+2*JPHEXT
    
          ALLOCATE(XLBXTKEM(IISIZEXF,IJSIZEXF,IKU))
          ALLOCATE(XLBYTKEM(IISIZEYF,IJSIZEYF,IKU))
        ELSE
    
          NSIZELBXTKE_ll=2*JPHEXT  ! 2
          NSIZELBYTKE_ll=2*JPHEXT  ! 2
    
          ALLOCATE(XLBXTKEM(IISIZEX2,IJSIZEX2,IKU))
          ALLOCATE(XLBYTKEM(IISIZEY2,IJSIZEY2,IKU))
        END IF
      ELSE
        NSIZELBXTKE_ll=0
        NSIZELBYTKE_ll=0
        ALLOCATE(XLBXTKEM(0,0,0))
        ALLOCATE(XLBYTKEM(0,0,0))
      END IF
      !
      IF ( NRR > 0 ) THEN
        IF (LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI    &
              .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH              &
           ) THEN
    
          NSIZELBXR_ll=2*NRIMX+2*JPHEXT
          NSIZELBYR_ll=2*NRIMY+2*JPHEXT
    
          ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,IKU,NRR))
          ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,IKU,NRR))
        ELSE
    
          NSIZELBXR_ll=2*JPHEXT  ! 2
          NSIZELBYR_ll=2*JPHEXT  ! 2
    
          ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,IKU,NRR))
          ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,IKU,NRR))
        ENDIF
      ELSE
        NSIZELBXR_ll=0
        NSIZELBYR_ll=0
        ALLOCATE(XLBXRM(0,0,0,0))
        ALLOCATE(XLBYRM(0,0,0,0))
      END IF
      !
      IF ( NSV > 0 ) THEN
        IF ( ANY( LHORELAX_SV(:)) ) THEN
    
          NSIZELBXSV_ll=2*NRIMX+2*JPHEXT
          NSIZELBYSV_ll=2*NRIMY+2*JPHEXT
    
          ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,IKU,NSV))
          ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,IKU,NSV))
        ELSE
    
          NSIZELBXSV_ll=2*JPHEXT  ! 2
          NSIZELBYSV_ll=2*JPHEXT  ! 2
    
          ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,IKU,NSV))
          ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,IKU,NSV))
        END IF
      ELSE
        NSIZELBXSV_ll=0
        NSIZELBYSV_ll=0
        ALLOCATE(XLBXSVM(0,0,0,0))
        ALLOCATE(XLBYSVM(0,0,0,0))
      END IF
    END IF      ! END OF THE IF STRUCTURE ON THE MODEL DIMENSION
    !
    !
    IF ( KMI > 1 ) THEN 
      ! it has been assumed that the THeta field used the largest rim area compared
      ! to the others prognostic variables, if it is not the case, you must change
      ! these lines
      ALLOCATE(XCOEFLIN_LBXM(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3)))
      ALLOCATE(   NKLIN_LBXM(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3)))
      ALLOCATE(XCOEFLIN_LBYM(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3)))
      ALLOCATE(   NKLIN_LBYM(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3)))
      ALLOCATE(XCOEFLIN_LBXU(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3)))
      ALLOCATE(   NKLIN_LBXU(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3)))
      ALLOCATE(XCOEFLIN_LBYU(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3)))
      ALLOCATE(   NKLIN_LBYU(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3)))
      ALLOCATE(XCOEFLIN_LBXV(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3)))
      ALLOCATE(   NKLIN_LBXV(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3)))
      ALLOCATE(XCOEFLIN_LBYV(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3)))
      ALLOCATE(   NKLIN_LBYV(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3)))
      ALLOCATE(XCOEFLIN_LBXW(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3)))
      ALLOCATE(   NKLIN_LBXW(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3)))
      ALLOCATE(XCOEFLIN_LBYW(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3)))
      ALLOCATE(   NKLIN_LBYW(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3)))
    
    ELSE
      ALLOCATE(XCOEFLIN_LBXM(0,0,0))
      ALLOCATE(   NKLIN_LBXM(0,0,0))
      ALLOCATE(XCOEFLIN_LBYM(0,0,0))
      ALLOCATE(   NKLIN_LBYM(0,0,0))
      ALLOCATE(XCOEFLIN_LBXU(0,0,0))
      ALLOCATE(   NKLIN_LBXU(0,0,0))
      ALLOCATE(XCOEFLIN_LBYU(0,0,0))
      ALLOCATE(   NKLIN_LBYU(0,0,0))
      ALLOCATE(XCOEFLIN_LBXV(0,0,0))
      ALLOCATE(   NKLIN_LBXV(0,0,0))
      ALLOCATE(XCOEFLIN_LBYV(0,0,0))
      ALLOCATE(   NKLIN_LBYV(0,0,0))
      ALLOCATE(XCOEFLIN_LBXW(0,0,0))
      ALLOCATE(   NKLIN_LBXW(0,0,0))
      ALLOCATE(XCOEFLIN_LBYW(0,0,0))
      ALLOCATE(   NKLIN_LBYW(0,0,0))
    
    END IF
    !
    !  allocation of the LS fields for vertical relaxation and numerical diffusion
    IF( .NOT. LSTEADYLS )  THEN
    !
      ALLOCATE(XLSUS(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3)))
      ALLOCATE(XLSVS(SIZE(XLSVM,1),SIZE(XLSVM,2),SIZE(XLSVM,3)))
      ALLOCATE(XLSWS(SIZE(XLSWM,1),SIZE(XLSWM,2),SIZE(XLSWM,3)))
      ALLOCATE(XLSTHS(SIZE(XLSTHM,1),SIZE(XLSTHM,2),SIZE(XLSTHM,3)))
      ALLOCATE(XLSRVS(SIZE(XLSRVM,1),SIZE(XLSRVM,2),SIZE(XLSRVM,3)))
    
      ALLOCATE(XLSZWSS(SIZE(XLSZWSM,1),SIZE(XLSZWSM,2)))
    
    !
    ELSE
    !
      ALLOCATE(XLSUS(0,0,0))
      ALLOCATE(XLSVS(0,0,0))
      ALLOCATE(XLSWS(0,0,0))
      ALLOCATE(XLSTHS(0,0,0))
      ALLOCATE(XLSRVS(0,0,0))
    
    !
    END IF
    !  allocation of the LB fields for horizontal relaxation and Lateral Boundaries
    IF( .NOT. ( LSTEADYLS .AND. KMI==1 ) )  THEN
    !
      ALLOCATE(XLBXTKES(SIZE(XLBXTKEM,1),SIZE(XLBXTKEM,2),SIZE(XLBXTKEM,3)))
      ALLOCATE(XLBYTKES(SIZE(XLBYTKEM,1),SIZE(XLBYTKEM,2),SIZE(XLBYTKEM,3)))
      ALLOCATE(XLBXUS(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3)))
      ALLOCATE(XLBYUS(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3)))
      ALLOCATE(XLBXVS(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3)))
      ALLOCATE(XLBYVS(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3)))
      ALLOCATE(XLBXWS(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3)))
      ALLOCATE(XLBYWS(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3)))
      ALLOCATE(XLBXTHS(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3)))
      ALLOCATE(XLBYTHS(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3)))
      ALLOCATE(XLBXRS(SIZE(XLBXRM,1),SIZE(XLBXRM,2),SIZE(XLBXRM,3),SIZE(XLBXRM,4)))
      ALLOCATE(XLBYRS(SIZE(XLBYRM,1),SIZE(XLBYRM,2),SIZE(XLBYRM,3),SIZE(XLBYRM,4)))
      ALLOCATE(XLBXSVS(SIZE(XLBXSVM,1),SIZE(XLBXSVM,2),SIZE(XLBXSVM,3),SIZE(XLBXSVM,4)))
      ALLOCATE(XLBYSVS(SIZE(XLBYSVM,1),SIZE(XLBYSVM,2),SIZE(XLBYSVM,3),SIZE(XLBYSVM,4)))
    !
    ELSE
    !
      ALLOCATE(XLBXTKES(0,0,0))
      ALLOCATE(XLBYTKES(0,0,0))
      ALLOCATE(XLBXUS(0,0,0))
      ALLOCATE(XLBYUS(0,0,0))
      ALLOCATE(XLBXVS(0,0,0))
      ALLOCATE(XLBYVS(0,0,0))
      ALLOCATE(XLBXWS(0,0,0))
      ALLOCATE(XLBYWS(0,0,0))
      ALLOCATE(XLBXTHS(0,0,0))
      ALLOCATE(XLBYTHS(0,0,0))
      ALLOCATE(XLBXRS(0,0,0,0))
      ALLOCATE(XLBYRS(0,0,0,0))
      ALLOCATE(XLBXSVS(0,0,0,0))
      ALLOCATE(XLBYSVS(0,0,0,0))
    !
    END IF
    !
    !
    
    !*       3.7   Module MODD_RADIATIONS_n (except XOZON and XAER)
    
    ! Initialization of SW bands
    NSWB_OLD = 6 ! Number of bands in ECMWF original scheme (from Fouquart et Bonnel (1980))
                 ! then modified through INI_RADIATIONS_ECMWF but remains equal to 6 practically
    IF (CRAD == 'ECRA') THEN
    
    END IF
    
    NLWB_MNH = 16 ! For XEMIS initialization (should be spectral in the future)
    
    
    ALLOCATE(XSW_BANDS (NSWB_MNH)) 
    ALLOCATE(XLW_BANDS (NLWB_MNH)) 
    
    ALLOCATE(XZENITH   (IIU,IJU))
    ALLOCATE(XAZIM     (IIU,IJU))
    ALLOCATE(XALBUV    (IIU,IJU))
    
    XALBUV(:,:) = NALBUV_DEFAULT !Set to an arbitrary low value (XALBUV is needed in CH_INTERP_JVALUES even if no radiation)
    
    ALLOCATE(XDIRSRFSWD(IIU,IJU,NSWB_MNH))
    ALLOCATE(XSCAFLASWD(IIU,IJU,NSWB_MNH))
    ALLOCATE(XFLALWD   (IIU,IJU))
    !
    IF (CRAD /= 'NONE') THEN
      ALLOCATE(XSLOPANG(IIU,IJU))
      ALLOCATE(XSLOPAZI(IIU,IJU))
      ALLOCATE(XDTHRAD(IIU,IJU,IKU))
      ALLOCATE(XDIRFLASWD(IIU,IJU,NSWB_MNH))
      ALLOCATE(XDIR_ALB(IIU,IJU,NSWB_MNH))
      ALLOCATE(XSCA_ALB(IIU,IJU,NSWB_MNH))
    
      ALLOCATE(XTSRAD (IIU,IJU))    ; XTSRAD = 0.0
      ALLOCATE(XSEA (IIU,IJU))
      ALLOCATE(XZS_XY (IIU,IJU))
      ALLOCATE(NCLEARCOL_TM1(IIU,IJU))
      ALLOCATE(XSWU(IIU,IJU,IKU))
      ALLOCATE(XSWD(IIU,IJU,IKU))
      ALLOCATE(XLWU(IIU,IJU,IKU))
      ALLOCATE(XLWD(IIU,IJU,IKU))
      ALLOCATE(XDTHRADSW(IIU,IJU,IKU))
      ALLOCATE(XDTHRADLW(IIU,IJU,IKU))
      ALLOCATE(XRADEFF(IIU,IJU,IKU))
    ELSE
      ALLOCATE(XSLOPANG(0,0))
      ALLOCATE(XSLOPAZI(0,0))
      ALLOCATE(XDTHRAD(0,0,0))
      ALLOCATE(XDIRFLASWD(0,0,0))
      ALLOCATE(XDIR_ALB(0,0,0))
      ALLOCATE(XSCA_ALB(0,0,0))
    
      ALLOCATE(XTSRAD (0,0))
      ALLOCATE(XSEA (0,0))
      ALLOCATE(XZS_XY (0,0))
      ALLOCATE(NCLEARCOL_TM1(0,0))
      ALLOCATE(XSWU(0,0,0))
      ALLOCATE(XSWD(0,0,0))
      ALLOCATE(XLWU(0,0,0))
      ALLOCATE(XLWD(0,0,0))
      ALLOCATE(XDTHRADSW(0,0,0))
      ALLOCATE(XDTHRADLW(0,0,0))
      ALLOCATE(XRADEFF(0,0,0))
    END IF
    
    
    IF (CRAD == 'ECMW' .OR. CRAD == 'ECRA') THEN
    
      ALLOCATE(XSTROATM(31,6))
      ALLOCATE(XSMLSATM(31,6))
      ALLOCATE(XSMLWATM(31,6))
      ALLOCATE(XSPOSATM(31,6))
      ALLOCATE(XSPOWATM(31,6))
      ALLOCATE(XSTATM(31,6))
    ELSE
      ALLOCATE(XSTROATM(0,0))
      ALLOCATE(XSMLSATM(0,0))
      ALLOCATE(XSMLWATM(0,0))
      ALLOCATE(XSPOSATM(0,0))
      ALLOCATE(XSPOWATM(0,0))
      ALLOCATE(XSTATM(0,0))
    END IF
    !
    
    !*       3.8   Module MODD_DEEP_CONVECTION_n
    
    !
    IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
      ALLOCATE(NCOUNTCONV(IIU,IJU))
      ALLOCATE(XDTHCONV(IIU,IJU,IKU))
      ALLOCATE(XDRVCONV(IIU,IJU,IKU))
      ALLOCATE(XDRCCONV(IIU,IJU,IKU))
      ALLOCATE(XDRICONV(IIU,IJU,IKU))
      ALLOCATE(XPRCONV(IIU,IJU))
      ALLOCATE(XPACCONV(IIU,IJU))
      ALLOCATE(XPRSCONV(IIU,IJU))
      ! diagnostics
      IF (LCH_CONV_LINOX) THEN
        ALLOCATE(XIC_RATE(IIU,IJU))
        ALLOCATE(XCG_RATE(IIU,IJU))
        ALLOCATE(XIC_TOTAL_NUMBER(IIU,IJU))
        ALLOCATE(XCG_TOTAL_NUMBER(IIU,IJU))
      ELSE
        ALLOCATE(XIC_RATE(0,0))
        ALLOCATE(XCG_RATE(0,0))
        ALLOCATE(XIC_TOTAL_NUMBER(0,0))
        ALLOCATE(XCG_TOTAL_NUMBER(0,0))
      END IF
      IF ( LDIAGCONV )  THEN
        ALLOCATE(XUMFCONV(IIU,IJU,IKU))
        ALLOCATE(XDMFCONV(IIU,IJU,IKU))
        ALLOCATE(XPRLFLXCONV(IIU,IJU,IKU))
        ALLOCATE(XPRSFLXCONV(IIU,IJU,IKU))
        ALLOCATE(XCAPE(IIU,IJU))
        ALLOCATE(NCLTOPCONV(IIU,IJU))
        ALLOCATE(NCLBASCONV(IIU,IJU))
      ELSE
        ALLOCATE(XUMFCONV(0,0,0))
        ALLOCATE(XDMFCONV(0,0,0))
        ALLOCATE(XPRLFLXCONV(0,0,0))
        ALLOCATE(XPRSFLXCONV(0,0,0))
        ALLOCATE(XCAPE(0,0))
        ALLOCATE(NCLTOPCONV(0,0))
        ALLOCATE(NCLBASCONV(0,0))
      END IF
    ELSE
    
      ALLOCATE(NCOUNTCONV(0,0))
      ALLOCATE(XDTHCONV(0,0,0))
      ALLOCATE(XDRVCONV(0,0,0))
      ALLOCATE(XDRCCONV(0,0,0))
      ALLOCATE(XDRICONV(0,0,0))
    
      ALLOCATE(XPRCONV(0,0))
      ALLOCATE(XPACCONV(0,0))
      ALLOCATE(XPRSCONV(0,0))
    
      ALLOCATE(XIC_RATE(0,0))
      ALLOCATE(XCG_RATE(0,0))
      ALLOCATE(XIC_TOTAL_NUMBER(0,0))
      ALLOCATE(XCG_TOTAL_NUMBER(0,0))
      ALLOCATE(XUMFCONV(0,0,0))
      ALLOCATE(XDMFCONV(0,0,0))
      ALLOCATE(XPRLFLXCONV(0,0,0))
      ALLOCATE(XPRSFLXCONV(0,0,0))
      ALLOCATE(XCAPE(0,0))
      ALLOCATE(NCLTOPCONV(0,0))
      ALLOCATE(NCLBASCONV(0,0))
    
    END IF
    !
    IF ((CDCONV == 'KAFR' .OR. CSCONV == 'KAFR') &
        .AND. LSUBG_COND .AND. LSIG_CONV) THEN
      ALLOCATE(XMFCONV(IIU,IJU,IKU))
    ELSE
      ALLOCATE(XMFCONV(0,0,0))
    ENDIF
    !
    IF ((CDCONV == 'KAFR' .OR. CSCONV == 'KAFR') &
        .AND. LCHTRANS .AND. NSV > 0 ) THEN
      ALLOCATE(XDSVCONV(IIU,IJU,IKU,NSV))
    ELSE
      ALLOCATE(XDSVCONV(0,0,0,0))
    END IF
    !
    ALLOCATE(XCF_MF(IIU,IJU,IKU)) ; XCF_MF=0.0
    ALLOCATE(XRC_MF(IIU,IJU,IKU)) ; XRC_MF=0.0
    ALLOCATE(XRI_MF(IIU,IJU,IKU)) ; XRI_MF=0.0
    !
    
    !*       3.9   Local variables
    
    !
    ALLOCATE(ZJ(IIU,IJU,IKU))
    !
    
    !*      3.10 Forcing variables (Module MODD_FRC)
    
    !
    IF (KMI == 1) THEN
      IF ( LFORCING ) THEN
        ALLOCATE(TDTFRC(NFRC))
        ALLOCATE(XUFRC(IKU,NFRC))
        ALLOCATE(XVFRC(IKU,NFRC))
        ALLOCATE(XWFRC(IKU,NFRC))
        ALLOCATE(XTHFRC(IKU,NFRC))
        ALLOCATE(XRVFRC(IKU,NFRC))
        ALLOCATE(XTENDTHFRC(IKU,NFRC))
        ALLOCATE(XTENDRVFRC(IKU,NFRC))
        ALLOCATE(XGXTHFRC(IKU,NFRC))
        ALLOCATE(XGYTHFRC(IKU,NFRC))
        ALLOCATE(XPGROUNDFRC(NFRC))
    
        ALLOCATE(XTENDUFRC(IKU,NFRC))
    
      ELSE
        ALLOCATE(TDTFRC(0))
        ALLOCATE(XUFRC(0,0))
        ALLOCATE(XVFRC(0,0))
        ALLOCATE(XWFRC(0,0))
        ALLOCATE(XTHFRC(0,0))
        ALLOCATE(XRVFRC(0,0))
        ALLOCATE(XTENDTHFRC(0,0))
        ALLOCATE(XTENDRVFRC(0,0))
        ALLOCATE(XGXTHFRC(0,0))
        ALLOCATE(XGYTHFRC(0,0))
        ALLOCATE(XPGROUNDFRC(0))
    
        ALLOCATE(XTENDUFRC(0,0))
        ALLOCATE(XTENDVFRC(0,0))
    
      END IF
      IF ( LFORCING ) THEN
        ALLOCATE(XWTFRC(IIU,IJU,IKU))
        ALLOCATE(XUFRC_PAST(IIU,IJU,IKU)) ; XUFRC_PAST = XUNDEF
        ALLOCATE(XVFRC_PAST(IIU,IJU,IKU)) ; XVFRC_PAST = XUNDEF
      ELSE
        ALLOCATE(XWTFRC(0,0,0))
        ALLOCATE(XUFRC_PAST(0,0,0))
        ALLOCATE(XVFRC_PAST(0,0,0))
      END IF
    
      !Do not allocate because they are the same on all grids (not 'n' variables)
    
    END IF
    ! ----------------------------------------------------------------------
    !
    IF (L2D_ADV_FRC) THEN
      WRITE(ILUOUT,*) 'L2D_ADV_FRC IS SET TO', L2D_ADV_FRC
      WRITE(ILUOUT,*) 'ADV FRC WILL BE SET'
      ALLOCATE(TDTADVFRC(NADVFRC))
      ALLOCATE(XDTHFRC(IIU,IJU,IKU,NADVFRC))  ; XDTHFRC=0.
      ALLOCATE(XDRVFRC(IIU,IJU,IKU,NADVFRC))  ; XDRVFRC=0.
    ELSE
      ALLOCATE(TDTADVFRC(0))
      ALLOCATE(XDTHFRC(0,0,0,0))
      ALLOCATE(XDRVFRC(0,0,0,0))
    ENDIF
    
    IF (L2D_REL_FRC) THEN
      WRITE(ILUOUT,*) 'L2D_REL_FRC IS SET TO', L2D_REL_FRC
      WRITE(ILUOUT,*) 'REL FRC WILL BE SET'
      ALLOCATE(TDTRELFRC(NRELFRC))
      ALLOCATE(XTHREL(IIU,IJU,IKU,NRELFRC))  ; XTHREL=0.
      ALLOCATE(XRVREL(IIU,IJU,IKU,NRELFRC))  ; XRVREL=0.
    ELSE
      ALLOCATE(TDTRELFRC(0))
      ALLOCATE(XTHREL(0,0,0,0))
      ALLOCATE(XRVREL(0,0,0,0))
    ENDIF
    !
    !*      4.11 BIS: Eddy fluxes allocation
    !
    IF ( LTH_FLX ) THEN
    
      ALLOCATE(XVTH_FLUX_M(IIU,IJU,IKU)) ; XVTH_FLUX_M = 0.
      ALLOCATE(XWTH_FLUX_M(IIU,IJU,IKU)) ; XWTH_FLUX_M = 0.
      IF (KMI /= 1) THEN
        ALLOCATE(XRTHS_EDDY_FLUX(IIU,IJU,IKU))
        XRTHS_EDDY_FLUX = 0.
      ELSE
        ALLOCATE(XRTHS_EDDY_FLUX(0,0,0))
      ENDIF
    
      ALLOCATE(XVTH_FLUX_M(0,0,0))
      ALLOCATE(XWTH_FLUX_M(0,0,0))
      ALLOCATE(XRTHS_EDDY_FLUX(0,0,0))
    
    END IF
    !
    IF ( LUV_FLX) THEN
    
      ALLOCATE(XVU_FLUX_M(IIU,IJU,IKU)) ; XVU_FLUX_M  = 0.
      IF (KMI /= 1) THEN
        ALLOCATE(XRVS_EDDY_FLUX(IIU,IJU,IKU))
        XRVS_EDDY_FLUX = 0.
      ELSE
        ALLOCATE(XRVS_EDDY_FLUX(0,0,0))
      ENDIF
    
    !*      3.11   Module MODD_ICE_CONC_n
    
    !
    IF (     (CCLOUD == 'ICE3'.OR.CCLOUD == 'ICE4') .AND.   &
         (CPROGRAM == 'DIAG  '.OR.CPROGRAM == 'MESONH')) THEN
      ALLOCATE(XCIT(IIU,IJU,IKU))
    ELSE
      ALLOCATE(XCIT(0,0,0))
    END IF
    !
    
    IF ( CCLOUD == 'KHKO' .OR. CCLOUD == 'C2R2') THEN
    
       ALLOCATE(XSUPSAT(IIU,IJU,IKU))
       ALLOCATE(XNACT(IIU,IJU,IKU))
       ALLOCATE(XNPRO(IIU,IJU,IKU))
       ALLOCATE(XSSPRO(IIU,IJU,IKU))
    
    ELSE
       ALLOCATE(XSUPSAT(0,0,0))
       ALLOCATE(XNACT(0,0,0))
       ALLOCATE(XNPRO(0,0,0))
       ALLOCATE(XSSPRO(0,0,0))
    
    !*      3.12   Module MODD_TURB_CLOUD
    
    !
    IF (.NOT.(ALLOCATED(XCEI))) ALLOCATE(XCEI(0,0,0))
    IF (KMI == NMODEL_CLOUD .AND. CTURBLEN_CLOUD/='NONE' ) THEN
      DEALLOCATE(XCEI)
      ALLOCATE(XCEI(IIU,IJU,IKU))
    ENDIF
    !
    
    !*      3.13  Module MODD_CH_PH_n
    
    IF (LUSECHAQ.AND.(CPROGRAM == 'DIAG  '.OR.CPROGRAM == 'MESONH')) THEN
      IF (LCH_PH) THEN
        ALLOCATE(XPHC(IIU,IJU,IKU))
        IF (NRRL==2) THEN
          ALLOCATE(XPHR(IIU,IJU,IKU))
    
          ALLOCATE(XACPHR(IIU,IJU))
          XACPHR(:,:) =  0.
    
      IF (NRRL==2) THEN
        ALLOCATE(XACPRAQ(IIU,IJU,NSV_CHAC/2))
        XACPRAQ(:,:,:) = 0.
      ENDIF
    
    IF (.NOT.(ASSOCIATED(XPHC))) ALLOCATE(XPHC(0,0,0))
    IF (.NOT.(ASSOCIATED(XPHR))) ALLOCATE(XPHR(0,0,0))
    IF (.NOT.(ASSOCIATED(XACPHR))) ALLOCATE(XACPHR(0,0))
    IF (.NOT.(ASSOCIATED(XACPRAQ))) ALLOCATE(XACPRAQ(0,0,0))
    
    IF ((LUSECHEM).AND.(CPROGRAM == 'DIAG  ')) THEN
      ALLOCATE(XCHFLX(IIU,IJU,NSV_CHEM))
      XCHFLX(:,:,:) = 0.
    
    !*          3.14 Module MODD_DRAG
    !
    IF (LDRAG) THEN
    
    !-------------------------------------------------------------------------------
    !
    
    !*       4.    INITIALIZE BUDGET VARIABLES
    
    !              ---------------------------
    !
    IF ( CBUTYPE /= "NONE" .AND. NBUMOD == KMI ) THEN
    
                 LNUMDIFU,LNUMDIFTH,LNUMDIFSV,                                    &
                 LHORELAX_UVWTH,LHORELAX_RV, LHORELAX_RC,LHORELAX_RR,             &
                 LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, LHORELAX_RH,LHORELAX_TKE,   &
    
                 LHORELAX_SV,LVE_RELAX,LCHTRANS,LNUDGING,LDRAGTREE,LDEPOTREE,     &
    
                 CRAD,CDCONV,CSCONV,CTURB,CTURBDIM,CCLOUD                         )
    
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !
    
    !*       5.    INITIALIZE INTERPOLATION COEFFICIENTS
    
    !
    CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI)
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*       6.     BUILT THE GENERIC OUTPUT NAME
    !               ----------------------------
    !
    IF (KMI == 1) THEN
      DO IMI = 1 , NMODEL
        WRITE(IO_SURF_MNH_MODEL(IMI)%COUTFILE,'(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))
    
        WRITE(YNAME, '(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))//'.000'
    
        CALL IO_File_add2list(LUNIT_MODEL(IMI)%TDIAFILE,YNAME,'MNHDIACHRONIC','WRITE',  &
    
                              KLFINPRAR=INT(50,KIND=LFI_INT),KLFITYPE=1,KLFIVERB=NVERB, &
    
                              TPDADFILE=LUNIT_MODEL(NDAD(IMI))%TDIAFILE )
    
      TDIAFILE => LUNIT_MODEL(KMI)%TDIAFILE !Necessary because no call to GOTO_MODEL before needing it
      !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
      IF (CPROGRAM=='MESONH') THEN
        IF ( NDAD(KMI) == 1)  CDAD_NAME(KMI) = CEXP//'.1.'//CSEG
        IF ( NDAD(KMI) == 2)  CDAD_NAME(KMI) = CEXP//'.2.'//CSEG
        IF ( NDAD(KMI) == 3)  CDAD_NAME(KMI) = CEXP//'.3.'//CSEG
        IF ( NDAD(KMI) == 4)  CDAD_NAME(KMI) = CEXP//'.4.'//CSEG
        IF ( NDAD(KMI) == 5)  CDAD_NAME(KMI) = CEXP//'.5.'//CSEG
        IF ( NDAD(KMI) == 6)  CDAD_NAME(KMI) = CEXP//'.6.'//CSEG
        IF ( NDAD(KMI) == 7)  CDAD_NAME(KMI) = CEXP//'.7.'//CSEG
        IF ( NDAD(KMI) == 8)  CDAD_NAME(KMI) = CEXP//'.8.'//CSEG
      END IF
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !*       7.    INITIALIZE GRIDS AND METRIC COEFFICIENTS
    
    !              ----------------------------------------
    !
    
    CALL SET_GRID(KMI,TPINIFILE,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,               &
    
                  XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4,           &
                  XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4,           &
                  NXOR_ALL(KMI),NYOR_ALL(KMI),NXEND_ALL(KMI),NYEND_ALL(KMI), &
                  NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),                       &
                  CLBCX,CLBCY,                                               &
                  XTSTEP,XSEGLEN,                                            &
                  XLONORI,XLATORI,XLON,XLAT,                                 &
                  XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP,                           &
    
                  XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT,              &
    
                  TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN)
    
    !
    CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
    !
    !* update halos of metric coefficients
    !
    !
    CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)
    !
    !
    CALL SET_DIRCOS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,TZINITHALO2D_ll,   &
                    XDIRCOSXW,XDIRCOSYW,XDIRCOSZW,XCOSSLOPE,XSINSLOPE  )
    !
    ! grid nesting initializations
    IF ( KMI == 1 ) THEN
      XTSTEP_MODEL1=XTSTEP
    END IF
    !
    NDT_2_WAY(KMI)=4
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      8.    INITIALIZE DATA FOR JVALUES AND AEROSOLS 
    
    !
    IF ( LUSECHEM .OR. LCHEMDIAG ) THEN
      IF ((KMI==1).AND.(CPROGRAM == "MESONH".OR.CPROGRAM == "DIAG  "))  &
        CALL CH_INIT_JVALUES(TDTCUR%TDATE%DAY, TDTCUR%TDATE%MONTH,      &
                             TDTCUR%TDATE%YEAR, ILUOUT, XCH_TUV_DOBNEW)
    !
      IF (LORILAM) THEN
        CALL CH_AER_MOD_INIT
      ENDIF
    END IF
    
    IF (.NOT.(ASSOCIATED(XMI))) ALLOCATE(XMI(0,0,0,0))
    IF (.NOT.(ASSOCIATED(XSOLORG))) ALLOCATE(XSOLORG(0,0,0,0))
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    IF (CCLOUD=='LIMA') CALL INIT_AEROSOL_PROPERTIES
    !
    
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*       9.    INITIALIZE THE PROGNOSTIC FIELDS
    
    !              --------------------------------
    !
    
    CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before read_field::XUT",PRECISION)
    
                    CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT,CGETZWS,     &
    
                    CGETRST,CGETRGT,CGETRHT,CGETSVT,CGETSRCT,CGETSIGS,CGETCLDFR,  &
    
                    CGETBL_DEPTH,CGETSBL_DEPTH,CGETPHC,CGETPHR,CUVW_ADV_SCHEME,   &
    
                    CTEMP_SCHEME,NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll,&
    
                    NSIZELBXTKE_ll,NSIZELBYTKE_ll,                                &
                    NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll,        &
    
                    XUM,XVM,XWM,XDUM,XDVM,XDWM,                                   &
    
                    XSIGS,XSRCT,XCLDFR,XBL_DEPTH,XSBL_DEPTH,XWTHVMF,XPHC,XPHR,    &
    
                    XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,                      &
    
                    XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,                        &
                    XLBXRM,XLBXSVM,                                               &
                    XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,                        &
                    XLBYRM,XLBYSVM,                                               &
                    NFRC,TDTFRC,XUFRC,XVFRC,XWFRC,XTHFRC,XRVFRC,                  &
                    XTENDTHFRC,XTENDRVFRC,XGXTHFRC,XGYTHFRC,                      &
                    XPGROUNDFRC, XATC,                                            &
    
                    XTENDUFRC, XTENDVFRC,                                         &
    
                    NADVFRC,TDTADVFRC,XDTHFRC,XDRVFRC,                            &
                    NRELFRC,TDTRELFRC,XTHREL,XRVREL,                              &
    
                    XVTH_FLUX_M,XWTH_FLUX_M,XVU_FLUX_M,                           &
                    XRUS_PRES,XRVS_PRES,XRWS_PRES,XRTHS_CLD,XRRS_CLD,XRSVS_CLD    )
    
    !
    !-------------------------------------------------------------------------------
    !
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*        10.  INITIALIZE REFERENCE STATE
    
    !              ---------------------------
    !
    !
    
    CALL SET_REF(KMI,TPINIFILE,                         &
    
                 XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY,    &
                 XREFMASS,XMASS_O_PHI0,XLINMASS,        &
                 XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ )
    
    !
    !-------------------------------------------------------------------------------
    !
    
    !*       10.1    INITIALIZE THE TURBULENCE VARIABLES
    
    !               -----------------------------------
    !
    IF ((CTURB == 'TKEL').AND.(CCONF=='START')) THEN
    
      CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_tke_eps::XUT",PRECISION)
    
      CALL INI_TKE_EPS(CGETTKET,XTHVREF,XZZ, &
    
                       XUT,XVT,XTHT,                  &
    
                       XTKET,TZINITHALO3D_ll    )
    
      CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_tke_eps::XUT",PRECISION)
    
    !*       10.2   INITIALIZE THE LES VARIABLES
    
    !               ----------------------------
    !
    CALL INI_LES_n
    !
    !-------------------------------------------------------------------------------
    !
    
    !*       11.    INITIALIZE THE SOURCE OF TOTAL DRY MASS Md
    
    !               ------------------------------------------
    !
    IF((KMI==1).AND.LSTEADYLS) THEN
      XDRYMASSS = 0.
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    
    !*       12.    INITIALIZE THE MICROPHYSICS                   
    
    !               ----------------------------
    !
    IF (CELEC == 'NONE') THEN
    
    !
    !-------------------------------------------------------------------------------
    !
    
    !*       13.    INITIALIZE THE ATMOSPHERIC ELECTRICITY                   
    
    !               --------------------------------------
    !
    ELSE
    
      CALL INI_ELEC_n(ILUOUT, CELEC, CCLOUD, TPINIFILE, &
                      XTSTEP, XZZ,                      &
                      XDXX, XDYY, XDZZ, XDZX, XDZY      )
    
    !
      WRITE (UNIT=ILUOUT,&
      FMT='(/,"ELECTRIC VARIABLES ARE BETWEEN INDEX",I2," AND ",I2)')&
      NSV_ELECBEG, NSV_ELECEND
    ! 
    
        IF( CGETSVT(NSV_ELECBEG)=='INIT' ) THEN
          XSVT(:,:,:,NSV_ELECBEG) = XCION_POS_FW(:,:,:)                  ! Nb/kg
          XSVT(:,:,:,NSV_ELECEND) = XCION_NEG_FW(:,:,:)
    !
    
          XSVT(:,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0
    
        ELSE  ! Convert elec_variables per m3 into elec_variables per kg of air
    
          DO JSV = NSV_ELECBEG, NSV_ELECEND
             XSVT(:,:,:,JSV) = XSVT(:,:,:,JSV) / XRHODREF(:,:,:)
          ENDDO
        END IF
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    
    !*       14.   INITIALIZE THE LARGE SCALE SOURCES
    
    !              ----------------------------------
    !
    IF ((KMI==1).AND.(.NOT. LSTEADYLS)) THEN
    
      CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_cpl::XUT",PRECISION)
    
      CALL INI_CPL(NSTOP,XTSTEP,LSTEADYLS,CCONF,                                  &
    
                   CGETTKET,                                                      &
                   CGETRVT,CGETRCT,CGETRRT,CGETRIT,                               &
                   CGETRST,CGETRGT,CGETRHT,CGETSVT,LCH_INIT_FIELD,                &
    
                   NSV,NIMAX_ll,NJMAX_ll,                                         &
                   NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll,             &
                   NSIZELBXTKE_ll,NSIZELBYTKE_ll,                                 &
                   NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll,         &
    
                   XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST,             &
    
                   XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,          &
                   XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,          &
    
                   XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS,             &
    
                   XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS,          &
                   XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS           )
    
      CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_cpl::XUT",PRECISION)
    
    !
          DO JSV=NSV_CHEMBEG,NSV_CHEMEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_LNOXBEG,NSV_LNOXEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_AERBEG,NSV_AEREND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_DSTBEG,NSV_DSTEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_DSTDEPBEG,NSV_DSTDEPEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_SLTBEG,NSV_SLTEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_SLTDEPBEG,NSV_SLTDEPEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
          DO JSV=NSV_PPBEG,NSV_PPEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
    #ifdef MNH_FOREFIRE
          DO JSV=NSV_FFBEG,NSV_FFEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
          !
    #endif
          DO JSV=NSV_CSBEG,NSV_CSEND
            XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
            XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
          ENDDO
    !
    
    END IF
    !
    IF ( KMI > 1) THEN
      ! Use dummy pointers to correct an ifort BUG
      DPTR_XBMX1=>XBMX1
      DPTR_XBMX2=>XBMX2
      DPTR_XBMX3=>XBMX3
      DPTR_XBMX4=>XBMX4
      DPTR_XBMY1=>XBMY1
      DPTR_XBMY2=>XBMY2
      DPTR_XBMY3=>XBMY3
      DPTR_XBMY4=>XBMY4
      DPTR_XBFX1=>XBFX1
      DPTR_XBFX2=>XBFX2
      DPTR_XBFX3=>XBFX3
      DPTR_XBFX4=>XBFX4
      DPTR_XBFY1=>XBFY1
      DPTR_XBFY2=>XBFY2
      DPTR_XBFY3=>XBFY3
      DPTR_XBFY4=>XBFY4
      DPTR_CLBCX=>CLBCX
      DPTR_CLBCY=>CLBCY
      !
      DPTR_XZZ=>XZZ
      DPTR_XZHAT=>XZHAT
      DPTR_XLSUM=>XLSUM
      DPTR_XLSVM=>XLSVM
      DPTR_XLSWM=>XLSWM
      DPTR_XLSTHM=>XLSTHM
      DPTR_XLSRVM=>XLSRVM
    
      DPTR_XLSUS=>XLSUS
      DPTR_XLSVS=>XLSVS
      DPTR_XLSWS=>XLSWS
      DPTR_XLSTHS=>XLSTHS
      DPTR_XLSRVS=>XLSRVS
    
      !
      DPTR_NKLIN_LBXU=>NKLIN_LBXU
      DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU
      DPTR_NKLIN_LBYU=>NKLIN_LBYU
      DPTR_XCOEFLIN_LBYU=>XCOEFLIN_LBYU
      DPTR_NKLIN_LBXV=>NKLIN_LBXV
      DPTR_XCOEFLIN_LBXV=>XCOEFLIN_LBXV
      DPTR_NKLIN_LBYV=>NKLIN_LBYV
      DPTR_XCOEFLIN_LBYV=>XCOEFLIN_LBYV
      DPTR_NKLIN_LBXW=>NKLIN_LBXW
      DPTR_XCOEFLIN_LBXW=>XCOEFLIN_LBXW
      DPTR_NKLIN_LBYW=>NKLIN_LBYW
      DPTR_XCOEFLIN_LBYW=>XCOEFLIN_LBYW
      DPTR_NKLIN_LBXM=>NKLIN_LBXM
      DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM
      DPTR_NKLIN_LBYM=>NKLIN_LBYM
      DPTR_XCOEFLIN_LBYM=>XCOEFLIN_LBYM
      !
      CALL INI_SPAWN_LS_n(NDAD(KMI),XTSTEP,KMI,                                 &
           DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4,      &
           DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4,      &
           NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),                  &
           DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT,                                &
           LSLEVE,XLEN1,XLEN2,                                   &
    
           DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSZWSM,         &
           DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSZWSS,                      &       
    
           DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU,    &
           DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV,    &
           DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW,    &
           DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM     )
      !