Skip to content
Snippets Groups Projects
ini_modeln.f90 83.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • !
    !
    CALL INI_SW_SETUP (CRAD,NSWB_MNH,XSW_BANDS)
    
    CALL INI_LW_SETUP (CRAD,NLWB_MNH,XLW_BANDS)
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !       17.1.1 Special initialisation for CO2 content
    
    !              CO2 (molar mass=44) horizontally and vertically homogeneous at 360 ppm
    !
    XCCO2 = 360.0E-06 * 44.0E-03 / XMD
    
    #ifdef MNH_ECRAD
    RCCO2 = 360.0E-06 * 44.0E-03 / XMD
    #endif
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      17.2   Externalized surface fields
    
    !              ---------------------------
    !
    ALLOCATE(ZCO2(IIU,IJU))
    ZCO2(:,:) = XCCO2
    !
    
    ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH))
    ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH))
    
    ALLOCATE(ZTSRAD (IIU,IJU))
    !
    IF (IMASDEV>=46) THEN
    
      CALL IO_READ_FIELD(TPINIFILE,'SURF',CSURF)
    
    ELSE
      CSURF = "EXTE"
    END IF
    !
    !
    IF (CSURF=='EXTE' .AND. (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ')) THEN
      ! ouverture du fichier PGD
      IF  ( LEN_TRIM(CINIFILEPGD) > 0 ) THEN
    
        CALL IO_FILE_ADD2LIST(TINIFILEPGD,TRIM(CINIFILEPGD),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
    
        CALL IO_FILE_OPEN_ll(TINIFILEPGD,OPARALLELIO=.FALSE.,KRESP=IRESP)
    
        IF (IRESP/=0) THEN
          WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD
          WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNITn"
        !callabortstop
    
          CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','')
    
        ENDIF
      ELSE
      ! case after a spawning
    
        CINIFILEPGD = TPINIFILE%CNAME
    
      CALL GOTO_SURFEX(KMI)
    
      !* initialization of surface
      CALL INIT_GROUND_PARAM_n ('ALL',SIZE(CSV),CSV,ZCO2,                             &
    
                                XZENITH,XAZIM,XSW_BANDS,XLW_BANDS,ZDIR_ALB,ZSCA_ALB,  &
    
                                ZEMIS,ZTSRAD                                )
      !
      IF (SIZE(XEMIS)>0) THEN
        XDIR_ALB = ZDIR_ALB
        XSCA_ALB = ZSCA_ALB
        XEMIS    = ZEMIS
        XTSRAD   = ZTSRAD
        CALL MNHGET_SURF_PARAM_n (PSEA=XSEA)                          
      END IF
    ELSE
      !* fields not physically necessary, but must be initialized
      IF (SIZE(XEMIS)>0) THEN
        XDIR_ALB = 0.
        XSCA_ALB = 0.
        XEMIS    = 1.
        XTSRAD   = XTT
        XSEA     = 1.
      END IF
    END IF
    IF (CSURF=='EXTE' .AND. (CPROGRAM=='SPAWN ')) THEN
      ! ouverture du fichier PGD
    
      CALL IO_FILE_ADD2LIST(TINIFILEPGD,TRIM(CINIFILEPGD),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
    
      CALL IO_FILE_OPEN_ll(TINIFILEPGD,OPARALLELIO=.FALSE.,KRESP=IRESP)
    
      IF (IRESP/=0) THEN
        WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD
        WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNIT2_SPA"
        !callabortstop
    
        CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','')
    
      ENDIF
    ENDIF
    !
      !* special case after spawning in prep_real_case
    IF (CSURF=='EXRM' .AND. CPROGRAM=='REAL  ') CSURF = 'EXTE'
    !
    DEALLOCATE(ZDIR_ALB)
    DEALLOCATE(ZSCA_ALB)
    DEALLOCATE(ZEMIS   )
    DEALLOCATE(ZTSRAD  )
    !
    DEALLOCATE(ZCO2)
    !
    !
    !* in a RESTART case, reads surface radiative quantities in the MESONH file
    !
    
    IF ((CRAD  == 'ECMW' .OR. CRAD  == 'ECRA') .AND. CGETRAD=='READ') THEN
    
      CALL INI_SURF_RAD(TPINIFILE, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD)
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      17.3   Mesonh fields
    
    !              -------------
    !
    
    IF (CPROGRAM/='REAL  ') CALL MNHREAD_ZS_DUMMY_n(TINIFILEPGD)
    
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*       18.    INITIALIZE THE PARAMETERS FOR THE PHYSICS
    
    !               -----------------------------------------
    !
    IF (CRAD   == 'ECMW') THEN
    !
    !* get cover mask for aerosols
    !
      IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ') THEN
    
        ALLOCATE(ZSEA(IIU,IJU))
        ALLOCATE(ZTOWN(IIU,IJU))
        ALLOCATE(ZBARE(IIU,IJU))
    
        IF (CSURF=='EXTE') THEN
    
          CALL GOTO_SURFEX(KMI)
    
          CALL MNHGET_SURF_PARAM_n(PSEA=ZSEA,PTOWN=ZTOWN,PBARE=ZBARE)
    
          ZSEA (:,:) = 1.
          ZTOWN(:,:) = 0.
          ZBARE(:,:) = 0.
    
        CALL INI_RADIATIONS_ECMWF (TPINIFILE%CNAME,HLUOUT,                                 &
                                   XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,       &
    
                                   CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB_OLD,CAER,NAER,NSTATM,   &
    
                                   XSTATM,ZSEA,ZTOWN,ZBARE,XOZON, XAER,XDST_WL, LSUBG_COND )
    
        DEALLOCATE(ZSEA,ZTOWN,ZBARE)
    
        ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4)))
        XAER_CLIM(:,:,:,:) =XAER(:,:,:,:)
    
    
    ELSE IF (CRAD   == 'ECRA') THEN
    #ifdef MNH_ECRAD
    !* get cover mask for aerosols
    !
      IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ') THEN
        ALLOCATE(ZSEA(IIU,IJU))
        ALLOCATE(ZTOWN(IIU,IJU))
        ALLOCATE(ZBARE(IIU,IJU))
        IF (CSURF=='EXTE') THEN
          CALL GOTO_SURFEX(KMI)
          CALL MNHGET_SURF_PARAM_n(PSEA=ZSEA,PTOWN=ZTOWN,PBARE=ZBARE)
        ELSE
          ZSEA (:,:) = 1.
          ZTOWN(:,:) = 0.
          ZBARE(:,:) = 0.
        END IF
    !   
    
        CALL INI_RADIATIONS_ECRAD (TPINIFILE%CNAME,HLUOUT,                                 &
                                   XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,       &
                                   CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB_OLD,CAER,NAER,NSTATM,   &
                                   XSTATM,ZSEA,ZTOWN,ZBARE,XOZON, XAER,XDST_WL, LSUBG_COND )
    
    
        DEALLOCATE(ZSEA,ZTOWN,ZBARE)
        ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4)))
        XAER_CLIM(:,:,:,:) = XAER(:,:,:,:)
    !
      END IF
    #endif
    
    ELSE
      ALLOCATE (XOZON(0,0,0))
      ALLOCATE (XAER(0,0,0,0))
      ALLOCATE (XDST_WL(0,0,0,0))
      ALLOCATE (XAER_CLIM(0,0,0,0))  
    END IF
    !
    !
    !
    IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
      IF (CGETCONV=='INIT') THEN
        GINIDCONV=.TRUE.
      ELSE
        GINIDCONV=.FALSE.
      END IF
    !
    !  commensurability between convection calling time and time step
    !
      XDTCONV=XTSTEP*REAL( INT( (MIN(XDTCONV,1800.)+1.E-10)/XTSTEP ) )
      XDTCONV=MAX( XDTCONV, XTSTEP )
      IF (NVERB>=10) THEN
        WRITE(ILUOUT,*) 'XDTCONV has been set to : ',XDTCONV
      END IF
    
      CALL INI_DEEP_CONVECTION (TPINIFILE,HLUOUT,GINIDCONV,TDTCUR,               &
    
                               NCOUNTCONV,XDTHCONV,XDRVCONV,XDRCCONV,            &
                               XDRICONV,XPRCONV,XPRSCONV,XPACCONV,               &
    
                               XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,&
    
                               XCAPE,NCLTOPCONV,NCLBASCONV,                      &
                               TDTDCONV, CGETSVCONV, XDSVCONV,                   &
                               LCH_CONV_LINOX, XIC_RATE, XCG_RATE,               &
                               XIC_TOTAL_NUMBER, XCG_TOTAL_NUMBER                )
    
    
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !
    
    !*      19.    ALLOCATION OF THE TEMPORAL SERIES
    
    !              ---------------------------------
    !
    IF (LSERIES .AND. CPROGRAM/='DIAG  ') CALL INI_SERIES_n
    !
    !-------------------------------------------------------------------------------
    !
    !
    
    !*      20.   (re)initialize scalar variables
    
    !             -------------------------------
    !
    !
    IF ( LUSECHEM .OR. LCHEMDIAG ) THEN
      IF (CPROGRAM=='MESONH'.AND.CCONF=='RESTA') LCH_INIT_FIELD =.FALSE.
      IF (CPROGRAM=='MESONH'.OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='IDEAL ') &
            CALL CH_INIT_FIELD_n(KMI, ILUOUT, NVERB)
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      21.    UPDATE HALO
    
    !              -----------
    !
    !
    CALL UPDATE_HALO_ll(TZINITHALO3D_ll,IINFO_ll)
    CALL UPDATE_HALO_ll(TZINITHALO2D_ll,IINFO_ll)
    CALL CLEANLIST_ll(TZINITHALO3D_ll)
    CALL CLEANLIST_ll(TZINITHALO2D_ll)
    !
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      22.    DEALLOCATION
    
    !              -------------
    !
    DEALLOCATE(ZJ)
    !
    DEALLOCATE(XSTROATM)
    DEALLOCATE(XSMLSATM)
    DEALLOCATE(XSMLWATM)
    DEALLOCATE(XSPOSATM)
    DEALLOCATE(XSPOWATM)
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      23.     BALLOON and AIRCRAFT initializations
    
    !              ------------------------------------
    !
    
    CALL INI_AIRCRAFT_BALLOON(TPINIFILE,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, &
                              IKU,CTURB=="TKEL" ,                          &
                              XLATORI, XLONORI                             )
    
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      24.     STATION initializations
    
    !              -----------------------
    !
    
    CALL INI_SURFSTATION_n(XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, &
                           CTURB=="TKEL" ,                    &
                           XLATORI, XLONORI                   )
    
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      25.     PROFILER initializations
    
    !              ------------------------
    !
    
    CALL INI_POSPROFILER_n(XTSTEP, TDTSEG, XSEGLEN, NRR, NSV,  &
                           CTURB=="TKEL",                      &
                           XLATORI, XLONORI                    )
    
    !
    !-------------------------------------------------------------------------------
    !
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      26.     Prognostic aerosols          
    
    !              ------------------------
    !
    CALL INI_AEROSET1
    CALL INI_AEROSET2
    CALL INI_AEROSET3
    CALL INI_AEROSET4
    CALL INI_AEROSET5
    CALL INI_AEROSET6
    
    #ifdef MNH_FOREFIRE
    ! 
    !-------------------------------------------------------------------------------
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
    !*      27.    FOREFIRE initializations
    
    !              ------------------------
    !
    
    ! Coupling with ForeFire if resolution is low enough
    !---------------------------------------------------
    IF ( LFOREFIRE .AND. 0.5*(XXHAT(2)-XXHAT(1)+XYHAT(2)-XYHAT(1)) < COUPLINGRES ) THEN
    	FFCOUPLING = .TRUE.	
    ELSE
    	FFCOUPLING = .FALSE.
    ENDIF
    
    ! Initializing the ForeFire variables
    !------------------------------------
    IF ( LFOREFIRE ) THEN
    	CALL INIT_FOREFIRE_n(KMI, ILUOUT, IP &
    		, TDTCUR%TDATE%YEAR, TDTCUR%TDATE%MONTH, TDTCUR%TDATE%DAY, TDTCUR%TIME, XTSTEP)
    END IF
    #endif
    
    !-------------------------------------------------------------------------------
    !
    !*      30.   Total production/Loss for chemical species
    !
    
            CALL CH_INIT_PRODLOSSTOT_n(ILUOUT)
            IF (NEQ_PLT>0) THEN
                    ALLOCATE(XPROD(IIU,IJU,IKU,NEQ_PLT))
                    ALLOCATE(XLOSS(IIU,IJU,IKU,NEQ_PLT))
                    XPROD=0.0
                    XLOSS=0.0
            ELSE
                    ALLOCATE(XPROD(0,0,0,0))
                    ALLOCATE(XLOSS(0,0,0,0))
            END IF
    ELSE
            ALLOCATE(XPROD(0,0,0,0))
            ALLOCATE(XLOSS(0,0,0,0))
    END IF
    !
    !-------------------------------------------------------------------------------
    !
    !*     31. Extended production/loss terms for chemical species
    !
    
            CALL CH_INIT_BUDGET_n(ILUOUT)
            IF (NEQ_BUDGET>0) THEN
                    ALLOCATE(IINDEX(2,NNONZEROTERMS))
                    ALLOCATE(IIND(NEQ_BUDGET))
                    CALL CH_NONZEROTERMS(KMI,IINDEX,NNONZEROTERMS)
                    ALLOCATE(XTCHEM(NEQ_BUDGET))
                    DO JM=1,NEQ_BUDGET
                            IIND(JM)=COUNT((IINDEX(1,:))==NSPEC_BUDGET(JM))
                            ALLOCATE(XTCHEM(JM)%NB_REAC(IIND(JM)))
                            ALLOCATE(XTCHEM(JM)%XB_REAC(IIU,IJU,IKU,IIND(JM)))
                    END DO
                    DEALLOCATE(IIND)
                    DEALLOCATE(IINDEX)
            ELSE
                    ALLOCATE(XTCHEM(0))
            END IF
    ELSE
            ALLOCATE(XTCHEM(0))
    END IF
    
    
    END SUBROUTINE INI_MODEL_n