program swim
use time, only : time_process_years
implicit none
! Version string, the only place this is defined
character(*), parameter :: version = "v2021.1"
! Modules in order of dependence
character(*), dimension(19), parameter :: swim_modules = (/ &
! Space-time modules
"time ", & ! 1
"hydrotope ", & ! 2
"subbasin ", & ! 3
"catchment ", & ! 4
! process modules
"evapotranspiration ", & ! 5
"soil ", & ! 6
"groundwater ", & ! 7
"reservoir ", & ! 8
"vegetation ", & ! 9
"crop ", & ! 10
"landuse ", & ! 11
"snow ", & ! 12
"nutrient ", & ! 13
"management ", & ! 14
"river ", & ! 15
"erosion ", & ! 16
! utility modules
"output ", & ! 17
"input ", & ! 18
"utilities " & ! 19
/)
call initialise
call time_process_years
call terminate
contains
subroutine initialise
use catchment, only : &
bSubcatch, &
catchment_ids, &
catchment_initialise, &
catchment_initialise_parameters, &
da, &
subcatch_id
use crop, only : crop_initialise, crop_read_input, mcrdb
use erosion, only : cvm, erosion_initialise
use evapotranspiration, only : evapotranspiration_initialise, lat
use groundwater, only : groundwater_correct_params, groundwater_initialise
use hydrotope, only : &
frar, &
hydrotope_area, &
hydrotope_ids, &
hydrotope_initialise, &
hydrotope_input_file_id, &
hydrotope_subbasin_id, &
meap, &
mstruc
use input, only : &
get_config_fid, &
input_initialise, &
#ifdef with_netcdf
input_nc_initialise, &
#endif
parse_commandline_arguments, &
print_splash
use landuse, only : LULC, landuse_initialise, nlut
use management, only : management_initialise
use nutrient, only : &
bn1, &
bn2, &
bn3, &
bnu1, &
bnu2, &
bp1, &
bp2, &
bp3, &
bpu1, &
bpu2, &
nutrient_initialise
use output, only : &
output_initialise, &
output_initialise_user_input, &
output_print_variables, &
output_dir
use reservoir, only : reservoir_initialise
use river, only : &
chd, &
chl, &
chn, &
chnn, &
chs, &
chss, &
ovn, &
river_initialise, &
river_initialise_travel_time
use snow, only : snow_initialise
use soil, only : al, amp, avt, ffc, ml, ms, soil_initialise, tc, wft, wi
use subbasin, only : &
flu, &
icodes, &
inum1s, &
mb, &
mch, &
mhyd, &
neap, &
sbar, &
slope_length, &
stp, &
subbasin_ids, &
subbasin_initialise, &
subbasin_initialise_area, &
subbasin_initialise_weather_gen, &
subbasin_input_file_id, &
tp5, &
tp6
use time, only : iyr, nbyr, nc, ndayssim, time_initialise
use utilities, only : log_info, identifier_max_length
use vegetation, only : vegetation_initialise
character(len=identifier_max_length) :: print_defaults
logical :: print_output_variables
call parse_commandline_arguments(version, print_output_variables, print_defaults)
if (trim(print_defaults) /= '') call print_module_parameters(print_defaults)
call print_splash(version)
! Utility modules
call input_initialise
call output_initialise_user_input
! Space-time modules
call time_initialise
call subbasin_initialise
call hydrotope_initialise(mb, neap, sbar)
call catchment_initialise(sbar, flu)
! Process modules
call landuse_initialise
call river_initialise(mb, mch, mhyd, subbasin_input_file_id)
call soil_initialise(mb, meap, mstruc, neap, bSubcatch, da, slope_length, stp, ovn, chs, flu, chn, chl, LULC%cn2a, LULC%cn2b, LULC%cn2c, LULC%cn2d)
call crop_initialise(iyr, mb, meap, ms, nbyr)
call erosion_initialise(mb, mcrdb, meap, subbasin_input_file_id, da, flu, stp, slope_length, tc, tp6, tp5, al, chl, chnn, chd, chss)
call nutrient_initialise(mb, mcrdb, meap, ml)
call evapotranspiration_initialise(mb, meap, subbasin_input_file_id)
call vegetation_initialise(mb, nlut, mcrdb, meap, lat)
call crop_read_input(bn1, bn2, bn3, bnu1, bnu2, bp1, bp2, bp3, bpu1, bpu2, cvm)
call groundwater_initialise(mb, subbasin_input_file_id)
call reservoir_initialise(icodes, inum1s, mb, mhyd)
call snow_initialise(mb, meap, subbasin_input_file_id, mstruc)
call management_initialise(get_config_fid(), frar, icodes, inum1s, iyr, &
mb, mhyd, mstruc, ndayssim, nbyr, neap, sbar, output_dir)
! Preprocessing that depends on many modules input data (could likely be detangled)
call catchment_initialise_parameters(mb, nbyr, sbar)
call river_initialise_travel_time(mb)
call subbasin_initialise_area(da)
call groundwater_correct_params
call subbasin_initialise_weather_gen(amp, avt, ffc, lat, nc, wft, wi)
! open ncdf climate files and initialise module
#ifdef with_netcdf
call input_nc_initialise(iyr, mb)
#endif
call output_initialise( &
hydrotope_ids, hydrotope_area, hydrotope_subbasin_id, subbasin_ids, neap, &
subcatch_id, catchment_ids, hydrotope_input_file_id, subbasin_input_file_id)
call log_info('swim', 'MAX number of soil layers =', int=ml)
call log_info('swim', 'MAX number of simulation years =', int=nbyr)
call log_info('swim', 'Number of years of simulation =', int=nbyr)
call log_info('swim', 'First year =', int=iyr)
call log_info('swim', 'Number of subbasins =', int=mb)
call log_info('swim', 'Number of soil types =', int=ms)
call log_info('swim', 'Number of crops in crop DB =', int=mcrdb)
call log_info('swim', 'Number of land use types =', int=nlut)
call log_info('swim', 'Program codes & Routing structure files - READ!')
if (print_output_variables) call output_print_variables
end subroutine initialise
subroutine terminate
use input, only : &
#ifdef with_netcdf
input_nc_close, &
#endif
get_config_fid
use management, only : bWAM_Module, management_write_user_output
use subbasin, only : mb
use time, only : nDaysSim
use catchment, only : dealloc_catchment
use crop, only : crop_deallocate
use erosion, only : dealloc_erosion
use evapotranspiration, only : dealloc_evapotranspiration
use groundwater, only : dealloc_groundwater
use hydrotope, only : dealloc_hydrotope
use nutrient, only : dealloc_nutrient
use output, only : dealloc_output
use reservoir, only : dealloc_reservoir
use river, only : dealloc_river
use snow, only : dealloc_snow
use soil, only : dealloc_soil
use subbasin, only : subbasin_close
use vegetation, only : dealloc_vegetation
if (bWAM_Module) call management_write_user_output(mb, ndayssim)
close(get_config_fid())
call dealloc_catchment
call crop_deallocate
call dealloc_erosion
call dealloc_evapotranspiration
call dealloc_groundwater
call dealloc_hydrotope
call dealloc_nutrient
call dealloc_output
call dealloc_reservoir
call dealloc_river
call dealloc_snow
call dealloc_soil
call subbasin_close
call dealloc_vegetation
!**** Close netcdf files
#ifdef with_netcdf
call input_nc_close
#endif
return
end subroutine terminate
subroutine print_module_parameters(module_name)
! Print modules' current parameters
! This subroutine has to be placed in the SWIM program unit as
! namelists cant be parsed as arguments
use time, only : time_parameters
!use hydrotope, only : hydrotope_parameters
use subbasin, only : subbasin_parameters
use catchment, only : catchment_parameters
use evapotranspiration, only : evapotranspiration_parameters
use soil, only : soil_parameters
use groundwater, only : groundwater_parameters
use reservoir, only : reservoir_parameters
use vegetation, only : vegetation_parameters
use crop, only : crop_parameters
use landuse, only : landuse_parameters
use snow, only : snow_parameters
use nutrient, only : nutrient_parameters
use management, only : management_parameters
use river, only : river_parameters
use erosion, only : erosion_parameters
use input, only : &
input_parameters, &
#ifdef with_netcdf
nc_climate_parameters, &
#endif
print_help
use output, only : output_parameters
character(len=*), intent(in) :: module_name
logical :: pparams(size(swim_modules))
pparams = swim_modules == module_name
if (module_name == "all") pparams(:) = .True.
if (.not. any(pparams)) &
call print_help("Not a valid module name in -d "//trim(module_name))
if (pparams(1)) write(*, nml=time_parameters)
!if (pparams(2)) write(*, nml=hydrotope_parameters)
if (pparams(3)) write(*, nml=subbasin_parameters)
if (pparams(4)) write(*, nml=catchment_parameters)
if (pparams(5)) write(*, nml=evapotranspiration_parameters)
if (pparams(6)) write(*, nml=soil_parameters)
if (pparams(7)) write(*, nml=groundwater_parameters)
if (pparams(8)) write(*, nml=reservoir_parameters)
if (pparams(9)) write(*, nml=vegetation_parameters)
if (pparams(10)) write(*, nml=crop_parameters)
if (pparams(11)) write(*, nml=landuse_parameters)
if (pparams(12)) write(*, nml=snow_parameters)
if (pparams(13)) write(*, nml=nutrient_parameters)
if (pparams(14)) write(*, nml=management_parameters)
if (pparams(15)) write(*, nml=river_parameters)
if (pparams(16)) write(*, nml=erosion_parameters)
if (pparams(17)) write(*, nml=output_parameters)
if (pparams(18)) then
write(*, nml=input_parameters)
#ifdef with_netcdf
write(*, nml=nc_climate_parameters)
#endif
end if
stop
end subroutine print_module_parameters
end program swim