#include "AIBallistic.hxx"
-
FGAIBallistic::FGAIBallistic(FGAIManager* mgr) {
manager = mgr;
_type_str = "ballistic";
bool FGAIBallistic::init() {
FGAIBase::init();
- aero_stabilized = true;
hdg = azimuth;
pitch = elevation;
roll = rotation;
rotation = rl;
}
-void FGAIBallistic::setStabilization(bool val) {
- aero_stabilized = val;
+void FGAIBallistic::setStabilisation(bool val) {
+ aero_stabilised = val;
}
void FGAIBallistic::setDragArea(double a) {
Cd = c;
}
-void FGAIBallistic::setWeight(double w) {
- weight = w;
+void FGAIBallistic::setMass(double m) {
+ mass = m;
}
void FGAIBallistic::Run(double dt) {
+
life_timer += dt;
+// cout << "life timer 1" << life_timer << dt << endl;
if (life_timer > life) setDie(true);
double speed_north_deg_sec;
double speed_east_deg_sec;
double wind_speed_from_north_deg_sec;
double wind_speed_from_east_deg_sec;
- double mass;
-
- // the drag calculations below assume sea-level density,
- // rho = 0.023780 slugs/ft3
- // calculate mass
- mass = weight * lbs_to_slugs;
+ double Cdm; // Cd adjusted by Mach Number
+
+ // Adjust Cd by Mach number. The equations are based on curves
+ // for a conventional shell/bullet (no boat-tail).
+ if ( Mach < 0.7 ) { Cdm = 0.0125 * Mach + Cd; }
+ else if ( 0.7 < Mach && Mach < 1.2 ) {
+ Cdm = 0.3742 * pow ( Mach, 2) - 0.252 * Mach + 0.0021 + Cd; }
+ else { Cdm = 0.2965 * pow ( Mach, -1.1506 ) + Cd; }
+
+// cout << " Mach , " << Mach << " , Cdm , " << Cdm << endl;
// drag = Cd * 0.5 * rho * speed * speed * drag_area;
+ // rho is adjusted for altitude in void FGAIBase::update,
+ // using Standard Atmosphere (sealevel temperature 15C)
// acceleration = drag/mass;
// adjust speed by drag
- speed -= (Cd * 0.5 * rho * speed * speed * drag_area/mass) * dt;
+ speed -= (Cdm * 0.5 * rho * speed * speed * drag_area/mass) * dt;
// don't let speed become negative
if ( speed < 0.0 ) speed = 0.0;
speed_east_deg_sec = sin(hdg / SG_RADIANS_TO_DEGREES) * hs / ft_per_deg_lon;
// if wind not required, set to zero
- if (!wind){
+ if (!wind) {
wind_from_north = 0;
wind_from_east = 0;
}
pos.setelev(altitude * SG_FEET_TO_METER);
// recalculate pitch (velocity vector) if aerostabilized
- if (aero_stabilized) pitch = atan2( vs, hs ) * SG_RADIANS_TO_DEGREES;
+ // cout << "aero_stabilised " << aero_stabilised << endl ;
+ if (aero_stabilised) pitch = atan2( vs, hs ) * SG_RADIANS_TO_DEGREES;
// recalculate total speed
speed = sqrt( vs * vs + hs * hs);
} // end Run
double FGAIBallistic::_getTime() const {
- return life_timer;
+// cout << "life timer 2" << life_timer << endl;
+ return life_timer;
}
// end AIBallistic