Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/config.cpp

    r1b2d30 r274d45  
    55 */
    66
     7#include "Helpers/MemDebug.hpp"
     8
    79#include <stdio.h>
    810#include <cstring>
    911
     12#include "World.hpp"
    1013#include "atom.hpp"
    1114#include "bond.hpp"
    12 #include "bondgraph.hpp"
    1315#include "config.hpp"
    14 #include "ConfigFileBuffer.hpp"
    1516#include "element.hpp"
    1617#include "helpers.hpp"
     
    2223#include "molecule.hpp"
    2324#include "periodentafel.hpp"
    24 #include "ThermoStatContainer.hpp"
    2525#include "World.hpp"
    2626
     27/******************************** Functions for class ConfigFileBuffer **********************/
     28
     29/** Structure containing compare function for Ion_Type sorting.
     30 */
     31struct IonTypeCompare {
     32  bool operator()(const char* s1, const char *s2) const {
     33    char number1[8];
     34    char number2[8];
     35    const char *dummy1, *dummy2;
     36    //Log() << Verbose(0) << s1 << "  " << s2 << endl;
     37    dummy1 = strchr(s1, '_')+sizeof(char)*5;  // go just after "Ion_Type"
     38    dummy2 = strchr(dummy1, '_');
     39    strncpy(number1, dummy1, dummy2-dummy1); // copy the number
     40    number1[dummy2-dummy1]='\0';
     41    dummy1 = strchr(s2, '_')+sizeof(char)*5;  // go just after "Ion_Type"
     42    dummy2 = strchr(dummy1, '_');
     43    strncpy(number2, dummy1, dummy2-dummy1); // copy the number
     44    number2[dummy2-dummy1]='\0';
     45    if (atoi(number1) != atoi(number2))
     46      return (atoi(number1) < atoi(number2));
     47    else {
     48      dummy1 = strchr(s1, '_')+sizeof(char);
     49      dummy1 = strchr(dummy1, '_')+sizeof(char);
     50      dummy2 = strchr(dummy1, ' ') < strchr(dummy1, '\t') ? strchr(dummy1, ' ') : strchr(dummy1, '\t');
     51      strncpy(number1, dummy1, dummy2-dummy1); // copy the number
     52      number1[dummy2-dummy1]='\0';
     53      dummy1 = strchr(s2, '_')+sizeof(char);
     54      dummy1 = strchr(dummy1, '_')+sizeof(char);
     55      dummy2 = strchr(dummy1, ' ') < strchr(dummy1, '\t') ? strchr(dummy1, ' ') : strchr(dummy1, '\t');
     56      strncpy(number2, dummy1, dummy2-dummy1); // copy the number
     57      number2[dummy2-dummy1]='\0';
     58      return (atoi(number1) < atoi(number2));
     59    }
     60  }
     61};
     62
     63/** Constructor for ConfigFileBuffer class.
     64 */
     65ConfigFileBuffer::ConfigFileBuffer() : buffer(NULL), LineMapping(NULL), CurrentLine(0), NoLines(0)
     66{
     67};
     68
     69/** Constructor for ConfigFileBuffer class with filename to be parsed.
     70 * \param *filename file name
     71 */
     72ConfigFileBuffer::ConfigFileBuffer(const char * const filename) : buffer(NULL), LineMapping(NULL), CurrentLine(0), NoLines(0)
     73{
     74  ifstream *file = NULL;
     75  char line[MAXSTRINGSIZE];
     76
     77  // prescan number of lines
     78  file= new ifstream(filename);
     79  if (file == NULL) {
     80    DoeLog(1) && (eLog()<< Verbose(1) << "config file " << filename << " missing!" << endl);
     81    return;
     82  }
     83  NoLines = 0; // we're overcounting by one
     84  long file_position = file->tellg(); // mark current position
     85  do {
     86    file->getline(line, 256);
     87    NoLines++;
     88  } while (!file->eof());
     89  file->clear();
     90  file->seekg(file_position, ios::beg);
     91  DoLog(1) && (Log() << Verbose(1) << NoLines-1 << " lines were recognized." << endl);
     92
     93  // allocate buffer's 1st dimension
     94  if (buffer != NULL) {
     95    DoeLog(1) && (eLog()<< Verbose(1) << "FileBuffer->buffer is not NULL!" << endl);
     96    return;
     97  } else
     98    buffer = new char *[NoLines];
     99
     100  // scan each line and put into buffer
     101  int lines=0;
     102  int i;
     103  do {
     104    buffer[lines] = new char[MAXSTRINGSIZE];
     105    file->getline(buffer[lines], MAXSTRINGSIZE-1);
     106    i = strlen(buffer[lines]);
     107    buffer[lines][i] = '\n';
     108    buffer[lines][i+1] = '\0';
     109    lines++;
     110  } while((!file->eof()) && (lines < NoLines));
     111  DoLog(1) && (Log() << Verbose(1) << lines-1 << " lines were read into the buffer." << endl);
     112
     113  // close and exit
     114  file->close();
     115  file->clear();
     116  delete(file);
     117}
     118
     119/** Destructor for ConfigFileBuffer class.
     120 */
     121ConfigFileBuffer::~ConfigFileBuffer()
     122{
     123  for(int i=0;i<NoLines;++i)
     124    delete[](buffer[i]);
     125  delete[](buffer);
     126  delete[](LineMapping);
     127}
     128
     129
     130/** Create trivial mapping.
     131 */
     132void ConfigFileBuffer::InitMapping()
     133{
     134  LineMapping = new int[NoLines];
     135  for (int i=0;i<NoLines;i++)
     136    LineMapping[i] = i;
     137}
     138
     139/** Creates a mapping for the \a *FileBuffer's lines containing the Ion_Type keyword such that they are sorted.
     140 * \a *map on return contains a list of NoAtom entries such that going through the list, yields indices to the
     141 * lines in \a *FileBuffer in a sorted manner of the Ion_Type?_? keywords. We assume that ConfigFileBuffer::CurrentLine
     142 * points to first Ion_Type entry.
     143 * \param *FileBuffer pointer to buffer structure
     144 * \param NoAtoms of subsequent lines to look at
     145 */
     146void ConfigFileBuffer::MapIonTypesInBuffer(const int NoAtoms)
     147{
     148  map<const char *, int, IonTypeCompare> IonTypeLineMap;
     149  if (LineMapping == NULL) {
     150    DoeLog(0) && (eLog()<< Verbose(0) << "map pointer is NULL: " << LineMapping << endl);
     151    performCriticalExit();
     152    return;
     153  }
     154
     155  // put all into hashed map
     156  for (int i=0; i<NoAtoms; ++i) {
     157    IonTypeLineMap.insert(pair<const char *, int> (buffer[CurrentLine+i], CurrentLine+i));
     158  }
     159
     160  // fill map
     161  int nr=0;
     162  for (map<const char *, int, IonTypeCompare>::iterator runner = IonTypeLineMap.begin(); runner != IonTypeLineMap.end(); ++runner) {
     163    if (CurrentLine+nr < NoLines)
     164      LineMapping[CurrentLine+(nr++)] = runner->second;
     165    else {
     166      DoeLog(0) && (eLog()<< Verbose(0) << "config::MapIonTypesInBuffer - NoAtoms is wrong: We are past the end of the file!" << endl);
     167      performCriticalExit();
     168    }
     169  }
     170}
     171
    27172/************************************* Functions for class config ***************************/
    28173
    29174/** Constructor for config file class.
    30175 */
    31 config::config() : BG(NULL), Thermostats(0), PsiType(0), MaxPsiDouble(0), PsiMaxNoUp(0), PsiMaxNoDown(0), MaxMinStopStep(1), InitMaxMinStopStep(1), ProcPEGamma(8), ProcPEPsi(1), configpath(NULL),
    32     configname(NULL), FastParsing(false), Deltat(0.01), basis(""), databasepath(NULL), DoConstrainedMD(0), MaxOuterStep(0), mainname(NULL), defaultpath(NULL), pseudopotpath(NULL),
     176config::config() : BG(NULL), PsiType(0), MaxPsiDouble(0), PsiMaxNoUp(0), PsiMaxNoDown(0), MaxMinStopStep(1), InitMaxMinStopStep(1), ProcPEGamma(8), ProcPEPsi(1), configpath(NULL),
     177    configname(NULL), FastParsing(false), Deltat(0.01), basis(""), databasepath(NULL), DoConstrainedMD(0), MaxOuterStep(0), Thermostat(4), ThermostatImplemented(NULL),
     178    ThermostatNames(NULL), TempFrequency(2.5), alpha(0.), HooverMass(0.), TargetTemp(0.00095004455), ScaleTempStep(25),  mainname(NULL), defaultpath(NULL), pseudopotpath(NULL),
    33179    DoOutVis(0), DoOutMes(1), DoOutNICS(0), DoOutOrbitals(0), DoOutCurrent(0), DoFullCurrent(0), DoPerturbation(0), DoWannier(0), CommonWannier(0), SawtoothStart(0.01),
    34180    VectorPlane(0), VectorCut(0.), UseAddGramSch(1), Seed(1), OutVisStep(10), OutSrcStep(5), MaxPsiStep(0), EpsWannier(1e-7), MaxMinStep(100), RelEpsTotalEnergy(1e-7),
     
    42188  configpath = new char[MAXSTRINGSIZE];
    43189  configname = new char[MAXSTRINGSIZE];
    44   Thermostats = new ThermoStatContainer();
    45190  strcpy(mainname,"pcp");
    46191  strcpy(defaultpath,"not specified");
     
    49194  configname[0]='\0';
    50195  basis = "3-21G";
     196
     197  InitThermostats();
    51198};
    52199
     
    61208  delete[](configpath);
    62209  delete[](configname);
    63   if (Thermostats != NULL)
    64     delete(Thermostats);
     210  delete[](ThermostatImplemented);
     211  for (int j=0;j<MaxThermostats;j++)
     212    delete[](ThermostatNames[j]);
     213  delete[](ThermostatNames);
    65214
    66215  if (BG != NULL)
    67216    delete(BG);
    68217};
     218
     219/** Initialises variables in class config for Thermostats.
     220 */
     221void config::InitThermostats()
     222{
     223  ThermostatImplemented = new int[MaxThermostats];
     224  ThermostatNames = new char *[MaxThermostats];
     225  for (int j=0;j<MaxThermostats;j++)
     226    ThermostatNames[j] = new char[12];
     227
     228  strcpy(ThermostatNames[0],"None");
     229  ThermostatImplemented[0] = 1;
     230  strcpy(ThermostatNames[1],"Woodcock");
     231  ThermostatImplemented[1] = 1;
     232  strcpy(ThermostatNames[2],"Gaussian");
     233  ThermostatImplemented[2] = 1;
     234  strcpy(ThermostatNames[3],"Langevin");
     235  ThermostatImplemented[3] = 1;
     236  strcpy(ThermostatNames[4],"Berendsen");
     237  ThermostatImplemented[4] = 1;
     238  strcpy(ThermostatNames[5],"NoseHoover");
     239  ThermostatImplemented[5] = 1;
     240};
     241
     242/** Readin of Thermostat related values from parameter file.
     243 * \param *fb file buffer containing the config file
     244 */
     245void config::ParseThermostats(class ConfigFileBuffer * const fb)
     246{
     247  char * const thermo = new char[12];
     248  const int verbose = 0;
     249
     250  // read desired Thermostat from file along with needed additional parameters
     251  if (ParseForParameter(verbose,fb,"Thermostat", 0, 1, 1, string_type, thermo, 1, optional)) {
     252    if (strcmp(thermo, ThermostatNames[0]) == 0) { // None
     253      if (ThermostatImplemented[0] == 1) {
     254        Thermostat = None;
     255      } else {
     256        DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
     257        Thermostat = None;
     258      }
     259    } else if (strcmp(thermo, ThermostatNames[1]) == 0) { // Woodcock
     260      if (ThermostatImplemented[1] == 1) {
     261        Thermostat = Woodcock;
     262        ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &ScaleTempStep, 1, critical); // read scaling frequency
     263      } else {
     264        DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
     265        Thermostat = None;
     266      }
     267    } else if (strcmp(thermo, ThermostatNames[2]) == 0) { // Gaussian
     268      if (ThermostatImplemented[2] == 1) {
     269        Thermostat = Gaussian;
     270        ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &ScaleTempStep, 1, critical); // read collision rate
     271      } else {
     272        DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
     273        Thermostat = None;
     274      }
     275    } else if (strcmp(thermo, ThermostatNames[3]) == 0) { // Langevin
     276      if (ThermostatImplemented[3] == 1) {
     277        Thermostat = Langevin;
     278        ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &TempFrequency, 1, critical); // read gamma
     279        if (ParseForParameter(verbose,fb,"Thermostat", 0, 3, 1, double_type, &alpha, 1, optional)) {
     280          DoLog(2) && (Log() << Verbose(2) << "Extended Stochastic Thermostat detected with interpolation coefficient " << alpha << "." << endl);
     281        } else {
     282          alpha = 1.;
     283        }
     284      } else {
     285        DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
     286        Thermostat = None;
     287      }
     288    } else if (strcmp(thermo, ThermostatNames[4]) == 0) { // Berendsen
     289      if (ThermostatImplemented[4] == 1) {
     290        Thermostat = Berendsen;
     291        ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &TempFrequency, 1, critical); // read \tau_T
     292      } else {
     293        DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
     294        Thermostat = None;
     295      }
     296    } else if (strcmp(thermo, ThermostatNames[5]) == 0) { // Nose-Hoover
     297      if (ThermostatImplemented[5] == 1) {
     298        Thermostat = NoseHoover;
     299        ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &HooverMass, 1, critical); // read Hoovermass
     300        alpha = 0.;
     301      } else {
     302        DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
     303        Thermostat = None;
     304      }
     305    } else {
     306      DoLog(1) && (Log() << Verbose(1) << " Warning: thermostat name was not understood!" << endl);
     307      Thermostat = None;
     308    }
     309  } else {
     310    if ((MaxOuterStep > 0) && (TargetTemp != 0))
     311      DoLog(2) && (Log() << Verbose(2) <<  "No thermostat chosen despite finite temperature MD, falling back to None." << endl);
     312    Thermostat = None;
     313  }
     314  delete[](thermo);
     315};
     316
    69317
    70318/** Displays menu for editing each entry of the config file.
     
    408656};
    409657
     658/** Initializes ConfigFileBuffer from a file.
     659 * \param *file input file stream being the opened config file
     660 * \param *FileBuffer pointer to FileBuffer on return, should point to NULL
     661 */
     662void PrepareFileBuffer(const char * const filename, struct ConfigFileBuffer *&FileBuffer)
     663{
     664  if (FileBuffer != NULL) {
     665    DoeLog(2) && (eLog()<< Verbose(2) << "deleting present FileBuffer in PrepareFileBuffer()." << endl);
     666    delete(FileBuffer);
     667  }
     668  FileBuffer = new ConfigFileBuffer(filename);
     669
     670  FileBuffer->InitMapping();
     671};
     672
    410673/** Loads a molecule from a ConfigFileBuffer.
    411674 * \param *mol molecule to load
     
    604867
    605868  // ParseParameterFile
    606   class ConfigFileBuffer *FileBuffer = new ConfigFileBuffer(filename);
     869  struct ConfigFileBuffer *FileBuffer = NULL;
     870  PrepareFileBuffer(filename,FileBuffer);
    607871
    608872  /* Oeffne Hauptparameterdatei */
     
    613877  int verbose = 0;
    614878 
    615   //TODO: This is actually sensible?: if (MaxOuterStep > 0)
    616879  ParseThermostats(FileBuffer);
    617880 
     
    678941  ParseForParameter(verbose,FileBuffer,"OutVisStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional);
    679942  ParseForParameter(verbose,FileBuffer,"OutSrcStep", 0, 1, 1, int_type, &(config::OutSrcStep), 1, optional);
    680   ParseForParameter(verbose,FileBuffer,"TargetTemp", 0, 1, 1, double_type, &(Thermostats->TargetTemp), 1, optional);
     943  ParseForParameter(verbose,FileBuffer,"TargetTemp", 0, 1, 1, double_type, &(config::TargetTemp), 1, optional);
    681944  //ParseForParameter(verbose,FileBuffer,"Thermostat", 0, 1, 1, int_type, &(config::ScaleTempStep), 1, optional);
    682945  if (!ParseForParameter(verbose,FileBuffer,"EpsWannier", 0, 1, 1, double_type, &(config::EpsWannier), 1, optional))
     
    8871150  ParseForParameter(verbose,file,"VisOuterStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional);
    8881151  ParseForParameter(verbose,file,"VisSrcOuterStep", 0, 1, 1, int_type, &(config::OutSrcStep), 1, optional);
    889   ParseForParameter(verbose,file,"TargetTemp", 0, 1, 1, double_type, &(Thermostats->TargetTemp), 1, optional);
    890   ParseForParameter(verbose,file,"ScaleTempStep", 0, 1, 1, int_type, &(Thermostats->ScaleTempStep), 1, optional);
     1152  ParseForParameter(verbose,file,"TargetTemp", 0, 1, 1, double_type, &(config::TargetTemp), 1, optional);
     1153  ParseForParameter(verbose,file,"ScaleTempStep", 0, 1, 1, int_type, &(config::ScaleTempStep), 1, optional);
    8911154  config::EpsWannier = 1e-8;
    8921155
     
    10761339    *output << "DoFullCurrent\t" << config::DoFullCurrent << "\t# Do full perturbation" << endl;
    10771340    *output << "DoConstrainedMD\t" << config::DoConstrainedMD << "\t# Do perform a constrained (>0, relating to current MD step) instead of unconstrained (0) MD" << endl;
    1078     *output << "Thermostat\t" << Thermostats->ThermostatNames[Thermostats->Thermostat] << "\t";
    1079     switch(Thermostats->Thermostat) {
     1341    *output << "Thermostat\t" << ThermostatNames[Thermostat] << "\t";
     1342    switch(Thermostat) {
    10801343      default:
    10811344      case None:
    10821345        break;
    10831346      case Woodcock:
    1084         *output << Thermostats->ScaleTempStep;
     1347        *output << ScaleTempStep;
    10851348        break;
    10861349      case Gaussian:
    1087         *output << Thermostats->ScaleTempStep;
     1350        *output << ScaleTempStep;
    10881351        break;
    10891352      case Langevin:
    1090         *output << Thermostats->TempFrequency << "\t" << Thermostats->alpha;
     1353        *output << TempFrequency << "\t" << alpha;
    10911354        break;
    10921355      case Berendsen:
    1093         *output << Thermostats->TempFrequency;
     1356        *output << TempFrequency;
    10941357        break;
    10951358      case NoseHoover:
    1096         *output << Thermostats->HooverMass;
     1359        *output << HooverMass;
    10971360        break;
    10981361    };
     
    11091372    *output << "OutVisStep\t" << config::OutVisStep << "\t# Output visual data every ...th step" << endl;
    11101373    *output << "OutSrcStep\t" << config::OutSrcStep << "\t# Output \"restart\" data every ..th step" << endl;
    1111     *output << "TargetTemp\t" << Thermostats->TargetTemp << "\t# Target temperature" << endl;
     1374    *output << "TargetTemp\t" << config::TargetTemp << "\t# Target temperature" << endl;
    11121375    *output << "MaxPsiStep\t" << config::MaxPsiStep << "\t# number of Minimisation steps per state (0 - default)" << endl;
    11131376    *output << "EpsWannier\t" << config::EpsWannier << "\t# tolerance value for spread minimisation of orbitals" << endl;
     
    12201483    // output of atoms
    12211484    AtomNo = 0;
    1222     mol->ActOnAllAtoms( &atom::OutputMPQCLine, (ostream * const) output, (const Vector *)center, &AtomNo );
     1485    mol->ActOnAllAtoms( &atom::OutputMPQCLine, output, (const Vector *)center, &AtomNo );
    12231486    delete(center);
    12241487    *output << "\t}" << endl;
     
    12621525    // output of atoms
    12631526    AtomNo = 0;
    1264     mol->ActOnAllAtoms( &atom::OutputMPQCLine, (ostream * const) output, (const Vector *)center, &AtomNo );
     1527    mol->ActOnAllAtoms( &atom::OutputMPQCLine, output, (const Vector *)center, &AtomNo );
    12651528    delete(center);
    12661529    *output << "\t}" << endl;
     
    15211784  char filename[MAXSTRINGSIZE];
    15221785  ofstream output;
    1523   molecule *mol = World::getInstance().createMolecule();
    1524   mol->SetNameFromFilename(ConfigFileName);
     1786  molecule *mol = NULL;
    15251787
    15261788  if (!strcmp(configpath, GetDefaultPath())) {
     
    15531815  // translate each to its center and merge all molecules in MoleculeListClass into this molecule
    15541816  int N = molecules->ListOfMolecules.size();
    1555   int *src = new int[N];
    1556   N=0;
    1557   for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) {
    1558     src[N++] = (*ListRunner)->IndexNr;
    1559     (*ListRunner)->Translate(&(*ListRunner)->Center);
    1560   }
    1561   molecules->SimpleMultiAdd(mol, src, N);
    1562   delete[](src);
    1563 
    1564   // ... and translate back
    1565   for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) {
    1566     (*ListRunner)->Center.Scale(-1.);
    1567     (*ListRunner)->Translate(&(*ListRunner)->Center);
    1568     (*ListRunner)->Center.Scale(-1.);
     1817  if (N != 1) { // don't do anything in case of only one molecule (shifts mol ids otherwise)
     1818    int *src = new int[N];
     1819    N=0;
     1820    for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) {
     1821      src[N++] = (*ListRunner)->IndexNr;
     1822      (*ListRunner)->Translate(&(*ListRunner)->Center);
     1823    }
     1824    mol = World::getInstance().createMolecule();
     1825    mol->SetNameFromFilename(ConfigFileName);
     1826    molecules->SimpleMultiMerge(mol, src, N);
     1827    mol->doCountAtoms();
     1828    mol->CountElements();
     1829    mol->CalculateOrbitals(*this);
     1830    delete[](src);
     1831  } else {
     1832    if (!molecules->ListOfMolecules.empty()) {
     1833      mol = *(molecules->ListOfMolecules.begin());
     1834      mol->doCountAtoms();
     1835      mol->CalculateOrbitals(*this);
     1836    } else {
     1837      DoeLog(1) && (eLog() << Verbose(1) << "There are no molecules to save!" << endl);
     1838    }
    15691839  }
    15701840
    15711841  Log() << Verbose(0) << "Storing configuration ... " << endl;
    15721842  // get correct valence orbitals
    1573   mol->CalculateOrbitals(*this);
    1574   InitMaxMinStopStep = MaxMinStopStep = MaxPsiDouble;
    15751843  if (ConfigFileName != NULL) { // test the file name
    15761844    strcpy(filename, ConfigFileName);
     
    16321900  }
    16331901
    1634   World::getInstance().destroyMolecule(mol);
     1902  // don't destroy molecule as it contains all our atoms
     1903  //World::getInstance().destroyMolecule(mol);
    16351904};
    16361905
     
    20772346  return (found); // true if found, false if not
    20782347}
    2079 
    2080 /** Reading of Thermostat related values from parameter file.
    2081  * \param *fb file buffer containing the config file
    2082  */
    2083 void config::ParseThermostats(class ConfigFileBuffer * const fb)
    2084 {
    2085   char * const thermo = new char[12];
    2086   const int verbose = 0;
    2087 
    2088   // read desired Thermostat from file along with needed additional parameters
    2089   if (ParseForParameter(verbose,fb,"Thermostat", 0, 1, 1, string_type, thermo, 1, optional)) {
    2090     if (strcmp(thermo, Thermostats->ThermostatNames[0]) == 0) { // None
    2091       if (Thermostats->ThermostatImplemented[0] == 1) {
    2092         Thermostats->Thermostat = None;
    2093       } else {
    2094         DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
    2095         Thermostats->Thermostat = None;
    2096       }
    2097     } else if (strcmp(thermo, Thermostats->ThermostatNames[1]) == 0) { // Woodcock
    2098       if (Thermostats->ThermostatImplemented[1] == 1) {
    2099         Thermostats->Thermostat = Woodcock;
    2100         ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &Thermostats->ScaleTempStep, 1, critical); // read scaling frequency
    2101       } else {
    2102         DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
    2103         Thermostats->Thermostat = None;
    2104       }
    2105     } else if (strcmp(thermo, Thermostats->ThermostatNames[2]) == 0) { // Gaussian
    2106       if (Thermostats->ThermostatImplemented[2] == 1) {
    2107         Thermostats->Thermostat = Gaussian;
    2108         ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &Thermostats->ScaleTempStep, 1, critical); // read collision rate
    2109       } else {
    2110         DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
    2111         Thermostats->Thermostat = None;
    2112       }
    2113     } else if (strcmp(thermo, Thermostats->ThermostatNames[3]) == 0) { // Langevin
    2114       if (Thermostats->ThermostatImplemented[3] == 1) {
    2115         Thermostats->Thermostat = Langevin;
    2116         ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &Thermostats->TempFrequency, 1, critical); // read gamma
    2117         if (ParseForParameter(verbose,fb,"Thermostat", 0, 3, 1, double_type, &Thermostats->alpha, 1, optional)) {
    2118           DoLog(2) && (Log() << Verbose(2) << "Extended Stochastic Thermostat detected with interpolation coefficient " << Thermostats->alpha << "." << endl);
    2119         } else {
    2120           Thermostats->alpha = 1.;
    2121         }
    2122       } else {
    2123         DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
    2124         Thermostats->Thermostat = None;
    2125       }
    2126     } else if (strcmp(thermo, Thermostats->ThermostatNames[4]) == 0) { // Berendsen
    2127       if (Thermostats->ThermostatImplemented[4] == 1) {
    2128         Thermostats->Thermostat = Berendsen;
    2129         ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &Thermostats->TempFrequency, 1, critical); // read \tau_T
    2130       } else {
    2131         DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
    2132         Thermostats->Thermostat = None;
    2133       }
    2134     } else if (strcmp(thermo, Thermostats->ThermostatNames[5]) == 0) { // Nose-Hoover
    2135       if (Thermostats->ThermostatImplemented[5] == 1) {
    2136         Thermostats->Thermostat = NoseHoover;
    2137         ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &Thermostats->HooverMass, 1, critical); // read Hoovermass
    2138         Thermostats->alpha = 0.;
    2139       } else {
    2140         DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);
    2141         Thermostats->Thermostat = None;
    2142       }
    2143     } else {
    2144       DoLog(1) && (Log() << Verbose(1) << " Warning: thermostat name was not understood!" << endl);
    2145       Thermostats->Thermostat = None;
    2146     }
    2147   } else {
    2148     if ((Thermostats->TargetTemp != 0))
    2149       DoLog(2) && (Log() << Verbose(2) <<  "No thermostat chosen despite finite temperature MD, falling back to None." << endl);
    2150     Thermostats->Thermostat = None;
    2151   }
    2152   delete[](thermo);
    2153 };
    2154 
Note: See TracChangeset for help on using the changeset viewer.