diff --git a/include/Particle.hpp b/include/Particle.hpp new file mode 100644 index 0000000..29b4ccb --- /dev/null +++ b/include/Particle.hpp @@ -0,0 +1,41 @@ +/** @file Particle.hpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 0.1 + * + * @brief A class that holds the properties of a particle. + * + * @bug No known bugs + * */ +#ifndef __PARTICLE__ +#define __PARTICLE__ + +#include + +/** @brief A class that holds attributes of a particle + * */ +class Particle { +private: + double q; ///< Charge + double m; ///< Mass + arma::vec::fixed<3> r_vec; ///< position + arma::vec::fixed<3> v_vec; ///< velocity + +public: + /** @brief Initialize the particle. + * + * @details Initialize the particle with a charge, mass, position and + * velocity. + * */ + Particle(double q, double m, + arma::vec::fixed<3> r_vec, + arma::vec::fixed<3> v_vec); + + /** @brief Make private attributes available for PenningTrap. + * */ + friend class PenningTrap; +}; + +#endif diff --git a/include/PenningTrap.hpp b/include/PenningTrap.hpp new file mode 100644 index 0000000..b0dbd86 --- /dev/null +++ b/include/PenningTrap.hpp @@ -0,0 +1,80 @@ +/** @file PenningTrap.hpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 0.1 + * + * @brief A class for simulating a Penning trap. + * + * @bug No known bugs + * */ +#ifndef __PENNING_TRAP__ +#define __PENNING_TRAP__ + +#include + +#include "constants.hpp" +#include "Particle.hpp" + +/** @brief A class that simulates a Penning trap. + * + * This class simulates a Penning trap. It can take in a number of particles + * and simulate how they would behave inside a Penning trap. + * */ +class PenningTrap { +private: + double B_0; ///< Magnetic field strength + double V_0; ///< Applied potential + double d; ///< Characteristic dimension + std::vector particles; ///< The particles in the Penning trap + +public: + /** @brief Set B_0, V_0 and d. + * */ + PenningTrap(double B_0 = T, double V_0 = 25.*V/1000., double d = 500.); + + /** @brief Add a particle to the system + * */ + void add_particle(Particle particle); + + /** @brief Calculate E at point r + * */ + arma::vec external_E_field(arma::vec r); + + /** @brief Calculate B at point r + * */ + arma::vec external_B_field(arma::vec r); + + /** @brief Calculate the force between 2 particles. + * + * @details Calculate the force exhibited on particle p_i from + * particle p_j. + * */ + arma::vec force_on_particle(int i, int j); + + /** @brief Calculate the total external force on a particle. + * + * @details Calculate the total amount of force that E and B exhibits + * on particle p_i. + * */ + arma::vec total_force_external(int i); + + /** @brief Calculate the total force on a particle from other particles. + * */ + arma::vec total_force_particles(int i); + + /** @brief calculate the total force on a particle. + * */ + arma::vec total_force(int i); + + /** @brief Go forward one timestep using the RK4 method + * */ + void evolve_RK4(double dt); + + /** @brief Go forward one timestep using the forward Euler method + * */ + void evolve_forward_euler(double dt); +}; + +#endif diff --git a/include/constants.hpp b/include/constants.hpp new file mode 100644 index 0000000..592b48a --- /dev/null +++ b/include/constants.hpp @@ -0,0 +1,21 @@ +/** @file constants.hpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 0.1 + * + * @brief Library of constants + * + * @bug No known bugs + * */ +#ifndef __CONST__ +#define __CONST__ + +#define K_E 138935.333 ///< Coulomb constant. unit: \f$\frac{u(\mu m)^3}{(\mu s)^2 e^2}\f$ + +#define T 96.4852558 ///< 1 Tesla. unit: \f$ \frac{u}{(\mu s) e} \f$ + +#define V 96485255.8 ///< 1 Volt. unit: \f$ \frac{u (\mu m)^2}{(\mu s)^2 e} \f$ + +#endif diff --git a/include/utils.hpp b/include/utils.hpp new file mode 100644 index 0000000..c8d3e4a --- /dev/null +++ b/include/utils.hpp @@ -0,0 +1,65 @@ +/** @file utils.hpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 1.0 + * + * @brief Function prototypes and macros that are useful. + * + * These utility function are mainly for convenience and aren't directly + * related to the project. + * + * @bug No known bugs + * */ +#ifndef __UTILS__ +#define __UTILS__ + +#include +#include +#include +#include + +/** @def DEBUG(msg) + * @brief Writes a debug message + * + * This function writes a debug message that includes the filename, + * line number, and a custom message. The function is wrapped in an ifdef + * that checks if DBG is defined, so one can choose to display the debug + * messages by adding the -DDBG flag when compiling. + * */ +#ifdef DBG + #define DEBUG(msg) std::cout << __FILE__ << " " << __LINE__ << ": " \ + << msg << std::endl +#else + #define DEBUG(msg) +#endif + +/** Code stolen from https://github.com/anderkve/FYS3150 + * Header: https://github.com/anderkve/FYS3150/blob/master/code_examples/compilation_linking/example_1/include/utils.hpp + * Source: https://github.com/anderkve/FYS3150/blob/master/code_examples/compilation_linking/example_1/src/utils.cpp + * */ + +/** @brief Turns a double into a string written in scientific format. + * + * @param d The number to stringify + * @param width The reserved width of the string + * @param prec The precision of the stringified number + * + * @return String + * */ +std::string scientific_format(double d, int width=20, int prec=10); + +/** @brief Turns a vector of doubles into a string written in scientific format. + * + * @param v The vector to stringify + * @param width The reserved width of the string + * @param prec The precision of the stringified number + * + * @return String + * */ +std::string scientific_format(const std::vector& v, + int width=20, + int prec=10); + +#endif diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..fd101c7 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,40 @@ +CC=g++ + +LIBSRCS=utils.cpp +LIBOBJS=$(LIBSRCS:.cpp=.o) + +CLASSSRCS=PenningTrap.cpp Particle.cpp +CLASSOBJS=$(CLASSSRCS:.cpp=.o) + +INCLUDE=../include + +CFLAGS=-larmadillo -llapack -std=c++11 +OPENMP=-fopenmp + +# Add a debug flag when compiling (For the DEBUG macro in utils.hpp) +DEBUG ?= 0 +ifeq ($(DEBUG), 1) + DBGFLAG=-DDBG +else + DBGFLAG= +endif + +.PHONY: clean + +all: test_suite main + +# Rules for executables +main: main.o $(LIBOBJS) + $(CC) $^ -o $@ $(CFLAGS) $(DBGFLAG) -I$(INCLUDE) $(OPENMP) + +test_suite: test_suite.o $(LIBOBJS) + $(CC) $^ -o $@ $(CFLAGS) $(DBGFLAG) -I$(INCLUDE) $(OPENMP) + +# Rule for object files +%.o: %.cpp + $(CC) -c $^ -o $@ $(DBGFLAG) -I$(INCLUDE) $(OPENMP) + +clean: + rm *.o + rm test_suite + rm main diff --git a/src/Particle.cpp b/src/Particle.cpp new file mode 100644 index 0000000..1bcdb15 --- /dev/null +++ b/src/Particle.cpp @@ -0,0 +1,22 @@ +/** @file Particle.cpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 0.1 + * + * @brief The implementation of the Particle class. + * + * @bug No known bugs + * + * @todo Implement constructor + * */ + +#include "Particle.hpp" + +Particle::Particle(double q, double m, + arma::vec::fixed<3> r_vec, + arma::vec::fixed<3> v_vec) +{ + +} diff --git a/src/PenningTrap.cpp b/src/PenningTrap.cpp new file mode 100644 index 0000000..7a4ff2b --- /dev/null +++ b/src/PenningTrap.cpp @@ -0,0 +1,74 @@ +/** @file PenningTrap.cpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 0.1 + * + * @brief The implementation of the PenningTrap class. + * + * @bug No known bugs + * + * @todo Implement constructor + * @todo Implement add_particle + * @todo Implement external_E_field + * @todo Implement external_B_field + * @todo Implement force_on_particle + * @todo Implement total_force_external + * @todo Implement total_force_particles + * @todo Implement total_force + * @todo Implement evolve_RK4 + * @todo Implement evolve_forward_euler + * */ + +#include "PenningTrap.hpp" + +PenningTrap::PenningTrap(double B_0, double V_0, double d) +{ + +} + +void PenningTrap::add_particle(Particle particle) +{ + +} + +arma::vec PenningTrap::external_E_field(arma::vec r) +{ + +} + +arma::vec PenningTrap::external_B_field(arma::vec r) +{ + +} + +arma::vec PenningTrap::force_on_particle(int i, int j) +{ + +} + +arma::vec PenningTrap::total_force_external(int i) +{ + +} + +arma::vec PenningTrap::total_force_particles(int i) +{ + +} + +arma::vec PenningTrap::total_force(int i) +{ + +} + +void PenningTrap::evolve_RK4(double dt) +{ + +} + +void PenningTrap::evolve_forward_euler(double dt) +{ + +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..4c46902 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,16 @@ +/** @file main.cpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 0.1 + * + * @brief The main program for this project + * + * @bug No known bugs + * */ + +int main() +{ + return 0; +} diff --git a/src/test_suite.cpp b/src/test_suite.cpp new file mode 100644 index 0000000..41f8b9c --- /dev/null +++ b/src/test_suite.cpp @@ -0,0 +1,15 @@ +/** @file test_suite.cpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 0.1 + * + * @brief The test suite for the project + * + * @bug No known bugs + * */ +int main() +{ + return 0; +} diff --git a/src/utils.cpp b/src/utils.cpp new file mode 100644 index 0000000..0e93a31 --- /dev/null +++ b/src/utils.cpp @@ -0,0 +1,28 @@ +/** @file utils.cpp + * + * @author Cory Alexander Balaton (coryab) + * @author Janita Ovidie Sandtrøen Willumsen (janitaws) + * + * @version 1.0 + * + * @brief Implementation of the utils + * + * @bug No known bugs + * */ +#include "utils.hpp" + +std::string scientific_format(double d, int width, int prec) +{ + std::stringstream ss; + ss << std::setw(width) << std::setprecision(prec) << std::scientific << d; + return ss.str(); +} + +std::string scientific_format(const std::vector& v, int width, int prec) +{ + std::stringstream ss; + for(double elem : v) { + ss << scientific_format(elem, width, prec); + } + return ss.str(); +}