Added DecayedException. Removed premature check.

feature/19
Daniel Warner 2012-01-07 23:26:33 +00:00
parent c63d209c35
commit 69744793e6
4 changed files with 90 additions and 28 deletions

View File

@ -0,0 +1,47 @@
#ifndef DECAYEDEXCEPTION_H_
#define DECAYEDEXCEPTION_H_
#include <exception>
#include <iostream>
#include "Julian.h"
#include "Vector.h"
class DecayedException : public std::exception
{
public:
DecayedException(const Julian& dt, const Vector& pos, const Vector& vel)
: _dt(dt), _pos(pos), _vel(vel)
{
}
virtual ~DecayedException(void) throw ()
{
}
virtual const char* what() const throw ()
{
return "Error: Satellite decayed";
}
Julian GetDate() const
{
return _dt;
}
Vector GetPosition() const
{
return _pos;
}
Vector GetVelocity() const
{
return _vel;
}
private:
Julian _dt;
Vector _pos;
Vector _vel;
};
#endif

View File

@ -3,6 +3,7 @@
#include "Util.h" #include "Util.h"
#include "Vector.h" #include "Vector.h"
#include "SatelliteException.h" #include "SatelliteException.h"
#include "DecayedException.h"
#include <cmath> #include <cmath>
#include <iomanip> #include <iomanip>
@ -267,11 +268,6 @@ Eci SGP4::FindPositionSDP4(const Julian& dt, double tsince) const
xl = xmam + omgadf + xnode; xl = xmam + omgadf + xnode;
omega = omgadf; omega = omgadf;
if (a < 1.0)
{
throw SatelliteException("Error: (a < 1.0)");
}
/* /*
* fix tolerance for error recognition * fix tolerance for error recognition
*/ */
@ -373,11 +369,6 @@ Eci SGP4::FindPositionSGP4(const Julian& dt, double tsince) const
e = elements_.Eccentricity() - tempe; e = elements_.Eccentricity() - tempe;
xl = xmp + omega + xnode + elements_.RecoveredMeanMotion() * templ; xl = xmp + omega + xnode + elements_.RecoveredMeanMotion() * templ;
if (a < 1.0)
{
throw SatelliteException("Error: (a < 1.0)");
}
/* /*
* fix tolerance for error recognition * fix tolerance for error recognition
*/ */
@ -538,11 +529,6 @@ Eci SGP4::CalculateFinalPositionVelocity(const Julian& dt, const double& e,
const double rdotk = rdot - xn * temp42 * x1mth2 * sin2u; const double rdotk = rdot - xn * temp42 * x1mth2 * sin2u;
const double rfdotk = rfdot + xn * temp42 * (x1mth2 * cos2u + 1.5 * x3thm1); const double rfdotk = rfdot + xn * temp42 * (x1mth2 * cos2u + 1.5 * x3thm1);
if (rk < 1.0)
{
throw SatelliteException("Error: Satellite decayed (rk < 1.0)");
}
/* /*
* orientation vectors * orientation vectors
*/ */
@ -572,6 +558,11 @@ Eci SGP4::CalculateFinalPositionVelocity(const Julian& dt, const double& e,
const double zdot = (rdotk * uz + rfdotk * vz) * kXKMPER / 60.0; const double zdot = (rdotk * uz + rfdotk * vz) * kXKMPER / 60.0;
Vector velocity(xdot, ydot, zdot); Vector velocity(xdot, ydot, zdot);
if (rk < 1.0)
{
throw DecayedException(dt, position, velocity);
}
Eci eci(dt, position, velocity); Eci eci(dt, position, velocity);
return eci; return eci;

View File

@ -5,6 +5,7 @@
#include "OrbitalElements.h" #include "OrbitalElements.h"
#include "Eci.h" #include "Eci.h"
#include "SatelliteException.h" #include "SatelliteException.h"
#include "DecayedException.h"
class SGP4 class SGP4
{ {

View File

@ -27,31 +27,59 @@ void RunTle(Tle tle, double start, double end, double inc)
while (running) while (running)
{ {
bool error = false;
Vector position;
Vector velocity;
double tsince;
try try
{ {
double val;
if (first_run && current != 0.0) if (first_run && current != 0.0)
{ {
/* /*
* make sure first run is always as zero * make sure first run is always as zero
*/ */
val = 0.0; tsince = 0.0;
} }
else else
{ {
/* /*
* otherwise run as normal * otherwise run as normal
*/ */
val = current; tsince = current;
} }
Eci eci = model.FindPosition(val);
Vector position = eci.GetPosition(); Eci eci = model.FindPosition(tsince);
Vector velocity = eci.GetVelocity(); position = eci.GetPosition();
velocity = eci.GetVelocity();
}
catch (SatelliteException& e)
{
std::cerr << e.what() << std::endl;
error = true;
running = false;
}
catch (DecayedException& e)
{
std::cerr << e.what() << std::endl;
position = e.GetPosition();
velocity = e.GetVelocity();
if (!first_run)
{
// print out position on first run
error = true;
}
running = false;
}
if (!error)
{
std::cout << std::setprecision(8) << std::fixed; std::cout << std::setprecision(8) << std::fixed;
std::cout.width(17); std::cout.width(17);
std::cout << val << " "; std::cout << tsince << " ";
std::cout.width(16); std::cout.width(16);
std::cout << position.x << " "; std::cout << position.x << " ";
std::cout.width(16); std::cout.width(16);
@ -65,12 +93,8 @@ void RunTle(Tle tle, double start, double end, double inc)
std::cout << velocity.y << " "; std::cout << velocity.y << " ";
std::cout.width(14); std::cout.width(14);
std::cout << velocity.z << std::endl; std::cout << velocity.z << std::endl;
}
}
catch (SatelliteException& e)
{
running = false;
}
if ((first_run && current == 0.0) || !first_run) if ((first_run && current == 0.0) || !first_run)
{ {
if (current == end) if (current == end)
@ -87,7 +111,6 @@ void RunTle(Tle tle, double start, double end, double inc)
} }
} }
first_run = false; first_run = false;
} }
} }