104 character(len=LENMEMPATH) :: input_mempath
105 integer(I4B),
pointer :: simcontinue, nocheck, maxerror
106 character(len=:),
pointer :: prmem
107 character(len=LINELENGTH) :: errmsg
113 call mem_setptr(simcontinue,
'CONTINUE', input_mempath)
114 call mem_setptr(nocheck,
'NOCHECK', input_mempath)
115 call mem_setptr(prmem,
'PRMEM', input_mempath)
116 call mem_setptr(maxerror,
'MAXERRORS', input_mempath)
123 if (prmem /=
'')
then
126 if (errmsg /=
'')
then
133 write (iout,
'(/1x,a)')
'READING SIMULATION OPTIONS'
136 write (iout,
'(4x, a)') &
137 'SIMULATION WILL CONTINUE EVEN IF THERE IS NONCONVERGENCE.'
141 write (iout,
'(4x, a)') &
142 'MODEL DATA WILL NOT BE CHECKED FOR ERRORS.'
145 write (iout,
'(4x, a, i0)') &
146 'MAXIMUM NUMBER OF ERRORS THAT WILL BE STORED IS ', maxerror
148 if (prmem /=
'')
then
149 write (iout,
'(4x, a, a, a)') &
150 'MEMORY_PRINT_OPTION SET TO "', trim(prmem),
'".'
153 write (iout,
'(1x,a)')
'END OF SIMULATION OPTIONS'
167 character(len=LENMEMPATH) :: input_mempath
168 character(len=LENMEMPATH) :: tdis_input_mempath
169 character(len=:),
pointer :: tdis6
170 logical :: terminate = .true.
176 write (iout,
'(/1x,a)')
'READING SIMULATION TIMING'
179 call mem_setptr(tdis6,
'TDIS6', input_mempath)
182 if (tdis6 /=
'')
then
183 call tdis_cr(tdis6, tdis_input_mempath)
185 call store_error(
'TIMING block variable TDIS6 is unset'// &
186 ' in simulation control input.', terminate)
189 write (iout,
'(1x,a)')
'END OF SIMULATION TIMING'
215 character(len=LENMEMPATH) :: input_mempath
224 character(len=LINELENGTH) :: model_type
225 character(len=LINELENGTH) :: fname, model_name
226 integer(I4B) :: n, nr_models_glob
227 integer(I4B),
dimension(:),
pointer :: model_ranks => null()
228 logical :: terminate = .true.
234 call mem_setptr(mtypes,
'MTYPE', input_mempath)
235 call mem_setptr(mfnames,
'MFNAME', input_mempath)
236 call mem_setptr(mnames,
'MNAME', input_mempath)
239 nr_models_glob =
size(mnames)
240 allocate (model_names(nr_models_glob))
241 allocate (model_loc_idx(nr_models_glob))
245 model_ranks => ds%get_load_balance()
248 write (iout,
'(/1x,a)')
'READING SIMULATION MODELS'
252 do n = 1,
size(mtypes)
255 model_type = mtypes(n)
257 model_name = mnames(n)
263 model_loc_idx(n) = -1
267 select case (model_type)
269 if (model_ranks(n) == proc_id)
then
271 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
272 n,
' will be created'
273 call gwf_cr(fname, n, model_names(n))
275 model_loc_idx(n) = im
279 if (model_ranks(n) == proc_id)
then
281 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
282 n,
' will be created'
283 call gwt_cr(fname, n, model_names(n))
285 model_loc_idx(n) = im
289 if (model_ranks(n) == proc_id)
then
291 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
292 n,
' will be created'
293 call gwe_cr(fname, n, model_names(n))
295 model_loc_idx(n) = im
299 if (model_ranks(n) == proc_id)
then
301 write (iout,
'(4x,2a,i0,a)') trim(model_type),
" model ", &
302 n,
" will be created"
303 call chf_cr(fname, n, model_names(n))
304 call dev_feature(
'CHF is still under development, install the &
305 &nightly build or compile from source with IDEVELOPMODE = 1.')
307 model_loc_idx(n) = im
310 if (model_ranks(n) == proc_id)
then
312 write (iout,
'(4x,2a,i0,a)') trim(model_type),
" model ", &
313 n,
" will be created"
314 call olf_cr(fname, n, model_names(n))
315 call dev_feature(
'OLF is still under development, install the &
316 &nightly build or compile from source with IDEVELOPMODE = 1.')
318 model_loc_idx(n) = im
322 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
323 n,
' will be created'
324 call prt_cr(fname, n, model_names(n))
326 model_loc_idx(n) = im
329 'Unknown simulation model type: ', trim(model_type)
335 write (iout,
'(1x,a)')
'END OF SIMULATION MODELS'
338 if (simulation_mode ==
'PARALLEL' .and. im == 0)
then
339 write (
errmsg,
'(a, i0)') &
340 'No MODELS assigned to process ', proc_id
366 character(len=LENMEMPATH) :: input_mempath
377 character(len=LINELENGTH) :: exgtype
378 integer(I4B) :: exg_id
379 integer(I4B) :: m1_id, m2_id
380 character(len=LINELENGTH) :: fname, name1, name2
381 character(len=LENEXCHANGENAME) :: exg_name
382 character(len=LENMEMPATH) :: exg_mempath
384 character(len=LINELENGTH) :: errmsg
385 logical(LGP) :: terminate = .true.
386 logical(LGP) :: both_remote, both_local
388 character(len=*),
parameter :: fmtmerr =
"('Error in simulation control ', &
389 &'file. Could not find model: ', a)"
395 call mem_setptr(etypes,
'EXGTYPE', input_mempath)
396 call mem_setptr(efiles,
'EXGFILE', input_mempath)
397 call mem_setptr(emnames_a,
'EXGMNAMEA', input_mempath)
398 call mem_setptr(emnames_b,
'EXGMNAMEB', input_mempath)
399 call mem_setptr(emempaths,
'EXGMEMPATHS', input_mempath)
402 write (iout,
'(/1x,a)')
'READING SIMULATION EXCHANGES'
408 do n = 1,
size(etypes)
415 exg_mempath = emempaths(n)
420 m1_id =
ifind(model_names, name1)
422 write (errmsg, fmtmerr) trim(name1)
425 m2_id =
ifind(model_names, name2)
427 write (errmsg, fmtmerr) trim(name2)
432 both_remote = (model_loc_idx(m1_id) == -1 .and. &
433 model_loc_idx(m2_id) == -1)
434 both_local = (model_loc_idx(m1_id) > 0 .and. &
435 model_loc_idx(m2_id) > 0)
436 if (.not. both_remote)
then
437 write (iout,
'(4x,a,a,i0,a,i0,a,i0)') trim(exgtype),
' exchange ', &
438 exg_id,
' will be created to connect model ', m1_id, &
439 ' with model ', m2_id
442 select case (exgtype)
444 write (exg_name,
'(a,i0)')
'CHF-GWF_', exg_id
446 call chfgwf_cr(fname, exg_name, exg_id, m1_id, m2_id, exg_mempath)
449 write (exg_name,
'(a,i0)')
'GWF-GWF_', exg_id
450 if (.not. both_remote)
then
457 call gwfgwt_cr(fname, exg_id, m1_id, m2_id)
461 call gwfgwe_cr(fname, exg_id, m1_id, m2_id)
464 call gwfprt_cr(fname, exg_id, m1_id, m2_id)
466 write (exg_name,
'(a,i0)')
'GWT-GWT_', exg_id
467 if (.not. both_remote)
then
473 write (exg_name,
'(a,i0)')
'GWE-GWE_', exg_id
474 if (.not. both_remote)
then
480 write (exg_name,
'(a,i0)')
'OLF-GWF_', exg_id
482 call olfgwf_cr(fname, exg_name, exg_id, m1_id, m2_id, exg_mempath)
485 write (errmsg,
'(a,a)') &
486 'Unknown simulation exchange type: ', trim(exgtype)
492 write (iout,
'(1x,a)')
'END OF SIMULATION EXCHANGES'
501 integer(I4B),
intent(in) :: sgid
502 integer(I4B),
intent(in) :: isgpsoln
504 character(len=LINELENGTH) :: errmsg
505 logical :: terminate = .true.
507 character(len=*),
parameter :: fmterrmxiter = &
508 "('MXITER is set to ', i0, ' but there is only one solution', &
509 &' in SOLUTION GROUP ', i0, '. Set MXITER to 1 in simulation control', &
516 if (isgpsoln == 0)
then
517 write (errmsg,
'(a,i0)') &
518 'There are no solutions for solution group ', sgid
523 if (isgpsoln == 1 .and. sgp%mxiter > 1)
then
524 write (errmsg, fmterrmxiter) sgp%mxiter, isgpsoln
546 character(len=LENMEMPATH) :: input_mempath
553 integer(I4B),
dimension(:),
contiguous,
pointer :: blocknum
554 character(len=LINELENGTH) :: stype, fname
555 character(len=:),
allocatable :: mnames
559 integer(I4B) :: isoln
560 integer(I4B) :: isgpsoln
562 integer(I4B) :: glo_mid
563 integer(I4B) :: loc_idx
564 integer(I4B) :: i, j, istat, mxiter
565 integer(I4B) :: nwords
566 character(len=LENMODELNAME),
dimension(:),
allocatable :: words
567 character(len=:),
allocatable :: parse_str
568 character(len=LINELENGTH) :: errmsg
569 logical :: terminate = .true.
575 call mem_setptr(slntype,
'SLNTYPE', input_mempath)
576 call mem_setptr(slnfname,
'SLNFNAME', input_mempath)
577 call mem_setptr(slnmnames,
'SLNMNAMES', input_mempath)
578 call mem_setptr(blocknum,
'SOLUTIONGROUPNUM', input_mempath)
581 write (iout,
'(/1x,a)')
'READING SOLUTIONGROUP'
588 do i = 1,
size(blocknum)
591 allocate (
character(slnmnames(i)%strlen()) :: mnames)
596 mnames = slnmnames(i)
598 if (blocknum(i) /= sgid)
then
601 if (blocknum(i) == sgid + 1)
then
617 write (errmsg,
'(a,i0,a,i0,a)') &
618 'Solution group blocks are not listed consecutively. Found ', &
619 blocknum(i),
' when looking for ', sgid + 1,
'.'
628 read (fname, *, iostat=istat) mxiter
636 isgpsoln = isgpsoln + 1
640 call sgp%add_solution(isoln, sp)
643 parse_str = trim(mnames)//
' '
649 glo_mid =
ifind(model_names, words(j))
650 if (glo_mid == -1)
then
651 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(words(j))
655 loc_idx = model_loc_idx(glo_mid)
656 if (loc_idx == -1)
then
666 call sp%add_model(mp)
673 isgpsoln = isgpsoln + 1
677 call sgp%add_solution(isoln, sp)
680 parse_str = trim(mnames)//
' '
686 glo_mid =
ifind(model_names, words(j))
687 if (glo_mid == -1)
then
688 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(words(j))
692 loc_idx = model_loc_idx(glo_mid)
693 if (loc_idx == -1)
then
703 call sp%add_model(mp)
717 write (iout,
'(1x,a)')
'END OF SOLUTIONGROUP'
721 call store_error(
'There are no solution groups.', terminate)
729 character(len=LINELENGTH) :: errmsg
735 if (mp%idsoln == 0)
then
736 write (errmsg,
'(a,a)') &
737 'Model was not assigned to a solution: ', mp%name
759 type(
listtype),
pointer :: models_in_solution
760 integer(I4B) :: is, ie, im
770 models_in_solution => sp%get_models()
771 do im = 1, models_in_solution%Count()
773 if (ep%connects_model(mp))
then
776 call sp%add_exchange(ep)
788 character(len=*),
intent(in) :: mtype
789 character(len=*),
intent(inout) :: mname
793 character(len=LINELENGTH) :: errmsg
794 logical :: terminate = .true.
796 ilen = len_trim(mname)
798 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(mname)
800 write (errmsg,
'(a,i0,a,i0)') &
801 'Name length of ', ilen,
' exceeds maximum length of ', &
806 if (mname(i:i) ==
' ')
then
807 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(mname)
809 write (errmsg,
'(a)') &
810 '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.
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.