Commit cbaaa495 authored by Alexander Lapshin's avatar Alexander Lapshin

.

parent 76023efb
......@@ -660,10 +660,10 @@ void BNOAstroBase::GetPosGelio(TPlanetId pl, const TimeJD &t, Vect3 *crd, Vect3
}
}
//-----------------------------------------------------------------------------
//
//
void BNOAstroBase::GetPosGeo(TPlanetId pl, const TimeJD &t, Vect3 *crd, Vect3 *vel,
Vect3 *acc) const
{
{
if (pl == plIdEarth || pl == plIdMoon)
{
const IEphemeride *iph = GetPlanet(pl)->GetEphemeride();
......@@ -696,7 +696,7 @@ void BNOAstroBase::GetPosGeo(TPlanetId pl, const TimeJD &t, Vect3 *crd, Vect3 *v
(*acc) += as;
}
}
}
}
//-----------------------------------------------------------------------------
//
bool BNOAstroBase::Init(bool noAtm, bool loadPlanets)
......
......@@ -11,14 +11,14 @@
#include "DVectors.h"
#include "Ids.h"
///////////////////////////////////////////////////////////////////////////////
// ,
//
// ,
//
class IEphemeride
{
public:
{
public:
//
virtual ~IEphemeride()
{} ;
{};
//
virtual bool LoadData(const TimeJD &s, const TimeJD &e) = 0;
//
......@@ -28,23 +28,23 @@ class IEphemeride
Vect3 *vel = NULL, Vect3 *acc = NULL) const = 0;
//
virtual TCoordSysId GetCS() const = 0;
};
};
///////////////////////////////////////////////////////////////////////////////
//
//
class TGeometryModel
{
public:
{
public:
double Re; //
double alpha; //
};
};
///////////////////////////////////////////////////////////////////////////////
//
//
class IAtmosphereModel
{
public:
{
public:
// .
virtual ~IAtmosphereModel()
{} ;
{};
// .
//
virtual double Density(const TimeJD &t, const Vect3 &v, const Vect3 &vSun)
......@@ -55,46 +55,46 @@ class IAtmosphereModel
virtual bool IsSunPosNeed() const = 0;
// ?
virtual bool IsTableNeed() const = 0;
};
};
///////////////////////////////////////////////////////////////////////////////
// ,
// ,
class TGeoSolarFlux
{
public:
{
public:
double f135; // 135 - 77
double f90; // 90 - ???
double f81; // 81 - ???
double f135w; // 135
double f81w; // 81 - 90
double f01; // 1 -
double kp ; // ( )
int ap ; //
double kp; // ( )
int ap; //
double three_hours_kp[8]; //
bool iskp3;
};
};
///////////////////////////////////////////////////////////////////////////////
//
//
class ITableGeoSolarFlux
{
public:
{
public:
//
virtual ~ITableGeoSolarFlux()
{} ;
{};
//
virtual const TGeoSolarFlux *Get_F107(const TimeJD &tm) const = 0;
//
virtual const double *Get_Kp3hour(const TimeJD &tm) const = 0;
//
virtual double Get_Kp3hourMod(const TimeJD &tm) const = 0;
};
};
///////////////////////////////////////////////////////////////////////////////
//
//
class IGravityModel
{
public:
{
public:
//
virtual ~IGravityModel()
{} ;
{};
//
virtual double c(unsigned int n, unsigned int m) const = 0;
virtual double d(unsigned int n, unsigned int m) const = 0;
......@@ -103,16 +103,18 @@ class IGravityModel
virtual unsigned int M() const = 0;
//
virtual TGravityModelId GetID() const = 0;
virtual const double* const* get_cc() const { return 0; }
virtual const double* const* get_dd() const { return 0; }
double mu; //
double Re; //
double alpha; //
};
};
///////////////////////////////////////////////////////////////////////////////
//
//
class IPlanet
{
public:
{
public:
//
IPlanet()
{};
......@@ -135,6 +137,6 @@ class IPlanet
double omega; //
double RShad; //
TGeometryModel Geometry;
};
};
///////////////////////////////////////////////////////////////////////////////
#endif
......@@ -7,6 +7,8 @@
#include "ODESystem.h"
#include "GeoCoords.h"
#include "IAstroBase.h"
#include "EarthGravity.h"
///////////////////////////////////////////////////////////////////////////////
//
//-----------------------------------------------------------------------------
......@@ -216,18 +218,22 @@ void ODEPhaseSystem::EarthNonCentralAcc(Vect3 &acc, const Vect3 &pos)
double p0 = p0_1;
double cn0, t1;
const double* const* CC = EarthGravity->get_cc();
const double* const* DD = EarthGravity->get_dd();
int n;
for (n = 2; n <= Ng; n++)
{
ro1 *= ro;
Ron[n] = ro1;
cn0 = EarthGravity->c(n, 0) * ro1;
x0 += cn0 * (n+1) * p0;
//cn0 = EarthGravity->c(n, 0) * ro1;
cn0 = CC[0][n] * ro1;
x0 += cn0 * (n + 1) * p0;
x2 += cn0 * Pm[n];
if (n == Ng)
break;
t1 = (2 * n + 1) * zr;
Pm[n+1] = (t1 * Pm[n] - (n + 1) * Pm[n-1]) / n;
Pm[n + 1] = (t1 * Pm[n] - (n + 1) * Pm[n - 1]) / n;
p0 = (t1 * p0_1 - n * p0_2) / (n + 1);
p0_2 = p0_1;
p0_1 = p0;
......@@ -244,7 +250,7 @@ void ODEPhaseSystem::EarthNonCentralAcc(Vect3 &acc, const Vect3 &pos)
double z12 = 0;
int m;
double cm=0.0, sm=0.0, cc;
double cm = 0.0, sm = 0.0, cc;
for (m = 1; m <= Mg; m++)
{
double x01 = 0;
......@@ -264,8 +270,13 @@ void ODEPhaseSystem::EarthNonCentralAcc(Vect3 &acc, const Vect3 &pos)
for (; n <= Mg; n++)
{
t1 = Ron[n];
double cnm = EarthGravity->c(n, m) * t1;
double dnm = EarthGravity->d(n , m) * t1;
//double cnm = EarthGravity->c(n, m) * t1;
double cnm = CC[m][n] * t1;
//double dnm = EarthGravity->d(n, m) * t1;
double dnm = DD[m][n] * t1;
t1 = Pm[n];
double t2 = cnm * t1;
......
......@@ -110,4 +110,3 @@ class ODEVarSystem : public ODEPhaseSystem
///////////////////////////////////////////////////////////////////////////////
#endif
......@@ -12,61 +12,89 @@
// ( )
///////////////////////////////////////////////////////////////////////////////
class SGravityModel : public IGravityModel
{
public:
{
public:
//
SGravityModel()
{};
{}
//
SGravityModel(double m, double r, double a)
{ mu = m; Re = r; alpha = a;};
{
mu = m; Re = r; alpha = a;
}
//
virtual double c(unsigned int /*n*/, unsigned int /*m*/) const
{ return 0;};
{
return 0;
}
virtual double d(unsigned int /*n*/, unsigned int /*m*/) const
{ return 0;};
{
return 0;
}
//
virtual unsigned int N() const
{ return 0;};
{
return 0;
}
virtual unsigned int M() const
{ return 0;};
{
return 0;
};
//
virtual TGravityModelId GetID() const
{ return grIdMu;};
{
return grIdMu;
};
};
///////////////////////////////////////////////////////////////////////////////
// PZ90
///////////////////////////////////////////////////////////////////////////////
class EarthPZ90GravityModel : public IGravityModel
{
public:
{
public:
//
EarthPZ90GravityModel();
//
virtual double c(unsigned int n, unsigned int m) const
{return CC[m][n];};
{
return CC[m][n];
};
virtual double d(unsigned int n, unsigned int m) const
{ return DD[m][n]; };
{
return DD[m][n];
};
virtual const double* const* get_cc() const { return CC; }
virtual const double* const* get_dd() const { return DD; }
//
virtual unsigned int N() const
{ return 36; };
{
return 36;
};
virtual unsigned int M() const
{ return 36; };
{
return 36;
};
//
virtual TGravityModelId GetID() const
{ return grIdPZ90;};
{
return grIdPZ90;
};
protected:
protected:
//
double **CC;
double **DD;
};
};
///////////////////////////////////////////////////////////////////////////////
// ( )
///////////////////////////////////////////////////////////////////////////////
......@@ -76,21 +104,43 @@ public:
//
EarthPZ902GravityModel();
double** getCC() const {
return CC;
}
double** getDD() const {
return DD;
}
//
virtual double c(unsigned int n, unsigned int m) const
{return CC[m][n];};
{
return CC[m][n];
};
virtual double d(unsigned int n, unsigned int m) const
{ return DD[m][n]; };
{
return DD[m][n];
};
virtual const double* const* get_cc() const { return CC; }
virtual const double* const* get_dd() const { return DD; }
//
virtual unsigned int N() const
{ return 36; };
{
return 36;
};
virtual unsigned int M() const
{ return 36; };
{
return 36;
};
//
virtual TGravityModelId GetID() const
{ return grIdPZ902s;};
{
return grIdPZ902s;
};
protected:
//
......@@ -101,8 +151,8 @@ protected:
// ( )
///////////////////////////////////////////////////////////////////////////////
class GravityModel : public IGravityModel
{
public:
{
public:
// ,
//
GravityModel(TGravityModelId Id, unsigned int N, unsigned int M,
......@@ -112,29 +162,49 @@ class GravityModel : public IGravityModel
//
virtual ~GravityModel()
{ freeAll();};
{
freeAll();
};
//
virtual double c(unsigned int n, unsigned int m) const
{return CC[m][n];};
{
return CC[m][n];
};
virtual double d(unsigned int n, unsigned int m) const
{ return DD[m][n]; };
{
return DD[m][n];
};
//
double c(unsigned int n, unsigned int m, double value)
{ return (CC[m][n] = value); };
{
return (CC[m][n] = value);
};
double d(unsigned int n, unsigned int m, double value)
{ return (DD[m][n] = value); };
{
return (DD[m][n] = value);
};
virtual const double* const* get_cc() const { return CC; }
virtual const double* const* get_dd() const { return DD; }
//
virtual unsigned int N() const
{ return N_; };
{
return N_;
};
virtual unsigned int M() const
{ return M_; };
{
return M_;
};
//
virtual TGravityModelId GetID() const
{ return Id;};
{
return Id;
};
//
//
......@@ -149,7 +219,7 @@ class GravityModel : public IGravityModel
//
TGravityModelId Id;
protected:
protected:
//
double **CC;
double **DD;
......@@ -162,6 +232,6 @@ class GravityModel : public IGravityModel
void freeAll();
//
void SetSize(unsigned int N, unsigned int M);
};
};
///////////////////////////////////////////////////////////////////////////////
#endif
......@@ -151,7 +151,7 @@ bool Ephemeride::ReadData(const TimeJD &start, const TimeJD &end)
//---------------------------------------------------------------------------
void Ephemeride::CalculatePolynom(double t_cheb, double *coeff, double *coord,
double *coord_dt, double *coord_dt2) const
{
{
double b2 = 0.0;
double b1 = 0.0;
double b;
......@@ -188,20 +188,21 @@ void Ephemeride::CalculatePolynom(double t_cheb, double *coeff, double *coord,
if (coord_dt)
*coord_dt = b1 + b_s * t_cheb - b2_s;
if (coord_dt2)
*coord_dt2= 2.0 * b1_s + b1_ss * t_cheb - b2_ss;
}
*coord_dt2 = 2.0 * b1_s + b1_ss * t_cheb - b2_ss;
}
//---------------------------------------------------------------------------
void Ephemeride::GetPosition(const TimeJD &t, Vect3 *pos,
Vect3 *vel, Vect3 *acc) const
{
TimeJD tdb(t);
{
TAssert(XCoefs != NULL);
TAssert(tdb >= StartTime && tdb <= EndTime);
// TAssert(XCoefs != NULL);
// TAssert(tdb >= StartTime && tdb <= EndTime);
if (GetFromCash(t, pos, vel, acc))
return;
TimeJD tdb(t);
double diff = (tdb - StartTime).GetDouble();
double tch = 2.0 * fmod(diff / DInterval[BodyID], 1.0) - 1.0;
int offset = (int)floor(diff / DInterval[BodyID]) * (Order[BodyID] + 1);
......@@ -247,7 +248,7 @@ void Ephemeride::GetPosition(const TimeJD &t, Vect3 *pos,
PutToCash(t, pos, vel, acc);
return;
}
}
//---------------------------------------------------------------------------
//
bool Ephemeride::GetFromCash(const TimeJD &t, Vect3 *pos, Vect3 *vel, Vect3 *acc) const
......
......@@ -185,7 +185,7 @@ static bool ReadFile(std::string path, std::string &str)
size_t res = fread(buf,len,1,fp); //read into buffer
fclose(fp);
str = std::string(buf);
delete buf;
delete[] buf;
if (!res){
return false;
......
......@@ -104,10 +104,6 @@ void XInterpolator::calc_positions(const SInitOrbit& orbit, const TimeJD& beg, c
TimeJD beg_ext = ShiftDate(beg, -n*step);
TimeJD end_ext = ShiftDate(end, +n*step);
// std::string s_beg = DateToStr(beg);
// std::string s_date = DateToStr(orbDate);
// std::string s_end = DateToStr(end);
if (orbit.GetDate() <= beg_ext){
propagate(orbit, beg_ext, end_ext, 1, result);
}else if (orbit.GetDate() >= end_ext){
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment