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()
65 integer(I4B),
pointer :: nreleasepoints => null()
66 integer(I4B),
pointer :: nreleasetimes => null()
67 integer(I4B),
pointer :: nparticles => null()
68 integer(I4B),
pointer,
contiguous :: rptnode(:) => null()
69 integer(I4B),
pointer,
contiguous :: rptzone(:) => null()
70 real(dp),
pointer,
contiguous :: rptx(:) => null()
71 real(dp),
pointer,
contiguous :: rpty(:) => null()
72 real(dp),
pointer,
contiguous :: rptz(:) => null()
73 real(dp),
pointer,
contiguous :: rptm(:) => null()
74 character(len=LENBOUNDNAME),
pointer,
contiguous :: rptname(:) => null()
75 character(len=LINELENGTH),
allocatable :: period_block_lines(:)
76 integer(I4B) :: applied_kper
125 subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, &
126 pakname, fmi, input_mempath)
128 class(
bndtype),
pointer :: packobj
129 integer(I4B),
intent(in) :: id
130 integer(I4B),
intent(in) :: ibcnum
131 integer(I4B),
intent(in) :: inunit
132 integer(I4B),
intent(in) :: iout
133 character(len=*),
intent(in) :: namemodel
134 character(len=*),
intent(in) :: pakname
135 character(len=*),
intent(in),
optional :: input_mempath
141 character(len=*),
parameter :: fmtheader = &
142 "(1x, /1x, 'PRP PARTICLE RELEASE POINT PACKAGE', &
143 &' INPUT READ FROM MEMPATH: ', a, /)"
144 character(len=*),
parameter :: fmtexgheader = &
145 "(1x, /1x, 'PRP-EXG EXCHANGE PARTICLE RELEASE POINT PACKAGE', &
146 &' (PROGRAMMATIC INPUT)', /)"
148 if (
present(input_mempath))
then
153 call packobj%set_names(ibcnum, namemodel, pakname,
ftype, input_mempath)
156 call prpobj%prp_allocate_scalars()
157 call packobj%pack_initialize()
159 packobj%inunit = inunit
162 packobj%ibcnum = ibcnum
167 if (inunit > 0)
write (iout, fmtheader) input_mempath
173 call packobj%set_names(ibcnum, namemodel, pakname,
ftype)
174 exgprpobj%text =
text
176 call exgprpobj%prp_allocate_scalars()
177 call packobj%pack_initialize()
179 packobj%inunit = inunit
182 packobj%ibcnum = ibcnum
187 if (iout > 0)
write (iout, fmtexgheader)
196 call this%BndExtType%bnd_da()
232 if (
allocated(this%period_block_lines))
deallocate (this%period_block_lines)
235 call this%particles%destroy(this%memoryPath)
236 call this%schedule%destroy()
237 deallocate (this%particles)
238 deallocate (this%schedule)
244 integer(I4B),
dimension(:),
pointer,
contiguous :: ibound
245 integer(I4B),
dimension(:),
pointer,
contiguous :: izone
247 this%ibound => ibound
248 this%rptzone => izone
255 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
256 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
260 call this%BndExtType%allocate_arrays()
266 this%nreleasepoints, &
270 call mem_allocate(this%rptx, this%nreleasepoints,
'RPTX', this%memoryPath)
271 call mem_allocate(this%rpty, this%nreleasepoints,
'RPTY', this%memoryPath)
272 call mem_allocate(this%rptz, this%nreleasepoints,
'RPTZ', this%memoryPath)
273 call mem_allocate(this%rptm, this%nreleasepoints,
'RPTMASS', &
275 call mem_allocate(this%rptnode, this%nreleasepoints,
'RPTNODER', &
278 'RPTNAME', this%memoryPath)
281 do nps = 1, this%nreleasepoints
282 this%rptm(nps) =
dzero
291 call this%BndExtType%allocate_scalars()
294 call mem_allocate(this%localz,
'LOCALZ', this%memoryPath)
295 call mem_allocate(this%extend,
'EXTEND', this%memoryPath)
296 call mem_allocate(this%offset,
'OFFSET', this%memoryPath)
297 call mem_allocate(this%stoptime,
'STOPTIME', this%memoryPath)
298 call mem_allocate(this%stoptraveltime,
'STOPTRAVELTIME', this%memoryPath)
299 call mem_allocate(this%istopweaksink,
'ISTOPWEAKSINK', this%memoryPath)
300 call mem_allocate(this%istopzone,
'ISTOPZONE', this%memoryPath)
302 call mem_allocate(this%idrymeth,
'IDRYMETH', this%memoryPath)
303 call mem_allocate(this%nreleasepoints,
'NRELEASEPOINTS', this%memoryPath)
304 call mem_allocate(this%nreleasetimes,
'NRELEASETIMES', this%memoryPath)
305 call mem_allocate(this%nparticles,
'NPARTICLES', this%memoryPath)
306 call mem_allocate(this%itrkout,
'ITRKOUT', this%memoryPath)
307 call mem_allocate(this%itrkhdr,
'ITRKHDR', this%memoryPath)
308 call mem_allocate(this%itrkcsv,
'ITRKCSV', this%memoryPath)
309 call mem_allocate(this%irlstls,
'IRLSTLS', this%memoryPath)
310 call mem_allocate(this%frctrn,
'FRCTRN', this%memoryPath)
311 call mem_allocate(this%iexmeth,
'IEXMETH', this%memoryPath)
312 call mem_allocate(this%ichkmeth,
'ICHKMETH', this%memoryPath)
313 call mem_allocate(this%icycwin,
'ICYCWIN', this%memoryPath)
316 call mem_allocate(this%rtfreq,
'RTFREQ', this%memoryPath)
319 this%localz = .false.
320 this%extend = .false.
322 this%stoptime = huge(1d0)
323 this%stoptraveltime = huge(1d0)
324 this%istopweaksink = 0
328 this%nreleasepoints = 0
329 this%nreleasetimes = 0
335 this%frctrn = .false.
342 this%applied_kper = 0
351 call this%obs%obs_ar()
353 if (this%inamedbound /= 0)
then
354 do n = 1, this%nreleasepoints
355 this%boundname(n) = this%rptname(n)
358 do n = 1, this%nreleasepoints
359 this%nodelist(n) = this%rptnode(n)
371 integer(I4B),
pointer :: iper, ionper
373 this%input_mempath = trim(this%memoryPath)//
'-INPUT'
383 call this%PrtPrpType%prp_allocate_scalars()
395 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
396 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
398 integer(I4B),
dimension(:, :),
pointer,
contiguous :: cellid
399 integer(I4B),
dimension(:),
pointer,
contiguous :: nodeulist
401 real(DP),
dimension(:, :),
pointer,
contiguous :: auxvar_input
403 call mem_allocate(cellid, this%dis%ndim, 0,
'CELLID', this%input_mempath)
404 call mem_allocate(nodeulist, 0,
'NODEULIST', this%input_mempath)
407 call mem_allocate(auxvar_input, 0, 0,
'AUXVAR', this%input_mempath)
409 call this%PrtPrpType%prp_allocate_arrays(nodelist, auxvar)
421 integer(I4B) :: ip, it
434 do ip = 1, this%nreleasepoints
435 this%rptm(ip) =
dzero
443 if (
kstp == 1 .and. &
444 kper /= this%applied_kper .and. &
445 allocated(this%period_block_lines))
then
446 call this%schedule%advance(lines=this%period_block_lines)
447 this%applied_kper =
kper
449 call this%schedule%advance()
453 if (.not. this%schedule%any())
return
456 call this%log_release()
460 call this%particles%resize( &
461 this%particles%num_stored() + &
462 (this%nreleasepoints * this%schedule%count()), &
467 do ip = 1, this%nreleasepoints
468 do it = 1, this%schedule%count()
469 t = this%schedule%times(it)
474 'Skipping negative release time (t=', t,
').'
479 'Skipping release time falling after the end of the &
480 &simulation (t=', t,
'). Enable EXTEND_TRACKING to &
481 &release particles after the simulation end time.'
485 call this%release(ip, t)
501 real(DP),
dimension(:),
intent(in) :: hnew
502 real(DP),
dimension(:),
intent(inout) :: flowja
503 integer(I4B),
intent(in) :: imover
511 type(
budgettype),
intent(inout) :: model_budget
518 integer(I4B),
intent(in) :: icbcfl
519 integer(I4B),
intent(in) :: ibudfl
520 integer(I4B),
intent(in) :: icbcun
521 integer(I4B),
dimension(:),
optional,
intent(in) :: imap
527 if (this%iprpak > 0)
then
528 write (this%iout,
"(1x,/1x,a,1x,i0)") &
529 'PARTICLE RELEASE FOR PRP', this%ibcnum
530 call this%schedule%log(this%iout)
542 integer(I4B),
intent(in) :: ic
543 real(DP),
intent(in) :: x, y, z
545 real(DP),
allocatable :: polyverts(:, :)
547 call this%fmi%dis%get_polyverts(ic, polyverts)
549 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
550 'Error: release point (x=', x,
', y=', y,
') is not in cell ', &
551 this%dis%get_nodeuser(ic)
555 if (z > maxval(this%dis%top))
then
556 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
557 'Error: release point (z=', z,
') is above grid top ', &
561 else if (z < minval(this%dis%bot))
then
562 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
563 'Error: release point (z=', z,
') is below grid bottom ', &
568 deallocate (polyverts)
586 integer(I4B),
intent(in) :: ip
587 real(DP),
intent(in) :: trelease
592 call this%initialize_particle(particle, ip, trelease)
593 np = this%nparticles + 1
595 call this%particles%put(particle, np)
596 deallocate (particle)
597 this%rptm(ip) = this%rptm(ip) +
done
605 integer(I4B),
intent(in) :: ip
606 real(DP),
intent(in) :: trelease
608 integer(I4B) :: irow, icol, ilay, icpl
609 integer(I4B) :: ic, icu, ic_old
611 real(DP) :: top, bot, hds
613 character(len=*),
parameter :: fmticterr = &
614 "('Error in ',a,': Flow model interface does not contain ICELLTYPE. &
615 &ICELLTYPE is required for PRT to distinguish convertible cells &
616 &from confined cells if LOCAL_Z release coordinates are provided. &
617 &Make sure a GWFGRID entry is configured in the PRT FMI package.')"
619 ic = this%rptnode(ip)
620 icu = this%dis%get_nodeuser(ic)
622 call create_particle(particle)
624 if (
size(this%boundname) /= 0)
then
625 particle%name = this%boundname(ip)
631 particle%istopweaksink = this%istopweaksink
632 particle%istopzone = this%istopzone
633 particle%idrymeth = this%idrymeth
636 select type (dis => this%dis)
638 call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay)
640 call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay)
643 particle%izone = this%rptzone(ic)
648 if (this%ibound(ic) == 0)
then
651 call this%dis%highest_active(ic, this%ibound)
652 if (ic == ic_old .or. this%ibound(ic) == 0)
then
666 if (this%localz)
then
670 if (this%fmi%igwfceltyp /= 1)
then
671 write (
errmsg, fmticterr) trim(this%text)
681 top = this%fmi%dis%top(ic)
682 bot = this%fmi%dis%bot(ic)
683 if (this%fmi%gwfceltyp(icu) /= 0)
then
684 hds = this%fmi%gwfhead(ic)
688 z = bot + this%rptz(ip) * (top - bot)
693 if (this%ichkmeth > 0) &
694 call this%validate_release_point(ic, x, y, z)
699 particle%trelease = trelease
702 if (this%stoptraveltime == huge(1d0))
then
703 particle%tstop = this%stoptime
705 particle%tstop = particle%trelease + this%stoptraveltime
706 if (this%stoptime < particle%tstop) particle%tstop = this%stoptime
709 particle%ttrack = particle%trelease
716 particle%frctrn = this%frctrn
717 particle%iexmeth = this%iexmeth
718 particle%extend = this%extend
719 particle%icycwin = this%icycwin
720 particle%extol = this%extol
734 integer(I4B),
pointer :: iper, ionper, nlist
738 call mem_setptr(iper,
'IPER', this%input_mempath)
739 call mem_setptr(ionper,
'IONPER', this%input_mempath)
741 if (
kper == 1 .and. &
743 (ionper >
nper) .and. &
744 size(this%schedule%time_select%times) == 0)
then
750 if (
allocated(this%period_block_lines))
deallocate (this%period_block_lines)
751 allocate (this%period_block_lines(1))
752 this%period_block_lines(1) =
"FIRST"
754 else if (iper /=
kper)
then
759 call mem_setptr(nlist,
'NBOUND', this%input_mempath)
760 call mem_setptr(settings,
'SETTING', this%input_mempath)
763 if (
allocated(this%period_block_lines))
deallocate (this%period_block_lines)
764 allocate (this%period_block_lines(nlist))
766 this%period_block_lines(n) = settings(n)
781 real(DP),
dimension(:),
intent(in) :: hnew
782 real(DP),
dimension(:),
intent(inout) :: flowja
783 integer(I4B),
intent(in) :: imover
787 integer(I4B) :: idiag
791 if (this%nbound <= 0)
return
794 do i = 1, this%nbound
795 node = this%nodelist(i)
800 idiag = this%dis%con%ia(node)
801 rrate = this%rptm(i) * (
done /
delt)
802 flowja(idiag) = flowja(idiag) + rrate
806 this%simvals(i) = rrate
827 call this%obs%StoreObsType(
'prp', .true., indx)
832 call this%obs%StoreObsType(
'to-mvr', .true., indx)
847 character(len=LENVARNAME),
dimension(3) :: drytrack_method = &
848 &[character(len=LENVARNAME) ::
'DROP',
'STOP',
'STAY']
849 character(len=
lenvarname),
dimension(2) :: coorcheck_method = &
850 &[
character(len=LENVARNAME) ::
'NONE',
'EAGER']
851 character(len=LINELENGTH) :: trackfile, trackcsvfile, fname
853 character(len=*),
parameter :: fmtextolwrn = &
854 "('WARNING: EXIT_SOLVE_TOLERANCE is set to ',g10.3,' &
855 &which is much greater than the default value of ',g10.3,'. &
856 &The tolerance that strikes the best balance between accuracy &
857 &and runtime is problem-dependent. Since the variable being &
858 &solved varies from 0 to 1, tolerance values much less than 1 &
859 &typically give the best results.')"
862 call this%BndExtType%source_options()
865 call mem_set_value(this%stoptime,
'STOPTIME', this%input_mempath, &
868 this%input_mempath, found%stoptraveltime)
869 call mem_set_value(this%istopweaksink,
'ISTOPWEAKSINK', this%input_mempath, &
871 call mem_set_value(this%istopzone,
'ISTOPZONE', this%input_mempath, &
873 call mem_set_value(this%drape,
'DRAPE', this%input_mempath, &
875 call mem_set_value(this%idrymeth,
'IDRYMETH', this%input_mempath, &
876 drytrack_method, found%idrymeth)
877 call mem_set_value(trackfile,
'TRACKFILE', this%input_mempath, &
879 call mem_set_value(trackcsvfile,
'TRACKCSVFILE', this%input_mempath, &
881 call mem_set_value(this%localz,
'LOCALZ', this%input_mempath, &
883 call mem_set_value(this%extend,
'EXTEND', this%input_mempath, &
885 call mem_set_value(this%extol,
'EXTOL', this%input_mempath, &
887 call mem_set_value(this%rttol,
'RTTOL', this%input_mempath, &
889 call mem_set_value(this%rtfreq,
'RTFREQ', this%input_mempath, &
891 call mem_set_value(this%frctrn,
'FRCTRN', this%input_mempath, &
893 call mem_set_value(this%iexmeth,
'IEXMETH', this%input_mempath, &
895 call mem_set_value(this%ichkmeth,
'ICHKMETH', this%input_mempath, &
896 coorcheck_method, found%ichkmeth)
897 call mem_set_value(this%icycwin,
'ICYCWIN', this%input_mempath, found%icycwin)
900 if (found%idrymeth)
then
901 if (this%idrymeth == 0)
then
902 write (
errmsg,
'(a)')
'Unsupported dry tracking method. &
903 &DRY_TRACKING_METHOD must be "DROP", "STOP", or "STAY"'
907 this%idrymeth = this%idrymeth - 1
911 if (found%extol)
then
912 if (this%extol <=
dzero) &
913 call store_error(
'EXIT_SOLVE_TOLERANCE MUST BE POSITIVE')
914 if (this%extol > dem2)
then
915 write (
warnmsg, fmt=fmtextolwrn) &
921 if (found%rttol)
then
922 if (this%rttol <=
dzero) &
923 call store_error(
'RELEASE_TIME_TOLERANCE MUST BE POSITIVE')
926 if (found%rtfreq)
then
927 if (this%rtfreq <=
dzero) &
928 call store_error(
'RELEASE_TIME_FREQUENCY MUST BE POSITIVE')
931 if (found%iexmeth)
then
932 if (.not. (this%iexmeth /= 1 .or. this%iexmeth /= 2)) &
934 &1 (BRENT) OR 2 (CHANDRUPATLA)')
937 if (found%ichkmeth)
then
938 if (this%ichkmeth == 0)
then
939 write (
errmsg,
'(a)')
'Unsupported coordinate check method. &
940 &COORDINATE_CHECK_METHOD must be "NONE" or "EAGER"'
944 this%ichkmeth = this%ichkmeth - 1
948 if (found%icycwin)
then
949 if (this%icycwin < 0) &
950 call store_error(
'CYCLE_DETECTION_WINDOW MUST BE NON-NEGATIVE')
954 if (found%trackfile)
then
956 call openfile(this%itrkout, this%iout, trackfile,
'DATA(BINARY)', &
961 fname = trim(trackfile)//
'.hdr'
962 call openfile(this%itrkhdr, this%iout, fname,
'CSV', &
963 filstat_opt=
'REPLACE', mode_opt=
mnormal)
967 if (found%trackcsvfile)
then
969 call openfile(this%itrkcsv, this%iout, trackcsvfile,
'CSV', &
970 filstat_opt=
'REPLACE')
980 call this%prp_log_options(found, trackfile, trackcsvfile)
1001 character(len=*),
intent(in) :: trackfile
1002 character(len=*),
intent(in) :: trackcsvfile
1005 character(len=*),
parameter :: fmttrkbin = &
1006 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, &
1007 &'OPENED ON UNIT: ', I0)"
1008 character(len=*),
parameter :: fmttrkcsv = &
1009 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, &
1010 &'OPENED ON UNIT: ', I0)"
1012 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
1014 if (found%frctrn)
then
1015 write (this%iout,
'(4x,a)') &
1016 'IF DISV, TRACKING WILL USE THE TERNARY METHOD REGARDLESS OF CELL TYPE'
1019 if (found%trackfile)
then
1020 write (this%iout, fmttrkbin) trim(adjustl(trackfile)), this%itrkout
1023 if (found%trackcsvfile)
then
1024 write (this%iout, fmttrkcsv) trim(adjustl(trackcsvfile)), this%itrkcsv
1027 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
1040 call mem_set_value(this%nreleasepoints,
'NRELEASEPTS', this%input_mempath, &
1042 call mem_set_value(this%nreleasetimes,
'NRELEASETIMES', this%input_mempath, &
1043 found%nreleasetimes)
1045 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
1046 write (this%iout,
'(4x,a,i0)')
'NRELEASEPTS = ', this%nreleasepoints
1047 write (this%iout,
'(4x,a,i0)')
'NRELEASETIMES = ', this%nreleasetimes
1048 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
1051 this%maxbound = this%nreleasepoints
1052 this%nbound = this%nreleasepoints
1054 call this%prp_allocate_arrays()
1055 call this%prp_packagedata()
1056 call this%prp_releasetimes()
1057 call this%prp_load_releasetimefrequency()
1065 this%nreleasepoints = 0
1066 this%nreleasetimes = 0
1070 call this%prp_allocate_arrays()
1081 integer(I4B),
dimension(:),
pointer,
contiguous :: irptno
1082 integer(I4B),
dimension(:, :),
pointer,
contiguous :: cellids
1083 real(DP),
dimension(:),
pointer,
contiguous :: xrpts, yrpts, zrpts
1085 contiguous :: boundnames
1086 character(len=LENBOUNDNAME) :: bndName, bndNameTemp
1087 character(len=9) :: cno
1088 character(len=20) :: cellidstr
1089 integer(I4B),
dimension(:),
allocatable :: nboundchk
1090 integer(I4B),
dimension(:),
pointer :: cellid
1091 integer(I4B) :: n, noder, nodeu, rptno
1094 call mem_setptr(irptno,
'IRPTNO', this%input_mempath)
1095 call mem_setptr(cellids,
'CELLID', this%input_mempath)
1096 call mem_setptr(xrpts,
'XRPT', this%input_mempath)
1097 call mem_setptr(yrpts,
'YRPT', this%input_mempath)
1098 call mem_setptr(zrpts,
'ZRPT', this%input_mempath)
1099 call mem_setptr(boundnames,
'BOUNDNAME', this%input_mempath)
1102 allocate (nboundchk(this%nreleasepoints))
1103 do n = 1, this%nreleasepoints
1107 write (this%iout,
'(/1x,a)')
'PROCESSING '//trim(adjustl(this%packName)) &
1110 do n = 1,
size(irptno)
1114 if (rptno < 1 .or. rptno > this%nreleasepoints)
then
1115 write (
errmsg,
'(a,i0,a,i0,a)') &
1116 'Expected ', this%nreleasepoints,
' release points. &
1117 &Points must be numbered from 1 to ', this%nreleasepoints,
'.'
1123 nboundchk(rptno) = nboundchk(rptno) + 1
1126 cellid => cellids(:, n)
1129 if (this%dis%ndim == 1)
then
1131 elseif (this%dis%ndim == 2)
then
1132 nodeu =
get_node(cellid(1), 1, cellid(2), &
1133 this%dis%mshape(1), 1, &
1136 nodeu =
get_node(cellid(1), cellid(2), cellid(3), &
1137 this%dis%mshape(1), &
1138 this%dis%mshape(2), &
1143 noder = this%dis%get_nodenumber(nodeu, 1)
1144 if (noder <= 0)
then
1145 call this%dis%nodeu_to_string(nodeu, cellidstr)
1147 'Particle release point configured for nonexistent cell: '// &
1148 trim(adjustl(cellidstr))//
'. This cell has IDOMAIN <= 0 and '&
1149 &
'therefore does not exist in the model grid.'
1153 this%rptnode(rptno) = noder
1156 if (this%localz .and. (zrpts(n) < 0 .or. zrpts(n) > 1))
then
1157 call store_error(
'Local z coordinate must fall in the interval [0, 1]')
1162 this%rptx(rptno) = xrpts(n)
1163 this%rpty(rptno) = yrpts(n)
1164 this%rptz(rptno) = zrpts(n)
1167 write (cno,
'(i9.9)') rptno
1168 bndname =
'PRP'//cno
1171 if (this%inamedbound /= 0)
then
1172 bndnametemp = boundnames(n)
1173 if (bndnametemp /=
'') bndname = bndnametemp
1179 this%rptname(rptno) = bndname
1182 write (this%iout,
'(1x,a)') &
1183 'END OF '//trim(adjustl(this%packName))//
' PACKAGEDATA'
1186 do n = 1, this%nreleasepoints
1187 if (nboundchk(n) == 0)
then
1188 write (
errmsg,
'(a,a,1x,i0,a)')
'No data specified for particle ', &
1189 'release point', n,
'.'
1191 else if (nboundchk(n) > 1)
then
1192 write (
errmsg,
'(a,1x,i0,1x,a,1x,i0,1x,a)') &
1193 'Data for particle release point', n,
'specified', nboundchk(n), &
1205 deallocate (nboundchk)
1214 real(DP),
dimension(:),
pointer,
contiguous :: time
1215 integer(I4B) :: n, isize
1216 real(DP),
allocatable :: times(:)
1218 if (this%nreleasetimes <= 0)
return
1221 allocate (times(this%nreleasetimes))
1224 call get_isize(
'TIME', this%input_mempath, isize)
1226 if (isize <= 0)
then
1227 errmsg =
"RELEASTIMES block expected when &
1228 &NRELEASETIMES dimension is non-zero."
1234 call mem_setptr(time,
'TIME', this%input_mempath)
1237 do n = 1,
size(time)
1242 call this%schedule%time_select%extend(times)
1245 if (.not. this%schedule%time_select%increasing())
then
1246 errmsg =
"RELEASTIMES block entries must strictly increase."
1262 real(DP),
allocatable :: times(:)
1265 if (this%rtfreq <=
dzero)
return
1274 call this%schedule%time_select%extend(times)
1277 if (.not. this%schedule%time_select%increasing())
then
1278 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 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_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.