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