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

This module contains the ModelPackageInputsModule. More...

Data Types

type  loadablepackagetype
 derived type for loadable package type More...
 
type  modelpackageinputstype
 derived type for model package inputs type More...
 

Functions/Subroutines

logical(lgp) function multi_pkg_type (mtype_component, ptype_component, pkgtype)
 does model support multiple instances of this package type More...
 
logical(lgp) function, public supported_model (ctype)
 is this a supported MODFLOW 6 model type More...
 
subroutine pkgtype_create (this, modeltype, modelname, pkgtype)
 create a new package type More...
 
subroutine pkgtype_add (this, modelname, mtype_component, filetype, filename, pkgname, iout)
 add a new package instance to this package type More...
 
subroutine pkgtype_destroy (this)
 deallocate object More...
 
subroutine modelpkgs_init (this, modeltype, modelfname, modelname, iout)
 initialize model package inputs object More...
 
subroutine modelpkgs_create (this, ftypes)
 create the package type list More...
 
subroutine modelpkgs_add (this, pkgtype, filename, pkgname)
 add a model package instance to package type list More...
 
subroutine modelpkgs_addpkgs (this)
 build the type list with all model package instances More...
 
integer(i4b) function modelpkgs_pkgcount (this)
 get package instance count and verify base or multi of each More...
 
subroutine modelpkgs_memload (this)
 load package descriptors to managed memory More...
 
subroutine modelpkgs_destroy (this)
 deallocate object More...
 

Detailed Description

This module contains the high-level routines for assembling model package information and loading to the input context

Function/Subroutine Documentation

◆ modelpkgs_add()

