MODFLOW 6  version 6.8.0.dev0
USGS Modular Hydrologic Model
gwf-wel.f90
Go to the documentation of this file.
1 !> @brief This module contains the WEL package methods
2 !!
3 !! This module contains the overridden methods for the standard WEL package.
4 !! Several methods need to be overridden because of the AUTO_FLOW_REDUCE
5 !! option. Overridden methods include:
6 !! - bnd_cf (AUTO_FLOW_REDUCE)
7 !! - bnd_fc (AUTO_FLOW_REDUCE)
8 !! - bnd_fn (AUTO_FLOW_REDUCE Newton-Raphson terms)
9 !! - bnd_ot_package_flows (write AUTO_FLOW_REDUCE terms to csv file)
10 !! - bnd_da (deallocate AUTO_FLOW_REDUCE variables)
11 !! - bnd_bd_obs (wel-reduction observation added)
12 !!
13 !<
14 
15 module welmodule
16  ! -- modules used by WelModule methods
17  use kindmodule, only: dp, i4b
22  use bndmodule, only: bndtype
23  use bndextmodule, only: bndexttype
26  use observemodule, only: observetype
30  !
31  implicit none
32  !
33  private
34  public :: wel_create
35  !
36  character(len=LENFTYPE) :: ftype = 'WEL' !< package ftype
37  character(len=16) :: text = ' WEL' !< package flow text string
38  !
39  type, extends(bndexttype) :: weltype
40  real(dp), dimension(:), pointer, contiguous :: q => null() !< volumetric well rate
41  integer(I4B), pointer :: iflowred => null() !< flag indicating if the AUTO_FLOW_REDUCE option is active
42  real(dp), pointer :: flowred => null() !< AUTO_FLOW_REDUCE variable
43  integer(I4B), pointer :: ioutafrcsv => null() !< unit number for CSV output file containing wells with reduced puping rates
44  integer(I4B), pointer :: iflowredlen => null() !< flag indicating flowred variable is a length value
45  contains
46  procedure :: allocate_scalars => wel_allocate_scalars
47  procedure :: allocate_arrays => wel_allocate_arrays
48  procedure :: source_options => wel_options
49  procedure :: log_wel_options
50  procedure :: bnd_cf => wel_cf
51  procedure :: bnd_fc => wel_fc
52  procedure :: bnd_fn => wel_fn
53  procedure :: bnd_da => wel_da
54  procedure :: define_listlabel
55  procedure :: bound_value => wel_bound_value
56  procedure :: q_mult
57  ! -- methods for observations
58  procedure, public :: bnd_obs_supported => wel_obs_supported
59  procedure, public :: bnd_df_obs => wel_df_obs
60  procedure, public :: bnd_bd_obs => wel_bd_obs
61  ! -- afr
62  procedure, private :: wel_afr_csv_init
63  procedure, private :: wel_afr_csv_write
64  end type weltype
65 
66 contains
67 
68  !> @ brief Create a new package object
69  !!
70  !! Create a new WEL Package object
71  !!
72  !<
73  subroutine wel_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, &
74  mempath)
75  ! -- dummy variables
76  class(bndtype), pointer :: packobj !< pointer to default package type
77  integer(I4B), intent(in) :: id !< package id
78  integer(I4B), intent(in) :: ibcnum !< boundary condition number
79  integer(I4B), intent(in) :: inunit !< unit number of WEL package input file
80  integer(I4B), intent(in) :: iout !< unit number of model listing file
81  character(len=*), intent(in) :: namemodel !< model name
82  character(len=*), intent(in) :: pakname !< package name
83  character(len=*), intent(in) :: mempath !< input mempath
84  ! -- local variables
85  type(weltype), pointer :: welobj
86  !
87  ! -- allocate the object and assign values to object variables
88  allocate (welobj)
89  packobj => welobj
90  !
91  ! -- create name and memory path
92  call packobj%set_names(ibcnum, namemodel, pakname, ftype, mempath)
93  packobj%text = text
94  !
95  ! -- allocate scalars
96  call welobj%allocate_scalars()
97  !
98  ! -- initialize package
99  call packobj%pack_initialize()
100 
101  packobj%inunit = inunit
102  packobj%iout = iout
103  packobj%id = id
104  packobj%ibcnum = ibcnum
105  packobj%ncolbnd = 1
106  packobj%ictMemPath = create_mem_path(namemodel, 'NPF')
107  end subroutine wel_create
108 
109  !> @ brief Deallocate package memory
110  !!
111  !! Deallocate WEL package scalars and arrays.
112  !!
113  !<
114  subroutine wel_da(this)
115  ! -- modules
117  ! -- dummy variables
118  class(weltype) :: this !< WelType object
119  !
120  ! -- Deallocate parent package
121  call this%BndExtType%bnd_da()
122  !
123  ! -- scalars
124  call mem_deallocate(this%iflowred)
125  call mem_deallocate(this%flowred)
126  call mem_deallocate(this%ioutafrcsv)
127  call mem_deallocate(this%iflowredlen)
128  call mem_deallocate(this%q, 'Q', this%memoryPath)
129  end subroutine wel_da
130 
131  !> @ brief Allocate scalars
132  !!
133  !! Allocate and initialize scalars for the WEL package. The base model
134  !! allocate scalars method is also called.
135  !!
136  !<
137  subroutine wel_allocate_scalars(this)
138  ! -- modules
140  ! -- dummy variables
141  class(weltype) :: this !< WelType object
142  !
143  ! -- call base type allocate scalars
144  call this%BndExtType%allocate_scalars()
145  !
146  ! -- allocate the object and assign values to object variables
147  call mem_allocate(this%iflowred, 'IFLOWRED', this%memoryPath)
148  call mem_allocate(this%flowred, 'FLOWRED', this%memoryPath)
149  call mem_allocate(this%ioutafrcsv, 'IOUTAFRCSV', this%memoryPath)
150  call mem_allocate(this%iflowredlen, 'IFLOWREDLEN', this%memoryPath)
151  !
152  ! -- Set values
153  this%iflowred = 0
154  this%ioutafrcsv = 0
155  this%flowred = dzero
156  this%iflowredlen = 0
157  end subroutine wel_allocate_scalars
158 
159  !> @ brief Allocate arrays
160  !!
161  !! Allocate and initialize arrays for the WEL package
162  !!
163  !<
164  subroutine wel_allocate_arrays(this, nodelist, auxvar)
165  ! -- modules
167  ! -- dummy
168  class(weltype) :: this
169  integer(I4B), dimension(:), pointer, contiguous, optional :: nodelist
170  real(DP), dimension(:, :), pointer, contiguous, optional :: auxvar
171  ! -- local
172  !
173  ! -- call BndExtType allocate scalars
174  call this%BndExtType%allocate_arrays(nodelist, auxvar)
175  !
176  ! -- set constant head array input context pointer
177  call mem_setptr(this%q, 'Q', this%input_mempath)
178  !
179  ! -- checkin constant head array input context pointer
180  call mem_checkin(this%q, 'Q', this%memoryPath, &
181  'Q', this%input_mempath)
182  end subroutine wel_allocate_arrays
183 
184  !> @ brief Source additional options for package
185  !!
186  !! Source additional options for WEL package.
187  !!
188  !<
189  subroutine wel_options(this)
190  ! -- modules
191  use inputoutputmodule, only: urword
194  ! -- dummy variables
195  class(weltype), intent(inout) :: this !< WelType object
196  ! -- local variables
197  character(len=LINELENGTH) :: fname
198  type(gwfwelparamfoundtype) :: found
199  ! -- formats
200  character(len=*), parameter :: fmtflowred = &
201  &"(4x, 'AUTOMATIC FLOW REDUCTION OF WELLS IMPLEMENTED.')"
202  character(len=*), parameter :: fmtflowredv = &
203  &"(4x, 'AUTOMATIC FLOW REDUCTION FRACTION (',g15.7,').')"
204  !
205  ! -- source base BndExtType options
206  call this%BndExtType%source_options()
207  !
208  ! -- source well options from input context
209  call mem_set_value(this%flowred, 'FLOWRED', this%input_mempath, found%flowred)
210  call mem_set_value(fname, 'AFRCSVFILE', this%input_mempath, found%afrcsvfile)
211  call mem_set_value(this%imover, 'MOVER', this%input_mempath, found%mover)
212  call mem_set_value(this%iflowredlen, 'IFLOWREDLEN', this%input_mempath, &
213  found%iflowredlen)
214 
215  if (found%iflowredlen) then
216  if (found%flowred .eqv. .false.) then
217  write (warnmsg, '(a)') &
218  'FLOW_REDUCTION_LENGTH option specified but a AUTO_FLOW_REDUCTION value &
219  &is not specified. The FLOW_REDUCTION_LENGTH option will be ignored.'
220  call store_warning(warnmsg)
221  else
222  this%iflowredlen = 1
223  end if
224  end if
225 
226  if (found%flowred) then
227  this%iflowred = 1
228  if (this%flowred <= dzero) then
229  if (found%iflowredlen) then
230  write (errmsg, '(a)') &
231  'An AUTO_FLOW_REDUCTION value less than or equal to zero cannot be &
232  &specified if the FLOW_REDUCTION_LENGTH option is specified.'
233  call store_error(errmsg)
234  else
235  this%flowred = dem1
236  end if
237  else if (this%flowred > done .and. this%iflowredlen == 0) then
238  this%flowred = done
239  end if
240  end if
241 
242  if (found%afrcsvfile) then
243  call this%wel_afr_csv_init(fname)
244  end if
245 
246  if (found%mover) then
247  this%imover = 1
248  end if
249 
250  ! -- log WEL specific options
251  call this%log_wel_options(found)
252  end subroutine wel_options
253 
254  !> @ brief Log WEL specific package options
255  !<
256  subroutine log_wel_options(this, found)
257  ! -- modules
259  ! -- dummy variables
260  class(weltype), intent(inout) :: this
261  type(gwfwelparamfoundtype), intent(in) :: found
262  ! -- local variables
263  ! -- format
264  character(len=*), parameter :: fmtflowred = &
265  &"(4x, 'AUTOMATIC FLOW REDUCTION OF WELLS IMPLEMENTED.')"
266  character(len=*), parameter :: fmtflowredv = &
267  &"(4x, 'AUTOMATIC FLOW REDUCTION FRACTION (',g15.7,').')"
268  character(len=*), parameter :: fmtflowredl = &
269  &"(4x, 'AUTOMATIC FLOW REDUCTION LENGTH (',g15.7,').')"
270  !
271  ! -- log found options
272  write (this%iout, '(/1x,a)') 'PROCESSING '//trim(adjustl(this%text)) &
273  //' OPTIONS'
274 
275  if (found%iflowredlen) then
276  write (this%iout, fmtflowred)
277  write (this%iout, '(4x,A)') &
278  'AUTOMATIC FLOW REDUCTION FRACTION INTERPRETED AS A LENGTH'
279  end if
280 
281  if (found%flowred) then
282  if (this%iflowredlen == 0) then
283  write (this%iout, fmtflowredv) this%flowred
284  else
285  write (this%iout, fmtflowredl) this%flowred
286  end if
287  end if
288  !
289  if (found%afrcsvfile) then
290  ! -- currently no-op
291  end if
292 
293  if (found%mover) then
294  write (this%iout, '(4x,A)') 'MOVER OPTION ENABLED'
295  end if
296  !
297  ! -- close logging block
298  write (this%iout, '(1x,a)') &
299  'END OF '//trim(adjustl(this%text))//' OPTIONS'
300  end subroutine log_wel_options
301 
302  !> @ brief Formulate the package hcof and rhs terms.
303  !!
304  !! Formulate the hcof and rhs terms for the WEL package that will be
305  !! added to the coefficient matrix and right-hand side vector.
306  !!
307  !<
308  subroutine wel_cf(this)
309  ! -- dummy variables
310  class(weltype) :: this !< WelType object
311  ! -- local variables
312  integer(I4B) :: i, node, ict
313  real(DP) :: qmult
314  real(DP) :: q
315  real(DP) :: tp
316  real(DP) :: bt
317  real(DP) :: thick
318  !
319  ! -- Return if no wells
320  if (this%nbound == 0) return
321  !
322  ! -- Calculate hcof and rhs for each well entry
323  do i = 1, this%nbound
324  node = this%nodelist(i)
325  this%hcof(i) = dzero
326  if (this%ibound(node) <= 0) then
327  this%rhs(i) = dzero
328  cycle
329  end if
330  q = this%q_mult(i)
331  if (this%iflowred /= 0 .and. q < dzero) then
332  ict = this%icelltype(node)
333  if (ict /= 0) then
334  bt = this%dis%bot(node)
335  if (this%iflowredlen == 0) then
336  thick = this%dis%top(node) - bt
337  else
338  thick = done
339  end if
340  tp = bt + this%flowred * thick
341  qmult = sqsaturation(tp, bt, this%xnew(node))
342  q = q * qmult
343  end if
344  end if
345  this%rhs(i) = -q
346  end do
347  end subroutine wel_cf
348 
349  !> @ brief Copy hcof and rhs terms into solution.
350  !!
351  !! Add the hcof and rhs terms for the WEL package to the
352  !! coefficient matrix and right-hand side vector.
353  !!
354  !<
355  subroutine wel_fc(this, rhs, ia, idxglo, matrix_sln)
356  ! -- dummy variables
357  class(weltype) :: this !< WelType object
358  real(DP), dimension(:), intent(inout) :: rhs !< right-hand side vector for model
359  integer(I4B), dimension(:), intent(in) :: ia !< solution CRS row pointers
360  integer(I4B), dimension(:), intent(in) :: idxglo !< mapping vector for model (local) to solution (global)
361  class(matrixbasetype), pointer :: matrix_sln !< solution coefficient matrix
362  ! -- local variables
363  integer(I4B) :: i
364  integer(I4B) :: n
365  integer(I4B) :: ipos
366  !
367  ! -- pakmvrobj fc
368  if (this%imover == 1) then
369  call this%pakmvrobj%fc()
370  end if
371  !
372  ! -- Copy package rhs and hcof into solution rhs and amat
373  do i = 1, this%nbound
374  n = this%nodelist(i)
375  rhs(n) = rhs(n) + this%rhs(i)
376  ipos = ia(n)
377  call matrix_sln%add_value_pos(idxglo(ipos), this%hcof(i))
378  !
379  ! -- If mover is active and this well is discharging,
380  ! store available water (as positive value).
381  if (this%imover == 1 .and. this%rhs(i) > dzero) then
382  call this%pakmvrobj%accumulate_qformvr(i, this%rhs(i))
383  end if
384  end do
385  end subroutine wel_fc
386 
387  !> @ brief Add Newton-Raphson terms for package into solution.
388  !!
389  !! Calculate and add the Newton-Raphson terms for the WEL package to the
390  !! coefficient matrix and right-hand side vector.
391  !!
392  !<
393  subroutine wel_fn(this, rhs, ia, idxglo, matrix_sln)
394  ! -- dummy variables
395  class(weltype) :: this !< WelType object
396  real(DP), dimension(:), intent(inout) :: rhs !< right-hand side vector for model
397  integer(I4B), dimension(:), intent(in) :: ia !< solution CRS row pointers
398  integer(I4B), dimension(:), intent(in) :: idxglo !< mapping vector for model (local) to solution (global)
399  class(matrixbasetype), pointer :: matrix_sln !< solution coefficient matrix
400  ! -- local variables
401  integer(I4B) :: i
402  integer(I4B) :: node
403  integer(I4B) :: ipos
404  integer(I4B) :: ict
405  real(DP) :: drterm
406  real(DP) :: q
407  real(DP) :: tp
408  real(DP) :: bt
409  real(DP) :: thick
410  !
411  ! -- Copy package rhs and hcof into solution rhs and amat
412  do i = 1, this%nbound
413  node = this%nodelist(i)
414  !
415  ! -- test if node is constant or inactive
416  if (this%ibound(node) <= 0) then
417  cycle
418  end if
419  !
420  ! -- well rate is possibly head dependent
421  ict = this%icelltype(node)
422  if (this%iflowred /= 0 .and. ict /= 0) then
423  ipos = ia(node)
424  q = -this%rhs(i)
425  if (q < dzero) then
426  ! -- calculate derivative for well
427  tp = this%dis%top(node)
428  bt = this%dis%bot(node)
429  thick = tp - bt
430  tp = bt + this%flowred * thick
431  drterm = sqsaturationderivative(tp, bt, this%xnew(node))
432  drterm = drterm * this%q_mult(i)
433  !--fill amat and rhs with newton-raphson terms
434  call matrix_sln%add_value_pos(idxglo(ipos), drterm)
435  rhs(node) = rhs(node) + drterm * this%xnew(node)
436  end if
437  end if
438  end do
439  end subroutine wel_fn
440 
441  !> @brief Initialize the auto flow reduce csv output file
442  subroutine wel_afr_csv_init(this, fname)
443  ! -- dummy variables
444  class(weltype), intent(inout) :: this !< WelType object
445  character(len=*), intent(in) :: fname
446  ! -- format
447  character(len=*), parameter :: fmtafrcsv = &
448  "(4x, 'AUTO FLOW REDUCE INFORMATION WILL BE SAVED TO FILE: ', a, /4x, &
449  &'OPENED ON UNIT: ', I0)"
450 
451  this%ioutafrcsv = getunit()
452  call openfile(this%ioutafrcsv, this%iout, fname, 'CSV', &
453  filstat_opt='REPLACE')
454  write (this%iout, fmtafrcsv) trim(adjustl(fname)), &
455  this%ioutafrcsv
456  write (this%ioutafrcsv, '(a)') &
457  'time,period,step,boundnumber,cellnumber,rate-requested,&
458  &rate-actual,wel-reduction'
459  end subroutine wel_afr_csv_init
460 
461  !> @brief Write out auto flow reductions only when & where they occur
462  subroutine wel_afr_csv_write(this)
463  ! -- modules
464  use tdismodule, only: totim, kstp, kper
465  ! -- dummy variables
466  class(weltype), intent(inout) :: this !< WelType object
467  ! -- local
468  integer(I4B) :: i
469  integer(I4B) :: nodereduced
470  integer(I4B) :: nodeuser
471  real(DP) :: v
472  ! -- format
473  do i = 1, this%nbound
474  nodereduced = this%nodelist(i)
475  !
476  ! -- test if node is constant or inactive
477  if (this%ibound(nodereduced) <= 0) then
478  cycle
479  end if
480  v = this%q_mult(i) + this%rhs(i)
481  if (v < dzero) then
482  nodeuser = this%dis%get_nodeuser(nodereduced)
483  write (this%ioutafrcsv, '(*(G0,:,","))') &
484  totim, kper, kstp, i, nodeuser, this%q_mult(i), this%simvals(i), v
485  end if
486  end do
487  end subroutine wel_afr_csv_write
488 
489  !> @ brief Define the list label for the package
490  !!
491  !! Method defined the list label for the WEL package. The list label is
492  !! the heading that is written to iout when PRINT_INPUT option is used.
493  !!
494  !<
495  subroutine define_listlabel(this)
496  ! -- dummy variables
497  class(weltype), intent(inout) :: this !< WelType object
498  !
499  ! -- create the header list label
500  this%listlabel = trim(this%filtyp)//' NO.'
501  if (this%dis%ndim == 3) then
502  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER'
503  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW'
504  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL'
505  elseif (this%dis%ndim == 2) then
506  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER'
507  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D'
508  else
509  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE'
510  end if
511  write (this%listlabel, '(a, a16)') trim(this%listlabel), 'STRESS RATE'
512  if (this%inamedbound == 1) then
513  write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME'
514  end if
515  end subroutine define_listlabel
516 
517  ! -- Procedures related to observations
518 
519  !> @brief Determine if observations are supported.
520  !!
521  !! Function to determine if observations are supported by the WEL package.
522  !! Observations are supported by the WEL package.
523  !!
524  !! @return wel_obs_supported boolean indicating if observations are supported
525  !!
526  !<
527  logical function wel_obs_supported(this)
528  ! -- dummy variables
529  class(weltype) :: this !< WelType object
530  !
531  ! -- set boolean
532  wel_obs_supported = .true.
533  end function wel_obs_supported
534 
535  !> @brief Define the observation types available in the package
536  !!
537  !! Method to define the observation types available in the WEL package.
538  !!
539  !<
540  subroutine wel_df_obs(this)
541  ! -- dummy variables
542  class(weltype) :: this !< WelType object
543  ! -- local variables
544  integer(I4B) :: indx
545  !
546  ! -- initialize observations
547  call this%obs%StoreObsType('wel', .true., indx)
548  this%obs%obsData(indx)%ProcessIdPtr => defaultobsidprocessor
549  !
550  ! -- Store obs type and assign procedure pointer
551  ! for to-mvr observation type.
552  call this%obs%StoreObsType('to-mvr', .true., indx)
553  this%obs%obsData(indx)%ProcessIdPtr => defaultobsidprocessor
554  !
555  ! -- Store obs type and assign procedure pointer
556  ! for wel-reduction observation type.
557  call this%obs%StoreObsType('wel-reduction', .true., indx)
558  this%obs%obsData(indx)%ProcessIdPtr => defaultobsidprocessor
559  end subroutine wel_df_obs
560 
561  !> @brief Save observations for the package
562  !!
563  !! Method to save simulated values for the WEL package.
564  !!
565  !<
566  subroutine wel_bd_obs(this)
567  ! -- dummy variables
568  class(weltype) :: this !< WelType object
569  ! -- local variables
570  integer(I4B) :: i
571  integer(I4B) :: n
572  integer(I4B) :: jj
573  real(DP) :: v
574  type(observetype), pointer :: obsrv => null()
575  !
576  ! -- clear the observations
577  call this%obs%obs_bd_clear()
578  !
579  ! -- Save simulated values for all of package's observations.
580  do i = 1, this%obs%npakobs
581  obsrv => this%obs%pakobs(i)%obsrv
582  if (obsrv%BndFound) then
583  do n = 1, obsrv%indxbnds_count
584  v = dnodata
585  jj = obsrv%indxbnds(n)
586  select case (obsrv%ObsTypeId)
587  case ('TO-MVR')
588  if (this%imover == 1) then
589  v = this%pakmvrobj%get_qtomvr(jj)
590  if (v > dzero) then
591  v = -v
592  end if
593  end if
594  case ('WEL')
595  v = this%simvals(jj)
596  case ('WEL-REDUCTION')
597  if (this%iflowred > 0) then
598  v = this%q_mult(jj) + this%rhs(jj)
599  end if
600  case default
601  errmsg = 'Unrecognized observation type: '//trim(obsrv%ObsTypeId)
602  call store_error(errmsg)
603  end select
604  call this%obs%SaveOneSimval(obsrv, v)
605  end do
606  else
607  call this%obs%SaveOneSimval(obsrv, dnodata)
608  end if
609  end do
610  !
611  ! -- Write the auto flow reduce csv file entries for this step
612  if (this%ioutafrcsv > 0) then
613  call this%wel_afr_csv_write()
614  end if
615  end subroutine wel_bd_obs
616 
617  function q_mult(this, row) result(q)
618  ! -- modules
619  use constantsmodule, only: dzero
620  ! -- dummy variables
621  class(weltype), intent(inout) :: this
622  integer(I4B), intent(in) :: row
623  ! -- result
624  real(dp) :: q
625  !
626  if (this%iauxmultcol > 0) then
627  q = this%q(row) * this%auxvar(this%iauxmultcol, row)
628  else
629  q = this%q(row)
630  end if
631  end function q_mult
632 
633  !> @ brief Return a bound value
634  !!
635  !! Return a bound value associated with an ncolbnd index
636  !! and row.
637  !!
638  !<
639  function wel_bound_value(this, col, row) result(bndval)
640  ! -- modules
641  use constantsmodule, only: dzero
642  ! -- dummy variables
643  class(weltype), intent(inout) :: this
644  integer(I4B), intent(in) :: col
645  integer(I4B), intent(in) :: row
646  ! -- result
647  real(dp) :: bndval
648  !
649  select case (col)
650  case (1)
651  bndval = this%q_mult(row)
652  case default
653  errmsg = 'Programming error. WEL bound value requested column '&
654  &'outside range of ncolbnd (1).'
655  call store_error(errmsg)
656  call store_error_filename(this%input_fname)
657  end select
658  end function wel_bound_value
659 
660 end module welmodule
This module contains block parser methods.
Definition: BlockParser.f90:7
This module contains the extended boundary package.
This module contains the base boundary package.
This module contains simulation constants.
Definition: Constants.f90:9
integer(i4b), parameter linelength
maximum length of a standard line
Definition: Constants.f90:45
real(dp), parameter dnodata
real no data constant
Definition: Constants.f90:95
real(dp), parameter dem1
real constant 1e-1
Definition: Constants.f90:103
integer(i4b), parameter lenftype
maximum length of a package type (DIS, WEL, OC, etc.)
Definition: Constants.f90:39
real(dp), parameter dzero
real constant zero
Definition: Constants.f90:65
real(dp), parameter done
real constant 1
Definition: Constants.f90:76
integer(i4b) function, public getunit()
Get a free unit number.
subroutine, public openfile(iu, iout, fname, ftype, fmtarg_opt, accarg_opt, filstat_opt, mode_opt)
Open a file.
Definition: InputOutput.f90:30
subroutine, public urword(line, icol, istart, istop, ncode, n, r, iout, in)
Extract a word from a string.
This module defines variable data types.
Definition: kind.f90:8
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
This module contains the derived types ObserveType and ObsDataType.
Definition: Observe.f90:15
This module contains the derived type ObsType.
Definition: Obs.f90:127
subroutine, public defaultobsidprocessor(obsrv, dis, inunitobs, iout)
@ brief Process IDstring provided for each observation
Definition: Obs.f90:246
This module contains simulation methods.
Definition: Sim.f90:10
subroutine, public store_warning(msg, substring)
Store warning message.
Definition: Sim.f90:236
subroutine, public store_error(msg, terminate)
Store an error message.
Definition: Sim.f90:92
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
Definition: Sim.f90:203
This module contains simulation variables.
Definition: SimVariables.f90:9
character(len=maxcharlen) errmsg
error message string
character(len=maxcharlen) warnmsg
warning message string
real(dp) function sqsaturationderivative(top, bot, x, c1, c2)
@ brief sQSaturationDerivative
real(dp) function sqsaturation(top, bot, x, c1, c2)
@ brief sQSaturation
real(dp), pointer, public totim
time relative to start of simulation
Definition: tdis.f90:32
integer(i4b), pointer, public kstp
current time step number
Definition: tdis.f90:24
integer(i4b), pointer, public kper
current stress period number
Definition: tdis.f90:23
This module contains the WEL package methods.
Definition: gwf-wel.f90:15
subroutine, public wel_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, mempath)
@ brief Create a new package object
Definition: gwf-wel.f90:75
subroutine wel_allocate_scalars(this)
@ brief Allocate scalars
Definition: gwf-wel.f90:138
subroutine wel_fc(this, rhs, ia, idxglo, matrix_sln)
@ brief Copy hcof and rhs terms into solution.
Definition: gwf-wel.f90:356
subroutine define_listlabel(this)
@ brief Define the list label for the package
Definition: gwf-wel.f90:496
subroutine wel_allocate_arrays(this, nodelist, auxvar)
@ brief Allocate arrays
Definition: gwf-wel.f90:165
subroutine wel_options(this)
@ brief Source additional options for package
Definition: gwf-wel.f90:190
subroutine wel_afr_csv_write(this)
Write out auto flow reductions only when & where they occur.
Definition: gwf-wel.f90:463
real(dp) function q_mult(this, row)
Definition: gwf-wel.f90:618
real(dp) function wel_bound_value(this, col, row)
@ brief Return a bound value
Definition: gwf-wel.f90:640
subroutine wel_da(this)
@ brief Deallocate package memory
Definition: gwf-wel.f90:115
subroutine wel_fn(this, rhs, ia, idxglo, matrix_sln)
@ brief Add Newton-Raphson terms for package into solution.
Definition: gwf-wel.f90:394
subroutine wel_afr_csv_init(this, fname)
Initialize the auto flow reduce csv output file.
Definition: gwf-wel.f90:443
character(len=lenftype) ftype
package ftype
Definition: gwf-wel.f90:36
subroutine wel_cf(this)
@ brief Formulate the package hcof and rhs terms.
Definition: gwf-wel.f90:309
subroutine wel_bd_obs(this)
Save observations for the package.
Definition: gwf-wel.f90:567
logical function wel_obs_supported(this)
Determine if observations are supported.
Definition: gwf-wel.f90:528
subroutine log_wel_options(this, found)
@ brief Log WEL specific package options
Definition: gwf-wel.f90:257
character(len=16) text
package flow text string
Definition: gwf-wel.f90:37
subroutine wel_df_obs(this)
Define the observation types available in the package.
Definition: gwf-wel.f90:541
@ brief BndType