[23189] | 1 | #Test Name: SquareSheetHydrologyShakti
|
---|
[22267] | 2 | import numpy as np
|
---|
[25836] | 3 |
|
---|
| 4 | from frictionshakti import frictionshakti
|
---|
[26744] | 5 | from socket import gethostname
|
---|
[22267] | 6 | from model import *
|
---|
[25836] | 7 | from operator import itemgetter
|
---|
| 8 | from parameterize import parameterize
|
---|
| 9 | from setflowequation import setflowequation
|
---|
| 10 | from setmask import setmask
|
---|
| 11 | from solve import solve
|
---|
| 12 | from transient import transient
|
---|
| 13 | from triangle import triangle
|
---|
[22267] | 14 |
|
---|
[24313] | 15 | md = triangle(model(), '../Exp/Square.exp', 50000.)
|
---|
[22267] | 16 | md.mesh.x = md.mesh.x / 1000
|
---|
| 17 | md.mesh.y = md.mesh.y / 1000
|
---|
[24313] | 18 | md = setmask(md, '', '')
|
---|
| 19 | md = parameterize(md, '../Par/SquareSheetConstrained.py')
|
---|
[25836] | 20 | md.transient = transient.deactivateall(md.transient)
|
---|
[22267] | 21 | md.transient.ishydrology = 1
|
---|
[24313] | 22 | md = setflowequation(md, 'SSA', 'all')
|
---|
| 23 | md.cluster = generic('name', gethostname(), 'np', 2)
|
---|
[22267] | 24 |
|
---|
[25836] | 25 | #Use hydrology coupled friction law
|
---|
| 26 | md.friction = frictionshakti(md.friction)
|
---|
[22267] | 27 |
|
---|
[23189] | 28 | #Change hydrology class to Shakti' model
|
---|
| 29 | md.hydrology = hydrologyshakti()
|
---|
[22267] | 30 |
|
---|
| 31 | #Change geometry
|
---|
| 32 | md.geometry.base = -.02 * md.mesh.x + 20.
|
---|
[24313] | 33 | md.geometry.thickness = 300. * np.ones((md.mesh.numberofvertices, ))
|
---|
[22267] | 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
|
---|
[24313] | 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, ))
|
---|
[22267] | 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
|
---|
[24313] | 49 | md.initialization.vx = 1e-6 * md.constants.yts * np.ones((md.mesh.numberofvertices, ))
|
---|
| 50 | md.initialization.vy = np.zeros((md.mesh.numberofvertices, ))
|
---|
[22267] | 51 |
|
---|
| 52 | md.timestepping.time_step = 3. * 3600. / md.constants.yts
|
---|
| 53 | md.timestepping.final_time = .5 / 365.
|
---|
[24313] | 54 | md.materials.rheology_B = (5e-25)**(-1. / 3.) * np.ones((md.mesh.numberofvertices, ))
|
---|
[22267] | 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]
|
---|
[24313] | 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))
|
---|
[22267] | 70 |
|
---|
[24313] | 71 | md = solve(md, 'Transient')
|
---|
[22267] | 72 |
|
---|
| 73 | #Fields and tolerances to track changes
|
---|
[24313] | 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]
|
---|