8 #define UNUSED(expr) (void)(expr)
13 SimplePhysicsSolverConfig::SimplePhysicsSolverConfig(
const double omega_e,
const double omega_b,
14 const double epsilon,
const double sigma)
19 , sigma2(sigma * sigma)
47 const size_t num_particles,
const double t,
54 double factor = double(0.0);
55 for (
size_t i = 0; i < num_particles; ++i) {
57 factor = pre_factor / (charges[i] / masses[i]);
70 const size_t num_particles,
const double t,
72 double* exyz,
double* phis)
76 double r = double(0.0),
79 double* dist =
new double[
DIM];
82 for (
size_t i = 0; i < num_particles; ++i) {
86 phis[i] = double(0.0);
87 for (
size_t d = 0; d <
DIM; ++d) { exyz[i * DIM + d] = double(0.0); }
90 for (
size_t j = 0; j < num_particles; ++j) {
97 for (
size_t d = 0; d <
DIM; ++d) {
98 dist[d] = positions[i * DIM + d] - positions[j * DIM + d];
99 dist2 += dist[d] * dist[d];
102 r = sqrt(dist2 + config->
sigma2);
104 phis[i] += charges[j] / r;
107 for (
size_t d = 0; d <
DIM; ++d) {
108 exyz[i * DIM + d] += dist[d] / r3 * charges[j];
123 void evaluate_e_field(
const double* positions,
const double* charges,
const double* masses,
124 const size_t num_particles,
const double t,
129 double* external =
new double[num_particles *
DIM];
130 double*
internal =
new double[num_particles *
DIM];
131 double* phis =
new double[num_particles];
135 for (
size_t i = 0; i < num_particles; ++i) {
137 for (
size_t d = 0; d <
DIM; ++d) {
138 forces[i * DIM + d] = external[i * DIM + d] +
internal[i * DIM + d];
152 for (
size_t i = 0; i <
DIM; ++i) {
153 b_field_vector[i] = double(0.0);
155 b_field_vector[2] = double(1.0);
156 for (
size_t i = 0; i <
DIM; ++i) {
157 b_field_vector[i] *= config->
omega_b;
161 void evaluate_b_field(
const double* velocities,
const double* charges,
const double* masses,
162 const size_t num_particles,
const double t,
167 for (
size_t i = 0; i < num_particles; ++i) {
170 config->
omega_b / (charges[i] / masses[i]),
180 const double* charges,
const double* masses,
181 const size_t num_particles,
const double t,
185 double e_kin = double(0.0);
186 double e_pot = double(0.0);
188 double* exyz =
new double[num_particles *
DIM];
189 double* phis =
new double[num_particles];
190 double* temp =
new double[
DIM];
191 double v2 = double(0.0);
195 for (
size_t i = 0; i < num_particles; ++i) {
210 e_kin += masses[i] / double(2.0) * v2;
223 return e_kin + e_pot;
230 cross_prod[0] = first[1] * second[2] - first[2] * second[1];
231 cross_prod[1] = first[2] * second[0] - first[0] * second[2];
232 cross_prod[2] = first[0] * second[1] - first[1] * second[0];
238 for (
size_t m = 0; m <
DIM; ++m) {
239 prod += first[m] * second[m];
245 const double factor,
double prod[DIM])
247 for (
size_t i = 0; i <
DIM; ++i) {
248 prod[i] = double(0.0);
249 for (
size_t j = 0; j <
DIM; ++j) {
250 prod[i] += factor * mat[i][j] * vec[j];
258 for (
size_t i = 0; i <
DIM; ++i) {
void evaluate_external_e_field(const double *positions, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config, double *forces)
void evaluate_internal_e_field(const double *positions, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config, double *exyz, double *phis)
double b_field_matrix[3][3]
double scalar_prod(const double first[DIM], const double second[DIM])
double external_e_field_matrix[3][3]
void cross_prod(const double first[DIM], const double second[DIM], double cross_prod[DIM])
void get_b_field_vector(const SimplePhysicsSolverConfig *config, double *b_field_vector)
void evaluate_b_field(const double *velocities, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config, double *forces)
void scale_mat_mul_vec(const double mat[DIM][DIM], const double vec[DIM], const double factor, double prod[DIM])
double compute_energy(const double *positions, const double *velocities, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config)
virtual ~SimplePhysicsSolverConfig()
void evaluate_e_field(const double *positions, const double *charges, const double *masses, const size_t num_particles, const double t, const SimplePhysicsSolverConfig *config, double *forces)
void print_vec(const double vec[DIM])