code: def requiv_contact_L23(q, sma, compno, **kwargs):
      
      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
docs: for the contact case we can make the assumption of aligned, synchronous, and circular