MODFLOW 6  version 6.8.0.dev0
USGS Modular Hydrologic Model
tspspcmodule Module Reference

This module contains the TspSpc Module. More...

Data Types

type  tspspctype
 Derived type for managing SPC input. More...
 

Functions/Subroutines

subroutine initialize (this, dis, id, input_mempath, iout, name_model, packNameFlow, dvn, input_fname)
 Initialize the SPC type. More...
 
subroutine allocate_scalars (this)
 Allocate package scalars. More...
 
subroutine allocate_arrays (this)
 Allocate package arrays. More...
 
real(dp) function get_value (this, ientry, nbound_flow)
 Get the data value from this package. More...
 
subroutine apply_input_values (this)
 Apply current input mempath values to dblvec. More...
 
subroutine spc_rp (this, nbound_flowpack, budtxt)
 Read and prepare stress period data. More...
 
subroutine spc_ad (this, nbound_flowpack, budtxt)
 Advance. More...
 
subroutine spc_da (this)
 Deallocate variables. More...
 
subroutine check_flow_package (this, nbound_flowpack, budtxt)
 Check flow package consistency. More...
 

Variables

character(len=lenftype) ftype = 'SPC'
 

Detailed Description

This module contains the code for reading and storing a generic input file of source and sink concentrations or temperatures.

Function/Subroutine Documentation

◆ allocate_arrays()

