Changeset a98603 for src/builder.cpp
- Timestamp:
- Feb 9, 2009, 2:18:13 PM (16 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 5bc4d0
- Parents:
- 674220 (diff), cc2ee5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/builder.cpp
-
Property mode
changed from
100644
to100755
r674220 ra98603 1 1 /** \file builder.cpp 2 * 2 * 3 3 * By stating absolute positions or binding angles and distances atomic positions of a molecule can be constructed. 4 4 * The output is the complete configuration file for PCP for direct use. … … 6 6 * -# Atomic data is retrieved from a file, if not found requested and stored there for later re-use 7 7 * -# step-by-step construction of the molecule beginning either at a centre of with a certain atom 8 * 8 * 9 9 */ 10 10 11 11 /*! \mainpage Molecuilder - a molecular set builder 12 * 12 * 13 13 * This introductory shall briefly make aquainted with the program, helping in installing and a first run. 14 * 14 * 15 15 * \section about About the Program 16 * 16 * 17 17 * Molecuilder is a short program, written in C++, that enables the construction of a coordinate set for the 18 18 * atoms making up an molecule by the successive statement of binding angles and distances and referencing to 19 19 * already constructed atoms. 20 * 20 * 21 21 * A configuration file may be written that is compatible to the format used by PCP - a parallel Car-Parrinello 22 22 * molecular dynamics implementation. 23 * 23 * 24 24 * \section install Installation 25 * 25 * 26 26 * Installation should without problems succeed as follows: 27 27 * -# ./configure (or: mkdir build;mkdir run;cd build; ../configure --bindir=../run) 28 28 * -# make 29 29 * -# make install 30 * 30 * 31 31 * Further useful commands are 32 32 * -# make clean uninstall: deletes .o-files and removes executable from the given binary directory\n 33 * -# make doxygen-doc: Creates these html pages out of the documented source 34 * 33 * -# make doxygen-doc: Creates these html pages out of the documented source 34 * 35 35 * \section run Running 36 * 36 * 37 37 * The program can be executed by running: ./molecuilder 38 * 38 * 39 39 * Note, that it uses a database, called "elements.db", in the executable's directory. If the file is not found, 40 40 * it is created and any given data on elements of the periodic table will be stored therein and re-used on 41 * later re-execution. 42 * 41 * later re-execution. 42 * 43 43 * \section ref References 44 * 44 * 45 45 * For the special configuration file format, see the documentation of pcp. 46 * 46 * 47 47 */ 48 48 … … 80 80 cout << Verbose(0) << "INPUT: "; 81 81 cin >> choice; 82 82 83 83 switch (choice) { 84 84 case 'a': // absolute coordinates of atom … … 89 89 mol->AddAtom(first); // add to molecule 90 90 break; 91 91 92 92 case 'b': // relative coordinates of atom wrt to reference point 93 93 first = new atom; … … 105 105 mol->AddAtom(first); // add to molecule 106 106 break; 107 107 108 108 case 'c': // relative coordinates of atom wrt to already placed atom 109 109 first = new atom; … … 111 111 do { 112 112 if (!valid) cout << Verbose(0) << "Resulting position out of cell." << endl; 113 second = mol->AskAtom("Enter atom number: "); 113 second = mol->AskAtom("Enter atom number: "); 114 114 cout << Verbose(0) << "Enter relative coordinates." << endl; 115 115 first->x.AskPosition(mol->cell_size, false); … … 121 121 mol->AddAtom(first); // add to molecule 122 122 break; 123 123 124 124 case 'd': // two atoms, two angles and a distance 125 125 first = new atom; … … 152 152 x.Copyvector(&fourth->x); 153 153 x.SubtractVector(&third->x); 154 154 155 155 if (!z.SolveSystem(&x,&y,&n, b, c, a)) { 156 156 cout << Verbose(0) << "Failure solving self-dependent linear system!" << endl; … … 167 167 cout << "x: ", 168 168 x.Output((ofstream *)&cout); 169 cout << endl; 169 cout << endl; 170 170 z.MakeNormalVector(&second->x,&third->x,&fourth->x); 171 171 cout << "z: ", 172 172 z.Output((ofstream *)&cout); 173 cout << endl; 173 cout << endl; 174 174 y.MakeNormalVector(&x,&z); 175 175 cout << "y: ", 176 176 y.Output((ofstream *)&cout); 177 cout << endl; 178 177 cout << endl; 178 179 179 // rotate vector around first angle 180 180 first->x.CopyVector(&x); … … 182 182 cout << "Rotated vector: ", 183 183 first->x.Output((ofstream *)&cout); 184 cout << endl; 184 cout << endl; 185 185 // remove the projection onto the rotation plane of the second angle 186 186 n.CopyVector(&y); … … 188 188 cout << "N1: ", 189 189 n.Output((ofstream *)&cout); 190 cout << endl; 190 cout << endl; 191 191 first->x.SubtractVector(&n); 192 192 cout << "Subtracted vector: ", 193 193 first->x.Output((ofstream *)&cout); 194 cout << endl; 194 cout << endl; 195 195 n.CopyVector(&z); 196 196 n.Scale(first->x.Projection(&z)); 197 197 cout << "N2: ", 198 198 n.Output((ofstream *)&cout); 199 cout << endl; 199 cout << endl; 200 200 first->x.SubtractVector(&n); 201 201 cout << "2nd subtracted vector: ", 202 202 first->x.Output((ofstream *)&cout); 203 cout << endl; 204 203 cout << endl; 204 205 205 // rotate another vector around second angle 206 206 n.CopyVector(&y); … … 208 208 cout << "2nd Rotated vector: ", 209 209 n.Output((ofstream *)&cout); 210 cout << endl; 211 210 cout << endl; 211 212 212 // add the two linear independent vectors 213 213 first->x.AddVector(&n); 214 first->x.Normalize(); 214 first->x.Normalize(); 215 215 first->x.Scale(a); 216 216 first->x.AddVector(&second->x); 217 217 218 218 cout << Verbose(0) << "resulting coordinates: "; 219 219 first->x.Output((ofstream *)&cout); … … 241 241 } while ((j != -1) && (i<128)); 242 242 if (i >= 2) { 243 first->x.LSQdistance(atoms, i); 243 first->x.LSQdistance(atoms, i); 244 244 245 245 first->x.Output((ofstream *)&cout); … … 259 259 static void CenterAtoms(molecule *mol) 260 260 { 261 Vector x, y ;261 Vector x, y, helper; 262 262 char choice; // menu choice char 263 263 264 264 cout << Verbose(0) << "===========CENTER ATOMS=========================" << endl; 265 265 cout << Verbose(0) << " a - on origin" << endl; … … 271 271 cout << Verbose(0) << "INPUT: "; 272 272 cin >> choice; 273 273 274 274 switch (choice) { 275 275 default: … … 292 292 mol->CenterEdge((ofstream *)&cout, &x); // make every coordinate positive 293 293 mol->Translate(&y); // translate by boundary 294 mol->SetBoxDimension(&(x+y*2)); // update Box of atoms by boundary 294 helper.CopyVector(&y); 295 helper.Scale(2.); 296 helper.AddVector(&x); 297 mol->SetBoxDimension(&helper); // update Box of atoms by boundary 295 298 break; 296 299 case 'd': … … 327 330 cout << Verbose(0) << "INPUT: "; 328 331 cin >> choice; 329 332 330 333 switch (choice) { 331 334 default: … … 346 349 second = mol->AskAtom("Enter second atom: "); 347 350 348 n.CopyVector((const Vector *)&first->x); 349 n.SubtractVector((const Vector *)&second->x); 351 n.CopyVector((const Vector *)&first->x); 352 n.SubtractVector((const Vector *)&second->x); 350 353 n.Normalize(); 351 break; 354 break; 352 355 case 'd': 353 356 char shorthand[4]; … … 363 366 x.x[i] = gsl_vector_get(param.x,i); 364 367 n.x[i] = gsl_vector_get(param.x,i+NDIM); 365 } 368 } 366 369 gsl_vector_free(param.x); 367 370 cout << Verbose(0) << "Offset vector: "; … … 369 372 cout << Verbose(0) << endl; 370 373 n.Normalize(); 371 break; 374 break; 372 375 }; 373 376 cout << Verbose(0) << "Alignment vector: "; … … 385 388 Vector n; 386 389 char choice; // menu choice char 387 390 388 391 cout << Verbose(0) << "===========MIRROR ATOMS=========================" << endl; 389 392 cout << Verbose(0) << " a - state three atoms defining mirror plane" << endl; … … 394 397 cout << Verbose(0) << "INPUT: "; 395 398 cin >> choice; 396 399 397 400 switch (choice) { 398 401 default: … … 413 416 second = mol->AskAtom("Enter second atom: "); 414 417 415 n.CopyVector((const Vector *)&first->x); 416 n.SubtractVector((const Vector *)&second->x); 418 n.CopyVector((const Vector *)&first->x); 419 n.SubtractVector((const Vector *)&second->x); 417 420 n.Normalize(); 418 break; 421 break; 419 422 }; 420 423 cout << Verbose(0) << "Normal vector: "; … … 433 436 double tmp1, tmp2; 434 437 char choice; // menu choice char 435 438 436 439 cout << Verbose(0) << "===========REMOVE ATOMS=========================" << endl; 437 440 cout << Verbose(0) << " a - state atom for removal by number" << endl; … … 442 445 cout << Verbose(0) << "INPUT: "; 443 446 cin >> choice; 444 447 445 448 switch (choice) { 446 449 default: … … 475 478 mol->RemoveAtom(first); 476 479 } 477 break; 480 break; 478 481 }; 479 482 //mol->Output((ofstream *)&cout); … … 492 495 int Z; 493 496 char choice; // menu choice char 494 497 495 498 cout << Verbose(0) << "===========MEASURE ATOMS=========================" << endl; 496 499 cout << Verbose(0) << " a - calculate bond length between one atom and all others" << endl; … … 514 517 for (int i=MAX_ELEMENTS;i--;) 515 518 min[i] = 0.; 516 517 second = mol->start; 519 520 second = mol->start; 518 521 while ((second->next != mol->end)) { 519 522 second = second->next; // advance … … 526 529 } 527 530 if ((tmp1 != 0.) && ((min[Z] == 0.) || (tmp1 < min[Z]))) min[Z] = tmp1; 528 //cout << Verbose(0) << "Bond length between Atom " << first->nr << " and " << second->nr << ": " << tmp1 << " a.u." << endl; 531 //cout << Verbose(0) << "Bond length between Atom " << first->nr << " and " << second->nr << ": " << tmp1 << " a.u." << endl; 529 532 } 530 533 for (int i=MAX_ELEMENTS;i--;) 531 534 if (min[i] != 0.) cout << Verbose(0) << "Minimum Bond length between " << first->type->name << " Atom " << first->nr << " and next Ion of type " << (periode->FindElement(i))->name << ": " << min[i] << " a.u." << endl; 532 535 break; 533 536 534 537 case 'b': 535 538 first = mol->AskAtom("Enter first atom: "); … … 556 559 y.SubtractVector((const Vector *)&second->x); 557 560 cout << Verbose(0) << "Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": "; 558 cout << Verbose(0) << (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.) << " degrees" << endl; 561 cout << Verbose(0) << (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.) << " degrees" << endl; 559 562 break; 560 563 case 'd': … … 600 603 int Order1; 601 604 clock_t start, end; 602 605 603 606 cout << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl; 604 607 cout << Verbose(0) << "What's the desired bond order: "; … … 609 612 end = clock(); 610 613 cout << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl; 611 } else 614 } else 612 615 cout << Verbose(0) << "Connection matrix has not yet been generated!" << endl; 613 616 }; … … 623 626 atom *Walker = mol->start; 624 627 int i, comp, counter=0; 625 628 626 629 // generate some KeySets 627 630 cout << "Generating KeySets." << endl; … … 637 640 cout << "Testing insertion of already present item in KeySets." << endl; 638 641 KeySetTestPair test; 639 test = TestSets[mol->AtomCount-1].insert(Walker->nr); 642 test = TestSets[mol->AtomCount-1].insert(Walker->nr); 640 643 if (test.second) { 641 644 cout << Verbose(1) << "Insertion worked?!" << endl; … … 646 649 TestSets[mol->AtomCount].insert(mol->end->previous->previous->previous->nr); 647 650 648 // constructing Graph structure 651 // constructing Graph structure 649 652 cout << "Generating Subgraph class." << endl; 650 653 Graph Subgraphs; … … 657 660 cout << "Testing insertion of already present item in Subgraph." << endl; 658 661 GraphTestPair test2; 659 test2 = Subgraphs.insert(GraphPair (TestSets[mol->AtomCount],pair<int, double>(counter++, 1.))); 662 test2 = Subgraphs.insert(GraphPair (TestSets[mol->AtomCount],pair<int, double>(counter++, 1.))); 660 663 if (test2.second) { 661 664 cout << Verbose(1) << "Insertion worked?!" << endl; … … 663 666 cout << Verbose(1) << "Insertion rejected: Present object is " << (*(test2.first)).second.first << "." << endl; 664 667 } 665 668 666 669 // show graphs 667 670 cout << "Showing Subgraph's contents, checking that it's sorted." << endl; … … 674 677 if ((*key) > comp) 675 678 cout << (*key) << " "; 676 else 679 else 677 680 cout << (*key) << "! "; 678 681 comp = (*key); … … 716 719 else 717 720 cout << "failed." << endl; 718 721 719 722 // and save to xyz file 720 723 if (ConfigFileName != NULL) { … … 727 730 strcat(filename, ".xyz"); 728 731 output.open(filename, ios::trunc); 729 } 732 } 730 733 cout << Verbose(0) << "Saving of XYZ file "; 731 734 if (mol->MDSteps <= 1) { … … 742 745 output.close(); 743 746 output.clear(); 744 747 745 748 // and save as MPQC configuration 746 749 if (ConfigFileName != NULL) … … 753 756 else 754 757 cout << "failed." << endl; 755 758 756 759 if (!strcmp(configuration->configpath, configuration->GetDefaultPath())) { 757 760 cerr << "WARNING: config is found under different path then stated in config file::defaultpath!" << endl; … … 785 788 int argptr; 786 789 PathToDatabases = LocalPath; 787 790 788 791 if (argc > 1) { // config file specified as option 789 792 // 1. : Parse options that just set variables or print help … … 798 801 case '?': 799 802 cout << "MoleCuilder suite" << endl << "==================" << endl << endl; 800 cout << "Usage: " << argv[0] << "[config file] [-{acefpsthH?vfrp}] [further arguments]" << endl; 803 cout << "Usage: " << argv[0] << "[config file] [-{acefpsthH?vfrp}] [further arguments]" << endl; 801 804 cout << "or simply " << argv[0] << " without arguments for interactive session." << endl; 802 805 cout << "\t-a Z x1 x2 x3\tAdd new atom of element Z at coordinates (x1,x2,x3)." << endl; 806 cout << "\t-A <source>\tCreate adjacency list from bonds parsed from 'dbond'-style file." <<endl; 803 807 cout << "\t-b x1 x2 x3\tCenter atoms in domain with given edge lengths of (x1,x2,x3)." << endl; 804 808 cout << "\t-c x1 x2 x3\tCenter atoms in domain with a minimum distance to boundary of (x1,x2,x3)." << endl; … … 812 816 cout << "\t-m <0/1>\tCalculate (0)/ Align in(1) PAS with greatest EV along z axis." << endl; 813 817 cout << "\t-n\tFast parsing (i.e. no trajectories are looked for)." << endl; 814 cout << "\t-o\tGet volume of the convex envelope (and store to tecplot file)." << endl; 818 cout << "\t-N\tGet non-convex-envelope." << endl; 819 cout << "\t-o <out>\tGet volume of the convex envelope (and store to tecplot file)." << endl; 815 820 cout << "\t-p <file>\tParse given xyz file and create raw config file from it." << endl; 816 821 cout << "\t-P <file>\tParse given forces file and append as an MD step to config file via Verlet." << endl; 817 822 cout << "\t-r\t\tConvert file from an old pcp syntax." << endl; 818 823 cout << "\t-t x1 x2 x3\tTranslate all atoms by this vector (x1,x2,x3)." << endl; 819 cout << "\t-T <file> Store temperatures from the config file in <file>." << endl; 824 cout << "\t-T <file> Store temperatures from the config file in <file>." << endl; 820 825 cout << "\t-s x1 x2 x3\tScale all atom coordinates by this vector (x1,x2,x3)." << endl; 821 cout << "\t-u rho\tsuspend in water solution and output necessary cell lengths, average density rho and repetition." << endl; 826 cout << "\t-u rho\tsuspend in water solution and output necessary cell lengths, average density rho and repetition." << endl; 822 827 cout << "\t-v/-V\t\tGives version information." << endl; 823 828 cout << "Note: config files must not begin with '-' !" << endl; … … 854 859 argptr++; 855 860 } while (argptr < argc); 856 861 857 862 // 2. Parse the element database 858 863 if (periode->LoadPeriodentafel(PathToDatabases)) { … … 863 868 return 1; 864 869 } 865 870 866 871 // 3. Find config file name and parse if possible 867 872 if (argv[1][0] != '-') { … … 902 907 } else 903 908 config_present = absent; 904 909 905 910 // 4. parse again through options, now for those depending on elements db and config presence 906 911 argptr = 1; … … 946 951 config_present = present; 947 952 } else 948 cerr << Verbose(1) << "Could not find the specified element." << endl; 953 cerr << Verbose(1) << "Could not find the specified element." << endl; 949 954 argptr+=4; 950 955 } … … 956 961 if (config_present == present) { 957 962 switch(argv[argptr-1][1]) { 958 case 'D': 963 case 'D': 959 964 ExitFlag = 1; 960 965 { … … 1002 1007 } 1003 1008 break; 1009 case 'A': 1010 ExitFlag = 1; 1011 if ((argptr >= argc) || (!IsValidNumber(argv[argptr])) || (argv[argptr][0] == '-')) { 1012 ExitFlag =255; 1013 cerr << "Missing source file for bonds in molecule: -A <bond sourcefile>" << endl; 1014 } else { 1015 cout << "Parsing bonds from " << argv[argptr] << "." << endl; 1016 ifstream *input = new ifstream(argv[argptr]); 1017 mol->CreateAdjacencyList2((ofstream *)&cout, input); 1018 input->close(); 1019 } 1020 break; 1021 case 'N': 1022 ExitFlag = 1; 1023 if ((argptr+1 >= argc) || (argv[argptr+1][0] == '-')){ 1024 ExitFlag = 255; 1025 cerr << "Not enough or invalid arguments given for non-convex envelope: -o <radius> <tecplot output file>" << endl; 1026 } else { 1027 cout << Verbose(0) << "Evaluating npn-convex envelope."; 1028 string TempName(argv[argptr+1]); 1029 TempName.append(".r3d"); 1030 ofstream *output = new ofstream(TempName.c_str(), ios::trunc); 1031 cout << Verbose(1) << "Using rolling ball of radius " << atof(argv[argptr]) << " and storing tecplot data in " << argv[argptr+1] << "." << endl; 1032 Find_non_convex_border((ofstream *)&cout, output, mol, argv[argptr+1], atof(argv[argptr])); 1033 output->close(); 1034 delete(output); 1035 argptr+=2; 1036 } 1037 break; 1004 1038 case 'T': 1005 1039 ExitFlag = 1; … … 1168 1202 case 'o': 1169 1203 ExitFlag = 1; 1170 if ((argptr >= argc) || (argv[argptr][0] == '-')) 1204 if ((argptr >= argc) || (argv[argptr][0] == '-')){ 1171 1205 ExitFlag = 255; 1172 1206 cerr << "Not enough or invalid arguments given for convex envelope: -o <tecplot output file>" << endl; 1173 1207 } else { 1174 1208 cout << Verbose(0) << "Evaluating volume of the convex envelope."; 1209 ofstream *output = new ofstream(argv[argptr], ios::trunc); 1210 //$$$ 1175 1211 cout << Verbose(1) << "Storing tecplot data in " << argv[argptr] << "." << endl; 1176 ofstream *output = new ofstream(argv[argptr], ios::trunc);1177 1212 VolumeOfConvexEnvelope((ofstream *)&cout, output, &configuration, NULL, mol); 1178 1213 output->close(); … … 1269 1304 mol->Translate(&x); 1270 1305 } 1271 mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor; 1306 mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor; 1272 1307 } 1273 1308 } … … 1332 1367 if (j == 1) return 0; // just for -v and -h options 1333 1368 if (j) return j; // something went wrong 1334 1369 1335 1370 // General stuff 1336 1371 if (mol->cell_size[0] == 0.) { … … 1346 1381 // now the main construction loop 1347 1382 cout << Verbose(0) << endl << "Now comes the real construction..." << endl; 1348 do { 1383 do { 1349 1384 cout << Verbose(0) << endl << endl; 1350 1385 cout << Verbose(0) << "============Element list=======================" << endl; … … 1365 1400 cout << Verbose(0) << "-----------------------------------------------" << endl; 1366 1401 cout << Verbose(0) << "d - duplicate molecule/periodic cell" << endl; 1367 cout << Verbose(0) << "i - realign molecule" << endl; 1368 cout << Verbose(0) << "m - mirror all molecules" << endl; 1402 cout << Verbose(0) << "i - realign molecule" << endl; 1403 cout << Verbose(0) << "m - mirror all molecules" << endl; 1369 1404 cout << Verbose(0) << "t - translate molecule by vector" << endl; 1370 1405 cout << Verbose(0) << "c - scale by unit transformation" << endl; … … 1377 1412 cout << Verbose(0) << "Input: "; 1378 1413 cin >> choice; 1379 1414 1380 1415 switch (choice) { 1381 1416 default: 1382 1417 case 'a': // add atom 1383 1418 AddAtoms(periode, mol); 1384 choice = 'a'; 1385 break; 1386 1419 choice = 'a'; 1420 break; 1421 1387 1422 case 'b': // scale a bond 1388 1423 cout << Verbose(0) << "Scaling bond length between two atoms." << endl; … … 1400 1435 } 1401 1436 //cout << Verbose(0) << "New coordinates of Atom " << second->nr << " are: "; 1402 //second->Output(second->type->No, 1, (ofstream *)&cout); 1403 break; 1404 1405 case 'c': // unit scaling of the metric 1437 //second->Output(second->type->No, 1, (ofstream *)&cout); 1438 break; 1439 1440 case 'c': // unit scaling of the metric 1406 1441 cout << Verbose(0) << "Angstroem -> Bohrradius: 1.8897261\t\tBohrradius -> Angstroem: 0.52917721" << endl; 1407 1442 cout << Verbose(0) << "Enter three factors: "; … … 1414 1449 delete[](factor); 1415 1450 break; 1416 1451 1417 1452 case 'd': // duplicate the periodic cell along a given axis, given times 1418 1453 cout << Verbose(0) << "State the axis [(+-)123]: "; … … 1420 1455 cout << Verbose(0) << "State the factor: "; 1421 1456 cin >> faktor; 1422 1457 1423 1458 mol->CountAtoms((ofstream *)&cout); // recount atoms 1424 1459 if (mol->AtomCount != 0) { // if there is more than none … … 1461 1496 mol->Translate(&x); 1462 1497 } 1463 mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor; 1498 mol->cell_size[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor; 1464 1499 } 1465 1500 break; 1466 1501 1467 1502 case 'e': // edit each field of the configuration 1468 1503 configuration.Edit(mol); 1469 1504 break; 1470 1505 1471 1506 case 'f': 1472 1507 FragmentAtoms(mol, &configuration); 1473 1508 break; 1474 1509 1475 1510 case 'g': // center the atoms 1476 1511 CenterAtoms(mol); 1477 1512 break; 1478 1479 case 'i': // align all atoms 1513 1514 case 'i': // align all atoms 1480 1515 AlignAtoms(periode, mol); 1481 1516 break; … … 1488 1523 MirrorAtoms(mol); 1489 1524 break; 1490 1525 1491 1526 case 'o': // create the connection matrix 1492 1527 { … … 1509 1544 } 1510 1545 break; 1511 1546 1512 1547 case 'p': // parse and XYZ file 1513 1548 cout << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl; … … 1518 1553 break; 1519 1554 1520 case 'q': // quit 1521 break; 1522 1555 case 'q': // quit 1556 break; 1557 1523 1558 case 'r': // remove atom 1524 RemoveAtoms(mol); 1525 break; 1526 1559 RemoveAtoms(mol); 1560 break; 1561 1527 1562 case 's': // save to config file 1528 1563 SaveConfig(ConfigFileName, &configuration, periode, mol); … … 1530 1565 1531 1566 case 't': // translate all atoms 1532 cout << Verbose(0) << "Enter translation vector." << endl; 1567 cout << Verbose(0) << "Enter translation vector." << endl; 1533 1568 x.AskPosition(mol->cell_size,0); 1534 1569 mol->Translate((const Vector *)&x); 1535 1570 break; 1536 1571 1537 1572 case 'T': 1538 1573 testroutine(mol); 1539 1574 break; 1540 1575 1541 1576 case 'u': // change an atom's element 1542 1577 first = NULL; … … 1545 1580 cin >> Z; 1546 1581 } while ((first = mol->FindAtom(Z)) == NULL); 1547 cout << Verbose(0) << "New element by atomic number Z: "; 1582 cout << Verbose(0) << "New element by atomic number Z: "; 1548 1583 cin >> Z; 1549 1584 first->type = periode->FindElement(Z); 1550 cout << Verbose(0) << "Atom " << first->nr << "'s element is " << first->type->name << "." << endl; 1585 cout << Verbose(0) << "Atom " << first->nr << "'s element is " << first->type->name << "." << endl; 1551 1586 break; 1552 1587 }; 1553 1588 } while (choice != 'q'); 1554 1589 1555 1590 // save element data base 1556 1591 if (periode->StorePeriodentafel(ElementsFileName)) //ElementsFileName -
Property mode
changed from
Note:
See TracChangeset
for help on using the changeset viewer.