Reference Guide  2.5.0
psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata Class Reference

Classes

class  FieldArg
 
class  GridArg
 
class  ScalarArg
 

Public Member Functions

def __init__ (self, iterates_over=None, index_offset=None, meta_args=None, procedure_name=None, name=None)
 
def lower_to_psyir (self)
 
def fortran_string (self)
 
def name (self)
 
def name (self, value)
 
def iterates_over (self)
 
def iterates_over (self, value)
 
def index_offset (self)
 
def index_offset (self, value)
 
def meta_args (self)
 
def procedure_name (self)
 
def procedure_name (self, value)
 

Static Public Member Functions

def create_from_psyir (symbol)
 
def create_from_fortran_string (fortran_string)
 

Public Attributes

 iterates_over
 
 index_offset
 
 procedure_name
 
 name
 

Detailed Description

Contains GOcean kernel metadata. This class supports kernel
metadata creation, modification, loading from a fortran string,
writing to a fortran string, raising from existing language-level
PSyIR and lowering to language-level psyir.

:param iterates_over: the name of the quantity that this kernel is \
    intended to iterate over.
:type iterates_over: Optional[str]
:param index_offset: the name of the quantity that specifies the \
    index offset (how different field indices relate to each \
    other).
:type index_offset: Optional[str]
:param meta_args: a list of 'meta_arg' objects which capture the \
    metadata values of the kernel arguments.
:type meta_args: Optional[List[:py:class:`GridArg` | :py:class:`FieldArg` \
    | :py:class:`ScalarArg`]]
:param procedure_name: the name of the kernel procedure to call.
:type procedure_name: Optional[str]
:param name: the name of the symbol to use for the metadata in \
    language-level PSyIR.
:type name: Optional[str]

Definition at line 133 of file psyir.py.

Member Function Documentation

◆ create_from_fortran_string()

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.create_from_fortran_string (   fortran_string)
static
Create a new instance of GOceanKernelMetadata populated with
metadata stored in a fortran string.

:param str fortran_string: the metadata stored as Fortran.

:returns: an instance of GOceanKernelMetadata.
:rtype: :py:class:`psyclone.domain.gocean.kernel.psyir.\
    GOceanKernelMetadata`

:raises ValueError: if the string does not contain a fortran \
    derived type.
:raises ParseError: if the metadata has an unexpected format.

Definition at line 237 of file psyir.py.

237  def create_from_fortran_string(fortran_string):
238  '''Create a new instance of GOceanKernelMetadata populated with
239  metadata stored in a fortran string.
240 
241  :param str fortran_string: the metadata stored as Fortran.
242 
243  :returns: an instance of GOceanKernelMetadata.
244  :rtype: :py:class:`psyclone.domain.gocean.kernel.psyir.\
245  GOceanKernelMetadata`
246 
247  :raises ValueError: if the string does not contain a fortran \
248  derived type.
249  :raises ParseError: if the metadata has an unexpected format.
250 
251  '''
252  kernel_metadata = GOceanKernelMetadata()
253 
254  # Ensure the Fortran2003 parser is initialised.
255  _ = ParserFactory().create(std="f2003")
256  reader = FortranStringReader(fortran_string)
257  try:
258  spec_part = Fortran2003.Derived_Type_Def(reader)
259  except Fortran2003.NoMatchError:
260  # pylint: disable=raise-missing-from
261  raise ValueError(
262  f"Expected kernel metadata to be a Fortran derived type, but "
263  f"found '{fortran_string}'.")
264 
265  kernel_metadata.name = spec_part.children[0].children[1].tostr()
266 
267  const = GOceanConstants()
268  # Extract and store the required 'iterates_over',
269  # 'index_offset' and 'code' properties from the parse tree
270 
271  # the value of iterates over (go_all_pts, ...)
272  value = GOceanKernelMetadata._get_property(
273  spec_part, "iterates_over").string
274  kernel_metadata.iterates_over = value
275 
276  # the value of index offset (NE, ...)
277  value = GOceanKernelMetadata._get_property(
278  spec_part, "index_offset").string
279  kernel_metadata.index_offset = value
280 
281  # the name of the procedure that this metadata refers to.
282  kernel_metadata.procedure_name = GOceanKernelMetadata._get_property(
283  spec_part, "code").string
284 
285  # meta_args contains arguments which have
286  # properties. Therefore create appropriate (GridArg, ScalarArg
287  # or FieldArg) instances to capture this information.
288  meta_args = GOceanKernelMetadata._get_property(
289  spec_part, "meta_args")
290  args = walk(meta_args, Fortran2003.Ac_Value_List)
291  if not args:
292  raise ParseError(
293  f"meta_args should be a list, but found "
294  f"'{str(meta_args)}' in '{spec_part}'.")
295 
296  for meta_arg in args[0].children:
297  if len(meta_arg.children[1].children) == 2:
298  # Grid args have 2 arguments
299  kernel_metadata.meta_args.append(
300  GOceanKernelMetadata.GridArg(meta_arg, kernel_metadata))
301  elif len(meta_arg.children[1].children) == 3:
302  # scalar and field args have 3 arguments
303  arg2 = meta_arg.children[1].children[1].string.lower()
304  if arg2 in const.VALID_FIELD_GRID_TYPES:
305  kernel_metadata.meta_args.append(
306  GOceanKernelMetadata.FieldArg(
307  meta_arg, kernel_metadata))
308  elif arg2 in const.VALID_SCALAR_TYPES:
309  kernel_metadata.meta_args.append(
310  GOceanKernelMetadata.ScalarArg(
311  meta_arg, kernel_metadata))
312  else:
313  raise ParseError(
314  f"Expected a 'meta_arg' entry with 3 arguments to "
315  f"either be a field or a scalar, but found '{arg2}' "
316  f"as the second argument instead of "
317  f"'{const.VALID_FIELD_GRID_TYPES}' (fields) or "
318  f"'{const.VALID_SCALAR_TYPES}' (scalars).")
319  else:
320  raise ParseError(
321  f"'meta_args' should have either 2 or 3 arguments, but "
322  f"found {len(meta_arg.children[1].children)} in "
323  f"{str(meta_arg)}.")
324 
325  return kernel_metadata
326 

