Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/builder.cpp

    • Property mode changed from 100755 to 100644
    rbe90f1 rf66195  
    5050using namespace std;
    5151
     52#include "atom.hpp"
     53#include "bond.hpp"
    5254#include "boundary.hpp"
     55#include "config.hpp"
     56#include "element.hpp"
    5357#include "ellipsoid.hpp"
    5458#include "helpers.hpp"
     59#include "leastsquaremin.hpp"
     60#include "linkedcell.hpp"
    5561#include "memoryusageobserverunittest.hpp"
    56 #include "molecules.hpp"
     62#include "molecule.hpp"
     63#include "periodentafel.hpp"
     64
    5765/********************************************* Subsubmenu routine ************************************/
    5866
     
    10181026      cin >> nr;
    10191027      count = 1;
    1020       for( MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)
     1028      for(MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)
    10211029        if (nr == (*ListRunner)->IndexNr) {
    10221030          mol = *ListRunner;
    10231031          molecules->ListOfMolecules.erase(ListRunner);
    10241032          delete(mol);
     1033          break;
    10251034        }
    10261035      break;
     
    10751084
    10761085    case 'e':
    1077       cout << Verbose(0) << "Not implemented yet." << endl;
     1086      {
     1087        int src, dest;
     1088        molecule *srcmol = NULL, *destmol = NULL;
     1089        do {
     1090          cout << Verbose(0) << "Enter index of matrix molecule (the variable one): ";
     1091          cin >> src;
     1092          srcmol = molecules->ReturnIndex(src);
     1093        } while ((srcmol == NULL) && (src != -1));
     1094        do {
     1095          cout << Verbose(0) << "Enter index of molecule to merge into (the fixed one): ";
     1096          cin >> dest;
     1097          destmol = molecules->ReturnIndex(dest);
     1098        } while ((destmol == NULL) && (dest != -1));
     1099        if ((src != -1) && (dest != -1))
     1100          molecules->EmbedMerge(destmol, srcmol);
     1101      }
    10781102      break;
    10791103
     
    13661390            cout << "\t-p <file>\tParse given xyz file and create raw config file from it." << endl;
    13671391            cout << "\t-P <file>\tParse given forces file and append as an MD step to config file via Verlet." << endl;
    1368             cout << "\t-r\t\tConvert file from an old pcp syntax." << endl;
    1369             cout << "\t-R\t\tRemove all atoms out of sphere around a given one." << endl;
     1392            cout << "\t-r <id>\t\tRemove an atom with given id." << endl;
     1393            cout << "\t-R <id> <radius>\t\tRemove all atoms out of sphere around a given one." << endl;
    13701394            cout << "\t-s x1 x2 x3\tScale all atom coordinates by this vector (x1,x2,x3)." << endl;
    13711395            cout << "\t-S <file> Store temperatures from the config file in <file>." << endl;
     
    14641488          switch(argv[argptr-1][1]) {
    14651489            case 'p':
    1466               ExitFlag = 1;
     1490              if (ExitFlag == 0) ExitFlag = 1;
    14671491              if ((argptr >= argc) || (argv[argptr][0] == '-')) {
    14681492                ExitFlag = 255;
     
    14801504              break;
    14811505            case 'a':
    1482               ExitFlag = 1;
     1506              if (ExitFlag == 0) ExitFlag = 1;
    14831507              if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr+1]))) {
    14841508                ExitFlag = 255;
     
    15191543              break;
    15201544            case 'D':
    1521               ExitFlag = 1;
     1545              if (ExitFlag == 0) ExitFlag = 1;
    15221546              {
    15231547                cout << Verbose(1) << "Depth-First-Search Analysis." << endl;
     
    15521576              break;
    15531577            case 'E':
    1554               ExitFlag = 1;
     1578              if (ExitFlag == 0) ExitFlag = 1;
    15551579              if ((argptr+1 >= argc) || (!IsValidNumber(argv[argptr])) || (argv[argptr+1][0] == '-')) {
    15561580                ExitFlag = 255;
     
    15651589              break;
    15661590            case 'F':
    1567               ExitFlag = 1;
     1591              if (ExitFlag == 0) ExitFlag = 1;
    15681592              if (argptr+5 >=argc) {
    15691593                ExitFlag = 255;
     
    16031627              break;
    16041628            case 'A':
    1605               ExitFlag = 1;
     1629              if (ExitFlag == 0) ExitFlag = 1;
    16061630              if ((argptr >= argc) || (argv[argptr][0] == '-')) {
    16071631                ExitFlag =255;
     
    16161640              break;
    16171641            case 'N':
    1618               ExitFlag = 1;
     1642              if (ExitFlag == 0) ExitFlag = 1;
    16191643              if ((argptr+1 >= argc) || (argv[argptr+1][0] == '-')){
    16201644                ExitFlag = 255;
     
    16261650                cout << Verbose(0) << "Evaluating non-convex envelope.";
    16271651                cout << Verbose(1) << "Using rolling ball of radius " << atof(argv[argptr]) << " and storing tecplot data in " << argv[argptr+1] << "." << endl;
    1628                 start = clock();
     1652                start = clock();
    16291653                LinkedCell LCList(mol, atof(argv[argptr])*2.);
    1630                 FindNonConvexBorder((ofstream *)&cout, mol, &LCList, argv[argptr+1], atof(argv[argptr]));
     1654                FindNonConvexBorder((ofstream *)&cout, mol, &LCList, atof(argv[argptr]), argv[argptr+1]);
    16311655                //FindDistributionOfEllipsoids((ofstream *)&cout, &T, &LCList, N, number, filename.c_str());
    1632                 end = clock();
    1633                 cout << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl;
     1656                end = clock();
     1657                cout << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl;
    16341658                argptr+=2;
    16351659              }
    16361660              break;
    16371661            case 'S':
    1638               ExitFlag = 1;
     1662              if (ExitFlag == 0) ExitFlag = 1;
    16391663              if ((argptr >= argc) || (argv[argptr][0] == '-')) {
    16401664                ExitFlag = 255;
     
    16531677              break;
    16541678            case 'L':
    1655               ExitFlag = 1;
    1656               SaveFlag = true;
    1657               cout << Verbose(1) << "Linear interpolation between configuration " << argv[argptr] << " and " << argv[argptr+1] << "." << endl;
    1658               if (!mol->LinearInterpolationBetweenConfiguration((ofstream *)&cout, atoi(argv[argptr]), atoi(argv[argptr+1]), argv[argptr+2], configuration))
    1659                 cout << Verbose(2) << "Could not store " << argv[argptr+2] << " files." << endl;
    1660               else
    1661                 cout << Verbose(2) << "Steps created and " << argv[argptr+2] << " files stored." << endl;
    1662               argptr+=3;
     1679              if (ExitFlag == 0) ExitFlag = 1;
     1680              if ((argptr >= argc) || (argv[argptr][0] == '-')) {
     1681                ExitFlag = 255;
     1682                cerr << "Not enough or invalid arguments given for storing tempature: -L <step0> <step1> <prefix> <identity mapping?>" << endl;
     1683              } else {
     1684                SaveFlag = true;
     1685                cout << Verbose(1) << "Linear interpolation between configuration " << argv[argptr] << " and " << argv[argptr+1] << "." << endl;
     1686                if (atoi(argv[argptr+3]) == 1)
     1687                  cout << Verbose(1) << "Using Identity for the permutation map." << endl;
     1688                if (!mol->LinearInterpolationBetweenConfiguration((ofstream *)&cout, atoi(argv[argptr]), atoi(argv[argptr+1]), argv[argptr+2], configuration, atoi(argv[argptr+3])) == 1 ? true : false)
     1689                  cout << Verbose(2) << "Could not store " << argv[argptr+2] << " files." << endl;
     1690                else
     1691                  cout << Verbose(2) << "Steps created and " << argv[argptr+2] << " files stored." << endl;
     1692                argptr+=4;
     1693              }
    16631694              break;
    16641695            case 'P':
    1665               ExitFlag = 1;
     1696              if (ExitFlag == 0) ExitFlag = 1;
    16661697              if ((argptr >= argc) || (argv[argptr][0] == '-')) {
    16671698                ExitFlag = 255;
     
    16781709              break;
    16791710            case 'R':
    1680               ExitFlag = 1;
    1681               if ((argptr+1 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])))  {
     1711              if (ExitFlag == 0) ExitFlag = 1;
     1712              if ((argptr+1 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])))  {
    16821713                ExitFlag = 255;
    16831714                cerr << "Not enough or invalid arguments given for removing atoms: -R <id> <distance>" << endl;
     
    17031734              break;
    17041735            case 't':
    1705               ExitFlag = 1;
    1706               if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
     1736              if (ExitFlag == 0) ExitFlag = 1;
     1737              if ((argptr+2 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
    17071738                ExitFlag = 255;
    17081739                cerr << "Not enough or invalid arguments given for translation: -t <x> <y> <z>" << endl;
    17091740              } else {
    1710                 ExitFlag = 1;
     1741                if (ExitFlag == 0) ExitFlag = 1;
    17111742                SaveFlag = true;
    1712                 cout << Verbose(1) << "Translating all ions to new origin." << endl;
     1743                cout << Verbose(1) << "Translating all ions by given vector." << endl;
    17131744                for (int i=NDIM;i--;)
    17141745                  x.x[i] = atof(argv[argptr+i]);
     
    17161747                argptr+=3;
    17171748              }
     1749              break;
    17181750            case 'T':
    1719               ExitFlag = 1;
    1720               if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
     1751              if (ExitFlag == 0) ExitFlag = 1;
     1752              if ((argptr+2 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
    17211753                ExitFlag = 255;
    17221754                cerr << "Not enough or invalid arguments given for periodic translation: -T <x> <y> <z>" << endl;
    17231755              } else {
    1724                 ExitFlag = 1;
     1756                if (ExitFlag == 0) ExitFlag = 1;
    17251757                SaveFlag = true;
    1726                 cout << Verbose(1) << "Translating all ions periodically to new origin." << endl;
     1758                cout << Verbose(1) << "Translating all ions periodically by given vector." << endl;
    17271759                for (int i=NDIM;i--;)
    17281760                  x.x[i] = atof(argv[argptr+i]);
     
    17321764              break;
    17331765            case 's':
    1734               ExitFlag = 1;
    1735               if ((argptr >= argc) || (!IsValidNumber(argv[argptr])) ) {
     1766              if (ExitFlag == 0) ExitFlag = 1;
     1767              if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) ) {
    17361768                ExitFlag = 255;
    17371769                cerr << "Not enough or invalid arguments given for scaling: -s <factor/[factor_x]> [factor_y] [factor_z]" << endl;
     
    17591791              break;
    17601792            case 'b':
    1761               ExitFlag = 1;
    1762               if ((argptr+5 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) ) {
     1793              if (ExitFlag == 0) ExitFlag = 1;
     1794              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])) ) {
    17631795                ExitFlag = 255;
    17641796                cerr << "Not enough or invalid arguments given for centering in box: -b <xx> <xy> <xz> <yy> <yz> <zz>" << endl;
     
    17761808              break;
    17771809            case 'B':
    1778               ExitFlag = 1;
    1779               if ((argptr+5 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) ) {
     1810              if (ExitFlag == 0) ExitFlag = 1;
     1811              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])) ) {
    17801812                ExitFlag = 255;
    17811813                cerr << "Not enough or invalid arguments given for bounding in box: -B <xx> <xy> <xz> <yy> <yz> <zz>" << endl;
     
    17931825              break;
    17941826            case 'c':
    1795               ExitFlag = 1;
    1796               if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
     1827              if (ExitFlag == 0) ExitFlag = 1;
     1828              if ((argptr+2 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
    17971829                ExitFlag = 255;
    17981830                cerr << "Not enough or invalid arguments given for centering with boundary: -c <boundary_x> <boundary_y> <boundary_z>" << endl;
     
    18171849              break;
    18181850            case 'O':
    1819               ExitFlag = 1;
     1851              if (ExitFlag == 0) ExitFlag = 1;
    18201852              SaveFlag = true;
    18211853              cout << Verbose(1) << "Centering atoms on edge and setting box dimensions." << endl;
     
    18261858              break;
    18271859            case 'r':
    1828               ExitFlag = 1;
    1829               SaveFlag = true;
    1830               cout << Verbose(1) << "Converting config file from supposed old to new syntax." << endl;
     1860              if (ExitFlag == 0) ExitFlag = 1;
     1861              if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])))  {
     1862                ExitFlag = 255;
     1863                cerr << "Not enough or invalid arguments given for removing atoms: -r <id>" << endl;
     1864              } else {
     1865                SaveFlag = true;
     1866                cout << Verbose(1) << "Removing atom " << argv[argptr] << "." << endl;
     1867                atom *first = mol->FindAtom(atoi(argv[argptr]));
     1868                mol->RemoveAtom(first);
     1869                argptr+=1;
     1870              }
    18311871              break;
    18321872            case 'f':
    1833               ExitFlag = 1;
    1834               if ((argptr+1 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1]))) {
     1873              if (ExitFlag == 0) ExitFlag = 1;
     1874              if ((argptr+1 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1]))) {
    18351875                ExitFlag = 255;
    18361876                cerr << "Not enough or invalid arguments for fragmentation: -f <max. bond distance> <bond order>" << endl;
     
    18501890              break;
    18511891            case 'm':
    1852               ExitFlag = 1;
     1892              if (ExitFlag == 0) ExitFlag = 1;
    18531893              j = atoi(argv[argptr++]);
    18541894              if ((j<0) || (j>1)) {
     
    18641904              break;
    18651905            case 'o':
    1866               ExitFlag = 1;
    1867               if ((argptr >= argc) || (argv[argptr][0] == '-')){
     1906              if (ExitFlag == 0) ExitFlag = 1;
     1907              if ((argptr+1 >= argc) || (argv[argptr][0] == '-')){
    18681908                ExitFlag = 255;
    1869                 cerr << "Not enough or invalid arguments given for convex envelope: -o <tecplot output file>" << endl;
     1909                cerr << "Not enough or invalid arguments given for convex envelope: -o <convex output file> <non-convex output file>" << endl;
    18701910              } else {
    18711911                cout << Verbose(0) << "Evaluating volume of the convex envelope.";
    1872                 cout << Verbose(1) << "Storing tecplot data in " << argv[argptr] << "." << endl;
     1912                cout << Verbose(1) << "Storing tecplot convex data in " << argv[argptr] << "." << endl;
     1913                cout << Verbose(1) << "Storing tecplot non-convex data in " << argv[argptr+1] << "." << endl;
    18731914                LinkedCell LCList(mol, 10.);
    18741915                //FindConvexBorder((ofstream *)&cout, mol, &LCList, argv[argptr]);
    1875                 FindNonConvexBorder((ofstream *)&cout, mol, &LCList, argv[argptr], 10.);
    1876 
     1916                FindNonConvexBorder((ofstream *)&cout, mol, &LCList, 5., argv[argptr+1]);
     1917//                RemoveAllBoundaryPoints((ofstream *)&cout, mol->TesselStruct, mol, argv[argptr]);
    18771918                double volumedifference = ConvexizeNonconvexEnvelope((ofstream *)&cout, mol->TesselStruct, mol, argv[argptr]);
    18781919                double clustervolume = VolumeOfConvexEnvelope((ofstream *)&cout, mol->TesselStruct, &configuration);
    18791920                cout << Verbose(0) << "The tesselated volume area is " << clustervolume << " " << (configuration.GetIsAngstroem() ? "angstrom" : "atomiclength") << "^3." << endl;
    18801921                cout << Verbose(0) << "The non-convex tesselated volume area is " << clustervolume-volumedifference << " " << (configuration.GetIsAngstroem() ? "angstrom" : "atomiclength") << "^3." << endl;
    1881                 argptr+=1;
     1922                argptr+=2;
    18821923              }
    18831924              break;
    18841925            case 'U':
    1885               ExitFlag = 1;
    1886               if ((argptr+1 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) ) {
     1926              if (ExitFlag == 0) ExitFlag = 1;
     1927              if ((argptr+1 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) ) {
    18871928                ExitFlag = 255;
    18881929                cerr << "Not enough or invalid arguments given for suspension with specified volume: -U <volume> <density>" << endl;
     
    18931934              }
    18941935            case 'u':
    1895               ExitFlag = 1;
    1896               if ((argptr >= argc) || (!IsValidNumber(argv[argptr])) ) {
     1936              if (ExitFlag == 0) ExitFlag = 1;
     1937              if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) ) {
    18971938                if (volume != -1)
    18981939                  ExitFlag = 255;
     
    19171958              break;
    19181959            case 'd':
    1919               ExitFlag = 1;
    1920               if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
     1960              if (ExitFlag == 0) ExitFlag = 1;
     1961              if ((argptr+2 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
    19211962                ExitFlag = 255;
    19221963                cerr << "Not enough or invalid arguments given for repeating cells: -d <repeat_x> <repeat_y> <repeat_z>" << endl;
     
    20322073      return 0;
    20332074      break;
     2075    case 2:  // just for -f option
     2076      delete(molecules); // also free's all molecules contained
     2077      delete(periode);
     2078      cout << Verbose(0) <<  "Maximum of allocated memory: "
     2079        << MemoryUsageObserver::getInstance()->getMaximumUsedMemory() << endl;
     2080      cout << Verbose(0) <<  "Remaining non-freed memory: "
     2081        << MemoryUsageObserver::getInstance()->getUsedMemorySize() << endl;
     2082      return 2;
     2083      break;
    20342084    default:
    20352085      break;
Note: See TracChangeset for help on using the changeset viewer.