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 integer(I4B),
pointer,
contiguous :: rptnode(:) => null()
68 integer(I4B),
pointer,
contiguous :: rptzone(:) => null()
69 real(dp),
pointer,
contiguous :: rptx(:) => null()
70 real(dp),
pointer,
contiguous :: rpty(:) => null()
71 real(dp),
pointer,
contiguous :: rptz(:) => null()
72 real(dp),
pointer,
contiguous :: rptm(:) => null()
73 character(len=LENBOUNDNAME),
pointer,
contiguous :: rptname(:) => null()
100 subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, &
103 class(
bndtype),
pointer :: packobj
104 integer(I4B),
intent(in) :: id
105 integer(I4B),
intent(in) :: ibcnum
106 integer(I4B),
intent(in) :: inunit
107 integer(I4B),
intent(in) :: iout
108 character(len=*),
intent(in) :: namemodel
109 character(len=*),
intent(in) :: pakname
114 character(len=*),
parameter :: fmtheader = &
115 "(1x, /1x, 'PRP PARTICLE RELEASE POINT PACKAGE', &
116 &' INPUT READ FROM UNIT ', i0, /)"
123 call packobj%set_names(ibcnum, namemodel, pakname,
ftype)
127 call prpobj%prp_allocate_scalars()
130 call packobj%pack_initialize()
132 packobj%inunit = inunit
135 packobj%ibcnum = ibcnum
143 if (inunit > 0)
write (iout, fmtheader) inunit
151 call this%BndType%bnd_da()
185 call this%particles%destroy(this%memoryPath)
186 call this%schedule%deallocate()
187 deallocate (this%particles)
188 deallocate (this%schedule)
194 integer(I4B),
dimension(:),
pointer,
contiguous :: ibound
195 integer(I4B),
dimension(:),
pointer,
contiguous :: izone
198 this%ibound => ibound
199 this%rptzone => izone
200 this%trackctl => trackctl
207 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
208 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
216 this%nreleasepoints, &
220 call mem_allocate(this%rptx, this%nreleasepoints,
'RPTX', this%memoryPath)
221 call mem_allocate(this%rpty, this%nreleasepoints,
'RPTY', this%memoryPath)
222 call mem_allocate(this%rptz, this%nreleasepoints,
'RPTZ', this%memoryPath)
223 call mem_allocate(this%rptm, this%nreleasepoints,
'RPTMASS', this%memoryPath)
224 call mem_allocate(this%rptnode, this%nreleasepoints,
'RPTNODER', &
227 'RPTNAME', this%memoryPath)
230 do nps = 1, this%nreleasepoints
231 this%rptm(nps) =
dzero
240 call this%BndType%allocate_scalars()
243 call mem_allocate(this%ilocalz,
'ILOCALZ', this%memoryPath)
244 call mem_allocate(this%iextend,
'IEXTEND', this%memoryPath)
245 call mem_allocate(this%offset,
'OFFSET', this%memoryPath)
246 call mem_allocate(this%stoptime,
'STOPTIME', this%memoryPath)
247 call mem_allocate(this%stoptraveltime,
'STOPTRAVELTIME', this%memoryPath)
248 call mem_allocate(this%istopweaksink,
'ISTOPWEAKSINK', this%memoryPath)
249 call mem_allocate(this%istopzone,
'ISTOPZONE', this%memoryPath)
250 call mem_allocate(this%idrape,
'IDRAPE', this%memoryPath)
251 call mem_allocate(this%idrymeth,
'IDRYMETH', this%memoryPath)
252 call mem_allocate(this%nreleasepoints,
'NRELEASEPOINTS', this%memoryPath)
253 call mem_allocate(this%nreleasetimes,
'NRELEASETIMES', this%memoryPath)
254 call mem_allocate(this%nparticles,
'NPARTICLES', this%memoryPath)
255 call mem_allocate(this%itrkout,
'ITRKOUT', this%memoryPath)
256 call mem_allocate(this%itrkhdr,
'ITRKHDR', this%memoryPath)
257 call mem_allocate(this%itrkcsv,
'ITRKCSV', this%memoryPath)
258 call mem_allocate(this%irlstls,
'IRLSTLS', this%memoryPath)
259 call mem_allocate(this%ifrctrn,
'IFRCTRN', this%memoryPath)
260 call mem_allocate(this%iexmeth,
'IEXMETH', this%memoryPath)
263 call mem_allocate(this%rtfreq,
'RTFREQ', this%memoryPath)
269 this%stoptime = huge(1d0)
270 this%stoptraveltime = huge(1d0)
271 this%istopweaksink = 0
275 this%nreleasepoints = 0
276 this%nreleasetimes = 0
297 call this%obs%obs_ar()
298 call this%BndType%allocate_arrays()
299 if (this%inamedbound /= 0)
then
300 do n = 1, this%nreleasepoints
301 this%boundname(n) = this%rptname(n)
304 do n = 1, this%nreleasepoints
305 this%nodelist(n) = this%rptnode(n)
313 integer(I4B) :: ip, it
326 do ip = 1, this%nreleasepoints
327 this%rptm(ip) =
dzero
332 call this%schedule%advance()
333 if (.not. this%schedule%any())
return
336 call this%log_release()
340 call this%particles%resize( &
341 this%particles%num_stored() + &
342 (this%nreleasepoints * this%schedule%count()), &
347 do ip = 1, this%nreleasepoints
348 do it = 1, this%schedule%count()
349 t = this%schedule%times(it)
354 'Skipping negative release time (t=', t,
').'
359 'Skipping release time falling after the end of the &
360 &simulation (t=', t,
'). Enable EXTEND_TRACKING to &
361 &release particles after the simulation end time.'
365 call this%release(ip, t)
373 if (this%iprpak > 0)
then
374 write (this%iout,
"(1x,/1x,a,1x,i0)") &
375 'PARTICLE RELEASE FOR PRP', this%ibcnum
376 call this%schedule%log(this%iout)
388 integer(I4B),
intent(in) :: ic
389 real(DP),
intent(in) :: x, y, z
391 real(DP),
allocatable :: polyverts(:, :)
393 call this%fmi%dis%get_polyverts(ic, polyverts)
395 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
396 'Error: release point (x=', x,
', y=', y,
') is not in cell ', &
397 this%dis%get_nodeuser(ic)
401 if (z > maxval(this%dis%top))
then
402 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
403 'Error: release point (z=', z,
') is above grid top ', &
407 else if (z < minval(this%dis%bot))
then
408 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
409 'Error: release point (z=', z,
') is below grid bottom ', &
414 deallocate (polyverts)
432 integer(I4B),
intent(in) :: ip
433 real(DP),
intent(in) :: trelease
438 call this%initialize_particle(particle, ip, trelease)
439 np = this%nparticles + 1
441 call this%particles%put(particle, np)
442 deallocate (particle)
443 this%rptm(ip) = this%rptm(ip) +
done
451 integer(I4B),
intent(in) :: ip
452 real(DP),
intent(in) :: trelease
454 integer(I4B) :: irow, icol, ilay, icpl
455 integer(I4B) :: ic, icu, ic_old
457 real(DP) :: top, bot, hds
459 ic = this%rptnode(ip)
460 icu = this%dis%get_nodeuser(ic)
462 call create_particle(particle)
464 if (
size(this%boundname) /= 0)
then
465 particle%name = this%boundname(ip)
471 particle%istopweaksink = this%istopweaksink
472 particle%istopzone = this%istopzone
473 particle%idrymeth = this%idrymeth
476 select type (dis => this%dis)
478 call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay)
480 call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay)
483 particle%izone = this%rptzone(ic)
488 if (this%ibound(ic) == 0)
then
490 if (this%idrape > 0)
then
491 call this%dis%highest_active(ic, this%ibound)
492 if (ic == ic_old .or. this%ibound(ic) == 0)
then
506 if (this%ilocalz > 0)
then
507 top = this%fmi%dis%top(ic)
508 bot = this%fmi%dis%bot(ic)
509 hds = this%fmi%gwfhead(ic)
510 z = bot + this%rptz(ip) * (hds - bot)
515 call this%validate_release_point(ic, x, y, z)
520 particle%trelease = trelease
523 if (this%stoptraveltime == huge(1d0))
then
524 particle%tstop = this%stoptime
526 particle%tstop = particle%trelease + this%stoptraveltime
527 if (this%stoptime < particle%tstop) particle%tstop = this%stoptime
530 particle%ttrack = particle%trelease
531 particle%idomain(1) = 0
532 particle%iboundary(1) = 0
533 particle%idomain(2) = ic
534 particle%iboundary(2) = 0
535 particle%idomain(3) = 0
536 particle%iboundary(3) = 0
537 particle%ifrctrn = this%ifrctrn
538 particle%iexmeth = this%iexmeth
539 particle%iextend = this%iextend
540 particle%extol = this%extol
552 logical(LGP) :: is_found
553 logical(LGP) :: end_of_block
554 logical(LGP) :: no_blocks
555 character(len=LINELENGTH) :: line
556 character(len=LINELENGTH),
allocatable :: lines(:)
558 character(len=*),
parameter :: fmtblkerr = &
559 "('Looking for BEGIN PERIOD iper. &
560 &Found ', a, ' instead.')"
561 character(len=*),
parameter :: fmt_steps = &
562 "(6x,'TIME STEP(S) ',50(I0,' '))"
563 character(len=*),
parameter :: fmt_freq = &
564 "(6x,'EVERY ',I0,' TIME STEP(S)')"
565 character(len=*),
parameter :: fmt_fracs = &
570 if (this%inunit == 0)
return
574 if (this%ionper <
kper)
then
576 call this%parser%GetBlock(
'PERIOD', is_found, ierr, &
577 supportopenclose=.true., &
578 blockrequired=.false.)
581 call this%read_check_ionper()
590 this%ionper =
nper + 1
594 call this%parser%GetCurrentLine(line)
595 write (
errmsg, fmtblkerr) adjustl(trim(line))
605 if (no_blocks .and. &
607 size(this%schedule%time_select%times) == 0)
then
611 call this%schedule%advance(lines=lines)
612 else if (this%ionper ==
kper)
then
618 call this%parser%GetNextLine(end_of_block)
619 if (end_of_block)
exit recordloop
620 call this%parser%GetCurrentLine(line)
622 lines(
size(lines)) = line
624 if (
size(lines) > 0) &
625 call this%schedule%advance(lines=lines)
637 real(DP),
dimension(:),
intent(in) :: hnew
638 real(DP),
dimension(:),
intent(inout) :: flowja
639 integer(I4B),
intent(in) :: imover
643 integer(I4B) :: idiag
647 if (this%nbound <= 0)
return
650 do i = 1, this%nbound
651 node = this%nodelist(i)
656 idiag = this%dis%con%ia(node)
657 rrate = this%rptm(i) * (
done /
delt)
658 flowja(idiag) = flowja(idiag) + rrate
662 this%simvals(i) = rrate
683 call this%obs%StoreObsType(
'prp', .true., indx)
688 call this%obs%StoreObsType(
'to-mvr', .true., indx)
700 character(len=*),
intent(inout) :: option
701 logical(LGP),
intent(inout) :: found
703 character(len=MAXCHARLEN) :: fname
704 character(len=MAXCHARLEN) :: keyword
706 character(len=*),
parameter :: fmttrkbin = &
707 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, &
708 &'OPENED ON UNIT: ', I0)"
709 character(len=*),
parameter :: fmttrkcsv = &
710 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, &
711 &'OPENED ON UNIT: ', I0)"
715 this%stoptime = this%parser%GetDouble()
717 case (
'STOPTRAVELTIME')
718 this%stoptraveltime = this%parser%GetDouble()
720 case (
'STOP_AT_WEAK_SINK')
721 this%istopweaksink = 1
724 this%istopzone = this%parser%GetInteger()
729 case (
'DRY_TRACKING_METHOD')
730 call this%parser%GetStringCaps(keyword)
731 select case (keyword)
739 write (
errmsg,
'(a, a)') &
740 'Unknown dry tracking method: ', trim(keyword)
742 write (
errmsg,
'(a, a)') &
743 'DRY must be "DROP", "STOP" or "STAY"'
745 call this%parser%StoreErrorUnit()
749 call this%parser%GetStringCaps(keyword)
750 if (keyword ==
'FILEOUT')
then
752 call this%parser%GetString(fname)
755 call openfile(this%itrkout, this%iout, fname,
'DATA(BINARY)', &
758 write (this%iout, fmttrkbin) trim(adjustl(fname)), this%itrkout
761 fname = trim(fname)//
'.hdr'
762 call openfile(this%itrkhdr, this%iout, fname,
'CSV', &
763 filstat_opt=
'REPLACE', mode_opt=mnormal)
766 call store_error(
'OPTIONAL TRACK KEYWORD MUST BE '// &
767 'FOLLOWED BY FILEOUT')
771 call this%parser%GetStringCaps(keyword)
772 if (keyword ==
'FILEOUT')
then
774 call this%parser%GetString(fname)
777 call openfile(this%itrkcsv, this%iout, fname,
'CSV', &
778 filstat_opt=
'REPLACE')
779 write (this%iout, fmttrkcsv) trim(adjustl(fname)), this%itrkcsv
782 call store_error(
'OPTIONAL TRACKCSV KEYWORD MUST BE &
783 &FOLLOWED BY FILEOUT')
789 case (
'EXTEND_TRACKING')
792 case (
'EXIT_SOLVE_TOLERANCE')
793 this%extol = this%parser%GetDouble()
794 if (this%extol <=
dzero) &
795 call store_error(
'EXIT_SOLVE_TOLERANCE MUST BE POSITIVE')
797 case (
'RELEASE_TIME_TOLERANCE')
798 this%rttol = this%parser%GetDouble()
799 if (this%rttol <=
dzero) &
800 call store_error(
'RELEASE_TIME_TOLERANCE MUST BE POSITIVE')
802 case (
'RELEASE_TIME_FREQUENCY')
803 this%rtfreq = this%parser%GetDouble()
804 if (this%rtfreq <=
dzero) &
805 call store_error(
'RELEASE_TIME_FREQUENCY MUST BE POSITIVE')
807 case (
'DEV_FORCETERNARY')
808 call this%parser%DevOpt()
810 write (this%iout,
'(4x,a)') &
811 'TRACKING WILL BE DONE USING THE TERNARY METHOD REGARDLESS OF CELL TYPE'
813 case (
'DEV_EXIT_SOLVE_METHOD')
814 call this%parser%DevOpt()
815 this%iexmeth = this%parser%GetInteger()
816 if (.not. (this%iexmeth /= 1 .or. this%iexmeth /= 2)) &
818 &1 (BRENT) OR 2 (CHANDRUPATLA)')
825 if (.not. found)
then
826 errmsg =
"UNKNOWN PRP OPTION '"//trim(keyword)//
"'."
828 call this%parser%StoreErrorUnit()
842 character(len=LINELENGTH) :: errmsg, keyword
844 logical :: isfound, endOfBlock
847 call this%parser%GetBlock(
'DIMENSIONS', isfound, ierr, &
848 supportopenclose=.true.)
852 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
854 call this%parser%GetNextLine(endofblock)
856 call this%parser%GetStringCaps(keyword)
857 select case (keyword)
859 this%nreleasepoints = this%parser%GetInteger()
860 case (
'NRELEASETIMES')
861 this%nreleasetimes = this%parser%GetInteger()
864 '(4x,a,a)')
'****ERROR. UNKNOWN PARTICLE INPUT DIMENSION: ', &
867 call this%parser%StoreErrorUnit()
870 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
872 call store_error(
'ERROR. REQUIRED DIMENSIONS BLOCK NOT FOUND.')
876 this%maxbound = this%nreleasepoints
877 this%nbound = this%nreleasepoints
880 call this%prp_allocate_arrays()
883 call this%prp_read_packagedata()
884 call this%prp_read_releasetimes()
885 call this%prp_load_releasetimefrequency()
893 character(len=LINELENGTH) :: cellid
894 character(len=LENBOUNDNAME) :: bndName, bndNameTemp
895 character(len=9) :: cno
897 logical :: endOfBlock
901 character(len=LENBOUNDNAME),
dimension(:),
allocatable :: nametxt
902 integer(I4B),
dimension(:),
allocatable :: nboundchk
903 integer(I4B),
dimension(:),
allocatable :: noder
904 real(DP),
dimension(:),
allocatable :: x
905 real(DP),
dimension(:),
allocatable :: y
906 real(DP),
dimension(:),
allocatable :: z
907 real(DP),
dimension(:),
allocatable :: tstop
909 character(len=*),
parameter :: fmttend = &
910 "('end time (', G0, ') must be greater than or equal to the &
911 &begin time (', G0, ').')"
914 allocate (noder(this%nreleasepoints))
915 allocate (x(this%nreleasepoints))
916 allocate (y(this%nreleasepoints))
917 allocate (z(this%nreleasepoints))
918 allocate (tstop(this%nreleasepoints))
919 allocate (nametxt(this%nreleasepoints))
920 allocate (nboundchk(this%nreleasepoints))
923 do n = 1, this%nreleasepoints
929 call this%parser%GetBlock(
'PACKAGEDATA', isfound, ierr, &
930 supportopenclose=.true.)
934 write (this%iout,
'(/1x,a)')
'PROCESSING '//trim(adjustl(this%packName)) &
937 call this%parser%GetNextLine(endofblock)
939 ival = this%parser%GetInteger()
942 if (n < 1 .or. n > this%nreleasepoints)
then
943 write (
errmsg,
'(a,i0,a,i0,a)') &
944 'Expected ', this%nreleasepoints,
' release points. &
945 &Points must be numbered from 1 to ', this%nreleasepoints,
'.'
951 nboundchk(n) = nboundchk(n) + 1
954 call this%parser%GetCellid(this%dis%ndim, cellid)
955 noder(n) = this%dis%noder_from_cellid(cellid, this%inunit, this%iout)
958 x(n) = this%parser%GetDouble()
959 y(n) = this%parser%GetDouble()
960 z(n) = this%parser%GetDouble()
962 if (this%ilocalz > 0 .and. (z(n) < 0 .or. z(n) > 1))
then
963 call store_error(
'Local z coordinate must fall in the interval [0, 1]')
968 write (cno,
'(i9.9)') n
972 if (this%inamedbound /= 0)
then
973 call this%parser%GetStringCaps(bndnametemp)
974 if (bndnametemp /=
'') &
975 bndname = bndnametemp
984 write (this%iout,
'(1x,a)') &
985 'END OF '//trim(adjustl(this%packName))//
' PACKAGEDATA'
988 do n = 1, this%nreleasepoints
989 if (nboundchk(n) == 0)
then
990 write (
errmsg,
'(a,a,1x,i0,a)')
'No data specified for particle ', &
991 'release point', n,
'.'
993 else if (nboundchk(n) > 1)
then
994 write (
errmsg,
'(a,1x,i0,1x,a,1x,i0,1x,a)') &
995 'Data for particle release point', n,
'specified', nboundchk(n), &
1001 call store_error(
'Required packagedata block not found.')
1006 call this%parser%StoreErrorUnit()
1010 do n = 1, this%nreleasepoints
1011 this%rptnode(n) = noder(n)
1015 this%rptname(n) = nametxt(n)
1024 deallocate (nametxt)
1025 deallocate (nboundchk)
1033 integer(I4B) :: i, ierr
1034 logical(LGP) :: eob, found, success
1036 real(DP),
allocatable :: times(:)
1039 call this%parser%GetBlock(
'RELEASETIMES', found, ierr, &
1040 supportopenclose=.true., &
1041 blockrequired=.false.)
1045 if (.not. found)
then
1046 if (this%nreleasetimes <= 0)
return
1047 write (
errmsg,
'(a, i0)') &
1048 "Expected RELEASETIMES with length ", this%nreleasetimes
1050 call this%parser%StoreErrorUnit(terminate=.true.)
1054 allocate (times(this%nreleasetimes))
1057 write (this%iout,
'(/1x,a)') &
1058 'PROCESSING '//trim(adjustl(this%text))//
' RELEASETIMES'
1059 do i = 1, this%nreleasetimes
1060 call this%parser%GetNextLine(eob)
1062 call this%parser%TryGetDouble(t, success)
1063 if (.not. success)
then
1064 errmsg =
"Failed to read double precision value"
1066 call this%parser%StoreErrorUnit(terminate=.true.)
1072 call this%schedule%time_select%extend(times)
1075 if (.not. this%schedule%time_select%increasing())
then
1076 errmsg =
"Release times must strictly increase"
1078 call this%parser%StoreErrorUnit(terminate=.true.)
1093 real(DP),
allocatable :: times(:)
1096 if (this%rtfreq <=
dzero)
return
1105 call this%schedule%time_select%extend(times)
1108 if (.not. this%schedule%time_select%increasing())
then
1109 errmsg =
"Release times must strictly increase"
1111 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
real(dp), parameter dem5
real constant 1e-5
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 create_particle_store(store, np, mempath)
Allocate particle store.
@ term_unreleased
terminated permanently unreleased
subroutine 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.