def blbr_jord8(q: sd, al: sd, bl: sd, br: sd, dm: sd): with computation(PARALLEL), interval(...): xt = 2.0 * dm aldiff = al - q aldiffj = al[0, 1, 0] - q bl = -1.0 * sign(min(abs(xt), abs(aldiff)), xt) br = sign(min(abs(xt), abs(aldiffj)), xt)
def compute_pkz_tempadjust( delp: sd, delz: sd, cappa: sd, heat_source: sd, delt: sd, pt: sd, pkz: sd ): with computation(PARALLEL), interval(...): pkz = exp(cappa / (1.0 - cappa) * log(constants.RDG * delp / delz * pt)) pkz = (constants.RDG * delp / delz * pt) ** (cappa / (1.0 - cappa)) dtmp = heat_source / (constants.CV_AIR * delp) deltmin = sign(min(delt, abs(dtmp)), dtmp) pt = pt + deltmin / pkz
def compute_pkz_tempadjust( delp: FloatField, delz: FloatField, cappa: FloatField, heat_source: FloatField, pt: FloatField, pkz: FloatField, delt_time_factor: float, ): """ Adjust air temperature from heating due to vorticity damping. Heating is limited by deltmax times the length of a timestep, with the highest levels limited further. Args: delp: Pressure thickness of atmosphere layers (in) delz: Vertical thickness of atmosphere layers (in) cappa: Power to raise pressure to (in) heat_source: heat source from vorticity damping implied by energy conservation (in) pt: Air potential temperature (inout) pkz: Layer mean pressure raised to the power of Kappa (in) delta_time_factor: scaled time step (in) """ with computation(PARALLEL), interval(...): pkz = exp(cappa / (1.0 - cappa) * log(constants.RDG * delp / delz * pt)) pkz = (constants.RDG * delp / delz * pt)**(cappa / (1.0 - cappa)) dtmp = heat_source / (constants.CV_AIR * delp) with computation(PARALLEL): with interval(0, 1): deltmin = sign(min(delt_time_factor * 0.1, abs(dtmp)), dtmp) pt = pt + deltmin / pkz with interval(1, 2): deltmin = sign(min(delt_time_factor * 0.5, abs(dtmp)), dtmp) pt = pt + deltmin / pkz with interval(2, None): deltmin = sign(min(delt_time_factor, abs(dtmp)), dtmp) pt = pt + deltmin / pkz
def blbr_iord8(q: FloatField, al: FloatField, dm: FloatField): xt = 2.0 * dm bl = -1.0 * sign(min(abs(xt), abs(al - q)), xt) br = sign(min(abs(xt), abs(al[1, 0, 0] - q)), xt) return bl, br
def dm_iord8plus(q: FloatField): xt = 0.25 * (q[1, 0, 0] - q[-1, 0, 0]) dqr = max(max(q, q[-1, 0, 0]), q[1, 0, 0]) - q dql = q - min(min(q, q[-1, 0, 0]), q[1, 0, 0]) return sign(min(min(abs(xt), dqr), dql), xt)
def bl_br_edges(bl, br, q, dxa, al, dm): from __externals__ import i_end, i_start # TODO(eddied): This temporary prevents race conditions in regions al_ip1 = al[1, 0, 0] with horizontal(region[i_start - 1, :]): # TODO(rheag) when possible # dm_left = dm_iord8plus(q[-1, 0, 0]) xt = 0.25 * (q - q[-2, 0, 0]) dqr = max(max(q[-1, 0, 0], q[-2, 0, 0]), q) - q[-1, 0, 0] dql = q[-1, 0, 0] - min(min(q[-1, 0, 0], q[-2, 0, 0]), q) dm_left = sign(min(min(abs(xt), dqr), dql), xt) xt_bl = ppm.s14 * dm_left + ppm.s11 * (q[-1, 0, 0] - q) + q xt_br = xt_dxa_edge_0(q, dxa) with horizontal(region[i_start, :]): # TODO(rheag) when possible # dm_right = dm_iord8plus(q[1, 0, 0]) xt = 0.25 * (q[2, 0, 0] - q) dqr = max(max(q[1, 0, 0], q), q[2, 0, 0]) - q[1, 0, 0] dql = q[1, 0, 0] - min(min(q[1, 0, 0], q), q[2, 0, 0]) dm_right = sign(min(min(abs(xt), dqr), dql), xt) xt_bl = ppm.s14 * dm_left + ppm.s11 * (q[-1, 0, 0] - q) + q xt_bl = xt_dxa_edge_1(q, dxa) xt_br = ppm.s15 * q + ppm.s11 * q[1, 0, 0] - ppm.s14 * dm_right with horizontal(region[i_start + 1, :]): xt_bl = ppm.s15 * q[-1, 0, 0] + ppm.s11 * q - ppm.s14 * dm xt_br = al_ip1 with horizontal(region[i_end - 1, :]): xt_bl = al xt_br = ppm.s15 * q[1, 0, 0] + ppm.s11 * q + ppm.s14 * dm with horizontal(region[i_end, :]): # TODO(rheag) when possible # dm_left_end = dm_iord8plus(q[-1, 0, 0]) xt = 0.25 * (q - q[-2, 0, 0]) dqr = max(max(q[-1, 0, 0], q[-2, 0, 0]), q) - q[-1, 0, 0] dql = q[-1, 0, 0] - min(min(q[-1, 0, 0], q[-2, 0, 0]), q) dm_left_end = sign(min(min(abs(xt), dqr), dql), xt) xt_bl = ppm.s15 * q + ppm.s11 * q[-1, 0, 0] + ppm.s14 * dm_left_end xt_br = xt_dxa_edge_0(q, dxa) with horizontal(region[i_end + 1, :]): # TODO(rheag) when possible # dm_right_end = dm_iord8plus(q[1, 0, 0]) xt = 0.25 * (q[2, 0, 0] - q) dqr = max(max(q[1, 0, 0], q), q[2, 0, 0]) - q[1, 0, 0] dql = q[1, 0, 0] - min(min(q[1, 0, 0], q), q[2, 0, 0]) dm_right_end = sign(min(min(abs(xt), dqr), dql), xt) xt_bl = xt_dxa_edge_1(q, dxa) xt_br = ppm.s11 * (q[1, 0, 0] - q) - ppm.s14 * dm_right_end + q with horizontal(region[i_start - 1:i_start + 2, :], region[i_end - 1:i_end + 2, :]): bl = xt_bl - q br = xt_br - q return bl, br
def dm_jord8plus(q: sd, al: sd, dm: sd): with computation(PARALLEL), interval(...): xt = 0.25 * (q[0, 1, 0] - q[0, -1, 0]) dqr = max(max(q, q[0, -1, 0]), q[0, 1, 0]) - q dql = q - min(min(q, q[0, -1, 0]), q[0, 1, 0]) dm = sign(min(min(abs(xt), dqr), dql), xt)
def blbr_jord8(q: FloatField, al: FloatField, dm: FloatField): yt = 2.0 * dm bl = -1.0 * sign(min(abs(yt), abs(al - q)), yt) br = sign(min(abs(yt), abs(al[0, 1, 0] - q)), yt) return bl, br
def dm_jord8plus(q: FloatField): yt = 0.25 * (q[0, 1, 0] - q[0, -1, 0]) dqr = max(max(q, q[0, -1, 0]), q[0, 1, 0]) - q dql = q - min(min(q, q[0, -1, 0]), q[0, 1, 0]) return sign(min(min(abs(yt), dqr), dql), yt)
def bl_br_edges(bl, br, q, dya, al, dm): from __externals__ import j_end, j_start # TODO(eddied): This temporary prevents race conditions in regions al_ip1 = al[0, 1, 0] with horizontal(region[:, j_start - 1]): # TODO(rheag) when possible # dm_left = dm_jord8plus(q[0, -1, 0]) yt = 0.25 * (q - q[0, -2, 0]) dqr = max(max(q[0, -1, 0], q[0, -2, 0]), q) - q[0, -1, 0] dql = q[0, -1, 0] - min(min(q[0, -1, 0], q[0, -2, 0]), q) dm_left = sign(min(min(abs(yt), dqr), dql), yt) yt_bl = ppm.s14 * dm_left + ppm.s11 * (q[0, -1, 0] - q) + q yt_br = yt_dya_edge_0(q, dya) with horizontal(region[:, j_start]): # TODO(rheag) when possible # dm_right = dm_jord8plus(q[0, 1, 0]) yt = 0.25 * (q[0, 2, 0] - q) dqr = max(max(q[0, 1, 0], q), q[0, 2, 0]) - q[0, 1, 0] dql = q[0, 1, 0] - min(min(q[0, 1, 0], q), q[0, 2, 0]) dm_right = sign(min(min(abs(yt), dqr), dql), yt) yt_bl = ppm.s14 * dm_left + ppm.s11 * (q[0, -1, 0] - q) + q yt_bl = yt_dya_edge_1(q, dya) yt_br = ppm.s15 * q + ppm.s11 * q[0, 1, 0] - ppm.s14 * dm_right with horizontal(region[:, j_start + 1]): yt_bl = ppm.s15 * q[0, -1, 0] + ppm.s11 * q - ppm.s14 * dm yt_br = al_ip1 with horizontal(region[:, j_end - 1]): yt_bl = al yt_br = ppm.s15 * q[0, 1, 0] + ppm.s11 * q + ppm.s14 * dm with horizontal(region[:, j_end]): # TODO(rheag) when possible # dm_left_end = dm_jord8plus(q[0, -1, 0]) yt = 0.25 * (q - q[0, -2, 0]) dqr = max(max(q[0, -1, 0], q[0, -2, 0]), q) - q[0, -1, 0] dql = q[0, -1, 0] - min(min(q[0, -1, 0], q[0, -2, 0]), q) dm_left_end = sign(min(min(abs(yt), dqr), dql), yt) yt_bl = ppm.s15 * q + ppm.s11 * q[0, -1, 0] + ppm.s14 * dm_left_end yt_br = yt_dya_edge_0(q, dya) with horizontal(region[:, j_end + 1]): # TODO(rheag) when possible # dm_right_end = dm_jord8plus(q[0, 1, 0]) yt = 0.25 * (q[0, 2, 0] - q) dqr = max(max(q[0, 1, 0], q), q[0, 2, 0]) - q[0, 1, 0] dql = q[0, 1, 0] - min(min(q[0, 1, 0], q), q[0, 2, 0]) dm_right_end = sign(min(min(abs(yt), dqr), dql), yt) yt_bl = yt_dya_edge_1(q, dya) yt_br = ppm.s11 * (q[0, 1, 0] - q) - ppm.s14 * dm_right_end + q with horizontal(region[:, j_start - 1:j_start + 2], region[:, j_end - 1:j_end + 2]): bl = yt_bl - q br = yt_br - q return bl, br
def blbr_iord8(q: sd, al: sd, bl: sd, br: sd, dm: sd): with computation(PARALLEL), interval(...): # al, dm = al_iord8plus_fn(q, al, dm, r3) xt = 2.0 * dm bl = -1.0 * sign(min(abs(xt), abs(al - q)), xt) br = sign(min(abs(xt), abs(al[1, 0, 0] - q)), xt)