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 character(len=*),
parameter :: fmticterr = &
470 "('Error in ',a,': Flow model interface does not contain ICELLTYPE. &
471 &ICELLTYPE is required for PRT to distinguish convertible cells &
472 &from confined cells if LOCAL_Z release coordinates are provided. &
473 &Make sure a GWFGRID entry is configured in the PRT FMI package.')"
475 ic = this%rptnode(ip)
476 icu = this%dis%get_nodeuser(ic)
478 call create_particle(particle)
480 if (
size(this%boundname) /= 0)
then
481 particle%name = this%boundname(ip)
487 particle%istopweaksink = this%istopweaksink
488 particle%istopzone = this%istopzone
489 particle%idrymeth = this%idrymeth
492 select type (dis => this%dis)
494 call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay)
496 call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay)
499 particle%izone = this%rptzone(ic)
504 if (this%ibound(ic) == 0)
then
507 call this%dis%highest_active(ic, this%ibound)
508 if (ic == ic_old .or. this%ibound(ic) == 0)
then
522 if (this%localz)
then
526 if (this%fmi%igwfceltyp /= 1)
then
527 write (
errmsg, fmticterr) trim(this%text)
536 top = this%fmi%dis%top(ic)
537 bot = this%fmi%dis%bot(ic)
538 hds = this%fmi%gwfhead(ic)
539 if (this%fmi%gwfceltyp(icu) /= 0) top = hds
540 if (top < bot) top = bot
541 z = bot + this%rptz(ip) * (top - bot)
546 if (this%ichkmeth > 0) &
547 call this%validate_release_point(ic, x, y, z)
552 particle%trelease = trelease
555 if (this%stoptraveltime == huge(1d0))
then
556 particle%tstop = this%stoptime
558 particle%tstop = particle%trelease + this%stoptraveltime
559 if (this%stoptime < particle%tstop) particle%tstop = this%stoptime
562 particle%ttrack = particle%trelease
569 particle%frctrn = this%frctrn
570 particle%iexmeth = this%iexmeth
571 particle%extend = this%extend
572 particle%icycwin = this%icycwin
573 particle%extol = this%extol
587 integer(I4B),
pointer :: iper, ionper, nlist
588 character(len=LINELENGTH),
allocatable :: lines(:)
592 call mem_setptr(iper,
'IPER', this%input_mempath)
593 call mem_setptr(ionper,
'IONPER', this%input_mempath)
595 if (
kper == 1 .and. &
597 (ionper >
nper) .and. &
598 size(this%schedule%time_select%times) == 0)
then
605 call this%schedule%advance(lines=lines)
608 else if (iper /=
kper)
then
613 call mem_setptr(nlist,
'NBOUND', this%input_mempath)
614 call mem_setptr(settings,
'SETTING', this%input_mempath)
617 allocate (lines(nlist))
619 lines(n) = settings(n)
623 if (
size(lines) > 0) &
624 call this%schedule%advance(lines=lines)
636 real(DP),
dimension(:),
intent(in) :: hnew
637 real(DP),
dimension(:),
intent(inout) :: flowja
638 integer(I4B),
intent(in) :: imover
642 integer(I4B) :: idiag
646 if (this%nbound <= 0)
return
649 do i = 1, this%nbound
650 node = this%nodelist(i)
655 idiag = this%dis%con%ia(node)
656 rrate = this%rptm(i) * (
done /
delt)
657 flowja(idiag) = flowja(idiag) + rrate
661 this%simvals(i) = rrate
682 call this%obs%StoreObsType(
'prp', .true., indx)
687 call this%obs%StoreObsType(
'to-mvr', .true., indx)
702 character(len=LENVARNAME),
dimension(3) :: drytrack_method = &
703 &[character(len=LENVARNAME) ::
'DROP',
'STOP',
'STAY']
704 character(len=
lenvarname),
dimension(2) :: coorcheck_method = &
705 &[
character(len=LENVARNAME) ::
'NONE',
'EAGER']
706 character(len=LINELENGTH) :: trackfile, trackcsvfile, fname
708 character(len=*),
parameter :: fmtextolwrn = &
709 "('WARNING: EXIT_SOLVE_TOLERANCE is set to ',g10.3,' &
710 &which is much greater than the default value of ',g10.3,'. &
711 &The tolerance that strikes the best balance between accuracy &
712 &and runtime is problem-dependent. Since the variable being &
713 &solved varies from 0 to 1, tolerance values much less than 1 &
714 &typically give the best results.')"
717 call this%BndExtType%source_options()
720 call mem_set_value(this%stoptime,
'STOPTIME', this%input_mempath, &
723 this%input_mempath, found%stoptraveltime)
724 call mem_set_value(this%istopweaksink,
'ISTOPWEAKSINK', this%input_mempath, &
726 call mem_set_value(this%istopzone,
'ISTOPZONE', this%input_mempath, &
728 call mem_set_value(this%drape,
'DRAPE', this%input_mempath, &
730 call mem_set_value(this%idrymeth,
'IDRYMETH', this%input_mempath, &
731 drytrack_method, found%idrymeth)
732 call mem_set_value(trackfile,
'TRACKFILE', this%input_mempath, &
734 call mem_set_value(trackcsvfile,
'TRACKCSVFILE', this%input_mempath, &
736 call mem_set_value(this%localz,
'LOCALZ', this%input_mempath, &
738 call mem_set_value(this%extend,
'EXTEND', this%input_mempath, &
740 call mem_set_value(this%extol,
'EXTOL', this%input_mempath, &
742 call mem_set_value(this%rttol,
'RTTOL', this%input_mempath, &
744 call mem_set_value(this%rtfreq,
'RTFREQ', this%input_mempath, &
746 call mem_set_value(this%frctrn,
'FRCTRN', this%input_mempath, &
748 call mem_set_value(this%iexmeth,
'IEXMETH', this%input_mempath, &
750 call mem_set_value(this%ichkmeth,
'ICHKMETH', this%input_mempath, &
751 coorcheck_method, found%ichkmeth)
752 call mem_set_value(this%icycwin,
'ICYCWIN', this%input_mempath, found%icycwin)
755 if (found%idrymeth)
then
756 if (this%idrymeth == 0)
then
757 write (
errmsg,
'(a)')
'Unsupported dry tracking method. &
758 &DRY_TRACKING_METHOD must be "DROP", "STOP", or "STAY"'
762 this%idrymeth = this%idrymeth - 1
766 if (found%extol)
then
767 if (this%extol <=
dzero) &
768 call store_error(
'EXIT_SOLVE_TOLERANCE MUST BE POSITIVE')
769 if (this%extol > dem2)
then
770 write (
warnmsg, fmt=fmtextolwrn) &
776 if (found%rttol)
then
777 if (this%rttol <=
dzero) &
778 call store_error(
'RELEASE_TIME_TOLERANCE MUST BE POSITIVE')
781 if (found%rtfreq)
then
782 if (this%rtfreq <=
dzero) &
783 call store_error(
'RELEASE_TIME_FREQUENCY MUST BE POSITIVE')
786 if (found%iexmeth)
then
787 if (.not. (this%iexmeth /= 1 .or. this%iexmeth /= 2)) &
789 &1 (BRENT) OR 2 (CHANDRUPATLA)')
792 if (found%ichkmeth)
then
793 if (this%ichkmeth == 0)
then
794 write (
errmsg,
'(a)')
'Unsupported coordinate check method. &
795 &COORDINATE_CHECK_METHOD must be "NONE" or "EAGER"'
799 this%ichkmeth = this%ichkmeth - 1
803 if (found%icycwin)
then
804 if (this%icycwin < 0) &
805 call store_error(
'CYCLE_DETECTION_WINDOW MUST BE NON-NEGATIVE')
809 if (found%trackfile)
then
811 call openfile(this%itrkout, this%iout, trackfile,
'DATA(BINARY)', &
816 fname = trim(trackfile)//
'.hdr'
817 call openfile(this%itrkhdr, this%iout, fname,
'CSV', &
818 filstat_opt=
'REPLACE', mode_opt=
mnormal)
822 if (found%trackcsvfile)
then
824 call openfile(this%itrkcsv, this%iout, trackcsvfile,
'CSV', &
825 filstat_opt=
'REPLACE')
835 call this%prp_log_options(found, trackfile, trackcsvfile)
849 character(len=*),
intent(in) :: trackfile
850 character(len=*),
intent(in) :: trackcsvfile
853 character(len=*),
parameter :: fmttrkbin = &
854 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, &
855 &'OPENED ON UNIT: ', I0)"
856 character(len=*),
parameter :: fmttrkcsv = &
857 "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, &
858 &'OPENED ON UNIT: ', I0)"
860 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
862 if (found%frctrn)
then
863 write (this%iout,
'(4x,a)') &
864 'IF DISV, TRACKING WILL USE THE TERNARY METHOD REGARDLESS OF CELL TYPE'
867 if (found%trackfile)
then
868 write (this%iout, fmttrkbin) trim(adjustl(trackfile)), this%itrkout
871 if (found%trackcsvfile)
then
872 write (this%iout, fmttrkcsv) trim(adjustl(trackcsvfile)), this%itrkcsv
875 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
888 call mem_set_value(this%nreleasepoints,
'NRELEASEPTS', this%input_mempath, &
890 call mem_set_value(this%nreleasetimes,
'NRELEASETIMES', this%input_mempath, &
893 write (this%iout,
'(1x,a)')
'PROCESSING PARTICLE INPUT DIMENSIONS'
894 write (this%iout,
'(4x,a,i0)')
'NRELEASEPTS = ', this%nreleasepoints
895 write (this%iout,
'(4x,a,i0)')
'NRELEASETIMES = ', this%nreleasetimes
896 write (this%iout,
'(1x,a)')
'END OF PARTICLE INPUT DIMENSIONS'
899 this%maxbound = this%nreleasepoints
900 this%nbound = this%nreleasepoints
903 call this%prp_allocate_arrays()
906 call this%prp_packagedata()
907 call this%prp_releasetimes()
908 call this%prp_load_releasetimefrequency()
919 integer(I4B),
dimension(:),
pointer,
contiguous :: irptno
920 integer(I4B),
dimension(:, :),
pointer,
contiguous :: cellids
921 real(DP),
dimension(:),
pointer,
contiguous :: xrpts, yrpts, zrpts
923 contiguous :: boundnames
924 character(len=LENBOUNDNAME) :: bndName, bndNameTemp
925 character(len=9) :: cno
926 character(len=20) :: cellidstr
927 integer(I4B),
dimension(:),
allocatable :: nboundchk
928 integer(I4B),
dimension(:),
pointer :: cellid
929 integer(I4B) :: n, noder, nodeu, rptno
932 call mem_setptr(irptno,
'IRPTNO', this%input_mempath)
933 call mem_setptr(cellids,
'CELLID', this%input_mempath)
934 call mem_setptr(xrpts,
'XRPT', this%input_mempath)
935 call mem_setptr(yrpts,
'YRPT', this%input_mempath)
936 call mem_setptr(zrpts,
'ZRPT', this%input_mempath)
937 call mem_setptr(boundnames,
'BOUNDNAME', this%input_mempath)
940 allocate (nboundchk(this%nreleasepoints))
941 do n = 1, this%nreleasepoints
945 write (this%iout,
'(/1x,a)')
'PROCESSING '//trim(adjustl(this%packName)) &
948 do n = 1,
size(irptno)
952 if (rptno < 1 .or. rptno > this%nreleasepoints)
then
953 write (
errmsg,
'(a,i0,a,i0,a)') &
954 'Expected ', this%nreleasepoints,
' release points. &
955 &Points must be numbered from 1 to ', this%nreleasepoints,
'.'
961 nboundchk(rptno) = nboundchk(rptno) + 1
964 cellid => cellids(:, n)
967 if (this%dis%ndim == 1)
then
969 elseif (this%dis%ndim == 2)
then
970 nodeu =
get_node(cellid(1), 1, cellid(2), &
971 this%dis%mshape(1), 1, &
974 nodeu =
get_node(cellid(1), cellid(2), cellid(3), &
975 this%dis%mshape(1), &
976 this%dis%mshape(2), &
981 noder = this%dis%get_nodenumber(nodeu, 1)
983 call this%dis%nodeu_to_string(nodeu, cellidstr)
985 'Particle release point configured for nonexistent cell: '// &
986 trim(adjustl(cellidstr))//
'. This cell has IDOMAIN <= 0 and '&
987 &
'therefore does not exist in the model grid.'
991 this%rptnode(rptno) = noder
994 if (this%localz .and. (zrpts(n) < 0 .or. zrpts(n) > 1))
then
995 call store_error(
'Local z coordinate must fall in the interval [0, 1]')
1000 this%rptx(rptno) = xrpts(n)
1001 this%rpty(rptno) = yrpts(n)
1002 this%rptz(rptno) = zrpts(n)
1005 write (cno,
'(i9.9)') rptno
1006 bndname =
'PRP'//cno
1009 if (this%inamedbound /= 0)
then
1010 bndnametemp = boundnames(n)
1011 if (bndnametemp /=
'') bndname = bndnametemp
1017 this%rptname(rptno) = bndname
1020 write (this%iout,
'(1x,a)') &
1021 'END OF '//trim(adjustl(this%packName))//
' PACKAGEDATA'
1024 do n = 1, this%nreleasepoints
1025 if (nboundchk(n) == 0)
then
1026 write (
errmsg,
'(a,a,1x,i0,a)')
'No data specified for particle ', &
1027 'release point', n,
'.'
1029 else if (nboundchk(n) > 1)
then
1030 write (
errmsg,
'(a,1x,i0,1x,a,1x,i0,1x,a)') &
1031 'Data for particle release point', n,
'specified', nboundchk(n), &
1043 deallocate (nboundchk)
1052 real(DP),
dimension(:),
pointer,
contiguous :: time
1053 integer(I4B) :: n, isize
1054 real(DP),
allocatable :: times(:)
1056 if (this%nreleasetimes <= 0)
return
1059 allocate (times(this%nreleasetimes))
1062 call get_isize(
'TIME', this%input_mempath, isize)
1064 if (isize <= 0)
then
1065 errmsg =
"RELEASTIMES block expected when &
1066 &NRELEASETIMES dimension is non-zero."
1072 call mem_setptr(time,
'TIME', this%input_mempath)
1075 do n = 1,
size(time)
1080 call this%schedule%time_select%extend(times)
1083 if (.not. this%schedule%time_select%increasing())
then
1084 errmsg =
"RELEASTIMES block entries must strictly increase."
1100 real(DP),
allocatable :: times(:)
1103 if (this%rtfreq <=
dzero)
return
1112 call this%schedule%time_select%extend(times)
1115 if (.not. this%schedule%time_select%increasing())
then
1116 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.