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