source: issm/trunk-jpl/src/m/materials/cuffey.py@ 26358

Last change on this file since 26358 was 26358, checked in by jdquinn, 4 years ago

CHG: Completed MATLAB -> Python updates for SE; archive updates now that GMSH can be used on macOS and Linux; various minor bug fixes; formatting; cleanup

File size: 3.5 KB
RevLine 
[21303]1import numpy as np
[17455]2
[24213]3
[17455]4def cuffey(temperature):
[26358]5 """CUFFEY - calculates ice rigidity as a function of temperature
[17455]6
[26358]7 rigidity (in s^(1/3)Pa) is the flow law parameter in the flow law
8 sigma = B * e(1/3) (Cuffey and Paterson, p75).
[17455]9
[26358]10 temperature is in Kelvin degrees
11
12 Usage:
13 rigidity = cuffey(temperature)
[24213]14 """
[23633]15
[26358]16 if np.any(temperature < 0.0):
17 raise RuntimeError('input temperature should be in Kelvin (positive)')
[17455]18
[24213]19 if np.ndim(temperature) == 2:
[24256]20 #T = temperature.reshape(-1, ) - 273.15
[24213]21 T = temperature.flatten() - 273.15
22 elif isinstance(temperature, float) or isinstance(temperature, int):
23 T = np.array([temperature]) - 273.15
24 else:
25 T = temperature - 273.15
[23633]26
[24213]27 rigidity = np.zeros_like(T)
[24260]28 pos = np.nonzero(T <= -45)
[24213]29 if len(pos):
[26358]30 rigidity[pos] = pow(10, 8) * (-0.000396645116301 * (T[pos] + 50)**3 + 0.013345579471334 * (T[pos] + 50)**2 - 0.356868703259105 * (T[pos] + 50) + 7.272363035371383)
[24256]31 pos = np.nonzero(np.logical_and(-45 <= T, T < -40))
[24213]32 if len(pos):
[26358]33 rigidity[pos] = pow(10, 8) * (-0.000396645116301 * (T[pos] + 45)**3 + 0.007395902726819 * (T[pos] + 45)**2 - 0.253161292268336 * (T[pos] + 45) + 5.772078366321591)
[24256]34 pos = np.nonzero(np.logical_and(-40 <= T, T < -35))
[24213]35 if len(pos):
[26358]36 rigidity[pos] = pow(10, 8) * (0.000408322072669 * (T[pos] + 40)**3 + 0.001446225982305 * (T[pos] + 40)**2 - 0.208950648722716 * (T[pos] + 40) + 4.641588833612773)
[24256]37 pos = np.nonzero(np.logical_and(-35 <= T, T < -30))
[24213]38 if len(pos):
[26358]39 rigidity[pos] = pow(10, 8) * (-0.000423888728124 * (T[pos] + 35)**3 + 0.007571057072334 * (T[pos] + 35)**2 - 0.163864233449525 * (T[pos] + 35) + 3.684031498640382)
[24256]40 pos = np.nonzero(np.logical_and(-30 <= T, T < -25))
[24213]41 if len(pos):
[26358]42 rigidity[pos] = pow(10, 8) * (0.000147154327025 * (T[pos] + 30)**3 + 0.001212726150476 * (T[pos] + 30)**2 - 0.119945317335478 * (T[pos] + 30) + 3.001000667185614)
[24256]43 pos = np.nonzero(np.logical_and(-25 <= T, T < -20))
[24213]44 if len(pos):
[26358]45 rigidity[pos] = pow(10, 8) * (-0.000193435838672 * (T[pos] + 25)**3 + 0.003420041055847 * (T[pos] + 25)**2 - 0.096781481303861 * (T[pos] + 25) + 2.449986525148220)
[24256]46 pos = np.nonzero(np.logical_and(-20 <= T, T < -15))
[24213]47 if len(pos):
[26358]48 rigidity[pos] = pow(10, 8) * (0.000219771255067 * (T[pos] + 20)**3 + 0.000518503475772 * (T[pos] + 20)**2 - 0.077088758645767 * (T[pos] + 20) + 2.027400665191131)
[24256]49 pos = np.nonzero(np.logical_and(-15 <= T, T < -10))
[24213]50 if len(pos):
[26358]51 rigidity[pos] = pow(10, 8) * (-0.000653438900191 * (T[pos] + 15)**3 + 0.003815072301777 * (T[pos] + 15)**2 - 0.055420879758021 * (T[pos] + 15) + 1.682390865739973)
[24256]52 pos = np.nonzero(np.logical_and(-10 <= T, T < -5))
[24213]53 if len(pos):
[26358]54 rigidity[pos] = pow(10, 8) * (0.000692439419762 * (T[pos] + 10)**3 - 0.005986511201093 * (T[pos] + 10)**2 - 0.066278074254598 * (T[pos] + 10) + 1.418983411970382)
[24256]55 pos = np.nonzero(np.logical_and(-5 <= T, T < -2))
[24213]56 if len(pos):
[26358]57 rigidity[pos] = pow(10, 8) * (-0.000132282004110 * (T[pos] + 5)**3 + 0.004400080095332 * (T[pos] + 5)**2 - 0.074210229783403 * (T[pos] + 5) + 1.024485188140279)
[24256]58 pos = np.nonzero(-2 <= T)
[24213]59 if len(pos):
[26358]60 rigidity[pos] = pow(10, 8) * (-0.000132282004110 * (T[pos] + 2)**3 + 0.003209542058346 * (T[pos] + 2)**2 - 0.051381363322371 * (T[pos] + 2) + 0.837883605537096)
[23633]61
[26358]62 # Now make sure that rigidity is positive
[24213]63 pos = np.nonzero(rigidity < 0)
[26358]64 rigidity[pos] = pow(1, 6)
[17455]65
[24213]66 return rigidity
Note: See TracBrowser for help on using the repository browser.