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)
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)
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)
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)
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)