subroutine tspspcmodule::allocate_arrays ( class(tspspctype this)
Parameters
thisTspSpcType object

Definition at line 163 of file TspSpc.f90.

164  ! -- modules
166  ! -- dummy variables
167  class(TspSpcType) :: this !< TspSpcType object
168  ! -- local
169  integer(I4B) :: i
170  !
171  call mem_allocate(this%dblvec, this%maxbound, 'DBLVEC', this%memoryPath)
172  !
173  do i = 1, this%maxbound
174  this%dblvec(i) = dzero
175  end do

◆ allocate_scalars()

subroutine tspspcmodule::allocate_scalars ( class(tspspctype this)
private
Parameters
thisTspSpcType object

Definition at line 142 of file TspSpc.f90.

143  ! -- modules
145  ! -- dummy variables
146  class(TspSpcType) :: this !< TspSpcType object
147  !
148  call mem_allocate(this%id, 'ID', this%memoryPath)
149  call mem_allocate(this%iout, 'IOUT', this%memoryPath)
150  call mem_allocate(this%maxbound, 'MAXBOUND', this%memoryPath)
151  call mem_allocate(this%iprpak, 'IPRPAK', this%memoryPath)
152  call mem_allocate(this%readasarrays, 'READASARRAYS', this%memoryPath)
153  !
154  this%id = 0
155  this%iout = 0
156  this%maxbound = 0
157  this%iprpak = 0
158  this%readasarrays = .false.

◆ apply_input_values()

subroutine tspspcmodule::apply_input_values ( class(tspspctype), intent(inout)  this)
private

For list-based SPC, iterates BNDNO/value rows. For array-based SPCA, copies the depvarname array directly.

Parameters
[in,out]thisTspSpcType object

Definition at line 220 of file TspSpc.f90.

221  ! -- dummy
222  class(TspSpcType), intent(inout) :: this !< TspSpcType object
223  ! -- local
224  integer(I4B), pointer :: nbound
225  integer(I4B), dimension(:), pointer, contiguous :: bndno_arr
226  real(DP), dimension(:), pointer, contiguous :: val_arr
227  integer(I4B) :: n
228  ! -- formats
229  character(len=*), parameter :: fmthdr = &
230  &"(1X,/1X,'INPUT VALUES FOR ',A,' PACKAGE (PACKAGE ',A,')')"
231  character(len=*), parameter :: fmtdvhdr = &
232  &"(5X,'NO.',5X,A)"
233  character(len=*), parameter :: fmtdvval = &
234  &"(5X,I6,2X,G12.5)"
235  !
236  if (this%readasarrays) then
237  ! -- array mode: copy depvarname array into dblvec
238  call mem_setptr(val_arr, trim(this%depvarname), this%input_mempath)
239  do n = 1, this%maxbound
240  this%dblvec(n) = val_arr(n)
241  end do
242  if (this%iprpak /= 0) then
243  write (this%iout, fmthdr) trim(this%depvarname), &
244  trim(this%packNameFlow)
245  write (this%iout, fmtdvhdr) trim(this%depvarname)
246  do n = 1, this%maxbound
247  write (this%iout, fmtdvval) n, this%dblvec(n)
248  end do
249  end if
250  else
251  ! -- list mode: apply BNDNO-indexed values; DNODATA entries are skipped
252  call mem_setptr(nbound, 'NBOUND', this%input_mempath)
253  call mem_setptr(bndno_arr, 'BNDNO', this%input_mempath)
254  call mem_setptr(val_arr, trim(this%depvarname), this%input_mempath)
255  do n = 1, nbound
256  if (val_arr(n) /= dnodata) then
257  this%dblvec(bndno_arr(n)) = val_arr(n)
258  end if
259  end do
260  if (this%iprpak /= 0) then
261  write (this%iout, fmthdr) trim(this%depvarname), &
262  trim(this%packNameFlow)
263  write (this%iout, fmtdvhdr) trim(this%depvarname)
264  do n = 1, this%maxbound
265  write (this%iout, fmtdvval) n, this%dblvec(n)
266  end do
267  end if
268  end if

◆ check_flow_package()

subroutine tspspcmodule::check_flow_package ( class(tspspctype), intent(inout)  this,
integer(i4b), intent(in)  nbound_flowpack,
character(len=*), intent(in)  budtxt 
)

Check that MAXBOUND is not less than nbound_flowpack and that readasarrays is consistent with the flow package type.

Parameters
[in,out]thisTspSpcType object

Definition at line 342 of file TspSpc.f90.

343  ! -- dummy
344  class(TspSpcType), intent(inout) :: this !< TspSpcType object
345  integer(I4B), intent(in) :: nbound_flowpack
346  character(len=*), intent(in) :: budtxt
347  !
348  ! -- Check and make sure MAXBOUND is not less than nbound_flowpack
349  if (this%maxbound < nbound_flowpack) then
350  write (errmsg, '(a,a,a,i0,a,i0,a)') &
351  'The SPC Package corresponding to flow package ', &
352  trim(this%packNameFlow), &
353  ' has MAXBOUND set less than the number of boundaries &
354  &active in this package. Found MAXBOUND equal ', &
355  this%maxbound, &
356  ' and number of flow boundaries (NBOUND) equal ', &
357  nbound_flowpack, &
358  '. Increase MAXBOUND in the SPC input file for this package.'
359  call store_error(errmsg)
360  call store_error_filename(this%input_fname)
361  end if
362  !
363  ! -- If budtxt is RCHA or EVTA, then readasarrays must be used, otherwise
364  ! readasarrays cannot be used
365  select case (trim(adjustl(budtxt)))
366  case ('RCHA')
367  if (.not. this%readasarrays) then
368  write (errmsg, '(a,a,a)') &
369  'Array-based recharge must be used with array-based stress package &
370  &concentrations. GWF Package ', trim(this%packNameFlow), ' is being &
371  &used with list-based SPC6 input. Use array-based SPC6 input instead.'
372  call store_error(errmsg)
373  call store_error_filename(this%input_fname)
374  end if
375  case ('EVTA')
376  if (.not. this%readasarrays) then
377  write (errmsg, '(a,a,a)') &
378  'Array-based evapotranspiration must be used with array-based stress &
379  &package concentrations. GWF Package ', trim(this%packNameFlow), &
380  &' is being used with list-based SPC6 input. Use array-based SPC6 &
381  &input instead.'
382  call store_error(errmsg)
383  call store_error_filename(this%input_fname)
384  end if
385  case default
386  if (this%readasarrays) then
387  write (errmsg, '(a,a,a)') &
388  'List-based packages must be used with list-based stress &
389  &package concentrations. GWF Package ', trim(this%packNameFlow), &
390  &' is being used with array-based SPC6 input. Use list-based SPC6 &
391  &input instead.'
392  call store_error(errmsg)
393  call store_error_filename(this%input_fname)
394  end if
395  end select
Here is the call graph for this function:

◆ get_value()

real(dp) function tspspcmodule::get_value ( class(tspspctype this,
integer(i4b), intent(in)  ientry,
integer(i4b), intent(in)  nbound_flow 
)

Get the floating point value from the dblvec array.

Parameters
thisTspSpcType object
[in]ientryindex of the data to return
[in]nbound_flowsize of bound list in flow package

Definition at line 183 of file TspSpc.f90.

184  class(TspSpcType) :: this !< TspSpcType object
185  integer(I4B), intent(in) :: ientry !< index of the data to return
186  integer(I4B), intent(in) :: nbound_flow !< size of bound list in flow package
187  real(DP) :: value
188  integer(I4B) :: nu
189  if (this%readasarrays) then
190  ! -- Special handling for reduced grids and readasarrays.
191  ! -- If flow and transport are in the same simulation, ientry is a user
192  ! -- node number and corresponds to the correct position in dblvec.
193  ! -- If flow and transport are not in the same simulation, ientry is a
194  ! -- reduced node number, because the list of flows in the budget file
195  ! -- does not include idomain < 1 entries. In that case, ientry must be
196  ! -- converted to a user node number so that it corresponds to a user
197  ! -- array, which includes idomain < 1 values.
198  if (nbound_flow == this%maxbound) then
199  ! -- flow and transport are in the same simulation or there
200  ! -- are no idomain < 1 cells.
201  value = this%dblvec(ientry)
202  else
203  ! -- flow and transport are in separate simulations; nbound_flow
204  ! -- would equal ncpl if in the same simulation, but boundary cells
205  ! -- with idomain < 1 are excluded from the binary budget file.
206  nu = this%dis%get_nodeuser(ientry)
207  value = this%dblvec(nu)
208  end if
209  else
210  value = this%dblvec(ientry)
211  end if

◆ initialize()

subroutine tspspcmodule::initialize ( class(tspspctype this,
class(disbasetype), intent(in), pointer  dis,
integer(i4b), intent(in)  id,
character(len=*), intent(in)  input_mempath,
integer(i4b), intent(in)  iout,
character(len=*), intent(in)  name_model,
character(len=*), intent(in)  packNameFlow,
character(len=*), intent(in)  dvn,
character(len=*), intent(in)  input_fname 
)
private

Initialize the SPC object using input context data.

Parameters
thisTspSpcType
[in]disdiscretization package
[in]idid number for this spc package
[in]input_mempathinput memory path
[in]ioutunit number for output
[in]name_modelmodel name
[in]packnameflowname of corresponding flow package
[in]dvndependent variable name (CONCENTRATION or TEMPERATURE)
[in]input_fnameSPC input file name

Definition at line 73 of file TspSpc.f90.

75  ! -- dummy variables
76  class(TspSpcType) :: this !< TspSpcType
77  class(DisBaseType), pointer, intent(in) :: dis !< discretization package
78  integer(I4B), intent(in) :: id !< id number for this spc package
79  character(len=*), intent(in) :: input_mempath !< input memory path
80  integer(I4B), intent(in) :: iout !< unit number for output
81  character(len=*), intent(in) :: name_model !< model name
82  character(len=*), intent(in) :: packNameFlow !< name of corresponding flow package
83  character(len=*), intent(in) :: dvn !< dependent variable name (CONCENTRATION or TEMPERATURE)
84  character(len=*), intent(in) :: input_fname !< SPC input file name
85  ! -- local
86  integer(I4B), pointer :: maxbound_ptr
87  integer(I4B) :: isize
88  logical(LGP) :: found_print_input
89  !
90  write (this%packName, '(a,i0)') 'SPC-', id
91  !
92  call this%allocate_scalars()
93  !
94  this%name_model = name_model
95  this%memoryPath = create_mem_path(this%name_model, this%packName)
96  this%input_mempath = input_mempath
97  this%input_fname = input_fname
98  this%id = id
99  this%iout = iout
100  this%packNameFlow = packnameflow
101  this%depvarname = dvn
102  this%dis => dis
103  !
104  ! -- READASARRAYS determine array or list based input
105  call get_isize('READASARRAYS', input_mempath, isize)
106  this%readasarrays = (isize > 0)
107  !
108  ! -- set maxbound
109  if (this%readasarrays) then
110  this%maxbound = dis%get_ncpl()
111  else
112  call mem_setptr(maxbound_ptr, 'MAXBOUND', input_mempath)
113  this%maxbound = maxbound_ptr
114  end if
115  !
116  call this%allocate_arrays()
117  !
118  ! -- read PRINT_INPUT flag from input context
119  call mem_set_value(this%iprpak, 'PRINT_INPUT', this%input_mempath, &
120  found_print_input)
121  if (found_print_input) then
122  write (this%iout, '(4x,a)') 'TIME-VARYING INPUT WILL BE PRINTED.'
123  end if
124  !
125  ! -- check for idm managed active timeseries
126  call get_isize('TS6_FILENAME', input_mempath, isize)
127  if (isize > 0) this%ts_active = .true.
128  call get_isize('TAS6_FILENAME', input_mempath, isize)
129  if (isize > 0) this%ts_active = .true.
130  !
131  write (this%iout, '(4x,a,a,a,a,a)') 'USING SPC INPUT FILE ', &
132  trim(input_fname), ' TO SET ', trim(dvn), &
133  'S FOR PACKAGE '//trim(packnameflow)
134  !
135  if (count_errors() > 0) then
136  call store_error_filename(this%input_fname)
137  end if
Here is the call graph for this function:

◆ spc_ad()

subroutine tspspcmodule::spc_ad ( class(tspspctype), intent(inout)  this,
integer(i4b), intent(in)  nbound_flowpack,
character(len=*), intent(in)  budtxt 
)
private

Apply advanced input values at each time step.

Parameters
[in,out]thisTspSpcType object

Definition at line 306 of file TspSpc.f90.

307  ! -- dummy
308  class(TspSpcType), intent(inout) :: this !< TspSpcType object
309  integer(I4B), intent(in) :: nbound_flowpack
310  character(len=*), intent(in) :: budtxt
311  !
312  ! -- no-op if timeseries inactive
313  if (.not. this%ts_active) return
314  !
315  call this%apply_input_values()
316  call this%check_flow_package(nbound_flowpack, budtxt)

◆ spc_da()

subroutine tspspcmodule::spc_da ( class(tspspctype this)
private
Parameters
thisTspSpcType object

Definition at line 321 of file TspSpc.f90.

322  ! -- modules
324  ! -- dummy variables
325  class(TspSpcType) :: this !< TspSpcType object
326  !
327  nullify (this%dis)
328  call mem_deallocate(this%dblvec)
329  call mem_deallocate(this%id)
330  call mem_deallocate(this%iout)
331  call mem_deallocate(this%maxbound)
332  call mem_deallocate(this%iprpak)
333  call mem_deallocate(this%readasarrays)

◆ spc_rp()

subroutine tspspcmodule::spc_rp ( class(tspspctype), intent(inout)  this,
integer(i4b), intent(in)  nbound_flowpack,
character(len=*), intent(in)  budtxt 
)
private

Copies input period data into dblvec when new data has been loaded for this stress period.

Parameters
[in,out]thisTspSpcType object

Definition at line 277 of file TspSpc.f90.

278  ! -- dummy
279  class(TspSpcType), intent(inout) :: this !< TspSpcType object
280  integer(I4B), intent(in) :: nbound_flowpack
281  character(len=*), intent(in) :: budtxt
282  ! -- local
283  integer(I4B), pointer :: iper
284  ! -- formats
285  character(len=*), parameter :: fmtlsp = &
286  &"(1X,/1X,'REUSING ',A,'S FROM LAST STRESS PERIOD')"
287  !
288  call mem_setptr(iper, 'IPER', this%input_mempath)
289  if (iper /= kper) then
290  write (this%iout, fmtlsp) trim(ftype)
291  return
292  end if
293  !
294  ! -- spc_ad applies each time step
295  if (this%ts_active) return
296  !
297  call this%apply_input_values()
298  call this%check_flow_package(nbound_flowpack, budtxt)

Variable Documentation

◆ ftype

character(len=lenftype) tspspcmodule::ftype = 'SPC'
private

Definition at line 26 of file TspSpc.f90.

26  character(len=LENFTYPE) :: ftype = 'SPC'