def test_hybrid_prognostic_solve(): Lx, Ly = 20e3, 20e3 h0, dh = 500.0, 100.0 T = 254.15 u_in = 100.0 model = icepack.models.HybridModel() opts = {'dirichlet_ids': [1], 'side_wall_ids': [3, 4], 'tol': 1e-12} Nx, Ny = 32, 32 mesh2d = firedrake.RectangleMesh(Nx, Ny, Lx, Ly) mesh = firedrake.ExtrudedMesh(mesh2d, layers=1) V = firedrake.VectorFunctionSpace(mesh, dim=2, family='CG', degree=2, vfamily='GL', vdegree=1) Q = firedrake.FunctionSpace(mesh, family='CG', degree=2, vfamily='DG', vdegree=0) x, y, ζ = firedrake.SpatialCoordinate(mesh) height_above_flotation = 10.0 d = -ρ_I / ρ_W * (h0 - dh) + height_above_flotation ρ = ρ_I - ρ_W * d**2 / (h0 - dh)**2 Z = icepack.rate_factor(T) * (ρ * g * h0 / 4)**n q = 1 - (1 - (dh / h0) * (x / Lx))**(n + 1) ux = u_in + Z * q * Lx * (h0 / dh) / (n + 1) u0 = interpolate(firedrake.as_vector((ux, 0)), V) thickness = h0 - dh * x / Lx β = 1 / 2 α = β * ρ / ρ_I * dh / Lx h = interpolate(h0 - dh * x / Lx, Q) h_inflow = h.copy(deepcopy=True) ds = (1 + β) * ρ / ρ_I * dh s = interpolate(d + h0 - dh + ds * (1 - x / Lx), Q) b = interpolate(s - h, Q) C = interpolate(α * (ρ_I * g * thickness) * ux**(-1 / m), Q) A = firedrake.Constant(icepack.rate_factor(T)) final_time, dt = 1.0, 1.0 / 12 num_timesteps = int(final_time / dt) u = model.diagnostic_solve(u0=u0, h=h, s=s, C=C, A=A, **opts) a0 = firedrake.Constant(0) a = interpolate((model.prognostic_solve(dt, h0=h, a=a0, u=u) - h) / dt, Q) for k in range(num_timesteps): h = model.prognostic_solve(dt, h0=h, a=a, u=u, h_inflow=h_inflow) s = icepack.compute_surface(h=h, b=b) u = model.diagnostic_solve(u0=u, h=h, s=s, C=C, A=A, **opts) assert icepack.norm(h, norm_type='Linfty') < np.inf
def test_computing_surface(): N = 16 mesh = firedrake.RectangleMesh(N, N, Lx, Ly) degree = 2 Q = firedrake.FunctionSpace(mesh, "CG", degree) x, y = firedrake.SpatialCoordinate(mesh) h = interpolate(h0 - dh * x / Lx, Q) b0 = ρ_I / ρ_W * (dh / 2 - h0) b = interpolate(firedrake.Constant(b0), Q) s = icepack.compute_surface(thickness=h, bed=b) x0, y0 = Lx / 2, Ly / 2 assert abs(s((x0, y0)) - (1 - ρ_I / ρ_W) * h((x0, y0))) < 1e-8
opts = { 'dirichlet_ids': [1], 'side_wall_ids': [3, 4], 'diagnostic_solver_type': 'petsc', 'diagnostic_solver_parameters': { 'snes_type': 'newtontr', 'ksp_type': 'preonly', 'pc_type': 'lu', 'pc_factor_mat_solver_type': 'mumps' } } solver = icepack.solvers.FlowSolver(model, **opts) # Create the initial data h = h0.copy(deepcopy=True) s = icepack.compute_surface(thickness=h, bed=z_b) a = firedrake.interpolate(firedrake.Constant(0.3), Q) u = solver.diagnostic_solve( velocity=u0, thickness=h, surface=s, fluidity=A, friction=C ) # Run the simulation δt = args.timestep num_steps = int(args.time / δt) output_name = os.path.splitext(args.output)[0]
def test_hybrid_prognostic_solve(solver_type): Lx, Ly = 20e3, 20e3 h0, dh = 500.0, 100.0 T = 254.15 u_in = 100.0 model = icepack.models.HybridModel() opts = { 'dirichlet_ids': [1], 'side_wall_ids': [3, 4], 'prognostic_solver_type': solver_type } Nx, Ny = 32, 32 mesh2d = firedrake.RectangleMesh(Nx, Ny, Lx, Ly) mesh = firedrake.ExtrudedMesh(mesh2d, layers=1) V = firedrake.VectorFunctionSpace( mesh, 'CG', 2, vfamily='GL', vdegree=1, dim=2 ) Q = firedrake.FunctionSpace(mesh, 'CG', 2, vfamily='DG', vdegree=0) x, y, ζ = firedrake.SpatialCoordinate(mesh) height_above_flotation = 10.0 d = -ρ_I / ρ_W * (h0 - dh) + height_above_flotation ρ = ρ_I - ρ_W * d**2 / (h0 - dh)**2 Z = icepack.rate_factor(T) * (ρ * g * h0 / 4)**n q = 1 - (1 - (dh/h0) * (x/Lx))**(n + 1) ux = u_in + Z * q * Lx * (h0/dh) / (n + 1) u0 = interpolate(firedrake.as_vector((ux, 0)), V) thickness = h0 - dh * x / Lx β = 1/2 α = β * ρ / ρ_I * dh / Lx h = interpolate(h0 - dh * x / Lx, Q) h_inflow = h.copy(deepcopy=True) ds = (1 + β) * ρ / ρ_I * dh s = interpolate(d + h0 - dh + ds * (1 - x / Lx), Q) b = interpolate(s - h, Q) C = interpolate(α * (ρ_I * g * thickness) * ux**(-1/m), Q) A = firedrake.Constant(icepack.rate_factor(T)) final_time, dt = 1.0, 1.0/12 num_timesteps = int(final_time / dt) solver = icepack.solvers.FlowSolver(model, **opts) u = solver.diagnostic_solve( velocity=u0, thickness=h, surface=s, fluidity=A, friction=C ) a = firedrake.Function(Q) h_n = solver.prognostic_solve( dt, thickness=h, velocity=u, accumulation=a, thickness_inflow=h_inflow ) a.interpolate((h_n - h) / dt) for k in range(num_timesteps): h = solver.prognostic_solve( dt, thickness=h, velocity=u, accumulation=a, thickness_inflow=h_inflow ) s = icepack.compute_surface(thickness=h, bed=b) u = solver.diagnostic_solve( velocity=u, thickness=h, surface=s, fluidity=A, friction=C ) assert icepack.norm(h, norm_type='Linfty') < np.inf
def test_ice_stream_prognostic_solve(): Lx, Ly = 20e3, 20e3 h0, dh = 500.0, 100.0 T = 254.15 u0 = 100.0 model = icepack.models.IceStream() opts = {"dirichlet_ids": [1], "side_wall_ids": [3, 4]} N = 32 mesh = firedrake.RectangleMesh(N, N, Lx, Ly) V = firedrake.VectorFunctionSpace(mesh, "CG", 2) Q = firedrake.FunctionSpace(mesh, "CG", 2) solver = icepack.solvers.FlowSolver(model, **opts) x, y = firedrake.SpatialCoordinate(mesh) height_above_flotation = 10.0 d = -ρ_I / ρ_W * (h0 - dh) + height_above_flotation ρ = ρ_I - ρ_W * d**2 / (h0 - dh)**2 Z = icepack.rate_factor(T) * (ρ * g * h0 / 4)**n q = 1 - (1 - (dh / h0) * (x / Lx))**(n + 1) ux = u0 + Z * q * Lx * (h0 / dh) / (n + 1) u0 = interpolate(firedrake.as_vector((ux, 0)), V) thickness = h0 - dh * x / Lx β = 1 / 2 α = β * ρ / ρ_I * dh / Lx h = interpolate(h0 - dh * x / Lx, Q) h_inflow = h.copy(deepcopy=True) ds = (1 + β) * ρ / ρ_I * dh s = interpolate(d + h0 - dh + ds * (1 - x / Lx), Q) b = interpolate(s - h, Q) C = interpolate(α * (ρ_I * g * thickness) * ux**(-1 / m), Q) A = Constant(icepack.rate_factor(T)) final_time, dt = 1.0, 1.0 / 12 num_timesteps = int(final_time / dt) u = solver.diagnostic_solve( velocity=u0, thickness=h, surface=s, fluidity=A, friction=C, strain_rate_min=Constant(0.0), ) a = firedrake.Function(Q) h_n = solver.prognostic_solve(dt, thickness=h, velocity=u, accumulation=a, thickness_inflow=h_inflow) a.interpolate((h_n - h) / dt) for k in range(num_timesteps): h = solver.prognostic_solve(dt, thickness=h, velocity=u, accumulation=a, thickness_inflow=h_inflow) s = icepack.compute_surface(thickness=h, bed=b) u = solver.diagnostic_solve( velocity=u, thickness=h, surface=s, fluidity=A, friction=C, strain_rate_min=Constant(0.0), ) assert icepack.norm(h, norm_type="Linfty") < np.inf