Пример #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
Пример #2
0
def velocity_monitor(mesh, alpha=alpha, beta=beta, gamma=gamma, K=kappa):
    P1 = FunctionSpace(mesh, "CG", 1)

    uv, elev = swp.fwd_solutions[0].split()
    horizontal_velocity = Function(elev.function_space()).project(uv[0])
    abs_horizontal_velocity = Function(elev.function_space()).project(abs(uv[0]))
    abs_hor_vel_norm = Function(elev.function_space()).project(abs_horizontal_velocity)

    uv_gradient = recovery.recover_gradient(horizontal_velocity)
    frob_uv_hess = Function(elev.function_space()).project(local_norm(uv_gradient))

    if max(abs(frob_uv_hess.dat.data[:])) < 1e-10:
        div_uv_star = Function(elev.function_space()).project(frob_uv_hess)
    else:
        div_uv_star = Function(elev.function_space()).project(frob_uv_hess/max(frob_uv_hess.dat.data[:]))

    if max(abs_horizontal_velocity.dat.data[:]) < 1e-10:
        abs_uv_star = Function(elev.function_space()).project(abs_hor_vel_norm)
    else:
        abs_uv_star = Function(elev.function_space()).project(abs_hor_vel_norm/max(abs_hor_vel_norm.dat.data[:]))

    comp = interpolate(conditional(beta*abs_uv_star > gamma*div_uv_star, beta*abs_uv_star, gamma*div_uv_star), elev.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(1.0 + alpha * 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
Пример #3
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
Пример #4
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