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

Functions/Subroutines

character(len=lenmempath) function create_mem_path (component, subcomponent, context)
 returns the path to the memory object More...
 
character(len=lenmemaddress) function create_mem_address (mem_path, var_name)
 returns the address string of the memory object More...
 
subroutine split_mem_address (mem_address, mem_path, var_name, success)
 Split a memory address string into memory path and variable name. More...
 
subroutine split_mem_path (mem_path, component, subcomponent)
 Split the memory path into component(s) More...
 
character(len=lenmempath) function get_mem_path_context (mem_path)
 Return the context from the memory path. More...
 
subroutine strip_context_mem_path (mem_path, mem_path_no_context)
 Remove the context from the memory path. More...
 
subroutine mem_check_length (name, max_length, description)
 Generic routine to check the length of (parts of) the memory address. More...
 

Variables

character(len=lenmemseparator), parameter mempathseparator = '/'
 used to build up the memory address for the stored variables More...
 

Function/Subroutine Documentation

◆ create_mem_address()

character(len=lenmemaddress) function memoryhelpermodule::create_mem_address ( character(len=*), intent(in)  mem_path,
character(len=*), intent(in)  var_name 
)

Returns the memory address, i.e. the full path plus name of the stored variable

NB: no need to trim the input parameters

Parameters
[in]mem_pathpath to the memory object
[in]var_namename of the stored variable
Returns
full address string to the memory object

Definition at line 55 of file MemoryHelper.f90.

56  character(len=*), intent(in) :: mem_path !< path to the memory object
57  character(len=*), intent(in) :: var_name !< name of the stored variable
58  character(len=LENMEMADDRESS) :: mem_address !< full address string to the memory object
59 
60  call mem_check_length(mem_path, lenmempath, "memory path")
61  call mem_check_length(var_name, lenvarname, "variable")
62 
63  mem_address = trim(mem_path)//mempathseparator//trim(var_name)
64 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_mem_path()

character(len=lenmempath) function memoryhelpermodule::create_mem_path ( character(len=*), intent(in)  component,
character(len=*), intent(in), optional  subcomponent,
character(len=*), intent(in), optional  context 
)

Returns the path to the location in the memory manager where the variables for this (sub)component are stored, the 'memoryPath'

NB: no need to trim the input parameters

Parameters
[in]componentname of the solution, model, or exchange
[in]subcomponentname of the package (optional)
[in]contextname of the context (optional)
Returns
the memory path

Definition at line 21 of file MemoryHelper.f90.

22  character(len=*), intent(in) :: component !< name of the solution, model, or exchange
23  character(len=*), intent(in), optional :: subcomponent !< name of the package (optional)
24  character(len=*), intent(in), optional :: context !< name of the context (optional)
25  character(len=LENMEMPATH) :: memory_path !< the memory path
26 
27  call mem_check_length(component, lencomponentname, "solution/model/exchange")
28 
29  if (present(subcomponent)) then
30  call mem_check_length(subcomponent, lencomponentname, "package")
31  end if
32 
33  if (present(context)) then
34  call mem_check_length(context, lencontextname, "context")
35  end if
36 
37  memory_path = trim(component)
38 
39  if (present(subcomponent)) then
40  memory_path = trim(memory_path)//mempathseparator//trim(subcomponent)
41  end if
42 
43  if (present(context)) then
44  memory_path = trim(context)//mempathseparator//trim(memory_path)
45  end if
46 
Here is the call graph for this function:

◆ get_mem_path_context()

character(len=lenmempath) function memoryhelpermodule::get_mem_path_context ( character(len=*), intent(in)  mem_path)

NB: when there is no context in the memory path, a empty character string is returned.

Parameters
[in]mem_pathpath to the memory object
Returns
memory path context

Definition at line 145 of file MemoryHelper.f90.

146  character(len=*), intent(in) :: mem_path !< path to the memory object
147  character(len=LENMEMPATH) :: res !< memory path context
148  ! local
149  integer(I4B) :: idx
150 
151  ! initialize the memory path context
152  res = ' '
153 
154  if (mem_path(1:2) == '__') then
155  idx = index(mem_path, mempathseparator)
156  if (idx > 0) then
157  res = mem_path(:idx)
158  end if
159  end if
Here is the caller graph for this function:

◆ mem_check_length()

subroutine memoryhelpermodule::mem_check_length ( character(len=*), intent(in)  name,
integer(i4b), intent(in)  max_length,
character(len=*), intent(in)  description 
)

The string will be trimmed before the measurement.

Warning
{if the length exceeds the maximum, a message is recorded and the program will be stopped}

The description should describe the part of the address that is checked (variable, package, model, solution, exchange name) or the full memory path itself

Parameters
[in]namestring to be checked
[in]max_lengthmaximum length
[in]descriptiona descriptive string

Definition at line 197 of file MemoryHelper.f90.

