def set_current_group(self, ig): """ Set current group for the term and all variables in its arguments. """ self.char_fun.set_current_group(ig) shape_kind = get_shape_kind(self.integration) for var in self.get_variables(): geo, geo_key, geo_ig = self.get_geometry(var) var.setup_bases(geo_key, geo_ig, geo, self.integral, shape_kind) var.set_current_group(geo_key, geo_ig)
def integrate(self, val_qp, variable): shape_kind = get_shape_kind(self.integration) geo, _, _ = self.get_geometry(variable) sh = val_qp.shape val = nm.zeros((sh[0], 1, sh[2], sh[3]), dtype=val_qp.dtype) if shape_kind == 'volume': geo.integrate(val, val_qp) else: geo.integrate(val, val_qp) return val
def integrate(self, val_qp, variable): shape_kind = get_shape_kind(self.integration) geo, _, _ = self.get_geometry(variable) sh = val_qp.shape val = nm.zeros((sh[0], 1, sh[2], sh[3]), dtype=val_qp.dtype) if shape_kind == 'volume': chunk = self.region.cells[self.char_fun.ig] chunk = nm.arange(sh[0], dtype=nm.int32) geo.integrate_chunk(val, val_qp, chunk) else: lchunk = nm.arange(sh[0], dtype=nm.int32) geo.integrate_chunk(val, val_qp, lchunk) return val
def evaluate(self, mode='eval', diff_var=None, **kwargs): shape_kind = get_shape_kind(self.integration) if mode == 'eval': var = self.get_variables()[0] val = 0.0 for ig in self.iter_groups(): args = self.get_args(**kwargs) val_qp = self(*args, **kwargs) _val = self.integrate(val_qp, var) val += self.sign * _val.sum() elif mode in ('el_avg', 'qp'): raise NotImplementedError() elif mode == 'weak': varr = self.get_virtual_variable() vals = [] iels = [] if diff_var is None: for ig in self.iter_groups(): args = self.get_args(**kwargs) aux = varr.get_data_shape(ig, self.integral, shape_kind, self.region.name) n_elr, n_qpr, dim, n_enr, n_cr = aux n_row = n_cr * n_enr shape = (n_elr, 1, n_row, 1) val = nm.zeros(shape, dtype=varr.dtype) for ir in varr.iter_dofs(): irs = slice(ir, ir + 1) try: val_qp = self(*args, **kwargs) except ValueError: output('%s term evaluation failed!' % self.name) raise _val = self.integrate(val_qp, varr) val[..., irs, :] = _val vals.append(self.sign * val) iels.append((ig, nm.arange(n_elr, dtype=nm.int32))) else: varc = self.get_variables(as_list=False)[diff_var] for ig in self.iter_groups(): args = self.get_args(**kwargs) aux = varr.get_data_shape(ig, self.integral, shape_kind, self.region.name) n_elr, n_qpr, dim, n_enr, n_cr = aux n_row = n_cr * n_enr aux = varc.get_data_shape(ig, self.integral, shape_kind, self.region.name) n_elc, n_qpc, dim, n_enc, n_cc = aux n_col = n_cc * n_enc shape = (n_elr, 1, n_row, n_col) val = nm.zeros(shape, dtype=varr.dtype) for ir in varr.iter_dofs(): irs = slice(ir, ir + 1) for ic in varc.iter_dofs(): ics = slice(ic, ic + 1) try: val_qp = self(*args, **kwargs) except ValueError: output('%s term evaluation failed!' % self.name) raise _val = self.integrate(val_qp, varr) val[..., irs, ics] = _val vals.append(self.sign * val) iels.append((ig, nm.arange(n_elr, dtype=nm.int32))) # Setup return value. if mode == 'eval': out = (val, ) else: out = (vals, iels) # Hack: add zero status. out = out + (0, ) if len(out) == 1: out = out[0] return out
def evaluate(self, mode='eval', diff_var=None, **kwargs): shape_kind = get_shape_kind(self.integration) if mode == 'eval': var = self.get_variables()[0] val = 0.0 for ig in self.iter_groups(): args = self.get_args(**kwargs) val_qp = self(*args, **kwargs) _val = self.integrate(val_qp, var) val += self.sign * _val.sum() elif mode in ('el_avg', 'qp'): raise NotImplementedError() elif mode == 'weak': varr = self.get_virtual_variable() vals = [] iels = [] if diff_var is None: for ig in self.iter_groups(): args = self.get_args(**kwargs) aux = varr.get_data_shape(ig, self.integral, shape_kind, self.region.name) n_elr, n_qpr, dim, n_enr, n_cr = aux n_row = n_cr * n_enr shape = (n_elr, 1, n_row, 1) val = nm.zeros(shape, dtype=varr.dtype) for ir in varr.iter_dofs(): irs = slice(ir, ir + 1) try: val_qp = self(*args, **kwargs) except ValueError: output('%s term evaluation failed!' % self.name) raise _val = self.integrate(val_qp, varr) val[..., irs, :] = _val vals.append(self.sign * val) iels.append((ig, nm.arange(n_elr, dtype=nm.int32))) else: varc = self.get_variables(as_list=False)[diff_var] for ig in self.iter_groups(): args = self.get_args(**kwargs) aux = varr.get_data_shape(ig, self.integral, shape_kind, self.region.name) n_elr, n_qpr, dim, n_enr, n_cr = aux n_row = n_cr * n_enr aux = varc.get_data_shape(ig, self.integral, shape_kind, self.region.name) n_elc, n_qpc, dim, n_enc, n_cc = aux n_col = n_cc * n_enc shape = (n_elr, 1, n_row, n_col) val = nm.zeros(shape, dtype=varr.dtype) for ir in varr.iter_dofs(): irs = slice(ir, ir + 1) for ic in varc.iter_dofs(): ics = slice(ic, ic + 1) try: val_qp = self(*args, **kwargs) except ValueError: output('%s term evaluation failed!' % self.name) raise _val = self.integrate(val_qp, varr) val[..., irs, ics] = _val vals.append(self.sign * val) iels.append((ig, nm.arange(n_elr, dtype=nm.int32))) # Setup return value. if mode == 'eval': out = (val,) else: out = (vals, iels) # Hack: add zero status. out = out + (0,) if len(out) == 1: out = out[0] return out