def _add_subview(self, scope, name): var = scope._var_meta[name] name2collapsed = scope.name2collapsed sz = var['size'] if sz > 0 and not var.get('noflat'): idx = var['flat_idx'] base = self._info[name2collapsed[var['basevar']]] sub_idx = offset_flat_index(idx, base.start) substart = get_flat_index_start(sub_idx) self._info[name] = ViewInfo(base.view, substart, to_slice(idx), len(to_indices(idx, base.view)), True) if self.array[sub_idx].size != sz: raise RuntimeError("size mismatch: in system %s, view for %s is %s, idx=%s, size=%d" % (system.name, name, list(self.bounds(name)), sub_idx,self.array[sub_idx].size))
def dump(self, system, srcvec, destvec, nest=0, stream=sys.stdout): if not self.scatter_conns: return stream.write(" "*nest) stream.write("Scatters for %s:\n" % system.name) stream.write(" "*nest) stream.write("scatter vars: %s\n" % sorted(self.scatter_conns)) stream.write(" "*nest) stream.write("%s --> %s\n" % (self.var_idxs, self.input_idxs)) stream.write(" "*nest) stream.write("local array = %s\n" % srcvec.array) var_idxs = to_indices(self.var_idxs, zeros(numpy.sum(system.local_var_sizes))) input_idxs = self.input_idxs stream.write(" "*nest) stream.write("%s --> %s\n" % (var_idxs, input_idxs)) if MPI and system.app_ordering: var_idx_set = system.app_ordering.app2petsc(var_idxs) stream.write(" "*nest) stream.write("(petsc): %s --> %s\n" % (var_idx_set, input_idxs)) if self.noflat_vars: stream.write(" "*nest) stream.write("no-flats: %s\n" % self.noflat_vars)
def _is_var_idx(self, info, idx): if isinstance(info.idxs, slice): if info.idxs.step == 1 or info.idxs.step is None: return idx >= info.idxs.start and idx < info.idxs.stop return idx in to_indices(info.idxs, info.view) return idx in info.idxs