Soil Water Balance (SWB2)
Loading...
Searching...
No Matches
model_iterate_multiple_simulations.F90
Go to the documentation of this file.
2
3 use iso_c_binding, only : c_bool, c_float, c_int, c_double
5 use datetime, only : months
8 use grid
9 use logfiles, only : logs, log_all
11 use simulation_datetime, only : sim_dt
12 use fstring, only : ascharacter
13 use output, only : write_output, &
19
20! use summary_statistics, only : perform_polygon_summarize
21 use grid
22 implicit none
23
24 private
25
27
28 real (c_float), allocatable :: monthly_net_infiltration_stats(:,:)
29 real (c_float), allocatable :: annual_net_infiltration_stats(:)
30 real (c_float), allocatable :: monthly_actual_et_stats(:,:)
31 real (c_float), allocatable :: annual_actual_et_stats(:)
32 real (c_float), allocatable :: monthly_rainfall_stats(:,:)
33 real (c_float), allocatable :: annual_rainfall_stats(:)
34 integer (c_int) :: day_count_by_month(12)
35
36 real (c_double), target, allocatable :: soil_moisture_storage_per_sim(:,:)
37 real (c_float), target, allocatable :: snow_storage_per_sim(:,:)
38 real (c_double), target, allocatable :: surface_storage_per_sim(:,:)
39 real (c_float), target, allocatable :: interception_storage_per_sim(:,:)
40 real (c_float), target, allocatable :: net_infiltration_per_sim(:,:)
41 real (c_double), target, allocatable :: actual_et_per_sim(:,:)
42 real (c_float), target, allocatable :: fog_per_sim(:,:)
43
44! Concept: remap pointers to key state variables for each of X simulations,
45! run the daily simulation given current landuse, soil type, etc.
46! update rainfall by means of method of fragments
47!
48contains
49
50 subroutine allocate_space_for_simulation_storage_state_variables(cells, number_of_simulations)
51
52 class(model_domain_t), intent(inout) :: cells
53 integer (c_int), intent(in) :: number_of_simulations
54
55 ! [ LOCALS ]
56 integer (c_int) :: length
57 integer (c_int) :: indx
58
59 length = size( cells%soil_storage, 1)
60
61 allocate( soil_moisture_storage_per_sim(length, number_of_simulations))
62 allocate( snow_storage_per_sim(length, number_of_simulations))
63 allocate( surface_storage_per_sim(length, number_of_simulations))
64 allocate( interception_storage_per_sim(length, number_of_simulations))
65 allocate( net_infiltration_per_sim(length, number_of_simulations))
66 allocate( actual_et_per_sim(length, number_of_simulations))
67 allocate( fog_per_sim(length, number_of_simulations))
68
69 allocate( monthly_net_infiltration_stats(length, 12) )
70 allocate( annual_net_infiltration_stats(length) )
71 allocate( monthly_actual_et_stats(length, 12) )
72 allocate( annual_actual_et_stats(length) )
73 allocate( monthly_rainfall_stats(length, 12) )
74 allocate( annual_rainfall_stats(length) )
75
76 ! do not want or need this memory since we are going to swap out a
77 ! different set of arrays for each simulation number
78 if (associated(cells%snow_storage)) then
79 do indx=1,number_of_simulations
80 snow_storage_per_sim(:,indx) = cells%snow_storage
81 enddo
82 deallocate(cells%snow_storage)
83 endif
84
85 if (associated(cells%soil_storage)) then
86 do indx=1,number_of_simulations
87 soil_moisture_storage_per_sim(:,indx) = cells%soil_storage
88 enddo
89 deallocate(cells%soil_storage)
90 endif
91
92 if (associated(cells%surface_storage)) then
93 do indx=1,number_of_simulations
94 surface_storage_per_sim(:,indx) = cells%surface_storage
95 enddo
96 deallocate(cells%surface_storage)
97 endif
98
99 if (associated(cells%interception_storage)) then
100 do indx=1,number_of_simulations
101 interception_storage_per_sim(:,indx) = cells%interception_storage
102 enddo
103 deallocate(cells%interception_storage)
104 endif
105
106 if (associated(cells%net_infiltration)) then
107 do indx=1,number_of_simulations
108 net_infiltration_per_sim(:,indx) = cells%net_infiltration
109 enddo
110 deallocate(cells%net_infiltration)
111 endif
112
113 if (associated(cells%actual_et)) then
114 do indx=1,number_of_simulations
115 actual_et_per_sim(:,indx) = cells%actual_et
116 enddo
117 deallocate(cells%actual_et)
118 endif
119
120 if (associated(cells%fog)) then
121 do indx=1,number_of_simulations
122 fog_per_sim(:,indx) = cells%fog
123 enddo
124 deallocate(cells%fog)
125 endif
126
128
129!------------------------------------------------------------------------------------------------
130
131 subroutine iterate_over_multiple_simulation_days(cells, number_of_simulations)
132
134
135 class(model_domain_t), intent(inout) :: cells
136 integer (c_int), intent(inout) :: number_of_simulations
137
138 ! [ LOCALS ]
139 integer (c_int) :: sim_number
140
141 ! set flags in output mod to allow multiple simulation output to be generated
142 outspecs(ncdf_net_infiltration)%multisim_outputs = true
143 outspecs(ncdf_actual_et)%multisim_outputs = true
144
145 call allocate_space_for_simulation_storage_state_variables(cells, number_of_simulations)
146
149
150 !call initialize_multiple_sim_output(cells, number_of_simulations)
151
152 do while ( sim_dt%curr <= sim_dt%end )
153
154 call cells%update_landuse_codes()
155
156 do sim_number=1,number_of_simulations
157
158 ! modifying module variable from precipitation__method_of_fragments
159 simulation_number = sim_number
160
161 call cells%get_weather_data( )
162
163 if (sim_number==1) then
164 call logs%write("Calculating: "//sim_dt%curr%prettydate(), &
165 iloglevel=log_all, lecho=.true._c_bool )
166 write(*,"(a,i0,a)", advance="no") " running ",number_of_simulations, &
167 " simulations: "
168 endif
169
170 write(*,fmt="(a)", advance="no") "."
171
172 cells%snow_storage => snow_storage_per_sim(:,sim_number)
173 cells%soil_storage => soil_moisture_storage_per_sim(:,sim_number)
174 cells%interception_storage => interception_storage_per_sim(:,sim_number)
175 cells%surface_storage => surface_storage_per_sim(:,sim_number)
176 cells%net_infiltration => net_infiltration_per_sim(:,sim_number)
177 cells%actual_et => actual_et_per_sim(:,sim_number)
178 cells%fog => fog_per_sim(:,sim_number)
179
180 call perform_daily_calculation( cells )
181
182 call write_output( cells )
183 call update_accumulators( cells, sim_number )
184! call write_multi_sim_output( cells, sim_number)
185 ! call perform_polygon_summarize( cells )
186
187 call cells%dump_variables( )
188
189 enddo
190
191 write(*,fmt="(/)")
192
193 call sim_dt%addDay( )
194
195 enddo
196
197 call finalize_accumulators( cells, number_of_simulations )
198
200
201!------------------------------------------------------------------------------------------------
202
204
205 monthly_actual_et_stats = 0.0_c_float
206 monthly_rainfall_stats = 0.0_c_float
208 day_count_by_month(:) = 0
209
210 end subroutine reset_monthly_accumulators
211
212!------------------------------------------------------------------------------------------------
213
215
216 annual_actual_et_stats = 0.0_c_float
217 annual_rainfall_stats = 0.0_c_float
219
220 end subroutine reset_annual_accumulators
221
222!------------------------------------------------------------------------------------------------
223
224 subroutine update_accumulators( cells, simulation_number )
225
226 class(model_domain_t), intent(inout) :: cells
227 integer (c_int), intent(in) :: simulation_number
228
229 ![ LOCALS ]
230 integer (c_int) :: month
231
232 month = sim_dt%curr%iMonth
233
234 if (simulation_number == 1) &
235 day_count_by_month(month) = day_count_by_month(month) + 1
236
237 ! called each day of a simulation for nsim number of simulations
239 + cells%net_infiltration
240
242 + cells%actual_et
243
245 + cells%rainfall
246
247 ! ANNUAL_NET_INFILTRATION_STATS(:,simulation_number) = &
248 ! ANNUAL_NET_INFILTRATION_STATS(:,simulation_number) + cells%net_infiltration
249 !
250 ! ANNUAL_ACTUAL_ET_STATS(:,simulation_number) = &
251 ! ANNUAL_ACTUAL_ET_STATS(:,simulation_number) + cells%actual_et
252
253 end subroutine update_accumulators
254
255!------------------------------------------------------------------------------------------------
256
257 subroutine finalize_accumulators(cells, number_of_simulations)
258
259 class(model_domain_t), intent(inout) :: cells
260 integer (c_int), intent(in) :: number_of_simulations
261
262 ![ LOCALS ]
263 real (c_float) :: number_of_simulation_days
264 integer (c_int) :: month
265 integer (c_int) :: simulation_number
266 character (len=256) :: filename, file_suffix
267 integer (c_int) :: start_year, end_year
268 integer (c_int) :: nx, ny
269 character (len=3) :: month_abbrev
270
271 type (GENERAL_GRID_T), pointer :: pTempGrid
272
273 start_year = sim_dt%start%iYear
274 end_year = sim_dt%end%iYear
275 nx = cells%number_of_columns
276 ny = cells%number_of_rows
277
278 file_suffix = "__"//trim(ascharacter(number_of_simulations))//"-simulations__" &
279 //trim(ascharacter(ny))//"_cols_by_"//trim(ascharacter(nx))//"_rows__" &
280 //trim(ascharacter(start_year))//"_to_"//trim(ascharacter(end_year))//".asc"
281
282 ptempgrid => grid_create( inx=cells%number_of_columns, iny=cells%number_of_rows, &
283 rx0=cells%X_ll, ry0=cells%Y_ll, &
284 rgridcellsize=cells%gridcellsize, idatatype=grid_datatype_real )
285
286 call grid_set_nodata_value(ptempgrid, fvalue=cells%nodata_fill_value(1,1))
287
288 number_of_simulation_days = real( sim_dt%end - sim_dt%start + 1.0, c_float)
289
290 do month=1,12
291
292 month_abbrev = months(month)%sName
293
296
298 + monthly_actual_et_stats(:,month)
299
301 + monthly_rainfall_stats(:,month)
302
304 / real(number_of_simulations, c_float) &
305 * real(months(month)%iNumDays, c_float) &
306 / real(day_count_by_month(month), c_float)
307
309 / real(number_of_simulations, c_float) &
310 * real(months(month)%iNumDays, c_float) &
311 / real(day_count_by_month(month), c_float)
312
314 / real(number_of_simulations, c_float) &
315 * real(months(month)%iNumDays, c_float) &
316 / real(day_count_by_month(month), c_float)
317
318 ptempgrid%rData = unpack( monthly_actual_et_stats(:,month), cells%active, cells%nodata_fill_value )
319 filename = "MEAN_MONTHLY_SUM-"//trim(month_abbrev)//"__actual_evapotranspiration"//trim(file_suffix)
320 call grid_writearcgrid( sfilename=filename, pgrd=ptempgrid )
321
322 ptempgrid%rData = unpack( monthly_net_infiltration_stats(:,month), cells%active, cells%nodata_fill_value )
323 filename = "MEAN_MONTHLY_SUM-"//trim(month_abbrev)//"__net_infiltration"//trim(file_suffix)
324 call grid_writearcgrid( sfilename=filename, pgrd=ptempgrid )
325
326 ptempgrid%rData = unpack( monthly_rainfall_stats(:,month), cells%active, cells%nodata_fill_value )
327 filename = "MEAN_MONTHLY_SUM-"//trim(month_abbrev)//"__rainfall"//trim(file_suffix)
328 call grid_writearcgrid( sfilename=filename, pgrd=ptempgrid )
329
330 enddo
331
333 / real(number_of_simulations, c_float) &
334 * 365.0_c_float &
335 / real(number_of_simulation_days, c_float)
336
338 / real(number_of_simulations, c_float) &
339 * 365.0_c_float &
340 / real(number_of_simulation_days, c_float)
341
343 / real(number_of_simulations, c_float) &
344 * 365.0_c_float &
345 / real(number_of_simulation_days, c_float)
346
347 ptempgrid%rData = unpack( annual_actual_et_stats, cells%active, cells%nodata_fill_value )
348 filename = "MEAN_ANNUAL_SUM__actual_evapotranspiration"//trim(file_suffix)
349 call grid_writearcgrid( sfilename=filename, pgrd=ptempgrid )
350
351 ptempgrid%rData = unpack( annual_net_infiltration_stats, cells%active, cells%nodata_fill_value )
352 filename = "MEAN_ANNUAL_SUM__net_infiltration"//trim(file_suffix)
353 call grid_writearcgrid( sfilename=filename, pgrd=ptempgrid )
354
355 ptempgrid%rData = unpack( annual_rainfall_stats, cells%active, cells%nodata_fill_value )
356 filename = "MEAN_ANNUAL_SUM__rainfall"//trim(file_suffix)
357 call grid_writearcgrid( sfilename=filename, pgrd=ptempgrid )
358
359 call grid_destroy( ptempgrid )
360
361 end subroutine finalize_accumulators
362
363
This module contains physical constants and convenience functions aimed at performing unit conversion...
logical(c_bool), parameter, public true
subroutine, public perform_daily_calculation(cells)
This module contains the DATETIME_T class and associated time and date-related routines,...
Definition datetime.F90:9
type(month_t), dimension(12), target, public months
Month information.
Definition datetime.F90:148
Provides support for input and output of gridded ASCII data, as well as for creation and destruction ...
Definition grid.F90:8
subroutine, public grid_destroy(pgrd)
Definition grid.F90:366
subroutine, public grid_writearcgrid(sfilename, pgrd)
Definition grid.F90:1056
subroutine, public grid_set_nodata_value(pgrd, ivalue, fvalue)
Definition grid.F90:2167
integer(c_int), parameter, public grid_datatype_real
Definition grid.F90:26
type(logfile_t), public logs
Definition logfiles.F90:62
subroutine, public iterate_over_multiple_simulation_days(cells, number_of_simulations)
real(c_float), dimension(:,:), allocatable monthly_actual_et_stats
subroutine allocate_space_for_simulation_storage_state_variables(cells, number_of_simulations)
real(c_float), dimension(:,:), allocatable monthly_rainfall_stats
real(c_float), dimension(:), allocatable annual_net_infiltration_stats
real(c_float), dimension(:), allocatable annual_actual_et_stats
real(c_float), dimension(:,:), allocatable, target net_infiltration_per_sim
real(c_double), dimension(:,:), allocatable, target actual_et_per_sim
subroutine finalize_accumulators(cells, number_of_simulations)
real(c_float), dimension(:,:), allocatable, target fog_per_sim
real(c_float), dimension(:), allocatable annual_rainfall_stats
real(c_double), dimension(:,:), allocatable, target soil_moisture_storage_per_sim
real(c_float), dimension(:,:), allocatable, target interception_storage_per_sim
real(c_float), dimension(:,:), allocatable monthly_net_infiltration_stats
subroutine update_accumulators(cells, simulation_number)
real(c_float), dimension(:,:), allocatable, target snow_storage_per_sim
real(c_double), dimension(:,:), allocatable, target surface_storage_per_sim
subroutine write_output(cells)
Definition output.F90:364
subroutine write_multi_sim_output(cells, simulation_number)
Definition output.F90:800
type(output_specs_t), dimension(ncdf_num_outputs) outspecs
Definition output.F90:33
@ ncdf_actual_et
Definition output.F90:68
@ ncdf_net_infiltration
Definition output.F90:68
subroutine initialize_output(cells)
Definition output.F90:120
subroutine initialize_multiple_sim_output(cells, number_of_simulations)
Definition output.F90:205
Module precipitation__method_of_fragments provides support for creating synthetic daily precipitation...
integer(c_int), public simulation_number
Module variable indicating which "simulation number" is active Only has meaning if the rainfall fragm...
type(date_range_t), public sim_dt