def requiv_contact_L23(q, sma, compno, **kwargs):
    """
    for the contact case we can make the assumption of aligned, synchronous, and circular
    """
    logger.debug("requiv_contact_L23(q={}, sma={}, compno={})".format(q, sma, compno))
    crit_pot_L23 = potential_contact_L23(q)

    logger.debug("libphoebe.roche_contact_neck_min(phi=pi/2, q={}, d=1., crit_pot_L23={})".format(q, crit_pot_L23))
    nekmin = libphoebe.roche_contact_neck_min(np.pi/2., q, 1., crit_pot_L23)['xmin']
    # we now have the critical potential and nekmin as if we were the primary star, so now we'll use compno=0 regardless
    logger.debug("libphoebe.roche_contact_partial_area_volume(nekmin={}, q={}, d=1, Omega={}, compno=0)".format(nekmin, q, crit_pot_L23))
    crit_vol_L23 = libphoebe.roche_contact_partial_area_volume(nekmin, q, 1., crit_pot_L23, compno-1)['lvolume']

    logger.debug("resulting vol: {}, requiv: {}".format(crit_vol_L23, (3./4*1./np.pi*crit_vol_L23)**(1./3) * sma))

    return (3./4*1./np.pi*crit_vol_L23)**(1./3) * sma
for the contact case we can make the assumption of aligned, synchronous, and circular