MODFLOW 6  version 6.7.0.dev0
USGS Modular Hydrologic Model
disumodule Module Reference

Data Types

type  disutype
 Unstructured grid discretization. More...
 
type  disufoundtype
 

Functions/Subroutines

subroutine, public disu_cr (dis, name_model, input_mempath, inunit, iout)
 Create a new unstructured discretization object. More...
 
subroutine disu_load (this)
 Transfer IDM data into this discretization object. More...
 
subroutine disu_df (this)
 Define the discretization. More...
 
subroutine grid_finalize (this)
 Finalize the grid. More...
 
subroutine disu_ck (this)
 Check discretization info. More...
 
subroutine disu_da (this)
 Deallocate variables. More...
 
subroutine nodeu_to_string (this, nodeu, str)
 Convert a user nodenumber to a string (nodenumber) More...
 
subroutine nodeu_to_array (this, nodeu, arr)
 Convert a user nodenumber to an array (nodenumber) More...
 
subroutine source_options (this)
 Copy options from IDM into package. More...
 
subroutine log_options (this, found)
 Write user options to list file. More...
 
subroutine source_dimensions (this)
 Copy dimensions from IDM into package. More...
 
subroutine log_dimensions (this, found)
 Write dimensions to list file. More...
 
subroutine source_griddata (this)
 Copy grid data from IDM into package. More...
 
subroutine log_griddata (this, found)
 Write griddata found to list file. More...
 
subroutine source_connectivity (this)
 Copy grid connectivity info from IDM into package. More...
 
subroutine log_connectivity (this, found, iac)
 Write griddata found to list file. More...
 
subroutine source_vertices (this)
 Copy grid vertex data from IDM into package. More...
 
subroutine define_cellverts (this, icell2d, ncvert, icvert)
 Build data structures to hold cell vertex info. More...
 
subroutine source_cell2d (this)
 Copy cell2d data from IDM into package. More...
 
subroutine write_grb (this, icelltype)
 Write a binary grid file. More...
 
integer(i4b) function get_nodenumber_idx1 (this, nodeu, icheck)
 Get reduced node number from user node number. More...
 
subroutine connection_normal (this, noden, nodem, ihc, xcomp, ycomp, zcomp, ipos)
 Get normal vector components between the cell and a given neighbor. More...
 
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. More...
 
subroutine get_dis_type (this, dis_type)
 Get the discretization type. More...
 
integer(i4b) function get_dis_enum (this)
 Get the discretization type enumeration. More...
 
subroutine allocate_scalars (this, name_model, input_mempath)
 Allocate and initialize scalar variables. More...
 
subroutine allocate_arrays (this)
 Allocate and initialize arrays. More...
 
subroutine allocate_arrays_mem (this)
 Allocate arrays in memory manager. More...
 
integer(i4b) function nodeu_from_string (this, lloc, istart, istop, in, iout, line, flag_string, allow_zero)
 Convert a string to a user nodenumber. More...
 
integer(i4b) function nodeu_from_cellid (this, cellid, inunit, iout, flag_string, allow_zero)
 Convert a cellid string to a user nodenumber. More...
 
logical function supports_layers (this)
 Indicates whether the grid discretization supports layers. More...
 
