36 '''Module containing the MetaArgsMetadata class which captures
37 the values for the LFRic kernel meta_args metadata.
40 from fparser.two
import Fortran2003
41 from fparser.two.utils
import walk
44 ColumnwiseOperatorArgMetadata
48 CommonDeclarationMetadata
51 FieldVectorArgMetadata
55 InterGridVectorArgMetadata
63 '''Class to capture the values of the LFRic kernel
64 meta_args metadata. This class supports the creation,
65 modification and Fortran output of this metadata.
67 meta_args metadata specifies information about data that the
68 kernel code expects to be passed to it via its argument list.
70 :param meta_args_args: a list of meta_args arguments.
71 :type meta_args_args: List[:py:class:`psyclone.domain.lfric.kernel.\
72 CommonMetaArgMetadata`]
75 def __init__(self, meta_args_args):
81 :returns: the meta_args metadata as Fortran.
89 '''Create an instance of MetaArgsMetadata from an fparser2
92 :param fparser2_tree: fparser2 tree capturing the meta \
94 :type fparser2_tree: :py:class:`fparser.two.Fortran2003.\
95 Data_Component_Def_Stmt`
97 :returns: an instance of MetaArgsMetadata.
98 :rtype: :py:class:`psyclone.domain.lfric.kernel.\
101 :raises ParseError: if an unknown MetaArgsArgMetadata argument \
105 MetaArgsMetadata.get_derived_array_declaration(
106 fparser2_tree,
"ARG_TYPE",
"META_ARGS")
107 args = walk(fparser2_tree, Fortran2003.Ac_Value_List)
109 for meta_arg
in args[0].children:
110 form = meta_arg.children[1].children[0].tostr()
112 if form ==
"gh_scalar":
113 arg = ScalarArgMetadata.create_from_fparser2(meta_arg)
114 elif form ==
"gh_operator":
115 arg = OperatorArgMetadata.create_from_fparser2(meta_arg)
116 elif form ==
"gh_columnwise_operator":
117 arg = ColumnwiseOperatorArgMetadata.create_from_fparser2(
119 elif "gh_field" in form:
120 vector_arg =
"*" in form
121 nargs = len(meta_arg.children[1].children)
122 intergrid_arg =
False
124 fifth_arg = meta_arg.children[1].children[4]
126 fifth_arg.children
and
127 fifth_arg.children[0].string.lower() ==
"mesh_arg")
129 if intergrid_arg
and vector_arg:
130 arg = InterGridVectorArgMetadata.create_from_fparser2(
132 elif intergrid_arg
and not vector_arg:
133 arg = InterGridArgMetadata.create_from_fparser2(meta_arg)
134 elif vector_arg
and not intergrid_arg:
135 arg = FieldVectorArgMetadata.create_from_fparser2(meta_arg)
137 arg = FieldArgMetadata.create_from_fparser2(meta_arg)
140 f
"Expected a 'meta_arg' entry to be a "
141 f
"field, a scalar or an operator, but found "
143 meta_args_args.append(arg)
147 def meta_args_args(self):
149 :returns: a list of meta args argument objects.
150 :rtype: List[:py:class:`psyclone.domain.lfric.kernel.\
155 @meta_args_args.setter
156 def meta_args_args(self, values):
158 :param values: set the meta_args metadata to the \
159 supplied list of values.
160 :type values: List[:py:class:`psyclone.domain.lfric.kernel.\
164 self.
validate_listvalidate_list(values, CommonMetaArgMetadata)
170 __all__ = [
"MetaArgsMetadata"]
def type_declaration_string(datatype, name, values)
def validate_list(cls, values, expected_type)
def meta_args_args(self, values)
def create_from_fparser2(fparser2_tree)