Abstracts over BoutReals and Field2D/3D/Perps Provides some helper functions for writing function signatures and passing data
| 75 | |
| 76 | |
| 77 | class Field(object): |
| 78 | """Abstracts over BoutReals and Field2D/3D/Perps |
| 79 | |
| 80 | Provides some helper functions for writing function signatures and |
| 81 | passing data |
| 82 | |
| 83 | """ |
| 84 | |
| 85 | def __init__( |
| 86 | self, |
| 87 | field_type, |
| 88 | dimensions, |
| 89 | name=None, |
| 90 | index_var=None, |
| 91 | jz_var="jz", |
| 92 | mixed_base_ind_var="base_ind", |
| 93 | ): |
| 94 | # C++ type of the field, e.g. Field3D |
| 95 | self.field_type = field_type |
| 96 | # array: dimensions of the field |
| 97 | self.dimensions = dimensions |
| 98 | # name of this field |
| 99 | self.name = name |
| 100 | # Name of the indexing variable |
| 101 | self.index_var = index_var |
| 102 | # Name of jz variable |
| 103 | self.jz_var = jz_var |
| 104 | self.mixed_base_ind_var = mixed_base_ind_var |
| 105 | # Note region_type isn't actually used currently but |
| 106 | # may be useful in future. |
| 107 | if self.field_type == "Field3D": |
| 108 | self.region_type = "3D" |
| 109 | elif self.field_type == "Field2D": |
| 110 | self.region_type = "2D" |
| 111 | else: |
| 112 | self.region_type = "_INVALID_" |
| 113 | |
| 114 | @property |
| 115 | def passByReference(self): |
| 116 | """Returns "Type& name", except if field_type is BoutReal, |
| 117 | in which case just returns "Type name" |
| 118 | |
| 119 | """ |
| 120 | return "{self.field_type}{ref} {self.name}".format( |
| 121 | self=self, ref="&" if self.field_type != "BoutReal" else "" |
| 122 | ) |
| 123 | |
| 124 | @property |
| 125 | def index(self): |
| 126 | """Returns "[{index_var}]", except if field_type is BoutReal, |
| 127 | in which case just returns "" |
| 128 | |
| 129 | """ |
| 130 | if self.field_type == "BoutReal": |
| 131 | return "{self.name}".format(self=self) |
| 132 | else: |
| 133 | return "{self.name}[{self.index_var}]".format(self=self) |
| 134 |