def test_marking(): # PDE data # ======== # define source term and diffusion coefficient # f = Expression("10.*exp(-(pow(x[0] - 0.6, 2) + pow(x[1] - 0.4, 2)) / 0.02)", degree=3) f = Constant("1.0") diffcoeff = Constant("1.0") # setup multivector #================== # solution evaluation function def eval_poisson(vec=None): if vec == None: # set default vector for new indices # mesh0 = refine(Mesh(lshape_xml)) mesh0 = UnitSquare(4, 4) fs = FunctionSpace(mesh0, "CG", 1) vec = FEniCSVector(Function(fs)) pde = FEMPoisson() fem_A = pde.assemble_lhs(diffcoeff, vec.basis) fem_b = pde.assemble_rhs(f, vec.basis) solve(fem_A, vec.coeffs, fem_b) return vec # define active multiindices mis = [Multiindex([0]), Multiindex([1]), Multiindex([0, 1]), Multiindex([0, 2])] # setup initial multivector w = MultiVectorWithProjection() Marking.refine(w, {}, mis, eval_poisson) logger.info("active indices of after initialisation: %s", w.active_indices()) # define coefficient field # ======================== # define coefficient field a0 = Expression("1.0", element=FiniteElement('Lagrange', ufl.triangle, 1)) # a = [Expression('2.+sin(2.*pi*I*x[0]+x[1]) + 10.*exp(-pow(I*(x[0] - 0.6)*(x[1] - 0.3), 2) / 0.02)', I=i, degree=3, a = (Expression('A*cos(pi*I*x[0])*cos(pi*I*x[1])', A=1 / i ** 2, I=i, degree=2, element=FiniteElement('Lagrange', ufl.triangle, 1)) for i in count()) rvs = (NormalRV(mu=0.5) for _ in count()) coeff_field = ParametricCoefficientField(a, rvs, a0=a0) # refinement loop # =============== theta_eta = 0.3 theta_zeta = 0.8 min_zeta = 1e-10 maxh = 1 / 10 theta_delta = 0.8 refinements = 1 for refinement in range(refinements): logger.info("*****************************") logger.info("REFINEMENT LOOP iteration %i", refinement + 1) logger.info("*****************************") # evaluate residual and projection error estimates # ================================================ mesh_markers_R, mesh_markers_P, new_multiindices = Marking.estimate_mark(w, coeff_field, f, theta_eta, theta_zeta, theta_delta, min_zeta, maxh) mesh_markers = mesh_markers_R.copy() mesh_markers.update(mesh_markers_P) Marking.refine(w, mesh_markers, new_multiindices.keys(), eval_poisson) # show refined meshes plot_meshes = False if plot_meshes: for mu, vec in w.iteritems(): plot(vec.basis.mesh, title=str(mu), interactive=False, axes=True) plot(vec._fefunc) interactive()