Ejemplo n.º 1
0
Archivo: fv.py Proyecto: simon-ca/pymor
    def apply(self, U, ind=None, mu=None):
        assert isinstance(U, NumpyVectorArray)
        assert U in self.source
        mu = self.parse_parameter(mu)

        if not hasattr(self, '_grid_data'):
            self._fetch_grid_data()

        ind = range(len(U)) if ind is None else ind
        U = U.data
        R = np.zeros((len(ind), self.source.dim))

        bi = self.boundary_info
        gd = self._grid_data
        SUPE = gd['SUPE']
        VOLS0 = gd['VOLS0']
        VOLS1 = gd['VOLS1']
        BOUNDARIES = gd['BOUNDARIES']
        CENTERS = gd['CENTERS']
        DIRICHLET_BOUNDARIES = gd['DIRICHLET_BOUNDARIES']
        NEUMANN_BOUNDARIES = gd['NEUMANN_BOUNDARIES']
        UNIT_OUTER_NORMALS = gd['UNIT_OUTER_NORMALS']

        if bi.has_dirichlet:
            if hasattr(self, '_dirichlet_values'):
                dirichlet_values = self._dirichlet_values
            elif self.dirichlet_data is not None:
                dirichlet_values = self.dirichlet_data(
                    CENTERS[DIRICHLET_BOUNDARIES], mu=mu)
            else:
                dirichlet_values = np.zeros_like(DIRICHLET_BOUNDARIES)
            F_dirichlet = self.numerical_flux.evaluate_stage1(
                dirichlet_values, mu)

        for i, j in enumerate(ind):
            Ui = U[j]
            Ri = R[i]

            F = self.numerical_flux.evaluate_stage1(Ui, mu)
            F_edge = [f[SUPE] for f in F]

            for f in F_edge:
                f[BOUNDARIES, 1] = f[BOUNDARIES, 0]
            if bi.has_dirichlet:
                for f, f_d in zip(F_edge, F_dirichlet):
                    f[DIRICHLET_BOUNDARIES, 1] = f_d

            NUM_FLUX = self.numerical_flux.evaluate_stage2(
                F_edge, UNIT_OUTER_NORMALS, VOLS1, mu)

            if bi.has_neumann:
                NUM_FLUX[NEUMANN_BOUNDARIES] = 0

            iadd_masked(Ri, NUM_FLUX, SUPE[:, 0])
            isub_masked(Ri, NUM_FLUX, SUPE[:, 1])

        R /= VOLS0

        return NumpyVectorArray(R)
Ejemplo n.º 2
0
Archivo: fv.py Proyecto: JuliaBru/pymor
    def apply(self, U, ind=None, mu=None):
        assert isinstance(U, NumpyVectorArray)
        assert U in self.source
        mu = self.parse_parameter(mu)

        if not hasattr(self, '_grid_data'):
            self._fetch_grid_data()

        ind = range(len(U)) if ind is None else ind
        U = U.data
        R = np.zeros((len(ind), self.source.dim))

        bi = self.boundary_info
        gd = self._grid_data
        SUPE = gd['SUPE']
        VOLS0 = gd['VOLS0']
        VOLS1 = gd['VOLS1']
        BOUNDARIES = gd['BOUNDARIES']
        CENTERS = gd['CENTERS']
        DIRICHLET_BOUNDARIES = gd['DIRICHLET_BOUNDARIES']
        NEUMANN_BOUNDARIES = gd['NEUMANN_BOUNDARIES']
        UNIT_OUTER_NORMALS = gd['UNIT_OUTER_NORMALS']

        if bi.has_dirichlet:
            if hasattr(self, '_dirichlet_values'):
                dirichlet_values = self._dirichlet_values
            elif self.dirichlet_data is not None:
                dirichlet_values = self.dirichlet_data(CENTERS[DIRICHLET_BOUNDARIES], mu=mu)
            else:
                dirichlet_values = np.zeros_like(DIRICHLET_BOUNDARIES)
            F_dirichlet = self.numerical_flux.evaluate_stage1(dirichlet_values, mu)

        for i, j in enumerate(ind):
            Ui = U[j]
            Ri = R[i]

            F = self.numerical_flux.evaluate_stage1(Ui, mu)
            F_edge = [f[SUPE] for f in F]

            for f in F_edge:
                f[BOUNDARIES, 1] = f[BOUNDARIES, 0]
            if bi.has_dirichlet:
                for f, f_d in zip(F_edge, F_dirichlet):
                    f[DIRICHLET_BOUNDARIES, 1] = f_d

            NUM_FLUX = self.numerical_flux.evaluate_stage2(F_edge, UNIT_OUTER_NORMALS, VOLS1, mu)

            if bi.has_neumann:
                NUM_FLUX[NEUMANN_BOUNDARIES] = 0

            iadd_masked(Ri, NUM_FLUX, SUPE[:, 0])
            isub_masked(Ri, NUM_FLUX, SUPE[:, 1])

        R /= VOLS0

        return NumpyVectorArray(R)
