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 49 of file MemoryHelper.f90.

50  character(len=*), intent(in) :: mem_path !< path to the memory object
51  character(len=*), intent(in) :: var_name !< name of the stored variable
52  character(len=LENMEMADDRESS) :: mem_address !< full address string to the memory object
53 
54  call mem_check_length(mem_path, lenmempath, "memory path")
55  call mem_check_length(var_name, lenvarname, "variable")
56 
57  mem_address = trim(mem_path)//mempathseparator//trim(var_name)
58 
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  call mem_check_length(subcomponent, lencomponentname, "package")
29  call mem_check_length(context, lencontextname, "context")
30 
31  memory_path = trim(component)
32 
33  if (present(subcomponent)) then
34  memory_path = trim(memory_path)//mempathseparator//trim(subcomponent)
35  end if
36 
37  if (present(context)) then
38  memory_path = trim(context)//mempathseparator//trim(memory_path)
39  end if
40 
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 139 of file MemoryHelper.f90.

140  character(len=*), intent(in) :: mem_path !< path to the memory object
141  character(len=LENMEMPATH) :: res !< memory path context
142  ! local
143  integer(I4B) :: idx
144 
145  ! initialize the memory path context
146  res = ' '
147 
148  if (mem_path(1:2) == '__') then
149  idx = index(mem_path, mempathseparator)
150  if (idx > 0) then
151  res = mem_path(:idx)
152  end if
153  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 191 of file MemoryHelper.f90.

192  character(len=*), intent(in) :: name !< string to be checked
193  integer(I4B), intent(in) :: max_length !< maximum length
194  character(len=*), intent(in) :: description !< a descriptive string
195 
196  if (len(trim(name)) > max_length) then
197  write (errmsg, '(*(G0))') &
198  'Fatal error in Memory Manager, length of ', description, ' must be ', &
199  max_length, ' characters or less: ', name, '(len=', len(trim(name)), ')'
200 
201  ! -- store error and stop program execution
202  call store_error(errmsg, terminate=.true.)
203  end if
204 
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 63 of file MemoryHelper.f90.

64  character(len=*), intent(in) :: mem_address !< the full memory address string
65  character(len=LENMEMPATH), intent(out) :: mem_path !< the memory path
66  character(len=LENVARNAME), intent(out) :: var_name !< the variable name
67  logical(LGP), intent(out) :: success !< true when successful
68  ! local
69  integer(I4B) :: idx
70 
71  idx = index(mem_address, mempathseparator, back=.true.)
72 
73  ! if no separator, or it's at the end of the string,
74  ! the memory address is not valid:
75  if (idx < 1 .or. idx == len(mem_address)) then
76  success = .false.
77  mem_path = ''
78  var_name = ''
79  else
80  success = .true.
81  mem_path = mem_address(:idx - 1)
82  var_name = mem_address(idx + 1:)
83  end if
84 
85  ! remove context specifier if prepended to mempath
86  !if (success) then
87  ! idx = index(mem_path, memPathSeparator, back=.true.)
88  ! if (idx > 0 .and. mem_path(1:2) == '__') then
89  ! mem_path = mem_path(idx + 1:)
90  ! end if
91  !end if
92 
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 100 of file MemoryHelper.f90.

101  character(len=*), intent(in) :: mem_path !< path to the memory object
102  character(len=LENCOMPONENTNAME), intent(out) :: component !< name of the component (solution, model, exchange)
103  character(len=LENCOMPONENTNAME), intent(out) :: subcomponent !< name of the subcomponent (package)
104  ! local
105  character(len=LENMEMPATH) :: local_mem_path
106  integer(I4B) :: idx
107 
108  call strip_context_mem_path(mem_path, local_mem_path)
109 
110  idx = index(local_mem_path, mempathseparator, back=.true.)
111  ! if the separator is found at the end of the string,
112  ! the path is invalid:
113  if (idx == len_trim(local_mem_path)) then
114  write (errmsg, '(*(G0))') &
115  'Fatal error in Memory Manager, cannot split invalid memory path: ', &
116  mem_path
117 
118  ! -- store error and stop program execution
119  call store_error(errmsg, terminate=.true.)
120  end if
121 
122  if (idx > 0) then
123  ! when found:
124  component = local_mem_path(:idx - 1)
125  subcomponent = local_mem_path(idx + 1:)
126  else
127  ! when not found, there apparently is no subcomponent:
128  component = local_mem_path(:lencomponentname)
129  subcomponent = ''
130  end if
131 
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 161 of file MemoryHelper.f90.

162  character(len=*), intent(in) :: mem_path !< path to the memory object
163  character(len=LENMEMPATH), intent(inout) :: mem_path_no_context !< path to the memory object without the context
164  ! local
165  integer(I4B) :: idx
166  character(len=LENMEMPATH) :: context
167 
168  ! initialize the local mem_path
169  mem_path_no_context = mem_path
170 
171  context = get_mem_path_context(mem_path)
172 
173  if (len_trim(context) > 0) then
174  idx = len_trim(context)
175  mem_path_no_context = mem_path(idx + 1:)
176  end if
177 
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