PeTar
N-body code for collisional gravitational systems
|
Go to the documentation of this file.
3 #include "Common/binary_tree.h"
33 #ifdef ARTIFICIAL_PARTICLE_DEBUG
49 #ifdef ARTIFICIAL_PARTICLE_DEBUG
50 assert(_status>0.0&&_mass_backup>0.0);
53 mass_backup = _mass_backup;
58 return (status>0.0 && mass_backup>0.0);
63 #ifdef ARTIFICIAL_PARTICLE_DEBUG
71 #ifdef ARTIFICIAL_PARTICLE_DEBUG
85 return (status==0.0 && mass_backup==0.0);
92 #ifdef ARTIFICIAL_PARTICLE_DEBUG
96 mass_backup = _mass_backup;
108 #ifdef ARTIFICIAL_PARTICLE_DEBUG
111 if (_data>0.0) status = _data;
112 else mass_backup = _data;
119 #ifdef ARTIFICIAL_PARTICLE_DEBUG
122 if (is_positive)
return status;
123 else return mass_backup;
128 #ifdef ARTIFICIAL_PARTICLE_DEBUG
141 return (status<0.0 && mass_backup<0.0);
146 status = - NUMERIC_FLOAT_MAX;
147 mass_backup = - NUMERIC_FLOAT_MAX;
156 _fout<<std::setw(_width)<<
"mass_bk"
157 <<std::setw(_width)<<
"status";
167 int counter = _counter;
169 _fout<<std::setw(_offset)<<
" "<<counter<<
". mass_bk: artificial particle parameter 1 [formatted] (0.0)\n";
171 _fout<<std::setw(_offset)<<
" "<<counter<<
". status: artificial particle parameter 2 [formatted] (0.0)\n";
181 _fout<<std::setw(_width)<<mass_backup
182 <<std::setw(_width)<<status;
189 fprintf(_fout,
"%26.17e %26.17e ",
190 this->mass_backup, this->status);
204 PS::S64 rcount=fscanf(_fin,
"%lf %lf ",
205 &this->mass_backup, &this->status);
207 std::cerr<<
"Error: Data reading fails! requiring data number is 2, only obtain "<<rcount<<
".\n";
218 std::cerr<<
"Error: Data reading fails! requiring data number is 1, only obtain "<<rcount<<
".\n";
224 void print(std::ostream & _fout)
const{
225 _fout<<
" mass_bk="<<mass_backup
226 <<
" status="<<status;
276 template <
class Tptcl>
278 COMM::BinaryTree<Tptcl,COMM::Binary> &_bin,
284 for (
int i=0; i<n_artificial-1; i++) {
285 Tptcl* pi = &_ptcl_artificial[i];
286 Tptcl* binary_member_i = _bin.getMember(i%2);
287 pi->id =
id_offset + abs(binary_member_i->id)*n_artificial +i;
288 auto& pi_artificial = pi->group_data.artificial;
289 pi_artificial.setParticleTypeToArtificial(
PS::F64(i+1));
290 #ifdef ARTIFICIAL_PARTICLE_DEBUG
291 assert(pi_artificial.isArtificial());
296 #ifdef ARTIFICIAL_PARTICLE_DEBUG
305 for (
int j=0; j<2; j++) {
306 PS::S32 n_members = _bin.isMemberTree(j) ? ((COMM::BinaryTree<Tptcl,COMM::Binary>*)(_bin.getMember(j)))->getMemberN() : 1;
307 _ptcl_artificial[j].group_data.artificial.storeData(n_members);
308 #ifdef ARTIFICIAL_PARTICLE_DEBUG
315 assert(_n_data+2<n_artificial-1);
316 for (
int j=0; j<_n_data; j++) {
317 _ptcl_artificial[j+2].group_data.artificial.storeData(_data_to_store[j]);
318 #ifdef ARTIFICIAL_PARTICLE_DEBUG
319 assert(_data_to_store[j]>0);
326 pcm->group_data.artificial.setParticleTypeToCM(_bin.mass, _bin.getMemberN());
327 #ifdef ARTIFICIAL_PARTICLE_DEBUG
328 assert(pcm->group_data.artificial.isCM());
331 else pcm->mass = _bin.mass;
334 pcm->id = - std::abs(_bin.id);
342 template <
class Tptcl>
354 for (
int k=0; k<n_orb; k++) {
355 acc_cm += porb[k].mass*porb[k].acc;
356 m_ob_tot += porb[k].mass;
360 #ifdef ARTIFICIAL_PARTICLE_DEBUG
361 assert(abs(m_ob_tot-pcm->group_data.artificial.getMassBackup())<1e-10);
372 template <
class Tptcl>
385 template <
class Tptcl>
387 #ifdef ARTIFICIAL_PARTICLE_DEBUG
394 template <
class Tptcl>
396 #ifdef ARTIFICIAL_PARTICLE_DEBUG
397 assert(_ptcl_list[
getIndexOffsetTT()].group_data.artificial.isArtificial());
403 template <
class Tptcl>
405 #ifdef ARTIFICIAL_PARTICLE_DEBUG
442 template <
class Tptcl>
444 #ifdef ARTIFICIAL_PARTICLE_DEBUG
445 assert(_ptcl_list[0].group_data.artificial.isArtificial());
447 return PS::S32(_ptcl_list[0].group_data.artificial.getData());
451 template <
class Tptcl>
453 #ifdef ARTIFICIAL_PARTICLE_DEBUG
460 template <
class Tptcl>
462 #ifdef ARTIFICIAL_PARTICLE_DEBUG
463 assert(_ptcl_list[1].group_data.artificial.isArtificial());
465 return PS::S32(_ptcl_list[1].group_data.artificial.getData(
true));
469 template <
class Tptcl>
471 #ifdef ARTIFICIAL_PARTICLE_DEBUG
478 template <
class Tptcl>
480 #ifdef ARTIFICIAL_PARTICLE_DEBUG
481 assert(_ptcl_list[_index+2].group_data.artificial.isArtificial());
483 return _ptcl_list[_index+2].group_data.artificial.getData(_is_positive);
505 std::cerr<<
"Error: Data reading fails! requiring data number is 2, only obtain "<<rcount<<
".\n";
512 void print(std::ostream & _fout)
const{
519 #ifdef ARTIFICIAL_PARTICLE_DEBUG
520 template <
class Tptcl,
class Tpart>
521 void checkConsistence(Tptcl* _ptcl_member, Tpart* _ptcl_artificial) {
523 PS::S64 id_min = _ptcl_member[0].id;
524 for(
int j=0; j<
getMemberN(_ptcl_artificial); j++) id_min =
std::min(id_min,_ptcl_member[j].
id);
525 assert(
getCMID(_ptcl_artificial) == id_min);
544 for(
int j=0; j<
getMemberN(_ptcl_artificial); j++) {
545 mass_cm_check += _ptcl_member[j].mass;
546 pos_cm_check += _ptcl_member[j].pos*_ptcl_member[j].mass;
549 pos_cm_check /= mass_cm_check;
552 assert(abs(mass_cm_check-pcm->group_data.artificial.getMassBackup())<1e-10);
554 assert(abs(dpos*dpos)<1e-20);
Tptcl * getCMParticles(Tptcl *_ptcl_list)
get c.m. particle list address from a artificial particle array
Definition: artificial_particles.hpp:404
static PS::S32 getParticleN()
get particle number
Definition: tidal_tensor.hpp:435
PS::S64 getCMID(const Tptcl *_ptcl_list) const
get center of mass id
Definition: artificial_particles.hpp:470
static void createTidalTensorMeasureParticles(Tptcl *_ptcl_tt, const Tptcl &_ptcl_cm, const PS::F64 _size)
create tidal tensor measurement particles
Definition: tidal_tensor.hpp:51
void createSampleParticles(Tptcl *_ptcl_artificial, COMM::BinaryTree< Tptcl, COMM::Binary > &_bin)
create pseudoparticle multipole particles
Definition: pseudoparticle_multipole.hpp:19
PS::F64 getStoredData(const Tptcl *_ptcl_list, const PS::S32 _index, const bool _is_positive) const
get stored data
Definition: artificial_particles.hpp:479
void print(std::ostream &_fout) const
print parameters
Definition: artificial_particles.hpp:512
int32_t S32
Definition: pikg_vector.hpp:24
void readBinary(FILE *_fin)
read class data with BINARY format
Definition: artificial_particles.hpp:215
bool checkParams()
check paramters
Definition: pseudoparticle_multipole.hpp:9
void setParticleTypeToMember(const PS::F64 _mass=PS::LARGE_FLOAT, const PS::F64 _status=-PS::LARGE_FLOAT)
set particle type to member
Definition: artificial_particles.hpp:32
Vector3< F64 > F64vec
Definition: pikg_vector.hpp:167
void correctOrbitalParticleForce(Tptcl *_ptcl_artificial)
correct orbit-samping/pseudo particles force
Definition: artificial_particles.hpp:343
PS::S32 getMemberN(const Tptcl *_ptcl_list) const
get member number
Definition: artificial_particles.hpp:452
void writeAscii(FILE *_fout) const
write class data with ASCII format
Definition: artificial_particles.hpp:188
static PS::S32 getParticleN()
get particle number
Definition: pseudoparticle_multipole.hpp:58
bool checkParams()
check paramters
Definition: artificial_particles.hpp:244
void correctArtficialParticleForce(Tptcl *_ptcl_artificial)
correct artificial particles force for furture use
Definition: artificial_particles.hpp:373
double F64
Definition: pikg_vector.hpp:17
PS::S32 getLeftMemberN(const Tptcl *_ptcl_list) const
get left member number
Definition: artificial_particles.hpp:443
int64_t S64
Definition: pikg_vector.hpp:23
PS::F64 r_tidal_tensor
Definition: artificial_particles.hpp:235
orbital sampling method for counter force from binary
Definition: orbit_sampling.hpp:6
void readBinary(FILE *_fin)
read class data to file with binary format
Definition: artificial_particles.hpp:499
PS::S32 getTidalTensorParticleN() const
get artificial particle total number
Definition: artificial_particles.hpp:432
PS::F64 getStatus() const
get status
Definition: artificial_particles.hpp:135
T min(const Vector3< T > &v)
Definition: pikg_vector.hpp:150
PS::S32 getRightMemberN(const Tptcl *_ptcl_list) const
get right member number
Definition: artificial_particles.hpp:461
PS::S32 getIndexOffsetTT() const
tidal tensor particle index offset
Definition: artificial_particles.hpp:412
void printColumn(std::ostream &_fout, const int _width=20)
print data of class members using column style
Definition: artificial_particles.hpp:180
OrbitManager orbit_manager
gravitational constant
Definition: artificial_particles.hpp:238
PS::S32 getArtificialParticleN() const
get artificial particle total number
Definition: artificial_particles.hpp:427
bool isCM() const
return whether the particle type is c.m.
Definition: artificial_particles.hpp:57
PseudoParticle Multipole method for counter force from binaries.
Definition: pseudoparticle_multipole.hpp:6
ArtificialParticleInformation()
initializer
Definition: artificial_particles.hpp:27
PseudoParticleMultipoleManager OrbitManager
Definition: artificial_particles.hpp:11
static void subtractCMForce(Tptcl *_ptcl_tt, const Tptcl &_ptcl_cm)
subtract c.m. force from measure points
Definition: tidal_tensor.hpp:94
void storeData(const PS::F64 _data)
store one data (only in artificial particles)
Definition: artificial_particles.hpp:107
void createArtificialParticles(Tptcl *_ptcl_artificial, COMM::BinaryTree< Tptcl, COMM::Binary > &_bin, const PS::F64 *_data_to_store, const PS::S32 _n_data)
create artificial particles
Definition: artificial_particles.hpp:277
void print(std::ostream &_fout) const
print parameters
Definition: artificial_particles.hpp:224
bool isUnused() const
return whether the particle is unused
Definition: artificial_particles.hpp:140
PS::F64 getMassBackup() const
get backup mass
Definition: artificial_particles.hpp:70
PS::S64 id_offset
tidal tensor maximum distance of particles
Definition: artificial_particles.hpp:236
void setMassBackup(const PS::F64 _mass)
set backup mass
Definition: artificial_particles.hpp:62
PS::F64 getData(const bool is_positive) const
get stored data (only in artificial particles)
Definition: artificial_particles.hpp:118
static int printTitleWithMeaning(std::ostream &_fout, const int _counter=0, const int _offset=0)
print column title with meaning (each line for one column)
Definition: artificial_particles.hpp:166
Tptcl * getTidalTensorParticles(Tptcl *_ptcl_list)
get tidal tensor particle list address from a artificial particle array
Definition: artificial_particles.hpp:395
void writeBinary(FILE *_fp)
write class data to file with binary format
Definition: pseudoparticle_multipole.hpp:65
bool isSingle() const
return whether the particle type is single
Definition: artificial_particles.hpp:84
void readAscii(FILE *_fin)
read class data with ASCII format
Definition: artificial_particles.hpp:203
void writeBinary(FILE *_fp)
write class data to file with binary format
Definition: artificial_particles.hpp:489
PS::S32 getIndexOffsetOrb() const
orbital/pseudo particle index offset
Definition: artificial_particles.hpp:417
bool isMember() const
return whether the particle type is member
Definition: artificial_particles.hpp:41
void setParticleTypeToSingle()
set particle type to single
Definition: artificial_particles.hpp:78
void setParticleTypeToUnused()
set particle type to unused
Definition: artificial_particles.hpp:145
void print(std::ostream &_fout) const
print parameters
Definition: pseudoparticle_multipole.hpp:75
static void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: artificial_particles.hpp:155
void readBinary(FILE *_fin)
read class data to file with binary format
Definition: pseudoparticle_multipole.hpp:71
#define ASSERT(expr)
Definition: hard_assert.hpp:238
class to organize artificial particles
Definition: artificial_particles.hpp:232
PS::S32 getIndexOffsetCM() const
CM particle index offset.
Definition: artificial_particles.hpp:422
void setParticleTypeToCM(const PS::F64 _mass_backup=PS::LARGE_FLOAT, const PS::F64 _status=PS::LARGE_FLOAT)
set particle type to artificial
Definition: artificial_particles.hpp:48
PS::F64 gravitational_constant
offset to generate ID for artificial particles
Definition: artificial_particles.hpp:237
void writeBinary(FILE *_fin) const
write class data with BINARY format
Definition: artificial_particles.hpp:196
PS::S32 getOrbitalParticleN() const
get orbitial particle number
Definition: artificial_particles.hpp:437
void setStatus(const PS::F64 _status)
set status
Definition: artificial_particles.hpp:127
void setParticleTypeToArtificial(const PS::F64 _status=PS::LARGE_FLOAT, const PS::F64 _mass_backup=0.0)
set particle type to artificial
Definition: artificial_particles.hpp:91
bool isArtificial() const
return whether the particle type is artificial
Definition: artificial_particles.hpp:100
Tptcl * getOrbitalParticles(Tptcl *_ptcl_list)
get oribit/pseudo particle list address from a artificial particle array
Definition: artificial_particles.hpp:386
class to store necessary information for using artificial particles
Definition: artificial_particles.hpp:20
ArtificialParticleManager()
orbit particle method
Definition: artificial_particles.hpp:241