Ejemplo n.º 3
0
Archivo: fv.py Proyecto: pymor/pymor
    def apply(self, U, mu=None):
        assert U in self.source
        mu = self.parse_parameter(mu)

        if not hasattr(self, "_grid_data"):
            self._fetch_grid_data()

        U = U.data
        R = np.zeros((len(U), self.source.dim))

        bi = self.boundary_info
        gd = self._grid_data
        SUPE = gd["SUPE"]
        VOLS0 = gd["VOLS0"]
        VOLS1 = gd["VOLS1"]
        BOUNDARIES = gd["BOUNDARIES"]
        CENTERS = gd["CENTERS"]
        DIRICHLET_BOUNDARIES = gd["DIRICHLET_BOUNDARIES"]
        NEUMANN_BOUNDARIES = gd["NEUMANN_BOUNDARIES"]
        UNIT_OUTER_NORMALS = gd["UNIT_OUTER_NORMALS"]

        if bi.has_dirichlet:
            if hasattr(self, "_dirichlet_values"):
                dirichlet_values = self._dirichlet_values
            elif self.dirichlet_data is not None:
                dirichlet_values = self.dirichlet_data(CENTERS[DIRICHLET_BOUNDARIES], mu=mu)
            else:
                dirichlet_values = np.zeros_like(DIRICHLET_BOUNDARIES)
            F_dirichlet = self.numerical_flux.evaluate_stage1(dirichlet_values, mu)

        for i, j in enumerate(range(len(U))):
            Ui = U[j]
            Ri = R[i]

            F = self.numerical_flux.evaluate_stage1(Ui, mu)
            F_edge = [f[SUPE] for f in F]

            for f in F_edge:
                f[BOUNDARIES, 1] = f[BOUNDARIES, 0]
            if bi.has_dirichlet:
                for f, f_d in zip(F_edge, F_dirichlet):
                    f[DIRICHLET_BOUNDARIES, 1] = f_d

            NUM_FLUX = self.numerical_flux.evaluate_stage2(F_edge, UNIT_OUTER_NORMALS, VOLS1, mu)

            if bi.has_neumann:
                NUM_FLUX[NEUMANN_BOUNDARIES] = 0

            iadd_masked(Ri, NUM_FLUX, SUPE[:, 0])
            isub_masked(Ri, NUM_FLUX, SUPE[:, 1])

        R /= VOLS0

        return self.range.make_array(R)
Ejemplo n.º 4
0
    def apply(self, U, ind=None, mu=None):
        assert isinstance(U, NumpyVectorArray)
        assert U in self.source
        mu = self.parse_parameter(mu)

        ind = xrange(len(U)) if ind is None else ind
        U = U.data
        R = np.zeros((len(ind), self.source.dim))

        g = self.grid
        bi = self.boundary_info
        SUPE = g.superentities(1, 0)
        SUPI = g.superentity_indices(1, 0)
        assert SUPE.ndim == 2
        VOLS = g.volumes(1)
        boundaries = g.boundaries(1)
        unit_outer_normals = g.unit_outer_normals()[SUPE[:, 0], SUPI[:, 0]]

        if bi.has_dirichlet:
            dirichlet_boundaries = bi.dirichlet_boundaries(1)
            if hasattr(self, '_dirichlet_values'):
                dirichlet_values = self._dirichlet_values
            elif self.dirichlet_data is not None:
                dirichlet_values = self.dirichlet_data(g.centers(1)[dirichlet_boundaries], mu=mu)
            else:
                dirichlet_values = np.zeros_like(dirichlet_boundaries)
            F_dirichlet = self.numerical_flux.evaluate_stage1(dirichlet_values, mu)

        for i, j in enumerate(ind):
            Ui = U[j]
            Ri = R[i]

            F = self.numerical_flux.evaluate_stage1(Ui, mu)
            F_edge = [f[SUPE] for f in F]

            for f in F_edge:
                f[boundaries, 1] = f[boundaries, 0]
            if bi.has_dirichlet:
                for f, f_d in izip(F_edge, F_dirichlet):
                    f[dirichlet_boundaries, 1] = f_d

            NUM_FLUX = self.numerical_flux.evaluate_stage2(F_edge, unit_outer_normals, VOLS, mu)

            if bi.has_neumann:
                NUM_FLUX[bi.neumann_boundaries(1)] = 0

            iadd_masked(Ri, NUM_FLUX, SUPE[:, 0])
            isub_masked(Ri, NUM_FLUX, SUPE[:, 1])

        R /= g.volumes(0)

        return NumpyVectorArray(R)
