Program Listing for File integratorclass.hpp#

Return to documentation for file (pymembrane/cppmodule/src/integrators/integratorclass.hpp)

/************************************************************************************
 * MIT License                                                                       *
 *                                                                                   *
 * Copyright (c) 2023 Dr. Daniel Alejandro Matoz Fernandez                           *
 *               fdamatoz@gmail.com                                                  *
 * Permission is hereby granted, free of charge, to any person obtaining a copy      *
 * of this software and associated documentation files (the "Software"), to deal     *
 * in the Software without restriction, including without limitation the rights      *
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell         *
 * copies of the Software, and to permit persons to whom the Software is             *
 * furnished to do so, subject to the following conditions:                          *
 *                                                                                   *
 * The above copyright notice and this permission notice shall be included in all    *
 * copies or substantial portions of the Software.                                   *
 *                                                                                   *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR        *
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,          *
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE       *
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER            *
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,     *
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE     *
 * SOFTWARE.                                                                         *
 *************************************************************************************/
#ifndef __integratorclass__hpp__
#define __integratorclass__hpp__

#include <memory>
#include <iostream>

#include "../types/globaltypes.hpp"
#include "../utils/fromstring.hpp"
#include "../system/systemclass.hpp"
#include "../box/pbc.hpp"
#include <pybind11/pybind11.h>
namespace py = pybind11;

class IntegratorClass
{
public:
   IntegratorClass(SystemClass &system) : _system(system)
   {
   }
   virtual ~IntegratorClass()
   {
   }
   virtual void prestep(void) = 0;
   virtual void poststep(void) = 0;
   void set_temperature(const real &_T)
   {
      T = fabs(_T);
      update_temperature_parameters();
   }
   virtual void update_temperature_parameters() {}

   real get_temperature(void) const { return T; }
   virtual void set_time_step(const real &_dt)
   {
      dt = fabs(_dt);
      update_time_step_parameters();
   }
   virtual void update_time_step_parameters() {}
   real get_time_step(void) const { return dt; }
   std::string get_name(void) { return m_name; }
   std::string get_type(void) { return m_type; }

   virtual std::map<std::string, std::string> get_info(void) = 0;

   virtual void set_default_properties(void) = 0;
   virtual void set_property(std::map<std::string, std::map<std::pair<std::string, std::string>, std::string>> &value_map) { this->print_warning_calling("map<string, map<pair<string, string>, string>> "); };
   virtual void set_property(std::map<std::string, std::map<std::string, std::string>> &value_map) { this->print_warning_calling("map<string, map<string, string>>"); };
   virtual void set_property(std::map<std::string, std::string> &value_map) { this->print_warning_calling("std::map<std::string, std::string>"); }
   void print_warning_calling(const std::string &message) { py::print("integrator ", m_name, " cannot be called with ", message); }
   void print_warning_property_name(const std::string &message) { py::print("parameter ", message, " is not part of ", m_name, "-", m_type, " integrator"); }

protected:
   SystemClass &_system;
   std::string m_name;
   std::string m_type;
   real T;
   real dt;
};

typedef std::shared_ptr<IntegratorClass> IntegratorClass_ptr;

#endif