File gen_fieldops.py#

module gen_fieldops#
Code-generator for arithmetic operators on Field2Ds/Field3Ds

This uses the jinja template in gen_fieldops.jinja to generate code
for the arithmetic operators, and prints to stdout.

The `Field` class provides some helper functions for determining how to
pass a variable by reference or pointer, and how to name arguments in
function signatures. This allows us to push some logic into the
templates themselves.

Functions

smart_open(filename, mode='r')#
Open stdin or stdout using a contextmanager

From: http://stackoverflow.com/a/29824059/2043465
returnType(f1, f2)#
Determine a suitable return type, by seeing which field is 'larger'.

Variables

operators = OrderedDict([("*", "multiplication"),("/", "division"),("+", "addition"),("-", "subtraction"),])#
header = """// This file is autogenerated - see gen_fieldops.py#include <bout/field2d.hxx>#include <bout/field3d.hxx>#include <bout/globals.hxx>#include <bout/interpolation.hxx>#include <bout/mesh.hxx>#include <bout/region.hxx>"""#
parser = argparse.ArgumentParser(description="Generate code for theFieldarithmetic operators")#
default#
help#
action#
dest#
args = parser.parse_args()#
index_var = "index"#
jz_var = "jz"#
mixed_base_ind_var = "base_ind"#
region_name = '"RGN_ALL"'#
region_loop = "BOUT_FOR_SERIAL"#
field3D = Field("Field3D",["x", "y", "z"],index_var=index_var,jz_var=jz_var,mixed_base_ind_var=mixed_base_ind_var,)#
field2D = Field("Field2D",["x", "y"],index_var=index_var,jz_var=jz_var,mixed_base_ind_var=mixed_base_ind_var,)#
fieldPerp = Field("FieldPerp",["x", "z"],index_var=index_var,jz_var=jz_var,mixed_base_ind_var=mixed_base_ind_var,)#
boutreal = Field("BoutReal",[],index_var=index_var,jz_var=jz_var,mixed_base_ind_var=mixed_base_ind_var,)#
fields = [field3D, field2D, fieldPerp, boutreal]#
env = jinja2.Environment(loader=jinja2.FileSystemLoader("."), trim_blocks=True)#
template = env.get_template("gen_fieldops.jinja")#
rhs = copy(rhs)#
lhs = copy(lhs)#
out = returnType(rhs, lhs)#
name#
template_args = {"operator": operator,"operator_name": operator_name,#"out": out,"lhs": lhs,"rhs": rhs,#"region_loop": region_loop,"region_name": region_name,#"index_var": index_var,"mixed_base_ind": mixed_base_ind_var,"jz_var": jz_var,}#
Field : public object
Abstracts over BoutReals and Field2D/3D/Perps

Provides some helper functions for writing function signatures and
passing data

Public Functions

__init__(self, field_type, dimensions, name=None, index_var=None, jz_var='jz', mixed_base_ind_var='base_ind')#
passByReference(self)#
Returns "Type& name", except if field_type is BoutReal,
in which case just returns "Type name"
index(self)#
Returns "[{index_var}]", except if field_type is BoutReal,
in which case just returns ""
mixed_index(self)#
Returns "[{index_var} + {jz_var}]" if field_type is Field3D,
self.index if Field2D or just returns "" for BoutReal
base_index(self)#
Returns "[{mixed_base_ind_var}]" if field_type is Field3D, Field2D or FieldPerp
or just returns "" for BoutReal
__eq__(self, other)#
__ne__(self, other)#
__repr__(self)#
__str__(self)#

Public Members

field_type#
dimensions#
name#
index_var#
jz_var#
mixed_base_ind_var#
region_type#