CosmoGRaPH v0.0
Public Member Functions | Private Attributes | List of all members
cosmo::Particles Class Reference

Class for evolving non-interacting matter particles. More...

#include <particles.h>

Collaboration diagram for cosmo::Particles:
Collaboration graph
[legend]

Public Member Functions

void init (idx_t n_particles)
 Create random particles. More...
 
void addParticle (Particle< real_t > particle)
 Add an individual particle. More...
 
particle_vec * getParticleVec ()
 
real_t getFractionalIndex (real_t x)
 Compute non-integer index at a point.
 
idx_t getIndexBelow (real_t x)
 Returns the index "below" a point (floor of getFractionalIndex) More...
 
idx_t getNearestIndex (real_t x)
 Returns the index nearest a point (rounds getFractionalIndex)
 
void setX_d (real_t X[3], real_t x_d[3])
 Sets a fractional distance between grid points. More...
 
ParticleMetricPrimitives< real_t > interpolatePrimitivesFromCorners (ParticleMetricPrimitives< real_t > corner_pp_in[2][2][2], real_t x_d[3])
 Linearly interpolate metric quantities from corners of a "box". More...
 
ParticleMetricPrimitives< real_t > interpolatePrimitivesFromCornersIncomplete (ParticleMetricPrimitives< real_t > corner_pp_in[2][2][2], real_t x_d[3])
 Only set some metric components. More...
 
real_t linearInterpolation (real_t C000, real_t C001, real_t C010, real_t C011, real_t C100, real_t C101, real_t C110, real_t C111, real_t x_d[3])
 
ParticleMetricPrimitives< real_t > getInterpolatedPrimitivesIncomplete (Particle< real_t > *p, map_t &bssn_fields)
 Interpolate some metric primitives required for geodesic integration. More...
 
ParticleMetricPrimitives< real_t > getInterpolatedPrimitives (Particle< real_t > *p, map_t &bssn_fields)
 Interpolate metric primitives required for geodesic integration. More...
 
void RKStep (ParticleRegister< real_t > *pr, real_t h, real_t RK_sum_coeff, map_t &bssn_fields)
 Implementation for evaluating a single RK step. More...
 
void RK1Step (map_t &bssn_fields)
 
void RK2Step (map_t &bssn_fields)
 
void RK3Step (map_t &bssn_fields)
 
void RK4Step (map_t &bssn_fields)
 
void stepInit (map_t &bssn_fields)
 
void regSwap_c_a ()
 
void stepTerm ()
 
real_t getKernelWeight (real_t r, real_t r_s)
 
void addParticlesToBSSNSrc (BSSN *bssnSim)
 
void addParticleToBSSNSrc (Particle< real_t > *p_c, map_t &bssn_fields)
 

Private Attributes

particle_vec * particles
 

Detailed Description

Class for evolving non-interacting matter particles.

Class stores a (private) vector of particles, and contains routines for particle evolution, interpolation, and interactions with GR (BSSN) fields.

Member Function Documentation

void cosmo::Particles::addParticle ( Particle< real_t >  particle)

Add an individual particle.

Add an individual particle to the internal list of particles

Parameters
particleParticle struct
void cosmo::Particles::addParticlesToBSSNSrc ( BSSN bssnSim)

Set bssn _a source registers using data from particle _c register

idx_t cosmo::Particles::getIndexBelow ( real_t  x)

Returns the index "below" a point (floor of getFractionalIndex)

Returns
index associated with position
ParticleMetricPrimitives< real_t > cosmo::Particles::getInterpolatedPrimitives ( Particle< real_t > *  p,
map_t &  bssn_fields 
)

Interpolate metric primitives required for geodesic integration.

Interpolate metric primitives (eg, variables in a ParticleMetricPrimitives struct) required for geodesic integration near a particular particle.

