def test_poisson_equation(self, p=1, maxit=4): h = 0.1 pde = CosCosData() domain = pde.domain() error = np.zeros((maxit,), dtype=np.float) for i in range(maxit): mesh = triangle(domain, h, meshtype='polygon') dmodel = SobolevEquationWGModel2d(self.pde, mesh, p=p) uh = dmodel.space.function() dmodel.space.set_dirichlet_bc(uh, pde.dirichlet) S = dmodel.space.stabilizer_matrix() A = dmodel.G + S F = dmodel.space.source_vector(pde.source) F -= A@uh isBdDof = dmodel.space.boundary_dof() gdof = dmodel.space.number_of_global_dofs() bdIdx = np.zeros(gdof, dtype=np.int) bdIdx[isBdDof] = 1 Tbd = spdiags(bdIdx, 0, gdof, gdof) T = spdiags(1-bdIdx, 0, gdof, gdof) A = T@A@T + Tbd F[isBdDof] = uh[isBdDof] uh[:] = spsolve(A, F) integralalg = dmodel.space.integralalg error[i] = integralalg.L2_error(pde.solution, uh) h /= 2 print(error) print(error[0:-1]/error[1:])
from scipy.sparse import csr_matrix import sys import sympy from mpl_toolkits.mplot3d import Axes3D from fealpy.decorator import cartesian from scipy.sparse.linalg import spsolve from fealpy.boundarycondition import DirichletBC from fealpy.pde.poisson_2d import CosCosData as PDE from fealpy.tools.show import showmultirate, show_error_table n = 10 p = 4 mf = MeshFactory() mesh = mf.boxmesh2d([0, 1, 0, 1], nx=n, ny=n, meshtype='tri') pde = PDE() domain = pde.domain() maxit = 4 errorType = [ '$|| u - u_h||_{\Omega,0}$', # L2 误差 '$||\\nabla u - \\nabla u_h||_{\Omega, 0}$' ] # H1 误差 errorMatrix = np.zeros((2, maxit), dtype=np.float) NDof = np.zeros(maxit, dtype=np.float) for i in range(maxit): print('Step:', i) space = LagrangeFiniteElementSpace(mesh, p=p) NDof[i] = space.number_of_global_dofs() uh = space.function() a = np.array([(10.0, -1.0), (-1.0, 2.0)], dtype=np.float64) A = space.stiff_matrix(c=a)
A0, S0 = space.chen_stability_term() A = space.stiff_matrix() print("A:", A.toarray()) print("A0:", A0.toarray()) print("S0:", S0.toarray()) np.savetxt('A.txt', A.toarray(), fmt='%.2e') np.savetxt('A0.txt', A0.toarray(), fmt='%.2e') np.savetxt('S0.txt', S0.toarray(), fmt='%.2e') if False: h = 0.1 maxit = 1 pde = CosCosData() box = pde.domain() for i in range(maxit): mesh = triangle(box, h / 2**(i - 1), meshtype='polygon') space = ConformingVirtualElementSpace2d(mesh, p=1) uh = space.function() bc = BoundaryCondition(space, dirichlet=pde.dirichlet) A0, S0 = space.chen_stability_term() A0 = A0.toarray() S0 = S0.toarray() A = space.stiff_matrix() F = space.source_vector(pde.source) A, F = bc.apply_dirichlet_bc(A, F, uh)
from fealpy.pde.poisson_2d import CosCosData from fealpy.mesh import MeshFactory from fealpy.decorator import cartesian, barycentric from fealpy.functionspace import RaviartThomasFiniteElementSpace2d from fealpy.solver import SaddlePointFastSolver p = int(sys.argv[1]) # RT 空间的次数 n = int(sys.argv[2]) # 初始网格部分段数 maxit = int(sys.argv[3]) # 迭代求解次数 pde = CosCosData() # pde 模型 box = pde.domain() # 模型区域 mf = MeshFactory() # 网格工场 for i in range(maxit): mesh = mf.boxmesh2d(box, nx=n, ny=n, meshtype='tri') space = RaviartThomasFiniteElementSpace2d(mesh, p=p) udof = space.number_of_global_dofs() pdof = space.smspace.number_of_global_dofs() gdof = udof + pdof print("step ", i, " with number of dofs:", gdof) uh = space.function() ph = space.smspace.function()