示例#1
0
文件: yppm.py 项目: twicki/fv3core
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)
示例#2
0
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
示例#4
0
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
示例#5
0
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)
示例#6
0
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
示例#7
0
文件: yppm.py 项目: twicki/fv3core
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)
示例#8
0
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
示例#9
0
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)
示例#10
0
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
示例#11
0
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)