Parameters
pInstance of particle to compute interpolated metric quantities near (Particle type).
bssn_fieldsMap from bssn class to fields.
Returns
Returns ParticleMetricPrimitives with values near the particle
ParticleMetricPrimitives< real_t > cosmo::Particles::getInterpolatedPrimitivesIncomplete ( Particle< real_t > *  p,
map_t &  bssn_fields 
)

Interpolate some metric primitives required for geodesic integration.

Interpolate some metric primitives (eg, only some variables in a ParticleMetricPrimitives struct: alpha, phi, gamma_ij) required for geodesic integration near a particular particle. See also: getInterpolatedPrimitives

Parameters
pInstance of particle to compute interpolated metric quantities near (Particle type).
bssn_fieldsMap from bssn class to fields.
Returns
Returns ParticleMetricPrimitives with values near the particle
void cosmo::Particles::init ( idx_t  n_particles)

Create random particles.

Add particles with randomized positions, zero velocity, and unit mass to internal particles vector.

Parameters
n_particlesnumber of particles to create
ParticleMetricPrimitives< real_t > cosmo::Particles::interpolatePrimitivesFromCorners ( ParticleMetricPrimitives< real_t >  corner_pp_in[2][2][2],
real_t  x_d[3] 
)

Linearly interpolate metric quantities from corners of a "box".

Linearly interpolate metric quantities from corners of a "box"

Parameters
corner_pp_inA 2x2x2 array containing metric values at corners of the "box"
x_dfractional position between corners inside the "box" to interpolate values at (see setX_d)
Returns
[description]
ParticleMetricPrimitives< real_t > cosmo::Particles::interpolatePrimitivesFromCornersIncomplete ( ParticleMetricPrimitives< real_t >  corner_pp_in[2][2][2],
real_t  x_d[3] 
)

Only set some metric components.

Only set some metric components: gamma_ij, rootdetg, and alpha see also: getInterpolatedPrimitivesIncomplete

Parameters
corner_pp_in2x2x2 array of metric primitives at corners (incomplete)
Returns
metric primitives (incomplete)
void cosmo::Particles::RKStep ( ParticleRegister< real_t > *  pr,
real_t  h,
real_t  RK_sum_coeff,
map_t &  bssn_fields 
)

Implementation for evaluating a single RK step.

General implementation for computing one of the RK steps: y_p; y_a = y_c = yp; y_f = 0 (TODO) y_a = y_p

y_c = y_p + dt/2 * f(y_a) // RK1 step y_f += y_c y_a <-> y_c

y_c = y_p + dt/2 * f(y_a) // RK2 step y_f += 2 y_c y_a <-> y_c

y_c = y_p + dt * f(y_a) // RK3 step y_f += y_c y_a <-> y_c

y_c = y_p + dt/2 * f(y_a) // RK4 step y_f += y_c y_a <-> y_c

(y_f = 5y_p + 1/2 K1 + K2 + K3 + 1/2 K4) y_f = y_f / 3 - 2/3 y_p // finalize y_f <-> y_p

Using Baumgarte & Shapiro, 5.223-5.225

For a single RK step, we can just do: y_c = y_p + h * f(y_a) and y_f += RK_sum_coeff * y_c

Parameters
prRegister of particles to integrate
[in]hstep size for particular RK step
[in]RK_sum_coeffcoefficient when adding RK step
bssn_fieldsMap from bssn class to fields.
void cosmo::Particles::setX_d ( real_t  X[3],
real_t  x_d[3] 
)

Sets a fractional distance between grid points.

Stores the fractional distance between grid points of a given point. Eg, for dx = 0.5, the value 1.23 is 46/100 the way between gridpoints at 1.0 and 1.5, so 0.46 is computed. Following this, supplying the point (1.23, 4.56, 7.89) as an argument for X would cause x_d to be set to (0.46, 0.12, 0.78)

Parameters
Xtrue position
x_dfractional position (passed by reference; values are mutated)

The documentation for this class was generated from the following files: