Changes in src/config.cpp [1b2d30:274d45]
- File:
-
- 1 edited
-
src/config.cpp (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/config.cpp
r1b2d30 r274d45 5 5 */ 6 6 7 #include "Helpers/MemDebug.hpp" 8 7 9 #include <stdio.h> 8 10 #include <cstring> 9 11 12 #include "World.hpp" 10 13 #include "atom.hpp" 11 14 #include "bond.hpp" 12 #include "bondgraph.hpp"13 15 #include "config.hpp" 14 #include "ConfigFileBuffer.hpp"15 16 #include "element.hpp" 16 17 #include "helpers.hpp" … … 22 23 #include "molecule.hpp" 23 24 #include "periodentafel.hpp" 24 #include "ThermoStatContainer.hpp"25 25 #include "World.hpp" 26 26 27 /******************************** Functions for class ConfigFileBuffer **********************/ 28 29 /** Structure containing compare function for Ion_Type sorting. 30 */ 31 struct 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 */ 65 ConfigFileBuffer::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 */ 72 ConfigFileBuffer::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 */ 121 ConfigFileBuffer::~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 */ 132 void 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 */ 146 void 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 27 172 /************************************* Functions for class config ***************************/ 28 173 29 174 /** Constructor for config file class. 30 175 */ 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), 176 config::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), 33 179 DoOutVis(0), DoOutMes(1), DoOutNICS(0), DoOutOrbitals(0), DoOutCurrent(0), DoFullCurrent(0), DoPerturbation(0), DoWannier(0), CommonWannier(0), SawtoothStart(0.01), 34 180 VectorPlane(0), VectorCut(0.), UseAddGramSch(1), Seed(1), OutVisStep(10), OutSrcStep(5), MaxPsiStep(0), EpsWannier(1e-7), MaxMinStep(100), RelEpsTotalEnergy(1e-7), … … 42 188 configpath = new char[MAXSTRINGSIZE]; 43 189 configname = new char[MAXSTRINGSIZE]; 44 Thermostats = new ThermoStatContainer();45 190 strcpy(mainname,"pcp"); 46 191 strcpy(defaultpath,"not specified"); … … 49 194 configname[0]='\0'; 50 195 basis = "3-21G"; 196 197 InitThermostats(); 51 198 }; 52 199 … … 61 208 delete[](configpath); 62 209 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); 65 214 66 215 if (BG != NULL) 67 216 delete(BG); 68 217 }; 218 219 /** Initialises variables in class config for Thermostats. 220 */ 221 void 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 */ 245 void 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 69 317 70 318 /** Displays menu for editing each entry of the config file. … … 408 656 }; 409 657 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 */ 662 void 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 410 673 /** Loads a molecule from a ConfigFileBuffer. 411 674 * \param *mol molecule to load … … 604 867 605 868 // ParseParameterFile 606 class ConfigFileBuffer *FileBuffer = new ConfigFileBuffer(filename); 869 struct ConfigFileBuffer *FileBuffer = NULL; 870 PrepareFileBuffer(filename,FileBuffer); 607 871 608 872 /* Oeffne Hauptparameterdatei */ … … 613 877 int verbose = 0; 614 878 615 //TODO: This is actually sensible?: if (MaxOuterStep > 0)616 879 ParseThermostats(FileBuffer); 617 880 … … 678 941 ParseForParameter(verbose,FileBuffer,"OutVisStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional); 679 942 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); 681 944 //ParseForParameter(verbose,FileBuffer,"Thermostat", 0, 1, 1, int_type, &(config::ScaleTempStep), 1, optional); 682 945 if (!ParseForParameter(verbose,FileBuffer,"EpsWannier", 0, 1, 1, double_type, &(config::EpsWannier), 1, optional)) … … 887 1150 ParseForParameter(verbose,file,"VisOuterStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional); 888 1151 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); 891 1154 config::EpsWannier = 1e-8; 892 1155 … … 1076 1339 *output << "DoFullCurrent\t" << config::DoFullCurrent << "\t# Do full perturbation" << endl; 1077 1340 *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" << Thermostat s->ThermostatNames[Thermostats->Thermostat] << "\t";1079 switch(Thermostat s->Thermostat) {1341 *output << "Thermostat\t" << ThermostatNames[Thermostat] << "\t"; 1342 switch(Thermostat) { 1080 1343 default: 1081 1344 case None: 1082 1345 break; 1083 1346 case Woodcock: 1084 *output << Thermostats->ScaleTempStep;1347 *output << ScaleTempStep; 1085 1348 break; 1086 1349 case Gaussian: 1087 *output << Thermostats->ScaleTempStep;1350 *output << ScaleTempStep; 1088 1351 break; 1089 1352 case Langevin: 1090 *output << T hermostats->TempFrequency << "\t" << Thermostats->alpha;1353 *output << TempFrequency << "\t" << alpha; 1091 1354 break; 1092 1355 case Berendsen: 1093 *output << T hermostats->TempFrequency;1356 *output << TempFrequency; 1094 1357 break; 1095 1358 case NoseHoover: 1096 *output << Thermostats->HooverMass;1359 *output << HooverMass; 1097 1360 break; 1098 1361 }; … … 1109 1372 *output << "OutVisStep\t" << config::OutVisStep << "\t# Output visual data every ...th step" << endl; 1110 1373 *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; 1112 1375 *output << "MaxPsiStep\t" << config::MaxPsiStep << "\t# number of Minimisation steps per state (0 - default)" << endl; 1113 1376 *output << "EpsWannier\t" << config::EpsWannier << "\t# tolerance value for spread minimisation of orbitals" << endl; … … 1220 1483 // output of atoms 1221 1484 AtomNo = 0; 1222 mol->ActOnAllAtoms( &atom::OutputMPQCLine, (ostream * const)output, (const Vector *)center, &AtomNo );1485 mol->ActOnAllAtoms( &atom::OutputMPQCLine, output, (const Vector *)center, &AtomNo ); 1223 1486 delete(center); 1224 1487 *output << "\t}" << endl; … … 1262 1525 // output of atoms 1263 1526 AtomNo = 0; 1264 mol->ActOnAllAtoms( &atom::OutputMPQCLine, (ostream * const)output, (const Vector *)center, &AtomNo );1527 mol->ActOnAllAtoms( &atom::OutputMPQCLine, output, (const Vector *)center, &AtomNo ); 1265 1528 delete(center); 1266 1529 *output << "\t}" << endl; … … 1521 1784 char filename[MAXSTRINGSIZE]; 1522 1785 ofstream output; 1523 molecule *mol = World::getInstance().createMolecule(); 1524 mol->SetNameFromFilename(ConfigFileName); 1786 molecule *mol = NULL; 1525 1787 1526 1788 if (!strcmp(configpath, GetDefaultPath())) { … … 1553 1815 // translate each to its center and merge all molecules in MoleculeListClass into this molecule 1554 1816 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 } 1569 1839 } 1570 1840 1571 1841 Log() << Verbose(0) << "Storing configuration ... " << endl; 1572 1842 // get correct valence orbitals 1573 mol->CalculateOrbitals(*this);1574 InitMaxMinStopStep = MaxMinStopStep = MaxPsiDouble;1575 1843 if (ConfigFileName != NULL) { // test the file name 1576 1844 strcpy(filename, ConfigFileName); … … 1632 1900 } 1633 1901 1634 World::getInstance().destroyMolecule(mol); 1902 // don't destroy molecule as it contains all our atoms 1903 //World::getInstance().destroyMolecule(mol); 1635 1904 }; 1636 1905 … … 2077 2346 return (found); // true if found, false if not 2078 2347 } 2079 2080 /** Reading of Thermostat related values from parameter file.2081 * \param *fb file buffer containing the config file2082 */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 parameters2089 if (ParseForParameter(verbose,fb,"Thermostat", 0, 1, 1, string_type, thermo, 1, optional)) {2090 if (strcmp(thermo, Thermostats->ThermostatNames[0]) == 0) { // None2091 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) { // Woodcock2098 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 frequency2101 } 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) { // Gaussian2106 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 rate2109 } 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) { // Langevin2114 if (Thermostats->ThermostatImplemented[3] == 1) {2115 Thermostats->Thermostat = Langevin;2116 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &Thermostats->TempFrequency, 1, critical); // read gamma2117 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) { // Berendsen2127 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_T2130 } 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-Hoover2135 if (Thermostats->ThermostatImplemented[5] == 1) {2136 Thermostats->Thermostat = NoseHoover;2137 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &Thermostats->HooverMass, 1, critical); // read Hoovermass2138 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.
