Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
    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
Exemplo n.º 7
0
    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