MODFLOW 6  version 6.6.0.dev0
USGS Modular Hydrologic Model
InputLoadType.f90
Go to the documentation of this file.
1 !> @brief This module contains the InputLoadTypeModule
2 !!
3 !! This module defines types that support generic IDM
4 !! static and dynamic input loading.
5 !!
6 !<
8 
9  use kindmodule, only: dp, i4b, lgp
12  use simvariablesmodule, only: errmsg
15  use listmodule, only: listtype
18 
19  implicit none
20  private
21  public :: staticpkgloadbasetype
22  public :: dynamicpkgloadbasetype
23  public :: modeldynamicpkgstype
26  public :: model_dynamic_pkgs
27 
28  !> @brief type representing package subpackage list
30  character(len=LENCOMPONENTNAME), dimension(:), allocatable :: pkgtypes
31  character(len=LENCOMPONENTNAME), dimension(:), allocatable :: component_types
32  character(len=LENCOMPONENTNAME), dimension(:), &
33  allocatable :: subcomponent_types
34  character(len=LINELENGTH), dimension(:), allocatable :: filenames
35  character(len=LENMEMPATH) :: mempath
36  character(len=LENCOMPONENTNAME) :: component_name
37  integer(I4B) :: pnum
38  contains
39  procedure :: create => subpkg_create
40  procedure :: add => subpkg_add
41  procedure :: destroy => subpkg_destroy
42  end type subpackagelisttype
43 
44  !> @brief Static loader type
45  !!
46  !! This type is a base concrete type for a static input loader
47  !!
48  !<
50  type(modflowinputtype) :: mf6_input !< description of modflow6 input
51  type(ncpackagevarstype), pointer :: nc_vars => null()
52  character(len=LENCOMPONENTNAME) :: component_name !< name of component
53  character(len=LINELENGTH) :: component_input_name !< component input name, e.g. model name file
54  character(len=LINELENGTH) :: input_name !< input name, e.g. package *.chd file
55  integer(I4B) :: iperblock !< index of period block on block definition list
56  type(subpackagelisttype) :: subpkg_list !< list of input subpackages
57  contains
58  procedure :: init => static_init
59  procedure :: create_subpkg_list
60  procedure :: destroy => static_destroy
61  end type staticpkgloadtype
62 
63  !> @brief Base abstract type for static input loader
64  !!
65  !! IDM sources should extend and implement this type
66  !!
67  !<
68  type, abstract, extends(staticpkgloadtype) :: staticpkgloadbasetype
69  contains
70  procedure(load_if), deferred :: load
71  end type staticpkgloadbasetype
72 
73  !> @brief Dynamic loader type
74  !!
75  !! This type is a base concrete type for a dynamic (period) input loader
76  !!
77  !<
79  type(modflowinputtype) :: mf6_input !< description of modflow6 input
80  type(ncpackagevarstype), pointer :: nc_vars => null()
81  character(len=LENCOMPONENTNAME) :: component_name !< name of component
82  character(len=LINELENGTH) :: component_input_name !< component input name, e.g. model name file
83  character(len=LINELENGTH) :: input_name !< input name, e.g. package *.chd file
84  character(len=LINELENGTH), dimension(:), allocatable :: param_names !< dynamic param tagnames
85  logical(LGP) :: readasarrays !< is this array based input
86  integer(I4B) :: iperblock !< index of period block on block definition list
87  integer(I4B) :: iout !< inunit number for logging
88  integer(I4B) :: nparam !< number of in scope params
89  contains
90  procedure :: init => dynamic_init
91  procedure :: df => dynamic_df
92  procedure :: ad => dynamic_ad
93  procedure :: destroy => dynamic_destroy
94  end type dynamicpkgloadtype
95 
96  !> @brief Base abstract type for dynamic input loader
97  !!
98  !! IDM sources should extend and implement this type
99  !!
100  !<
101  type, abstract, extends(dynamicpkgloadtype) :: dynamicpkgloadbasetype
102  contains
103  procedure(period_load_if), deferred :: rp
104  end type dynamicpkgloadbasetype
105 
106  !> @brief load interfaces for source static and dynamic types
107  !<
108  abstract interface
109  function load_if(this, iout) result(dynamic_loader)
111  class(staticpkgloadbasetype), intent(inout) :: this
112  integer(I4B), intent(in) :: iout
113  class(dynamicpkgloadbasetype), pointer :: dynamic_loader
114  end function load_if
115  subroutine period_load_if(this)
116  import dynamicpkgloadbasetype, i4b
117  class(dynamicpkgloadbasetype), intent(inout) :: this
118  end subroutine
119  end interface
120 
121  !> @brief type for storing a dynamic package load list
122  !!
123  !! This type is used to store a list of package
124  !! dynamic load types for a model
125  !!
126  !<
128  character(len=LENCOMPONENTNAME) :: modeltype !< type of model
129  character(len=LENMODELNAME) :: modelname !< name of model
130  character(len=LINELENGTH) :: modelfname !< name of model input file
131  type(listtype) :: pkglist !< model package list
132  character(len=LINELENGTH) :: nc_fname !< name of model netcdf input
133  integer(I4B) :: ncid !< netcdf file handle
134  integer(I4B) :: iout
135  contains
136  procedure :: init => dynamicpkgs_init
137  procedure :: add => dynamicpkgs_add
138  procedure :: get => dynamicpkgs_get
139  procedure :: rp => dynamicpkgs_rp
140  procedure :: df => dynamicpkgs_df
141  procedure :: ad => dynamicpkgs_ad
142  procedure :: size => dynamicpkgs_size
143  procedure :: destroy => dynamicpkgs_destroy
144  end type modeldynamicpkgstype
145 
147 
148 contains
149 
150  !> @brief create a new package type
151  !<
152  subroutine subpkg_create(this, mempath, component_name)
153  ! -- modules
154  ! -- dummy
155  class(subpackagelisttype) :: this
156  character(len=*), intent(in) :: mempath
157  character(len=*), intent(in) :: component_name
158  ! -- local
159  !
160  ! -- initialize
161  this%pnum = 0
162  this%mempath = mempath
163  this%component_name = component_name
164  !
165  ! -- allocate arrays
166  allocate (this%pkgtypes(0))
167  allocate (this%component_types(0))
168  allocate (this%subcomponent_types(0))
169  allocate (this%filenames(0))
170  end subroutine subpkg_create
171 
172  !> @brief create a new package type
173  !<
174  subroutine subpkg_add(this, pkgtype, component_type, subcomponent_type, &
175  tagname, filename)
176  ! -- modules
181  ! -- dummy
182  class(subpackagelisttype) :: this
183  character(len=*), intent(in) :: pkgtype
184  character(len=*), intent(in) :: component_type
185  character(len=*), intent(in) :: subcomponent_type
186  character(len=*), intent(in) :: tagname
187  character(len=*), intent(in) :: filename
188  ! -- local
189  character(len=LENVARNAME) :: mempath_tag
190  character(len=LENMEMPATH), pointer :: subpkg_mempath
191  character(len=LINELENGTH), pointer :: input_fname
192  integer(I4B) :: idx, trimlen
193  !
194  ! -- reallocate
195  call expandarray(this%pkgtypes)
196  call expandarray(this%component_types)
197  call expandarray(this%subcomponent_types)
198  call expandarray(this%filenames)
199  !
200  ! -- add new package instance
201  this%pnum = this%pnum + 1
202  this%pkgtypes(this%pnum) = pkgtype
203  this%component_types(this%pnum) = component_type
204  this%subcomponent_types(this%pnum) = subcomponent_type
205  this%filenames(this%pnum) = filename
206  !
207  ! -- initialize mempath tag
208  mempath_tag = tagname
209  trimlen = len_trim(tagname)
210  idx = 0
211  !
212  ! -- create mempath tagname
213  idx = index(tagname, '_')
214  if (idx > 0) then
215  if (tagname(idx + 1:trimlen) == 'FILENAME') then
216  write (mempath_tag, '(a)') tagname(1:idx)//'MEMPATH'
217  end if
218  end if
219  !
220  ! -- allocate mempath variable for subpackage
221  call mem_allocate(subpkg_mempath, lenmempath, mempath_tag, &
222  this%mempath)
223  !
224  ! -- create and set the mempath
225  subpkg_mempath = &
226  create_mem_path(this%component_name, &
227  subcomponent_type, idm_context)
228  !
229  ! -- allocate and initialize filename for subpackage
230  call mem_allocate(input_fname, linelength, 'INPUT_FNAME', subpkg_mempath)
231  input_fname = filename
232  end subroutine subpkg_add
233 
234  !> @brief create a new package type
235  !<
236  subroutine subpkg_destroy(this)
237  ! -- modules
238  ! -- dummy
239  class(subpackagelisttype) :: this
240  ! -- local
241  !
242  ! -- allocate arrays
243  deallocate (this%pkgtypes)
244  deallocate (this%component_types)
245  deallocate (this%subcomponent_types)
246  deallocate (this%filenames)
247  end subroutine subpkg_destroy
248 
249  !> @brief initialize static package loader
250  !!
251  !<
252  subroutine static_init(this, mf6_input, component_name, component_input_name, &
253  input_name)
254  class(staticpkgloadtype), intent(inout) :: this
255  type(modflowinputtype), intent(in) :: mf6_input
256  character(len=*), intent(in) :: component_name
257  character(len=*), intent(in) :: component_input_name
258  character(len=*), intent(in) :: input_name
259  integer(I4B) :: iblock
260  !
261  this%mf6_input = mf6_input
262  this%component_name = component_name
263  this%component_input_name = component_input_name
264  this%input_name = input_name
265  this%iperblock = 0
266  !
267  ! -- create subpackage list
268  call this%subpkg_list%create(this%mf6_input%mempath, &
269  this%mf6_input%component_name)
270  !
271  ! -- identify period block definition
272  do iblock = 1, size(mf6_input%block_dfns)
273  !
274  if (mf6_input%block_dfns(iblock)%blockname == 'PERIOD') then
275  this%iperblock = iblock
276  exit
277  end if
278  end do
279  !
280  return
281  end subroutine static_init
282 
283  !> @brief create the subpackage list
284  !!
285  !<
286  subroutine create_subpkg_list(this)
290  class(staticpkgloadtype), intent(inout) :: this
291  character(len=16), dimension(:), pointer :: subpkgs
292  character(len=LINELENGTH) :: tag, fname, pkgtype
293  character(len=LENFTYPE) :: c_type, sc_type
294  character(len=16) :: subpkg
295  integer(I4B) :: idx, n
296  !
297  ! -- set pointer to package (idm integrated) subpackage list
298  subpkgs => idm_subpackages(this%mf6_input%component_type, &
299  this%mf6_input%subcomponent_type)
300  !
301  ! -- check if tag matches subpackage
302  do n = 1, size(subpkgs)
303  subpkg = subpkgs(n)
304  idx = index(subpkg, '-')
305  ! -- split sp string into component/subcomponent
306  if (idx > 0) then
307  ! -- split string in component/subcomponent types
308  c_type = subpkg(1:idx - 1)
309  sc_type = subpkg(idx + 1:len_trim(subpkg))
310  !
311  if (idm_integrated(c_type, sc_type)) then
312  !
313  ! -- set pkgtype and input filename tag
314  pkgtype = trim(sc_type)//'6'
315  tag = trim(pkgtype)//'_FILENAME'
316  !
317  ! -- support single instance of each subpackage
318  if (idm_multi_package(c_type, sc_type)) then
319  errmsg = 'Multi-instance subpackages not supported. Remove dfn &
320  &subpackage tagline for package "'//trim(subpkg)//'".'
321  call store_error(errmsg)
322  call store_error_filename(this%input_name)
323  else
324  if (filein_fname(fname, tag, this%mf6_input%mempath, &
325  this%input_name)) then
326  call this%subpkg_list%add(pkgtype, c_type, sc_type, &
327  trim(tag), trim(fname))
328  end if
329  end if
330  else
331  errmsg = 'Identified subpackage is not IDM integrated. Remove dfn &
332  &subpackage tagline for package "'//trim(subpkg)//'".'
333  call store_error(errmsg)
334  call store_error_filename(this%input_name)
335  end if
336  end if
337  end do
338  end subroutine create_subpkg_list
339 
340  subroutine static_destroy(this)
341  class(staticpkgloadtype), intent(inout) :: this
342  !
343  call this%subpkg_list%destroy()
344  !
345  if (associated(this%nc_vars)) then
346  call this%nc_vars%destroy()
347  deallocate (this%nc_vars)
348  nullify (this%nc_vars)
349  end if
350  !
351  return
352  end subroutine static_destroy
353 
354  !> @brief initialize dynamic package loader
355  !!
356  !! Any managed memory pointed to from model/package context
357  !! must be allocated when dynamic loader is initialized.
358  !!
359  !<
360  subroutine dynamic_init(this, mf6_input, component_name, component_input_name, &
361  input_name, iperblock, iout)
362  use simvariablesmodule, only: errmsg
364  ! -- dummy
365  class(dynamicpkgloadtype), intent(inout) :: this
366  type(modflowinputtype), intent(in) :: mf6_input
367  character(len=*), intent(in) :: component_name
368  character(len=*), intent(in) :: component_input_name
369  character(len=*), intent(in) :: input_name
370  integer(I4B), intent(in) :: iperblock
371  integer(I4B), intent(in) :: iout
372  type(inputparamdefinitiontype), pointer :: idt
373  !
374  this%mf6_input = mf6_input
375  this%component_name = component_name
376  this%component_input_name = component_input_name
377  this%input_name = input_name
378  this%iperblock = iperblock
379  this%nparam = 0
380  this%iout = iout
381  nullify (idt)
382  !
383  ! -- throw error and exit if not found
384  if (this%iperblock == 0) then
385  write (errmsg, '(a,a)') &
386  'Programming error. (IDM) PERIOD block not found in '&
387  &'dynamic package input block dfns: ', &
388  trim(mf6_input%subcomponent_name)
389  call store_error(errmsg)
390  call store_error_filename(this%input_name)
391  end if
392  !
393  ! -- set readasarrays
394  this%readasarrays = (.not. mf6_input%block_dfns(iperblock)%aggregate)
395  end subroutine dynamic_init
396 
397  !> @brief dynamic package loader define
398  !!
399  !<
400  subroutine dynamic_df(this)
401  class(dynamicpkgloadtype), intent(inout) :: this
402  !
403  ! override in derived type
404  !
405  return
406  end subroutine dynamic_df
407 
408  !> @brief dynamic package loader advance
409  !!
410  !<
411  subroutine dynamic_ad(this)
412  class(dynamicpkgloadtype), intent(inout) :: this
413  !
414  ! override in derived type
415  !
416  return
417  end subroutine dynamic_ad
418 
419  !> @brief dynamic package loader destroy
420  !!
421  !<
422  subroutine dynamic_destroy(this)
426  class(dynamicpkgloadtype), intent(inout) :: this
427  !
428  ! -- clean up netcdf variables structure
429  if (associated(this%nc_vars)) then
430  call this%nc_vars%destroy()
431  deallocate (this%nc_vars)
432  nullify (this%nc_vars)
433  end if
434  !
435  ! -- deallocate package static and dynamic input context
436  call memorystore_remove(this%mf6_input%component_name, &
437  this%mf6_input%subcomponent_name, &
438  idm_context)
439  !
440  return
441  end subroutine dynamic_destroy
442 
443  !> @brief model dynamic packages init
444  !!
445  !<
446  subroutine dynamicpkgs_init(this, modeltype, modelname, modelfname, nc_fname, &
447  ncid, iout)
448  class(modeldynamicpkgstype), intent(inout) :: this
449  character(len=*), intent(in) :: modeltype
450  character(len=*), intent(in) :: modelname
451  character(len=*), intent(in) :: modelfname
452  character(len=*), intent(in) :: nc_fname
453  integer(I4B), intent(in) :: ncid
454  integer(I4B), intent(in) :: iout
455  !
456  this%modeltype = modeltype
457  this%modelname = modelname
458  this%modelfname = modelfname
459  this%nc_fname = nc_fname
460  this%ncid = ncid
461  this%iout = iout
462  !
463  return
464  end subroutine dynamicpkgs_init
465 
466  !> @brief add package to model dynamic packages list
467  !!
468  !<
469  subroutine dynamicpkgs_add(this, dynamic_pkg)
470  class(modeldynamicpkgstype), intent(inout) :: this
471  class(dynamicpkgloadbasetype), pointer, intent(inout) :: dynamic_pkg
472  class(*), pointer :: obj
473  !
474  obj => dynamic_pkg
475  call this%pkglist%add(obj)
476  !
477  return
478  end subroutine dynamicpkgs_add
479 
480  !> @brief retrieve package from model dynamic packages list
481  !!
482  !<
483  function dynamicpkgs_get(this, idx) result(res)
484  class(modeldynamicpkgstype), intent(inout) :: this
485  integer(I4B), intent(in) :: idx
486  class(dynamicpkgloadbasetype), pointer :: res
487  class(*), pointer :: obj
488  !
489  nullify (res)
490  obj => this%pkglist%GetItem(idx)
491  !
492  if (associated(obj)) then
493  select type (obj)
494  class is (dynamicpkgloadbasetype)
495  res => obj
496  end select
497  end if
498  !
499  return
500  end function dynamicpkgs_get
501 
502  !> @brief read and prepare model dynamic packages
503  !!
504  !<
505  subroutine dynamicpkgs_rp(this)
507  class(modeldynamicpkgstype), intent(inout) :: this
508  class(dynamicpkgloadbasetype), pointer :: dynamic_pkg
509  integer(I4B) :: n
510  !
511  call idm_log_period_header(this%modelname, this%iout)
512  !
513  do n = 1, this%pkglist%Count()
514  dynamic_pkg => this%get(n)
515  call dynamic_pkg%rp()
516  end do
517  !
518  call idm_log_period_close(this%iout)
519  !
520  return
521  end subroutine dynamicpkgs_rp
522 
523  !> @brief define model dynamic packages
524  !!
525  !<
526  subroutine dynamicpkgs_df(this)
527  class(modeldynamicpkgstype), intent(inout) :: this
528  class(dynamicpkgloadbasetype), pointer :: dynamic_pkg
529  integer(I4B) :: n
530  !
531  do n = 1, this%pkglist%Count()
532  dynamic_pkg => this%get(n)
533  call dynamic_pkg%df()
534  end do
535  !
536  return
537  end subroutine dynamicpkgs_df
538 
539  !> @brief advance model dynamic packages
540  !!
541  !<
542  subroutine dynamicpkgs_ad(this)
543  class(modeldynamicpkgstype), intent(inout) :: this
544  class(dynamicpkgloadbasetype), pointer :: dynamic_pkg
545  integer(I4B) :: n
546  !
547  do n = 1, this%pkglist%Count()
548  dynamic_pkg => this%get(n)
549  call dynamic_pkg%ad()
550  end do
551  !
552  return
553  end subroutine dynamicpkgs_ad
554 
555  !> @brief get size of model dynamic packages list
556  !!
557  !<
558  function dynamicpkgs_size(this) result(size)
559  class(modeldynamicpkgstype), intent(inout) :: this
560  integer(I4B) :: size
561  !
562  size = this%pkglist%Count()
563  !
564  return
565  end function dynamicpkgs_size
566 
567  !> @brief destroy model dynamic packages object
568  !!
569  !<
570  subroutine dynamicpkgs_destroy(this)
571  class(modeldynamicpkgstype), intent(inout) :: this
572  class(dynamicpkgloadbasetype), pointer :: dynamic_pkg
573  integer(I4B) :: n
574  !
575  ! -- destroy dynamic loaders
576  do n = 1, this%pkglist%Count()
577  dynamic_pkg => this%get(n)
578  call dynamic_pkg%destroy()
579  deallocate (dynamic_pkg)
580  nullify (dynamic_pkg)
581  end do
582  !
583  call this%pkglist%Clear()
584  !
585  return
586  end subroutine dynamicpkgs_destroy
587 
588  !> @brief add model dynamic packages object to list
589  !!
590  !<
591  subroutine adddynamicmodeltolist(list, model_dynamic)
592  ! -- dummy variables
593  type(listtype), intent(inout) :: list !< package list
594  class(modeldynamicpkgstype), pointer, intent(inout) :: model_dynamic
595  ! -- local variables
596  class(*), pointer :: obj
597  !
598  obj => model_dynamic
599  call list%Add(obj)
600  end subroutine adddynamicmodeltolist
601 
602  !> @brief get model dynamic packages object from list
603  !!
604  !<
605  function getdynamicmodelfromlist(list, idx) result(res)
606  ! -- dummy variables
607  type(listtype), intent(inout) :: list !< spd list
608  integer(I4B), intent(in) :: idx !< package number
609  class(modeldynamicpkgstype), pointer :: res
610  ! -- local variables
611  class(*), pointer :: obj
612  !
613  ! -- initialize res
614  nullify (res)
615  !
616  ! -- get the object from the list
617  obj => list%GetItem(idx)
618  if (associated(obj)) then
619  select type (obj)
620  class is (modeldynamicpkgstype)
621  res => obj
622  end select
623  end if
624  end function getdynamicmodelfromlist
625 
626 end module inputloadtypemodule
subroutine init()
Definition: GridSorting.f90:24
load interfaces for source static and dynamic types
This module contains simulation constants.
Definition: Constants.f90:9
integer(i4b), parameter linelength
maximum length of a standard line
Definition: Constants.f90:45
integer(i4b), parameter lencomponentname
maximum length of a component name
Definition: Constants.f90:18
integer(i4b), parameter lenmodelname
maximum length of the model name
Definition: Constants.f90:22
integer(i4b), parameter lenvarname
maximum length of a variable name
Definition: Constants.f90:17
integer(i4b), parameter lenftype
maximum length of a package type (DIS, WEL, OC, etc.)
Definition: Constants.f90:39
integer(i4b), parameter lenmempath
maximum length of the memory path
Definition: Constants.f90:27
logical function, public idm_integrated(component, subcomponent)
logical function, public idm_multi_package(component, subcomponent)
character(len=16) function, dimension(:), pointer, public idm_subpackages(component, subcomponent)
This module contains the Input Data Model Logger Module.
Definition: IdmLogger.f90:7
subroutine, public idm_log_period_header(component, iout)
@ brief log a dynamic header message
Definition: IdmLogger.f90:69
subroutine, public idm_log_period_close(iout)
@ brief log the period closing message
Definition: IdmLogger.f90:82
This module contains the InputDefinitionModule.
This module contains the InputLoadTypeModule.
subroutine dynamic_ad(this)
dynamic package loader advance
subroutine static_init(this, mf6_input, component_name, component_input_name, input_name)
initialize static package loader
subroutine subpkg_destroy(this)
create a new package type
subroutine dynamicpkgs_init(this, modeltype, modelname, modelfname, nc_fname, ncid, iout)
model dynamic packages init
class(modeldynamicpkgstype) function, pointer, public getdynamicmodelfromlist(list, idx)
get model dynamic packages object from list
subroutine create_subpkg_list(this)
create the subpackage list
integer(i4b) function dynamicpkgs_size(this)
get size of model dynamic packages list
subroutine dynamic_init(this, mf6_input, component_name, component_input_name, input_name, iperblock, iout)
initialize dynamic package loader
subroutine, public adddynamicmodeltolist(list, model_dynamic)
add model dynamic packages object to list
subroutine dynamicpkgs_add(this, dynamic_pkg)
add package to model dynamic packages list
subroutine dynamicpkgs_rp(this)
read and prepare model dynamic packages
subroutine subpkg_create(this, mempath, component_name)
create a new package type
subroutine static_destroy(this)
subroutine subpkg_add(this, pkgtype, component_type, subcomponent_type, tagname, filename)
create a new package type
subroutine dynamicpkgs_destroy(this)
destroy model dynamic packages object
class(dynamicpkgloadbasetype) function, pointer dynamicpkgs_get(this, idx)
retrieve package from model dynamic packages list
subroutine dynamicpkgs_ad(this)
advance model dynamic packages
subroutine dynamic_destroy(this)
dynamic package loader destroy
type(listtype), public model_dynamic_pkgs
subroutine dynamic_df(this)
dynamic package loader define
subroutine dynamicpkgs_df(this)
define model dynamic packages
This module defines variable data types.
Definition: kind.f90:8
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
subroutine, public memorystore_remove(component, subcomponent, context)
This module contains the ModflowInputModule.
Definition: ModflowInput.f90:9
This module contains the NCFileVarsModule.
Definition: NCFileVars.f90:7
This module contains simulation methods.
Definition: Sim.f90:10
subroutine, public store_error(msg, terminate)
Store an error message.
Definition: Sim.f90:92
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
Definition: Sim.f90:203
This module contains simulation variables.
Definition: SimVariables.f90:9
character(len=maxcharlen) errmsg
error message string
character(len=linelength) idm_context
This module contains the SourceCommonModule.
Definition: SourceCommon.f90:7
logical(lgp) function, public filein_fname(filename, tagname, input_mempath, input_fname)
enforce and set a single input filename provided via FILEIN keyword
Base abstract type for dynamic input loader.
type for storing a dynamic package load list
Base abstract type for static input loader.
type representing package subpackage list
A generic heterogeneous doubly-linked list.
Definition: List.f90:14
derived type for storing input definition for a file
Type describing input variables for a package in NetCDF file.
Definition: NCFileVars.f90:22