示例#1
0
def prepare_rhs(A, w, coeff_field, pde):
    b = 0 * w
    zero = Multiindex()
    b[zero].coeffs = pde.assemble_rhs(basis=b[zero].basis, coeff=coeff_field.mean_func,
                                      withNeumannBC=True)
    
    f = pde.f
    if f.value_rank() == 0:
        zero_func = Constant(0.0)
    else:
        zero_func = Constant((0.0,) * f.value_size())
    zero_func = zero_function(b[zero].basis._fefs) 

    for m in range(w.max_order):
        eps_m = zero.inc(m)
        am_f, am_rv = coeff_field[m]
        beta = am_rv.orth_polys.get_beta(0)

        if eps_m in b.active_indices():
            g0 = b[eps_m].copy()
            g0.coeffs = pde.assemble_rhs(basis=b[eps_m].basis, coeff=am_f, withNeumannBC=False, f=zero_func)  # this equates to homogeneous Neumann bc
            pde.set_dirichlet_bc_entries(g0, homogeneous=True)
            b[eps_m] += beta[1] * g0

        g0 = b[zero].copy()
        g0.coeffs = pde.assemble_rhs(basis=b[zero].basis, coeff=am_f, f=zero_func)
        pde.set_dirichlet_bc_entries(g0, homogeneous=True)
        b[zero] += beta[0] * g0
    return b
示例#2
0
np.set_printoptions(linewidth=1000, precision=3, suppress=True)

# get boundary dofs
dofs = []
bcs = pde.create_dirichlet_bcs(w[Multiindex()].basis, None, None)
for bc in bcs:
    dofs += bc.get_boundary_values().keys()
print dofs


if True:
    b = 0 * w
    zero = Multiindex()
    b[zero].coeffs = pde.assemble_rhs(coeff_field.mean_func, basis=b[zero].basis)
    for m in range(w.max_order):
        eps_m = zero.inc(m)
        am_f, am_rv = coeff_field[m]
        beta = am_rv.orth_polys.get_beta(1)

        g0 = pde.assemble_rhs(am_f, basis=b[eps_m].basis, f=Constant(0.0))
        g0[dofs] = 0
        b[eps_m].coeffs += beta[1] * g0

        g0 = pde.assemble_rhs(am_f, basis=b[zero].basis, f=Constant(0.0))
        g0[dofs] = 0
        b[zero].coeffs += beta[0] * g0
        # b[eps_m].coeffs[dofs] += beta[1] * pde.assemble_rhs(am_f, basis=b[eps_m].basis, f=Constant(0.0))[dofs]
        # b[zero].coeffs[dofs] += beta[0] * pde.assemble_rhs(am_f, basis=b[zero].basis, f=Constant(0.0))[dofs]
    b0 = 1 * b

if True: