34 character(len=LENFTYPE) ::
ftype =
'PRP'
35 character(len=16) ::
text =
' PRP'
40 logical(LGP),
pointer :: extend => null()
41 logical(LGP),
pointer :: frctrn => null()
42 logical(LGP),
pointer :: drape => null()
43 logical(LGP),
pointer :: localz => null()
44 integer(I4B),
pointer :: istopweaksink => null()
45 integer(I4B),
pointer :: istopzone => null()
46 integer(I4B),
pointer :: idrymeth => null()
47 integer(I4B),
pointer :: itrkout => null()
48 integer(I4B),
pointer :: itrkhdr => null()
49 integer(I4B),
pointer :: itrkcsv => null()
50 integer(I4B),
pointer :: irlstls => null()
51 integer(I4B),
pointer :: iexmeth => null()
52 integer(I4B),
pointer :: ichkmeth => null()
53 integer(I4B),
pointer :: icycwin => null()
54 real(dp),
pointer :: extol => null()
55 real(dp),
pointer :: rttol => null()
56 real(dp),
pointer :: rtfreq => null()
57 real(dp),
pointer :: offset => null()
58 real(dp),
pointer :: stoptime => null()
59 real(dp),
pointer :: stoptraveltime => null()
64 integer(I4B),
pointer :: nreleasepoints => null()
65 integer(I4B),
pointer :: nreleasetimes => null()
66 integer(I4B),
pointer :: nparticles => 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()
101 subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, &
102 pakname, input_mempath, fmi)
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
111 character(len=*),
intent(in) :: input_mempath
116 character(len=*),
parameter :: fmtheader = &
117 "(1x, /1x, 'PRP PARTICLE RELEASE POINT PACKAGE', &
118 &' INPUT READ FROM MEMPATH: ', a, /)"
125 call packobj%set_names(ibcnum, namemodel, pakname,
ftype, input_mempath)
129 call prpobj%prp_allocate_scalars()
132 call packobj%pack_initialize()
134 packobj%inunit = inunit
137 packobj%ibcnum = ibcnum
145 if (inunit > 0)
write (iout, fmtheader) input_mempath
153 call this%BndExtType%bnd_da()
189 call this%particles%destroy(this%memoryPath)
190 call this%schedule%destroy()
191 deallocate (this%particles)
192 deallocate (this%schedule)
198 integer(I4B),
dimension(:),
pointer,
contiguous :: ibound
199 integer(I4B),
dimension(:),
pointer,
contiguous :: izone
201 this%ibound => ibound
202 this%rptzone => izone
209 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
210 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
214 call this%BndExtType%allocate_arrays()
220 this%nreleasepoints, &
224 call mem_allocate(this%rptx, this%nreleasepoints,
'RPTX', this%memoryPath)
225 call mem_allocate(this%rpty, this%nreleasepoints,
'RPTY', this%memoryPath)
226 call mem_allocate(this%rptz, this%nreleasepoints,
'RPTZ', this%memoryPath)
227 call mem_allocate(this%rptm, this%nreleasepoints,
'RPTMASS', &
229 call mem_allocate(this%rptnode, this%nreleasepoints,
'RPTNODER', &
232 'RPTNAME', this%memoryPath)
235 do nps = 1, this%nreleasepoints
236 this%rptm(nps) =
dzero
245 call this%BndExtType%allocate_scalars()
248 call mem_allocate(this%localz,
'LOCALZ', this%memoryPath)
249 call mem_allocate(this%extend,
'EXTEND', this%memoryPath)
250 call mem_allocate(this%offset,
'OFFSET', this%memoryPath)
251 call mem_allocate(this%stoptime,
'STOPTIME', this%memoryPath)
252 call mem_allocate(this%stoptraveltime,
'STOPTRAVELTIME', this%memoryPath)
253 call mem_allocate(this%istopweaksink,
'ISTOPWEAKSINK', this%memoryPath)
254 call mem_allocate(this%istopzone,
'ISTOPZONE', this%memoryPath)
256 call mem_allocate(this%idrymeth,
'IDRYMETH', this%memoryPath)
257 call mem_allocate(this%nreleasepoints,
'NRELEASEPOINTS', this%memoryPath)
258 call mem_allocate(this%nreleasetimes,
'NRELEASETIMES', this%memoryPath)
259 call mem_allocate(this%nparticles,
'NPARTICLES', this%memoryPath)
260 call mem_allocate(this%itrkout,
'ITRKOUT', this%memoryPath)
261 call mem_allocate(this%itrkhdr,
'ITRKHDR', this%memoryPath)
262 call mem_allocate(this%itrkcsv,
'ITRKCSV', this%memoryPath)
263 call mem_allocate(this%irlstls,
'IRLSTLS', this%memoryPath)
264 call mem_allocate(this%frctrn,
'FRCTRN', this%memoryPath)
265 call mem_allocate(this%iexmeth,
'IEXMETH', this%memoryPath)
266 call mem_allocate(this%ichkmeth,
'ICHKMETH', this%memoryPath)
267 call mem_allocate(this%icycwin,
'ICYCWIN', this%memoryPath)
270 call mem_allocate(this%rtfreq,
'RTFREQ', this%memoryPath)
273 this%localz = .false.
274 this%extend = .false.
276 this%stoptime = huge(1d0)
277 this%stoptraveltime = huge(1d0)
278 this%istopweaksink = 0
282 this%nreleasepoints = 0
283 this%nreleasetimes = 0
289 this%frctrn = .false.
306 call this%obs%obs_ar()
308 if (this%inamedbound /= 0)
then
309 do n = 1, this%nreleasepoints
310 this%boundname(n) = this%rptname(n)
313 do n = 1, this%nreleasepoints
314 this%nodelist(n) = this%rptnode(n)
322 integer(I4B) :: ip, it
335 do ip = 1, this%nreleasepoints
336 this%rptm(ip) =
dzero
341 call this%schedule%advance()
342 if (.not. this%schedule%any())
return
345 call this%log_release()
349 call this%particles%resize( &
350 this%particles%num_stored() + &
351 (this%nreleasepoints * this%schedule%count()), &
356 do ip = 1, this%nreleasepoints
357 do it = 1, this%schedule%count()
358 t = this%schedule%times(it)
363 'Skipping negative release time (t=', t,
').'
368 'Skipping release time falling after the end of the &
369 &simulation (t=', t,
'). Enable EXTEND_TRACKING to &
370 &release particles after the simulation end time.'
374 call this%release(ip, t)
382 if (this%iprpak > 0)
then
383 write (this%iout,
"(1x,/1x,a,1x,i0)") &
384 'PARTICLE RELEASE FOR PRP', this%ibcnum
385 call this%schedule%log(this%iout)
397 integer(I4B),
intent(in) :: ic
398 real(DP),
intent(in) :: x, y, z
400 real(DP),
allocatable :: polyverts(:, :)
402 call this%fmi%dis%get_polyverts(ic, polyverts)
404 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
405 'Error: release point (x=', x,
', y=', y,
') is not in cell ', &
406 this%dis%get_nodeuser(ic)
410 if (z > maxval(this%dis%top))
then
411 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
412 'Error: release point (z=', z,
') is above grid top ', &
416 else if (z < minval(this%dis%bot))
then
417 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
418 'Error: release point (z=', z,
') is below grid bottom ', &
423 deallocate (polyverts)
441 integer(I4B),
intent(in) :: ip
442 real(DP),
intent(in) :: trelease
447 call this%initialize_particle(particle, ip, trelease)
448 np = this%nparticles + 1
450 call this%particles%put(particle, np)
451 deallocate (particle)
452 this%rptm(ip) = this%rptm(ip) +
done
460 integer(I4B),
intent(in) :: ip
461 real(DP),
intent(in) :: trelease
463 integer(I4B) :: irow, icol, ilay, icpl
464 integer(I4B) :: ic, icu, ic_old
466 real(DP) :: top, bot, hds
468 ic = this%rptnode(ip)
469 icu = this%dis%get_nodeuser(ic)
471 call create_particle(particle)
473 if (
size(this%boundname) /= 0)
then
474 particle%name = this%boundname(ip)
480 particle%istopweaksink = this%istopweaksink
481 particle%istopzone = this%istopzone
482 particle%idrymeth = this%idrymeth
485 select type (dis => this%dis)
487 call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay)
489 call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay)
492 particle%izone = this%rptzone(ic)
497 if (this%ibound(ic) == 0)
then
500 call this%dis%highest_active(ic, this%ibound)
501 if (ic == ic_old .or. this%ibound(ic) == 0)
then
515 if (this%localz)
then
516 top = this%fmi%dis%top(ic)
517 bot = this%fmi%dis%bot(ic)
518 hds = this%fmi%gwfhead(ic)
519 z = bot + this%rptz(ip) * (hds - bot)
524 if (this%ichkmeth > 0) &
525 call this%validate_release_point(ic, x, y, z)
530 particle%trelease = trelease
533 if (this%stoptraveltime == huge(1d0))
then
534 particle%tstop = this%stoptime
536 particle%tstop = particle%trelease + this%stoptraveltime
537 if (this%stoptime < particle%tstop) particle%tstop = this%stoptime
540 particle%ttrack = particle%trelease
547 particle%frctrn = this%frctrn
548 particle%iexmeth = this%iexmeth
549 particle%extend = this%extend
550 particle%icycwin = this%icycwin
551 particle%extol = this%extol
565 integer(I4B),
pointer :: iper, ionper, nlist
566 character(len=LINELENGTH),
allocatable :: lines(:)
570 call mem_setptr(iper,
'IPER', this%input_mempath)
571 call mem_setptr(ionper,
'IONPER', this%input_mempath)
573 if (
kper == 1 .and. &
575 (ionper >
nper) .and. &
576 size(this%schedule%time_select%times) == 0)
then
583 call this%schedule%advance(lines=lines)
586 else if (iper /=
kper)
then
591 call mem_setptr(nlist,
'NBOUND', this%input_mempath)
592 call mem_setptr(settings,
'SETTING', this%input_mempath)
595 allocate (lines(nlist))
597 lines(n) = settings(n)
601 if (
size(lines) > 0) &
602 call this%schedule%advance(lines=lines)
614 real(DP),
dimension(:),
intent(in) :: hnew
615 real(DP),
dimension(:),
intent(inout) :: flowja
616 integer(I4B),
intent(in) :: imover
620 integer(I4B) :: idiag
624 if (this%nbound <= 0)
return
627 do i = 1, this%nbound
628 node = this%nodelist(i)
633 idiag = this%dis%con%ia(node)
634 rrate = this%rptm(i) * (
done /
delt)
635 flowja(idiag) = flowja(idiag) + rrate
639 this%simvals(i) = rrate
660 call this%obs%StoreObsType(
'prp', .true., indx)
665 call this%obs%StoreObsType(
'to-mvr', .true., indx)
680 character(len=LENVARNAME),
dimension(3) :: drytrack_method = &
681 &[character(len=LENVARNAME) ::
'DROP',
'STOP',
'STAY']
682 character(len=
lenvarname),
dimension(2) :: coorcheck_method = &
683 &[
character(len=LENVARNAME) ::
'NONE',
'EAGER']
684 character(len=LINELENGTH) :: trackfile, trackcsvfile, fname
688 call this%BndExtType%source_options()
691 call mem_set_value(this%stoptime,
'STOPTIME', this%input_mempath, &
694 this%input_mempath, found%stoptraveltime)
695 call mem_set_value(this%istopweaksink,
'ISTOPWEAKSINK', this%input_mempath, &
697 call mem_set_value(this%istopzone,
'ISTOPZONE', this%input_mempath, &
699 call mem_set_value(this%drape,
'DRAPE', this%input_mempath, &
701 call mem_set_value(this%idrymeth,
'IDRYMETH', this%input_mempath, &
702 drytrack_method, found%idrymeth)
703 call mem_set_value(trackfile,
'TRACKFILE', this%input_mempath, &
705 call mem_set_value(trackcsvfile,
'TRACKCSVFILE', this%input_mempath, &
707 call mem_set_value(this%localz,
'LOCALZ', this%input_mempath, &
709 call mem_set_value(this%extend,
'EXTEND', this%input_mempath, &
711 call mem_set_value(this%extol,
'EXTOL', this%input_mempath, &
713 call mem_set_value(this%rttol,
'RTTOL', this%input_mempath, &
715 call mem_set_value(this%rtfreq,
'RTFREQ', this%input_mempath, &
717 call mem_set_value(this%frctrn,
'FRCTRN', this%input_mempath, &
719 call mem_set_value(this%iexmeth,
'IEXMETH', this%input_mempath, &
721 call mem_set_value(this%ichkmeth,
'ICHKMETH', this%input_mempath, &
722 coorcheck_method, found%ichkmeth)
723 call mem_set_value(this%icycwin,
'ICYCWIN', this%input_mempath, found%icycwin)
726 if (found%idrymeth)
then
727 if (this%idrymeth == 0)
then
728 write (
errmsg,
'(a)')
'Unsupported dry tracking method. &
729 &DRY_TRACKING_METHOD must be "DROP", "STOP", or "STAY"'
733 this%idrymeth = this%idrymeth - 1
737 if (found%extol)
then
738 if (this%extol <=
dzero) &
739 call store_error(
'EXIT_SOLVE_TOLERANCE MUST BE POSITIVE')
742 if (found%rttol)
then
743 if (this%rttol <=
dzero) &
744 call store_error(
'RELEASE_TIME_TOLERANCE MUST BE POSITIVE')
747 if (found%rtfreq)
then
748 if (this%rtfreq <=
dzero) &
749 call store_error(
'RELEASE_TIME_FREQUENCY MUST BE POSITIVE')
752 if (found%iexmeth)
then
753 if (.not. (this%iexmeth /= 1 .or. this%iexmeth /= 2)) &
755 &1 (BRENT) OR 2 (CHANDRUPATLA)')
758 if (found%ichkmeth)
then
759 if (this%ichkmeth == 0)
then
760 write (
errmsg,
'(a)')
'Unsupported coordinate check method. &
761 &COORDINATE_CHECK_METHOD must be "NONE" or "EAGER"'
765 this%ichkmeth = this%ichkmeth - 1
769 if (found%icycwin)
then
770 if (this%icycwin < 0) &
771 call store_error(
'CYCLE_DETECTION_WINDOW MUST BE NON-NEGATIVE')
775 if (found%trackfile)
then
777 call openfile(this%itrkout, this%iout, trackfile,
'DATA(BINARY)', &
782 fname = trim(trackfile)//
'.hdr'
783 call openfile(this%itrkhdr, this%iout, fname,
'CSV', &
784 filstat_opt=
'REPLACE', mode_opt=
mnormal)
788 if (found%trackcsvfile)
then
790 call openfile(this%itrkcsv, this%iout, trackcsvfile,
'CSV', &
791 filstat_opt=
'REPLACE')
801 call this%prp_log_options(found, trackfile, trackcsvfile)
815 character(len=*),
intent(in) :: trackfile
816 character(len=*),
intent(in) :: trackcsvfile
819 character(len=*),
parameter :: fmttrkbin = &
820 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, &
821 &'OPENED ON UNIT: ', I0)"
822 character(len=*),
parameter :: fmttrkcsv = &
823 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, &
824 &'OPENED ON UNIT: ', I0)"
826 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
828 if (found%frctrn)
then
829 write (this%iout,
'(4x,a)') &
830 'IF DISV, TRACKING WILL USE THE TERNARY METHOD REGARDLESS OF CELL TYPE'
833 if (found%trackfile)
then
834 write (this%iout, fmttrkbin) trim(adjustl(trackfile)), this%itrkout
837 if (found%trackcsvfile)
then
838 write (this%iout, fmttrkcsv) trim(adjustl(trackcsvfile)), this%itrkcsv
841 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
854 call mem_set_value(this%nreleasepoints,
'NRELEASEPTS', this%input_mempath, &
856 call mem_set_value(this%nreleasetimes,
'NRELEASETIMES', this%input_mempath, &
859 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
860 write (this%iout,
'(4x,a,i0)')
'NRELEASEPTS = ', this%nreleasepoints
861 write (this%iout,
'(4x,a,i0)')
'NRELEASETIMES = ', this%nreleasetimes
862 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
865 this%maxbound = this%nreleasepoints
866 this%nbound = this%nreleasepoints
869 call this%prp_allocate_arrays()
872 call this%prp_packagedata()
873 call this%prp_releasetimes()
874 call this%prp_load_releasetimefrequency()
885 integer(I4B),
dimension(:),
pointer,
contiguous :: irptno
886 integer(I4B),
dimension(:, :),
pointer,
contiguous :: cellids
887 real(DP),
dimension(:),
pointer,
contiguous :: xrpts, yrpts, zrpts
889 contiguous :: boundnames
890 character(len=LENBOUNDNAME) :: bndName, bndNameTemp
891 character(len=9) :: cno
892 character(len=20) :: cellidstr
893 integer(I4B),
dimension(:),
allocatable :: nboundchk
894 integer(I4B),
dimension(:),
pointer :: cellid
895 integer(I4B) :: n, noder, nodeu, rptno
898 call mem_setptr(irptno,
'IRPTNO', this%input_mempath)
899 call mem_setptr(cellids,
'CELLID', this%input_mempath)
900 call mem_setptr(xrpts,
'XRPT', this%input_mempath)
901 call mem_setptr(yrpts,
'YRPT', this%input_mempath)
902 call mem_setptr(zrpts,
'ZRPT', this%input_mempath)
903 call mem_setptr(boundnames,
'BOUNDNAME', this%input_mempath)
906 allocate (nboundchk(this%nreleasepoints))
907 do n = 1, this%nreleasepoints
911 write (this%iout,
'(/1x,a)')
'PROCESSING '//trim(adjustl(this%packName)) &
914 do n = 1,
size(irptno)
918 if (rptno < 1 .or. rptno > this%nreleasepoints)
then
919 write (
errmsg,
'(a,i0,a,i0,a)') &
920 'Expected ', this%nreleasepoints,
' release points. &
921 &Points must be numbered from 1 to ', this%nreleasepoints,
'.'
927 nboundchk(rptno) = nboundchk(rptno) + 1
930 cellid => cellids(:, n)
933 if (this%dis%ndim == 1)
then
935 elseif (this%dis%ndim == 2)
then
936 nodeu =
get_node(cellid(1), 1, cellid(2), &
937 this%dis%mshape(1), 1, &
940 nodeu =
get_node(cellid(1), cellid(2), cellid(3), &
941 this%dis%mshape(1), &
942 this%dis%mshape(2), &
947 noder = this%dis%get_nodenumber(nodeu, 1)
949 call this%dis%nodeu_to_string(nodeu, cellidstr)
951 'Particle release point configured for inactive cell: '// &
952 trim(adjustl(cellidstr))//
'.'
956 this%rptnode(rptno) = noder
959 if (this%localz .and. (zrpts(n) < 0 .or. zrpts(n) > 1))
then
960 call store_error(
'Local z coordinate must fall in the interval [0, 1]')
965 this%rptx(rptno) = xrpts(n)
966 this%rpty(rptno) = yrpts(n)
967 this%rptz(rptno) = zrpts(n)
970 write (cno,
'(i9.9)') rptno
974 if (this%inamedbound /= 0)
then
975 bndnametemp = boundnames(n)
976 if (bndnametemp /=
'') bndname = bndnametemp
982 this%rptname(rptno) = bndname
985 write (this%iout,
'(1x,a)') &
986 'END OF '//trim(adjustl(this%packName))//
' PACKAGEDATA'
989 do n = 1, this%nreleasepoints
990 if (nboundchk(n) == 0)
then
991 write (
errmsg,
'(a,a,1x,i0,a)')
'No data specified for particle ', &
992 'release point', n,
'.'
994 else if (nboundchk(n) > 1)
then
995 write (
errmsg,
'(a,1x,i0,1x,a,1x,i0,1x,a)') &
996 'Data for particle release point', n,
'specified', nboundchk(n), &
1008 deallocate (nboundchk)
1017 real(DP),
dimension(:),
pointer,
contiguous :: time
1018 integer(I4B) :: n, isize
1019 real(DP),
allocatable :: times(:)
1021 if (this%nreleasetimes <= 0)
return
1024 allocate (times(this%nreleasetimes))
1027 call get_isize(
'TIME', this%input_mempath, isize)
1029 if (isize <= 0)
then
1030 errmsg =
"RELEASTIMES block expected when &
1031 &NRELEASETIMES dimension is non-zero."
1037 call mem_setptr(time,
'TIME', this%input_mempath)
1040 do n = 1,
size(time)
1045 call this%schedule%time_select%extend(times)
1048 if (.not. this%schedule%time_select%increasing())
then
1049 errmsg =
"RELEASTIMES block entries must strictly increase."
1065 real(DP),
allocatable :: times(:)
1068 if (this%rtfreq <=
dzero)
return
1077 call this%schedule%time_select%extend(times)
1080 if (.not. this%schedule%time_select%increasing())
then
1081 errmsg =
"Release times must strictly increase"
This module contains the extended boundary package.
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 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 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, public prp_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, input_mempath, fmi)
Create a new particle release point package.
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.
character(len=lenftype) ftype
subroutine prp_df_obs(this)
Store supported observations.
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 prp_dimensions(this)
@ brief Set dimensions specific to PrtPrpType
subroutine prp_set_pointers(this, ibound, izone)
@ brief Set pointers to model variables
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 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 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
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.
Manages particle track output (logging/writing).
Particle release point (PRP) package.