MODULE driverMod ! UW Land Surface Hydrology Group implementation of SAC/SNOW17 model ! modified from NLDAS implementation ! author: Ted Bohn, tbohn@hydro.washington.edu ! Modifications: ! 2007-Dec-05 Added SUFFIX_NEW. TJB ! RCS ID string: $Id: driverMod.f90,v 1.4 2007/12/07 03:09:36 vicadmin Exp $ ! Catchment types use catch_types use modis_types IMPLICIT NONE SAVE ! NetCDF subroutines include 'netcdf.inc' ! Model constants REAL, PARAMETER :: TFREEZ=273.15 REAL, PARAMETER :: LVH2O=2.501000E+6 REAL, PARAMETER :: LSUBS=2.83E+6 REAL, PARAMETER :: SIGMA=5.672E-8 REAL, PARAMETER :: NODATA=1E+20 INTEGER, PARAMETER :: NODATA_INT=-9999 LOGICAL, PARAMETER :: LOCAL = .false. LOGICAL, PARAMETER :: LLANDUSE = .false. LOGICAL, PARAMETER :: LSOIL = .false. REAL, PARAMETER :: LAPSE_RATE = 6.5 ! deg C/km; for snow elevation bands REAL, PARAMETER :: SNOW_WB_ERROR_TOL = 1.0 ! snow water balance error tolerance for warning messages, in mm/day over the model time step REAL, PARAMETER :: EXSAC_WB_ERROR_TOL = 1.0 ! exsac water balance error tolerance for warning messages, in mm/day over the model time step REAL, PARAMETER :: WB_ERROR_TOL = 1.0 ! water balance error tolerance for warning messages, in mm/day over the model time step ! Error-reporting INTEGER :: status ! Input/output filenames CHARACTER(len=200) :: CNTRFL CHARACTER(len=200) :: LSC CHARACTER(len=200) :: VEG_FILE CHARACTER(len=200) :: LAI_FILE CHARACTER(len=200) :: GREEN_FILE CHARACTER(len=200) :: MODIS_ALBVF_FILE CHARACTER(len=200) :: MODIS_ALBNF_FILE CHARACTER(len=200) :: MODIS_ALBNR_FILE CHARACTER(len=200) :: MODIS_ALBVR_FILE CHARACTER(len=200) :: MASK_FILE CHARACTER(len=200) :: UZTWM_FILE CHARACTER(len=200) :: UZFWM_FILE CHARACTER(len=200) :: UZK_FILE CHARACTER(len=200) :: ZPERC_FILE CHARACTER(len=200) :: REXP_FILE CHARACTER(len=200) :: LZTWM_FILE CHARACTER(len=200) :: LZFSM_FILE CHARACTER(len=200) :: LZFPM_FILE CHARACTER(len=200) :: LZSK_FILE CHARACTER(len=200) :: LZPK_FILE CHARACTER(len=200) :: PFREE_FILE CHARACTER(len=200) :: ELEV_FILE CHARACTER(len=200) :: SNOWBAND_FILE CHARACTER(len=200) :: SAC_CONST CHARACTER(len=200) :: SNOW_CONST CHARACTER(len=200) :: PE_SCALE CHARACTER(len=200) :: PE_ADJ CHARACTER(len=200) :: INITIAL ! Name of the initial state file CHARACTER(len=200) :: FORCING ! Path and prefix of the input forcing files CHARACTER(len=200) :: PE ! Path and prefix of the input pe files CHARACTER(len=200) :: RESTART ! Path and prefix of the restart files CHARACTER(len=200) :: RESULT ! Path of the output result files CHARACTER(len=50) :: SUFFIX ! Suffix of current input/output files (".YYYYMM.nc") CHARACTER(len=50) :: SUFFIX_NEW ! Suffix of current input/output files (".YYYYMM.nc") CHARACTER(len=200) :: FORCFILE ! Path and full name of the current forcing file CHARACTER(len=200) :: PEFILE ! Path and full name of the current pe file CHARACTER(len=200) :: RESTFILE ! Path and full name of the current restart file CHARACTER(len=200) :: OUTFILES(6) ! Paths and full names of the current output files ! Input/output netcdf file ids INTEGER :: LSC_NCID INTEGER :: INITIAL_NCID INTEGER :: FORCING_NCID INTEGER :: PE_NCID INTEGER :: RESTART_NCID INTEGER :: OUT_NCIDS(6) ! Other model options CHARACTER(len=10) :: PARAM_TYPE ! Specifies the format of the parameter files; can be 'ascii', 'bin', or 'netcdf' INTEGER :: MODEL_DT REAL :: MODEL_DT_REAL INTEGER :: OUTPUT_DT REAL :: OUTPUT_DT_REAL INTEGER :: MADTT INTEGER :: OUTPUT_STEP_RATIO INTEGER :: YEAR0 INTEGER :: MONTH0 INTEGER :: DAY0 INTEGER :: JULDAY0 INTEGER :: YEAR_FINAL INTEGER :: MONTH_FINAL INTEGER :: DAY_FINAL INTEGER :: IDTS INTEGER :: IDT CHARACTER(len=19) :: MODEL_START_TIME ! Model data dimensions INTEGER :: MAXNSOIL ! Number of soil layers INTEGER :: MAXNSNOW ! Number of soil layers INTEGER :: ylen ! Number of grid rows INTEGER :: xlen ! Number of grid columns INTEGER :: landlen ! Number of active (Land/InBasin) cells in grid INTEGER :: tsteplen ! Number of timesteps in forcing data file INTEGER :: NMONTHS ! Number of timesteps in land surface characteristics file INTEGER :: NADC ! Number of points in area depletion curve INTEGER :: NSNOWCO ! Number of variables in snowco array INTEGER :: NBANDS ! Number of snow elevation bands ! Grid cell geometric attributes REAL :: XLLCORNER ! Longitude of grid cell at lower left corner of grid REAL :: YLLCORNER ! Latitude of grid cell at lower left corner of grid REAL :: cellsize ! size of grid cell, in degrees INTEGER, ALLOCATABLE :: ROW(:,:) ! Grid cell row number (indexed by y,x) INTEGER, ALLOCATABLE :: COL(:,:) ! Grid cell column number (indexed by y,x) REAL, ALLOCATABLE :: LAT(:,:) ! Grid cell latitude (indexed by y,x) REAL, ALLOCATABLE :: LON(:,:) ! Grid cell longitude (indexed by y,x) INTEGER, ALLOCATABLE :: CELLID(:,:) ! Cell ID number (indexed by y,x) INTEGER, ALLOCATABLE :: LANDMASK(:,:)! 1=Land/InBasin, 0=Ocean/OutOfBasin (indexed by y,x) INTEGER, ALLOCATABLE :: Y(:),X(:) ! Y and X values of active (Land/InBasin) grid cells (indexed by cell id) INTEGER, ALLOCATABLE :: LAND(:) ! List of (Y*ylen+X) values of active (Land/InBasin) ! grid cells (indexed by cell id) (used in compression) INTEGER, ALLOCATABLE :: CID(:,:) ! Tile coordinates (indexed by y,x) REAL, ALLOCATABLE :: LATL(:) ! List of latitudes REAL, ALLOCATABLE :: LONL(:) ! List of latitudes ! CLSM parameters type(cat_param_type), ALLOCATABLE :: CP(:) ! Model parameter data structure REAL, ALLOCATABLE :: CGREEN(:,:) ! Climatological Greenness array (Cell index, Month) REAL, ALLOCATABLE :: CLAI(:,:) ! Climatological Leaf Area Index array (Cell index, Month) type(modis_alb_param_type), ALLOCATABLE :: MODIS_PARAM(:,:) ! MODIS albedo parameters type(cat_progn_type), ALLOCATABLE :: CAT_PROGN(:) ! Catchment prognostic variables type(cat_diagn_type), ALLOCATABLE :: CAT_DIAGN(:) ! Catchment diagnostic variables type(met_force_type), ALLOCATABLE :: MET_FORCE(:) ! Forcing variables REAL, ALLOCATABLE :: LAI(:) ! Leaf Area Index array (Cell index) REAL, ALLOCATABLE :: GREEN(:) ! Greenness array (Cell index) ! SAC parameters - 2D LOGICAL :: LREAL8 !!$ REAL, ALLOCATABLE :: UZTWM_2d(:) !!$ REAL, ALLOCATABLE :: UZFWM_2d(:) !!$ REAL, ALLOCATABLE :: UZK_2d(:) !!$ REAL, ALLOCATABLE :: PCTIM_2d(:) !!$ REAL, ALLOCATABLE :: ADIMP_2d(:) !!$ REAL, ALLOCATABLE :: RIVA_2d(:) !!$ REAL, ALLOCATABLE :: ZPERC_2d(:) !!$ REAL, ALLOCATABLE :: REXP_2d(:) !!$ REAL, ALLOCATABLE :: LZTWM_2d(:) !!$ REAL, ALLOCATABLE :: LZFSM_2d(:) !!$ REAL, ALLOCATABLE :: LZFPM_2d(:) !!$ REAL, ALLOCATABLE :: LZSK_2d(:) !!$ REAL, ALLOCATABLE :: LZPK_2d(:) !!$ REAL, ALLOCATABLE :: PFREE_2d(:) !!$ REAL, ALLOCATABLE :: SIDE_2d(:) !!$ REAL, ALLOCATABLE :: RSERV_2d(:) ! SNOW17 parameters - 2D REAL, ALLOCATABLE :: SCF_2d(:) REAL, ALLOCATABLE :: MFMAX_2d(:) REAL, ALLOCATABLE :: MFMIN_2d(:) REAL, ALLOCATABLE :: UADJ_2d(:) REAL, ALLOCATABLE :: SI_2d(:) REAL, ALLOCATABLE :: NMF_2d(:) REAL, ALLOCATABLE :: TIPM_2d(:) REAL, ALLOCATABLE :: MBASE_2d(:) REAL, ALLOCATABLE :: PXTEMP_2d(:) REAL, ALLOCATABLE :: PLWHC_2d(:) REAL, ALLOCATABLE :: DAYGM_2d(:) REAL, ALLOCATABLE :: ELEV_2d(:) REAL, ALLOCATABLE :: ADC_2d(:,:) ! PE Scale/adjustment factors - 2D REAL, ALLOCATABLE :: PESCALE_2d(:) REAL, ALLOCATABLE :: PEADJ_2d(:,:) ! SAC State Variables - 2D REAL, ALLOCATABLE :: UZTWC_2d(:,:) REAL, ALLOCATABLE :: UZFWC_2d(:,:) REAL, ALLOCATABLE :: LZTWC_2d(:,:) REAL, ALLOCATABLE :: LZFSC_2d(:,:) REAL, ALLOCATABLE :: LZFPC_2d(:,:) REAL, ALLOCATABLE :: ADIMC_2d(:,:) ! SNOW17 State Variables - 2D REAL, ALLOCATABLE :: SNOWH(:,:) REAL, ALLOCATABLE :: SNEQV(:,:) REAL, ALLOCATABLE :: SNOWCO(:,:,:) ! SAC STATE VARS - 1D REAL :: UZTWC,UZFWC,LZTWC,LZFSC,LZFPC,ADIMC ! SNOW17 STATE VARS - 1D REAL :: CS(19) ! Snow elevation band parameters REAL, ALLOCATABLE :: band_elev(:,:) REAL, ALLOCATABLE :: band_area(:,:) REAL, ALLOCATABLE :: band_prec(:,:) REAL, ALLOCATABLE :: Tfactor(:,:) REAL, ALLOCATABLE :: Pfactor(:,:) ! SAC PARAMETERS - 1D REAL :: UZTWM,UZFWM,UZK,PCTIM,ADIMP,RIVA,ZPERC,REXP, & LZTWM,LZFSM,LZFPM,LZSK,LZPK,PFREE,SIDE,RSERV ! SNOW17 PARAMETERS - 1D REAL :: ALAT,SCF,MFMAX,MFMIN,UADJ,SI,NMF,TIPM,MBASE,PXTEMP,PLWHC,DAYGM,ELEV REAL :: ADC(11) ! Forcing variables INTEGER :: FORCING_DT REAL :: FORCING_DT_REAL INTEGER :: FORCING_START_YEAR INTEGER :: FORCING_START_MONTH INTEGER :: FORCING_START_DAY INTEGER :: FORCING_START_HOUR INTEGER :: FORCING_START_MIN INTEGER :: FORCING_START_SEC CHARACTER(len=19) :: FORCING_START_TIME ! If COMP_FORCING is FALSE, data from the FORCING file ! will be read into 2-d arrays and then converted to the ! 1-d compressed arrays that are used by the model. LOGICAL :: COMP_FORCING LOGICAL :: LLSRAINF LOGICAL :: LWIND2d INTEGER :: PE_START_YEAR INTEGER :: PE_START_MONTH INTEGER :: PE_START_DAY INTEGER :: PE_START_HOUR INTEGER :: PE_START_MIN INTEGER :: PE_START_SEC CHARACTER(len=19) :: PE_START_TIME ! If COMP_PE is FALSE, data from the PE file ! will be read into 2-d arrays and then converted to the ! 1-d compressed arrays that are used by the model. LOGICAL :: COMP_PE REAL, ALLOCATABLE :: SWdownminus(:) REAL, ALLOCATABLE :: LWdownminus(:) REAL, ALLOCATABLE :: Tairminus(:) REAL, ALLOCATABLE :: Qairminus(:) REAL, ALLOCATABLE :: Rainfminus(:) REAL, ALLOCATABLE :: Snowfminus(:) REAL, ALLOCATABLE :: PSurfminus(:) REAL, ALLOCATABLE :: Windminus(:) REAL, ALLOCATABLE :: PotEvapminus(:,:) REAL, ALLOCATABLE :: SWdownnow(:) REAL, ALLOCATABLE :: LWdownnow(:) REAL, ALLOCATABLE :: Tairnow(:) REAL, ALLOCATABLE :: Qairnow(:) REAL, ALLOCATABLE :: Rainfnow(:) REAL, ALLOCATABLE :: Snowfnow(:) REAL, ALLOCATABLE :: PSurfnow(:) REAL, ALLOCATABLE :: Windnow(:) REAL, ALLOCATABLE :: PotEvapnow(:,:) REAL, ALLOCATABLE :: SWdownplus(:) REAL, ALLOCATABLE :: LWdownplus(:) REAL, ALLOCATABLE :: Tairplus(:) REAL, ALLOCATABLE :: Qairplus(:) REAL, ALLOCATABLE :: Rainfplus(:) REAL, ALLOCATABLE :: Snowfplus(:) REAL, ALLOCATABLE :: PSurfplus(:) REAL, ALLOCATABLE :: Windplus(:) REAL, ALLOCATABLE :: PotEvapplus(:,:) REAL, ALLOCATABLE :: DT_TAIR(:) REAL, ALLOCATABLE :: DT_SPFH(:) REAL, ALLOCATABLE :: DT_PSFC(:) REAL, ALLOCATABLE :: DT_WIND(:) REAL, ALLOCATABLE :: DT_LWDN(:) REAL, ALLOCATABLE :: DT_SOLDN(:) REAL, ALLOCATABLE :: DT_SOLDNB(:) REAL, ALLOCATABLE :: DT_PRCP(:) REAL, ALLOCATABLE :: DT_RAIN(:) REAL, ALLOCATABLE :: DT_SNOW(:) REAL, ALLOCATABLE :: DT_EDMND(:,:) REAL, ALLOCATABLE :: TPREV(:) REAL, ALLOCATABLE :: Z(:) ! Intermediate variables (used for i/o with exsnow19 and exsac subroutines) ! REAL, ALLOCATABLE :: SNCOVR(:) ! REAL, ALLOCATABLE :: SNOALB(:) ! REAL, ALLOCATABLE :: ALBEDO_D(:) ! REAL, ALLOCATABLE :: FFROZP(:) REAL, ALLOCATABLE :: CZMODEL(:) ! REAL, ALLOCATABLE :: DT_SOLNET(:) REAL, ALLOCATABLE :: SoilMoistTotal(:) REAL, ALLOCATABLE :: SoilMoistTotal_old(:) REAL, ALLOCATABLE :: SWE_old(:) ! REAL, ALLOCATABLE :: ALB_TOT(:) ! Output variables INTEGER :: VARIDS(6,30) ! If COMP_OUTPUT is FALSE, output data will be ! converted from the 1- or 2-d compressed arrays that are used by the model ! into 2- or 3-d arrays that are written to the OUTPUT files LOGICAL :: COMP_OUTPUT ! REAL, ALLOCATABLE :: SWnet(:) ! REAL, ALLOCATABLE :: LWnet(:) ! REAL, ALLOCATABLE :: Qle(:) ! REAL, ALLOCATABLE :: Qh(:) ! REAL, ALLOCATABLE :: Qg(:) ! REAL, ALLOCATABLE :: Qf(:) ! REAL, ALLOCATABLE :: Qv(:) ! REAL, ALLOCATABLE :: Qa(:) ! REAL, ALLOCATABLE :: DelSurfHeat(:) ! REAL, ALLOCATABLE :: DelColdCont(:) REAL, ALLOCATABLE :: Snowf(:) REAL, ALLOCATABLE :: Rainf(:) REAL, ALLOCATABLE :: Evap(:) REAL, ALLOCATABLE :: Qs(:) REAL, ALLOCATABLE :: Qsb(:) REAL, ALLOCATABLE :: Qsm(:) REAL, ALLOCATABLE :: Qfz(:) REAL, ALLOCATABLE :: Qst(:) REAL, ALLOCATABLE :: DelSoilMoist(:) REAL, ALLOCATABLE :: DelSWE(:) REAL, ALLOCATABLE :: DelSurfStor(:) REAL, ALLOCATABLE :: DelIntercept(:) ! REAL, ALLOCATABLE :: SnowT(:) ! REAL, ALLOCATABLE :: VegT(:) ! REAL, ALLOCATABLE :: BareSoilT(:) REAL, ALLOCATABLE :: AvgSurfT(:) REAL, ALLOCATABLE :: RadT(:) ! REAL, ALLOCATABLE :: Albedo(:) REAL, ALLOCATABLE :: SWE(:) REAL, ALLOCATABLE :: SWEVeg(:) REAL, ALLOCATABLE :: SurfStor(:) REAL, ALLOCATABLE :: SoilMoist(:,:) ! REAL, ALLOCATABLE :: SoilTemp(:,:) ! REAL, ALLOCATABLE :: SMLiqFrac(:,:) ! REAL, ALLOCATABLE :: SMFrozFrac(:,:) REAL, ALLOCATABLE :: SoilWet(:) REAL, ALLOCATABLE :: PotEvap(:) REAL, ALLOCATABLE :: CanEvap(:) REAL, ALLOCATABLE :: Transp(:) REAL, ALLOCATABLE :: BareEvap(:) ! REAL, ALLOCATABLE :: TVeg(:) ! REAL, ALLOCATABLE :: ESoil(:) ! REAL, ALLOCATABLE :: EWater(:) ! REAL, ALLOCATABLE :: RootMoist(:) REAL, ALLOCATABLE :: CanopInt(:) ! REAL, ALLOCATABLE :: EvapSnow(:) ! REAL, ALLOCATABLE :: SubSnow(:) ! REAL, ALLOCATABLE :: SubSurf(:) ! REAL, ALLOCATABLE :: ACond(:) ! REAL, ALLOCATABLE :: SnowFrac(:) ! REAL, ALLOCATABLE :: Fdepth(:) ! REAL, ALLOCATABLE :: Tdepth(:) ! REAL, ALLOCATABLE :: SAlbedo(:) REAL, ALLOCATABLE :: SnowDepth(:) END MODULE driverMod