def __init__(self, mesh: MeshInstance, element_type: MeshElementType, entry_expr: impl.Expr): self.mesh = mesh self.element_type = element_type self.entry_expr = entry_expr element_field = self.mesh.fields[self.element_type] for key, attr in element_field.field_dict.items(): global_entry_expr = impl.Expr( _ti_core.get_index_conversion( self.mesh.mesh_ptr, element_type, entry_expr, ConvType.l2r if element_field.attr_dict[key].reorder else ConvType.l2g)) # transform index space global_entry_expr_group = impl.make_expr_group( *tuple([global_entry_expr])) if isinstance(attr, MatrixField): setattr( self, key, _IntermediateMatrix(attr.n, attr.m, [ impl.Expr( _ti_core.subscript(e.ptr, global_entry_expr_group)) for e in attr.get_field_members() ])) elif isinstance(attr, StructField): raise RuntimeError('ti.Mesh has not support StructField yet') else: # isinstance(attr, Field) var = attr.get_field_members()[0].ptr setattr( self, key, impl.Expr(_ti_core.subscript(var, global_entry_expr_group))) for element_type in self.mesh._type.elements: setattr(self, element_type_name(element_type), impl.mesh_relation_access(self.mesh, self, element_type))
def subscript(self, *indices): assert len(indices) == 1 entry_expr = self.mesh.get_relation_access(self.from_index, self.to_element_type, impl.Expr(indices[0]).ptr) entry_expr.type_check(impl.get_runtime().prog.config) return MeshElementFieldProxy(self.mesh, self.to_element_type, entry_expr)
def subscript(self, *indices): assert (len(indices) == 1) entry_expr = _ti_core.get_relation_access(self.mesh.mesh_ptr, self.from_index.ptr, self.to_element_type, impl.Expr(indices[0]).ptr) entry_expr.type_check() return MeshElementFieldProxy(self.mesh, self.to_element_type, entry_expr)
def size(self): return impl.Expr( _ti_core.get_relation_size(self.mesh.mesh_ptr, self.from_index.ptr, self.to_element_type))
def id(self): # return the global non-reordered index l2g_expr = impl.Expr( _ti_core.get_index_conversion(self.mesh.mesh_ptr, self.element_type, self.entry_expr, ConvType.l2g)) return l2g_expr
def size(self): return impl.Expr( self.mesh.get_relation_size(self.from_index, self.to_element_type))