Esempio n. 1
0
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()