@@ -118,17 +118,29 @@ def __init__(self, fields, args, var):
118118
119119
120120class SummedVectorFieldNode (IntrinsicNode ):
121+ def __getattr__ (self , attr ):
122+ if attr == "eval" :
123+ return SummedVectorFieldEvalCallNode (self )
124+
121125 def __getitem__ (self , attr ):
122126 return SummedVectorFieldEvalNode (self .obj , attr )
123127
124128
129+ class SummedVectorFieldEvalCallNode (IntrinsicNode ):
130+ def __init__ (self , field ):
131+ self .field = field
132+ self .obj = field .obj
133+ self .ccode = ""
134+
135+
125136class SummedVectorFieldEvalNode (IntrinsicNode ):
126- def __init__ (self , fields , args , var , var2 , var3 ):
137+ def __init__ (self , fields , args , var , var2 , var3 , convert = True ):
127138 self .fields = fields
128139 self .args = args
129140 self .var = var # the variable in which the interpolated field is written
130141 self .var2 = var2 # second variable for UV interpolation
131142 self .var3 = var3 # third variable for UVW interpolation
143+ self .convert = convert # whether to convert the result (like field.applyConversion)
132144
133145
134146class NestedFieldNode (IntrinsicNode ):
@@ -446,6 +458,28 @@ def visit_Call(self, node):
446458 return ast .Tuple ([ast .Name (id = tmp1 ), ast .Name (id = tmp2 ), ast .Name (id = tmp3 )], ast .Load ())
447459 else :
448460 return ast .Tuple ([ast .Name (id = tmp1 ), ast .Name (id = tmp2 )], ast .Load ())
461+
462+ elif isinstance (node .func , SummedVectorFieldEvalCallNode ):
463+ # get a temporary value to assign result to
464+ tmp = [self .get_tmp () for _ in range (len (node .func .obj ))]
465+ tmp2 = [self .get_tmp () for _ in range (len (node .func .obj ))]
466+ tmp3 = [self .get_tmp () if list .__getitem__ (node .func .obj , 0 ).vector_type == '3D' else None for _ in range (len (node .func .obj ))]
467+ # whether to convert
468+ convert = True
469+ if "applyConversion" in node .keywords :
470+ k = node .keywords ["applyConversion" ]
471+ if isinstance (k , ast .NameConstant ):
472+ convert = k .value
473+
474+ # convert args to Index(Tuple(*args))
475+ args = ast .Index (value = ast .Tuple (node .args , ast .Load ()))
476+
477+ self .stmt_stack += [SummedVectorFieldEvalNode (node .func .field , args , tmp , tmp2 , tmp3 , convert )]
478+ if all (tmp3 ):
479+ return ast .Tuple ([ast .Name (id = '+' .join (tmp )), ast .Name (id = '+' .join (tmp2 )), ast .Name (id = '+' .join (tmp3 ))], ast .Load ())
480+ else :
481+ return ast .Tuple ([ast .Name (id = '+' .join (tmp )), ast .Name (id = '+' .join (tmp2 ))], ast .Load ())
482+
449483 return node
450484
451485
@@ -975,14 +1009,14 @@ def visit_SummedVectorFieldEvalNode(self, node):
9751009 for fld , var , var2 , var3 in zip (node .fields .obj , node .var , node .var2 , node .var3 ):
9761010 ccode_eval = fld .ccode_eval_array (var , var2 , var3 ,
9771011 fld .U , fld .V , fld .W , * args )
978- if fld .U .interp_method != 'cgrid_velocity' :
1012+ if node . convert and fld .U .interp_method != 'cgrid_velocity' :
9791013 ccode_conv1 = fld .U .ccode_convert (* args )
9801014 ccode_conv2 = fld .V .ccode_convert (* args )
9811015 statements = [c .Statement ("%s *= %s" % (var , ccode_conv1 )),
9821016 c .Statement ("%s *= %s" % (var2 , ccode_conv2 ))]
9831017 else :
9841018 statements = []
985- if fld .vector_type == '3D' :
1019+ if node . convert and fld .vector_type == '3D' :
9861020 ccode_conv3 = fld .W .ccode_convert (* args )
9871021 statements .append (c .Statement ("%s *= %s" % (var3 , ccode_conv3 )))
9881022 cstat += [c .Assign ("err" , ccode_eval ), c .Block (statements )]
@@ -1125,14 +1159,14 @@ def visit_SummedVectorFieldEvalNode(self, node):
11251159 args = self ._check_FieldSamplingArguments (node .args .ccode )
11261160 for fld , var , var2 , var3 in zip (node .fields .obj , node .var , node .var2 , node .var3 ):
11271161 ccode_eval = fld .ccode_eval_object (var , var2 , var3 , fld .U , fld .V , fld .W , * args )
1128- if fld .U .interp_method != 'cgrid_velocity' :
1162+ if node . convert and fld .U .interp_method != 'cgrid_velocity' :
11291163 ccode_conv1 = fld .U .ccode_convert (* args )
11301164 ccode_conv2 = fld .V .ccode_convert (* args )
11311165 statements = [c .Statement ("%s *= %s" % (var , ccode_conv1 )),
11321166 c .Statement ("%s *= %s" % (var2 , ccode_conv2 ))]
11331167 else :
11341168 statements = []
1135- if fld .vector_type == '3D' :
1169+ if node . convert and fld .vector_type == '3D' :
11361170 ccode_conv3 = fld .W .ccode_convert (* args )
11371171 statements .append (c .Statement ("%s *= %s" % (var3 , ccode_conv3 )))
11381172 cstat += [c .Assign ("err" , ccode_eval ), c .Block (statements )]
0 commit comments