package org.schmivits.airball.airdata;
import static org.schmivits.airball.airdata.Constants.GRAVITATIONAL_ACCELERATION;
import static org.schmivits.airball.airdata.Constants.METERS_PER_FOOT;
import static org.schmivits.airball.airdata.Constants.METERS_PER_SECOND_PER_KNOT;
import static org.schmivits.airball.airdata.Constants.NEWTONS_PER_POUND;
import static org.schmivits.airball.airdata.Constants.SQUARE_METERS_PER_SQUARE_FOOT;
import static org.schmivits.airball.airdata.Constants.STANDARD_AIR_DENSITY;
import org.schmivits.airball.util.MathUtils;
public class BetaModel {
public static class Config {
// Lateral area in square feet
public float lateralArea;
// Lateral lift coefficient per degree
public float lateralClPerDegree;
// Aircraft weight in pounds
public float weight;
// Full scale beta, in degrees
public float fullScaleBeta;
}
// http://upload.wikimedia.org/wikipedia/commons/d/dc/StandardAtmosphere.png
// At 10,000 meters, the density is about 0.35 times its value at sea level
// The curve between them can be approximated *very* roughly as a straight line
private static double computeDensity(double densityAltitudeInFeet) {
double densityAltitude = densityAltitudeInFeet * METERS_PER_FOOT;
double ratio = MathUtils.interpolate(
0, 1, // density ratio = 1 at surface
10000, 0.34, // density ratio = 0.34 at 10,000 meters
densityAltitude);
return ratio * STANDARD_AIR_DENSITY;
}
/**
* Return the proportion of full scale beta under current conditions.
*
* @param config a BetaModelConfig
* @param lateralAcceleration lateral acceleration in "g".
* @param indicatedAirspeed IAS in knots.
* @param densityAltitude density altitude in feet.
* @return beta as a proportion of full scale value.
*/
public static float computeBetaRatio(
BetaModel.Config config,
float lateralAcceleration,
float indicatedAirspeed,
float densityAltitude) {
double weight = config.weight * NEWTONS_PER_POUND;
double acceleration = lateralAcceleration * GRAVITATIONAL_ACCELERATION;
double area = config.lateralArea * SQUARE_METERS_PER_SQUARE_FOOT;
double speed = indicatedAirspeed * METERS_PER_SECOND_PER_KNOT;
double density = computeDensity(densityAltitude);
double g = GRAVITATIONAL_ACCELERATION;
double clBeta = config.lateralClPerDegree;
double beta =
(2.0 * weight * acceleration)
/ (area * speed * speed * density * g * clBeta);
double betaRatio = beta / config.fullScaleBeta;
return (float) betaRatio;
}
}