def sinusoidal_bidirectional(target,
                             num_points=1e2,
                             surface_tension='pore.surface_tension',
                             contact_angle='pore.contact_angle',
                             throat_diameter='throat.diameter',
                             throat_amplitude='throat.amplitude',
                             throat_length='throat.length',
                             pore_diameter='pore.diameter'):
    r"""
    Computes the throat capillary entry pressure assuming the throat has a
    sinusoisal profile.
    Makes use of the toroidal meniscus model with mode touch.
    This model accounts for mensicus protrusion into adjacent pores and
    touching solid features.
    It is bidirectional becauase the connected pores generally have different
    sizes and this determines how far the meniscus can protrude.

    Parameters
    ----------
    target : OpenPNM Object
        The object for which these values are being calculated.  This
        controls the length of the calculated array, and also provides
        access to other necessary thermofluid properties

    num_points : float (Default 100)
        The number of divisions to make along the profile length to assess the
        meniscus properties in order to find the touch length.

    surface_tension : dict key (string)
        The dictionary key containing the surface tension values to be used.
        If a pore property is given, it is interpolated to a throat list.

    contact_angle : dict key (string)
        The dictionary key containing the contact angle values to be used.
        If a pore property is given, it is interpolated to a throat list.

    throat_diameter : dict key (string)
        The dictionary key containing the throat diameter values to be used.

    throat_amplitude : dict key (string)
        The dictionary key containing the amplitude of variation in the throat
        diameter about the mean.

    throat_length : dict key (string)
        The dictionary key containing the throat length values to be used.

    pore_diameter : dict key (string)
        The dictionary key containing the pore diameter values to be used.
    Notes
    """
    network = target.project.network
    conns = network['throat.conns']
    values = {}
    for p in range(2):
        network['throat.temp_diameter'] = network[pore_diameter][conns[:, p]]
        key = 'throat.touch_pore_'+str(p)
        target.add_model(propname=key,
                         model=pm.meniscus.sinusoidal,
                         mode='touch',
                         num_points=num_points,
                         surface_tension=surface_tension,
                         contact_angle=contact_angle,
                         throat_diameter=throat_diameter,
                         throat_amplitude=throat_amplitude,
                         throat_length=throat_length,
                         touch_length='throat.temp_diameter')
        values[p] = target[key]
        target.remove_model(key)
    del network['throat.temp_diameter']
    return np.vstack((values[0], values[1])).T
r"""
    Computes the throat capillary entry pressure assuming the throat has a
    sinusoisal profile.
    Makes use of the toroidal meniscus model with mode touch.
    This model accounts for mensicus protrusion into adjacent pores and
    touching solid features.
    It is bidirectional becauase the connected pores generally have different
    sizes and this determines how far the meniscus can protrude.

    Parameters
    ----------
    target : OpenPNM Object
        The object for which these values are being calculated.  This
        controls the length of the calculated array, and also provides
        access to other necessary thermofluid properties

    num_points : float (Default 100)
        The number of divisions to make along the profile length to assess the
        meniscus properties in order to find the touch length.

    surface_tension : dict key (string)
        The dictionary key containing the surface tension values to be used.
        If a pore property is given, it is interpolated to a throat list.

    contact_angle : dict key (string)
        The dictionary key containing the contact angle values to be used.
        If a pore property is given, it is interpolated to a throat list.

    throat_diameter : dict key (string)
        The dictionary key containing the throat diameter values to be used.

    throat_amplitude : dict key (string)
        The dictionary key containing the amplitude of variation in the throat
        diameter about the mean.

    throat_length : dict key (string)
        The dictionary key containing the throat length values to be used.

    pore_diameter : dict key (string)
        The dictionary key containing the pore diameter values to be used.
    Notes