diff --git a/src/core_atmosphere/Registry.xml b/src/core_atmosphere/Registry.xml index 6378596797..348bc96134 100644 --- a/src/core_atmosphere/Registry.xml +++ b/src/core_atmosphere/Registry.xml @@ -2212,7 +2212,7 @@ + possible_values="`suite',`sf_monin_obukhov',`sf_mynn',`sf_pxsfclay',`off'"/> 1 + REGIME(I) = 1.0 + ZOLL = BR(I) * GZ1OZ0(I) / (1.0 - RICRITI * RICUT(I)) + PSIM(I) = 1.0 - BETAM - ZOLL + PSIH(I) = 1.0 - BETAH - ZOLL + + ELSE IF (BR(I) .GE. 0.0) THEN +! -----CLASS 2; STABLE: for 1 > Z/L >0 + REGIME(I) = 2.0 + ZOLL = BR(I) * GZ1OZ0(I) / (1.0 - RICRITI * BR(I)) + PSIM(I) = -BETAM * ZOLL + PSIH(I) = -BETAH * ZOLL + + ELSE +! ----- CLASS 3 or 4; UNSTABLE: +! ----- CLASS 4 IS FOR ACM NON-LOCAL CONVECTION (H/L < -3) + REGIME(I) = 3.0 + AM = 0.031 + 0.276 * ALOG(GZ1OZ0(I)) + AH = 0.04 + 0.355 * ALOG(GZ1OZ0(I)) + SQLNZZ0 = SQRT(GZ1OZ0(I)) + PSIM(I) = AM * ALOG(1.0 - BM * SQLNZZ0 * BR(I)) + PSIH(I) = AH * ALOG(1.0 - BH * SQLNZZ0 * BR(I)) + + ENDIF + ENDDO + +! -------- COMPUTE THE FRICTIONAL VELOCITY AND SURFACE FLUXES: + DO I = its,ite + DTG = THETA1(I) - THETAG(I) + PSIX = GZ1OZ0(I) - PSIM(I) + UST(I) = 0.5*UST(I)+0.5*KARMAN*WSPD(I)/PSIX + USTM(I) = UST(I) + +! ------- OVER WATER, ALTER ROUGHNESS LENGTH (Z0) ACCORDING TO WIND (UST). + IF ((XLAND(I)-1.5) .GE. 0.0) THEN + ZNT(I) = CZO * USTM(I) * USTM(I) / G + OZO + GZ1OZ0(I) = ALOG(ZA(I) / ZNT(I)) + PSIX = GZ1OZ0(I) - PSIM(I) + UST(I) = KARMAN * WSPD(I) / PSIX + USTM(I) = UST(I) + ENDIF + + RA(I) = PR0 * (GZ1OZ0(I) - PSIH(I)) / (KARMAN * UST(I)) + RBH = 5.0 / UST(I) + RBW = 4.503/UST(I) + CHS(I) = 1./(RA(I) + RBH) + CQS = 1./(RA(I) + RBW) + MOL(I) = DTG * CHS(I) / UST(I) + TSTV = (THETAV1(I) - TH0(I)) * CHS(I) / UST(I) + IF (ABS(TSTV) .LT. 1.E-5) TSTV = 1.E-5 + MOLENGTH(I) = THETAV1(I) * UST(I) * UST(I) / (KARMAN * G * TSTV) + +! ---Compute 2m surface exchange coefficients for heat and moisture + XMOL = MOLENGTH(I) + IF(MOLENGTH(I).GT.0.0) XMOL = AMAX1(MOLENGTH(I),2.0) + RMOL(I) = 1/XMOL + ZOL(I) = ZA(I)*RMOL(I) + ZOBOL = 1.5*RMOL(I) + Z10OL = 10.0*RMOL(I) + ZNTOL = ZNT(I)*RMOL(I) + IF(XMOL.LT.0.0) THEN + YNT = ( 1.0 - GAMAH * ZNTOL )**0.5 + YOB = ( 1.0 - GAMAH * ZOBOL )**0.5 + PSIH2 = 2. * ALOG((YOB+1.0)/(YNT+1.0)) + x1 = (1.0 - gamam * z10ol)**0.25 + x2 = (1.0 - gamam * zntol)**0.25 + psim10 = 2.0 * ALOG( (1.0+x1) / (1.0+x2) ) + & + ALOG( (1.0+x1*x1) / (1.0+x2*x2)) - & + 2.0 * ATAN(x1) + 2.0 * ATAN(x2) + ELSE + IF((ZOBOL-ZNTOL).LE.1.0) THEN + PSIH2 = -BETAH*(ZOBOL-ZNTOL) + ELSE + PSIH2 = 1.-BETAH-(ZOBOL-ZNTOL) + ENDIF + IF((Z10OL-ZNTOL).LE.1.0) THEN + PSIM10 = -BETAM*(Z10OL-ZNTOL) + ELSE + PSIM10 = 1.-BETAM-(Z10OL-ZNTOL) + ENDIF + ENDIF + G2OZ0 = ALOG(1.5 / ZNT(I)) + G10OZ0 = ALOG(10.0 / ZNT(I)) + RA2 = PR0 * (G2OZ0 - PSIH2) / (KARMAN * UST(I)) + CHS2(I) = 1.0/(RA2 + RBH) + CQS2(I) = 1.0/(RA2 + RBW) + U10(I) = US(I)*(G10OZ0-PSIM10)/PSIX + V10(I) = VS(I)*(G10OZ0-PSIM10)/PSIX + +! -----COMPUTE SURFACE HEAT AND MOIST FLUX: + FLHC(i) = CPM(I)*RHOX(I)*CHS(I) +#if defined(mpas) + FLQC(i) = RHOX(I)*CQS +#else + FLQC(i) = RHOX(I)*CQS*MAVAIL(I) +#endif + QFX(I) = FLQC(I)*(QSFC(I)-QV1D(I)) + QFX(I) = AMAX1(QFX(I),0.) + LH(I) = XLV*QFX(I) + IF(XLAND(I)-1.5.GT.0.)THEN + HFX(I)= -FLHC(I)*DTG + ELSEIF(XLAND(I)-1.5.LT.0.)THEN + HFX(I)= -FLHC(I)*DTG + HFX(I)= AMAX1(HFX(I),-250.) + ENDIF +#if defined(mpas) + TH2(I) = THETAG(I) - HFX(I) / (CPM(I)*RHOX(I)*CHS2(I)) + CPOT = (100./PSFC(I))**ROVCP + TA2(I) = TH2(I)/CPOT + QA2(I) = QSFC(I) - QFX(I) / (RHOX(I)*CQS2(I)) +#endif + ENDDO + + + END SUBROUTINE PXSFCLAY1D + +!==================================================================== + SUBROUTINE pxsfclayinit( allowed_to_read ) + + LOGICAL , INTENT(IN) :: allowed_to_read + INTEGER :: N + REAL :: ZOLN,X,Y + + + END SUBROUTINE pxsfclayinit + +!------------------------------------------------------------------- + +END MODULE module_sf_pxsfclay