Skip to content
Snippets Groups Projects
resolved_cloud.f90 58.2 KiB
Newer Older
                     PRR=PRS(:,:,:,3)*PTSTEP,                                &
                     PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),             &
                     PRS=PRS(:,:,:,5)*PTSTEP,                                &
                     PRG=PRS(:,:,:,6)*PTSTEP,                                &
                     TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS),              &
                     PRH=PRS(:,:,:,7)*PTSTEP,                                &
                     PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                   &
                     PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                    )
    END IF

    deallocate( zexn )
!           
!
!*       12.    2-MOMENT MIXED-PHASE MICROPHYSICAL SCHEME LIMA
!               --------------------------------------------------------------
!
!
!*       12.1   Compute the explicit microphysical sources
!
  CASE ('LIMA')
     !
    DO JK=IKB,IKE
      ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK)    
    ENDDO
    ZZZ = MZF( PZZ )
     IF (LPTSPLIT) THEN
        CALL LIMA (1, IKU, 1,                                              &
                   PTSTEP, TPFILE,                                         &
                   PRHODREF, PEXNREF, ZDZZ,                                &
                   NMOD_CCN, NMOD_IFN, NMOD_IMM,                           &
                   PDTHRAD, PTHT, PRT,                                     &
                   PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), PW_ACT,          &
                   PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),       &
                   PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, &
                   PEVAP3D, PCLDFR, PICEFR, PRAINFR                        )
     ELSE

        IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI,       &
                                  TPFILE, KRR, PZZ, PRHODJ,                         &
                                  PRHODREF, PEXNREF, PW_ACT, PPABST,                &
                                  PDTHRAD,                                          &
                                  PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), &
                                  PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), &
                                  PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D         )
!
        IF (LCOLD) CALL LIMA_COLD(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI,               &
                                  KRR, PZZ, PRHODJ,                                  &
                                  PRHODREF, PEXNREF, PPABST, PW_ACT,                 &
                                  PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),  &
                                  PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),  &
                                  PINPRS, PINPRG, PINPRH                             )
!
        IF (OWARM .AND. LCOLD) CALL LIMA_MIXED(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI,              &
                                               KRR, PZZ, PRHODJ,                                 &
                                               PRHODREF, PEXNREF, PPABST, PW_ACT,                &
                                               PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), &
                                               PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END)  )
     ENDIF
!
!*       12.2   Perform the saturation adjustment
!
   IF (LSPRO) THEN
    CALL LIMA_NOTADJUST (KMI, TPFILE, HRAD,                                      &
                         PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PEXNREF, PZZ, &
                         PTHT,PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),        &
                         PTHS,PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),        &
    CALL LIMA_ADJUST_SPLIT(YLDIMPHYEX, KRR, KMI, TPFILE, CCONDENS, CLAMBDA3,                     &
                     PRHODREF, PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, PPABSTT, ZZZ,&
                     PDTHRAD, PW_ACT,                                                &
                     PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),                &
                     PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),                          &
                     PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF             )
   ELSE
    CALL LIMA_ADJUST(KRR, KMI, TPFILE,                                &
                     OSUBG_COND, PTSTEP,                              &
                     PRHODREF, PRHODJ, PEXNREF, PPABST, PPABSTT,      &
                     PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), &
                     PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),           &
                     PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR             )
   ENDIF
!
END SELECT
!
IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN
  PINPRC3D=ZFPR(:,:,:,2) / CST%XRHOLW
  PINPRR3D=ZFPR(:,:,:,3) / CST%XRHOLW
  PINPRS3D=ZFPR(:,:,:,5) / CST%XRHOLW
  PINPRG3D=ZFPR(:,:,:,6) / CST%XRHOLW
  IF(KRR==7) PINPRH3D=ZFPR(:,:,:,7) / CST%XRHOLW
  WHERE (PRT(:,:,:,2) > 1.E-04 )
    PSPEEDC=ZFPR(:,:,:,2) / (PRT(:,:,:,2) * PRHODREF(:,:,:))
  ENDWHERE
  WHERE (PRT(:,:,:,3) > 1.E-04 )
    PSPEEDR=ZFPR(:,:,:,3) / (PRT(:,:,:,3) * PRHODREF(:,:,:))
  ENDWHERE
  WHERE (PRT(:,:,:,5) > 1.E-04 )
    PSPEEDS=ZFPR(:,:,:,5) / (PRT(:,:,:,5) * PRHODREF(:,:,:))
  ENDWHERE
  WHERE (PRT(:,:,:,6) > 1.E-04 )
    PSPEEDG=ZFPR(:,:,:,6) / (PRT(:,:,:,6) * PRHODREF(:,:,:))
  ENDWHERE
  IF(KRR==7) THEN
    WHERE (PRT(:,:,:,7) > 1.E-04 )
      PSPEEDH=ZFPR(:,:,:,7) / (PRT(:,:,:,7) * PRHODREF(:,:,:))
    ENDWHERE
  ENDIF
ENDIF

! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
call Sources_neg_correct( hcloud, 'NECON', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj )

!-------------------------------------------------------------------------------
!
!
!*      13.     SWITCH BACK TO THE PROGNOSTIC VARIABLES
!               ---------------------------------------
!
PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:)
!
DO JRR = 1,KRR
  PRS(:,:,:,JRR)  = PRS(:,:,:,JRR) * PRHODJ(:,:,:)
END DO
!
IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN
  DO JSV = ISVBEG, ISVEND
    PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:)
  ENDDO
ENDIF

!-------------------------------------------------------------------------------
!
END SUBROUTINE RESOLVED_CLOUD