29 integer(I4B),
pointer :: njausr => null()
30 integer(I4B),
pointer :: nvert => null()
31 real(dp),
pointer :: voffsettol => null()
32 real(dp),
dimension(:, :),
pointer,
contiguous :: vertices => null()
33 real(dp),
dimension(:, :),
pointer,
contiguous :: cellxy => null()
34 real(dp),
dimension(:),
pointer,
contiguous :: top1d => null()
35 real(dp),
dimension(:),
pointer,
contiguous :: bot1d => null()
36 real(dp),
dimension(:),
pointer,
contiguous :: area1d => null()
37 integer(I4B),
dimension(:),
pointer,
contiguous :: iainp => null()
38 integer(I4B),
dimension(:),
pointer,
contiguous :: jainp => null()
39 integer(I4B),
dimension(:),
pointer,
contiguous :: ihcinp => null()
40 real(dp),
dimension(:),
pointer,
contiguous :: cl12inp => null()
41 real(dp),
dimension(:),
pointer,
contiguous :: hwvainp => null()
42 real(dp),
dimension(:),
pointer,
contiguous :: angldegxinp => null()
43 integer(I4B),
pointer :: iangledegx => null()
44 integer(I4B),
dimension(:),
pointer,
contiguous :: iavert => null()
45 integer(I4B),
dimension(:),
pointer,
contiguous :: javert => null()
46 integer(I4B),
dimension(:),
pointer,
contiguous :: idomain => null()
47 logical(LGP) :: readfromfile
93 logical :: length_units = .false.
94 logical :: nogrb = .false.
95 logical :: xorigin = .false.
96 logical :: yorigin = .false.
97 logical :: angrot = .false.
98 logical :: voffsettol = .false.
99 logical :: nodes = .false.
100 logical :: nja = .false.
101 logical :: nvert = .false.
102 logical :: top = .false.
103 logical :: bot = .false.
104 logical :: area = .false.
105 logical :: idomain = .false.
106 logical :: iac = .false.
107 logical :: ja = .false.
108 logical :: ihc = .false.
109 logical :: cl12 = .false.
110 logical :: hwva = .false.
111 logical :: angldegx = .false.
112 logical :: iv = .false.
113 logical :: xv = .false.
114 logical :: yv = .false.
115 logical :: icell2d = .false.
116 logical :: xc = .false.
117 logical :: yc = .false.
118 logical :: ncvert = .false.
119 logical :: icvert = .false.
126 subroutine disu_cr(dis, name_model, input_mempath, inunit, iout)
129 character(len=*),
intent(in) :: name_model
130 character(len=*),
intent(in) :: input_mempath
131 integer(I4B),
intent(in) :: inunit
132 integer(I4B),
intent(in) :: iout
135 character(len=*),
parameter :: fmtheader = &
136 "(1X, /1X, 'DISU -- UNSTRUCTURED GRID DISCRETIZATION PACKAGE,', &
137 &' VERSION 2 : 3/27/2014 - INPUT READ FROM MEMPATH: ', A, //)"
144 call dis%allocate_scalars(name_model, input_mempath)
153 write (iout, fmtheader) dis%input_mempath
157 call disnew%disu_load()
169 call this%source_options()
170 call this%source_dimensions()
171 call this%source_griddata()
172 call this%source_connectivity()
175 if (this%nvert > 0)
then
176 call this%source_vertices()
177 call this%source_cell2d()
195 call this%grid_finalize()
207 integer(I4B) :: noder
208 integer(I4B) :: nrsize
210 character(len=*),
parameter :: fmtdz = &
211 "('CELL (',i0,',',i0,',',i0,') THICKNESS <= 0. ', &
212 &'TOP, BOT: ',2(1pg24.15))"
213 character(len=*),
parameter :: fmtnr = &
214 "(/1x, 'The specified IDOMAIN results in a reduced number of cells.',&
215 &/1x, 'Number of user nodes: ',I0,&
216 &/1X, 'Number of nodes in solution: ', I0, //)"
220 do n = 1, this%nodesuser
221 if (this%idomain(n) > 0) this%nodes = this%nodes + 1
225 if (this%nodes == 0)
then
226 call store_error(
'Model does not have any active nodes. &
227 &Ensure IDOMAIN array has some values greater &
233 if (this%nodes < this%nodesuser)
then
234 write (this%iout, fmtnr) this%nodesuser, this%nodes
238 call this%allocate_arrays()
244 if (this%nodes < this%nodesuser)
then
246 do node = 1, this%nodesuser
247 if (this%idomain(node) > 0)
then
248 this%nodereduced(node) = noder
250 elseif (this%idomain(node) < 0)
then
251 this%nodereduced(node) = -1
253 this%nodereduced(node) = 0
259 if (this%nodes < this%nodesuser)
then
261 do node = 1, this%nodesuser
262 if (this%idomain(node) > 0)
then
263 this%nodeuser(noder) = node
270 do node = 1, this%nodesuser
272 if (this%nodes < this%nodesuser) noder = this%nodereduced(node)
273 if (noder <= 0) cycle
274 this%top(noder) = this%top1d(node)
275 this%bot(noder) = this%bot1d(node)
276 this%area(noder) = this%area1d(node)
280 if (this%nvert > 0)
then
281 do node = 1, this%nodesuser
283 if (this%nodes < this%nodesuser) noder = this%nodereduced(node)
284 if (noder <= 0) cycle
285 this%xc(noder) = this%cellxy(1, node)
286 this%yc(noder) = this%cellxy(2, node)
295 if (this%nodes < this%nodesuser) nrsize = this%nodes
297 call this%con%disuconnections(this%name_model, this%nodes, &
298 this%nodesuser, nrsize, &
299 this%nodereduced, this%nodeuser, &
300 this%iainp, this%jainp, &
301 this%ihcinp, this%cl12inp, &
302 this%hwvainp, this%angldegxinp, &
304 this%nja = this%con%nja
305 this%njas = this%con%njas
320 character(len=*),
parameter :: fmtidm = &
321 &
"('Invalid idomain value ', i0, ' specified for node ', i0)"
322 character(len=*),
parameter :: fmtdz = &
323 &
"('Cell ', i0, ' with thickness <= 0. Top, bot: ', 2(1pg24.15))"
324 character(len=*),
parameter :: fmtarea = &
325 &
"('Cell ', i0, ' with area <= 0. Area: ', 1(1pg24.15))"
326 character(len=*),
parameter :: fmtjan = &
327 &
"('Cell ', i0, ' must have its first connection be itself. Found: ', i0)"
328 character(len=*),
parameter :: fmtjam = &
329 &
"('Cell ', i0, ' has invalid connection in JA. Found: ', i0)"
330 character(len=*),
parameter :: fmterrmsg = &
331 "('Top elevation (', 1pg15.6, ') for cell ', i0, ' is above bottom &
332 &elevation (', 1pg15.6, ') for cell ', i0, '. Based on node numbering &
333 &rules cell ', i0, ' must be below cell ', i0, '.')"
336 do n = 1, this%nodesuser
347 write (
errmsg, fmtjan) n, m
352 do ipos = this%iainp(n) + 1, this%iainp(n + 1) - 1
354 if (m < 0 .or. m > this%nodesuser)
then
356 write (
errmsg, fmtjam) n, m
364 if (this%inunit > 0)
then
370 do n = 1, this%nodesuser
371 if (this%idomain(n) > 1 .or. this%idomain(n) < 0)
then
372 write (
errmsg, fmtidm) this%idomain(n), n
379 do n = 1, this%nodesuser
380 if (this%idomain(n) == 1)
then
381 dz = this%top1d(n) - this%bot1d(n)
382 if (dz <=
dzero)
then
383 write (
errmsg, fmt=fmtdz) n, this%top1d(n), this%bot1d(n)
386 if (this%area1d(n) <=
dzero)
then
387 write (
errmsg, fmt=fmtarea) n, this%area1d(n)
394 if (this%voffsettol <
dzero)
then
395 write (
errmsg,
'(a, 1pg15.6)') &
396 'Vertical offset tolerance must be greater than zero. Found ', &
399 if (this%inunit > 0)
then
406 do n = 1, this%nodesuser
407 do ipos = this%iainp(n) + 1, this%iainp(n + 1) - 1
409 ihc = this%ihcinp(ipos)
410 if (ihc == 0 .and. m > n)
then
411 dz = this%top1d(m) - this%bot1d(n)
412 if (dz > this%voffsettol)
then
413 write (
errmsg, fmterrmsg) this%top1d(m), m, this%bot1d(n), n, m, n
422 if (this%inunit > 0)
then
447 if (this%readFromFile)
then
451 if (
associated(this%iavert))
then
471 call this%DisBaseType%dis_da()
480 integer(I4B),
intent(in) :: nodeu
481 character(len=*),
intent(inout) :: str
483 character(len=10) :: nstr
485 write (nstr,
'(i0)') nodeu
486 str =
'('//trim(adjustl(nstr))//
')'
494 integer(I4B),
intent(in) :: nodeu
495 integer(I4B),
dimension(:),
intent(inout) :: arr
497 integer(I4B) :: isize
501 if (isize /= this%ndim)
then
502 write (
errmsg,
'(a,i0,a,i0,a)') &
503 'Program error: nodeu_to_array size of array (', isize, &
504 ') is not equal to the discretization dimension (', this%ndim,
')'
519 character(len=LENVARNAME),
dimension(3) :: lenunits = &
520 &[character(len=LENVARNAME) ::
'FEET',
'METERS',
'CENTIMETERS']
524 call mem_set_value(this%lenuni,
'LENGTH_UNITS', this%input_mempath, &
525 lenunits, found%length_units)
526 call mem_set_value(this%nogrb,
'NOGRB', this%input_mempath, found%nogrb)
527 call mem_set_value(this%xorigin,
'XORIGIN', this%input_mempath, found%xorigin)
528 call mem_set_value(this%yorigin,
'YORIGIN', this%input_mempath, found%yorigin)
529 call mem_set_value(this%angrot,
'ANGROT', this%input_mempath, found%angrot)
530 call mem_set_value(this%voffsettol,
'VOFFSETTOL', this%input_mempath, &
534 if (this%iout > 0)
then
535 call this%log_options(found)
547 write (this%iout,
'(1x,a)')
'Setting Discretization Options'
549 if (found%length_units)
then
550 write (this%iout,
'(4x,a,i0)')
'Model length unit [0=UND, 1=FEET, &
551 &2=METERS, 3=CENTIMETERS] set as ', this%lenuni
554 if (found%nogrb)
then
555 write (this%iout,
'(4x,a,i0)')
'Binary grid file [0=GRB, 1=NOGRB] &
556 &set as ', this%nogrb
559 if (found%xorigin)
then
560 write (this%iout,
'(4x,a,G0)')
'XORIGIN = ', this%xorigin
563 if (found%yorigin)
then
564 write (this%iout,
'(4x,a,G0)')
'YORIGIN = ', this%yorigin
567 if (found%angrot)
then
568 write (this%iout,
'(4x,a,G0)')
'ANGROT = ', this%angrot
571 if (found%voffsettol)
then
572 write (this%iout,
'(4x,a,G0)')
'VERTICAL_OFFSET_TOLERANCE = ', &
576 write (this%iout,
'(1x,a,/)')
'End Setting Discretization Options'
590 call mem_set_value(this%nodesuser,
'NODES', this%input_mempath, found%nodes)
591 call mem_set_value(this%njausr,
'NJA', this%input_mempath, found%nja)
592 call mem_set_value(this%nvert,
'NVERT', this%input_mempath, found%nvert)
595 if (this%iout > 0)
then
596 call this%log_dimensions(found)
600 if (this%nodesuser < 1)
then
602 'NODES was not specified or was specified incorrectly.')
604 if (this%njausr < 1)
then
606 'NJA was not specified or was specified incorrectly.')
615 this%readFromFile = .true.
616 call mem_allocate(this%top1d, this%nodesuser,
'TOP1D', this%memoryPath)
617 call mem_allocate(this%bot1d, this%nodesuser,
'BOT1D', this%memoryPath)
618 call mem_allocate(this%area1d, this%nodesuser,
'AREA1D', this%memoryPath)
619 call mem_allocate(this%idomain, this%nodesuser,
'IDOMAIN', this%memoryPath)
620 call mem_allocate(this%vertices, 2, this%nvert,
'VERTICES', this%memoryPath)
621 call mem_allocate(this%iainp, this%nodesuser + 1,
'IAINP', this%memoryPath)
622 call mem_allocate(this%jainp, this%njausr,
'JAINP', this%memoryPath)
623 call mem_allocate(this%ihcinp, this%njausr,
'IHCINP', this%memoryPath)
624 call mem_allocate(this%cl12inp, this%njausr,
'CL12INP', this%memoryPath)
625 call mem_allocate(this%hwvainp, this%njausr,
'HWVAINP', this%memoryPath)
626 call mem_allocate(this%angldegxinp, this%njausr,
'ANGLDEGXINP', &
628 if (this%nvert > 0)
then
629 call mem_allocate(this%cellxy, 2, this%nodesuser,
'CELLXY', this%memoryPath)
631 call mem_allocate(this%cellxy, 2, 0,
'CELLXY', this%memoryPath)
635 do n = 1, this%nodesuser
647 write (this%iout,
'(1x,a)')
'Setting Discretization Dimensions'
649 if (found%nodes)
then
650 write (this%iout,
'(4x,a,i0)')
'NODES = ', this%nodesuser
654 write (this%iout,
'(4x,a,i0)')
'NJA = ', this%njausr
657 if (found%nvert)
then
658 write (this%iout,
'(4x,a,i0)')
'NVERT = ', this%nvert
661 write (this%iout,
'(1x,a,/)')
'End Setting Discretization Dimensions'
674 call mem_set_value(this%top1d,
'TOP', this%input_mempath, found%top)
675 call mem_set_value(this%bot1d,
'BOT', this%input_mempath, found%bot)
676 call mem_set_value(this%area1d,
'AREA', this%input_mempath, found%area)
677 call mem_set_value(this%idomain,
'IDOMAIN', this%input_mempath, found%idomain)
680 if (this%iout > 0)
then
681 call this%log_griddata(found)
693 write (this%iout,
'(1x,a)')
'Setting Discretization Griddata'
696 write (this%iout,
'(4x,a)')
'TOP set from input file'
700 write (this%iout,
'(4x,a)')
'BOT set from input file'
704 write (this%iout,
'(4x,a)')
'AREA set from input file'
707 if (found%idomain)
then
708 write (this%iout,
'(4x,a)')
'IDOMAIN set from input file'
711 write (this%iout,
'(1x,a,/)')
'End Setting Discretization Griddata'
722 integer(I4B),
dimension(:),
contiguous,
pointer :: iac => null()
726 call mem_set_value(this%jainp,
'JA', this%input_mempath, found%ja)
727 call mem_set_value(this%ihcinp,
'IHC', this%input_mempath, found%ihc)
728 call mem_set_value(this%cl12inp,
'CL12', this%input_mempath, found%cl12)
729 call mem_set_value(this%hwvainp,
'HWVA', this%input_mempath, found%hwva)
730 call mem_set_value(this%angldegxinp,
'ANGLDEGX', this%input_mempath, &
734 call mem_setptr(iac,
'IAC', this%input_mempath)
737 if (
associated(iac))
call iac_to_ia(iac, this%iainp)
740 if (found%angldegx) this%iangledegx = 1
743 if (this%iout > 0)
then
744 call this%log_connectivity(found, iac)
754 integer(I4B),
dimension(:),
contiguous,
pointer,
intent(in) :: iac
756 write (this%iout,
'(1x,a)')
'Setting Discretization Connectivity'
758 if (
associated(iac))
then
759 write (this%iout,
'(4x,a)')
'IAC set from input file'
763 write (this%iout,
'(4x,a)')
'JA set from input file'
767 write (this%iout,
'(4x,a)')
'IHC set from input file'
771 write (this%iout,
'(4x,a)')
'CL12 set from input file'
775 write (this%iout,
'(4x,a)')
'HWVA set from input file'
778 if (found%angldegx)
then
779 write (this%iout,
'(4x,a)')
'ANGLDEGX set from input file'
782 write (this%iout,
'(1x,a,/)')
'End Setting Discretization Connectivity'
793 real(DP),
dimension(:),
contiguous,
pointer :: vert_x => null()
794 real(DP),
dimension(:),
contiguous,
pointer :: vert_y => null()
798 call mem_setptr(vert_x,
'XV', this%input_mempath)
799 call mem_setptr(vert_y,
'YV', this%input_mempath)
802 if (
associated(vert_x) .and.
associated(vert_y))
then
804 this%vertices(1, i) = vert_x(i)
805 this%vertices(2, i) = vert_y(i)
808 call store_error(
'Required Vertex arrays not found.')
812 if (this%iout > 0)
then
813 write (this%iout,
'(1x,a)')
'Discretization Vertex data loaded'
825 integer(I4B),
dimension(:),
contiguous,
pointer,
intent(in) :: icell2d
826 integer(I4B),
dimension(:),
contiguous,
pointer,
intent(in) :: ncvert
827 integer(I4B),
dimension(:),
contiguous,
pointer,
intent(in) :: icvert
830 integer(I4B) :: i, j, ierr
831 integer(I4B) :: icv_idx, startvert, maxnnz = 5
834 call vert_spm%init(this%nodesuser, this%nvert, maxnnz)
838 do i = 1, this%nodesuser
839 if (icell2d(i) /= i)
call store_error(
'ICELL2D input sequence violation.')
841 call vert_spm%addconnection(i, icvert(icv_idx), 0)
843 startvert = icvert(icv_idx)
844 elseif (j == ncvert(i) .and. (icvert(icv_idx) /= startvert))
then
845 call vert_spm%addconnection(i, startvert, 0)
847 icv_idx = icv_idx + 1
852 call mem_allocate(this%iavert, this%nodesuser + 1,
'IAVERT', this%memoryPath)
853 call mem_allocate(this%javert, vert_spm%nnz,
'JAVERT', this%memoryPath)
854 call vert_spm%filliaja(this%iavert, this%javert, ierr)
855 call vert_spm%destroy()
865 integer(I4B),
dimension(:),
contiguous,
pointer :: icell2d => null()
866 integer(I4B),
dimension(:),
contiguous,
pointer :: ncvert => null()
867 integer(I4B),
dimension(:),
contiguous,
pointer :: icvert => null()
868 real(DP),
dimension(:),
contiguous,
pointer :: cell_x => null()
869 real(DP),
dimension(:),
contiguous,
pointer :: cell_y => null()
873 call mem_setptr(icell2d,
'ICELL2D', this%input_mempath)
874 call mem_setptr(ncvert,
'NCVERT', this%input_mempath)
875 call mem_setptr(icvert,
'ICVERT', this%input_mempath)
878 if (
associated(icell2d) .and.
associated(ncvert) &
879 .and.
associated(icvert))
then
880 call this%define_cellverts(icell2d, ncvert, icvert)
882 call store_error(
'Required cell vertex arrays not found.')
886 call mem_setptr(cell_x,
'XC', this%input_mempath)
887 call mem_setptr(cell_y,
'YC', this%input_mempath)
890 if (
associated(cell_x) .and.
associated(cell_y))
then
891 do i = 1, this%nodesuser
892 this%cellxy(1, i) = cell_x(i)
893 this%cellxy(2, i) = cell_y(i)
896 call store_error(
'Required cell center arrays not found.')
900 if (this%iout > 0)
then
901 write (this%iout,
'(1x,a)')
'Discretization Cell2d data loaded'
913 integer(I4B),
dimension(:),
intent(in) :: icelltype
915 integer(I4B) :: i, iunit, ntxt
916 integer(I4B),
parameter :: lentxt = 100
917 character(len=50) :: txthdr
918 character(len=lentxt) :: txt
919 character(len=LINELENGTH) :: fname
921 character(len=*),
parameter :: fmtgrdsave = &
922 "(4X,'BINARY GRID INFORMATION WILL BE WRITTEN TO:', &
923 &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)"
927 if (this%nvert > 0) ntxt = ntxt + 5
930 fname = trim(this%input_fname)//
'.grb'
932 write (this%iout, fmtgrdsave) iunit, trim(adjustl(fname))
933 call openfile(iunit, this%iout, trim(adjustl(fname)),
'DATA(BINARY)', &
937 write (txthdr,
'(a)')
'GRID DISU'
938 txthdr(50:50) = new_line(
'a')
940 write (txthdr,
'(a)')
'VERSION 1'
941 txthdr(50:50) = new_line(
'a')
943 write (txthdr,
'(a, i0)')
'NTXT ', ntxt
944 txthdr(50:50) = new_line(
'a')
946 write (txthdr,
'(a, i0)')
'LENTXT ', lentxt
947 txthdr(50:50) = new_line(
'a')
951 write (txt,
'(3a, i0)')
'NODES ',
'INTEGER ',
'NDIM 0 # ', this%nodesuser
952 txt(lentxt:lentxt) = new_line(
'a')
954 write (txt,
'(3a, i0)')
'NJA ',
'INTEGER ',
'NDIM 0 # ', this%con%nja
955 txt(lentxt:lentxt) = new_line(
'a')
957 write (txt,
'(3a, 1pg24.15)')
'XORIGIN ',
'DOUBLE ',
'NDIM 0 # ', this%xorigin
958 txt(lentxt:lentxt) = new_line(
'a')
960 write (txt,
'(3a, 1pg24.15)')
'YORIGIN ',
'DOUBLE ',
'NDIM 0 # ', this%yorigin
961 txt(lentxt:lentxt) = new_line(
'a')
963 write (txt,
'(3a, 1pg24.15)')
'ANGROT ',
'DOUBLE ',
'NDIM 0 # ', this%angrot
964 txt(lentxt:lentxt) = new_line(
'a')
966 write (txt,
'(3a, i0)')
'TOP ',
'DOUBLE ',
'NDIM 1 ', this%nodesuser
967 txt(lentxt:lentxt) = new_line(
'a')
969 write (txt,
'(3a, i0)')
'BOT ',
'DOUBLE ',
'NDIM 1 ', this%nodesuser
970 txt(lentxt:lentxt) = new_line(
'a')
972 write (txt,
'(3a, i0)')
'IA ',
'INTEGER ',
'NDIM 1 ', this%nodesuser + 1
973 txt(lentxt:lentxt) = new_line(
'a')
975 write (txt,
'(3a, i0)')
'JA ',
'INTEGER ',
'NDIM 1 ', this%con%nja
976 txt(lentxt:lentxt) = new_line(
'a')
978 write (txt,
'(3a, i0)')
'ICELLTYPE ',
'INTEGER ',
'NDIM 1 ', this%nodesuser
979 txt(lentxt:lentxt) = new_line(
'a')
983 if (this%nvert > 0)
then
984 write (txt,
'(3a, i0)')
'VERTICES ',
'DOUBLE ',
'NDIM 2 2 ', this%nvert
985 txt(lentxt:lentxt) = new_line(
'a')
987 write (txt,
'(3a, i0)')
'CELLX ',
'DOUBLE ',
'NDIM 1 ', this%nodesuser
988 txt(lentxt:lentxt) = new_line(
'a')
990 write (txt,
'(3a, i0)')
'CELLY ',
'DOUBLE ',
'NDIM 1 ', this%nodesuser
991 txt(lentxt:lentxt) = new_line(
'a')
993 write (txt,
'(3a, i0)')
'IAVERT ',
'INTEGER ',
'NDIM 1 ', this%nodesuser + 1
994 txt(lentxt:lentxt) = new_line(
'a')
996 write (txt,
'(3a, i0)')
'JAVERT ',
'INTEGER ',
'NDIM 1 ',
size(this%javert)
997 txt(lentxt:lentxt) = new_line(
'a')
1002 write (iunit) this%nodesuser
1003 write (iunit) this%nja
1004 write (iunit) this%xorigin
1005 write (iunit) this%yorigin
1006 write (iunit) this%angrot
1007 write (iunit) this%top1d
1008 write (iunit) this%bot1d
1009 write (iunit) this%con%iausr
1010 write (iunit) this%con%jausr
1011 write (iunit) icelltype
1014 if (this%nvert > 0)
then
1015 write (iunit) this%vertices
1016 write (iunit) (this%cellxy(1, i), i=1, this%nodesuser)
1017 write (iunit) (this%cellxy(2, i), i=1, this%nodesuser)
1018 write (iunit) this%iavert
1019 write (iunit) this%javert
1030 class(
disutype),
intent(in) :: this
1031 integer(I4B),
intent(in) :: nodeu
1032 integer(I4B),
intent(in) :: icheck
1033 integer(I4B) :: nodenumber
1035 if (icheck /= 0)
then
1036 if (nodeu < 1 .or. nodeu > this%nodes)
then
1037 write (
errmsg,
'(a,i0,a,i0,a)') &
1038 'Node number (', nodeu,
') is less than 1 or greater than nodes (', &
1046 if (this%nodes == this%nodesuser)
then
1049 nodenumber = this%nodereduced(nodeu)
1062 integer(I4B),
intent(in) :: noden
1063 integer(I4B),
intent(in) :: nodem
1064 integer(I4B),
intent(in) :: ihc
1065 real(DP),
intent(inout) :: xcomp
1066 real(DP),
intent(inout) :: ycomp
1067 real(DP),
intent(inout) :: zcomp
1068 integer(I4B),
intent(in) :: ipos
1070 real(DP) :: angle, dmult
1078 if (nodem < noden)
then
1090 angle = this%con%anglex(this%con%jas(ipos))
1092 if (nodem < noden) dmult = -
done
1093 xcomp = cos(angle) * dmult
1094 ycomp = sin(angle) * dmult
1106 xcomp, ycomp, zcomp, conlen)
1109 integer(I4B),
intent(in) :: noden
1110 integer(I4B),
intent(in) :: nodem
1111 logical,
intent(in) :: nozee
1112 real(DP),
intent(in) :: satn
1113 real(DP),
intent(in) :: satm
1114 integer(I4B),
intent(in) :: ihc
1115 real(DP),
intent(inout) :: xcomp
1116 real(DP),
intent(inout) :: ycomp
1117 real(DP),
intent(inout) :: zcomp
1118 real(DP),
intent(inout) :: conlen
1120 real(DP) :: xn, xm, yn, ym, zn, zm
1124 if (
size(this%cellxy, 2) < 1)
then
1126 'Cannot calculate unit vector components for DISU grid if VERTEX '// &
1127 'data are not specified'
1141 zn = this%bot(noden) +
dhalf * (this%top(noden) - this%bot(noden))
1142 zm = this%bot(nodem) +
dhalf * (this%top(nodem) - this%bot(nodem))
1151 zn = this%bot(noden) +
dhalf * satn * (this%top(noden) - this%bot(noden))
1152 zm = this%bot(nodem) +
dhalf * satm * (this%top(nodem) - this%bot(nodem))
1166 class(
disutype),
intent(in) :: this
1167 character(len=*),
intent(out) :: dis_type
1176 class(
disutype),
intent(in) :: this
1177 integer(I4B) :: dis_enum
1186 character(len=*),
intent(in) :: name_model
1187 character(len=*),
intent(in) :: input_mempath
1190 call this%DisBaseType%allocate_scalars(name_model, input_mempath)
1193 call mem_allocate(this%njausr,
'NJAUSR', this%memoryPath)
1194 call mem_allocate(this%nvert,
'NVERT', this%memoryPath)
1195 call mem_allocate(this%voffsettol,
'VOFFSETTOL', this%memoryPath)
1196 call mem_allocate(this%iangledegx,
'IANGLEDEGX', this%memoryPath)
1202 this%voffsettol =
dzero
1204 this%readFromFile = .false.
1215 call this%DisBaseType%allocate_arrays()
1218 if (this%nodes < this%nodesuser)
then
1219 call mem_allocate(this%nodeuser, this%nodes,
'NODEUSER', this%memoryPath)
1220 call mem_allocate(this%nodereduced, this%nodesuser,
'NODEREDUCED', &
1223 call mem_allocate(this%nodeuser, 1,
'NODEUSER', this%memoryPath)
1224 call mem_allocate(this%nodereduced, 1,
'NODEREDUCED', this%memoryPath)
1228 this%mshape(1) = this%nodesuser
1240 call mem_allocate(this%idomain, this%nodes,
'IDOMAIN', this%memoryPath)
1241 call mem_allocate(this%vertices, 2, this%nvert,
'VERTICES', this%memoryPath)
1242 call mem_allocate(this%cellxy, 2, this%nodes,
'CELLXY', this%memoryPath)
1253 flag_string, allow_zero)
result(nodeu)
1256 integer(I4B),
intent(inout) :: lloc
1257 integer(I4B),
intent(inout) :: istart
1258 integer(I4B),
intent(inout) :: istop
1259 integer(I4B),
intent(in) :: in
1260 integer(I4B),
intent(in) :: iout
1261 character(len=*),
intent(inout) :: line
1262 logical,
optional,
intent(in) :: flag_string
1263 logical,
optional,
intent(in) :: allow_zero
1264 integer(I4B) :: nodeu
1266 integer(I4B) :: lloclocal, ndum, istat, n
1269 if (
present(flag_string))
then
1270 if (flag_string)
then
1273 call urword(line, lloclocal, istart, istop, 1, ndum, r, iout, in)
1274 read (line(istart:istop), *, iostat=istat) n
1275 if (istat /= 0)
then
1283 call urword(line, lloc, istart, istop, 2, nodeu, r, iout, in)
1285 if (nodeu == 0)
then
1286 if (
present(allow_zero))
then
1287 if (allow_zero)
then
1293 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
1294 write (
errmsg,
'(a,i0,a)') &
1295 "Node number in list (", nodeu,
") is outside of the grid. "// &
1296 "Cell number cannot be determined in line '"// &
1297 trim(adjustl(line))//
"'."
1313 allow_zero)
result(nodeu)
1315 integer(I4B) :: nodeu
1318 character(len=*),
intent(inout) :: cellid
1319 integer(I4B),
intent(in) :: inunit
1320 integer(I4B),
intent(in) :: iout
1321 logical,
optional,
intent(in) :: flag_string
1322 logical,
optional,
intent(in) :: allow_zero
1324 integer(I4B) :: lloclocal, istart, istop, ndum, n
1325 integer(I4B) :: istat
1328 if (
present(flag_string))
then
1329 if (flag_string)
then
1332 call urword(cellid, lloclocal, istart, istop, 1, ndum, r, iout, inunit)
1333 read (cellid(istart:istop), *, iostat=istat) n
1334 if (istat /= 0)
then
1343 call urword(cellid, lloclocal, istart, istop, 2, nodeu, r, iout, inunit)
1345 if (nodeu == 0)
then
1346 if (
present(allow_zero))
then
1347 if (allow_zero)
then
1353 if (nodeu < 1 .or. nodeu > this%nodesuser)
then
1354 write (
errmsg,
'(a,i0,a)') &
1355 "Cell number cannot be determined for cellid ("// &
1356 trim(adjustl(cellid))//
") and results in a user "// &
1357 "node number (", nodeu,
") that is outside of the grid."
1391 class(
disutype),
intent(inout) :: this
1392 character(len=*),
intent(inout) :: line
1393 integer(I4B),
intent(inout) :: lloc
1394 integer(I4B),
intent(inout) :: istart
1395 integer(I4B),
intent(inout) :: istop
1396 integer(I4B),
intent(in) :: in
1397 integer(I4B),
intent(in) :: iout
1398 integer(I4B),
dimension(:),
pointer,
contiguous,
intent(inout) :: iarray
1399 character(len=*),
intent(in) :: aname
1401 integer(I4B) :: nval
1402 integer(I4B),
dimension(:),
pointer,
contiguous :: itemp
1408 if (this%nodes < this%nodesuser)
then
1409 nval = this%nodesuser
1418 call readarray(in, itemp, aname, this%ndim, nval, iout, 0)
1421 if (this%nodes < this%nodesuser)
then
1422 call this%fill_grid_array(itemp, iarray)
1432 class(
disutype),
intent(inout) :: this
1433 character(len=*),
intent(inout) :: line
1434 integer(I4B),
intent(inout) :: lloc
1435 integer(I4B),
intent(inout) :: istart
1436 integer(I4B),
intent(inout) :: istop
1437 integer(I4B),
intent(in) :: in
1438 integer(I4B),
intent(in) :: iout
1439 real(DP),
dimension(:),
pointer,
contiguous,
intent(inout) :: darray
1440 character(len=*),
intent(in) :: aname
1442 integer(I4B) :: nval
1443 real(DP),
dimension(:),
pointer,
contiguous :: dtemp
1449 if (this%nodes < this%nodesuser)
then
1450 nval = this%nodesuser
1458 call readarray(in, dtemp, aname, this%ndim, nval, iout, 0)
1461 if (this%nodes < this%nodesuser)
then
1462 call this%fill_grid_array(dtemp, darray)
1473 cdatafmp, nvaluesp, nwidthp, editdesc, dinact)
1475 class(
disutype),
intent(inout) :: this
1476 real(DP),
dimension(:),
pointer,
contiguous,
intent(inout) :: darray
1477 integer(I4B),
intent(in) :: iout
1478 integer(I4B),
intent(in) :: iprint
1479 integer(I4B),
intent(in) :: idataun
1480 character(len=*),
intent(in) :: aname
1481 character(len=*),
intent(in) :: cdatafmp
1482 integer(I4B),
intent(in) :: nvaluesp
1483 integer(I4B),
intent(in) :: nwidthp
1484 character(len=*),
intent(in) :: editdesc
1485 real(DP),
intent(in) :: dinact
1487 integer(I4B) :: k, ifirst
1488 integer(I4B) :: nlay
1489 integer(I4B) :: nrow
1490 integer(I4B) :: ncol
1491 integer(I4B) :: nval
1492 integer(I4B) :: nodeu, noder
1493 integer(I4B) :: istart, istop
1494 real(DP),
dimension(:),
pointer,
contiguous :: dtemp
1496 character(len=*),
parameter :: fmthsv = &
1497 "(1X,/1X,a,' WILL BE SAVED ON UNIT ',I4, &
1498 &' AT END OF TIME STEP',I5,', STRESS PERIOD ',I4)"
1503 ncol = this%mshape(1)
1507 if (this%nodes < this%nodesuser)
then
1510 do nodeu = 1, this%nodesuser
1511 noder = this%get_nodenumber(nodeu, 0)
1512 if (noder <= 0)
then
1513 dtemp(nodeu) = dinact
1516 dtemp(nodeu) = darray(noder)
1524 if (iprint /= 0)
then
1527 istop = istart + nrow * ncol - 1
1529 aname, cdatafmp, nvaluesp, nwidthp, editdesc)
1535 if (idataun > 0)
then
1540 istop = istart + nrow * ncol - 1
1541 if (ifirst == 1)
write (iout, fmthsv) &
1542 trim(adjustl(aname)), idataun, &
1549 elseif (idataun < 0)
then
1552 call ubdsv1(
kstp,
kper, aname, -idataun, dtemp, ncol, nrow, nlay, &
1561 dstmodel, dstpackage, naux, auxtxt, &
1562 ibdchn, nlist, iout)
1565 character(len=16),
intent(in) :: text
1566 character(len=16),
intent(in) :: textmodel
1567 character(len=16),
intent(in) :: textpackage
1568 character(len=16),
intent(in) :: dstmodel
1569 character(len=16),
intent(in) :: dstpackage
1570 integer(I4B),
intent(in) :: naux
1571 character(len=16),
dimension(:),
intent(in) :: auxtxt
1572 integer(I4B),
intent(in) :: ibdchn
1573 integer(I4B),
intent(in) :: nlist
1574 integer(I4B),
intent(in) :: iout
1576 integer(I4B) :: nlay, nrow, ncol
1580 ncol = this%mshape(1)
1583 call ubdsv06(
kstp,
kper, text, textmodel, textpackage, dstmodel, dstpackage, &
1584 ibdchn, naux, auxtxt, ncol, nrow, nlay, &
1593 class(*),
pointer :: dis
subroutine, public iac_to_ia(iac, ia)
Convert an iac array into an ia array.
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
@ disu
DISV6 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 allocate_scalars(this, name_model, input_mempath)
Allocate and initialize scalar variables.
subroutine write_grb(this, icelltype)
Write a binary grid file.
subroutine allocate_arrays(this)
Allocate and initialize arrays.
subroutine disu_load(this)
Transfer IDM data into this discretization object.
subroutine source_connectivity(this)
Copy grid connectivity info from IDM into package.
subroutine, public disu_cr(dis, name_model, input_mempath, inunit, iout)
Create a new unstructured discretization object.
subroutine source_dimensions(this)
Copy dimensions from IDM into package.
subroutine source_options(this)
Copy options from IDM into package.
subroutine log_dimensions(this, found)
Write dimensions to list file.
subroutine disu_da(this)
Deallocate variables.
class(disutype) function, pointer, public castasdisutype(dis)
Cast base to DISU.
integer(i4b) function get_ncpl(this)
Get number of cells per layer (total nodes since DISU isn't layered)
subroutine define_cellverts(this, icell2d, ncvert, icvert)
Build data structures to hold cell vertex info.
subroutine read_dbl_array(this, line, lloc, istart, istop, iout, in, darray, aname)
Read a double precision array.
integer(i4b) function nodeu_from_cellid(this, cellid, inunit, iout, flag_string, allow_zero)
Convert a cellid string to a user nodenumber.
subroutine log_options(this, found)
Write user options to list file.
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.
subroutine source_vertices(this)
Copy grid vertex data from IDM into package.
subroutine source_cell2d(this)
Copy cell2d data from IDM into package.
subroutine log_griddata(this, found)
Write griddata found to list file.
subroutine allocate_arrays_mem(this)
Allocate arrays in memory manager.
subroutine source_griddata(this)
Copy grid data from IDM into package.
subroutine nodeu_to_array(this, nodeu, arr)
Convert a user nodenumber to an array (nodenumber)
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 record_array(this, darray, iout, iprint, idataun, aname, cdatafmp, nvaluesp, nwidthp, editdesc, dinact)
Record a double precision array.
subroutine disu_df(this)
Define the discretization.
logical function supports_layers(this)
Indicates whether the grid discretization supports layers.
subroutine read_int_array(this, line, lloc, istart, istop, iout, in, iarray, aname)
Read an integer array.
subroutine grid_finalize(this)
Finalize the grid.
integer(i4b) function get_nodenumber_idx1(this, nodeu, icheck)
Get reduced node number from user node number.
subroutine nodeu_to_string(this, nodeu, str)
Convert a user nodenumber to a string (nodenumber)
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 disu_ck(this)
Check discretization info.
integer(i4b) function get_dis_enum(this)
Get the discretization type enumeration.
subroutine log_connectivity(this, found, iac)
Write griddata found to list file.
subroutine connection_normal(this, noden, nodem, ihc, xcomp, ycomp, zcomp, ipos)
Get normal vector components between the cell and a given neighbor.
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,...
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
Unstructured grid discretization.