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
487 integer(I4B),
dimension(:),
intent(in) :: icelltype
489 integer(I4B) :: iunit, ntxt
490 integer(I4B),
parameter :: lentxt = 100
491 character(len=50) :: txthdr
492 character(len=lentxt) :: txt
493 character(len=LINELENGTH) :: fname
494 character(len=*),
parameter :: fmtgrdsave = &
495 "(4X,'BINARY GRID INFORMATION WILL BE WRITTEN TO:', &
496 &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)"
502 fname = trim(this%input_fname)//
'.grb'
504 write (this%iout, fmtgrdsave) iunit, trim(adjustl(fname))
505 call openfile(iunit, this%iout, trim(adjustl(fname)),
'DATA(BINARY)', &
509 write (txthdr,
'(a)')
'GRID DIS2D'
510 txthdr(50:50) = new_line(
'a')
512 write (txthdr,
'(a)')
'VERSION 1'
513 txthdr(50:50) = new_line(
'a')
515 write (txthdr,
'(a, i0)')
'NTXT ', ntxt
516 txthdr(50:50) = new_line(
'a')
518 write (txthdr,
'(a, i0)')
'LENTXT ', lentxt
519 txthdr(50:50) = new_line(
'a')
523 write (txt,
'(3a, i0)')
'NCELLS ',
'INTEGER ',
'NDIM 0 # ', this%nodesuser
524 txt(lentxt:lentxt) = new_line(
'a')
526 write (txt,
'(3a, i0)')
'NROW ',
'INTEGER ',
'NDIM 0 # ', this%nrow
527 txt(lentxt:lentxt) = new_line(
'a')
529 write (txt,
'(3a, i0)')
'NCOL ',
'INTEGER ',
'NDIM 0 # ', this%ncol
530 txt(lentxt:lentxt) = new_line(
'a')
532 write (txt,
'(3a, i0)')
'NJA ',
'INTEGER ',
'NDIM 0 # ', this%nja
533 txt(lentxt:lentxt) = new_line(
'a')
535 write (txt,
'(3a, 1pg24.15)')
'XORIGIN ',
'DOUBLE ',
'NDIM 0 # ', this%xorigin
536 txt(lentxt:lentxt) = new_line(
'a')
538 write (txt,
'(3a, 1pg24.15)')
'YORIGIN ',
'DOUBLE ',
'NDIM 0 # ', this%yorigin
539 txt(lentxt:lentxt) = new_line(
'a')
541 write (txt,
'(3a, 1pg24.15)')
'ANGROT ',
'DOUBLE ',
'NDIM 0 # ', this%angrot
542 txt(lentxt:lentxt) = new_line(
'a')
544 write (txt,
'(3a, i0)')
'DELR ',
'DOUBLE ',
'NDIM 1 ', this%ncol
545 txt(lentxt:lentxt) = new_line(
'a')
547 write (txt,
'(3a, i0)')
'DELC ',
'DOUBLE ',
'NDIM 1 ', this%nrow
548 txt(lentxt:lentxt) = new_line(
'a')
550 write (txt,
'(3a, i0)')
'BOTM ',
'DOUBLE ',
'NDIM 1 ', this%nodesuser
551 txt(lentxt:lentxt) = new_line(
'a')
553 write (txt,
'(3a, i0)')
'IA ',
'INTEGER ',
'NDIM 1 ', this%nodesuser + 1
554 txt(lentxt:lentxt) = new_line(
'a')
556 write (txt,
'(3a, i0)')
'JA ',
'INTEGER ',
'NDIM 1 ',
size(this%con%jausr)
557 txt(lentxt:lentxt) = new_line(
'a')
559 write (txt,
'(3a, i0)')
'IDOMAIN ',
'INTEGER ',
'NDIM 1 ', this%nodesuser
560 txt(lentxt:lentxt) = new_line(
'a')
562 write (txt,
'(3a, i0)')
'ICELLTYPE ',
'INTEGER ',
'NDIM 1 ', this%nodesuser
563 txt(lentxt:lentxt) = new_line(
'a')
567 write (iunit) this%nodesuser
568 write (iunit) this%nrow
569 write (iunit) this%ncol
570 write (iunit) this%nja
571 write (iunit) this%xorigin
572 write (iunit) this%yorigin
573 write (iunit) this%angrot
574 write (iunit) this%delr
575 write (iunit) this%delc
576 write (iunit) this%bottom
577 write (iunit) this%con%iausr
578 write (iunit) this%con%jausr
579 write (iunit) this%idomain
580 write (iunit) icelltype
592 integer(I4B),
intent(in) :: nodeu
593 character(len=*),
intent(inout) :: str
595 integer(I4B) :: i, j, k
596 character(len=10) :: istr, jstr
598 call get_ijk(nodeu, this%nrow, this%ncol, 1, i, j, k)
599 write (istr,
'(i10)') i
600 write (jstr,
'(i10)') j
601 str =
'('//trim(adjustl(istr))//
','// &
602 trim(adjustl(jstr))//
')'
611 integer(I4B),
intent(in) :: nodeu
612 integer(I4B),
dimension(:),
intent(inout) :: arr
614 integer(I4B) :: isize
615 integer(I4B) :: i, j, k
619 if (isize /= this%ndim)
then
620 write (
errmsg,
'(a,i0,a,i0,a)') &
621 'Program error: nodeu_to_array size of array (', isize, &
622 ') is not equal to the discretization dimension (', this%ndim,
')'
627 call get_ijk(nodeu, this%nrow, this%ncol, 1, i, j, k)
639 integer(I4B) :: nodenumber
642 integer(I4B),
intent(in) :: nodeu
643 integer(I4B),
intent(in) :: icheck
646 if (icheck /= 0)
then
649 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
650 write (
errmsg,
'(a,i0,a)') &
651 'Node number (', nodeu, &
652 ') less than 1 or greater than the number of nodes.'
657 if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu)
661 if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu)
670 integer(I4B) :: nodenumber
673 integer(I4B),
intent(in) :: k, j
674 integer(I4B),
intent(in) :: icheck
676 integer(I4B) :: nodeu, i
678 character(len=*),
parameter :: fmterr = &
679 "('Error in structured-grid cell indices: row = ',i0,&
683 nodeu =
get_node(1, i, j, 1, this%nrow, this%ncol)
685 write (
errmsg, fmterr) i, j
689 if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu)
692 if (icheck /= 0)
then
694 if (i < 1 .or. i > this%nrow) &
695 call store_error(
'Row less than one or greater than nrow')
696 if (j < 1 .or. j > this%ncol) &
697 call store_error(
'Column less than one or greater than ncol')
700 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
701 write (
errmsg,
'(a,i0,a)') &
702 'Node number (', nodeu,
')less than 1 or greater than nodes.'
714 character(len=*),
intent(in) :: name_model
715 character(len=*),
intent(in) :: input_mempath
718 call this%DisBaseType%allocate_scalars(name_model, input_mempath)
738 call this%DisBaseType%allocate_arrays()
741 if (this%nodes < this%nodesuser)
then
742 call mem_allocate(this%nodeuser, this%nodes,
'NODEUSER', this%memoryPath)
743 call mem_allocate(this%nodereduced, this%nodesuser,
'NODEREDUCED', &
746 call mem_allocate(this%nodeuser, 1,
'NODEUSER', this%memoryPath)
747 call mem_allocate(this%nodereduced, 1,
'NODEREDUCED', this%memoryPath)
751 this%mshape(1) = this%nrow
752 this%mshape(2) = this%ncol
763 flag_string, allow_zero)
result(nodeu)
766 integer(I4B),
intent(inout) :: lloc
767 integer(I4B),
intent(inout) :: istart
768 integer(I4B),
intent(inout) :: istop
769 integer(I4B),
intent(in) :: in
770 integer(I4B),
intent(in) :: iout
771 character(len=*),
intent(inout) :: line
772 logical,
optional,
intent(in) :: flag_string
773 logical,
optional,
intent(in) :: allow_zero
774 integer(I4B) :: nodeu
776 integer(I4B) :: i, j, nrow, ncol
777 integer(I4B) :: lloclocal, ndum, istat, n
780 if (
present(flag_string))
then
781 if (flag_string)
then
784 call urword(line, lloclocal, istart, istop, 1, ndum, r, iout, in)
785 read (line(istart:istop), *, iostat=istat) n
794 nrow = this%mshape(1)
795 ncol = this%mshape(2)
797 call urword(line, lloc, istart, istop, 2, i, r, iout, in)
798 call urword(line, lloc, istart, istop, 2, j, r, iout, in)
800 if (i == 0 .and. j == 0)
then
801 if (
present(allow_zero))
then
811 if (i < 1 .or. i > nrow)
then
812 write (
errmsg,
'(a,1x,a,i0,a)') &
813 trim(adjustl(
errmsg)),
'Row number in list (', i, &
814 ') is outside of the grid.'
816 if (j < 1 .or. j > ncol)
then
817 write (
errmsg,
'(a,1x,a,i0,a)') &
818 trim(adjustl(
errmsg)),
'Column number in list (', j, &
819 ') is outside of the grid.'
822 nodeu =
get_node(1, i, j, 1, nrow, ncol)
824 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
825 write (
errmsg,
'(a,1x,a,i0,a)') &
827 "Node number in list (", nodeu,
") is outside of the grid. "// &
828 "Cell number cannot be determined in line '"// &
829 trim(adjustl(line))//
"'."
832 if (len_trim(adjustl(
errmsg)) > 0)
then
848 allow_zero)
result(nodeu)
850 integer(I4B) :: nodeu
853 character(len=*),
intent(inout) :: cellid
854 integer(I4B),
intent(in) :: inunit
855 integer(I4B),
intent(in) :: iout
856 logical,
optional,
intent(in) :: flag_string
857 logical,
optional,
intent(in) :: allow_zero
859 integer(I4B) :: lloclocal, istart, istop, ndum, n
860 integer(I4B) :: i, j, nrow, ncol
861 integer(I4B) :: istat
864 if (
present(flag_string))
then
865 if (flag_string)
then
868 call urword(cellid, lloclocal, istart, istop, 1, ndum, r, iout, inunit)
869 read (cellid(istart:istop), *, iostat=istat) n
878 nrow = this%mshape(1)
879 ncol = this%mshape(2)
882 call urword(cellid, lloclocal, istart, istop, 2, i, r, iout, inunit)
883 call urword(cellid, lloclocal, istart, istop, 2, j, r, iout, inunit)
885 if (i == 0 .and. j == 0)
then
886 if (
present(allow_zero))
then
896 if (i < 1 .or. i > nrow)
then
897 write (
errmsg,
'(a,1x,a,i0,a)') &
898 trim(adjustl(
errmsg)),
'Row number in list (', i, &
899 ') is outside of the grid.'
901 if (j < 1 .or. j > ncol)
then
902 write (
errmsg,
'(a,1x,a,i0,a)') &
903 trim(adjustl(
errmsg)),
'Column number in list (', j, &
904 ') is outside of the grid.'
907 nodeu =
get_node(1, i, j, 1, nrow, ncol)
909 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
910 write (
errmsg,
'(a,1x,a,i0,a)') &
912 "Cell number cannot be determined for cellid ("// &
913 trim(adjustl(cellid))//
") and results in a user "// &
914 "node number (", nodeu,
") that is outside of the grid."
917 if (len_trim(adjustl(
errmsg)) > 0)
then
950 integer(I4B),
intent(in) :: noden
951 integer(I4B),
intent(in) :: nodem
952 integer(I4B),
intent(in) :: ihc
953 real(DP),
intent(inout) :: xcomp
954 real(DP),
intent(inout) :: ycomp
955 real(DP),
intent(inout) :: zcomp
956 integer(I4B),
intent(in) :: ipos
958 integer(I4B) :: nodeu1, i1, j1, k1
959 integer(I4B) :: nodeu2, i2, j2, k2
965 if (nodem < noden)
then
978 nodeu1 = this%get_nodeuser(noden)
979 nodeu2 = this%get_nodeuser(nodem)
980 call get_ijk(nodeu1, this%nrow, this%ncol, 1, i1, j1, k1)
981 call get_ijk(nodeu2, this%nrow, this%ncol, 1, i2, j2, k2)
984 elseif (j2 < j1)
then
986 elseif (j2 > j1)
then
1000 xcomp, ycomp, zcomp, conlen)
1005 integer(I4B),
intent(in) :: noden
1006 integer(I4B),
intent(in) :: nodem
1007 logical,
intent(in) :: nozee
1008 real(DP),
intent(in) :: satn
1009 real(DP),
intent(in) :: satm
1010 integer(I4B),
intent(in) :: ihc
1011 real(DP),
intent(inout) :: xcomp
1012 real(DP),
intent(inout) :: ycomp
1013 real(DP),
intent(inout) :: zcomp
1014 real(DP),
intent(inout) :: conlen
1017 real(DP) :: x1, y1, x2, y2
1019 integer(I4B) :: i1, i2, j1, j2, k1, k2
1020 integer(I4B) :: nodeu1, nodeu2, ipos
1025 ipos = this%con%getjaindex(noden, nodem)
1026 ds = this%con%cl1(this%con%jas(ipos)) + this%con%cl2(this%con%jas(ipos))
1027 nodeu1 = this%get_nodeuser(noden)
1028 nodeu2 = this%get_nodeuser(nodem)
1029 call get_ijk(nodeu1, this%nrow, this%ncol, 1, i1, j1, k1)
1030 call get_ijk(nodeu2, this%nrow, this%ncol, 1, i2, j2, k2)
1037 elseif (j2 < j1)
then
1039 elseif (j2 > j1)
then
1052 character(len=*),
intent(out) :: dis_type
1062 integer(I4B) :: dis_enum
1073 integer(I4B),
intent(in) :: ic
1074 real(DP),
allocatable,
intent(out) :: polyverts(:, :)
1075 logical(LGP),
intent(in),
optional :: closed
1077 integer(I4B) :: icu, nverts, irow, jcol, klay
1078 real(DP) :: cellx, celly, dxhalf, dyhalf
1079 logical(LGP) :: lclosed
1084 if (.not. (
present(closed)))
then
1092 allocate (polyverts(2, nverts + 1))
1094 allocate (polyverts(2, nverts))
1098 icu = this%get_nodeuser(ic)
1099 call get_ijk(icu, this%nrow, this%ncol, 1, irow, jcol, klay)
1100 cellx = this%cellx(jcol)
1101 celly = this%celly(irow)
1102 dxhalf =
dhalf * this%delr(jcol)
1103 dyhalf =
dhalf * this%delc(irow)
1104 polyverts(:, 1) = (/cellx - dxhalf, celly - dyhalf/)
1105 polyverts(:, 2) = (/cellx - dxhalf, celly + dyhalf/)
1106 polyverts(:, 3) = (/cellx + dxhalf, celly + dyhalf/)
1107 polyverts(:, 4) = (/cellx + dxhalf, celly - dyhalf/)
1111 polyverts(:, nverts + 1) = polyverts(:, 1)
1121 character(len=*),
intent(inout) :: line
1122 integer(I4B),
intent(inout) :: lloc
1123 integer(I4B),
intent(inout) :: istart
1124 integer(I4B),
intent(inout) :: istop
1125 integer(I4B),
intent(in) :: in
1126 integer(I4B),
intent(in) :: iout
1127 integer(I4B),
dimension(:),
pointer,
contiguous,
intent(inout) :: iarray
1128 character(len=*),
intent(in) :: aname
1140 character(len=*),
intent(inout) :: line
1141 integer(I4B),
intent(inout) :: lloc
1142 integer(I4B),
intent(inout) :: istart
1143 integer(I4B),
intent(inout) :: istop
1144 integer(I4B),
intent(in) :: in
1145 integer(I4B),
intent(in) :: iout
1146 real(DP),
dimension(:),
pointer,
contiguous,
intent(inout) :: darray
1147 character(len=*),
intent(in) :: aname
1157 icolbnd, aname, inunit, iout)
1160 integer(I4B),
intent(in) :: maxbnd
1161 integer(I4B),
dimension(maxbnd) :: nodelist
1162 integer(I4B),
intent(in) :: ncolbnd
1163 real(DP),
dimension(ncolbnd, maxbnd),
intent(inout) :: darray
1164 integer(I4B),
intent(in) :: icolbnd
1165 character(len=*),
intent(in) :: aname
1166 integer(I4B),
intent(in) :: inunit
1167 integer(I4B),
intent(in) :: iout
1177 cdatafmp, nvaluesp, nwidthp, editdesc, dinact)
1180 real(DP),
dimension(:),
pointer,
contiguous,
intent(inout) :: darray
1181 integer(I4B),
intent(in) :: iout
1182 integer(I4B),
intent(in) :: iprint
1183 integer(I4B),
intent(in) :: idataun
1184 character(len=*),
intent(in) :: aname
1185 character(len=*),
intent(in) :: cdatafmp
1186 integer(I4B),
intent(in) :: nvaluesp
1187 integer(I4B),
intent(in) :: nwidthp
1188 character(len=*),
intent(in) :: editdesc
1189 real(DP),
intent(in) :: dinact
1191 integer(I4B) :: k, ifirst
1192 integer(I4B) :: nlay
1193 integer(I4B) :: nrow
1194 integer(I4B) :: ncol
1195 integer(I4B) :: nval
1196 integer(I4B) :: nodeu, noder
1197 integer(I4B) :: istart, istop
1198 real(DP),
dimension(:),
pointer,
contiguous :: dtemp
1200 character(len=*),
parameter :: fmthsv = &
1201 "(1X,/1X,a,' WILL BE SAVED ON UNIT ',I4, &
1202 &' AT END OF TIME STEP',I5,', STRESS PERIOD ',I4)"
1206 nrow = this%mshape(1)
1207 ncol = this%mshape(2)
1211 if (this%nodes < this%nodesuser)
then
1214 do nodeu = 1, this%nodesuser
1215 noder = this%get_nodenumber(nodeu, 0)
1216 if (noder <= 0)
then
1217 dtemp(nodeu) = dinact
1220 dtemp(nodeu) = darray(noder)
1228 if (iprint /= 0)
then
1231 istop = istart + nrow * ncol - 1
1233 aname, cdatafmp, nvaluesp, nwidthp, editdesc)
1239 if (idataun > 0)
then
1244 istop = istart + nrow * ncol - 1
1245 if (ifirst == 1)
write (iout, fmthsv) &
1246 trim(adjustl(aname)), idataun, &
1253 elseif (idataun < 0)
then
1256 call ubdsv1(
kstp,
kper, aname, -idataun, dtemp, ncol, nrow, nlay, &
1265 dstmodel, dstpackage, naux, auxtxt, &
1266 ibdchn, nlist, iout)
1269 character(len=16),
intent(in) :: text
1270 character(len=16),
intent(in) :: textmodel
1271 character(len=16),
intent(in) :: textpackage
1272 character(len=16),
intent(in) :: dstmodel
1273 character(len=16),
intent(in) :: dstpackage
1274 integer(I4B),
intent(in) :: naux
1275 character(len=16),
dimension(:),
intent(in) :: auxtxt
1276 integer(I4B),
intent(in) :: ibdchn
1277 integer(I4B),
intent(in) :: nlist
1278 integer(I4B),
intent(in) :: iout
1280 integer(I4B) :: nlay, nrow, ncol
1283 nrow = this%mshape(1)
1284 ncol = this%mshape(2)
1287 call ubdsv06(
kstp,
kper, text, textmodel, textpackage, dstmodel, dstpackage, &
1288 ibdchn, naux, auxtxt, ncol, nrow, nlay, &
1298 integer(I4B),
intent(in) :: maxbnd
1299 integer(I4B),
dimension(:),
pointer,
contiguous :: darray
1300 integer(I4B),
dimension(maxbnd),
intent(inout) :: nodelist
1301 integer(I4B),
intent(inout) :: nbound
1302 character(len=*),
intent(in) :: aname
1304 integer(I4B) :: il, ir, ic, ncol, nrow, nlay, nval, nodeu, noder, ipos, ierr
1308 nrow = this%mshape(1)
1309 ncol = this%mshape(2)
1311 if (this%ndim > 1)
then
1320 nodeu =
get_node(1, ir, ic, nlay, nrow, ncol)
1322 if (il < 1 .or. il > nlay)
then
1323 write (
errmsg,
'(a,1x,i0)')
'Invalid layer number:', il
1326 nodeu =
get_node(il, ir, ic, nlay, nrow, ncol)
1327 noder = this%get_nodenumber(nodeu, 0)
1328 if (ipos > maxbnd)
then
1331 nodelist(ipos) = noder
1340 write (
errmsg,
'(a,1x,i0)') &
1341 'MAXBOUND dimension is too small.'// &
1342 'INCREASE MAXBOUND TO:', ierr
1347 if (nbound < maxbnd)
then
1348 do ipos = nbound + 1, maxbnd
1357 do noder = 1, maxbnd
1358 if (noder < 1 .or. noder > this%nodes)
then
1359 write (
errmsg,
'(a,1x,i0)')
'Invalid node number:', noder
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard 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.