Changeset 579a81 for src/Thermostats


Ignore:
Timestamp:
Aug 20, 2010, 1:54:23 PM (15 years ago)
Author:
Tillmann Crueger <crueger@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
0b882a
Parents:
194649
Message:

Added a basic self-descriptive structure for Thermostats

Location:
src/Thermostats
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • src/Thermostats/Berendsen.cpp

    r194649 r579a81  
    1212#include "Helpers/Log.hpp"
    1313#include "ThermoStatContainer.hpp"
     14#include "World.hpp"
    1415
    15 Berendsen::Berendsen(double _ActualTemp) :
    16   ActualTemp(_ActualTemp)
     16Berendsen::Berendsen(double _TempFrequency) :
     17  TempFrequency(_TempFrequency)
    1718{}
    1819
     
    2021{}
    2122
    22 double Berendsen::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
    23   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     23ThermostatTraits<class Berendsen>::ThermostatTraits() :
     24  name("Berendsen")
     25{}
     26
     27
     28double Berendsen::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
     29  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    2430}
    2531
    26 double Berendsen::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
    27   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     32double Berendsen::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
     33  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    2834}
    2935
    30 double Berendsen::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
    31   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     36double Berendsen::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
     37  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    3238}
    3339
    3440template <class ForwardIterator>
    35 double Berendsen::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end){
     41double Berendsen::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end){
    3642  DoLog(2) && (Log() << Verbose(2) <<  "Applying Berendsen-VanGunsteren thermostat..." << endl);
    3743  double ekin;
    38   double ScaleTempFactor = configuration.Thermostats->TargetTemp/ActualTemp;
     44  double ScaleTempFactor = getContainer().TargetTemp/ActualTemp;
    3945  for(ForwardIterator iter=begin;iter!=end;++iter){
    4046    Vector &U = (*iter)->Trajectory.U.at(step);
    4147    if ((*iter)->FixedIon == 0) { // even FixedIon moves, only not by other's forces
    42       U *= sqrt(1+(configuration.Deltat/configuration.Thermostats->TempFrequency)*(ScaleTempFactor-1));
     48      U *= sqrt(1+(World::getInstance().getConfig()->Deltat/TempFrequency)*(ScaleTempFactor-1));
    4349      ekin += 0.5*(*iter)->getType()->mass * U.NormSquared();
    4450    }
     
    4652  return ekin;
    4753}
     54
     55std::string Berendsen::name(){
     56  return ThermostatTraits<Berendsen>().name;
     57}
     58
     59std::string Berendsen::writeParam(){
     60  stringstream sstr;
     61  sstr << TempFrequency;
     62  return sstr.str();
     63}
  • src/Thermostats/Berendsen.hpp

    r194649 r579a81  
    1717  virtual ~Berendsen();
    1818
    19   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
    20   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
    21   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
     19  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
     20  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
     21  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
    2222
    23   virtual std::string name() { return "Berendsen";}
     23  virtual std::string name();
     24
     25  virtual std::string writeParam();
     26
    2427private:
    2528  template <class ForwardIterator>
    26   double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end);
     29  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end);
    2730
    28   double ActualTemp;
     31  double TempFrequency;
     32};
     33
     34template <>
     35struct ThermostatTraits<class Berendsen>{
     36  ThermostatTraits();
     37  const char* name;
    2938};
    3039
  • src/Thermostats/GaussianThermostat.cpp

    r194649 r579a81  
    1313#include "element.hpp"
    1414#include "config.hpp"
     15#include "World.hpp"
     16
    1517#include <set>
    1618
    17 GaussianThermostat::GaussianThermostat() : E(0),G(0)
     19GaussianThermostat::GaussianThermostat(int _ScaleTempStep) :
     20  E(0),G(0),
     21  ScaleTempStep(_ScaleTempStep)
    1822{}
    1923
     
    2125{}
    2226
    23 double GaussianThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
    24   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     27ThermostatTraits<GaussianThermostat>::ThermostatTraits() :
     28  name("Gaussian")
     29{}
     30
     31double GaussianThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
     32  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    2533}
    2634
    27 double GaussianThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
    28   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     35double GaussianThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
     36  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    2937}
    3038
    31 double GaussianThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
    32   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     39double GaussianThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
     40  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    3341}
    3442
    3543template <class ForwardIterator>
    36 double GaussianThermostat::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end){
     44double GaussianThermostat::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end){
    3745  DoLog(2) && (Log() << Verbose(2) <<  "Applying Gaussian thermostat..." << endl);
    3846  init(step,begin,end);
     
    4351    Vector &U = (*iter)->Trajectory.U.at(step);
    4452    if ((*iter)->FixedIon == 0) {// even FixedIon moves, only not by other's forces
    45       U += configuration.Deltat * G_over_E * U;
     53      U += World::getInstance().getConfig()->Deltat * G_over_E * U;
    4654      ekin += (*iter)->getType()->mass * U.NormSquared();
    4755    }
     
    7179  return G;
    7280}
     81
     82std::string GaussianThermostat::name(){
     83  return ThermostatTraits<GaussianThermostat>().name;
     84}
     85
     86std::string GaussianThermostat::writeParams(){
     87  std::stringstream sstr;
     88  sstr << ScaleTempStep;
     89  return sstr.str();
     90}
  • src/Thermostats/GaussianThermostat.hpp

    r194649 r579a81  
    1616{
    1717public:
    18   GaussianThermostat();
     18  GaussianThermostat(int ScaleTempStep);
    1919  virtual ~GaussianThermostat();
    2020
    21   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
    22   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
    23   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
     21  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
     22  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
     23  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
    2424
    25   virtual std::string name() { return "Gaussian";}
    2625  double getE() const;
    2726  double getG() const;
     27
     28  virtual std::string name();
     29  virtual std::string writeParams();
    2830private:
    2931  template <class ForwardIterator>
    3032  void init(unsigned int step,ForwardIterator begin, ForwardIterator end);
    3133  template <class ForwardIterator>
    32   double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end);
     34  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end);
    3335  double E,G;
     36  int ScaleTempStep;
     37};
     38
     39template <>
     40struct ThermostatTraits<GaussianThermostat>{
     41  ThermostatTraits();
     42  const char* name;
    3443};
    3544
  • src/Thermostats/Langevin.cpp

    r194649 r579a81  
    2525}
    2626
    27 double Langevin::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
    28   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     27ThermostatTraits<class Langevin>::ThermostatTraits() :
     28  name("Langevin")
     29{}
     30
     31double Langevin::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
     32  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    2933}
    3034
    31 double Langevin::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
    32   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     35double Langevin::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
     36  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    3337}
    3438
    35 double Langevin::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
    36   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     39double Langevin::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
     40  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    3741}
    3842
    3943template <class ForwardIterator>
    40 double Langevin::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end){
     44double Langevin::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end){
    4145  DoLog(2) && (Log() << Verbose(2) <<  "Applying Langevin thermostat..." << endl);
    4246  double ekin=0;
    4347  for(ForwardIterator iter=begin;iter!=end;++iter){
    44     double sigma  = sqrt(configuration.Thermostats->TargetTemp/(*iter)->getType()->mass); // sigma = (k_b T)/m (Hartree/atomicmass = atomiclength/atomictime)
     48    double sigma  = sqrt(getContainer().TargetTemp/(*iter)->getType()->mass); // sigma = (k_b T)/m (Hartree/atomicmass = atomiclength/atomictime)
    4549    Vector &U = (*iter)->Trajectory.U.at(step);
    4650    if ((*iter)->FixedIon == 0) { // even FixedIon moves, only not by other's forces
    4751      // throw a dice to determine whether it gets hit by a heat bath particle
    48       if (((((rand()/(double)RAND_MAX))*configuration.Thermostats->TempFrequency) < 1.)) {
     52      if (((((rand()/(double)RAND_MAX))*TempFrequency) < 1.)) {
    4953        DoLog(3) && (Log() << Verbose(3) << "Particle " << (**iter) << " was hit (sigma " << sigma << "): " << sqrt(U[0]*U[0]+U[1]*U[1]+U[2]*U[2]) << " -> ");
    5054        // pick three random numbers from a Boltzmann distribution around the desired temperature T for each momenta axis
     
    5963  return ekin;
    6064}
     65
     66std::string Langevin::name(){
     67  return ThermostatTraits<Langevin>().name;
     68}
     69
     70std::string Langevin::writeParams(){
     71  stringstream sstr;
     72  sstr << TempFrequency << "\t" << alpha;
     73  return sstr.str();
     74}
  • src/Thermostats/Langevin.hpp

    r194649 r579a81  
    1717  virtual ~Langevin();
    1818
    19   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list))=0;
    20   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector))=0;
    21   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set))=0;
     19  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
     20  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
     21  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
    2222
    23   virtual std::string name(){return "Langevin";}
     23  virtual std::string name();
     24  virtual std::string writeParams();
    2425
    2526private:
    2627  template <class ForwardIterator>
    27   double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end);
     28  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end);
    2829
     30
     31  double TempFrequency;
     32  double alpha;
    2933  gsl_rng * r;
    3034  const gsl_rng_type * T;
    3135};
    3236
     37template <>
     38struct ThermostatTraits<class Langevin>{
     39  ThermostatTraits();
     40  const char* name;
     41};
     42
    3343#endif /* LANGEVIN_HPP_ */
  • src/Thermostats/NoThermostat.cpp

    r194649 r579a81  
    1414{}
    1515
    16 double NoThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
     16ThermostatTraits<class NoThermostat>::ThermostatTraits() :
     17  name("None")
     18{}
     19
     20double NoThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
    1721  return 0;
    1822}
    1923
    20 double NoThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
     24double NoThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
    2125  return 0;
    2226}
    2327
    24 double NoThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
     28double NoThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
    2529  return 0;
    2630}
     31
     32std::string NoThermostat::name(){
     33  return ThermostatTraits<NoThermostat>().name;
     34}
     35
     36std::string NoThermostat::writeParams(){
     37  return "";
     38}
  • src/Thermostats/NoThermostat.hpp

    r194649 r579a81  
    1717  virtual ~NoThermostat();
    1818
    19   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
    20   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
    21   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
     19  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
     20  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
     21  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
    2222
    23   virtual std::string name() { return "None";}
     23  virtual std::string name();
     24  virtual std::string writeParams();
     25};
     26
     27template <>
     28struct ThermostatTraits<class NoThermostat>{
     29  ThermostatTraits();
     30  const char* name;
    2431};
    2532
  • src/Thermostats/NoseHoover.cpp

    r194649 r579a81  
    1313#include "Helpers/Log.hpp"
    1414#include "ThermoStatContainer.hpp"
     15#include "World.hpp"
    1516
    16 NoseHoover::NoseHoover()
     17NoseHoover::NoseHoover(double _HooverMass) :
     18  HooverMass(_HooverMass)
    1719{}
    1820
     
    2022{}
    2123
     24ThermostatTraits<class NoseHoover>::ThermostatTraits() :
     25  name("NoseHoover")
     26{}
    2227
    23 double NoseHoover::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
    24   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     28
     29double NoseHoover::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
     30  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    2531}
    2632
    27 double NoseHoover::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
    28   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     33double NoseHoover::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
     34  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    2935}
    3036
    31 double NoseHoover::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
    32   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     37double NoseHoover::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
     38  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    3339}
    3440
    3541template <class ForwardIterator>
    36 double NoseHoover::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end){
     42double NoseHoover::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end){
    3743  DoLog(2) && (Log() << Verbose(2) <<  "Applying Nose-Hoover thermostat..." << endl);
    3844  init(step,begin,end);
    39   delta_alpha = (delta_alpha - (3.*count+1.) * configuration.Thermostats->TargetTemp)/(configuration.Thermostats->HooverMass*Units2Electronmass);
    40   configuration.Thermostats->alpha += delta_alpha*configuration.Deltat;
    41   DoLog(3) && (Log() << Verbose(3) << "alpha = " << delta_alpha << " * " << configuration.Deltat << " = " << configuration.Thermostats->alpha << "." << endl);
     45  delta_alpha = (delta_alpha - (3.*count+1.) * getContainer().TargetTemp)/(HooverMass*Units2Electronmass);
     46  getContainer().alpha += delta_alpha*World::getInstance().getConfig()->Deltat;
     47  DoLog(3) && (Log() << Verbose(3) << "alpha = " << delta_alpha << " * " << World::getInstance().getConfig()->Deltat << " = " << getContainer().alpha << "." << endl);
    4248  double ekin =0;
    4349  for(ForwardIterator iter=begin;iter!=end;++iter){
    4450    Vector &U = (*iter)->Trajectory.U.at(step);
    4551    if ((*iter)->FixedIon == 0) { // even FixedIon moves, only not by other's forces
    46       U += configuration.Deltat/(*iter)->getType()->mass * (configuration.Thermostats->alpha * (U * (*iter)->getType()->mass));
     52      U += World::getInstance().getConfig()->Deltat/(*iter)->getType()->mass * (getContainer().alpha * (U * (*iter)->getType()->mass));
    4753      ekin += (0.5*(*iter)->getType()->mass) * U.NormSquared();
    4854    }
     
    6369  }
    6470}
     71
     72std::string NoseHoover::name(){
     73  return ThermostatTraits<NoseHoover>().name;
     74}
     75
     76std::string NoseHoover::writeParams(){
     77  std::stringstream sstr;
     78  sstr << HooverMass;
     79  return sstr.str();
     80}
  • src/Thermostats/NoseHoover.hpp

    r194649 r579a81  
    1414{
    1515public:
    16   NoseHoover();
     16  NoseHoover(double _HooverMass);
    1717  virtual ~NoseHoover();
    1818
    19   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
    20   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
    21   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
     19  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
     20  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
     21  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
    2222
    23   virtual std::string name() { return "Nose-Hoover";}
     23  virtual std::string name();
     24  virtual std::string writeParams();
    2425
    2526private:
     
    2728  void init(unsigned int step,ForwardIterator begin, ForwardIterator end);
    2829  template <class ForwardIterator>
    29   double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end);
     30  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end);
    3031
     32  double HooverMass;
    3133  double delta_alpha;
    3234  int count;
    3335};
    3436
     37template <>
     38struct ThermostatTraits<class NoseHoover>{
     39  ThermostatTraits();
     40  const char* name;
     41};
     42
     43
    3544#endif /* NOSEHOOVER_HPP_ */
  • src/Thermostats/Thermostat.cpp

    r194649 r579a81  
    88#include "Thermostat.hpp"
    99
    10 Thermostat::Thermostat()
     10#include "Helpers/Assert.hpp"
     11
     12Thermostat::Thermostat() :
     13  container(0)
    1114{}
    1215
    1316Thermostat::~Thermostat()
    1417{}
     18
     19ThermostatTraits<Thermostat>::ThermostatTraits() :
     20  name("Base")
     21{}
     22
     23void Thermostat::addToContainer(ThermoStatContainer &_container){
     24  container = &_container;
     25}
     26
     27ThermoStatContainer &Thermostat::getContainer(){
     28  ASSERT(container,"No container used for this Thermostat");
     29  return *container;
     30}
  • src/Thermostats/Thermostat.hpp

    r194649 r579a81  
    1717#include "AtomSet.hpp"
    1818
     19class ThermoStatContainer;
     20
    1921class Thermostat
    2022{
    2123public:
    2224  Thermostat();
    23   virtual  ~Thermostat();
     25  virtual ~Thermostat();
    2426
    2527  // cannot template this, because we need virtual functions
    26   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list))=0;
    27   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector))=0;
    28   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set))=0;
     28  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms)=0;
     29  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms)=0;
     30  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms)=0;
    2931
    3032  virtual std::string name()=0;
     33
     34  virtual std::string writeParams()=0;
     35protected:
     36  void addToContainer(ThermoStatContainer &);
     37  ThermoStatContainer &getContainer();
     38private:
     39  ThermoStatContainer* container;
     40};
     41
     42template <class Thermostat>
     43struct ThermostatTraits;
     44
     45template <>
     46struct ThermostatTraits<Thermostat>{
     47  ThermostatTraits();
     48  const char* name;
    3149};
    3250
  • src/Thermostats/Woodcock.cpp

    r194649 r579a81  
    1414#include "ThermoStatContainer.hpp"
    1515
    16 Woodcock::Woodcock(int _MDSteps, double _ActualTemp) :
    17   MDSteps(_MDSteps),
    18   ActualTemp(_ActualTemp)
     16#include <sstream>
     17
     18Woodcock::Woodcock(int _ScaleTempStep) :
     19  ScaleTempStep(_ScaleTempStep)
    1920{}
    2021
     
    2223{}
    2324
    24 double Woodcock::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
    25   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     25ThermostatTraits<class Woodcock>::ThermostatTraits() :
     26  name("Woodcock")
     27{}
     28
     29double Woodcock::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
     30  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    2631}
    2732
    28 double Woodcock::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
    29   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     33double Woodcock::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
     34  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    3035}
    3136
    32 double Woodcock::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
    33   return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
     37double Woodcock::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
     38  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
    3439}
    3540
    3641template <class ForwardIterator>
    37 double Woodcock::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin,ForwardIterator end){
     42double Woodcock::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin,ForwardIterator end){
    3843  double ekin=0;
    39   if ((configuration.Thermostats->ScaleTempStep > 0) && ((MDSteps-1) % configuration.Thermostats->ScaleTempStep == 0)) {
    40     double ScaleTempFactor = sqrt(configuration.Thermostats->TargetTemp/ActualTemp);
     44  if ((ScaleTempStep > 0) && ((step-1) % ScaleTempStep == 0)) {
     45    double ScaleTempFactor = sqrt(getContainer().TargetTemp/ActualTemp);
    4146    DoLog(2) && (Log() << Verbose(2) <<  "Applying Woodcock thermostat..." << endl);
    4247    double ekin;
     
    5156  return ekin;
    5257}
     58
     59std::string Woodcock::name(){
     60  return ThermostatTraits<Woodcock>().name;
     61}
     62
     63std::string Woodcock::writeParams(){
     64  std::stringstream sstr;
     65  sstr << ScaleTempStep;
     66  return sstr.str();
     67}
  • src/Thermostats/Woodcock.hpp

    r194649 r579a81  
    1414{
    1515public:
    16   Woodcock(int,double);
     16  Woodcock(int);
    1717  virtual ~Woodcock();
    1818
    19   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
    20   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
    21   virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
     19  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
     20  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
     21  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
    2222
    23   virtual std::string name(){return "Woodcock";}
     23  virtual std::string name();
     24
     25  virtual std::string writeParams();
    2426
    2527private:
    2628  template <class ForwardIterator>
    27   double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin,ForwardIterator end);
     29  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin,ForwardIterator end);
    2830
    29   int MDSteps;
    30   double ActualTemp;
     31  int ScaleTempStep;
     32};
     33
     34template <>
     35struct ThermostatTraits<class Woodcock>{
     36  ThermostatTraits();
     37  const char* name;
    3138};
    3239
Note: See TracChangeset for help on using the changeset viewer.