MODFLOW 6  version 6.6.0.dev0
USGS Modular Hydrologic Model
ModflowInput.f90
Go to the documentation of this file.
1 !> @brief This module contains the ModflowInputModule
2 !!
3 !! This module contains a helper object and function
4 !! for accessing the ModflowInput, which is a
5 !! description of the structure of a modflow input
6 !! file.
7 !!
8 !<
10 
11  use kindmodule, only: i4b, lgp
21 
22  implicit none
23  private
25 
26  !> @brief derived type for storing input definition for a file
27  !!
28  !! This derived type contains the information needed to read
29  !! a specific modflow input file, including block definitions,
30  !! aggregate definitions (structarrays), and individual
31  !! parameter definitions.
32  !!
33  !<
35  character(len=LENCOMPONENTNAME) :: pkgtype
36  character(len=LENCOMPONENTNAME) :: component_type
37  character(len=LENCOMPONENTNAME) :: subcomponent_type
38  character(len=LENCOMPONENTNAME) :: component_name
39  character(len=LENCOMPONENTNAME) :: subcomponent_name
40  character(len=LENMEMPATH) :: mempath
41  character(len=LENMEMPATH) :: component_mempath
42  type(inputblockdefinitiontype), dimension(:), pointer :: block_dfns
43  type(inputparamdefinitiontype), dimension(:), pointer :: aggregate_dfns
44  type(inputparamdefinitiontype), dimension(:), pointer :: param_dfns
45  end type modflowinputtype
46 
47 contains
48 
49  !> @brief function to return ModflowInputType
50  !<
51  function getmodflowinput(pkgtype, component_type, subcomponent_type, &
52  component_name, subcomponent_name, filename) &
53  result(mf6_input)
54  character(len=*), intent(in) :: pkgtype !< package type to load, such as DIS6, DISV6, NPF6
55  character(len=*), intent(in) :: component_type !< component type, such as GWF or GWT
56  character(len=*), intent(in) :: subcomponent_type !< subcomponent type, such as DIS or NPF
57  character(len=*), intent(in) :: component_name !< component name, such as MYGWFMODEL
58  character(len=*), intent(in) :: subcomponent_name !< subcomponent name, such as MYWELLPACKAGE
59  character(len=*), optional, intent(in) :: filename !< optional name of package input file
60  type(modflowinputtype) :: mf6_input
61  character(len=LENPACKAGETYPE) :: dfn_subcomponent_type
62 
63  ! -- set subcomponent type
64  if (present(filename)) then
65  dfn_subcomponent_type = update_sc_type(pkgtype, filename, component_type, &
66  subcomponent_type)
67  else
68  dfn_subcomponent_type = trim(subcomponent_type)
69  end if
70 
71  ! -- set input attributes
72  mf6_input%pkgtype = trim(pkgtype)
73  mf6_input%component_type = trim(component_type)
74  mf6_input%subcomponent_type = trim(dfn_subcomponent_type)
75  mf6_input%component_name = trim(component_name)
76  mf6_input%subcomponent_name = trim(subcomponent_name)
77 
78  ! -- set mempaths
79  mf6_input%mempath = create_mem_path(component_name, subcomponent_name, &
81  mf6_input%component_mempath = create_mem_path(component=component_name, &
82  context=idm_context)
83 
84  ! -- set input definitions
85  mf6_input%block_dfns => block_definitions(mf6_input%component_type, &
86  mf6_input%subcomponent_type)
87  mf6_input%aggregate_dfns => aggregate_definitions(mf6_input%component_type, &
88  mf6_input%subcomponent_type)
89  mf6_input%param_dfns => param_definitions(mf6_input%component_type, &
90  mf6_input%subcomponent_type)
91  end function getmodflowinput
92 
93  function update_sc_type(filetype, filename, component_type, subcomponent_type) &
94  result(sc_type)
95  character(len=*), intent(in) :: component_type
96  character(len=*), intent(in) :: subcomponent_type
97  character(len=*), intent(in) :: filetype
98  character(len=*), intent(in) :: filename
99  ! -- result
100  character(len=LENPACKAGETYPE) :: sc_type
101  !
102  sc_type = subcomponent_type
103  !
104  select case (subcomponent_type)
105  case ('RCH', 'EVT', 'SCP')
106  sc_type = read_as_arrays(filetype, filename, component_type, &
107  subcomponent_type)
108  case default
109  end select
110  end function update_sc_type
111 
112  function read_as_arrays(filetype, filename, component_type, subcomponent_type) &
113  result(sc_type)
114  use constantsmodule, only: linelength
117  character(len=*), intent(in) :: component_type
118  character(len=*), intent(in) :: subcomponent_type
119  character(len=*), intent(in) :: filetype
120  character(len=*), intent(in) :: filename
121  ! -- result
122  character(len=LENPACKAGETYPE) :: sc_type
123  type(blockparsertype) :: parser
124  integer(I4B) :: ierr, inunit
125  logical(LGP) :: isfound
126  logical(LGP) :: endofblock
127  character(len=LINELENGTH) :: keyword
128  !
129  sc_type = subcomponent_type
130  !
131  inunit = getunit()
132  !
133  call openfile(inunit, 0, trim(adjustl(filename)), filetype, &
134  'FORMATTED', 'SEQUENTIAL', 'OLD')
135  !
136  call parser%Initialize(inunit, 0)
137  !
138  ! -- get options block
139  call parser%GetBlock('OPTIONS', isfound, ierr, &
140  supportopenclose=.true., blockrequired=.false.)
141  !
142  ! -- parse options block if detected
143  if (isfound) then
144  do
145  call parser%GetNextLine(endofblock)
146  !
147  if (endofblock) exit
148  !
149  call parser%GetStringCaps(keyword)
150  !
151  if (keyword == 'READASARRAYS') then
152  write (sc_type, '(a)') trim(subcomponent_type)//'A'
153  exit
154  end if
155  end do
156  end if
157  !
158  call parser%clear()
159  end function read_as_arrays
160 
161 end module modflowinputmodule
This module contains block parser methods.
Definition: BlockParser.f90:7
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 lenpackagetype
maximum length of a package type (DIS6, SFR6, CSUB6, etc.)
Definition: Constants.f90:38
integer(i4b), parameter lenmempath
maximum length of the memory path
Definition: Constants.f90:27
type(inputblockdefinitiontype) function, dimension(:), pointer, public block_definitions(component, subcomponent)
type(inputparamdefinitiontype) function, dimension(:), pointer, public param_definitions(component, subcomponent)
type(inputparamdefinitiontype) function, dimension(:), pointer, public aggregate_definitions(component, subcomponent)
This module contains the InputDefinitionModule.
integer(i4b) function, public getunit()
Get a free unit number.
subroutine, public openfile(iu, iout, fname, ftype, fmtarg_opt, accarg_opt, filstat_opt, mode_opt)
Open a file.
Definition: InputOutput.f90:30
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
This module contains the ModflowInputModule.
Definition: ModflowInput.f90:9
character(len=lenpackagetype) function update_sc_type(filetype, filename, component_type, subcomponent_type)
type(modflowinputtype) function, public getmodflowinput(pkgtype, component_type, subcomponent_type, component_name, subcomponent_name, filename)
function to return ModflowInputType
character(len=lenpackagetype) function read_as_arrays(filetype, filename, component_type, subcomponent_type)
This module contains simulation variables.
Definition: SimVariables.f90:9
character(len=linelength) idm_context
derived type for storing input definition for a file