34 character(len=LENFTYPE) ::
ftype =
'PRP'
35 character(len=16) ::
text =
' PRP'
41 logical(LGP),
pointer :: extend => null()
42 logical(LGP),
pointer :: frctrn => null()
43 logical(LGP),
pointer :: drape => null()
44 logical(LGP),
pointer :: localz => null()
45 integer(I4B),
pointer :: istopweaksink => null()
46 integer(I4B),
pointer :: istopzone => null()
47 integer(I4B),
pointer :: idrymeth => null()
48 integer(I4B),
pointer :: itrkout => null()
49 integer(I4B),
pointer :: itrkhdr => null()
50 integer(I4B),
pointer :: itrkcsv => null()
51 integer(I4B),
pointer :: irlstls => null()
52 integer(I4B),
pointer :: iexmeth => null()
53 integer(I4B),
pointer :: ichkmeth => null()
54 integer(I4B),
pointer :: icycwin => null()
55 real(dp),
pointer :: extol => null()
56 real(dp),
pointer :: rttol => null()
57 real(dp),
pointer :: rtfreq => null()
58 real(dp),
pointer :: offset => null()
59 real(dp),
pointer :: stoptime => null()
60 real(dp),
pointer :: stoptraveltime => null()
66 integer(I4B),
pointer :: nreleasepoints => null()
67 integer(I4B),
pointer :: nreleasetimes => null()
68 integer(I4B),
pointer :: nparticles => null()
69 integer(I4B),
pointer,
contiguous :: rptnode(:) => null()
70 integer(I4B),
pointer,
contiguous :: rptzone(:) => null()
71 real(dp),
pointer,
contiguous :: rptx(:) => null()
72 real(dp),
pointer,
contiguous :: rpty(:) => null()
73 real(dp),
pointer,
contiguous :: rptz(:) => null()
74 real(dp),
pointer,
contiguous :: rptm(:) => null()
75 character(len=LENBOUNDNAME),
pointer,
contiguous :: rptname(:) => null()
76 character(len=LINELENGTH),
allocatable :: period_block_lines(:)
77 integer(I4B) :: applied_kper
127 subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, &
128 pakname, fmi, input_mempath)
130 class(
bndtype),
pointer :: packobj
131 integer(I4B),
intent(in) :: id
132 integer(I4B),
intent(in) :: ibcnum
133 integer(I4B),
intent(in) :: inunit
134 integer(I4B),
intent(in) :: iout
135 character(len=*),
intent(in) :: namemodel
136 character(len=*),
intent(in) :: pakname
137 character(len=*),
intent(in),
optional :: input_mempath
143 character(len=*),
parameter :: fmtheader = &
144 "(1x, /1x, 'PRP PARTICLE RELEASE POINT PACKAGE', &
145 &' INPUT READ FROM MEMPATH: ', a, /)"
146 character(len=*),
parameter :: fmtexgheader = &
147 "(1x, /1x, 'PRP-EXG EXCHANGE PARTICLE RELEASE POINT PACKAGE', &
148 &' (PROGRAMMATIC INPUT)', /)"
150 if (
present(input_mempath))
then
155 call packobj%set_names(ibcnum, namemodel, pakname,
ftype, input_mempath)
158 call prpobj%prp_allocate_scalars()
159 call packobj%pack_initialize()
161 packobj%inunit = inunit
164 packobj%ibcnum = ibcnum
169 if (inunit > 0)
write (iout, fmtheader) input_mempath
175 call packobj%set_names(ibcnum, namemodel, pakname,
ftype)
176 exgprpobj%text =
text
178 call exgprpobj%prp_allocate_scalars()
179 call packobj%pack_initialize()
181 packobj%inunit = inunit
184 packobj%ibcnum = ibcnum
189 if (iout > 0)
write (iout, fmtexgheader)
198 call this%BndExtType%bnd_da()
234 if (
allocated(this%period_block_lines))
deallocate (this%period_block_lines)
237 call this%particles%destroy(this%memoryPath)
238 call this%particles_staging%destroy(trim(this%memoryPath)//
'-STAGING')
239 call this%schedule%destroy()
240 deallocate (this%particles)
241 deallocate (this%particles_staging)
242 deallocate (this%schedule)
248 integer(I4B),
dimension(:),
pointer,
contiguous :: ibound
249 integer(I4B),
dimension(:),
pointer,
contiguous :: izone
251 this%ibound => ibound
252 this%rptzone => izone
259 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
260 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
264 call this%BndExtType%allocate_arrays()
271 this%particles_staging, 0, &
272 trim(this%memoryPath)//
'-STAGING')
275 call mem_allocate(this%rptx, this%nreleasepoints,
'RPTX', this%memoryPath)
276 call mem_allocate(this%rpty, this%nreleasepoints,
'RPTY', this%memoryPath)
277 call mem_allocate(this%rptz, this%nreleasepoints,
'RPTZ', this%memoryPath)
278 call mem_allocate(this%rptm, this%nreleasepoints,
'RPTMASS', &
280 call mem_allocate(this%rptnode, this%nreleasepoints,
'RPTNODER', &
283 'RPTNAME', this%memoryPath)
286 do nps = 1, this%nreleasepoints
287 this%rptm(nps) =
dzero
296 call this%BndExtType%allocate_scalars()
299 call mem_allocate(this%localz,
'LOCALZ', this%memoryPath)
300 call mem_allocate(this%extend,
'EXTEND', this%memoryPath)
301 call mem_allocate(this%offset,
'OFFSET', this%memoryPath)
302 call mem_allocate(this%stoptime,
'STOPTIME', this%memoryPath)
303 call mem_allocate(this%stoptraveltime,
'STOPTRAVELTIME', this%memoryPath)
304 call mem_allocate(this%istopweaksink,
'ISTOPWEAKSINK', this%memoryPath)
305 call mem_allocate(this%istopzone,
'ISTOPZONE', this%memoryPath)
307 call mem_allocate(this%idrymeth,
'IDRYMETH', this%memoryPath)
308 call mem_allocate(this%nreleasepoints,
'NRELEASEPOINTS', this%memoryPath)
309 call mem_allocate(this%nreleasetimes,
'NRELEASETIMES', this%memoryPath)
310 call mem_allocate(this%nparticles,
'NPARTICLES', this%memoryPath)
311 call mem_allocate(this%itrkout,
'ITRKOUT', this%memoryPath)
312 call mem_allocate(this%itrkhdr,
'ITRKHDR', this%memoryPath)
313 call mem_allocate(this%itrkcsv,
'ITRKCSV', this%memoryPath)
314 call mem_allocate(this%irlstls,
'IRLSTLS', this%memoryPath)
315 call mem_allocate(this%frctrn,
'FRCTRN', this%memoryPath)
316 call mem_allocate(this%iexmeth,
'IEXMETH', this%memoryPath)
317 call mem_allocate(this%ichkmeth,
'ICHKMETH', this%memoryPath)
318 call mem_allocate(this%icycwin,
'ICYCWIN', this%memoryPath)
321 call mem_allocate(this%rtfreq,
'RTFREQ', this%memoryPath)
324 this%localz = .false.
325 this%extend = .false.
327 this%stoptime = huge(1d0)
328 this%stoptraveltime = huge(1d0)
329 this%istopweaksink = 0
333 this%nreleasepoints = 0
334 this%nreleasetimes = 0
340 this%frctrn = .false.
347 this%applied_kper = 0
356 call this%obs%obs_ar()
358 if (this%inamedbound /= 0)
then
359 do n = 1, this%nreleasepoints
360 this%boundname(n) = this%rptname(n)
363 do n = 1, this%nreleasepoints
364 this%nodelist(n) = this%rptnode(n)
376 integer(I4B),
pointer :: iper, ionper
378 this%input_mempath = trim(this%memoryPath)//
'-INPUT'
388 call this%PrtPrpType%prp_allocate_scalars()
400 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
401 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
403 integer(I4B),
dimension(:, :),
pointer,
contiguous :: cellid
404 integer(I4B),
dimension(:),
pointer,
contiguous :: nodeulist
406 real(DP),
dimension(:, :),
pointer,
contiguous :: auxvar_input
408 call mem_allocate(cellid, this%dis%ndim, 0,
'CELLID', this%input_mempath)
409 call mem_allocate(nodeulist, 0,
'NODEULIST', this%input_mempath)
412 call mem_allocate(auxvar_input, 0, 0,
'AUXVAR', this%input_mempath)
414 call this%PrtPrpType%prp_allocate_arrays(nodelist, auxvar)
426 integer(I4B) :: ip, it
439 if (.not. this%fmi%flows_from_file)
then
440 call this%particles_staging%resize( &
441 this%particles%num_stored(), &
442 trim(this%memoryPath)//
'-STAGING')
443 call this%particles_staging%copy_from(this%particles)
444 this%nparticles = this%particles%num_stored()
448 do ip = 1, this%nreleasepoints
449 this%rptm(ip) =
dzero
457 if (
kstp == 1 .and. &
458 kper /= this%applied_kper .and. &
459 allocated(this%period_block_lines))
then
460 call this%schedule%advance(lines=this%period_block_lines)
461 this%applied_kper =
kper
463 call this%schedule%advance()
467 if (.not. this%schedule%any())
return
470 call this%log_release()
474 call this%particles_staging%resize( &
475 this%particles_staging%num_stored() + &
476 (this%nreleasepoints * this%schedule%count()), &
477 trim(this%memoryPath)//
'-STAGING')
481 do ip = 1, this%nreleasepoints
482 do it = 1, this%schedule%count()
483 t = this%schedule%times(it)
488 'Skipping negative release time (t=', t,
').'
493 'Skipping release time falling after the end of the &
494 &simulation (t=', t,
'). Enable EXTEND_TRACKING to &
495 &release particles after the simulation end time.'
499 call this%release(ip, t)
507 call this%particles%resize( &
508 this%particles_staging%num_stored(), &
510 call this%particles%copy_from(this%particles_staging)
524 real(DP),
dimension(:),
intent(in) :: hnew
525 real(DP),
dimension(:),
intent(inout) :: flowja
526 integer(I4B),
intent(in) :: imover
534 type(
budgettype),
intent(inout) :: model_budget
541 integer(I4B),
intent(in) :: icbcfl
542 integer(I4B),
intent(in) :: ibudfl
543 integer(I4B),
intent(in) :: icbcun
544 integer(I4B),
dimension(:),
optional,
intent(in) :: imap
550 if (this%iprpak > 0)
then
551 write (this%iout,
"(1x,/1x,a,1x,i0)") &
552 'PARTICLE RELEASE FOR PRP', this%ibcnum
553 call this%schedule%log(this%iout)
565 integer(I4B),
intent(in) :: ic
566 real(DP),
intent(in) :: x, y, z
568 real(DP),
allocatable :: polyverts(:, :)
570 call this%fmi%dis%get_polyverts(ic, polyverts)
572 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
573 'Error: release point (x=', x,
', y=', y,
') is not in cell ', &
574 this%dis%get_nodeuser(ic)
578 if (z > maxval(this%dis%top))
then
579 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
580 'Error: release point (z=', z,
') is above grid top ', &
584 else if (z < minval(this%dis%bot))
then
585 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
586 'Error: release point (z=', z,
') is below grid bottom ', &
591 deallocate (polyverts)
609 integer(I4B),
intent(in) :: ip
610 real(DP),
intent(in) :: trelease
615 call this%initialize_particle(particle, ip, trelease)
616 np = this%nparticles + 1
618 call this%particles_staging%put(particle, np)
619 deallocate (particle)
620 this%rptm(ip) = this%rptm(ip) +
done
628 integer(I4B),
intent(in) :: ip
629 real(DP),
intent(in) :: trelease
631 logical(LGP) :: draped
632 integer(I4B) :: irow, icol, ilay, icpl
633 integer(I4B) :: ic, icu, ic_old
636 character(len=*),
parameter :: fmticterr = &
637 "('Error in ',a,': Flow model interface does not contain ICELLTYPE. &
638 &ICELLTYPE is required for PRT to distinguish convertible cells &
639 &from confined cells if LOCAL_Z release coordinates are provided. &
640 &Make sure a GWFGRID entry is configured in the PRT FMI package.')"
642 ic = this%rptnode(ip)
644 call create_particle(particle)
646 if (
size(this%boundname) /= 0)
then
647 particle%name = this%boundname(ip)
653 particle%istopweaksink = this%istopweaksink
654 particle%istopzone = this%istopzone
655 particle%idrymeth = this%idrymeth
662 if (this%ibound(ic) == 0)
then
665 call this%dis%highest_active(ic, this%ibound)
666 draped = ic /= ic_old
667 if (.not. draped .and. this%ibound(ic) == 0)
then
678 icu = this%dis%get_nodeuser(ic)
680 select type (dis => this%dis)
682 call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay)
684 call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay)
687 particle%izone = this%rptzone(ic)
693 z = this%fmi%dis%bot(ic) + &
694 this%fmi%gwfsat(ic) * &
695 (this%fmi%dis%top(ic) - this%fmi%dis%bot(ic))
696 else if (this%localz)
then
697 z = this%fmi%dis%bot(ic) + &
699 this%fmi%gwfsat(ic) * &
700 (this%fmi%dis%top(ic) - this%fmi%dis%bot(ic))
708 if (this%ichkmeth > 0) &
709 call this%validate_release_point(ic, x, y, z)
714 particle%trelease = trelease
717 if (this%stoptraveltime == huge(1d0))
then
718 particle%tstop = this%stoptime
720 particle%tstop = particle%trelease + this%stoptraveltime
721 if (this%stoptime < particle%tstop) particle%tstop = this%stoptime
724 particle%ttrack = particle%trelease
731 particle%frctrn = this%frctrn
732 particle%iexmeth = this%iexmeth
733 particle%extend = this%extend
734 particle%icycwin = this%icycwin
735 particle%extol = this%extol
749 integer(I4B),
pointer :: iper, ionper, nlist
753 call mem_setptr(iper,
'IPER', this%input_mempath)
754 call mem_setptr(ionper,
'IONPER', this%input_mempath)
756 if (
kper == 1 .and. &
758 (ionper >
nper) .and. &
759 size(this%schedule%time_select%times) == 0)
then
766 call this%schedule%time_select%extend([
dzero])
768 else if (iper /=
kper)
then
773 call mem_setptr(nlist,
'NBOUND', this%input_mempath)
774 call mem_setptr(settings,
'SETTING', this%input_mempath)
777 if (
allocated(this%period_block_lines))
deallocate (this%period_block_lines)
778 allocate (this%period_block_lines(nlist))
780 this%period_block_lines(n) = settings(n)
795 real(DP),
dimension(:),
intent(in) :: hnew
796 real(DP),
dimension(:),
intent(inout) :: flowja
797 integer(I4B),
intent(in) :: imover
801 integer(I4B) :: idiag
805 if (this%nbound <= 0)
return
808 do i = 1, this%nbound
809 node = this%nodelist(i)
814 idiag = this%dis%con%ia(node)
815 rrate = this%rptm(i) * (
done /
delt)
816 flowja(idiag) = flowja(idiag) + rrate
820 this%simvals(i) = rrate
841 call this%obs%StoreObsType(
'prp', .true., indx)
846 call this%obs%StoreObsType(
'to-mvr', .true., indx)
861 character(len=LENVARNAME),
dimension(3) :: drytrack_method = &
862 &[character(len=LENVARNAME) ::
'DROP',
'STOP',
'STAY']
863 character(len=
lenvarname),
dimension(2) :: coorcheck_method = &
864 &[
character(len=LENVARNAME) ::
'NONE',
'EAGER']
865 character(len=LINELENGTH) :: trackfile, trackcsvfile, fname
867 character(len=*),
parameter :: fmtextolwrn = &
868 "('WARNING: EXIT_SOLVE_TOLERANCE is set to ',g10.3,' &
869 &which is much greater than the default value of ',g10.3,'. &
870 &The tolerance that strikes the best balance between accuracy &
871 &and runtime is problem-dependent. Since the variable being &
872 &solved varies from 0 to 1, tolerance values much less than 1 &
873 &typically give the best results.')"
876 call this%BndExtType%source_options()
879 call mem_set_value(this%stoptime,
'STOPTIME', this%input_mempath, &
882 this%input_mempath, found%stoptraveltime)
883 call mem_set_value(this%istopweaksink,
'ISTOPWEAKSINK', this%input_mempath, &
885 call mem_set_value(this%istopzone,
'ISTOPZONE', this%input_mempath, &
887 call mem_set_value(this%drape,
'DRAPE', this%input_mempath, &
889 call mem_set_value(this%idrymeth,
'IDRYMETH', this%input_mempath, &
890 drytrack_method, found%idrymeth)
891 call mem_set_value(trackfile,
'TRACKFILE', this%input_mempath, &
893 call mem_set_value(trackcsvfile,
'TRACKCSVFILE', this%input_mempath, &
895 call mem_set_value(this%localz,
'LOCALZ', this%input_mempath, &
897 call mem_set_value(this%extend,
'EXTEND', this%input_mempath, &
899 call mem_set_value(this%extol,
'EXTOL', this%input_mempath, &
901 call mem_set_value(this%rttol,
'RTTOL', this%input_mempath, &
903 call mem_set_value(this%rtfreq,
'RTFREQ', this%input_mempath, &
905 call mem_set_value(this%frctrn,
'FRCTRN', this%input_mempath, &
907 call mem_set_value(this%iexmeth,
'IEXMETH', this%input_mempath, &
909 call mem_set_value(this%ichkmeth,
'ICHKMETH', this%input_mempath, &
910 coorcheck_method, found%ichkmeth)
911 call mem_set_value(this%icycwin,
'ICYCWIN', this%input_mempath, found%icycwin)
914 if (found%idrymeth)
then
915 if (this%idrymeth == 0)
then
916 write (
errmsg,
'(a)')
'Unsupported dry tracking method. &
917 &DRY_TRACKING_METHOD must be "DROP", "STOP", or "STAY"'
921 this%idrymeth = this%idrymeth - 1
925 if (found%extol)
then
926 if (this%extol <=
dzero) &
927 call store_error(
'EXIT_SOLVE_TOLERANCE MUST BE POSITIVE')
928 if (this%extol > dem2)
then
929 write (
warnmsg, fmt=fmtextolwrn) &
935 if (found%rttol)
then
936 if (this%rttol <=
dzero) &
937 call store_error(
'RELEASE_TIME_TOLERANCE MUST BE POSITIVE')
940 if (found%rtfreq)
then
941 if (this%rtfreq <=
dzero) &
942 call store_error(
'RELEASE_TIME_FREQUENCY MUST BE POSITIVE')
945 if (found%iexmeth)
then
946 if (.not. (this%iexmeth /= 1 .or. this%iexmeth /= 2)) &
948 &1 (BRENT) OR 2 (CHANDRUPATLA)')
951 if (found%ichkmeth)
then
952 if (this%ichkmeth == 0)
then
953 write (
errmsg,
'(a)')
'Unsupported coordinate check method. &
954 &COORDINATE_CHECK_METHOD must be "NONE" or "EAGER"'
958 this%ichkmeth = this%ichkmeth - 1
962 if (found%icycwin)
then
963 if (this%icycwin < 0) &
964 call store_error(
'CYCLE_DETECTION_WINDOW MUST BE NON-NEGATIVE')
968 if (found%trackfile)
then
970 call openfile(this%itrkout, this%iout, trackfile,
'DATA(BINARY)', &
975 fname = trim(trackfile)//
'.hdr'
976 call openfile(this%itrkhdr, this%iout, fname,
'CSV', &
977 filstat_opt=
'REPLACE', mode_opt=
mnormal)
981 if (found%trackcsvfile)
then
983 call openfile(this%itrkcsv, this%iout, trackcsvfile,
'CSV', &
984 filstat_opt=
'REPLACE')
994 call this%prp_log_options(found, trackfile, trackcsvfile)
1015 character(len=*),
intent(in) :: trackfile
1016 character(len=*),
intent(in) :: trackcsvfile
1019 character(len=*),
parameter :: fmttrkbin = &
1020 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, &
1021 &'OPENED ON UNIT: ', I0)"
1022 character(len=*),
parameter :: fmttrkcsv = &
1023 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, &
1024 &'OPENED ON UNIT: ', I0)"
1026 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
1028 if (found%frctrn)
then
1029 write (this%iout,
'(4x,a)') &
1030 'IF DISV, TRACKING WILL USE THE TERNARY METHOD REGARDLESS OF CELL TYPE'
1033 if (found%trackfile)
then
1034 write (this%iout, fmttrkbin) trim(adjustl(trackfile)), this%itrkout
1037 if (found%trackcsvfile)
then
1038 write (this%iout, fmttrkcsv) trim(adjustl(trackcsvfile)), this%itrkcsv
1041 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
1054 call mem_set_value(this%nreleasepoints,
'NRELEASEPTS', this%input_mempath, &
1056 call mem_set_value(this%nreleasetimes,
'NRELEASETIMES', this%input_mempath, &
1057 found%nreleasetimes)
1059 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
1060 write (this%iout,
'(4x,a,i0)')
'NRELEASEPTS = ', this%nreleasepoints
1061 write (this%iout,
'(4x,a,i0)')
'NRELEASETIMES = ', this%nreleasetimes
1062 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
1065 this%maxbound = this%nreleasepoints
1066 this%nbound = this%nreleasepoints
1068 call this%prp_allocate_arrays()
1069 call this%prp_packagedata()
1070 call this%prp_releasetimes()
1071 call this%prp_load_releasetimefrequency()
1079 this%nreleasepoints = 0
1080 this%nreleasetimes = 0
1084 call this%prp_allocate_arrays()
1096 integer(I4B),
dimension(:),
pointer,
contiguous :: irptno
1097 integer(I4B),
dimension(:, :),
pointer,
contiguous :: cellids
1098 real(DP),
dimension(:),
pointer,
contiguous :: xrpts, yrpts, zrpts
1100 contiguous :: boundnames
1101 character(len=LENBOUNDNAME) :: bndName, bndNameTemp
1102 character(len=9) :: cno
1103 character(len=20) :: cellidstr
1104 integer(I4B),
dimension(:),
allocatable :: nboundchk
1105 integer(I4B),
dimension(:),
pointer :: cellid
1106 integer(I4B) :: n, noder, nodeu, rptno
1109 call mem_setptr(irptno,
'IRPTNO', this%input_mempath)
1110 call mem_setptr(cellids,
'CELLID', this%input_mempath)
1111 call mem_setptr(xrpts,
'XRPT', this%input_mempath)
1112 call mem_setptr(yrpts,
'YRPT', this%input_mempath)
1113 call mem_setptr(zrpts,
'ZRPT', this%input_mempath)
1114 call mem_setptr(boundnames,
'BOUNDNAME', this%input_mempath)
1117 allocate (nboundchk(this%nreleasepoints))
1118 do n = 1, this%nreleasepoints
1122 write (this%iout,
'(/1x,a)')
'PROCESSING '//trim(adjustl(this%packName)) &
1125 do n = 1,
size(irptno)
1129 if (rptno < 1 .or. rptno > this%nreleasepoints)
then
1130 write (
errmsg,
'(a,i0,a,i0,a)') &
1131 'Expected ', this%nreleasepoints,
' release points. &
1132 &Points must be numbered from 1 to ', this%nreleasepoints,
'.'
1138 nboundchk(rptno) = nboundchk(rptno) + 1
1141 cellid => cellids(:, n)
1144 if (this%dis%ndim == 1)
then
1146 elseif (this%dis%ndim == 2)
then
1147 nodeu =
get_node(cellid(1), 1, cellid(2), &
1148 this%dis%mshape(1), 1, &
1151 nodeu =
get_node(cellid(1), cellid(2), cellid(3), &
1152 this%dis%mshape(1), &
1153 this%dis%mshape(2), &
1158 noder = this%dis%get_nodenumber(nodeu, 1)
1159 if (noder <= 0)
then
1160 call this%dis%nodeu_to_string(nodeu, cellidstr)
1162 'Particle release point configured for nonexistent cell: '// &
1163 trim(adjustl(cellidstr))//
'. This cell has IDOMAIN <= 0 and '&
1164 &
'therefore does not exist in the model grid.'
1168 this%rptnode(rptno) = noder
1171 if (this%localz .and. (zrpts(n) < 0 .or. zrpts(n) > 1))
then
1172 call store_error(
'Local z coordinate must fall in the interval [0, 1]')
1177 this%rptx(rptno) = xrpts(n)
1178 this%rpty(rptno) = yrpts(n)
1179 this%rptz(rptno) = zrpts(n)
1182 write (cno,
'(i9.9)') rptno
1183 bndname =
'PRP'//cno
1186 if (this%inamedbound /= 0)
then
1187 bndnametemp = boundnames(n)
1188 if (bndnametemp /=
'') bndname = bndnametemp
1194 this%rptname(rptno) = bndname
1197 write (this%iout,
'(1x,a)') &
1198 'END OF '//trim(adjustl(this%packName))//
' PACKAGEDATA'
1201 do n = 1, this%nreleasepoints
1202 if (nboundchk(n) == 0)
then
1203 write (
errmsg,
'(a,a,1x,i0,a)')
'No data specified for particle ', &
1204 'release point', n,
'.'
1206 else if (nboundchk(n) > 1)
then
1207 write (
errmsg,
'(a,1x,i0,1x,a,1x,i0,1x,a)') &
1208 'Data for particle release point', n,
'specified', nboundchk(n), &
1220 deallocate (nboundchk)
1236 real(DP),
dimension(:),
pointer,
contiguous :: time
1237 integer(I4B) :: n, isize
1238 real(DP),
allocatable :: times(:)
1240 if (this%nreleasetimes <= 0)
return
1243 allocate (times(this%nreleasetimes))
1246 call get_isize(
'TIME', this%input_mempath, isize)
1248 if (isize <= 0)
then
1249 errmsg =
"RELEASTIMES block expected when &
1250 &NRELEASETIMES dimension is non-zero."
1256 call mem_setptr(time,
'TIME', this%input_mempath)
1259 do n = 1,
size(time)
1264 call this%schedule%time_select%extend(times)
1267 if (.not. this%schedule%time_select%increasing())
then
1268 errmsg =
"RELEASTIMES block entries must strictly increase."
1284 real(DP),
allocatable :: times(:)
1287 if (this%rtfreq <=
dzero)
return
1296 call this%schedule%time_select%extend(times)
1299 if (.not. this%schedule%time_select%increasing())
then
1300 errmsg =
"Release times must strictly increase"
This module contains the extended boundary package.
This module contains the base boundary package.
This module contains the BudgetModule.
This module contains simulation constants.
real(dp), parameter dsame
real constant for values that are considered the same based on machine precision
integer(i4b), parameter linelength
maximum length of a standard line
@ tabcenter
centered table column
@ tableft
left justified table column
@ mnormal
normal output mode
real(dp), parameter dep3
real constant 1000
integer(i4b), parameter lenpakloc
maximum length of a package location
real(dp), parameter dem1
real constant 1e-1
real(dp), parameter dep9
real constant 1e9
integer(i4b), parameter lenvarname
maximum length of a variable name
integer(i4b), parameter lenftype
maximum length of a package type (DIS, WEL, OC, etc.)
integer(i4b), parameter lenboundname
maximum length of a bound name
real(dp), parameter dzero
real constant zero
real(dp), parameter dem5
real constant 1e-5
real(dp), parameter dem2
real constant 1e-2
real(dp), parameter done
real constant 1
subroutine pstop(status, message)
Stop the program, optionally specifying an error status code.
integer(i4b) function, public get_node(ilay, irow, icol, nlay, nrow, ncol)
Get node number, given layer, row, and column indices for a structured grid. If any argument is inval...
logical function, public point_in_polygon(x, y, poly)
Check if a point is within a polygon.
subroutine, public get_ijk(nodenumber, nrow, ncol, nlay, irow, icol, ilay)
Get row, column and layer indices from node number and grid dimensions. If nodenumber is invalid,...
subroutine, public get_jk(nodenumber, ncpl, nlay, icpl, ilay)
Get layer index and within-layer node index from node number and grid dimensions. If nodenumber is in...
This module defines variable data types.
pure real(dp) function, dimension(:), allocatable, public arange(start, stop, step)
Return reals separated by the given step over the given interval.
pure logical function, public is_close(a, b, rtol, atol, symmetric)
Check if a real value is approximately equal to another.
subroutine, public memorystore_release(varname, memory_path)
Release a single variable from the memory store.
subroutine, public get_isize(name, mem_path, isize)
@ brief Get the number of elements for this variable
Particle tracking strategies.
@, public level_subfeature
This module contains the derived type ObsType.
subroutine, public defaultobsidprocessor(obsrv, dis, inunitobs, iout)
@ brief Process IDstring provided for each observation
subroutine create_particle_store(store, np, mempath)
Allocate particle store.
@ term_unreleased
terminated permanently unreleased
subroutine create_particle(particle)
Create a new particle.
Particle release scheduling.
type(particlereleasescheduletype) function, pointer, public create_release_schedule(tolerance)
Create a new release schedule.
Particle track output module.
character(len= *), parameter, public trackheader
character(len= *), parameter, public trackdtypes
subroutine exg_prp_allocate_arrays(this, nodelist, auxvar)
Allocate arrays for exchange PRP.
subroutine exg_prp_ar(this)
@ brief No-op AR method override for exchange PRP.
subroutine prp_allocate_arrays(this, nodelist, auxvar)
Allocate arrays.
subroutine exg_prp_cq_simrate(this, hnew, flowja, imover)
No-op flow calculation for exchange PRP.
subroutine prp_rp(this)
@ brief Read and prepare period data for particle input
subroutine exg_prp_rp(this)
@ brief No-op RP method override for exchange PRP.
subroutine prp_load_releasetimefrequency(this)
Load regularly spaced release times if configured.
subroutine prp_cq_simrate(this, hnew, flowja, imover)
@ brief Calculate flow between package and model.
subroutine exg_prp_allocate_scalars(this)
Allocate scalars for exchange PRP.
subroutine exg_prp_ad(this)
No-op AD method override for exchange PRP.
character(len=lenftype) ftype
subroutine exg_prp_bd(this, model_budget)
No-op budget method for exchange PRP. Likewise about the STORAGE term accounting.
subroutine prp_df_obs(this)
Store supported observations.
real(dp), parameter default_exit_solve_tolerance
subroutine define_listlabel(this)
subroutine log_release(this)
Log the release scheduled for this time step.
subroutine exg_prp_options(this)
@ brief No-op options method override for exchange PRP. Just creates an empty release schedule.
subroutine prp_ad(this)
Advance a time step and release particles if scheduled.
subroutine prp_allocate_scalars(this)
Allocate scalars.
subroutine prp_dimensions(this)
@ brief Set dimensions specific to PrtPrpType
subroutine exg_prp_dimensions(this)
@ brief Dimensions method override for exchange PRP. Just set all dimensions to zero and allocate arr...
subroutine prp_set_pointers(this, ibound, izone)
@ brief Set pointers to model variables
subroutine exg_prp_ot_model_flows(this, icbcfl, ibudfl, icbcun, imap)
No-op flow output method for exchange PRP. No contribution to budget, no need to write output.
subroutine initialize_particle(this, particle, ip, trelease)
subroutine prp_da(this)
Deallocate memory.
subroutine prp_releasetimes(this)
Load explicitly specified release times.
subroutine prp_commit(this)
Commit staged particle state to the "final" store.
subroutine prp_options(this)
@ brief Set options specific to PrtPrpType
subroutine prp_log_options(this, found, trackfile, trackcsvfile)
@ brief Log options specific to PrtPrpType
logical function prp_obs_supported(this)
Indicates whether observations are supported.
subroutine prp_ar(this)
@ brief Allocate and read period data
subroutine release(this, ip, trelease)
Release a particle at the specified time.
subroutine, public prp_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, fmi, input_mempath)
Create a new particle release point package.
subroutine validate_release_point(this, ic, x, y, z)
Verify that the release point is in the cell.
subroutine prp_packagedata(this)
Load package data (release points).
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=maxcharlen) warnmsg
warning message string
real(dp), pointer, public totalsimtime
time at end of simulation
integer(i4b), pointer, public kstp
current time step number
integer(i4b), pointer, public kper
current stress period number
real(dp), pointer, public delt
length of the current time step
integer(i4b), pointer, public nper
number of stress period
Derived type for the Budget object.
This class is used to store a single deferred-length character string. It was designed to work in an ...
Structured grid discretization.
Vertex grid discretization.
Structure of arrays to store particles.
Particle tracked by the PRT model.
Particle release scheduling utility.
Particle track output manager. Handles printing as well as writing to files. One output unit can be c...
Exchange PRP package. A variant of the normal PRP package that doesn't read from input files but inst...
Particle release point (PRP) package.