1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
/***********************************************/
/**
* @file gravityfieldOscillation.cpp
*
* @brief Gravityfield as oscillation.
* @see Gravityfield
*
* @author Torsten Mayer-Guerr
* @date 2015-06-07
*
*/
/***********************************************/
#include "base/import.h"
#include "base/sphericalHarmonics.h"
#include "config/config.h"
#include "classes/kernel/kernel.h"
#include "classes/gravityfield/gravityfield.h"
#include "classes/gravityfield/gravityfieldOscillation.h"
/***********************************************/
GravityfieldOscillation::GravityfieldOscillation(Config &config)
{
try
{
readConfig(config, "gravityfieldCos", gravityfieldCos, Config::MUSTSET, "", "multiplicated by cos(2pi/T(time-time0))");
readConfig(config, "gravityfieldSin", gravityfieldSin, Config::MUSTSET, "", "multiplicated by sin(2pi/T(time-time0))");
readConfig(config, "time0", time0, Config::MUSTSET, STRING_J2000, "reference time");
readConfig(config, "period", timePeriod, Config::MUSTSET, "365.25", "[day]");
if(isCreateSchema(config)) return;
}
catch(std::exception &e)
{
GROOPS_RETHROW(e)
}
}
/***********************************************/
Double GravityfieldOscillation::potential(const Time &time, const Vector3d &point) const
{
if(time == Time())
return 0;
const Double omega = 2*PI/timePeriod.mjd()*(time-time0).mjd();
return cos(omega) * gravityfieldCos->potential(time, point) + sin(omega) * gravityfieldSin->potential(time, point);
}
/***********************************************/
Double GravityfieldOscillation::radialGradient(const Time &time, const Vector3d &point) const
{
if(time == Time())
return 0;
const Double omega = 2*PI/timePeriod.mjd()*(time-time0).mjd();
return cos(omega) * gravityfieldCos->radialGradient(time, point) +
sin(omega) * gravityfieldSin->radialGradient(time, point);
}
/***********************************************/
Double GravityfieldOscillation::field(const Time &time, const Vector3d &point, const Kernel &kernel) const
{
if(time == Time())
return 0;
const Double omega = 2*PI/timePeriod.mjd()*(time-time0).mjd();
return cos(omega) * gravityfieldCos->field(time, point, kernel) +
sin(omega) * gravityfieldSin->field(time, point, kernel);
}
/***********************************************/
Vector3d GravityfieldOscillation::gravity(const Time &time, const Vector3d &point) const
{
if(time == Time())
return Vector3d();
const Double omega = 2*PI/timePeriod.mjd()*(time-time0).mjd();
return cos(omega) * gravityfieldCos->gravity(time, point) +
sin(omega) * gravityfieldSin->gravity(time, point);
}
/***********************************************/
Tensor3d GravityfieldOscillation::gravityGradient(const Time &time, const Vector3d &point) const
{
if(time == Time())
return Tensor3d();
const Double omega = 2*PI/timePeriod.mjd()*(time-time0).mjd();
return cos(omega) * gravityfieldCos->gravityGradient(time, point) +
sin(omega) * gravityfieldSin->gravityGradient(time, point);
}
/***********************************************/
Vector3d GravityfieldOscillation::deformation(const Time &time, const Vector3d &point, Double gravity, const Vector &hn, const Vector &ln) const
{
if(time == Time())
return Vector3d();
const Double omega = 2*PI/timePeriod.mjd()*(time-time0).mjd();
return cos(omega) * gravityfieldCos->deformation(time, point, gravity, hn, ln) +
sin(omega) * gravityfieldSin->deformation(time, point, gravity, hn, ln);
}
/***********************************************/
void GravityfieldOscillation::deformation(const std::vector<Time> &time, const std::vector<Vector3d> &point, const std::vector<Double> &gravity,
const Vector &hn, const Vector &ln, std::vector<std::vector<Vector3d>> &disp) const
{
if((time.size()==0) || (point.size()==0))
return;
std::vector<std::vector<Vector3d>> dispCos(point.size());
for(UInt k=0; k<point.size(); k++)
dispCos.at(k).resize(time.size());
gravityfieldCos->deformation(time, point, gravity, hn, ln, dispCos);
std::vector<std::vector<Vector3d>> dispSin(point.size());
for(UInt k=0; k<point.size(); k++)
dispSin.at(k).resize(time.size());
gravityfieldCos->deformation(time, point, gravity, hn, ln, dispSin);
for(UInt i=0; i<time.size(); i++)
{
const Double omega = 2*PI/timePeriod.mjd()*(time.at(i)-time0).mjd();
for(UInt k=0; k<point.size(); k++)
disp.at(k).at(i) += cos(omega) * dispCos.at(k).at(i) + sin(omega) * dispSin.at(k).at(i);
}
}
/***********************************************/
void GravityfieldOscillation::variance(const Time &/*time*/, const std::vector<Vector3d> &/*point*/, const Kernel &/*kernel*/, Matrix &/*D*/) const
{
}
/***********************************************/
SphericalHarmonics GravityfieldOscillation::sphericalHarmonics(const Time &time, UInt maxDegree, UInt minDegree, Double GM, Double R) const
{
if(time == Time())
return SphericalHarmonics();
const Double omega = 2*PI/timePeriod.mjd()*(time-time0).mjd();
return cos(omega) * gravityfieldCos->sphericalHarmonics(time, maxDegree, minDegree, GM, R) +
sin(omega) * gravityfieldSin->sphericalHarmonics(time, maxDegree, minDegree, GM, R);
}
/***********************************************/
|