def main(N, family, bci):
    bc = bcs[bci]
    if bci == 0:
        SD = FunctionSpace(N,
                           family=family,
                           bc=bc,
                           domain=domain,
                           mean=mean[family.lower()])
    else:
        SD = FunctionSpace(N, family=family, bc=bc, domain=domain)

    u = TrialFunction(SD)
    v = TestFunction(SD)

    # Get f on quad points
    fj = Array(SD, buffer=fe)

    # Compute right hand side of Poisson equation
    f_hat = Function(SD)
    f_hat = inner(v, fj, output_array=f_hat)

    # Get left hand side of Poisson equation
    A = inner(v, div(grad(u)))

    u_hat = Function(SD).set_boundary_dofs()
    if isinstance(A, list):
        bc_mat = extract_bc_matrices([A])
        A = A[0]
        f_hat -= bc_mat[0].matvec(u_hat, Function(SD))

    u_hat = A.solve(f_hat, u_hat)
    uj = u_hat.backward()
    uh = uj.forward()

    # Compare with analytical solution
    ua = Array(SD, buffer=ue)
    assert np.allclose(uj, ua), np.linalg.norm(uj - ua)
    if 'pytest' not in os.environ:
        print("Error=%2.16e" % (np.sqrt(dx((uj - ua)**2))))
        import matplotlib.pyplot as plt
        plt.plot(SD.mesh(), uj, 'b', SD.mesh(), ua, 'r')
Пример #2
0
u = TrialFunction(T)
v = TestFunction(T)

# Get f on quad points
fj = Array(T, buffer=fe)

# Compute right hand side of biharmonic equation
f_hat = inner(v, fj)

# Get left hand side of biharmonic equation
matrices = inner(v, div(grad(div(grad(u)))))

u_hat = Function(T).set_boundary_dofs()  # Solution spectral space

if SD.has_nonhomogeneous_bcs:
    bc_mats = extract_bc_matrices([matrices])
    w0 = np.zeros_like(u_hat)
    for mat in bc_mats:
        f_hat -= mat.matvec(u_hat, w0)

# Create linear algebra solver
H = BiharmonicSolver(*matrices)

# Solve and transform to real space
u_hat = H(u_hat, f_hat)  # Solve

uq = u_hat.backward()

# Compare with analytical solution
uj = Array(T, buffer=ue)
print(abs(uj - uq).max())
Пример #3
0
N = 32

SD = FunctionSpace(N, family=family, bc={'left': ('N', 1), 'right': ('N', 1)})

u = TrialFunction(SD)
v = TestFunction(SD)

# Get f on quad points
fj = Array(SD, buffer=fe)

# Compute right hand side of Poisson equation
f_hat = Function(SD, buffer=inner(v, fj))

# Get left hand side of Poisson equation
A = inner(v, div(grad(u)))
B = extract_bc_matrices([A])[0]
A = A[0]
u_hat = Function(SD).set_boundary_dofs()
f_hat -= B.matvec(u_hat, Function(SD))
u_hat = A.solve(f_hat, u_hat)

# Solve and transform to real space
u = np.zeros(N)  # Solution real space
u = SD.backward(u_hat, u)

# Compare with analytical solution
uj = Array(SD, buffer=ue)
print(abs(uj - u).max())
assert np.allclose(uj, u)

if 'pytest' not in os.environ: