MODFLOW 6 version 6.9.0.dev0
USGS Modular Hydrologic Model
Loading...
Searching...
No Matches
exg-gwfgwt.f90
Go to the documentation of this file.
2 use kindmodule, only: dp, i4b, lgp
6 use simmodule, only: store_error
17 use gwfmodule, only: gwfmodeltype
18 use gwtmodule, only: gwtmodeltype
20
21 implicit none
22 public :: gwfgwtexchangetype
23 public :: gwfgwt_cr
24
26
27 integer(I4B), pointer :: m1_idx => null() !< index into the list of base exchanges for model 1
28 integer(I4B), pointer :: m2_idx => null() !< index into the list of base exchanges for model 2
29 character(len=LINELENGTH) :: filename !< the input file for the GWF-GWT exchange
30
31 contains
32
33 procedure :: exg_df
34 procedure :: exg_ar
35 procedure :: exg_da
36 procedure, private :: set_model_pointers
37 procedure, private :: allocate_scalars
38 procedure, private :: gwfbnd2gwtfmi
39 procedure, private :: gwfconn2gwtconn
40 procedure, private :: link_connections
41
42 end type gwfgwtexchangetype
43
44contains
45
46 !> @brief Create a new GWF to GWT exchange object
47 !<
48 subroutine gwfgwt_cr(filename, id, m1_id, m2_id)
49 ! -- modules
51 ! -- dummy
52 character(len=*), intent(in) :: filename
53 integer(I4B), intent(in) :: id
54 integer(I4B), intent(in) :: m1_id
55 integer(I4B), intent(in) :: m2_id
56 ! -- local
57 class(baseexchangetype), pointer :: baseexchange => null()
58 type(gwfgwtexchangetype), pointer :: exchange => null()
59 character(len=20) :: cint
60 !
61 ! -- Create a new exchange and add it to the baseexchangelist container
62 allocate (exchange)
63 baseexchange => exchange
64 call addbaseexchangetolist(baseexchangelist, baseexchange)
65 !
66 ! -- Assign id and name
67 exchange%id = id
68 write (cint, '(i0)') id
69 exchange%name = 'GWF-GWT_'//trim(adjustl(cint))
70 exchange%memoryPath = exchange%name
71 exchange%filename = filename
72 !
73 ! -- allocate scalars
74 call exchange%allocate_scalars()
75 !
76 ! -- NB: convert from id to local model index in base model list
77 exchange%m1_idx = model_loc_idx(m1_id)
78 exchange%m2_idx = model_loc_idx(m2_id)
79 !
80 ! -- set model pointers
81 call exchange%set_model_pointers()
82 end subroutine gwfgwt_cr
83
84 !> @brief Allocate and read
85 !<
86 subroutine set_model_pointers(this)
87 ! -- dummy
88 class(gwfgwtexchangetype) :: this
89 ! -- local
90 class(basemodeltype), pointer :: mb => null()
91 type(gwfmodeltype), pointer :: gwfmodel => null()
92 type(gwtmodeltype), pointer :: gwtmodel => null()
93 !
94 ! -- set gwfmodel
95 gwfmodel => null()
96 mb => getbasemodelfromlist(basemodellist, this%m1_idx)
97 select type (mb)
98 type is (gwfmodeltype)
99 gwfmodel => mb
100 end select
101 !
102 ! -- set gwtmodel
103 gwtmodel => null()
104 mb => getbasemodelfromlist(basemodellist, this%m2_idx)
105 select type (mb)
106 type is (gwtmodeltype)
107 gwtmodel => mb
108 end select
109 !
110 ! -- Verify that gwf model is of the correct type
111 if (.not. associated(gwfmodel)) then
112 write (errmsg, '(3a)') 'Problem with GWF-GWT exchange ', trim(this%name), &
113 '. Specified GWF Model does not appear to be of the correct type.'
114 call store_error(errmsg, terminate=.true.)
115 end if
116 !
117 ! -- Verify that gwt model is of the correct type
118 if (.not. associated(gwtmodel)) then
119 write (errmsg, '(3a)') 'Problem with GWF-GWT exchange ', trim(this%name), &
120 '. Specified GWT Model does not appear to be of the correct type.'
121 call store_error(errmsg, terminate=.true.)
122 end if
123 !
124 ! -- Tell transport model fmi flows are not read from file
125 gwtmodel%fmi%flows_from_file = .false.
126 !
127 ! -- Set a pointer to the GWF bndlist. This will allow the transport model
128 ! to look through the flow packages and establish a link to GWF flows
129 gwtmodel%fmi%gwfbndlist => gwfmodel%bndlist
130 end subroutine set_model_pointers
131
132 !> @brief Define the GwfGwt Exchange object
133 !<
134 subroutine exg_df(this)
135 ! -- modules
137 ! -- dummy
138 class(gwfgwtexchangetype) :: this
139 ! -- local
140 class(basemodeltype), pointer :: mb => null()
141 type(gwfmodeltype), pointer :: gwfmodel => null()
142 type(gwtmodeltype), pointer :: gwtmodel => null()
143 !
144 ! -- set gwfmodel
145 mb => getbasemodelfromlist(basemodellist, this%m1_idx)
146 select type (mb)
147 type is (gwfmodeltype)
148 gwfmodel => mb
149 end select
150 !
151 ! -- set gwtmodel
152 mb => getbasemodelfromlist(basemodellist, this%m2_idx)
153 select type (mb)
154 type is (gwtmodeltype)
155 gwtmodel => mb
156 end select
157 !
158 ! -- Check to make sure that flow is solved before transport and in a
159 ! different IMS solution
160 if (gwfmodel%idsoln >= gwtmodel%idsoln) then
161 write (errmsg, '(3a)') 'Problem with GWF-GWT exchange ', trim(this%name), &
162 '. The GWF model must be solved by a different IMS than the GWT model. &
163 &Furthermore, the IMS specified for GWF must be listed in mfsim.nam &
164 &before the IMS for GWT.'
165 call store_error(errmsg, terminate=.true.)
166 end if
167 !
168 ! -- Set pointer to flowja
169 gwtmodel%fmi%gwfflowja => gwfmodel%flowja
170 call mem_checkin(gwtmodel%fmi%gwfflowja, &
171 'GWFFLOWJA', gwtmodel%fmi%memoryPath, &
172 'FLOWJA', gwfmodel%memoryPath)
173
174 !
175 ! -- Set the npf flag so that specific discharge is available for
176 ! transport calculations if dispersion is active
177 if (gwtmodel%indsp > 0) then
178 gwfmodel%npf%icalcspdis = 1
179 end if
180 end subroutine exg_df
181
182 !> @brief Allocate and read
183 !<
184 subroutine exg_ar(this)
185 ! -- modules
187 use dismodule, only: distype
188 use disvmodule, only: disvtype
189 use disumodule, only: disutype
190 ! -- dummy
191 class(gwfgwtexchangetype) :: this
192 ! -- local
193 class(basemodeltype), pointer :: mb => null()
194 type(gwfmodeltype), pointer :: gwfmodel => null()
195 type(gwtmodeltype), pointer :: gwtmodel => null()
196 ! -- formats
197 character(len=*), parameter :: fmtdiserr = &
198 "('GWF and GWT Models do not have the same discretization for exchange&
199 & ',a,'.&
200 & GWF Model has ', i0, ' user nodes and ', i0, ' reduced nodes.&
201 & GWT Model has ', i0, ' user nodes and ', i0, ' reduced nodes.&
202 & Ensure discretization packages, including IDOMAIN, are identical.')"
203 character(len=*), parameter :: fmtidomerr = &
204 "('GWF and GWT Models do not have the same discretization for exchange&
205 & ',a,'.&
206 & GWF Model and GWT Model have different IDOMAIN arrays.&
207 & Ensure discretization packages, including IDOMAIN, are identical.')"
208 !
209 ! -- set gwfmodel
210 mb => getbasemodelfromlist(basemodellist, this%m1_idx)
211 select type (mb)
212 type is (gwfmodeltype)
213 gwfmodel => mb
214 end select
215 !
216 ! -- set gwtmodel
217 mb => getbasemodelfromlist(basemodellist, this%m2_idx)
218 select type (mb)
219 type is (gwtmodeltype)
220 gwtmodel => mb
221 end select
222 !
223 ! -- Check to make sure sizes are identical
224 if (gwtmodel%dis%nodes /= gwfmodel%dis%nodes .or. &
225 gwtmodel%dis%nodesuser /= gwfmodel%dis%nodesuser) then
226 write (errmsg, fmtdiserr) trim(this%name), &
227 gwfmodel%dis%nodesuser, &
228 gwfmodel%dis%nodes, &
229 gwtmodel%dis%nodesuser, &
230 gwtmodel%dis%nodes
231 call store_error(errmsg, terminate=.true.)
232 end if
233 !
234 ! -- Make sure idomains are identical
235 select type (gwfdis => gwfmodel%dis)
236 type is (distype)
237 select type (gwtdis => gwtmodel%dis)
238 type is (distype)
239 if (.not. all(gwfdis%idomain == gwtdis%idomain)) then
240 write (errmsg, fmtidomerr) trim(this%name)
241 call store_error(errmsg, terminate=.true.)
242 end if
243 end select
244 type is (disvtype)
245 select type (gwtdis => gwtmodel%dis)
246 type is (disvtype)
247 if (.not. all(gwfdis%idomain == gwtdis%idomain)) then
248 write (errmsg, fmtidomerr) trim(this%name)
249 call store_error(errmsg, terminate=.true.)
250 end if
251 end select
252 type is (disutype)
253 select type (gwtdis => gwtmodel%dis)
254 type is (disutype)
255 if (.not. all(gwfdis%idomain == gwtdis%idomain)) then
256 write (errmsg, fmtidomerr) trim(this%name)
257 call store_error(errmsg, terminate=.true.)
258 end if
259 end select
260 end select
261 !
262 ! -- setup pointers to gwf variables allocated in gwf_ar
263 gwtmodel%fmi%gwfhead => gwfmodel%x
264 call mem_checkin(gwtmodel%fmi%gwfhead, &
265 'GWFHEAD', gwtmodel%fmi%memoryPath, &
266 'X', gwfmodel%memoryPath)
267 gwtmodel%fmi%gwfsat => gwfmodel%npf%sat
268 call mem_checkin(gwtmodel%fmi%gwfsat, &
269 'GWFSAT', gwtmodel%fmi%memoryPath, &
270 'SAT', gwfmodel%npf%memoryPath)
271 gwtmodel%fmi%gwfspdis => gwfmodel%npf%spdis
272 call mem_checkin(gwtmodel%fmi%gwfspdis, &
273 'GWFSPDIS', gwtmodel%fmi%memoryPath, &
274 'SPDIS', gwfmodel%npf%memoryPath)
275 gwtmodel%fmi%igwfspdis = gwfmodel%npf%icalcspdis
276 !
277 ! -- setup pointers to the flow storage rates. GWF strg arrays are
278 ! available after the gwf_ar routine is called.
279 if (gwtmodel%inmst > 0) then
280 if (gwfmodel%insto > 0) then
281 gwtmodel%fmi%gwfstrgss => gwfmodel%sto%strgss
282 gwtmodel%fmi%igwfstrgss = 1
283 if (gwfmodel%sto%iusesy == 1) then
284 gwtmodel%fmi%gwfstrgsy => gwfmodel%sto%strgsy
285 gwtmodel%fmi%igwfstrgsy = 1
286 end if
287 end if
288 end if
289 !
290 ! -- Set a pointer to conc in buy
291 if (gwfmodel%inbuy > 0) then
292 call gwfmodel%buy%set_concentration_pointer(gwtmodel%name, gwtmodel%x, &
293 gwtmodel%ibound)
294 end if
295 !
296 ! -- Set a pointer to conc (which could be a temperature) in vsc
297 if (gwfmodel%invsc > 0) then
298 call gwfmodel%vsc%set_concentration_pointer(gwtmodel%name, gwtmodel%x, &
299 gwtmodel%ibound)
300 end if
301 !
302 ! -- transfer the boundary package information from gwf to gwt
303 call this%gwfbnd2gwtfmi()
304 !
305 ! -- if mover package is active, then set a pointer to it's budget object
306 if (gwfmodel%inmvr /= 0) then
307 gwtmodel%fmi%mvrbudobj => gwfmodel%mvr%budobj
308 end if
309 !
310 ! -- connect Connections
311 call this%gwfconn2gwtconn(gwfmodel, gwtmodel)
312 end subroutine exg_ar
313
314 !> @brief Link GWT connections to GWF connections or exchanges
315 !<
316 subroutine gwfconn2gwtconn(this, gwfModel, gwtModel)
317 ! -- modules
319 use simvariablesmodule, only: iout
321 ! -- dummy
322 class(gwfgwtexchangetype) :: this !< this exchange
323 type(gwfmodeltype), pointer :: gwfModel !< the flow model
324 type(gwtmodeltype), pointer :: gwtModel !< the transport model
325 ! -- local
326 class(spatialmodelconnectiontype), pointer :: conn => null()
327 class(*), pointer :: objPtr => null()
328 class(gwtgwtconnectiontype), pointer :: gwtConn => null()
329 class(gwfgwfconnectiontype), pointer :: gwfConn => null()
330 class(gwfexchangetype), pointer :: gwfExg => null()
331 class(gwtexchangetype), pointer :: gwtExg => null()
332 integer(I4B) :: ic1, ic2, iex
333 integer(I4B) :: gwfConnIdx, gwfExIdx
334 logical(LGP) :: areEqual
335 !
336 ! loop over all connections
337 gwtloop: do ic1 = 1, baseconnectionlist%Count()
338 !
340 if (.not. associated(conn%owner, gwtmodel)) cycle gwtloop
341 !
342 ! start with a GWT conn.
343 objptr => conn
344 gwtconn => castasgwtgwtconnection(objptr)
345 gwtexg => gwtconn%gwtExchange
346 gwfconnidx = -1
347 gwfexidx = -1
348 !
349 ! find matching GWF conn. in same list
350 gwfloop: do ic2 = 1, baseconnectionlist%Count()
352 !
353 if (associated(conn%owner, gwfmodel)) then
354 !
355 objptr => conn
356 gwfconn => castasgwfgwfconnection(objptr)
357 gwfexg => gwfconn%gwfExchange
358 !
359 ! A model can have multiple exchanges, even connecting the same two
360 ! models. We have a match if
361 ! 1. gwtgwt%model1 is connected to gwfgwf%model1
362 ! 2. gwtgwt%model2 is connected to gwfgwf%model2
363 ! 3. the list of connected nodes (nodem1, nodem2) is equivalent, such
364 ! that it contains the same nodes, appearing in the same order in the
365 ! exchange data block
366 !
367 if (gwfexg%v_model1%name /= gwtexg%gwfmodelname1) cycle
368 if (gwfexg%v_model2%name /= gwtexg%gwfmodelname2) cycle
369 !
370 areequal = (gwfexg%nexg == gwtexg%nexg)
371 if (areequal) then
372 areequal = all(gwfexg%nodem1 == gwtexg%nodem1)
373 areequal = areequal .and. all(gwfexg%nodem2 == gwtexg%nodem2)
374 end if
375 if (areequal) then
376 ! same DIS, same exchange: link and go to next GWT conn.
377 write (iout, '(/6a)') 'Linking exchange ', &
378 trim(gwtexg%name), ' to ', trim(gwfexg%name), &
379 ' (using interface model) for GWT model ', &
380 trim(gwtmodel%name)
381 gwfconnidx = ic2
382 call this%link_connections(gwtconn, gwfconn)
383 exit gwfloop
384 end if
385 end if
386 end do gwfloop
387 !
388 ! fallback option: coupling to old gwfgwf exchange,
389 ! the conditions are equal to what is used above
390 ! (this will go obsolete at some point)
391 if (gwfconnidx == -1) then
392 gwfloopexg: do iex = 1, baseexchangelist%Count()
394 !
395 if (.not. associated(gwfexg)) cycle gwfloopexg
396 !
397 if (associated(gwfexg%model1, gwfmodel) .or. &
398 associated(gwfexg%model2, gwfmodel)) then
399 !
400 if (gwfexg%v_model1%name /= gwtexg%gwfmodelname1) cycle
401 if (gwfexg%v_model2%name /= gwtexg%gwfmodelname2) cycle
402 !
403 areequal = (gwfexg%nexg == gwtexg%nexg)
404 !
405 if (areequal) then
406 areequal = all(gwfexg%nodem1 == gwtexg%nodem1)
407 areequal = areequal .and. all(gwfexg%nodem2 == gwtexg%nodem2)
408 end if
409 if (areequal) then
410 ! link exchange to connection
411 write (iout, '(/6a)') 'Linking exchange ', &
412 trim(gwtexg%name), ' to ', trim(gwfexg%name), ' for GWT model ', &
413 trim(gwtmodel%name)
414 gwfexidx = iex
415 if (gwtconn%owns_exchange) then
416 gwtexg%gwfsimvals => gwfexg%simvals
417 call mem_checkin(gwtexg%gwfsimvals, &
418 'GWFSIMVALS', gwtexg%memoryPath, &
419 'SIMVALS', gwfexg%memoryPath)
420 end if
421 !
422 !cdl link up mvt to mvr
423 if (gwfexg%inmvr > 0) then
424 if (gwtconn%owns_exchange .and. &
425 gwtconn%gwtExchange%inmvt > 0) then
426 call gwtexg%mvt%set_pointer_mvrbudobj(gwfexg%mvr%budobj)
427 end if
428 end if
429 !
430 if (associated(gwfexg%model2, gwfmodel)) gwtconn%exgflowSign = -1
431 gwtconn%gwtInterfaceModel%fmi%flows_from_file = .false.
432 !
433 exit gwfloopexg
434 end if
435 end if
436 !
437 end do gwfloopexg
438 end if
439 !
440 if (gwfconnidx == -1 .and. gwfexidx == -1) then
441 ! none found, report
442 write (errmsg, *) 'Cannot find GWF-GWF exchange when connecting'// &
443 ' GWT model ', trim(gwtmodel%name), ' with exchange ', &
444 trim(gwtexg%name), ' to GWF model ', trim(gwfmodel%name), &
445 '. Note: GWF-GWF and GWT-GWT need identical exchange data '// &
446 '(both in value and order) for the match to succeed.'
447 call store_error(errmsg)
448 end if
449 !
450 end do gwtloop
451 !
452 ! -- report errors
453 if (count_errors() > 0) then
454 call store_error_filename(this%filename)
455 end if
456 end subroutine gwfconn2gwtconn
457
458 !> @brief Links a GWT connection to its GWF counterpart
459 !<
460 subroutine link_connections(this, gwtConn, gwfConn)
461 ! -- modules
463 ! -- dummy
464 class(gwfgwtexchangetype) :: this !< this exchange
465 class(gwtgwtconnectiontype), pointer :: gwtConn !< GWT connection
466 class(gwfgwfconnectiontype), pointer :: gwfConn !< GWF connection
467 !
468 !gwtConn%exgflowja => gwfConn%exgflowja
469 if (gwtconn%owns_exchange) then
470 gwtconn%gwtExchange%gwfsimvals => gwfconn%gwfExchange%simvals
471 call mem_checkin(gwtconn%gwtExchange%gwfsimvals, &
472 'GWFSIMVALS', gwtconn%gwtExchange%memoryPath, &
473 'SIMVALS', gwfconn%gwfExchange%memoryPath)
474 end if
475 !
476 !cdl link up mvt to mvr
477 if (gwfconn%gwfExchange%inmvr > 0) then
478 if (gwtconn%owns_exchange .and. gwtconn%gwtExchange%inmvt > 0) then
479 call gwtconn%gwtExchange%mvt%set_pointer_mvrbudobj( &
480 gwfconn%gwfExchange%mvr%budobj)
481 end if
482 end if
483 !
484 if (associated(gwfconn%gwfExchange%model2, gwfconn%owner)) then
485 gwtconn%exgflowSign = -1
486 end if
487 !
488 ! fmi flows are not read from file
489 gwtconn%gwtInterfaceModel%fmi%flows_from_file = .false.
490 !
491 ! set concentration pointer for buoyancy
492 ! call gwfConn%gwfInterfaceModel%buy%set_concentration_pointer( &
493 ! gwtConn%gwtModel%name, &
494 ! gwtConn%conc, &
495 ! gwtConn%icbound)
496 end subroutine link_connections
497
498 !> @brief Deallocate memory
499 !<
500 subroutine exg_da(this)
501 ! -- modules
503 ! -- dummy
504 class(gwfgwtexchangetype) :: this
505 !
506 call mem_deallocate(this%m1_idx)
507 call mem_deallocate(this%m2_idx)
508 end subroutine exg_da
509
510 !> @brief Allocate package scalars
511 !<
512 subroutine allocate_scalars(this)
513 ! -- modules
515 ! -- dummy
516 class(gwfgwtexchangetype) :: this
517 !
518 call mem_allocate(this%m1_idx, 'M1ID', this%memoryPath)
519 call mem_allocate(this%m2_idx, 'M2ID', this%memoryPath)
520 this%m1_idx = 0
521 this%m2_idx = 0
522 end subroutine allocate_scalars
523
524 !> @brief Call routines in FMI that will set pointers to the necessary flow
525 !! data
526 !<
527 subroutine gwfbnd2gwtfmi(this)
528 ! -- dummy
529 class(gwfgwtexchangetype) :: this
530 ! -- local
531 integer(I4B) :: ngwfpack, ip, iterm, imover
532 class(basemodeltype), pointer :: mb => null()
533 type(gwfmodeltype), pointer :: gwfmodel => null()
534 type(gwtmodeltype), pointer :: gwtmodel => null()
535 class(bndtype), pointer :: packobj => null()
536 !
537 ! -- set gwfmodel
538 mb => getbasemodelfromlist(basemodellist, this%m1_idx)
539 select type (mb)
540 type is (gwfmodeltype)
541 gwfmodel => mb
542 end select
543 !
544 ! -- set gwtmodel
545 mb => getbasemodelfromlist(basemodellist, this%m2_idx)
546 select type (mb)
547 type is (gwtmodeltype)
548 gwtmodel => mb
549 end select
550 !
551 ! -- Call routines in FMI that will set pointers to the necessary flow
552 ! data (SIMVALS and SIMTOMVR) stored within each GWF flow package
553 ngwfpack = gwfmodel%bndlist%Count()
554 iterm = 1
555 do ip = 1, ngwfpack
556 packobj => getbndfromlist(gwfmodel%bndlist, ip)
557 call gwtmodel%fmi%gwfpackages(iterm)%set_pointers( &
558 'SIMVALS', &
559 packobj%memoryPath, packobj%input_mempath)
560 iterm = iterm + 1
561 !
562 ! -- If a mover is active for this package, then establish a separate
563 ! pointer link for the mover flows stored in SIMTOMVR
564 imover = packobj%imover
565 if (packobj%isadvpak /= 0) imover = 0
566 if (imover /= 0) then
567 call gwtmodel%fmi%gwfpackages(iterm)%set_pointers( &
568 'SIMTOMVR', &
569 packobj%memoryPath, packobj%input_mempath)
570 iterm = iterm + 1
571 end if
572 end do
573 end subroutine gwfbnd2gwtfmi
574
575end module gwfgwtexchangemodule
subroutine exg_da(this)
Deallocate memory.
subroutine, public addbaseexchangetolist(list, exchange)
Add the exchange object (BaseExchangeType) to a list.
class(basemodeltype) function, pointer, public getbasemodelfromlist(list, idx)
This module contains the base boundary package.
class(bndtype) function, pointer, public getbndfromlist(list, idx)
Get boundary from package list.
This module contains simulation constants.
Definition Constants.f90:9
integer(i4b), parameter linelength
maximum length of a standard line
Definition Constants.f90:45
integer(i4b), parameter lenpackagename
maximum length of the package name
Definition Constants.f90:23
class(gwfgwfconnectiontype) function, pointer, public castasgwfgwfconnection(obj)
Cast to GwfGwfConnectionType.
This module contains the GwfGwfExchangeModule Module.
class(gwfexchangetype) function, pointer, public getgwfexchangefromlist(list, idx)
@ brief Get exchange from list
subroutine allocate_scalars(this)
@ brief Allocate scalars
subroutine link_connections(this, gwtconn, gwfconn)
Links a GWT connection to its GWF counterpart.
subroutine gwfconn2gwtconn(this, gwfmodel, gwtmodel)
Link GWT connections to GWF connections or exchanges.
subroutine, public gwfgwt_cr(filename, id, m1_id, m2_id)
Create a new GWF to GWT exchange object.
subroutine gwfbnd2gwtfmi(this)
Call routines in FMI that will set pointers to the necessary flow data.
subroutine set_model_pointers(this)
Allocate and read.
class(gwtgwtconnectiontype) function, pointer, public castasgwtgwtconnection(obj)
Cast to GwtGwtConnectionType.
This module contains the GwtGwtExchangeModule Module.
This module defines variable data types.
Definition kind.f90:8
type(listtype), public basemodellist
Definition mf6lists.f90:16
type(listtype), public baseexchangelist
Definition mf6lists.f90:25
type(listtype), public baseconnectionlist
Definition mf6lists.f90:28
This module contains simulation methods.
Definition Sim.f90:10
subroutine, public store_error(msg, terminate)
Store an error message.
Definition Sim.f90:92
integer(i4b) function, public count_errors()
Return number of errors.
Definition Sim.f90:59
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
Definition Sim.f90:204
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
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
class(spatialmodelconnectiontype) function, pointer, public get_smc_from_list(list, idx)
Get the connection from a list.
Highest level model type. All models extend this parent type.
Definition BaseModel.f90:16
Structured grid discretization.
Definition Dis.f90:23
Unstructured grid discretization.
Definition Disu.f90:30
Vertex grid discretization.
Definition Disv.f90:25
Connecting a GWF model to other models in space, implements NumericalExchangeType so the solution can...
Derived type for GwfExchangeType.
Connects a GWT model to other GWT models in space. Derives from NumericalExchangeType so the solution...
Derived type for GwtExchangeType.
Class to manage spatial connection of a model to one or more models of the same type....