diff --git a/include/IsingModel.hpp b/include/IsingModel.hpp index 74b8323..d4adc9b 100644 --- a/include/IsingModel.hpp +++ b/include/IsingModel.hpp @@ -27,10 +27,11 @@ #define DOWN 1 #define RIGHT 1 + /** @brief The Ising model in 2 dimensions. * - * @details Here we set \f$ J = 1 \f$, and the Boltzmann constant - * \f$ k_B = 1 \f$. + * @details None of the methods are parallelized, as there is very little + * benefit in doing so. * */ class IsingModel { private: @@ -39,16 +40,26 @@ private: * */ arma::Mat lattice; + /** @brief \f$ L \cross 2 \f$ matrix with the neighbors of each element + * \f$ x_i \f$. + * + * @details The reason why it's \f$ L \cross 2 \f$ instead of + * \f$ L \cross 2 \f$, is that we can see that we can use the same column + * for the left and upper neighbor, and we can use the same column for the + * right and lower neighbor. + * */ arma::Mat neighbors; /** @brief A hash map containing all possible energy changes. * */ std::unordered_map energy_diff; - /** @brief Temperature + /** @brief The temperature of the model. * */ double T; + /** @brief Size of the lattice. + * */ uint L; /** @brief The current energy state. unit: \f$ J \f$. @@ -72,32 +83,57 @@ private: * */ void initialize_lattice(); + /** @brief initialize the neighbors matrix. + * */ void initialize_neighbors(); /** @brief Initialize the hashmap with the correct values. * */ void initialize_energy_diff(); - /** @brief Initialize the model. + /** @brief Initialize the magnetization. * */ void initialize_magnetization(); + /** @brief Initialize the energy. + * */ void initialize_energy(); + /** @brief Constructor used for testing. + * */ + IsingModel(); + public: /** @brief Constructor for the Ising model. * * @param L The size of the lattice. + * @param T The temperature for the system. * */ IsingModel(uint L, double T); /** @brief Constructor for the Ising model. * * @param L The size of the lattice. + * @param T The temperature for the system. + * @param val The value to set for all spins. * */ IsingModel(uint L, double T, int val); + /** @brief The Metropolis algorithm. + * */ void Metropolis(std::mt19937 engine); + + /** @brief Get the current energy. + * + * @return int + * */ + int get_E(); + + /** @brief Get the current magnetization. + * + * @return int + * */ + int get_M(); }; #endif diff --git a/src/IsingModel.cpp b/src/IsingModel.cpp index ef03f85..dda98b9 100644 --- a/src/IsingModel.cpp +++ b/src/IsingModel.cpp @@ -14,8 +14,13 @@ #include "constants.hpp" +#include #include +IsingModel::IsingModel() +{ +} + IsingModel::IsingModel(uint L, double T) { this->L = L; @@ -55,11 +60,11 @@ void IsingModel::initialize_neighbors() { this->neighbors.set_size(this->L, 2); - for (int i = 0; i < this->L; i++) { + // Having i as a signed integer is necessary in this case. + for (int i = 0; i < (int)this->L; i++) { this->neighbors(i, UP) = INDEX(i - 1, this->L); this->neighbors(i, DOWN) = INDEX(i + 1, this->L); } - this->neighbors.print(); } void IsingModel::initialize_energy_diff() @@ -98,7 +103,7 @@ void IsingModel::Metropolis(std::mt19937 engine) std::uniform_real_distribution<> random_number(0., 1.); // Loop over the number of spins - for (int i = 0; i < this->lattice.n_elem; i++) { + for (size_t i = 0; i < this->lattice.n_elem; i++) { // Get random indeces ri = random_index(engine); rj = random_index(engine); @@ -119,3 +124,13 @@ void IsingModel::Metropolis(std::mt19937 engine) } } } + +int IsingModel::get_E() +{ + return this->E; +} + +int IsingModel::get_M() +{ + return this->M; +}