@@ -56,14 +56,14 @@ def __init__(
5656 self .z_max = z_max
5757 self .t_max = t_max
5858
59- self .qv = interp1d (
59+ self .qv0 = interp1d (
6060 (0 , 740 , 3260 ), (0.015 , 0.0138 , 0.0024 ), fill_value = "extrapolate"
6161 )
6262 self ._th = interp1d (
6363 (0 , 740 , 3260 ), (297.9 , 297.9 , 312.66 ), fill_value = "extrapolate"
6464 )
6565
66- self .thd = lambda z : formulae .th_dry (self ._th (z ), self . qv ( z ) )
66+ self .thd = lambda z , qv : formulae .th_dry (self ._th (z ), qv )
6767
6868 z_points = np .arange (0 , self .z_max + self .dz / 2 , self .dz / 2 )
6969
@@ -104,7 +104,7 @@ def z2exner(z, return_rho=False, return_press=False, return_temp=False):
104104 return exner
105105
106106 self .temp = lambda z : z2exner (zpos (z ), return_temp = True )
107- self .press = lambda z : z2exner (zpos (z ), return_press = True )
107+ self .press = lambda z , qv : z2exner (zpos (z ), return_press = True )
108108 self .rhod = lambda z : z2exner (zpos (z ), return_rho = True )
109109 if is_exner_novapour_uniformrho :
110110 rhod0 = 1.0 * np .ones_like (z_points ) # [kg / m^3]
@@ -114,30 +114,31 @@ def z2exner(z, return_rho=False, return_press=False, return_temp=False):
114114 # note: not in the paper,
115115 # https://github.com/BShipway/KiD/tree/master/src/physconst.f90#L43
116116 def drhod_dz (z , rhod ):
117- T = formulae .temperature (rhod [0 ], self .thd (z ))
118- p = formulae .pressure (rhod [0 ], T , self .qv (z ))
119- drhod_dz = formulae .drho_dz (const .g , p , T , self .qv (z ), const .lv )
117+ T = formulae .temperature (rhod [0 ], self .thd (z , self . qv0 ( z ) ))
118+ p = formulae .pressure (rhod [0 ], T , self .qv0 (z ))
119+ drhod_dz = formulae .drho_dz (const .g , p , T , self .qv0 (z ), const .lv )
120120 if not is_approx_drhod_dz : # to resolve issue #335
121- qv = self .qv (z )
122- dqv_dz = Derivative (self .qv )(z )
121+ qv = self .qv0 (z )
122+ dqv_dz = Derivative (self .qv0 )(z )
123123 drhod_dz = drhod_dz / (1 + qv ) - rhod * dqv_dz / (1 + qv ) ** 2
124124 return drhod_dz
125125
126- rhod0 = formulae .rho_d (p_surf , self .qv (0 ), self ._th (0 ))
126+ rhod0 = formulae .rho_d (p_surf , self .qv0 (0 ), self ._th (0 ))
127127 rhod_solution = solve_ivp (
128128 fun = drhod_dz ,
129129 t_span = (0 , self .z_max ),
130130 y0 = np .asarray ((rhod0 ,)),
131131 t_eval = z_points ,
132+ max_step = self .dz / 2 ,
132133 )
133134 assert rhod_solution .success
134135
135136 self .rhod = lambda z : interp1d (z_points , rhod_solution .y [0 ])(zpos (z ))
136137 self .temp = lambda z : formulae .temperature (
137- self .rhod (zpos (z )), self .thd (zpos (z ))
138+ self .rhod (zpos (z )), self .thd (zpos (z ), self . qv0 ( zpos ( z )) )
138139 )
139- self .press = lambda z : formulae .pressure (
140- self .rhod (zpos (z )), self .temp (zpos (z )), self . qv ( zpos ( z ))
140+ self .press = lambda z , qv : formulae .pressure (
141+ self .rhod (zpos (z )), self .temp (zpos (z )), qv
141142 )
142143
143144 rhod_w_const = wmax_const * si .m / si .s * si .kg / si .m ** 3
@@ -147,6 +148,7 @@ def drhod_dz(z, rhod):
147148 )
148149
149150 self .nz_vec = arakawa_c .z_vector_coord ((self .nz ,))
151+ self .press0 = lambda z : self .press (z , self .qv0 (zpos (z )))
150152
151153 @property
152154 def nz (self ):
0 commit comments