◆ create_from_psyir()

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.create_from_psyir (   symbol)
static
Create a new instance of GOceanKernelMetadata populated with
metadata from a kernel in language-level PSyIR.

:param symbol: the symbol in which the metadata is stored \
    in language-level PSyIR.
:type symbol: :py:class:`psyclone.psyir.symbols.DataTypeSymbol`

:returns: an instance of GOceanKernelMetadata.
:rtype: :py:class:`psyclone.domain.gocean.kernel.psyir.\
    GOceanKernelMetadata`

:raises TypeError: if the symbol argument is not the expected \
    type.
:raises InternalError: if the datatype of the provided symbol \
    is not the expected type.

Definition at line 200 of file psyir.py.

200  def create_from_psyir(symbol):
201  '''Create a new instance of GOceanKernelMetadata populated with
202  metadata from a kernel in language-level PSyIR.
203 
204  :param symbol: the symbol in which the metadata is stored \
205  in language-level PSyIR.
206  :type symbol: :py:class:`psyclone.psyir.symbols.DataTypeSymbol`
207 
208  :returns: an instance of GOceanKernelMetadata.
209  :rtype: :py:class:`psyclone.domain.gocean.kernel.psyir.\
210  GOceanKernelMetadata`
211 
212  :raises TypeError: if the symbol argument is not the expected \
213  type.
214  :raises InternalError: if the datatype of the provided symbol \
215  is not the expected type.
216 
217  '''
218  if not isinstance(symbol, DataTypeSymbol):
219  raise TypeError(
220  f"Expected a DataTypeSymbol but found a "
221  f"{type(symbol).__name__}.")
222 
223  datatype = symbol.datatype
224 
225  if not isinstance(datatype, UnsupportedFortranType):
226  raise InternalError(
227  f"Expected kernel metadata to be stored in the PSyIR as "
228  f"an UnsupportedFortranType, but found "
229  f"{type(datatype).__name__}.")
230 
231  # In an UnsupportedFortranType, the declaration is stored as a
232  # string, so use create_from_fortran_string()
233  return GOceanKernelMetadata.create_from_fortran_string(
234  datatype.declaration)
235 

◆ fortran_string()

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.fortran_string (   self)
:returns: the metadata represented by this instance as Fortran.
:rtype: str

Definition at line 402 of file psyir.py.

402  def fortran_string(self):
403  '''
404  :returns: the metadata represented by this instance as Fortran.
405  :rtype: str
406  '''
407  go_args = []
408  for go_arg in self.meta_args:
409  go_args.append(go_arg.fortran_string())
410  go_args_str = ", &\n".join(go_args)
411  result = (
412  f"TYPE, EXTENDS(kernel_type) :: {self.name}\n"
413  f" TYPE(go_arg), DIMENSION({len(self.meta_args)}) :: "
414  f"meta_args = (/ &\n{go_args_str}/)\n"
415  f" INTEGER :: ITERATES_OVER = {self.iterates_over}\n"
416  f" INTEGER :: INDEX_OFFSET = {self.index_offset}\n"
417  f" CONTAINS\n"
418  f" PROCEDURE, NOPASS :: code => {self.procedure_name}\n"
419  f"END TYPE {self.name}\n")
420  return result
421 

References psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.meta_args(), and psyclone.domain.lfric.kernel.lfric_kernel_metadata.LFRicKernelMetadata.meta_args().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ index_offset() [1/2]

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.index_offset (   self)
:returns: the name of the quantity that specifies the index \
    offset (how different field indices relate to each other).
:rtype: str

Definition at line 495 of file psyir.py.

495  def index_offset(self):
496  '''
497  :returns: the name of the quantity that specifies the index \
498  offset (how different field indices relate to each other).
499  :rtype: str
500  '''
501  return self._index_offset
502 

References psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._index_offset, psyclone.gocean1p0.GOKern._index_offset, and psyclone.gocean1p0.GOKernelType1p0._index_offset.

Here is the caller graph for this function:

◆ index_offset() [2/2]

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.index_offset (   self,
  value 
)
:param str value: set the index_offset metadata to the \
  specified value.

Definition at line 504 of file psyir.py.

504  def index_offset(self, value):
505  '''
506  :param str value: set the index_offset metadata to the \
507  specified value.
508  '''
509  self._validate_index_offset(value)
510  self._index_offset = value
511 

References psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._index_offset, psyclone.gocean1p0.GOKern._index_offset, psyclone.gocean1p0.GOKernelType1p0._index_offset, and psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._validate_index_offset().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ iterates_over() [1/2]

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.iterates_over (   self)
:returns: the name of the quantity that this kernel is intended to \
    iterate over.
:rtype: str

Definition at line 461 of file psyir.py.

461  def iterates_over(self):
462  '''
463  :returns: the name of the quantity that this kernel is intended to \
464  iterate over.
465  :rtype: str
466  '''
467  return self._iterates_over
468 

References psyclone.domain.common.psylayer.psyloop.PSyLoop._iterates_over, psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._iterates_over, psyclone.parse.kernel.KernelType._iterates_over, and psyclone.psyGen.Kern._iterates_over.

Here is the caller graph for this function:

◆ iterates_over() [2/2]

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.iterates_over (   self,
  value 
)
:param str value: set the iterates_over metadata to the \
    specified value.

Definition at line 470 of file psyir.py.

470  def iterates_over(self, value):
471  '''
472  :param str value: set the iterates_over metadata to the \
473  specified value.
474  '''
475  self._validate_iterates_over(value)
476  self._iterates_over = value
477 

References psyclone.domain.common.psylayer.psyloop.PSyLoop._iterates_over, psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._iterates_over, psyclone.parse.kernel.KernelType._iterates_over, psyclone.psyGen.Kern._iterates_over, and psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._validate_iterates_over().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ lower_to_psyir()

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.lower_to_psyir (   self)
 Lower the metadata to language-level PSyIR.

:returns: metadata as stored in language-level PSyIR.
:rtype: :py:class:`psyclone.psyir.symbols.DataTypeSymbol`

Definition at line 189 of file psyir.py.

189  def lower_to_psyir(self):
190  ''' Lower the metadata to language-level PSyIR.
191 
192  :returns: metadata as stored in language-level PSyIR.
193  :rtype: :py:class:`psyclone.psyir.symbols.DataTypeSymbol`
194 
195  '''
196  return DataTypeSymbol(
197  str(self.name), UnsupportedFortranType(self.fortran_string()))
198 

References psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.fortran_string(), psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.GridArg.fortran_string(), psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.FieldArg.fortran_string(), psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.ScalarArg.fortran_string(), psyclone.domain.lfric.kernel.evaluator_targets_metadata.EvaluatorTargetsMetadata.fortran_string(), psyclone.domain.lfric.kernel.field_arg_metadata.FieldArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.field_vector_arg_metadata.FieldVectorArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.inter_grid_arg_metadata.InterGridArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.inter_grid_vector_arg_metadata.InterGridVectorArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.lfric_kernel_metadata.LFRicKernelMetadata.fortran_string(), psyclone.domain.lfric.kernel.meta_args_metadata.MetaArgsMetadata.fortran_string(), psyclone.domain.lfric.kernel.meta_funcs_arg_metadata.MetaFuncsArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.meta_funcs_metadata.MetaFuncsMetadata.fortran_string(), psyclone.domain.lfric.kernel.meta_mesh_arg_metadata.MetaMeshArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.meta_mesh_metadata.MetaMeshMetadata.fortran_string(), psyclone.domain.lfric.kernel.meta_ref_element_arg_metadata.MetaRefElementArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.meta_ref_element_metadata.MetaRefElementMetadata.fortran_string(), psyclone.domain.lfric.kernel.operates_on_metadata.OperatesOnMetadata.fortran_string(), psyclone.domain.lfric.kernel.operator_arg_metadata.OperatorArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.scalar_arg_metadata.ScalarArgMetadata.fortran_string(), psyclone.domain.lfric.kernel.shapes_metadata.ShapesMetadata.fortran_string(), psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.name, psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.GridArg.name, psyclone.domain.gocean.transformations.gocean_const_loop_bounds_trans.GOConstLoopBoundsTrans.name(), psyclone.domain.gocean.transformations.gocean_move_iteration_boundaries_inside_kernel_trans.GOMoveIterationBoundariesInsideKernelTrans.name(), psyclone.domain.gocean.transformations.gocean_opencl_trans.GOOpenCLTrans.name(), psyclone.domain.lfric.kernel.lfric_kernel_metadata.LFRicKernelMetadata.name, psyclone.domain.nemo.transformations.create_nemo_invoke_schedule_trans.CreateNemoInvokeScheduleTrans.name(), psyclone.domain.nemo.transformations.create_nemo_psy_trans.CreateNemoPSyTrans.name(), psyclone.domain.nemo.transformations.nemo_allarrayrange2loop_trans.NemoAllArrayRange2LoopTrans.name(), psyclone.domain.nemo.transformations.nemo_arrayrange2loop_trans.NemoArrayRange2LoopTrans.name(), psyclone.domain.nemo.transformations.nemo_outerarrayrange2loop_trans.NemoOuterArrayRange2LoopTrans.name(), psyclone.dynamo0p3.DynamoPSy.name(), psyclone.expression.FunctionVar.name, psyclone.expression.NamedArg.name(), psyclone.gocean1p0.GOKernelGridArgument.name(), psyclone.gocean1p0.GOStencil.name(), psyclone.parse.algorithm.FileInfo.name(), psyclone.parse.algorithm.InvokeCall.name(), psyclone.parse.kernel.KernelProcedure.name(), psyclone.parse.kernel.KernelType.name(), psyclone.parse.module_info.ModuleInfo.name(), psyclone.psyad.transformations.assignment_trans.AssignmentTrans.name(), psyclone.psyGen.PSy.name(), psyclone.psyGen.Invoke.name(), psyclone.psyGen.Kern.name(), psyclone.psyGen.CodedKern.name, psyclone.psyGen.Argument.name(), psyclone.psyGen.Transformation.name(), psyclone.psyGen.DummyTransformation.name(), psyclone.psyir.nodes.container.Container.name, psyclone.psyir.nodes.member.Member.name, psyclone.psyir.nodes.reference.Reference.name(), psyclone.psyir.nodes.routine.Routine.name, psyclone.psyir.symbols.symbol.Symbol.name(), psyclone.psyir.transformations.allarrayaccess2loop_trans.AllArrayAccess2LoopTrans.name(), psyclone.psyir.transformations.arrayrange2loop_trans.ArrayRange2LoopTrans.name(), psyclone.psyir.transformations.fold_conditional_return_expressions_trans.FoldConditionalReturnExpressionsTrans.name(), psyclone.psyir.transformations.loop_trans.LoopTrans.name(), psyclone.psyir.transformations.omp_task_trans.OMPTaskTrans.name(), psyclone.psyir.transformations.psy_data_trans.PSyDataTrans.name(), psyclone.transformations.OMPSingleTrans.name(), psyclone.transformations.OMPMasterTrans.name(), psyclone.transformations.OMPParallelTrans.name(), psyclone.transformations.MoveTrans.name(), psyclone.transformations.Dynamo0p3AsyncHaloExchangeTrans.name(), psyclone.transformations.Dynamo0p3KernelConstTrans.name(), psyclone.transformations.ACCEnterDataTrans.name(), psyclone.transformations.ACCRoutineTrans.name(), psyclone.transformations.ACCKernelsTrans.name(), psyclone.transformations.ACCDataTrans.name(), and psyclone.transformations.KernelImportsToArguments.name().

