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