11 use iso_c_binding,
only : c_short, c_int, c_float, c_double, c_bool, c_long
22 use fstring,
only :
operator(.containssimilar.), &
24 use version_control,
only : swb_version, git_commit_hash_string, &
25 git_branch_string, compile_date, &
26 compile_time, system_name
35 character (len=256) :: sbuf
36 character (len=256) :: soutputprefixname
37 character (len=256) :: soutputdirectoryname
38 character (len=256) :: slogfiledirectoryname
39 character (len=256) :: sdatadirectoryname
40 character (len=256) :: slookuptabledirectoryname
41 character (len=256) :: sweatherdatadirectoryname
42 integer (c_int) :: inumargs
43 character (len=1024) :: scompileroptions
44 character (len=256) :: scompilerversion
45 character (len=:),
allocatable :: scompilername
46 character (len=256) :: sversionstring
47 character (len=256) :: scompilationdatestring
48 character (len=256) :: scompilationsystemstring
49 character (len=256) :: sexecutabledescription
50 character (len=256) :: sgithashstring
51 integer (c_int) :: icount
52 integer (c_int) :: iindex
53 integer (c_int) :: ilen
54 integer (c_int) :: number_of_simulations
58 soutputprefixname =
""
59 soutputdirectoryname =
""
60 sdatadirectoryname =
""
61 slogfiledirectoryname =
""
62 slookuptabledirectoryname =
""
63 sweatherdatadirectoryname =
""
64 number_of_simulations = 1
68 inumargs = command_argument_count()
70 sversionstring = trim( swb_version )
71 scompilationdatestring = trim(compile_date)//
" "//trim(compile_time)
72 scompilationsystemstring = trim(system_name)
73 scompileroptions = compiler_options()
74 scompilerversion = compiler_version()
75 sexecutabledescription =
"USGS Soil-Water-Balance Code version "//trim( sversionstring )
77 if ( system_name ==
"Windows" )
then
83 sgithashstring = trim( adjustl(git_branch_string ) )//
", "//trim( git_commit_hash_string )
86 scompilername =
"gfortran" // trim(scompilerversion)
89#ifdef __INTEL_COMPILER
92 scompilername =
"Intel Fortran,"//
right(string=scompilerversion, substring=
",")
97 icount = max( len_trim( sversionstring ), len_trim( sgithashstring ) )
98 icount = max( icount, len_trim( scompilationsystemstring) )
99 icount = max( icount, len_trim( scompilername) + len_trim( scompilerversion ) )
101 icount = max( icount, len_trim( sexecutabledescription ) )
103 write(unit=*, fmt=
"(/,a)") repeat(
"-",icount + 4)
104 write(unit=*,fmt=
"(2x,a,/)") trim(sexecutabledescription)
105 write(unit=*,fmt=
"(a24,a)")
"compiled on : ", trim( scompilationdatestring )
106 write(unit=*,fmt=
"(a24,a)")
"compiled with : ", trim( scompilername )
107 write(unit=*,fmt=
"(a24,a)")
"compiled for : ",trim( scompilationsystemstring )
108 write(unit=*,fmt=
"(a24,a)")
"git hash and branch : ", trim( sgithashstring )
109 write(unit=*, fmt=
"(a,/)") repeat(
"-",icount + 4)
111 if(inumargs == 0 )
then
113 write(unit=*,fmt=
"(a)")
" Compiler options : "
114 write(unit=*,fmt=
"(a,/,a,/)")
"==================== ", trim( scompileroptions )
118 write(unit=*,fmt=
"(//,a,/,/,6(a,/))")
"Usage: swb2 [ options ] control_file_name ", &
119 "[ --output_prefix= ] :: text to use as a prefix for output filenames", &
120 "[ --output_dir= ] :: directory to place output in (may be relative or absolute)", &
121 "[ --lookup_dir= ] :: directory to search for lookup tables", &
122 "[ --logfile_dir= ] :: directory to write logfiles to", &
123 "[ --data_dir= ] :: directory to search for input data grids", &
124 "[ --weather_data_dir= ] :: directory to search for weather data grids"
131 do iindex=1, inumargs
133 call get_command_argument( iindex, sbuf )
135 if ( sbuf(1:13) .eq.
"--output_dir=" )
then
137 soutputdirectoryname = trim( sbuf(14:) )
138 ilen = len_trim( soutputdirectoryname )
145 elseif( sbuf(1:15) .eq.
"--random_start=" )
then
149 elseif( sbuf(1:17) .eq.
"--number_of_sims=" )
then
151 number_of_simulations =
asint( sbuf(18:) )
153 elseif ( sbuf(1:16) .eq.
"--output_prefix=" )
then
155 soutputprefixname = trim( sbuf(17:) )
156 ilen = len_trim( soutputprefixname )
158 elseif ( sbuf(1:11) .eq.
"--data_dir=" )
then
160 sdatadirectoryname = sbuf(12:)
161 ilen = len_trim( sdatadirectoryname )
168 elseif ( sbuf(1:14) .eq.
"--logfile_dir=" )
then
169 slogfiledirectoryname = sbuf(15:)
170 ilen = len_trim( slogfiledirectoryname )
177 elseif ( sbuf(1:13) .eq.
"--lookup_dir=" )
then
179 slookuptabledirectoryname = sbuf(14:)
180 ilen = len_trim( slookuptabledirectoryname )
187 elseif ( sbuf(1:19) .eq.
"--lookup_table_dir=" )
then
189 slookuptabledirectoryname = sbuf(20:)
190 ilen = len_trim( slookuptabledirectoryname )
197 elseif ( sbuf(1:19) .eq.
"--weather_data_dir=" )
then
199 sweatherdatadirectoryname = sbuf(20:)
200 ilen = len_trim( sweatherdatadirectoryname )
210 call slcontrolfiles%append( trim( sbuf ) )
219 if ( len_trim( slogfiledirectoryname ) /= 0 )
then
220 call logs%set_output_directory( trim( slogfiledirectoryname ) )
221 elseif ( len_trim( soutputdirectoryname ) /= 0 )
then
222 call logs%set_output_directory( trim( soutputdirectoryname ) )
229 call logs%write( smessage=
'Grid data directory name set to:',lecho=.
true._c_bool )
230 call logs%write( smessage=
'"'//trim( sdatadirectoryname )//
'"', itab=4,lecho=.
true._c_bool )
231 call logs%write( smessage=
'Lookup table directory name set to:',lecho=.
true._c_bool )
232 call logs%write( smessage=
'"'//trim( slookuptabledirectoryname )//
'"', itab=4,lecho=.
true._c_bool )
233 call logs%write( smessage=
'Weather data directory (precip, tmin, tmax grids) name set to: ',lecho=.
true._c_bool )
234 call logs%write(
'"'//trim( sweatherdatadirectoryname )//
'"',itab=4,lecho=.
true._c_bool )
236 call logs%write( smessage=
'Output will be written to: ',lecho=.
true._c_bool )
237 call logs%write(
'"'//trim( soutputdirectoryname )//
'"',itab=4,lecho=.
true._c_bool )
238 call logs%write( smessage=
'Output file prefix set to:',lecho=.
true._c_bool )
239 call logs%write( smessage=
'"'//trim( soutputprefixname )//
'"', itab=4, lecho=.
true._c_bool )
242 call logs%write(smessage=
"Pseudo-random numbers will be pulled from index number " &
244 lecho=.
true._c_bool )
246 if ( number_of_simulations > 1) &
248 call logs%write(smessage=
"Running multiple simulations; assuming method of fragments " &
249 //
"was selected as the precipitation method.", &
250 lecho=.
true._c_bool )
254 do iindex=1, slcontrolfiles%count
259 call slcontrolfiles%clear()
262 sdatadirectoryname, slookuptabledirectoryname, &
263 sweatherdatadirectoryname )
266 call runtimer%calc_time_values(
"split")
267 call logs%write(smessage=
"Time spent initializing simulation: " &
268 //trim( runtimer%get_pretty()), lecho=.
true._c_bool, &
269 ilinesbefore=1, ilinesafter=1 )
271 call runtimer%start()
273 if ( number_of_simulations > 1)
then
284 call runtimer%calc_time_values(
"split")
285 call logs%write(smessage=
"Time spent running simulation: " &
286 //trim( runtimer%get_pretty()), lecho=.
true._c_bool, &
288 call runtimer%calc_time_values(
"elapsed")
289 call logs%write(smessage=
"Total runtime : " &
290 //trim( runtimer%get_pretty()), lecho=.
true._c_bool, &
program main
Main program which references all other modules; execution begins here.
This module contains physical constants and convenience functions aimed at performing unit conversion...
logical(c_bool), parameter, public true
character(len=1) os_native_path_delimiter
integer(c_long_long) random_start
subroutine log_provisional_disclaimer()
subroutine write_provisional_disclaimer()
type(logfile_t), public logs
type(model_domain_t), public model
subroutine, public read_control_file(sfilename)
subroutine, public initialize_all(output_prefix, output_dirname, data_dirname, lookup_table_dirname, weather_data_dirname)
subroutine, public iterate_over_multiple_simulation_days(cells, number_of_simulations)
subroutine, public iterate_over_simulation_days(cells)