52 integer(I4B),
pointer :: inewton => null()
53 integer(I4B),
pointer :: icellavg => null()
54 integer(I4B),
pointer :: ivarcv => null()
55 integer(I4B),
pointer :: idewatcv => null()
56 integer(I4B),
pointer :: ingnc => null()
58 integer(I4B),
pointer :: inmvr => null()
60 integer(I4B),
pointer :: inobs => null()
64 real(dp),
dimension(:),
pointer,
contiguous :: cond => null()
65 real(dp),
dimension(:),
pointer,
contiguous :: condsat => null()
66 integer(I4B),
dimension(:),
pointer,
contiguous :: idxglo => null()
67 integer(I4B),
dimension(:),
pointer,
contiguous :: idxsymglo => null()
68 real(dp),
pointer :: satomega => null()
69 real(dp),
dimension(:),
pointer,
contiguous :: simvals => null()
129 character(len=*),
intent(in) :: filename
130 character(len=*) :: name
131 integer(I4B),
intent(in) :: id
132 integer(I4B),
intent(in) :: m1_id
133 integer(I4B),
intent(in) :: m2_id
134 character(len=*),
intent(in) :: input_mempath
139 integer(I4B) :: m1_index, m2_index
143 baseexchange => exchange
150 exchange%input_mempath = input_mempath
153 call exchange%allocate_scalars()
154 exchange%filename = filename
155 exchange%typename =
'GWF-GWF'
159 if (m1_index > 0)
then
160 mb => getbasemodelfromlist(basemodellist, m1_index)
163 exchange%model1 => mb
164 exchange%gwfmodel1 => mb
168 exchange%is_datacopy = .not. exchange%v_model1%is_local
172 if (m2_index > 0)
then
173 mb => getbasemodelfromlist(basemodellist, m2_index)
176 exchange%model2 => mb
177 exchange%gwfmodel2 => mb
183 if (.not.
associated(exchange%gwfmodel1) .and. m1_index > 0)
then
184 write (
errmsg,
'(3a)')
'Problem with GWF-GWF exchange ', &
185 trim(exchange%name), &
186 '. First specified GWF Model does not appear to be of the correct type.'
191 if (.not.
associated(exchange%gwfmodel2) .and. m2_index > 0)
then
192 write (
errmsg,
'(3a)')
'Problem with GWF-GWF exchange ', &
193 trim(exchange%name), &
194 '. Second specified GWF Model does not appear to be of the correct type.'
199 call obs_cr(exchange%obs, exchange%inobs)
219 write (
iout,
'(/a,a)')
' Creating exchange: ', this%name
222 if (this%v_model1%idsoln%get() /= this%v_model2%idsoln%get())
then
223 call store_error(
'Two models are connected in a GWF '// &
224 'exchange but they are in different solutions. '// &
225 'GWF models must be in same solution: '// &
226 trim(this%v_model1%name)//
' '// &
227 trim(this%v_model2%name))
232 call this%source_options(
iout)
235 call this%source_dimensions(
iout)
238 call this%allocate_arrays()
241 call this%source_data(
iout)
244 if (
associated(this%gwfmodel1))
then
245 call this%gwfmodel1%npf%increase_edge_count(this%nexg)
247 if (
associated(this%gwfmodel2))
then
248 call this%gwfmodel2%npf%increase_edge_count(this%nexg)
252 if (this%ingnc > 0)
then
253 if (
associated(this%gwfmodel1) .and.
associated(this%gwfmodel2))
then
254 call gnc_cr(this%gnc, this%name, this%ingnc,
iout)
260 if (this%inmvr > 0)
then
261 call this%read_mvr(
iout)
265 call this%gwf_gwf_df_obs()
266 if (
associated(this%gwfmodel1))
then
267 call this%obs%obs_df(
iout, this%name,
'GWF-GWF', this%gwfmodel1%dis)
271 call this%validate_exchange()
283 logical(LGP) :: has_k22, has_spdis, has_vsc
286 if (this%v_model1 == this%v_model2)
then
287 if (this%ixt3d > 0)
then
288 write (
errmsg,
'(3a)')
'GWF-GWF exchange ', trim(this%name), &
289 ' is a periodic boundary condition which cannot'// &
290 ' be configured with XT3D'
296 if (this%ixt3d > 0 .and. this%ianglex == 0)
then
297 write (
errmsg,
'(3a)')
'GWF-GWF exchange ', trim(this%name), &
298 ' requires that ANGLDEGX be specified as an'// &
299 ' auxiliary variable because XT3D is enabled'
309 if (
associated(this%gwfmodel1))
then
310 has_k22 = (this%gwfmodel1%npf%ik22 /= 0)
311 has_spdis = (this%gwfmodel1%npf%icalcspdis /= 0)
312 has_vsc = (this%gwfmodel1%npf%invsc /= 0)
314 if (
associated(this%gwfmodel2))
then
315 has_k22 = has_k22 .or. (this%gwfmodel2%npf%ik22 /= 0)
316 has_spdis = has_spdis .or. (this%gwfmodel2%npf%icalcspdis /= 0)
317 has_vsc = has_vsc .or. (this%gwfmodel2%npf%invsc /= 0)
324 if (this%ianglex == 0)
then
325 write (
errmsg,
'(3a)')
'GWF-GWF exchange ', trim(this%name), &
326 ' requires that ANGLDEGX be specified as an'// &
327 ' auxiliary variable because K22 was specified'// &
328 ' in one or both groundwater models.'
337 if (this%ianglex == 0)
then
338 write (
errmsg,
'(3a)')
'GWF-GWF exchange ', trim(this%name), &
339 ' requires that ANGLDEGX be specified as an'// &
340 ' auxiliary variable because specific discharge'// &
341 ' is being calculated in one or both'// &
342 ' groundwater models.'
345 if (this%icdist == 0)
then
346 write (
errmsg,
'(3a)')
'GWF-GWF exchange ', trim(this%name), &
347 ' requires that CDIST be specified as an'// &
348 ' auxiliary variable because specific discharge'// &
349 ' is being calculated in one or both'// &
350 ' groundwater models.'
358 write (
errmsg,
'(3a)')
'GWF-GWF exchange ', trim(this%name), &
359 ' requires that the Viscosity Package is inactive'// &
360 ' in both of the connected models.'
379 integer(I4B) :: n, iglo, jglo
383 iglo = this%nodem1(n) + this%gwfmodel1%moffset
384 jglo = this%nodem2(n) + this%gwfmodel2%moffset
385 call sparse%addconnection(iglo, jglo, 1)
386 call sparse%addconnection(jglo, iglo, 1)
390 if (this%ingnc > 0)
then
391 call this%gnc%gnc_ac(sparse)
409 integer(I4B) :: n, iglo, jglo
413 iglo = this%nodem1(n) + this%gwfmodel1%moffset
414 jglo = this%nodem2(n) + this%gwfmodel2%moffset
415 this%idxglo(n) = matrix_sln%get_position(iglo, jglo)
416 this%idxsymglo(n) = matrix_sln%get_position(jglo, iglo)
420 if (this%ingnc > 0)
then
421 call this%gnc%gnc_mc(matrix_sln)
437 if (this%inmvr > 0)
call this%mvr%mvr_ar()
440 if (.not. this%use_interface_model())
call this%calc_cond_sat()
443 call this%obs%obs_ar()
463 if (this%inmvr > 0)
call this%mvr%mvr_rp()
466 call this%gwf_gwf_rp_obs()
481 if (this%inmvr > 0)
call this%mvr%mvr_ad()
484 call this%obs%obs_ad()
497 integer(I4B),
intent(in) :: kiter
501 if (this%inmvr > 0)
call this%mvr%xmvr_cf()
505 call this%rewet(kiter)
515 subroutine gwf_gwf_fc(this, kiter, matrix_sln, rhs_sln, inwtflag)
521 integer(I4B),
intent(in) :: kiter
523 real(DP),
dimension(:),
intent(inout) :: rhs_sln
524 integer(I4B),
optional,
intent(in) :: inwtflag
526 integer(I4B) :: inwt, iexg
527 integer(I4B) :: i, nodem1sln, nodem2sln
534 if (this%ingnc > 0)
then
535 do iexg = 1, this%nexg
536 this%gnc%cond(iexg) = this%cond(iexg)
542 call matrix_sln%set_value_pos(this%idxglo(i), this%cond(i))
543 call matrix_sln%set_value_pos(this%idxsymglo(i), this%cond(i))
545 nodem1sln = this%nodem1(i) + this%gwfmodel1%moffset
546 nodem2sln = this%nodem2(i) + this%gwfmodel2%moffset
547 call matrix_sln%add_diag_value(nodem1sln, -this%cond(i))
548 call matrix_sln%add_diag_value(nodem2sln, -this%cond(i))
552 if (this%ingnc > 0)
then
553 call this%gnc%gnc_fc(kiter, matrix_sln)
557 if (this%inmvr > 0)
call this%mvr%mvr_fc()
561 if (
present(inwtflag))
then
562 if (inwtflag == 0) inwt = 0
565 call this%exg_fn(kiter, matrix_sln)
569 if (this%ingnc > 0)
then
571 call this%gnc%gnc_fn(kiter, matrix_sln, this%condsat, &
572 ihc_opt=this%ihc, ivarcv_opt=this%ivarcv, &
573 ictm1_opt=this%gwfmodel1%npf%icelltype, &
574 ictm2_opt=this%gwfmodel2%npf%icelltype)
591 integer(I4B),
intent(in) :: kiter
597 integer(I4B) :: nodensln, nodemsln
598 integer(I4B) :: ibdn, ibdm
599 real(DP) :: topn, topm
600 real(DP) :: botn, botm
601 real(DP) :: topup, botup
609 do iexg = 1, this%nexg
610 n = this%nodem1(iexg)
611 m = this%nodem2(iexg)
612 nodensln = this%nodem1(iexg) + this%gwfmodel1%moffset
613 nodemsln = this%nodem2(iexg) + this%gwfmodel2%moffset
614 ibdn = this%gwfmodel1%ibound(n)
615 ibdm = this%gwfmodel2%ibound(m)
616 topn = this%gwfmodel1%dis%top(n)
617 topm = this%gwfmodel2%dis%top(m)
618 botn = this%gwfmodel1%dis%bot(n)
619 botm = this%gwfmodel2%dis%bot(m)
620 hn = this%gwfmodel1%x(n)
621 hm = this%gwfmodel2%x(m)
622 if (this%ihc(iexg) == 0)
then
627 if (hm < hn) nisup = .true.
644 if (this%gwfmodel1%npf%icelltype(n) == 0) cycle
646 if (this%gwfmodel2%npf%icelltype(m) == 0) cycle
650 if (this%ihc(iexg) == 2)
then
651 topup = min(topn, topm)
652 botup = max(botn, botm)
656 cond = this%condsat(iexg)
661 consterm = -cond * (hup - hdn)
666 term = consterm * derv
667 this%gwfmodel1%rhs(n) = this%gwfmodel1%rhs(n) + term * hn
668 this%gwfmodel2%rhs(m) = this%gwfmodel2%rhs(m) - term * hn
669 call matrix_sln%add_diag_value(nodensln, term)
671 call matrix_sln%add_value_pos(this%idxsymglo(iexg), -term)
676 term = -consterm * derv
677 this%gwfmodel1%rhs(n) = this%gwfmodel1%rhs(n) + term * hm
678 this%gwfmodel2%rhs(m) = this%gwfmodel2%rhs(m) - term * hm
679 call matrix_sln%add_diag_value(nodemsln, -term)
681 call matrix_sln%add_value_pos(this%idxglo(iexg), term)
696 subroutine gwf_gwf_cq(this, icnvg, isuppress_output, isolnid)
699 integer(I4B),
intent(inout) :: icnvg
700 integer(I4B),
intent(in) :: isuppress_output
701 integer(I4B),
intent(in) :: isolnid
704 call this%gwf_gwf_calc_simvals()
707 call this%gwf_gwf_set_flow_to_npf()
710 call this%gwf_gwf_add_to_flowja()
726 integer(I4B) :: n1, n2
727 integer(I4B) :: ibdn1, ibdn2
734 ibdn1 = this%gwfmodel1%ibound(n1)
735 ibdn2 = this%gwfmodel2%ibound(n2)
736 if (ibdn1 /= 0 .and. ibdn2 /= 0)
then
737 rrate = this%qcalc(i, n1, n2)
738 if (this%ingnc > 0)
then
739 rrate = rrate + this%gnc%deltaqgnc(i)
742 this%simvals(i) = rrate
758 integer(I4B) :: idiag
763 if (
associated(this%gwfmodel1))
then
765 if (this%gwfmodel1%ibound(n) > 0)
then
766 flow = this%simvals(i)
767 idiag = this%gwfmodel1%ia(n)
768 this%gwfmodel1%flowja(idiag) = this%gwfmodel1%flowja(idiag) + flow
772 if (
associated(this%gwfmodel2))
then
774 if (this%gwfmodel2%ibound(n) > 0)
then
775 flow = -this%simvals(i)
776 idiag = this%gwfmodel2%ia(n)
777 this%gwfmodel2%flowja(idiag) = this%gwfmodel2%flowja(idiag) + flow
797 integer(I4B) :: n1, n2
798 integer(I4B) :: ibdn1, ibdn2
799 integer(I4B) :: ictn1, ictn2
802 real(DP) :: topn1, topn2
803 real(DP) :: botn1, botn2
804 real(DP) :: satn1, satn2
815 if (this%gwfmodel1%npf%icalcspdis == 0 .and. &
816 this%gwfmodel2%npf%icalcspdis == 0)
return
821 rrate = this%simvals(i)
826 ibdn1 = this%gwfmodel1%ibound(n1)
827 ibdn2 = this%gwfmodel2%ibound(n2)
828 ictn1 = this%gwfmodel1%npf%icelltype(n1)
829 ictn2 = this%gwfmodel2%npf%icelltype(n2)
830 topn1 = this%gwfmodel1%dis%top(n1)
831 topn2 = this%gwfmodel2%dis%top(n2)
832 botn1 = this%gwfmodel1%dis%bot(n1)
833 botn2 = this%gwfmodel2%dis%bot(n2)
834 satn1 = this%gwfmodel1%npf%sat(n1)
835 satn2 = this%gwfmodel2%npf%sat(n2)
836 hn1 = this%gwfmodel1%x(n1)
837 hn2 = this%gwfmodel2%x(n2)
844 if (botn1 < botn2)
then
850 if (this%ianglex > 0)
then
851 angle = this%auxvar(this%ianglex, i) *
dpio180
856 call store_error(
'error in gwf_gwf_cq', terminate=.true.)
860 thksat =
thksatnm(ibdn1, ibdn2, ictn1, ictn2, this%inewton, ihc, &
861 hn1, hn2, satn1, satn2, &
862 topn1, topn2, botn1, botn2)
868 if (this%icdist > 0)
then
869 dltot = this%auxvar(this%icdist, i)
871 call store_error(
'error in gwf_gwf_cq', terminate=.true.)
873 distance = dltot * this%cl1(i) / (this%cl1(i) + this%cl2(i))
874 if (this%gwfmodel1%npf%icalcspdis == 1)
then
875 call this%gwfmodel1%npf%set_edge_properties(n1, ihc, rrate, area, &
881 if (this%icdist > 0)
then
882 dltot = this%auxvar(this%icdist, i)
884 call store_error(
'error in gwf_gwf_cq', terminate=.true.)
886 if (this%gwfmodel2%npf%icalcspdis == 1)
then
887 distance = dltot * this%cl2(i) / (this%cl1(i) + this%cl2(i))
888 if (ihc /= 0) rrate = -rrate
889 call this%gwfmodel2%npf%set_edge_properties(n2, ihc, rrate, area, &
903 subroutine gwf_gwf_bd(this, icnvg, isuppress_output, isolnid)
909 integer(I4B),
intent(inout) :: icnvg
910 integer(I4B),
intent(in) :: isuppress_output
911 integer(I4B),
intent(in) :: isolnid
913 character(len=LENBUDTXT),
dimension(1) :: budtxt
914 real(DP),
dimension(2, 1) :: budterm
915 real(DP) :: ratin, ratout
918 budtxt(1) =
' FLOW-JA-FACE'
924 if (
associated(this%gwfmodel1))
then
925 budterm(1, 1) = ratin
926 budterm(2, 1) = ratout
927 call this%gwfmodel1%model_bdentry(budterm, budtxt, this%name)
931 if (
associated(this%gwfmodel2))
then
932 budterm(1, 1) = ratout
933 budterm(2, 1) = ratin
934 call this%gwfmodel2%model_bdentry(budterm, budtxt, this%name)
939 call this%gwf_gwf_chd_bd()
942 if (this%inmvr > 0)
call this%mvr%mvr_bd()
959 character(len=LENBUDTXT),
dimension(1) :: budtxt
962 real(DP),
dimension(2, 1) :: budterm
963 real(DP) :: ratin, ratout
967 budtxt(1) =
'FLOW-JA-FACE-CHD'
970 if (
associated(this%gwfmodel1))
then
975 if (this%gwfmodel1%ibound(n) < 0)
then
984 budterm(1, 1) = ratin
985 budterm(2, 1) = ratout
986 call this%gwfmodel1%model_bdentry(budterm, budtxt, this%name)
990 if (
associated(this%gwfmodel2))
then
995 if (this%gwfmodel2%ibound(n) < 0)
then
1005 budterm(1, 1) = ratin
1006 budterm(2, 1) = ratout
1007 call this%gwfmodel2%model_bdentry(budterm, budtxt, this%name)
1022 integer(I4B) :: icbcfl, ibudfl
1025 if (
associated(this%gwfmodel1))
then
1026 call this%gwf_gwf_bdsav_model(this%gwfmodel1)
1030 if (
associated(this%gwfmodel2))
then
1031 call this%gwf_gwf_bdsav_model(this%gwfmodel2)
1040 if (this%inmvr > 0)
call this%mvr%mvr_bdsav(icbcfl, ibudfl, 0)
1043 if (this%inobs /= 0)
then
1044 call this%gwf_gwf_save_simvals()
1059 character(len=LENPACKAGENAME + 4) :: packname
1060 character(len=LENBUDTXT),
dimension(1) :: budtxt
1063 character(len=20) :: nodestr
1064 character(len=LENBOUNDNAME) :: bname
1065 integer(I4B) :: ntabrows
1066 integer(I4B) :: nodeu
1067 integer(I4B) :: i, n1, n2, n1u, n2u
1068 integer(I4B) :: ibinun
1069 real(DP) :: ratin, ratout, rrate
1070 logical(LGP) :: is_for_model1
1072 budtxt(1) =
' FLOW-JA-FACE'
1073 packname =
'EXG '//this%name
1074 packname = adjustr(packname)
1075 if (
associated(model, this%gwfmodel1))
then
1076 output_tab => this%outputtab1
1077 nbr_model => this%v_model2
1078 is_for_model1 = .true.
1080 output_tab => this%outputtab2
1081 nbr_model => this%v_model1
1082 is_for_model1 = .false.
1086 if (this%iprflow /= 0)
then
1089 if (model%oc%oc_save(
'BUDGET'))
then
1090 call output_tab%set_title(packname)
1094 call output_tab%set_kstpkper(
kstp,
kper)
1103 if (this%v_model1%ibound%get(n1) /= 0 .and. &
1104 this%v_model2%ibound%get(n2) /= 0)
then
1105 ntabrows = ntabrows + 1
1108 if (ntabrows > 0)
then
1109 call output_tab%set_maxbound(ntabrows)
1116 if (this%ipakcb /= 0)
then
1117 ibinun = model%oc%oc_save_unit(
'BUDGET')
1124 if (.not. model%oc%oc_save(
'BUDGET')) ibinun = 0
1127 if (ibinun /= 0)
then
1128 call model%dis%record_srcdst_list_header(budtxt(1), &
1133 this%naux, this%auxname, &
1134 ibinun, this%nexg, &
1146 if (this%inamedbound > 0)
then
1147 bname = this%boundname(i)
1158 if (this%v_model1%ibound%get(n1) /= 0 .and. &
1159 this%v_model2%ibound%get(n2) /= 0)
then
1160 rrate = this%simvals(i)
1163 if (this%iprflow /= 0)
then
1164 if (model%oc%oc_save(
'BUDGET'))
then
1167 if (is_for_model1)
then
1168 nodeu = model%dis%get_nodeuser(n1)
1169 call model%dis%nodeu_to_string(nodeu, nodestr)
1170 call output_tab%print_list_entry(i, trim(adjustl(nodestr)), &
1173 nodeu = model%dis%get_nodeuser(n2)
1174 call model%dis%nodeu_to_string(nodeu, nodestr)
1175 call output_tab%print_list_entry(i, trim(adjustl(nodestr)), &
1180 if (rrate <
dzero)
then
1181 ratout = ratout - rrate
1183 ratin = ratin + rrate
1188 n1u = this%v_model1%dis_get_nodeuser(n1)
1189 n2u = this%v_model2%dis_get_nodeuser(n2)
1190 if (ibinun /= 0)
then
1191 if (is_for_model1)
then
1192 call model%dis%record_mf6_list_entry(ibinun, n1u, n2u, rrate, &
1193 this%naux, this%auxvar(:, i), &
1196 call model%dis%record_mf6_list_entry(ibinun, n2u, n1u, -rrate, &
1197 this%naux, this%auxvar(:, i), &
1219 integer(I4B) :: iexg, n1, n2
1220 integer(I4B) :: ibudfl
1221 real(DP) :: flow, deltaqgnc
1222 character(len=LINELENGTH) :: node1str, node2str
1224 character(len=*),
parameter :: fmtheader = &
1225 "(/1x, 'SUMMARY OF EXCHANGE RATES FOR EXCHANGE ', a, ' WITH ID ', i0, /, &
1226 &2a16, 5a16, /, 112('-'))"
1227 character(len=*),
parameter :: fmtheader2 = &
1228 "(/1x, 'SUMMARY OF EXCHANGE RATES FOR EXCHANGE ', a, ' WITH ID ', i0, /, &
1229 &2a16, 4a16, /, 96('-'))"
1230 character(len=*),
parameter :: fmtdata = &
1231 "(2a16, 5(1pg16.6))"
1234 call this%gwf_gwf_bdsav()
1240 if (this%iprflow /= 0)
then
1241 if (this%ingnc > 0)
then
1242 write (
iout, fmtheader) trim(adjustl(this%name)), this%id,
'NODEM1', &
1243 'NODEM2',
'COND',
'X_M1',
'X_M2',
'DELTAQGNC', &
1246 write (
iout, fmtheader2) trim(adjustl(this%name)), this%id,
'NODEM1', &
1247 'NODEM2',
'COND',
'X_M1',
'X_M2',
'FLOW'
1249 do iexg = 1, this%nexg
1250 n1 = this%nodem1(iexg)
1251 n2 = this%nodem2(iexg)
1252 flow = this%simvals(iexg)
1253 call this%v_model1%dis_noder_to_string(n1, node1str)
1254 call this%v_model2%dis_noder_to_string(n2, node2str)
1256 if (this%ingnc > 0)
then
1257 deltaqgnc = this%gnc%deltaqgnc(iexg)
1258 write (
iout, fmtdata) trim(adjustl(node1str)), &
1259 trim(adjustl(node2str)), &
1260 this%cond(iexg), this%v_model1%x%get(n1), &
1261 this%v_model2%x%get(n2), deltaqgnc, flow
1263 write (
iout, fmtdata) trim(adjustl(node1str)), &
1264 trim(adjustl(node2str)), &
1265 this%cond(iexg), this%v_model1%x%get(n1), &
1266 this%v_model2%x%get(n2), flow
1273 if (this%inmvr > 0)
call this%mvr%mvr_ot_bdsummary(ibudfl)
1276 call this%obs%obs_ot()
1296 integer(I4B),
intent(in) :: iout
1299 character(len=LENVARNAME),
dimension(3) :: cellavg_method = &
1300 &[character(len=LENVARNAME) ::
'HARMONIC',
'LOGARITHMIC',
'AMT-LMK']
1301 character(len=linelength) :: gnc_fname, mvr_fname
1304 call mem_set_value(this%icellavg,
'CELL_AVERAGING', this%input_mempath, &
1305 cellavg_method, found%cell_averaging)
1306 call mem_set_value(this%inewton,
'NEWTON', this%input_mempath, found%newton)
1307 call mem_set_value(this%ixt3d,
'XT3D', this%input_mempath, found%xt3d)
1308 call mem_set_value(this%ivarcv,
'VARIABLECV', this%input_mempath, &
1310 call mem_set_value(this%idewatcv,
'DEWATERED', this%input_mempath, &
1313 write (iout,
'(1x,a)')
'PROCESSING GWF-GWF EXCHANGE OPTIONS'
1316 call this%DisConnExchangeType%source_options(iout)
1318 if (found%cell_averaging)
then
1320 this%icellavg = this%icellavg - 1
1321 write (iout,
'(4x,a,a)') &
1322 'CELL AVERAGING METHOD HAS BEEN SET TO: ', &
1323 trim(cellavg_method(this%icellavg + 1))
1326 if (found%newton)
then
1327 write (iout,
'(4x,a)') &
1328 'NEWTON-RAPHSON method used for unconfined cells'
1331 if (found%xt3d)
then
1332 write (iout,
'(4x,a)')
'XT3D WILL BE APPLIED ON THE INTERFACE'
1335 if (found%variablecv)
then
1336 write (iout,
'(4x,a)') &
1337 'VERTICAL CONDUCTANCE VARIES WITH WATER TABLE.'
1340 if (found%dewatered)
then
1341 write (iout,
'(4x,a)') &
1342 'VERTICAL CONDUCTANCE ACCOUNTS FOR DEWATERED PORTION OF '// &
1343 'AN UNDERLYING CELL.'
1347 if (
filein_fname(gnc_fname,
'GNC6_FILENAME', this%input_mempath, &
1348 this%filename))
then
1350 call openfile(this%ingnc, iout, gnc_fname,
'GNC')
1351 write (iout,
'(4x,a)') &
1352 'GHOST NODES WILL BE READ FROM ', trim(gnc_fname)
1356 if (
filein_fname(mvr_fname,
'MVR6_FILENAME', this%input_mempath, &
1357 this%filename))
then
1359 call openfile(this%inmvr, iout, mvr_fname,
'MVR')
1360 write (iout,
'(4x,a)') &
1361 'WATER MOVER INFORMATION WILL BE READ FROM ', trim(mvr_fname)
1365 if (.not. this%is_datacopy)
then
1366 if (
filein_fname(this%obs%inputFilename,
'OBS6_FILENAME', &
1367 this%input_mempath, this%filename))
then
1368 this%obs%active = .true.
1369 this%obs%inUnitObs =
getunit()
1370 call openfile(this%obs%inUnitObs, iout, this%obs%inputFilename,
'OBS')
1374 write (iout,
'(1x,a)')
'END OF GWF-GWF EXCHANGE OPTIONS'
1377 if (this%inewton > 0)
then
1378 this%satomega =
dem6
1395 integer(I4B) :: i, nm1, nm2, nmgnc1, nmgnc2
1396 character(len=*),
parameter :: fmterr = &
1397 "('EXCHANGE NODES ', i0, ' AND ', i0,"// &
1398 "' NOT CONSISTENT WITH GNC NODES ', "// &
1403 call this%gnc%gnc_df(this%gwfmodel1, m2=this%gwfmodel2)
1406 if (.not. this%gnc%implicit .and. this%inewton /= 0)
then
1407 call store_error(
'GNC is explicit, but GWF exchange has active newton.')
1408 call store_error(
'Add implicit option to GNC or remove NEWTON from '// &
1414 if (this%nexg /= this%gnc%nexg)
then
1415 call store_error(
'Number of exchanges does not match number of GNCs')
1421 if (this%nodem1(i) /= this%gnc%nodem1(i) .or. &
1422 this%nodem2(i) /= this%gnc%nodem2(i))
then
1423 nm1 = this%gwfmodel1%dis%get_nodeuser(this%nodem1(i))
1424 nm2 = this%gwfmodel2%dis%get_nodeuser(this%nodem2(i))
1425 nmgnc1 = this%gwfmodel1%dis%get_nodeuser(this%gnc%nodem1(i))
1426 nmgnc2 = this%gwfmodel2%dis%get_nodeuser(this%gnc%nodem2(i))
1427 write (
errmsg, fmterr) nm1, nm2, nmgnc1, nmgnc2
1451 integer(I4B),
intent(in) :: iout
1462 if (this%v_model1%is_local)
then
1463 dis => this%gwfmodel1%dis
1464 else if (this%v_model2%is_local)
then
1465 dis => this%gwfmodel2%dis
1467 call exg_mvr_cr(this%mvr, this%name, this%inmvr, iout, dis)
1468 this%mvr%model1 => this%v_model1
1469 this%mvr%model2 => this%v_model2
1484 integer(I4B),
intent(in) :: kiter
1486 integer(I4B) :: iexg
1487 integer(I4B) :: n, m
1488 integer(I4B) :: ibdn, ibdm
1491 integer(I4B) :: irewet
1492 character(len=30) :: nodestrn, nodestrm
1493 character(len=*),
parameter :: fmtrwt = &
1494 "(1x, 'CELL ',A,' REWET FROM GWF MODEL ',A,' CELL ',A, &
1495 &' FOR ITER. ',I0, ' STEP ',I0, ' PERIOD ', I0)"
1498 do iexg = 1, this%nexg
1499 n = this%nodem1(iexg)
1500 m = this%nodem2(iexg)
1501 hn = this%gwfmodel1%x(n)
1502 hm = this%gwfmodel2%x(m)
1503 ibdn = this%gwfmodel1%ibound(n)
1504 ibdm = this%gwfmodel2%ibound(m)
1505 ihc = this%ihc(iexg)
1506 call this%gwfmodel1%npf%rewet_check(kiter, n, hm, ibdm, ihc, &
1507 this%gwfmodel1%x, irewet)
1508 if (irewet == 1)
then
1509 call this%gwfmodel1%dis%noder_to_string(n, nodestrn)
1510 call this%gwfmodel2%dis%noder_to_string(m, nodestrm)
1511 write (this%gwfmodel1%iout, fmtrwt) trim(nodestrn), &
1512 trim(this%gwfmodel2%name), trim(nodestrm), kiter,
kstp,
kper
1514 call this%gwfmodel2%npf%rewet_check(kiter, m, hn, ibdn, ihc, &
1515 this%gwfmodel2%x, irewet)
1516 if (irewet == 1)
then
1517 call this%gwfmodel1%dis%noder_to_string(n, nodestrm)
1518 call this%gwfmodel2%dis%noder_to_string(m, nodestrn)
1519 write (this%gwfmodel2%iout, fmtrwt) trim(nodestrn), &
1520 trim(this%gwfmodel1%name), trim(nodestrm), kiter,
kstp,
kper
1527 end subroutine rewet
1536 integer(I4B) :: iexg
1537 integer(I4B) :: n, m, ihc
1538 real(DP) :: topn, topm
1539 real(DP) :: botn, botm
1540 real(DP) :: satn, satm
1541 real(DP) :: thickn, thickm
1542 real(DP) :: angle, hyn, hym
1545 real(DP),
dimension(3) :: vg
1547 do iexg = 1, this%nexg
1549 ihc = this%ihc(iexg)
1550 n = this%nodem1(iexg)
1551 m = this%nodem2(iexg)
1552 topn = this%gwfmodel1%dis%top(n)
1553 topm = this%gwfmodel2%dis%top(m)
1554 botn = this%gwfmodel1%dis%bot(n)
1555 botm = this%gwfmodel2%dis%bot(m)
1556 satn = this%gwfmodel1%npf%sat(n)
1557 satm = this%gwfmodel2%npf%sat(m)
1558 thickn = (topn - botn) * satn
1559 thickm = (topm - botm) * satm
1568 hyn = this%gwfmodel1%npf%hy_eff(n, 0, ihc, vg=vg)
1569 hym = this%gwfmodel2%npf%hy_eff(m, 0, ihc, vg=vg)
1570 csat =
vcond(1, 1, 1, 1, 0, 1, 1,
done, &
1580 hyn = this%gwfmodel1%npf%k11(n)
1581 hym = this%gwfmodel2%npf%k11(m)
1584 if (this%ianglex > 0)
then
1585 angle = this%auxvar(this%ianglex, iexg) *
dpio180
1586 vg(1) = abs(cos(angle))
1587 vg(2) = abs(sin(angle))
1591 if (this%gwfmodel1%npf%ik22 /= 0)
then
1592 hyn = this%gwfmodel1%npf%hy_eff(n, 0, ihc, vg=vg)
1596 if (this%gwfmodel2%npf%ik22 /= 0)
then
1597 hym = this%gwfmodel2%npf%hy_eff(m, 0, ihc, vg=vg)
1601 fawidth = this%hwva(iexg)
1602 csat =
hcond(1, 1, 1, 1, 0, ihc, &
1603 this%icellavg,
done, &
1604 topn, topm, satn, satm, hyn, hym, &
1607 this%cl1(iexg), this%cl2(iexg), &
1612 this%condsat(iexg) = csat
1630 integer(I4B) :: iexg
1631 integer(I4B) :: n, m, ihc
1632 integer(I4B) :: ibdn, ibdm
1633 integer(I4B) :: ictn, ictm
1634 real(DP) :: topn, topm
1635 real(DP) :: botn, botm
1636 real(DP) :: satn, satm
1637 real(DP) :: hyn, hym
1642 real(DP),
dimension(3) :: vg
1645 do iexg = 1, this%nexg
1646 ihc = this%ihc(iexg)
1647 n = this%nodem1(iexg)
1648 m = this%nodem2(iexg)
1649 ibdn = this%gwfmodel1%ibound(n)
1650 ibdm = this%gwfmodel2%ibound(m)
1651 ictn = this%gwfmodel1%npf%icelltype(n)
1652 ictm = this%gwfmodel2%npf%icelltype(m)
1653 topn = this%gwfmodel1%dis%top(n)
1654 topm = this%gwfmodel2%dis%top(m)
1655 botn = this%gwfmodel1%dis%bot(n)
1656 botm = this%gwfmodel2%dis%bot(m)
1657 satn = this%gwfmodel1%npf%sat(n)
1658 satm = this%gwfmodel2%npf%sat(m)
1659 hn = this%gwfmodel1%x(n)
1660 hm = this%gwfmodel2%x(m)
1669 hyn = this%gwfmodel1%npf%hy_eff(n, 0, ihc, vg=vg)
1670 hym = this%gwfmodel2%npf%hy_eff(m, 0, ihc, vg=vg)
1671 cond =
vcond(ibdn, ibdm, ictn, ictm, this%inewton, this%ivarcv, &
1672 this%idewatcv, this%condsat(iexg), hn, hm, hyn, hym, &
1673 satn, satm, topn, topm, botn, botm, this%hwva(iexg))
1677 hyn = this%gwfmodel1%npf%k11(n)
1678 hym = this%gwfmodel2%npf%k11(m)
1681 if (this%ianglex > 0)
then
1682 angle = this%auxvar(this%ianglex, iexg)
1683 vg(1) = abs(cos(angle))
1684 vg(2) = abs(sin(angle))
1688 if (this%gwfmodel1%npf%ik22 /= 0)
then
1689 hyn = this%gwfmodel1%npf%hy_eff(n, 0, ihc, vg=vg)
1693 if (this%gwfmodel2%npf%ik22 /= 0)
then
1694 hym = this%gwfmodel2%npf%hy_eff(m, 0, ihc, vg=vg)
1698 fawidth = this%hwva(iexg)
1699 cond =
hcond(ibdn, ibdm, ictn, ictm, this%inewton, &
1700 this%ihc(iexg), this%icellavg, this%condsat(iexg), &
1701 hn, hm, satn, satm, hyn, hym, topn, topm, botn, botm, &
1702 this%cl1(iexg), this%cl2(iexg), fawidth)
1705 this%cond(iexg) = cond
1724 call this%DisConnExchangeType%allocate_scalars()
1726 call mem_allocate(this%icellavg,
'ICELLAVG', this%memoryPath)
1727 call mem_allocate(this%ivarcv,
'IVARCV', this%memoryPath)
1728 call mem_allocate(this%idewatcv,
'IDEWATCV', this%memoryPath)
1729 call mem_allocate(this%inewton,
'INEWTON', this%memoryPath)
1730 call mem_allocate(this%ingnc,
'INGNC', this%memoryPath)
1731 call mem_allocate(this%inmvr,
'INMVR', this%memoryPath)
1732 call mem_allocate(this%inobs,
'INOBS', this%memoryPath)
1733 call mem_allocate(this%satomega,
'SATOMEGA', this%memoryPath)
1741 this%satomega =
dzero
1758 if (this%ingnc > 0)
then
1759 call this%gnc%gnc_da()
1760 deallocate (this%gnc)
1762 if (this%inmvr > 0)
then
1763 call this%mvr%mvr_da()
1764 deallocate (this%mvr)
1766 call this%obs%obs_da()
1767 deallocate (this%obs)
1777 if (
associated(this%outputtab1))
then
1778 call this%outputtab1%table_da()
1779 deallocate (this%outputtab1)
1780 nullify (this%outputtab1)
1782 if (
associated(this%outputtab2))
then
1783 call this%outputtab2%table_da()
1784 deallocate (this%outputtab2)
1785 nullify (this%outputtab2)
1789 deallocate (this%filename)
1801 call this%DisConnExchangeType%disconnex_da()
1817 character(len=LINELENGTH) :: text
1818 integer(I4B) :: ntabcol, i
1820 call this%DisConnExchangeType%allocate_arrays()
1822 call mem_allocate(this%cond, this%nexg,
'COND', this%memoryPath)
1823 call mem_allocate(this%idxglo, this%nexg,
'IDXGLO', this%memoryPath)
1824 call mem_allocate(this%idxsymglo, this%nexg,
'IDXSYMGLO', this%memoryPath)
1825 call mem_allocate(this%condsat, this%nexg,
'CONDSAT', this%memoryPath)
1826 call mem_allocate(this%simvals, this%nexg,
'SIMVALS', this%memoryPath)
1834 if (this%iprflow /= 0)
then
1838 if (this%inamedbound > 0)
then
1839 ntabcol = ntabcol + 1
1844 if (this%v_model1%is_local)
then
1845 call table_cr(this%outputtab1, this%name,
' ')
1846 call this%outputtab1%table_df(this%nexg, ntabcol, this%gwfmodel1%iout, &
1849 call this%outputtab1%initialize_column(text, 10, alignment=
tabcenter)
1851 call this%outputtab1%initialize_column(text, 20, alignment=
tableft)
1853 call this%outputtab1%initialize_column(text, 15, alignment=
tabcenter)
1854 if (this%inamedbound > 0)
then
1856 call this%outputtab1%initialize_column(text, 20, alignment=
tableft)
1860 if (this%v_model2%is_local)
then
1861 call table_cr(this%outputtab2, this%name,
' ')
1862 call this%outputtab2%table_df(this%nexg, ntabcol, this%gwfmodel2%iout, &
1865 call this%outputtab2%initialize_column(text, 10, alignment=
tabcenter)
1867 call this%outputtab2%initialize_column(text, 20, alignment=
tableft)
1869 call this%outputtab2%initialize_column(text, 15, alignment=
tabcenter)
1870 if (this%inamedbound > 0)
then
1872 call this%outputtab2%initialize_column(text, 20, alignment=
tableft)
1889 integer(I4B) :: indx
1893 call this%obs%StoreObsType(
'flow-ja-face', .true., indx)
1913 character(len=LENBOUNDNAME) :: bname
1916 10
format(
'Exchange "', a,
'" for observation "', a, &
1917 '" is invalid in package "', a,
'"')
1918 20
format(
'Exchange id "', i0,
'" for observation "', a, &
1919 '" is invalid in package "', a,
'"')
1921 do i = 1, this%obs%npakobs
1922 obsrv => this%obs%pakobs(i)%obsrv
1927 call obsrv%ResetObsIndex()
1928 obsrv%BndFound = .false.
1930 bname = obsrv%FeatureName
1931 if (bname /=
'')
then
1937 if (this%boundname(j) == bname)
then
1939 obsrv%BndFound = .true.
1940 obsrv%CurrentTimeStepEndValue =
dzero
1941 call obsrv%AddObsIndex(j)
1944 if (.not. jfound)
then
1945 write (
errmsg, 10) trim(bname), trim(obsrv%ObsTypeId), trim(this%name)
1950 if (obsrv%intPak1 <= this%nexg .and. obsrv%intPak1 > 0)
then
1952 obsrv%BndFound = .true.
1953 obsrv%CurrentTimeStepEndValue =
dzero
1954 call obsrv%AddObsIndex(obsrv%intPak1)
1958 if (.not. jfound)
then
1959 write (
errmsg, 20) obsrv%intPak1, trim(obsrv%ObsTypeId), trim(this%name)
1995 integer(I4B),
intent(in) :: iexg
1996 integer(I4B),
intent(in) :: n1
1997 integer(I4B),
intent(in) :: n2
2001 qcalc = this%cond(iexg) * (this%gwfmodel2%x(n2) - this%gwfmodel1%x(n1))
2016 integer(I4B) :: iasym
2022 if (this%inewton /= 0) iasym = 1
2025 if (this%ingnc > 0)
then
2026 if (this%gnc%iasym /= 0) iasym = 1
2041 logical(LGP) :: is_connected
2043 is_connected = .false.
2048 if (
associated(this%gwfmodel1, model))
then
2049 is_connected = .true.
2050 else if (
associated(this%gwfmodel2, model))
then
2051 is_connected = .true.
2066 logical(LGP) :: use_im
2068 integer(I4B) :: inbuy_m1
2070 use_im = this%DisConnExchangeType%use_interface_model()
2071 use_im = use_im .or. (this%ixt3d > 0)
2074 select type (m => this%v_model1)
2076 inbuy_m1 = m%inbuy%get()
2078 use_im = use_im .or. (inbuy_m1 > 0)
2100 integer(I4B) :: iexg
2105 if (this%obs%npakobs > 0)
then
2106 call this%obs%obs_bd_clear()
2107 do i = 1, this%obs%npakobs
2108 obsrv => this%obs%pakobs(i)%obsrv
2109 do j = 1, obsrv%indxbnds_count
2110 iexg = obsrv%indxbnds(j)
2112 select case (obsrv%ObsTypeId)
2113 case (
'FLOW-JA-FACE')
2114 n1 = this%nodem1(iexg)
2115 n2 = this%nodem2(iexg)
2116 v = this%simvals(iexg)
2118 errmsg =
'Unrecognized observation type: '// &
2119 trim(obsrv%ObsTypeId)
2123 call this%obs%SaveOneSimval(obsrv, v)
2145 integer(I4B),
intent(in) :: inunitobs
2146 integer(I4B),
intent(in) :: iout
2148 integer(I4B) :: n, iexg, istat
2149 integer(I4B) :: icol, istart, istop
2151 character(len=LINELENGTH) :: string
2153 string = obsrv%IDstring
2156 call urword(string, icol, istart, istop, 1, n, r, iout, inunitobs)
2157 read (string(istart:istop),
'(i10)', iostat=istat) iexg
2158 if (istat == 0)
then
2159 obsrv%intPak1 = iexg
2163 obsrv%FeatureName = trim(adjustl(string))
2167 obsrv%intPak1 = namedboundflag
2181 class(*),
pointer,
intent(inout) :: obj
2186 if (.not.
associated(obj))
return
2204 type(
listtype),
intent(inout) :: list
2205 integer(I4B),
intent(in) :: idx
2209 class(*),
pointer :: obj
2211 obj => list%GetItem(idx)
subroutine, public addbaseexchangetolist(list, exchange)
Add the exchange object (BaseExchangeType) to a list.
class(basemodeltype) function, pointer, public getbasemodelfromlist(list, idx)
This module contains the BudgetModule.
subroutine, public rate_accumulator(flow, rin, rout)
@ brief Rate accumulator subroutine
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
@ tabcenter
centered table column
@ tableft
left justified table column
integer(i4b), parameter lenpackagename
maximum length of the package name
integer(i4b), parameter namedboundflag
named bound flag
real(dp), parameter dnodata
real no data constant
integer(i4b), parameter lenvarname
maximum length of a variable name
real(dp), parameter dhalf
real constant 1/2
integer(i4b), parameter lenauxname
maximum length of a aux variable
integer(i4b), parameter lenboundname
maximum length of a bound name
real(dp), parameter dpio180
real constant
real(dp), parameter dem6
real constant 1e-6
real(dp), parameter dzero
real constant zero
integer(i4b), parameter lenbudtxt
maximum length of a budget component names
real(dp), parameter done
real constant 1
subroutine, public gnc_cr(gncobj, name_parent, inunit, iout)
Create new GNC exchange object.
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.
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, public exg_mvr_cr(exg_mvr, name_parent, inunit, iout, dis)
This module contains the GwfGwfExchangeModule Module.
integer(i4b) function gwf_gwf_get_iasym(this)
@ brief Set symmetric flag
subroutine gwf_gwf_fp(this)
@ brief Final processing
subroutine gwf_gwf_cq(this, icnvg, isuppress_output, isolnid)
@ brief Calculate flow
class(gwfexchangetype) function, pointer, public getgwfexchangefromlist(list, idx)
@ brief Get exchange from list
subroutine gwf_gwf_process_obsid(obsrv, dis, inunitobs, iout)
@ brief Obs ID processor
subroutine rewet(this, kiter)
@ brief Rewet
subroutine gwf_gwf_add_to_flowja(this)
Add exchange flow to each model flowja diagonal position so that residual is calculated correctly.
subroutine gwf_gwf_ac(this, sparse)
@ brief Add connections
subroutine gwf_gwf_save_simvals(this)
@ brief Save simulated flow observations
subroutine calc_cond_sat(this)
logical(lgp) function use_interface_model(this)
Should interface model be used for this exchange.
subroutine gwf_gwf_ar(this)
@ brief Allocate and read
subroutine gwf_gwf_bdsav(this)
@ brief Budget save
subroutine gwf_gwf_ad(this)
@ brief Advance
subroutine gwf_gwf_fn(this, kiter, matrix_sln)
@ brief Fill Newton
subroutine gwf_gwf_fc(this, kiter, matrix_sln, rhs_sln, inwtflag)
@ brief Fill coefficients
subroutine gwf_gwf_bd(this, icnvg, isuppress_output, isolnid)
@ brief Budget
subroutine allocate_scalars(this)
@ brief Allocate scalars
subroutine gwf_gwf_da(this)
@ brief Deallocate
subroutine gwf_gwf_rp(this)
@ brief Read and prepare
real(dp) function qcalc(this, iexg, n1, n2)
@ brief Calculate flow
subroutine gwf_gwf_df(this)
@ brief Define GWF GWF exchange
subroutine gwf_gwf_df_obs(this)
@ brief Define observations
logical(lgp) function gwf_gwf_connects_model(this, model)
Return true when this exchange provides matrix coefficients for solving.
subroutine gwf_gwf_set_flow_to_npf(this)
Set flow rates to the edges in the models.
subroutine gwf_gwf_ot(this)
@ brief Output
subroutine allocate_arrays(this)
@ brief Allocate arrays
subroutine validate_exchange(this)
validate exchange data after reading
class(gwfexchangetype) function, pointer, public castasgwfexchange(obj)
@ brief Cast polymorphic object as exchange
subroutine gwf_gwf_rp_obs(this)
@ brief Read and prepare observations
subroutine, public gwfexchange_create(filename, name, id, m1_id, m2_id, input_mempath)
@ brief Create GWF GWF exchange
subroutine gwf_gwf_mc(this, matrix_sln)
@ brief Map connections
subroutine gwf_gwf_cf(this, kiter)
@ brief Calculate coefficients
subroutine gwf_gwf_bdsav_model(this, model)
subroutine gwf_gwf_calc_simvals(this)
Calculate flow rates for the exchanges and store them in a member array.
subroutine gwf_gwf_chd_bd(this)
@ brief gwf-gwf-chd-bd
subroutine read_mvr(this, iout)
@ brief Read mover
subroutine condcalc(this)
@ brief Calculate the conductance
subroutine read_gnc(this)
@ brief Read ghost nodes
subroutine source_options(this, iout)
@ brief Source options
This module defines variable data types.
type(listtype), public basemodellist
type(listtype), public baseexchangelist
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
This module contains the derived types ObserveType and ObsDataType.
This module contains the derived type ObsType.
subroutine, public obs_cr(obs, inobs)
@ brief Create a new ObsType object
This module contains simulation methods.
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.
subroutine, public store_error_unit(iunit, terminate)
Store the file unit number.
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
integer(i4b), dimension(:), allocatable model_loc_idx
equals the local index into the basemodel list (-1 when not available)
integer(i4b) iout
file unit number for simulation output
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
subroutine, public table_cr(this, name, title)
logical(lgp), pointer, public readnewdata
flag indicating time to read new data
integer(i4b), pointer, public kstp
current time step number
integer(i4b), pointer, public kper
current stress period number
Highest level model type. All models extend this parent type.
This class is used to store a single deferred-length character string. It was designed to work in an ...
Exchange based on connection between discretizations of DisBaseType. The data specifies the connectio...
Extends model mover for exchanges to also handle the.
Derived type for GwfExchangeType.
A generic heterogeneous doubly-linked list.