File: gravityfieldEarthquakeOscillation.cpp

package info (click to toggle)
groops 0%2Bgit20250907%2Bds-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 11,140 kB
  • sloc: cpp: 135,607; fortran: 1,603; makefile: 20
file content (138 lines) | stat: -rw-r--r-- 4,871 bytes parent folder | download | duplicates (2)
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
/***********************************************/
/**
* @file gravityfieldEarthquakeOscillation.cpp
*
* @brief Earthquake oscillation.
* @see Gravityfield
*
* @author Saniya Behzadpour
* @date 2017-06-07
*
*/
/***********************************************/

#include "base/import.h"
#include "base/sphericalHarmonics.h"
#include "config/config.h"
#include "files/fileMatrix.h"
#include "classes/kernel/kernel.h"
#include "classes/gravityfield/gravityfield.h"
#include "classes/gravityfield/gravityfieldEarthquakeOscillation.h"

/***********************************************/

GravityfieldEarthquakeOscillation::GravityfieldEarthquakeOscillation(Config &config)
{
  try
  {
    FileName xName;

    readConfig(config, "inputCoefficientMatrix", xName,     Config::MUSTSET,  "",  "oscillation model parameters");
    readConfig(config, "time0",                  time0,     Config::MUSTSET,  "",  "the time earthquake happened");
    readConfig(config, "minDegree",              minDegree, Config::DEFAULT,  "2", "");
    readConfig(config, "maxDegree",              maxDegree, Config::DEFAULT,  "2", "");
    readConfig(config, "GM",                     GM,        Config::DEFAULT,  STRING_DEFAULT_GM, "Geocentric gravitational constant");
    readConfig(config, "R",                      R,         Config::DEFAULT,  STRING_DEFAULT_R,  "reference radius");
    if(isCreateSchema(config)) return;

    Matrix mx;
    readFileMatrix(xName, mx);
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW(e)
  }
}
/***********************************************/

SphericalHarmonics GravityfieldEarthquakeOscillation::timeVariableCoefficients(const Time &time) const
{
  try
  {
    if(time < time0)
      return SphericalHarmonics();

    const Double c = 2*PI*(time-time0).seconds();

    Matrix cnm(maxDegree+1, Matrix::TRIANGULAR, Matrix::LOWER);
    Matrix snm(maxDegree+1, Matrix::TRIANGULAR, Matrix::LOWER);
    for(UInt i=0; i<mx.rows(); i++)
    {
      cnm(mx(i,1), mx(i,2)) += mx(i,3) * (1-cos(c/mx(i,5)) * exp(-c/mx(i,5)/mx(i,6)/2));
      snm(mx(i,1), mx(i,2)) += mx(i,4) * (1-cos(c/mx(i,5)) * exp(-c/mx(i,5)/mx(i,6)/2));
    }

    return SphericalHarmonics(GM, R, cnm, snm);
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW(e)
  }
}
/***********************************************/

Double GravityfieldEarthquakeOscillation::potential(const Time &time, const Vector3d &point) const
{
  return timeVariableCoefficients(time).potential(point);
}

/***********************************************/

Double GravityfieldEarthquakeOscillation::radialGradient(const Time &time, const Vector3d &point) const
{
  return timeVariableCoefficients(time).radialGradient(point);
}

/***********************************************/

Double GravityfieldEarthquakeOscillation::field(const Time &time, const Vector3d &point, const Kernel &kernel) const
{
  SphericalHarmonics harmonics = timeVariableCoefficients(time);
  return inner(kernel.inverseCoefficients(point, harmonics.maxDegree(), harmonics.isInterior()), harmonics.Yn(point, harmonics.maxDegree()));
}

/***********************************************/

Vector3d GravityfieldEarthquakeOscillation::gravity(const Time &time, const Vector3d &point) const
{
  return timeVariableCoefficients(time).gravity(point);
}

/***********************************************/

Tensor3d GravityfieldEarthquakeOscillation::gravityGradient(const Time &time, const Vector3d &point) const
{
  return timeVariableCoefficients(time).gravityGradient(point);
}

/***********************************************/

Vector3d GravityfieldEarthquakeOscillation::deformation(const Time &time, const Vector3d &point, Double gravity, const Vector &hn, const Vector &ln) const
{
  return timeVariableCoefficients(time).deformation(point, gravity, hn, ln);
}

/***********************************************/

void GravityfieldEarthquakeOscillation::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
{
  for(UInt i=0; i<time.size(); i++)
    for(UInt k=0; k<point.size(); k++)
      disp.at(k).at(i) += deformation(time.at(i), point.at(k), gravity.at(k), hn, ln);
}

/***********************************************/

SphericalHarmonics GravityfieldEarthquakeOscillation::sphericalHarmonics(const Time &time, UInt maxDegree, UInt minDegree, Double GM, Double R) const
{
  return timeVariableCoefficients(time).get(maxDegree, std::max(this->minDegree, minDegree), GM, R);
}

/***********************************************/

void GravityfieldEarthquakeOscillation::variance(const Time &/*time*/, const std::vector<Vector3d> &/*point*/, const Kernel &/*kernel*/, Matrix &/*D*/) const
{
}

/***********************************************/