198  character(len=*), intent(in) :: name !< string to be checked
199  integer(I4B), intent(in) :: max_length !< maximum length
200  character(len=*), intent(in) :: description !< a descriptive string
201 
202  if (len(trim(name)) > max_length) then
203  write (errmsg, '(*(G0))') &
204  'Fatal error in Memory Manager, length of ', description, ' must be ', &
205  max_length, ' characters or less: ', name, '(len=', len(trim(name)), ')'
206 
207  ! -- store error and stop program execution
208  call store_error(errmsg, terminate=.true.)
209  end if
210 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ split_mem_address()

subroutine memoryhelpermodule::split_mem_address ( character(len=*), intent(in)  mem_address,
character(len=lenmempath), intent(out)  mem_path,
character(len=lenvarname), intent(out)  var_name,
logical(lgp), intent(out)  success 
)
Parameters
[in]mem_addressthe full memory address string
[out]mem_paththe memory path
[out]var_namethe variable name
[out]successtrue when successful

Definition at line 69 of file MemoryHelper.f90.

70  character(len=*), intent(in) :: mem_address !< the full memory address string
71  character(len=LENMEMPATH), intent(out) :: mem_path !< the memory path
72  character(len=LENVARNAME), intent(out) :: var_name !< the variable name
73  logical(LGP), intent(out) :: success !< true when successful
74  ! local
75  integer(I4B) :: idx
76 
77  idx = index(mem_address, mempathseparator, back=.true.)
78 
79  ! if no separator, or it's at the end of the string,
80  ! the memory address is not valid:
81  if (idx < 1 .or. idx == len(mem_address)) then
82  success = .false.
83  mem_path = ''
84  var_name = ''
85  else
86  success = .true.
87  mem_path = mem_address(:idx - 1)
88  var_name = mem_address(idx + 1:)
89  end if
90 
91  ! remove context specifier if prepended to mempath
92  !if (success) then
93  ! idx = index(mem_path, memPathSeparator, back=.true.)
94  ! if (idx > 0 .and. mem_path(1:2) == '__') then
95  ! mem_path = mem_path(idx + 1:)
96  ! end if
97  !end if
98 
Here is the caller graph for this function:

◆ split_mem_path()

subroutine memoryhelpermodule::split_mem_path ( character(len=*), intent(in)  mem_path,
character(len=lencomponentname), intent(out)  component,
character(len=lencomponentname), intent(out)  subcomponent 
)

NB: when there is no subcomponent in the path, the value for

subcomponent is set to an empty string.
Parameters
[in]mem_pathpath to the memory object
[out]componentname of the component (solution, model, exchange)
[out]subcomponentname of the subcomponent (package)

Definition at line 106 of file MemoryHelper.f90.

107  character(len=*), intent(in) :: mem_path !< path to the memory object
108  character(len=LENCOMPONENTNAME), intent(out) :: component !< name of the component (solution, model, exchange)
109  character(len=LENCOMPONENTNAME), intent(out) :: subcomponent !< name of the subcomponent (package)
110  ! local
111  character(len=LENMEMPATH) :: local_mem_path
112  integer(I4B) :: idx
113 
114  call strip_context_mem_path(mem_path, local_mem_path)
115 
116  idx = index(local_mem_path, mempathseparator, back=.true.)
117  ! if the separator is found at the end of the string,
118  ! the path is invalid:
119  if (idx == len_trim(local_mem_path)) then
120  write (errmsg, '(*(G0))') &
121  'Fatal error in Memory Manager, cannot split invalid memory path: ', &
122  mem_path
123 
124  ! -- store error and stop program execution
125  call store_error(errmsg, terminate=.true.)
126  end if
127 
128  if (idx > 0) then
129  ! when found:
130  component = local_mem_path(:idx - 1)
131  subcomponent = local_mem_path(idx + 1:)
132  else
133  ! when not found, there apparently is no subcomponent:
134  component = local_mem_path(:lencomponentname)
135  subcomponent = ''
136  end if
137 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ strip_context_mem_path()

subroutine memoryhelpermodule::strip_context_mem_path ( character(len=*), intent(in)  mem_path,
character(len=lenmempath), intent(inout)  mem_path_no_context 
)

NB: when there is no context in the memory path, the original memory path is returned.

Parameters
[in]mem_pathpath to the memory object
[in,out]mem_path_no_contextpath to the memory object without the context

Definition at line 167 of file MemoryHelper.f90.

168  character(len=*), intent(in) :: mem_path !< path to the memory object
169  character(len=LENMEMPATH), intent(inout) :: mem_path_no_context !< path to the memory object without the context
170  ! local
171  integer(I4B) :: idx
172  character(len=LENMEMPATH) :: context
173 
174  ! initialize the local mem_path
175  mem_path_no_context = mem_path
176 
177  context = get_mem_path_context(mem_path)
178 
179  if (len_trim(context) > 0) then
180  idx = len_trim(context)
181  mem_path_no_context = mem_path(idx + 1:)
182  end if
183 
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ mempathseparator

character(len=lenmemseparator), parameter memoryhelpermodule::mempathseparator = '/'

Definition at line 10 of file MemoryHelper.f90.

10  character(len=LENMEMSEPARATOR), parameter :: memPathSeparator = '/' !< used to build up the memory address for the stored variables