24 integer(I4B),
pointer :: nrow => null()
25 integer(I4B),
pointer :: ncol => null()
26 real(dp),
dimension(:),
pointer,
contiguous :: delr => null()
27 real(dp),
dimension(:),
pointer,
contiguous :: delc => null()
28 real(dp),
dimension(:, :),
pointer,
contiguous :: bottom => null()
29 integer(I4B),
dimension(:, :),
pointer,
contiguous :: idomain => null()
30 real(dp),
dimension(:),
pointer,
contiguous :: cellx => null()
31 real(dp),
dimension(:),
pointer,
contiguous :: celly => null()
74 logical :: length_units = .false.
75 logical :: nogrb = .false.
76 logical :: xorigin = .false.
77 logical :: yorigin = .false.
78 logical :: angrot = .false.
79 logical :: nrow = .false.
80 logical :: ncol = .false.
81 logical :: delr = .false.
82 logical :: delc = .false.
83 logical :: bottom = .false.
84 logical :: idomain = .false.
91 subroutine dis2d_cr(dis, name_model, input_mempath, inunit, iout)
94 character(len=*),
intent(in) :: name_model
95 character(len=*),
intent(in) :: input_mempath
96 integer(I4B),
intent(in) :: inunit
97 integer(I4B),
intent(in) :: iout
101 character(len=*),
parameter :: fmtheader = &
102 "(1X, /1X, 'DIS -- STRUCTURED GRID DISCRETIZATION PACKAGE,', &
103 &' VERSION 2 : 3/27/2014 - INPUT READ FROM MEMPATH: ', A, /)"
107 call disnew%allocate_scalars(name_model, input_mempath)
116 write (iout, fmtheader) dis%input_mempath
129 if (this%inunit /= 0)
then
132 call this%source_options()
135 call this%source_dimensions()
138 call this%source_griddata()
142 call this%grid_finalize()
156 call this%DisBaseType%dis_da()
180 character(len=LENVARNAME),
dimension(3) :: lenunits = &
181 &[character(len=LENVARNAME) ::
'FEET',
'METERS',
'CENTIMETERS']
185 call mem_set_value(this%lenuni,
'LENGTH_UNITS', this%input_mempath, &
186 lenunits, found%length_units)
187 call mem_set_value(this%nogrb,
'NOGRB', this%input_mempath, found%nogrb)
188 call mem_set_value(this%xorigin,
'XORIGIN', this%input_mempath, found%xorigin)
189 call mem_set_value(this%yorigin,
'YORIGIN', this%input_mempath, found%yorigin)
190 call mem_set_value(this%angrot,
'ANGROT', this%input_mempath, found%angrot)
193 if (this%iout > 0)
then
194 call this%log_options(found)
206 write (this%iout,
'(1x,a)')
'Setting Discretization Options'
208 if (found%length_units)
then
209 write (this%iout,
'(4x,a,i0)')
'Model length unit [0=UND, 1=FEET, &
210 &2=METERS, 3=CENTIMETERS] set as ', this%lenuni
213 if (found%nogrb)
then
214 write (this%iout,
'(4x,a,i0)')
'Binary grid file [0=GRB, 1=NOGRB] &
215 &set as ', this%nogrb
218 if (found%xorigin)
then
219 write (this%iout,
'(4x,a,G0)')
'XORIGIN = ', this%xorigin
222 if (found%yorigin)
then
223 write (this%iout,
'(4x,a,G0)')
'YORIGIN = ', this%yorigin
226 if (found%angrot)
then
227 write (this%iout,
'(4x,a,G0)')
'ANGROT = ', this%angrot
230 write (this%iout,
'(1x,a,/)')
'End Setting Discretization Options'
244 call mem_set_value(this%nrow,
'NROW', this%input_mempath, found%nrow)
245 call mem_set_value(this%ncol,
'NCOL', this%input_mempath, found%ncol)
248 if (this%iout > 0)
then
249 call this%log_dimensions(found)
253 if (this%nrow < 1)
then
255 'NROW was not specified or was specified incorrectly.')
258 if (this%ncol < 1)
then
260 'NCOL was not specified or was specified incorrectly.')
265 this%nodesuser = this%nrow * this%ncol
268 call mem_allocate(this%delr, this%ncol,
'DELR', this%memoryPath)
269 call mem_allocate(this%delc, this%nrow,
'DELC', this%memoryPath)
270 call mem_allocate(this%idomain, this%ncol, this%nrow,
'IDOMAIN', &
272 call mem_allocate(this%bottom, this%ncol, this%nrow,
'BOTTOM', &
274 call mem_allocate(this%cellx, this%ncol,
'CELLX', this%memoryPath)
275 call mem_allocate(this%celly, this%nrow,
'CELLY', this%memoryPath)
280 this%idomain(j, i) = 1
293 write (this%iout,
'(1x,a)')
'Setting Discretization Dimensions'
296 write (this%iout,
'(4x,a,i0)')
'NROW = ', this%nrow
300 write (this%iout,
'(4x,a,i0)')
'NCOL = ', this%ncol
303 write (this%iout,
'(1x,a,/)')
'End Setting Discretization Dimensions'
315 call mem_set_value(this%delr,
'DELR', this%input_mempath, found%delr)
316 call mem_set_value(this%delc,
'DELC', this%input_mempath, found%delc)
317 call mem_set_value(this%bottom,
'BOTTOM', this%input_mempath, found%bottom)
318 call mem_set_value(this%idomain,
'IDOMAIN', this%input_mempath, found%idomain)
321 if (this%iout > 0)
then
322 call this%log_griddata(found)
334 write (this%iout,
'(1x,a)')
'Setting Discretization Griddata'
337 write (this%iout,
'(4x,a)')
'DELR set from input file'
341 write (this%iout,
'(4x,a)')
'DELC set from input file'
344 if (found%bottom)
then
345 write (this%iout,
'(4x,a)')
'BOTTOM set from input file'
348 if (found%idomain)
then
349 write (this%iout,
'(4x,a)')
'IDOMAIN set from input file'
352 write (this%iout,
'(1x,a,/)')
'End Setting Discretization Griddata'
366 integer(I4B) :: noder
367 integer(I4B) :: nrsize
369 character(len=*),
parameter :: fmtdz = &
370 "('CELL (',i0,',',i0,',',i0,') THICKNESS <= 0. ', &
371 &'TOP, BOT: ',2(1pg24.15))"
372 character(len=*),
parameter :: fmtnr = &
373 "(/1x, 'The specified IDOMAIN results in a reduced number of cells.',&
374 &/1x, 'Number of user nodes: ',I0,&
375 &/1X, 'Number of nodes in solution: ', I0, //)"
381 if (this%idomain(j, i) > 0) this%nodes = this%nodes + 1
386 if (this%nodes == 0)
then
387 call store_error(
'Model does not have any active nodes. &
388 &Ensure IDOMAIN array has some values greater &
394 if (this%nodes < this%nodesuser)
then
395 write (this%iout, fmtnr) this%nodesuser, this%nodes
399 call this%allocate_arrays()
405 if (this%nodes < this%nodesuser)
then
410 if (this%idomain(j, i) > 0)
then
411 this%nodereduced(node) = noder
413 elseif (this%idomain(j, i) < 0)
then
414 this%nodereduced(node) = -1
416 this%nodereduced(node) = 0
424 if (this%nodes < this%nodesuser)
then
429 if (this%idomain(j, i) > 0)
then
430 this%nodeuser(noder) = node
439 this%cellx(1) =
dhalf * this%delr(1)
440 this%celly(this%nrow) =
dhalf * this%delc(this%nrow)
442 this%cellx(j) = this%cellx(j - 1) +
dhalf * this%delr(j - 1) + &
446 do i = this%nrow - 1, 1, -1
447 this%celly(i) = this%celly(i + 1) +
dhalf * this%delc(i + 1) + &
457 if (this%nodes < this%nodesuser) noder = this%nodereduced(node)
458 if (noder <= 0) cycle
459 this%bot(noder) = this%bottom(j, i)
460 this%area(noder) = this%delr(j) * this%delc(i)
461 this%xc(noder) = this%cellx(j)
462 this%yc(noder) = this%celly(i)
468 if (this%nodes < this%nodesuser) nrsize = this%nodes
470 call this%con%disconnections(this%name_model, this%nodes, &
471 this%ncol, this%nrow, 1, &
472 nrsize, this%delr, this%delc, &
473 this%top, this%bot, this%nodereduced, &
475 this%nja = this%con%nja
476 this%njas = this%con%njas
488 integer(I4B),
dimension(:),
intent(in) :: icelltype
490 integer(I4B) :: iunit, ntxt, version
491 integer(I4B),
parameter :: lentxt = 100
492 character(len=50) :: txthdr
493 character(len=lentxt) :: txt
494 character(len=LINELENGTH) :: fname
495 character(len=LENBIGLINE) :: crs
496 logical(LGP) :: found_crs
497 character(len=*),
parameter :: fmtgrdsave = &
498 "(4X,'BINARY GRID INFORMATION WILL BE WRITTEN TO:', &
499 &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)"
505 call mem_set_value(crs,
'CRS', this%input_mempath, found_crs)
514 fname = trim(this%output_fname)
516 write (this%iout, fmtgrdsave) iunit, trim(adjustl(fname))
517 call openfile(iunit, this%iout, trim(adjustl(fname)),
'DATA(BINARY)', &
521 write (txthdr,
'(a)')
'GRID DIS2D'
522 txthdr(50:50) = new_line(
'a')
524 write (txthdr,
'(a)')
'VERSION 1'
525 txthdr(50:50) = new_line(
'a')
527 write (txthdr,
'(a, i0)')
'NTXT ', ntxt
528 txthdr(50:50) = new_line(
'a')
530 write (txthdr,
'(a, i0)')
'LENTXT ', lentxt
531 txthdr(50:50) = new_line(
'a')
535 write (txt,
'(3a, i0)')
'NCELLS ',
'INTEGER ',
'NDIM 0 # ', this%nodesuser
536 txt(lentxt:lentxt) = new_line(
'a')
538 write (txt,
'(3a, i0)')
'NROW ',
'INTEGER ',
'NDIM 0 # ', this%nrow
539 txt(lentxt:lentxt) = new_line(
'a')
541 write (txt,
'(3a, i0)')
'NCOL ',
'INTEGER ',
'NDIM 0 # ', this%ncol
542 txt(lentxt:lentxt) = new_line(
'a')
544 write (txt,
'(3a, i0)')
'NJA ',
'INTEGER ',
'NDIM 0 # ', this%nja
545 txt(lentxt:lentxt) = new_line(
'a')
547 write (txt,
'(3a, 1pg24.15)')
'XORIGIN ',
'DOUBLE ',
'NDIM 0 # ', this%xorigin
548 txt(lentxt:lentxt) = new_line(
'a')
550 write (txt,
'(3a, 1pg24.15)')
'YORIGIN ',
'DOUBLE ',
'NDIM 0 # ', this%yorigin
551 txt(lentxt:lentxt) = new_line(
'a')
553 write (txt,
'(3a, 1pg24.15)')
'ANGROT ',
'DOUBLE ',
'NDIM 0 # ', this%angrot
554 txt(lentxt:lentxt) = new_line(
'a')
556 write (txt,
'(3a, i0)')
'DELR ',
'DOUBLE ',
'NDIM 1 ', this%ncol
557 txt(lentxt:lentxt) = new_line(
'a')
559 write (txt,
'(3a, i0)')
'DELC ',
'DOUBLE ',
'NDIM 1 ', this%nrow
560 txt(lentxt:lentxt) = new_line(
'a')
562 write (txt,
'(3a, i0)')
'BOTM ',
'DOUBLE ',
'NDIM 1 ', this%nodesuser
563 txt(lentxt:lentxt) = new_line(
'a')
565 write (txt,
'(3a, i0)')
'IA ',
'INTEGER ',
'NDIM 1 ', this%nodesuser + 1
566 txt(lentxt:lentxt) = new_line(
'a')
568 write (txt,
'(3a, i0)')
'JA ',
'INTEGER ',
'NDIM 1 ',
size(this%con%jausr)
569 txt(lentxt:lentxt) = new_line(
'a')
571 write (txt,
'(3a, i0)')
'IDOMAIN ',
'INTEGER ',
'NDIM 1 ', this%nodesuser
572 txt(lentxt:lentxt) = new_line(
'a')
574 write (txt,
'(3a, i0)')
'ICELLTYPE ',
'INTEGER ',
'NDIM 1 ', this%nodesuser
575 txt(lentxt:lentxt) = new_line(
'a')
579 if (version == 2)
then
581 write (txt,
'(3a, i0)')
'CRS ',
'CHARACTER ',
'NDIM 1 ', &
583 txt(lentxt:lentxt) = new_line(
'a')
589 write (iunit) this%nodesuser
590 write (iunit) this%nrow
591 write (iunit) this%ncol
592 write (iunit) this%nja
593 write (iunit) this%xorigin
594 write (iunit) this%yorigin
595 write (iunit) this%angrot
596 write (iunit) this%delr
597 write (iunit) this%delc
598 write (iunit) this%bottom
599 write (iunit) this%con%iausr
600 write (iunit) this%con%jausr
601 write (iunit) this%idomain
602 write (iunit) icelltype
605 if (version == 2)
then
606 if (found_crs)
write (iunit) trim(crs)
619 integer(I4B),
intent(in) :: nodeu
620 character(len=*),
intent(inout) :: str
622 integer(I4B) :: i, j, k
623 character(len=10) :: istr, jstr
625 call get_ijk(nodeu, this%nrow, this%ncol, 1, i, j, k)
626 write (istr,
'(i10)') i
627 write (jstr,
'(i10)') j
628 str =
'('//trim(adjustl(istr))//
','// &
629 trim(adjustl(jstr))//
')'
638 integer(I4B),
intent(in) :: nodeu
639 integer(I4B),
dimension(:),
intent(inout) :: arr
641 integer(I4B) :: isize
642 integer(I4B) :: i, j, k
646 if (isize /= this%ndim)
then
647 write (
errmsg,
'(a,i0,a,i0,a)') &
648 'Program error: nodeu_to_array size of array (', isize, &
649 ') is not equal to the discretization dimension (', this%ndim,
')'
654 call get_ijk(nodeu, this%nrow, this%ncol, 1, i, j, k)
666 integer(I4B) :: nodenumber
669 integer(I4B),
intent(in) :: nodeu
670 integer(I4B),
intent(in) :: icheck
673 if (icheck /= 0)
then
676 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
677 write (
errmsg,
'(a,i0,a)') &
678 'Node number (', nodeu, &
679 ') less than 1 or greater than the number of nodes.'
684 if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu)
688 if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu)
697 integer(I4B) :: nodenumber
700 integer(I4B),
intent(in) :: k, j
701 integer(I4B),
intent(in) :: icheck
703 integer(I4B) :: nodeu, i
705 character(len=*),
parameter :: fmterr = &
706 "('Error in structured-grid cell indices: row = ',i0,&
710 nodeu =
get_node(1, i, j, 1, this%nrow, this%ncol)
712 write (
errmsg, fmterr) i, j
716 if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu)
719 if (icheck /= 0)
then
721 if (i < 1 .or. i > this%nrow) &
722 call store_error(
'Row less than one or greater than nrow')
723 if (j < 1 .or. j > this%ncol) &
724 call store_error(
'Column less than one or greater than ncol')
727 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
728 write (
errmsg,
'(a,i0,a)') &
729 'Node number (', nodeu,
')less than 1 or greater than nodes.'
741 character(len=*),
intent(in) :: name_model
742 character(len=*),
intent(in) :: input_mempath
745 call this%DisBaseType%allocate_scalars(name_model, input_mempath)
765 call this%DisBaseType%allocate_arrays()
768 if (this%nodes < this%nodesuser)
then
769 call mem_allocate(this%nodeuser, this%nodes,
'NODEUSER', this%memoryPath)
770 call mem_allocate(this%nodereduced, this%nodesuser,
'NODEREDUCED', &
773 call mem_allocate(this%nodeuser, 1,
'NODEUSER', this%memoryPath)
774 call mem_allocate(this%nodereduced, 1,
'NODEREDUCED', this%memoryPath)
778 this%mshape(1) = this%nrow
779 this%mshape(2) = this%ncol
790 flag_string, allow_zero)
result(nodeu)
793 integer(I4B),
intent(inout) :: lloc
794 integer(I4B),
intent(inout) :: istart
795 integer(I4B),
intent(inout) :: istop
796 integer(I4B),
intent(in) :: in
797 integer(I4B),
intent(in) :: iout
798 character(len=*),
intent(inout) :: line
799 logical,
optional,
intent(in) :: flag_string
800 logical,
optional,
intent(in) :: allow_zero
801 integer(I4B) :: nodeu
803 integer(I4B) :: i, j, nrow, ncol
804 integer(I4B) :: lloclocal, ndum, istat, n
807 if (
present(flag_string))
then
808 if (flag_string)
then
811 call urword(line, lloclocal, istart, istop, 1, ndum, r, iout, in)
812 read (line(istart:istop), *, iostat=istat) n
821 nrow = this%mshape(1)
822 ncol = this%mshape(2)
824 call urword(line, lloc, istart, istop, 2, i, r, iout, in)
825 call urword(line, lloc, istart, istop, 2, j, r, iout, in)
827 if (i == 0 .and. j == 0)
then
828 if (
present(allow_zero))
then
838 if (i < 1 .or. i > nrow)
then
839 write (
errmsg,
'(a,1x,a,i0,a)') &
840 trim(adjustl(
errmsg)),
'Row number in list (', i, &
841 ') is outside of the grid.'
843 if (j < 1 .or. j > ncol)
then
844 write (
errmsg,
'(a,1x,a,i0,a)') &
845 trim(adjustl(
errmsg)),
'Column number in list (', j, &
846 ') is outside of the grid.'
849 nodeu =
get_node(1, i, j, 1, nrow, ncol)
851 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
852 write (
errmsg,
'(a,1x,a,i0,a)') &
854 "Node number in list (", nodeu,
") is outside of the grid. "// &
855 "Cell number cannot be determined in line '"// &
856 trim(adjustl(line))//
"'."
859 if (len_trim(adjustl(
errmsg)) > 0)
then
875 allow_zero)
result(nodeu)
877 integer(I4B) :: nodeu
880 character(len=*),
intent(inout) :: cellid
881 integer(I4B),
intent(in) :: inunit
882 integer(I4B),
intent(in) :: iout
883 logical,
optional,
intent(in) :: flag_string
884 logical,
optional,
intent(in) :: allow_zero
886 integer(I4B) :: lloclocal, istart, istop, ndum, n
887 integer(I4B) :: i, j, nrow, ncol
888 integer(I4B) :: istat
891 if (
present(flag_string))
then
892 if (flag_string)
then
895 call urword(cellid, lloclocal, istart, istop, 1, ndum, r, iout, inunit)
896 read (cellid(istart:istop), *, iostat=istat) n
905 nrow = this%mshape(1)
906 ncol = this%mshape(2)
909 call urword(cellid, lloclocal, istart, istop, 2, i, r, iout, inunit)
910 call urword(cellid, lloclocal, istart, istop, 2, j, r, iout, inunit)
912 if (i == 0 .and. j == 0)
then
913 if (
present(allow_zero))
then
923 if (i < 1 .or. i > nrow)
then
924 write (
errmsg,
'(a,1x,a,i0,a)') &
925 trim(adjustl(
errmsg)),
'Row number in list (', i, &
926 ') is outside of the grid.'
928 if (j < 1 .or. j > ncol)
then
929 write (
errmsg,
'(a,1x,a,i0,a)') &
930 trim(adjustl(
errmsg)),
'Column number in list (', j, &
931 ') is outside of the grid.'
934 nodeu =
get_node(1, i, j, 1, nrow, ncol)
936 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
937 write (
errmsg,
'(a,1x,a,i0,a)') &
939 "Cell number cannot be determined for cellid ("// &
940 trim(adjustl(cellid))//
") and results in a user "// &
941 "node number (", nodeu,
") that is outside of the grid."
944 if (len_trim(adjustl(
errmsg)) > 0)
then
977 integer(I4B),
intent(in) :: noden
978 integer(I4B),
intent(in) :: nodem
979 integer(I4B),
intent(in) :: ihc
980 real(DP),
intent(inout) :: xcomp
981 real(DP),
intent(inout) :: ycomp
982 real(DP),
intent(inout) :: zcomp
983 integer(I4B),
intent(in) :: ipos
985 integer(I4B) :: nodeu1, i1, j1, k1
986 integer(I4B) :: nodeu2, i2, j2, k2
992 if (nodem < noden)
then
1005 nodeu1 = this%get_nodeuser(noden)
1006 nodeu2 = this%get_nodeuser(nodem)
1007 call get_ijk(nodeu1, this%nrow, this%ncol, 1, i1, j1, k1)
1008 call get_ijk(nodeu2, this%nrow, this%ncol, 1, i2, j2, k2)
1011 elseif (j2 < j1)
then
1013 elseif (j2 > j1)
then
1027 xcomp, ycomp, zcomp, conlen)
1032 integer(I4B),
intent(in) :: noden
1033 integer(I4B),
intent(in) :: nodem
1034 logical,
intent(in) :: nozee
1035 real(DP),
intent(in) :: satn
1036 real(DP),
intent(in) :: satm
1037 integer(I4B),
intent(in) :: ihc
1038 real(DP),
intent(inout) :: xcomp
1039 real(DP),
intent(inout) :: ycomp
1040 real(DP),
intent(inout) :: zcomp
1041 real(DP),
intent(inout) :: conlen
1044 real(DP) :: x1, y1, x2, y2
1046 integer(I4B) :: i1, i2, j1, j2, k1, k2
1047 integer(I4B) :: nodeu1, nodeu2, ipos
1052 ipos = this%con%getjaindex(noden, nodem)
1053 ds = this%con%cl1(this%con%jas(ipos)) + this%con%cl2(this%con%jas(ipos))
1054 nodeu1 = this%get_nodeuser(noden)
1055 nodeu2 = this%get_nodeuser(nodem)
1056 call get_ijk(nodeu1, this%nrow, this%ncol, 1, i1, j1, k1)
1057 call get_ijk(nodeu2, this%nrow, this%ncol, 1, i2, j2, k2)
1064 elseif (j2 < j1)
then
1066 elseif (j2 > j1)
then
1079 character(len=*),
intent(out) :: dis_type
1089 integer(I4B) :: dis_enum
1100 integer(I4B),
intent(in) :: ic
1101 real(DP),
allocatable,
intent(out) :: polyverts(:, :)
1102 logical(LGP),
intent(in),
optional :: closed
1104 integer(I4B) :: icu, nverts, irow, jcol, klay
1105 real(DP) :: cellx, celly, dxhalf, dyhalf
1106 logical(LGP) :: lclosed
1111 if (.not. (
present(closed)))
then
1119 allocate (polyverts(2, nverts + 1))
1121 allocate (polyverts(2, nverts))
1125 icu = this%get_nodeuser(ic)
1126 call get_ijk(icu, this%nrow, this%ncol, 1, irow, jcol, klay)
1127 cellx = this%cellx(jcol)
1128 celly = this%celly(irow)
1129 dxhalf =
dhalf * this%delr(jcol)
1130 dyhalf =
dhalf * this%delc(irow)
1131 polyverts(:, 1) = (/cellx - dxhalf, celly - dyhalf/)
1132 polyverts(:, 2) = (/cellx - dxhalf, celly + dyhalf/)
1133 polyverts(:, 3) = (/cellx + dxhalf, celly + dyhalf/)
1134 polyverts(:, 4) = (/cellx + dxhalf, celly - dyhalf/)
1138 polyverts(:, nverts + 1) = polyverts(:, 1)
1148 character(len=*),
intent(inout) :: line
1149 integer(I4B),
intent(inout) :: lloc
1150 integer(I4B),
intent(inout) :: istart
1151 integer(I4B),
intent(inout) :: istop
1152 integer(I4B),
intent(in) :: in
1153 integer(I4B),
intent(in) :: iout
1154 integer(I4B),
dimension(:),
pointer,
contiguous,
intent(inout) :: iarray
1155 character(len=*),
intent(in) :: aname
1167 character(len=*),
intent(inout) :: line
1168 integer(I4B),
intent(inout) :: lloc
1169 integer(I4B),
intent(inout) :: istart
1170 integer(I4B),
intent(inout) :: istop
1171 integer(I4B),
intent(in) :: in
1172 integer(I4B),
intent(in) :: iout
1173 real(DP),
dimension(:),
pointer,
contiguous,
intent(inout) :: darray
1174 character(len=*),
intent(in) :: aname
1184 icolbnd, aname, inunit, iout)
1187 integer(I4B),
intent(in) :: maxbnd
1188 integer(I4B),
dimension(maxbnd) :: nodelist
1189 integer(I4B),
intent(in) :: ncolbnd
1190 real(DP),
dimension(ncolbnd, maxbnd),
intent(inout) :: darray
1191 integer(I4B),
intent(in) :: icolbnd
1192 character(len=*),
intent(in) :: aname
1193 integer(I4B),
intent(in) :: inunit
1194 integer(I4B),
intent(in) :: iout
1204 cdatafmp, nvaluesp, nwidthp, editdesc, dinact)
1207 real(DP),
dimension(:),
pointer,
contiguous,
intent(inout) :: darray
1208 integer(I4B),
intent(in) :: iout
1209 integer(I4B),
intent(in) :: iprint
1210 integer(I4B),
intent(in) :: idataun
1211 character(len=*),
intent(in) :: aname
1212 character(len=*),
intent(in) :: cdatafmp
1213 integer(I4B),
intent(in) :: nvaluesp
1214 integer(I4B),
intent(in) :: nwidthp
1215 character(len=*),
intent(in) :: editdesc
1216 real(DP),
intent(in) :: dinact
1218 integer(I4B) :: k, ifirst
1219 integer(I4B) :: nlay
1220 integer(I4B) :: nrow
1221 integer(I4B) :: ncol
1222 integer(I4B) :: nval
1223 integer(I4B) :: nodeu, noder
1224 integer(I4B) :: istart, istop
1225 real(DP),
dimension(:),
pointer,
contiguous :: dtemp
1227 character(len=*),
parameter :: fmthsv = &
1228 "(1X,/1X,a,' WILL BE SAVED ON UNIT ',I4, &
1229 &' AT END OF TIME STEP',I5,', STRESS PERIOD ',I4)"
1233 nrow = this%mshape(1)
1234 ncol = this%mshape(2)
1238 if (this%nodes < this%nodesuser)
then
1241 do nodeu = 1, this%nodesuser
1242 noder = this%get_nodenumber(nodeu, 0)
1243 if (noder <= 0)
then
1244 dtemp(nodeu) = dinact
1247 dtemp(nodeu) = darray(noder)
1255 if (iprint /= 0)
then
1258 istop = istart + nrow * ncol - 1
1260 aname, cdatafmp, nvaluesp, nwidthp, editdesc)
1266 if (idataun > 0)
then
1271 istop = istart + nrow * ncol - 1
1272 if (ifirst == 1)
write (iout, fmthsv) &
1273 trim(adjustl(aname)), idataun, &
1280 elseif (idataun < 0)
then
1283 call ubdsv1(
kstp,
kper, aname, -idataun, dtemp, ncol, nrow, nlay, &
1292 dstmodel, dstpackage, naux, auxtxt, &
1293 ibdchn, nlist, iout)
1296 character(len=16),
intent(in) :: text
1297 character(len=16),
intent(in) :: textmodel
1298 character(len=16),
intent(in) :: textpackage
1299 character(len=16),
intent(in) :: dstmodel
1300 character(len=16),
intent(in) :: dstpackage
1301 integer(I4B),
intent(in) :: naux
1302 character(len=16),
dimension(:),
intent(in) :: auxtxt
1303 integer(I4B),
intent(in) :: ibdchn
1304 integer(I4B),
intent(in) :: nlist
1305 integer(I4B),
intent(in) :: iout
1307 integer(I4B) :: nlay, nrow, ncol
1310 nrow = this%mshape(1)
1311 ncol = this%mshape(2)
1314 call ubdsv06(
kstp,
kper, text, textmodel, textpackage, dstmodel, dstpackage, &
1315 ibdchn, naux, auxtxt, ncol, nrow, nlay, &
1325 integer(I4B),
intent(in) :: maxbnd
1326 integer(I4B),
dimension(:),
pointer,
contiguous :: darray
1327 integer(I4B),
dimension(maxbnd),
intent(inout) :: nodelist
1328 integer(I4B),
intent(inout) :: nbound
1329 character(len=*),
intent(in) :: aname
1331 integer(I4B) :: il, ir, ic, ncol, nrow, nlay, nval, nodeu, noder, ipos, ierr
1335 nrow = this%mshape(1)
1336 ncol = this%mshape(2)
1338 if (this%ndim > 1)
then
1347 nodeu =
get_node(1, ir, ic, nlay, nrow, ncol)
1349 if (il < 1 .or. il > nlay)
then
1350 write (
errmsg,
'(a,1x,i0)')
'Invalid layer number:', il
1353 nodeu =
get_node(il, ir, ic, nlay, nrow, ncol)
1354 noder = this%get_nodenumber(nodeu, 0)
1355 if (ipos > maxbnd)
then
1358 nodelist(ipos) = noder
1367 write (
errmsg,
'(a,1x,i0)') &
1368 'MAXBOUND dimension is too small.'// &
1369 'INCREASE MAXBOUND TO:', ierr
1374 if (nbound < maxbnd)
then
1375 do ipos = nbound + 1, maxbnd
1384 do noder = 1, maxbnd
1385 if (noder < 1 .or. noder > this%nodes)
then
1386 write (
errmsg,
'(a,1x,i0)')
'Invalid node number:', noder
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
integer(i4b), parameter lenbigline
maximum length of a big line
@ dis2d
DIS2D6 discretization.
integer(i4b), parameter lenvarname
maximum length of a variable name
real(dp), parameter dhalf
real constant 1/2
real(dp), parameter dzero
real constant zero
integer(i4b), parameter lenmempath
maximum length of the memory path
real(dp), parameter done
real constant 1
subroutine read_layer_array(this, nodelist, darray, ncolbnd, maxbnd, icolbnd, aname, inunit, iout)
Read a 2d double array into col icolbnd of darray.
subroutine read_int_array(this, line, lloc, istart, istop, iout, in, iarray, aname)
Read an integer array.
integer(i4b) function get_nodenumber_idx2(this, k, j, icheck)
Get reduced node number from layer, row and column indices.
subroutine log_options(this, found)
Write user options to list file.
subroutine, public dis2d_cr(dis, name_model, input_mempath, inunit, iout)
Create a new structured discretization object.
subroutine nodeu_to_string(this, nodeu, str)
Convert a user nodenumber to a string (nodenumber) or (k,i,j)
subroutine record_srcdst_list_header(this, text, textmodel, textpackage, dstmodel, dstpackage, naux, auxtxt, ibdchn, nlist, iout)
Record list header for imeth=6.
subroutine get_dis_type(this, dis_type)
Get the discretization type.
integer(i4b) function nodeu_from_cellid(this, cellid, inunit, iout, flag_string, allow_zero)
Convert a cellid string to a user nodenumber.
integer(i4b) function get_dis_enum(this)
Get the discretization type enumeration.
subroutine dis3d_da(this)
Deallocate variables.
subroutine nodeu_to_array(this, nodeu, arr)
Convert a user nodenumber to an array (nodenumber) or (i,j)
subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, xcomp, ycomp, zcomp, conlen)
Get unit vector components between the cell and a given neighbor.
subroutine read_dbl_array(this, line, lloc, istart, istop, iout, in, darray, aname)
Read a double precision array.
subroutine source_options(this)
Copy options from IDM into package.
subroutine log_griddata(this, found)
Write dimensions to list file.
integer(i4b) function get_ncpl(this)
Return number of cells per layer (nrow * ncol)
subroutine record_array(this, darray, iout, iprint, idataun, aname, cdatafmp, nvaluesp, nwidthp, editdesc, dinact)
Record a double precision array.
subroutine allocate_scalars(this, name_model, input_mempath)
Allocate and initialize scalar variables.
subroutine grid_finalize(this)
Finalize grid (check properties, allocate arrays, compute connections)
logical function supports_layers(this)
Indicates whether the grid discretization supports layers.
subroutine log_dimensions(this, found)
Write dimensions to list file.
subroutine allocate_arrays(this)
Allocate and initialize arrays.
integer(i4b) function get_nodenumber_idx1(this, nodeu, icheck)
Get reduced node number from user node number.
subroutine connection_normal(this, noden, nodem, ihc, xcomp, ycomp, zcomp, ipos)
Get normal vector components between the cell and a given neighbor.
integer(i4b) function nodeu_from_string(this, lloc, istart, istop, in, iout, line, flag_string, allow_zero)
Convert a string to a user nodenumber.
subroutine source_dimensions(this)
Copy dimensions from IDM into package.
subroutine source_griddata(this)
Copy grid data from IDM into package.
subroutine nlarray_to_nodelist(this, darray, nodelist, maxbnd, nbound, aname)
Convert an integer array (layer numbers) to nodelist.
subroutine write_grb(this, icelltype)
Write a binary grid file.
subroutine get_polyverts(this, ic, polyverts, closed)
Get a 2D array of polygon vertices, listed in.
subroutine dis3d_df(this)
Define the discretization.
subroutine, public line_unit_vector(x0, y0, z0, x1, y1, z1, xcomp, ycomp, zcomp, vmag)
Calculate the vector components (xcomp, ycomp, and zcomp) for a line defined by two points,...
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...
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,...
This module defines variable data types.
subroutine, public memorystore_remove(component, subcomponent, context)
This module contains simulation methods.
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.
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=linelength) idm_context
real(dp), pointer, public pertim
time relative to start of stress period
real(dp), pointer, public totim
time relative to start of simulation
integer(i4b), pointer, public kstp
current time step number
integer(i4b), pointer, public kper
current stress period number
real(dp), pointer, public delt
length of the current time step
Structured grid discretization.
Simplifies tracking parameters sourced from the input context.