Changes in src/builder.cpp [e138de:a67d19]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/builder.cpp
re138de ra67d19 50 50 using namespace std; 51 51 52 #include <cstring> 53 54 #include "analysis_bonds.hpp" 52 55 #include "analysis_correlation.hpp" 53 56 #include "atom.hpp" … … 65 68 #include "molecule.hpp" 66 69 #include "periodentafel.hpp" 70 #include "version.h" 71 #include "World.hpp" 67 72 68 73 /********************************************* Subsubmenu routine ************************************/ … … 81 86 bool valid; 82 87 83 Log()<< Verbose(0) << "===========ADD ATOM============================" << endl;84 Log()<< Verbose(0) << " a - state absolute coordinates of atom" << endl;85 Log()<< Verbose(0) << " b - state relative coordinates of atom wrt to reference point" << endl;86 Log()<< Verbose(0) << " c - state relative coordinates of atom wrt to already placed atom" << endl;87 Log()<< Verbose(0) << " d - state two atoms, two angles and a distance" << endl;88 Log()<< Verbose(0) << " e - least square distance position to a set of atoms" << endl;89 Log()<< Verbose(0) << "all else - go back" << endl;90 Log()<< Verbose(0) << "===============================================" << endl;91 Log()<< Verbose(0) << "Note: Specifiy angles in degrees not multiples of Pi!" << endl;92 Log()<< Verbose(0) << "INPUT: ";88 cout << Verbose(0) << "===========ADD ATOM============================" << endl; 89 cout << Verbose(0) << " a - state absolute coordinates of atom" << endl; 90 cout << Verbose(0) << " b - state relative coordinates of atom wrt to reference point" << endl; 91 cout << Verbose(0) << " c - state relative coordinates of atom wrt to already placed atom" << endl; 92 cout << Verbose(0) << " d - state two atoms, two angles and a distance" << endl; 93 cout << Verbose(0) << " e - least square distance position to a set of atoms" << endl; 94 cout << Verbose(0) << "all else - go back" << endl; 95 cout << Verbose(0) << "===============================================" << endl; 96 cout << Verbose(0) << "Note: Specifiy angles in degrees not multiples of Pi!" << endl; 97 cout << Verbose(0) << "INPUT: "; 93 98 cin >> choice; 94 99 95 100 switch (choice) { 96 101 default: 97 Log() << Verbose(0) << "Not a valid choice." << endl;102 DoeLog(2) && (eLog()<< Verbose(2) << "Not a valid choice." << endl); 98 103 break; 99 104 case 'a': // absolute coordinates of atom 100 Log()<< Verbose(0) << "Enter absolute coordinates." << endl;105 cout << Verbose(0) << "Enter absolute coordinates." << endl; 101 106 first = new atom; 102 first->x.AskPosition( mol->cell_size, false);107 first->x.AskPosition(World::get()->cell_size, false); 103 108 first->type = periode->AskElement(); // give type 104 109 mol->AddAtom(first); // add to molecule … … 109 114 valid = true; 110 115 do { 111 if (!valid) Log() << Verbose(0) << "Resulting position out of cell." << endl;112 Log()<< Verbose(0) << "Enter reference coordinates." << endl;113 x.AskPosition( mol->cell_size, true);114 Log()<< Verbose(0) << "Enter relative coordinates." << endl;115 first->x.AskPosition( mol->cell_size, false);116 if (!valid) DoeLog(2) && (eLog()<< Verbose(2) << "Resulting position out of cell." << endl); 117 cout << Verbose(0) << "Enter reference coordinates." << endl; 118 x.AskPosition(World::get()->cell_size, true); 119 cout << Verbose(0) << "Enter relative coordinates." << endl; 120 first->x.AskPosition(World::get()->cell_size, false); 116 121 first->x.AddVector((const Vector *)&x); 117 Log()<< Verbose(0) << "\n";122 cout << Verbose(0) << "\n"; 118 123 } while (!(valid = mol->CheckBounds((const Vector *)&first->x))); 119 124 first->type = periode->AskElement(); // give type … … 125 130 valid = true; 126 131 do { 127 if (!valid) Log() << Verbose(0) << "Resulting position out of cell." << endl;132 if (!valid) DoeLog(2) && (eLog()<< Verbose(2) << "Resulting position out of cell." << endl); 128 133 second = mol->AskAtom("Enter atom number: "); 129 Log() << Verbose(0) << "Enter relative coordinates." << endl;130 first->x.AskPosition( mol->cell_size, false);134 DoLog(0) && (Log() << Verbose(0) << "Enter relative coordinates." << endl); 135 first->x.AskPosition(World::get()->cell_size, false); 131 136 for (int i=NDIM;i--;) { 132 137 first->x.x[i] += second->x.x[i]; … … 142 147 do { 143 148 if (!valid) { 144 Log() << Verbose(0) << "Resulting coordinates out of cell - "; 145 first->x.Output(); 146 Log() << Verbose(0) << endl; 149 DoeLog(2) && (eLog()<< Verbose(2) << "Resulting coordinates out of cell - " << first->x << endl); 147 150 } 148 Log()<< Verbose(0) << "First, we need two atoms, the first atom is the central, while the second is the outer one." << endl;151 cout << Verbose(0) << "First, we need two atoms, the first atom is the central, while the second is the outer one." << endl; 149 152 second = mol->AskAtom("Enter central atom: "); 150 153 third = mol->AskAtom("Enter second atom (specifying the axis for first angle): "); … … 157 160 c *= M_PI/180.; 158 161 bound(&c, -M_PI, M_PI); 159 Log()<< Verbose(0) << "radius: " << a << "\t phi: " << b*180./M_PI << "\t theta: " << c*180./M_PI << endl;162 cout << Verbose(0) << "radius: " << a << "\t phi: " << b*180./M_PI << "\t theta: " << c*180./M_PI << endl; 160 163 /* 161 164 second->Output(1,1,(ofstream *)&cout); … … 169 172 170 173 if (!z.SolveSystem(&x,&y,&n, b, c, a)) { 171 Log() << Verbose(0) << "Failure solving self-dependent linear system!" << endl;174 coutg() << Verbose(0) << "Failure solving self-dependent linear system!" << endl; 172 175 continue; 173 176 } 174 Log() << Verbose(0) << "resulting relative coordinates: ";177 DoLog(0) && (Log() << Verbose(0) << "resulting relative coordinates: "); 175 178 z.Output(); 176 Log() << Verbose(0) << endl;179 DoLog(0) && (Log() << Verbose(0) << endl); 177 180 */ 178 181 // calc axis vector … … 182 185 Log() << Verbose(0) << "x: ", 183 186 x.Output(); 184 Log() << Verbose(0) << endl;187 DoLog(0) && (Log() << Verbose(0) << endl); 185 188 z.MakeNormalVector(&second->x,&third->x,&fourth->x); 186 189 Log() << Verbose(0) << "z: ", 187 190 z.Output(); 188 Log() << Verbose(0) << endl;191 DoLog(0) && (Log() << Verbose(0) << endl); 189 192 y.MakeNormalVector(&x,&z); 190 193 Log() << Verbose(0) << "y: ", 191 194 y.Output(); 192 Log() << Verbose(0) << endl;195 DoLog(0) && (Log() << Verbose(0) << endl); 193 196 194 197 // rotate vector around first angle … … 197 200 Log() << Verbose(0) << "Rotated vector: ", 198 201 first->x.Output(); 199 Log() << Verbose(0) << endl;202 DoLog(0) && (Log() << Verbose(0) << endl); 200 203 // remove the projection onto the rotation plane of the second angle 201 204 n.CopyVector(&y); … … 203 206 Log() << Verbose(0) << "N1: ", 204 207 n.Output(); 205 Log() << Verbose(0) << endl;208 DoLog(0) && (Log() << Verbose(0) << endl); 206 209 first->x.SubtractVector(&n); 207 210 Log() << Verbose(0) << "Subtracted vector: ", 208 211 first->x.Output(); 209 Log() << Verbose(0) << endl;212 DoLog(0) && (Log() << Verbose(0) << endl); 210 213 n.CopyVector(&z); 211 214 n.Scale(first->x.ScalarProduct(&z)); 212 215 Log() << Verbose(0) << "N2: ", 213 216 n.Output(); 214 Log() << Verbose(0) << endl;217 DoLog(0) && (Log() << Verbose(0) << endl); 215 218 first->x.SubtractVector(&n); 216 219 Log() << Verbose(0) << "2nd subtracted vector: ", 217 220 first->x.Output(); 218 Log() << Verbose(0) << endl;221 DoLog(0) && (Log() << Verbose(0) << endl); 219 222 220 223 // rotate another vector around second angle … … 223 226 Log() << Verbose(0) << "2nd Rotated vector: ", 224 227 n.Output(); 225 Log() << Verbose(0) << endl;228 DoLog(0) && (Log() << Verbose(0) << endl); 226 229 227 230 // add the two linear independent vectors … … 231 234 first->x.AddVector(&second->x); 232 235 233 Log() << Verbose(0) << "resulting coordinates: ";236 DoLog(0) && (Log() << Verbose(0) << "resulting coordinates: "); 234 237 first->x.Output(); 235 Log() << Verbose(0) << endl;238 DoLog(0) && (Log() << Verbose(0) << endl); 236 239 } while (!(valid = mol->CheckBounds((const Vector *)&first->x))); 237 240 first->type = periode->AskElement(); // give type … … 246 249 atoms[i] = NULL; 247 250 int i=0, j=0; 248 Log()<< Verbose(0) << "Now we need at least three molecules.\n";251 cout << Verbose(0) << "Now we need at least three molecules.\n"; 249 252 do { 250 Log()<< Verbose(0) << "Enter " << i+1 << "th atom: ";253 cout << Verbose(0) << "Enter " << i+1 << "th atom: "; 251 254 cin >> j; 252 255 if (j != -1) { … … 263 266 } else { 264 267 delete first; 265 Log()<< Verbose(0) << "Please enter at least two vectors!\n";268 cout << Verbose(0) << "Please enter at least two vectors!\n"; 266 269 } 267 270 break; … … 277 280 char choice; // menu choice char 278 281 279 Log()<< Verbose(0) << "===========CENTER ATOMS=========================" << endl;280 Log()<< Verbose(0) << " a - on origin" << endl;281 Log()<< Verbose(0) << " b - on center of gravity" << endl;282 Log()<< Verbose(0) << " c - within box with additional boundary" << endl;283 Log()<< Verbose(0) << " d - within given simulation box" << endl;284 Log()<< Verbose(0) << "all else - go back" << endl;285 Log()<< Verbose(0) << "===============================================" << endl;286 Log()<< Verbose(0) << "INPUT: ";282 cout << Verbose(0) << "===========CENTER ATOMS=========================" << endl; 283 cout << Verbose(0) << " a - on origin" << endl; 284 cout << Verbose(0) << " b - on center of gravity" << endl; 285 cout << Verbose(0) << " c - within box with additional boundary" << endl; 286 cout << Verbose(0) << " d - within given simulation box" << endl; 287 cout << Verbose(0) << "all else - go back" << endl; 288 cout << Verbose(0) << "===============================================" << endl; 289 cout << Verbose(0) << "INPUT: "; 287 290 cin >> choice; 288 291 289 292 switch (choice) { 290 293 default: 291 Log()<< Verbose(0) << "Not a valid choice." << endl;294 cout << Verbose(0) << "Not a valid choice." << endl; 292 295 break; 293 296 case 'a': 294 Log()<< Verbose(0) << "Centering atoms in config file on origin." << endl;297 cout << Verbose(0) << "Centering atoms in config file on origin." << endl; 295 298 mol->CenterOrigin(); 296 299 break; 297 300 case 'b': 298 Log()<< Verbose(0) << "Centering atoms in config file on center of gravity." << endl;301 cout << Verbose(0) << "Centering atoms in config file on center of gravity." << endl; 299 302 mol->CenterPeriodic(); 300 303 break; 301 304 case 'c': 302 Log()<< Verbose(0) << "Centering atoms in config file within given additional boundary." << endl;305 cout << Verbose(0) << "Centering atoms in config file within given additional boundary." << endl; 303 306 for (int i=0;i<NDIM;i++) { 304 Log()<< Verbose(0) << "Enter axis " << i << " boundary: ";307 cout << Verbose(0) << "Enter axis " << i << " boundary: "; 305 308 cin >> y.x[i]; 306 309 } … … 313 316 break; 314 317 case 'd': 315 Log()<< Verbose(1) << "Centering atoms in config file within given simulation box." << endl;318 cout << Verbose(1) << "Centering atoms in config file within given simulation box." << endl; 316 319 for (int i=0;i<NDIM;i++) { 317 Log()<< Verbose(0) << "Enter axis " << i << " boundary: ";320 cout << Verbose(0) << "Enter axis " << i << " boundary: "; 318 321 cin >> x.x[i]; 319 322 } … … 336 339 char choice; // menu choice char 337 340 338 Log()<< Verbose(0) << "===========ALIGN ATOMS=========================" << endl;339 Log()<< Verbose(0) << " a - state three atoms defining align plane" << endl;340 Log()<< Verbose(0) << " b - state alignment vector" << endl;341 Log()<< Verbose(0) << " c - state two atoms in alignment direction" << endl;342 Log()<< Verbose(0) << " d - align automatically by least square fit" << endl;343 Log()<< Verbose(0) << "all else - go back" << endl;344 Log()<< Verbose(0) << "===============================================" << endl;345 Log()<< Verbose(0) << "INPUT: ";341 cout << Verbose(0) << "===========ALIGN ATOMS=========================" << endl; 342 cout << Verbose(0) << " a - state three atoms defining align plane" << endl; 343 cout << Verbose(0) << " b - state alignment vector" << endl; 344 cout << Verbose(0) << " c - state two atoms in alignment direction" << endl; 345 cout << Verbose(0) << " d - align automatically by least square fit" << endl; 346 cout << Verbose(0) << "all else - go back" << endl; 347 cout << Verbose(0) << "===============================================" << endl; 348 cout << Verbose(0) << "INPUT: "; 346 349 cin >> choice; 347 350 … … 356 359 break; 357 360 case 'b': // normal vector of mirror plane 358 Log()<< Verbose(0) << "Enter normal vector of mirror plane." << endl;359 n.AskPosition( mol->cell_size,0);361 cout << Verbose(0) << "Enter normal vector of mirror plane." << endl; 362 n.AskPosition(World::get()->cell_size,0); 360 363 n.Normalize(); 361 364 break; … … 376 379 fscanf(stdin, "%3s", shorthand); 377 380 } while ((param.type = periode->FindElement(shorthand)) == NULL); 378 Log()<< Verbose(0) << "Element is " << param.type->name << endl;381 cout << Verbose(0) << "Element is " << param.type->name << endl; 379 382 mol->GetAlignvector(¶m); 380 383 for (int i=NDIM;i--;) { … … 383 386 } 384 387 gsl_vector_free(param.x); 385 Log()<< Verbose(0) << "Offset vector: ";388 cout << Verbose(0) << "Offset vector: "; 386 389 x.Output(); 387 Log() << Verbose(0) << endl;390 DoLog(0) && (Log() << Verbose(0) << endl); 388 391 n.Normalize(); 389 392 break; 390 393 }; 391 Log() << Verbose(0) << "Alignment vector: ";394 DoLog(0) && (Log() << Verbose(0) << "Alignment vector: "); 392 395 n.Output(); 393 Log() << Verbose(0) << endl;396 DoLog(0) && (Log() << Verbose(0) << endl); 394 397 mol->Align(&n); 395 398 }; … … 404 407 char choice; // menu choice char 405 408 406 Log() << Verbose(0) << "===========MIRROR ATOMS=========================" << endl;407 Log() << Verbose(0) << " a - state three atoms defining mirror plane" << endl;408 Log() << Verbose(0) << " b - state normal vector of mirror plane" << endl;409 Log() << Verbose(0) << " c - state two atoms in normal direction" << endl;410 Log() << Verbose(0) << "all else - go back" << endl;411 Log() << Verbose(0) << "===============================================" << endl;412 Log() << Verbose(0) << "INPUT: ";409 DoLog(0) && (Log() << Verbose(0) << "===========MIRROR ATOMS=========================" << endl); 410 DoLog(0) && (Log() << Verbose(0) << " a - state three atoms defining mirror plane" << endl); 411 DoLog(0) && (Log() << Verbose(0) << " b - state normal vector of mirror plane" << endl); 412 DoLog(0) && (Log() << Verbose(0) << " c - state two atoms in normal direction" << endl); 413 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl); 414 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl); 415 DoLog(0) && (Log() << Verbose(0) << "INPUT: "); 413 416 cin >> choice; 414 417 … … 423 426 break; 424 427 case 'b': // normal vector of mirror plane 425 Log() << Verbose(0) << "Enter normal vector of mirror plane." << endl;426 n.AskPosition( mol->cell_size,0);428 DoLog(0) && (Log() << Verbose(0) << "Enter normal vector of mirror plane." << endl); 429 n.AskPosition(World::get()->cell_size,0); 427 430 n.Normalize(); 428 431 break; … … 436 439 break; 437 440 }; 438 Log() << Verbose(0) << "Normal vector: ";441 DoLog(0) && (Log() << Verbose(0) << "Normal vector: "); 439 442 n.Output(); 440 Log() << Verbose(0) << endl;443 DoLog(0) && (Log() << Verbose(0) << endl); 441 444 mol->Mirror((const Vector *)&n); 442 445 }; … … 452 455 char choice; // menu choice char 453 456 454 Log() << Verbose(0) << "===========REMOVE ATOMS=========================" << endl;455 Log() << Verbose(0) << " a - state atom for removal by number" << endl;456 Log() << Verbose(0) << " b - keep only in radius around atom" << endl;457 Log() << Verbose(0) << " c - remove this with one axis greater value" << endl;458 Log() << Verbose(0) << "all else - go back" << endl;459 Log() << Verbose(0) << "===============================================" << endl;460 Log() << Verbose(0) << "INPUT: ";457 DoLog(0) && (Log() << Verbose(0) << "===========REMOVE ATOMS=========================" << endl); 458 DoLog(0) && (Log() << Verbose(0) << " a - state atom for removal by number" << endl); 459 DoLog(0) && (Log() << Verbose(0) << " b - keep only in radius around atom" << endl); 460 DoLog(0) && (Log() << Verbose(0) << " c - remove this with one axis greater value" << endl); 461 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl); 462 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl); 463 DoLog(0) && (Log() << Verbose(0) << "INPUT: "); 461 464 cin >> choice; 462 465 … … 465 468 case 'a': 466 469 if (mol->RemoveAtom(mol->AskAtom("Enter number of atom within molecule: "))) 467 Log() << Verbose(1) << "Atom removed." << endl;470 DoLog(1) && (Log() << Verbose(1) << "Atom removed." << endl); 468 471 else 469 Log() << Verbose(1) << "Atom not found." << endl;472 DoLog(1) && (Log() << Verbose(1) << "Atom not found." << endl); 470 473 break; 471 474 case 'b': 472 475 second = mol->AskAtom("Enter number of atom as reference point: "); 473 Log() << Verbose(0) << "Enter radius: ";476 DoLog(0) && (Log() << Verbose(0) << "Enter radius: "); 474 477 cin >> tmp1; 475 478 first = mol->start; … … 483 486 break; 484 487 case 'c': 485 Log() << Verbose(0) << "Which axis is it: ";488 DoLog(0) && (Log() << Verbose(0) << "Which axis is it: "); 486 489 cin >> axis; 487 Log() << Verbose(0) << "Lower boundary: ";490 DoLog(0) && (Log() << Verbose(0) << "Lower boundary: "); 488 491 cin >> tmp1; 489 Log() << Verbose(0) << "Upper boundary: ";492 DoLog(0) && (Log() << Verbose(0) << "Upper boundary: "); 490 493 cin >> tmp2; 491 494 first = mol->start; … … 517 520 char choice; // menu choice char 518 521 519 Log() << Verbose(0) << "===========MEASURE ATOMS=========================" << endl;520 Log() << Verbose(0) << " a - calculate bond length between one atom and all others" << endl;521 Log() << Verbose(0) << " b - calculate bond length between two atoms" << endl;522 Log() << Verbose(0) << " c - calculate bond angle" << endl;523 Log() << Verbose(0) << " d - calculate principal axis of the system" << endl;524 Log() << Verbose(0) << " e - calculate volume of the convex envelope" << endl;525 Log() << Verbose(0) << " f - calculate temperature from current velocity" << endl;526 Log() << Verbose(0) << " g - output all temperatures per step from velocities" << endl;527 Log() << Verbose(0) << "all else - go back" << endl;528 Log() << Verbose(0) << "===============================================" << endl;529 Log() << Verbose(0) << "INPUT: ";522 DoLog(0) && (Log() << Verbose(0) << "===========MEASURE ATOMS=========================" << endl); 523 DoLog(0) && (Log() << Verbose(0) << " a - calculate bond length between one atom and all others" << endl); 524 DoLog(0) && (Log() << Verbose(0) << " b - calculate bond length between two atoms" << endl); 525 DoLog(0) && (Log() << Verbose(0) << " c - calculate bond angle" << endl); 526 DoLog(0) && (Log() << Verbose(0) << " d - calculate principal axis of the system" << endl); 527 DoLog(0) && (Log() << Verbose(0) << " e - calculate volume of the convex envelope" << endl); 528 DoLog(0) && (Log() << Verbose(0) << " f - calculate temperature from current velocity" << endl); 529 DoLog(0) && (Log() << Verbose(0) << " g - output all temperatures per step from velocities" << endl); 530 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl); 531 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl); 532 DoLog(0) && (Log() << Verbose(0) << "INPUT: "); 530 533 cin >> choice; 531 534 532 535 switch(choice) { 533 536 default: 534 Log() << Verbose(1) << "Not a valid choice." << endl;537 DoLog(1) && (Log() << Verbose(1) << "Not a valid choice." << endl); 535 538 break; 536 539 case 'a': … … 564 567 x.SubtractVector((const Vector *)&second->x); 565 568 tmp1 = x.Norm(); 566 Log() << Verbose(1) << "Distance vector is ";569 DoLog(1) && (Log() << Verbose(1) << "Distance vector is "); 567 570 x.Output(); 568 Log() << Verbose(0) << "." << endl << "Norm of distance is " << tmp1 << "." << endl;571 DoLog(0) && (Log() << Verbose(0) << "." << endl << "Norm of distance is " << tmp1 << "." << endl); 569 572 break; 570 573 571 574 case 'c': 572 Log() << Verbose(0) << "Evaluating bond angle between three - first, central, last - atoms." << endl;575 DoLog(0) && (Log() << Verbose(0) << "Evaluating bond angle between three - first, central, last - atoms." << endl); 573 576 first = mol->AskAtom("Enter first atom: "); 574 577 second = mol->AskAtom("Enter central atom: "); … … 579 582 y.CopyVector((const Vector *)&third->x); 580 583 y.SubtractVector((const Vector *)&second->x); 581 Log() << Verbose(0) << "Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": ";582 Log() << Verbose(0) << (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.) << " degrees" << endl;584 DoLog(0) && (Log() << Verbose(0) << "Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": "); 585 DoLog(0) && (Log() << Verbose(0) << (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.) << " degrees" << endl); 583 586 break; 584 587 case 'd': 585 Log() << Verbose(0) << "Evaluating prinicipal axis." << endl;586 Log() << Verbose(0) << "Shall we rotate? [0/1]: ";588 DoLog(0) && (Log() << Verbose(0) << "Evaluating prinicipal axis." << endl); 589 DoLog(0) && (Log() << Verbose(0) << "Shall we rotate? [0/1]: "); 587 590 cin >> Z; 588 591 if ((Z >=0) && (Z <=1)) … … 593 596 case 'e': 594 597 { 595 Log() << Verbose(0) << "Evaluating volume of the convex envelope.";598 DoLog(0) && (Log() << Verbose(0) << "Evaluating volume of the convex envelope."); 596 599 class Tesselation *TesselStruct = NULL; 597 600 const LinkedCell *LCList = NULL; … … 599 602 FindConvexBorder(mol, TesselStruct, LCList, NULL); 600 603 double clustervolume = VolumeOfConvexEnvelope(TesselStruct, configuration); 601 Log() << Verbose(0) << "The tesselated surface area is " << clustervolume << "." << endl;\604 DoLog(0) && (Log() << Verbose(0) << "The tesselated surface area is " << clustervolume << "." << endl);\ 602 605 delete(LCList); 603 606 delete(TesselStruct); … … 610 613 { 611 614 char filename[255]; 612 Log() << Verbose(0) << "Please enter filename: " << endl;615 DoLog(0) && (Log() << Verbose(0) << "Please enter filename: " << endl); 613 616 cin >> filename; 614 Log() << Verbose(1) << "Storing temperatures in " << filename << "." << endl;617 DoLog(1) && (Log() << Verbose(1) << "Storing temperatures in " << filename << "." << endl); 615 618 ofstream *output = new ofstream(filename, ios::trunc); 616 619 if (!mol->OutputTemperatureFromTrajectories(output, 0, mol->MDSteps)) 617 Log() << Verbose(2) << "File could not be written." << endl;620 DoLog(2) && (Log() << Verbose(2) << "File could not be written." << endl); 618 621 else 619 Log() << Verbose(2) << "File stored." << endl;622 DoLog(2) && (Log() << Verbose(2) << "File stored." << endl); 620 623 output->close(); 621 624 delete(output); … … 634 637 clock_t start, end; 635 638 636 Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl;637 Log() << Verbose(0) << "What's the desired bond order: ";639 DoLog(0) && (Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl); 640 DoLog(0) && (Log() << Verbose(0) << "What's the desired bond order: "); 638 641 cin >> Order1; 639 642 if (mol->first->next != mol->last) { // there are bonds … … 641 644 mol->FragmentMolecule(Order1, configuration); 642 645 end = clock(); 643 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl;646 DoLog(0) && (Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl); 644 647 } else 645 Log() << Verbose(0) << "Connection matrix has not yet been generated!" << endl;648 DoLog(0) && (Log() << Verbose(0) << "Connection matrix has not yet been generated!" << endl); 646 649 }; 647 650 … … 654 657 static void ManipulateAtoms(periodentafel *periode, MoleculeListClass *molecules, config *configuration) 655 658 { 656 atom *first, *second ;659 atom *first, *second, *third; 657 660 molecule *mol = NULL; 658 661 Vector x,y,z,n; // coordinates for absolute point in cell volume … … 662 665 bool valid; 663 666 664 Log() << Verbose(0) << "=========MANIPULATE ATOMS======================" << endl; 665 Log() << Verbose(0) << "a - add an atom" << endl; 666 Log() << Verbose(0) << "r - remove an atom" << endl; 667 Log() << Verbose(0) << "b - scale a bond between atoms" << endl; 668 Log() << Verbose(0) << "u - change an atoms element" << endl; 669 Log() << Verbose(0) << "l - measure lengths, angles, ... for an atom" << endl; 670 Log() << Verbose(0) << "all else - go back" << endl; 671 Log() << Verbose(0) << "===============================================" << endl; 667 DoLog(0) && (Log() << Verbose(0) << "=========MANIPULATE ATOMS======================" << endl); 668 DoLog(0) && (Log() << Verbose(0) << "a - add an atom" << endl); 669 DoLog(0) && (Log() << Verbose(0) << "r - remove an atom" << endl); 670 DoLog(0) && (Log() << Verbose(0) << "b - scale a bond between atoms" << endl); 671 DoLog(0) && (Log() << Verbose(0) << "t - turn an atom round another bond" << endl); 672 DoLog(0) && (Log() << Verbose(0) << "u - change an atoms element" << endl); 673 DoLog(0) && (Log() << Verbose(0) << "l - measure lengths, angles, ... for an atom" << endl); 674 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl); 675 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl); 672 676 if (molecules->NumberOfActiveMolecules() > 1) 673 Log() << Verbose(0) << "WARNING: There is more than one molecule active! Atoms will be added to each." << endl;674 Log() << Verbose(0) << "INPUT: ";677 DoeLog(2) && (eLog()<< Verbose(2) << "There is more than one molecule active! Atoms will be added to each." << endl); 678 DoLog(0) && (Log() << Verbose(0) << "INPUT: "); 675 679 cin >> choice; 676 680 677 681 switch (choice) { 678 682 default: 679 Log() << Verbose(0) << "Not a valid choice." << endl;683 DoLog(0) && (Log() << Verbose(0) << "Not a valid choice." << endl); 680 684 break; 681 685 … … 684 688 if ((*ListRunner)->ActiveFlag) { 685 689 mol = *ListRunner; 686 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;690 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 687 691 AddAtoms(periode, mol); 688 692 } … … 693 697 if ((*ListRunner)->ActiveFlag) { 694 698 mol = *ListRunner; 695 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;696 Log() << Verbose(0) << "Scaling bond length between two atoms." << endl;699 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 700 DoLog(0) && (Log() << Verbose(0) << "Scaling bond length between two atoms." << endl); 697 701 first = mol->AskAtom("Enter first (fixed) atom: "); 698 702 second = mol->AskAtom("Enter second (shifting) atom: "); … … 701 705 minBond += (first->x.x[i]-second->x.x[i])*(first->x.x[i] - second->x.x[i]); 702 706 minBond = sqrt(minBond); 703 Log() << Verbose(0) << "Current Bond length between " << first->type->name << " Atom " << first->nr << " and " << second->type->name << " Atom " << second->nr << ": " << minBond << " a.u." << endl;704 Log() << Verbose(0) << "Enter new bond length [a.u.]: ";707 DoLog(0) && (Log() << Verbose(0) << "Current Bond length between " << first->type->name << " Atom " << first->nr << " and " << second->type->name << " Atom " << second->nr << ": " << minBond << " a.u." << endl); 708 DoLog(0) && (Log() << Verbose(0) << "Enter new bond length [a.u.]: "); 705 709 cin >> bond; 706 710 for (int i=NDIM;i--;) { … … 716 720 if ((*ListRunner)->ActiveFlag) { 717 721 mol = *ListRunner; 718 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;719 Log() << Verbose(0) << "Angstroem -> Bohrradius: 1.8897261\t\tBohrradius -> Angstroem: 0.52917721" << endl;720 Log() << Verbose(0) << "Enter three factors: ";722 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 723 DoLog(0) && (Log() << Verbose(0) << "Angstroem -> Bohrradius: 1.8897261\t\tBohrradius -> Angstroem: 0.52917721" << endl); 724 DoLog(0) && (Log() << Verbose(0) << "Enter three factors: "); 721 725 factor = new double[NDIM]; 722 726 cin >> factor[0]; … … 733 737 if ((*ListRunner)->ActiveFlag) { 734 738 mol = *ListRunner; 735 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;739 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 736 740 MeasureAtoms(periode, mol, configuration); 737 741 } … … 742 746 if ((*ListRunner)->ActiveFlag) { 743 747 mol = *ListRunner; 744 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;748 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 745 749 RemoveAtoms(mol); 746 750 } 751 break; 752 753 case 't': // turn/rotate atom 754 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 755 if ((*ListRunner)->ActiveFlag) { 756 mol = *ListRunner; 757 DoLog(0) && (Log() << Verbose(0) << "Turning atom around another bond - first is atom to turn, second (central) and third specify bond" << endl); 758 first = mol->AskAtom("Enter turning atom: "); 759 second = mol->AskAtom("Enter central atom: "); 760 third = mol->AskAtom("Enter bond atom: "); 761 cout << Verbose(0) << "Enter new angle in degrees: "; 762 double tmp = 0.; 763 cin >> tmp; 764 // calculate old angle 765 x.CopyVector((const Vector *)&first->x); 766 x.SubtractVector((const Vector *)&second->x); 767 y.CopyVector((const Vector *)&third->x); 768 y.SubtractVector((const Vector *)&second->x); 769 double alpha = (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.); 770 cout << Verbose(0) << "Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": "; 771 cout << Verbose(0) << alpha << " degrees" << endl; 772 // rotate 773 z.MakeNormalVector(&x,&y); 774 x.RotateVector(&z,(alpha-tmp)*M_PI/180.); 775 x.AddVector(&second->x); 776 first->x.CopyVector(&x); 777 // check new angle 778 x.CopyVector((const Vector *)&first->x); 779 x.SubtractVector((const Vector *)&second->x); 780 alpha = (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.); 781 cout << Verbose(0) << "new Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": "; 782 cout << Verbose(0) << alpha << " degrees" << endl; 783 } 747 784 break; 748 785 … … 752 789 int Z; 753 790 mol = *ListRunner; 754 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;791 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 755 792 first = NULL; 756 793 do { 757 Log() << Verbose(0) << "Change the element of which atom: ";794 DoLog(0) && (Log() << Verbose(0) << "Change the element of which atom: "); 758 795 cin >> Z; 759 796 } while ((first = mol->FindAtom(Z)) == NULL); 760 Log() << Verbose(0) << "New element by atomic number Z: ";797 DoLog(0) && (Log() << Verbose(0) << "New element by atomic number Z: "); 761 798 cin >> Z; 762 799 first->type = periode->FindElement(Z); 763 Log() << Verbose(0) << "Atom " << first->nr << "'s element is " << first->type->name << "." << endl;800 DoLog(0) && (Log() << Verbose(0) << "Atom " << first->nr << "'s element is " << first->type->name << "." << endl); 764 801 } 765 802 break; … … 782 819 MoleculeLeafClass *Subgraphs = NULL; 783 820 784 Log() << Verbose(0) << "=========MANIPULATE GLOBALLY===================" << endl;785 Log() << Verbose(0) << "c - scale by unit transformation" << endl;786 Log() << Verbose(0) << "d - duplicate molecule/periodic cell" << endl;787 Log() << Verbose(0) << "f - fragment molecule many-body bond order style" << endl;788 Log() << Verbose(0) << "g - center atoms in box" << endl;789 Log() << Verbose(0) << "i - realign molecule" << endl;790 Log() << Verbose(0) << "m - mirror all molecules" << endl;791 Log() << Verbose(0) << "o - create connection matrix" << endl;792 Log() << Verbose(0) << "t - translate molecule by vector" << endl;793 Log() << Verbose(0) << "all else - go back" << endl;794 Log() << Verbose(0) << "===============================================" << endl;821 DoLog(0) && (Log() << Verbose(0) << "=========MANIPULATE GLOBALLY===================" << endl); 822 DoLog(0) && (Log() << Verbose(0) << "c - scale by unit transformation" << endl); 823 DoLog(0) && (Log() << Verbose(0) << "d - duplicate molecule/periodic cell" << endl); 824 DoLog(0) && (Log() << Verbose(0) << "f - fragment molecule many-body bond order style" << endl); 825 DoLog(0) && (Log() << Verbose(0) << "g - center atoms in box" << endl); 826 DoLog(0) && (Log() << Verbose(0) << "i - realign molecule" << endl); 827 DoLog(0) && (Log() << Verbose(0) << "m - mirror all molecules" << endl); 828 DoLog(0) && (Log() << Verbose(0) << "o - create connection matrix" << endl); 829 DoLog(0) && (Log() << Verbose(0) << "t - translate molecule by vector" << endl); 830 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl); 831 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl); 795 832 if (molecules->NumberOfActiveMolecules() > 1) 796 Log() << Verbose(0) << "WARNING: There is more than one molecule active! Atoms will be added to each." << endl;797 Log() << Verbose(0) << "INPUT: ";833 DoeLog(2) && (eLog()<< Verbose(2) << "There is more than one molecule active! Atoms will be added to each." << endl); 834 DoLog(0) && (Log() << Verbose(0) << "INPUT: "); 798 835 cin >> choice; 799 836 800 837 switch (choice) { 801 838 default: 802 Log() << Verbose(0) << "Not a valid choice." << endl;839 DoLog(0) && (Log() << Verbose(0) << "Not a valid choice." << endl); 803 840 break; 804 841 … … 807 844 if ((*ListRunner)->ActiveFlag) { 808 845 mol = *ListRunner; 809 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;810 Log() << Verbose(0) << "State the axis [(+-)123]: ";846 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 847 DoLog(0) && (Log() << Verbose(0) << "State the axis [(+-)123]: "); 811 848 cin >> axis; 812 Log() << Verbose(0) << "State the factor: ";849 DoLog(0) && (Log() << Verbose(0) << "State the factor: "); 813 850 cin >> faktor; 814 851 … … 827 864 } 828 865 if (count != j) 829 Log() << Verbose(0) << "ERROR: AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl;866 DoeLog(1) && (eLog()<< Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl); 830 867 x.Zero(); 831 868 y.Zero(); 832 y.x[abs(axis)-1] = mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] * abs(axis)/axis; // last term is for sign, first is for magnitude869 y.x[abs(axis)-1] = World::get()->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] * abs(axis)/axis; // last term is for sign, first is for magnitude 833 870 for (int i=1;i<faktor;i++) { // then add this list with respective translation factor times 834 871 x.AddVector(&y); // per factor one cell width further … … 853 890 mol->Translate(&x); 854 891 } 855 mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor;892 World::get()->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor; 856 893 } 857 894 } … … 866 903 if ((*ListRunner)->ActiveFlag) { 867 904 mol = *ListRunner; 868 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;905 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 869 906 CenterAtoms(mol); 870 907 } … … 875 912 if ((*ListRunner)->ActiveFlag) { 876 913 mol = *ListRunner; 877 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;914 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 878 915 AlignAtoms(periode, mol); 879 916 } … … 884 921 if ((*ListRunner)->ActiveFlag) { 885 922 mol = *ListRunner; 886 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;923 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 887 924 MirrorAtoms(mol); 888 925 } … … 895 932 double bonddistance; 896 933 clock_t start,end; 897 Log() << Verbose(0) << "What's the maximum bond distance: ";934 DoLog(0) && (Log() << Verbose(0) << "What's the maximum bond distance: "); 898 935 cin >> bonddistance; 899 936 start = clock(); 900 937 mol->CreateAdjacencyList(bonddistance, configuration->GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL); 901 938 end = clock(); 902 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl;939 DoLog(0) && (Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl); 903 940 } 904 941 break; … … 908 945 if ((*ListRunner)->ActiveFlag) { 909 946 mol = *ListRunner; 910 Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl;911 Log() << Verbose(0) << "Enter translation vector." << endl;912 x.AskPosition( mol->cell_size,0);947 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl); 948 DoLog(0) && (Log() << Verbose(0) << "Enter translation vector." << endl); 949 x.AskPosition(World::get()->cell_size,0); 913 950 mol->Center.AddVector((const Vector *)&x); 914 951 } … … 937 974 molecule *mol = NULL; 938 975 939 Log() << Verbose(0) << "==========EDIT MOLECULES=====================" << endl;940 Log() << Verbose(0) << "c - create new molecule" << endl;941 Log() << Verbose(0) << "l - load molecule from xyz file" << endl;942 Log() << Verbose(0) << "n - change molecule's name" << endl;943 Log() << Verbose(0) << "N - give molecules filename" << endl;944 Log() << Verbose(0) << "p - parse atoms in xyz file into molecule" << endl;945 Log() << Verbose(0) << "r - remove a molecule" << endl;946 Log() << Verbose(0) << "all else - go back" << endl;947 Log() << Verbose(0) << "===============================================" << endl;948 Log() << Verbose(0) << "INPUT: ";976 DoLog(0) && (Log() << Verbose(0) << "==========EDIT MOLECULES=====================" << endl); 977 DoLog(0) && (Log() << Verbose(0) << "c - create new molecule" << endl); 978 DoLog(0) && (Log() << Verbose(0) << "l - load molecule from xyz file" << endl); 979 DoLog(0) && (Log() << Verbose(0) << "n - change molecule's name" << endl); 980 DoLog(0) && (Log() << Verbose(0) << "N - give molecules filename" << endl); 981 DoLog(0) && (Log() << Verbose(0) << "p - parse atoms in xyz file into molecule" << endl); 982 DoLog(0) && (Log() << Verbose(0) << "r - remove a molecule" << endl); 983 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl); 984 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl); 985 DoLog(0) && (Log() << Verbose(0) << "INPUT: "); 949 986 cin >> choice; 950 987 951 988 switch (choice) { 952 989 default: 953 Log() << Verbose(0) << "Not a valid choice." << endl;990 DoLog(0) && (Log() << Verbose(0) << "Not a valid choice." << endl); 954 991 break; 955 992 case 'c': … … 961 998 { 962 999 char filename[MAXSTRINGSIZE]; 963 Log() << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl;1000 DoLog(0) && (Log() << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl); 964 1001 mol = new molecule(periode); 965 1002 do { 966 Log() << Verbose(0) << "Enter file name: ";1003 DoLog(0) && (Log() << Verbose(0) << "Enter file name: "); 967 1004 cin >> filename; 968 1005 } while (!mol->AddXYZFile(filename)); … … 970 1007 // center at set box dimensions 971 1008 mol->CenterEdge(¢er); 972 mol->cell_size[0] = center.x[0]; 973 mol->cell_size[1] = 0; 974 mol->cell_size[2] = center.x[1]; 975 mol->cell_size[3] = 0; 976 mol->cell_size[4] = 0; 977 mol->cell_size[5] = center.x[2]; 1009 double * const cell_size = World::get()->cell_size; 1010 cell_size[0] = center.x[0]; 1011 cell_size[1] = 0; 1012 cell_size[2] = center.x[1]; 1013 cell_size[3] = 0; 1014 cell_size[4] = 0; 1015 cell_size[5] = center.x[2]; 978 1016 molecules->insert(mol); 979 1017 } … … 984 1022 char filename[MAXSTRINGSIZE]; 985 1023 do { 986 Log() << Verbose(0) << "Enter index of molecule: ";1024 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: "); 987 1025 cin >> nr; 988 1026 mol = molecules->ReturnIndex(nr); 989 1027 } while (mol == NULL); 990 Log() << Verbose(0) << "Enter name: ";1028 DoLog(0) && (Log() << Verbose(0) << "Enter name: "); 991 1029 cin >> filename; 992 1030 strcpy(mol->name, filename); … … 998 1036 char filename[MAXSTRINGSIZE]; 999 1037 do { 1000 Log() << Verbose(0) << "Enter index of molecule: ";1038 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: "); 1001 1039 cin >> nr; 1002 1040 mol = molecules->ReturnIndex(nr); 1003 1041 } while (mol == NULL); 1004 Log() << Verbose(0) << "Enter name: ";1042 DoLog(0) && (Log() << Verbose(0) << "Enter name: "); 1005 1043 cin >> filename; 1006 1044 mol->SetNameFromFilename(filename); … … 1013 1051 mol = NULL; 1014 1052 do { 1015 Log() << Verbose(0) << "Enter index of molecule: ";1053 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: "); 1016 1054 cin >> nr; 1017 1055 mol = molecules->ReturnIndex(nr); 1018 1056 } while (mol == NULL); 1019 Log() << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl;1057 DoLog(0) && (Log() << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl); 1020 1058 do { 1021 Log() << Verbose(0) << "Enter file name: ";1059 DoLog(0) && (Log() << Verbose(0) << "Enter file name: "); 1022 1060 cin >> filename; 1023 1061 } while (!mol->AddXYZFile(filename)); … … 1027 1065 1028 1066 case 'r': 1029 Log() << Verbose(0) << "Enter index of molecule: ";1067 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: "); 1030 1068 cin >> nr; 1031 1069 count = 1; … … 1050 1088 char choice; // menu choice char 1051 1089 1052 Log() << Verbose(0) << "===========MERGE MOLECULES=====================" << endl; 1053 Log() << Verbose(0) << "a - simple add of one molecule to another" << endl; 1054 Log() << Verbose(0) << "e - embedding merge of two molecules" << endl; 1055 Log() << Verbose(0) << "m - multi-merge of all molecules" << endl; 1056 Log() << Verbose(0) << "s - scatter merge of two molecules" << endl; 1057 Log() << Verbose(0) << "t - simple merge of two molecules" << endl; 1058 Log() << Verbose(0) << "all else - go back" << endl; 1059 Log() << Verbose(0) << "===============================================" << endl; 1060 Log() << Verbose(0) << "INPUT: "; 1090 DoLog(0) && (Log() << Verbose(0) << "===========MERGE MOLECULES=====================" << endl); 1091 DoLog(0) && (Log() << Verbose(0) << "a - simple add of one molecule to another" << endl); 1092 DoLog(0) && (Log() << Verbose(0) << "b - count the number of bonds of two elements" << endl); 1093 DoLog(0) && (Log() << Verbose(0) << "B - count the number of bonds of three elements " << endl); 1094 DoLog(0) && (Log() << Verbose(0) << "e - embedding merge of two molecules" << endl); 1095 DoLog(0) && (Log() << Verbose(0) << "h - count the number of hydrogen bonds" << endl); 1096 DoLog(0) && (Log() << Verbose(0) << "b - count the number of hydrogen bonds" << endl); 1097 DoLog(0) && (Log() << Verbose(0) << "m - multi-merge of all molecules" << endl); 1098 DoLog(0) && (Log() << Verbose(0) << "s - scatter merge of two molecules" << endl); 1099 DoLog(0) && (Log() << Verbose(0) << "t - simple merge of two molecules" << endl); 1100 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl); 1101 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl); 1102 DoLog(0) && (Log() << Verbose(0) << "INPUT: "); 1061 1103 cin >> choice; 1062 1104 1063 1105 switch (choice) { 1064 1106 default: 1065 Log() << Verbose(0) << "Not a valid choice." << endl;1107 DoLog(0) && (Log() << Verbose(0) << "Not a valid choice." << endl); 1066 1108 break; 1067 1109 … … 1072 1114 { 1073 1115 do { 1074 Log() << Verbose(0) << "Enter index of destination molecule: ";1116 DoLog(0) && (Log() << Verbose(0) << "Enter index of destination molecule: "); 1075 1117 cin >> dest; 1076 1118 destmol = molecules->ReturnIndex(dest); 1077 1119 } while ((destmol == NULL) && (dest != -1)); 1078 1120 do { 1079 Log() << Verbose(0) << "Enter index of source molecule to add from: ";1121 DoLog(0) && (Log() << Verbose(0) << "Enter index of source molecule to add from: "); 1080 1122 cin >> src; 1081 1123 srcmol = molecules->ReturnIndex(src); … … 1087 1129 break; 1088 1130 1131 case 'b': 1132 { 1133 const int nr = 2; 1134 char *names[nr] = {"first", "second"}; 1135 int Z[nr]; 1136 element *elements[nr]; 1137 for (int i=0;i<nr;i++) { 1138 Z[i] = 0; 1139 do { 1140 cout << "Enter " << names[i] << " element: "; 1141 cin >> Z[i]; 1142 } while ((Z[i] <= 0) && (Z[i] > MAX_ELEMENTS)); 1143 elements[i] = periode->FindElement(Z[i]); 1144 } 1145 const int count = CountBondsOfTwo(molecules, elements[0], elements[1]); 1146 cout << endl << "There are " << count << " "; 1147 for (int i=0;i<nr;i++) { 1148 if (i==0) 1149 cout << elements[i]->symbol; 1150 else 1151 cout << "-" << elements[i]->symbol; 1152 } 1153 cout << " bonds." << endl; 1154 } 1155 break; 1156 1157 case 'B': 1158 { 1159 const int nr = 3; 1160 char *names[nr] = {"first", "second", "third"}; 1161 int Z[nr]; 1162 element *elements[nr]; 1163 for (int i=0;i<nr;i++) { 1164 Z[i] = 0; 1165 do { 1166 cout << "Enter " << names[i] << " element: "; 1167 cin >> Z[i]; 1168 } while ((Z[i] <= 0) && (Z[i] > MAX_ELEMENTS)); 1169 elements[i] = periode->FindElement(Z[i]); 1170 } 1171 const int count = CountBondsOfThree(molecules, elements[0], elements[1], elements[2]); 1172 cout << endl << "There are " << count << " "; 1173 for (int i=0;i<nr;i++) { 1174 if (i==0) 1175 cout << elements[i]->symbol; 1176 else 1177 cout << "-" << elements[i]->symbol; 1178 } 1179 cout << " bonds." << endl; 1180 } 1181 break; 1182 1089 1183 case 'e': 1090 1184 { … … 1092 1186 molecule *srcmol = NULL, *destmol = NULL; 1093 1187 do { 1094 Log() << Verbose(0) << "Enter index of matrix molecule (the variable one): ";1188 DoLog(0) && (Log() << Verbose(0) << "Enter index of matrix molecule (the variable one): "); 1095 1189 cin >> src; 1096 1190 srcmol = molecules->ReturnIndex(src); 1097 1191 } while ((srcmol == NULL) && (src != -1)); 1098 1192 do { 1099 Log() << Verbose(0) << "Enter index of molecule to merge into (the fixed one): ";1193 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule to merge into (the fixed one): "); 1100 1194 cin >> dest; 1101 1195 destmol = molecules->ReturnIndex(dest); … … 1106 1200 break; 1107 1201 1202 case 'h': 1203 { 1204 int Z; 1205 cout << "Please enter interface element: "; 1206 cin >> Z; 1207 element * const InterfaceElement = periode->FindElement(Z); 1208 cout << endl << "There are " << CountHydrogenBridgeBonds(molecules, InterfaceElement) << " hydrogen bridges with connections to " << (InterfaceElement != 0 ? InterfaceElement->name : "None") << "." << endl; 1209 } 1210 break; 1211 1108 1212 case 'm': 1109 1213 { … … 1111 1215 molecule *mol = NULL; 1112 1216 do { 1113 Log() << Verbose(0) << "Enter index of molecule to merge into: ";1217 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule to merge into: "); 1114 1218 cin >> nr; 1115 1219 mol = molecules->ReturnIndex(nr); … … 1128 1232 1129 1233 case 's': 1130 Log() << Verbose(0) << "Not implemented yet." << endl;1234 DoLog(0) && (Log() << Verbose(0) << "Not implemented yet." << endl); 1131 1235 break; 1132 1236 … … 1137 1241 { 1138 1242 do { 1139 Log() << Verbose(0) << "Enter index of destination molecule: ";1243 DoLog(0) && (Log() << Verbose(0) << "Enter index of destination molecule: "); 1140 1244 cin >> dest; 1141 1245 destmol = molecules->ReturnIndex(dest); 1142 1246 } while ((destmol == NULL) && (dest != -1)); 1143 1247 do { 1144 Log() << Verbose(0) << "Enter index of source molecule to merge into: ";1248 DoLog(0) && (Log() << Verbose(0) << "Enter index of source molecule to merge into: "); 1145 1249 cin >> src; 1146 1250 srcmol = molecules->ReturnIndex(src); … … 1171 1275 mol = (molecules->ListOfMolecules.front())->CopyMolecule(); 1172 1276 else { 1173 eLog() << Verbose(0) << "I don't have anything to test on ... "; 1277 DoeLog(0) && (eLog()<< Verbose(0) << "I don't have anything to test on ... "); 1278 performCriticalExit(); 1174 1279 return; 1175 1280 } … … 1177 1282 1178 1283 // generate some KeySets 1179 Log() << Verbose(0) << "Generating KeySets." << endl;1284 DoLog(0) && (Log() << Verbose(0) << "Generating KeySets." << endl); 1180 1285 KeySet TestSets[mol->AtomCount+1]; 1181 1286 i=1; … … 1187 1292 i++; 1188 1293 } 1189 Log() << Verbose(0) << "Testing insertion of already present item in KeySets." << endl;1294 DoLog(0) && (Log() << Verbose(0) << "Testing insertion of already present item in KeySets." << endl); 1190 1295 KeySetTestPair test; 1191 1296 test = TestSets[mol->AtomCount-1].insert(Walker->nr); 1192 1297 if (test.second) { 1193 Log() << Verbose(1) << "Insertion worked?!" << endl;1298 DoLog(1) && (Log() << Verbose(1) << "Insertion worked?!" << endl); 1194 1299 } else { 1195 Log() << Verbose(1) << "Insertion rejected: Present object is " << (*test.first) << "." << endl;1300 DoLog(1) && (Log() << Verbose(1) << "Insertion rejected: Present object is " << (*test.first) << "." << endl); 1196 1301 } 1197 1302 TestSets[mol->AtomCount].insert(mol->end->previous->nr); … … 1199 1304 1200 1305 // constructing Graph structure 1201 Log() << Verbose(0) << "Generating Subgraph class." << endl;1306 DoLog(0) && (Log() << Verbose(0) << "Generating Subgraph class." << endl); 1202 1307 Graph Subgraphs; 1203 1308 1204 1309 // insert KeySets into Subgraphs 1205 Log() << Verbose(0) << "Inserting KeySets into Subgraph class." << endl;1310 DoLog(0) && (Log() << Verbose(0) << "Inserting KeySets into Subgraph class." << endl); 1206 1311 for (int j=0;j<mol->AtomCount;j++) { 1207 1312 Subgraphs.insert(GraphPair (TestSets[j],pair<int, double>(counter++, 1.))); 1208 1313 } 1209 Log() << Verbose(0) << "Testing insertion of already present item in Subgraph." << endl;1314 DoLog(0) && (Log() << Verbose(0) << "Testing insertion of already present item in Subgraph." << endl); 1210 1315 GraphTestPair test2; 1211 1316 test2 = Subgraphs.insert(GraphPair (TestSets[mol->AtomCount],pair<int, double>(counter++, 1.))); 1212 1317 if (test2.second) { 1213 Log() << Verbose(1) << "Insertion worked?!" << endl;1318 DoLog(1) && (Log() << Verbose(1) << "Insertion worked?!" << endl); 1214 1319 } else { 1215 Log() << Verbose(1) << "Insertion rejected: Present object is " << (*(test2.first)).second.first << "." << endl;1320 DoLog(1) && (Log() << Verbose(1) << "Insertion rejected: Present object is " << (*(test2.first)).second.first << "." << endl); 1216 1321 } 1217 1322 1218 1323 // show graphs 1219 Log() << Verbose(0) << "Showing Subgraph's contents, checking that it's sorted." << endl;1324 DoLog(0) && (Log() << Verbose(0) << "Showing Subgraph's contents, checking that it's sorted." << endl); 1220 1325 Graph::iterator A = Subgraphs.begin(); 1221 1326 while (A != Subgraphs.end()) { 1222 Log() << Verbose(0) << (*A).second.first << ": ";1327 DoLog(0) && (Log() << Verbose(0) << (*A).second.first << ": "); 1223 1328 KeySet::iterator key = (*A).first.begin(); 1224 1329 comp = -1; 1225 1330 while (key != (*A).first.end()) { 1226 1331 if ((*key) > comp) 1227 Log() << Verbose(0) << (*key) << " ";1332 DoLog(0) && (Log() << Verbose(0) << (*key) << " "); 1228 1333 else 1229 Log() << Verbose(0) << (*key) << "! ";1334 DoLog(0) && (Log() << Verbose(0) << (*key) << "! "); 1230 1335 comp = (*key); 1231 1336 key++; 1232 1337 } 1233 Log() << Verbose(0) << endl;1338 DoLog(0) && (Log() << Verbose(0) << endl); 1234 1339 A++; 1235 1340 } … … 1248 1353 ofstream output; 1249 1354 molecule *mol = new molecule(periode); 1355 mol->SetNameFromFilename(ConfigFileName); 1356 1357 if (!strcmp(configuration->configpath, configuration->GetDefaultPath())) { 1358 DoeLog(2) && (eLog()<< Verbose(2) << "config is found under different path then stated in config file::defaultpath!" << endl); 1359 } 1360 1361 1362 // first save as PDB data 1363 if (ConfigFileName != NULL) 1364 strcpy(filename, ConfigFileName); 1365 if (output == NULL) 1366 strcpy(filename,"main_pcp_linux"); 1367 DoLog(0) && (Log() << Verbose(0) << "Saving as pdb input "); 1368 if (configuration->SavePDB(filename, molecules)) 1369 DoLog(0) && (Log() << Verbose(0) << "done." << endl); 1370 else 1371 DoLog(0) && (Log() << Verbose(0) << "failed." << endl); 1372 1373 // then save as tremolo data file 1374 if (ConfigFileName != NULL) 1375 strcpy(filename, ConfigFileName); 1376 if (output == NULL) 1377 strcpy(filename,"main_pcp_linux"); 1378 DoLog(0) && (Log() << Verbose(0) << "Saving as tremolo data input "); 1379 if (configuration->SaveTREMOLO(filename, molecules)) 1380 DoLog(0) && (Log() << Verbose(0) << "done." << endl); 1381 else 1382 DoLog(0) && (Log() << Verbose(0) << "failed." << endl); 1250 1383 1251 1384 // translate each to its center and merge all molecules in MoleculeListClass into this molecule … … 1267 1400 } 1268 1401 1269 Log() << Verbose(0) << "Storing configuration ... " << endl;1402 DoLog(0) && (Log() << Verbose(0) << "Storing configuration ... " << endl); 1270 1403 // get correct valence orbitals 1271 1404 mol->CalculateOrbitals(*configuration); … … 1283 1416 output.close(); 1284 1417 output.clear(); 1285 Log() << Verbose(0) << "Saving of config file ";1418 DoLog(0) && (Log() << Verbose(0) << "Saving of config file "); 1286 1419 if (configuration->Save(filename, periode, mol)) 1287 Log() << Verbose(0) << "successful." << endl;1420 DoLog(0) && (Log() << Verbose(0) << "successful." << endl); 1288 1421 else 1289 Log() << Verbose(0) << "failed." << endl;1422 DoLog(0) && (Log() << Verbose(0) << "failed." << endl); 1290 1423 1291 1424 // and save to xyz file … … 1300 1433 output.open(filename, ios::trunc); 1301 1434 } 1302 Log() << Verbose(0) << "Saving of XYZ file ";1435 DoLog(0) && (Log() << Verbose(0) << "Saving of XYZ file "); 1303 1436 if (mol->MDSteps <= 1) { 1304 1437 if (mol->OutputXYZ(&output)) 1305 Log() << Verbose(0) << "successful." << endl;1438 DoLog(0) && (Log() << Verbose(0) << "successful." << endl); 1306 1439 else 1307 Log() << Verbose(0) << "failed." << endl;1440 DoLog(0) && (Log() << Verbose(0) << "failed." << endl); 1308 1441 } else { 1309 1442 if (mol->OutputTrajectoriesXYZ(&output)) 1310 Log() << Verbose(0) << "successful." << endl;1443 DoLog(0) && (Log() << Verbose(0) << "successful." << endl); 1311 1444 else 1312 Log() << Verbose(0) << "failed." << endl;1445 DoLog(0) && (Log() << Verbose(0) << "failed." << endl); 1313 1446 } 1314 1447 output.close(); … … 1320 1453 if (output == NULL) 1321 1454 strcpy(filename,"main_pcp_linux"); 1322 Log() << Verbose(0) << "Saving as mpqc input ";1455 DoLog(0) && (Log() << Verbose(0) << "Saving as mpqc input "); 1323 1456 if (configuration->SaveMPQC(filename, mol)) 1324 Log() << Verbose(0) << "done." << endl;1457 DoLog(0) && (Log() << Verbose(0) << "done." << endl); 1325 1458 else 1326 Log() << Verbose(0) << "failed." << endl;1459 DoLog(0) && (Log() << Verbose(0) << "failed." << endl); 1327 1460 1328 1461 if (!strcmp(configuration->configpath, configuration->GetDefaultPath())) { 1329 eLog() << Verbose(0) << "WARNING: config is found under different path then stated in config file::defaultpath!" << endl;1462 DoeLog(2) && (eLog()<< Verbose(2) << "config is found under different path then stated in config file::defaultpath!" << endl); 1330 1463 } 1464 1331 1465 delete(mol); 1332 1466 }; … … 1356 1490 enum ConfigStatus configPresent = absent; 1357 1491 clock_t start,end; 1492 double MaxDistance = -1; 1358 1493 int argptr; 1359 1494 molecule *mol = NULL; 1360 string BondGraphFileName(""); 1495 string BondGraphFileName("\n"); 1496 int verbosity = 0; 1361 1497 strncpy(configuration.databasepath, LocalPath, MAXSTRINGSIZE-1); 1362 1498 … … 1366 1502 do { 1367 1503 if (argv[argptr][0] == '-') { 1368 Log() << Verbose(0) << "Recognized command line argument: " << argv[argptr][1] << ".\n";1504 DoLog(0) && (Log() << Verbose(0) << "Recognized command line argument: " << argv[argptr][1] << ".\n"); 1369 1505 argptr++; 1370 1506 switch(argv[argptr-1][1]) { … … 1372 1508 case 'H': 1373 1509 case '?': 1374 Log() << Verbose(0) << "MoleCuilder suite" << endl << "==================" << endl << endl; 1375 Log() << Verbose(0) << "Usage: " << argv[0] << "[config file] [-{acefpsthH?vfrp}] [further arguments]" << endl; 1376 Log() << Verbose(0) << "or simply " << argv[0] << " without arguments for interactive session." << endl; 1377 Log() << Verbose(0) << "\t-a Z x1 x2 x3\tAdd new atom of element Z at coordinates (x1,x2,x3)." << endl; 1378 Log() << Verbose(0) << "\t-A <source>\tCreate adjacency list from bonds parsed from 'dbond'-style file." <<endl; 1379 Log() << Verbose(0) << "\t-b xx xy xz yy yz zz\tCenter atoms in domain with given symmetric matrix of (xx,xy,xz,yy,yz,zz)." << endl; 1380 Log() << Verbose(0) << "\t-B xx xy xz yy yz zz\tBound atoms by domain with given symmetric matrix of (xx,xy,xz,yy,yz,zz)." << endl; 1381 Log() << Verbose(0) << "\t-c x1 x2 x3\tCenter atoms in domain with a minimum distance to boundary of (x1,x2,x3)." << endl; 1382 Log() << Verbose(0) << "\t-C\tPair Correlation analysis." << endl; 1383 Log() << Verbose(0) << "\t-d x1 x2 x3\tDuplicate cell along each axis by given factor." << endl; 1384 Log() << Verbose(0) << "\t-D <bond distance>\tDepth-First-Search Analysis of the molecule, giving cycles and tree/back edges." << endl; 1385 Log() << Verbose(0) << "\t-e <file>\tSets the databases path to be parsed (default: ./)." << endl; 1386 Log() << Verbose(0) << "\t-E <id> <Z>\tChange atom <id>'s element to <Z>, <id> begins at 0." << endl; 1387 Log() << Verbose(0) << "\t-f/F <dist> <order>\tFragments the molecule in BOSSANOVA manner (with/out rings compressed) and stores config files in same dir as config (return code 0 - fragmented, 2 - no fragmentation necessary)." << endl; 1388 Log() << Verbose(0) << "\t-g <file>\tParses a bond length table from the given file." << endl; 1389 Log() << Verbose(0) << "\t-h/-H/-?\tGive this help screen." << endl; 1390 Log() << Verbose(0) << "\t-L <step0> <step1> <prefix>\tStore a linear interpolation between two configurations <step0> and <step1> into single config files with prefix <prefix> and as Trajectories into the current config file." << endl; 1391 Log() << Verbose(0) << "\t-m <0/1>\tCalculate (0)/ Align in(1) PAS with greatest EV along z axis." << endl; 1392 Log() << Verbose(0) << "\t-M <basis>\tSetting basis to store to MPQC config files." << endl; 1393 Log() << Verbose(0) << "\t-n\tFast parsing (i.e. no trajectories are looked for)." << endl; 1394 Log() << Verbose(0) << "\t-N <radius> <file>\tGet non-convex-envelope." << endl; 1395 Log() << Verbose(0) << "\t-o <out>\tGet volume of the convex envelope (and store to tecplot file)." << endl; 1396 Log() << Verbose(0) << "\t-O\tCenter atoms in origin." << endl; 1397 Log() << Verbose(0) << "\t-p <file>\tParse given xyz file and create raw config file from it." << endl; 1398 Log() << Verbose(0) << "\t-P <file>\tParse given forces file and append as an MD step to config file via Verlet." << endl; 1399 Log() << Verbose(0) << "\t-r <id>\t\tRemove an atom with given id." << endl; 1400 Log() << Verbose(0) << "\t-R <id> <radius>\t\tRemove all atoms out of sphere around a given one." << endl; 1401 Log() << Verbose(0) << "\t-s x1 x2 x3\tScale all atom coordinates by this vector (x1,x2,x3)." << endl; 1402 Log() << Verbose(0) << "\t-S <file> Store temperatures from the config file in <file>." << endl; 1403 Log() << Verbose(0) << "\t-t x1 x2 x3\tTranslate all atoms by this vector (x1,x2,x3)." << endl; 1404 Log() << Verbose(0) << "\t-T x1 x2 x3\tTranslate periodically all atoms by this vector (x1,x2,x3)." << endl; 1405 Log() << Verbose(0) << "\t-u rho\tsuspend in water solution and output necessary cell lengths, average density rho and repetition." << endl; 1406 Log() << Verbose(0) << "\t-v/-V\t\tGives version information." << endl; 1407 Log() << Verbose(0) << "Note: config files must not begin with '-' !" << endl; 1510 DoLog(0) && (Log() << Verbose(0) << "MoleCuilder suite" << endl << "==================" << endl << endl); 1511 DoLog(0) && (Log() << Verbose(0) << "Usage: " << argv[0] << "[config file] [-{acefpsthH?vfrp}] [further arguments]" << endl); 1512 DoLog(0) && (Log() << Verbose(0) << "or simply " << argv[0] << " without arguments for interactive session." << endl); 1513 DoLog(0) && (Log() << Verbose(0) << "\t-a Z x1 x2 x3\tAdd new atom of element Z at coordinates (x1,x2,x3)." << endl); 1514 DoLog(0) && (Log() << Verbose(0) << "\t-A <source>\tCreate adjacency list from bonds parsed from 'dbond'-style file." <<endl); 1515 DoLog(0) && (Log() << Verbose(0) << "\t-b xx xy xz yy yz zz\tCenter atoms in domain with given symmetric matrix of (xx,xy,xz,yy,yz,zz)." << endl); 1516 DoLog(0) && (Log() << Verbose(0) << "\t-B xx xy xz yy yz zz\tBound atoms by domain with given symmetric matrix of (xx,xy,xz,yy,yz,zz)." << endl); 1517 DoLog(0) && (Log() << Verbose(0) << "\t-c x1 x2 x3\tCenter atoms in domain with a minimum distance to boundary of (x1,x2,x3)." << endl); 1518 DoLog(0) && (Log() << Verbose(0) << "\t-C <type> [params] <output> <bin output> <BinWidth> <BinStart> <BinEnd>\tPair Correlation analysis." << endl); 1519 DoLog(0) && (Log() << Verbose(0) << "\t-d x1 x2 x3\tDuplicate cell along each axis by given factor." << endl); 1520 DoLog(0) && (Log() << Verbose(0) << "\t-D <bond distance>\tDepth-First-Search Analysis of the molecule, giving cycles and tree/back edges." << endl); 1521 DoLog(0) && (Log() << Verbose(0) << "\t-e <file>\tSets the databases path to be parsed (default: ./)." << endl); 1522 DoLog(0) && (Log() << Verbose(0) << "\t-E <id> <Z>\tChange atom <id>'s element to <Z>, <id> begins at 0." << endl); 1523 DoLog(0) && (Log() << Verbose(0) << "\t-f <dist> <order>\tFragments the molecule in BOSSANOVA manner (with/out rings compressed) and stores config files in same dir as config (return code 0 - fragmented, 2 - no fragmentation necessary)." << endl); 1524 DoLog(0) && (Log() << Verbose(0) << "\t-F <xyz of filler> <dist_x> <dist_y> <dist_z> <epsilon> <randatom> <randmol> <DoRotate>\tFilling Box with water molecules." << endl); 1525 DoLog(0) && (Log() << Verbose(0) << "\t-FF <MaxDistance> <xyz of filler> <dist_x> <dist_y> <dist_z> <epsilon> <randatom> <randmol> <DoRotate>\tFilling Box with water molecules." << endl); 1526 DoLog(0) && (Log() << Verbose(0) << "\t-g <file>\tParses a bond length table from the given file." << endl); 1527 DoLog(0) && (Log() << Verbose(0) << "\t-h/-H/-?\tGive this help screen." << endl); 1528 DoLog(0) && (Log() << Verbose(0) << "\t-I\t Dissect current system of molecules into a set of disconnected (subgraphs of) molecules." << endl); 1529 DoLog(0) && (Log() << Verbose(0) << "\t-j\t<path> Store all bonds to file." << endl); 1530 DoLog(0) && (Log() << Verbose(0) << "\t-J\t<path> Store adjacency per atom to file." << endl); 1531 DoLog(0) && (Log() << Verbose(0) << "\t-L <step0> <step1> <prefix>\tStore a linear interpolation between two configurations <step0> and <step1> into single config files with prefix <prefix> and as Trajectories into the current config file." << endl); 1532 DoLog(0) && (Log() << Verbose(0) << "\t-m <0/1>\tCalculate (0)/ Align in(1) PAS with greatest EV along z axis." << endl); 1533 DoLog(0) && (Log() << Verbose(0) << "\t-M <basis>\tSetting basis to store to MPQC config files." << endl); 1534 DoLog(0) && (Log() << Verbose(0) << "\t-n\tFast parsing (i.e. no trajectories are looked for)." << endl); 1535 DoLog(0) && (Log() << Verbose(0) << "\t-N <radius> <file>\tGet non-convex-envelope." << endl); 1536 DoLog(0) && (Log() << Verbose(0) << "\t-o <out>\tGet volume of the convex envelope (and store to tecplot file)." << endl); 1537 DoLog(0) && (Log() << Verbose(0) << "\t-O\tCenter atoms in origin." << endl); 1538 DoLog(0) && (Log() << Verbose(0) << "\t-p <file>\tParse given xyz file and create raw config file from it." << endl); 1539 DoLog(0) && (Log() << Verbose(0) << "\t-P <file>\tParse given forces file and append as an MD step to config file via Verlet." << endl); 1540 DoLog(0) && (Log() << Verbose(0) << "\t-r <id>\t\tRemove an atom with given id." << endl); 1541 DoLog(0) && (Log() << Verbose(0) << "\t-R <id> <radius>\t\tRemove all atoms out of sphere around a given one." << endl); 1542 DoLog(0) && (Log() << Verbose(0) << "\t-s x1 x2 x3\tScale all atom coordinates by this vector (x1,x2,x3)." << endl); 1543 DoLog(0) && (Log() << Verbose(0) << "\t-S <file> Store temperatures from the config file in <file>." << endl); 1544 DoLog(0) && (Log() << Verbose(0) << "\t-t x1 x2 x3\tTranslate all atoms by this vector (x1,x2,x3)." << endl); 1545 DoLog(0) && (Log() << Verbose(0) << "\t-T x1 x2 x3\tTranslate periodically all atoms by this vector (x1,x2,x3)." << endl); 1546 DoLog(0) && (Log() << Verbose(0) << "\t-u rho\tsuspend in water solution and output necessary cell lengths, average density rho and repetition." << endl); 1547 DoLog(0) && (Log() << Verbose(0) << "\t-v\t\tsets verbosity (more is more)." << endl); 1548 DoLog(0) && (Log() << Verbose(0) << "\t-V\t\tGives version information." << endl); 1549 DoLog(0) && (Log() << Verbose(0) << "\t-X\t\tset default name of a molecule." << endl); 1550 DoLog(0) && (Log() << Verbose(0) << "Note: config files must not begin with '-' !" << endl); 1408 1551 return (1); 1409 1552 break; 1410 1553 case 'v': 1554 while (argv[argptr-1][verbosity+1] == 'v') { 1555 verbosity++; 1556 } 1557 setVerbosity(verbosity); 1558 DoLog(0) && (Log() << Verbose(0) << "Setting verbosity to " << verbosity << "." << endl); 1559 break; 1411 1560 case 'V': 1412 Log() << Verbose(0) << argv[0] << " " << VERSIONSTRING << endl;1413 Log() << Verbose(0) << "Build your own molecule position set." << endl;1561 DoLog(0) && (Log() << Verbose(0) << argv[0] << " " << VERSIONSTRING << endl); 1562 DoLog(0) && (Log() << Verbose(0) << "Build your own molecule position set." << endl); 1414 1563 return (1); 1564 break; 1565 case 'B': 1566 if (ExitFlag == 0) ExitFlag = 1; 1567 if ((argptr+5 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) ) { 1568 ExitFlag = 255; 1569 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for bounding in box: -B <xx> <xy> <xz> <yy> <yz> <zz>" << endl); 1570 performCriticalExit(); 1571 } else { 1572 SaveFlag = true; 1573 j = -1; 1574 DoLog(1) && (Log() << Verbose(1) << "Centering atoms in config file within given simulation box." << endl); 1575 double * const cell_size = World::get()->cell_size; 1576 for (int i=0;i<6;i++) { 1577 cell_size[i] = atof(argv[argptr+i]); 1578 } 1579 argptr+=6; 1580 } 1415 1581 break; 1416 1582 case 'e': 1417 1583 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 1418 eLog() << Verbose(0) << "Not enough or invalid arguments for specifying element db: -e <db file>" << endl; 1584 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for specifying element db: -e <db file>" << endl); 1585 performCriticalExit(); 1419 1586 } else { 1420 Log() << Verbose(0) << "Using " << argv[argptr] << " as elements database." << endl;1587 DoLog(0) && (Log() << Verbose(0) << "Using " << argv[argptr] << " as elements database." << endl); 1421 1588 strncpy (configuration.databasepath, argv[argptr], MAXSTRINGSIZE-1); 1422 1589 argptr+=1; … … 1425 1592 case 'g': 1426 1593 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 1427 eLog() << Verbose(0) << "Not enough or invalid arguments for specifying bond length table: -g <table file>" << endl; 1594 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for specifying bond length table: -g <table file>" << endl); 1595 performCriticalExit(); 1428 1596 } else { 1429 1597 BondGraphFileName = argv[argptr]; 1430 Log() << Verbose(0) << "Using " << BondGraphFileName << " as bond length table." << endl;1598 DoLog(0) && (Log() << Verbose(0) << "Using " << BondGraphFileName << " as bond length table." << endl); 1431 1599 argptr+=1; 1432 1600 } 1433 1601 break; 1434 1602 case 'n': 1435 Log() << Verbose(0) << "I won't parse trajectories." << endl;1603 DoLog(0) && (Log() << Verbose(0) << "I won't parse trajectories." << endl); 1436 1604 configuration.FastParsing = true; 1605 break; 1606 case 'X': 1607 { 1608 char **name = &(World::get()->DefaultName); 1609 delete[](*name); 1610 const int length = strlen(argv[argptr]); 1611 *name = new char[length+2]; 1612 strncpy(*name, argv[argptr], length); 1613 DoLog(0) && (Log() << Verbose(0) << "Default name of new molecules set to " << *name << "." << endl); 1614 } 1437 1615 break; 1438 1616 default: // no match? Step on … … 1446 1624 // 3a. Parse the element database 1447 1625 if (periode->LoadPeriodentafel(configuration.databasepath)) { 1448 Log() << Verbose(0) << "Element list loaded successfully." << endl;1626 DoLog(0) && (Log() << Verbose(0) << "Element list loaded successfully." << endl); 1449 1627 //periode->Output(); 1450 1628 } else { 1451 Log() << Verbose(0) << "Element list loading failed." << endl;1629 DoLog(0) && (Log() << Verbose(0) << "Element list loading failed." << endl); 1452 1630 return 1; 1453 1631 } … … 1455 1633 if (argv[1][0] != '-') { 1456 1634 // simply create a new molecule, wherein the config file is loaded and the manipulation takes place 1457 Log() << Verbose(0) << "Config file given." << endl;1635 DoLog(0) && (Log() << Verbose(0) << "Config file given." << endl); 1458 1636 test.open(argv[1], ios::in); 1459 1637 if (test == NULL) { … … 1461 1639 output.open(argv[1], ios::out); 1462 1640 if (output == NULL) { 1463 Log() << Verbose(1) << "Specified config file " << argv[1] << " not found." << endl;1641 DoLog(1) && (Log() << Verbose(1) << "Specified config file " << argv[1] << " not found." << endl); 1464 1642 configPresent = absent; 1465 1643 } else { 1466 Log() << Verbose(0) << "Empty configuration file." << endl;1644 DoLog(0) && (Log() << Verbose(0) << "Empty configuration file." << endl); 1467 1645 ConfigFileName = argv[1]; 1468 1646 configPresent = empty; … … 1472 1650 test.close(); 1473 1651 ConfigFileName = argv[1]; 1474 Log() << Verbose(1) << "Specified config file found, parsing ... ";1652 DoLog(1) && (Log() << Verbose(1) << "Specified config file found, parsing ... "); 1475 1653 switch (configuration.TestSyntax(ConfigFileName, periode)) { 1476 1654 case 1: 1477 Log() << Verbose(0) << "new syntax." << endl;1655 DoLog(0) && (Log() << Verbose(0) << "new syntax." << endl); 1478 1656 configuration.Load(ConfigFileName, BondGraphFileName, periode, molecules); 1479 1657 configPresent = present; 1480 1658 break; 1481 1659 case 0: 1482 Log() << Verbose(0) << "old syntax." << endl;1660 DoLog(0) && (Log() << Verbose(0) << "old syntax." << endl); 1483 1661 configuration.LoadOld(ConfigFileName, BondGraphFileName, periode, molecules); 1484 1662 configPresent = present; 1485 1663 break; 1486 1664 default: 1487 Log() << Verbose(0) << "Unknown syntax or empty, yet present file." << endl;1665 DoLog(0) && (Log() << Verbose(0) << "Unknown syntax or empty, yet present file." << endl); 1488 1666 configPresent = empty; 1489 1667 } … … 1502 1680 mol = new molecule(periode); 1503 1681 mol->ActiveFlag = true; 1682 if (ConfigFileName != NULL) 1683 mol->SetNameFromFilename(ConfigFileName); 1504 1684 molecules->insert(mol); 1685 } 1686 if (configuration.BG == NULL) { 1687 configuration.BG = new BondGraph(configuration.GetIsAngstroem()); 1688 if ((!BondGraphFileName.empty()) && (configuration.BG->LoadBondLengthTable(BondGraphFileName))) { 1689 DoLog(0) && (Log() << Verbose(0) << "Bond length table loaded successfully." << endl); 1690 } else { 1691 DoeLog(1) && (eLog()<< Verbose(1) << "Bond length table loading failed." << endl); 1692 } 1505 1693 } 1506 1694 … … 1508 1696 argptr = 1; 1509 1697 do { 1510 Log() << Verbose(0) << "Current Command line argument: " << argv[argptr] << "." << endl;1698 DoLog(0) && (Log() << Verbose(0) << "Current Command line argument: " << argv[argptr] << "." << endl); 1511 1699 if (argv[argptr][0] == '-') { 1512 1700 argptr++; … … 1517 1705 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 1518 1706 ExitFlag = 255; 1519 eLog() << Verbose(0) << "Not enough arguments for parsing: -p <xyz file>" << endl; 1707 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough arguments for parsing: -p <xyz file>" << endl); 1708 performCriticalExit(); 1520 1709 } else { 1521 1710 SaveFlag = true; 1522 Log() << Verbose(1) << "Parsing xyz file for new atoms." << endl;1711 DoLog(1) && (Log() << Verbose(1) << "Parsing xyz file for new atoms." << endl); 1523 1712 if (!mol->AddXYZFile(argv[argptr])) 1524 Log() << Verbose(2) << "File not found." << endl;1713 DoLog(2) && (Log() << Verbose(2) << "File not found." << endl); 1525 1714 else { 1526 Log() << Verbose(2) << "File found and parsed." << endl;1715 DoLog(2) && (Log() << Verbose(2) << "File found and parsed." << endl); 1527 1716 configPresent = present; 1528 1717 } … … 1533 1722 if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3]))) { 1534 1723 ExitFlag = 255; 1535 eLog() << Verbose(0) << "Not enough or invalid arguments for adding atom: -a <element> <x> <y> <z>" << endl; 1724 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for adding atom: -a <element> <x> <y> <z>" << endl); 1725 performCriticalExit(); 1536 1726 } else { 1537 1727 SaveFlag = true; 1538 Log() << Verbose(1) << "Adding new atom with element " << argv[argptr] << " at (" << argv[argptr+1] << "," << argv[argptr+2] << "," << argv[argptr+3] << "), ";1728 DoLog(1) && (Log() << Verbose(1) << "Adding new atom with element " << argv[argptr] << " at (" << argv[argptr+1] << "," << argv[argptr+2] << "," << argv[argptr+3] << "), "); 1539 1729 first = new atom; 1540 1730 first->type = periode->FindElement(atoi(argv[argptr])); 1541 1731 if (first->type != NULL) 1542 Log() << Verbose(2) << "found element " << first->type->name << endl;1732 DoLog(2) && (Log() << Verbose(2) << "found element " << first->type->name << endl); 1543 1733 for (int i=NDIM;i--;) 1544 1734 first->x.x[i] = atof(argv[argptr+1+i]); … … 1548 1738 configPresent = present; 1549 1739 } else 1550 eLog() << Verbose(1) << "Could not find the specified element." << endl;1740 DoeLog(1) && (eLog()<< Verbose(1) << "Could not find the specified element." << endl); 1551 1741 argptr+=4; 1552 1742 } … … 1561 1751 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 1562 1752 ExitFlag = 255; 1563 eLog() << Verbose(0) << "Not enough or invalid arguments given for setting MPQC basis: -B <basis name>" << endl; 1753 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for setting MPQC basis: -B <basis name>" << endl); 1754 performCriticalExit(); 1564 1755 } else { 1565 1756 configuration.basis = argv[argptr]; 1566 Log() << Verbose(1) << "Setting MPQC basis to " << configuration.basis << "." << endl;1757 DoLog(1) && (Log() << Verbose(1) << "Setting MPQC basis to " << configuration.basis << "." << endl); 1567 1758 argptr+=1; 1568 1759 } … … 1571 1762 if (ExitFlag == 0) ExitFlag = 1; 1572 1763 { 1573 Log() << Verbose(1) << "Depth-First-Search Analysis." << endl;1764 DoLog(1) && (Log() << Verbose(1) << "Depth-First-Search Analysis." << endl); 1574 1765 MoleculeLeafClass *Subgraphs = NULL; // list of subgraphs from DFS analysis 1575 1766 int *MinimumRingSize = new int[mol->AtomCount]; … … 1601 1792 //argptr+=1; 1602 1793 break; 1794 case 'I': 1795 DoLog(1) && (Log() << Verbose(1) << "Dissecting molecular system into a set of disconnected subgraphs ... " << endl); 1796 // @TODO rather do the dissection afterwards 1797 molecules->DissectMoleculeIntoConnectedSubgraphs(periode, &configuration); 1798 mol = NULL; 1799 if (molecules->ListOfMolecules.size() != 0) { 1800 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 1801 if ((*ListRunner)->ActiveFlag) { 1802 mol = *ListRunner; 1803 break; 1804 } 1805 } 1806 if ((mol == NULL) && (!molecules->ListOfMolecules.empty())) { 1807 mol = *(molecules->ListOfMolecules.begin()); 1808 if (mol != NULL) 1809 mol->ActiveFlag = true; 1810 } 1811 break; 1603 1812 case 'C': 1813 { 1814 int ranges[3] = {1, 1, 1}; 1815 bool periodic = (argv[argptr-1][2] =='p'); 1816 if (ExitFlag == 0) ExitFlag = 1; 1817 if ((argptr >= argc)) { 1818 ExitFlag = 255; 1819 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C[p] <type: E/P/S> [more params] <output> <bin output> <BinStart> <BinEnd>" << endl); 1820 performCriticalExit(); 1821 } else { 1822 switch(argv[argptr][0]) { 1823 case 'E': 1824 { 1825 if ((argptr+6 >= argc) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+5])) || (!IsValidNumber(argv[argptr+6])) || (!IsValidNumber(argv[argptr+2])) || (argv[argptr+1][0] == '-') || (argv[argptr+2][0] == '-') || (argv[argptr+3][0] == '-') || (argv[argptr+4][0] == '-')) { 1826 ExitFlag = 255; 1827 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C E <Z1> <Z2> <output> <bin output>" << endl); 1828 performCriticalExit(); 1829 } else { 1830 ofstream output(argv[argptr+3]); 1831 ofstream binoutput(argv[argptr+4]); 1832 const double BinStart = atof(argv[argptr+5]); 1833 const double BinEnd = atof(argv[argptr+6]); 1834 1835 element *elemental = periode->FindElement((const int) atoi(argv[argptr+1])); 1836 element *elemental2 = periode->FindElement((const int) atoi(argv[argptr+2])); 1837 PairCorrelationMap *correlationmap = NULL; 1838 if (periodic) 1839 correlationmap = PeriodicPairCorrelation(molecules, elemental, elemental2, ranges); 1840 else 1841 correlationmap = PairCorrelation(molecules, elemental, elemental2); 1842 //OutputCorrelationToSurface(&output, correlationmap); 1843 BinPairMap *binmap = BinData( correlationmap, 0.5, BinStart, BinEnd ); 1844 OutputCorrelation ( &binoutput, binmap ); 1845 output.close(); 1846 binoutput.close(); 1847 delete(binmap); 1848 delete(correlationmap); 1849 argptr+=7; 1850 } 1851 } 1852 break; 1853 1854 case 'P': 1855 { 1856 if ((argptr+8 >= argc) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+7])) || (!IsValidNumber(argv[argptr+8])) || (argv[argptr+1][0] == '-') || (argv[argptr+2][0] == '-') || (argv[argptr+3][0] == '-') || (argv[argptr+4][0] == '-') || (argv[argptr+5][0] == '-') || (argv[argptr+6][0] == '-')) { 1857 ExitFlag = 255; 1858 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C P <Z1> <x> <y> <z> <output> <bin output>" << endl); 1859 performCriticalExit(); 1860 } else { 1861 ofstream output(argv[argptr+5]); 1862 ofstream binoutput(argv[argptr+6]); 1863 const double BinStart = atof(argv[argptr+7]); 1864 const double BinEnd = atof(argv[argptr+8]); 1865 1866 element *elemental = periode->FindElement((const int) atoi(argv[argptr+1])); 1867 Vector *Point = new Vector((const double) atof(argv[argptr+1]),(const double) atof(argv[argptr+2]),(const double) atof(argv[argptr+3])); 1868 CorrelationToPointMap *correlationmap = NULL; 1869 if (periodic) 1870 correlationmap = PeriodicCorrelationToPoint(molecules, elemental, Point, ranges); 1871 else 1872 correlationmap = CorrelationToPoint(molecules, elemental, Point); 1873 //OutputCorrelationToSurface(&output, correlationmap); 1874 BinPairMap *binmap = BinData( correlationmap, 0.5, BinStart, BinEnd ); 1875 OutputCorrelation ( &binoutput, binmap ); 1876 output.close(); 1877 binoutput.close(); 1878 delete(Point); 1879 delete(binmap); 1880 delete(correlationmap); 1881 argptr+=9; 1882 } 1883 } 1884 break; 1885 1886 case 'S': 1887 { 1888 if ((argptr+6 >= argc) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) || (!IsValidNumber(argv[argptr+6])) || (argv[argptr+1][0] == '-') || (argv[argptr+2][0] == '-') || (argv[argptr+3][0] == '-')) { 1889 ExitFlag = 255; 1890 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C S <Z> <output> <bin output> <BinWidth> <BinStart> <BinEnd>" << endl); 1891 performCriticalExit(); 1892 } else { 1893 ofstream output(argv[argptr+2]); 1894 ofstream binoutput(argv[argptr+3]); 1895 const double radius = 4.; 1896 const double BinWidth = atof(argv[argptr+4]); 1897 const double BinStart = atof(argv[argptr+5]); 1898 const double BinEnd = atof(argv[argptr+6]); 1899 double LCWidth = 20.; 1900 if (BinEnd > 0) { 1901 if (BinEnd > 2.*radius) 1902 LCWidth = BinEnd; 1903 else 1904 LCWidth = 2.*radius; 1905 } 1906 1907 // get the boundary 1908 class molecule *Boundary = NULL; 1909 class Tesselation *TesselStruct = NULL; 1910 const LinkedCell *LCList = NULL; 1911 // find biggest molecule 1912 int counter = 0; 1913 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) { 1914 if ((Boundary == NULL) || (Boundary->AtomCount < (*BigFinder)->AtomCount)) { 1915 Boundary = *BigFinder; 1916 } 1917 counter++; 1918 } 1919 bool *Actives = Malloc<bool>(counter, "ParseCommandLineOptions() - case C -- *Actives"); 1920 counter = 0; 1921 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) { 1922 Actives[counter++] = (*BigFinder)->ActiveFlag; 1923 (*BigFinder)->ActiveFlag = (*BigFinder == Boundary) ? false : true; 1924 } 1925 LCList = new LinkedCell(Boundary, LCWidth); 1926 element *elemental = periode->FindElement((const int) atoi(argv[argptr+1])); 1927 FindNonConvexBorder(Boundary, TesselStruct, LCList, radius, NULL); 1928 CorrelationToSurfaceMap *surfacemap = NULL; 1929 if (periodic) 1930 surfacemap = PeriodicCorrelationToSurface( molecules, elemental, TesselStruct, LCList, ranges); 1931 else 1932 surfacemap = CorrelationToSurface( molecules, elemental, TesselStruct, LCList); 1933 OutputCorrelationToSurface(&output, surfacemap); 1934 // check whether radius was appropriate 1935 { 1936 double start; double end; 1937 GetMinMax( surfacemap, start, end); 1938 if (LCWidth < end) 1939 DoeLog(1) && (eLog()<< Verbose(1) << "Linked Cell width is smaller than the found range of values! Bins can only be correct up to: " << radius << "." << endl); 1940 } 1941 BinPairMap *binmap = BinData( surfacemap, BinWidth, BinStart, BinEnd ); 1942 OutputCorrelation ( &binoutput, binmap ); 1943 output.close(); 1944 binoutput.close(); 1945 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) 1946 (*BigFinder)->ActiveFlag = Actives[counter++]; 1947 Free(&Actives); 1948 delete(LCList); 1949 delete(TesselStruct); 1950 delete(binmap); 1951 delete(surfacemap); 1952 argptr+=7; 1953 } 1954 } 1955 break; 1956 1957 default: 1958 ExitFlag = 255; 1959 DoeLog(0) && (eLog()<< Verbose(0) << "Invalid type given for pair correlation analysis: -C <type: E/P/S> [more params] <output> <bin output>" << endl); 1960 performCriticalExit(); 1961 break; 1962 } 1963 } 1964 break; 1965 } 1966 case 'E': 1604 1967 if (ExitFlag == 0) ExitFlag = 1; 1605 if ((argptr+ 2 >= argc) || (!IsValidNumber(argv[argptr])) || (argv[argptr][0] == '-') || (argv[argptr+1][0] == '-') || (argv[argptr+2][0] == '-')) {1968 if ((argptr+1 >= argc) || (!IsValidNumber(argv[argptr])) || (argv[argptr+1][0] == '-')) { 1606 1969 ExitFlag = 255; 1607 eLog() << Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C <Z> <output> <bin output>" << endl; 1970 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for changing element: -E <atom nr.> <element>" << endl); 1971 performCriticalExit(); 1608 1972 } else { 1609 SaveFlag = false; 1610 ofstream output(argv[argptr+1]); 1611 ofstream binoutput(argv[argptr+2]); 1612 const double radius = 5.; 1613 1614 // get the boundary 1615 class molecule *Boundary = NULL; 1616 class Tesselation *TesselStruct = NULL; 1973 SaveFlag = true; 1974 DoLog(1) && (Log() << Verbose(1) << "Changing atom " << argv[argptr] << " to element " << argv[argptr+1] << "." << endl); 1975 first = mol->FindAtom(atoi(argv[argptr])); 1976 first->type = periode->FindElement(atoi(argv[argptr+1])); 1977 argptr+=2; 1978 } 1979 break; 1980 case 'F': 1981 if (ExitFlag == 0) ExitFlag = 1; 1982 MaxDistance = -1; 1983 if (argv[argptr-1][2] == 'F') { // option is -FF? 1984 // fetch first argument as max distance to surface 1985 MaxDistance = atof(argv[argptr++]); 1986 DoLog(0) && (Log() << Verbose(0) << "Filling with maximum layer distance of " << MaxDistance << "." << endl); 1987 } 1988 if ((argptr+7 >=argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) || (!IsValidNumber(argv[argptr+6])) || (!IsValidNumber(argv[argptr+7]))) { 1989 ExitFlag = 255; 1990 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <xyz of filler> <dist_x> <dist_y> <dist_z> <boundary> <randatom> <randmol> <DoRotate>" << endl); 1991 performCriticalExit(); 1992 } else { 1993 SaveFlag = true; 1994 DoLog(1) && (Log() << Verbose(1) << "Filling Box with water molecules." << endl); 1995 // construct water molecule 1996 molecule *filler = new molecule(periode); 1997 if (!filler->AddXYZFile(argv[argptr])) { 1998 DoeLog(0) && (eLog()<< Verbose(0) << "Could not parse filler molecule from " << argv[argptr] << "." << endl); 1999 } 2000 filler->SetNameFromFilename(argv[argptr]); 2001 configuration.BG->ConstructBondGraph(filler); 2002 molecule *Filling = NULL; 2003 // call routine 2004 double distance[NDIM]; 2005 for (int i=0;i<NDIM;i++) 2006 distance[i] = atof(argv[argptr+i+1]); 2007 Filling = FillBoxWithMolecule(molecules, filler, configuration, MaxDistance, distance, atof(argv[argptr+4]), atof(argv[argptr+5]), atof(argv[argptr+6]), atoi(argv[argptr+7])); 2008 if (Filling != NULL) { 2009 Filling->ActiveFlag = false; 2010 molecules->insert(Filling); 2011 } 2012 delete(filler); 2013 argptr+=6; 2014 } 2015 break; 2016 case 'A': 2017 if (ExitFlag == 0) ExitFlag = 1; 2018 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 2019 ExitFlag =255; 2020 DoeLog(0) && (eLog()<< Verbose(0) << "Missing source file for bonds in molecule: -A <bond sourcefile>" << endl); 2021 performCriticalExit(); 2022 } else { 2023 DoLog(0) && (Log() << Verbose(0) << "Parsing bonds from " << argv[argptr] << "." << endl); 2024 ifstream *input = new ifstream(argv[argptr]); 2025 mol->CreateAdjacencyListFromDbondFile(input); 2026 input->close(); 2027 argptr+=1; 2028 } 2029 break; 2030 2031 case 'J': 2032 if (ExitFlag == 0) ExitFlag = 1; 2033 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 2034 ExitFlag =255; 2035 DoeLog(0) && (eLog()<< Verbose(0) << "Missing path of adjacency file: -j <path>" << endl); 2036 performCriticalExit(); 2037 } else { 2038 DoLog(0) && (Log() << Verbose(0) << "Storing adjacency to path " << argv[argptr] << "." << endl); 2039 configuration.BG->ConstructBondGraph(mol); 2040 mol->StoreAdjacencyToFile(NULL, argv[argptr]); 2041 argptr+=1; 2042 } 2043 break; 2044 2045 case 'j': 2046 if (ExitFlag == 0) ExitFlag = 1; 2047 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 2048 ExitFlag =255; 2049 DoeLog(0) && (eLog()<< Verbose(0) << "Missing path of bonds file: -j <path>" << endl); 2050 performCriticalExit(); 2051 } else { 2052 DoLog(0) && (Log() << Verbose(0) << "Storing bonds to path " << argv[argptr] << "." << endl); 2053 configuration.BG->ConstructBondGraph(mol); 2054 mol->StoreBondsToFile(NULL, argv[argptr]); 2055 argptr+=1; 2056 } 2057 break; 2058 2059 case 'N': 2060 if (ExitFlag == 0) ExitFlag = 1; 2061 if ((argptr+1 >= argc) || (argv[argptr+1][0] == '-')){ 2062 ExitFlag = 255; 2063 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for non-convex envelope: -o <radius> <tecplot output file>" << endl); 2064 performCriticalExit(); 2065 } else { 2066 class Tesselation *T = NULL; 1617 2067 const LinkedCell *LCList = NULL; 2068 molecule * Boundary = NULL; 2069 //string filename(argv[argptr+1]); 2070 //filename.append(".csv"); 2071 DoLog(0) && (Log() << Verbose(0) << "Evaluating non-convex envelope of biggest molecule."); 2072 DoLog(1) && (Log() << Verbose(1) << "Using rolling ball of radius " << atof(argv[argptr]) << " and storing tecplot data in " << argv[argptr+1] << "." << endl); 1618 2073 // find biggest molecule 1619 2074 int counter = 0; 1620 2075 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) { 2076 (*BigFinder)->CountAtoms(); 1621 2077 if ((Boundary == NULL) || (Boundary->AtomCount < (*BigFinder)->AtomCount)) { 1622 2078 Boundary = *BigFinder; … … 1624 2080 counter++; 1625 2081 } 1626 bool *Actives = Malloc<bool>(counter, "ParseCommandLineOptions() - case C -- *Actives"); 1627 counter = 0; 1628 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) { 1629 Actives[counter] = (*BigFinder)->ActiveFlag; 1630 (*BigFinder)->ActiveFlag = (*BigFinder == Boundary) ? false : true; 1631 } 1632 LCList = new LinkedCell(Boundary, 2.*radius); 1633 element *elemental = periode->FindElement((const int) atoi(argv[argptr])); 1634 FindNonConvexBorder(Boundary, TesselStruct, LCList, radius, NULL); 1635 int ranges[NDIM] = {1,1,1}; 1636 CorrelationToSurfaceMap *surfacemap = PeriodicCorrelationToSurface( molecules, elemental, TesselStruct, LCList, ranges ); 1637 BinPairMap *binmap = BinData( surfacemap, 0.5, 0., 0. ); 1638 OutputCorrelation ( &binoutput, binmap ); 1639 output.close(); 1640 binoutput.close(); 1641 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) 1642 (*BigFinder)->ActiveFlag = Actives[counter]; 1643 Free(&Actives); 1644 delete(LCList); 1645 delete(TesselStruct); 1646 argptr+=3; 1647 } 1648 break; 1649 case 'E': 1650 if (ExitFlag == 0) ExitFlag = 1; 1651 if ((argptr+1 >= argc) || (!IsValidNumber(argv[argptr])) || (argv[argptr+1][0] == '-')) { 1652 ExitFlag = 255; 1653 eLog() << Verbose(0) << "Not enough or invalid arguments given for changing element: -E <atom nr.> <element>" << endl; 1654 } else { 1655 SaveFlag = true; 1656 Log() << Verbose(1) << "Changing atom " << argv[argptr] << " to element " << argv[argptr+1] << "." << endl; 1657 first = mol->FindAtom(atoi(argv[argptr])); 1658 first->type = periode->FindElement(atoi(argv[argptr+1])); 1659 argptr+=2; 1660 } 1661 break; 1662 case 'F': 1663 if (ExitFlag == 0) ExitFlag = 1; 1664 if (argptr+5 >=argc) { 1665 ExitFlag = 255; 1666 eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> <randatom> <randmol> <DoRotate>" << endl; 1667 } else { 1668 SaveFlag = true; 1669 Log() << Verbose(1) << "Filling Box with water molecules." << endl; 1670 // construct water molecule 1671 molecule *filler = new molecule(periode);; 1672 molecule *Filling = NULL; 1673 atom *second = NULL, *third = NULL; 1674 first = new atom(); 1675 first->type = periode->FindElement(1); 1676 first->x.Init(0.441, -0.143, 0.); 1677 filler->AddAtom(first); 1678 second = new atom(); 1679 second->type = periode->FindElement(1); 1680 second->x.Init(-0.464, 1.137, 0.0); 1681 filler->AddAtom(second); 1682 third = new atom(); 1683 third->type = periode->FindElement(8); 1684 third->x.Init(-0.464, 0.177, 0.); 1685 filler->AddAtom(third); 1686 filler->AddBond(first, third, 1); 1687 filler->AddBond(second, third, 1); 1688 // call routine 1689 double distance[NDIM]; 1690 for (int i=0;i<NDIM;i++) 1691 distance[i] = atof(argv[argptr+i]); 1692 Filling = FillBoxWithMolecule(molecules, filler, configuration, distance, atof(argv[argptr+3]), atof(argv[argptr+4]), atoi(argv[argptr+5])); 1693 if (Filling != NULL) { 1694 molecules->insert(Filling); 1695 } 1696 delete(filler); 1697 argptr+=6; 1698 } 1699 break; 1700 case 'A': 1701 if (ExitFlag == 0) ExitFlag = 1; 1702 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 1703 ExitFlag =255; 1704 eLog() << Verbose(0) << "Missing source file for bonds in molecule: -A <bond sourcefile>" << endl; 1705 } else { 1706 Log() << Verbose(0) << "Parsing bonds from " << argv[argptr] << "." << endl; 1707 ifstream *input = new ifstream(argv[argptr]); 1708 mol->CreateAdjacencyListFromDbondFile(input); 1709 input->close(); 1710 argptr+=1; 1711 } 1712 break; 1713 case 'N': 1714 if (ExitFlag == 0) ExitFlag = 1; 1715 if ((argptr+1 >= argc) || (argv[argptr+1][0] == '-')){ 1716 ExitFlag = 255; 1717 eLog() << Verbose(0) << "Not enough or invalid arguments given for non-convex envelope: -o <radius> <tecplot output file>" << endl; 1718 } else { 1719 class Tesselation *T = NULL; 1720 const LinkedCell *LCList = NULL; 1721 string filename(argv[argptr+1]); 1722 filename.append(".csv"); 1723 Log() << Verbose(0) << "Evaluating non-convex envelope."; 1724 Log() << Verbose(1) << "Using rolling ball of radius " << atof(argv[argptr]) << " and storing tecplot data in " << argv[argptr+1] << "." << endl; 2082 DoLog(1) && (Log() << Verbose(1) << "Biggest molecule has " << Boundary->AtomCount << " atoms." << endl); 1725 2083 start = clock(); 1726 LCList = new LinkedCell(mol, atof(argv[argptr])*2.); 1727 FindNonConvexBorder(mol, T, LCList, atof(argv[argptr]), argv[argptr+1]); 2084 LCList = new LinkedCell(Boundary, atof(argv[argptr])*2.); 2085 if (!FindNonConvexBorder(Boundary, T, LCList, atof(argv[argptr]), argv[argptr+1])) 2086 ExitFlag = 255; 1728 2087 //FindDistributionOfEllipsoids(T, &LCList, N, number, filename.c_str()); 1729 2088 end = clock(); 1730 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl;2089 DoLog(0) && (Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl); 1731 2090 delete(LCList); 2091 delete(T); 1732 2092 argptr+=2; 1733 2093 } … … 1737 2097 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 1738 2098 ExitFlag = 255; 1739 eLog() << Verbose(0) << "Not enough or invalid arguments given for storing tempature: -S <temperature file>" << endl; 2099 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for storing tempature: -S <temperature file>" << endl); 2100 performCriticalExit(); 1740 2101 } else { 1741 Log() << Verbose(1) << "Storing temperatures in " << argv[argptr] << "." << endl;2102 DoLog(1) && (Log() << Verbose(1) << "Storing temperatures in " << argv[argptr] << "." << endl); 1742 2103 ofstream *output = new ofstream(argv[argptr], ios::trunc); 1743 2104 if (!mol->OutputTemperatureFromTrajectories(output, 0, mol->MDSteps)) 1744 Log() << Verbose(2) << "File could not be written." << endl;2105 DoLog(2) && (Log() << Verbose(2) << "File could not be written." << endl); 1745 2106 else 1746 Log() << Verbose(2) << "File stored." << endl;2107 DoLog(2) && (Log() << Verbose(2) << "File stored." << endl); 1747 2108 output->close(); 1748 2109 delete(output); … … 1754 2115 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 1755 2116 ExitFlag = 255; 1756 eLog() << Verbose(0) << "Not enough or invalid arguments given for storing tempature: -L <step0> <step1> <prefix> <identity mapping?>" << endl; 2117 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for storing tempature: -L <step0> <step1> <prefix> <identity mapping?>" << endl); 2118 performCriticalExit(); 1757 2119 } else { 1758 2120 SaveFlag = true; 1759 Log() << Verbose(1) << "Linear interpolation between configuration " << argv[argptr] << " and " << argv[argptr+1] << "." << endl;2121 DoLog(1) && (Log() << Verbose(1) << "Linear interpolation between configuration " << argv[argptr] << " and " << argv[argptr+1] << "." << endl); 1760 2122 if (atoi(argv[argptr+3]) == 1) 1761 Log() << Verbose(1) << "Using Identity for the permutation map." << endl;2123 DoLog(1) && (Log() << Verbose(1) << "Using Identity for the permutation map." << endl); 1762 2124 if (!mol->LinearInterpolationBetweenConfiguration(atoi(argv[argptr]), atoi(argv[argptr+1]), argv[argptr+2], configuration, atoi(argv[argptr+3])) == 1 ? true : false) 1763 Log() << Verbose(2) << "Could not store " << argv[argptr+2] << " files." << endl;2125 DoLog(2) && (Log() << Verbose(2) << "Could not store " << argv[argptr+2] << " files." << endl); 1764 2126 else 1765 Log() << Verbose(2) << "Steps created and " << argv[argptr+2] << " files stored." << endl;2127 DoLog(2) && (Log() << Verbose(2) << "Steps created and " << argv[argptr+2] << " files stored." << endl); 1766 2128 argptr+=4; 1767 2129 } … … 1771 2133 if ((argptr >= argc) || (argv[argptr][0] == '-')) { 1772 2134 ExitFlag = 255; 1773 eLog() << Verbose(0) << "Not enough or invalid arguments given for parsing and integrating forces: -P <forces file>" << endl; 2135 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for parsing and integrating forces: -P <forces file>" << endl); 2136 performCriticalExit(); 1774 2137 } else { 1775 2138 SaveFlag = true; 1776 Log() << Verbose(1) << "Parsing forces file and Verlet integrating." << endl;2139 DoLog(1) && (Log() << Verbose(1) << "Parsing forces file and Verlet integrating." << endl); 1777 2140 if (!mol->VerletForceIntegration(argv[argptr], configuration)) 1778 Log() << Verbose(2) << "File not found." << endl;2141 DoLog(2) && (Log() << Verbose(2) << "File not found." << endl); 1779 2142 else 1780 Log() << Verbose(2) << "File found and parsed." << endl;2143 DoLog(2) && (Log() << Verbose(2) << "File found and parsed." << endl); 1781 2144 argptr+=1; 1782 2145 } … … 1786 2149 if ((argptr+1 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1]))) { 1787 2150 ExitFlag = 255; 1788 eLog() << Verbose(0) << "Not enough or invalid arguments given for removing atoms: -R <id> <distance>" << endl; 2151 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for removing atoms: -R <id> <distance>" << endl); 2152 performCriticalExit(); 1789 2153 } else { 1790 2154 SaveFlag = true; 1791 Log() << Verbose(1) << "Removing atoms around " << argv[argptr] << " with radius " << argv[argptr+1] << "." << endl;2155 DoLog(1) && (Log() << Verbose(1) << "Removing atoms around " << argv[argptr] << " with radius " << argv[argptr+1] << "." << endl); 1792 2156 double tmp1 = atof(argv[argptr+1]); 1793 2157 atom *third = mol->FindAtom(atoi(argv[argptr])); … … 1802 2166 } 1803 2167 } else { 1804 eLog() << Verbose(0) << "Removal failed due to missing atoms on molecule or wrong id." << endl;2168 DoeLog(1) && (eLog()<< Verbose(1) << "Removal failed due to missing atoms on molecule or wrong id." << endl); 1805 2169 } 1806 2170 argptr+=2; … … 1811 2175 if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) { 1812 2176 ExitFlag = 255; 1813 eLog() << Verbose(0) << "Not enough or invalid arguments given for translation: -t <x> <y> <z>" << endl; 2177 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for translation: -t <x> <y> <z>" << endl); 2178 performCriticalExit(); 1814 2179 } else { 1815 2180 if (ExitFlag == 0) ExitFlag = 1; 1816 2181 SaveFlag = true; 1817 Log() << Verbose(1) << "Translating all ions by given vector." << endl;2182 DoLog(1) && (Log() << Verbose(1) << "Translating all ions by given vector." << endl); 1818 2183 for (int i=NDIM;i--;) 1819 2184 x.x[i] = atof(argv[argptr+i]); … … 1826 2191 if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) { 1827 2192 ExitFlag = 255; 1828 eLog() << Verbose(0) << "Not enough or invalid arguments given for periodic translation: -T <x> <y> <z>" << endl; 2193 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for periodic translation: -T <x> <y> <z>" << endl); 2194 performCriticalExit(); 1829 2195 } else { 1830 2196 if (ExitFlag == 0) ExitFlag = 1; 1831 2197 SaveFlag = true; 1832 Log() << Verbose(1) << "Translating all ions periodically by given vector." << endl;2198 DoLog(1) && (Log() << Verbose(1) << "Translating all ions periodically by given vector." << endl); 1833 2199 for (int i=NDIM;i--;) 1834 2200 x.x[i] = atof(argv[argptr+i]); … … 1841 2207 if ((argptr >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) { 1842 2208 ExitFlag = 255; 1843 eLog() << Verbose(0) << "Not enough or invalid arguments given for scaling: -s <factor_x> [factor_y] [factor_z]" << endl; 2209 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for scaling: -s <factor_x> [factor_y] [factor_z]" << endl); 2210 performCriticalExit(); 1844 2211 } else { 1845 2212 SaveFlag = true; 1846 2213 j = -1; 1847 Log() << Verbose(1) << "Scaling all ion positions by factor." << endl;2214 DoLog(1) && (Log() << Verbose(1) << "Scaling all ion positions by factor." << endl); 1848 2215 factor = new double[NDIM]; 1849 2216 factor[0] = atof(argv[argptr]); … … 1851 2218 factor[2] = atof(argv[argptr+2]); 1852 2219 mol->Scale((const double ** const)&factor); 2220 double * const cell_size = World::get()->cell_size; 1853 2221 for (int i=0;i<NDIM;i++) { 1854 2222 j += i+1; 1855 2223 x.x[i] = atof(argv[NDIM+i]); 1856 mol->cell_size[j]*=factor[i];2224 cell_size[j]*=factor[i]; 1857 2225 } 1858 2226 delete[](factor); … … 1864 2232 if ((argptr+5 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) ) { 1865 2233 ExitFlag = 255; 1866 eLog() << Verbose(0) << "Not enough or invalid arguments given for centering in box: -b <xx> <xy> <xz> <yy> <yz> <zz>" << endl; 2234 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for centering in box: -b <xx> <xy> <xz> <yy> <yz> <zz>" << endl); 2235 performCriticalExit(); 1867 2236 } else { 1868 2237 SaveFlag = true; 1869 2238 j = -1; 1870 Log() << Verbose(1) << "Centering atoms in config file within given simulation box." << endl; 2239 DoLog(1) && (Log() << Verbose(1) << "Centering atoms in config file within given simulation box." << endl); 2240 double * const cell_size = World::get()->cell_size; 1871 2241 for (int i=0;i<6;i++) { 1872 mol->cell_size[i] = atof(argv[argptr+i]);2242 cell_size[i] = atof(argv[argptr+i]); 1873 2243 } 1874 2244 // center … … 1881 2251 if ((argptr+5 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) ) { 1882 2252 ExitFlag = 255; 1883 eLog() << Verbose(0) << "Not enough or invalid arguments given for bounding in box: -B <xx> <xy> <xz> <yy> <yz> <zz>" << endl; 2253 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for bounding in box: -B <xx> <xy> <xz> <yy> <yz> <zz>" << endl); 2254 performCriticalExit(); 1884 2255 } else { 1885 2256 SaveFlag = true; 1886 2257 j = -1; 1887 Log() << Verbose(1) << "Centering atoms in config file within given simulation box." << endl; 2258 DoLog(1) && (Log() << Verbose(1) << "Centering atoms in config file within given simulation box." << endl); 2259 double * const cell_size = World::get()->cell_size; 1888 2260 for (int i=0;i<6;i++) { 1889 mol->cell_size[i] = atof(argv[argptr+i]);2261 cell_size[i] = atof(argv[argptr+i]); 1890 2262 } 1891 2263 // center … … 1898 2270 if ((argptr+2 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) { 1899 2271 ExitFlag = 255; 1900 eLog() << Verbose(0) << "Not enough or invalid arguments given for centering with boundary: -c <boundary_x> <boundary_y> <boundary_z>" << endl; 2272 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for centering with boundary: -c <boundary_x> <boundary_y> <boundary_z>" << endl); 2273 performCriticalExit(); 1901 2274 } else { 1902 2275 SaveFlag = true; 1903 2276 j = -1; 1904 Log() << Verbose(1) << "Centering atoms in config file within given additional boundary." << endl;2277 DoLog(1) && (Log() << Verbose(1) << "Centering atoms in config file within given additional boundary." << endl); 1905 2278 // make every coordinate positive 1906 2279 mol->CenterEdge(&x); … … 1908 2281 mol->SetBoxDimension(&x); 1909 2282 // translate each coordinate by boundary 2283 double * const cell_size = World::get()->cell_size; 1910 2284 j=-1; 1911 2285 for (int i=0;i<NDIM;i++) { 1912 2286 j += i+1; 1913 2287 x.x[i] = atof(argv[argptr+i]); 1914 mol->cell_size[j] += x.x[i]*2.;2288 cell_size[j] += x.x[i]*2.; 1915 2289 } 1916 2290 mol->Translate((const Vector *)&x); … … 1921 2295 if (ExitFlag == 0) ExitFlag = 1; 1922 2296 SaveFlag = true; 1923 Log() << Verbose(1) << "Centering atoms on edge and setting box dimensions." << endl;2297 DoLog(1) && (Log() << Verbose(1) << "Centering atoms on edge and setting box dimensions." << endl); 1924 2298 x.Zero(); 1925 2299 mol->CenterEdge(&x); … … 1931 2305 if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr]))) { 1932 2306 ExitFlag = 255; 1933 eLog() << Verbose(0) << "Not enough or invalid arguments given for removing atoms: -r <id>" << endl; 2307 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for removing atoms: -r <id>" << endl); 2308 performCriticalExit(); 1934 2309 } else { 1935 2310 SaveFlag = true; 1936 Log() << Verbose(1) << "Removing atom " << argv[argptr] << "." << endl;2311 DoLog(1) && (Log() << Verbose(1) << "Removing atom " << argv[argptr] << "." << endl); 1937 2312 atom *first = mol->FindAtom(atoi(argv[argptr])); 1938 2313 mol->RemoveAtom(first); … … 1944 2319 if ((argptr+1 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1]))) { 1945 2320 ExitFlag = 255; 1946 eLog() << Verbose(0) << "Not enough or invalid arguments for fragmentation: -f <max. bond distance> <bond order>" << endl; 2321 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for fragmentation: -f <max. bond distance> <bond order>" << endl); 2322 performCriticalExit(); 1947 2323 } else { 1948 Log() << Verbose(0) << "Fragmenting molecule with bond distance " << argv[argptr] << " angstroem, order of " << argv[argptr+1] << "." << endl;1949 Log() << Verbose(0) << "Creating connection matrix..." << endl;2324 DoLog(0) && (Log() << Verbose(0) << "Fragmenting molecule with bond distance " << argv[argptr] << " angstroem, order of " << argv[argptr+1] << "." << endl); 2325 DoLog(0) && (Log() << Verbose(0) << "Creating connection matrix..." << endl); 1950 2326 start = clock(); 1951 2327 mol->CreateAdjacencyList(atof(argv[argptr++]), configuration.GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL); 1952 Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl;2328 DoLog(0) && (Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl); 1953 2329 if (mol->first->next != mol->last) { 1954 2330 ExitFlag = mol->FragmentMolecule(atoi(argv[argptr]), &configuration); 1955 2331 } 1956 2332 end = clock(); 1957 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl;2333 DoLog(0) && (Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl); 1958 2334 argptr+=2; 1959 2335 } … … 1963 2339 j = atoi(argv[argptr++]); 1964 2340 if ((j<0) || (j>1)) { 1965 eLog() << Verbose(1) << "ERROR: Argument of '-m' should be either 0 for no-rotate or 1 for rotate." << endl;2341 DoeLog(1) && (eLog()<< Verbose(1) << "Argument of '-m' should be either 0 for no-rotate or 1 for rotate." << endl); 1966 2342 j = 0; 1967 2343 } 1968 2344 if (j) { 1969 2345 SaveFlag = true; 1970 Log() << Verbose(0) << "Converting to prinicipal axis system." << endl;2346 DoLog(0) && (Log() << Verbose(0) << "Converting to prinicipal axis system." << endl); 1971 2347 } else 1972 Log() << Verbose(0) << "Evaluating prinicipal axis." << endl;2348 DoLog(0) && (Log() << Verbose(0) << "Evaluating prinicipal axis." << endl); 1973 2349 mol->PrincipalAxisSystem((bool)j); 1974 2350 break; … … 1977 2353 if ((argptr+1 >= argc) || (argv[argptr][0] == '-')){ 1978 2354 ExitFlag = 255; 1979 eLog() << Verbose(0) << "Not enough or invalid arguments given for convex envelope: -o <convex output file> <non-convex output file>" << endl; 2355 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for convex envelope: -o <convex output file> <non-convex output file>" << endl); 2356 performCriticalExit(); 1980 2357 } else { 1981 2358 class Tesselation *TesselStruct = NULL; 1982 2359 const LinkedCell *LCList = NULL; 1983 Log() << Verbose(0) << "Evaluating volume of the convex envelope.";1984 Log() << Verbose(1) << "Storing tecplot convex data in " << argv[argptr] << "." << endl;1985 Log() << Verbose(1) << "Storing tecplot non-convex data in " << argv[argptr+1] << "." << endl;2360 DoLog(0) && (Log() << Verbose(0) << "Evaluating volume of the convex envelope."); 2361 DoLog(1) && (Log() << Verbose(1) << "Storing tecplot convex data in " << argv[argptr] << "." << endl); 2362 DoLog(1) && (Log() << Verbose(1) << "Storing tecplot non-convex data in " << argv[argptr+1] << "." << endl); 1986 2363 LCList = new LinkedCell(mol, 10.); 1987 2364 //FindConvexBorder(mol, LCList, argv[argptr]); … … 1990 2367 double volumedifference = ConvexizeNonconvexEnvelope(TesselStruct, mol, argv[argptr]); 1991 2368 double clustervolume = VolumeOfConvexEnvelope(TesselStruct, &configuration); 1992 Log() << Verbose(0) << "The tesselated volume area is " << clustervolume << " " << (configuration.GetIsAngstroem() ? "angstrom" : "atomiclength") << "^3." << endl;1993 Log() << Verbose(0) << "The non-convex tesselated volume area is " << clustervolume-volumedifference << " " << (configuration.GetIsAngstroem() ? "angstrom" : "atomiclength") << "^3." << endl;2369 DoLog(0) && (Log() << Verbose(0) << "The tesselated volume area is " << clustervolume << " " << (configuration.GetIsAngstroem() ? "angstrom" : "atomiclength") << "^3." << endl); 2370 DoLog(0) && (Log() << Verbose(0) << "The non-convex tesselated volume area is " << clustervolume-volumedifference << " " << (configuration.GetIsAngstroem() ? "angstrom" : "atomiclength") << "^3." << endl); 1994 2371 delete(TesselStruct); 1995 2372 delete(LCList); … … 2001 2378 if ((argptr+1 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) ) { 2002 2379 ExitFlag = 255; 2003 eLog() << Verbose(0) << "Not enough or invalid arguments given for suspension with specified volume: -U <volume> <density>" << endl;2004 volume = -1; // for case 'u': don't print error again2380 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for suspension with specified volume: -U <volume> <density>" << endl); 2381 performCriticalExit(); 2005 2382 } else { 2006 2383 volume = atof(argv[argptr++]); 2007 Log() << Verbose(0) << "Using " << volume << " angstrom^3 as the volume instead of convex envelope one's." << endl;2384 DoLog(0) && (Log() << Verbose(0) << "Using " << volume << " angstrom^3 as the volume instead of convex envelope one's." << endl); 2008 2385 } 2009 2386 case 'u': … … 2012 2389 if (volume != -1) 2013 2390 ExitFlag = 255; 2014 eLog() << Verbose(0) << "Not enough arguments given for suspension: -u <density>" << endl; 2391 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for suspension: -u <density>" << endl); 2392 performCriticalExit(); 2015 2393 } else { 2016 2394 double density; 2017 2395 SaveFlag = true; 2018 Log() << Verbose(0) << "Evaluating necessary cell volume for a cluster suspended in water.";2396 DoLog(0) && (Log() << Verbose(0) << "Evaluating necessary cell volume for a cluster suspended in water."); 2019 2397 density = atof(argv[argptr++]); 2020 2398 if (density < 1.0) { 2021 eLog() << Verbose(0) << "Density must be greater than 1.0g/cm^3 !" << endl;2399 DoeLog(1) && (eLog()<< Verbose(1) << "Density must be greater than 1.0g/cm^3 !" << endl); 2022 2400 density = 1.3; 2023 2401 } … … 2025 2403 // repetition[i] = atoi(argv[argptr++]); 2026 2404 // if (repetition[i] < 1) 2027 // eLog() << Verbose(0) << "ERROR: repetition value must be greater 1!" << endl;2405 // DoeLog(1) && (eLog()<< Verbose(1) << "repetition value must be greater 1!" << endl); 2028 2406 // repetition[i] = 1; 2029 2407 // } … … 2035 2413 if ((argptr+2 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) { 2036 2414 ExitFlag = 255; 2037 eLog() << Verbose(0) << "Not enough or invalid arguments given for repeating cells: -d <repeat_x> <repeat_y> <repeat_z>" << endl; 2415 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for repeating cells: -d <repeat_x> <repeat_y> <repeat_z>" << endl); 2416 performCriticalExit(); 2038 2417 } else { 2039 2418 SaveFlag = true; 2419 double * const cell_size = World::get()->cell_size; 2040 2420 for (int axis = 1; axis <= NDIM; axis++) { 2041 2421 int faktor = atoi(argv[argptr++]); … … 2044 2424 Vector ** vectors; 2045 2425 if (faktor < 1) { 2046 eLog() << Verbose(0) << "ERROR: Repetition faktor mus be greater than 1!" << endl;2426 DoeLog(1) && (eLog()<< Verbose(1) << "Repetition factor mus be greater than 1!" << endl); 2047 2427 faktor = 1; 2048 2428 } … … 2061 2441 } 2062 2442 if (count != j) 2063 Log() << Verbose(0) << "ERROR: AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl;2443 DoeLog(1) && (eLog()<< Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl); 2064 2444 x.Zero(); 2065 2445 y.Zero(); 2066 y.x[abs(axis)-1] = mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] * abs(axis)/axis; // last term is for sign, first is for magnitude2446 y.x[abs(axis)-1] = cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] * abs(axis)/axis; // last term is for sign, first is for magnitude 2067 2447 for (int i=1;i<faktor;i++) { // then add this list with respective translation factor times 2068 2448 x.AddVector(&y); // per factor one cell width further … … 2085 2465 mol->Translate(&x); 2086 2466 } 2087 mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor;2467 cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor; 2088 2468 } 2089 2469 } … … 2102 2482 } else { // no arguments, hence scan the elements db 2103 2483 if (periode->LoadPeriodentafel(configuration.databasepath)) 2104 Log() << Verbose(0) << "Element list loaded successfully." << endl;2484 DoLog(0) && (Log() << Verbose(0) << "Element list loaded successfully." << endl); 2105 2485 else 2106 Log() << Verbose(0) << "Element list loading failed." << endl;2486 DoLog(0) && (Log() << Verbose(0) << "Element list loading failed." << endl); 2107 2487 configuration.RetrieveConfigPathAndName("main_pcp_linux"); 2108 2488 } … … 2126 2506 int j; 2127 2507 2128 setVerbosity(2); 2508 cout << ESPACKVersion << endl; 2509 2510 DoLog(1) && (Log() << Verbose(1) << "test" << endl); 2511 DoLog(3) && (Log() << Verbose(1) << "test"); 2512 2513 setVerbosity(0); 2129 2514 2130 2515 // =========================== PARSE COMMAND LINE OPTIONS ==================================== … … 2142 2527 << MemoryUsageObserver::getInstance()->getUsedMemorySize() << endl; 2143 2528 MemoryUsageObserver::getInstance()->purgeInstance(); 2529 logger::purgeInstance(); 2530 errorLogger::purgeInstance(); 2144 2531 return (j == 1 ? 0 : j); 2145 2532 default: … … 2150 2537 if (molecules->ListOfMolecules.size() == 0) { 2151 2538 mol = new molecule(periode); 2152 if (mol->cell_size[0] == 0.) { 2153 Log() << Verbose(0) << "enter lower tridiagonal form of basis matrix" << endl << endl; 2539 double * const cell_size = World::get()->cell_size; 2540 if (cell_size[0] == 0.) { 2541 DoLog(0) && (Log() << Verbose(0) << "enter lower tridiagonal form of basis matrix" << endl << endl); 2154 2542 for (int i=0;i<6;i++) { 2155 Log() << Verbose(1) << "Cell size" << i << ": ";2156 cin >> mol->cell_size[i];2543 DoLog(1) && (Log() << Verbose(1) << "Cell size" << i << ": "); 2544 cin >> cell_size[i]; 2157 2545 } 2158 2546 } … … 2164 2552 2165 2553 // now the main construction loop 2166 Log() << Verbose(0) << endl << "Now comes the real construction..." << endl;2554 DoLog(0) && (Log() << Verbose(0) << endl << "Now comes the real construction..." << endl); 2167 2555 do { 2168 Log() << Verbose(0) << endl << endl;2169 Log() << Verbose(0) << "============Molecule list=======================" << endl;2556 DoLog(0) && (Log() << Verbose(0) << endl << endl); 2557 DoLog(0) && (Log() << Verbose(0) << "============Molecule list=======================" << endl); 2170 2558 molecules->Enumerate((ofstream *)&cout); 2171 Log() << Verbose(0) << "============Menu===============================" << endl;2172 Log() << Verbose(0) << "a - set molecule (in)active" << endl;2173 Log() << Verbose(0) << "e - edit molecules (load, parse, save)" << endl;2174 Log() << Verbose(0) << "g - globally manipulate atoms in molecule" << endl;2175 Log() << Verbose(0) << "M - Merge molecules" << endl;2176 Log() << Verbose(0) << "m - manipulate atoms" << endl;2177 Log() << Verbose(0) << "-----------------------------------------------" << endl;2178 Log() << Verbose(0) << "c - edit the current configuration" << endl;2179 Log() << Verbose(0) << "-----------------------------------------------" << endl;2180 Log() << Verbose(0) << "s - save current setup to config file" << endl;2181 Log() << Verbose(0) << "T - call the current test routine" << endl;2182 Log() << Verbose(0) << "q - quit" << endl;2183 Log() << Verbose(0) << "===============================================" << endl;2184 Log() << Verbose(0) << "Input: ";2559 DoLog(0) && (Log() << Verbose(0) << "============Menu===============================" << endl); 2560 DoLog(0) && (Log() << Verbose(0) << "a - set molecule (in)active" << endl); 2561 DoLog(0) && (Log() << Verbose(0) << "e - edit molecules (load, parse, save)" << endl); 2562 DoLog(0) && (Log() << Verbose(0) << "g - globally manipulate atoms in molecule" << endl); 2563 DoLog(0) && (Log() << Verbose(0) << "M - Merge molecules" << endl); 2564 DoLog(0) && (Log() << Verbose(0) << "m - manipulate atoms" << endl); 2565 DoLog(0) && (Log() << Verbose(0) << "-----------------------------------------------" << endl); 2566 DoLog(0) && (Log() << Verbose(0) << "c - edit the current configuration" << endl); 2567 DoLog(0) && (Log() << Verbose(0) << "-----------------------------------------------" << endl); 2568 DoLog(0) && (Log() << Verbose(0) << "s - save current setup to config file" << endl); 2569 DoLog(0) && (Log() << Verbose(0) << "T - call the current test routine" << endl); 2570 DoLog(0) && (Log() << Verbose(0) << "q - quit" << endl); 2571 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl); 2572 DoLog(0) && (Log() << Verbose(0) << "Input: "); 2185 2573 cin >> choice; 2186 2574 … … 2188 2576 case 'a': // (in)activate molecule 2189 2577 { 2190 Log() << Verbose(0) << "Enter index of molecule: ";2578 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: "); 2191 2579 cin >> j; 2192 2580 for(MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) … … 2234 2622 // save element data base 2235 2623 if (periode->StorePeriodentafel(configuration->databasepath)) //ElementsFileName 2236 Log() << Verbose(0) << "Saving of elements.db successful." << endl;2624 DoLog(0) && (Log() << Verbose(0) << "Saving of elements.db successful." << endl); 2237 2625 else 2238 Log() << Verbose(0) << "Saving of elements.db failed." << endl;2626 DoLog(0) && (Log() << Verbose(0) << "Saving of elements.db failed." << endl); 2239 2627 2240 2628 delete(molecules); // also free's all molecules contained … … 2247 2635 << MemoryUsageObserver::getInstance()->getUsedMemorySize() << endl; 2248 2636 MemoryUsageObserver::purgeInstance(); 2637 logger::purgeInstance(); 2638 errorLogger::purgeInstance(); 2249 2639 2250 2640 return (0);
Note:
See TracChangeset
for help on using the changeset viewer.