MODULE module_sf_noahmpdrv 2 !------------------------------- USE module_sf_noahmplsm USE module_sf_urban USE module_sf_noahdrv, ONLY : SOIL_VEG_GEN_PARM USE module_sf_noah_seaice USE module_sf_noahmp_glacier USE MODULE_RA_GFDLETA, ONLY: CAL_MON_DAY #ifdef WRF_CHEM USE module_data_gocart_dust #endif !------------------------------- ! CONTAINS ! SUBROUTINE noahmplsm(ITIMESTEP, YR, JULIAN, COSZIN, XLATIN, & ! IN : Time/Space-related 1,4 DZ8W, DT, DZS, NSOIL, DX, & ! IN : Model configuration IVGTYP, ISLTYP, VEGFRA, VEGMAX, TMN, & ! IN : Vegetation/Soil characteristics XLAND, XICE,XICE_THRES, ISICE, ISURBAN, & ! IN : Vegetation/Soil characteristics IDVEG, IOPT_CRS, IOPT_BTR, IOPT_RUN, IOPT_SFC, IOPT_FRZ, & ! IN : User options IOPT_INF, IOPT_RAD, IOPT_ALB, IOPT_SNF,IOPT_TBOT, IOPT_STC, & ! IN : User options IZ0TLND, & ! IN : User options T3D, QV3D, U_PHY, V_PHY, SWDOWN, GLW, & ! IN : Forcing P8W3D, RAINBL, & ! IN : Forcing TSK, HFX, QFX, LH, GRDFLX, SMSTAV, & ! IN/OUT LSM eqv SMSTOT,SFCRUNOFF, UDRUNOFF, ALBEDO, SNOWC, SMOIS, & ! IN/OUT LSM eqv SH2O, TSLB, SNOW, SNOWH, CANWAT, ACSNOM, & ! IN/OUT LSM eqv ACSNOW, EMISS, QSFC, & ! IN/OUT LSM eqv ISNOWXY, TVXY, TGXY, CANICEXY, CANLIQXY, EAHXY, & ! IN/OUT Noah MP only TAHXY, CMXY, CHXY, FWETXY, SNEQVOXY, ALBOLDXY, & ! IN/OUT Noah MP only QSNOWXY, WSLAKEXY, ZWTXY, WAXY, WTXY, TSNOXY, & ! IN/OUT Noah MP only ZSNSOXY, SNICEXY, SNLIQXY, LFMASSXY, RTMASSXY, STMASSXY, & ! IN/OUT Noah MP only WOODXY, STBLCPXY, FASTCPXY, XLAIXY, XSAIXY, TAUSSXY, & ! IN/OUT Noah MP only T2MVXY, T2MBXY, Q2MVXY, Q2MBXY, & ! OUT Noah MP only TRADXY, NEEXY, GPPXY, NPPXY, FVEGXY, RUNSFXY, & ! OUT Noah MP only RUNSBXY, ECANXY, EDIRXY, ETRANXY, FSAXY, FIRAXY, & ! OUT Noah MP only APARXY, PSNXY, SAVXY, SAGXY, RSSUNXY, RSSHAXY, & ! OUT Noah MP only BGAPXY, WGAPXY, TGVXY, TGBXY, CHVXY, CHBXY, & ! OUT Noah MP only SHGXY, SHCXY, SHBXY, EVGXY, EVBXY, GHVXY, & ! OUT Noah MP only GHBXY, IRGXY, IRCXY, IRBXY, TRXY, EVCXY, & ! OUT Noah MP only CHLEAFXY, CHUCXY, CHV2XY, CHB2XY, & ! OUT Noah MP only ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte ) !---------------------------------------------------------------- IMPLICIT NONE !---------------------------------------------------------------- ! IN only INTEGER, INTENT(IN ) :: ITIMESTEP ! timestep number INTEGER, INTENT(IN ) :: YR ! 4-digit year REAL, INTENT(IN ) :: JULIAN ! Julian day REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: COSZIN ! cosine zenith angle REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLATIN ! latitude [rad] REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: DZ8W ! thickness of atmo layers [m] REAL, INTENT(IN ) :: DT ! timestep [s] REAL, DIMENSION(1:nsoil), INTENT(IN ) :: DZS ! thickness of soil layers [m] INTEGER, INTENT(IN ) :: NSOIL ! number of soil layers REAL, INTENT(IN ) :: DX ! horizontal grid spacing [m] INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: IVGTYP ! vegetation type INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: ISLTYP ! soil type REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: VEGFRA ! vegetation fraction [] REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ) :: VEGMAX ! annual max vegetation fraction [] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: TMN ! deep soil temperature [K] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLAND ! =2 ocean; =1 land/seaice REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XICE ! fraction of grid that is seaice REAL, INTENT(IN ) :: XICE_THRES! fraction of grid determining seaice INTEGER, INTENT(IN ) :: ISICE ! land cover category for ice INTEGER, INTENT(IN ) :: ISURBAN ! land cover category for urban INTEGER, INTENT(IN ) :: IDVEG ! dynamic vegetation (1 -> off ; 2 -> on) with opt_crs = 1 INTEGER, INTENT(IN ) :: IOPT_CRS ! canopy stomatal resistance (1-> Ball-Berry; 2->Jarvis) INTEGER, INTENT(IN ) :: IOPT_BTR ! soil moisture factor for stomatal resistance (1-> Noah; 2-> CLM; 3-> SSiB) INTEGER, INTENT(IN ) :: IOPT_RUN ! runoff and groundwater (1->SIMGM; 2->SIMTOP; 3->Schaake96; 4->BATS) INTEGER, INTENT(IN ) :: IOPT_SFC ! surface layer drag coeff (CH & CM) (1->M-O; 2->Chen97) INTEGER, INTENT(IN ) :: IOPT_FRZ ! supercooled liquid water (1-> NY06; 2->Koren99) INTEGER, INTENT(IN ) :: IOPT_INF ! frozen soil permeability (1-> NY06; 2->Koren99) INTEGER, INTENT(IN ) :: IOPT_RAD ! radiation transfer (1->gap=F(3D,cosz); 2->gap=0; 3->gap=1-Fveg) INTEGER, INTENT(IN ) :: IOPT_ALB ! snow surface albedo (1->BATS; 2->CLASS) INTEGER, INTENT(IN ) :: IOPT_SNF ! rainfall & snowfall (1-Jordan91; 2->BATS; 3->Noah) INTEGER, INTENT(IN ) :: IOPT_TBOT ! lower boundary of soil temperature (1->zero-flux; 2->Noah) INTEGER, INTENT(IN ) :: IOPT_STC ! snow/soil temperature time scheme INTEGER, INTENT(IN ) :: IZ0TLND ! option of Chen adjustment of Czil (not used) REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: T3D ! 3D atmospheric temperature valid at mid-levels [K] REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: QV3D ! 3D water vapor mixing ratio [kg/kg_dry] REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: U_PHY ! 3D U wind component [m/s] REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: V_PHY ! 3D V wind component [m/s] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: SWDOWN ! solar down at surface [W m-2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: GLW ! longwave down at surface [W m-2] REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: P8W3D ! 3D pressure, valid at interface [Pa] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: RAINBL ! precipitation entering land model [mm] ! INOUT (with generic LSM equivalent) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TSK ! surface radiative temperature [K] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: HFX ! sensible heat flux [W m-2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QFX ! latent heat flux [kg s-1 m-2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LH ! latent heat flux [W m-2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: GRDFLX ! ground/snow heat flux [W m-2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SMSTAV ! soil moisture avail. [not used] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SMSTOT ! total soil water [mm][not used] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SFCRUNOFF ! accumulated surface runoff [m] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UDRUNOFF ! accumulated sub-surface runoff [m] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ALBEDO ! total grid albedo [] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SNOWC ! snow cover fraction [] REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(INOUT) :: SMOIS ! volumetric soil moisture [m3/m3] REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(INOUT) :: SH2O ! volumetric liquid soil moisture [m3/m3] REAL, DIMENSION( ims:ime, 1:nsoil, jms:jme ), INTENT(INOUT) :: TSLB ! soil temperature [K] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SNOW ! snow water equivalent [mm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SNOWH ! physical snow depth [m] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CANWAT ! total canopy water + ice [mm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACSNOM ! accumulated snow melt leaving pack REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ACSNOW ! accumulated snow on grid REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: EMISS ! surface bulk emissivity REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QSFC ! bulk surface specific humidity ! INOUT (with no Noah LSM equivalent) INTEGER, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ISNOWXY ! actual no. of snow layers REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TVXY ! vegetation leaf temperature REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TGXY ! bulk ground surface temperature REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CANICEXY ! canopy-intercepted ice (mm) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CANLIQXY ! canopy-intercepted liquid water (mm) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: EAHXY ! canopy air vapor pressure (pa) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TAHXY ! canopy air temperature (k) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMXY ! bulk momentum drag coefficient REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHXY ! bulk sensible heat exchange coefficient REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FWETXY ! wetted or snowed fraction of the canopy (-) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SNEQVOXY ! snow mass at last time step(mm h2o) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ALBOLDXY ! snow albedo at last time step (-) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: QSNOWXY ! snowfall on the ground [mm/s] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: WSLAKEXY ! lake water storage [mm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ZWTXY ! water table depth [m] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: WAXY ! water in the "aquifer" [mm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: WTXY ! groundwater storage [mm] REAL, DIMENSION( ims:ime,-2:0, jms:jme ), INTENT(INOUT) :: TSNOXY ! snow temperature [K] REAL, DIMENSION( ims:ime,-2:NSOIL, jms:jme ), INTENT(INOUT) :: ZSNSOXY ! snow layer depth [m] REAL, DIMENSION( ims:ime,-2:0, jms:jme ), INTENT(INOUT) :: SNICEXY ! snow layer ice [mm] REAL, DIMENSION( ims:ime,-2:0, jms:jme ), INTENT(INOUT) :: SNLIQXY ! snow layer liquid water [mm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: LFMASSXY ! leaf mass [g/m2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: RTMASSXY ! mass of fine roots [g/m2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: STMASSXY ! stem mass [g/m2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: WOODXY ! mass of wood (incl. woody roots) [g/m2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: STBLCPXY ! stable carbon in deep soil [g/m2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FASTCPXY ! short-lived carbon, shallow soil [g/m2] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XLAIXY ! leaf area index REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: XSAIXY ! stem area index REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TAUSSXY ! snow age factor ! OUT (with no Noah LSM equivalent) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: T2MVXY ! 2m temperature of vegetation part REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: T2MBXY ! 2m temperature of bare ground part REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: Q2MVXY ! 2m mixing ratio of vegetation part REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: Q2MBXY ! 2m mixing ratio of bare ground part REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: TRADXY ! surface radiative temperature (k) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: NEEXY ! net ecosys exchange (g/m2/s CO2) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: GPPXY ! gross primary assimilation [g/m2/s C] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: NPPXY ! net primary productivity [g/m2/s C] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FVEGXY ! Noah-MP vegetation fraction [-] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RUNSFXY ! surface runoff [mm/s] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RUNSBXY ! subsurface runoff [mm/s] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: ECANXY ! evaporation of intercepted water (mm/s) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EDIRXY ! soil surface evaporation rate (mm/s] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: ETRANXY ! transpiration rate (mm/s) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FSAXY ! total absorbed solar radiation (w/m2) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: FIRAXY ! total net longwave rad (w/m2) [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: APARXY ! photosyn active energy by canopy (w/m2) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: PSNXY ! total photosynthesis (umol co2/m2/s) [+] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SAVXY ! solar rad absorbed by veg. (w/m2) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SAGXY ! solar rad absorbed by ground (w/m2) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RSSUNXY ! sunlit leaf stomatal resistance (s/m) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: RSSHAXY ! shaded leaf stomatal resistance (s/m) REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: BGAPXY ! between gap fraction REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: WGAPXY ! within gap fraction REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: TGVXY ! under canopy ground temperature[K] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: TGBXY ! bare ground temperature [K] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHVXY ! sensible heat exchange coefficient vegetated REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHBXY ! sensible heat exchange coefficient bare-ground REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SHGXY ! veg ground sen. heat [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SHCXY ! canopy sen. heat [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: SHBXY ! bare sensible heat [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EVGXY ! veg ground evap. heat [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EVBXY ! bare soil evaporation [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: GHVXY ! veg ground heat flux [w/m2] [+ to soil] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: GHBXY ! bare ground heat flux [w/m2] [+ to soil] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: IRGXY ! veg ground net LW rad. [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: IRCXY ! canopy net LW rad. [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: IRBXY ! bare net longwave rad. [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: TRXY ! transpiration [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: EVCXY ! canopy evaporation heat [w/m2] [+ to atm] REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHLEAFXY ! leaf exchange coefficient REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHUCXY ! under canopy exchange coefficient REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHV2XY ! veg 2m exchange coefficient REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT ) :: CHB2XY ! bare 2m exchange coefficient INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & ! d -> domain & ims,ime, jms,jme, kms,kme, & ! m -> memory & its,ite, jts,jte, kts,kte ! t -> tile ! 1D equivalent of 2D/3D fields ! IN only REAL :: COSZ ! cosine zenith angle REAL :: LAT ! latitude [rad] REAL :: Z_ML ! model height [m] INTEGER :: VEGTYP ! vegetation type INTEGER :: SOILTYP ! soil type REAL :: FVEG ! vegetation fraction [-] REAL :: FVGMAX ! annual max vegetation fraction [] REAL :: TBOT ! deep soil temperature [K] REAL :: T_ML ! temperature valid at mid-levels [K] REAL :: Q_ML ! water vapor mixing ratio [kg/kg_dry] REAL :: U_ML ! U wind component [m/s] REAL :: V_ML ! V wind component [m/s] REAL :: SWDN ! solar down at surface [W m-2] REAL :: LWDN ! longwave down at surface [W m-2] REAL :: P_ML ! pressure, valid at interface [Pa] REAL :: PSFC ! surface pressure [Pa] REAL :: PRCP ! precipitation entering land model [mm] ! INOUT (with generic LSM equivalent) REAL :: FSH ! total sensible heat (w/m2) [+ to atm] REAL :: SSOIL ! soil heat heat (w/m2) REAL :: SALB ! surface albedo (-) REAL :: FSNO ! snow cover fraction (-) REAL, DIMENSION( 1:NSOIL) :: SMC ! vol. soil moisture (m3/m3) REAL, DIMENSION( 1:NSOIL) :: SMH2O ! vol. soil liquid water (m3/m3) REAL, DIMENSION(-2:NSOIL) :: STC ! snow/soil tmperatures REAL :: SWE ! snow water equivalent (mm) REAL :: SNDPTH ! snow depth (m) REAL :: EMISSI ! net surface emissivity REAL :: QSFC1D ! bulk surface specific humidity ! INOUT (with no Noah LSM equivalent) INTEGER :: ISNOW ! actual no. of snow layers REAL :: TV ! vegetation canopy temperature REAL :: TG ! ground surface temperature REAL :: CANICE ! canopy-intercepted ice (mm) REAL :: CANLIQ ! canopy-intercepted liquid water (mm) REAL :: EAH ! canopy air vapor pressure (pa) REAL :: TAH ! canopy air temperature (k) REAL :: CM ! momentum drag coefficient REAL :: CH ! sensible heat exchange coefficient REAL :: FWET ! wetted or snowed fraction of the canopy (-) REAL :: SNEQVO ! snow mass at last time step(mm h2o) REAL :: ALBOLD ! snow albedo at last time step (-) REAL :: QSNOW ! snowfall on the ground [mm/s] REAL :: WSLAKE ! lake water storage [mm] REAL :: ZWT ! water table depth [m] REAL :: WA ! water in the "aquifer" [mm] REAL :: WT ! groundwater storage [mm] REAL, DIMENSION(-2:NSOIL) :: ZSNSO ! snow layer depth [m] REAL, DIMENSION(-2: 0) :: SNICE ! snow layer ice [mm] REAL, DIMENSION(-2: 0) :: SNLIQ ! snow layer liquid water [mm] REAL :: LFMASS ! leaf mass [g/m2] REAL :: RTMASS ! mass of fine roots [g/m2] REAL :: STMASS ! stem mass [g/m2] REAL :: WOOD ! mass of wood (incl. woody roots) [g/m2] REAL :: STBLCP ! stable carbon in deep soil [g/m2] REAL :: FASTCP ! short-lived carbon, shallow soil [g/m2] REAL :: PLAI ! leaf area index REAL :: PSAI ! stem area index REAL :: TAUSS ! non-dimensional snow age ! OUT (with no Noah LSM equivalent) REAL :: T2MV ! 2m temperature of vegetation part REAL :: T2MB ! 2m temperature of bare ground part REAL :: Q2MV ! 2m mixing ratio of vegetation part REAL :: Q2MB ! 2m mixing ratio of bare ground part REAL :: TRAD ! surface radiative temperature (k) REAL :: NEE ! net ecosys exchange (g/m2/s CO2) REAL :: GPP ! gross primary assimilation [g/m2/s C] REAL :: NPP ! net primary productivity [g/m2/s C] REAL :: FVEGMP ! greenness vegetation fraction [-] REAL :: RUNSF ! surface runoff [mm/s] REAL :: RUNSB ! subsurface runoff [mm/s] REAL :: ECAN ! evaporation of intercepted water (mm/s) REAL :: ETRAN ! transpiration rate (mm/s) REAL :: ESOIL ! soil surface evaporation rate (mm/s] REAL :: FSA ! total absorbed solar radiation (w/m2) REAL :: FIRA ! total net longwave rad (w/m2) [+ to atm] REAL :: APAR ! photosyn active energy by canopy (w/m2) REAL :: PSN ! total photosynthesis (umol co2/m2/s) [+] REAL :: SAV ! solar rad absorbed by veg. (w/m2) REAL :: SAG ! solar rad absorbed by ground (w/m2) REAL :: RSSUN ! sunlit leaf stomatal resistance (s/m) REAL :: RSSHA ! shaded leaf stomatal resistance (s/m) REAL :: BGAP ! between gap fraction REAL :: WGAP ! within gap fraction REAL :: TGV ! under canopy ground temperature[K] REAL :: TGB ! bare ground temperature [K] REAL :: CHV ! sensible heat exchange coefficient vegetated REAL :: CHB ! sensible heat exchange coefficient bare-ground REAL :: IRC ! canopy net LW rad. [w/m2] [+ to atm] REAL :: IRG ! veg ground net LW rad. [w/m2] [+ to atm] REAL :: SHC ! canopy sen. heat [w/m2] [+ to atm] REAL :: SHG ! veg ground sen. heat [w/m2] [+ to atm] REAL :: EVG ! veg ground evap. heat [w/m2] [+ to atm] REAL :: GHV ! veg ground heat flux [w/m2] [+ to soil] REAL :: IRB ! bare net longwave rad. [w/m2] [+ to atm] REAL :: SHB ! bare sensible heat [w/m2] [+ to atm] REAL :: EVB ! bare evaporation heat [w/m2] [+ to atm] REAL :: GHB ! bare ground heat flux [w/m2] [+ to soil] REAL :: TR ! transpiration [w/m2] [+ to atm] REAL :: EVC ! canopy evaporation heat [w/m2] [+ to atm] REAL :: CHLEAF ! leaf exchange coefficient REAL :: CHUC ! under canopy exchange coefficient REAL :: CHV2 ! veg 2m exchange coefficient REAL :: CHB2 ! bare 2m exchange coefficient ! Intermediate terms REAL :: FPICE ! snow fraction of precip REAL :: FCEV ! canopy evaporation heat (w/m2) [+ to atm] REAL :: FGEV ! ground evaporation heat (w/m2) [+ to atm] REAL :: FCTR ! transpiration heat flux (w/m2) [+ to atm] REAL :: QSNBOT ! snowmelt out bottom of pack [mm/s] REAL :: PONDING ! snowmelt with no pack [mm] REAL :: PONDING1 ! snowmelt with no pack [mm] REAL :: PONDING2 ! snowmelt with no pack [mm] ! Local terms REAL :: FSR ! total reflected solar radiation (w/m2) REAL, DIMENSION(-2:0) :: FICEOLD ! snow layer ice fraction [] REAL :: CO2PP ! CO2 partial pressure [Pa] REAL :: O2PP ! O2 partial pressure [Pa] REAL, DIMENSION(1:NSOIL) :: ZSOIL ! depth to soil interfaces [m] REAL :: FOLN ! nitrogen saturation [%] REAL :: QC ! cloud specific humidity for MYJ [not used] REAL :: PBLH ! PBL height for MYJ [not used] REAL :: DZ8W1D ! model level heights for MYJ [not used] INTEGER :: I INTEGER :: J INTEGER :: K INTEGER :: ICE INTEGER :: SLOPETYP LOGICAL :: IPRINT INTEGER :: ISC ! soil color index INTEGER :: IST ! surface type 1-soil; 2-lake INTEGER :: YEARLEN INTEGER, PARAMETER :: NSNOW = 3 ! number of snow layers fixed to 3 REAL, PARAMETER :: CO2 = 395.e-06 REAL, PARAMETER :: O2 = 0.209 REAL, PARAMETER :: undefined_value = -1.E36 ! ---------------------------------------------------------------------- ! ---------------------------------------------------------------------- CALL NOAHMP_OPTIONS(IDVEG ,IOPT_CRS ,IOPT_BTR ,IOPT_RUN ,IOPT_SFC ,IOPT_FRZ , & IOPT_INF ,IOPT_RAD ,IOPT_ALB ,IOPT_SNF ,IOPT_TBOT, IOPT_STC ) IPRINT = .false. ! debug printout YEARLEN = 365 ! find length of year for phenology (also S Hemisphere) if (mod(YR,4) == 0) then YEARLEN = 366 if (mod(YR,100) == 0) then YEARLEN = 365 if (mod(YR,400) == 0) then YEARLEN = 366 endif endif endif ZSOIL(1) = -DZS(1) ! depth to soil interfaces (<0) [m] DO K = 2, NSOIL ZSOIL(K) = -DZS(K) + ZSOIL(K-1) END DO JLOOP : DO J=jts,jte IF(ITIMESTEP == 1)THEN DO I=its,ite IF((XLAND(I,J)-1.5) >= 0.) THEN ! Open water case IF(XICE(I,J) == 1. .AND. IPRINT) PRINT *,' sea-ice at water point, I=',I,'J=',J SMSTAV(I,J) = 1.0 SMSTOT(I,J) = 1.0 DO K = 1, NSOIL SMOIS(I,K,J) = 1.0 TSLB(I,K,J) = 273.16 ENDDO ELSE IF(XICE(I,J) == 1.) THEN ! Sea-ice case SMSTAV(I,J) = 1.0 SMSTOT(I,J) = 1.0 DO K = 1, NSOIL SMOIS(I,K,J) = 1.0 ENDDO ENDIF ENDIF ENDDO ENDIF ! end of initialization over ocean !----------------------------------------------------------------------- ILOOP : DO I = its, ite IF (XICE(I,J) >= XICE_THRES) THEN ICE = 1 ! Sea-ice point ELSE IF ( IVGTYP(I,J) == ISICE ) THEN ICE = -1 ! Land-ice point ELSE ICE=0 ! Neither sea ice or land ice. ENDIF IF((XLAND(I,J)-1.5) >= 0.) CYCLE ILOOP ! Open water case IF ( ICE == 1) THEN SH2O (i,1:NSOIL,j) = 1.0 XLAIXY(i,j) = 0.01 CYCLE ILOOP ! Skip any processing at sea-ice points ELSE ! 2D to 1D ! IN only COSZ = COSZIN (I,J) ! cos zenith angle [] LAT = XLATIN (I,J) ! latitude [rad] Z_ML = 0.5*DZ8W(I,1,J) ! DZ8W: thickness of full levels; ZLVL forcing height [m] VEGTYP = IVGTYP(I,J) ! vegetation type SOILTYP= ISLTYP(I,J) ! soil type FVEG = VEGFRA(I,J)/100. ! vegetation fraction [0-1] FVGMAX = VEGMAX (I,J)/100. ! Vegetation fraction annual max [0-1] TBOT = TMN(I,J) ! Fixed deep soil temperature for land T_ML = T3D(I,1,J) ! temperature defined at intermediate level [K] Q_ML = QV3D(I,1,J)/(1.0+QV3D(I,1,J)) ! convert from mixing ratio to specific humidity [kg/kg] U_ML = U_PHY(I,1,J) ! u-wind at interface [m/s] V_ML = V_PHY(I,1,J) ! v-wind at interface [m/s] SWDN = SWDOWN(I,J) ! shortwave down from SW scheme [W/m2] LWDN = GLW(I,J) ! total longwave down from LW scheme [W/m2] P_ML =(P8W3D(I,KTS+1,J)+P8W3D(I,KTS,J))*0.5 ! surface pressure defined at intermediate level [Pa] ! consistent with temperature, mixing ratio PSFC = P8W3D(I,1,J) ! surface pressure defined a full levels [Pa] PRCP = RAINBL(I,J)/DT ! timestep precipitation [mm/s] ! IN/OUT fields ISNOW = ISNOWXY (I,J) ! snow layers [] SMC ( 1:NSOIL) = SMOIS (I, 1:NSOIL,J) ! soil total moisture [m3/m3] SMH2O( 1:NSOIL) = SH2O (I, 1:NSOIL,J) ! soil liquid moisture [m3/m3] STC (-NSNOW+1: 0) = TSNOXY (I,-NSNOW+1: 0,J) ! snow temperatures [K] STC ( 1:NSOIL) = TSLB (I, 1:NSOIL,J) ! soil temperatures [K] SWE = SNOW (I,J) ! snow water equivalent [mm] SNDPTH = SNOWH (I,J) ! snow depth [m] QSFC1D = QSFC (I,J) ! INOUT (with no Noah LSM equivalent) TV = TVXY (I,J) ! leaf temperature [K] TG = TGXY (I,J) ! ground temperature [K] CANLIQ = CANLIQXY(I,J) ! canopy liquid water [mm] CANICE = CANICEXY(I,J) ! canopy frozen water [mm] EAH = EAHXY (I,J) ! canopy vapor pressure [Pa] TAH = TAHXY (I,J) ! canopy temperature [K] CM = CMXY (I,J) ! avg. momentum exchange (MP only) [m/s] CH = CHXY (I,J) ! avg. heat exchange (MP only) [m/s] FWET = FWETXY (I,J) ! canopy fraction wet or snow SNEQVO = SNEQVOXY(I,J) ! SWE previous timestep ALBOLD = ALBOLDXY(I,J) ! albedo previous timestep, for snow aging QSNOW = QSNOWXY (I,J) ! snow falling on ground WSLAKE = WSLAKEXY(I,J) ! lake water storage (can be neg.) (mm) ZWT = ZWTXY (I,J) ! depth to water table [m] WA = WAXY (I,J) ! water storage in aquifer [mm] WT = WTXY (I,J) ! water in aquifer&saturated soil [mm] ZSNSO(-NSNOW+1:NSOIL) = ZSNSOXY (I,-NSNOW+1:NSOIL,J) ! depth to layer interface SNICE(-NSNOW+1: 0) = SNICEXY (I,-NSNOW+1: 0,J) ! snow layer ice content SNLIQ(-NSNOW+1: 0) = SNLIQXY (I,-NSNOW+1: 0,J) ! snow layer water content LFMASS = LFMASSXY(I,J) ! leaf mass RTMASS = RTMASSXY(I,J) ! root mass STMASS = STMASSXY(I,J) ! stem mass WOOD = WOODXY (I,J) ! mass of wood (incl. woody roots) [g/m2] STBLCP = STBLCPXY(I,J) ! stable carbon pool FASTCP = FASTCPXY(I,J) ! fast carbon pool PLAI = XLAIXY (I,J) ! leaf area index [-] (no snow effects) PSAI = XSAIXY (I,J) ! stem area index [-] (no snow effects) TAUSS = TAUSSXY (I,J) ! non-dimensional snow age ! Initialized local FICEOLD = 0.0 FICEOLD(ISNOW+1:0) = SNICEXY(I,ISNOW+1:0,J) & ! snow ice fraction /(SNICEXY(I,ISNOW+1:0,J)+SNLIQXY(I,ISNOW+1:0,J)) CO2PP = CO2 * P_ML ! partial pressure co2 [Pa] O2PP = O2 * P_ML ! partial pressure o2 [Pa] FOLN = 1.0 ! for now, set to nitrogen saturation QC = undefined_value ! test dummy value PBLH = undefined_value ! test dummy value ! PBL height DZ8W1D = DZ8W (I,1,J) ! thickness of atmospheric layers SLOPETYP = 1 ! set underground runoff slope term IST = 1 ! MP surface type: 1 = land; 2 = lake ISC = 4 ! soil color: assuming a middle color category ????????? IF(SOILTYP == 14 .AND. XICE(I,J) == 0.) THEN IF(IPRINT) PRINT *, ' SOIL TYPE FOUND TO BE WATER AT A LAND-POINT' IF(IPRINT) PRINT *, i,j,'RESET SOIL in surfce.F' SOILTYP = 7 ENDIF IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. & IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33) THEN VEGTYP = ISURBAN ENDIF IF(VEGTYP == 25) FVEG = 0.0 ! Set playa, lava, sand to bare IF(VEGTYP == 25) PLAI = 0.0 IF(VEGTYP == 26) FVEG = 0.0 ! hard coded for USGS IF(VEGTYP == 26) PLAI = 0.0 IF(VEGTYP == 27) FVEG = 0.0 IF(VEGTYP == 27) PLAI = 0.0 CALL REDPRM (VEGTYP,SOILTYP,SLOPETYP,ZSOIL,NSOIL,ISURBAN) IF ( ICE == -1 ) THEN CALL NOAHMP_GLACIER( I, J, COSZ, NSNOW, NSOIL, DT, & ! IN : Time/Space/Model-related T_ML, P_ML, U_ML, V_ML, Q_ML, SWDN, & ! IN : Forcing PRCP, LWDN, TBOT, Z_ML, FICEOLD, ZSOIL, & ! IN : Forcing QSNOW, SNEQVO, ALBOLD, CM, CH, ISNOW, & ! IN/OUT : SWE, SMC, ZSNSO, SNDPTH, SNICE, SNLIQ, & ! IN/OUT : TGB, STC, SMH2O, TAUSS, QSFC1D, & ! IN/OUT : FSA, FSR, FIRA, FSH, FGEV, SSOIL, & ! OUT : TRAD, ESOIL, RUNSF, RUNSB, SAG, SALB, & ! OUT : QSNBOT,PONDING,PONDING1,PONDING2, T2MB, Q2MB, & ! OUT : EMISSI, FPICE, CHB2 ) ! OUT : FSNO = 1.0 TV = undefined_value ! Output from standard Noah-MP undefined for glacier points TG = TGB CANICE = undefined_value CANLIQ = undefined_value EAH = undefined_value TAH = undefined_value FWET = undefined_value WSLAKE = undefined_value ZWT = undefined_value WA = undefined_value WT = undefined_value LFMASS = undefined_value RTMASS = undefined_value STMASS = undefined_value WOOD = undefined_value STBLCP = undefined_value FASTCP = undefined_value PLAI = undefined_value PSAI = undefined_value T2MV = undefined_value Q2MV = undefined_value NEE = undefined_value GPP = undefined_value NPP = undefined_value FVEGMP = 0.0 ECAN = undefined_value ETRAN = undefined_value APAR = undefined_value PSN = undefined_value SAV = undefined_value RSSUN = undefined_value RSSHA = undefined_value BGAP = undefined_value WGAP = undefined_value TGV = undefined_value CHV = undefined_value CHB = CH IRC = undefined_value IRG = undefined_value SHC = undefined_value SHG = undefined_value EVG = undefined_value GHV = undefined_value IRB = FIRA SHB = FSH EVB = FGEV GHB = SSOIL TR = undefined_value EVC = undefined_value CHLEAF = undefined_value CHUC = undefined_value CHV2 = undefined_value FCEV = undefined_value FCTR = undefined_value QFX(I,J) = ESOIL ELSE goto 1000 if(i==1.and.j==8) then print*,I , J , LAT , YEARLEN , JULIAN , COSZ print*,'DT' print*,DT , DX , DZ8W1D , NSOIL , ZSOIL , 3 print*,'FVEG' print*,FVEG , FVGMAX , VEGTYP , ISURBAN , ICE , IST print*,ISC print*,IZ0TLND print*,'T_ML' print*,T_ML , P_ML , PSFC , U_ML , V_ML , Q_ML print*,'QC' print*,QC , SWDN , LWDN , PRCP , TBOT , CO2PP print*,'O2PP' print*,O2PP , FOLN , FICEOLD , PBLH , Z_ML print*,'ALBOLD' print*,ALBOLD , SNEQVO print*,'STC' print*,STC , SMH2O , SMC , TAH , EAH , FWET print*,'CANLIQ' print*,CANLIQ , CANICE , TV , TG , QSFC1D , QSNOW print*,'ISNOW' print*,ISNOW , ZSNSO , SNDPTH , SWE , SNICE , SNLIQ print*,'ZWT' print*,ZWT , WA , WT , WSLAKE , LFMASS , RTMASS print*,'STMASS' print*,STMASS , WOOD , STBLCP , FASTCP , PLAI , PSAI print*,'CM' print*,CM , CH , TAUSS print*,'FSA' print*,FSA , FSR , FIRA , FSH , SSOIL , FCEV print*,'FGEV' print*,FGEV , FCTR , ECAN , ETRAN , ESOIL , TRAD print*,'TGB' print*, TGB , TGV , T2MV , T2MB print*,'Q2MV' print*, Q2MV , Q2MB , RUNSF , RUNSB , APAR print*,'PSN' print*,PSN , SAV , SAG , FSNO , NEE , GPP print*,'NPP' print*,NPP , FVEGMP , SALB , QSNBOT , PONDING , PONDING1 print*,'PONDING2' print*,PONDING2, RSSUN , RSSHA , BGAP , WGAP print*,'CHV' print*, CHV , CHB , EMISSI end if ! stop999 1000 continue CALL NOAHMP_SFLX (& I , J , LAT , YEARLEN , JULIAN , COSZ , & ! IN : Time/Space-related DT , DX , DZ8W1D , NSOIL , ZSOIL , NSNOW , & ! IN : Model configuration FVEG , FVGMAX , VEGTYP , ISURBAN , ICE , IST , & ! IN : Vegetation/Soil characteristics ISC , & ! IN : Vegetation/Soil characteristics IZ0TLND , & ! IN : User options T_ML , P_ML , PSFC , U_ML , V_ML , Q_ML , & ! IN : Forcing QC , SWDN , LWDN , PRCP , TBOT , CO2PP , & ! IN : Forcing O2PP , FOLN , FICEOLD , PBLH , Z_ML , & ! IN : Forcing ALBOLD , SNEQVO , & ! IN/OUT : STC , SMH2O , SMC , TAH , EAH , FWET , & ! IN/OUT : CANLIQ , CANICE , TV , TG , QSFC1D , QSNOW , & ! IN/OUT : ISNOW , ZSNSO , SNDPTH , SWE , SNICE , SNLIQ , & ! IN/OUT : ZWT , WA , WT , WSLAKE , LFMASS , RTMASS , & ! IN/OUT : STMASS , WOOD , STBLCP , FASTCP , PLAI , PSAI , & ! IN/OUT : CM , CH , TAUSS , & ! IN/OUT : FSA , FSR , FIRA , FSH , SSOIL , FCEV , & ! OUT : FGEV , FCTR , ECAN , ETRAN , ESOIL , TRAD , & ! OUT : TGB , TGV , T2MV , T2MB , Q2MV , Q2MB , & ! OUT : RUNSF , RUNSB , APAR , PSN , SAV , SAG , & ! OUT : FSNO , NEE , GPP , NPP , FVEGMP , SALB , & ! OUT : QSNBOT , PONDING , PONDING1, PONDING2, RSSUN , RSSHA , & ! OUT : BGAP , WGAP , CHV , CHB , EMISSI , & ! OUT : SHG , SHC , SHB , EVG , EVB , GHV , & ! OUT : GHB , IRG , IRC , IRB , TR , EVC , & ! OUT : CHLEAF , CHUC , CHV2 , CHB2 , FPICE ) ! OUT : QFX(I,J) = ECAN + ESOIL + ETRAN ENDIF ! glacial split ends ! INPUT/OUTPUT TSK (I,J) = TRAD HFX (I,J) = FSH LH (I,J) = FCEV + FGEV + FCTR GRDFLX (I,J) = SSOIL SMSTAV (I,J) = 0.0 ! [maintained as Noah consistency] SMSTOT (I,J) = 0.0 ! [maintained as Noah consistency] SFCRUNOFF(I,J) = SFCRUNOFF(I,J) + RUNSF * DT UDRUNOFF (I,J) = UDRUNOFF(I,J) + RUNSB * DT IF ( SALB > -999 ) THEN ALBEDO(I,J) = SALB ENDIF SNOWC (I,J) = FSNO SMOIS (I, 1:NSOIL,J) = SMC ( 1:NSOIL) SH2O (I, 1:NSOIL,J) = SMH2O ( 1:NSOIL) TSLB (I, 1:NSOIL,J) = STC ( 1:NSOIL) SNOW (I,J) = SWE SNOWH (I,J) = SNDPTH CANWAT (I,J) = CANLIQ + CANICE ACSNOW (I,J) = ACSNOW(I,J) + PRCP * FPICE ACSNOM (I,J) = ACSNOM(I,J) + QSNBOT*DT + PONDING + PONDING1 + PONDING2 EMISS (I,J) = EMISSI QSFC (I,J) = QSFC1D ISNOWXY (I,J) = ISNOW TVXY (I,J) = TV TGXY (I,J) = TG CANLIQXY (I,J) = CANLIQ CANICEXY (I,J) = CANICE EAHXY (I,J) = EAH TAHXY (I,J) = TAH CMXY (I,J) = CM CHXY (I,J) = CH FWETXY (I,J) = FWET SNEQVOXY (I,J) = SNEQVO ALBOLDXY (I,J) = ALBOLD QSNOWXY (I,J) = QSNOW WSLAKEXY (I,J) = WSLAKE ZWTXY (I,J) = ZWT WAXY (I,J) = WA WTXY (I,J) = WT TSNOXY (I,-NSNOW+1: 0,J) = STC (-NSNOW+1: 0) ZSNSOXY (I,-NSNOW+1:NSOIL,J) = ZSNSO (-NSNOW+1:NSOIL) SNICEXY (I,-NSNOW+1: 0,J) = SNICE (-NSNOW+1: 0) SNLIQXY (I,-NSNOW+1: 0,J) = SNLIQ (-NSNOW+1: 0) LFMASSXY (I,J) = LFMASS RTMASSXY (I,J) = RTMASS STMASSXY (I,J) = STMASS WOODXY (I,J) = WOOD STBLCPXY (I,J) = STBLCP FASTCPXY (I,J) = FASTCP XLAIXY (I,J) = PLAI XSAIXY (I,J) = PSAI TAUSSXY (I,J) = TAUSS ! OUTPUT T2MVXY (I,J) = T2MV T2MBXY (I,J) = T2MB Q2MVXY (I,J) = Q2MV/(1.0 - Q2MV) ! specific humidity to mixing ratio Q2MBXY (I,J) = Q2MB/(1.0 - Q2MB) ! consistent with registry def of Q2 TRADXY (I,J) = TRAD NEEXY (I,J) = NEE GPPXY (I,J) = GPP NPPXY (I,J) = NPP FVEGXY (I,J) = FVEGMP RUNSFXY (I,J) = RUNSF RUNSBXY (I,J) = RUNSB ECANXY (I,J) = ECAN EDIRXY (I,J) = ESOIL ETRANXY (I,J) = ETRAN FSAXY (I,J) = FSA FIRAXY (I,J) = FIRA APARXY (I,J) = APAR PSNXY (I,J) = PSN SAVXY (I,J) = SAV SAGXY (I,J) = SAG RSSUNXY (I,J) = RSSUN RSSHAXY (I,J) = RSSHA BGAPXY (I,J) = BGAP WGAPXY (I,J) = WGAP TGVXY (I,J) = TGV TGBXY (I,J) = TGB CHVXY (I,J) = CHV CHBXY (I,J) = CHB IRCXY (I,J) = IRC IRGXY (I,J) = IRG SHCXY (I,J) = SHC SHGXY (I,J) = SHG EVGXY (I,J) = EVG GHVXY (I,J) = GHV IRBXY (I,J) = IRB SHBXY (I,J) = SHB EVBXY (I,J) = EVB GHBXY (I,J) = GHB TRXY (I,J) = TR EVCXY (I,J) = EVC CHLEAFXY (I,J) = CHLEAF CHUCXY (I,J) = CHUC CHV2XY (I,J) = CHV2 CHB2XY (I,J) = CHB2 ENDIF ! endif of land-sea test ENDDO ILOOP ! of I loop ENDDO JLOOP ! of J loop !------------------------------------------------------ END SUBROUTINE noahmplsm !------------------------------------------------------ SUBROUTINE NOAHMP_INIT ( MMINLU, SNOW , SNOWH , CANWAT , ISLTYP , & 1,7 TSLB , SMOIS , SH2O , DZS , FNDSOILW , FNDSNOWH , & TSK, isnowxy , tvxy ,tgxy ,canicexy , & canliqxy ,eahxy ,tahxy ,cmxy ,chxy , & fwetxy ,sneqvoxy ,alboldxy ,qsnowxy ,wslakexy ,zwtxy ,waxy , & wtxy ,tsnoxy ,zsnsoxy ,snicexy ,snliqxy ,lfmassxy ,rtmassxy , & stmassxy ,woodxy ,stblcpxy ,fastcpxy ,xsaixy , & !jref:start t2mvxy ,t2mbxy ,chstarxy, & !jref:end NSOIL, restart, & allowed_to_read , & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte ) ! Initializing Canopy air temperature to 287 K seems dangerous to me [KWM]. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & & ims,ime, jms,jme, kms,kme, & & its,ite, jts,jte, kts,kte INTEGER, INTENT(IN) :: NSOIL LOGICAL, INTENT(IN) :: restart, & & allowed_to_read REAL, DIMENSION( NSOIL), INTENT(IN) :: DZS ! Thickness of the soil layers [m] REAL, DIMENSION( ims:ime, NSOIL, jms:jme ) , & & INTENT(INOUT) :: SMOIS, & & SH2O, & & TSLB REAL, DIMENSION( ims:ime, jms:jme ) , & & INTENT(INOUT) :: SNOW, & & SNOWH, & & CANWAT INTEGER, DIMENSION( ims:ime, jms:jme ), & & INTENT(IN) :: ISLTYP LOGICAL, INTENT(IN) :: FNDSOILW, & & FNDSNOWH REAL, DIMENSION(ims:ime,jms:jme), INTENT(IN) :: TSK !skin temperature (k) INTEGER, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: isnowxy !actual no. of snow layers REAL, DIMENSION(ims:ime,-2:NSOIL,jms:jme), INTENT(INOUT) :: zsnsoxy !snow layer depth [m] REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: tsnoxy !snow temperature [K] REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snicexy !snow layer ice [mm] REAL, DIMENSION(ims:ime,-2: 0,jms:jme), INTENT(INOUT) :: snliqxy !snow layer liquid water [mm] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tvxy !vegetation canopy temperature REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tgxy !ground surface temperature REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canicexy !canopy-intercepted ice (mm) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: canliqxy !canopy-intercepted liquid water (mm) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: eahxy !canopy air vapor pressure (pa) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: tahxy !canopy air temperature (k) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: cmxy !momentum drag coefficient REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chxy !sensible heat exchange coefficient REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fwetxy !wetted or snowed fraction of the canopy (-) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: sneqvoxy !snow mass at last time step(mm h2o) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: alboldxy !snow albedo at last time step (-) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: qsnowxy !snowfall on the ground [mm/s] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wslakexy !lake water storage [mm] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: zwtxy !water table depth [m] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: waxy !water in the "aquifer" [mm] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: wtxy !groundwater storage [mm] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: lfmassxy !leaf mass [g/m2] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: rtmassxy !mass of fine roots [g/m2] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stmassxy !stem mass [g/m2] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: woodxy !mass of wood (incl. woody roots) [g/m2] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: stblcpxy !stable carbon in deep soil [g/m2] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: fastcpxy !short-lived carbon, shallow soil [g/m2] REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: xsaixy !stem area index !jref:start REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: t2mvxy !2m temperature vegetation part (k) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: t2mbxy !2m temperature bare ground part (k) REAL, DIMENSION(ims:ime,jms:jme), INTENT(INOUT) :: chstarxy !dummy !jref:end REAL, DIMENSION(1:NSOIL) :: ZSOIL ! Depth of the soil layer bottom (m) from ! the surface (negative) REAL :: BX, SMCMAX, PSISAT REAL, PARAMETER :: BLIM = 5.5 REAL, PARAMETER :: HLICE = 3.335E5 REAL, PARAMETER :: GRAV = 9.81 REAL, PARAMETER :: T0 = 273.15 INTEGER :: errflag character(len=80) :: err_message character(len=4) :: MMINSL character(len=*), intent(in) :: MMINLU MMINSL='STAS' call read_mp_veg_parameters(trim(MMINLU)) ! ! initialize three Noah LSM related tables ! IF ( allowed_to_read ) THEN CALL wrf_message( 'INITIALIZE THREE Noah LSM RELATED TABLES' ) CALL SOIL_VEG_GEN_PARM( MMINLU, MMINSL ) ENDIF IF( .NOT. restart ) THEN itf=min0(ite,ide-1) jtf=min0(jte,jde-1) errflag = 0 DO j = jts,jtf DO i = its,itf IF ( ISLTYP( i,j ) .LT. 1 ) THEN errflag = 1 WRITE(err_message,*)"module_sf_noahlsm.F: lsminit: out of range ISLTYP ",i,j,ISLTYP( i,j ) CALL wrf_message(err_message) ENDIF ENDDO ENDDO IF ( errflag .EQ. 1 ) THEN CALL wrf_error_fatal( "module_sf_noahlsm.F: lsminit: out of range value "// & "of ISLTYP. Is this field in the input?" ) ENDIF #ifdef WRF_CHEM ! ! need this parameter for dust parameterization in wrf/chem ! do I=1,NSLTYPE porosity(i)=maxsmc(i) enddo #endif ! initialize soil liquid water content SH2O DO J = jts , jtf DO I = its , itf BX = BB(ISLTYP(I,J)) SMCMAX = MAXSMC(ISLTYP(I,J)) PSISAT = SATPSI(ISLTYP(I,J)) IF ( ( BX > 0.0 ) .AND. ( SMCMAX > 0.0 ) .AND. ( PSISAT > 0.0 ) ) THEN DO NS=1, NSOIL IF ( TSLB(I,NS,J) < 273.149 ) THEN ! Use explicit as initial soil ice FK=(( (HLICE/(GRAV*(-PSISAT))) * & ((TSLB(I,NS,J)-T0)/TSLB(I,NS,J)) )**(-1/BX) )*SMCMAX FK = MAX(FK, 0.02) SH2O(I,NS,J) = MIN( FK, SMOIS(I,NS,J) ) ELSE SH2O(I,NS,J)=SMOIS(I,NS,J) ENDIF END DO ELSE DO NS=1, NSOIL SH2O(I,NS,J)=SMOIS(I,NS,J) END DO ENDIF ENDDO ENDDO ! ENDIF ! ! initialize physical snow height SNOWH ! IF(.NOT.FNDSNOWH)THEN ! If no SNOWH do the following CALL wrf_message( 'SNOW HEIGHT NOT FOUND - VALUE DEFINED IN LSMINIT' ) DO J = jts,jtf DO I = its,itf SNOWH(I,J)=SNOW(I,J)*0.005 ! SNOW in mm and SNOWH in m ENDDO ENDDO ENDIF DO J = jts,jtf DO I = its,itf tvxy (I,J) = TSK(I,J) tgxy (I,J) = TSK(I,J) CANWAT (I,J) = 0.0 canliqxy (I,J) = CANWAT(I,J) canicexy (I,J) = 0. eahxy (I,J) = 2000. tahxy (I,J) = TSK(I,J) ! tahxy (I,J) = 287. !jref:start t2mvxy (I,J) = TSK(I,J) t2mbxy (I,J) = TSK(I,J) chstarxy (I,J) = 0.1 !jref:end cmxy (I,J) = 0.0 chxy (I,J) = 0.0 fwetxy (I,J) = 0.0 sneqvoxy (I,J) = 0.0 alboldxy (I,J) = 0.65 qsnowxy (I,J) = 0.0 wslakexy (I,J) = 0.0 waxy (I,J) = 4900. !??? wtxy (I,J) = waxy(i,j) !??? zwtxy (I,J) = (25. + 2.0) - waxy(i,j)/1000/0.2 !??? lfmassxy (I,J) = 50. ! stmassxy (I,J) = 50.0 ! rtmassxy (I,J) = 500.0 ! woodxy (I,J) = 500.0 ! stblcpxy (I,J) = 1000.0 ! fastcpxy (I,J) = 1000.0 ! xsaixy (I,J) = 0.1 ! enddo enddo ! Given the soil layer thicknesses (in DZS), initialize the soil layer ! depths from the surface. ZSOIL(1) = -DZS(1) ! negative DO NS=2, NSOIL ZSOIL(NS) = ZSOIL(NS-1) - DZS(NS) END DO ! Initialize snow/soil layer arrays ZSNSOXY, TSNOXY, SNICEXY, SNLIQXY, ! and ISNOWXY CALL snow_init ( ims , ime , jms , jme , its , itf , jts , jtf , 3 , & & NSOIL , zsoil , snow , tgxy , snowh , & & zsnsoxy , tsnoxy , snicexy , snliqxy , isnowxy ) ENDIF END SUBROUTINE NOAHMP_INIT !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ SUBROUTINE SNOW_INIT ( ims , ime , jms , jme , its , itf , jts , jtf , & 1,1 & NSNOW , NSOIL , ZSOIL , SWE , TGXY , SNODEP , & & ZSNSOXY , TSNOXY , SNICEXY ,SNLIQXY , ISNOWXY ) !------------------------------------------------------------------------------------------ ! Initialize snow arrays for Noah-MP LSM, based in input SNOWDEP, NSNOW ! ISNOWXY is an index array, indicating the index of the top snow layer. Valid indices ! for snow layers range from 0 (no snow) and -1 (shallow snow) to (-NSNOW)+1 (deep snow). ! TSNOXY holds the temperature of the snow layer. Snow layers are initialized with ! temperature = ground temperature [?]. Snow-free levels in the array have value 0.0 ! SNICEXY is the frozen content of a snow layer. Initial estimate based on SNODEP and SWE ! SNLIQXY is the liquid content of a snow layer. Initialized to 0.0 ! ZNSNOXY is the layer depth from the surface. !------------------------------------------------------------------------------------------ IMPLICIT NONE !------------------------------------------------------------------------------------------ INTEGER, INTENT(IN) :: ims, ime, jms, jme INTEGER, INTENT(IN) :: its, itf, jts, jtf INTEGER, INTENT(IN) :: NSNOW INTEGER, INTENT(IN) :: NSOIL REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: SWE REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: SNODEP REAL, INTENT(IN), DIMENSION(ims:ime, jms:jme) :: TGXY REAL, INTENT(IN), DIMENSION(1:NSOIL) :: ZSOIL INTEGER, INTENT(OUT), DIMENSION(ims:ime, jms:jme) :: ISNOWXY ! Top snow layer index REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1:NSOIL,jms:jme) :: ZSNSOXY ! Snow/soil layer depth from surface [m] REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: TSNOXY ! Snow layer temperature [K] REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: SNICEXY ! Snow layer ice content [mm] REAL, INTENT(OUT), DIMENSION(ims:ime, -NSNOW+1: 0,jms:jme) :: SNLIQXY ! snow layer liquid content [mm] ! Local variables: ! DZSNO holds the thicknesses of the various snow layers. ! DZSNOSO holds the thicknesses of the various soil/snow layers. INTEGER :: I,J,IZ REAL, DIMENSION(-NSNOW+1: 0) :: DZSNO REAL, DIMENSION(-NSNOW+1:NSOIL) :: DZSNSO !------------------------------------------------------------------------------------------ DO J = jts , jtf DO I = its , itf IF ( SNODEP(I,J) < 0.025 ) THEN ISNOWXY(I,J) = 0 DZSNO(-NSNOW+1:0) = 0. ELSE IF ( ( SNODEP(I,J) >= 0.025 ) .AND. ( SNODEP(I,J) <= 0.05 ) ) THEN ISNOWXY(I,J) = -1 DZSNO(0) = SNODEP(I,J) ELSE IF ( ( SNODEP(I,J) > 0.05 ) .AND. ( SNODEP(I,J) <= 0.10 ) ) THEN ISNOWXY(I,J) = -2 DZSNO(-1) = SNODEP(I,J)/2. DZSNO( 0) = SNODEP(I,J)/2. ELSE IF ( (SNODEP(I,J) > 0.10 ) .AND. ( SNODEP(I,J) <= 0.25 ) ) THEN ISNOWXY(I,J) = -2 DZSNO(-1) = 0.05 DZSNO( 0) = SNODEP(I,J) - DZSNO(-1) ELSE IF ( ( SNODEP(I,J) > 0.25 ) .AND. ( SNODEP(I,J) <= 0.45 ) ) THEN ISNOWXY(I,J) = -3 DZSNO(-2) = 0.05 DZSNO(-1) = 0.5*(SNODEP(I,J)-DZSNO(-2)) DZSNO( 0) = 0.5*(SNODEP(I,J)-DZSNO(-2)) ELSE IF ( SNODEP(I,J) > 0.45 ) THEN ISNOWXY(I,J) = -3 DZSNO(-2) = 0.05 DZSNO(-1) = 0.20 DZSNO( 0) = SNODEP(I,J) - DZSNO(-1) - DZSNO(-2) ELSE CALL wrf_error_fatal("Problem with the logic assigning snow layers.") END IF END IF TSNOXY (I,-NSNOW+1:0,J) = 0. SNICEXY(I,-NSNOW+1:0,J) = 0. SNLIQXY(I,-NSNOW+1:0,J) = 0. DO IZ = ISNOWXY(I,J)+1 , 0 TSNOXY(I,IZ,J) = TGXY(I,J) ! [k] SNLIQXY(I,IZ,J) = 0.00 SNICEXY(I,IZ,J) = 1.00 * DZSNO(IZ) * (SWE(I,J)/SNODEP(I,J)) ! [kg/m3] END DO ! Assign local variable DZSNSO, the soil/snow layer thicknesses, for snow layers DO IZ = ISNOWXY(I,J)+1 , 0 DZSNSO(IZ) = -DZSNO(IZ) END DO ! Assign local variable DZSNSO, the soil/snow layer thicknesses, for soil layers DZSNSO(1) = ZSOIL(1) DO IZ = 2 , NSOIL DZSNSO(IZ) = (ZSOIL(IZ) - ZSOIL(IZ-1)) END DO ! Assign ZSNSOXY, the layer depths, for soil and snow layers ZSNSOXY(I,ISNOWXY(I,J)+1,J) = DZSNSO(ISNOWXY(I,J)+1) DO IZ = ISNOWXY(I,J)+2 , NSOIL ZSNSOXY(I,IZ,J) = ZSNSOXY(I,IZ-1,J) + DZSNSO(IZ) ENDDO END DO END DO END SUBROUTINE SNOW_INIT ! !------------------------------------------------------------------------------------------ !------------------------------------------------------------------------------------------ ! END MODULE module_sf_noahmpdrv