Line data Source code
1 : !> \file mo_mhm_eval.f90
2 : !> \brief \copybrief mo_mhm_eval
3 : !> \details \copydetails mo_mhm_eval
4 :
5 : !> \brief Runs mhm with a specific parameter set and returns required variables, e.g. runoff.
6 : !> \details Runs mhm with a specific parameter set and returns required variables, e.g. runoff.
7 : !> \authors Juliane Mai, Rohini Kumar
8 : !> \date Feb 2013
9 : !> \copyright Copyright 2005-\today, the mHM Developers, Luis Samaniego, Sabine Attinger: All rights reserved.
10 : !! mHM is released under the LGPLv3+ license \license_note
11 : !> \ingroup f_mhm
12 : MODULE mo_mhm_eval
13 :
14 : use mo_kind, only : i4, dp
15 : use mo_optimization_types, only : optidata_sim
16 : use mo_mhm_interface_run, only : &
17 : mhm_interface_run_prepare, &
18 : mhm_interface_run_get_ndomains, &
19 : mhm_interface_run_prepare_domain, &
20 : mhm_interface_run_finished, &
21 : mhm_interface_run_do_time_step, &
22 : mhm_interface_run_write_output, &
23 : mhm_interface_run_update_optisim, &
24 : mhm_interface_run_finalize_domain, &
25 : mhm_interface_run_finalize
26 :
27 : IMPLICIT NONE
28 :
29 : PRIVATE
30 :
31 : PUBLIC :: mhm_eval
32 :
33 : ! ------------------------------------------------------------------
34 :
35 : CONTAINS
36 :
37 : ! ------------------------------------------------------------------
38 :
39 : ! NAME
40 : ! mhm_eval
41 :
42 : ! PURPOSE
43 : !> \brief Runs mhm with a specific parameter set and returns required variables, e.g. runoff.
44 :
45 : !> \details Runs mhm with a specific parameter set and returns required variables, e.g. runoff.
46 :
47 : ! INTENT(IN)
48 : !> \param[in] "real(dp), dimension(:) :: parameterset" a set of global parameter (gamma) to run mHM, DIMENSION
49 : !> [no. of global_Parameters]
50 :
51 : ! INTENT(OUT), OPTIONAL
52 : !> \param[out] "real(dp), dimension(:, :), optional :: runoff" returns runoff time series, DIMENSION
53 : !> [nTimeSteps, nGaugesTotal]
54 : !> \param[out] "real(dp), dimension(:, :), optional :: sm_opti" returns soil moisture time series for all
55 : !> grid cells (of multiple Domains concatenated),DIMENSION [nCells, nTimeSteps]
56 : !> time series, DIMENSION [nTimeSteps, nDomains]
57 : !> \param[out] "real(dp), dimension(:, :), optional :: neutrons_opti" dim1=ncells, dim2=time
58 : !> \param[out] "real(dp), dimension(:, :), optional :: et_opti" returns evapotranspiration time series for
59 : !> \param[out] "real(dp), dimension(:, :), optional :: tws_opti" returns tws time series
60 : !> all grid cells (of multiple Domains concatenated),DIMENSION [nCells, nTimeSteps]
61 :
62 : ! HISTORY
63 : !> \authors Juliane Mai, Rohini Kumar
64 :
65 : !> \date Feb 2013
66 :
67 : ! Modifications:
68 : ! R. Kumar Jun 2013 - restart_flag_states_read is passed to mhm call for the soil moisture initalisation
69 : ! R. Kumar Jun 2013 - frac_sealed_city_area is added
70 : ! R. Kumar & S. Thober Aug 2013 - code change to incorporate output timestep during writing of the netcdf file
71 : ! R. Kumar Aug 2013 - added iFlag_LAI_data_format to handle LAI options, and changed within the code made accordingly
72 : ! R. Kumar, J. Mai Sep 2013 - Splitting allocation and initialization of arrays
73 : ! R. Kumar Nov 2013 - update intent variables in documentation
74 : ! L. Samaniego Nov 2013 - relational statements == to .eq., etc.
75 : ! M. Zink Feb 2014 - added PET calculation: Hargreaves-Samani (Process 5)
76 : ! M. Zink Mar 2014 - added inflow from upstream areas
77 : ! Stephan Thober Jun 2014 - added chunk read for meteorological input
78 : ! Stephan Thober Jun 2014 - updated flag for read_restart
79 : ! M. Cuntz & J. Mai Nov 2014 - LAI input from daily, monthly or yearly files
80 : ! Matthias Zink Dec 2014 - adopted inflow gauges to ignore headwater cells
81 : ! Stephan Thober Aug 2015 - moved writing of daily discharge to mo_write_routing, included routing related variables from mRM
82 : ! David Schaefer Aug 2015 - changed to new netcdf-writing scheme
83 : ! Stephan Thober Sep 2015 - updated mrm_routing call
84 : ! O. Rakovec, R. Kumar Oct 2015 - added optional output for Domain averaged TWS
85 : ! Rohini Kumar Mar 2016 - changes for handling multiple soil database options
86 : ! Stephan Thober Nov 2016 - added two options for routing
87 : ! Rohini Kuamr Dec 2016 - option to handle monthly mean gridded fields of LAI
88 : ! Stephan Thober Jan 2017 - added prescribed weights for tavg and pet
89 : ! Zink M. Demirel C. Mar 2017 - Added Jarvis soil water stress function at SM process(3)
90 : ! Robert Schweppe Dec 2017 - extracted call to mpr from inside mhm
91 : ! Robert Schweppe Jun 2018 - refactoring and reformatting
92 : ! Stephan Thober Jan 2022 - added nTstepForcingDay and is_hourly_forcing flag
93 :
94 61 : SUBROUTINE mhm_eval(parameterset, opti_domain_indices, runoff, smOptiSim, neutronsOptiSim, etOptiSim, twsOptiSim, BFI)
95 : implicit none
96 :
97 : !> a set of global parameter (gamma) to run mHM, DIMENSION [no. of global_Parameters]
98 : real(dp), dimension(:), intent(in) :: parameterset
99 : !> selected domains for optimization
100 : integer(i4), dimension(:), optional, intent(in) :: opti_domain_indices
101 : !> returns runoff time series, DIMENSION [nTimeSteps, nGaugesTotal]
102 : real(dp), dimension(:, :), allocatable, optional, intent(out) :: runoff
103 : !> returns soil moisture time series for all grid cells (of multiple Domains concatenated),DIMENSION [nCells, nTimeSteps]
104 : type(optidata_sim), dimension(:), optional, intent(inout) :: smOptiSim
105 : !> dim1=ncells, dim2=time
106 : type(optidata_sim), dimension(:), optional, intent(inout) :: neutronsOptiSim
107 : !> returns evapotranspiration time series for all grid cells (of multiple Domains concatenated),DIMENSION [nCells, nTimeSteps]
108 : type(optidata_sim), dimension(:), optional, intent(inout) :: etOptiSim
109 : !> returns tws time series for all grid cells (of multiple Domains concatenated),DIMENSION [nCells, nTimeSteps]
110 : type(optidata_sim), dimension(:), optional, intent(inout) :: twsOptiSim
111 : !> baseflow index, dim1=domainID
112 : real(dp), dimension(:), allocatable, optional, intent(out) :: BFI
113 :
114 : ! number of domains simulated in this mhm_eval run. Depends on opti_function
115 : integer(i4) :: nDomains, ii
116 :
117 : ! flag to check if time loop is finished
118 : logical :: time_loop_finished
119 :
120 : ! prepare the mhm run
121 94 : call mhm_interface_run_prepare(parameterset, opti_domain_indices, present(runoff), present(BFI))
122 :
123 : ! get number of domains to loop over
124 61 : call mhm_interface_run_get_ndomains(nDomains)
125 :
126 : ! loop over Domains
127 143 : DomainLoop: do ii = 1, nDomains
128 :
129 : ! prepare current domain
130 350 : call mhm_interface_run_prepare_domain(ii, etOptiSim, twsOptiSim, neutronsOptiSim, smOptiSim)
131 :
132 : ! run time-loop at least once
133 82 : time_loop_finished = .false.
134 :
135 : ! Loop over time
136 2020354 : TimeLoop: do while(.not. time_loop_finished)
137 :
138 : ! do one time-step on current domain
139 2020272 : call mhm_interface_run_do_time_step()
140 :
141 : ! write output
142 2020272 : call mhm_interface_run_write_output()
143 :
144 : ! update optisim data
145 8366304 : call mhm_interface_run_update_optisim(etOptiSim, twsOptiSim, neutronsOptiSim, smOptiSim)
146 :
147 : ! check whether to run the time-loop further
148 2020272 : call mhm_interface_run_finished(time_loop_finished)
149 :
150 : end do TimeLoop !<< TIME STEPS LOOP
151 :
152 : ! finalize domain
153 143 : call mhm_interface_run_finalize_domain()
154 :
155 : end do DomainLoop !<< Domain LOOP
156 :
157 : ! SET RUNOFF OUTPUT VARIABLE; reset init-flag for MPR
158 61 : call mhm_interface_run_finalize(runoff, BFI)
159 :
160 61 : end SUBROUTINE mhm_eval
161 :
162 : END MODULE mo_mhm_eval
|