source: issm/trunk/examples/shakti/runme.py@ 25836

Last change on this file since 25836 was 25836, checked in by Mathieu Morlighem, 4 years ago

merged trunk-jpl and trunk for revision 25834

File size: 3.6 KB
Line 
1import numpy as np
2from model import *
3from solve import solve
4from hydrologyshakti import hydrologyshakti
5from parameterize import parameterize
6from export_netCDF import export_netCDF
7from transient import transient
8from setmask import setmask
9from triangle import triangle
10
11
12steps = [1, 2, 3]
13
14if 1 in steps:
15 print(' Step 1: Mesh')
16 #Generate unstructured mesh on 1, 000 m square with typical element edge length of 20 m
17 md = triangle(model(), './outline.exp', 20)
18 export_netCDF(md, 'MoulinMesh.nc')
19
20
21if 2 in steps:
22 print(' Step 2: Parameterization')
23 md = loadmodel('MoulinMesh.nc')
24 md = setmask(md, '', '')
25
26 # Run parameterization script to set up geometry, velocity, material properties, etc.
27 md = parameterize(md, 'moulin.py')
28
29 # HYDROLOGY SPECIFIC PARAMETERIZATION:
30 # Change hydrology class to Sommers' SHaKTI model
31 md.hydrology = hydrologyshakti()
32
33 # Define initial water head such that water pressure is 50% of ice overburden pressure
34 md.hydrology.head = 0.5 * md.materials.rho_ice / md.materials.rho_freshwater * md.geometry.thickness + md.geometry.base
35
36 # Initial subglacial gap height of 0.01m everywhere
37 md.hydrology.gap_height = 0.01 * np.ones(md.mesh.numberofelements)
38
39 # Typical bed bump bump spacing (2m)
40 md.hydrology.bump_spacing = 2 * np.ones(md.mesh.numberofelements)
41
42 # Typical bed bump height (0.1m)
43 md.hydrology.bump_height = 0.1 * np.ones(md.mesh.numberofelements)
44
45 # Define distributed englacial input to the subglacial system (m / yr)
46 # Change the value 0.0 to add distributed input
47 md.hydrology.englacial_input = 0.0 * np.ones(md.mesh.numberofvertices)
48
49 # Initial Reynolds number (start at Re = 1000 everywhere)
50 md.hydrology.reynolds = 1000. * np.ones(md.mesh.numberofelements)
51
52 # Set up atmospheric pressure Type I boundary condition at left edge of
53 # domain (outflow, i.e. h = zb at x = xmin)
54 md.hydrology.spchead = np.nan * np.ones(md.mesh.numberofvertices)
55 pos = np.where(np.logical_and(md.mesh.vertexonboundary, md.mesh.x == np.nanmin(md.mesh.x)))
56 md.hydrology.spchead[pos] = md.geometry.base[pos]
57
58 export_netCDF(md, 'MoulinParam.nc')
59
60if 3 in steps:
61 print(' Step 3: Solve!')
62 md = loadmodel('MoulinParam.nc')
63
64 md.transient = transient.deactivateall(md.transient)
65 md.transient.ishydrology = 1
66
67 # Specify that you want to run the model on your current computer
68 # Change the number of processors according to your machine (here np = 4)
69 md.cluster = generic('np', 2)
70
71 # Define the time stepping scheme: run for 90 days with a time step of 1 hr
72 md.timestepping.time_step = 3600. / md.constants.yts # Time step (in years)
73 md.timestepping.final_time = 30. / 365.
74
75 #Add one moulin with steady input at x = 500, y = 500
76 DistToCenter = np.sqrt((md.mesh.x - 500)**2 + (md.mesh.y - 500)**2)
77 loc = np.where(np.nanmin(DistToCenter) == DistToCenter)
78 time = np.arange(0, md.timestepping.final_time + md.timestepping.time_step, md.timestepping.time_step)
79 md.hydrology.moulin_input = np.zeros((md.mesh.numberofvertices, len(time)))
80 md.hydrology.moulin_input = np.vstack((md.hydrology.moulin_input, time))
81 md.hydrology.moulin_input[loc, :] = 4
82
83 # Specify no - flux Type 2 boundary conditions on all edges (except
84 # the Type 1 condition set at the outflow above)
85 md.hydrology.neumannflux = np.zeros((md.mesh.numberofelements, len(time)))
86 md.hydrology.neumannflux = np.vstack((md.hydrology.neumannflux, time))
87
88 md.verbose.solution = 1
89 md = solve(md, 'Transient')
90
91 export_netCDF(md, 'MoulinTransient.nc')
Note: See TracBrowser for help on using the repository browser.