37 character(len=LENFTYPE) ::
ftype =
'PRP'
38 character(len=16) ::
text =
' PRP'
46 integer(I4B),
pointer :: nreleasepoints => null()
47 integer(I4B),
pointer :: nreleasetimes => null()
48 integer(I4B),
pointer :: nparticles => null()
49 integer(I4B),
pointer :: istopweaksink => null()
50 integer(I4B),
pointer :: istopzone => null()
51 integer(I4B),
pointer :: idrape => null()
52 integer(I4B),
pointer :: idrymeth => null()
53 integer(I4B),
pointer :: itrkout => null()
54 integer(I4B),
pointer :: itrkhdr => null()
55 integer(I4B),
pointer :: itrkcsv => null()
56 integer(I4B),
pointer :: irlstls => null()
57 integer(I4B),
pointer :: ilocalz => null()
58 integer(I4B),
pointer :: iextend => null()
59 integer(I4B),
pointer :: ifrctrn => null()
60 integer(I4B),
pointer :: iexmeth => null()
61 real(dp),
pointer :: extol => null()
62 real(dp),
pointer :: rttol => null()
63 real(dp),
pointer :: rtfreq => null()
64 real(dp),
pointer :: offset => null()
65 real(dp),
pointer :: stoptime => null()
66 real(dp),
pointer :: stoptraveltime => null()
67 logical(LGP),
pointer :: foundtol => 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()
101 subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, &
104 class(
bndtype),
pointer :: packobj
105 integer(I4B),
intent(in) :: id
106 integer(I4B),
intent(in) :: ibcnum
107 integer(I4B),
intent(in) :: inunit
108 integer(I4B),
intent(in) :: iout
109 character(len=*),
intent(in) :: namemodel
110 character(len=*),
intent(in) :: pakname
115 character(len=*),
parameter :: fmtheader = &
116 "(1x, /1x, 'PRP PARTICLE RELEASE POINT PACKAGE', &
117 &' INPUT READ FROM UNIT ', i0, /)"
124 call packobj%set_names(ibcnum, namemodel, pakname,
ftype)
128 call prpobj%prp_allocate_scalars()
131 call packobj%pack_initialize()
133 packobj%inunit = inunit
136 packobj%ibcnum = ibcnum
144 if (inunit > 0)
write (iout, fmtheader) inunit
152 call this%BndType%bnd_da()
187 call this%particles%deallocate(this%memoryPath)
188 call this%schedule%deallocate()
189 deallocate (this%particles)
190 deallocate (this%schedule)
196 integer(I4B),
dimension(:),
pointer,
contiguous :: ibound
197 integer(I4B),
dimension(:),
pointer,
contiguous :: izone
200 this%ibound => ibound
201 this%rptzone => izone
202 this%trackctl => trackctl
209 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
210 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
218 this%nreleasepoints, &
222 call mem_allocate(this%rptx, this%nreleasepoints,
'RPTX', this%memoryPath)
223 call mem_allocate(this%rpty, this%nreleasepoints,
'RPTY', this%memoryPath)
224 call mem_allocate(this%rptz, this%nreleasepoints,
'RPTZ', this%memoryPath)
225 call mem_allocate(this%rptm, this%nreleasepoints,
'RPTMASS', this%memoryPath)
226 call mem_allocate(this%rptnode, this%nreleasepoints,
'RPTNODER', &
229 'RPTNAME', this%memoryPath)
232 do nps = 1, this%nreleasepoints
233 this%rptm(nps) =
dzero
242 call this%BndType%allocate_scalars()
245 call mem_allocate(this%ilocalz,
'ILOCALZ', this%memoryPath)
246 call mem_allocate(this%iextend,
'IEXTEND', this%memoryPath)
247 call mem_allocate(this%offset,
'OFFSET', this%memoryPath)
248 call mem_allocate(this%stoptime,
'STOPTIME', this%memoryPath)
249 call mem_allocate(this%stoptraveltime,
'STOPTRAVELTIME', this%memoryPath)
250 call mem_allocate(this%istopweaksink,
'ISTOPWEAKSINK', this%memoryPath)
251 call mem_allocate(this%istopzone,
'ISTOPZONE', this%memoryPath)
252 call mem_allocate(this%idrape,
'IDRAPE', this%memoryPath)
253 call mem_allocate(this%idrymeth,
'IDRYMETH', this%memoryPath)
254 call mem_allocate(this%nreleasepoints,
'NRELEASEPOINTS', this%memoryPath)
255 call mem_allocate(this%nreleasetimes,
'NRELEASETIMES', this%memoryPath)
256 call mem_allocate(this%nparticles,
'NPARTICLES', this%memoryPath)
257 call mem_allocate(this%itrkout,
'ITRKOUT', this%memoryPath)
258 call mem_allocate(this%itrkhdr,
'ITRKHDR', this%memoryPath)
259 call mem_allocate(this%itrkcsv,
'ITRKCSV', this%memoryPath)
260 call mem_allocate(this%irlstls,
'IRLSTLS', this%memoryPath)
261 call mem_allocate(this%ifrctrn,
'IFRCTRN', this%memoryPath)
262 call mem_allocate(this%iexmeth,
'IEXMETH', this%memoryPath)
265 call mem_allocate(this%rtfreq,
'RTFREQ', this%memoryPath)
266 call mem_allocate(this%foundtol,
'FOUNDTOL', this%memoryPath)
272 this%stoptime = huge(1d0)
273 this%stoptraveltime = huge(1d0)
274 this%istopweaksink = 0
278 this%nreleasepoints = 0
279 this%nreleasetimes = 0
290 this%foundtol = .false.
301 call this%obs%obs_ar()
302 call this%BndType%allocate_arrays()
303 if (this%inamedbound /= 0)
then
304 do n = 1, this%nreleasepoints
305 this%boundname(n) = this%rptname(n)
308 do n = 1, this%nreleasepoints
309 this%nodelist(n) = this%rptnode(n)
316 integer(I4B) :: ip, it
328 do ip = 1, this%nreleasepoints
329 this%rptm(ip) =
dzero
334 call this%schedule%advance()
335 if (.not. this%schedule%any())
return
338 call this%log_release()
342 call this%particles%resize( &
343 this%particles%num_stored() + &
344 (this%nreleasepoints * this%schedule%count()), &
349 do ip = 1, this%nreleasepoints
350 do it = 1, this%schedule%count()
351 call this%release(ip, this%schedule%times(it))
359 if (this%iprpak > 0)
then
360 write (this%iout,
"(1x,/1x,a,1x,i0)") &
361 'PARTICLE RELEASE FOR PRP', this%ibcnum
362 call this%schedule%log(this%iout)
374 integer(I4B),
intent(in) :: ic
375 real(DP),
intent(in) :: x, y, z
377 real(DP),
allocatable :: polyverts(:, :)
379 call this%fmi%dis%get_polyverts(ic, polyverts)
381 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
382 'Error: release point (x=', x,
', y=', y,
') is not in cell ', &
383 this%dis%get_nodeuser(ic)
387 if (z > maxval(this%dis%top))
then
388 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
389 'Error: release point (z=', z,
') is above grid top ', &
393 else if (z < minval(this%dis%bot))
then
394 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
395 'Error: release point (z=', z,
') is below grid bottom ', &
400 deallocate (polyverts)
418 integer(I4B),
intent(in) :: ip
419 real(DP),
intent(in) :: trelease
424 call this%initialize_particle(particle, ip, trelease)
427 np = this%nparticles + 1
431 call this%particles%save_particle(particle, np)
432 deallocate (particle)
435 this%rptm(ip) = this%rptm(ip) +
done
442 integer(I4B),
intent(in) :: ip
443 real(DP),
intent(in) :: trelease
445 integer(I4B) :: irow, icol, ilay, icpl
446 integer(I4B) :: ic, icu, ic_old
448 real(DP) :: top, bot, hds
450 ic = this%rptnode(ip)
451 icu = this%dis%get_nodeuser(ic)
455 if (
size(this%boundname) /= 0)
then
456 particle%name = this%boundname(ip)
462 particle%istopweaksink = this%istopweaksink
463 particle%istopzone = this%istopzone
464 particle%idrymeth = this%idrymeth
467 select type (dis => this%dis)
469 call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay)
471 call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay)
474 particle%izone = this%rptzone(ic)
480 if (this%ibound(ic) == 0)
then
482 if (this%idrape > 0)
then
483 call this%dis%highest_active(ic, this%ibound)
484 if (ic == ic_old .or. this%ibound(ic) == 0) &
494 if (this%ilocalz > 0)
then
495 top = this%fmi%dis%top(ic)
496 bot = this%fmi%dis%bot(ic)
497 hds = this%fmi%gwfhead(ic)
498 z = bot + this%rptz(ip) * (hds - bot)
503 call this%validate_release_point(ic, x, y, z)
508 particle%trelease = trelease
511 if (this%stoptraveltime == huge(1d0))
then
512 particle%tstop = this%stoptime
514 particle%tstop = particle%trelease + this%stoptraveltime
515 if (this%stoptime < particle%tstop) particle%tstop = this%stoptime
518 particle%ttrack = particle%trelease
519 particle%idomain(1) = 0
520 particle%iboundary(1) = 0
521 particle%idomain(2) = ic
522 particle%iboundary(2) = 0
523 particle%idomain(3) = 0
524 particle%iboundary(3) = 0
525 particle%ifrctrn = this%ifrctrn
526 particle%iexmeth = this%iexmeth
527 particle%iextend = this%iextend
528 particle%extol = this%extol
540 logical(LGP) :: is_found
541 logical(LGP) :: end_of_block
542 logical(LGP) :: no_blocks
543 character(len=LINELENGTH) :: line
544 character(len=LINELENGTH),
allocatable :: lines(:)
546 character(len=*),
parameter :: fmtblkerr = &
547 "('Looking for BEGIN PERIOD iper. &
548 &Found ', a, ' instead.')"
549 character(len=*),
parameter :: fmt_steps = &
550 "(6x,'TIME STEP(S) ',50(I0,' '))"
551 character(len=*),
parameter :: fmt_freq = &
552 "(6x,'EVERY ',I0,' TIME STEP(S)')"
553 character(len=*),
parameter :: fmt_fracs = &
558 if (this%inunit == 0)
return
562 if (this%ionper <
kper)
then
564 call this%parser%GetBlock(
'PERIOD', is_found, ierr, &
565 supportopenclose=.true., &
566 blockrequired=.false.)
569 call this%read_check_ionper()
578 this%ionper =
nper + 1
582 call this%parser%GetCurrentLine(line)
583 write (
errmsg, fmtblkerr) adjustl(trim(line))
593 if (no_blocks .and. &
595 size(this%schedule%time_select%times) == 0)
then
599 call this%schedule%advance(lines=lines)
600 else if (this%ionper ==
kper)
then
606 call this%parser%GetNextLine(end_of_block)
607 if (end_of_block)
exit recordloop
608 call this%parser%GetCurrentLine(line)
610 lines(
size(lines)) = line
612 if (
size(lines) > 0) &
613 call this%schedule%advance(lines=lines)
625 real(DP),
dimension(:),
intent(in) :: hnew
626 real(DP),
dimension(:),
intent(inout) :: flowja
627 integer(I4B),
intent(in) :: imover
631 integer(I4B) :: idiag
635 if (this%nbound <= 0)
return
638 do i = 1, this%nbound
639 node = this%nodelist(i)
644 idiag = this%dis%con%ia(node)
645 rrate = this%rptm(i) * (
done /
delt)
646 flowja(idiag) = flowja(idiag) + rrate
650 this%simvals(i) = rrate
671 call this%obs%StoreObsType(
'prp', .true., indx)
676 call this%obs%StoreObsType(
'to-mvr', .true., indx)
688 character(len=*),
intent(inout) :: option
689 logical(LGP),
intent(inout) :: found
691 character(len=MAXCHARLEN) :: fname
692 character(len=MAXCHARLEN) :: keyword
694 character(len=*),
parameter :: fmttrkbin = &
695 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, &
696 &'OPENED ON UNIT: ', I0)"
697 character(len=*),
parameter :: fmttrkcsv = &
698 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, &
699 &'OPENED ON UNIT: ', I0)"
703 this%stoptime = this%parser%GetDouble()
705 case (
'STOPTRAVELTIME')
706 this%stoptraveltime = this%parser%GetDouble()
708 case (
'STOP_AT_WEAK_SINK')
709 this%istopweaksink = 1
712 this%istopzone = this%parser%GetInteger()
717 case (
'DRY_TRACKING_METHOD')
718 call this%parser%GetStringCaps(keyword)
719 select case (keyword)
727 write (
errmsg,
'(a, a)') &
728 'Unknown dry tracking method: ', trim(keyword)
730 write (
errmsg,
'(a, a)') &
731 'DRY must be "DROP", "STOP" or "STAY"'
733 call this%parser%StoreErrorUnit()
737 call this%parser%GetStringCaps(keyword)
738 if (keyword ==
'FILEOUT')
then
740 call this%parser%GetString(fname)
743 call openfile(this%itrkout, this%iout, fname,
'DATA(BINARY)', &
746 write (this%iout, fmttrkbin) trim(adjustl(fname)), this%itrkout
749 fname = trim(fname)//
'.hdr'
750 call openfile(this%itrkhdr, this%iout, fname,
'CSV', &
751 filstat_opt=
'REPLACE', mode_opt=mnormal)
754 call store_error(
'OPTIONAL TRACK KEYWORD MUST BE '// &
755 'FOLLOWED BY FILEOUT')
759 call this%parser%GetStringCaps(keyword)
760 if (keyword ==
'FILEOUT')
then
762 call this%parser%GetString(fname)
765 call openfile(this%itrkcsv, this%iout, fname,
'CSV', &
766 filstat_opt=
'REPLACE')
767 write (this%iout, fmttrkcsv) trim(adjustl(fname)), this%itrkcsv
770 call store_error(
'OPTIONAL TRACKCSV KEYWORD MUST BE &
771 &FOLLOWED BY FILEOUT')
777 case (
'EXTEND_TRACKING')
780 case (
'EXIT_SOLVE_TOLERANCE')
781 this%extol = this%parser%GetDouble()
782 if (this%extol <=
dzero) &
783 call store_error(
'EXIT_SOLVE_TOLERANCE MUST BE POSITIVE')
785 this%foundtol = .true.
786 case (
'RELEASE_TIME_TOLERANCE')
787 this%rttol = this%parser%GetDouble()
788 if (this%rttol <=
dzero) &
789 call store_error(
'RELEASE_TIME_TOLERANCE MUST BE POSITIVE')
791 case (
'RELEASE_TIME_FREQUENCY')
792 this%rtfreq = this%parser%GetDouble()
793 if (this%rtfreq <=
dzero) &
794 call store_error(
'RELEASE_TIME_FREQUENCY MUST BE POSITIVE')
796 case (
'DEV_FORCETERNARY')
797 call this%parser%DevOpt()
799 write (this%iout,
'(4x,a)') &
800 'TRACKING WILL BE DONE USING THE TERNARY METHOD REGARDLESS OF CELL TYPE'
802 case (
'DEV_EXIT_SOLVE_METHOD')
803 call this%parser%DevOpt()
804 this%iexmeth = this%parser%GetInteger()
805 if (.not. (this%iexmeth /= 1 .or. this%iexmeth /= 2)) &
807 &1 (BRENT) OR 2 (CHANDRUPATLA)')
814 if (.not. found)
then
815 errmsg =
"UNKNOWN PRP OPTION '"//trim(keyword)//
"'."
817 call this%parser%StoreErrorUnit()
831 character(len=LINELENGTH) :: errmsg, keyword
833 logical :: isfound, endOfBlock
835 if (.not. this%foundtol) &
836 call store_error(
'EXIT_SOLVE_TOLERANCE MISSING, VALUE REQUIRED')
839 call this%parser%GetBlock(
'DIMENSIONS', isfound, ierr, &
840 supportopenclose=.true.)
844 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
846 call this%parser%GetNextLine(endofblock)
848 call this%parser%GetStringCaps(keyword)
849 select case (keyword)
851 this%nreleasepoints = this%parser%GetInteger()
852 case (
'NRELEASETIMES')
853 this%nreleasetimes = this%parser%GetInteger()
856 '(4x,a,a)')
'****ERROR. UNKNOWN PARTICLE INPUT DIMENSION: ', &
859 call this%parser%StoreErrorUnit()
862 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
864 call store_error(
'ERROR. REQUIRED DIMENSIONS BLOCK NOT FOUND.')
868 this%maxbound = this%nreleasepoints
869 this%nbound = this%nreleasepoints
872 call this%prp_allocate_arrays()
875 call this%prp_read_packagedata()
876 call this%prp_read_releasetimes()
877 call this%prp_load_releasetimefrequency()
885 character(len=LINELENGTH) :: cellid
886 character(len=LENBOUNDNAME) :: bndName, bndNameTemp
887 character(len=9) :: cno
889 logical :: endOfBlock
893 character(len=LENBOUNDNAME),
dimension(:),
allocatable :: nametxt
894 integer(I4B),
dimension(:),
allocatable :: nboundchk
895 integer(I4B),
dimension(:),
allocatable :: noder
896 real(DP),
dimension(:),
allocatable :: x
897 real(DP),
dimension(:),
allocatable :: y
898 real(DP),
dimension(:),
allocatable :: z
899 real(DP),
dimension(:),
allocatable :: tstop
901 character(len=*),
parameter :: fmttend = &
902 "('end time (', G0, ') must be greater than or equal to the &
903 &begin time (', G0, ').')"
906 allocate (noder(this%nreleasepoints))
907 allocate (x(this%nreleasepoints))
908 allocate (y(this%nreleasepoints))
909 allocate (z(this%nreleasepoints))
910 allocate (tstop(this%nreleasepoints))
911 allocate (nametxt(this%nreleasepoints))
912 allocate (nboundchk(this%nreleasepoints))
915 do n = 1, this%nreleasepoints
921 call this%parser%GetBlock(
'PACKAGEDATA', isfound, ierr, &
922 supportopenclose=.true.)
926 write (this%iout,
'(/1x,a)')
'PROCESSING '//trim(adjustl(this%packName)) &
929 call this%parser%GetNextLine(endofblock)
931 ival = this%parser%GetInteger()
934 if (n < 1 .or. n > this%nreleasepoints)
then
935 write (
errmsg,
'(a,1x,i0,a)') &
936 'Release point number must be greater than 0 and less than', &
937 'or equal to', this%nreleasepoints,
'.'
943 nboundchk(n) = nboundchk(n) + 1
946 call this%parser%GetCellid(this%dis%ndim, cellid)
947 noder(n) = this%dis%noder_from_cellid(cellid, this%inunit, this%iout)
950 x(n) = this%parser%GetDouble()
951 y(n) = this%parser%GetDouble()
952 z(n) = this%parser%GetDouble()
954 if (this%ilocalz > 0 .and. (z(n) < 0 .or. z(n) > 1))
then
955 call store_error(
'Local z coordinate must fall in the interval [0, 1]')
960 write (cno,
'(i9.9)') n
964 if (this%inamedbound /= 0)
then
965 call this%parser%GetStringCaps(bndnametemp)
966 if (bndnametemp /=
'') &
967 bndname = bndnametemp
976 write (this%iout,
'(1x,a)') &
977 'END OF '//trim(adjustl(this%packName))//
' PACKAGEDATA'
980 do n = 1, this%nreleasepoints
981 if (nboundchk(n) == 0)
then
982 write (
errmsg,
'(a,a,1x,i0,a)')
'No data specified for particle ', &
983 'release point', n,
'.'
985 else if (nboundchk(n) > 1)
then
986 write (
errmsg,
'(a,1x,i0,1x,a,1x,i0,1x,a)') &
987 'Data for particle release point', n,
'specified', nboundchk(n), &
993 call store_error(
'Required packagedata block not found.')
998 call this%parser%StoreErrorUnit()
1002 do n = 1, this%nreleasepoints
1003 this%rptnode(n) = noder(n)
1007 this%rptname(n) = nametxt(n)
1016 deallocate (nametxt)
1017 deallocate (nboundchk)
1025 integer(I4B) :: i, ierr
1026 logical(LGP) :: eob, found, success
1028 real(DP),
allocatable :: times(:)
1031 call this%parser%GetBlock(
'RELEASETIMES', found, ierr, &
1032 supportopenclose=.true., &
1033 blockrequired=.false.)
1037 if (.not. found)
then
1038 if (this%nreleasetimes <= 0)
return
1039 write (
errmsg,
'(a, i0)') &
1040 "Expected RELEASETIMES with length ", this%nreleasetimes
1042 call this%parser%StoreErrorUnit(terminate=.true.)
1046 allocate (times(this%nreleasetimes))
1049 write (this%iout,
'(/1x,a)') &
1050 'PROCESSING '//trim(adjustl(this%text))//
' RELEASETIMES'
1051 do i = 1, this%nreleasetimes
1052 call this%parser%GetNextLine(eob)
1054 call this%parser%TryGetDouble(t, success)
1055 if (.not. success)
then
1056 errmsg =
"Failed to read double precision value"
1058 call this%parser%StoreErrorUnit(terminate=.true.)
1064 call this%schedule%time_select%extend(times)
1067 if (.not. this%schedule%time_select%increasing())
then
1068 errmsg =
"Release times must strictly increase"
1070 call this%parser%StoreErrorUnit(terminate=.true.)
1085 real(DP),
allocatable :: times(:)
1088 if (this%rtfreq <=
dzero)
return
1097 call this%schedule%time_select%extend(times)
1100 if (.not. this%schedule%time_select%increasing())
then
1101 errmsg =
"Release times must strictly increase"
1103 call this%parser%StoreErrorUnit(terminate=.true.)
This module contains block parser methods.
This module contains the base boundary package.
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 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
integer(i4b), parameter maxcharlen
maximum length of char string
real(dp), parameter done
real constant 1
subroutine pstop(status, message)
Stop the program, optionally specifying an error status code.
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.
This module contains the derived type ObsType.
subroutine, public defaultobsidprocessor(obsrv, dis, inunitobs, iout)
@ brief Process IDstring provided for each observation
subroutine, public allocate_particle_store(this, np, mempath)
Create a new particle store.
subroutine, public create_particle(particle)
Create a new particle.
subroutine prp_set_pointers(this, ibound, izone, trackctl)
@ brief Set pointers to model variables
subroutine prp_allocate_arrays(this, nodelist, auxvar)
Allocate arrays.
subroutine prp_rp(this)
@ brief Read and prepare period data for particle input
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 prp_read_dimensions(this)
Read package dimensions.
character(len=lenftype) ftype
subroutine prp_read_releasetimes(this)
Load explicitly specified release times.
subroutine prp_df_obs(this)
Store supported observations.
subroutine, public prp_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, fmi)
Create a new particle release point package.
subroutine define_listlabel(this)
subroutine log_release(this)
Log the release scheduled for this time step.
subroutine prp_ad(this)
Advance a time step and release particles if scheduled.
subroutine prp_allocate_scalars(this)
Allocate scalars.
subroutine initialize_particle(this, particle, ip, trelease)
subroutine prp_da(this)
Deallocate memory.
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 prp_read_packagedata(this)
Load package data (release points).
subroutine validate_release_point(this, ic, x, y, z)
Verify that the release point is in the cell.
subroutine prp_options(this, option, found)
Set options specific to PrtPrpType.
Particle release scheduling.
type(releasescheduletype) function, pointer, public create_release_schedule(tol)
Create a new release schedule object.
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_unit(iunit, terminate)
Store the file unit number.
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
character(len=maxcharlen) warnmsg
warning message string
subroutine, public table_cr(this, name, title)
real(dp), pointer, public totalsimtime
time at end of simulation
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
type(timeserieslinktype) function, pointer, public gettimeserieslinkfromlist(list, indx)
Get time series link from a list.
character(len= *), parameter, public trackdtypes
character(len= *), parameter, public trackheader
Structured grid discretization.
Vertex grid discretization.
Structure of arrays to store particles.
Particle tracked by the PRT model.
Particle release point (PRP) package.
Particle release scheduling utility.
Manages particle track (i.e. pathline) files.