Adding a custom boundary condition

TransiFlow implements many pre-defined problem types, but you can easily add your own using a custom boundary condition. An example would be a 2D lid-driven cavity with a moving lid on the bottom instead of the top. For the purpose of this example, we code the moving lid manually, instead of using the provided moving_lid_south method. Say we have a lid that moves with velocity $U$, then at the boundary $(u_j + u_{j-1}) / 2 = U$, $v_j = 0$. So we replace $u_{j-1}$ by $2U - u_j$ and then apply the no slip condition. We do this by subtracting the part of atom that would be applied to $u_{j-1}$ from $u_j$, and adding $2U$ times the part of atom that would be applied to $u_{j-1}$ to the forcing.

def boundaries(boundary_conditions, atom):
    lid_velocity = parameters['Lid Velocity']
    boundary_conditions.frc[0, :, :, 1] += \
        2 * lid_velocity * numpy.sum(atom[0, :, :, 1, 1, 0, :, :], axis=(-1, -2))

    atom[0, :, :, :, 1, 1, :, :] -= atom[0, :, :, :, 1, 0, :, :]
    atom[0, :, :, :, 1, 0, :, :] = 0

    boundary_conditions.no_slip_east(atom)
    boundary_conditions.no_slip_west(atom)

    boundary_conditions.no_slip_north(atom)
    boundary_conditions.no_slip_south(atom)

    return boundary_conditions.get_forcing()

interface = Interface(parameters, nx, ny, boundary_conditions=boundaries)

The arguments for the boundaries function are a BoundaryConditions object and an atom object as described in the Discretization class.

\[\]