コード例 #1
0
    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))
コード例 #2
0
    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)
コード例 #3
0
 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