/** * @file System.hpp * @author jun * @brief System declarations * @version 0.1 * @date 2023-07-25 * * Copyright (c) 2023 jun * */ #pragma once #include #include #include "Atom.hpp" typedef std::function PotentialFunction; typedef std::function ForceFunction; class System { private: std::vector atoms; ///< Atoms in the system std::vector atomsOld; ///< Atoms in the system in the previous step std::vector forceTable; ///< Force table std::vector forceTableOld; ///< Force table in the previous step std::vector potentialTable; ///< Potential table ForceFunction forceGenerator; ///< Force generator PotentialFunction potentialGenerator; ///< Potential generator double rcut; ///< Cutoff radius double rcut2; ///< Cutoff radius squared std::size_t tableResolution = 1000; ///< Resolution of the force table double timeDelta = 0; ///< Time delta between steps /** * @brief Initialize the force and potential tables * */ void initTables(); /** * @brief Evaluate interaction forces between atoms * */ void evaulateForces(); public: explicit System(double timeDelta, double rcut, PotentialFunction potentialFunction, ForceFunction forceFunction, std::size_t tableResolution = 1000); void step(); /** * @brief Step the system to the first step using euler method * */ void stepFirst(); /** * @brief Add an atom to the system * * @param atom */ void addAtom(Atom atom); /** * @brief Add a vector of atoms to the system * * @param atoms */ void addAtom(std::vector atoms); /** * @brief Print atoms * */ void printAtoms(); };