40 integer(I4B),
pointer :: iname => null()
41 character(len=24),
dimension(:),
pointer :: aname => null()
42 integer(I4B),
dimension(:),
pointer,
contiguous :: ibound => null()
43 real(dp),
dimension(:),
pointer,
contiguous :: hnew => null()
44 integer(I4B),
pointer :: ixt3d => null()
45 integer(I4B),
pointer :: ixt3drhs => null()
46 integer(I4B),
pointer :: iperched => null()
47 integer(I4B),
pointer :: ivarcv => null()
48 integer(I4B),
pointer :: idewatcv => null()
49 integer(I4B),
pointer :: ithickstrt => null()
50 integer(I4B),
pointer :: ihighcellsat => null()
51 integer(I4B),
pointer :: igwfnewtonur => null()
52 integer(I4B),
pointer :: icalcspdis => null()
53 integer(I4B),
pointer :: isavspdis => null()
54 integer(I4B),
pointer :: isavsat => null()
55 real(dp),
pointer :: hnoflo => null()
56 real(dp),
pointer :: satomega => null()
57 integer(I4B),
pointer :: irewet => null()
58 integer(I4B),
pointer :: iwetit => null()
59 integer(I4B),
pointer :: ihdwet => null()
60 integer(I4B),
pointer :: icellavg => null()
61 real(dp),
pointer :: wetfct => null()
62 real(dp),
pointer :: hdry => null()
63 integer(I4B),
dimension(:),
pointer,
contiguous :: icelltype => null()
64 integer(I4B),
dimension(:),
pointer,
contiguous :: ithickstartflag => null()
67 real(dp),
dimension(:),
pointer,
contiguous :: k11 => null()
68 real(dp),
dimension(:),
pointer,
contiguous :: k22 => null()
69 real(dp),
dimension(:),
pointer,
contiguous :: k33 => null()
70 real(dp),
dimension(:),
pointer,
contiguous :: k11input => null()
71 real(dp),
dimension(:),
pointer,
contiguous :: k22input => null()
72 real(dp),
dimension(:),
pointer,
contiguous :: k33input => null()
73 integer(I4B),
pointer :: iavgkeff => null()
74 integer(I4B),
pointer :: ik22 => null()
75 integer(I4B),
pointer :: ik33 => null()
76 integer(I4B),
pointer :: ik22overk => null()
77 integer(I4B),
pointer :: ik33overk => null()
78 integer(I4B),
pointer :: iangle1 => null()
79 integer(I4B),
pointer :: iangle2 => null()
80 integer(I4B),
pointer :: iangle3 => null()
81 real(dp),
dimension(:),
pointer,
contiguous :: angle1 => null()
82 real(dp),
dimension(:),
pointer,
contiguous :: angle2 => null()
83 real(dp),
dimension(:),
pointer,
contiguous :: angle3 => null()
85 integer(I4B),
pointer :: iwetdry => null()
86 real(dp),
dimension(:),
pointer,
contiguous :: wetdry => null()
87 real(dp),
dimension(:),
pointer,
contiguous :: sat => null()
88 real(dp),
dimension(:),
pointer,
contiguous :: condsat => null()
89 integer(I4B),
dimension(:),
pointer,
contiguous :: ibotnode => null()
91 real(dp),
dimension(:, :),
pointer,
contiguous :: spdis => null()
92 integer(I4B),
pointer :: nedges => null()
93 integer(I4B),
pointer :: lastedge => null()
94 integer(I4B),
dimension(:),
pointer,
contiguous :: nodedge => null()
95 integer(I4B),
dimension(:),
pointer,
contiguous :: ihcedge => null()
96 real(dp),
dimension(:, :),
pointer,
contiguous :: propsedge => null()
97 integer(I4B),
dimension(:),
pointer,
contiguous :: iedge_ptr => null()
98 integer(I4B),
dimension(:),
pointer,
contiguous :: edge_idxs => null()
101 integer(I4B),
pointer :: intvk => null()
102 integer(I4B),
pointer :: invsc => null()
104 integer(I4B),
pointer :: kchangeper => null()
105 integer(I4B),
pointer :: kchangestp => null()
106 integer(I4B),
dimension(:),
pointer,
contiguous :: nodekchange => null()
159 subroutine npf_cr(npfobj, name_model, input_mempath, inunit, iout)
165 character(len=*),
intent(in) :: name_model
166 character(len=*),
intent(in) :: input_mempath
167 integer(I4B),
intent(in) :: inunit
168 integer(I4B),
intent(in) :: iout
170 character(len=*),
parameter :: fmtheader = &
171 "(1x, /1x, 'NPF -- NODE PROPERTY FLOW PACKAGE, VERSION 1, 3/30/2015', &
172 &' INPUT READ FROM MEMPATH: ', A, /)"
178 call npfobj%set_names(1, name_model,
'NPF',
'NPF', input_mempath)
181 call npfobj%allocate_scalars()
184 npfobj%inunit = inunit
191 write (iout, fmtheader) input_mempath
195 allocate (npfobj%spdis_wa)
206 subroutine npf_df(this, dis, xt3d, ingnc, invsc, npf_options)
214 integer(I4B),
intent(in) :: ingnc
215 integer(I4B),
intent(in) :: invsc
222 if (invsc > 0) this%invsc = invsc
224 if (.not.
present(npf_options))
then
227 call this%source_options()
230 call this%allocate_arrays(this%dis%nodes, this%dis%njas)
233 call this%source_griddata()
234 call this%prepcheck()
236 call this%set_options(npf_options)
239 call this%allocate_arrays(this%dis%nodes, this%dis%njas)
242 call this%check_options()
246 if (this%ixt3d /= 0) xt3d%ixt3d = this%ixt3d
247 call this%xt3d%xt3d_df(dis)
250 if (this%ixt3d /= 0 .and. ingnc > 0)
then
251 call store_error(
'Error in model '//trim(this%name_model)// &
252 '. The XT3D option cannot be used with the GNC &
253 &Package.', terminate=.true.)
264 integer(I4B),
intent(in) :: moffset
268 if (this%ixt3d /= 0)
call this%xt3d%xt3d_ac(moffset, sparse)
273 subroutine npf_mc(this, moffset, matrix_sln)
276 integer(I4B),
intent(in) :: moffset
279 if (this%ixt3d /= 0)
call this%xt3d%xt3d_mc(moffset, matrix_sln)
287 subroutine npf_ar(this, ic, vsc, ibound, hnew)
292 type(
gwfictype),
pointer,
intent(in) :: ic
294 integer(I4B),
dimension(:),
pointer,
contiguous,
intent(inout) :: ibound
295 real(DP),
dimension(:),
pointer,
contiguous,
intent(inout) :: hnew
301 this%ibound => ibound
304 if (this%icalcspdis == 1)
then
305 call mem_reallocate(this%spdis, 3, this%dis%nodes,
'SPDIS', this%memoryPath)
306 call mem_reallocate(this%nodedge, this%nedges,
'NODEDGE', this%memoryPath)
307 call mem_reallocate(this%ihcedge, this%nedges,
'IHCEDGE', this%memoryPath)
308 call mem_reallocate(this%propsedge, 5, this%nedges,
'PROPSEDGE', &
311 'NREDGESNODE', this%memoryPath)
313 'EDGEIDXS', this%memoryPath)
315 do n = 1, this%nedges
316 this%edge_idxs(n) = 0
318 do n = 1, this%dis%nodes
319 this%iedge_ptr(n) = 0
320 this%spdis(:, n) =
dzero
325 if (this%invsc /= 0)
then
330 if (this%invsc > 0)
then
342 call this%store_original_k_arrays(this%dis%nodes, this%dis%njas)
346 call this%preprocess_input()
349 if (this%ixt3d /= 0)
then
350 call this%xt3d%xt3d_ar(ibound, this%k11, this%ik33, this%k33, &
351 this%sat, this%ik22, this%k22, &
352 this%iangle1, this%iangle2, this%iangle3, &
353 this%angle1, this%angle2, this%angle3, &
354 this%inewton, this%icelltype)
358 if (this%intvk /= 0)
then
359 call this%tvk%ar(this%dis)
373 if (this%intvk /= 0)
then
382 subroutine npf_ad(this, nodes, hold, hnew, irestore)
389 integer(I4B),
intent(in) :: nodes
390 real(DP),
dimension(nodes),
intent(inout) :: hold
391 real(DP),
dimension(nodes),
intent(inout) :: hnew
392 integer(I4B),
intent(in) :: irestore
397 if (this%irewet > 0)
then
398 do n = 1, this%dis%nodes
399 if (this%wetdry(n) ==
dzero) cycle
400 if (this%ibound(n) /= 0) cycle
401 hold(n) = this%dis%bot(n)
405 do n = 1, this%dis%nodes
406 if (this%wetdry(n) ==
dzero) cycle
407 if (this%ibound(n) /= 0) cycle
413 if (this%intvk /= 0)
then
419 if (this%invsc /= 0)
then
420 call this%vsc%update_k_with_vsc()
424 if (this%kchangeper ==
kper .and. this%kchangestp ==
kstp)
then
425 if (this%ixt3d == 0)
then
429 do n = 1, this%dis%nodes
430 if (this%nodekchange(n) == 1)
then
431 call this%calc_condsat(n, .false.)
437 if (this%xt3d%lamatsaved .and. .not. this%xt3d%ldispersion)
then
438 call this%xt3d%xt3d_fcpc(this%dis%nodes, .true.)
446 subroutine npf_cf(this, kiter, nodes, hnew)
449 integer(I4B) :: kiter
450 integer(I4B),
intent(in) :: nodes
451 real(DP),
intent(inout),
dimension(nodes) :: hnew
457 if (this%inewton /= 1)
then
458 call this%wd(kiter, hnew)
462 do n = 1, this%dis%nodes
463 if (this%icelltype(n) /= 0)
then
464 if (this%ibound(n) == 0)
then
467 call this%thksat(n, hnew(n), satn)
476 subroutine npf_fc(this, kiter, matrix_sln, idxglo, rhs, hnew)
481 integer(I4B) :: kiter
483 integer(I4B),
intent(in),
dimension(:) :: idxglo
484 real(DP),
intent(inout),
dimension(:) :: rhs
485 real(DP),
intent(inout),
dimension(:) :: hnew
487 integer(I4B) :: n, m, ii, idiag, ihc
488 integer(I4B) :: isymcon, idiagm
496 if (this%ixt3d /= 0)
then
497 call this%xt3d%xt3d_fc(kiter, matrix_sln, idxglo, rhs, hnew)
499 do n = 1, this%dis%nodes
500 do ii = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1
501 if (this%dis%con%mask(ii) == 0) cycle
503 m = this%dis%con%ja(ii)
508 ihc = this%dis%con%ihc(this%dis%con%jas(ii))
509 hyn = this%hy_eff(n, m, ihc, ipos=ii)
510 hym = this%hy_eff(m, n, ihc, ipos=ii)
513 if (ihc == c3d_vertical)
then
516 cond =
vcond(this%ibound(n), this%ibound(m), &
517 this%icelltype(n), this%icelltype(m), this%inewton, &
518 this%ivarcv, this%idewatcv, &
519 this%condsat(this%dis%con%jas(ii)), hnew(n), hnew(m), &
521 this%sat(n), this%sat(m), &
522 this%dis%top(n), this%dis%top(m), &
523 this%dis%bot(n), this%dis%bot(m), &
524 this%dis%con%hwva(this%dis%con%jas(ii)))
527 if (this%iperched /= 0)
then
528 if (this%icelltype(m) /= 0)
then
529 if (hnew(m) < this%dis%top(m))
then
532 idiag = this%dis%con%ia(n)
533 rhs(n) = rhs(n) - cond * this%dis%bot(n)
534 call matrix_sln%add_value_pos(idxglo(idiag), -cond)
537 isymcon = this%dis%con%isym(ii)
538 call matrix_sln%add_value_pos(idxglo(isymcon), cond)
539 rhs(m) = rhs(m) + cond * this%dis%bot(n)
550 if (this%ihighcellsat /= 0)
then
551 call this%highest_cell_saturation(n, m, &
557 cond =
hcond(this%ibound(n), this%ibound(m), &
558 this%icelltype(n), this%icelltype(m), &
560 this%dis%con%ihc(this%dis%con%jas(ii)), &
562 this%condsat(this%dis%con%jas(ii)), &
563 hnew(n), hnew(m), satn, satm, hyn, hym, &
564 this%dis%top(n), this%dis%top(m), &
565 this%dis%bot(n), this%dis%bot(m), &
566 this%dis%con%cl1(this%dis%con%jas(ii)), &
567 this%dis%con%cl2(this%dis%con%jas(ii)), &
568 this%dis%con%hwva(this%dis%con%jas(ii)))
572 idiag = this%dis%con%ia(n)
573 call matrix_sln%add_value_pos(idxglo(ii), cond)
574 call matrix_sln%add_value_pos(idxglo(idiag), -cond)
577 isymcon = this%dis%con%isym(ii)
578 idiagm = this%dis%con%ia(m)
579 call matrix_sln%add_value_pos(idxglo(isymcon), cond)
580 call matrix_sln%add_value_pos(idxglo(idiagm), -cond)
595 integer(I4B),
intent(in) :: n, m
596 real(DP),
intent(in) :: hn, hm
597 real(DP),
intent(inout) :: satn, satm
599 integer(I4B) :: ihdbot
600 real(DP) :: botn, botm
603 botn = this%dis%bot(n)
604 botm = this%dis%bot(m)
607 if (botm > botn) ihdbot = m
611 if (abs(botm - botn) >=
dem2)
then
612 top = this%dis%top(ihdbot)
613 bot = this%dis%bot(ihdbot)
621 subroutine npf_fn(this, kiter, matrix_sln, idxglo, rhs, hnew)
624 integer(I4B) :: kiter
626 integer(I4B),
intent(in),
dimension(:) :: idxglo
627 real(DP),
intent(inout),
dimension(:) :: rhs
628 real(DP),
intent(inout),
dimension(:) :: hnew
630 integer(I4B) :: nodes, nja
631 integer(I4B) :: n, m, ii, idiag
632 integer(I4B) :: isymcon, idiagm
637 real(DP) :: filledterm
645 nodes = this%dis%nodes
646 nja = this%dis%con%nja
647 if (this%ixt3d /= 0)
then
648 call this%xt3d%xt3d_fn(kiter, nodes, nja, matrix_sln, idxglo, rhs, hnew)
652 idiag = this%dis%con%ia(n)
653 do ii = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1
654 if (this%dis%con%mask(ii) == 0) cycle
656 m = this%dis%con%ja(ii)
657 isymcon = this%dis%con%isym(ii)
660 if (this%dis%con%ihc(this%dis%con%jas(ii)) == 0 .and. &
661 this%ivarcv == 0)
then
667 if (hnew(m) < hnew(n)) iups = n
669 if (iups == n) idn = m
672 if (this%icelltype(iups) == 0) cycle
676 topup = this%dis%top(iups)
677 botup = this%dis%bot(iups)
678 if (this%dis%con%ihc(this%dis%con%jas(ii)) == 2)
then
679 topup = min(this%dis%top(n), this%dis%top(m))
680 botup = max(this%dis%bot(n), this%dis%bot(m))
684 cond = this%condsat(this%dis%con%jas(ii))
687 consterm = -cond * (hnew(iups) - hnew(idn))
689 filledterm = matrix_sln%get_value_pos(idxglo(ii))
692 idiagm = this%dis%con%ia(m)
697 term = consterm * derv
698 rhs(n) = rhs(n) + term * hnew(n)
699 rhs(m) = rhs(m) - term * hnew(n)
701 call matrix_sln%add_value_pos(idxglo(idiag), term)
703 if (this%ibound(n) > 0)
then
704 filledterm = matrix_sln%get_value_pos(idxglo(ii))
705 call matrix_sln%set_value_pos(idxglo(ii), filledterm)
708 filledterm = matrix_sln%get_value_pos(idxglo(idiagm))
709 call matrix_sln%set_value_pos(idxglo(idiagm), filledterm)
711 if (this%ibound(m) > 0)
then
712 call matrix_sln%add_value_pos(idxglo(isymcon), -term)
717 term = -consterm * derv
718 rhs(n) = rhs(n) + term * hnew(m)
719 rhs(m) = rhs(m) - term * hnew(m)
721 filledterm = matrix_sln%get_value_pos(idxglo(idiag))
722 call matrix_sln%set_value_pos(idxglo(idiag), filledterm)
724 if (this%ibound(n) > 0)
then
725 call matrix_sln%add_value_pos(idxglo(ii), term)
728 call matrix_sln%add_value_pos(idxglo(idiagm), -term)
730 if (this%ibound(m) > 0)
then
731 filledterm = matrix_sln%get_value_pos(idxglo(isymcon))
732 call matrix_sln%set_value_pos(idxglo(isymcon), filledterm)
748 subroutine npf_nur(this, neqmod, x, xtemp, dx, inewtonur, dxmax, locmax)
751 integer(I4B),
intent(in) :: neqmod
752 real(DP),
dimension(neqmod),
intent(inout) :: x
753 real(DP),
dimension(neqmod),
intent(in) :: xtemp
754 real(DP),
dimension(neqmod),
intent(inout) :: dx
755 integer(I4B),
intent(inout) :: inewtonur
756 real(DP),
intent(inout) :: dxmax
757 integer(I4B),
intent(inout) :: locmax
766 do n = 1, this%dis%nodes
767 if (this%ibound(n) < 1) cycle
768 ibot = this%ibotnode(n)
771 if (this%icelltype(n) > 0 .and. this%icelltype(ibot) > 0)
then
772 botm = this%dis%bot(ibot)
775 if (x(n) < botm)
then
779 if (abs(dxx) > abs(dxmax))
then
784 dx(n) = xtemp(n) - x(n)
795 real(DP),
intent(inout),
dimension(:) :: hnew
796 real(DP),
intent(inout),
dimension(:) :: flowja
798 integer(I4B) :: n, ipos, m
803 if (this%ixt3d /= 0)
then
804 call this%xt3d%xt3d_flowja(hnew, flowja)
807 do n = 1, this%dis%nodes
808 do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1
809 m = this%dis%con%ja(ipos)
811 call this%qcalc(n, m, hnew(n), hnew(m), ipos, qnm)
813 flowja(this%dis%con%isym(ipos)) = -qnm
825 integer(I4B),
intent(in) :: n
826 real(DP),
intent(in) :: hn
827 real(DP),
intent(inout) :: thksat
830 if (hn >= this%dis%top(n))
then
833 thksat = (hn - this%dis%bot(n)) / (this%dis%top(n) - this%dis%bot(n))
837 if (this%inewton /= 0)
then
848 integer(I4B),
intent(in) :: n
849 integer(I4B),
intent(in) :: m
850 real(DP),
intent(in) :: hn
851 real(DP),
intent(in) :: hm
852 integer(I4B),
intent(in) :: icon
853 real(DP),
intent(inout) :: qnm
857 real(DP) :: hntemp, hmtemp
858 real(DP) :: satn, satm
862 ihc = this%dis%con%ihc(this%dis%con%jas(icon))
863 hyn = this%hy_eff(n, m, ihc, ipos=icon)
864 hym = this%hy_eff(m, n, ihc, ipos=icon)
868 condnm =
vcond(this%ibound(n), this%ibound(m), &
869 this%icelltype(n), this%icelltype(m), this%inewton, &
870 this%ivarcv, this%idewatcv, &
871 this%condsat(this%dis%con%jas(icon)), hn, hm, &
873 this%sat(n), this%sat(m), &
874 this%dis%top(n), this%dis%top(m), &
875 this%dis%bot(n), this%dis%bot(m), &
876 this%dis%con%hwva(this%dis%con%jas(icon)))
880 if (this%ihighcellsat /= 0)
then
881 call this%highest_cell_saturation(n, m, hn, hm, satn, satm)
884 condnm =
hcond(this%ibound(n), this%ibound(m), &
885 this%icelltype(n), this%icelltype(m), &
887 this%dis%con%ihc(this%dis%con%jas(icon)), &
889 this%condsat(this%dis%con%jas(icon)), &
890 hn, hm, satn, satm, hyn, hym, &
891 this%dis%top(n), this%dis%top(m), &
892 this%dis%bot(n), this%dis%bot(m), &
893 this%dis%con%cl1(this%dis%con%jas(icon)), &
894 this%dis%con%cl2(this%dis%con%jas(icon)), &
895 this%dis%con%hwva(this%dis%con%jas(icon)))
903 if (this%iperched /= 0)
then
904 if (this%dis%con%ihc(this%dis%con%jas(icon)) == 0)
then
906 if (this%icelltype(n) /= 0)
then
907 if (hn < this%dis%top(n)) hntemp = this%dis%bot(m)
910 if (this%icelltype(m) /= 0)
then
911 if (hm < this%dis%top(m)) hmtemp = this%dis%bot(n)
918 qnm = condnm * (hmtemp - hntemp)
926 real(DP),
dimension(:),
intent(in) :: flowja
927 integer(I4B),
intent(in) :: icbcfl
928 integer(I4B),
intent(in) :: icbcun
930 integer(I4B) :: ibinun
933 if (this%ipakcb < 0)
then
935 elseif (this%ipakcb == 0)
then
940 if (icbcfl == 0) ibinun = 0
943 if (ibinun /= 0)
then
944 call this%dis%record_connection_array(flowja, ibinun, this%iout)
948 if (this%isavspdis /= 0)
then
949 if (ibinun /= 0)
call this%sav_spdis(ibinun)
953 if (this%isavsat /= 0)
then
954 if (ibinun /= 0)
call this%sav_sat(ibinun)
966 integer(I4B),
intent(in) :: ibudfl
967 real(DP),
intent(inout),
dimension(:) :: flowja
969 character(len=LENBIGLINE) :: line
970 character(len=30) :: tempstr
971 integer(I4B) :: n, ipos, m
974 character(len=*),
parameter :: fmtiprflow = &
975 &
"(/,4x,'CALCULATED INTERCELL FLOW FOR PERIOD ', i0, ' STEP ', i0)"
978 if (ibudfl /= 0 .and. this%iprflow > 0)
then
979 write (this%iout, fmtiprflow)
kper,
kstp
980 do n = 1, this%dis%nodes
982 call this%dis%noder_to_string(n, tempstr)
983 line = trim(tempstr)//
':'
984 do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1
985 m = this%dis%con%ja(ipos)
986 call this%dis%noder_to_string(m, tempstr)
987 line = trim(line)//
' '//trim(tempstr)
989 write (tempstr,
'(1pg15.6)') qnm
990 line = trim(line)//
' '//trim(adjustl(tempstr))
992 write (this%iout,
'(a)') trim(line)
1007 if (this%icalcspdis == 1 .and. this%spdis_wa%is_created()) &
1008 call this%spdis_wa%destroy()
1009 deallocate (this%spdis_wa)
1015 if (this%intvk /= 0)
then
1017 deallocate (this%tvk)
1021 if (this%invsc /= 0)
then
1065 deallocate (this%aname)
1089 call this%NumericalPackageType%da()
1108 call this%NumericalPackageType%allocate_scalars()
1111 call mem_allocate(this%iname,
'INAME', this%memoryPath)
1112 call mem_allocate(this%ixt3d,
'IXT3D', this%memoryPath)
1113 call mem_allocate(this%ixt3drhs,
'IXT3DRHS', this%memoryPath)
1114 call mem_allocate(this%satomega,
'SATOMEGA', this%memoryPath)
1115 call mem_allocate(this%hnoflo,
'HNOFLO', this%memoryPath)
1117 call mem_allocate(this%icellavg,
'ICELLAVG', this%memoryPath)
1118 call mem_allocate(this%iavgkeff,
'IAVGKEFF', this%memoryPath)
1121 call mem_allocate(this%ik22overk,
'IK22OVERK', this%memoryPath)
1122 call mem_allocate(this%ik33overk,
'IK33OVERK', this%memoryPath)
1123 call mem_allocate(this%iperched,
'IPERCHED', this%memoryPath)
1124 call mem_allocate(this%ivarcv,
'IVARCV', this%memoryPath)
1125 call mem_allocate(this%idewatcv,
'IDEWATCV', this%memoryPath)
1126 call mem_allocate(this%ithickstrt,
'ITHICKSTRT', this%memoryPath)
1127 call mem_allocate(this%ihighcellsat,
'IHIGHCELLSAT', this%memoryPath)
1128 call mem_allocate(this%icalcspdis,
'ICALCSPDIS', this%memoryPath)
1129 call mem_allocate(this%isavspdis,
'ISAVSPDIS', this%memoryPath)
1130 call mem_allocate(this%isavsat,
'ISAVSAT', this%memoryPath)
1131 call mem_allocate(this%irewet,
'IREWET', this%memoryPath)
1132 call mem_allocate(this%wetfct,
'WETFCT', this%memoryPath)
1133 call mem_allocate(this%iwetit,
'IWETIT', this%memoryPath)
1134 call mem_allocate(this%ihdwet,
'IHDWET', this%memoryPath)
1135 call mem_allocate(this%iangle1,
'IANGLE1', this%memoryPath)
1136 call mem_allocate(this%iangle2,
'IANGLE2', this%memoryPath)
1137 call mem_allocate(this%iangle3,
'IANGLE3', this%memoryPath)
1138 call mem_allocate(this%iwetdry,
'IWETDRY', this%memoryPath)
1139 call mem_allocate(this%nedges,
'NEDGES', this%memoryPath)
1140 call mem_allocate(this%lastedge,
'LASTEDGE', this%memoryPath)
1141 call mem_allocate(this%intvk,
'INTVK', this%memoryPath)
1142 call mem_allocate(this%invsc,
'INVSC', this%memoryPath)
1143 call mem_allocate(this%kchangeper,
'KCHANGEPER', this%memoryPath)
1144 call mem_allocate(this%kchangestp,
'KCHANGESTP', this%memoryPath)
1147 call mem_setptr(this%igwfnewtonur,
'INEWTONUR', &
1154 this%satomega =
dzero
1167 this%ihighcellsat = 0
1187 this%iasym = this%inewton
1205 integer(I4B),
intent(in) :: ncells
1206 integer(I4B),
intent(in) :: njas
1212 this%k11input(n) = this%k11(n)
1213 this%k22input(n) = this%k22(n)
1214 this%k33input(n) = this%k33(n)
1223 integer(I4B),
intent(in) :: ncells
1224 integer(I4B),
intent(in) :: njas
1228 call mem_allocate(this%ithickstartflag, ncells,
'ITHICKSTARTFLAG', &
1230 call mem_allocate(this%icelltype, ncells,
'ICELLTYPE', this%memoryPath)
1231 call mem_allocate(this%k11, ncells,
'K11', this%memoryPath)
1232 call mem_allocate(this%sat, ncells,
'SAT', this%memoryPath)
1233 call mem_allocate(this%condsat, njas,
'CONDSAT', this%memoryPath)
1236 call mem_allocate(this%k22, ncells,
'K22', this%memoryPath)
1237 call mem_allocate(this%k33, ncells,
'K33', this%memoryPath)
1238 call mem_allocate(this%wetdry, ncells,
'WETDRY', this%memoryPath)
1239 call mem_allocate(this%angle1, ncells,
'ANGLE1', this%memoryPath)
1240 call mem_allocate(this%angle2, ncells,
'ANGLE2', this%memoryPath)
1241 call mem_allocate(this%angle3, ncells,
'ANGLE3', this%memoryPath)
1244 call mem_allocate(this%ibotnode, 0,
'IBOTNODE', this%memoryPath)
1245 call mem_allocate(this%nodedge, 0,
'NODEDGE', this%memoryPath)
1246 call mem_allocate(this%ihcedge, 0,
'IHCEDGE', this%memoryPath)
1247 call mem_allocate(this%propsedge, 0, 0,
'PROPSEDGE', this%memoryPath)
1248 call mem_allocate(this%iedge_ptr, 0,
'NREDGESNODE', this%memoryPath)
1249 call mem_allocate(this%edge_idxs, 0,
'EDGEIDXS', this%memoryPath)
1252 call mem_allocate(this%k11input, 0,
'K11INPUT', this%memoryPath)
1253 call mem_allocate(this%k22input, 0,
'K22INPUT', this%memoryPath)
1254 call mem_allocate(this%k33input, 0,
'K33INPUT', this%memoryPath)
1257 call mem_allocate(this%spdis, 3, 0,
'SPDIS', this%memoryPath)
1260 call mem_allocate(this%nodekchange, ncells,
'NODEKCHANGE', this%memoryPath)
1264 this%angle1(n) =
dzero
1265 this%angle2(n) =
dzero
1266 this%angle3(n) =
dzero
1267 this%wetdry(n) =
dzero
1268 this%nodekchange(n) =
dzero
1272 allocate (this%aname(this%iname))
1273 this%aname = [
' ICELLTYPE',
' K', &
1275 ' WETDRY',
' ANGLE1', &
1276 ' ANGLE2',
' ANGLE3']
1290 write (this%iout,
'(1x,a)')
'Setting NPF Options'
1291 if (found%iprflow) &
1292 write (this%iout,
'(4x,a)')
'Cell-by-cell flow information will be printed &
1293 &to listing file whenever ICBCFL is not zero.'
1295 write (this%iout,
'(4x,a)')
'Cell-by-cell flow information will be saved &
1296 &to binary file whenever ICBCFL is not zero.'
1297 if (found%cellavg) &
1298 write (this%iout,
'(4x,a,i0)')
'Alternative cell averaging [1=logarithmic, &
1299 &2=AMT-LMK, 3=AMT-HMK] set to: ', &
1301 if (found%ithickstrt) &
1302 write (this%iout,
'(4x,a)')
'THICKSTRT option has been activated.'
1303 if (found%ihighcellsat) &
1304 write (this%iout,
'(4x,a)')
'HIGHEST_CELL_SATURATION option &
1305 &has been activated.'
1306 if (found%iperched) &
1307 write (this%iout,
'(4x,a)')
'Vertical flow will be adjusted for perched &
1310 write (this%iout,
'(4x,a)')
'Vertical conductance varies with water table.'
1311 if (found%idewatcv) &
1312 write (this%iout,
'(4x,a)')
'Vertical conductance is calculated using &
1313 &only the saturated thickness and properties &
1314 &of the overlying cell if the head in the &
1315 &underlying cell is below its top.'
1316 if (found%ixt3d)
write (this%iout,
'(4x,a)')
'XT3D formulation is selected.'
1317 if (found%ixt3drhs) &
1318 write (this%iout,
'(4x,a)')
'XT3D RHS formulation is selected.'
1319 if (found%isavspdis) &
1320 write (this%iout,
'(4x,a)')
'Specific discharge will be calculated at cell &
1321 ¢ers and written to DATA-SPDIS in budget &
1322 &file when requested.'
1323 if (found%isavsat) &
1324 write (this%iout,
'(4x,a)')
'Saturation will be written to DATA-SAT in &
1325 &budget file when requested.'
1326 if (found%ik22overk) &
1327 write (this%iout,
'(4x,a)')
'Values specified for K22 are anisotropy &
1328 &ratios and will be multiplied by K before &
1329 &being used in calculations.'
1330 if (found%ik33overk) &
1331 write (this%iout,
'(4x,a)')
'Values specified for K33 are anisotropy &
1332 &ratios and will be multiplied by K before &
1333 &being used in calculations.'
1334 if (found%inewton) &
1335 write (this%iout,
'(4x,a)')
'NEWTON-RAPHSON method disabled for unconfined &
1337 if (found%satomega) &
1338 write (this%iout,
'(4x,a,1pg15.6)')
'Saturation omega: ', this%satomega
1340 write (this%iout,
'(4x,a)')
'Rewetting is active.'
1342 write (this%iout,
'(4x,a,1pg15.6)') &
1343 'Wetting factor (WETFCT) has been set to: ', this%wetfct
1345 write (this%iout,
'(4x,a,i5)') &
1346 'Wetting iteration interval (IWETIT) has been set to: ', this%iwetit
1348 write (this%iout,
'(4x,a,i5)') &
1349 'Head rewet equation (IHDWET) has been set to: ', this%ihdwet
1350 write (this%iout,
'(1x,a,/)')
'End Setting NPF Options'
1366 character(len=LENVARNAME),
dimension(3) :: cellavg_method = &
1367 &[character(len=LENVARNAME) ::
'LOGARITHMIC',
'AMT-LMK',
'AMT-HMK']
1369 character(len=LINELENGTH) :: tvk6_filename
1372 call mem_set_value(this%iprflow,
'IPRFLOW', this%input_mempath, found%iprflow)
1373 call mem_set_value(this%ipakcb,
'IPAKCB', this%input_mempath, found%ipakcb)
1374 call mem_set_value(this%icellavg,
'CELLAVG', this%input_mempath, &
1375 cellavg_method, found%cellavg)
1376 call mem_set_value(this%ithickstrt,
'ITHICKSTRT', this%input_mempath, &
1378 call mem_set_value(this%ihighcellsat,
'IHIGHCELLSAT', this%input_mempath, &
1380 call mem_set_value(this%iperched,
'IPERCHED', this%input_mempath, &
1382 call mem_set_value(this%ivarcv,
'IVARCV', this%input_mempath, found%ivarcv)
1383 call mem_set_value(this%idewatcv,
'IDEWATCV', this%input_mempath, &
1385 call mem_set_value(this%ixt3d,
'IXT3D', this%input_mempath, found%ixt3d)
1386 call mem_set_value(this%ixt3drhs,
'IXT3DRHS', this%input_mempath, &
1388 call mem_set_value(this%isavspdis,
'ISAVSPDIS', this%input_mempath, &
1390 call mem_set_value(this%isavsat,
'ISAVSAT', this%input_mempath, found%isavsat)
1391 call mem_set_value(this%ik22overk,
'IK22OVERK', this%input_mempath, &
1393 call mem_set_value(this%ik33overk,
'IK33OVERK', this%input_mempath, &
1395 call mem_set_value(this%inewton,
'INEWTON', this%input_mempath, found%inewton)
1396 call mem_set_value(this%satomega,
'SATOMEGA', this%input_mempath, &
1398 call mem_set_value(this%irewet,
'IREWET', this%input_mempath, found%irewet)
1399 call mem_set_value(this%wetfct,
'WETFCT', this%input_mempath, found%wetfct)
1400 call mem_set_value(this%iwetit,
'IWETIT', this%input_mempath, found%iwetit)
1401 call mem_set_value(this%ihdwet,
'IHDWET', this%input_mempath, found%ihdwet)
1404 if (found%ipakcb) this%ipakcb = -1
1407 if (found%ixt3d .and. found%ixt3drhs) this%ixt3d = 2
1410 if (found%isavspdis) this%icalcspdis = this%isavspdis
1413 if (found%inewton)
then
1419 if (
filein_fname(tvk6_filename,
'TVK6_FILENAME', this%input_mempath, &
1420 this%input_fname))
then
1421 call openfile(this%intvk, this%iout, tvk6_filename,
'TVK')
1422 call tvk_cr(this%tvk, this%name_model, this%intvk, this%iout)
1426 if (found%cellavg)
then
1427 if (this%icellavg == 0)
then
1428 errmsg =
'Unrecognized input value for ALTERNATIVE_CELL_AVERAGING option.'
1435 if (this%iout > 0)
then
1436 call this%log_options(found)
1447 this%ithickstrt = options%ithickstrt
1448 this%ihighcellsat = options%ihighcellsat
1449 this%iperched = options%iperched
1450 this%ivarcv = options%ivarcv
1451 this%idewatcv = options%idewatcv
1452 this%irewet = options%irewet
1453 this%wetfct = options%wetfct
1454 this%iwetit = options%iwetit
1455 this%ihdwet = options%ihdwet
1469 if (this%inewton > 0)
then
1470 this%satomega = dem6
1473 if (this%inewton > 0)
then
1474 if (this%iperched > 0)
then
1475 write (
errmsg,
'(a)')
'ERROR IN NPF OPTIONS. NEWTON OPTION CANNOT '// &
1476 'BE USED WITH PERCHED OPTION.'
1479 if (this%ivarcv > 0)
then
1480 write (
errmsg,
'(a)')
'ERROR IN NPF OPTIONS. NEWTON OPTION CANNOT '// &
1481 'BE USED WITH VARIABLECV OPTION.'
1484 if (this%irewet > 0)
then
1485 write (
errmsg,
'(a)')
'ERROR IN NPF OPTIONS. NEWTON OPTION CANNOT '// &
1486 'BE USED WITH REWET OPTION.'
1490 if (this%ihighcellsat /= 0)
then
1491 write (
warnmsg,
'(a)')
'HIGHEST_CELL_SATURATION '// &
1492 'option cannot be used when NEWTON option in not specified. '// &
1493 'Resetting HIGHEST_CELL_SATURATION option to off.'
1494 this%ihighcellsat = 0
1499 if (this%ixt3d /= 0)
then
1500 if (this%icellavg > 0)
then
1501 write (
errmsg,
'(a)')
'ERROR IN NPF OPTIONS. '// &
1502 'ALTERNATIVE_CELL_AVERAGING OPTION '// &
1503 'CANNOT BE USED WITH XT3D OPTION.'
1506 if (this%ithickstrt > 0)
then
1507 write (
errmsg,
'(a)')
'ERROR IN NPF OPTIONS. THICKSTRT OPTION '// &
1508 'CANNOT BE USED WITH XT3D OPTION.'
1511 if (this%iperched > 0)
then
1512 write (
errmsg,
'(a)')
'ERROR IN NPF OPTIONS. PERCHED OPTION '// &
1513 'CANNOT BE USED WITH XT3D OPTION.'
1516 if (this%ivarcv > 0)
then
1517 write (
errmsg,
'(a)')
'ERROR IN NPF OPTIONS. VARIABLECV OPTION '// &
1518 'CANNOT BE USED WITH XT3D OPTION.'
1538 write (this%iout,
'(1x,a)')
'Setting NPF Griddata'
1540 if (found%icelltype)
then
1541 write (this%iout,
'(4x,a)')
'ICELLTYPE set from input file'
1545 write (this%iout,
'(4x,a)')
'K set from input file'
1549 write (this%iout,
'(4x,a)')
'K33 set from input file'
1551 write (this%iout,
'(4x,a)')
'K33 not provided. Setting K33 = K.'
1555 write (this%iout,
'(4x,a)')
'K22 set from input file'
1557 write (this%iout,
'(4x,a)')
'K22 not provided. Setting K22 = K.'
1560 if (found%wetdry)
then
1561 write (this%iout,
'(4x,a)')
'WETDRY set from input file'
1564 if (found%angle1)
then
1565 write (this%iout,
'(4x,a)')
'ANGLE1 set from input file'
1568 if (found%angle2)
then
1569 write (this%iout,
'(4x,a)')
'ANGLE2 set from input file'
1572 if (found%angle3)
then
1573 write (this%iout,
'(4x,a)')
'ANGLE3 set from input file'
1576 write (this%iout,
'(1x,a,/)')
'End Setting NPF Griddata'
1590 character(len=LINELENGTH) :: errmsg
1592 logical,
dimension(2) :: afound
1593 integer(I4B),
dimension(:),
pointer,
contiguous :: map
1597 if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser
1600 call mem_set_value(this%icelltype,
'ICELLTYPE', this%input_mempath, map, &
1602 call mem_set_value(this%k11,
'K', this%input_mempath, map, found%k)
1603 call mem_set_value(this%k33,
'K33', this%input_mempath, map, found%k33)
1604 call mem_set_value(this%k22,
'K22', this%input_mempath, map, found%k22)
1605 call mem_set_value(this%wetdry,
'WETDRY', this%input_mempath, map, &
1607 call mem_set_value(this%angle1,
'ANGLE1', this%input_mempath, map, &
1609 call mem_set_value(this%angle2,
'ANGLE2', this%input_mempath, map, &
1611 call mem_set_value(this%angle3,
'ANGLE3', this%input_mempath, map, &
1615 if (.not. found%icelltype)
then
1616 write (errmsg,
'(a)')
'Error in GRIDDATA block: ICELLTYPE not found.'
1621 if (.not. found%k)
then
1622 write (errmsg,
'(a)')
'Error in GRIDDATA block: K not found.'
1627 if (.not. found%k33 .and. this%ik33overk /= 0)
then
1628 write (errmsg,
'(a)')
'K33OVERK option specified but K33 not specified.'
1633 if (.not. found%k22 .and. this%ik22overk /= 0)
then
1634 write (errmsg,
'(a)')
'K22OVERK option specified but K22 not specified.'
1639 if (found%k33) this%ik33 = 1
1640 if (found%k22) this%ik22 = 1
1641 if (found%wetdry) this%iwetdry = 1
1642 if (found%angle1) this%iangle1 = 1
1643 if (found%angle2) this%iangle2 = 1
1644 if (found%angle3) this%iangle3 = 1
1647 if (.not. found%k33)
then
1648 call mem_set_value(this%k33,
'K', this%input_mempath, map, afound(1))
1650 if (.not. found%k22)
then
1651 call mem_set_value(this%k22,
'K', this%input_mempath, map, afound(2))
1653 if (.not. found%wetdry)
call mem_reallocate(this%wetdry, 1,
'WETDRY', &
1654 trim(this%memoryPath))
1655 if (.not. found%angle1 .and. this%ixt3d == 0) &
1656 call mem_reallocate(this%angle1, 0,
'ANGLE1', trim(this%memoryPath))
1657 if (.not. found%angle2 .and. this%ixt3d == 0) &
1658 call mem_reallocate(this%angle2, 0,
'ANGLE2', trim(this%memoryPath))
1659 if (.not. found%angle3 .and. this%ixt3d == 0) &
1660 call mem_reallocate(this%angle3, 0,
'ANGLE3', trim(this%memoryPath))
1663 if (this%iout > 0)
then
1664 call this%log_griddata(found)
1677 character(len=24),
dimension(:),
pointer :: aname
1678 character(len=LINELENGTH) :: cellstr, errmsg
1679 integer(I4B) :: nerr, n
1681 character(len=*),
parameter :: fmtkerr = &
1682 &
"(1x, 'Hydraulic property ',a,' is <= 0 for cell ',a, ' ', 1pg15.6)"
1683 character(len=*),
parameter :: fmtkerr2 = &
1684 &
"(1x, '... ', i0,' additional errors not shown for ',a)"
1691 do n = 1,
size(this%k11)
1692 if (this%k11(n) <= dzero)
then
1694 if (nerr <= 20)
then
1695 call this%dis%noder_to_string(n, cellstr)
1696 write (errmsg, fmtkerr) trim(adjustl(aname(2))), trim(cellstr), &
1703 write (errmsg, fmtkerr2) nerr, trim(adjustl(aname(2)))
1708 if (this%ik33 /= 0)
then
1712 do n = 1,
size(this%k33)
1713 if (this%ik33overk /= 0) this%k33(n) = this%k33(n) * this%k11(n)
1714 if (this%k33(n) <= dzero)
then
1716 if (nerr <= 20)
then
1717 call this%dis%noder_to_string(n, cellstr)
1718 write (errmsg, fmtkerr) trim(adjustl(aname(3))), trim(cellstr), &
1725 write (errmsg, fmtkerr2) nerr, trim(adjustl(aname(3)))
1731 if (this%ik22 /= 0)
then
1734 if (this%dis%con%ianglex == 0)
then
1735 write (errmsg,
'(a)')
'Error. ANGLDEGX not provided in '// &
1736 'discretization file, but K22 was specified. '
1742 do n = 1,
size(this%k22)
1743 if (this%ik22overk /= 0) this%k22(n) = this%k22(n) * this%k11(n)
1744 if (this%k22(n) <= dzero)
then
1746 if (nerr <= 20)
then
1747 call this%dis%noder_to_string(n, cellstr)
1748 write (errmsg, fmtkerr) trim(adjustl(aname(4))), trim(cellstr), &
1755 write (errmsg, fmtkerr2) nerr, trim(adjustl(aname(4)))
1761 if (this%irewet == 1)
then
1762 if (this%iwetdry == 0)
then
1763 write (errmsg,
'(a, a, a)')
'Error in GRIDDATA block: ', &
1764 trim(adjustl(aname(5))),
' not found.'
1770 if (this%iangle1 /= 0)
then
1771 do n = 1,
size(this%angle1)
1772 this%angle1(n) = this%angle1(n) *
dpio180
1775 if (this%ixt3d /= 0)
then
1777 write (this%iout,
'(a)')
'XT3D IN USE, BUT ANGLE1 NOT SPECIFIED. '// &
1778 'SETTING ANGLE1 TO ZERO.'
1779 do n = 1,
size(this%angle1)
1780 this%angle1(n) = dzero
1784 if (this%iangle2 /= 0)
then
1785 if (this%iangle1 == 0)
then
1786 write (errmsg,
'(a)')
'ANGLE2 SPECIFIED BUT NOT ANGLE1. '// &
1787 'ANGLE2 REQUIRES ANGLE1. '
1790 if (this%iangle3 == 0)
then
1791 write (errmsg,
'(a)')
'ANGLE2 SPECIFIED BUT NOT ANGLE3. '// &
1792 'SPECIFY BOTH OR NEITHER ONE. '
1795 do n = 1,
size(this%angle2)
1796 this%angle2(n) = this%angle2(n) *
dpio180
1799 if (this%iangle3 /= 0)
then
1800 if (this%iangle1 == 0)
then
1801 write (errmsg,
'(a)')
'ANGLE3 SPECIFIED BUT NOT ANGLE1. '// &
1802 'ANGLE3 REQUIRES ANGLE1. '
1805 if (this%iangle2 == 0)
then
1806 write (errmsg,
'(a)')
'ANGLE3 SPECIFIED BUT NOT ANGLE2. '// &
1807 'SPECIFY BOTH OR NEITHER ONE. '
1810 do n = 1,
size(this%angle3)
1811 this%angle3(n) = this%angle3(n) *
dpio180
1838 integer(I4B) :: n, m, ii, nn
1839 real(DP) :: hyn, hym
1840 real(DP) :: satn, topn, botn
1841 integer(I4B) :: nextn
1842 real(DP) :: minbot, botm
1844 character(len=LINELENGTH) :: cellstr, errmsg
1846 character(len=*),
parameter :: fmtcnv = &
1848 &' ELIMINATED BECAUSE ALL HYDRAULIC CONDUCTIVITIES TO NODE ARE 0.')"
1849 character(len=*),
parameter :: fmtnct = &
1850 &
"(1X,'Negative cell thickness at cell ', A)"
1851 character(len=*),
parameter :: fmtihbe = &
1852 &
"(1X,'Initial head, bottom elevation:',1P,2G13.5)"
1853 character(len=*),
parameter :: fmttebe = &
1854 &
"(1X,'Top elevation, bottom elevation:',1P,2G13.5)"
1856 do n = 1, this%dis%nodes
1857 this%ithickstartflag(n) = 0
1863 nodeloop:
do n = 1, this%dis%nodes
1866 if (this%ibound(n) == 0)
then
1867 if (this%irewet /= 0)
then
1868 if (this%wetdry(n) == dzero) cycle nodeloop
1875 if (this%k11(n) /= dzero) cycle nodeloop
1879 do ii = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1
1880 m = this%dis%con%ja(ii)
1881 if (this%dis%con%ihc(this%dis%con%jas(ii)) == 0)
then
1883 if (this%ik33 /= 0) hyn = this%k33(n)
1884 if (hyn /= dzero)
then
1886 if (this%ik33 /= 0) hym = this%k33(m)
1887 if (hym /= dzero) cycle
1895 this%hnew(n) = this%hnoflo
1896 if (this%irewet /= 0) this%wetdry(n) = dzero
1897 call this%dis%noder_to_string(n, cellstr)
1898 write (this%iout, fmtcnv) trim(adjustl(cellstr))
1903 if (this%inewton == 0)
then
1906 call this%wd(0, this%hnew)
1912 if (this%ivarcv == 1)
then
1913 do n = 1, this%dis%nodes
1914 if (this%hnew(n) < this%dis%bot(n))
then
1915 this%hnew(n) = this%dis%bot(n) + dem6
1923 if (this%ithickstrt == 0)
then
1924 do n = 1, this%dis%nodes
1925 if (this%icelltype(n) < 0)
then
1926 this%icelltype(n) = 1
1936 do n = 1, this%dis%nodes
1937 if (this%ibound(n) == 0)
then
1939 if (this%icelltype(n) < 0 .and. this%ithickstrt /= 0)
then
1940 this%ithickstartflag(n) = 1
1941 this%icelltype(n) = 0
1944 topn = this%dis%top(n)
1945 botn = this%dis%bot(n)
1946 if (this%icelltype(n) < 0 .and. this%ithickstrt /= 0)
then
1947 call this%thksat(n, this%ic%strt(n), satn)
1948 if (botn > this%ic%strt(n))
then
1949 call this%dis%noder_to_string(n, cellstr)
1950 write (errmsg, fmtnct) trim(adjustl(cellstr))
1952 write (errmsg, fmtihbe) this%ic%strt(n), botn
1955 this%ithickstartflag(n) = 1
1956 this%icelltype(n) = 0
1959 if (botn > topn)
then
1960 call this%dis%noder_to_string(n, cellstr)
1961 write (errmsg, fmtnct) trim(adjustl(cellstr))
1963 write (errmsg, fmttebe) topn, botn
1976 if (this%ixt3d == 0)
then
1981 do n = 1, this%dis%nodes
1982 call this%calc_condsat(n, .true.)
1988 if (this%igwfnewtonur /= 0)
then
1990 trim(this%memoryPath))
1991 do n = 1, this%dis%nodes
1993 minbot = this%dis%bot(n)
1996 do while (.not. finished)
2000 do ii = this%dis%con%ia(nn) + 1, this%dis%con%ia(nn + 1) - 1
2003 m = this%dis%con%ja(ii)
2004 botm = this%dis%bot(m)
2007 if (this%dis%con%ihc(this%dis%con%jas(ii)) == 0)
then
2008 if (m > nn .and. botm < minbot)
then
2020 this%ibotnode(n) = nn
2025 this%igwfnewtonur => null()
2036 integer(I4B),
intent(in) :: node
2037 logical,
intent(in) :: upperOnly
2039 integer(I4B) :: ii, m, n, ihc, jj
2040 real(DP) :: topm, topn, topnode, botm, botn, botnode, satm, satn, satnode
2041 real(DP) :: hyn, hym, hn, hm, fawidth, csat
2043 satnode = this%calc_initial_sat(node)
2045 topnode = this%dis%top(node)
2046 botnode = this%dis%bot(node)
2049 do ii = this%dis%con%ia(node) + 1, this%dis%con%ia(node + 1) - 1
2053 m = this%dis%con%ja(ii)
2054 jj = this%dis%con%jas(ii)
2056 if (upperonly) cycle
2063 topn = this%dis%top(n)
2064 botn = this%dis%bot(n)
2065 satn = this%calc_initial_sat(n)
2072 topm = this%dis%top(m)
2073 botm = this%dis%bot(m)
2074 satm = this%calc_initial_sat(m)
2077 ihc = this%dis%con%ihc(jj)
2078 hyn = this%hy_eff(n, m, ihc, ipos=ii)
2079 hym = this%hy_eff(m, n, ihc, ipos=ii)
2080 if (this%ithickstartflag(n) == 0)
then
2083 hn = this%ic%strt(n)
2085 if (this%ithickstartflag(m) == 0)
then
2088 hm = this%ic%strt(m)
2096 csat =
vcond(1, 1, 1, 1, 0, 1, 1,
done, &
2102 this%dis%con%hwva(jj))
2106 fawidth = this%dis%con%hwva(jj)
2107 csat =
hcond(1, 1, 1, 1, 0, &
2111 hn, hm, satn, satm, hyn, hym, &
2114 this%dis%con%cl1(jj), &
2115 this%dis%con%cl2(jj), &
2118 this%condsat(jj) = csat
2132 integer(I4B),
intent(in) :: n
2137 if (this%ibound(n) /= 0 .and. this%ithickstartflag(n) /= 0)
then
2138 call this%thksat(n, this%ic%strt(n), satn)
2151 integer(I4B),
intent(in) :: kiter
2152 real(DP),
intent(inout),
dimension(:) :: hnew
2154 integer(I4B) :: n, m, ii, ihc
2155 real(DP) :: ttop, bbot, thick
2156 integer(I4B) :: ncnvrt, ihdcnv
2157 character(len=30),
dimension(5) :: nodcnvrt
2158 character(len=30) :: nodestr
2159 character(len=3),
dimension(5) :: acnvrt
2160 character(len=LINELENGTH) :: errmsg
2161 integer(I4B) :: irewet
2163 character(len=*),
parameter :: fmtnct = &
2164 "(1X,/1X,'Negative cell thickness at (layer,row,col)', &
2166 character(len=*),
parameter :: fmttopbot = &
2167 &
"(1X,'Top elevation, bottom elevation:',1P,2G13.5)"
2168 character(len=*),
parameter :: fmttopbotthk = &
2169 &
"(1X,'Top elevation, bottom elevation, thickness:',1P,3G13.5)"
2170 character(len=*),
parameter :: fmtdrychd = &
2171 &
"(1X,/1X,'CONSTANT-HEAD CELL WENT DRY -- SIMULATION ABORTED')"
2172 character(len=*),
parameter :: fmtni = &
2173 &
"(1X,'CELLID=',a,' ITERATION=',I0,' TIME STEP=',I0,' STRESS PERIOD=',I0)"
2180 do n = 1, this%dis%nodes
2181 do ii = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1
2182 m = this%dis%con%ja(ii)
2183 ihc = this%dis%con%ihc(this%dis%con%jas(ii))
2184 call this%rewet_check(kiter, n, hnew(m), this%ibound(m), ihc, hnew, &
2186 if (irewet == 1)
then
2187 call this%wdmsg(2, ncnvrt, nodcnvrt, acnvrt, ihdcnv, kiter, n)
2193 do n = 1, this%dis%nodes
2196 if (this%ibound(n) == 0) cycle
2197 if (this%icelltype(n) == 0) cycle
2200 bbot = this%dis%bot(n)
2201 ttop = this%dis%top(n)
2202 if (bbot > ttop)
then
2203 write (errmsg, fmtnct) n
2205 write (errmsg, fmttopbot) ttop, bbot
2211 if (this%icelltype(n) /= 0)
then
2212 if (hnew(n) < ttop) ttop = hnew(n)
2217 if (thick <= dzero)
then
2218 call this%wdmsg(1, ncnvrt, nodcnvrt, acnvrt, ihdcnv, kiter, n)
2220 if (this%ibound(n) < 0)
then
2221 errmsg =
'CONSTANT-HEAD CELL WENT DRY -- SIMULATION ABORTED'
2223 write (errmsg, fmttopbotthk) ttop, bbot, thick
2225 call this%dis%noder_to_string(n, nodestr)
2226 write (errmsg, fmtni) trim(adjustl(nodestr)), kiter,
kstp,
kper
2235 call this%wdmsg(0, ncnvrt, nodcnvrt, acnvrt, ihdcnv, kiter, n)
2238 do n = 1, this%dis%nodes
2239 if (this%ibound(n) == 30000) this%ibound(n) = 1
2250 subroutine rewet_check(this, kiter, node, hm, ibdm, ihc, hnew, irewet)
2253 integer(I4B),
intent(in) :: kiter
2254 integer(I4B),
intent(in) :: node
2255 real(DP),
intent(in) :: hm
2256 integer(I4B),
intent(in) :: ibdm
2257 integer(I4B),
intent(in) :: ihc
2258 real(DP),
intent(inout),
dimension(:) :: hnew
2259 integer(I4B),
intent(out) :: irewet
2261 integer(I4B) :: itflg
2262 real(DP) :: wd, awd, turnon, bbot
2267 if (this%irewet > 0)
then
2268 itflg = mod(kiter, this%iwetit)
2269 if (itflg == 0)
then
2270 if (this%ibound(node) == 0 .and. this%wetdry(node) /=
dzero)
then
2273 bbot = this%dis%bot(node)
2274 wd = this%wetdry(node)
2276 if (wd < 0) awd = -wd
2284 if (ibdm > 0 .and. hm >= turnon) irewet = 1
2286 if (wd >
dzero)
then
2289 if (ibdm > 0 .and. hm >= turnon) irewet = 1
2293 if (irewet == 1)
then
2296 if (this%ihdwet == 0)
then
2297 hnew(node) = bbot + this%wetfct * (hm - bbot)
2299 hnew(node) = bbot + this%wetfct * awd
2301 this%ibound(node) = 30000
2316 integer(I4B),
intent(in) :: icode
2317 integer(I4B),
intent(inout) :: ncnvrt
2318 character(len=30),
dimension(5),
intent(inout) :: nodcnvrt
2319 character(len=3),
dimension(5),
intent(inout) :: acnvrt
2320 integer(I4B),
intent(inout) :: ihdcnv
2321 integer(I4B),
intent(in) :: kiter
2322 integer(I4B),
intent(in) :: n
2326 character(len=*),
parameter :: fmtcnvtn = &
2327 "(1X,/1X,'CELL CONVERSIONS FOR ITER.=',I0, &
2328 &' STEP=',I0,' PERIOD=',I0,' (NODE or LRC)')"
2329 character(len=*),
parameter :: fmtnode =
"(1X,3X,5(A4, A20))"
2334 call this%dis%noder_to_string(n, nodcnvrt(ncnvrt))
2335 if (icode == 1)
then
2336 acnvrt(ncnvrt) =
'DRY'
2338 acnvrt(ncnvrt) =
'WET'
2344 if (ncnvrt == 5 .or. (icode == 0 .and. ncnvrt > 0))
then
2345 if (ihdcnv == 0)
write (this%iout, fmtcnvtn) kiter,
kstp,
kper
2347 write (this%iout, fmtnode) &
2348 (acnvrt(l), trim(adjustl(nodcnvrt(l))), l=1, ncnvrt)
2363 function hy_eff(this, n, m, ihc, ipos, vg)
result(hy)
2368 integer(I4B),
intent(in) :: n
2369 integer(I4B),
intent(in) :: m
2370 integer(I4B),
intent(in) :: ihc
2371 integer(I4B),
intent(in),
optional :: ipos
2372 real(dp),
dimension(3),
intent(in),
optional :: vg
2374 integer(I4B) :: iipos
2375 real(dp) :: hy11, hy22, hy33
2376 real(dp) :: ang1, ang2, ang3
2377 real(dp) :: vg1, vg2, vg3
2381 if (
present(ipos)) iipos = ipos
2395 if (this%iangle2 > 0)
then
2396 if (
present(vg))
then
2401 call this%dis%connection_normal(n, m, ihc, vg1, vg2, vg3, iipos)
2403 ang1 = this%angle1(n)
2404 ang2 = this%angle2(n)
2406 if (this%iangle3 > 0) ang3 = this%angle3(n)
2407 hy =
hyeff(hy11, hy22, hy33, ang1, ang2, ang3, vg1, vg2, vg3, &
2415 if (this%ik22 > 0)
then
2416 if (
present(vg))
then
2421 call this%dis%connection_normal(n, m, ihc, vg1, vg2, vg3, iipos)
2426 if (this%iangle1 > 0)
then
2427 ang1 = this%angle1(n)
2428 if (this%iangle2 > 0)
then
2429 ang2 = this%angle2(n)
2430 if (this%iangle3 > 0) ang3 = this%angle3(n)
2433 hy =
hyeff(hy11, hy22, hy33, ang1, ang2, ang3, vg1, vg2, vg3, &
2447 real(DP),
intent(in),
dimension(:) :: flowja
2451 integer(I4B) :: ipos
2452 integer(I4B) :: iedge
2453 integer(I4B) :: isympos
2481 logical :: nozee = .true.
2485 if (this%icalcspdis /= 0 .and. this%dis%con%ianglex == 0)
then
2486 call store_error(
'Error. ANGLDEGX not provided in '// &
2487 'discretization file. ANGLDEGX required for '// &
2488 'calculation of specific discharge.', terminate=.true.)
2491 swa => this%spdis_wa
2492 if (.not. swa%is_created())
then
2494 call this%spdis_wa%create(this%calc_max_conns())
2497 if (this%nedges > 0)
call this%prepare_edge_lookup()
2501 do n = 1, this%dis%nodes
2511 do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1
2512 m = this%dis%con%ja(ipos)
2513 isympos = this%dis%con%jas(ipos)
2514 ihc = this%dis%con%ihc(isympos)
2515 area = this%dis%con%hwva(isympos)
2521 call this%dis%connection_vector(n, m, nozee, this%sat(n), this%sat(m), &
2522 ihc, xc, yc, zc, dltot)
2523 cl1 = this%dis%con%cl1(isympos)
2524 cl2 = this%dis%con%cl2(isympos)
2526 cl1 = this%dis%con%cl2(isympos)
2527 cl2 = this%dis%con%cl1(isympos)
2529 ooclsum =
done / (cl1 + cl2)
2530 swa%diz(iz) = dltot * cl1 * ooclsum
2533 swa%viz(iz) = qz / area
2538 dz =
thksatnm(this%ibound(n), this%ibound(m), &
2539 this%icelltype(n), this%icelltype(m), &
2540 this%inewton, ihc, &
2541 this%hnew(n), this%hnew(m), this%sat(n), this%sat(m), &
2542 this%dis%top(n), this%dis%top(m), this%dis%bot(n), &
2545 call this%dis%connection_normal(n, m, ihc, xn, yn, zn, ipos)
2546 call this%dis%connection_vector(n, m, nozee, this%sat(n), this%sat(m), &
2547 ihc, xc, yc, zc, dltot)
2548 cl1 = this%dis%con%cl1(isympos)
2549 cl2 = this%dis%con%cl2(isympos)
2551 cl1 = this%dis%con%cl2(isympos)
2552 cl2 = this%dis%con%cl1(isympos)
2554 ooclsum =
done / (cl1 + cl2)
2557 swa%di(ic) = dltot * cl1 * ooclsum
2558 if (area >
dzero)
then
2559 swa%vi(ic) = flowja(ipos) / area
2567 if (this%nedges > 0)
then
2568 do ipos = this%iedge_ptr(n), this%iedge_ptr(n + 1) - 1
2569 iedge = this%edge_idxs(ipos)
2572 ihc = this%ihcedge(iedge)
2573 area = this%propsedge(2, iedge)
2576 swa%viz(iz) = this%propsedge(1, iedge) / area
2577 swa%diz(iz) = this%propsedge(5, iedge)
2580 swa%nix(ic) = -this%propsedge(3, iedge)
2581 swa%niy(ic) = -this%propsedge(4, iedge)
2582 swa%di(ic) = this%propsedge(5, iedge)
2583 if (area >
dzero)
then
2584 swa%vi(ic) = this%propsedge(1, iedge) / area
2602 dsumz = dsumz + swa%diz(iz)
2604 denom = (ncz -
done)
2606 dsumz = dsumz +
dem10 * dsumz
2608 if (dsumz >
dzero) swa%wiz(iz) =
done - swa%diz(iz) / dsumz
2610 swa%wiz(iz) = swa%wiz(iz) / denom
2618 vz = vz + swa%wiz(iz) * swa%viz(iz)
2627 swa%wix(ic) = swa%di(ic) * abs(swa%nix(ic))
2628 swa%wiy(ic) = swa%di(ic) * abs(swa%niy(ic))
2629 dsumx = dsumx + swa%wix(ic)
2630 dsumy = dsumy + swa%wiy(ic)
2637 dsumx = dsumx +
dem10 * dsumx
2638 dsumy = dsumy +
dem10 * dsumy
2640 swa%wix(ic) = (dsumx - swa%wix(ic)) * abs(swa%nix(ic))
2641 swa%wiy(ic) = (dsumy - swa%wiy(ic)) * abs(swa%niy(ic))
2648 swa%bix(ic) = swa%wix(ic) * sign(
done, swa%nix(ic))
2649 swa%biy(ic) = swa%wiy(ic) * sign(
done, swa%niy(ic))
2650 dsumx = dsumx + swa%wix(ic) * abs(swa%nix(ic))
2651 dsumy = dsumy + swa%wiy(ic) * abs(swa%niy(ic))
2658 swa%bix(ic) = swa%bix(ic) * dsumx
2659 swa%biy(ic) = swa%biy(ic) * dsumy
2660 axy = axy + swa%bix(ic) * swa%niy(ic)
2661 ayx = ayx + swa%biy(ic) * swa%nix(ic)
2674 vx = vx + (swa%bix(ic) - axy * swa%biy(ic)) * swa%vi(ic)
2675 vy = vy + (swa%biy(ic) - ayx * swa%bix(ic)) * swa%vi(ic)
2677 denom =
done - axy * ayx
2678 if (denom /=
dzero)
then
2683 this%spdis(1, n) = vx
2684 this%spdis(2, n) = vy
2685 this%spdis(3, n) = vz
2696 integer(I4B),
intent(in) :: ibinun
2698 character(len=16) :: text
2699 character(len=16),
dimension(3) :: auxtxt
2701 integer(I4B) :: naux
2704 text =
' DATA-SPDIS'
2706 auxtxt(:) = [
' qx',
' qy',
' qz']
2707 call this%dis%record_srcdst_list_header(text, this%name_model, &
2708 this%packName, this%name_model, &
2709 this%packName, naux, auxtxt, ibinun, &
2710 this%dis%nodes, this%iout)
2713 do n = 1, this%dis%nodes
2714 call this%dis%record_mf6_list_entry(ibinun, n, n,
dzero, naux, &
2724 integer(I4B),
intent(in) :: ibinun
2726 character(len=16) :: text
2727 character(len=16),
dimension(1) :: auxtxt
2728 real(DP),
dimension(1) :: a
2730 integer(I4B) :: naux
2735 auxtxt(:) = [
' sat']
2736 call this%dis%record_srcdst_list_header(text, this%name_model, &
2737 this%packName, this%name_model, &
2738 this%packName, naux, auxtxt, ibinun, &
2739 this%dis%nodes, this%iout)
2742 do n = 1, this%dis%nodes
2744 call this%dis%record_mf6_list_entry(ibinun, n, n,
dzero, naux, a)
2756 integer(I4B),
intent(in) :: nedges
2758 this%nedges = this%nedges + nedges
2765 integer(I4B) :: max_conns
2767 integer(I4B) :: n, m, ic
2770 do n = 1, this%dis%nodes
2773 ic = this%dis%con%ia(n + 1) - this%dis%con%ia(n) - 1
2776 do m = 1, this%nedges
2777 if (this%nodedge(m) == n)
then
2783 if (ic > max_conns) max_conns = ic
2794 integer(I4B),
intent(in) :: nodedge
2795 integer(I4B),
intent(in) :: ihcedge
2796 real(DP),
intent(in) :: q
2797 real(DP),
intent(in) :: area
2798 real(DP),
intent(in) :: nx
2799 real(DP),
intent(in) :: ny
2800 real(DP),
intent(in) :: distance
2802 integer(I4B) :: lastedge
2804 this%lastedge = this%lastedge + 1
2805 lastedge = this%lastedge
2806 this%nodedge(lastedge) = nodedge
2807 this%ihcedge(lastedge) = ihcedge
2808 this%propsedge(1, lastedge) = q
2809 this%propsedge(2, lastedge) = area
2810 this%propsedge(3, lastedge) = nx
2811 this%propsedge(4, lastedge) = ny
2812 this%propsedge(5, lastedge) = distance
2816 if (this%lastedge == this%nedges) this%lastedge = 0
2822 integer(I4B) :: i, inode, iedge
2823 integer(I4B) :: n, start, end
2824 integer(I4B) :: prev_cnt, strt_idx, ipos
2826 do i = 1,
size(this%iedge_ptr)
2827 this%iedge_ptr(i) = 0
2829 do i = 1,
size(this%edge_idxs)
2830 this%edge_idxs(i) = 0
2834 do iedge = 1, this%nedges
2835 n = this%nodedge(iedge)
2836 this%iedge_ptr(n) = this%iedge_ptr(n) + 1
2840 prev_cnt = this%iedge_ptr(1)
2841 this%iedge_ptr(1) = 1
2842 do inode = 2, this%dis%nodes + 1
2843 strt_idx = this%iedge_ptr(inode - 1) + prev_cnt
2844 prev_cnt = this%iedge_ptr(inode)
2845 this%iedge_ptr(inode) = strt_idx
2849 do iedge = 1, this%nedges
2850 n = this%nodedge(iedge)
2851 start = this%iedge_ptr(n)
2852 end = this%iedge_ptr(n + 1) - 1
2853 do ipos = start,
end
2854 if (this%edge_idxs(ipos) > 0) cycle
2855 this%edge_idxs(ipos) = iedge
2871 real(dp) :: satthickness
2873 satthickness = thksatnm(this%ibound(n), &
2875 this%icelltype(n), &
2876 this%icelltype(m), &
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
@ c3d_vertical
vertical connection
real(dp), parameter dhdry
real dry cell constant
real(dp), parameter dp9
real constant 9/10
real(dp), parameter dem10
real constant 1e-10
real(dp), parameter dem7
real constant 1e-7
real(dp), parameter dem8
real constant 1e-8
integer(i4b), parameter lenbigline
maximum length of a big line
real(dp), parameter dhnoflo
real no flow constant
integer(i4b), parameter lenvarname
maximum length of a variable name
real(dp), parameter dhalf
real constant 1/2
real(dp), parameter dpio180
real constant
real(dp), parameter dem6
real constant 1e-6
real(dp), parameter dzero
real constant zero
real(dp), parameter dem9
real constant 1e-9
real(dp), parameter dem2
real constant 1e-2
real(dp), parameter dtwo
real constant 2
integer(i4b), parameter lenmempath
maximum length of the memory path
real(dp), parameter done
real constant 1
This module contains stateless conductance functions.
real(dp) function, public thksatnm(ibdn, ibdm, ictn, ictm, iupstream, ihc, hn, hm, satn, satm, topn, topm, botn, botm)
Calculate wetted cell thickness at interface between two cells.
real(dp) function, public condmean(k1, k2, thick1, thick2, cl1, cl2, width, iavgmeth)
Calculate the conductance between two cells.
real(dp) function, public hcond(ibdn, ibdm, ictn, ictm, iupstream, ihc, icellavg, condsat, hn, hm, satn, satm, hkn, hkm, topn, topm, botn, botm, cln, clm, fawidth)
Horizontal conductance between two cells.
@, public ccond_hmean
Harmonic mean.
real(dp) function, public vcond(ibdn, ibdm, ictn, ictm, inewton, ivarcv, idewatcv, condsat, hn, hm, vkn, vkm, satn, satm, topn, topm, botn, botm, flowarea)
Vertical conductance between two cells.
subroutine set_options(this, options)
Set options in the NPF object.
subroutine npf_save_model_flows(this, flowja, icbcfl, icbcun)
Record flowja and calculate specific discharge if requested.
subroutine source_options(this)
Update simulation options from input mempath.
real(dp) function calc_initial_sat(this, n)
Calculate initial saturation for the given node.
subroutine calc_condsat(this, node, upperOnly)
Calculate CONDSAT array entries for the given node.
subroutine rewet_check(this, kiter, node, hm, ibdm, ihc, hnew, irewet)
Determine if a cell should rewet.
integer(i4b) function calc_max_conns(this)
Calculate the maximum number of connections for any cell.
subroutine npf_mc(this, moffset, matrix_sln)
Map connections and construct iax, jax, and idxglox.
subroutine npf_fc(this, kiter, matrix_sln, idxglo, rhs, hnew)
Formulate coefficients.
subroutine npf_ac(this, moffset, sparse)
Add connections for extended neighbors to the sparse matrix.
subroutine sgwf_npf_wetdry(this, kiter, hnew)
Perform wetting and drying.
subroutine source_griddata(this)
Update simulation griddata from input mempath.
subroutine npf_nur(this, neqmod, x, xtemp, dx, inewtonur, dxmax, locmax)
Under-relaxation.
subroutine sav_spdis(this, ibinun)
Save specific discharge in binary format to ibinun.
subroutine sgwf_npf_thksat(this, n, hn, thksat)
Fractional cell saturation.
subroutine preprocess_input(this)
preprocess the NPF input data
subroutine set_edge_properties(this, nodedge, ihcedge, q, area, nx, ny, distance)
Provide the npf package with edge properties.
subroutine prepare_edge_lookup(this)
subroutine npf_da(this)
Deallocate variables.
subroutine log_griddata(this, found)
Write dimensions to list file.
real(dp) function hy_eff(this, n, m, ihc, ipos, vg)
Calculate the effective hydraulic conductivity for the n-m connection.
subroutine calc_spdis(this, flowja)
Calculate the 3 components of specific discharge at the cell center.
subroutine, public npf_cr(npfobj, name_model, input_mempath, inunit, iout)
Create a new NPF object. Pass a inunit value of 0 if npf data will initialized from memory.
subroutine increase_edge_count(this, nedges)
Reserve space for nedges cells that have an edge on them.
subroutine npf_fn(this, kiter, matrix_sln, idxglo, rhs, hnew)
Fill newton terms.
subroutine log_options(this, found)
Log npf options sourced from the input mempath.
subroutine npf_print_model_flows(this, ibudfl, flowja)
Print budget.
subroutine allocate_arrays(this, ncells, njas)
Allocate npf arrays.
subroutine sav_sat(this, ibinun)
Save saturation in binary format to ibinun.
subroutine prepcheck(this)
Initialize and check NPF data.
subroutine npf_df(this, dis, xt3d, ingnc, invsc, npf_options)
Define the NPF package instance.
subroutine highest_cell_saturation(this, n, m, hn, hm, satn, satm)
Calculate dry cell saturation.
subroutine npf_ad(this, nodes, hold, hnew, irestore)
Advance.
subroutine sgwf_npf_wdmsg(this, icode, ncnvrt, nodcnvrt, acnvrt, ihdcnv, kiter, n)
Print wet/dry message.
subroutine sgwf_npf_qcalc(this, n, m, hn, hm, icon, qnm)
Flow between two cells.
subroutine npf_rp(this)
Read and prepare method for package.
real(dp) function calcsatthickness(this, n, m, ihc)
Calculate saturated thickness between cell n and m.
subroutine store_original_k_arrays(this, ncells, njas)
@ brief Store backup copy of hydraulic conductivity when the VSC package is activate
subroutine allocate_scalars(this)
@ brief Allocate scalars
subroutine npf_cq(this, hnew, flowja)
Calculate flowja.
subroutine npf_ar(this, ic, vsc, ibound, hnew)
Allocate and read this NPF instance.
subroutine check_options(this)
Check for conflicting NPF options.
subroutine npf_cf(this, kiter, nodes, hnew)
Routines associated fill coefficients.
General-purpose hydrogeologic functions.
real(dp) function, public hyeff(k11, k22, k33, ang1, ang2, ang3, vg1, vg2, vg3, iavgmeth)
Calculate the effective horizontal hydraulic conductivity from an ellipse using a specified direction...
This module defines variable data types.
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
subroutine, public memorystore_remove(component, subcomponent, context)
subroutine, public get_isize(name, mem_path, isize)
@ brief Get the number of elements for this variable
This module contains the base numerical package type.
This module contains simulation methods.
subroutine, public store_warning(msg, substring)
Store warning message.
subroutine, public store_error(msg, terminate)
Store an error message.
integer(i4b) function, public count_errors()
Return number of errors.
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
character(len=linelength) idm_context
character(len=maxcharlen) warnmsg
warning message string
real(dp) function squadraticsaturation(top, bot, x, eps)
@ brief sQuadraticSaturation
real(dp) function squadraticsaturationderivative(top, bot, x, eps)
@ brief Derivative of the quadratic saturation function
This module contains the SourceCommonModule.
logical(lgp) function, public filein_fname(filename, tagname, input_mempath, input_fname)
enforce and set a single input filename provided via FILEIN keyword
integer(i4b), pointer, public kstp
current time step number
integer(i4b), pointer, public kper
current stress period number
This module contains time-varying conductivity package methods.
subroutine, public tvk_cr(tvk, name_model, inunit, iout)
Create a new TvkType object.
subroutine, public xt3d_cr(xt3dobj, name_model, inunit, iout, ldispopt)
Create a new xt3d object.
This class is used to store a single deferred-length character string. It was designed to work in an ...
Data structure and helper methods for passing NPF options into npf_df, as an alternative to reading t...
Helper class with work arrays for the SPDIS calculation in NPF.