SlowDown Algorithmic Regularization (SDAR)
Algorithmic Regularization with slowdown method for integrating few-body motions
hermite_particle.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Common/Float.h"
4 
5 namespace H4{
6  template <class Tparticle> class ParticleH4;
7 
9  /*
10  template <class Tparticle>
11  class ParticleAR: public Tparticle{
12  public:
13  //Tparticle* adr; // original particle address
14 
15  ParticleAR& operator = (Tparticle & _p) {
16  *(Tparticle*)this = _p;
17  adr = &_p;
18  return *this;
19  }
20 
21  ParticleAR& operator = (ParticleH4<Tparticle> & _p) {
22  *(Tparticle*)this = *(Tparticle*)&_p;
23  adr = &_p;
24  return *this;
25  }
26 
27  ParticleAR& operator = (const ParticleAR & _p) {
28  *(Tparticle*)this = *(Tparticle*)&_p;
29  adr = _p.adr;
30  return *this;
31  }
32  };
33  */
34 
36  template <class Tparticle>
37  class ParticleH4: public Tparticle{
38  public:
41  Float acc0[3];
42  Float acc1[3];
43 #ifdef HERMITE_DEBUG_ACC
44  Float acc2[3]; // for debug
45  Float acc3[3]; // for debug
46 #endif
48 
50 
51  ParticleH4(const Tparticle & _p) {
52  *(Tparticle*)this = *(Tparticle*)&_p;
53  }
54 
56  *(Tparticle*)this = *(Tparticle*)&_p;
57  dt = _p.dt;
58  time = _p.time;
59  acc0[0] = _p.acc0[0];
60  acc0[1] = _p.acc0[1];
61  acc0[2] = _p.acc0[2];
62  acc1[0] = _p.acc1[0];
63  acc1[1] = _p.acc1[1];
64  acc1[2] = _p.acc1[2];
65 #ifdef HERMITE_DEBUG_ACC
66  acc2[0] = _p.acc2[0];
67  acc2[1] = _p.acc2[1];
68  acc2[2] = _p.acc2[2];
69  acc3[0] = _p.acc3[0];
70  acc3[1] = _p.acc3[1];
71  acc3[2] = _p.acc3[2];
72 #endif
73  pot = _p.pot;
74  }
75 
76  ParticleH4& operator = (const Tparticle & _p) {
77  *(Tparticle*)this = *(Tparticle*)&_p;
78  return *this;
79  }
80 
82  *(Tparticle*)this = *(Tparticle*)&_p;
83  dt = _p.dt;
84  time = _p.time;
85  acc0[0] = _p.acc0[0];
86  acc0[1] = _p.acc0[1];
87  acc0[2] = _p.acc0[2];
88  acc1[0] = _p.acc1[0];
89  acc1[1] = _p.acc1[1];
90  acc1[2] = _p.acc1[2];
91 #ifdef HERMITE_DEBUG_ACC
92  acc2[0] = _p.acc2[0];
93  acc2[1] = _p.acc2[1];
94  acc2[2] = _p.acc2[2];
95  acc3[0] = _p.acc3[0];
96  acc3[1] = _p.acc3[1];
97  acc3[2] = _p.acc3[2];
98 #endif
99  pot = _p.pot;
100  return *this;
101  }
102 
104  void print(std::ostream & _fout) const{
105  Tparticle::print(_fout);
106  _fout<<" dt="<<dt
107  <<" time="<<time
108  <<" acc0="<<acc0
109  <<" acc1="<<acc0;
110 #ifdef HERMITE_DEBUG_ACC
111  _fout<<" acc2="<<acc2
112  <<" acc3="<<acc3;
113 #endif
114  _fout<<" pot="<<pot;
115  }
116 
118 
122  void printColumnTitle(std::ostream & _fout, const int _width=20) {
123  Tparticle::printColumnTitle(_fout, _width);
124  _fout<<std::setw(_width)<<"dt"
125  <<std::setw(_width)<<"time"
126  <<std::setw(_width)<<"acc0.x"
127  <<std::setw(_width)<<"acc0.y"
128  <<std::setw(_width)<<"acc0.z"
129  <<std::setw(_width)<<"acc1.x"
130  <<std::setw(_width)<<"acc1.y"
131  <<std::setw(_width)<<"acc1.z";
132 #ifdef HERMITE_DEBUG_ACC
133  _fout<<std::setw(_width)<<"acc2.x"
134  <<std::setw(_width)<<"acc2.y"
135  <<std::setw(_width)<<"acc2.z"
136  <<std::setw(_width)<<"acc3.x"
137  <<std::setw(_width)<<"acc3.y"
138  <<std::setw(_width)<<"acc3.z";
139 #endif
140  _fout<<std::setw(_width)<<"pot";
141  }
142 
144 
148  void printColumn(std::ostream & _fout, const int _width=20){
149  Tparticle::printColumn(_fout, _width);
150  _fout<<std::setw(_width)<<dt
151  <<std::setw(_width)<<time
152  <<std::setw(_width)<<acc0[0]
153  <<std::setw(_width)<<acc0[1]
154  <<std::setw(_width)<<acc0[2]
155  <<std::setw(_width)<<acc1[0]
156  <<std::setw(_width)<<acc1[1]
157  <<std::setw(_width)<<acc1[2];
158 #ifdef HERMITE_DEBUG_ACC
159  _fout<<std::setw(_width)<<acc2[0]
160  <<std::setw(_width)<<acc2[1]
161  <<std::setw(_width)<<acc2[2]
162  <<std::setw(_width)<<acc3[0]
163  <<std::setw(_width)<<acc3[1]
164  <<std::setw(_width)<<acc3[2];
165 #endif
166  _fout<<std::setw(_width)<<pot;
167  }
168 
171  // */
172  //void writeBinary(FILE *_fp) const {
173  // fwrite(this, sizeof(*this),1,_fp);
174  //}
175  //
178  // */
179  //void readBinary(FILE *_fin) {
180  // size_t rcount = fread(this, sizeof(*this),1,_fin);
181  // if (rcount<1) {
182  // std::cerr<<"Error: Data reading fails! requiring data number is 1, only obtain "<<rcount<<".\n";
183  // abort();
184  // }
185  //}
186 
187  };
188 
190  class ForceH4{
191  public:
192  Float acc0[3]; //
193  Float acc1[3]; //
195 
196  ForceH4(): acc0{0.0,0.0,0.0}, acc1{0.0,0.0,0.0}, pot(0.0){}
197 
199  void clear() {
200  acc0[0] = acc0[1] = acc0[2] = Float(0.0);
201  acc1[0] = acc1[1] = acc1[2] = Float(0.0);
202  pot = 0.0;
203  }
204 
206 
210  void printColumnTitle(std::ostream & _fout, const int _width=20) {
211  _fout<<std::setw(_width)<<"acc0.x"
212  <<std::setw(_width)<<"acc0.y"
213  <<std::setw(_width)<<"acc0.z"
214  <<std::setw(_width)<<"acc1.x"
215  <<std::setw(_width)<<"acc1.y"
216  <<std::setw(_width)<<"acc1.z"
217  <<std::setw(_width)<<"pot";
218  }
219 
221 
225  void printColumn(std::ostream & _fout, const int _width=20) {
226  _fout<<std::setw(_width)<<acc0[0]
227  <<std::setw(_width)<<acc0[1]
228  <<std::setw(_width)<<acc0[2]
229  <<std::setw(_width)<<acc1[0]
230  <<std::setw(_width)<<acc1[1]
231  <<std::setw(_width)<<acc1[2]
232  <<std::setw(_width)<<pot;
233  }
234  };
235 
236 }
H4::ParticleH4::acc0
Float acc0[3]
Definition: hermite_particle.h:41
H4::ParticleH4::dt
Float dt
Definition: hermite_particle.h:39
H4::ParticleH4::time
Float time
Definition: hermite_particle.h:40
H4::ParticleH4::printColumn
void printColumn(std::ostream &_fout, const int _width=20)
print data of class members using column style
Definition: hermite_particle.h:148
H4::ParticleH4::ParticleH4
ParticleH4(const Tparticle &_p)
Definition: hermite_particle.h:51
Float.h
H4::ParticleH4::ParticleH4
ParticleH4()
Definition: hermite_particle.h:49
H4::ForceH4::printColumn
void printColumn(std::ostream &_fout, const int _width=20)
print data of class members using column style
Definition: hermite_particle.h:225
H4::ForceH4
Particle force for hermite integrator.
Definition: hermite_particle.h:190
H4::ParticleH4::print
void print(std::ostream &_fout) const
print function for one line
Definition: hermite_particle.h:104
H4::ForceH4::printColumnTitle
void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: hermite_particle.h:210
H4::ParticleH4
particle type for AR integrator, not necessary anymore
Definition: hermite_particle.h:6
H4::ForceH4::pot
Float pot
Definition: hermite_particle.h:194
H4::ParticleH4::pot
Float pot
Definition: hermite_particle.h:47
H4::ParticleH4::acc1
Float acc1[3]
Definition: hermite_particle.h:42
H4::ForceH4::ForceH4
ForceH4()
Definition: hermite_particle.h:196
Float
double Float
Definition: Float.h:25
H4::ForceH4::acc0
Float acc0[3]
Definition: hermite_particle.h:192
H4
Definition: ar_information.h:9
H4::ParticleH4::printColumnTitle
void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: hermite_particle.h:122
H4::ForceH4::clear
void clear()
clear function
Definition: hermite_particle.h:199
H4::ForceH4::acc1
Float acc1[3]
Definition: hermite_particle.h:193
H4::ParticleH4::operator=
ParticleH4 & operator=(const Tparticle &_p)
Definition: hermite_particle.h:76
H4::ParticleH4::ParticleH4
ParticleH4(const ParticleH4< Tparticle > &_p)
Definition: hermite_particle.h:55