Esempio n. 1
0
def gradient_interface_monitor(mesh, alpha=alpha, beta=beta, gamma=gamma):
    """
    Monitor function focused around the steep_gradient (budd acta numerica)

    NOTE: Defined on the *computational* mesh.
    """
    P1 = FunctionSpace(mesh, "CG", 1)

    b = swp.fwd_solutions_bathymetry[0]
    bath_gradient = recovery.recover_gradient(b)
    bath_hess = recovery.recover_hessian(b, op=op)
    frob_bath_hess = Function(b.function_space()).project(
        local_frobenius_norm(bath_hess))
    frob_bath_norm = Function(b.function_space()).project(
        frob_bath_hess / max(frob_bath_hess.dat.data[:]))
    l2_bath_grad = Function(b.function_space()).project(
        local_norm(bath_gradient))
    bath_dx_l2_norm = Function(b.function_space()).interpolate(
        l2_bath_grad / max(l2_bath_grad.dat.data[:]))

    comp = interpolate(
        conditional(
            alpha * beta * bath_dx_l2_norm > alpha * gamma * frob_bath_norm,
            alpha * beta * bath_dx_l2_norm, alpha * gamma * frob_bath_norm),
        b.function_space())
    comp_new = project(comp, P1)
    comp_new2 = interpolate(
        conditional(comp_new > Constant(0.0), comp_new, Constant(0.0)), P1)
    mon_init = project(Constant(1.0) + comp_new2, P1)

    return mon_init
Esempio n. 2
0
def frobenius_monitor(mesh, x=None):  # NOQA: Version above not smooth enough
    """
    Frobenius norm taken element-wise.
    """
    P1 = FunctionSpace(mesh, "CG", 1)
    b = swp.fwd_solutions_bathymetry[0]
    P0 = FunctionSpace(b.function_space().mesh(), "DG", 0)
    H = recovery.recover_hessian(b, op=op)
    frob = interpolate(local_frobenius_norm(H), P0)
    return 1 + alpha_const*project(frob, P1)/frob.vector().gather().max()
 def frobenius(mesh=None, x=None):
     """
     Adapt to the Frobenius norm of an L1-normalised
     Hessian metric for the sensor.
     """
     P1 = FunctionSpace(mesh, "CG", 1)
     M = steady_metric(sensor(mesh, xy=x),
                       mesh=mesh,
                       op=op,
                       **hessian_kwargs)
     M_F = local_frobenius_norm(M, space=P1)
     return 1.0 + alpha * M_F / interpolate(M_F, P1).vector().gather().max()
Esempio n. 4
0
def gradient_interface_monitor(mesh,
                               mod=mod,
                               beta_mod=beta_mod,
                               alpha=alpha,
                               beta=beta,
                               gamma=gamma,
                               x=None):
    """
    Monitor function focused around the steep_gradient (budd acta numerica)

    NOTE: Defined on the *computational* mesh.

    """
    P1 = FunctionSpace(mesh, "CG", 1)

    eta = swp.fwd_solutions[0].split()[1]
    b = swp.fwd_solutions_bathymetry[0]

    bath_gradient = recovery.recover_gradient(b)
    bath_hess = recovery.recover_hessian(b, op=op)

    frob_bath_hess = Function(b.function_space()).project(
        local_frobenius_norm(bath_hess))

    if max(abs(frob_bath_hess.dat.data[:])) < 1e-10:
        frob_bath_norm = Function(b.function_space()).project(frob_bath_hess)
    else:
        frob_bath_norm = Function(b.function_space()).project(
            frob_bath_hess / max(frob_bath_hess.dat.data[:]))

    current_mesh = b.function_space().mesh()
    l2_bath_grad = Function(b.function_space()).project(
        abs(local_norm(bath_gradient)))

    bath_dx_l2_norm = Function(b.function_space()).interpolate(
        l2_bath_grad / max(l2_bath_grad.dat.data[:]))

    alpha_mod = alpha * mod
    #beta_mod = 5
    elev_abs_norm = Function(eta.function_space()).interpolate(
        alpha_mod * pow(cosh(beta_mod * (eta + b)), -2))

    comp_int = conditional(
        alpha * beta * bath_dx_l2_norm > alpha * gamma * frob_bath_norm,
        alpha * beta * bath_dx_l2_norm, alpha * gamma * frob_bath_norm)
    comp = interpolate(comp_int + elev_abs_norm, b.function_space())
    comp_new = project(comp, P1)
    comp_new2 = interpolate(
        conditional(comp_new > Constant(0.0), comp_new, Constant(0.0)), P1)
    mon_init = project(Constant(1.0) + comp_new2, P1)

    return mon_init
Esempio n. 5
0
def gradient_interface_monitor(mesh,
                               alpha=alpha,
                               beta=beta,
                               gamma=gamma,
                               K=kappa):
    """
    Monitor function focused around the steep_gradient (budd acta numerica)

    NOTE: Defined on the *computational* mesh.

    """
    P1 = FunctionSpace(mesh, "CG", 1)

    b = swp.fwd_solutions_bathymetry[0]
    bath_gradient = recovery.recover_gradient(b)
    bath_hess = recovery.recover_hessian(b, op=op)
    frob_bath_hess = Function(b.function_space()).project(
        local_frobenius_norm(bath_hess))

    if max(abs(frob_bath_hess.dat.data[:])) < 1e-10:
        frob_bath_norm = Function(b.function_space()).project(frob_bath_hess)
    else:
        frob_bath_norm = Function(b.function_space()).project(
            frob_bath_hess / max(frob_bath_hess.dat.data[:]))

    l2_bath_grad = Function(b.function_space()).project(
        abs(local_norm(bath_gradient)))

    bath_dx_l2_norm = Function(b.function_space()).interpolate(
        l2_bath_grad / max(l2_bath_grad.dat.data[:]))
    comp = interpolate(
        conditional(
            alpha * beta * bath_dx_l2_norm > alpha * gamma * frob_bath_norm,
            alpha * beta * bath_dx_l2_norm, alpha * gamma * frob_bath_norm),
        b.function_space())
    comp_new = project(comp, P1)
    comp_new2 = interpolate(
        conditional(comp_new > Constant(0.0), comp_new, Constant(0.0)), P1)
    mon_init = project(Constant(1.0) + comp_new2, P1)

    H = Function(P1)
    tau = TestFunction(P1)

    a = (inner(tau, H) * dx) + (K * inner(tau.dx(1), H.dx(1)) *
                                dx) - inner(tau, mon_init) * dx
    solve(a == 0, H)

    return H