subroutine modelpackageinputsmodule::modelpkgs_add ( class(modelpackageinputstype this,
character(len=*), intent(in)  pkgtype,
character(len=*), intent(in)  filename,
character(len=*), intent(in)  pkgname 
)

Definition at line 340 of file ModelPackageInputs.f90.

341  class(ModelPackageInputsType) :: this
342  character(len=*), intent(in) :: pkgtype
343  character(len=*), intent(in) :: filename
344  character(len=*), intent(in) :: pkgname
345  type(LoadablePackageType) :: pkg
346  integer(I4B) :: n
347  ! locate index of pkgtype in pkglist
348  do n = 1, size(this%pkglist)
349  pkg = this%pkglist(n)
350  if (pkg%pkgtype == pkgtype) then
351  call this%pkglist(n)%add(this%modelname, this%component_type, &
352  pkgtype, filename, pkgname, this%iout)
353  exit
354  end if
355  end do

◆ modelpkgs_addpkgs()

subroutine modelpackageinputsmodule::modelpkgs_addpkgs ( class(modelpackageinputstype this)
private

Definition at line 360 of file ModelPackageInputs.f90.

363  class(ModelPackageInputsType) :: this
364  type(CharacterStringType), dimension(:), contiguous, &
365  pointer :: ftypes !< file types
366  type(CharacterStringType), dimension(:), contiguous, &
367  pointer :: fnames !< file names
368  type(CharacterStringType), dimension(:), contiguous, &
369  pointer :: pnames !< package names
370  character(len=LINELENGTH) :: ftype, fname, pname
371  integer(I4B) :: n
372 
373  ! set pointers to input context model package attribute arrays
374  call mem_setptr(ftypes, 'FTYPE', this%input_mempath)
375  call mem_setptr(fnames, 'FNAME', this%input_mempath)
376  call mem_setptr(pnames, 'PNAME', this%input_mempath)
377 
378  ! create the package list
379  call this%create(ftypes)
380 
381  ! load model packages
382  do n = 1, size(ftypes)
383  ! attributes for this package
384  ftype = ftypes(n)
385  fname = fnames(n)
386  call inlen_check(pnames(n), pname, lenpackagename, 'PACKAGENAME')
387 
388  ! add this instance to package list
389  call this%add(ftype, fname, pname)
390  end do
391 
392  ! terminate if errors were detected
393  if (count_errors() > 0) then
394  call store_error_filename(this%modelfname)
395  end if
This module contains the SourceCommonModule.
Definition: SourceCommon.f90:7
subroutine, public inlen_check(input_name, mf6_name, maxlen, name_type)
store an error for input exceeding internal name length
Here is the call graph for this function:

◆ modelpkgs_create()

subroutine modelpackageinputsmodule::modelpkgs_create ( class(modelpackageinputstype this,
type(characterstringtype), dimension(:), pointer, contiguous  ftypes 
)

Definition at line 272 of file ModelPackageInputs.f90.

273  use sortmodule, only: qsort
274  class(ModelPackageInputsType) :: this
275  type(CharacterStringType), dimension(:), contiguous, &
276  pointer :: ftypes
277  integer(I4B), dimension(:), allocatable :: cunit_idxs, indx
278  character(len=LENPACKAGETYPE) :: ftype
279  integer(I4B) :: n, m
280  logical(LGP) :: found
281 
282  ! allocate
283  allocate (cunit_idxs(0))
284 
285  ! identify input packages and check that each is supported
286  do n = 1, size(ftypes)
287  ! type from model nam file packages block
288  ftype = ftypes(n)
289  found = .false.
290 
291  ! search supported types for this filetype
292  do m = 1, this%niunit
293  if (this%cunit(m) == ftype) then
294  ! set found
295  found = .true.
296 
297  ! add to cunit list if first instance of this type
298  if (any(cunit_idxs == m)) then
299  ! no-op
300  else
301  call expandarray(cunit_idxs)
302  cunit_idxs(size(cunit_idxs)) = m
303  end if
304 
305  ! exit search
306  exit
307  end if
308  end do
309 
310  ! set error if namfile pkg filetype is not supported
311  if (.not. found) then
312  write (errmsg, '(a,a,a,a,a)') 'Model package type not supported &
313  &[model=', trim(this%modelname), ', type=', &
314  trim(ftype), '].'
315  call store_error(errmsg)
316  call store_error_filename(this%modelfname)
317  end if
318  end do
319 
320  ! allocate the pkglist
321  allocate (this%pkglist(size(cunit_idxs)))
322 
323  ! sort cunit indexes
324  allocate (indx(size(cunit_idxs)))
325  call qsort(indx, cunit_idxs)
326 
327  ! create sorted LoadablePackageType object list
328  do n = 1, size(cunit_idxs)
329  call this%pkglist(n)%create(this%modeltype, this%modelname, &
330  this%cunit(cunit_idxs(n)))
331  end do
332 
333  ! cleanup
334  deallocate (cunit_idxs)
335  deallocate (indx)
Here is the call graph for this function:

◆ modelpkgs_destroy()

subroutine modelpackageinputsmodule::modelpkgs_destroy ( class(modelpackageinputstype this)

Definition at line 473 of file ModelPackageInputs.f90.

474  class(ModelPackageInputsType) :: this
475  integer(I4B) :: n
476  do n = 1, size(this%pkglist)
477  call this%pkglist(n)%destroy()
478  end do
479  deallocate (this%pkglist)
480  deallocate (this%cunit)

◆ modelpkgs_init()

subroutine modelpackageinputsmodule::modelpkgs_init ( class(modelpackageinputstype this,
character(len=*), intent(in)  modeltype,
character(len=*), intent(in)  modelfname,
character(len=*), intent(in)  modelname,
integer(i4b), intent(in)  iout 
)
private

Definition at line 222 of file ModelPackageInputs.f90.

228  class(ModelPackageInputsType) :: this
229  character(len=*), intent(in) :: modeltype
230  character(len=*), intent(in) :: modelfname
231  character(len=*), intent(in) :: modelname
232  integer(I4B), intent(in) :: iout
233 
234  ! initialize object
235  this%modeltype = modeltype
236  this%modelfname = modelfname
237  this%modelname = modelname
238  this%component_type = idm_component_type(modeltype)
239  this%iout = iout
240 
241  ! verify user specified model type
242  if (.not. supported_model(modeltype)) then
243  ! -- error and exit for unsupported model type
244  write (errmsg, '(3a)') 'Models block model type "', trim(modeltype), &
245  '" is not valid.'
246  call store_error(errmsg)
247  call store_error_filename(simfile)
248  end if
249 
250  ! allocate and set model supported package types
251  call supported_model_packages(modeltype, this%cunit, this%niunit)
252 
253  ! set memory paths
254  this%input_mempath = create_mem_path(this%modelname, 'NAM', idm_context)
255  this%model_mempath = create_mem_path(component=this%modelname, &
256  context=idm_context)
257  ! allocate managed memory
258  call mem_allocate(this%pkgtypes, lenpackagetype, 0, 'PKGTYPES', &
259  this%model_mempath)
260  call mem_allocate(this%pkgnames, lenpackagename, 0, 'PKGNAMES', &
261  this%model_mempath)
262  call mem_allocate(this%mempaths, lenmempath, 0, 'MEMPATHS', &
263  this%model_mempath)
264  call mem_allocate(this%inunits, 0, 'INUNITS', this%model_mempath)
265 
266  ! build descriptions of packages
267  call this%addpkgs()
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
This module contains the ModelPackageInputModule.
subroutine, public supported_model_packages(mtype, pkgtypes, numpkgs)
set supported package types for model
This module contains simulation variables.
Definition: SimVariables.f90:9
character(len=linelength) idm_context
character(len=linelength) simfile
simulation name file
character(len=lencomponentname) function, public idm_component_type(component)
component from package or model type
Here is the call graph for this function:

◆ modelpkgs_memload()

subroutine modelpackageinputsmodule::modelpkgs_memload ( class(modelpackageinputstype this)
private

Definition at line 433 of file ModelPackageInputs.f90.

435  class(ModelPackageInputsType) :: this
436  integer(I4B) :: n, m, idx
437  integer(I4B) :: pnum
438 
439  ! initialize load index
440  idx = 0
441 
442  ! set total number of package instances
443  pnum = this%pkgcount()
444 
445  ! reallocate model input package attribute arrays
446  call mem_reallocate(this%pkgtypes, lenpackagetype, pnum, 'PKGTYPES', &
447  this%model_mempath)
448  call mem_reallocate(this%pkgnames, lenpackagename, pnum, 'PKGNAMES', &
449  this%model_mempath)
450  call mem_reallocate(this%mempaths, lenmempath, pnum, 'MEMPATHS', &
451  this%model_mempath)
452  call mem_reallocate(this%inunits, pnum, 'INUNITS', this%model_mempath)
453 
454  ! load pkinfo
455  do n = 1, size(this%pkglist)
456  do m = 1, this%pkglist(n)%pnum
457  ! increment index
458  idx = idx + 1
459  ! package type like 'CHD6'
460  this%pkgtypes(idx) = trim(this%pkglist(n)%pkgtype)
461  ! package name like 'CHD-2'
462  this%pkgnames(idx) = trim(this%pkglist(n)%pkgnames(m))
463  ! memory path like '__INPUT__/MYMODEL/CHD-2'
464  this%mempaths(idx) = trim(this%pkglist(n)%mempaths(m))
465  ! input file unit number
466  this%inunits(idx) = this%pkglist(n)%inunits(m)
467  end do
468  end do

◆ modelpkgs_pkgcount()

integer(i4b) function modelpackageinputsmodule::modelpkgs_pkgcount ( class(modelpackageinputstype this)

Definition at line 400 of file ModelPackageInputs.f90.

401  class(ModelPackageInputsType) :: this
402  integer(I4B) :: pnum
403  integer(I4B) :: n
404 
405  ! initialize
406  pnum = 0
407 
408  ! count model package instances
409  do n = 1, size(this%pkglist)
410  if (multi_pkg_type(this%component_type, &
411  this%pkglist(n)%subcomponent_type, &
412  this%pkglist(n)%pkgtype)) then
413  ! multiple instances ok
414  else
415  ! set error for unexpected extra packages
416  if (this%pkglist(n)%pnum > 1) then
417  write (errmsg, '(a,a,a,a,a)') &
418  'Multiple instances specified for model base package type &
419  &[model=', trim(this%modelname), ', type=', &
420  trim(this%pkglist(n)%pkgtype), '].'
421  call store_error(errmsg)
422  call store_error_filename(this%modelfname)
423  end if
424  end if
425 
426  ! add to package count
427  pnum = pnum + this%pkglist(n)%pnum
428  end do
Here is the call graph for this function:

◆ multi_pkg_type()

logical(lgp) function modelpackageinputsmodule::multi_pkg_type ( character(len=lencomponentname), intent(in)  mtype_component,
character(len=lencomponentname), intent(in)  ptype_component,
character(len=lenftype), intent(in)  pkgtype 
)
private

Definition at line 93 of file ModelPackageInputs.f90.

97  character(len=LENCOMPONENTNAME), intent(in) :: mtype_component
98  character(len=LENCOMPONENTNAME), intent(in) :: ptype_component
99  character(len=LENFTYPE), intent(in) :: pkgtype
100  logical(LGP) :: multi_pkg
101  multi_pkg = .false.
102  if (idm_integrated(mtype_component, ptype_component)) then
103  multi_pkg = idm_multi_package(mtype_component, ptype_component)
104  else
105  multi_pkg = multi_package_type(mtype_component, ptype_component, pkgtype)
106  end if
logical function, public idm_integrated(component, subcomponent)
logical function, public idm_multi_package(component, subcomponent)
logical(lgp) function, public multi_package_type(mtype_component, ptype_component, pkgtype)
Is the package multi-instance.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pkgtype_add()

subroutine modelpackageinputsmodule::pkgtype_add ( class(loadablepackagetype this,
character(len=*), intent(in)  modelname,
character(len=*), intent(in)  mtype_component,
character(len=*), intent(in)  filetype,
character(len=*), intent(in)  filename,
character(len=*), intent(in)  pkgname,
integer(i4b), intent(in)  iout 
)

Definition at line 148 of file ModelPackageInputs.f90.

155  class(LoadablePackageType) :: this
156  character(len=*), intent(in) :: modelname
157  character(len=*), intent(in) :: mtype_component
158  character(len=*), intent(in) :: filetype
159  character(len=*), intent(in) :: filename
160  character(len=*), intent(in) :: pkgname
161  integer(I4B), intent(in) :: iout
162  character(len=LENPACKAGENAME) :: sc_name, pname
163  character(len=LENMEMPATH) :: mempath
164  character(len=LINELENGTH), pointer :: cstr
165 
166  ! reallocate
167  call expandarray(this%filenames)
168  call expandarray(this%pkgnames)
169  call expandarray(this%inunits)
170  call expandarray(this%mempaths)
171 
172  ! add new package instance
173  this%pnum = this%pnum + 1
174  this%filenames(this%pnum) = filename
175  this%pkgnames(this%pnum) = pkgname
176  this%inunits(this%pnum) = 0
177 
178  ! set pkgname if empty
179  if (this%pkgnames(this%pnum) == '') then
180  if (multi_pkg_type(mtype_component, &
181  this%subcomponent_type, &
182  filetype)) then
183  pname = idm_pkg_instance_name(this%subcomponent_type, &
184  this%pnum)
185  else
186  write (pname, '(a)') trim(this%subcomponent_type)
187  end if
188  this%pkgnames(this%pnum) = pname
189  end if
190 
191  ! set up input context for model
192  if (idm_integrated(mtype_component, this%subcomponent_type)) then
193  ! set subcomponent name
194  sc_name = idm_subcomponent_name(mtype_component, this%subcomponent_type, &
195  this%pkgnames(this%pnum))
196  ! create and store the mempath
197  this%mempaths(this%pnum) = &
198  create_mem_path(modelname, sc_name, idm_context)
199  ! allocate and initialize filename for package
200  mempath = create_mem_path(modelname, sc_name, idm_context)
201  call mem_allocate(cstr, linelength, 'INPUT_FNAME', mempath)
202  cstr = filename
203  else
204  ! set mempath empty
205  this%mempaths(this%pnum) = ''
206  end if
character(len=lenpackagename) function, public idm_pkg_instance_name(pkg_type, inst)
default name for a multi-package instance
character(len=lenpackagename) function, public idm_subcomponent_name(component_type, subcomponent_type, sc_name)
model package subcomponent name
Here is the call graph for this function:

◆ pkgtype_create()

subroutine modelpackageinputsmodule::pkgtype_create ( class(loadablepackagetype this,
character(len=*), intent(in)  modeltype,
character(len=*), intent(in)  modelname,
character(len=*), intent(in)  pkgtype 
)

Definition at line 127 of file ModelPackageInputs.f90.

129  class(LoadablePackageType) :: this
130  character(len=*), intent(in) :: modeltype
131  character(len=*), intent(in) :: modelname
132  character(len=*), intent(in) :: pkgtype
133 
134  ! initialize
135  this%pkgtype = pkgtype
136  this%subcomponent_type = idm_subcomponent_type(modeltype, pkgtype)
137  this%pnum = 0
138 
139  ! allocate arrays
140  allocate (this%filenames(0))
141  allocate (this%pkgnames(0))
142  allocate (this%mempaths(0))
143  allocate (this%inunits(0))
character(len=lencomponentname) function, public idm_subcomponent_type(component, subcomponent)
component from package or model type
Here is the call graph for this function:

◆ pkgtype_destroy()

subroutine modelpackageinputsmodule::pkgtype_destroy ( class(loadablepackagetype this)

Definition at line 211 of file ModelPackageInputs.f90.

212  class(LoadablePackageType) :: this
213  ! deallocate dynamic arrays
214  deallocate (this%filenames)
215  deallocate (this%pkgnames)
216  deallocate (this%inunits)
217  deallocate (this%mempaths)

◆ supported_model()

logical(lgp) function, public modelpackageinputsmodule::supported_model ( character(len=*), intent(in)  ctype)

Definition at line 111 of file ModelPackageInputs.f90.

113  character(len=*), intent(in) :: ctype
114  logical(LGP) :: supported_model
115  integer(I4B) :: n
116  supported_model = .false.
117  do n = 1, nmodel
118  if (ctype == modflow6models(n)) then
119  supported_model = .true.
120  exit
121  end if
122  end do
integer(i4b), parameter, public nmodel
Valid simulation model types.
character(len=lenpackagetype), dimension(nmodel), public modflow6models
Here is the caller graph for this function: