MODFLOW 6 version 6.9.0.dev0
USGS Modular Hydrologic Model
Loading...
Searching...
No Matches
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
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
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
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
74contains
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
642end module swfevpmodule
643
This module contains block parser methods.
This module contains the extended boundary package.
subroutine default_nodelist(this)
Assign default nodelist when READASARRAYS is specified.
real(dp) function bound_value(this, col, row)
@ brief Return a bound value
This module contains the base boundary package.
logical(lgp) function bnd_obs_supported(this)
Determine if observations are supported.
subroutine bnd_rp(this)
@ brief Allocate and read method for package
subroutine bnd_da(this)
@ brief Deallocate package memory
subroutine bnd_fc(this, rhs, ia, idxglo, matrix_sln)
@ brief Copy hcof and rhs terms into solution.
subroutine bnd_ck(this)
@ brief Check boundary package period data
subroutine bnd_df_obs(this)
Define the observation types available in the package.
subroutine bnd_cf(this)
@ brief Formulate the package hcof and rhs terms.
subroutine define_listlabel(this)
@ brief Define the list label for the 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
@ dis
DIS6 discretization.
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
real(dp), parameter dzero
real constant zero
Definition Constants.f90:65
real(dp), parameter dprec
real constant machine precision
integer(i4b), parameter maxcharlen
maximum length of char string
Definition Constants.f90:47
real(dp), parameter done
real constant 1
Definition Constants.f90:76
subroutine source_dimensions(this)
Copy dimensions from IDM into package.
Definition Disv1d.f90:341
subroutine allocate_arrays(this)
Definition Disv1d.f90:796
subroutine source_options(this)
Copy options from IDM into package.
Definition Disv1d.f90:272
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:92
real(dp) function, public area(xv, yv, cw)
Calculate polygon area, with vertices given in CW or CCW order.
Definition GeomUtil.f90:364
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:204
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
integer(i4b) iout
file unit number for simulation output
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 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:26
This class is used to store a single deferred-length character string. It was designed to work in an ...