Ejemplo n.º 1
0
    for i in range(nc):
        #%% 2 Generate Mesh and FEM
        n = int(5 * (2**i))
        ng = 5

        mesh = genMesh1D(domain, n)
        fem = genFEM1D(mesh, pd)

        #%% 3 Node type and DOF
        fem.genBC1D(domain, bc)

        #%% 4 Generate Matrices abd Vectors
        Mxx = globalMatrix1D(pde.a, mesh, fem, 1, fem, 1, ng)
        M0x = globalMatrix1D(pde.b, mesh, fem, 0, fem, 1, ng)
        M00 = globalMatrix1D(pde.c, mesh, fem, 0, fem, 0, ng)
        f = globalVec1D(pde.f, mesh, fem, 0, ng)

        #%% 5 Dirichlet boundary condition
        uD = pde.gD(fem.p)
        uD[fem.dof] = 0.0
        bxx = Mxx @ uD
        b0x = M0x @ uD
        b00 = M00 @ uD

        #%% 6 Neumann boundary condition
        bN = np.zeros(np.shape(fem.p))
        bN[fem.ptype == 2] = pde.gN(fem.p[fem.ptype == 2])

        #%% 7 Extract degree of freedom
        ii, jj = np.meshgrid(fem.dof, fem.dof, indexing='ij')
        A = Mxx[ii, jj] + M0x[ii, jj] + M00[ii, jj]
onefun = lambda x: 1.0

error_list = []
fig, axs = plt.subplots(4, 5, sharex=True, sharey=True, figsize=(20, 16))

for pd in [1, 2, 3, 4]:
    file = open(f'./logs/hw2_problem2_projection_out_{pd}.log', 'w')
    sys.stdout = file

    for i in range(5):
        n = int(4 * (2**i))
        mesh = genMesh1D(domain, n)
        fem = genFEM1D(mesh, pd)

        M = globalMatrix1D(onefun, mesh, fem, 0, fem, 0, ng)
        b = globalVec1D(fun, mesh, fem, 0, ng)

        uh = inv(M) @ b

        for k in range(n):
            vert = mesh.p[mesh.t[k, :]]
            x = np.linspace(vert[0], vert[1], 101)

            uhK = uh[fem.t[k, :]]
            u = evalFEfun1D(x, uhK, vert, pd, dind)

            axs[pd - 1, i].plot(x, fun(x), 'k', lw=2)
            axs[pd - 1, i].plot(x, u, 'r', lw=1)

        axs[pd - 1, i].grid()
        custom_lines = [