diff --git a/build/FUSE_SRC/dshare/model_defn.f90 b/build/FUSE_SRC/dshare/model_defn.f90 deleted file mode 100644 index 9a0c80a..0000000 --- a/build/FUSE_SRC/dshare/model_defn.f90 +++ /dev/null @@ -1,74 +0,0 @@ -! --------------------------------------------------------------------------------------- -! Creator: -! -------- -! Martyn Clark -! Modified by Brian Henn to include snow model, 6/2013 -! --------------------------------------------------------------------------------------- -MODULE model_defn - USE nrtype - ! FUSE version - character(*),parameter::FUSE_version="FUSE 1.0" - logical,parameter::FUSE_enabled=.true. - ! list of combinations in each model component - INTEGER, PARAMETER :: NDEC = 9 ! number of model decisions - TYPE DESC - CHARACTER(LEN=16) :: MCOMPONENT ! description of model component - END TYPE DESC - TYPE(DESC), DIMENSION(2) :: LIST_RFERR ! rainfall error - TYPE(DESC), DIMENSION(3) :: LIST_ARCH1 ! upper-layer architecture - TYPE(DESC), DIMENSION(4) :: LIST_ARCH2 ! lower-layer architecture - TYPE(DESC), DIMENSION(3) :: LIST_QSURF ! surface runoff - TYPE(DESC), DIMENSION(3) :: LIST_QPERC ! percolation - TYPE(DESC), DIMENSION(2) :: LIST_ESOIL ! evaporation - TYPE(DESC), DIMENSION(2) :: LIST_QINTF ! interflow - TYPE(DESC), DIMENSION(2) :: LIST_Q_TDH ! time delay in runoff - TYPE(DESC), DIMENSION(2) :: LIST_SNOWM ! snow model - ! structure that holds (x) unique combinations - TYPE UMODEL - INTEGER(I4B) :: MODIX ! model index - CHARACTER(LEN=256) :: MNAME ! model name -! CHARACTER(LEN=16) :: RFERR ! rainfall error - INTEGER(I4B) :: iRFERR -! CHARACTER(LEN=16) :: ARCH1 ! upper-layer architecture - INTEGER(I4B) :: iARCH1 -! CHARACTER(LEN=16) :: ARCH2 ! lower-layer architecture - INTEGER(I4B) :: iARCH2 -! CHARACTER(LEN=16) :: QSURF ! surface runoff - INTEGER(I4B) :: iQSURF -! CHARACTER(LEN=16) :: QPERC ! percolation - INTEGER(I4B) :: iQPERC -! CHARACTER(LEN=16) :: ESOIL ! evaporation - INTEGER(I4B) :: iESOIL -! CHARACTER(LEN=16) :: QINTF ! interflow - INTEGER(I4B) :: iQINTF -! CHARACTER(LEN=16) :: Q_TDH ! time delay in runoff - INTEGER(I4B) :: iQ_TDH - INTEGER(I4B) :: iSNOWM ! snow - END TYPE UMODEL - ! structure to hold model state names - TYPE SNAMES -! CHARACTER(LEN=8) :: SNAME ! state name - INTEGER(I4B) :: iSNAME ! integer value of state name - END TYPE SNAMES - ! structure to hold model flux names - TYPE FNAMES - CHARACTER(LEN=16) :: FNAME ! state name - END TYPE FNAMES -! max steps in routing function - INTEGER(I4B),PARAMETER::NTDH_MAX=500 -! model definitions - CHARACTER(LEN=256) :: FNAME_NETCDF_RUNS ! NETCDF output filename for model runs - CHARACTER(LEN=256) :: FNAME_NETCDF_PARA ! NETCDF output filename for model parameters - CHARACTER(LEN=256) :: FNAME_NETCDF_PARA_SCE ! NETCDF output filename for model parameters produced by SCE - CHARACTER(LEN=256) :: FNAME_NETCDF_PARA_PRE ! NETCDF filename for pre-defined model parameters set - CHARACTER(LEN=256) :: FNAME_PREFIX ! prefix for desired output files - CHARACTER(LEN=256) :: FNAME_TEMPRY ! prefix for temporary output files - CHARACTER(LEN=256) :: FNAME_ASCII ! ASCII output filename - TYPE(UMODEL),DIMENSION(5000) :: AMODL ! (model definition -- all) - TYPE(UMODEL) :: SMODL ! (model definition -- single model) - TYPE(SNAMES),DIMENSION(7) :: CSTATE ! (list of model states for SMODL) - INTEGER(I4B) :: NSTATE=0 ! number of model states - TYPE(FNAMES),DIMENSION(50) :: C_FLUX ! (list of model fluxes for SMODL) - INTEGER(I4B) :: N_FLUX=0 ! number of model fluxes - ! -------------------------------------------------------------------------------------- -END MODULE model_defn diff --git a/build/FUSE_SRC/dshare/multiforce.f90 b/build/FUSE_SRC/dshare/multiforce.f90 deleted file mode 100644 index 90d6ec6..0000000 --- a/build/FUSE_SRC/dshare/multiforce.f90 +++ /dev/null @@ -1,160 +0,0 @@ -! --------------------------------------------------------------------------------------- -! Creator: -! -------- -! Martyn Clark -! Modified by Brian Henn to include snow model, 6/2013 -! Modified by Nans Addor to enable distributed modeling, 9/2016 -! Modified by Cyril Thébault to allow different metrics as objective function, 2024 -! --------------------------------------------------------------------------------------- -MODULE multiforce - USE nrtype - SAVE - ! -------------------------------------------------------------------------------------- - ! the time data structure (will have no spatial dimension) - TYPE TDATA - INTEGER(I4B) :: IY ! year - INTEGER(I4B) :: IM ! month - INTEGER(I4B) :: ID ! day - INTEGER(I4B) :: IH ! hour - INTEGER(I4B) :: IMIN ! minute - REAL(SP) :: DSEC ! second - REAL(SP) :: DTIME ! time in seconds since year dot - ENDTYPE TDATA - ! the response structure (will not have a spatial dimension) - TYPE VDATA - REAL(SP) :: OBSQ ! observed runoff (mm day-1) - END TYPE VDATA - ! ancillary forcing variables used to compute ET (will have a spatial dimension) - TYPE ADATA - REAL(SP) :: AIRTEMP ! air temperature (K) - REAL(SP) :: SPECHUM ! specific humidity (g/g) - REAL(SP) :: AIRPRES ! air pressure (Pa) - REAL(SP) :: SWDOWN ! downward sw radiation (W m-2) - REAL(SP) :: NETRAD ! net radiation (W m-2) - END TYPE ADATA - ! the forcing data structure (will have a spatial dimension) - TYPE FDATA - REAL(SP) :: PPT ! water input: rain + melt (mm day-1) - REAL(SP) :: TEMP ! temperature for snow model (deg.C) - REAL(SP) :: PET ! energy input: potential ET (mm day-1) - ENDTYPE FDATA - ! -------------------------------------------------------------------------------------- - ! general - INTEGER(I4B),PARAMETER :: STRLEN=256 ! length of the character string - ! time data structures - TYPE(tData) :: timDat ! model time structure - ! response data structures - TYPE(vData) :: valDat ! validation structure - TYPE(vData), DIMENSION(:,:,:), POINTER :: aValid ! all model validation data - ! forcing data structures - TYPE(FDATA), DIMENSION(:), POINTER :: CFORCE ! COPY of model forcing data - TYPE(FDATA), DIMENSION(:), POINTER :: AFORCE ! all model forcing data - TYPE(FDATA) :: MFORCE ! model forcing data for a single time step - TYPE(fData), DIMENSION(:,:), POINTER :: gForce ! model forcing data for a 2-d grid - TYPE(aData), DIMENSION(:,:), POINTER :: ancilF ! ancillary forcing data for the 2-d grid - TYPE(fData), DIMENSION(:,:,:), POINTER :: gForce_3d ! model forcing data for a 3-d grid (time as 3rd dimension) - TYPE(aData), DIMENSION(:,:,:), POINTER :: ancilF_3d ! ancillary forcing data for the 3-d grid - - ! timing information - note that numtim_in >= numtim_sim >= numtim_sub - CHARACTER(len=20) :: date_start_input ! date start input time series - CHARACTER(len=20) :: date_end_input ! date end input time series - - INTEGER(i4b) :: numtim_in=-1 ! number of time steps of input (atmospheric forcing) - INTEGER(i4b) :: numtim_sim=-1 ! number of time steps of FUSE simulations (including spin-up) - INTEGER(i4b) :: numtim_sub=-1 ! number of time steps of subperiod (will be kept in memory) - INTEGER(i4b) :: numtim_sub_cur=-1 ! number of time steps of current subperiod (allows for the last subperiod to be shorter) - INTEGER(i4b) :: itim_in=-1 ! indice within numtim_in - INTEGER(i4b) :: itim_sim=-1 ! indice within numtim_sim - INTEGER(i4b) :: itim_sub=-1 ! indice within numtim_sub - - INTEGER(i4b) :: sim_beg=-1 ! index for the start of the simulation in fuse_metric - INTEGER(i4b) :: sim_end=-1 ! index for the end of the simulation in fuse_metric - INTEGER(i4b) :: eval_beg=-1 ! index for the start of evaluation period - INTEGER(i4b) :: eval_end=-1 ! index for the end of the inference period - - INTEGER(i4b) :: istart=-1 ! index for start of inference period (in reduced array) - REAL(sp) :: jdayRef ! reference time (days) - REAL(sp) :: deltim=-1._dp ! length of time step (days) - - LOGICAL(LGT) :: SUB_PERIODS_FLAG ! .true. if subperiods are used to run FUSE - - ! dimension information - INTEGER(i4b) :: startSpat2=-1 ! number of points in 1st spatial dimension - INTEGER(i4b) :: nSpat1=-1 ! number of points in 1st spatial dimension - INTEGER(i4b) :: nSpat2=-1 ! number of points in 2nd spatial dimension - LOGICAL(LGT) :: GRID_FLAG ! spatial flag .true. if grid - REAL(sp) :: xlon ! longitude (degrees) for PET computation - REAL(sp) :: ylat ! latitude (degrees) for PET computation - REAL(sp),dimension(:),allocatable :: latitude ! latitude (degrees) - REAL(sp),dimension(:),allocatable :: longitude ! longitude (degrees) - CHARACTER(len=strLen),dimension(:),allocatable :: name_psets ! name of parameter sets - INTEGER(I4B) :: NUMPSET ! number of parameter sets - REAL(sp),dimension(:),allocatable :: time_steps ! time steps (days) - REAL(sp),dimension(:),allocatable :: julian_day_input ! time steps (julian days) - CHARACTER(len=strLen) :: latUnits ! units string for latitude - CHARACTER(len=strLen) :: lonUnits ! units string for longitude - CHARACTER(len=strLen) :: timeUnits ! units string for time - - ! filename - CHARACTER(len=StrLen) :: forcefile='undefined' ! name of forcing file - - ! name of time variables - CHARACTER(len=StrLen) :: vname_iy ='undefined' ! name of variable for year - CHARACTER(len=StrLen) :: vname_im ='undefined' ! name of variable for month - CHARACTER(len=StrLen) :: vname_id ='undefined' ! name of variable for day - CHARACTER(len=StrLen) :: vname_ih ='undefined' ! name of variable for hour - CHARACTER(len=StrLen) :: vname_imin ='undefined' ! name of variable for minute - CHARACTER(len=StrLen) :: vname_dsec ='undefined' ! name of variable for second - CHARACTER(len=StrLen) :: vname_dtime='undefined' ! name of variable for time - - ! number of forcing variables - INTEGER(i4b), PARAMETER :: nForce=7 ! see lines below - INTEGER(i4b) :: nInput=3 ! number of variable to retrieve from input file - - ! forcing variable names - CHARACTER(len=StrLen) :: vname_aprecip='undefined' ! variable name: precipitation - CHARACTER(len=StrLen) :: vname_potevap='undefined' ! variable name: potential ET - CHARACTER(len=StrLen) :: vname_airtemp='undefined' ! variable name: temperature - CHARACTER(len=StrLen) :: vname_q ='undefined' ! variable name: observed runoff - CHARACTER(len=StrLen) :: vname_spechum='undefined' ! variable name: specific humidity - CHARACTER(len=StrLen) :: vname_airpres='undefined' ! variable name: surface pressure - CHARACTER(len=StrLen) :: vname_swdown ='undefined' ! variable name: downward shortwave radiation - - ! indices for forcing variables - INTEGER(i4b),PARAMETER :: ilook_aprecip=1 ! named element in lCheck - INTEGER(i4b),PARAMETER :: ilook_potevap=2 ! named element in lCheck - INTEGER(i4b),PARAMETER :: ilook_airtemp=3 ! named element in lCheck - INTEGER(i4b),PARAMETER :: ilook_q=4 ! named element in lCheck - INTEGER(i4b),PARAMETER :: ilook_spechum=5 ! named element in lCheck - INTEGER(i4b),PARAMETER :: ilook_airpres=6 ! named element in lCheck - INTEGER(i4b),PARAMETER :: ilook_swdown =7 ! named element in lCheck - - ! NetCDF - INTEGER(i4b) :: ncid_forc=-1 ! NetCDF forcing file ID - INTEGER(i4b),DIMENSION(nForce) :: ncid_var ! NetCDF forcing variable ID - - ! indices for time data (only used in ASCII files) - INTEGER(i4b) :: ivarid_iy=-1 ! variable ID for year - INTEGER(i4b) :: ivarid_im=-1 ! variable ID for month - INTEGER(i4b) :: ivarid_id=-1 ! variable ID for day - INTEGER(i4b) :: ivarid_ih=-1 ! variable ID for hour - INTEGER(i4b) :: ivarid_imin=-1 ! variable ID for minute - INTEGER(i4b) :: ivarid_dsec=-1 ! variable ID for second - - ! indices for variables - INTEGER(i4b) :: ivarid_ppt=-1 ! variable ID for precipitation - INTEGER(i4b) :: ivarid_temp=-1 ! variable ID for temperature - INTEGER(i4b) :: ivarid_pet=-1 ! variable ID for potential ET - INTEGER(i4b) :: ivarid_q=-1 ! variable ID for runoff - - ! multipliers for variables to convert fluxes to mm/day - REAL(sp) :: amult_ppt=-1._dp ! convert precipitation to mm/day - REAL(sp) :: amult_pet=-1._dp ! convert potential ET to mm/day - REAL(sp) :: amult_q=-1._dp ! convert runoff to mm/day - - ! missing values - INTEGER(I4B),PARAMETER :: NA_VALUE=-9999 ! integer designating missing values - TODO: retrieve from NetCDF file - REAL(SP),PARAMETER :: NA_VALUE_SP=-9999 ! integer designating missing values - TODO: retrieve from NetCDF file - - ! -------------------------------------------------------------------------------------- -END MODULE multiforce diff --git a/build/FUSE_SRC/dshare/multiroute.f90 b/build/FUSE_SRC/dshare/multiroute.f90 deleted file mode 100644 index f9d046b..0000000 --- a/build/FUSE_SRC/dshare/multiroute.f90 +++ /dev/null @@ -1,13 +0,0 @@ -MODULE multiroute - USE nrtype - USE model_defn,ONLY:NTDH_MAX - TYPE RUNOFF - REAL(SP) :: Q_INSTNT ! instantaneous runoff - REAL(SP) :: Q_ROUTED ! routed runoff - REAL(SP) :: Q_ACCURATE ! "accurate" runoff estimate (mm day-1) - END TYPE RUNOFF - REAL(SP), DIMENSION(NTDH_MAX) :: FUTURE ! runoff placed in future time steps - TYPE(RUNOFF), DIMENSION(:), POINTER :: AROUTE ! runoff for all time steps - TYPE(RUNOFF),dimension(:,:,:), allocatable :: AROUTE_3d ! runoff for all time steps on a grid - TYPE(RUNOFF) :: MROUTE ! runoff for one time step -END MODULE multiroute diff --git a/build/FUSE_SRC/dshare/multistate.f90 b/build/FUSE_SRC/dshare/multistate.f90 deleted file mode 100644 index 51c563c..0000000 --- a/build/FUSE_SRC/dshare/multistate.f90 +++ /dev/null @@ -1,53 +0,0 @@ -MODULE multistate - USE nrtype - ! -------------------------------------------------------------------------------------- - ! model state structure - ! -------------------------------------------------------------------------------------- - TYPE STATEV - ! snow layer - REAL(SP) :: SWE_TOT ! total storage as snow (mm) - ! upper layer - REAL(SP) :: WATR_1 ! total storage in layer1 (mm) - REAL(SP) :: TENS_1 ! tension storage in layer1 (mm) - REAL(SP) :: FREE_1 ! free storage in layer 1 (mm) - REAL(SP) :: TENS_1A ! storage in the recharge zone (mm) - REAL(SP) :: TENS_1B ! storage in the lower zone (mm) - ! lower layer - REAL(SP) :: WATR_2 ! total storage in layer2 (mm) - REAL(SP) :: TENS_2 ! tension storage in layer2 (mm) - REAL(SP) :: FREE_2 ! free storage in layer2 (mm) - REAL(SP) :: FREE_2A ! storage in the primary resvr (mm) - REAL(SP) :: FREE_2B ! storage in the secondary resvr (mm) - END TYPE STATEV - ! -------------------------------------------------------------------------------------- - ! model time structure - ! -------------------------------------------------------------------------------------- - TYPE M_TIME - REAL(SP) :: STEP ! (time interval to advance model states) - END TYPE M_TIME - ! -------------------------------------------------------------------------------------- - ! variable definitions - ! -------------------------------------------------------------------------------------- - type(statev),dimension(:,:),pointer :: gState ! (grid of model states) - type(statev),dimension(:,:,:),pointer :: gState_3d ! (grid of model states with a time dimension) - TYPE(STATEV) :: ASTATE ! (model states at the start of full timestep) - TYPE(STATEV) :: FSTATE ! (model states at start of sub-timestep) - TYPE(STATEV) :: MSTATE ! (model states at start/middle of sub-timestep) - TYPE(STATEV) :: TSTATE ! (temporary copy of model states) - TYPE(STATEV) :: BSTATE ! (temporary copy of model states) - TYPE(STATEV) :: ESTATE ! (temporary copy of model states) - TYPE(STATEV) :: DSTATE ! (default model states) - TYPE(STATEV) :: DYDT_0 ! (derivative of model states at start of sub-step) - TYPE(STATEV) :: DYDT_1 ! (derivative of model states at end of sub-step) - TYPE(STATEV) :: DY_DT ! (derivative of model states) - TYPE(STATEV) :: DYDT_OLD ! (derivative of model states for final solution) - TYPE(M_TIME) :: HSTATE ! (time interval to advance model states) - ! -------------------------------------------------------------------------------------- - - ! NetCDF - integer(i4b) :: ncid_out=-1 ! NetCDF output file ID - - ! initial store fraction (initialization) - real(sp),parameter::fracState0=0.25_sp - -END MODULE multistate diff --git a/build/FUSE_SRC/prelim/bucketsize.f90 b/build/FUSE_SRC/prelim/bucketsize.f90 index cfcb526..0afbd0e 100644 --- a/build/FUSE_SRC/prelim/bucketsize.f90 +++ b/build/FUSE_SRC/prelim/bucketsize.f90 @@ -12,6 +12,7 @@ SUBROUTINE BUCKETSIZE() ! ----------------- ! MODULE multiparam -- bucket sizes stored in MODULE multiparam ! --------------------------------------------------------------------------------------- +USE nrtype USE multiparam ! model parameters IMPLICIT NONE ! --------------------------------------------------------------------------------------- diff --git a/build/FUSE_SRC/prelim/init_state.f90 b/build/FUSE_SRC/prelim/init_state.f90 index ea88d82..c5a4f41 100644 --- a/build/FUSE_SRC/prelim/init_state.f90 +++ b/build/FUSE_SRC/prelim/init_state.f90 @@ -13,6 +13,7 @@ SUBROUTINE INIT_STATE(FRAC) ! ----------------- ! Model states in MODULE multistate ! --------------------------------------------------------------------------------------- +USE nrtype USE multiparam ! model parameters USE multistate ! model states USE multibands ! model snow bands diff --git a/build/FUSE_SRC/dshare/globaldata.f90 b/build/FUSE_SRC/share/globaldata.f90 similarity index 100% rename from build/FUSE_SRC/dshare/globaldata.f90 rename to build/FUSE_SRC/share/globaldata.f90 diff --git a/build/FUSE_SRC/share/model_defn_data.f90 b/build/FUSE_SRC/share/model_defn_data.f90 new file mode 100644 index 0000000..3b85981 --- /dev/null +++ b/build/FUSE_SRC/share/model_defn_data.f90 @@ -0,0 +1,56 @@ +MODULE model_defn + + ! --------------------------------------------------------------------------------------- + ! Creator: + ! -------- + ! Martyn Clark + ! Modified by Brian Henn to include snow model, 6/2013 + ! Modified by Martyn Clark to separate type definitions from data storage, 01/2026 + ! --------------------------------------------------------------------------------------- + + USE nrtype + USE model_defn_types, only: DESC, UMODEL, SNAMES, FNAMES + + USE globaldata, only: FUSE_VERSION + + implicit none + private + + public :: NDEC, NTDH_MAX, NSTATE, N_FLUX + public :: LIST_RFERR, LIST_ARCH1, LIST_ARCH2, LIST_QSURF, LIST_QPERC, LIST_ESOIL, LIST_QINTF, LIST_Q_TDH, LIST_SNOWM + public :: FNAME_PREFIX, FNAME_TEMPRY, FNAME_ASCII + public :: FNAME_NETCDF_RUNS, FNAME_NETCDF_PARA, FNAME_NETCDF_PARA_SCE, FNAME_NETCDF_PARA_PRE + public :: AMODL, SMODL, CSTATE, C_FLUX + + ! list of combinations in each model component + INTEGER, PARAMETER :: NDEC = 9 ! number of model decisions + TYPE(DESC), DIMENSION(2) :: LIST_RFERR ! rainfall error + TYPE(DESC), DIMENSION(3) :: LIST_ARCH1 ! upper-layer architecture + TYPE(DESC), DIMENSION(4) :: LIST_ARCH2 ! lower-layer architecture + TYPE(DESC), DIMENSION(3) :: LIST_QSURF ! surface runoff + TYPE(DESC), DIMENSION(3) :: LIST_QPERC ! percolation + TYPE(DESC), DIMENSION(2) :: LIST_ESOIL ! evaporation + TYPE(DESC), DIMENSION(2) :: LIST_QINTF ! interflow + TYPE(DESC), DIMENSION(2) :: LIST_Q_TDH ! time delay in runoff + TYPE(DESC), DIMENSION(2) :: LIST_SNOWM ! snow model + + ! max steps in routing function + INTEGER(I4B),PARAMETER::NTDH_MAX=500 + + ! model definitions + CHARACTER(LEN=256) :: FNAME_NETCDF_RUNS ! NETCDF output filename for model runs + CHARACTER(LEN=256) :: FNAME_NETCDF_PARA ! NETCDF output filename for model parameters + CHARACTER(LEN=256) :: FNAME_NETCDF_PARA_SCE ! NETCDF output filename for model parameters produced by SCE + CHARACTER(LEN=256) :: FNAME_NETCDF_PARA_PRE ! NETCDF filename for pre-defined model parameters set + CHARACTER(LEN=256) :: FNAME_PREFIX ! prefix for desired output files + CHARACTER(LEN=256) :: FNAME_TEMPRY ! prefix for temporary output files + CHARACTER(LEN=256) :: FNAME_ASCII ! ASCII output filename + TYPE(UMODEL),DIMENSION(5000) :: AMODL ! (model definition -- all) + TYPE(UMODEL) :: SMODL ! (model definition -- single model) + TYPE(SNAMES),DIMENSION(7) :: CSTATE ! (list of model states for SMODL) + TYPE(FNAMES),DIMENSION(50) :: C_FLUX ! (list of model fluxes for SMODL) + INTEGER(I4B) :: NSTATE=0 ! number of model states + INTEGER(I4B) :: N_FLUX=0 ! number of model fluxes + ! -------------------------------------------------------------------------------------- + +END MODULE model_defn diff --git a/build/FUSE_SRC/dshare/model_defnames.f90 b/build/FUSE_SRC/share/model_defnames.f90 similarity index 100% rename from build/FUSE_SRC/dshare/model_defnames.f90 rename to build/FUSE_SRC/share/model_defnames.f90 diff --git a/build/FUSE_SRC/dshare/model_numerix.f90 b/build/FUSE_SRC/share/model_numerix.f90 similarity index 100% rename from build/FUSE_SRC/dshare/model_numerix.f90 rename to build/FUSE_SRC/share/model_numerix.f90 diff --git a/build/FUSE_SRC/share/multi_flux_data.f90 b/build/FUSE_SRC/share/multi_flux_data.f90 new file mode 100644 index 0000000..9673397 --- /dev/null +++ b/build/FUSE_SRC/share/multi_flux_data.f90 @@ -0,0 +1,22 @@ +MODULE multi_flux + + USE nrtype + + USE multi_flux_types, only: FLUXES + + implicit none + private + + public :: M_FLUX, FLUX_0, FLUX_1, FDFLUX, W_FLUX, W_FLUX_3d + public :: CURRENT_DT + + TYPE(FLUXES) :: M_FLUX ! model fluxes + TYPE(FLUXES) :: FLUX_0 ! model fluxes at start of step + TYPE(FLUXES) :: FLUX_1 ! model fluxes at end of step + TYPE(FLUXES), DIMENSION(:), POINTER :: FDFLUX=>NULL() ! finite difference fluxes + TYPE(FLUXES) :: W_FLUX ! weighted sum of model fluxes over a time step + TYPE(FLUXES), dimension(:,:,:), allocatable :: W_FLUX_3d ! weighted sum of model fluxes over a time step for several time steps + + REAL(SP) :: CURRENT_DT ! current time step (days) + +END MODULE multi_flux diff --git a/build/FUSE_SRC/share/multibands_data.f90 b/build/FUSE_SRC/share/multibands_data.f90 new file mode 100644 index 0000000..7fa4406 --- /dev/null +++ b/build/FUSE_SRC/share/multibands_data.f90 @@ -0,0 +1,30 @@ +MODULE multibands + + ! Created by Brian Henn to allow multi-band snow modeling, 6/2013 + ! Based on module MULTIFORCE by Martyn Clark + + ! Modified by Martyn Clark to separate type definitions from data storage, 01/2026 + + USE nrtype + + USE multibands_types, only: BANDS, BANDS_INFO, BANDS_VAR + + implicit none + private + + public :: N_BANDS + public :: MBANDS, MBANDS_INFO_3d, MBANDS_VAR_4d + public :: Z_FORCING, Z_FORCING_grid, elev_mask + + ! -------------------------------------------------------------------------------------- + TYPE(BANDS),DIMENSION(:),ALLOCATABLE :: MBANDS ! basin band information + type(BANDS_INFO),dimension(:,:,:),ALLOCATABLE :: MBANDS_INFO_3d ! basin band information in space + type(BANDS_VAR),dimension(:,:,:,:),ALLOCATABLE :: MBANDS_VAR_4d ! basin band information in space plus time + + INTEGER(I4B) :: N_BANDS=0 ! number of bands, initialize to zero + REAL(SP) :: Z_FORCING ! elevation of forcing data (m) + REAL(SP),DIMENSION(:,:),ALLOCATABLE :: Z_FORCING_grid ! elevation of forcing data (m) for the 2D domain + LOGICAL(LGT),DIMENSION(:,:),ALLOCATABLE :: elev_mask ! mask domain - TRUE means the cell must be masked, i.e. not run + ! -------------------------------------------------------------------------------------- + +END MODULE multibands diff --git a/build/FUSE_SRC/dshare/multiconst.f90 b/build/FUSE_SRC/share/multiconst.f90 similarity index 100% rename from build/FUSE_SRC/dshare/multiconst.f90 rename to build/FUSE_SRC/share/multiconst.f90 diff --git a/build/FUSE_SRC/share/multiforce_data.f90 b/build/FUSE_SRC/share/multiforce_data.f90 new file mode 100644 index 0000000..cd077b2 --- /dev/null +++ b/build/FUSE_SRC/share/multiforce_data.f90 @@ -0,0 +1,185 @@ +MODULE multiforce + + ! --------------------------------------------------------------------------------------- + ! Creator: + ! -------- + ! Martyn Clark + ! Modified by Brian Henn to include snow model, 6/2013 + ! Modified by Nans Addor to enable distributed modeling, 9/2016 + ! Modified by Cyril Thébault to allow different metrics as objective function, 2024 + ! Modified by Martyn Clark to separate type definitions from data storage, 01/2026 + ! --------------------------------------------------------------------------------------- + + USE nrtype + + USE multiforce_types, only: TDATA, VDATA, ADATA, FDATA + + implicit none + private + + public :: forcefile + + public :: ncid_forc, ncid_var + + public :: nForce, nInput + + public :: timDat, valDat, aValid + public :: AFORCE, CFORCE, MFORCE + public :: ancilF, ancilF_3d + public :: gForce, gForce_3d + + public :: date_start_input, date_end_input + public :: numtim_in, numtim_sim, numtim_sub, numtim_sub_cur + public :: itim_in, itim_sim, itim_sub + public :: sim_beg, sim_end, eval_beg, eval_end + public :: istart, jdayRef + public :: deltim + + public :: SUB_PERIODS_FLAG, GRID_FLAG + + public :: startSpat2, nSpat1, nSpat2 + public :: xlon, ylat, latitude, longitude + public :: latUnits, lonUnits, timeUnits + + public :: time_steps, julian_day_input + + public :: NUMPSET, name_psets + + public :: vname_iy, vname_im, vname_id, vname_ih, vname_imin, vname_dsec, vname_dtime + + public :: vname_aprecip, vname_potevap, vname_airtemp, vname_q, vname_spechum, vname_airpres, vname_swdown + public :: ilook_aprecip, ilook_potevap, ilook_airtemp, ilook_q, ilook_spechum, ilook_airpres, ilook_swdown + + public :: ivarid_iy, ivarid_im, ivarid_id, ivarid_ih, ivarid_imin, ivarid_dsec + public :: ivarid_ppt, ivarid_temp, ivarid_pet, ivarid_q + + public :: amult_ppt, amult_pet, amult_q + + public :: NA_VALUE, NA_VALUE_SP + + SAVE + + ! general + INTEGER(I4B),PARAMETER :: STRLEN=256 ! length of the character string + + ! time data structures + TYPE(tData) :: timDat ! model time structure + + ! response data structures + TYPE(vData) :: valDat ! validation structure + TYPE(vData), DIMENSION(:,:,:), POINTER :: aValid ! all model validation data + + ! forcing data structures + TYPE(FDATA), DIMENSION(:), POINTER :: AFORCE ! all model forcing data + TYPE(FDATA), DIMENSION(:), POINTER :: CFORCE ! COPY of model forcing data + TYPE(FDATA) :: MFORCE ! model forcing data for a single time step + TYPE(aData), DIMENSION(:,:), POINTER :: ancilF ! ancillary forcing data for the 2-d grid + TYPE(fData), DIMENSION(:,:), POINTER :: gForce ! model forcing data for a 2-d grid + TYPE(fData), DIMENSION(:,:,:), POINTER :: gForce_3d ! model forcing data for a 3-d grid (time as 3rd dimension) + TYPE(aData), DIMENSION(:,:,:), POINTER :: ancilF_3d ! ancillary forcing data for the 3-d grid + + ! NetCDF + + CHARACTER(len=StrLen) :: forcefile = 'undefined' ! name of forcing file + + INTEGER(i4b), PARAMETER :: nForce = 7 ! number of forcing variables + INTEGER(i4b) :: nInput = 3 ! number of variable to retrieve from input file + + INTEGER(i4b) :: ncid_forc = -1 ! NetCDF forcing file ID + INTEGER(i4b), DIMENSION(nForce) :: ncid_var ! NetCDF forcing variable ID + + ! timing information - note that numtim_in >= numtim_sim >= numtim_sub + + CHARACTER(len=20) :: date_start_input ! date start input time series + CHARACTER(len=20) :: date_end_input ! date end input time series + + INTEGER(i4b) :: numtim_in = -1 ! number of time steps of input (atmospheric forcing) + INTEGER(i4b) :: numtim_sim = -1 ! number of time steps of FUSE simulations (including spin-up) + INTEGER(i4b) :: numtim_sub = -1 ! number of time steps of subperiod (will be kept in memory) + INTEGER(i4b) :: numtim_sub_cur = -1 ! number of time steps of current subperiod (allows for the last subperiod to be shorter) + INTEGER(i4b) :: itim_in = -1 ! indice within numtim_in + INTEGER(i4b) :: itim_sim = -1 ! indice within numtim_sim + INTEGER(i4b) :: itim_sub = -1 ! indice within numtim_sub + + INTEGER(i4b) :: sim_beg = -1 ! index for the start of the simulation in fuse_metric + INTEGER(i4b) :: sim_end = -1 ! index for the end of the simulation in fuse_metric + INTEGER(i4b) :: eval_beg = -1 ! index for the start of evaluation period + INTEGER(i4b) :: eval_end = -1 ! index for the end of the inference period + + INTEGER(i4b) :: istart = -1 ! index for start of inference period (in reduced array) + REAL(sp) :: jdayRef ! reference time (days) + REAL(sp) :: deltim = -1._dp ! length of time step (days) + + LOGICAL(LGT) :: SUB_PERIODS_FLAG ! .true. if subperiods are used to run FUSE + LOGICAL(LGT) :: GRID_FLAG ! spatial flag .true. if grid + + ! dimension information + + INTEGER(i4b) :: startSpat2 = -1 ! number of points in 1st spatial dimension + INTEGER(i4b) :: nSpat1 = -1 ! number of points in 1st spatial dimension + INTEGER(i4b) :: nSpat2 = -1 ! number of points in 2nd spatial dimension + REAL(sp) :: xlon ! longitude (degrees) for PET computation + REAL(sp) :: ylat ! latitude (degrees) for PET computation + REAL(sp),dimension(:),allocatable :: latitude ! latitude (degrees) + REAL(sp),dimension(:),allocatable :: longitude ! longitude (degrees) + CHARACTER(len=strLen) :: latUnits ! units string for latitude + CHARACTER(len=strLen) :: lonUnits ! units string for longitude + CHARACTER(len=strLen) :: timeUnits ! units string for time + + REAL(sp),dimension(:),allocatable :: time_steps ! time steps (days) + REAL(sp),dimension(:),allocatable :: julian_day_input ! time steps (julian days) + + INTEGER(I4B) :: NUMPSET ! number of parameter sets + CHARACTER(len=strLen),dimension(:),allocatable :: name_psets ! name of parameter sets + + ! name of time variables + CHARACTER(len=StrLen) :: vname_iy = 'undefined' ! name of variable for year + CHARACTER(len=StrLen) :: vname_im = 'undefined' ! name of variable for month + CHARACTER(len=StrLen) :: vname_id = 'undefined' ! name of variable for day + CHARACTER(len=StrLen) :: vname_ih = 'undefined' ! name of variable for hour + CHARACTER(len=StrLen) :: vname_imin = 'undefined' ! name of variable for minute + CHARACTER(len=StrLen) :: vname_dsec = 'undefined' ! name of variable for second + CHARACTER(len=StrLen) :: vname_dtime = 'undefined' ! name of variable for time + + ! forcing variable names + CHARACTER(len=StrLen) :: vname_aprecip = 'undefined' ! variable name: precipitation + CHARACTER(len=StrLen) :: vname_potevap = 'undefined' ! variable name: potential ET + CHARACTER(len=StrLen) :: vname_airtemp = 'undefined' ! variable name: temperature + CHARACTER(len=StrLen) :: vname_q = 'undefined' ! variable name: observed runoff + CHARACTER(len=StrLen) :: vname_spechum = 'undefined' ! variable name: specific humidity + CHARACTER(len=StrLen) :: vname_airpres = 'undefined' ! variable name: surface pressure + CHARACTER(len=StrLen) :: vname_swdown = 'undefined' ! variable name: downward shortwave radiation + + ! indices for forcing variables + INTEGER(i4b),PARAMETER :: ilook_aprecip = 1 ! named element in lCheck + INTEGER(i4b),PARAMETER :: ilook_potevap = 2 ! named element in lCheck + INTEGER(i4b),PARAMETER :: ilook_airtemp = 3 ! named element in lCheck + INTEGER(i4b),PARAMETER :: ilook_q = 4 ! named element in lCheck + INTEGER(i4b),PARAMETER :: ilook_spechum = 5 ! named element in lCheck + INTEGER(i4b),PARAMETER :: ilook_airpres = 6 ! named element in lCheck + INTEGER(i4b),PARAMETER :: ilook_swdown = 7 ! named element in lCheck + + ! indices for time data (only used in ASCII files) + INTEGER(i4b) :: ivarid_iy = -1 ! variable ID for year + INTEGER(i4b) :: ivarid_im = -1 ! variable ID for month + INTEGER(i4b) :: ivarid_id = -1 ! variable ID for day + INTEGER(i4b) :: ivarid_ih = -1 ! variable ID for hour + INTEGER(i4b) :: ivarid_imin = -1 ! variable ID for minute + INTEGER(i4b) :: ivarid_dsec = -1 ! variable ID for second + + ! indices for variables + INTEGER(i4b) :: ivarid_ppt = -1 ! variable ID for precipitation + INTEGER(i4b) :: ivarid_temp = -1 ! variable ID for temperature + INTEGER(i4b) :: ivarid_pet = -1 ! variable ID for potential ET + INTEGER(i4b) :: ivarid_q = -1 ! variable ID for runoff + + ! multipliers for variables to convert fluxes to mm/day + REAL(sp) :: amult_ppt = -1._dp ! convert precipitation to mm/day + REAL(sp) :: amult_pet = -1._dp ! convert potential ET to mm/day + REAL(sp) :: amult_q = -1._dp ! convert runoff to mm/day + + ! missing values + INTEGER(I4B),PARAMETER :: NA_VALUE = -9999 ! integer designating missing values - TODO: retrieve from NetCDF file + REAL(SP),PARAMETER :: NA_VALUE_SP = -9999._sp ! integer designating missing values - TODO: retrieve from NetCDF file + +END MODULE multiforce diff --git a/build/FUSE_SRC/share/multiparam_data.f90 b/build/FUSE_SRC/share/multiparam_data.f90 new file mode 100644 index 0000000..2fc8071 --- /dev/null +++ b/build/FUSE_SRC/share/multiparam_data.f90 @@ -0,0 +1,37 @@ +MODULE multiparam + + ! --------------------------------------------------------------------------------------- + ! Creator: + ! -------- + ! Martyn Clark + ! Modified by Brian Henn to include snow model, 6/2013 + ! Modified by Martyn Clark to separate type definitions from data storage, 01/2026 + ! --------------------------------------------------------------------------------------- + + USE nrtype + USE multiparam_types, only: PARATT ! included for legacy for routines that USE multiparam + USE multiparam_types, only: PARADJ, PARDVD, PARINFO, PAR_ID + + implicit none + private + + public :: PARATT, PARADJ, PARDVD, PARINFO, PAR_ID + + public :: MAXPAR, NUMPAR + public :: APARAM, MPARAM, DPARAM + public :: PARMETA, LPARAM + public :: SOBOL_INDX + + INTEGER(I4B), PARAMETER :: MAXPAR=50 ! maximum number of parameters for a single model + INTEGER(I4B) :: NUMPAR ! number of model parameters for current model + + TYPE(PARADJ), DIMENSION(:), POINTER :: APARAM=>null() ! all model parameter sets; DK/2008/10/21: explicit null + TYPE(PARADJ) :: MPARAM ! single model parameter set + TYPE(PARDVD) :: DPARAM ! derived model parameters + + TYPE(PARINFO) :: PARMETA ! parameter metadata (all parameters) + TYPE(PAR_ID), DIMENSION(MAXPAR) :: LPARAM ! list of model parameter names (need to modify to 16 for SCE) + + INTEGER(I4B) :: SOBOL_INDX ! code to re-assemble Sobol parameters + +END MODULE multiparam diff --git a/build/FUSE_SRC/share/multiroute_data.f90 b/build/FUSE_SRC/share/multiroute_data.f90 new file mode 100644 index 0000000..e1f3111 --- /dev/null +++ b/build/FUSE_SRC/share/multiroute_data.f90 @@ -0,0 +1,20 @@ +MODULE multiroute + + USE nrtype + USE model_defn,ONLY:NTDH_MAX + USE multiroute_types, only: RUNOFF + + implicit none + private + + public :: FUTURE + public :: AROUTE, AROUTE_3d + public :: MROUTE + + REAL(SP), DIMENSION(NTDH_MAX) :: FUTURE ! runoff placed in future time steps + + TYPE(RUNOFF), DIMENSION(:), POINTER :: AROUTE ! runoff for all time steps + TYPE(RUNOFF),dimension(:,:,:), allocatable :: AROUTE_3d ! runoff for all time steps on a grid + TYPE(RUNOFF) :: MROUTE ! runoff for one time step + +END MODULE multiroute diff --git a/build/FUSE_SRC/share/multistate_data.f90 b/build/FUSE_SRC/share/multistate_data.f90 new file mode 100644 index 0000000..ce1c1ec --- /dev/null +++ b/build/FUSE_SRC/share/multistate_data.f90 @@ -0,0 +1,44 @@ +MODULE multistate + + USE nrtype + USE multistate_types, only: STATEV, M_TIME + + implicit none + private + + public :: STATEV, M_TIME + + public :: gState, gState_3d + + public :: ASTATE, FSTATE, MSTATE, TSTATE, BSTATE, ESTATE, DSTATE + public :: DYDT_0, DYDT_1, DY_DT, DYDT_OLD + public :: HSTATE + + public :: ncid_out + public :: fracState0 + + ! variable definitions (grid) + type(statev),dimension(:,:),pointer :: gState ! (grid of model states) + type(statev),dimension(:,:,:),pointer :: gState_3d ! (grid of model states with a time dimension) + + ! variable definitions (one cell) + TYPE(STATEV) :: ASTATE ! (model states at the start of full timestep) + TYPE(STATEV) :: FSTATE ! (model states at start of sub-timestep) + TYPE(STATEV) :: MSTATE ! (model states at start/middle of sub-timestep) + TYPE(STATEV) :: TSTATE ! (temporary copy of model states) + TYPE(STATEV) :: BSTATE ! (temporary copy of model states) + TYPE(STATEV) :: ESTATE ! (temporary copy of model states) + TYPE(STATEV) :: DSTATE ! (default model states) + TYPE(STATEV) :: DYDT_0 ! (derivative of model states at start of sub-step) + TYPE(STATEV) :: DYDT_1 ! (derivative of model states at end of sub-step) + TYPE(STATEV) :: DY_DT ! (derivative of model states) + TYPE(STATEV) :: DYDT_OLD ! (derivative of model states for final solution) + TYPE(M_TIME) :: HSTATE ! (time interval to advance model states) + + ! NetCDF + integer(i4b) :: ncid_out = -1 ! NetCDF output file ID + + ! initial store fraction (initialization) + real(sp), parameter :: fracState0 = 0.25_sp + +END MODULE multistate diff --git a/build/FUSE_SRC/share/multistats_data.f90 b/build/FUSE_SRC/share/multistats_data.f90 new file mode 100644 index 0000000..4008e09 --- /dev/null +++ b/build/FUSE_SRC/share/multistats_data.f90 @@ -0,0 +1,16 @@ +MODULE multistats + + USE nrtype + USE multistats_types, only: SUMMARY + + implicit none + private + + public :: MSTATS, MOD_IX, PCOUNT, FCOUNT + + TYPE(SUMMARY) :: MSTATS ! (model summary statistics) + INTEGER(I4B) :: MOD_IX = 1 ! (model index) + INTEGER(I4B) :: PCOUNT ! (number of parameter sets in model output files) + INTEGER(I4B) :: FCOUNT ! (number of model simulations) + +END MODULE multistats diff --git a/build/FUSE_SRC/types/model_defn_types.f90 b/build/FUSE_SRC/types/model_defn_types.f90 new file mode 100644 index 0000000..a22acf9 --- /dev/null +++ b/build/FUSE_SRC/types/model_defn_types.f90 @@ -0,0 +1,48 @@ +MODULE model_defn_types + + ! --------------------------------------------------------------------------------------- + ! Creator: + ! -------- + ! Martyn Clark + ! Modified by Brian Henn to include snow model, 6/2013 + ! Modified by Martyn Clark to separate data tyoes from data store, 01/2026 + ! --------------------------------------------------------------------------------------- + + USE nrtype + + implicit none + private + + public :: DESC, UMODEL, SNAMES, FNAMES + + ! description of model component + TYPE DESC + CHARACTER(LEN=16) :: MCOMPONENT ! description of model component + END TYPE DESC + + ! structure that holds (x) unique combinations + TYPE UMODEL + INTEGER(I4B) :: MODIX ! model index + CHARACTER(LEN=256) :: MNAME ! model name + INTEGER(I4B) :: iRFERR + INTEGER(I4B) :: iARCH1 + INTEGER(I4B) :: iARCH2 + INTEGER(I4B) :: iQSURF + INTEGER(I4B) :: iQPERC + INTEGER(I4B) :: iESOIL + INTEGER(I4B) :: iQINTF + INTEGER(I4B) :: iQ_TDH + INTEGER(I4B) :: iSNOWM ! snow + END TYPE UMODEL + + ! structure to hold model state names + TYPE SNAMES + INTEGER(I4B) :: iSNAME ! integer value of state name + END TYPE SNAMES + + ! structure to hold model flux names + TYPE FNAMES + CHARACTER(LEN=16) :: FNAME ! state name + END TYPE FNAMES + +END MODULE model_defn_types diff --git a/build/FUSE_SRC/dshare/multi_flux.f90 b/build/FUSE_SRC/types/multi_flux_types.f90 similarity index 82% rename from build/FUSE_SRC/dshare/multi_flux.f90 rename to build/FUSE_SRC/types/multi_flux_types.f90 index b3c884f..c4411f4 100644 --- a/build/FUSE_SRC/dshare/multi_flux.f90 +++ b/build/FUSE_SRC/types/multi_flux_types.f90 @@ -1,5 +1,12 @@ -MODULE multi_flux +MODULE multi_flux_types + USE nrtype + + implicit none + private + + public :: FLUXES + TYPE FLUXES REAL(SP) :: EFF_PPT ! effective precipitation (mm day-1) REAL(SP) :: SATAREA ! saturated area (-) @@ -32,11 +39,5 @@ MODULE multi_flux REAL(SP) :: ERR_FREE_2B ! excessive extrapolation: storage in the secondary resvr (mm day-1) REAL(SP) :: CHK_TIME ! time elapsed during time step (days) ENDTYPE FLUXES - TYPE(FLUXES) :: M_FLUX ! model fluxes - TYPE(FLUXES) :: FLUX_0 ! model fluxes at start of step - TYPE(FLUXES) :: FLUX_1 ! model fluxes at end of step - TYPE(FLUXES), DIMENSION(:), POINTER :: FDFLUX=>NULL() ! finite difference fluxes - TYPE(FLUXES) :: W_FLUX ! weighted sum of model fluxes over a time step - TYPE(FLUXES), dimension(:,:,:), allocatable :: W_FLUX_3d ! weighted sum of model fluxes over a time step for several time steps - REAL(SP) :: CURRENT_DT ! current time step (days) -END MODULE multi_flux + +END MODULE multi_flux_types diff --git a/build/FUSE_SRC/dshare/multibands.f90 b/build/FUSE_SRC/types/multibands_types.f90 similarity index 59% rename from build/FUSE_SRC/dshare/multibands.f90 rename to build/FUSE_SRC/types/multibands_types.f90 index 101928d..e045eec 100644 --- a/build/FUSE_SRC/dshare/multibands.f90 +++ b/build/FUSE_SRC/types/multibands_types.f90 @@ -1,7 +1,18 @@ -! Created by Brian Henn to allow multi-band snow modeling, 6/2013 -! Based on module MULTIFORCE by Martyn Clark -MODULE multibands +MODULE multibands_types + + ! Created by Brian Henn to allow multi-band snow modeling, 6/2013 + ! Based on module MULTIFORCE by Martyn Clark + + ! Modified by Martyn Clark to separate type definitions from data storage, 01/2026 + USE nrtype + + implicit none + private + + public :: BANDS, BANDS_INFO, BANDS_VAR + + TYPE BANDS ! for catchment scale modeling INTEGER(I4B) :: NUM ! band number (-) REAL(SP) :: Z_MID ! band mid-point elevation (m) @@ -26,14 +37,4 @@ MODULE multibands REAL(SP) :: DSWE_DT ! rate of change of band SWE (mm day-1) ENDTYPE BANDS_VAR - ! -------------------------------------------------------------------------------------- - TYPE(BANDS),DIMENSION(:),ALLOCATABLE :: MBANDS ! basin band information - type(BANDS_INFO),dimension(:,:,:),ALLOCATABLE :: MBANDS_INFO_3d ! basin band information in space - type(BANDS_VAR),dimension(:,:,:,:),ALLOCATABLE :: MBANDS_VAR_4d ! basin band information in space plus time - - INTEGER(I4B) :: N_BANDS=0 ! number of bands, initialize to zero - REAL(SP) :: Z_FORCING ! elevation of forcing data (m) - REAL(SP),DIMENSION(:,:),ALLOCATABLE :: Z_FORCING_grid ! elevation of forcing data (m) for the 2D domain - LOGICAL(LGT),DIMENSION(:,:),ALLOCATABLE :: elev_mask ! mask domain - TRUE means the cell must be masked, i.e. not run - ! -------------------------------------------------------------------------------------- -END MODULE multibands +END MODULE multibands_types diff --git a/build/FUSE_SRC/types/multiforce_types.f90 b/build/FUSE_SRC/types/multiforce_types.f90 new file mode 100644 index 0000000..8a40f9b --- /dev/null +++ b/build/FUSE_SRC/types/multiforce_types.f90 @@ -0,0 +1,52 @@ +MODULE multiforce_types + + ! --------------------------------------------------------------------------------------- + ! Creator: + ! -------- + ! Martyn Clark + ! Modified by Brian Henn to include snow model, 6/2013 + ! Modified by Nans Addor to enable distributed modeling, 9/2016 + ! Modified by Cyril Thébault to allow different metrics as objective function, 2024 + ! Modified by Martyn Clark to separate type definitions from data storage, 01/2026 + ! --------------------------------------------------------------------------------------- + + USE nrtype + + implicit none + private + + public :: TDATA, VDATA, ADATA, FDATA + + ! the time data structure (will have no spatial dimension) + TYPE TDATA + INTEGER(I4B) :: IY ! year + INTEGER(I4B) :: IM ! month + INTEGER(I4B) :: ID ! day + INTEGER(I4B) :: IH ! hour + INTEGER(I4B) :: IMIN ! minute + REAL(SP) :: DSEC ! second + REAL(SP) :: DTIME ! time in seconds since year dot + ENDTYPE TDATA + + ! the response structure (will not have a spatial dimension) + TYPE VDATA + REAL(SP) :: OBSQ ! observed runoff (mm day-1) + END TYPE VDATA + + ! ancillary forcing variables used to compute ET (will have a spatial dimension) + TYPE ADATA + REAL(SP) :: AIRTEMP ! air temperature (K) + REAL(SP) :: SPECHUM ! specific humidity (g/g) + REAL(SP) :: AIRPRES ! air pressure (Pa) + REAL(SP) :: SWDOWN ! downward sw radiation (W m-2) + REAL(SP) :: NETRAD ! net radiation (W m-2) + END TYPE ADATA + + ! the forcing data structure (will have a spatial dimension) + TYPE FDATA + REAL(SP) :: PPT ! water input: rain + melt (mm day-1) + REAL(SP) :: TEMP ! temperature for snow model (deg.C) + REAL(SP) :: PET ! energy input: potential ET (mm day-1) + ENDTYPE FDATA + +END MODULE multiforce_types diff --git a/build/FUSE_SRC/dshare/multiparam.f90 b/build/FUSE_SRC/types/multiparam_types.f90 similarity index 90% rename from build/FUSE_SRC/dshare/multiparam.f90 rename to build/FUSE_SRC/types/multiparam_types.f90 index dd1188e..6062732 100644 --- a/build/FUSE_SRC/dshare/multiparam.f90 +++ b/build/FUSE_SRC/types/multiparam_types.f90 @@ -1,12 +1,21 @@ -! --------------------------------------------------------------------------------------- -! Creator: -! -------- -! Martyn Clark -! Modified by Brian Henn to include snow model, 6/2013 -! --------------------------------------------------------------------------------------- -MODULE multiparam +MODULE multiparam_types + + ! --------------------------------------------------------------------------------------- + ! Creator: + ! -------- + ! Martyn Clark + ! Modified by Brian Henn to include snow model, 6/2013 + ! Modified by Martyn Clark to separate type definitions from data storage, 01/2026 + ! --------------------------------------------------------------------------------------- + USE nrtype - USE model_defn,ONLY:NTDH_MAX + USE model_defn, ONLY: NTDH_MAX + + implicit none + private + + public :: PARATT, PARINFO, PARADJ, PARDVD, PAR_ID + ! -------------------------------------------------------------------------------------- ! (1) PARAMETER METADATA ! -------------------------------------------------------------------------------------- @@ -29,6 +38,7 @@ MODULE multiparam CHARACTER(LEN=256) :: CHILD1 ! name of 1st parameter child CHARACTER(LEN=256) :: CHILD2 ! name of 2nd parameter child END TYPE PARATT + ! data structure to hold metadata for each parameter TYPE PARINFO ! rainfall error parameters (adjustable) @@ -78,6 +88,7 @@ MODULE multiparam TYPE(PARATT) :: OPG ! precipitation gradient (-) TYPE(PARATT) :: LAPSE ! temperature gradient (deg. C) ENDTYPE PARINFO + ! -------------------------------------------------------------------------------------- ! (2) ADJUSTABLE PARAMETERS ! -------------------------------------------------------------------------------------- @@ -129,6 +140,7 @@ MODULE multiparam REAL(SP) :: OPG ! precipitation gradient (-) REAL(SP) :: LAPSE ! temperature gradient (deg. C) END TYPE PARADJ + ! -------------------------------------------------------------------------------------- ! (3) DERIVED PARAMETERS ! -------------------------------------------------------------------------------------- @@ -153,22 +165,12 @@ MODULE multiparam REAL(SP), DIMENSION(NTDH_MAX) :: FRAC_FUTURE ! fraction of runoff in future time steps INTEGER(I4B) :: NTDH_NEED ! number of time-steps with non-zero routing contribution END TYPE PARDVD + ! -------------------------------------------------------------------------------------- ! (4) LIST OF PARAMETERS FOR A GIVEN MODEL ! -------------------------------------------------------------------------------------- TYPE PAR_ID CHARACTER(LEN=9) :: PARNAME ! list of parameter names ENDTYPE PAR_ID - ! -------------------------------------------------------------------------------------- - ! (5) FINAL DATA STRUCTURES - ! -------------------------------------------------------------------------------------- - INTEGER(I4B), PARAMETER :: MAXPAR=50 ! maximum number of parameters for a single model - TYPE(PARADJ), DIMENSION(:), POINTER :: APARAM=>null() ! all model parameter sets; DK/2008/10/21: explicit null - TYPE(PARADJ) :: MPARAM ! single model parameter set - TYPE(PARDVD) :: DPARAM ! derived model parameters - TYPE(PARINFO) :: PARMETA ! parameter metadata (all parameters) - TYPE(PAR_ID), DIMENSION(MAXPAR) :: LPARAM ! list of model parameter names (need to modify to 16 for SCE) - INTEGER(I4B) :: NUMPAR ! number of model parameters for current model - INTEGER(I4B) :: SOBOL_INDX ! code to re-assemble Sobol parameters - ! -------------------------------------------------------------------------------------- -END MODULE multiparam + +END MODULE multiparam_types diff --git a/build/FUSE_SRC/types/multiroute_types.f90 b/build/FUSE_SRC/types/multiroute_types.f90 new file mode 100644 index 0000000..3b98045 --- /dev/null +++ b/build/FUSE_SRC/types/multiroute_types.f90 @@ -0,0 +1,16 @@ +MODULE multiroute_types + + USE nrtype + + implicit none + private + + public :: RUNOFF + + TYPE RUNOFF + REAL(SP) :: Q_INSTNT ! instantaneous runoff + REAL(SP) :: Q_ROUTED ! routed runoff + REAL(SP) :: Q_ACCURATE ! "accurate" runoff estimate (mm day-1) + END TYPE RUNOFF + +END MODULE multiroute_types diff --git a/build/FUSE_SRC/types/multistate_types.f90 b/build/FUSE_SRC/types/multistate_types.f90 new file mode 100644 index 0000000..e40f59d --- /dev/null +++ b/build/FUSE_SRC/types/multistate_types.f90 @@ -0,0 +1,37 @@ +MODULE multistate_types + + USE nrtype + + implicit none + private + + public :: STATEV, M_TIME + + ! -------------------------------------------------------------------------------------- + ! model state structure + ! -------------------------------------------------------------------------------------- + TYPE STATEV + ! snow layer + REAL(SP) :: SWE_TOT ! total storage as snow (mm) + ! upper layer + REAL(SP) :: WATR_1 ! total storage in layer1 (mm) + REAL(SP) :: TENS_1 ! tension storage in layer1 (mm) + REAL(SP) :: FREE_1 ! free storage in layer 1 (mm) + REAL(SP) :: TENS_1A ! storage in the recharge zone (mm) + REAL(SP) :: TENS_1B ! storage in the lower zone (mm) + ! lower layer + REAL(SP) :: WATR_2 ! total storage in layer2 (mm) + REAL(SP) :: TENS_2 ! tension storage in layer2 (mm) + REAL(SP) :: FREE_2 ! free storage in layer2 (mm) + REAL(SP) :: FREE_2A ! storage in the primary resvr (mm) + REAL(SP) :: FREE_2B ! storage in the secondary resvr (mm) + END TYPE STATEV + + ! -------------------------------------------------------------------------------------- + ! model time structure + ! -------------------------------------------------------------------------------------- + TYPE M_TIME + REAL(SP) :: STEP ! (time interval to advance model states) + END TYPE M_TIME + +END MODULE multistate_types diff --git a/build/FUSE_SRC/dshare/multistats.f90 b/build/FUSE_SRC/types/multistats_types.f90 similarity index 85% rename from build/FUSE_SRC/dshare/multistats.f90 rename to build/FUSE_SRC/types/multistats_types.f90 index d950cd9..f3f4ffd 100644 --- a/build/FUSE_SRC/dshare/multistats.f90 +++ b/build/FUSE_SRC/types/multistats_types.f90 @@ -1,10 +1,21 @@ -MODULE multistats +MODULE multistats_types + USE nrtype + + implicit none + private + + public :: SUMMARY + + ! -------------------------------------------------------------------------------------- + TYPE SUMMARY - ! DMSL diagnostix + + ! DMSL diagnostix REAL(SP) :: VAR_RESIDUL ! variance of the model residuals REAL(SP) :: LOGP_SIMULN ! log density of the model simulation REAL(SP) :: JUMP_TAKEN ! defines a jump in the MCMC production run + ! comparisons between model output and observations REAL(SP) :: QOBS_MEAN ! mean observed runoff (mm day-1) REAL(SP) :: QSIM_MEAN ! mean simulated runoff (mm day-1) @@ -19,6 +30,7 @@ MODULE multistats REAL(SP) :: KGEP ! Kling-Gupta Efficiency' score REAL(SP) :: MAE ! Mean absolute error REAL(SP) :: METRIC_VAL ! value of the metric chosen as objective function + ! attributes of model output REAL(SP) :: NUM_RMSE ! error of the approximate solution REAL(SP) :: NUM_FUNCS ! number of function calls @@ -28,12 +40,10 @@ MODULE multistats REAL(SP) :: NUMSUB_NOCONV ! number of sub-steps tried that did not converge INTEGER(I4B) :: MAXNUM_ITERNS ! maximum number of iterations in implicit scheme REAL(SP), DIMENSION(20) :: NUMSUB_PROB ! probability distribution for number of sub-steps + ! error checking CHARACTER(LEN=1024) :: ERR_MESSAGE ! error message + ENDTYPE SUMMARY - ! final data structures - TYPE(SUMMARY) :: MSTATS ! (model summary statistics) - INTEGER(I4B) :: MOD_IX=1 ! (model index) - INTEGER(I4B) :: PCOUNT ! (number of parameter sets in model output files) - INTEGER(I4B) :: FCOUNT ! (number of model simulations) -END MODULE multistats + +END MODULE multistats_types diff --git a/build/Makefile b/build/Makefile index 5a41660..3310710 100755 --- a/build/Makefile +++ b/build/Makefile @@ -124,7 +124,8 @@ NUMREC_DIR = $(FUSE_SOURCE_DIR)numrec HOOKUP_DIR = $(FUSE_SOURCE_DIR)hookup DRIVER_DIR = $(FUSE_SOURCE_DIR)driver NETCDF_DIR = $(FUSE_SOURCE_DIR)netcdf -DSHARE_DIR = $(FUSE_SOURCE_DIR)dshare +SHARE_DIR = $(FUSE_SOURCE_DIR)share +TYPES_DIR = $(FUSE_SOURCE_DIR)types PRELIM_DIR = $(FUSE_SOURCE_DIR)prelim RUNTIME_DIR = $(FUSE_SOURCE_DIR)runtime PHYSICS_DIR = $(FUSE_SOURCE_DIR)physics @@ -158,22 +159,43 @@ FUSE_NRUTIL += nrtype.f90 FUSE_NRUTIL += nr.f90 nrutil.f90 NRUTIL = $(patsubst %, $(NUMREC_DIR)/%, $(FUSE_NRUTIL)) -# Data modules -FUSE_DATAMS = -FUSE_DATAMS += model_defn.f90 -#FUSE_DATAMS += data_types.f90 -FUSE_DATAMS += model_defnames.f90 -FUSE_DATAMS += globaldata.f90 -FUSE_DATAMS += multiconst.f90 -FUSE_DATAMS += multiforce.f90 -FUSE_DATAMS += multibands.f90 -FUSE_DATAMS += multiparam.f90 -FUSE_DATAMS += multistate.f90 -FUSE_DATAMS += multi_flux.f90 -FUSE_DATAMS += multiroute.f90 -FUSE_DATAMS += multistats.f90 -FUSE_DATAMS += model_numerix.f90 -DATAMS = $(patsubst %, $(DSHARE_DIR)/%, $(FUSE_DATAMS)) +# Global data (needs to be defined before model_defn) +G_DATA = $(SHARE_DIR)/globaldata.f90 + +# Model definition +FUSE_MODDEF = +FUSE_MODDEF += $(TYPES_DIR)/model_defn_types.f90 +FUSE_MODDEF += $(SHARE_DIR)/model_defn_data.f90 +MODDEF = $(FUSE_MODDEF) # no patetrn substitution needed + +# Data types +FUSE_TYPES = +FUSE_TYPES += multiforce_types.f90 +FUSE_TYPES += multibands_types.f90 +FUSE_TYPES += multiparam_types.f90 +FUSE_TYPES += multistate_types.f90 +FUSE_TYPES += multi_flux_types.f90 +FUSE_TYPES += multiroute_types.f90 +FUSE_TYPES += multistats_types.f90 +#FUSE_TYPES += data_types.f90 +TYPES = $(patsubst %, $(TYPES_DIR)/%, $(FUSE_TYPES)) + +# combined type+data (mimic legacy code) +FUSE_SHARE = +FUSE_SHARE += multiconst.f90 +FUSE_SHARE += model_defnames.f90 +FUSE_SHARE += model_numerix.f90 +FUSE_SHARE += multiforce_data.f90 +FUSE_SHARE += multibands_data.f90 +FUSE_SHARE += multiparam_data.f90 +FUSE_SHARE += multistate_data.f90 +FUSE_SHARE += multi_flux_data.f90 +FUSE_SHARE += multiroute_data.f90 +FUSE_SHARE += multistats_data.f90 +SHARE = $(patsubst %, $(SHARE_DIR)/%, $(FUSE_SHARE)) + +# combine data modules together +DATAMS = $(G_DATA) $(MODDEF) $(TYPES) $(SHARE) # Time I/O modules FUSE_TIMEMS = diff --git a/build/generated/fuseversion.inc b/build/generated/fuseversion.inc index 7dadb42..ac6d752 100644 --- a/build/generated/fuseversion.inc +++ b/build/generated/fuseversion.inc @@ -4,6 +4,6 @@ integer, parameter :: FUSE_BUILDTIME_LEN = 32 integer, parameter :: FUSE_GITBRANCH_LEN = 64 integer, parameter :: FUSE_GITHASH_LEN = 64 character(len=FUSE_VERSION_LEN), parameter :: FUSE_VERSION = 'v2.0.0' -character(len=FUSE_BUILDTIME_LEN), parameter :: FUSE_BUILDTIME = '2026-01-03T18:48:22Z' -character(len=FUSE_GITBRANCH_LEN), parameter :: FUSE_GITBRANCH = 'refactor/baseline' -character(len=FUSE_GITHASH_LEN), parameter :: FUSE_GITHASH = '4bb2fc3879f4acb512fb464781d8422a92e35c89' +character(len=FUSE_BUILDTIME_LEN), parameter :: FUSE_BUILDTIME = '2026-01-06T08:03:49Z' +character(len=FUSE_GITBRANCH_LEN), parameter :: FUSE_GITBRANCH = 'refactor/separate-data-types-from-storage' +character(len=FUSE_GITHASH_LEN), parameter :: FUSE_GITHASH = 'fa0612d2409778bdcf26825084d4f3ac2b51f873'