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
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: