Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

alternative implementation of updating water discharge #135

Open
amoodie opened this issue Feb 9, 2021 · 0 comments
Open

alternative implementation of updating water discharge #135

amoodie opened this issue Feb 9, 2021 · 0 comments
Labels
enhancement New feature or request use case example

Comments

@amoodie
Copy link
Member

amoodie commented Feb 9, 2021

I began work on an alternative implementation for the water discharge updating. My thought was that it would be helpful to have the flexibility to only update water discharge at the end of water routing. This would enable particles that were unsatisfactory to be re-routed, without having to mess with un-doing their impact on the water discharge array. I think that this approach of rerouting might be useful for the ocassional issue where 1) the delta digs itself a hole, 2) no new water parcels reach the domain edge, 3) thus no new parcels are counted in the free surface, 4) the free surface decays to the sea level, 5) everything blows up.

Ultimately, I decided not to pursue this any further, but I wanted to record some of my efforts, and have made a branch that begins to implement this ability, in case we want to go down that road in the future. HERE is a link to the feature branch.

image

@njit
def _accumulate_Qs(free_surf_walk_inds, directions, cell_type,
                   Qp_water, dx, iwalk_flat, jwalk_flat):
    """Update discharge field values after one set of water parcel steps."""

    # nparcels = free_surf_walk_inds.shape[0]
    domain_shape = cell_type.shape
    L, W = domain_shape
    cell_type_flat = cell_type.ravel()

    qxn = np.zeros((L * W))
    qyn = np.zeros((L * W))
    qwn = np.zeros((L * W))

    idx = 0
    current_inds = free_surf_walk_inds[:, idx]

    qxn[current_inds] += 1
    qyn[current_inds] += 0  # this could be omitted...
    qwn[current_inds] += Qp_water / dx / 2

    while np.sum(current_inds) > 0:

        # extract next inds *as recorded*
        next_inds = free_surf_walk_inds[:, idx + 1]

        # get the direction of the step between current_inds and next_inds
        steps_direction = directions[:, idx + 1]

        # get the stepped-ness
        dist, istep, jstep, astep = shared_tools.get_steps(
            steps_direction,
            iwalk_flat,
            jwalk_flat)

        # get the potential new indices
        #     (if no step correction were applied)
        potential_inds = _calculate_new_ind(
            current_inds,
            steps_direction,
            iwalk_flat,
            jwalk_flat,
            domain_shape)

        # any cells that will end the timestep at the 0 index,
        #     should not be counted
        astep[next_inds == 0] = 0

        # update the current and potential steps
        qxn = _update_dirQfield(
            qxn[:], dist, current_inds,
            astep, jstep)
        qyn = _update_dirQfield(
            qyn[:], dist, current_inds,
            astep, istep)
        qwn = _update_absQfield(
            qwn[:], dist, current_inds,
            astep, Qp_water, dx)

        qxn = _update_dirQfield(
            qxn[:], dist, potential_inds,
            astep, jstep)
        qyn = _update_dirQfield(
            qyn[:], dist, potential_inds,
            astep, istep)
        qwn = _update_absQfield(
            qwn[:], dist, potential_inds,
            astep, Qp_water, dx)

        # if potential was edge, balance flux at edge
        whr_edge = cell_type_flat[potential_inds] == -1
        qxn = _update_dirQfield(
            qxn[:], dist[whr_edge], potential_inds[whr_edge],
            astep[whr_edge], jstep[whr_edge])
        qyn = _update_dirQfield(
            qyn[:], dist[whr_edge], potential_inds[whr_edge],
            astep[whr_edge], istep[whr_edge])
        qwn = _update_absQfield(
            qwn[:], dist[whr_edge], potential_inds[whr_edge],
            astep[whr_edge], Qp_water, dx)

        # step to the next location
        current_inds = free_surf_walk_inds[:, idx + 1]
        idx += 1

    return qxn, qyn, qwn
@amoodie amoodie added enhancement New feature or request use case example labels Feb 9, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request use case example
Projects
None yet
Development

No branches or pull requests

1 participant