def advance_parcel_vars(self): dt = self.core.dt qv = self['qv'][0] T = self['T'][0] p = self['p'][0] t = self['t'][0] rho = p / phys.R(qv) / T pd = p * (1 - 1 / (1 + const.eps / qv)) # mid-point value for w dz_dt = self.w(t + dt / 2) # Explicit Euler for p,T (predictor step assuming dq=0) dp_dt = -rho * const.g * dz_dt dpd_dt = dp_dt # dq=0 dT_dt = dp_dt / rho / phys.c_p(qv) self._tmp['t'][:] += dt self._tmp['z'][:] += dt * dz_dt self._tmp['rhod'][:] += dt * (dpd_dt / const.Rd / T + -dT_dt * pd / const.Rd / T**2) rhod_mean = (self._tmp['rhod'][0] + self["rhod"][0]) / 2 self.mesh.dv = self.mass_of_dry_air / rhod_mean
def rhod(self, zZ): Z = self.size[1] z = zZ * Z # :) # hydrostatic profile kappa = const.Rd / const.c_pd arg = np.power( self.p0 / const.p1000, kappa) - z * kappa * const.g / self.th_std0 / phys.R(self.qv0) p = const.p1000 * np.power(arg, 1 / kappa) # density using "dry" potential temp. pd = p * (1 - self.qv0 / (self.qv0 + const.eps)) rhod = pd / (np.power(p / const.p1000, kappa) * const.Rd * self.th_std0) return rhod