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
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()
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
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