Here is the call graph for this function:

◆ meta_args()

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.meta_args (   self)
:returns: a list of 'meta_arg' objects which capture the \
    metadata values of the kernel arguments.
:rtype: List[:py:class:`psyclone.psyir.common.kernel.\
    KernelMetadataSymbol.KernelMetadataArg`]

Definition at line 513 of file psyir.py.

513  def meta_args(self):
514  '''
515  :returns: a list of 'meta_arg' objects which capture the \
516  metadata values of the kernel arguments.
517  :rtype: List[:py:class:`psyclone.psyir.common.kernel.\
518  KernelMetadataSymbol.KernelMetadataArg`]
519  '''
520  return self._meta_args
521 

References psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._meta_args, and psyclone.domain.lfric.kernel.lfric_kernel_metadata.LFRicKernelMetadata._meta_args.

Here is the caller graph for this function:

◆ name() [1/2]

◆ name() [2/2]

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.name (   self,
  value 
)
:param str value: set the name of the symbol that will contain \
    the metadata when lowering.

:raises ValueError: if the name is not valid.

Definition at line 449 of file psyir.py.

449  def name(self, value):
450  '''
451  :param str value: set the name of the symbol that will contain \
452  the metadata when lowering.
453 
454  :raises ValueError: if the name is not valid.
455 
456  '''
457  FortranReader.validate_name(value)
458  self._name = value
459 

References psyclone.domain.common.algorithm.psyir.AlgorithmInvokeCall._name, psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._name, psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.GridArg._name, psyclone.domain.lfric.kernel.lfric_kernel_metadata.LFRicKernelMetadata._name, psyclone.dynamo0p3.DynFuncDescriptor03._name, psyclone.expression.NamedArg._name, psyclone.gocean1p0.GOKernelGridArgument._name, psyclone.gocean1p0.GOStencil._name, psyclone.nemo.NemoInvoke._name, psyclone.nemo.NemoPSy._name, psyclone.parse.algorithm.FileInfo._name, psyclone.parse.algorithm.InvokeCall._name, psyclone.parse.kernel.KernelProcedure._name, psyclone.parse.kernel.KernelType._name, psyclone.parse.module_info.ModuleInfo._name, psyclone.psyGen.PSy._name, psyclone.psyGen.Invoke._name, psyclone.psyGen.Kern._name, psyclone.psyGen.Argument._name, psyclone.psyir.nodes.container.Container._name, psyclone.psyir.nodes.routine.Routine._name, and psyclone.psyir.symbols.symbol.Symbol._name.

Here is the caller graph for this function:

◆ procedure_name() [1/2]

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.procedure_name (   self)
:returns: the kernel procedure name specified by the metadata.
:rtype: str

Definition at line 523 of file psyir.py.

523  def procedure_name(self):
524  '''
525  :returns: the kernel procedure name specified by the metadata.
526  :rtype: str
527  '''
528  return self._procedure_name
529 

References psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._procedure_name, and psyclone.domain.lfric.kernel.lfric_kernel_metadata.LFRicKernelMetadata._procedure_name.

Here is the caller graph for this function:

◆ procedure_name() [2/2]

def psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata.procedure_name (   self,
  value 
)
:param str value: set the procedure name specified in the
    metadata to the specified value.

:raises ValueError: if the supplied procedure name is invalid.

Definition at line 531 of file psyir.py.

531  def procedure_name(self, value):
532  '''
533  :param str value: set the procedure name specified in the
534  metadata to the specified value.
535 
536  :raises ValueError: if the supplied procedure name is invalid.
537 
538  '''
539  try:
540  FortranReader.validate_name(value)
541  except (TypeError, ValueError) as err:
542  raise ValueError(
543  f"Expected procedure_name to be a valid value but found "
544  f"'{value}'.") from err
545  self._procedure_name = value
546 

References psyclone.domain.gocean.kernel.psyir.GOceanKernelMetadata._procedure_name, and psyclone.domain.lfric.kernel.lfric_kernel_metadata.LFRicKernelMetadata._procedure_name.

Here is the caller graph for this function:

The documentation for this class was generated from the following file: