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)
120 if (nocheck == 1)
then
128 if (prmem /=
'')
then
131 if (errmsg /=
'')
then
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 developmode(
'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 developmode(
'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
class(distributedsimtype) function, pointer, public get_dsim()
Get pointer to the distributed simulation object.
Disable development features in release mode.
subroutine, public developmode(errmsg, iunit)
Terminate if in release mode (guard development features)
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.