1 | #Test Name: SquareSheetHydrologyShakti
|
---|
2 | from operator import itemgetter
|
---|
3 | import numpy as np
|
---|
4 | from model import *
|
---|
5 | from socket import gethostname
|
---|
6 | from triangle import *
|
---|
7 | from setmask import *
|
---|
8 | from parameterize import *
|
---|
9 | from setflowequation import *
|
---|
10 | from solve import *
|
---|
11 | from frictionshakti import *
|
---|
12 | from hydrologyshakti import *
|
---|
13 | from transient import *
|
---|
14 |
|
---|
15 | md = triangle(model(), '../Exp/Square.exp', 50000.)
|
---|
16 | md.mesh.x = md.mesh.x / 1000
|
---|
17 | md.mesh.y = md.mesh.y / 1000
|
---|
18 | md = setmask(md, '', '')
|
---|
19 | md = parameterize(md, '../Par/SquareSheetConstrained.py')
|
---|
20 | md.transient = transient().deactivateall()
|
---|
21 | md.transient.ishydrology = 1
|
---|
22 | md = setflowequation(md, 'SSA', 'all')
|
---|
23 | md.cluster = generic('name', gethostname(), 'np', 2)
|
---|
24 |
|
---|
25 | #Use hydroogy coupled friciton law
|
---|
26 | md.friction = frictionshakti(md)
|
---|
27 |
|
---|
28 | #Change hydrology class to Shakti' model
|
---|
29 | md.hydrology = hydrologyshakti()
|
---|
30 |
|
---|
31 | #Change geometry
|
---|
32 | md.geometry.base = -.02 * md.mesh.x + 20.
|
---|
33 | md.geometry.thickness = 300. * np.ones((md.mesh.numberofvertices, ))
|
---|
34 | md.geometry.bed = md.geometry.base
|
---|
35 | md.geometry.surface = md.geometry.bed + md.geometry.thickness
|
---|
36 |
|
---|
37 | #define the initial water head as being such that the water pressure is 50% of the ice overburden pressure
|
---|
38 | md.hydrology.head = 0.5 * md.materials.rho_ice / md.materials.rho_freshwater * md.geometry.thickness + md.geometry.base
|
---|
39 | md.hydrology.gap_height = 0.01 * np.ones((md.mesh.numberofelements, ))
|
---|
40 | md.hydrology.bump_spacing = 2 * np.ones((md.mesh.numberofelements, ))
|
---|
41 | md.hydrology.bump_height = 0.05 * np.ones((md.mesh.numberofelements, ))
|
---|
42 | md.hydrology.englacial_input = 0.5 * np.ones((md.mesh.numberofvertices, ))
|
---|
43 | md.hydrology.reynolds = 1000. * np.ones((md.mesh.numberofelements, ))
|
---|
44 | md.hydrology.spchead = float('NaN') * np.ones((md.mesh.numberofvertices, ))
|
---|
45 | pos = np.intersect1d(np.array(np.where(md.mesh.vertexonboundary)), np.array(np.where(md.mesh.x == 1000)))
|
---|
46 | md.hydrology.spchead[pos] = md.geometry.base[pos]
|
---|
47 |
|
---|
48 | #Define velocity
|
---|
49 | md.initialization.vx = 1e-6 * md.constants.yts * np.ones((md.mesh.numberofvertices, ))
|
---|
50 | md.initialization.vy = np.zeros((md.mesh.numberofvertices, ))
|
---|
51 |
|
---|
52 | md.timestepping.time_step = 3. * 3600. / md.constants.yts
|
---|
53 | md.timestepping.final_time = .5 / 365.
|
---|
54 | md.materials.rheology_B = (5e-25)**(-1. / 3.) * np.ones((md.mesh.numberofvertices, ))
|
---|
55 |
|
---|
56 | #Add one moulin and Neumann BC, varying in time
|
---|
57 | a = np.sqrt((md.mesh.x - 500.)**2 + (md.mesh.y - 500.)**2)
|
---|
58 | pos = min(enumerate(a), key=itemgetter(1))[0]
|
---|
59 | time = np.arange(0, md.timestepping.final_time + 1, md.timestepping.time_step)
|
---|
60 | md.hydrology.moulin_input = np.zeros((md.mesh.numberofvertices + 1, np.size(time)))
|
---|
61 | md.hydrology.moulin_input[-1, :] = time
|
---|
62 | md.hydrology.moulin_input[pos, :] = 5. * (1. - np.sin(2. * np.pi / (1. / 365.) * time))
|
---|
63 | md.hydrology.neumannflux = np.zeros((md.mesh.numberofelements + 1, np.size(time)))
|
---|
64 | md.hydrology.neumannflux[-1, :] = time
|
---|
65 | segx = md.mesh.x[md.mesh.segments[:, 0] - 1]
|
---|
66 | segy = md.mesh.y[md.mesh.segments[:, 0] - 1]
|
---|
67 | posA = np.intersect1d(np.intersect1d(np.array(np.where(segx < 1.)), np.array(np.where(segy > 400.))), np.array(np.where(segy < 600.)))
|
---|
68 | pos = (md.mesh.segments[posA] - 1)[:, 2]
|
---|
69 | md.hydrology.neumannflux[pos, :] = np.tile(0.05 * (1. - np.sin(2. * np.pi / (1. / 365.) * time)), (len(pos), 1))
|
---|
70 |
|
---|
71 | md = solve(md, 'Transient')
|
---|
72 |
|
---|
73 | #Fields and tolerances to track changes
|
---|
74 | field_names = ['HydrologyHead1', 'HydrologyGapHeight1',
|
---|
75 | 'HydrologyHead2', 'HydrologyGapHeight2',
|
---|
76 | 'HydrologyHead3', 'HydrologyGapHeight3',
|
---|
77 | 'HydrologyHead4', 'HydrologyGapHeight4']
|
---|
78 | field_tolerances = [1e-13, 1e-13,
|
---|
79 | 1e-13, 1e-13,
|
---|
80 | 1e-13, 1e-13,
|
---|
81 | 1e-13, 1e-12]
|
---|
82 | field_values = [md.results.TransientSolution[0].HydrologyHead,
|
---|
83 | md.results.TransientSolution[0].HydrologyGapHeight,
|
---|
84 | md.results.TransientSolution[1].HydrologyHead,
|
---|
85 | md.results.TransientSolution[1].HydrologyGapHeight,
|
---|
86 | md.results.TransientSolution[2].HydrologyHead,
|
---|
87 | md.results.TransientSolution[2].HydrologyGapHeight,
|
---|
88 | md.results.TransientSolution[3].HydrologyHead,
|
---|
89 | md.results.TransientSolution[3].HydrologyGapHeight]
|
---|