105 character(len=LENMEMPATH) :: input_mempath
106 integer(I4B),
pointer :: simcontinue, nocheck, maxerror
107 character(len=:),
pointer :: prmem, prprof
108 character(len=LINELENGTH) :: errmsg
114 call mem_setptr(simcontinue,
'CONTINUE', input_mempath)
115 call mem_setptr(nocheck,
'NOCHECK', input_mempath)
116 call mem_setptr(prmem,
'PRMEM', input_mempath)
117 call mem_setptr(prprof,
'PRPROF', input_mempath)
118 call mem_setptr(maxerror,
'MAXERRORS', input_mempath)
125 if (prmem /=
'')
then
128 if (errmsg /=
'')
then
134 call g_prof%set_print_option(prprof)
139 write (iout,
'(/1x,a)')
'READING SIMULATION OPTIONS'
142 write (iout,
'(4x, a)') &
143 'SIMULATION WILL CONTINUE EVEN IF THERE IS NONCONVERGENCE.'
147 write (iout,
'(4x, a)') &
148 'MODEL DATA WILL NOT BE CHECKED FOR ERRORS.'
151 write (iout,
'(4x, a, i0)') &
152 'MAXIMUM NUMBER OF ERRORS THAT WILL BE STORED IS ', maxerror
154 if (prmem /=
'')
then
155 write (iout,
'(4x, a, a, a)') &
156 'MEMORY_PRINT_OPTION SET TO "', trim(prmem),
'".'
159 write (iout,
'(1x,a)')
'END OF SIMULATION OPTIONS'
173 character(len=LENMEMPATH) :: input_mempath
174 character(len=LENMEMPATH) :: tdis_input_mempath
175 character(len=:),
pointer :: tdis6
176 logical :: terminate = .true.
182 write (iout,
'(/1x,a)')
'READING SIMULATION TIMING'
185 call mem_setptr(tdis6,
'TDIS6', input_mempath)
188 if (tdis6 /=
'')
then
189 call tdis_cr(tdis6, tdis_input_mempath)
191 call store_error(
'TIMING block variable TDIS6 is unset'// &
192 ' in simulation control input.', terminate)
195 write (iout,
'(1x,a)')
'END OF SIMULATION TIMING'
221 character(len=LENMEMPATH) :: input_mempath
230 character(len=LINELENGTH) :: model_type
231 character(len=LINELENGTH) :: fname, model_name
232 integer(I4B) :: n, nr_models_glob
233 integer(I4B),
dimension(:),
pointer :: model_ranks => null()
234 logical :: terminate = .true.
240 call mem_setptr(mtypes,
'MTYPE', input_mempath)
241 call mem_setptr(mfnames,
'MFNAME', input_mempath)
242 call mem_setptr(mnames,
'MNAME', input_mempath)
245 nr_models_glob =
size(mnames)
246 allocate (model_names(nr_models_glob))
247 allocate (model_loc_idx(nr_models_glob))
251 model_ranks => ds%get_load_balance()
254 write (iout,
'(/1x,a)')
'READING SIMULATION MODELS'
258 do n = 1,
size(mtypes)
261 model_type = mtypes(n)
263 model_name = mnames(n)
269 model_loc_idx(n) = -1
273 select case (model_type)
275 if (model_ranks(n) == proc_id)
then
277 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
278 n,
' will be created'
279 call gwf_cr(fname, n, model_names(n))
281 model_loc_idx(n) = im
285 if (model_ranks(n) == proc_id)
then
287 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
288 n,
' will be created'
289 call gwt_cr(fname, n, model_names(n))
291 model_loc_idx(n) = im
295 if (model_ranks(n) == proc_id)
then
297 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
298 n,
' will be created'
299 call gwe_cr(fname, n, model_names(n))
301 model_loc_idx(n) = im
305 if (model_ranks(n) == proc_id)
then
307 write (iout,
'(4x,2a,i0,a)') trim(model_type),
" model ", &
308 n,
" will be created"
309 call chf_cr(fname, n, model_names(n))
310 call dev_feature(
'CHF is still under development, install the &
311 &nightly build or compile from source with IDEVELOPMODE = 1.')
313 model_loc_idx(n) = im
316 if (model_ranks(n) == proc_id)
then
318 write (iout,
'(4x,2a,i0,a)') trim(model_type),
" model ", &
319 n,
" will be created"
320 call olf_cr(fname, n, model_names(n))
321 call dev_feature(
'OLF is still under development, install the &
322 &nightly build or compile from source with IDEVELOPMODE = 1.')
324 model_loc_idx(n) = im
328 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
329 n,
' will be created'
330 call prt_cr(fname, n, model_names(n))
332 model_loc_idx(n) = im
335 'Unknown simulation model type: ', trim(model_type)
341 write (iout,
'(1x,a)')
'END OF SIMULATION MODELS'
344 if (simulation_mode ==
'PARALLEL' .and. im == 0)
then
345 write (
errmsg,
'(a, i0)') &
346 'No MODELS assigned to process ', proc_id
372 character(len=LENMEMPATH) :: input_mempath
383 character(len=LINELENGTH) :: exgtype
384 integer(I4B) :: exg_id
385 integer(I4B) :: m1_id, m2_id
386 character(len=LINELENGTH) :: fname, name1, name2
387 character(len=LENEXCHANGENAME) :: exg_name
388 character(len=LENMEMPATH) :: exg_mempath
390 character(len=LINELENGTH) :: errmsg
391 logical(LGP) :: terminate = .true.
392 logical(LGP) :: both_remote, both_local
394 character(len=*),
parameter :: fmtmerr =
"('Error in simulation control ', &
395 &'file. Could not find model: ', a)"
401 call mem_setptr(etypes,
'EXGTYPE', input_mempath)
402 call mem_setptr(efiles,
'EXGFILE', input_mempath)
403 call mem_setptr(emnames_a,
'EXGMNAMEA', input_mempath)
404 call mem_setptr(emnames_b,
'EXGMNAMEB', input_mempath)
405 call mem_setptr(emempaths,
'EXGMEMPATHS', input_mempath)
408 write (iout,
'(/1x,a)')
'READING SIMULATION EXCHANGES'
414 do n = 1,
size(etypes)
421 exg_mempath = emempaths(n)
426 m1_id =
ifind(model_names, name1)
428 write (errmsg, fmtmerr) trim(name1)
431 m2_id =
ifind(model_names, name2)
433 write (errmsg, fmtmerr) trim(name2)
438 both_remote = (model_loc_idx(m1_id) == -1 .and. &
439 model_loc_idx(m2_id) == -1)
440 both_local = (model_loc_idx(m1_id) > 0 .and. &
441 model_loc_idx(m2_id) > 0)
442 if (.not. both_remote)
then
443 write (iout,
'(4x,a,a,i0,a,i0,a,i0)') trim(exgtype),
' exchange ', &
444 exg_id,
' will be created to connect model ', m1_id, &
445 ' with model ', m2_id
448 select case (exgtype)
450 write (exg_name,
'(a,i0)')
'CHF-GWF_', exg_id
452 call chfgwf_cr(fname, exg_name, exg_id, m1_id, m2_id, exg_mempath)
455 write (exg_name,
'(a,i0)')
'GWF-GWF_', exg_id
456 if (.not. both_remote)
then
463 call gwfgwt_cr(fname, exg_id, m1_id, m2_id)
467 call gwfgwe_cr(fname, exg_id, m1_id, m2_id)
470 call gwfprt_cr(fname, exg_id, m1_id, m2_id)
472 write (exg_name,
'(a,i0)')
'GWT-GWT_', exg_id
473 if (.not. both_remote)
then
479 write (exg_name,
'(a,i0)')
'GWE-GWE_', exg_id
480 if (.not. both_remote)
then
486 write (exg_name,
'(a,i0)')
'OLF-GWF_', exg_id
488 call olfgwf_cr(fname, exg_name, exg_id, m1_id, m2_id, exg_mempath)
491 write (errmsg,
'(a,a)') &
492 'Unknown simulation exchange type: ', trim(exgtype)
498 write (iout,
'(1x,a)')
'END OF SIMULATION EXCHANGES'
507 integer(I4B),
intent(in) :: sgid
508 integer(I4B),
intent(in) :: isgpsoln
510 character(len=LINELENGTH) :: errmsg
511 logical :: terminate = .true.
513 character(len=*),
parameter :: fmterrmxiter = &
514 "('MXITER is set to ', i0, ' but there is only one solution', &
515 &' in SOLUTION GROUP ', i0, '. Set MXITER to 1 in simulation control', &
522 if (isgpsoln == 0)
then
523 write (errmsg,
'(a,i0)') &
524 'There are no solutions for solution group ', sgid
529 if (isgpsoln == 1 .and. sgp%mxiter > 1)
then
530 write (errmsg, fmterrmxiter) sgp%mxiter, isgpsoln
552 character(len=LENMEMPATH) :: input_mempath
559 integer(I4B),
dimension(:),
contiguous,
pointer :: blocknum
560 character(len=LINELENGTH) :: stype, fname
561 character(len=:),
allocatable :: mnames
565 integer(I4B) :: isoln
566 integer(I4B) :: isgpsoln
568 integer(I4B) :: glo_mid
569 integer(I4B) :: loc_idx
570 integer(I4B) :: i, j, istat, mxiter
571 integer(I4B) :: nwords
572 character(len=LENMODELNAME),
dimension(:),
allocatable :: words
573 character(len=:),
allocatable :: parse_str
574 character(len=LINELENGTH) :: errmsg
575 logical :: terminate = .true.
581 call mem_setptr(slntype,
'SLNTYPE', input_mempath)
582 call mem_setptr(slnfname,
'SLNFNAME', input_mempath)
583 call mem_setptr(slnmnames,
'SLNMNAMES', input_mempath)
584 call mem_setptr(blocknum,
'SOLUTIONGROUPNUM', input_mempath)
587 write (iout,
'(/1x,a)')
'READING SOLUTIONGROUP'
594 do i = 1,
size(blocknum)
597 allocate (
character(slnmnames(i)%strlen()) :: mnames)
602 mnames = slnmnames(i)
604 if (blocknum(i) /= sgid)
then
607 if (blocknum(i) == sgid + 1)
then
623 write (errmsg,
'(a,i0,a,i0,a)') &
624 'Solution group blocks are not listed consecutively. Found ', &
625 blocknum(i),
' when looking for ', sgid + 1,
'.'
634 read (fname, *, iostat=istat) mxiter
642 isgpsoln = isgpsoln + 1
646 call sgp%add_solution(isoln, sp)
649 parse_str = trim(mnames)//
' '
655 glo_mid =
ifind(model_names, words(j))
656 if (glo_mid == -1)
then
657 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(words(j))
661 loc_idx = model_loc_idx(glo_mid)
662 if (loc_idx == -1)
then
672 call sp%add_model(mp)
679 isgpsoln = isgpsoln + 1
683 call sgp%add_solution(isoln, sp)
686 parse_str = trim(mnames)//
' '
692 glo_mid =
ifind(model_names, words(j))
693 if (glo_mid == -1)
then
694 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(words(j))
698 loc_idx = model_loc_idx(glo_mid)
699 if (loc_idx == -1)
then
709 call sp%add_model(mp)
723 write (iout,
'(1x,a)')
'END OF SOLUTIONGROUP'
727 call store_error(
'There are no solution groups.', terminate)
735 character(len=LINELENGTH) :: errmsg
741 if (mp%idsoln == 0)
then
742 write (errmsg,
'(a,a)') &
743 'Model was not assigned to a solution: ', mp%name
765 type(
listtype),
pointer :: models_in_solution
766 integer(I4B) :: is, ie, im
776 models_in_solution => sp%get_models()
777 do im = 1, models_in_solution%Count()
779 if (ep%connects_model(mp))
then
782 call sp%add_exchange(ep)
794 character(len=*),
intent(in) :: mtype
795 character(len=*),
intent(inout) :: mname
799 character(len=LINELENGTH) :: errmsg
800 logical :: terminate = .true.
802 ilen = len_trim(mname)
804 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(mname)
806 write (errmsg,
'(a,i0,a,i0)') &
807 'Name length of ', ilen,
' exceeds maximum length of ', &
812 if (mname(i:i) ==
' ')
then
813 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(mname)
815 write (errmsg,
'(a)') &
816 'Model name cannot have spaces within it.'
class(baseexchangetype) function, pointer, public getbaseexchangefromlist(list, idx)
Retrieve a specific BaseExchangeType object from a list.
class(basemodeltype) function, pointer, public getbasemodelfromlist(list, idx)
subroutine, public addbasesolutiontolist(list, solution)
class(basesolutiontype) function, pointer, public getbasesolutionfromlist(list, idx)
This module contains the ChfGwfExchangeModule Module.
subroutine, public chfgwf_cr(filename, name, id, m1_id, m2_id, input_mempath)
@ brief Create CHF GWF exchange
Channel Flow (CHF) Module.
subroutine, public chf_cr(filename, id, modelname)
Create a new surface water flow model object.
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
integer(i4b), parameter lenmodelname
maximum length of the model name
integer(i4b), parameter lenexchangename
maximum length of the exchange name
integer(i4b), parameter lenpackagetype
maximum length of a package type (DIS6, SFR6, CSUB6, etc.)
integer(i4b), parameter lenbigline
maximum length of a big line
real(dp), parameter dzero
real constant zero
integer(i4b), parameter lenmempath
maximum length of the memory path
Disable development features in release mode.
subroutine, public dev_feature(errmsg, iunit)
Terminate if in release mode (guard development features)
class(distributedsimtype) function, pointer, public get_dsim()
Get pointer to the distributed simulation object.
This module contains the GweGweExchangeModule Module.
subroutine, public gweexchange_create(filename, name, id, m1_id, m2_id, input_mempath)
@ brief Create GWT GWT exchange
subroutine, public gwe_cr(filename, id, modelname)
Create a new groundwater energy transport model object.
subroutine, public gwfgwe_cr(filename, id, m1_id, m2_id)
Create a new GWF to GWE exchange object.
This module contains the GwfGwfExchangeModule Module.
subroutine, public gwfexchange_create(filename, name, id, m1_id, m2_id, input_mempath)
@ brief Create GWF GWF exchange
subroutine, public gwfgwt_cr(filename, id, m1_id, m2_id)
Create a new GWF to GWT exchange object.
subroutine, public gwf_cr(filename, id, modelname)
Create a new groundwater flow model object.
subroutine, public gwfprt_cr(filename, id, m1id, m2id)
Create a new GWF to PRT exchange object.
This module contains the GwtGwtExchangeModule Module.
subroutine, public gwtexchange_create(filename, name, id, m1_id, m2_id, input_mempath)
@ brief Create GWT GWT exchange
subroutine, public gwt_cr(filename, id, modelname)
Create a new groundwater transport model object.
This module defines variable data types.
subroutine, public write_kindinfo(iout)
Write variable data types.
type(listtype), public basemodellist
type(listtype), public baseexchangelist
type(listtype), public solutiongrouplist
type(listtype), public basesolutionlist
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
subroutine, public mem_set_print_option(iout, keyword, error_msg)
Set the memory print option.
class(numericalmodeltype) function, pointer, public getnumericalmodelfromlist(list, idx)
This module contains the OlfGwfExchangeModule Module.
subroutine, public olfgwf_cr(filename, name, id, m1_id, m2_id, input_mempath)
@ brief Create OLF GWF exchange
Channel Flow (OLF) Module.
subroutine, public olf_cr(filename, id, modelname)
Create a new overland flow model object.
type(profilertype), public g_prof
the global timer object (to reduce trivial lines of code)
subroutine, public prt_cr(filename, id, modelname)
Create a new particle tracking model object.
This module contains simulation methods.
subroutine, public store_warning(msg, substring)
Store warning message.
subroutine, public store_error(msg, terminate)
Store an error message.
subroutine, public maxerrors(imax)
Set the maximum number of errors to be stored.
integer(i4b) function, public count_errors()
Return number of errors.
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
subroutine models_create()
Set the models to be used for the simulation.
subroutine check_model_assignment()
Check for dangling models, and break with error when found.
subroutine, public simulation_da()
Deallocate simulation variables.
subroutine options_create()
Set the simulation options.
subroutine check_model_name(mtype, mname)
Check that the model name is valid.
subroutine source_simulation_nam()
Source the simulation name file.
subroutine solution_groups_create()
Set the solution_groups to be used for the simulation.
subroutine timing_create()
Set the timing module to be used for the simulation.
subroutine exchanges_create()
Set the exchanges to be used for the simulation.
subroutine assign_exchanges()
Assign exchanges to solutions.
subroutine solution_group_check(sgp, sgid, isgpsoln)
Check a solution_group to be used for the simulation.
subroutine, public simulation_cr()
Read the simulation name file and initialize the models, exchanges.
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
character(len=linelength) idm_context
integer(i4b) isimcheck
simulation input check flag (1) to check input, (0) to ignore checks
integer(i4b) isimcontinue
simulation continue flag (1) to continue if isimcnvg = 0, (0) to terminate
character(len=linelength) simulation_mode
integer(i4b), dimension(:), allocatable model_loc_idx
equals the local index into the basemodel list (-1 when not available)
integer(i4b) iout
file unit number for simulation output
character(len=lenmodelname), dimension(:), allocatable model_names
all model names in the (global) simulation
class(basesolutiontype) function, pointer, public create_ims_solution(sim_mode, filename, sol_id)
Create an IMS solution of type NumericalSolution for serial runs or its sub-type ParallelSolution for...
class(basesolutiontype) function, pointer, public create_ems_solution(sim_mode, filename, sol_id)
Create an EMS solution of type ExplicitSolution for serial runs or its sub-type ParallelSolution for.
subroutine, public solutiongroup_create(sgp, id)
Create a new solution group.
subroutine, public addsolutiongrouptolist(list, solutiongroup)
subroutine, public tdis_cr(fname, inmempath)
Create temporal discretization.
This module contains version information.
subroutine write_listfile_header(iout, cmodel_type, write_sys_command, write_kind_info)
@ brief Write program header
subroutine, public add_virtual_gwe_exchange(name, exchange_id, model1_id, model2_id)
Add a virtual GWE-GWE exchange to the simulation.
subroutine, public add_virtual_gwe_model(model_id, model_name, model)
subroutine, public add_virtual_gwf_exchange(name, exchange_id, model1_id, model2_id)
Add a virtual GWF-GWF exchange to the simulation.
subroutine, public add_virtual_gwf_model(model_id, model_name, model)
Add virtual GWF model.
subroutine, public add_virtual_gwt_exchange(name, exchange_id, model1_id, model2_id)
Add a virtual GWT-GWT exchange to the simulation.
subroutine, public add_virtual_gwt_model(model_id, model_name, model)
Highest level model type. All models extend this parent type.
This class is used to store a single deferred-length character string. It was designed to work in an ...
A generic heterogeneous doubly-linked list.