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)
122 if (nocheck == 1)
then
130 if (prmem /=
'')
then
133 if (errmsg /=
'')
then
139 call g_prof%set_print_option(prprof)
144 write (iout,
'(/1x,a)')
'READING SIMULATION OPTIONS'
147 write (iout,
'(4x, a)') &
148 'SIMULATION WILL CONTINUE EVEN IF THERE IS NONCONVERGENCE.'
152 write (iout,
'(4x, a)') &
153 'MODEL DATA WILL NOT BE CHECKED FOR ERRORS.'
156 write (iout,
'(4x, a, i0)') &
157 'MAXIMUM NUMBER OF ERRORS THAT WILL BE STORED IS ', maxerror
159 if (prmem /=
'')
then
160 write (iout,
'(4x, a, a, a)') &
161 'MEMORY_PRINT_OPTION SET TO "', trim(prmem),
'".'
164 write (iout,
'(1x,a)')
'END OF SIMULATION OPTIONS'
178 character(len=LENMEMPATH) :: input_mempath
179 character(len=LENMEMPATH) :: tdis_input_mempath
180 character(len=:),
pointer :: tdis6
181 logical :: terminate = .true.
187 write (iout,
'(/1x,a)')
'READING SIMULATION TIMING'
190 call mem_setptr(tdis6,
'TDIS6', input_mempath)
193 if (tdis6 /=
'')
then
194 call tdis_cr(tdis6, tdis_input_mempath)
196 call store_error(
'TIMING block variable TDIS6 is unset'// &
197 ' in simulation control input.', terminate)
200 write (iout,
'(1x,a)')
'END OF SIMULATION TIMING'
226 character(len=LENMEMPATH) :: input_mempath
235 character(len=LINELENGTH) :: model_type
236 character(len=LINELENGTH) :: fname, model_name
237 integer(I4B) :: n, nr_models_glob
238 integer(I4B),
dimension(:),
pointer :: model_ranks => null()
239 logical :: terminate = .true.
245 call mem_setptr(mtypes,
'MTYPE', input_mempath)
246 call mem_setptr(mfnames,
'MFNAME', input_mempath)
247 call mem_setptr(mnames,
'MNAME', input_mempath)
250 nr_models_glob =
size(mnames)
251 allocate (model_names(nr_models_glob))
252 allocate (model_loc_idx(nr_models_glob))
256 model_ranks => ds%get_load_balance()
259 write (iout,
'(/1x,a)')
'READING SIMULATION MODELS'
263 do n = 1,
size(mtypes)
266 model_type = mtypes(n)
268 model_name = mnames(n)
274 model_loc_idx(n) = -1
278 select case (model_type)
280 if (model_ranks(n) == proc_id)
then
282 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
283 n,
' will be created'
284 call gwf_cr(fname, n, model_names(n))
286 model_loc_idx(n) = im
290 if (model_ranks(n) == proc_id)
then
292 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
293 n,
' will be created'
294 call gwt_cr(fname, n, model_names(n))
296 model_loc_idx(n) = im
300 if (model_ranks(n) == proc_id)
then
302 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
303 n,
' will be created'
304 call gwe_cr(fname, n, model_names(n))
306 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 chf_cr(fname, n, model_names(n))
315 call developmode(
'CHF is still under development, install the &
316 &nightly build or compile from source with IDEVELOPMODE = 1.')
318 model_loc_idx(n) = im
321 if (model_ranks(n) == proc_id)
then
323 write (iout,
'(4x,2a,i0,a)') trim(model_type),
" model ", &
324 n,
" will be created"
325 call olf_cr(fname, n, model_names(n))
326 call developmode(
'OLF is still under development, install the &
327 &nightly build or compile from source with IDEVELOPMODE = 1.')
329 model_loc_idx(n) = im
333 write (iout,
'(4x,2a,i0,a)') trim(model_type),
' model ', &
334 n,
' will be created'
335 call prt_cr(fname, n, model_names(n))
337 model_loc_idx(n) = im
340 'Unknown simulation model type: ', trim(model_type)
346 write (iout,
'(1x,a)')
'END OF SIMULATION MODELS'
349 if (simulation_mode ==
'PARALLEL' .and. im == 0)
then
350 write (
errmsg,
'(a, i0)') &
351 'No MODELS assigned to process ', proc_id
377 character(len=LENMEMPATH) :: input_mempath
388 character(len=LINELENGTH) :: exgtype
389 integer(I4B) :: exg_id
390 integer(I4B) :: m1_id, m2_id
391 character(len=LINELENGTH) :: fname, name1, name2
392 character(len=LENEXCHANGENAME) :: exg_name
393 character(len=LENMEMPATH) :: exg_mempath
395 character(len=LINELENGTH) :: errmsg
396 logical(LGP) :: terminate = .true.
397 logical(LGP) :: both_remote, both_local
399 character(len=*),
parameter :: fmtmerr =
"('Error in simulation control ', &
400 &'file. Could not find model: ', a)"
406 call mem_setptr(etypes,
'EXGTYPE', input_mempath)
407 call mem_setptr(efiles,
'EXGFILE', input_mempath)
408 call mem_setptr(emnames_a,
'EXGMNAMEA', input_mempath)
409 call mem_setptr(emnames_b,
'EXGMNAMEB', input_mempath)
410 call mem_setptr(emempaths,
'EXGMEMPATHS', input_mempath)
413 write (iout,
'(/1x,a)')
'READING SIMULATION EXCHANGES'
419 do n = 1,
size(etypes)
426 exg_mempath = emempaths(n)
431 m1_id =
ifind(model_names, name1)
433 write (errmsg, fmtmerr) trim(name1)
436 m2_id =
ifind(model_names, name2)
438 write (errmsg, fmtmerr) trim(name2)
443 both_remote = (model_loc_idx(m1_id) == -1 .and. &
444 model_loc_idx(m2_id) == -1)
445 both_local = (model_loc_idx(m1_id) > 0 .and. &
446 model_loc_idx(m2_id) > 0)
447 if (.not. both_remote)
then
448 write (iout,
'(4x,a,a,i0,a,i0,a,i0)') trim(exgtype),
' exchange ', &
449 exg_id,
' will be created to connect model ', m1_id, &
450 ' with model ', m2_id
453 select case (exgtype)
455 write (exg_name,
'(a,i0)')
'CHF-GWF_', exg_id
457 call chfgwf_cr(fname, exg_name, exg_id, m1_id, m2_id, exg_mempath)
460 write (exg_name,
'(a,i0)')
'GWF-GWF_', exg_id
461 if (.not. both_remote)
then
468 call gwfgwt_cr(fname, exg_id, m1_id, m2_id)
472 call gwfgwe_cr(fname, exg_id, m1_id, m2_id)
475 call gwfprt_cr(fname, exg_id, m1_id, m2_id)
477 write (exg_name,
'(a,i0)')
'GWT-GWT_', exg_id
478 if (.not. both_remote)
then
484 write (exg_name,
'(a,i0)')
'GWE-GWE_', exg_id
485 if (.not. both_remote)
then
491 write (exg_name,
'(a,i0)')
'OLF-GWF_', exg_id
493 call olfgwf_cr(fname, exg_name, exg_id, m1_id, m2_id, exg_mempath)
496 write (errmsg,
'(a,a)') &
497 'Unknown simulation exchange type: ', trim(exgtype)
503 write (iout,
'(1x,a)')
'END OF SIMULATION EXCHANGES'
512 integer(I4B),
intent(in) :: sgid
513 integer(I4B),
intent(in) :: isgpsoln
515 character(len=LINELENGTH) :: errmsg
516 logical :: terminate = .true.
518 character(len=*),
parameter :: fmterrmxiter = &
519 "('MXITER is set to ', i0, ' but there is only one solution', &
520 &' in SOLUTION GROUP ', i0, '. Set MXITER to 1 in simulation control', &
527 if (isgpsoln == 0)
then
528 write (errmsg,
'(a,i0)') &
529 'There are no solutions for solution group ', sgid
534 if (isgpsoln == 1 .and. sgp%mxiter > 1)
then
535 write (errmsg, fmterrmxiter) sgp%mxiter, isgpsoln
557 character(len=LENMEMPATH) :: input_mempath
564 integer(I4B),
dimension(:),
contiguous,
pointer :: blocknum
565 character(len=LINELENGTH) :: stype, fname
566 character(len=:),
allocatable :: mnames
570 integer(I4B) :: isoln
571 integer(I4B) :: isgpsoln
573 integer(I4B) :: glo_mid
574 integer(I4B) :: loc_idx
575 integer(I4B) :: i, j, istat, mxiter
576 integer(I4B) :: nwords
577 character(len=LENMODELNAME),
dimension(:),
allocatable :: words
578 character(len=:),
allocatable :: parse_str
579 character(len=LINELENGTH) :: errmsg
580 logical :: terminate = .true.
586 call mem_setptr(slntype,
'SLNTYPE', input_mempath)
587 call mem_setptr(slnfname,
'SLNFNAME', input_mempath)
588 call mem_setptr(slnmnames,
'SLNMNAMES', input_mempath)
589 call mem_setptr(blocknum,
'SOLUTIONGROUPNUM', input_mempath)
592 write (iout,
'(/1x,a)')
'READING SOLUTIONGROUP'
599 do i = 1,
size(blocknum)
602 allocate (
character(slnmnames(i)%strlen()) :: mnames)
607 mnames = slnmnames(i)
609 if (blocknum(i) /= sgid)
then
612 if (blocknum(i) == sgid + 1)
then
628 write (errmsg,
'(a,i0,a,i0,a)') &
629 'Solution group blocks are not listed consecutively. Found ', &
630 blocknum(i),
' when looking for ', sgid + 1,
'.'
639 read (fname, *, iostat=istat) mxiter
647 isgpsoln = isgpsoln + 1
651 call sgp%add_solution(isoln, sp)
654 parse_str = trim(mnames)//
' '
660 glo_mid =
ifind(model_names, words(j))
661 if (glo_mid == -1)
then
662 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(words(j))
666 loc_idx = model_loc_idx(glo_mid)
667 if (loc_idx == -1)
then
677 call sp%add_model(mp)
684 isgpsoln = isgpsoln + 1
688 call sgp%add_solution(isoln, sp)
691 parse_str = trim(mnames)//
' '
697 glo_mid =
ifind(model_names, words(j))
698 if (glo_mid == -1)
then
699 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(words(j))
703 loc_idx = model_loc_idx(glo_mid)
704 if (loc_idx == -1)
then
714 call sp%add_model(mp)
728 write (iout,
'(1x,a)')
'END OF SOLUTIONGROUP'
732 call store_error(
'There are no solution groups.', terminate)
740 character(len=LINELENGTH) :: errmsg
746 if (mp%idsoln == 0)
then
747 write (errmsg,
'(a,a)') &
748 'Model was not assigned to a solution: ', mp%name
770 type(
listtype),
pointer :: models_in_solution
771 integer(I4B) :: is, ie, im
781 models_in_solution => sp%get_models()
782 do im = 1, models_in_solution%Count()
784 if (ep%connects_model(mp))
then
787 call sp%add_exchange(ep)
799 character(len=*),
intent(in) :: mtype
800 character(len=*),
intent(inout) :: mname
804 character(len=LINELENGTH) :: errmsg
805 logical :: terminate = .true.
807 ilen = len_trim(mname)
809 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(mname)
811 write (errmsg,
'(a,i0,a,i0)') &
812 'Name length of ', ilen,
' exceeds maximum length of ', &
817 if (mname(i:i) ==
' ')
then
818 write (errmsg,
'(a,a)')
'Invalid model name: ', trim(mname)
820 write (errmsg,
'(a)') &
821 '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.
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.