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:])
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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()