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 :: itrkout => null()
53 integer(I4B),
pointer :: itrkhdr => null()
54 integer(I4B),
pointer :: itrkcsv => null()
55 integer(I4B),
pointer :: irlstls => null()
56 integer(I4B),
pointer :: ilocalz => null()
57 integer(I4B),
pointer :: iextend => null()
58 integer(I4B),
pointer :: ifrctrn => null()
59 integer(I4B),
pointer :: iexmeth => null()
60 real(dp),
pointer :: extol => null()
61 real(dp),
pointer :: rttol => null()
62 real(dp),
pointer :: rtfreq => null()
63 real(dp),
pointer :: offset => null()
64 real(dp),
pointer :: stoptime => null()
65 real(dp),
pointer :: stoptraveltime => null()
66 logical(LGP),
pointer :: foundtol => 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()
99 subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, &
102 class(
bndtype),
pointer :: packobj
103 integer(I4B),
intent(in) :: id
104 integer(I4B),
intent(in) :: ibcnum
105 integer(I4B),
intent(in) :: inunit
106 integer(I4B),
intent(in) :: iout
107 character(len=*),
intent(in) :: namemodel
108 character(len=*),
intent(in) :: pakname
113 character(len=*),
parameter :: fmtheader = &
114 "(1x, /1x, 'PRP PARTICLE RELEASE POINT PACKAGE', &
115 &' INPUT READ FROM UNIT ', i0, /)"
122 call packobj%set_names(ibcnum, namemodel, pakname,
ftype)
126 call prpobj%prp_allocate_scalars()
129 call packobj%pack_initialize()
131 packobj%inunit = inunit
134 packobj%ibcnum = ibcnum
142 if (inunit > 0)
write (iout, fmtheader) inunit
150 call this%BndType%bnd_da()
184 call this%particles%deallocate(this%memoryPath)
185 call this%schedule%deallocate()
186 deallocate (this%particles)
187 deallocate (this%schedule)
193 integer(I4B),
dimension(:),
pointer,
contiguous :: ibound
194 integer(I4B),
dimension(:),
pointer,
contiguous :: izone
197 this%ibound => ibound
198 this%rptzone => izone
199 this%tracks => trackfilectl
206 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
207 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
215 this%nreleasepoints, &
219 call mem_allocate(this%rptx, this%nreleasepoints,
'RPTX', this%memoryPath)
220 call mem_allocate(this%rpty, this%nreleasepoints,
'RPTY', this%memoryPath)
221 call mem_allocate(this%rptz, this%nreleasepoints,
'RPTZ', this%memoryPath)
222 call mem_allocate(this%rptm, this%nreleasepoints,
'RPTMASS', this%memoryPath)
223 call mem_allocate(this%rptnode, this%nreleasepoints,
'RPTNODER', &
226 'RPTNAME', this%memoryPath)
229 do nps = 1, this%nreleasepoints
230 this%rptm(nps) =
dzero
239 call this%BndType%allocate_scalars()
242 call mem_allocate(this%ilocalz,
'ILOCALZ', this%memoryPath)
243 call mem_allocate(this%iextend,
'IEXTEND', this%memoryPath)
244 call mem_allocate(this%offset,
'OFFSET', this%memoryPath)
245 call mem_allocate(this%stoptime,
'STOPTIME', this%memoryPath)
246 call mem_allocate(this%stoptraveltime,
'STOPTRAVELTIME', this%memoryPath)
247 call mem_allocate(this%istopweaksink,
'ISTOPWEAKSINK', this%memoryPath)
248 call mem_allocate(this%istopzone,
'ISTOPZONE', this%memoryPath)
249 call mem_allocate(this%idrape,
'IDRAPE', this%memoryPath)
250 call mem_allocate(this%nreleasepoints,
'NRELEASEPOINTS', this%memoryPath)
251 call mem_allocate(this%nreleasetimes,
'NRELEASETIMES', this%memoryPath)
252 call mem_allocate(this%nparticles,
'NPARTICLES', this%memoryPath)
253 call mem_allocate(this%itrkout,
'ITRKOUT', this%memoryPath)
254 call mem_allocate(this%itrkhdr,
'ITRKHDR', this%memoryPath)
255 call mem_allocate(this%itrkcsv,
'ITRKCSV', this%memoryPath)
256 call mem_allocate(this%irlstls,
'IRLSTLS', this%memoryPath)
257 call mem_allocate(this%ifrctrn,
'IFRCTRN', this%memoryPath)
258 call mem_allocate(this%iexmeth,
'IEXMETH', this%memoryPath)
261 call mem_allocate(this%rtfreq,
'RTFREQ', this%memoryPath)
262 call mem_allocate(this%foundtol,
'FOUNDTOL', this%memoryPath)
268 this%stoptime = huge(1d0)
269 this%stoptraveltime = huge(1d0)
270 this%istopweaksink = 0
273 this%nreleasepoints = 0
274 this%nreleasetimes = 0
285 this%foundtol = .false.
296 call this%obs%obs_ar()
297 call this%BndType%allocate_arrays()
298 if (this%inamedbound /= 0)
then
299 do n = 1, this%nreleasepoints
300 this%boundname(n) = this%rptname(n)
303 do n = 1, this%nreleasepoints
304 this%nodelist(n) = this%rptnode(n)
311 integer(I4B) :: ip, it
323 do ip = 1, this%nreleasepoints
324 this%rptm(ip) =
dzero
329 call this%schedule%advance()
330 if (.not. this%schedule%any())
return
333 call this%log_release()
337 call this%particles%resize( &
338 this%particles%num_stored() + &
339 (this%nreleasepoints * this%schedule%count()), &
344 do ip = 1, this%nreleasepoints
345 do it = 1, this%schedule%count()
346 call this%release(ip, this%schedule%times(it))
354 if (this%iprpak > 0)
then
355 write (this%iout,
"(1x,/1x,a,1x,i0)") &
356 'PARTICLE RELEASE FOR PRP', this%ibcnum
357 call this%schedule%log(this%iout)
369 integer(I4B),
intent(in) :: ic
370 real(DP),
intent(in) :: x, y, z
372 real(DP),
allocatable :: polyverts(:, :)
374 call this%fmi%dis%get_polyverts(ic, polyverts)
376 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
377 'Error: release point (x=', x,
', y=', y,
') is not in cell ', &
378 this%dis%get_nodeuser(ic)
382 if (z > maxval(this%dis%top))
then
383 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
384 'Error: release point (z=', z,
') is above grid top ', &
388 else if (z < minval(this%dis%bot))
then
389 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
390 'Error: release point (z=', z,
') is below grid bottom ', &
395 deallocate (polyverts)
413 integer(I4B),
intent(in) :: ip
414 real(DP),
intent(in) :: trelease
416 integer(I4B) :: irow, icol, ilay, icpl
417 integer(I4B) :: ic, icu
420 real(DP) :: top, bot, hds
424 np = this%nparticles + 1
428 ic = this%rptnode(ip)
429 icu = this%dis%get_nodeuser(ic)
434 if (this%ilocalz > 0)
then
435 top = this%fmi%dis%top(ic)
436 bot = this%fmi%dis%bot(ic)
437 hds = this%fmi%gwfhead(ic)
438 z = bot + this%rptz(ip) * (hds - bot)
444 call this%validate_release_point(ic, x, y, z)
448 if (
size(this%boundname) /= 0)
then
449 particle%name = this%boundname(ip)
454 particle%istopweaksink = this%istopweaksink
455 particle%istopzone = this%istopzone
457 select type (dis => this%dis)
459 call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay)
461 call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay)
464 particle%izone = this%rptzone(ic)
467 if (this%ibound(ic) == 0)
then
470 if (this%idrape /= 0) &
471 call this%dis%highest_active(ic, this%ibound)
473 if (this%ibound(ic) == 0) &
479 particle%trelease = trelease
481 if (this%stoptraveltime == huge(1d0))
then
482 particle%tstop = this%stoptime
484 particle%tstop = particle%trelease + this%stoptraveltime
485 if (this%stoptime < particle%tstop) particle%tstop = this%stoptime
487 particle%ttrack = particle%trelease
488 particle%idomain(1) = 0
489 particle%iboundary(1) = 0
490 particle%idomain(2) = ic
491 particle%iboundary(2) = 0
492 particle%idomain(3) = 0
493 particle%iboundary(3) = 0
494 particle%ifrctrn = this%ifrctrn
495 particle%iexmeth = this%iexmeth
496 particle%iextend = this%iextend
497 particle%extol = this%extol
500 call this%particles%save_particle(particle, np)
501 deallocate (particle)
504 this%rptm(ip) = this%rptm(ip) +
done
517 logical(LGP) :: is_found
518 logical(LGP) :: end_of_block
519 logical(LGP) :: no_blocks
520 character(len=LINELENGTH) :: line
521 character(len=LINELENGTH),
allocatable :: lines(:)
523 character(len=*),
parameter :: fmtblkerr = &
524 "('Looking for BEGIN PERIOD iper. &
525 &Found ', a, ' instead.')"
526 character(len=*),
parameter :: fmt_steps = &
527 "(6x,'TIME STEP(S) ',50(I0,' '))"
528 character(len=*),
parameter :: fmt_freq = &
529 "(6x,'EVERY ',I0,' TIME STEP(S)')"
530 character(len=*),
parameter :: fmt_fracs = &
535 if (this%inunit == 0)
return
539 if (this%ionper <
kper)
then
541 call this%parser%GetBlock(
'PERIOD', is_found, ierr, &
542 supportopenclose=.true., &
543 blockrequired=.false.)
546 call this%read_check_ionper()
555 this%ionper =
nper + 1
559 call this%parser%GetCurrentLine(line)
560 write (
errmsg, fmtblkerr) adjustl(trim(line))
570 if (no_blocks .and. &
572 size(this%schedule%time_select%times) == 0)
then
576 call this%schedule%advance(lines=lines)
577 else if (this%ionper ==
kper)
then
583 call this%parser%GetNextLine(end_of_block)
584 if (end_of_block)
exit recordloop
585 call this%parser%GetCurrentLine(line)
587 lines(
size(lines)) = line
589 if (
size(lines) > 0) &
590 call this%schedule%advance(lines=lines)
602 real(DP),
dimension(:),
intent(in) :: hnew
603 real(DP),
dimension(:),
intent(inout) :: flowja
604 integer(I4B),
intent(in) :: imover
608 integer(I4B) :: idiag
612 if (this%nbound <= 0)
return
615 do i = 1, this%nbound
616 node = this%nodelist(i)
621 idiag = this%dis%con%ia(node)
622 rrate = this%rptm(i) * (
done /
delt)
623 flowja(idiag) = flowja(idiag) + rrate
627 this%simvals(i) = rrate
648 call this%obs%StoreObsType(
'prp', .true., indx)
653 call this%obs%StoreObsType(
'to-mvr', .true., indx)
665 character(len=*),
intent(inout) :: option
666 logical(LGP),
intent(inout) :: found
668 character(len=MAXCHARLEN) :: fname
669 character(len=MAXCHARLEN) :: keyword
671 character(len=*),
parameter :: fmttrkbin = &
672 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, &
673 &'OPENED ON UNIT: ', I0)"
674 character(len=*),
parameter :: fmttrkcsv = &
675 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, &
676 &'OPENED ON UNIT: ', I0)"
680 this%stoptime = this%parser%GetDouble()
682 case (
'STOPTRAVELTIME')
683 this%stoptraveltime = this%parser%GetDouble()
685 case (
'STOP_AT_WEAK_SINK')
686 this%istopweaksink = 1
689 this%istopzone = this%parser%GetInteger()
695 call this%parser%GetStringCaps(keyword)
696 if (keyword ==
'FILEOUT')
then
698 call this%parser%GetString(fname)
701 call openfile(this%itrkout, this%iout, fname,
'DATA(BINARY)', &
704 write (this%iout, fmttrkbin) trim(adjustl(fname)), this%itrkout
707 fname = trim(fname)//
'.hdr'
708 call openfile(this%itrkhdr, this%iout, fname,
'CSV', &
709 filstat_opt=
'REPLACE', mode_opt=mnormal)
712 call store_error(
'OPTIONAL TRACK KEYWORD MUST BE '// &
713 'FOLLOWED BY FILEOUT')
717 call this%parser%GetStringCaps(keyword)
718 if (keyword ==
'FILEOUT')
then
720 call this%parser%GetString(fname)
723 call openfile(this%itrkcsv, this%iout, fname,
'CSV', &
724 filstat_opt=
'REPLACE')
725 write (this%iout, fmttrkcsv) trim(adjustl(fname)), this%itrkcsv
728 call store_error(
'OPTIONAL TRACKCSV KEYWORD MUST BE &
729 &FOLLOWED BY FILEOUT')
735 case (
'EXTEND_TRACKING')
738 case (
'EXIT_SOLVE_TOLERANCE')
739 this%extol = this%parser%GetDouble()
740 if (this%extol <=
dzero) &
741 call store_error(
'EXIT_SOLVE_TOLERANCE MUST BE POSITIVE')
743 this%foundtol = .true.
744 case (
'RELEASE_TIME_TOLERANCE')
745 this%rttol = this%parser%GetDouble()
746 if (this%rttol <=
dzero) &
747 call store_error(
'RELEASE_TIME_TOLERANCE MUST BE POSITIVE')
749 case (
'RELEASE_TIME_FREQUENCY')
750 this%rtfreq = this%parser%GetDouble()
751 if (this%rtfreq <=
dzero) &
752 call store_error(
'RELEASE_TIME_FREQUENCY MUST BE POSITIVE')
754 case (
'DEV_FORCETERNARY')
755 call this%parser%DevOpt()
757 write (this%iout,
'(4x,a)') &
758 'TRACKING WILL BE DONE USING THE TERNARY METHOD REGARDLESS OF CELL TYPE'
760 case (
'DEV_EXIT_SOLVE_METHOD')
761 call this%parser%DevOpt()
762 this%iexmeth = this%parser%GetInteger()
763 if (.not. (this%iexmeth /= 1 .or. this%iexmeth /= 2)) &
765 &1 (BRENT) OR 2 (CHANDRUPATLA)')
772 if (.not. found)
then
773 errmsg =
"UNKNOWN PRP OPTION '"//trim(keyword)//
"'."
775 call this%parser%StoreErrorUnit()
789 character(len=LINELENGTH) :: errmsg, keyword
791 logical :: isfound, endOfBlock
793 if (.not. this%foundtol) &
794 call store_error(
'EXIT_SOLVE_TOLERANCE MISSING, VALUE REQUIRED')
797 call this%parser%GetBlock(
'DIMENSIONS', isfound, ierr, &
798 supportopenclose=.true.)
802 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
804 call this%parser%GetNextLine(endofblock)
806 call this%parser%GetStringCaps(keyword)
807 select case (keyword)
809 this%nreleasepoints = this%parser%GetInteger()
810 case (
'NRELEASETIMES')
811 this%nreleasetimes = this%parser%GetInteger()
814 '(4x,a,a)')
'****ERROR. UNKNOWN PARTICLE INPUT DIMENSION: ', &
817 call this%parser%StoreErrorUnit()
820 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
822 call store_error(
'ERROR. REQUIRED DIMENSIONS BLOCK NOT FOUND.')
826 this%maxbound = this%nreleasepoints
827 this%nbound = this%nreleasepoints
830 call this%prp_allocate_arrays()
833 call this%prp_read_packagedata()
834 call this%prp_read_releasetimes()
835 call this%prp_load_releasetimefrequency()
843 character(len=LINELENGTH) :: cellid
844 character(len=LENBOUNDNAME) :: bndName, bndNameTemp
845 character(len=9) :: cno
847 logical :: endOfBlock
851 character(len=LENBOUNDNAME),
dimension(:),
allocatable :: nametxt
852 integer(I4B),
dimension(:),
allocatable :: nboundchk
853 integer(I4B),
dimension(:),
allocatable :: noder
854 real(DP),
dimension(:),
allocatable :: x
855 real(DP),
dimension(:),
allocatable :: y
856 real(DP),
dimension(:),
allocatable :: z
857 real(DP),
dimension(:),
allocatable :: tstop
859 character(len=*),
parameter :: fmttend = &
860 "('end time (', G0, ') must be greater than or equal to the &
861 &begin time (', G0, ').')"
864 allocate (noder(this%nreleasepoints))
865 allocate (x(this%nreleasepoints))
866 allocate (y(this%nreleasepoints))
867 allocate (z(this%nreleasepoints))
868 allocate (tstop(this%nreleasepoints))
869 allocate (nametxt(this%nreleasepoints))
870 allocate (nboundchk(this%nreleasepoints))
873 do n = 1, this%nreleasepoints
879 call this%parser%GetBlock(
'PACKAGEDATA', isfound, ierr, &
880 supportopenclose=.true.)
884 write (this%iout,
'(/1x,a)')
'PROCESSING '//trim(adjustl(this%packName)) &
887 call this%parser%GetNextLine(endofblock)
889 ival = this%parser%GetInteger()
892 if (n < 1 .or. n > this%nreleasepoints)
then
893 write (
errmsg,
'(a,1x,i0,a)') &
894 'Release point number must be greater than 0 and less than ', &
895 'or equal to', this%nreleasepoints,
'.'
901 nboundchk(n) = nboundchk(n) + 1
904 call this%parser%GetCellid(this%dis%ndim, cellid)
905 noder(n) = this%dis%noder_from_cellid(cellid, this%inunit, this%iout)
908 x(n) = this%parser%GetDouble()
909 y(n) = this%parser%GetDouble()
910 z(n) = this%parser%GetDouble()
912 if (this%ilocalz > 0 .and. (z(n) < 0 .or. z(n) > 1))
then
913 call store_error(
'Local z coordinate must fall in the interval [0, 1]')
918 write (cno,
'(i9.9)') n
922 if (this%inamedbound /= 0)
then
923 call this%parser%GetStringCaps(bndnametemp)
924 if (bndnametemp /=
'') &
925 bndname = bndnametemp
934 write (this%iout,
'(1x,a)') &
935 'END OF '//trim(adjustl(this%packName))//
' PACKAGEDATA'
938 do n = 1, this%nreleasepoints
939 if (nboundchk(n) == 0)
then
940 write (
errmsg,
'(a,a,1x,i0,a)')
'No data specified for particle ', &
941 'release point', n,
'.'
943 else if (nboundchk(n) > 1)
then
944 write (
errmsg,
'(a,1x,i0,1x,a,1x,i0,1x,a)') &
945 'Data for particle release point', n,
'specified', nboundchk(n), &
951 call store_error(
'Required packagedata block not found.')
956 call this%parser%StoreErrorUnit()
960 do n = 1, this%nreleasepoints
961 this%rptnode(n) = noder(n)
965 this%rptname(n) = nametxt(n)
975 deallocate (nboundchk)
983 integer(I4B) :: i, ierr
984 logical(LGP) :: eob, found, success
986 real(DP),
allocatable :: times(:)
989 call this%parser%GetBlock(
'RELEASETIMES', found, ierr, &
990 supportopenclose=.true., &
991 blockrequired=.false.)
995 if (.not. found)
then
996 if (this%nreleasetimes <= 0)
return
997 write (
errmsg,
'(a, i0)') &
998 "Expected RELEASETIMES with length ", this%nreleasetimes
1000 call this%parser%StoreErrorUnit(terminate=.true.)
1004 allocate (times(this%nreleasetimes))
1007 write (this%iout,
'(/1x,a)') &
1008 'PROCESSING '//trim(adjustl(this%text))//
' RELEASETIMES'
1009 do i = 1, this%nreleasetimes
1010 call this%parser%GetNextLine(eob)
1012 call this%parser%TryGetDouble(t, success)
1013 if (.not. success)
then
1014 errmsg =
"Failed to read double precision value"
1016 call this%parser%StoreErrorUnit(terminate=.true.)
1022 call this%schedule%time_select%extend(times)
1025 if (.not. this%schedule%time_select%increasing())
then
1026 errmsg =
"Release times must strictly increase"
1028 call this%parser%StoreErrorUnit(terminate=.true.)
1043 real(DP),
allocatable :: times(:)
1046 if (this%rtfreq <=
dzero)
return
1055 call this%schedule%time_select%extend(times)
1058 if (.not. this%schedule%time_select%increasing())
then
1059 errmsg =
"Release times must strictly increase"
1061 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_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_set_pointers(this, ibound, izone, trackfilectl)
@ brief Set pointers to model variables
subroutine prp_allocate_scalars(this)
Allocate scalars.
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 trackheader
character(len= *), parameter, public trackdtypes
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.