integer(i4b) function get_ncpl (this)
 Get number of cells per layer (total nodes since DISU isn't layered) More...
 
subroutine read_int_array (this, line, lloc, istart, istop, iout, in, iarray, aname)
 Read an integer array. More...
 
subroutine read_dbl_array (this, line, lloc, istart, istop, iout, in, darray, aname)
 Read a double precision array. More...
 
subroutine record_array (this, darray, iout, iprint, idataun, aname, cdatafmp, nvaluesp, nwidthp, editdesc, dinact)
 Record a double precision array. More...
 
subroutine record_srcdst_list_header (this, text, textmodel, textpackage, dstmodel, dstpackage, naux, auxtxt, ibdchn, nlist, iout)
 Record list header for imeth=6. More...
 
class(disutype) function, pointer, public castasdisutype (dis)
 Cast base to DISU. More...
 

Function/Subroutine Documentation

◆ allocate_arrays()

subroutine disumodule::allocate_arrays ( class(disutype this)
private

Definition at line 1214 of file Disu.f90.

1215  ! -- dummy
1216  class(DisuType) :: this
1217  !
1218  ! -- Allocate arrays in DisBaseType (mshape, top, bot, area)
1219  call this%DisBaseType%allocate_arrays()
1220  !
1221  ! -- Allocate arrays in DISU
1222  if (this%nodes < this%nodesuser) then
1223  call mem_allocate(this%nodeuser, this%nodes, 'NODEUSER', this%memoryPath)
1224  call mem_allocate(this%nodereduced, this%nodesuser, 'NODEREDUCED', &
1225  this%memoryPath)
1226  else
1227  call mem_allocate(this%nodeuser, 1, 'NODEUSER', this%memoryPath)
1228  call mem_allocate(this%nodereduced, 1, 'NODEREDUCED', this%memoryPath)
1229  end if
1230  !
1231  ! -- Initialize
1232  this%mshape(1) = this%nodesuser
1233  !

◆ allocate_arrays_mem()

subroutine disumodule::allocate_arrays_mem ( class(disutype this)
private

Definition at line 1238 of file Disu.f90.

1239  ! -- modules
1241  ! -- dummy
1242  class(DisuType) :: this
1243  !
1244  call mem_allocate(this%idomain, this%nodes, 'IDOMAIN', this%memoryPath)
1245  call mem_allocate(this%vertices, 2, this%nvert, 'VERTICES', this%memoryPath)
1246  call mem_allocate(this%cellxy, 2, this%nodes, 'CELLXY', this%memoryPath)
1247  !

◆ allocate_scalars()

subroutine disumodule::allocate_scalars ( class(disutype this,
character(len=*), intent(in)  name_model,
character(len=*), intent(in)  input_mempath 
)

Definition at line 1187 of file Disu.f90.

1188  ! -- dummy
1189  class(DisuType) :: this
1190  character(len=*), intent(in) :: name_model
1191  character(len=*), intent(in) :: input_mempath
1192  !
1193  ! -- Allocate parent scalars
1194  call this%DisBaseType%allocate_scalars(name_model, input_mempath)
1195  !
1196  ! -- Allocate variables for DISU
1197  call mem_allocate(this%njausr, 'NJAUSR', this%memoryPath)
1198  call mem_allocate(this%nvert, 'NVERT', this%memoryPath)
1199  call mem_allocate(this%voffsettol, 'VOFFSETTOL', this%memoryPath)
1200  call mem_allocate(this%iangledegx, 'IANGLEDEGX', this%memoryPath)
1201  !
1202  ! -- Set values
1203  this%ndim = 1
1204  this%njausr = 0
1205  this%nvert = 0
1206  this%voffsettol = dzero
1207  this%iangledegx = 0
1208  this%readFromFile = .false.
1209  !

◆ castasdisutype()

class(disutype) function, pointer, public disumodule::castasdisutype ( class(*), pointer  dis)
Parameters
disbase pointer to DISU object
Returns
the resulting DISU pointer

Definition at line 1595 of file Disu.f90.

1596  ! -- dummy
1597  class(*), pointer :: dis !< base pointer to DISU object
1598  ! -- return
1599  class(DisuType), pointer :: disu !< the resulting DISU pointer
1600  !
1601  disu => null()
1602  select type (dis)
1603  class is (disutype)
1604  disu => dis
1605  end select
1606  !
Here is the caller graph for this function:

◆ connection_normal()

subroutine disumodule::connection_normal ( class(disutype this,
integer(i4b), intent(in)  noden,
integer(i4b), intent(in)  nodem,
integer(i4b), intent(in)  ihc,
real(dp), intent(inout)  xcomp,
real(dp), intent(inout)  ycomp,
real(dp), intent(inout)  zcomp,
integer(i4b), intent(in)  ipos 
)
private

The normal points outward from the shared face between noden and nodem.

Parameters
[in]nodencell (reduced nn)
[in]nodemneighbor (reduced nn)
[in]ihchorizontal connection flag

Definition at line 1062 of file Disu.f90.

1064  ! -- dummy
1065  class(DisuType) :: this
1066  integer(I4B), intent(in) :: noden !< cell (reduced nn)
1067  integer(I4B), intent(in) :: nodem !< neighbor (reduced nn)
1068  integer(I4B), intent(in) :: ihc !< horizontal connection flag
1069  real(DP), intent(inout) :: xcomp
1070  real(DP), intent(inout) :: ycomp
1071  real(DP), intent(inout) :: zcomp
1072  integer(I4B), intent(in) :: ipos
1073  ! -- local
1074  real(DP) :: angle, dmult
1075  !
1076  ! -- Set vector components based on ihc
1077  if (ihc == 0) then
1078  !
1079  ! -- connection is vertical
1080  xcomp = dzero
1081  ycomp = dzero
1082  if (nodem < noden) then
1083  !
1084  ! -- nodem must be above noden, so upward connection
1085  zcomp = done
1086  else
1087  !
1088  ! -- nodem must be below noden, so downward connection
1089  zcomp = -done
1090  end if
1091  else
1092  ! -- find from anglex, since anglex is symmetric, need to flip vector
1093  ! for lower triangle (nodem < noden)
1094  angle = this%con%anglex(this%con%jas(ipos))
1095  dmult = done
1096  if (nodem < noden) dmult = -done
1097  xcomp = cos(angle) * dmult
1098  ycomp = sin(angle) * dmult
1099  zcomp = dzero
1100  end if
1101  !

◆ connection_vector()

subroutine disumodule::connection_vector ( class(disutype this,
integer(i4b), intent(in)  noden,
integer(i4b), intent(in)  nodem,
logical, intent(in)  nozee,
real(dp), intent(in)  satn,
real(dp), intent(in)  satm,
integer(i4b), intent(in)  ihc,
real(dp), intent(inout)  xcomp,
real(dp), intent(inout)  ycomp,
real(dp), intent(inout)  zcomp,
real(dp), intent(inout)  conlen 
)
private

Saturation must be provided to compute cell center vertical coordinates. Also return the straight-line connection length.

Definition at line 1109 of file Disu.f90.

1111  ! -- dummy
1112  class(DisuType) :: this
1113  integer(I4B), intent(in) :: noden
1114  integer(I4B), intent(in) :: nodem
1115  logical, intent(in) :: nozee
1116  real(DP), intent(in) :: satn
1117  real(DP), intent(in) :: satm
1118  integer(I4B), intent(in) :: ihc
1119  real(DP), intent(inout) :: xcomp
1120  real(DP), intent(inout) :: ycomp
1121  real(DP), intent(inout) :: zcomp
1122  real(DP), intent(inout) :: conlen
1123  ! -- local
1124  real(DP) :: xn, xm, yn, ym, zn, zm
1125  !
1126  ! -- Terminate with error if requesting unit vector components for problems
1127  ! without cell data
1128  if (size(this%cellxy, 2) < 1) then
1129  write (errmsg, '(a)') &
1130  'Cannot calculate unit vector components for DISU grid if VERTEX '// &
1131  'data are not specified'
1132  call store_error(errmsg, terminate=.true.)
1133  end if
1134  !
1135  ! -- get xy center coords
1136  xn = this%xc(noden)
1137  yn = this%yc(noden)
1138  xm = this%xc(nodem)
1139  ym = this%yc(nodem)
1140  !
1141  ! -- Set vector components based on ihc
1142  if (ihc == 0) then
1143  !
1144  ! -- vertical connection, calculate z as cell center elevation
1145  zn = this%bot(noden) + dhalf * (this%top(noden) - this%bot(noden))
1146  zm = this%bot(nodem) + dhalf * (this%top(nodem) - this%bot(nodem))
1147  else
1148  !
1149  ! -- horizontal connection, with possible z component due to cell offsets
1150  ! and/or water table conditions
1151  if (nozee) then
1152  zn = dzero
1153  zm = dzero
1154  else
1155  zn = this%bot(noden) + dhalf * satn * (this%top(noden) - this%bot(noden))
1156  zm = this%bot(nodem) + dhalf * satm * (this%top(nodem) - this%bot(nodem))
1157  end if
1158  end if
1159  !
1160  ! -- Use coords to find vector components and connection length
1161  call line_unit_vector(xn, yn, zn, xm, ym, zm, xcomp, ycomp, zcomp, &
1162  conlen)
1163  !
Here is the call graph for this function:

◆ define_cellverts()

subroutine disumodule::define_cellverts ( class(disutype this,
integer(i4b), dimension(:), intent(in), pointer, contiguous  icell2d,
integer(i4b), dimension(:), intent(in), pointer, contiguous  ncvert,
integer(i4b), dimension(:), intent(in), pointer, contiguous  icvert 
)
private

Definition at line 820 of file Disu.f90.

821  ! -- modules
822  use sparsemodule, only: sparsematrix
823  ! -- dummy
824  class(DisuType) :: this
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
828  ! -- locals
829  type(sparsematrix) :: vert_spm
830  integer(I4B) :: i, j, ierr
831  integer(I4B) :: icv_idx, startvert, maxnnz = 5
832  !
833  ! -- initialize sparse matrix
834  call vert_spm%init(this%nodesuser, this%nvert, maxnnz)
835  !
836  ! -- add sparse matrix connections from input memory paths
837  icv_idx = 1
838  do i = 1, this%nodesuser
839  if (icell2d(i) /= i) call store_error('ICELL2D input sequence violation.')
840  do j = 1, ncvert(i)
841  call vert_spm%addconnection(i, icvert(icv_idx), 0)
842  if (j == 1) then
843  startvert = icvert(icv_idx)
844  elseif (j == ncvert(i) .and. (icvert(icv_idx) /= startvert)) then
845  call vert_spm%addconnection(i, startvert, 0)
846  end if
847  icv_idx = icv_idx + 1
848  end do
849  end do
850  !
851  ! -- allocate and fill iavert and javert
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()
856  !
Here is the call graph for this function:

◆ disu_ck()

subroutine disumodule::disu_ck ( class(disutype this)
private

Definition at line 311 of file Disu.f90.

312  ! -- dummy
313  class(DisuType) :: this
314  ! -- local
315  integer(I4B) :: n, m
316  integer(I4B) :: ipos
317  integer(I4B) :: ihc
318  real(DP) :: dz
319  ! -- formats
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, '.')"
334  !
335  ! -- Check connectivity
336  do n = 1, this%nodesuser
337  !
338  ! -- Ensure first connection is to itself, and
339  ! that ja(ia(n)) is positive
340  ipos = this%iainp(n)
341  m = this%jainp(ipos)
342  if (m < 0) then
343  m = abs(m)
344  this%jainp(ipos) = m
345  end if
346  if (n /= m) then
347  write (errmsg, fmtjan) n, m
348  call store_error(errmsg)
349  end if
350  !
351  ! -- Check for valid node numbers in connected cells
352  do ipos = this%iainp(n) + 1, this%iainp(n + 1) - 1
353  m = this%jainp(ipos)
354  if (m < 0 .or. m > this%nodesuser) then
355  ! -- make sure first connection is to itself
356  write (errmsg, fmtjam) n, m
357  call store_error(errmsg)
358  end if
359  end do
360  end do
361  !
362  ! -- terminate if errors found
363  if (count_errors() > 0) then
364  if (this%inunit > 0) then
365  call store_error_filename(this%input_fname)
366  end if
367  end if
368  !
369  ! -- Ensure idomain values are valid
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
373  call store_error(errmsg)
374  end if
375  end do
376  !
377  ! -- Check for zero and negative thickness and zero or negative areas
378  ! for cells with idomain == 1
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)
384  call store_error(errmsg)
385  end if
386  if (this%area1d(n) <= dzero) then
387  write (errmsg, fmt=fmtarea) n, this%area1d(n)
388  call store_error(errmsg)
389  end if
390  end if
391  end do
392  !
393  ! -- check to make sure voffsettol is >= 0
394  if (this%voffsettol < dzero) then
395  write (errmsg, '(a, 1pg15.6)') &
396  'Vertical offset tolerance must be greater than zero. Found ', &
397  this%voffsettol
398  call store_error(errmsg)
399  if (this%inunit > 0) then
400  call store_error_filename(this%input_fname)
401  end if
402  end if
403  !
404  ! -- For cell n, ensure that underlying cells have tops less than
405  ! or equal to the bottom of cell n
406  do n = 1, this%nodesuser
407  do ipos = this%iainp(n) + 1, this%iainp(n + 1) - 1
408  m = this%jainp(ipos)
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
414  call store_error(errmsg)
415  end if
416  end if
417  end do
418  end do
419  !
420  ! -- terminate if errors found
421  if (count_errors() > 0) then
422  if (this%inunit > 0) then
423  call store_error_filename(this%input_fname)
424  end if
425  end if
426  !
Here is the call graph for this function:

◆ disu_cr()

subroutine, public disumodule::disu_cr ( class(disbasetype), pointer  dis,
character(len=*), intent(in)  name_model,
character(len=*), intent(in)  input_mempath,
integer(i4b), intent(in)  inunit,
integer(i4b), intent(in)  iout 
)

Definition at line 126 of file Disu.f90.

127  ! -- dummy
128  class(DisBaseType), pointer :: dis
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
133  ! -- local
134  type(DisuType), pointer :: disnew
135  character(len=*), parameter :: fmtheader = &
136  "(1X, /1X, 'DISU -- UNSTRUCTURED GRID DISCRETIZATION PACKAGE,', &
137  &' VERSION 2 : 3/27/2014 - INPUT READ FROM MEMPATH: ', A, //)"
138  !
139  ! -- Create a new discretization object
140  allocate (disnew)
141  dis => disnew
142  !
143  ! -- Allocate scalars and assign data
144  call dis%allocate_scalars(name_model, input_mempath)
145  dis%inunit = inunit
146  dis%iout = iout
147  !
148  ! -- If disu is enabled
149  if (inunit > 0) then
150  !
151  ! -- Identify package
152  if (iout > 0) then
153  write (iout, fmtheader) dis%input_mempath
154  end if
155  !
156  ! -- load disu
157  call disnew%disu_load()
158  end if
159  !
Here is the caller graph for this function:

◆ disu_da()

subroutine disumodule::disu_da ( class(disutype this)
private

Definition at line 431 of file Disu.f90.

432  ! -- dummy
433  class(DisuType) :: this
434  !
435  ! -- Deallocate idm memory
436  call memorystore_remove(this%name_model, 'DISU', idm_context)
437  call memorystore_remove(component=this%name_model, &
438  context=idm_context)
439  !
440  ! -- scalars
441  call mem_deallocate(this%njausr)
442  call mem_deallocate(this%nvert)
443  call mem_deallocate(this%voffsettol)
444  call mem_deallocate(this%iangledegx)
445  !
446  ! -- arrays
447  if (this%readFromFile) then
448  call mem_deallocate(this%top1d)
449  call mem_deallocate(this%bot1d)
450  call mem_deallocate(this%area1d)
451  if (associated(this%iavert)) then
452  call mem_deallocate(this%iavert)
453  call mem_deallocate(this%javert)
454  end if
455  call mem_deallocate(this%vertices)
456  call mem_deallocate(this%iainp)
457  call mem_deallocate(this%jainp)
458  call mem_deallocate(this%ihcinp)
459  call mem_deallocate(this%cl12inp)
460  call mem_deallocate(this%hwvainp)
461  call mem_deallocate(this%angldegxinp)
462  end if
463  !
464  call mem_deallocate(this%idomain)
465  call mem_deallocate(this%cellxy)
466  !
467  call mem_deallocate(this%nodeuser)
468  call mem_deallocate(this%nodereduced)
469  !
470  ! -- DisBaseType deallocate
471  call this%DisBaseType%dis_da()
472  !
Here is the call graph for this function:

◆ disu_df()

subroutine disumodule::disu_df ( class(disutype this)
private

Definition at line 191 of file Disu.f90.

192  ! -- dummy
193  class(DisuType) :: this
194  !
195  call this%grid_finalize()
196  !

◆ disu_load()

subroutine disumodule::disu_load ( class(disutype this)
private

Definition at line 164 of file Disu.f90.

165  ! -- dummy
166  class(DisuType) :: this
167  !
168  ! -- source input data
169  call this%source_options()
170  call this%source_dimensions()
171  call this%source_griddata()
172  call this%source_connectivity()
173  !
174  ! -- If NVERT specified and greater than 0, then source VERTICES and CELL2D
175  if (this%nvert > 0) then
176  call this%source_vertices()
177  call this%source_cell2d()
178  else
179  ! -- connection direction information cannot be calculated
180  this%icondir = 0
181  end if
182  !
183  ! -- Make some final disu checks on the non-reduced user-provided
184  ! input
185  call this%disu_ck()
186  !

◆ get_dis_enum()

integer(i4b) function disumodule::get_dis_enum ( class(disutype), intent(in)  this)
private

Definition at line 1178 of file Disu.f90.

1179  use constantsmodule, only: disu
1180  class(DisuType), intent(in) :: this
1181  integer(I4B) :: dis_enum
1182  dis_enum = disu
This module contains simulation constants.
Definition: Constants.f90:9
@ disu
DISV6 discretization.
Definition: Constants.f90:157

◆ get_dis_type()

subroutine disumodule::get_dis_type ( class(disutype), intent(in)  this,
character(len=*), intent(out)  dis_type 
)
private

Definition at line 1168 of file Disu.f90.

1169  ! -- dummy
1170  class(DisuType), intent(in) :: this
1171  character(len=*), intent(out) :: dis_type
1172  !
1173  dis_type = "DISU"
1174  !

◆ get_ncpl()

integer(i4b) function disumodule::get_ncpl ( class(disutype this)
private

Definition at line 1380 of file Disu.f90.

1381  ! -- return
1382  integer(I4B) :: get_ncpl
1383  ! -- dummy
1384  class(DisuType) :: this
1385  !
1386  get_ncpl = this%nodesuser
1387  !

◆ get_nodenumber_idx1()

integer(i4b) function disumodule::get_nodenumber_idx1 ( class(disutype), intent(in)  this,
integer(i4b), intent(in)  nodeu,
integer(i4b), intent(in)  icheck 
)

Definition at line 1033 of file Disu.f90.

1034  class(DisuType), intent(in) :: this
1035  integer(I4B), intent(in) :: nodeu
1036  integer(I4B), intent(in) :: icheck
1037  integer(I4B) :: nodenumber
1038  !
1039  if (icheck /= 0) then
1040  if (nodeu < 1 .or. nodeu > this%nodes) then
1041  write (errmsg, '(a,i0,a,i0,a)') &
1042  'Node number (', nodeu, ') is less than 1 or greater than nodes (', &
1043  this%nodes, ').'
1044  call store_error(errmsg)
1045  end if
1046  end if
1047  !
1048  ! -- set node number to passed in nodenumber since there is a one to one
1049  ! mapping for an unstructured grid
1050  if (this%nodes == this%nodesuser) then
1051  nodenumber = nodeu
1052  else
1053  nodenumber = this%nodereduced(nodeu)
1054  end if
1055  !
Here is the call graph for this function:

◆ grid_finalize()

subroutine disumodule::grid_finalize ( class(disutype this)
private

Definition at line 201 of file Disu.f90.

202  ! -- dummy
203  class(DisuType) :: this
204  ! -- locals
205  integer(I4B) :: n
206  integer(I4B) :: node
207  integer(I4B) :: noder
208  integer(I4B) :: nrsize
209  ! -- formats
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, //)"
217  !
218  ! -- count active cells
219  this%nodes = 0
220  do n = 1, this%nodesuser
221  if (this%idomain(n) > 0) this%nodes = this%nodes + 1
222  end do
223  !
224  ! -- Check to make sure nodes is a valid number
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 &
228  &than zero.')
229  call store_error_filename(this%input_fname)
230  end if
231  !
232  ! -- Write message if reduced grid
233  if (this%nodes < this%nodesuser) then
234  write (this%iout, fmtnr) this%nodesuser, this%nodes
235  end if
236  !
237  ! -- Array size is now known, so allocate
238  call this%allocate_arrays()
239  !
240  ! -- Fill the nodereduced array with the reduced nodenumber, or
241  ! a negative number to indicate it is a pass-through cell, or
242  ! a zero to indicate that the cell is excluded from the
243  ! solution. (negative idomain not supported for disu)
244  if (this%nodes < this%nodesuser) then
245  noder = 1
246  do node = 1, this%nodesuser
247  if (this%idomain(node) > 0) then
248  this%nodereduced(node) = noder
249  noder = noder + 1
250  elseif (this%idomain(node) < 0) then
251  this%nodereduced(node) = -1
252  else
253  this%nodereduced(node) = 0
254  end if
255  end do
256  end if
257  !
258  ! -- Fill nodeuser if a reduced grid
259  if (this%nodes < this%nodesuser) then
260  noder = 1
261  do node = 1, this%nodesuser
262  if (this%idomain(node) > 0) then
263  this%nodeuser(noder) = node
264  noder = noder + 1
265  end if
266  end do
267  end if
268  !
269  ! -- Move top1d, bot1d, and area1d into top, bot, and area
270  do node = 1, this%nodesuser
271  noder = node
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)
277  end do
278  !
279  ! -- fill cell center coordinates
280  if (this%nvert > 0) then
281  do node = 1, this%nodesuser
282  noder = node
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)
287  end do
288  else
289  call mem_reallocate(this%xc, 0, 'XC', this%memoryPath)
290  call mem_reallocate(this%yc, 0, 'YC', this%memoryPath)
291  end if
292  !
293  ! -- create and fill the connections object
294  nrsize = 0
295  if (this%nodes < this%nodesuser) nrsize = this%nodes
296  allocate (this%con)
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, &
303  this%iangledegx)
304  this%nja = this%con%nja
305  this%njas = this%con%njas
306  !
Here is the call graph for this function:

◆ log_connectivity()

subroutine disumodule::log_connectivity ( class(disutype this,
type(disufoundtype), intent(in)  found,
integer(i4b), dimension(:), intent(in), pointer, contiguous  iac 
)
private

Definition at line 751 of file Disu.f90.

752  class(DisuType) :: this
753  type(DisuFoundType), intent(in) :: found
754  integer(I4B), dimension(:), contiguous, pointer, intent(in) :: iac
755  !
756  write (this%iout, '(1x,a)') 'Setting Discretization Connectivity'
757  !
758  if (associated(iac)) then
759  write (this%iout, '(4x,a)') 'IAC set from input file'
760  end if
761  !
762  if (found%ja) then
763  write (this%iout, '(4x,a)') 'JA set from input file'
764  end if
765  !
766  if (found%ihc) then
767  write (this%iout, '(4x,a)') 'IHC set from input file'
768  end if
769  !
770  if (found%cl12) then
771  write (this%iout, '(4x,a)') 'CL12 set from input file'
772  end if
773  !
774  if (found%hwva) then
775  write (this%iout, '(4x,a)') 'HWVA set from input file'
776  end if
777  !
778  if (found%angldegx) then
779  write (this%iout, '(4x,a)') 'ANGLDEGX set from input file'
780  end if
781  !
782  write (this%iout, '(1x,a,/)') 'End Setting Discretization Connectivity'
783  !

◆ log_dimensions()

subroutine disumodule::log_dimensions ( class(disutype this,
type(disufoundtype), intent(in)  found 
)
private

Definition at line 643 of file Disu.f90.

644  class(DisuType) :: this
645  type(DisuFoundType), intent(in) :: found
646  !
647  write (this%iout, '(1x,a)') 'Setting Discretization Dimensions'
648  !
649  if (found%nodes) then
650  write (this%iout, '(4x,a,i0)') 'NODES = ', this%nodesuser
651  end if
652  !
653  if (found%nja) then
654  write (this%iout, '(4x,a,i0)') 'NJA = ', this%njausr
655  end if
656  !
657  if (found%nvert) then
658  write (this%iout, '(4x,a,i0)') 'NVERT = ', this%nvert
659  end if
660  !
661  write (this%iout, '(1x,a,/)') 'End Setting Discretization Dimensions'
662  !

◆ log_griddata()

subroutine disumodule::log_griddata ( class(disutype this,
type(disufoundtype), intent(in)  found 
)
private

Definition at line 688 of file Disu.f90.

689  ! -- dummy
690  class(DisuType) :: this
691  type(DisuFoundType), intent(in) :: found
692  !
693  write (this%iout, '(1x,a)') 'Setting Discretization Griddata'
694  !
695  if (found%top) then
696  write (this%iout, '(4x,a)') 'TOP set from input file'
697  end if
698  !
699  if (found%bot) then
700  write (this%iout, '(4x,a)') 'BOT set from input file'
701  end if
702  !
703  if (found%area) then
704  write (this%iout, '(4x,a)') 'AREA set from input file'
705  end if
706  !
707  if (found%idomain) then
708  write (this%iout, '(4x,a)') 'IDOMAIN set from input file'
709  end if
710  !
711  write (this%iout, '(1x,a,/)') 'End Setting Discretization Griddata'
712  !

◆ log_options()

subroutine disumodule::log_options ( class(disutype this,
type(disufoundtype), intent(in)  found 
)
private

Definition at line 542 of file Disu.f90.

543  ! -- dummy
544  class(DisuType) :: this
545  type(DisuFoundType), intent(in) :: found
546  !
547  write (this%iout, '(1x,a)') 'Setting Discretization Options'
548  !
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
552  end if
553  !
554  if (found%nogrb) then
555  write (this%iout, '(4x,a,i0)') 'Binary grid file [0=GRB, 1=NOGRB] &
556  &set as ', this%nogrb
557  end if
558  !
559  if (found%xorigin) then
560  write (this%iout, '(4x,a,G0)') 'XORIGIN = ', this%xorigin
561  end if
562  !
563  if (found%yorigin) then
564  write (this%iout, '(4x,a,G0)') 'YORIGIN = ', this%yorigin
565  end if
566  !
567  if (found%angrot) then
568  write (this%iout, '(4x,a,G0)') 'ANGROT = ', this%angrot
569  end if
570  !
571  if (found%voffsettol) then
572  write (this%iout, '(4x,a,G0)') 'VERTICAL_OFFSET_TOLERANCE = ', &
573  this%voffsettol
574  end if
575  !
576  write (this%iout, '(1x,a,/)') 'End Setting Discretization Options'
577  !

◆ nodeu_from_cellid()

integer(i4b) function disumodule::nodeu_from_cellid ( class(disutype this,
character(len=*), intent(inout)  cellid,
integer(i4b), intent(in)  inunit,
integer(i4b), intent(in)  iout,
logical, intent(in), optional  flag_string,
logical, intent(in), optional  allow_zero 
)
private

If flag_string is present and true, the first token may be non-numeric (e.g. boundary name). In this case, return -2.

If allow_zero is present and true, and all indices are zero, the result can be zero. If allow_zero is false, a zero in any index is an error.

Definition at line 1316 of file Disu.f90.

1318  ! -- return
1319  integer(I4B) :: nodeu
1320  ! -- dummy
1321  class(DisuType) :: this
1322  character(len=*), intent(inout) :: cellid
1323  integer(I4B), intent(in) :: inunit
1324  integer(I4B), intent(in) :: iout
1325  logical, optional, intent(in) :: flag_string
1326  logical, optional, intent(in) :: allow_zero
1327  ! -- local
1328  integer(I4B) :: lloclocal, istart, istop, ndum, n
1329  integer(I4B) :: istat
1330  real(DP) :: r
1331  !
1332  if (present(flag_string)) then
1333  if (flag_string) then
1334  ! Check to see if first token in cellid can be read as an integer.
1335  lloclocal = 1
1336  call urword(cellid, lloclocal, istart, istop, 1, ndum, r, iout, inunit)
1337  read (cellid(istart:istop), *, iostat=istat) n
1338  if (istat /= 0) then
1339  ! First token in cellid is not an integer; return flag to this effect.
1340  nodeu = -2
1341  return
1342  end if
1343  end if
1344  end if
1345  !
1346  lloclocal = 1
1347  call urword(cellid, lloclocal, istart, istop, 2, nodeu, r, iout, inunit)
1348  !
1349  if (nodeu == 0) then
1350  if (present(allow_zero)) then
1351  if (allow_zero) then
1352  return
1353  end if
1354  end if
1355  end if
1356  !
1357  if (nodeu < 1 .or. nodeu > this%nodesuser) then
1358  write (errmsg, '(a,i0,a)') &
1359  "Cell number cannot be determined for cellid ("// &
1360  trim(adjustl(cellid))//") and results in a user "// &
1361  "node number (", nodeu, ") that is outside of the grid."
1362  call store_error(errmsg)
1363  call store_error_unit(inunit)
1364  end if
1365  !
Here is the call graph for this function:

◆ nodeu_from_string()

integer(i4b) function disumodule::nodeu_from_string ( class(disutype this,
integer(i4b), intent(inout)  lloc,
integer(i4b), intent(inout)  istart,
integer(i4b), intent(inout)  istop,
integer(i4b), intent(in)  in,
integer(i4b), intent(in)  iout,
character(len=*), intent(inout)  line,
logical, intent(in), optional  flag_string,
logical, intent(in), optional  allow_zero 
)

Parse and return user nodenumber. If flag_string is present and true, the first token may be non-numeric (e.g. boundary name). In this case, return -2.

Definition at line 1256 of file Disu.f90.

1258  ! -- dummy
1259  class(DisuType) :: this
1260  integer(I4B), intent(inout) :: lloc
1261  integer(I4B), intent(inout) :: istart
1262  integer(I4B), intent(inout) :: istop
1263  integer(I4B), intent(in) :: in
1264  integer(I4B), intent(in) :: iout
1265  character(len=*), intent(inout) :: line
1266  logical, optional, intent(in) :: flag_string
1267  logical, optional, intent(in) :: allow_zero
1268  integer(I4B) :: nodeu
1269  ! -- local
1270  integer(I4B) :: lloclocal, ndum, istat, n
1271  real(DP) :: r
1272  !
1273  if (present(flag_string)) then
1274  if (flag_string) then
1275  ! Check to see if first token in line can be read as an integer.
1276  lloclocal = lloc
1277  call urword(line, lloclocal, istart, istop, 1, ndum, r, iout, in)
1278  read (line(istart:istop), *, iostat=istat) n
1279  if (istat /= 0) then
1280  ! First token in line is not an integer; return flag to this effect.
1281  nodeu = -2
1282  return
1283  end if
1284  end if
1285  end if
1286  !
1287  call urword(line, lloc, istart, istop, 2, nodeu, r, iout, in)
1288  !
1289  if (nodeu == 0) then
1290  if (present(allow_zero)) then
1291  if (allow_zero) then
1292  return
1293  end if
1294  end if
1295  end if
1296  !
1297  if (nodeu < 1 .or. nodeu > this%nodesuser) then
1298  write (errmsg, '(a,i0,a)') &
1299  "Node number in list (", nodeu, ") is outside of the grid. "// &
1300  "Cell number cannot be determined in line '"// &
1301  trim(adjustl(line))//"'."
1302  call store_error(errmsg)
1303  call store_error_unit(in)
1304  end if
1305  !
Here is the call graph for this function:

◆ nodeu_to_array()

subroutine disumodule::nodeu_to_array ( class(disutype this,
integer(i4b), intent(in)  nodeu,
integer(i4b), dimension(:), intent(inout)  arr 
)
private

Definition at line 492 of file Disu.f90.

493  class(DisuType) :: this
494  integer(I4B), intent(in) :: nodeu
495  integer(I4B), dimension(:), intent(inout) :: arr
496  ! -- local
497  integer(I4B) :: isize
498  !
499  ! -- check the size of arr
500  isize = size(arr)
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, ')'
505  call store_error(errmsg, terminate=.true.)
506  end if
507  !
508  ! -- fill array
509  arr(1) = nodeu
510  !
Here is the call graph for this function:

◆ nodeu_to_string()

subroutine disumodule::nodeu_to_string ( class(disutype this,
integer(i4b), intent(in)  nodeu,
character(len=*), intent(inout)  str 
)
private

Definition at line 477 of file Disu.f90.

478  ! -- dummy
479  class(DisuType) :: this
480  integer(I4B), intent(in) :: nodeu
481  character(len=*), intent(inout) :: str
482  ! -- local
483  character(len=10) :: nstr
484  !
485  write (nstr, '(i0)') nodeu
486  str = '('//trim(adjustl(nstr))//')'
487  !

◆ read_dbl_array()

subroutine disumodule::read_dbl_array ( class(disutype), intent(inout)  this,
character(len=*), intent(inout)  line,
integer(i4b), intent(inout)  lloc,
integer(i4b), intent(inout)  istart,
integer(i4b), intent(inout)  istop,
integer(i4b), intent(in)  iout,
integer(i4b), intent(in)  in,
real(dp), dimension(:), intent(inout), pointer, contiguous  darray,
character(len=*), intent(in)  aname 
)
private

Definition at line 1433 of file Disu.f90.

1435  ! -- dummy
1436  class(DisuType), intent(inout) :: this
1437  character(len=*), intent(inout) :: line
1438  integer(I4B), intent(inout) :: lloc
1439  integer(I4B), intent(inout) :: istart
1440  integer(I4B), intent(inout) :: istop
1441  integer(I4B), intent(in) :: in
1442  integer(I4B), intent(in) :: iout
1443  real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray
1444  character(len=*), intent(in) :: aname
1445  ! -- local
1446  integer(I4B) :: nval
1447  real(DP), dimension(:), pointer, contiguous :: dtemp
1448  !
1449  ! -- Point the temporary pointer array, which is passed to the reading
1450  ! subroutine. The temporary array will point to dbuff if it is a
1451  ! reduced structured system, or to darray if it is an unstructured
1452  ! model.
1453  if (this%nodes < this%nodesuser) then
1454  nval = this%nodesuser
1455  dtemp => this%dbuff
1456  else
1457  nval = this%nodes
1458  dtemp => darray
1459  end if
1460  !
1461  ! -- Read the array
1462  call readarray(in, dtemp, aname, this%ndim, nval, iout, 0)
1463  !
1464  ! -- If reduced model, then need to copy from dtemp(=>dbuff) to darray
1465  if (this%nodes < this%nodesuser) then
1466  call this%fill_grid_array(dtemp, darray)
1467  end if
1468  !

◆ read_int_array()

subroutine disumodule::read_int_array ( class(disutype), intent(inout)  this,
character(len=*), intent(inout)  line,
integer(i4b), intent(inout)  lloc,
integer(i4b), intent(inout)  istart,
integer(i4b), intent(inout)  istop,
integer(i4b), intent(in)  iout,
integer(i4b), intent(in)  in,
integer(i4b), dimension(:), intent(inout), pointer, contiguous  iarray,
character(len=*), intent(in)  aname 
)
private

Definition at line 1392 of file Disu.f90.

1394  ! -- dummy
1395  class(DisuType), intent(inout) :: this
1396  character(len=*), intent(inout) :: line
1397  integer(I4B), intent(inout) :: lloc
1398  integer(I4B), intent(inout) :: istart
1399  integer(I4B), intent(inout) :: istop
1400  integer(I4B), intent(in) :: in
1401  integer(I4B), intent(in) :: iout
1402  integer(I4B), dimension(:), pointer, contiguous, intent(inout) :: iarray
1403  character(len=*), intent(in) :: aname
1404  ! -- local
1405  integer(I4B) :: nval
1406  integer(I4B), dimension(:), pointer, contiguous :: itemp
1407  !
1408  ! -- Point the temporary pointer array, which is passed to the reading
1409  ! subroutine. The temporary array will point to ibuff if it is a
1410  ! reduced structured system, or to iarray if it is an unstructured
1411  ! model.
1412  if (this%nodes < this%nodesuser) then
1413  nval = this%nodesuser
1414  itemp => this%ibuff
1415  else
1416  nval = this%nodes
1417  itemp => iarray
1418  end if
1419  !
1420  ! -- Read the array
1421  ! -- Read unstructured input
1422  call readarray(in, itemp, aname, this%ndim, nval, iout, 0)
1423  !
1424  ! -- If reduced model, then need to copy from itemp(=>ibuff) to iarray
1425  if (this%nodes < this%nodesuser) then
1426  call this%fill_grid_array(itemp, iarray)
1427  end if
1428  !

◆ record_array()

subroutine disumodule::record_array ( class(disutype), intent(inout)  this,
real(dp), dimension(:), intent(inout), pointer, contiguous  darray,
integer(i4b), intent(in)  iout,
integer(i4b), intent(in)  iprint,
integer(i4b), intent(in)  idataun,
character(len=*), intent(in)  aname,
character(len=*), intent(in)  cdatafmp,
integer(i4b), intent(in)  nvaluesp,
integer(i4b), intent(in)  nwidthp,
character(len=*), intent(in)  editdesc,
real(dp), intent(in)  dinact 
)
private

The array is written to a formatted or unformatted external file depending on the arguments.

Parameters
[in,out]darraydouble precision array to record
[in]ioutascii output unit number
[in]iprintwhether to print the array
[in]idataunbinary output unit number
[in]anametext descriptor
[in]nvaluespvalues per line
[in]nwidthpnumber width
[in]editdescformat type (I, G, F, S, E)
[in]dinactdouble precision value for cells excluded from model domain

Definition at line 1476 of file Disu.f90.

1478  ! -- dummy
1479  class(DisuType), intent(inout) :: this
1480  real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray !< double precision array to record
1481  integer(I4B), intent(in) :: iout !< ascii output unit number
1482  integer(I4B), intent(in) :: iprint !< whether to print the array
1483  integer(I4B), intent(in) :: idataun !< binary output unit number
1484  character(len=*), intent(in) :: aname !< text descriptor
1485  character(len=*), intent(in) :: cdatafmp ! write format
1486  integer(I4B), intent(in) :: nvaluesp !< values per line
1487  integer(I4B), intent(in) :: nwidthp !< number width
1488  character(len=*), intent(in) :: editdesc !< format type (I, G, F, S, E)
1489  real(DP), intent(in) :: dinact !< double precision value for cells excluded from model domain
1490  ! -- local
1491  integer(I4B) :: k, ifirst
1492  integer(I4B) :: nlay
1493  integer(I4B) :: nrow
1494  integer(I4B) :: ncol
1495  integer(I4B) :: nval
1496  integer(I4B) :: nodeu, noder
1497  integer(I4B) :: istart, istop
1498  real(DP), dimension(:), pointer, contiguous :: dtemp
1499  ! -- formats
1500  character(len=*), parameter :: fmthsv = &
1501  "(1X,/1X,a,' WILL BE SAVED ON UNIT ',I4, &
1502  &' AT END OF TIME STEP',I5,', STRESS PERIOD ',I4)"
1503  !
1504  ! -- set variables
1505  nlay = 1
1506  nrow = 1
1507  ncol = this%mshape(1)
1508  !
1509  ! -- If this is a reduced model, then copy the values from darray into
1510  ! dtemp.
1511  if (this%nodes < this%nodesuser) then
1512  nval = this%nodes
1513  dtemp => this%dbuff
1514  do nodeu = 1, this%nodesuser
1515  noder = this%get_nodenumber(nodeu, 0)
1516  if (noder <= 0) then
1517  dtemp(nodeu) = dinact
1518  cycle
1519  end if
1520  dtemp(nodeu) = darray(noder)
1521  end do
1522  else
1523  nval = this%nodes
1524  dtemp => darray
1525  end if
1526  !
1527  ! -- Print to iout if iprint /= 0
1528  if (iprint /= 0) then
1529  istart = 1
1530  do k = 1, nlay
1531  istop = istart + nrow * ncol - 1
1532  call ulaprufw(ncol, nrow, kstp, kper, k, iout, dtemp(istart:istop), &
1533  aname, cdatafmp, nvaluesp, nwidthp, editdesc)
1534  istart = istop + 1
1535  end do
1536  end if
1537  !
1538  ! -- Save array to an external file.
1539  if (idataun > 0) then
1540  ! -- write to binary file by layer
1541  ifirst = 1
1542  istart = 1
1543  do k = 1, nlay
1544  istop = istart + nrow * ncol - 1
1545  if (ifirst == 1) write (iout, fmthsv) &
1546  trim(adjustl(aname)), idataun, &
1547  kstp, kper
1548  ifirst = 0
1549  call ulasav(dtemp(istart:istop), aname, kstp, kper, &
1550  pertim, totim, ncol, nrow, k, idataun)
1551  istart = istop + 1
1552  end do
1553  elseif (idataun < 0) then
1554  !
1555  ! -- write entire array as one record
1556  call ubdsv1(kstp, kper, aname, -idataun, dtemp, ncol, nrow, nlay, &
1557  iout, delt, pertim, totim)
1558  end if
1559  !
Here is the call graph for this function:

◆ record_srcdst_list_header()

subroutine disumodule::record_srcdst_list_header ( class(disutype this,
character(len=16), intent(in)  text,
character(len=16), intent(in)  textmodel,
character(len=16), intent(in)  textpackage,
character(len=16), intent(in)  dstmodel,
character(len=16), intent(in)  dstpackage,
integer(i4b), intent(in)  naux,
character(len=16), dimension(:), intent(in)  auxtxt,
integer(i4b), intent(in)  ibdchn,
integer(i4b), intent(in)  nlist,
integer(i4b), intent(in)  iout 
)
private

Definition at line 1564 of file Disu.f90.

1567  ! -- dummy
1568  class(DisuType) :: this
1569  character(len=16), intent(in) :: text
1570  character(len=16), intent(in) :: textmodel
1571  character(len=16), intent(in) :: textpackage
1572  character(len=16), intent(in) :: dstmodel
1573  character(len=16), intent(in) :: dstpackage
1574  integer(I4B), intent(in) :: naux
1575  character(len=16), dimension(:), intent(in) :: auxtxt
1576  integer(I4B), intent(in) :: ibdchn
1577  integer(I4B), intent(in) :: nlist
1578  integer(I4B), intent(in) :: iout
1579  ! -- local
1580  integer(I4B) :: nlay, nrow, ncol
1581  !
1582  nlay = 1
1583  nrow = 1
1584  ncol = this%mshape(1)
1585  !
1586  ! -- Use ubdsv06 to write list header
1587  call ubdsv06(kstp, kper, text, textmodel, textpackage, dstmodel, dstpackage, &
1588  ibdchn, naux, auxtxt, ncol, nrow, nlay, &
1589  nlist, iout, delt, pertim, totim)
1590  !
Here is the call graph for this function:

◆ source_cell2d()

subroutine disumodule::source_cell2d ( class(disutype this)

Definition at line 861 of file Disu.f90.

862  ! -- dummy
863  class(DisuType) :: this
864  ! -- locals
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()
870  integer(I4B) :: i
871  !
872  ! -- set pointers to input path ncvert and icvert
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)
876  !
877  ! --
878  if (associated(icell2d) .and. associated(ncvert) &
879  .and. associated(icvert)) then
880  call this%define_cellverts(icell2d, ncvert, icvert)
881  else
882  call store_error('Required cell vertex arrays not found.')
883  end if
884  !
885  ! -- set pointers to cell center arrays
886  call mem_setptr(cell_x, 'XC', this%input_mempath)
887  call mem_setptr(cell_y, 'YC', this%input_mempath)
888  !
889  ! -- set cell centers
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)
894  end do
895  else
896  call store_error('Required cell center arrays not found.')
897  end if
898  !
899  ! -- log
900  if (this%iout > 0) then
901  write (this%iout, '(1x,a)') 'Discretization Cell2d data loaded'
902  end if
903  !
Here is the call graph for this function:

◆ source_connectivity()

subroutine disumodule::source_connectivity ( class(disutype this)
private

Definition at line 717 of file Disu.f90.

718  ! -- dummy
719  class(DisuType) :: this
720  ! -- locals
721  type(DisuFoundType) :: found
722  integer(I4B), dimension(:), contiguous, pointer :: iac => null()
723  ! -- formats
724  !
725  ! -- update defaults with idm sourced values
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, &
731  found%angldegx)
732  !
733  ! -- set pointer to iac input array
734  call mem_setptr(iac, 'IAC', this%input_mempath)
735  !
736  ! -- Convert iac to ia
737  if (associated(iac)) call iac_to_ia(iac, this%iainp)
738  !
739  ! -- Set angldegx flag if found
740  if (found%angldegx) this%iangledegx = 1
741  !
742  ! -- log simulation values
743  if (this%iout > 0) then
744  call this%log_connectivity(found, iac)
745  end if
746  !
Here is the call graph for this function:

◆ source_dimensions()

subroutine disumodule::source_dimensions ( class(disutype this)
private

Definition at line 582 of file Disu.f90.

583  ! -- dummy
584  class(DisuType) :: this
585  ! -- locals
586  integer(I4B) :: n
587  type(DisuFoundType) :: found
588  !
589  ! -- update defaults with idm sourced values
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)
593  !
594  ! -- log simulation values
595  if (this%iout > 0) then
596  call this%log_dimensions(found)
597  end if
598  !
599  ! -- verify dimensions were set
600  if (this%nodesuser < 1) then
601  call store_error( &
602  'NODES was not specified or was specified incorrectly.')
603  end if
604  if (this%njausr < 1) then
605  call store_error( &
606  'NJA was not specified or was specified incorrectly.')
607  end if
608  !
609  ! -- terminate if errors were detected
610  if (count_errors() > 0) then
611  call store_error_filename(this%input_fname)
612  end if
613  !
614  ! -- allocate vectors that are the size of nodesuser
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', &
627  this%memoryPath)
628  if (this%nvert > 0) then
629  call mem_allocate(this%cellxy, 2, this%nodesuser, 'CELLXY', this%memoryPath)
630  else
631  call mem_allocate(this%cellxy, 2, 0, 'CELLXY', this%memoryPath)
632  end if
633  !
634  ! -- initialize all cells to be active (idomain = 1)
635  do n = 1, this%nodesuser
636  this%idomain(n) = 1
637  end do
638  !
Here is the call graph for this function:

◆ source_griddata()

subroutine disumodule::source_griddata ( class(disutype this)
private

Definition at line 667 of file Disu.f90.

668  ! -- dummy
669  class(DisuType) :: this
670  ! -- locals
671  type(DisuFoundType) :: found
672  !
673  ! -- update defaults with idm sourced values
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)
678  !
679  ! -- log simulation values
680  if (this%iout > 0) then
681  call this%log_griddata(found)
682  end if
683  !

◆ source_options()

subroutine disumodule::source_options ( class(disutype this)
private

Definition at line 515 of file Disu.f90.

516  ! -- dummy
517  class(DisuType) :: this
518  ! -- locals
519  character(len=LENVARNAME), dimension(3) :: lenunits = &
520  &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS']
521  type(disufoundtype) :: found
522  !
523  ! -- update defaults with idm sourced values
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, &
531  found%voffsettol)
532  !
533  ! -- log values to list file
534  if (this%iout > 0) then
535  call this%log_options(found)
536  end if
537  !

◆ source_vertices()

subroutine disumodule::source_vertices ( class(disutype this)
private

Definition at line 788 of file Disu.f90.

789  ! -- dummy
790  class(DisuType) :: this
791  ! -- local
792  integer(I4B) :: i
793  real(DP), dimension(:), contiguous, pointer :: vert_x => null()
794  real(DP), dimension(:), contiguous, pointer :: vert_y => null()
795  ! -- formats
796  !
797  ! -- set pointers to memory manager input arrays
798  call mem_setptr(vert_x, 'XV', this%input_mempath)
799  call mem_setptr(vert_y, 'YV', this%input_mempath)
800  !
801  ! -- set vertices 2d array
802  if (associated(vert_x) .and. associated(vert_y)) then
803  do i = 1, this%nvert
804  this%vertices(1, i) = vert_x(i)
805  this%vertices(2, i) = vert_y(i)
806  end do
807  else
808  call store_error('Required Vertex arrays not found.')
809  end if
810  !
811  ! -- log
812  if (this%iout > 0) then
813  write (this%iout, '(1x,a)') 'Discretization Vertex data loaded'
814  end if
815  !
Here is the call graph for this function:

◆ supports_layers()

logical function disumodule::supports_layers ( class(disutype this)
private

Definition at line 1370 of file Disu.f90.

1371  ! -- dummy
1372  class(DisuType) :: this
1373  !
1374  supports_layers = .false.
1375  !

◆ write_grb()

subroutine disumodule::write_grb ( class(disutype this,
integer(i4b), dimension(:), intent(in)  icelltype 
)
private

Definition at line 908 of file Disu.f90.

909  ! -- modules
910  use openspecmodule, only: access, form
911  ! -- dummy
912  class(DisuType) :: this
913  integer(I4B), dimension(:), intent(in) :: icelltype
914  ! -- local
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
920  ! -- formats
921  character(len=*), parameter :: fmtgrdsave = &
922  "(4X,'BINARY GRID INFORMATION WILL BE WRITTEN TO:', &
923  &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)"
924  !
925  ! -- Initialize
926  ntxt = 11
927  if (this%nvert > 0) ntxt = ntxt + 5
928  !
929  ! -- Open the file
930  fname = trim(this%input_fname)//'.grb'
931  iunit = getunit()
932  write (this%iout, fmtgrdsave) iunit, trim(adjustl(fname))
933  call openfile(iunit, this%iout, trim(adjustl(fname)), 'DATA(BINARY)', &
934  form, access, 'REPLACE')
935  !
936  ! -- write header information
937  write (txthdr, '(a)') 'GRID DISU'
938  txthdr(50:50) = new_line('a')
939  write (iunit) txthdr
940  write (txthdr, '(a)') 'VERSION 1'
941  txthdr(50:50) = new_line('a')
942  write (iunit) txthdr
943  write (txthdr, '(a, i0)') 'NTXT ', ntxt
944  txthdr(50:50) = new_line('a')
945  write (iunit) txthdr
946  write (txthdr, '(a, i0)') 'LENTXT ', lentxt
947  txthdr(50:50) = new_line('a')
948  write (iunit) txthdr
949  !
950  ! -- write variable definitions
951  write (txt, '(3a, i0)') 'NODES ', 'INTEGER ', 'NDIM 0 # ', this%nodesuser
952  txt(lentxt:lentxt) = new_line('a')
953  write (iunit) txt
954  write (txt, '(3a, i0)') 'NJA ', 'INTEGER ', 'NDIM 0 # ', this%con%nja
955  txt(lentxt:lentxt) = new_line('a')
956  write (iunit) txt
957  write (txt, '(3a, 1pg24.15)') 'XORIGIN ', 'DOUBLE ', 'NDIM 0 # ', this%xorigin
958  txt(lentxt:lentxt) = new_line('a')
959  write (iunit) txt
960  write (txt, '(3a, 1pg24.15)') 'YORIGIN ', 'DOUBLE ', 'NDIM 0 # ', this%yorigin
961  txt(lentxt:lentxt) = new_line('a')
962  write (iunit) txt
963  write (txt, '(3a, 1pg24.15)') 'ANGROT ', 'DOUBLE ', 'NDIM 0 # ', this%angrot
964  txt(lentxt:lentxt) = new_line('a')
965  write (iunit) txt
966  write (txt, '(3a, i0)') 'TOP ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser
967  txt(lentxt:lentxt) = new_line('a')
968  write (iunit) txt
969  write (txt, '(3a, i0)') 'BOT ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser
970  txt(lentxt:lentxt) = new_line('a')
971  write (iunit) txt
972  write (txt, '(3a, i0)') 'IA ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + 1
973  txt(lentxt:lentxt) = new_line('a')
974  write (iunit) txt
975  write (txt, '(3a, i0)') 'JA ', 'INTEGER ', 'NDIM 1 ', this%con%nja
976  txt(lentxt:lentxt) = new_line('a')
977  write (iunit) txt
978  write (txt, '(3a, i0)') 'IDOMAIN ', 'INTEGER ', 'NDIM 1 ', this%nodesuser
979  txt(lentxt:lentxt) = new_line('a')
980  write (iunit) txt
981  write (txt, '(3a, i0)') 'ICELLTYPE ', 'INTEGER ', 'NDIM 1 ', this%nodesuser
982  txt(lentxt:lentxt) = new_line('a')
983  write (iunit) txt
984  !
985  ! -- if vertices have been read then write additional header information
986  if (this%nvert > 0) then
987  write (txt, '(3a, i0)') 'VERTICES ', 'DOUBLE ', 'NDIM 2 2 ', this%nvert
988  txt(lentxt:lentxt) = new_line('a')
989  write (iunit) txt
990  write (txt, '(3a, i0)') 'CELLX ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser
991  txt(lentxt:lentxt) = new_line('a')
992  write (iunit) txt
993  write (txt, '(3a, i0)') 'CELLY ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser
994  txt(lentxt:lentxt) = new_line('a')
995  write (iunit) txt
996  write (txt, '(3a, i0)') 'IAVERT ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + 1
997  txt(lentxt:lentxt) = new_line('a')
998  write (iunit) txt
999  write (txt, '(3a, i0)') 'JAVERT ', 'INTEGER ', 'NDIM 1 ', size(this%javert)
1000  txt(lentxt:lentxt) = new_line('a')
1001  write (iunit) txt
1002  end if
1003  !
1004  ! -- write data
1005  write (iunit) this%nodesuser ! nodes
1006  write (iunit) this%nja ! nja
1007  write (iunit) this%xorigin ! xorigin
1008  write (iunit) this%yorigin ! yorigin
1009  write (iunit) this%angrot ! angrot
1010  write (iunit) this%top1d ! top
1011  write (iunit) this%bot1d ! bot
1012  write (iunit) this%con%iausr ! ia
1013  write (iunit) this%con%jausr ! ja
1014  write (iunit) this%idomain ! idomain
1015  write (iunit) icelltype ! icelltype
1016  !
1017  ! -- if vertices have been read then write additional data
1018  if (this%nvert > 0) then
1019  write (iunit) this%vertices ! vertices
1020  write (iunit) (this%cellxy(1, i), i=1, this%nodesuser) ! cellx
1021  write (iunit) (this%cellxy(2, i), i=1, this%nodesuser) ! celly
1022  write (iunit) this%iavert ! iavert
1023  write (iunit) this%javert ! javert
1024  end if
1025  !
1026  ! -- Close the file
1027  close (iunit)
1028  !
character(len=20) access
Definition: OpenSpec.f90:7
character(len=20) form
Definition: OpenSpec.f90:7
Here is the call graph for this function: