MODFLOW 6  version 6.7.0.dev1
USGS Modular Hydrologic Model
swf-evp.f90
Go to the documentation of this file.
1 !> @brief This module contains the evaporation (EVP) package methods
2 !!
3 !! This module can be used to represent evaporation onto streams and
4 !! overland flow cells.
5 !<
7 
8  use kindmodule, only: dp, i4b, lgp
13  use bndmodule, only: bndtype
14  use bndextmodule, only: bndexttype
16  use simvariablesmodule, only: errmsg
21  use smoothingmodule, only: sqsaturation
24  use geomutilmodule, only: get_node
25  use basedismodule, only: disbasetype
26  use disv1dmodule, only: disv1dtype
27  use swfdfwmodule, only: swfdfwtype
28  use swfcxsmodule, only: swfcxstype
29 
30  implicit none
31 
32  private
33  public :: evp_create
34 
35  character(len=LENFTYPE) :: ftype = 'EVP'
36  character(len=LENPACKAGENAME) :: text = ' EVP'
37  ! character(len=LENPACKAGENAME) :: texta = ' EVPA'
38 
39  type, extends(bndexttype) :: swfevptype
40  real(dp), dimension(:), pointer, contiguous :: evaporation => null() !< boundary evaporation array
41  integer(I4B), pointer :: iflowred => null() !< flag that indicates evaporation will be shut off when depth is less than reduction depth
42  real(dp), pointer :: reduction_depth => null() !< depth below which evaporation is reduced
43  logical, pointer, private :: read_as_arrays
44 
45  ! pointers to other objects
46  type(swfdfwtype), pointer :: dfw
47  type(swfcxstype), pointer :: cxs
48 
49  contains
50 
51  procedure :: evp_allocate_scalars
52  procedure :: allocate_arrays => evp_allocate_arrays
53  procedure :: source_options => evp_source_options
54  procedure :: source_dimensions => evp_source_dimensions
55  procedure :: log_evp_options
56  procedure :: read_initial_attr => evp_read_initial_attr
57  procedure :: bnd_rp => evp_rp
58  procedure :: bnd_ck => evp_ck
59  procedure :: bnd_cf => evp_cf
60  procedure :: bnd_fc => evp_fc
61  procedure :: bnd_da => evp_da
62  procedure :: define_listlabel => evp_define_listlabel
63  procedure :: bound_value => evp_bound_value
64  procedure, private :: default_nodelist
65  procedure, private :: reach_length_pointer
66  procedure, private :: get_qevp
67  procedure, private :: get_evap_reduce_mult
68  ! for observations
69  procedure, public :: bnd_obs_supported => evp_obs_supported
70  procedure, public :: bnd_df_obs => evp_df_obs
71 
72  end type swfevptype
73 
74 contains
75 
76  !> @brief Create a Evaporation Package
77  !<
78  subroutine evp_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, &
79  mempath, dis, dfw, cxs)
80  ! dummy
81  class(bndtype), pointer :: packobj !< pointer to default package type
82  integer(I4B), intent(in) :: id !< package id
83  integer(I4B), intent(in) :: ibcnum !< boundary condition number
84  integer(I4B), intent(in) :: inunit !< unit number of CDB package input file
85  integer(I4B), intent(in) :: iout !< unit number of model listing file
86  character(len=*), intent(in) :: namemodel !< model name
87  character(len=*), intent(in) :: pakname !< package name
88  character(len=*), intent(in) :: mempath !< input mempath
89  class(disbasetype), pointer, intent(inout) :: dis !< the pointer to the discretization
90  type(swfdfwtype), pointer, intent(in) :: dfw !< the pointer to the dfw package
91  type(swfcxstype), pointer, intent(in) :: cxs !< the pointer to the cxs package
92  ! local
93  type(swfevptype), pointer :: evpobj
94 
95  ! allocate evaporation object and scalar variables
96  allocate (evpobj)
97  packobj => evpobj
98 
99  ! create name and memory path
100  call packobj%set_names(ibcnum, namemodel, pakname, ftype, mempath)
101  packobj%text = text
102 
103  ! allocate scalars
104  call evpobj%evp_allocate_scalars()
105 
106  ! initialize package
107  call packobj%pack_initialize()
108 
109  packobj%inunit = inunit
110  packobj%iout = iout
111  packobj%id = id
112  packobj%ibcnum = ibcnum
113  packobj%ictMemPath = create_mem_path(namemodel, 'DFW')
114 
115  ! store pointer to dis
116  evpobj%dis => dis
117 
118  ! store pointer to dfw
119  evpobj%dfw => dfw
120 
121  ! store pointer to cxs
122  evpobj%cxs => cxs
123  end subroutine evp_create
124 
125  !> @brief Allocate scalar members
126  !<
127  subroutine evp_allocate_scalars(this)
128  ! dummy
129  class(swfevptype), intent(inout) :: this
130 
131  ! allocate base scalars
132  call this%BndExtType%allocate_scalars()
133 
134  ! allocate internal members
135  call mem_allocate(this%iflowred, 'IFLOWRED', this%memoryPath)
136  call mem_allocate(this%reduction_depth, 'REDUCTION_DEPTH', this%memoryPath)
137  allocate (this%read_as_arrays)
138 
139  ! Set values
140  this%iflowred = 1
141  this%reduction_depth = dem6
142  this%read_as_arrays = .false.
143  end subroutine evp_allocate_scalars
144 
145  !> @brief Allocate package arrays
146  !<
147  subroutine evp_allocate_arrays(this, nodelist, auxvar)
148  ! modules
150  ! dummy
151  class(swfevptype) :: this
152  integer(I4B), dimension(:), pointer, contiguous, optional :: nodelist
153  real(DP), dimension(:, :), pointer, contiguous, optional :: auxvar
154 
155  ! allocate base arrays
156  call this%BndExtType%allocate_arrays(nodelist, auxvar)
157 
158  ! set input context pointers
159  call mem_setptr(this%evaporation, 'EVAPORATION', this%input_mempath)
160 
161  ! checkin input context pointers
162  call mem_checkin(this%evaporation, 'EVAPORATION', this%memoryPath, &
163  'EVAPORATION', this%input_mempath)
164  end subroutine evp_allocate_arrays
165 
166  !> @brief Source options specific to EVPType
167  !<
168  subroutine evp_source_options(this)
169  ! modules
171  implicit none
172  ! dummy
173  class(swfevptype), intent(inout) :: this
174  ! local
175  logical(LGP) :: found_readasarrays = .false.
176 
177  ! source common bound options
178  call this%BndExtType%source_options()
179 
180  ! update defaults with idm sourced values
181  call mem_set_value(this%read_as_arrays, 'READASARRAYS', this%input_mempath, &
182  found_readasarrays)
183 
184  ! log evp params
185  call this%log_evp_options(found_readasarrays)
186  end subroutine evp_source_options
187 
188  !> @brief Log options specific to SwfEvpType
189  !<
190  subroutine log_evp_options(this, found_readasarrays)
191  implicit none
192  ! dummy
193  class(swfevptype), intent(inout) :: this
194  logical(LGP), intent(in) :: found_readasarrays
195  ! formats
196  character(len=*), parameter :: fmtreadasarrays = &
197  &"(4x, 'EVAPORATION INPUT WILL BE READ AS ARRAY(S).')"
198 
199  ! log found options
200  write (this%iout, '(/1x,a)') 'PROCESSING '//trim(adjustl(this%text)) &
201  //' OPTIONS'
202 
203  if (found_readasarrays) then
204  write (this%iout, fmtreadasarrays)
205  end if
206 
207  ! close logging block
208  write (this%iout, '(1x,a)') &
209  'END OF '//trim(adjustl(this%text))//' OPTIONS'
210  end subroutine log_evp_options
211 
212  !> @brief Source the dimensions for this package
213  !<
214  subroutine evp_source_dimensions(this)
215  ! dummy
216  class(swfevptype), intent(inout) :: this
217 
218  if (this%read_as_arrays) then
219 
220  ! Set maxbound to the number of cells per layer, which is simply
221  ! nrow * ncol for a dis2d grid, and nodesuser for disv2d and disv1d
222  this%maxbound = this%dis%get_ncpl()
223 
224  ! verify dimensions were set
225  if (this%maxbound <= 0) then
226  write (errmsg, '(a)') &
227  'MAXBOUND must be an integer greater than zero.'
228  call store_error(errmsg)
229  call store_error_filename(this%input_fname)
230  end if
231 
232  else
233 
234  ! source maxbound
235  call this%BndExtType%source_dimensions()
236 
237  end if
238 
239  ! Call define_listlabel to construct the list label that is written
240  ! when PRINT_INPUT option is used.
241  call this%define_listlabel()
242  end subroutine evp_source_dimensions
243 
244  !> @brief Part of allocate and read
245  !<
246  subroutine evp_read_initial_attr(this)
247  ! dummy
248  class(swfevptype), intent(inout) :: this
249 
250  if (this%read_as_arrays) then
251  call this%default_nodelist()
252  end if
253  end subroutine evp_read_initial_attr
254 
255  !> @brief Read and Prepare
256  !!
257  !! Read itmp and read new boundaries if itmp > 0
258  !<
259  subroutine evp_rp(this)
260  ! modules
261  use tdismodule, only: kper
262  implicit none
263  ! dummy
264  class(swfevptype), intent(inout) :: this
265 
266  if (this%iper /= kper) return
267 
268  if (this%read_as_arrays) then
269  ! no need to do anything because this%evaporation points directly to
270  ! the input context evaporation, which is automatically updated by idm
271  else
272  call this%BndExtType%bnd_rp()
273  end if
274 
275  ! Write the list to iout if requested
276  if (this%iprpak /= 0) then
277  call this%write_list()
278  end if
279  end subroutine evp_rp
280 
281  !> @brief Ensure evaporation is positive
282  !<
283  subroutine evp_ck(this)
284  ! dummy
285  class(swfevptype), intent(inout) :: this
286  ! local
287  character(len=30) :: nodestr
288  integer(I4B) :: i, nr
289  character(len=*), parameter :: fmterr = &
290  &"('Specified stress ',i0, &
291  &' evaporation (',g0,') is less than zero for cell', a)"
292 
293  ! Ensure evaporation rates are positive
294  do i = 1, this%nbound
295  nr = this%nodelist(i)
296  if (nr <= 0) cycle
297  if (this%evaporation(i) < dzero) then
298  call this%dis%noder_to_string(nr, nodestr)
299  write (errmsg, fmt=fmterr) i, this%evaporation(i), trim(nodestr)
300  call store_error(errmsg)
301  end if
302  end do
303 
304  ! write summary of package error messages
305  if (count_errors() > 0) then
306  call store_error_filename(this%input_fname)
307  end if
308  end subroutine evp_ck
309 
310  !> @brief Formulate the HCOF and RHS terms
311  !!
312  !! Skip if no evaporation. Otherwise, calculate hcof and rhs
313  !<
314  subroutine evp_cf(this)
315  ! dummy
316  class(swfevptype) :: this
317  ! local
318  integer(I4B) :: i
319  integer(I4B) :: node
320  integer(I4B) :: inwt
321  real(DP) :: q
322  real(DP) :: qeps
323  real(DP) :: eps
324  real(DP) :: derv
325  real(DP) :: evap
326  real(DP) :: rlen
327  real(DP), dimension(:), pointer :: reach_length
328 
329  ! Return if no evaporation
330  if (this%nbound == 0) return
331 
332  ! Set pointer to reach_length for 1d
333  reach_length => this%reach_length_pointer()
334  rlen = dzero
335 
336  ! Calculate hcof and rhs for each evaporation entry
337  do i = 1, this%nbound
338 
339  ! Find the node number
340  node = this%nodelist(i)
341 
342  ! cycle if nonexistent bound
343  if (node <= 0) then
344  this%hcof(i) = dzero
345  this%rhs(i) = dzero
346  cycle
347  end if
348 
349  ! cycle if dry or constant head
350  if (this%ibound(node) <= 0) then
351  this%hcof(i) = dzero
352  this%rhs(i) = dzero
353  cycle
354  end if
355 
356  ! Initialize hcof
357  this%hcof(i) = dzero
358 
359  ! assign evap rate in length per time and multiply by auxvar
360  evap = this%evaporation(i)
361  if (this%iauxmultcol > 0) then
362  evap = evap * this%auxvar(this%iauxmultcol, i)
363  end if
364 
365  ! get reach length for 1d channel
366  if (this%dis%is_1d()) then
367  rlen = reach_length(node)
368  end if
369 
370  ! Calculate volumetric evaporation flow in L^3/Td and add to rhs
371  q = -this%get_qevp(node, rlen, this%xnew(node), this%xold(node), evap)
372  this%rhs(i) = -q
373 
374  ! Code for adding newton terms
375  inwt = 1
376  if (inwt == 1) then
377 
378  ! calculate perturbed q
379  eps = get_perturbation(this%xnew(node))
380  qeps = -this%get_qevp(node, rlen, this%xnew(node) + eps, &
381  this%xold(node), evap)
382 
383  ! calculate derivative
384  derv = (qeps - q) / eps
385 
386  ! add derivative to hcof and update rhs with derivate contribution
387  this%hcof(i) = derv
388  this%rhs(i) = this%rhs(i) + derv * this%xnew(node)
389  end if
390 
391  end do
392  end subroutine evp_cf
393 
394  !> @brief Calculate qevp
395  !!
396  !! Calculate qevp for both channel and overland flow grids.
397  !! Approximate the average water surface width of the channel
398  !! as wavg = delta A over delta h, and then multiply wavg
399  !! by reach length to come up with surface water area for the
400  !! channel. Reduce evaporation when depths are small and shut
401  !! it off when there is no water in the cell.
402  !<
403  function get_qevp(this, node, rlen, snew, sold, evaporation) result(qevp)
404  ! dummy
405  class(swfevptype) :: this !< this instance
406  integer(I4B), intent(in) :: node !< reduced node number
407  real(dp), intent(in) :: rlen !< length of reach
408  real(dp), intent(in) :: snew !< current stage in reach
409  real(dp), intent(in) :: sold !< previous stage in reach
410  real(dp), intent(in) :: evaporation !< evaporation rate in length per time
411  ! return
412  real(dp) :: qevp
413  ! local
414  integer(I4B) :: idcxs
415  real(dp) :: depth
416  real(dp) :: bt
417  real(dp) :: area
418  real(dp) :: anew
419  real(dp) :: aold
420  real(dp) :: denom
421  real(dp) :: wavg
422  real(dp) :: width_channel
423  real(dp) :: dummy
424  real(dp) :: qmult
425 
426  ! calculate depth of water
427  bt = this%dis%bot(node)
428 
429  ! Determine the water surface area
430  if (this%dis%is_2d()) then
431  ! overland flow case
432  area = this%dis%get_area(node)
433  else if (this%dis%is_1d()) then
434  ! channel case
435  idcxs = this%dfw%idcxs(node)
436  call this%dis%get_flow_width(node, node, 0, width_channel, dummy)
437 
438  depth = snew - bt
439  anew = this%cxs%get_area(idcxs, width_channel, depth)
440  depth = sold - bt
441  aold = this%cxs%get_area(idcxs, width_channel, depth)
442  wavg = this%cxs%get_wetted_top_width(idcxs, width_channel, depth)
443  denom = snew - sold
444  if (abs(denom) > dprec) then
445  wavg = (anew - aold) / (snew - sold)
446  end if
447  area = rlen * wavg
448 
449  end if
450 
451  ! Reduce the evap rate as cell goes dry
452  qmult = this%get_evap_reduce_mult(snew, bt)
453 
454  ! calculate volumetric evaporation flow in L^3/T
455  qevp = evaporation * area * qmult
456 
457  end function get_qevp
458 
459  !> @brief Calculate multiplier to reduce evap as depth goes to zero
460  !<
461  function get_evap_reduce_mult(this, stage, bottom) result(qmult)
462  ! dummy
463  class(swfevptype) :: this
464  real(dp), intent(in) :: stage
465  real(dp), intent(in) :: bottom
466  ! return
467  real(dp) :: qmult
468  ! local
469  real(dp) :: tp
470 
471  qmult = done
472  if (this%iflowred == 1) then
473  tp = bottom + this%reduction_depth
474  qmult = sqsaturation(tp, bottom, stage)
475  end if
476 
477  end function get_evap_reduce_mult
478 
479  !> @brief Copy rhs and hcof into solution rhs and amat
480  !<
481  subroutine evp_fc(this, rhs, ia, idxglo, matrix_sln)
482  ! dummy
483  class(swfevptype) :: this
484  real(DP), dimension(:), intent(inout) :: rhs
485  integer(I4B), dimension(:), intent(in) :: ia
486  integer(I4B), dimension(:), intent(in) :: idxglo
487  class(matrixbasetype), pointer :: matrix_sln
488  ! local
489  integer(I4B) :: i, n, ipos
490 
491  ! Copy package rhs and hcof into solution rhs and amat
492  do i = 1, this%nbound
493  n = this%nodelist(i)
494  if (n <= 0) cycle
495  rhs(n) = rhs(n) + this%rhs(i)
496  ipos = ia(n)
497  call matrix_sln%add_value_pos(idxglo(ipos), this%hcof(i))
498  end do
499  end subroutine evp_fc
500 
501  !> @brief Deallocate memory
502  !<
503  subroutine evp_da(this)
504  ! modules
505  ! dummy
506  class(swfevptype) :: this
507 
508  ! Deallocate parent package
509  call this%BndExtType%bnd_da()
510 
511  ! scalars
512  call mem_deallocate(this%iflowred)
513  call mem_deallocate(this%reduction_depth)
514  deallocate (this%read_as_arrays)
515 
516  ! arrays
517  call mem_deallocate(this%evaporation, 'EVAPORATION', this%memoryPath)
518 
519  ! pointers
520  nullify (this%dis)
521  nullify (this%dfw)
522  nullify (this%cxs)
523  end subroutine evp_da
524 
525  !> @brief Define the list heading that is written to iout when PRINT_INPUT
526  !! option is used.
527  !<
528  subroutine evp_define_listlabel(this)
529  ! dummy
530  class(swfevptype), intent(inout) :: this
531  !
532  ! create the header list label
533  this%listlabel = trim(this%filtyp)//' NO.'
534  if (this%dis%ndim == 3) then
535  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER'
536  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW'
537  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL'
538  elseif (this%dis%ndim == 2) then
539  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER'
540  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D'
541  else
542  write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE'
543  end if
544  write (this%listlabel, '(a, a16)') trim(this%listlabel), 'EVAPORATION'
545 ! if(this%multindex > 0) &
546 ! write(this%listlabel, '(a, a16)') trim(this%listlabel), 'MULTIPLIER'
547  if (this%inamedbound == 1) then
548  write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME'
549  end if
550  end subroutine evp_define_listlabel
551 
552  !> @brief Assign default nodelist when READASARRAYS is specified.
553  !<
554  subroutine default_nodelist(this)
555  ! dummy
556  class(swfevptype) :: this
557  ! local
558  integer(I4B) :: nodeu, noder
559 
560  ! This is only called for readasarrays, so nodelist will be the size of
561  ! the user grid, and will have a value of 0 for any entries where idomain
562  ! is not 1
563  do nodeu = 1, this%maxbound
564  noder = this%dis%get_nodenumber(nodeu, 0)
565  this%nodelist(nodeu) = noder
566  end do
567 
568  ! Assign nbound
569  this%nbound = this%maxbound
570 
571  end subroutine default_nodelist
572 
573  ! Procedures related to observations
574 
575  !> @brief
576  !!
577  !! Overrides BndType%bnd_obs_supported()
578  !<
579  logical function evp_obs_supported(this)
580  implicit none
581  ! dummy
582  class(swfevptype) :: this
583  evp_obs_supported = .true.
584  end function evp_obs_supported
585 
586  !> @brief Implements bnd_df_obs
587  !!
588  !! Store observation type supported by EVP package. Overrides
589  !! BndType%bnd_df_obs
590  !<
591  subroutine evp_df_obs(this)
592  implicit none
593  ! dummy
594  class(swfevptype) :: this
595  ! local
596  integer(I4B) :: indx
597 
598  call this%obs%StoreObsType('evp', .true., indx)
599  this%obs%obsData(indx)%ProcessIdPtr => defaultobsidprocessor
600  end subroutine evp_df_obs
601 
602  !> @brief Return requested boundary value
603  !<
604  function evp_bound_value(this, col, row) result(bndval)
605  ! modules
606  use constantsmodule, only: dzero
607  ! dummy
608  class(swfevptype), intent(inout) :: this !< BndExtType object
609  integer(I4B), intent(in) :: col
610  integer(I4B), intent(in) :: row
611  ! result
612  real(dp) :: bndval
613 
614  select case (col)
615  case (1)
616  if (this%iauxmultcol > 0) then
617  bndval = this%evaporation(row) * this%auxvar(this%iauxmultcol, row)
618  else
619  bndval = this%evaporation(row)
620  end if
621  case default
622  errmsg = 'Programming error. EVP bound value requested column '&
623  &'outside range of ncolbnd (1).'
624  call store_error(errmsg)
625  call store_error_filename(this%input_fname)
626  end select
627  end function evp_bound_value
628 
629  function reach_length_pointer(this) result(ptr)
630  ! dummy
631  class(swfevptype) :: this !< this instance
632  ! return
633  real(dp), dimension(:), pointer :: ptr
634  ! local
635  class(disbasetype), pointer :: dis
636 
637  ptr => null()
638  dis => this%dis
639  select type (dis)
640  type is (disv1dtype)
641  ptr => dis%length
642  end select
643 
644  end function reach_length_pointer
645 
646 end module swfevpmodule
647 
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
integer(i4b), parameter lenpackagename
maximum length of the package name
Definition: Constants.f90:23
real(dp), parameter dhalf
real constant 1/2
Definition: Constants.f90:68
integer(i4b), parameter lenftype
maximum length of a package type (DIS, WEL, OC, etc.)
Definition: Constants.f90:39
real(dp), parameter dem6
real constant 1e-6
Definition: Constants.f90:109
real(dp), parameter dzero
real constant zero
Definition: Constants.f90:65
real(dp), parameter dprec
real constant machine precision
Definition: Constants.f90:120
integer(i4b), parameter maxcharlen
maximum length of char string
Definition: Constants.f90:47
real(dp), parameter done
real constant 1
Definition: Constants.f90:76
integer(i4b) function, public get_node(ilay, irow, icol, nlay, nrow, ncol)
Get node number, given layer, row, and column indices for a structured grid. If any argument is inval...
Definition: GeomUtil.f90:83
This module defines variable data types.
Definition: kind.f90:8
real(dp) function, public get_perturbation(x)
Calculate a numerical perturbation given the value of x.
Definition: MathUtil.f90:372
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
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_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:203
This module contains simulation variables.
Definition: SimVariables.f90:9
character(len=maxcharlen) errmsg
error message string
real(dp) function sqsaturation(top, bot, x, c1, c2)
@ brief sQSaturation
This module contains the evaporation (EVP) package methods.
Definition: swf-evp.f90:6
character(len=lenpackagename) text
Definition: swf-evp.f90:36
real(dp) function get_qevp(this, node, rlen, snew, sold, evaporation)
Calculate qevp.
Definition: swf-evp.f90:404
subroutine evp_da(this)
Deallocate memory.
Definition: swf-evp.f90:504
subroutine evp_allocate_scalars(this)
Allocate scalar members.
Definition: swf-evp.f90:128
subroutine evp_df_obs(this)
Implements bnd_df_obs.
Definition: swf-evp.f90:592
subroutine evp_ck(this)
Ensure evaporation is positive.
Definition: swf-evp.f90:284
subroutine evp_cf(this)
Formulate the HCOF and RHS terms.
Definition: swf-evp.f90:315
logical function evp_obs_supported(this)
Overrides BndTypebnd_obs_supported()
Definition: swf-evp.f90:580
subroutine evp_fc(this, rhs, ia, idxglo, matrix_sln)
Copy rhs and hcof into solution rhs and amat.
Definition: swf-evp.f90:482
subroutine, public evp_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, mempath, dis, dfw, cxs)
Create a Evaporation Package.
Definition: swf-evp.f90:80
subroutine evp_rp(this)
Read and Prepare.
Definition: swf-evp.f90:260
subroutine evp_define_listlabel(this)
Define the list heading that is written to iout when PRINT_INPUT option is used.
Definition: swf-evp.f90:529
subroutine evp_allocate_arrays(this, nodelist, auxvar)
Allocate package arrays.
Definition: swf-evp.f90:148
subroutine evp_source_dimensions(this)
Source the dimensions for this package.
Definition: swf-evp.f90:215
real(dp) function evp_bound_value(this, col, row)
Return requested boundary value.
Definition: swf-evp.f90:605
real(dp) function, dimension(:), pointer reach_length_pointer(this)
Definition: swf-evp.f90:630
subroutine evp_source_options(this)
Source options specific to EVPType.
Definition: swf-evp.f90:169
subroutine evp_read_initial_attr(this)
Part of allocate and read.
Definition: swf-evp.f90:247
subroutine default_nodelist(this)
Assign default nodelist when READASARRAYS is specified.
Definition: swf-evp.f90:555
subroutine log_evp_options(this, found_readasarrays)
Log options specific to SwfEvpType.
Definition: swf-evp.f90:191
real(dp) function get_evap_reduce_mult(this, stage, bottom)
Calculate multiplier to reduce evap as depth goes to zero.
Definition: swf-evp.f90:462
character(len=lenftype) ftype
Definition: swf-evp.f90:35
integer(i4b), pointer, public kper
current stress period number
Definition: tdis.f90:23
@ brief BndType
This class is used to store a single deferred-length character string. It was designed to work in an ...
Definition: CharString.f90:23