34 character(len=LENFTYPE) ::
ftype =
'PRP'
35 character(len=16) ::
text =
' PRP'
41 logical(LGP),
pointer :: extend => null()
42 logical(LGP),
pointer :: frctrn => null()
43 logical(LGP),
pointer :: drape => null()
44 logical(LGP),
pointer :: localz => null()
45 integer(I4B),
pointer :: istopweaksink => null()
46 integer(I4B),
pointer :: istopzone => null()
47 integer(I4B),
pointer :: idrymeth => null()
48 integer(I4B),
pointer :: itrkout => null()
49 integer(I4B),
pointer :: itrkhdr => null()
50 integer(I4B),
pointer :: itrkcsv => null()
51 integer(I4B),
pointer :: irlstls => null()
52 integer(I4B),
pointer :: iexmeth => null()
53 integer(I4B),
pointer :: ichkmeth => null()
54 integer(I4B),
pointer :: icycwin => null()
55 real(dp),
pointer :: extol => null()
56 real(dp),
pointer :: rttol => null()
57 real(dp),
pointer :: rtfreq => null()
58 real(dp),
pointer :: offset => null()
59 real(dp),
pointer :: stoptime => null()
60 real(dp),
pointer :: stoptraveltime => null()
65 integer(I4B),
pointer :: nreleasepoints => null()
66 integer(I4B),
pointer :: nreleasetimes => null()
67 integer(I4B),
pointer :: nparticles => null()
68 integer(I4B),
pointer,
contiguous :: rptnode(:) => null()
69 integer(I4B),
pointer,
contiguous :: rptzone(:) => null()
70 real(dp),
pointer,
contiguous :: rptx(:) => null()
71 real(dp),
pointer,
contiguous :: rpty(:) => null()
72 real(dp),
pointer,
contiguous :: rptz(:) => null()
73 real(dp),
pointer,
contiguous :: rptm(:) => null()
74 character(len=LENBOUNDNAME),
pointer,
contiguous :: rptname(:) => null()
102 subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, &
103 pakname, input_mempath, fmi)
105 class(
bndtype),
pointer :: packobj
106 integer(I4B),
intent(in) :: id
107 integer(I4B),
intent(in) :: ibcnum
108 integer(I4B),
intent(in) :: inunit
109 integer(I4B),
intent(in) :: iout
110 character(len=*),
intent(in) :: namemodel
111 character(len=*),
intent(in) :: pakname
112 character(len=*),
intent(in) :: input_mempath
117 character(len=*),
parameter :: fmtheader = &
118 "(1x, /1x, 'PRP PARTICLE RELEASE POINT PACKAGE', &
119 &' INPUT READ FROM MEMPATH: ', a, /)"
126 call packobj%set_names(ibcnum, namemodel, pakname,
ftype, input_mempath)
130 call prpobj%prp_allocate_scalars()
133 call packobj%pack_initialize()
135 packobj%inunit = inunit
138 packobj%ibcnum = ibcnum
146 if (inunit > 0)
write (iout, fmtheader) input_mempath
154 call this%BndExtType%bnd_da()
190 call this%particles%destroy(this%memoryPath)
191 call this%schedule%destroy()
192 deallocate (this%particles)
193 deallocate (this%schedule)
199 integer(I4B),
dimension(:),
pointer,
contiguous :: ibound
200 integer(I4B),
dimension(:),
pointer,
contiguous :: izone
202 this%ibound => ibound
203 this%rptzone => izone
210 integer(I4B),
dimension(:),
pointer,
contiguous,
optional :: nodelist
211 real(DP),
dimension(:, :),
pointer,
contiguous,
optional :: auxvar
215 call this%BndExtType%allocate_arrays()
221 this%nreleasepoints, &
225 call mem_allocate(this%rptx, this%nreleasepoints,
'RPTX', this%memoryPath)
226 call mem_allocate(this%rpty, this%nreleasepoints,
'RPTY', this%memoryPath)
227 call mem_allocate(this%rptz, this%nreleasepoints,
'RPTZ', this%memoryPath)
228 call mem_allocate(this%rptm, this%nreleasepoints,
'RPTMASS', &
230 call mem_allocate(this%rptnode, this%nreleasepoints,
'RPTNODER', &
233 'RPTNAME', this%memoryPath)
236 do nps = 1, this%nreleasepoints
237 this%rptm(nps) =
dzero
246 call this%BndExtType%allocate_scalars()
249 call mem_allocate(this%localz,
'LOCALZ', this%memoryPath)
250 call mem_allocate(this%extend,
'EXTEND', this%memoryPath)
251 call mem_allocate(this%offset,
'OFFSET', this%memoryPath)
252 call mem_allocate(this%stoptime,
'STOPTIME', this%memoryPath)
253 call mem_allocate(this%stoptraveltime,
'STOPTRAVELTIME', this%memoryPath)
254 call mem_allocate(this%istopweaksink,
'ISTOPWEAKSINK', this%memoryPath)
255 call mem_allocate(this%istopzone,
'ISTOPZONE', this%memoryPath)
257 call mem_allocate(this%idrymeth,
'IDRYMETH', this%memoryPath)
258 call mem_allocate(this%nreleasepoints,
'NRELEASEPOINTS', this%memoryPath)
259 call mem_allocate(this%nreleasetimes,
'NRELEASETIMES', this%memoryPath)
260 call mem_allocate(this%nparticles,
'NPARTICLES', this%memoryPath)
261 call mem_allocate(this%itrkout,
'ITRKOUT', this%memoryPath)
262 call mem_allocate(this%itrkhdr,
'ITRKHDR', this%memoryPath)
263 call mem_allocate(this%itrkcsv,
'ITRKCSV', this%memoryPath)
264 call mem_allocate(this%irlstls,
'IRLSTLS', this%memoryPath)
265 call mem_allocate(this%frctrn,
'FRCTRN', this%memoryPath)
266 call mem_allocate(this%iexmeth,
'IEXMETH', this%memoryPath)
267 call mem_allocate(this%ichkmeth,
'ICHKMETH', this%memoryPath)
268 call mem_allocate(this%icycwin,
'ICYCWIN', this%memoryPath)
271 call mem_allocate(this%rtfreq,
'RTFREQ', this%memoryPath)
274 this%localz = .false.
275 this%extend = .false.
277 this%stoptime = huge(1d0)
278 this%stoptraveltime = huge(1d0)
279 this%istopweaksink = 0
283 this%nreleasepoints = 0
284 this%nreleasetimes = 0
290 this%frctrn = .false.
307 call this%obs%obs_ar()
309 if (this%inamedbound /= 0)
then
310 do n = 1, this%nreleasepoints
311 this%boundname(n) = this%rptname(n)
314 do n = 1, this%nreleasepoints
315 this%nodelist(n) = this%rptnode(n)
323 integer(I4B) :: ip, it
336 do ip = 1, this%nreleasepoints
337 this%rptm(ip) =
dzero
342 call this%schedule%advance()
343 if (.not. this%schedule%any())
return
346 call this%log_release()
350 call this%particles%resize( &
351 this%particles%num_stored() + &
352 (this%nreleasepoints * this%schedule%count()), &
357 do ip = 1, this%nreleasepoints
358 do it = 1, this%schedule%count()
359 t = this%schedule%times(it)
364 'Skipping negative release time (t=', t,
').'
369 'Skipping release time falling after the end of the &
370 &simulation (t=', t,
'). Enable EXTEND_TRACKING to &
371 &release particles after the simulation end time.'
375 call this%release(ip, t)
383 if (this%iprpak > 0)
then
384 write (this%iout,
"(1x,/1x,a,1x,i0)") &
385 'PARTICLE RELEASE FOR PRP', this%ibcnum
386 call this%schedule%log(this%iout)
398 integer(I4B),
intent(in) :: ic
399 real(DP),
intent(in) :: x, y, z
401 real(DP),
allocatable :: polyverts(:, :)
403 call this%fmi%dis%get_polyverts(ic, polyverts)
405 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
406 'Error: release point (x=', x,
', y=', y,
') is not in cell ', &
407 this%dis%get_nodeuser(ic)
411 if (z > maxval(this%dis%top))
then
412 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
413 'Error: release point (z=', z,
') is above grid top ', &
417 else if (z < minval(this%dis%bot))
then
418 write (
errmsg,
'(a,g0,a,g0,a,i0)') &
419 'Error: release point (z=', z,
') is below grid bottom ', &
424 deallocate (polyverts)
442 integer(I4B),
intent(in) :: ip
443 real(DP),
intent(in) :: trelease
448 call this%initialize_particle(particle, ip, trelease)
449 np = this%nparticles + 1
451 call this%particles%put(particle, np)
452 deallocate (particle)
453 this%rptm(ip) = this%rptm(ip) +
done
461 integer(I4B),
intent(in) :: ip
462 real(DP),
intent(in) :: trelease
464 integer(I4B) :: irow, icol, ilay, icpl
465 integer(I4B) :: ic, icu, ic_old
467 real(DP) :: top, bot, hds
469 ic = this%rptnode(ip)
470 icu = this%dis%get_nodeuser(ic)
472 call create_particle(particle)
474 if (
size(this%boundname) /= 0)
then
475 particle%name = this%boundname(ip)
481 particle%istopweaksink = this%istopweaksink
482 particle%istopzone = this%istopzone
483 particle%idrymeth = this%idrymeth
486 select type (dis => this%dis)
488 call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay)
490 call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay)
493 particle%izone = this%rptzone(ic)
498 if (this%ibound(ic) == 0)
then
501 call this%dis%highest_active(ic, this%ibound)
502 if (ic == ic_old .or. this%ibound(ic) == 0)
then
516 if (this%localz)
then
517 top = this%fmi%dis%top(ic)
518 bot = this%fmi%dis%bot(ic)
519 hds = this%fmi%gwfhead(ic)
520 z = bot + this%rptz(ip) * (hds - bot)
525 if (this%ichkmeth > 0) &
526 call this%validate_release_point(ic, x, y, z)
531 particle%trelease = trelease
534 if (this%stoptraveltime == huge(1d0))
then
535 particle%tstop = this%stoptime
537 particle%tstop = particle%trelease + this%stoptraveltime
538 if (this%stoptime < particle%tstop) particle%tstop = this%stoptime
541 particle%ttrack = particle%trelease
548 particle%frctrn = this%frctrn
549 particle%iexmeth = this%iexmeth
550 particle%extend = this%extend
551 particle%icycwin = this%icycwin
552 particle%extol = this%extol
566 integer(I4B),
pointer :: iper, ionper, nlist
567 character(len=LINELENGTH),
allocatable :: lines(:)
571 call mem_setptr(iper,
'IPER', this%input_mempath)
572 call mem_setptr(ionper,
'IONPER', this%input_mempath)
574 if (
kper == 1 .and. &
576 (ionper >
nper) .and. &
577 size(this%schedule%time_select%times) == 0)
then
584 call this%schedule%advance(lines=lines)
587 else if (iper /=
kper)
then
592 call mem_setptr(nlist,
'NBOUND', this%input_mempath)
593 call mem_setptr(settings,
'SETTING', this%input_mempath)
596 allocate (lines(nlist))
598 lines(n) = settings(n)
602 if (
size(lines) > 0) &
603 call this%schedule%advance(lines=lines)
615 real(DP),
dimension(:),
intent(in) :: hnew
616 real(DP),
dimension(:),
intent(inout) :: flowja
617 integer(I4B),
intent(in) :: imover
621 integer(I4B) :: idiag
625 if (this%nbound <= 0)
return
628 do i = 1, this%nbound
629 node = this%nodelist(i)
634 idiag = this%dis%con%ia(node)
635 rrate = this%rptm(i) * (
done /
delt)
636 flowja(idiag) = flowja(idiag) + rrate
640 this%simvals(i) = rrate
661 call this%obs%StoreObsType(
'prp', .true., indx)
666 call this%obs%StoreObsType(
'to-mvr', .true., indx)
681 character(len=LENVARNAME),
dimension(3) :: drytrack_method = &
682 &[character(len=LENVARNAME) ::
'DROP',
'STOP',
'STAY']
683 character(len=
lenvarname),
dimension(2) :: coorcheck_method = &
684 &[
character(len=LENVARNAME) ::
'NONE',
'EAGER']
685 character(len=LINELENGTH) :: trackfile, trackcsvfile, fname
687 character(len=*),
parameter :: fmtextolwrn = &
688 "('WARNING: EXIT_SOLVE_TOLERANCE is set to ',g10.3,' &
689 &which is much greater than the default value of ',g10.3,'. &
690 &The tolerance that strikes the best balance between accuracy &
691 &and runtime is problem-dependent. Since the variable being &
692 &solved varies from 0 to 1, tolerance values much less than 1 &
693 &typically give the best results.')"
696 call this%BndExtType%source_options()
699 call mem_set_value(this%stoptime,
'STOPTIME', this%input_mempath, &
702 this%input_mempath, found%stoptraveltime)
703 call mem_set_value(this%istopweaksink,
'ISTOPWEAKSINK', this%input_mempath, &
705 call mem_set_value(this%istopzone,
'ISTOPZONE', this%input_mempath, &
707 call mem_set_value(this%drape,
'DRAPE', this%input_mempath, &
709 call mem_set_value(this%idrymeth,
'IDRYMETH', this%input_mempath, &
710 drytrack_method, found%idrymeth)
711 call mem_set_value(trackfile,
'TRACKFILE', this%input_mempath, &
713 call mem_set_value(trackcsvfile,
'TRACKCSVFILE', this%input_mempath, &
715 call mem_set_value(this%localz,
'LOCALZ', this%input_mempath, &
717 call mem_set_value(this%extend,
'EXTEND', this%input_mempath, &
719 call mem_set_value(this%extol,
'EXTOL', this%input_mempath, &
721 call mem_set_value(this%rttol,
'RTTOL', this%input_mempath, &
723 call mem_set_value(this%rtfreq,
'RTFREQ', this%input_mempath, &
725 call mem_set_value(this%frctrn,
'FRCTRN', this%input_mempath, &
727 call mem_set_value(this%iexmeth,
'IEXMETH', this%input_mempath, &
729 call mem_set_value(this%ichkmeth,
'ICHKMETH', this%input_mempath, &
730 coorcheck_method, found%ichkmeth)
731 call mem_set_value(this%icycwin,
'ICYCWIN', this%input_mempath, found%icycwin)
734 if (found%idrymeth)
then
735 if (this%idrymeth == 0)
then
736 write (
errmsg,
'(a)')
'Unsupported dry tracking method. &
737 &DRY_TRACKING_METHOD must be "DROP", "STOP", or "STAY"'
741 this%idrymeth = this%idrymeth - 1
745 if (found%extol)
then
746 if (this%extol <=
dzero) &
747 call store_error(
'EXIT_SOLVE_TOLERANCE MUST BE POSITIVE')
748 if (this%extol > dem2)
then
749 write (
warnmsg, fmt=fmtextolwrn) &
755 if (found%rttol)
then
756 if (this%rttol <=
dzero) &
757 call store_error(
'RELEASE_TIME_TOLERANCE MUST BE POSITIVE')
760 if (found%rtfreq)
then
761 if (this%rtfreq <=
dzero) &
762 call store_error(
'RELEASE_TIME_FREQUENCY MUST BE POSITIVE')
765 if (found%iexmeth)
then
766 if (.not. (this%iexmeth /= 1 .or. this%iexmeth /= 2)) &
768 &1 (BRENT) OR 2 (CHANDRUPATLA)')
771 if (found%ichkmeth)
then
772 if (this%ichkmeth == 0)
then
773 write (
errmsg,
'(a)')
'Unsupported coordinate check method. &
774 &COORDINATE_CHECK_METHOD must be "NONE" or "EAGER"'
778 this%ichkmeth = this%ichkmeth - 1
782 if (found%icycwin)
then
783 if (this%icycwin < 0) &
784 call store_error(
'CYCLE_DETECTION_WINDOW MUST BE NON-NEGATIVE')
788 if (found%trackfile)
then
790 call openfile(this%itrkout, this%iout, trackfile,
'DATA(BINARY)', &
795 fname = trim(trackfile)//
'.hdr'
796 call openfile(this%itrkhdr, this%iout, fname,
'CSV', &
797 filstat_opt=
'REPLACE', mode_opt=
mnormal)
801 if (found%trackcsvfile)
then
803 call openfile(this%itrkcsv, this%iout, trackcsvfile,
'CSV', &
804 filstat_opt=
'REPLACE')
814 call this%prp_log_options(found, trackfile, trackcsvfile)
828 character(len=*),
intent(in) :: trackfile
829 character(len=*),
intent(in) :: trackcsvfile
832 character(len=*),
parameter :: fmttrkbin = &
833 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, &
834 &'OPENED ON UNIT: ', I0)"
835 character(len=*),
parameter :: fmttrkcsv = &
836 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, &
837 &'OPENED ON UNIT: ', I0)"
839 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
841 if (found%frctrn)
then
842 write (this%iout,
'(4x,a)') &
843 'IF DISV, TRACKING WILL USE THE TERNARY METHOD REGARDLESS OF CELL TYPE'
846 if (found%trackfile)
then
847 write (this%iout, fmttrkbin) trim(adjustl(trackfile)), this%itrkout
850 if (found%trackcsvfile)
then
851 write (this%iout, fmttrkcsv) trim(adjustl(trackcsvfile)), this%itrkcsv
854 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
867 call mem_set_value(this%nreleasepoints,
'NRELEASEPTS', this%input_mempath, &
869 call mem_set_value(this%nreleasetimes,
'NRELEASETIMES', this%input_mempath, &
872 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
873 write (this%iout,
'(4x,a,i0)')
'NRELEASEPTS = ', this%nreleasepoints
874 write (this%iout,
'(4x,a,i0)')
'NRELEASETIMES = ', this%nreleasetimes
875 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
878 this%maxbound = this%nreleasepoints
879 this%nbound = this%nreleasepoints
882 call this%prp_allocate_arrays()
885 call this%prp_packagedata()
886 call this%prp_releasetimes()
887 call this%prp_load_releasetimefrequency()
898 integer(I4B),
dimension(:),
pointer,
contiguous :: irptno
899 integer(I4B),
dimension(:, :),
pointer,
contiguous :: cellids
900 real(DP),
dimension(:),
pointer,
contiguous :: xrpts, yrpts, zrpts
902 contiguous :: boundnames
903 character(len=LENBOUNDNAME) :: bndName, bndNameTemp
904 character(len=9) :: cno
905 character(len=20) :: cellidstr
906 integer(I4B),
dimension(:),
allocatable :: nboundchk
907 integer(I4B),
dimension(:),
pointer :: cellid
908 integer(I4B) :: n, noder, nodeu, rptno
911 call mem_setptr(irptno,
'IRPTNO', this%input_mempath)
912 call mem_setptr(cellids,
'CELLID', this%input_mempath)
913 call mem_setptr(xrpts,
'XRPT', this%input_mempath)
914 call mem_setptr(yrpts,
'YRPT', this%input_mempath)
915 call mem_setptr(zrpts,
'ZRPT', this%input_mempath)
916 call mem_setptr(boundnames,
'BOUNDNAME', this%input_mempath)
919 allocate (nboundchk(this%nreleasepoints))
920 do n = 1, this%nreleasepoints
924 write (this%iout,
'(/1x,a)')
'PROCESSING '//trim(adjustl(this%packName)) &
927 do n = 1,
size(irptno)
931 if (rptno < 1 .or. rptno > this%nreleasepoints)
then
932 write (
errmsg,
'(a,i0,a,i0,a)') &
933 'Expected ', this%nreleasepoints,
' release points. &
934 &Points must be numbered from 1 to ', this%nreleasepoints,
'.'
940 nboundchk(rptno) = nboundchk(rptno) + 1
943 cellid => cellids(:, n)
946 if (this%dis%ndim == 1)
then
948 elseif (this%dis%ndim == 2)
then
949 nodeu =
get_node(cellid(1), 1, cellid(2), &
950 this%dis%mshape(1), 1, &
953 nodeu =
get_node(cellid(1), cellid(2), cellid(3), &
954 this%dis%mshape(1), &
955 this%dis%mshape(2), &
960 noder = this%dis%get_nodenumber(nodeu, 1)
962 call this%dis%nodeu_to_string(nodeu, cellidstr)
964 'Particle release point configured for inactive cell: '// &
965 trim(adjustl(cellidstr))//
'.'
969 this%rptnode(rptno) = noder
972 if (this%localz .and. (zrpts(n) < 0 .or. zrpts(n) > 1))
then
973 call store_error(
'Local z coordinate must fall in the interval [0, 1]')
978 this%rptx(rptno) = xrpts(n)
979 this%rpty(rptno) = yrpts(n)
980 this%rptz(rptno) = zrpts(n)
983 write (cno,
'(i9.9)') rptno
987 if (this%inamedbound /= 0)
then
988 bndnametemp = boundnames(n)
989 if (bndnametemp /=
'') bndname = bndnametemp
995 this%rptname(rptno) = bndname
998 write (this%iout,
'(1x,a)') &
999 'END OF '//trim(adjustl(this%packName))//
' PACKAGEDATA'
1002 do n = 1, this%nreleasepoints
1003 if (nboundchk(n) == 0)
then
1004 write (
errmsg,
'(a,a,1x,i0,a)')
'No data specified for particle ', &
1005 'release point', n,
'.'
1007 else if (nboundchk(n) > 1)
then
1008 write (
errmsg,
'(a,1x,i0,1x,a,1x,i0,1x,a)') &
1009 'Data for particle release point', n,
'specified', nboundchk(n), &
1021 deallocate (nboundchk)
1030 real(DP),
dimension(:),
pointer,
contiguous :: time
1031 integer(I4B) :: n, isize
1032 real(DP),
allocatable :: times(:)
1034 if (this%nreleasetimes <= 0)
return
1037 allocate (times(this%nreleasetimes))
1040 call get_isize(
'TIME', this%input_mempath, isize)
1042 if (isize <= 0)
then
1043 errmsg =
"RELEASTIMES block expected when &
1044 &NRELEASETIMES dimension is non-zero."
1050 call mem_setptr(time,
'TIME', this%input_mempath)
1053 do n = 1,
size(time)
1058 call this%schedule%time_select%extend(times)
1061 if (.not. this%schedule%time_select%increasing())
then
1062 errmsg =
"RELEASTIMES block entries must strictly increase."
1078 real(DP),
allocatable :: times(:)
1081 if (this%rtfreq <=
dzero)
return
1090 call this%schedule%time_select%extend(times)
1093 if (.not. this%schedule%time_select%increasing())
then
1094 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 dem2
real constant 1e-2
real(dp), parameter done
real constant 1
subroutine pstop(status, message)
Stop the program, optionally specifying an error status code.
integer(i4b) function, public get_node(ilay, irow, icol, nlay, nrow, ncol)
Get node number, given layer, row, and column indices for a structured grid. If any argument is inval...
logical function, public point_in_polygon(x, y, poly)
Check if a point is within a polygon.
subroutine, public get_ijk(nodenumber, nrow, ncol, nlay, irow, icol, ilay)
Get row, column and layer indices from node number and grid dimensions. If nodenumber is invalid,...
subroutine, public get_jk(nodenumber, ncpl, nlay, icpl, ilay)
Get layer index and within-layer node index from node number and grid dimensions. If nodenumber is in...
This module defines variable data types.
pure real(dp) function, dimension(:), allocatable, public arange(start, stop, step)
Return reals separated by the given step over the given interval.
pure logical function, public is_close(a, b, rtol, atol, symmetric)
Check if a real value is approximately equal to another.
subroutine, public get_isize(name, mem_path, isize)
@ brief Get the number of elements for this variable
Particle tracking strategies.
@, public level_subfeature
This module contains the derived type ObsType.
subroutine, public defaultobsidprocessor(obsrv, dis, inunitobs, iout)
@ brief Process IDstring provided for each observation
subroutine create_particle_store(store, np, mempath)
Allocate particle store.
@ term_unreleased
terminated permanently unreleased
subroutine create_particle(particle)
Create a new particle.
Particle release scheduling.
type(particlereleasescheduletype) function, pointer, public create_release_schedule(tolerance)
Create a new release schedule.
Particle track output module.
character(len= *), parameter, public trackheader
character(len= *), parameter, public trackdtypes
subroutine, 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.
real(dp), parameter default_exit_solve_tolerance
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.