Ejemplo n.º 5
0
    def apply(self, U, ind=None, mu=None):
        assert isinstance(U, NumpyVectorArray)
        assert U in self.source
        mu = self.parse_parameter(mu)

        ind = xrange(len(U)) if ind is None else ind
        U = U.data
        R = np.zeros((len(ind), self.source.dim))

        g = self.grid
        bi = self.boundary_info
        SUPE = g.superentities(1, 0)
        SUPI = g.superentity_indices(1, 0)
        assert SUPE.ndim == 2
        VOLS = g.volumes(1)
        boundaries = g.boundaries(1)
        unit_outer_normals = g.unit_outer_normals()[SUPE[:, 0], SUPI[:, 0]]

        if bi.has_dirichlet:
            dirichlet_boundaries = bi.dirichlet_boundaries(1)
            if hasattr(self, '_dirichlet_values'):
                dirichlet_values = self._dirichlet_values
            elif self.dirichlet_data is not None:
                dirichlet_values = self.dirichlet_data(g.centers(1)[dirichlet_boundaries], mu=mu)
            else:
                dirichlet_values = np.zeros_like(dirichlet_boundaries)
            F_dirichlet = self.numerical_flux.evaluate_stage1(dirichlet_values, mu)

        for i, j in enumerate(ind):
            Ui = U[j]
            Ri = R[i]

            F = self.numerical_flux.evaluate_stage1(Ui, mu)
            F_edge = [f[SUPE] for f in F]

            for f in F_edge:
                f[boundaries, 1] = f[boundaries, 0]
            if bi.has_dirichlet:
                for f, f_d in izip(F_edge, F_dirichlet):
                    f[dirichlet_boundaries, 1] = f_d

            NUM_FLUX = self.numerical_flux.evaluate_stage2(F_edge, unit_outer_normals, VOLS, mu)

            if bi.has_neumann:
                NUM_FLUX[bi.neumann_boundaries(1)] = 0

            iadd_masked(Ri, NUM_FLUX, SUPE[:, 0])
            isub_masked(Ri, NUM_FLUX, SUPE[:, 1])

        R /= g.volumes(0)

        return NumpyVectorArray(R)
Ejemplo n.º 6
0
    def apply(self, U, ind=None, mu=None):
        assert isinstance(U, NumpyVectorArray)
        assert U.dim == self.dim_source

        ind = xrange(len(U)) if ind is None else ind
        U = U._array
        R = np.zeros((len(ind), self.dim_source))

        grid = self.grid
        N = grid.neighbours(0, 0)
        SUPE = grid.superentities(1, 0)
        SUPI = grid.superentity_indices(1, 0)
        assert SUPE.ndim == 2
        VOLS = grid.volumes(1)

        for i, j in enumerate(ind):
            Ui = U[j]
            Ri = R[i]

            F = self.flux(Ui, self.map_parameter(mu, 'flux'))
            F_edge = F[SUPE]
            F_edge[SUPE == -1] = 0
            F_edge = np.sum(np.sum(F_edge, axis=1) * grid.unit_outer_normals()[SUPE[:,0], SUPI[:,0]], axis=1)

            U_edge = Ui[SUPE]
            U_edge[SUPE == -1] = 0
            U_edge = (U_edge[:,0] - U_edge[:,1]) * (1. / self.lmbda)

            TOT_edge = F_edge + U_edge
            TOT_edge *= 0.5 * VOLS

            # for k in xrange(len(TOT_edge)):
            #     Ri[SUPE[k,0]] += TOT_edge[k]
            #     Ri[SUPE[k,1]] -= TOT_edge[k]
            # Ri[SUPE[:,0]] += TOT_edge
            # Ri[SUPE[:,1]] -= TOT_edge
            iadd_masked(Ri, TOT_edge, SUPE[:,0])
            isub_masked(Ri, TOT_edge, SUPE[:,1])

        R /= grid.volumes(0)

        return NumpyVectorArray(R)