Changes in src/config.cpp [274d45:1b2d30]
- File:
-
- 1 edited
-
src/config.cpp (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/config.cpp
r274d45 r1b2d30 5 5 */ 6 6 7 #include "Helpers/MemDebug.hpp"8 9 7 #include <stdio.h> 10 8 #include <cstring> 11 9 12 #include "World.hpp"13 10 #include "atom.hpp" 14 11 #include "bond.hpp" 12 #include "bondgraph.hpp" 15 13 #include "config.hpp" 14 #include "ConfigFileBuffer.hpp" 16 15 #include "element.hpp" 17 16 #include "helpers.hpp" … … 23 22 #include "molecule.hpp" 24 23 #include "periodentafel.hpp" 24 #include "ThermoStatContainer.hpp" 25 25 #include "World.hpp" 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 number40 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 number44 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 number52 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 number57 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 name71 */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 lines78 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 one84 long file_position = file->tellg(); // mark current position85 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 dimension94 if (buffer != NULL) {95 DoeLog(1) && (eLog()<< Verbose(1) << "FileBuffer->buffer is not NULL!" << endl);96 return;97 } else98 buffer = new char *[NoLines];99 100 // scan each line and put into buffer101 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 exit114 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 the141 * lines in \a *FileBuffer in a sorted manner of the Ion_Type?_? keywords. We assume that ConfigFileBuffer::CurrentLine142 * points to first Ion_Type entry.143 * \param *FileBuffer pointer to buffer structure144 * \param NoAtoms of subsequent lines to look at145 */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 map156 for (int i=0; i<NoAtoms; ++i) {157 IonTypeLineMap.insert(pair<const char *, int> (buffer[CurrentLine+i], CurrentLine+i));158 }159 160 // fill map161 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 26 172 27 /************************************* Functions for class config ***************************/ … … 174 29 /** Constructor for config file class. 175 30 */ 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), 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), 179 33 DoOutVis(0), DoOutMes(1), DoOutNICS(0), DoOutOrbitals(0), DoOutCurrent(0), DoFullCurrent(0), DoPerturbation(0), DoWannier(0), CommonWannier(0), SawtoothStart(0.01), 180 34 VectorPlane(0), VectorCut(0.), UseAddGramSch(1), Seed(1), OutVisStep(10), OutSrcStep(5), MaxPsiStep(0), EpsWannier(1e-7), MaxMinStep(100), RelEpsTotalEnergy(1e-7), … … 188 42 configpath = new char[MAXSTRINGSIZE]; 189 43 configname = new char[MAXSTRINGSIZE]; 44 Thermostats = new ThermoStatContainer(); 190 45 strcpy(mainname,"pcp"); 191 46 strcpy(defaultpath,"not specified"); … … 194 49 configname[0]='\0'; 195 50 basis = "3-21G"; 196 197 InitThermostats();198 51 }; 199 52 … … 208 61 delete[](configpath); 209 62 delete[](configname); 210 delete[](ThermostatImplemented); 211 for (int j=0;j<MaxThermostats;j++) 212 delete[](ThermostatNames[j]); 213 delete[](ThermostatNames); 63 if (Thermostats != NULL) 64 delete(Thermostats); 214 65 215 66 if (BG != NULL) 216 67 delete(BG); 217 68 }; 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 file244 */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 parameters251 if (ParseForParameter(verbose,fb,"Thermostat", 0, 1, 1, string_type, thermo, 1, optional)) {252 if (strcmp(thermo, ThermostatNames[0]) == 0) { // None253 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) { // Woodcock260 if (ThermostatImplemented[1] == 1) {261 Thermostat = Woodcock;262 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &ScaleTempStep, 1, critical); // read scaling frequency263 } 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) { // Gaussian268 if (ThermostatImplemented[2] == 1) {269 Thermostat = Gaussian;270 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &ScaleTempStep, 1, critical); // read collision rate271 } 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) { // Langevin276 if (ThermostatImplemented[3] == 1) {277 Thermostat = Langevin;278 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &TempFrequency, 1, critical); // read gamma279 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) { // Berendsen289 if (ThermostatImplemented[4] == 1) {290 Thermostat = Berendsen;291 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &TempFrequency, 1, critical); // read \tau_T292 } 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-Hoover297 if (ThermostatImplemented[5] == 1) {298 Thermostat = NoseHoover;299 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &HooverMass, 1, critical); // read Hoovermass300 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 317 69 318 70 /** Displays menu for editing each entry of the config file. … … 656 408 }; 657 409 658 /** Initializes ConfigFileBuffer from a file.659 * \param *file input file stream being the opened config file660 * \param *FileBuffer pointer to FileBuffer on return, should point to NULL661 */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 673 410 /** Loads a molecule from a ConfigFileBuffer. 674 411 * \param *mol molecule to load … … 867 604 868 605 // ParseParameterFile 869 struct ConfigFileBuffer *FileBuffer = NULL; 870 PrepareFileBuffer(filename,FileBuffer); 606 class ConfigFileBuffer *FileBuffer = new ConfigFileBuffer(filename); 871 607 872 608 /* Oeffne Hauptparameterdatei */ … … 877 613 int verbose = 0; 878 614 615 //TODO: This is actually sensible?: if (MaxOuterStep > 0) 879 616 ParseThermostats(FileBuffer); 880 617 … … 941 678 ParseForParameter(verbose,FileBuffer,"OutVisStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional); 942 679 ParseForParameter(verbose,FileBuffer,"OutSrcStep", 0, 1, 1, int_type, &(config::OutSrcStep), 1, optional); 943 ParseForParameter(verbose,FileBuffer,"TargetTemp", 0, 1, 1, double_type, &( config::TargetTemp), 1, optional);680 ParseForParameter(verbose,FileBuffer,"TargetTemp", 0, 1, 1, double_type, &(Thermostats->TargetTemp), 1, optional); 944 681 //ParseForParameter(verbose,FileBuffer,"Thermostat", 0, 1, 1, int_type, &(config::ScaleTempStep), 1, optional); 945 682 if (!ParseForParameter(verbose,FileBuffer,"EpsWannier", 0, 1, 1, double_type, &(config::EpsWannier), 1, optional)) … … 1150 887 ParseForParameter(verbose,file,"VisOuterStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional); 1151 888 ParseForParameter(verbose,file,"VisSrcOuterStep", 0, 1, 1, int_type, &(config::OutSrcStep), 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);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); 1154 891 config::EpsWannier = 1e-8; 1155 892 … … 1339 1076 *output << "DoFullCurrent\t" << config::DoFullCurrent << "\t# Do full perturbation" << endl; 1340 1077 *output << "DoConstrainedMD\t" << config::DoConstrainedMD << "\t# Do perform a constrained (>0, relating to current MD step) instead of unconstrained (0) MD" << endl; 1341 *output << "Thermostat\t" << Thermostat Names[Thermostat] << "\t";1342 switch(Thermostat ) {1078 *output << "Thermostat\t" << Thermostats->ThermostatNames[Thermostats->Thermostat] << "\t"; 1079 switch(Thermostats->Thermostat) { 1343 1080 default: 1344 1081 case None: 1345 1082 break; 1346 1083 case Woodcock: 1347 *output << ScaleTempStep;1084 *output << Thermostats->ScaleTempStep; 1348 1085 break; 1349 1086 case Gaussian: 1350 *output << ScaleTempStep;1087 *output << Thermostats->ScaleTempStep; 1351 1088 break; 1352 1089 case Langevin: 1353 *output << T empFrequency << "\t" <<alpha;1090 *output << Thermostats->TempFrequency << "\t" << Thermostats->alpha; 1354 1091 break; 1355 1092 case Berendsen: 1356 *output << T empFrequency;1093 *output << Thermostats->TempFrequency; 1357 1094 break; 1358 1095 case NoseHoover: 1359 *output << HooverMass;1096 *output << Thermostats->HooverMass; 1360 1097 break; 1361 1098 }; … … 1372 1109 *output << "OutVisStep\t" << config::OutVisStep << "\t# Output visual data every ...th step" << endl; 1373 1110 *output << "OutSrcStep\t" << config::OutSrcStep << "\t# Output \"restart\" data every ..th step" << endl; 1374 *output << "TargetTemp\t" << config::TargetTemp << "\t# Target temperature" << endl;1111 *output << "TargetTemp\t" << Thermostats->TargetTemp << "\t# Target temperature" << endl; 1375 1112 *output << "MaxPsiStep\t" << config::MaxPsiStep << "\t# number of Minimisation steps per state (0 - default)" << endl; 1376 1113 *output << "EpsWannier\t" << config::EpsWannier << "\t# tolerance value for spread minimisation of orbitals" << endl; … … 1483 1220 // output of atoms 1484 1221 AtomNo = 0; 1485 mol->ActOnAllAtoms( &atom::OutputMPQCLine, output, (const Vector *)center, &AtomNo );1222 mol->ActOnAllAtoms( &atom::OutputMPQCLine, (ostream * const) output, (const Vector *)center, &AtomNo ); 1486 1223 delete(center); 1487 1224 *output << "\t}" << endl; … … 1525 1262 // output of atoms 1526 1263 AtomNo = 0; 1527 mol->ActOnAllAtoms( &atom::OutputMPQCLine, output, (const Vector *)center, &AtomNo );1264 mol->ActOnAllAtoms( &atom::OutputMPQCLine, (ostream * const) output, (const Vector *)center, &AtomNo ); 1528 1265 delete(center); 1529 1266 *output << "\t}" << endl; … … 1784 1521 char filename[MAXSTRINGSIZE]; 1785 1522 ofstream output; 1786 molecule *mol = NULL; 1523 molecule *mol = World::getInstance().createMolecule(); 1524 mol->SetNameFromFilename(ConfigFileName); 1787 1525 1788 1526 if (!strcmp(configpath, GetDefaultPath())) { … … 1815 1553 // translate each to its center and merge all molecules in MoleculeListClass into this molecule 1816 1554 int N = molecules->ListOfMolecules.size(); 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 } 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.); 1839 1569 } 1840 1570 1841 1571 Log() << Verbose(0) << "Storing configuration ... " << endl; 1842 1572 // get correct valence orbitals 1573 mol->CalculateOrbitals(*this); 1574 InitMaxMinStopStep = MaxMinStopStep = MaxPsiDouble; 1843 1575 if (ConfigFileName != NULL) { // test the file name 1844 1576 strcpy(filename, ConfigFileName); … … 1900 1632 } 1901 1633 1902 // don't destroy molecule as it contains all our atoms 1903 //World::getInstance().destroyMolecule(mol); 1634 World::getInstance().destroyMolecule(mol); 1904 1635 }; 1905 1636 … … 2346 2077 return (found); // true if found, false if not 2347 2078 } 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.
