Ejemplo n.º 1
0
    def solve_poisson_3d(self, n=2):
        from fealpy.pde.poisson_3d import CosCosCosData as PDE
        from fealpy.mesh import MeshFactory
        from fealpy.functionspace import LagrangeFiniteElementSpace
        from fealpy.boundarycondition import DirichletBC

        pde = PDE()
        mf = MeshFactory()
        m = 2**n
        box = [0, 1, 0, 1, 0, 1]
        mesh = mf.boxmesh3d(box, nx=m, ny=m, nz=m, meshtype='tet')
        space = LagrangeFiniteElementSpace(mesh, p=1)
        gdof = space.number_of_global_dofs()
        NC = mesh.number_of_cells()
        print('gdof:', gdof, 'NC:', NC)
        bc = DirichletBC(space, pde.dirichlet)
        uh = space.function()
        A = space.stiff_matrix()
        A = space.parallel_stiff_matrix(q=1)

        M = space.parallel_mass_matrix(q=2)
        M = space.mass_matrix()

        F = space.source_vector(pde.source)

        A, F = bc.apply(A, F, uh)

        solver = PETScSolver()
        solver.solve(A, F, uh)
        error = space.integralalg.L2_error(pde.solution, uh)
        print(error)
Ejemplo n.º 2
0
    def __init__(self):
        self.domain = [0, 50, 0, 50]
        self.mesh = MeshFactory().regular(self.domain, n=50)
        self.timeline = UniformTimeLine(0, 1, 100)
        self.space0 = RaviartThomasFiniteElementSpace2d(self.mesh, p=0)
        self.space1 = ScaledMonomialSpace2d(self.mesh, p=1)  # 线性间断有限元空间

        self.vh = self.space0.function()  # 速度
        self.ph = self.space0.smspace.function()  # 压力
        self.ch = self.space1.function(dim=3)  # 三个组分的摩尔密度
        self.options = {
            'viscosity': 1.0,
            'permeability': 1.0,
            'temperature': 397,
            'pressure': 50,
            'porosity': 0.2,
            'injecttion_rate': 0.1,
            'compressibility': (0.001, 0.001, 0.001),
            'pmv': (1.0, 1.0, 1.0),
            'dt': self.timeline.dt
        }

        c = self.options['viscosity'] / self.options['permeability']
        self.A = c * self.space0.mass_matrix()
        self.B = self.space0.div_matrix()

        phi = self.options['porosity']
        self.M = phi / dt * self.space0.smspace.mass_matrix()  #
        self.MC = self.space1.cell_mass_matrix() / dt
Ejemplo n.º 3
0
    def __init__(self, pde, timeline, n=1):
        self.pde = pde
        box = pde.domain()
        mf = MeshFactory()
        self.mesh = mf.boxmesh2d(box, nx=n, ny=n, meshtype='tri')

        self.uspace = RaviartThomasFiniteElementSpace2d(self.mesh, p=0)
        self.pspace = self.uspace.smspace

        self.timeline = timeline
        NL = timeline.number_of_time_levels()

        # state variable
        self.yh = self.pspace.function(dim=NL)
        self.uh = self.pspace.function(dim=NL)
        self.tph = self.uspace.function(dim=NL)
        self.ph = self.uspace.function()
        bc = self.mesh.entity_barycenter('cell')

        f = cartesian(lambda p: pde.y_solution(p, 0))
        self.yh[:, 0] = self.pspace.local_projection(f)

        # costate variable
        self.zh = self.pspace.function(dim=NL)
        self.tqh = self.uspace.function(dim=NL)
        self.qh = self.uspace.function()

        self.A = self.uspace.stiff_matrix()  # RT 质量矩阵
        self.D = self.uspace.div_matrix()  # (p, \div v)
        self.M = self.pspace.mass_matrix()
