x130.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "xmodel.h"
4 #include "xphysics.h"
5 #include "xvector.h"
6 #include <iostream>
7 
8 namespace nmx::apps::x130 {
9 
13 class X130 : public XModel
14 {
15  using Data = Data<4>;
16  using Vector = gsl::Vector;
17 
18 private:
19  // G m1 m3 and G m2 m3
20  double _factor1, _factor2;
21  //Koordinaten der Massen m1 und m2
22  Vector _d1, _d2;
23  //Datenobjekt
24  Data _data;
25 
26 public:
27  //Eingabeparameter
28  const double m1, m2, m3;
29  const double d, dx, dy;
30  const double xlim, ylim;
31 
32 public:
44  // clang-format off
45  X130(double m1, double m2, double d, double m3 = 1,
46  double xlim = 5, double dx = 1,
47  double ylim = 5, double dy = 1): XModel (__func__)
48  , m1{ m1 } , m2{ m2 }, m3{ m3 }
49  , d{ 0.5*d }, dx{ dx } , dy{ dy }
50  , xlim{ xlim }, ylim{ ylim } {}
51  // clang-format on
52 
58  inline auto force1(const Vector &v) const {
59  auto r = v - _d1; //Vektor von m1 zur Probemasse
60  const double norm = nrm2(r);
61  Check::error_if(nmx_msg, norm == 0.0);
62 
63  //berechne Kraft
64  double den = pow(norm, 3);
65  auto fResult = (_factor1 / den) * r;
66  return fResult;
67  }
68 
74  inline auto force2(const Vector &v) const {
75  auto r = v - _d2; //Vektor von m2 zur Probemasse
76  const double norm = nrm2(r);
77  Check::error_if(nmx_msg, norm == 0.0);
78 
79  //berechne Kraft
80  double den = pow(norm, 3);
81  auto fResult = (_factor2 / den) * r;
82  return fResult;
83  }
84 
88  inline void exec() {
89  using namespace gravitation;
90  Check::all(nmx_msg, { m1 > 0, m2 > 0, d > 0, m3 > 0 });
91 
92  //konstante Faktoren der Kräfte von m1 und m2 auf die Probemasse
93  _factor1 = -Astronomy::G * m1 * m3;
94  _factor2 = -Astronomy::G * m2 * m3;
95 
96  //Ortsvektorten von m1 und m2
97  _d1 = { -d, 0.0 };
98  _d2 = -_d1;
99 
100  //Berechne normierte Gesamtkraft für jeden Punkt (x,y)
101  for (double _x = -xlim; _x < xlim; _x += dx) {
102  for (double _y = -ylim; _y < ylim; _y += dy) {
103  Vector r{ _x, _y };
104  try {
105  //Kräfte von m1 und m2 auf Probemasse
106  auto f1 = force1(r), f2 = force2(r);
107  auto f = normalize(f1 + f2);
108  //speichere Daten in Tabelle
109  _data += { _x, _y, f[0], f[1] };
110  } catch (const std::exception &err) {
111  std::cout << _x << "," << _y << std::endl;
112  std::cout << err.what() << std::endl;
113  }
114  }
115  }
116  }
117 
121  inline void save_data() const {
122  std::ofstream mysplot = get_output_stream(Output::plot, m1);
123  mysplot << std::scientific << std::setprecision(2);
124 
125  //Formatierung kompatibel zu TiKZ (erste Zeile)
126  mysplot << "x y u v\n";
127 
128  //Formatierung kompatibel zu TiKZ (Daten)
129  const auto sep = " ", lend = "\n";
130  for (const auto &crow : _data.data()) {
131  mysplot << crow[0] //
132  << sep << crow[1] //
133  << sep << crow[2] //
134  << sep << crow[3] << lend;
135  }
136  }
137 }; //X130
138 
143 inline void run() {
144  //Probemasse
145  const double m3 = 1.0;
146  //Erzeugt zusammen mit m1 das Feld
147  const double m2 = 1e4;
148  //Abstand zwischen m1 und m2
149  const double d = 10.0;
150  //Bereich in dem die Vektoren gezeichnet werden
151  const double xlim = 10, dx = 1.5;
152  const double ylim = 10, dy = 1.5;
153 
154  // setze m1 = m2
155  double m1 = 1e4;
156  X130 xobj0{ m1, m2, d, m3, xlim, dx, ylim, dy };
157  xobj0.exec();
158  xobj0.save_data();
159 
160  // m1 ist ein Vielfaches von m2
161  m1 = 16e4;
162  X130 xobj1{ m1, m2, d, m3, xlim, dx, ylim, dy };
163  xobj1.exec();
164  xobj1.save_data();
165 }
166 
167 } // namespace nmx::apps::x130
const double d
Definition: x130.h:29
const double m3
Definition: x130.h:28
auto force2(const Vector &v) const
force2 Berechnung der Kraft von m2 auf die Probemasse
Definition: x130.h:74
static void error_if(const std::string &s, bool arg)
error_if Fehler wenn Bedingung erfüllt ist
Definition: xerror.h:51
void run()
run Gravitationsfeld welches von zwei Massen m1 und m2 erzeugt wird
Definition: x130.h:143
The X130 class Gravitationsfeld zweier Massen.
Definition: x130.h:13
The XModel class Basisklasse speichert eine ID in Form einer Zeichenkette enthält Hilfsfunktionen zur...
Definition: xmodel.h:22
#define nmx_msg
Definition: xerror.h:113
LU::Vector Vector
Definition: x038.h:10
const double dx
Definition: x130.h:29
void save_data() const
save_data Speicherung der Daten, z.B. -1 -1 5 8
Definition: x130.h:121
const double dy
Definition: x130.h:29
const double m1
Definition: x130.h:28
const double xlim
Definition: x130.h:30
auto force1(const Vector &v) const
force1 Berechnung der Kraft von m1 auf die Probemasse
Definition: x130.h:58
static std::ofstream get_output_stream(Format fmt)
get_output_stream
Definition: xmodel.h:49
X130(double m1, double m2, double d, double m3=1, double xlim=5, double dx=1, double ylim=5, double dy=1)
X130 Konstruktor.
Definition: x130.h:45
void exec()
exec Berechnung der normierten Kraftvektoren
Definition: x130.h:88
The Vector class Klasse für gsl-Vektoren zussamengesetzt aus Komponenten.
Definition: xvector.h:76
const double m2
Definition: x130.h:28
const double ylim
Definition: x130.h:30
double f(double x, void *params)
f
Definition: x035.h:15
static void all(const std::string &s, std::initializer_list< bool > lst)
input teste mehrere Bedingungen auf einmal
Definition: xerror.h:76
static const Format plot
Definition: xoutput.h:18