def __init__(self): self.pde = SphereSinSinSinData() self.surface = self.pde.domain() self.mesh = self.pde.init_mesh(4) node = self.mesh.entity('node') cell = self.mesh.entity('cell') self.tritree = Tritree(node, cell)
def grad_recovery_test(self, p=1, plot=False): from fealpy.pde.surface_poisson_model_3d import SphereSinSinSinData pde = SphereSinSinSinData() surface = pde.domain() mesh = pde.init_mesh() for i in range(4): space = SurfaceLagrangeFiniteElementSpace(mesh, surface, p=p) uI = space.interpolation(pde.solution) rg = space.grad_recovery(uI) error0 = space.integralalg.L2_error(pde.solution, uI.value) error1 = space.integralalg.L2_error(pde.gradient, rg.value) def f(x): return np.sum(rg.value(x)**2, axis=-1) eta = space.integralalg.integral(f, celltype=True) mesh.uniform_refine(surface=surface) print(error1)
def interpolation(self, p=2, n=1, fname='surface.vtu'): from fealpy.geometry import SphereSurface from fealpy.pde.surface_poisson_model_3d import SphereSinSinSinData pde = SphereSinSinSinData() surface = pde.domain() mesh = pde.init_mesh(n=n) node = mesh.entity('node') cell = mesh.entity('cell') mesh = LagrangeTriangleMesh(node, cell, p=p, surface=surface) space = ParametricLagrangeFiniteElementSpace(mesh, p=p) uI = space.interpolation(pde.solution) mesh.nodedata['uI'] = uI[:] error0 = space.integralalg.error(pde.solution, uI.value) error1 = space.integralalg.error(pde.gradient, uI.grad_value) print(error0, error1) mesh.to_vtk(fname=fname)
import pylab as pl p = int(sys.argv[1]) maxit = int(sys.argv[2]) theta = 0.35 errorType = [ '$|| u_I - u_h ||_{l_2}$', '$|| u - u_h ||_{S,0}$', '$||\\nabla_S u - \\nabla_S u_h||_{S,0}$' ] Ndof = np.zeros((maxit, ), dtype=np.int) errorMatrix = np.zeros((len(errorType), maxit), dtype=np.float) integrator = TriangleQuadrature(3) ralg = FEMFunctionRecoveryAlg() pde = SphereSinSinSinData() mesh = pde.init_mesh(2) tmesh = Tritree(mesh.node, mesh.ds.cell, irule=1) pmesh = tmesh.to_conformmesh() fig = pl.figure() axes = a3.Axes3D(fig) pmesh.add_plot(axes) for i in range(maxit): print('step:', i) fem = SurfacePoissonFEMModel(pmesh, pde, p, integrator) fem.solve() uh = fem.uh rguh = ralg.harmonic_average(uh) eta = fem.recover_estimate(rguh)
class TritreeTest: def __init__(self): self.pde = SphereSinSinSinData() self.surface = self.pde.domain() self.mesh = self.pde.init_mesh(4) node = self.mesh.entity('node') cell = self.mesh.entity('cell') self.tritree = Tritree(node, cell) def test_adaptive(self): options = self.tritree.adaptive_options(maxrefine=1) mesh = self.tritree.to_conformmesh() for i in range(1): space = SurfaceLagrangeFiniteElementSpace(mesh, self.surface, p=1) uI = space.interpolation(self.pde.solution) phi = lambda x: uI.grad_value(x)**2 eta = space.integralalg.integral(lambda x: uI.grad_value(x)**2, celltype=True, barycenter=True) eta = eta.sum(axis=-1) self.tritree.adaptive(eta, options, surface=self.surface) mesh = self.tritree.to_conformmesh() print(self.tritree.celldata['idxmap']) cell = self.tritree.entity('cell') print(cell[15]) cell = mesh.entity('cell') print(cell[104]) print(cell[140]) fig = pl.figure() axes = a3.Axes3D(fig) self.tritree.add_plot(axes) plt.show() def test_interpolation_surface(self, p=1): options = self.tritree.adaptive_options(maxrefine=1, p=p) mesh = self.tritree.to_conformmesh() space = SurfaceLagrangeFiniteElementSpace(mesh, self.surface, p=p) uI = space.interpolation(self.pde.solution) print('1:', space.number_of_global_dofs()) print('2:', uI.shape) error0 = space.integralalg.L2_error(self.pde.solution, uI) print(error0) data = self.tritree.interpolation(uI) print('3', data.shape) options['data'] = {'q': data} if 1: eta = space.integralalg.integral(lambda x: uI.grad_value(x)**2, celltype=True, barycenter=True) eta = eta.sum(axis=-1) self.tritree.adaptive(eta, options, surface=self.surface) else: self.tritree.uniform_refine(options=options, surface=self.surface) mesh = self.tritree.to_conformmesh(options) space = SurfaceLagrangeFiniteElementSpace(mesh, self.surface, p=p) data = options['data']['q'] print('data:', data.shape) uh = space.to_function(data) print('uh:', uh.shape) error1 = space.integralalg.L2_error(self.pde.solution, uh) print(error1) uI = space.interpolation(self.pde.solution) error2 = space.integralalg.L2_error(self.pde.solution, uI) print(error2) data = self.tritree.interpolation(uI) options['data'] = {'q': data} if 0: eta = space.integralalg.integral(lambda x: uI.grad_value(x)**2, celltype=True, barycenter=True) eta = eta.sum(axis=-1) self.tritree.adaptive(eta, options, surface=self.surface) else: self.tritree.uniform_refine(options=options, surface=self.surface) mesh = self.tritree.to_conformmesh(options) space = SurfaceLagrangeFiniteElementSpace(mesh, self.surface, p=p) data = options['data']['q'] uh = space.to_function(data) error3 = space.integralalg.L2_error(self.pde.solution, uh) print(error3) if 0: fig = pl.figure() axes = a3.Axes3D(fig) self.tritree.add_plot(axes) plt.show() else: fig = pl.figure() axes = a3.Axes3D(fig) mesh.add_plot(axes) plt.show() def test_interpolation_plane(self): def u(p): x = p[..., 0] y = p[..., 1] return x * y node = np.array([(0, 0), (1, 0), (1, 1), (0, 1)], dtype=np.float) cell = np.array([(1, 2, 0), (3, 0, 2)], dtype=np.int) mesh = TriangleMesh(node, cell) node = mesh.entity('node') cell = mesh.entity('cell') tritree = Tritree(node, cell) mesh = tritree.to_conformmesh() space = LagrangeFiniteElementSpace(mesh, p=2) uI = space.interpolation(u) error0 = space.integralalg.L2_error(u, uI) fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, node=space.interpolation_points(), showindex=True) data = tritree.interpolation(uI) options = tritree.adaptive_options(method='numrefine', data={"q": data}, maxrefine=1, p=2) if 1: #eta = space.integralalg.integral(lambda x : uI.grad_value(x)**2, celltype=True, barycenter=True) #eta = eta.sum(axis=-1) eta = np.array([1, 0], dtype=np.int) tritree.adaptive(eta, options) else: tritree.uniform_refine(options=options) fig = plt.figure() axes = fig.gca() tritree.add_plot(axes) tritree.find_node(axes, showindex=True) mesh = tritree.to_conformmesh(options) space = LagrangeFiniteElementSpace(mesh, p=2) data = options['data']['q'] uh = space.to_function(data) error1 = space.integralalg.L2_error(u, uh) data = tritree.interpolation(uh) isLeafCell = tritree.is_leaf_cell() fig = plt.figure() axes = fig.gca() tritree.add_plot(axes) tritree.find_node(axes, node=space.interpolation_points(), showindex=True) tritree.find_cell(axes, index=isLeafCell, showindex=True) options = tritree.adaptive_options(method='numrefine', data={"q": data}, maxrefine=1, maxcoarsen=1, p=2) if 1: #eta = space.integralalg.integral(lambda x : uI.grad_value(x)**2, celltype=True, barycenter=True) #eta = eta.sum(axis=-1) eta = np.array([-1, -1, -1, -1, 0, 1], dtype=np.int) tritree.adaptive(eta, options) else: tritree.uniform_refine(options=options) mesh = tritree.to_conformmesh(options) space = LagrangeFiniteElementSpace(mesh, p=2) data = options['data']['q'] uh = space.to_function(data) fig = plt.figure() axes = fig.gca() mesh.add_plot(axes) mesh.find_node(axes, node=space.interpolation_points(), showindex=True) mesh.find_cell(axes, showindex=True) error2 = space.integralalg.L2_error(u, uh) print(error0) print(error1) print(error2) plt.show()
import pylab as pl p = int(sys.argv[1]) maxit = int(sys.argv[2]) theta = 0.4 errorType = [ '$|| u_I - u_h ||_{l_2}$', '$|| u - u_h ||_{S,0}$', '$||\\nabla_S u - \\nabla_S u_h||_{S,0}$' ] Ndof = np.zeros((maxit, ), dtype=np.int) errorMatrix = np.zeros((len(errorType), maxit), dtype=np.float) integrator = TriangleQuadrature(3) ralg = FEMFunctionRecoveryAlg() pde = SphereSinSinSinData() surface = Sphere() mesh = surface.init_mesh() mesh.uniform_refine(n=2, surface=surface) tmesh = Tritree(mesh.node, mesh.ds.cell, irule=1) pmesh = tmesh.to_conformmesh() fig = pl.figure() axes = a3.Axes3D(fig) pmesh.add_plot(axes) for i in range(maxit): print('step:', i) fem = SurfacePoissonFEMModel(pmesh, pde, p, integrator) fem.solve() uh = fem.uh