/**
  * Calculates the acceleration of vehicle me.
  *
  * @param me
  * @param laneSegment
  * @param alphaT
  * @param alphaV0
  * @param alphaA
  * @return the calculated acceleration
  */
 public double calcAcc(
     Vehicle me, LaneSegment laneSegment, double alphaT, double alphaV0, double alphaA) {
   // By default only consider the vehicle in front when calculating acceleration.
   // LDMs that consider more than the front vehicle should override this method.
   final Vehicle frontVehicle = laneSegment.frontVehicle(me);
   return calcAcc(me, frontVehicle, alphaT, alphaV0, alphaA);
 }
  /**
   * Calculates the acceleration of vehicle me, under European lane changing rules (no
   * "undertaking").
   *
   * @param vCritEur critical speed under which European rules no longer apply
   * @param me
   * @param laneSegment
   * @param leftLaneSegment
   * @param alphaT
   * @param alphaV0
   * @param alphaA
   * @return the acceleration of vehicle me
   */
  public double calcAccEur(
      double vCritEur,
      Vehicle me,
      LaneSegment laneSegment,
      LaneSegment leftLaneSegment,
      double alphaT,
      double alphaV0,
      double alphaA) {

    // calculate normal acceleration in own lane
    final double accInOwnLane = calcAcc(me, laneSegment, alphaT, alphaV0, alphaA);

    // no lane on left-hand side
    if (leftLaneSegment == null) {
      return accInOwnLane;
    }

    // check left-vehicle's speed
    final Vehicle newFrontLeft = leftLaneSegment.frontVehicle(me);
    if (newFrontLeft == null) {
      return accInOwnLane;
    }
    final double speedFront = newFrontLeft.getSpeed();
    if (speedFront <= vCritEur) {
      return accInOwnLane;
    }

    // condition me.getSpeed() > speedFront will be evaluated by softer tanh
    // condition below
    final double accLeft = calcAcc(me, leftLaneSegment, alphaT, alphaV0, alphaA);

    // avoid hard switching by condition vMe>vLeft needed in European
    // acceleration rule
    final double frac = calcSmoothFraction(me.getSpeed(), speedFront);
    final double accResult = frac * Math.min(accInOwnLane, accLeft) + (1 - frac) * accInOwnLane;

    // if (speedFront != -1) {
    // LOG.debug(String
    // .format("pos=%.4f, accLeft: frac=%.4f, acc=%.4f, accLeft=%.4f, accResult=%.4f, meSpeed=%.2f,
    // frontLeftSpeed=%.2f\n",
    // me.getPosition(), frac, accInOwnLane, accLeft, accResult, me.getSpeed(), speedFront));
    // }
    return accResult;
  }