Ejemplo n.º 4
0
    def show_mesh(self, p=2, plot=True):

        mf = MeshFactory()

        mesh = mf.boxmesh2d([0, 1, 0, 1], nx=2, ny=2, meshtype='tri')
        node = mesh.entity('node')
        cell = mesh.entity('cell')

        ltmesh = LagrangeTriangleMesh(node, cell, p=p)
        NN = ltmesh.number_of_nodes()

        mesh.ds.edge = ltmesh.lds.edge
        mesh.ds.edge2cell = ltmesh.lds.edge2cell

        node = ltmesh.entity('node')
        #ltmesh.print()

        if plot:
            fig = plt.figure()
            axes = fig.gca()
            mesh.add_plot(axes)
            mesh.find_node(axes, node=node, showindex=True, fontsize=28)
            mesh.find_edge(axes, showindex=True)
            mesh.find_cell(axes, showindex=True)
            plt.show()
Ejemplo n.º 5
0
 def diff_index_test(self, p=3):
     mfactory = MeshFactory()
     mesh = mfactory.one_tetrahedron_mesh()
     space = ScaledMonomialSpace3d(mesh, p=p)
     index = space.diff_index_1()
     print(index)
     index = space.diff_index_2()
     print(index)
Ejemplo n.º 6
0
 def space_mesh(self, n=10):
     from fealpy.mesh import MeshFactory
     mf = MeshFactory()
     mesh = mf.boxmesh2d(self.domain, nx=2, ny=2, meshtype='tri')
     for i in range(n):
         isCrossedCell = mesh.is_crossed_cell(self.point, self.segment)
         mesh.bisect(isCrossedCell)
     return mesh
Ejemplo n.º 7
0
    def save_mesh(self, p=2, fname='test.vtu'):
        mf = MeshFactory()

        mesh = mf.boxmesh2d([0, 1, 0, 1], nx=2, ny=2, meshtype='quad')
        node = mesh.entity('node')
        cell = mesh.entity('cell')

        mesh = LagrangeQuadrangleMesh(node, cell[:, [0, 3, 1, 2]], p=p)
        mesh.to_vtk(fname=fname)
Ejemplo n.º 8
0
 def one_tet_mesh_test(self, p, plot=True):
     mfactory = MeshFactory()
     mesh = mfactory.one_tetrahedron_mesh()
     space = ScaledMonomialSpace3d(mesh, p=p)
     if plot:
         fig = plt.figure()
         axes = fig.gca(projection='3d')
         mesh.add_plot(axes)
         axes.set_axis_off()
         plt.show()
Ejemplo n.º 9
0
 def space_mesh(self, n=10):
     from fealpy.mesh import MeshFactory
     mf = MeshFactory()
     mesh = mf.boxmesh2d(self.domain, nx=1, ny=1, meshtype='tri')
     point = self.fracture['point']
     segment = self.fracture['segment']
     for i in range(n):
         isCutCell = mesh.find_segment_location(point, segment)
         mesh.bisect(isCutCell)
     return mesh
Ejemplo n.º 10
0
    def space_mesh(self, n=50):
        """

        Notes
        -----

        最小网格单元尺寸为 1 m
        """
        box = [0, 50, 0, 50]
        mf = MeshFactory()
        mesh = mf.boxmesh2d(box, nx=n, ny=n, meshtype='tri')
        return mesh
Ejemplo n.º 11
0
 def space_mesh(self, p, NS=0):
     from fealpy.mesh import MeshFactory
     mf = MeshFactory()
     mesh = mf.boxmesh2d(self.domain, nx=70, ny=30, p=p, meshtype='quad')
     mesh.uniform_refine(NS)
     return mesh
Ejemplo n.º 12
0
 def __init__(self):
     self.mf = MeshFactory()
Ejemplo n.º 13
0
 def space_mesh(self, n=32):
     from fealpy.mesh import MeshFactory
     mf = MeshFactory()
     mesh = mf.boxmesh2d(self.domain, nx=n, ny=n, meshtype='tri')
     return mesh
Ejemplo n.º 14
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()

    M = space.mass_matrix()
Ejemplo n.º 15
0
 def init_mesh(self):
     d = self.domain()
     mfactory = MeshFactory()
     mesh = mfactory.regular(d)
     return mesh
Ejemplo n.º 16
0
 def space_mesh(self, n=50):
     box = [0, 50, 0, 50]
     mf = MeshFactory()
     mesh = mf.boxmesh2d(box, nx=n, ny=n, meshtype='tri')
     return mesh