Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/molecules.cpp

    • Property mode changed from 100644 to 100755
    r4158ba rcc2ee5  
    11/** \file molecules.cpp
    2  * 
     2 *
    33 * Functions for the class molecule.
    4  * 
     4 *
    55 */
    66
     
    2525      sum += (gsl_vector_get(x,j) - (vectors[i])->x[j])*(gsl_vector_get(x,j) - (vectors[i])->x[j]);
    2626  }
    27  
     27
    2828  return sum;
    2929};
     
    3434 * Initialises molecule list with correctly referenced start and end, and sets molecule::last_atom to zero.
    3535 */
    36 molecule::molecule(periodentafel *teil) 
    37 { 
     36molecule::molecule(periodentafel *teil)
     37{
    3838  // init atom chain list
    39   start = new atom; 
     39  start = new atom;
    4040  end = new atom;
    41   start->father = NULL; 
     41  start->father = NULL;
    4242  end->father = NULL;
    4343  link(start,end);
     
    4646  last = new bond(start, end, 1, -1);
    4747  link(first,last);
    48   // other stuff 
     48  // other stuff
    4949  MDSteps = 0;
    50   last_atom = 0; 
     50  last_atom = 0;
    5151  elemente = teil;
    5252  AtomCount = 0;
     
    6767 * Initialises molecule list with correctly referenced start and end, and sets molecule::last_atom to zero.
    6868 */
    69 molecule::~molecule() 
     69molecule::~molecule()
    7070{
    7171  if (ListOfBondsPerAtom != NULL)
     
    7878  delete(last);
    7979  delete(end);
    80   delete(start); 
     80  delete(start);
    8181};
    8282
    8383/** Adds given atom \a *pointer from molecule list.
    84  * Increases molecule::last_atom and gives last number to added atom and names it according to its element::abbrev and molecule::AtomCount 
     84 * Increases molecule::last_atom and gives last number to added atom and names it according to its element::abbrev and molecule::AtomCount
    8585 * \param *pointer allocated and set atom
    8686 * \return true - succeeded, false - atom not found in list
    8787 */
    8888bool molecule::AddAtom(atom *pointer)
    89 { 
     89{
    9090  if (pointer != NULL) {
    91     pointer->sort = &pointer->nr; 
     91    pointer->sort = &pointer->nr;
    9292    pointer->nr = last_atom++;  // increase number within molecule
    9393    AtomCount++;
     
    106106    return add(pointer, end);
    107107  } else
    108     return false; 
     108    return false;
    109109};
    110110
     
    115115 */
    116116atom * molecule::AddCopyAtom(atom *pointer)
    117 { 
     117{
    118118  if (pointer != NULL) {
    119119        atom *walker = new atom();
     
    122122    walker->v.CopyVector(&pointer->v); // copy velocity
    123123    walker->FixedIon = pointer->FixedIon;
    124     walker->sort = &walker->nr; 
     124    walker->sort = &walker->nr;
    125125    walker->nr = last_atom++;  // increase number within molecule
    126126    walker->father = pointer; //->GetTrueFather();
     
    133133    return walker;
    134134  } else
    135     return NULL; 
     135    return NULL;
    136136};
    137137
     
    156156 *    The lengths for these are \f$f\f$ and \f$g\f$ (from triangle H1-H2-(center of H1-H2-H3)) with knowledge that
    157157 *    the median lines in an isosceles triangle meet in the center point with a ratio 2:1.
    158  *    \f[ f = \frac{b}{\sqrt{3}} \qquad g = \frac{b}{2} 
     158 *    \f[ f = \frac{b}{\sqrt{3}} \qquad g = \frac{b}{2}
    159159 *    \f]
    160  *    as the coordination of all three atoms in the coordinate system of these three vectors: 
     160 *    as the coordination of all three atoms in the coordinate system of these three vectors:
    161161 *    \f$\pmatrix{d & f & 0}\f$, \f$\pmatrix{d & -0.5 \cdot f & g}\f$ and \f$\pmatrix{d & -0.5 \cdot f & -g}\f$.
    162  * 
     162 *
    163163 * \param *out output stream for debugging
    164  * \param *Bond pointer to bond between \a *origin and \a *replacement 
    165  * \param *TopOrigin son of \a *origin of upper level molecule (the atom added to this molecule as a copy of \a *origin) 
     164 * \param *Bond pointer to bond between \a *origin and \a *replacement
     165 * \param *TopOrigin son of \a *origin of upper level molecule (the atom added to this molecule as a copy of \a *origin)
    166166 * \param *origin pointer to atom which acts as the origin for scaling the added hydrogen to correct bond length
    167167 * \param *replacement pointer to the atom which shall be copied as a hydrogen atom in this molecule
     
    191191  InBondvector.SubtractVector(&TopOrigin->x);
    192192  bondlength = InBondvector.Norm();
    193    
     193
    194194   // is greater than typical bond distance? Then we have to correct periodically
    195195   // the problem is not the H being out of the box, but InBondvector have the wrong direction
    196    // due to TopReplacement or Origin being on the wrong side! 
    197   if (bondlength > BondDistance) { 
     196   // due to TopReplacement or Origin being on the wrong side!
     197  if (bondlength > BondDistance) {
    198198//    *out << Verbose(4) << "InBondvector is: ";
    199199//    InBondvector.Output(out);
     
    215215//    *out << endl;
    216216  } // periodic correction finished
    217  
     217
    218218  InBondvector.Normalize();
    219219  // get typical bond length and store as scale factor for later
    220220  BondRescale = TopOrigin->type->HBondDistance[TopBond->BondDegree-1];
    221221  if (BondRescale == -1) {
    222     cerr << Verbose(3) << "WARNING: There is no typical bond distance for bond (" << TopOrigin->Name << "<->" << TopReplacement->Name << ") of degree " << TopBond->BondDegree << "!" << endl;
    223     BondRescale = bondlength;
     222    cerr << Verbose(3) << "ERROR: There is no typical hydrogen bond distance in replacing bond (" << TopOrigin->Name << "<->" << TopReplacement->Name << ") of degree " << TopBond->BondDegree << "!" << endl;
     223    return false;
     224    BondRescale = bondlength;
    224225  } else {
    225226    if (!IsAngstroem)
     
    272273      if (FirstOtherAtom != NULL) { // then we just have this double bond and the plane does not matter at all
    273274//        *out << Verbose(3) << "Regarding the double bond (" << TopOrigin->Name << "<->" << TopReplacement->Name << ") to be constructed: Taking " << FirstOtherAtom->Name << " and " << SecondOtherAtom->Name << " along with " << TopOrigin->Name << " to determine orthogonal plane." << endl;
    274        
     275
    275276        // determine the plane of these two with the *origin
    276277        AllWentWell = AllWentWell && Orthovector1.MakeNormalVector(&TopOrigin->x, &FirstOtherAtom->x, &SecondOtherAtom->x);
     
    285286      Orthovector1.Normalize();
    286287      //*out << Verbose(3) << "ReScaleCheck: " << Orthovector1.Norm() << " and " << InBondvector.Norm() << "." << endl;
    287      
     288
    288289      // create the two Hydrogens ...
    289290      FirstOtherAtom = new atom();
     
    299300      bondangle = TopOrigin->type->HBondAngle[1];
    300301      if (bondangle == -1) {
    301         *out << Verbose(3) << "WARNING: There is no typical bond angle for bond (" << TopOrigin->Name << "<->" << TopReplacement->Name << ") of degree " << TopBond->BondDegree << "!" << endl;
     302        *out << Verbose(3) << "ERROR: There is no typical hydrogen bond angle in replacing bond (" << TopOrigin->Name << "<->" << TopReplacement->Name << ") of degree " << TopBond->BondDegree << "!" << endl;
     303        return false;
    302304        bondangle = 0;
    303305      }
     
    316318        SecondOtherAtom->x.x[i] = InBondvector.x[i] * cos(bondangle) + Orthovector1.x[i] * (-sin(bondangle));
    317319      }
    318       FirstOtherAtom->x.Scale(&BondRescale);  // rescale by correct BondDistance 
     320      FirstOtherAtom->x.Scale(&BondRescale);  // rescale by correct BondDistance
    319321      SecondOtherAtom->x.Scale(&BondRescale);
    320322      //*out << Verbose(3) << "ReScaleCheck: " << FirstOtherAtom->x.Norm() << " and " << SecondOtherAtom->x.Norm() << "." << endl;
    321323      for(int i=NDIM;i--;) { // and make relative to origin atom
    322         FirstOtherAtom->x.x[i] += TopOrigin->x.x[i]; 
     324        FirstOtherAtom->x.x[i] += TopOrigin->x.x[i];
    323325        SecondOtherAtom->x.x[i] += TopOrigin->x.x[i];
    324326      }
     
    363365//      *out << endl;
    364366      AllWentWell = AllWentWell && Orthovector2.MakeNormalVector(&InBondvector, &Orthovector1);
    365 //      *out << Verbose(3) << "Orthovector2: "; 
     367//      *out << Verbose(3) << "Orthovector2: ";
    366368//      Orthovector2.Output(out);
    367369//      *out << endl;
    368      
     370
    369371      // create correct coordination for the three atoms
    370372      alpha = (TopOrigin->type->HBondAngle[2])/180.*M_PI/2.;  // retrieve triple bond angle from database
     
    378380      factors[0] = d;
    379381      factors[1] = f;
    380       factors[2] = 0.; 
     382      factors[2] = 0.;
    381383      FirstOtherAtom->x.LinearCombinationOfVectors(&InBondvector, &Orthovector1, &Orthovector2, factors);
    382384      factors[1] = -0.5*f;
    383       factors[2] = g; 
     385      factors[2] = g;
    384386      SecondOtherAtom->x.LinearCombinationOfVectors(&InBondvector, &Orthovector1, &Orthovector2, factors);
    385       factors[2] = -g; 
     387      factors[2] = -g;
    386388      ThirdOtherAtom->x.LinearCombinationOfVectors(&InBondvector, &Orthovector1, &Orthovector2, factors);
    387389
     
    435437 */
    436438bool molecule::AddXYZFile(string filename)
    437 { 
     439{
    438440  istringstream *input = NULL;
    439441  int NumberOfAtoms = 0; // atom number in xyz read
     
    444446  string line;    // currently parsed line
    445447  double x[3];    // atom coordinates
    446  
     448
    447449  xyzfile.open(filename.c_str());
    448450  if (!xyzfile)
     
    452454  input = new istringstream(line);
    453455  *input >> NumberOfAtoms;
    454   cout << Verbose(0) << "Parsing " << NumberOfAtoms << " atoms in file." << endl; 
     456  cout << Verbose(0) << "Parsing " << NumberOfAtoms << " atoms in file." << endl;
    455457  getline(xyzfile,line,'\n'); // Read comment
    456458  cout << Verbose(1) << "Comment: " << line << endl;
    457  
     459
    458460  if (MDSteps == 0) // no atoms yet present
    459461    MDSteps++;
     
    489491  xyzfile.close();
    490492  delete(input);
    491   return true; 
     493  return true;
    492494};
    493495
     
    501503  atom *LeftAtom = NULL, *RightAtom = NULL;
    502504  atom *Walker = NULL;
    503  
     505
    504506  // copy all atoms
    505507  Walker = start;
     
    508510    CurrentAtom = copy->AddCopyAtom(Walker);
    509511  }
    510  
     512
    511513  // copy all bonds
    512514  bond *Binder = first;
     
    532534      copy->NoCyclicBonds++;
    533535    NewBond->Type = Binder->Type;
    534   } 
     536  }
    535537  // correct fathers
    536538  Walker = copy->start;
     
    549551    copy->CreateListOfBondsPerAtom((ofstream *)&cout);
    550552  }
    551  
     553
    552554  return copy;
    553555};
     
    574576
    575577/** Remove bond from bond chain list.
    576  * \todo Function not implemented yet 
     578 * \todo Function not implemented yet
    577579 * \param *pointer bond pointer
    578580 * \return true - bound found and removed, false - bond not found/removed
     
    586588
    587589/** Remove every bond from bond chain list that atom \a *BondPartner is a constituent of.
    588  * \todo Function not implemented yet 
     590 * \todo Function not implemented yet
    589591 * \param *BondPartner atom to be removed
    590592 * \return true - bounds found and removed, false - bonds not found/removed
     
    619621  Vector *min = new Vector;
    620622  Vector *max = new Vector;
    621  
     623
    622624  // gather min and max for each axis
    623625  ptr = start->next;  // start at first in list
     
    665667{
    666668  Vector *min = new Vector;
    667  
     669
    668670//  *out << Verbose(3) << "Begin of CenterEdge." << endl;
    669671  atom *ptr = start->next;  // start at first in list
     
    681683      }
    682684    }
    683 //    *out << Verbose(4) << "Maximum is "; 
     685//    *out << Verbose(4) << "Maximum is ";
    684686//    max->Output(out);
    685687//    *out << ", Minimum is ";
     
    689691    max->AddVector(min);
    690692    Translate(min);
    691   } 
     693  }
    692694  delete(min);
    693695//  *out << Verbose(3) << "End of CenterEdge." << endl;
    694 }; 
     696};
    695697
    696698/** Centers the center of the atoms at (0,0,0).
     
    702704  int Num = 0;
    703705  atom *ptr = start->next;  // start at first in list
    704  
     706
    705707  for(int i=NDIM;i--;) // zero center vector
    706708    center->x[i] = 0.;
    707    
     709
    708710  if (ptr != end) {   //list not empty?
    709711    while (ptr->next != end) {  // continue with second if present
    710712      ptr = ptr->next;
    711713      Num++;
    712       center->AddVector(&ptr->x);       
     714      center->AddVector(&ptr->x);
    713715    }
    714716    center->Scale(-1./Num); // divide through total number (and sign for direction)
    715717    Translate(center);
    716718  }
    717 }; 
     719};
    718720
    719721/** Returns vector pointing to center of gravity.
     
    727729  Vector tmp;
    728730  double Num = 0;
    729  
     731
    730732  a->Zero();
    731733
     
    735737      Num += 1.;
    736738      tmp.CopyVector(&ptr->x);
    737       a->AddVector(&tmp);       
     739      a->AddVector(&tmp);
    738740    }
    739741    a->Scale(-1./Num); // divide through total mass (and sign for direction)
     
    755757        Vector tmp;
    756758  double Num = 0;
    757        
     759
    758760        a->Zero();
    759761
     
    764766      tmp.CopyVector(&ptr->x);
    765767      tmp.Scale(ptr->type->mass);  // scale by mass
    766       a->AddVector(&tmp);       
     768      a->AddVector(&tmp);
    767769    }
    768770    a->Scale(-1./Num); // divide through total mass (and sign for direction)
     
    787789    Translate(center);
    788790  }
    789 }; 
     791};
    790792
    791793/** Scales all atoms by \a *factor.
     
    801803      Trajectories[ptr].R.at(j).Scale(factor);
    802804    ptr->x.Scale(factor);
    803   }     
    804 };
    805 
    806 /** Translate all atoms by given vector. 
     805  }
     806};
     807
     808/** Translate all atoms by given vector.
    807809 * \param trans[] translation vector.
    808810 */
     
    816818      Trajectories[ptr].R.at(j).Translate(trans);
    817819    ptr->x.Translate(trans);
    818   }     
    819 };
    820 
    821 /** Mirrors all atoms against a given plane. 
     820  }
     821};
     822
     823/** Mirrors all atoms against a given plane.
    822824 * \param n[] normal vector of mirror plane.
    823825 */
     
    831833      Trajectories[ptr].R.at(j).Mirror(n);
    832834    ptr->x.Mirror(n);
    833   }     
     835  }
    834836};
    835837
     
    845847  bool flag;
    846848  Vector Testvector, Translationvector;
    847  
     849
    848850  do {
    849851    Center.Zero();
     
    861863          if (Walker->nr < Binder->GetOtherAtom(Walker)->nr) // otherwise we shift one to, the other fro and gain nothing
    862864            for (int j=0;j<NDIM;j++) {
    863               tmp = Walker->x.x[j] - Binder->GetOtherAtom(Walker)->x.x[j]; 
     865              tmp = Walker->x.x[j] - Binder->GetOtherAtom(Walker)->x.x[j];
    864866              if ((fabs(tmp)) > BondDistance) {
    865867                flag = false;
     
    877879        cout << Verbose(1) << "vector is: ";
    878880        Testvector.Output((ofstream *)&cout);
    879         cout << endl;     
     881        cout << endl;
    880882#ifdef ADDHYDROGEN
    881883        // now also change all hydrogens
     
    890892            cout << Verbose(1) << "Hydrogen vector is: ";
    891893            Testvector.Output((ofstream *)&cout);
    892             cout << endl;     
     894            cout << endl;
    893895          }
    894896        }
     
    912914
    913915        CenterGravity(out, CenterOfGravity);
    914        
    915         // reset inertia tensor 
     916
     917        // reset inertia tensor
    916918        for(int i=0;i<NDIM*NDIM;i++)
    917919                InertiaTensor[i] = 0.;
    918        
     920
    919921        // sum up inertia tensor
    920922        while (ptr->next != end) {
     
    941943        }
    942944        *out << endl;
    943        
     945
    944946        // diagonalize to determine principal axis system
    945947        gsl_eigen_symmv_workspace *T = gsl_eigen_symmv_alloc(NDIM);
     
    950952        gsl_eigen_symmv_free(T);
    951953        gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_ABS_DESC);
    952        
     954
    953955        for(int i=0;i<NDIM;i++) {
    954956                *out << Verbose(1) << "eigenvalue = " << gsl_vector_get(eval, i);
    955957                *out << ", eigenvector = (" << evec->data[i * evec->tda + 0] << "," << evec->data[i * evec->tda + 1] << "," << evec->data[i * evec->tda + 2] << ")" << endl;
    956958        }
    957        
     959
    958960        // check whether we rotate or not
    959961        if (DoRotate) {
    960           *out << Verbose(1) << "Transforming molecule into PAS ... "; 
     962          *out << Verbose(1) << "Transforming molecule into PAS ... ";
    961963          // the eigenvectors specify the transformation matrix
    962964          ptr = start;
     
    970972
    971973          // summing anew for debugging (resulting matrix has to be diagonal!)
    972           // reset inertia tensor 
     974          // reset inertia tensor
    973975    for(int i=0;i<NDIM*NDIM;i++)
    974976      InertiaTensor[i] = 0.;
    975    
     977
    976978    // sum up inertia tensor
    977979    ptr = start;
     
    10001002    *out << endl;
    10011003        }
    1002        
     1004
    10031005        // free everything
    10041006        delete(CenterOfGravity);
     
    10071009};
    10081010
    1009 /** Evaluates the potential energy used for constrained molecular dynamics.
    1010  * \f$V_i^{con} = c^{bond} \cdot | r_{P(i)} - R_i | + sum_{i \neq j} C^{min} \cdot \frac{1}{C_{ij}} + C^{inj} \Bigl (1 - \theta \bigl (\prod_{i \neq j} (P(i) - P(j)) \bigr ) \Bigr )\f$
    1011  *     where the first term points to the target in minimum distance, the second is a penalty for trajectories lying too close to each other (\f$C_{ij}$ is minimum distance between
    1012  *     trajectories i and j) and the third term is a penalty for two atoms trying to each the same target point.
    1013  * Note that for the second term we have to solve the following linear system:
    1014  * \f$-c_1 \cdot n_1 + c_2 \cdot n_2 + C \cdot n_3 = - p_2 + p_1\f$, where \f$c_1\f$, \f$c_2\f$ and \f$C\f$ are constants,
    1015  * offset vector \f$p_1\f$ in direction \f$n_1\f$, offset vector \f$p_2\f$ in direction \f$n_2\f$,
    1016  * \f$n_3\f$ is the normal vector to both directions. \f$C\f$ would be the minimum distance between the two lines.
    1017  * \sa molecule::MinimiseConstrainedPotential(), molecule::VerletForceIntegration()
    1018  * \param *out output stream for debugging
    1019  * \param *PermutationMap gives target ptr for each atom, array of size molecule::AtomCount (this is "x" in \f$V^{con}(x)\f$)
    1020  * \param startstep start configuration (MDStep in molecule::trajectories)
    1021  * \param endstep end configuration (MDStep in molecule::trajectories)
    1022  * \param *constants constant in front of each term
    1023  * \param IsAngstroem whether coordinates are in angstroem (true) or bohrradius (false)
    1024  * \return potential energy
    1025  * \note This routine is scaling quadratically which is not optimal.
    1026  * \todo There's a bit double counting going on for the first time, bu nothing to worry really about.
    1027  */
    1028 double molecule::ConstrainedPotential(ofstream *out, atom **PermutationMap, int startstep, int endstep, double *constants, bool IsAngstroem)
    1029 {
    1030   double result = 0., tmp, Norm1, Norm2;
    1031   atom *Walker = NULL, *Runner = NULL, *Sprinter = NULL;
    1032   Vector trajectory1, trajectory2, normal, TestVector;
    1033   gsl_matrix *A = gsl_matrix_alloc(NDIM,NDIM);
    1034   gsl_vector *x = gsl_vector_alloc(NDIM);
    1035 
    1036   // go through every atom
    1037   Walker = start;
    1038   while (Walker->next != end) {
    1039     Walker = Walker->next;
    1040     // first term: distance to target
    1041     Runner = PermutationMap[Walker->nr];   // find target point
    1042     tmp = (Trajectories[Walker].R.at(startstep).Distance(&Trajectories[Runner].R.at(endstep)));
    1043     tmp *= IsAngstroem ? 1. : 1./AtomicLengthToAngstroem;
    1044     result += constants[0] * tmp;
    1045     //*out << Verbose(4) << "Adding " << tmp*constants[0] << "." << endl;
    1046    
    1047     // second term: sum of distances to other trajectories
    1048     Runner = start;
    1049     while (Runner->next != end) {
    1050       Runner = Runner->next;
    1051       if (Runner == Walker) // hence, we only go up to the Walker, not beyond (similar to i=0; i<j; i++)
    1052         break;
    1053       // determine normalized trajectories direction vector (n1, n2)
    1054       Sprinter = PermutationMap[Walker->nr];   // find first target point
    1055       trajectory1.CopyVector(&Trajectories[Sprinter].R.at(endstep));
    1056       trajectory1.SubtractVector(&Trajectories[Walker].R.at(startstep));
    1057       trajectory1.Normalize();
    1058       Norm1 = trajectory1.Norm();
    1059       Sprinter = PermutationMap[Runner->nr];   // find second target point
    1060       trajectory2.CopyVector(&Trajectories[Sprinter].R.at(endstep));
    1061       trajectory2.SubtractVector(&Trajectories[Runner].R.at(startstep));
    1062       trajectory2.Normalize();
    1063       Norm2 = trajectory1.Norm();
    1064       // check whether either is zero()
    1065       if ((Norm1 < MYEPSILON) && (Norm2 < MYEPSILON)) {
    1066         tmp = Trajectories[Walker].R.at(startstep).Distance(&Trajectories[Runner].R.at(startstep));
    1067       } else if (Norm1 < MYEPSILON) {
    1068         Sprinter = PermutationMap[Walker->nr];   // find first target point
    1069         trajectory1.CopyVector(&Trajectories[Sprinter].R.at(endstep));  // copy first offset
    1070         trajectory1.SubtractVector(&Trajectories[Runner].R.at(startstep));  // subtract second offset
    1071         trajectory2.Scale( trajectory1.ScalarProduct(&trajectory2) ); // trajectory2 is scaled to unity, hence we don't need to divide by anything
    1072         trajectory1.SubtractVector(&trajectory2);   // project the part in norm direction away
    1073         tmp = trajectory1.Norm();  // remaining norm is distance
    1074       } else if (Norm2 < MYEPSILON) {
    1075         Sprinter = PermutationMap[Runner->nr];   // find second target point
    1076         trajectory2.CopyVector(&Trajectories[Sprinter].R.at(endstep));  // copy second offset
    1077         trajectory2.SubtractVector(&Trajectories[Walker].R.at(startstep));  // subtract first offset
    1078         trajectory1.Scale( trajectory2.ScalarProduct(&trajectory1) ); // trajectory1 is scaled to unity, hence we don't need to divide by anything
    1079         trajectory2.SubtractVector(&trajectory1);   // project the part in norm direction away
    1080         tmp = trajectory2.Norm();  // remaining norm is distance
    1081       } else if ((fabs(trajectory1.ScalarProduct(&trajectory2)/Norm1/Norm2) - 1.) < MYEPSILON) { // check whether they're linear dependent
    1082 //        *out << Verbose(3) << "Both trajectories of " << *Walker << " and " << *Runner << " are linear dependent: ";
    1083 //        *out << trajectory1;
    1084 //        *out << " and ";
    1085 //        *out << trajectory2;
    1086         tmp = Trajectories[Walker].R.at(startstep).Distance(&Trajectories[Runner].R.at(startstep));
    1087 //        *out << " with distance " << tmp << "." << endl;
    1088       } else { // determine distance by finding minimum distance
    1089 //        *out << Verbose(3) << "Both trajectories of " << *Walker << " and " << *Runner << " are linear independent ";
    1090 //        *out << endl;
    1091 //        *out << "First Trajectory: ";
    1092 //        *out << trajectory1 << endl;
    1093 //        *out << "Second Trajectory: ";
    1094 //        *out << trajectory2 << endl;
    1095         // determine normal vector for both
    1096         normal.MakeNormalVector(&trajectory1, &trajectory2);
    1097         // print all vectors for debugging
    1098 //        *out << "Normal vector in between: ";
    1099 //        *out << normal << endl;
    1100         // setup matrix
    1101         for (int i=NDIM;i--;) {
    1102           gsl_matrix_set(A, 0, i, trajectory1.x[i]);
    1103           gsl_matrix_set(A, 1, i, trajectory2.x[i]);
    1104           gsl_matrix_set(A, 2, i, normal.x[i]);
    1105           gsl_vector_set(x,i, (Trajectories[Walker].R.at(startstep).x[i] - Trajectories[Runner].R.at(startstep).x[i]));
    1106         }
    1107         // solve the linear system by Householder transformations
    1108         gsl_linalg_HH_svx(A, x);
    1109         // distance from last component
    1110         tmp = gsl_vector_get(x,2);
    1111 //        *out << " with distance " << tmp << "." << endl;
    1112         // test whether we really have the intersection (by checking on c_1 and c_2)
    1113         TestVector.CopyVector(&Trajectories[Runner].R.at(startstep));
    1114         trajectory2.Scale(gsl_vector_get(x,1));
    1115         TestVector.AddVector(&trajectory2);
    1116         normal.Scale(gsl_vector_get(x,2));
    1117         TestVector.AddVector(&normal);
    1118         TestVector.SubtractVector(&Trajectories[Walker].R.at(startstep));
    1119         trajectory1.Scale(gsl_vector_get(x,0));
    1120         TestVector.SubtractVector(&trajectory1);
    1121         if (TestVector.Norm() < MYEPSILON) {
    1122 //          *out << Verbose(2) << "Test: ok.\tDistance of " << tmp << " is correct." << endl; 
    1123         } else {
    1124 //          *out << Verbose(2) << "Test: failed.\tIntersection is off by ";
    1125 //          *out << TestVector;
    1126 //          *out << "." << endl; 
    1127         }
    1128       }
    1129       // add up
    1130       tmp *= IsAngstroem ? 1. : 1./AtomicLengthToAngstroem;
    1131       if (fabs(tmp) > MYEPSILON) {
    1132         result += constants[1] * 1./tmp;
    1133         //*out << Verbose(4) << "Adding " << 1./tmp*constants[1] << "." << endl;
    1134       }
    1135     }
    1136      
    1137     // third term: penalty for equal targets
    1138     Runner = start;
    1139     while (Runner->next != end) {
    1140       Runner = Runner->next;
    1141       if ((PermutationMap[Walker->nr] == PermutationMap[Runner->nr]) && (Walker->nr < Runner->nr)) {
    1142         Sprinter = PermutationMap[Walker->nr];
    1143 //        *out << *Walker << " and " << *Runner << " are heading to the same target at ";
    1144 //        *out << Trajectories[Sprinter].R.at(endstep);
    1145 //        *out << ", penalting." << endl;
    1146         result += constants[2];
    1147         //*out << Verbose(4) << "Adding " << constants[2] << "." << endl;
    1148       }
    1149     }
    1150   }
    1151  
    1152   return result;
    1153 };
    1154 
    1155 void PrintPermutationMap(ofstream *out, atom **PermutationMap, int Nr)
    1156 {
    1157   stringstream zeile1, zeile2;
    1158   int *DoubleList = (int *) Malloc(Nr*sizeof(int), "PrintPermutationMap: *DoubleList");
    1159   int doubles = 0;
    1160   for (int i=0;i<Nr;i++)
    1161     DoubleList[i] = 0;
    1162   zeile1 << "PermutationMap: ";
    1163   zeile2 << "                ";
    1164   for (int i=0;i<Nr;i++) {
    1165     DoubleList[PermutationMap[i]->nr]++;
    1166     zeile1 << i << " ";
    1167     zeile2 << PermutationMap[i]->nr << " ";
    1168   }
    1169   for (int i=0;i<Nr;i++)
    1170     if (DoubleList[i] > 1)
    1171     doubles++;
    1172  // *out << "Found " << doubles << " Doubles." << endl;
    1173   Free((void **)&DoubleList, "PrintPermutationMap: *DoubleList");
    1174 //  *out << zeile1.str() << endl << zeile2.str() << endl;
    1175 };
    1176 
    1177 /** Minimises the extra potential for constrained molecular dynamics and gives forces and the constrained potential energy.
    1178  * We do the following:
    1179  *  -# Generate a distance list from all source to all target points
    1180  *  -# Sort this per source point
    1181  *  -# Take for each source point the target point with minimum distance, use this as initial permutation
    1182  *  -# check whether molecule::ConstrainedPotential() is greater than injective penalty
    1183  *     -# If so, we go through each source point, stepping down in the sorted target point distance list and re-checking potential.
    1184  *  -# Next, we only apply transformations that keep the injectivity of the permutations list.
    1185  *  -# Hence, for one source point we step down the ladder and seek the corresponding owner of this new target
    1186  *     point and try to change it for one with lesser distance, or for the next one with greater distance, but only
    1187  *     if this decreases the conditional potential.
    1188  *  -# finished.
    1189  *  -# Then, we calculate the forces by taking the spatial derivative, where we scale the potential to such a degree,
    1190  *     that the total force is always pointing in direction of the constraint force (ensuring that we move in the
    1191  *     right direction).
    1192  *  -# Finally, we calculate the potential energy and return.
    1193  * \param *out output stream for debugging
    1194  * \param **PermutationMap on return: mapping between the atom label of the initial and the final configuration
    1195  * \param startstep current MD step giving initial position between which and \a endstep we perform the constrained MD (as further steps are always concatenated)
    1196  * \param endstep step giving final position in constrained MD
    1197  * \param IsAngstroem whether coordinates are in angstroem (true) or bohrradius (false)
    1198  * \sa molecule::VerletForceIntegration()
    1199  * \return potential energy (and allocated **PermutationMap (array of molecule::AtomCount ^2)
    1200  * \todo The constrained potential's constants are set to fixed values right now, but they should scale based on checks of the system in order
    1201  *       to ensure they're properties (e.g. constants[2] always greater than the energy of the system).
    1202  * \bug this all is not O(N log N) but O(N^2)
    1203  */
    1204 double molecule::MinimiseConstrainedPotential(ofstream *out, atom **&PermutationMap, int startstep, int endstep, bool IsAngstroem)
    1205 {
    1206   double Potential, OldPotential, OlderPotential;
    1207   PermutationMap = (atom **) Malloc(AtomCount*sizeof(atom *), "molecule::MinimiseConstrainedPotential: **PermutationMap");
    1208   DistanceMap **DistanceList = (DistanceMap **) Malloc(AtomCount*sizeof(DistanceMap *), "molecule::MinimiseConstrainedPotential: **DistanceList");
    1209   DistanceMap::iterator *DistanceIterators = (DistanceMap::iterator *) Malloc(AtomCount*sizeof(DistanceMap::iterator), "molecule::MinimiseConstrainedPotential: *DistanceIterators");
    1210   int *DoubleList = (int *) Malloc(AtomCount*sizeof(int), "molecule::MinimiseConstrainedPotential: *DoubleList");
    1211   DistanceMap::iterator *StepList = (DistanceMap::iterator *) Malloc(AtomCount*sizeof(DistanceMap::iterator), "molecule::MinimiseConstrainedPotential: *StepList");
    1212   double constants[3];
    1213   int round;
    1214   atom *Walker = NULL, *Runner = NULL, *Sprinter = NULL;
    1215   DistanceMap::iterator Rider, Strider;
    1216  
    1217   /// Minimise the potential
    1218   // set Lagrange multiplier constants
    1219   constants[0] = 10.;
    1220   constants[1] = 1.;
    1221   constants[2] = 1e+7;    // just a huge penalty
    1222   // generate the distance list
    1223   *out << Verbose(1) << "Creating the distance list ... " << endl;
    1224   for (int i=AtomCount; i--;) {
    1225     DoubleList[i] = 0;  // stores for how many atoms in startstep this atom is a target in endstep
    1226     DistanceList[i] = new DistanceMap;    // is the distance sorted target list per atom
    1227     DistanceList[i]->clear();
    1228   }
    1229   *out << Verbose(1) << "Filling the distance list ... " << endl;
    1230   Walker = start;
    1231   while (Walker->next != end) {
    1232     Walker = Walker->next;
    1233     Runner = start;
    1234     while(Runner->next != end) {
    1235       Runner = Runner->next;
    1236       DistanceList[Walker->nr]->insert( DistancePair(Trajectories[Walker].R.at(startstep).Distance(&Trajectories[Runner].R.at(endstep)), Runner) );
    1237     }
    1238   }
    1239   // create the initial PermutationMap (source -> target)
    1240   Walker = start;
    1241   while (Walker->next != end) {
    1242     Walker = Walker->next;
    1243     StepList[Walker->nr] = DistanceList[Walker->nr]->begin();    // stores the step to the next iterator that could be a possible next target
    1244     PermutationMap[Walker->nr] = DistanceList[Walker->nr]->begin()->second;   // always pick target with the smallest distance
    1245     DoubleList[DistanceList[Walker->nr]->begin()->second->nr]++;            // increase this target's source count (>1? not injective)
    1246     DistanceIterators[Walker->nr] = DistanceList[Walker->nr]->begin();    // and remember which one we picked
    1247     *out << *Walker << " starts with distance " << DistanceList[Walker->nr]->begin()->first << "." << endl;
    1248   }
    1249   *out << Verbose(1) << "done." << endl;
    1250   // make the PermutationMap injective by checking whether we have a non-zero constants[2] term in it
    1251   *out << Verbose(1) << "Making the PermutationMap injective ... " << endl;
    1252   Walker = start;
    1253   DistanceMap::iterator NewBase;
    1254   OldPotential = fabs(ConstrainedPotential(out, PermutationMap, startstep, endstep, constants, IsAngstroem));
    1255   while ((OldPotential) > constants[2]) {
    1256     PrintPermutationMap(out, PermutationMap, AtomCount);
    1257     Walker = Walker->next;
    1258     if (Walker == end) // round-robin at the end
    1259       Walker = start->next;
    1260     if (DoubleList[DistanceIterators[Walker->nr]->second->nr] <= 1)  // no need to make those injective that aren't
    1261       continue;
    1262     // now, try finding a new one
    1263     NewBase = DistanceIterators[Walker->nr];  // store old base
    1264     do {
    1265       NewBase++;  // take next further distance in distance to targets list that's a target of no one
    1266     } while ((DoubleList[NewBase->second->nr] != 0) && (NewBase != DistanceList[Walker->nr]->end()));
    1267     if (NewBase != DistanceList[Walker->nr]->end()) {
    1268       PermutationMap[Walker->nr] = NewBase->second;
    1269       Potential = fabs(ConstrainedPotential(out, PermutationMap, startstep, endstep, constants, IsAngstroem));
    1270       if (Potential > OldPotential) { // undo
    1271         PermutationMap[Walker->nr] = DistanceIterators[Walker->nr]->second;
    1272       } else {  // do
    1273         DoubleList[DistanceIterators[Walker->nr]->second->nr]--;  // decrease the old entry in the doubles list
    1274         DoubleList[NewBase->second->nr]++;    // increase the old entry in the doubles list
    1275         DistanceIterators[Walker->nr] = NewBase;
    1276         OldPotential = Potential;
    1277         *out << Verbose(3) << "Found a new permutation, new potential is " << OldPotential << "." << endl;
    1278       }
    1279     }
    1280   }
    1281   for (int i=AtomCount; i--;) // now each single entry in the DoubleList should be <=1
    1282     if (DoubleList[i] > 1) {
    1283       cerr << "Failed to create an injective PermutationMap!" << endl;
    1284       exit(1);
    1285     }
    1286   *out << Verbose(1) << "done." << endl;
    1287   Free((void **)&DoubleList, "molecule::MinimiseConstrainedPotential: *DoubleList");
    1288   // argument minimise the constrained potential in this injective PermutationMap
    1289   *out << Verbose(1) << "Argument minimising the PermutationMap, at current potential " << OldPotential << " ... " << endl;
    1290   OldPotential = 1e+10;
    1291   round = 0;
    1292   do {
    1293     *out << "Starting round " << ++round << " ... " << endl;
    1294     OlderPotential = OldPotential;
    1295     do {
    1296       Walker = start;
    1297       while (Walker->next != end) { // pick one
    1298         Walker = Walker->next;
    1299         PrintPermutationMap(out, PermutationMap, AtomCount);
    1300         Sprinter = DistanceIterators[Walker->nr]->second;   // store initial partner
    1301         Strider = DistanceIterators[Walker->nr];  //remember old iterator
    1302         DistanceIterators[Walker->nr] = StepList[Walker->nr]; 
    1303         if (DistanceIterators[Walker->nr] == DistanceList[Walker->nr]->end()) {// stop, before we run through the list and still on
    1304           DistanceIterators[Walker->nr] == DistanceList[Walker->nr]->begin();
    1305           break;
    1306         }
    1307         //*out << Verbose(2) << "Current Walker: " << *Walker << " with old/next candidate " << *Sprinter << "/" << *DistanceIterators[Walker->nr]->second << "." << endl;
    1308         // find source of the new target
    1309         Runner = start->next;
    1310         while(Runner != end) { // find the source whose toes we might be stepping on (Walker's new target should be in use by another already)
    1311           if (PermutationMap[Runner->nr] == DistanceIterators[Walker->nr]->second) {
    1312             //*out << Verbose(2) << "Found the corresponding owner " << *Runner << " to " << *PermutationMap[Runner->nr] << "." << endl;
    1313             break;
    1314           }
    1315           Runner = Runner->next;
    1316         }
    1317         if (Runner != end) { // we found the other source
    1318           // then look in its distance list for Sprinter
    1319           Rider = DistanceList[Runner->nr]->begin();
    1320           for (; Rider != DistanceList[Runner->nr]->end(); Rider++)
    1321             if (Rider->second == Sprinter)
    1322               break;
    1323           if (Rider != DistanceList[Runner->nr]->end()) { // if we have found one
    1324             //*out << Verbose(2) << "Current Other: " << *Runner << " with old/next candidate " << *PermutationMap[Runner->nr] << "/" << *Rider->second << "." << endl;
    1325             // exchange both
    1326             PermutationMap[Walker->nr] = DistanceIterators[Walker->nr]->second; // put next farther distance into PermutationMap
    1327             PermutationMap[Runner->nr] = Sprinter;  // and hand the old target to its respective owner
    1328             PrintPermutationMap(out, PermutationMap, AtomCount);
    1329             // calculate the new potential
    1330             //*out << Verbose(2) << "Checking new potential ..." << endl;
    1331             Potential = ConstrainedPotential(out, PermutationMap, startstep, endstep, constants, IsAngstroem);
    1332             if (Potential > OldPotential) { // we made everything worse! Undo ...
    1333               //*out << Verbose(3) << "Nay, made the potential worse: " << Potential << " vs. " << OldPotential << "!" << endl;
    1334               //*out << Verbose(3) << "Setting " << *Runner << "'s source to " << *DistanceIterators[Runner->nr]->second << "." << endl;
    1335               // Undo for Runner (note, we haven't moved the iteration yet, we may use this)
    1336               PermutationMap[Runner->nr] = DistanceIterators[Runner->nr]->second;
    1337               // Undo for Walker
    1338               DistanceIterators[Walker->nr] = Strider;  // take next farther distance target
    1339               //*out << Verbose(3) << "Setting " << *Walker << "'s source to " << *DistanceIterators[Walker->nr]->second << "." << endl;
    1340               PermutationMap[Walker->nr] = DistanceIterators[Walker->nr]->second;
    1341             } else {
    1342               DistanceIterators[Runner->nr] = Rider;  // if successful also move the pointer in the iterator list
    1343               *out << Verbose(3) << "Found a better permutation, new potential is " << Potential << " vs." << OldPotential << "." << endl;
    1344               OldPotential = Potential;
    1345             }
    1346             if (Potential > constants[2]) {
    1347               cerr << "ERROR: The two-step permutation procedure did not maintain injectivity!" << endl;
    1348               exit(255);
    1349             }
    1350             //*out << endl;
    1351           } else {
    1352             cerr << "ERROR: " << *Runner << " was not the owner of " << *Sprinter << "!" << endl;
    1353             exit(255);
    1354           }
    1355         } else {
    1356           PermutationMap[Walker->nr] = DistanceIterators[Walker->nr]->second; // new target has no source!
    1357         }
    1358         StepList[Walker->nr]++; // take next farther distance target
    1359       }
    1360     } while (Walker->next != end);
    1361   } while ((OlderPotential - OldPotential) > 1e-3);
    1362   *out << Verbose(1) << "done." << endl;
    1363 
    1364  
    1365   /// free memory and return with evaluated potential
    1366   for (int i=AtomCount; i--;)
    1367     DistanceList[i]->clear();
    1368   Free((void **)&DistanceList, "molecule::MinimiseConstrainedPotential: **DistanceList");
    1369   Free((void **)&DistanceIterators, "molecule::MinimiseConstrainedPotential: *DistanceIterators");
    1370   return ConstrainedPotential(out, PermutationMap, startstep, endstep, constants, IsAngstroem);
    1371 };
    1372 
    1373 /** Evaluates the (distance-related part) of the constrained potential for the constrained forces.
    1374  * \param *out output stream for debugging
    1375  * \param startstep current MD step giving initial position between which and \a endstep we perform the constrained MD (as further steps are always concatenated)
    1376  * \param endstep step giving final position in constrained MD
    1377  * \param **PermutationMap mapping between the atom label of the initial and the final configuration
    1378  * \param *Force ForceMatrix containing force vectors from the external energy functional minimisation.
    1379  * \todo the constant for the constrained potential distance part is hard-coded independently of the hard-coded value in MinimiseConstrainedPotential()
    1380  */
    1381 void molecule::EvaluateConstrainedForces(ofstream *out, int startstep, int endstep, atom **PermutationMap, ForceMatrix *Force)
    1382 {
    1383   double constant = 10.;
    1384   atom *Walker = NULL, *Sprinter = NULL;
    1385  
    1386   /// evaluate forces (only the distance to target dependent part) with the final PermutationMap
    1387   *out << Verbose(1) << "Calculating forces and adding onto ForceMatrix ... " << endl;
    1388   Walker = start;
    1389   while (Walker->next != NULL) {
    1390     Walker = Walker->next;
    1391     Sprinter = PermutationMap[Walker->nr];
    1392     // set forces
    1393     for (int i=NDIM;i++;)
    1394       Force->Matrix[0][Walker->nr][5+i] += 2.*constant*sqrt(Trajectories[Walker].R.at(startstep).Distance(&Trajectories[Sprinter].R.at(endstep)));
    1395   } 
    1396   *out << Verbose(1) << "done." << endl;
    1397 };
    1398 
    1399 /** Performs a linear interpolation between two desired atomic configurations with a given number of steps.
    1400  * Note, step number is config::MaxOuterStep
    1401  * \param *out output stream for debugging
    1402  * \param startstep stating initial configuration in molecule::Trajectories
    1403  * \param endstep stating final configuration in molecule::Trajectories
    1404  * \param &config configuration structure
    1405  * \return true - success in writing step files, false - error writing files or only one step in molecule::Trajectories
    1406  */
    1407 bool molecule::LinearInterpolationBetweenConfiguration(ofstream *out, int startstep, int endstep, const char *prefix, config &configuration)
    1408 {
    1409   bool status = true;
    1410   int MaxSteps = configuration.MaxOuterStep;
    1411   MoleculeListClass *MoleculePerStep = new MoleculeListClass(MaxSteps+1, AtomCount);
    1412   // Get the Permutation Map by MinimiseConstrainedPotential
    1413   atom **PermutationMap = NULL;
    1414   atom *Walker = NULL, *Sprinter = NULL;
    1415   MinimiseConstrainedPotential(out, PermutationMap, startstep, endstep, configuration.GetIsAngstroem());
    1416 
    1417   // check whether we have sufficient space in Trajectories for each atom
    1418   Walker = start;
    1419   while (Walker->next != end) {
    1420     Walker = Walker->next;
    1421     if (Trajectories[Walker].R.size() <= (unsigned int)(MaxSteps)) {
    1422       //cout << "Increasing size for trajectory array of " << keyword << " to " << (MaxSteps+1) << "." << endl;
    1423       Trajectories[Walker].R.resize(MaxSteps+1);
    1424       Trajectories[Walker].U.resize(MaxSteps+1);
    1425       Trajectories[Walker].F.resize(MaxSteps+1);
    1426     }
    1427   }
    1428   // push endstep to last one
    1429   Walker = start;
    1430   while (Walker->next != end) { // remove the endstep (is now the very last one)
    1431     Walker = Walker->next;
    1432     for (int n=NDIM;n--;) {
    1433       Trajectories[Walker].R.at(MaxSteps).x[n] = Trajectories[Walker].R.at(endstep).x[n];
    1434       Trajectories[Walker].U.at(MaxSteps).x[n] = Trajectories[Walker].U.at(endstep).x[n];
    1435       Trajectories[Walker].F.at(MaxSteps).x[n] = Trajectories[Walker].F.at(endstep).x[n];
    1436     }
    1437   }
    1438   endstep = MaxSteps;
    1439  
    1440   // go through all steps and add the molecular configuration to the list and to the Trajectories of \a this molecule
    1441   *out << Verbose(1) << "Filling intermediate " << MaxSteps << " steps with MDSteps of " << MDSteps << "." << endl;
    1442   for (int step = 0; step <= MaxSteps; step++) {
    1443     MoleculePerStep->ListOfMolecules[step] = new molecule(elemente);
    1444     Walker = start;
    1445     while (Walker->next != end) {
    1446       Walker = Walker->next;
    1447       // add to molecule list
    1448       Sprinter = MoleculePerStep->ListOfMolecules[step]->AddCopyAtom(Walker);
    1449       for (int n=NDIM;n--;) {
    1450         Sprinter->x.x[n] = Trajectories[Walker].R.at(startstep).x[n] + (Trajectories[PermutationMap[Walker->nr]].R.at(endstep).x[n] - Trajectories[Walker].R.at(startstep).x[n])*((double)step/(double)MaxSteps);
    1451         // add to Trajectories
    1452         //*out << Verbose(3) << step << ">=" << MDSteps-1 << endl;
    1453         if (step < MaxSteps) {
    1454           Trajectories[Walker].R.at(step).x[n] = Trajectories[Walker].R.at(startstep).x[n] + (Trajectories[PermutationMap[Walker->nr]].R.at(endstep).x[n] - Trajectories[Walker].R.at(startstep).x[n])*((double)step/(double)MaxSteps);
    1455           Trajectories[Walker].U.at(step).x[n] = 0.;
    1456           Trajectories[Walker].F.at(step).x[n] = 0.;
    1457         }
    1458       }
    1459     }
    1460   }
    1461   MDSteps = MaxSteps+1;   // otherwise new Trajectories' points aren't stored on save&exit
    1462  
    1463   // store the list to single step files
    1464   int *SortIndex = (int *) Malloc(AtomCount*sizeof(int), "molecule::LinearInterpolationBetweenConfiguration: *SortIndex");
    1465   for (int i=AtomCount; i--; )
    1466     SortIndex[i] = i;
    1467   status = MoleculePerStep->OutputConfigForListOfFragments(out, "ConstrainedStep", &configuration, SortIndex, false, false);
    1468  
    1469   // free and return
    1470   Free((void **)&PermutationMap, "molecule::MinimiseConstrainedPotential: *PermutationMap");
    1471   delete(MoleculePerStep);
    1472   return status;
    1473 };
    1474 
    14751011/** Parses nuclear forces from file and performs Verlet integration.
    14761012 * Note that we assume the parsed forces to be in atomic units (hence, if coordinates are in angstroem, we
    14771013 * have to transform them).
    14781014 * This adds a new MD step to the config file.
    1479  * \param *out output stream for debugging
    14801015 * \param *file filename
    14811016 * \param delta_t time step width in atomic units
    14821017 * \param IsAngstroem whether coordinates are in angstroem (true) or bohrradius (false)
    1483  * \param DoConstrained whether we perform a constrained (>0, target step in molecule::trajectories) or unconstrained (0) molecular dynamics, \sa molecule::MinimiseConstrainedPotential()
    14841018 * \return true - file found and parsed, false - file not found or imparsable
    1485  * \todo This is not yet checked if it is correctly working with DoConstrained set to true.
    1486  */
    1487 bool molecule::VerletForceIntegration(ofstream *out, char *file, double delta_t, bool IsAngstroem, int DoConstrained)
     1019 */
     1020bool molecule::VerletForceIntegration(char *file, double delta_t, bool IsAngstroem)
    14881021{
    14891022  element *runner = elemente->start;
     
    14931026  string token;
    14941027  stringstream item;
    1495   double a, IonMass, Vector[NDIM], ConstrainedPotentialEnergy;
     1028  double a, IonMass;
    14961029  ForceMatrix Force;
     1030  Vector tmpvector;
    14971031
    14981032  CountElements();  // make sure ElementsInMolecule is up to date
    1499  
     1033
    15001034  // check file
    15011035  if (input == NULL) {
     
    15121046    }
    15131047    // correct Forces
    1514     for(int d=0;d<NDIM;d++)
    1515       Vector[d] = 0.;
    1516     for(int i=0;i<AtomCount;i++)
    1517       for(int d=0;d<NDIM;d++) {
    1518         Vector[d] += Force.Matrix[0][i][d+5];
    1519       }
    1520     for(int i=0;i<AtomCount;i++)
    1521       for(int d=0;d<NDIM;d++) {
    1522         Force.Matrix[0][i][d+5] -= Vector[d]/(double)AtomCount;
    1523       }
    1524     // solve a constrained potential if we are meant to
    1525     if (DoConstrained) {
    1526       // calculate forces and potential
    1527       atom **PermutationMap = NULL;
    1528       ConstrainedPotentialEnergy = MinimiseConstrainedPotential(out, PermutationMap, DoConstrained, 0, IsAngstroem);
    1529       EvaluateConstrainedForces(out, DoConstrained, 0, PermutationMap, &Force);
    1530       Free((void **)&PermutationMap, "molecule::MinimiseConstrainedPotential: *PermutationMap");
    1531     }
    1532    
     1048//    for(int d=0;d<NDIM;d++)
     1049//      tmpvector.x[d] = 0.;
     1050//    for(int i=0;i<AtomCount;i++)
     1051//      for(int d=0;d<NDIM;d++) {
     1052//        tmpvector.x[d] += Force.Matrix[0][i][d+5];
     1053//      }
     1054//    for(int i=0;i<AtomCount;i++)
     1055//      for(int d=0;d<NDIM;d++) {
     1056//        Force.Matrix[0][i][d+5] -= tmpvector.x[d]/(double)AtomCount;
     1057//      }
    15331058    // and perform Verlet integration for each atom with position, velocity and force vector
    15341059    runner = elemente->start;
     
    15451070            // check size of vectors
    15461071            if (Trajectories[walker].R.size() <= (unsigned int)(MDSteps)) {
    1547               //out << "Increasing size for trajectory array of " << *walker << " to " << (size+10) << "." << endl;
     1072              //cout << "Increasing size for trajectory array of " << *walker << " to " << (size+10) << "." << endl;
    15481073              Trajectories[walker].R.resize(MDSteps+10);
    15491074              Trajectories[walker].U.resize(MDSteps+10);
    15501075              Trajectories[walker].F.resize(MDSteps+10);
    15511076            }
    1552            
    1553             // Update R (and F)
     1077            // 1. calculate x(t+\delta t)
    15541078            for (int d=0; d<NDIM; d++) {
    1555               Trajectories[walker].F.at(MDSteps).x[d] = -Force.Matrix[0][AtomNo][d+5]*(IsAngstroem ? AtomicLengthToAngstroem : 1.);
     1079              Trajectories[walker].F.at(MDSteps).x[d] = -Force.Matrix[0][AtomNo][d+5];
    15561080              Trajectories[walker].R.at(MDSteps).x[d] = Trajectories[walker].R.at(MDSteps-1).x[d];
    15571081              Trajectories[walker].R.at(MDSteps).x[d] += delta_t*(Trajectories[walker].U.at(MDSteps-1).x[d]);
    1558               Trajectories[walker].R.at(MDSteps).x[d] += delta_t*a*(Trajectories[walker].F.at(MDSteps).x[d]);     // F = m * a and s = 0.5 * F/m * t^2 = F * a * t
     1082              Trajectories[walker].R.at(MDSteps).x[d] += 0.5*delta_t*delta_t*(Trajectories[walker].F.at(MDSteps-1).x[d])/IonMass;     // F = m * a and s = 0.5 * F/m * t^2 = F * a * t
    15591083            }
    1560             // Update U
     1084            // 2. Calculate v(t+\delta t)
    15611085            for (int d=0; d<NDIM; d++) {
    1562               Trajectories[walker].U.at(MDSteps).x[d] = Trajectories[walker].U.at(MDSteps-1).x[d]; 
    1563               Trajectories[walker].U.at(MDSteps).x[d] += a * (Trajectories[walker].F.at(MDSteps).x[d]+Trajectories[walker].F.at(MDSteps-1).x[d]);
     1086              Trajectories[walker].U.at(MDSteps).x[d] = Trajectories[walker].U.at(MDSteps-1).x[d];
     1087              Trajectories[walker].U.at(MDSteps).x[d] += 0.5*delta_t*(Trajectories[walker].F.at(MDSteps-1).x[d]+Trajectories[walker].F.at(MDSteps).x[d])/IonMass;
    15641088            }
    1565 //            out << "Integrated position&velocity of step " << (MDSteps) << ": (";
     1089//            cout << "Integrated position&velocity of step " << (MDSteps) << ": (";
    15661090//            for (int d=0;d<NDIM;d++)
    1567 //              out << Trajectories[walker].R.at(MDSteps).x[d] << " ";          // next step
    1568 //            out << ")\t(";
     1091//              cout << Trajectories[walker].R.at(MDSteps).x[d] << " ";          // next step
     1092//            cout << ")\t(";
    15691093//            for (int d=0;d<NDIM;d++)
    15701094//              cout << Trajectories[walker].U.at(MDSteps).x[d] << " ";          // next step
    1571 //            out << ")" << endl;
     1095//            cout << ")" << endl;
    15721096            // next atom
    15731097            AtomNo++;
     
    15781102  }
    15791103//  // correct velocities (rather momenta) so that center of mass remains motionless
    1580 //  for(int d=0;d<NDIM;d++)
    1581 //    Vector[d] = 0.;
     1104//  tmpvector.zero()
    15821105//  IonMass = 0.;
    15831106//  walker = start;
     
    15861109//    IonMass += walker->type->mass;  // sum up total mass
    15871110//    for(int d=0;d<NDIM;d++) {
    1588 //      Vector[d] += Trajectories[walker].U.at(MDSteps).x[d]*walker->type->mass;
     1111//      tmpvector.x[d] += Trajectories[walker].U.at(MDSteps).x[d]*walker->type->mass;
    15891112//    }
    15901113//  }
     
    15931116//    walker = walker->next;
    15941117//    for(int d=0;d<NDIM;d++) {
    1595 //      Trajectories[walker].U.at(MDSteps).x[d] -= Vector[d]*walker->type->mass/IonMass;
     1118//      Trajectories[walker].U.at(MDSteps).x[d] -= tmpvector.x[d]*walker->type->mass/IonMass;
    15961119//    }
    15971120//  }
    15981121  MDSteps++;
    15991122
    1600  
     1123
    16011124  // exit
    16021125  return true;
    16031126};
    16041127
    1605 /** Align all atoms in such a manner that given vector \a *n is along z axis. 
     1128/** Align all atoms in such a manner that given vector \a *n is along z axis.
    16061129 * \param n[] alignment vector.
    16071130 */
     
    16221145    ptr = ptr->next;
    16231146    tmp = ptr->x.x[0];
    1624     ptr->x.x[0] =  cos(alpha) * tmp + sin(alpha) * ptr->x.x[2]; 
     1147    ptr->x.x[0] =  cos(alpha) * tmp + sin(alpha) * ptr->x.x[2];
    16251148    ptr->x.x[2] = -sin(alpha) * tmp + cos(alpha) * ptr->x.x[2];
    16261149    for (int j=0;j<MDSteps;j++) {
    16271150      tmp = Trajectories[ptr].R.at(j).x[0];
    1628       Trajectories[ptr].R.at(j).x[0] =  cos(alpha) * tmp + sin(alpha) * Trajectories[ptr].R.at(j).x[2]; 
     1151      Trajectories[ptr].R.at(j).x[0] =  cos(alpha) * tmp + sin(alpha) * Trajectories[ptr].R.at(j).x[2];
    16291152      Trajectories[ptr].R.at(j).x[2] = -sin(alpha) * tmp + cos(alpha) * Trajectories[ptr].R.at(j).x[2];
    16301153    }
    1631   }     
     1154  }
    16321155  // rotate n vector
    16331156  tmp = n->x[0];
     
    16371160  n->Output((ofstream *)&cout);
    16381161  cout << endl;
    1639  
     1162
    16401163  // rotate on z-y plane
    16411164  ptr = start;
     
    16451168    ptr = ptr->next;
    16461169    tmp = ptr->x.x[1];
    1647     ptr->x.x[1] =  cos(alpha) * tmp + sin(alpha) * ptr->x.x[2]; 
     1170    ptr->x.x[1] =  cos(alpha) * tmp + sin(alpha) * ptr->x.x[2];
    16481171    ptr->x.x[2] = -sin(alpha) * tmp + cos(alpha) * ptr->x.x[2];
    16491172    for (int j=0;j<MDSteps;j++) {
    16501173      tmp = Trajectories[ptr].R.at(j).x[1];
    1651       Trajectories[ptr].R.at(j).x[1] =  cos(alpha) * tmp + sin(alpha) * Trajectories[ptr].R.at(j).x[2]; 
     1174      Trajectories[ptr].R.at(j).x[1] =  cos(alpha) * tmp + sin(alpha) * Trajectories[ptr].R.at(j).x[2];
    16521175      Trajectories[ptr].R.at(j).x[2] = -sin(alpha) * tmp + cos(alpha) * Trajectories[ptr].R.at(j).x[2];
    16531176    }
    1654   }     
     1177  }
    16551178  // rotate n vector (for consistency check)
    16561179  tmp = n->x[1];
    16571180  n->x[1] =  cos(alpha) * tmp +  sin(alpha) * n->x[2];
    16581181  n->x[2] = -sin(alpha) * tmp +  cos(alpha) * n->x[2];
    1659  
     1182
    16601183  cout << Verbose(1) << "alignment vector after second rotation: ";
    16611184  n->Output((ofstream *)&cout);
     
    16681191 * \return true - succeeded, false - atom not found in list
    16691192 */
    1670 bool molecule::RemoveAtom(atom *pointer) 
    1671 { 
     1193bool molecule::RemoveAtom(atom *pointer)
     1194{
    16721195  if (ElementsInMolecule[pointer->type->Z] != 0)  // this would indicate an error
    16731196    ElementsInMolecule[pointer->type->Z]--;  // decrease number of atom of this element
    16741197  else
    1675     cerr << "ERROR: Atom " << pointer->Name << " is of element " << pointer->type->Z << " but the entry in the table of the molecule is 0!" << endl; 
     1198    cerr << "ERROR: Atom " << pointer->Name << " is of element " << pointer->type->Z << " but the entry in the table of the molecule is 0!" << endl;
    16761199  if (ElementsInMolecule[pointer->type->Z] == 0)  // was last atom of this element?
    16771200    ElementCount--;
     
    16831206 * \return true - succeeded, false - atom not found in list
    16841207 */
    1685 bool molecule::CleanupMolecule() 
    1686 { 
    1687   return (cleanup(start,end) && cleanup(first,last)); 
     1208bool molecule::CleanupMolecule()
     1209{
     1210  return (cleanup(start,end) && cleanup(first,last));
    16881211};
    16891212
     
    16991222  } else {
    17001223    cout << Verbose(0) << "Atom not found in list." << endl;
    1701     return NULL; 
     1224    return NULL;
    17021225  }
    17031226};
     
    17481271  struct lsq_params *par = (struct lsq_params *)params;
    17491272  atom *ptr = par->mol->start;
    1750  
     1273
    17511274  // initialize vectors
    17521275  a.x[0] = gsl_vector_get(x,0);
     
    17781301{
    17791302    int np = 6;
    1780    
     1303
    17811304   const gsl_multimin_fminimizer_type *T =
    17821305     gsl_multimin_fminimizer_nmsimplex;
     
    17841307   gsl_vector *ss;
    17851308   gsl_multimin_function minex_func;
    1786  
     1309
    17871310   size_t iter = 0, i;
    17881311   int status;
    17891312   double size;
    1790  
     1313
    17911314   /* Initial vertex size vector */
    17921315   ss = gsl_vector_alloc (np);
    1793  
     1316
    17941317   /* Set all step sizes to 1 */
    17951318   gsl_vector_set_all (ss, 1.0);
    1796  
     1319
    17971320   /* Starting point */
    17981321   par->x = gsl_vector_alloc (np);
    17991322   par->mol = this;
    1800  
     1323
    18011324   gsl_vector_set (par->x, 0, 0.0);  // offset
    18021325   gsl_vector_set (par->x, 1, 0.0);
     
    18051328   gsl_vector_set (par->x, 4, 0.0);
    18061329   gsl_vector_set (par->x, 5, 1.0);
    1807  
     1330
    18081331   /* Initialize method and iterate */
    18091332   minex_func.f = &LeastSquareDistance;
    18101333   minex_func.n = np;
    18111334   minex_func.params = (void *)par;
    1812  
     1335
    18131336   s = gsl_multimin_fminimizer_alloc (T, np);
    18141337   gsl_multimin_fminimizer_set (s, &minex_func, par->x, ss);
    1815  
     1338
    18161339   do
    18171340     {
    18181341       iter++;
    18191342       status = gsl_multimin_fminimizer_iterate(s);
    1820  
     1343
    18211344       if (status)
    18221345         break;
    1823  
     1346
    18241347       size = gsl_multimin_fminimizer_size (s);
    18251348       status = gsl_multimin_test_size (size, 1e-2);
    1826  
     1349
    18271350       if (status == GSL_SUCCESS)
    18281351         {
    18291352           printf ("converged to minimum at\n");
    18301353         }
    1831  
     1354
    18321355       printf ("%5d ", (int)iter);
    18331356       for (i = 0; i < (size_t)np; i++)
     
    18381361     }
    18391362   while (status == GSL_CONTINUE && iter < 100);
    1840  
     1363
    18411364  for (i=0;i<(size_t)np;i++)
    18421365    gsl_vector_set(par->x, i, gsl_vector_get(s->x, i));
     
    18551378  int ElementNo, AtomNo;
    18561379  CountElements();
    1857  
     1380
    18581381  if (out == NULL) {
    18591382    return false;
     
    18901413  int ElementNo, AtomNo;
    18911414  CountElements();
    1892  
     1415
    18931416  if (out == NULL) {
    18941417    return false;
     
    19371460  atom *Walker = start;
    19381461  while (Walker->next != end) {
    1939     Walker = Walker->next; 
     1462    Walker = Walker->next;
    19401463#ifdef ADDHYDROGEN
    19411464    if (Walker->type->Z != 1) {   // regard only non-hydrogen
     
    19681491  int No = 0;
    19691492  time_t now;
    1970  
     1493
    19711494  now = time((time_t *)NULL);   // Get the system time and put it into 'now' as 'calender time'
    19721495  walker = start;
     
    19951518{
    19961519  atom *walker = NULL;
    1997   int No = 0;
     1520  int AtomNo = 0, ElementNo;
    19981521  time_t now;
    1999  
     1522  element *runner = NULL;
     1523
    20001524  now = time((time_t *)NULL);   // Get the system time and put it into 'now' as 'calender time'
    20011525  walker = start;
    20021526  while (walker->next != end) { // go through every atom and count
    20031527    walker = walker->next;
    2004     No++;
     1528    AtomNo++;
    20051529  }
    20061530  if (out != NULL) {
    2007     *out << No << "\n\tCreated by molecuilder on " << ctime(&now);
    2008     walker = start;
    2009     while (walker->next != end) { // go through every atom of this element
    2010       walker = walker->next;
    2011       walker->OutputXYZLine(out);
     1531    *out << AtomNo << "\n\tCreated by molecuilder on " << ctime(&now);
     1532    ElementNo = 0;
     1533    runner = elemente->start;
     1534    while (runner->next != elemente->end) { // go through every element
     1535                runner = runner->next;
     1536      if (ElementsInMolecule[runner->Z]) { // if this element got atoms
     1537        ElementNo++;
     1538        walker = start;
     1539        while (walker->next != end) { // go through every atom of this element
     1540          walker = walker->next;
     1541          if (walker->type == runner) { // if this atom fits to element
     1542            walker->OutputXYZLine(out);
     1543          }
     1544        }
     1545      }
    20121546    }
    20131547    return true;
     
    20401574              Walker->nr = i;   // update number in molecule (for easier referencing in FragmentMolecule lateron)
    20411575              if (Walker->type->Z != 1) // count non-hydrogen atoms whilst at it
    2042                 NoNonHydrogen++; 
     1576                NoNonHydrogen++;
    20431577              Free((void **)&Walker->Name, "molecule::CountAtoms: *walker->Name");
    20441578              Walker->Name = (char *) Malloc(sizeof(char)*6, "molecule::CountAtoms: *walker->Name");
     
    20481582            }
    20491583    } else
    2050         *out << Verbose(3) << "AtomCount is still " << AtomCount << ", thus counting nothing." << endl; 
     1584        *out << Verbose(3) << "AtomCount is still " << AtomCount << ", thus counting nothing." << endl;
    20511585  }
    20521586};
     
    20601594        ElementsInMolecule[i] = 0;
    20611595        ElementCount = 0;
    2062        
     1596
    20631597  atom *walker = start;
    20641598  while (walker->next != end) {
     
    20961630    Binder = Binder->next;
    20971631    if (Binder->Cyclic)
    2098       No++;   
     1632      No++;
    20991633  }
    21001634  delete(BackEdgeStack);
     
    21541688
    21551689/** Creates an adjacency list of the molecule.
     1690 * We obtain an outside file with the indices of atoms which are bondmembers.
     1691 */
     1692void molecule::CreateAdjacencyList2(ofstream *out, ifstream *input)
     1693{
     1694
     1695        // 1 We will parse bonds out of the dbond file created by tremolo.
     1696                        int atom1, atom2, temp;
     1697                        atom *Walker, *OtherWalker;
     1698
     1699                if (!input)
     1700                {
     1701                        cout << Verbose(1) << "Opening silica failed \n";
     1702                };
     1703
     1704                        *input >> ws >> atom1;
     1705                        *input >> ws >> atom2;
     1706                cout << Verbose(1) << "Scanning file\n";
     1707                while (!input->eof()) // Check whether we read everything already
     1708                {
     1709                                *input >> ws >> atom1;
     1710                                *input >> ws >> atom2;
     1711                        if(atom2<atom1) //Sort indices of atoms in order
     1712                        {
     1713                                temp=atom1;
     1714                                atom1=atom2;
     1715                                atom2=temp;
     1716                        };
     1717
     1718                        Walker=start;
     1719                        while(Walker-> nr != atom1) // Find atom corresponding to first index
     1720                        {
     1721                                Walker = Walker->next;
     1722                        };
     1723                        OtherWalker = Walker->next;
     1724                        while(OtherWalker->nr != atom2) // Find atom corresponding to second index
     1725                        {
     1726                                OtherWalker= OtherWalker->next;
     1727                        };
     1728                        AddBond(Walker, OtherWalker); //Add the bond between the two atoms with respective indices.
     1729                       
     1730                }
     1731
     1732                CreateListOfBondsPerAtom(out);
     1733
     1734};
     1735
     1736
     1737/** Creates an adjacency list of the molecule.
    21561738 * Generally, we use the CSD approach to bond recognition, that is the the distance
    21571739 * between two atoms A and B must be within [Rcov(A)+Rcov(B)-t,Rcov(A)+Rcov(B)+t] with
    2158  * a threshold t = 0.4 Angstroem. 
     1740 * a threshold t = 0.4 Angstroem.
    21591741 * To make it O(N log N) the function uses the linked-cell technique as follows:
    21601742 * The procedure is step-wise:
     
    21731755void molecule::CreateAdjacencyList(ofstream *out, double bonddistance, bool IsAngstroem)
    21741756{
     1757
    21751758  atom *Walker = NULL, *OtherWalker = NULL, *Candidate = NULL;
    21761759  int No, NoBonds, CandidateBondNo;
     
    21811764  Vector x;
    21821765  int FalseBondDegree = 0;
    2183  
     1766
    21841767  BondDistance = bonddistance; // * ((IsAngstroem) ? 1. : 1./AtomicLengthToAngstroem);
    21851768  *out << Verbose(0) << "Begin of CreateAdjacencyList." << endl;
     
    21881771    cleanup(first,last);
    21891772  }
    2190        
     1773
    21911774  // count atoms in molecule = dimension of matrix (also give each unique name and continuous numbering)
    21921775  CountAtoms(out);
     
    22071790    for (int i=NumberCells;i--;)
    22081791      CellList[i] = NULL;
    2209  
     1792
    22101793    // 2b. put all atoms into its corresponding list
    22111794    Walker = start;
     
    22281811      if (CellList[index] == NULL)  // allocate molecule if not done
    22291812        CellList[index] = new molecule(elemente);
    2230       OtherWalker = CellList[index]->AddCopyAtom(Walker); // add a copy of walker to this atom, father will be walker for later reference 
    2231       //*out << Verbose(1) << "Copy Atom is " << *OtherWalker << "." << endl; 
     1813      OtherWalker = CellList[index]->AddCopyAtom(Walker); // add a copy of walker to this atom, father will be walker for later reference
     1814      //*out << Verbose(1) << "Copy Atom is " << *OtherWalker << "." << endl;
    22321815    }
    22331816    //for (int i=0;i<NumberCells;i++)
    22341817      //*out << Verbose(1) << "Cell number " << i << ": " << CellList[i] << "." << endl;
    2235      
     1818
     1819
    22361820    // 3a. go through every cell
    22371821    for (N[0]=divisor[0];N[0]--;)
     
    22461830              Walker = Walker->next;
    22471831              //*out << Verbose(0) << "Current Atom is " << *Walker << "." << endl;
    2248               // 3c. check for possible bond between each atom in this and every one in the 27 cells 
     1832              // 3c. check for possible bond between each atom in this and every one in the 27 cells
    22491833              for (n[0]=-1;n[0]<=1;n[0]++)
    22501834                for (n[1]=-1;n[1]<=1;n[1]++)
     
    22781862          }
    22791863        }
     1864
     1865
     1866
    22801867    // 4. free the cell again
    22811868    for (int i=NumberCells;i--;)
     
    22841871      }
    22851872    Free((void **)&CellList, "molecule::CreateAdjacencyList - ** CellList");
    2286    
     1873
    22871874    // create the adjacency list per atom
    22881875    CreateListOfBondsPerAtom(out);
    2289                
     1876
    22901877    // correct Bond degree of each bond by checking both bond partners for a mismatch between valence and current sum of bond degrees,
    22911878    // iteratively increase the one first where the other bond partner has the fewest number of bonds (i.e. in general bonds oxygene
     
    23361923                        *out << Verbose(1) << "BondCount is " << BondCount << ", no bonds between any of the " << AtomCount << " atoms." << endl;
    23371924          *out << Verbose(1) << "I detected " << BondCount << " bonds in the molecule with distance " << bonddistance << ", " << FalseBondDegree << " bonds could not be corrected." << endl;
    2338                
     1925
    23391926          // output bonds for debugging (if bond chain list was correctly installed)
    23401927          *out << Verbose(1) << endl << "From contents of bond chain list:";
     
    23461933    *out << endl;
    23471934  } else
    2348         *out << Verbose(1) << "AtomCount is " << AtomCount << ", thus no bonds, no connections!." << endl; 
     1935        *out << Verbose(1) << "AtomCount is " << AtomCount << ", thus no bonds, no connections!." << endl;
    23491936  *out << Verbose(0) << "End of CreateAdjacencyList." << endl;
    23501937  Free((void **)&matrix, "molecule::CreateAdjacencyList: *matrix");
    2351 };
     1938
     1939};
     1940
     1941
    23521942
    23531943/** Performs a Depth-First search on this molecule.
     
    23701960  bond *Binder = NULL;
    23711961  bool BackStepping = false;
    2372  
     1962
    23731963  *out << Verbose(0) << "Begin of DepthFirstSearchAnalysis" << endl;
    2374  
     1964
    23751965  ResetAllBondsToUnused();
    23761966  ResetAllAtomNumbers();
     
    23851975    LeafWalker->Leaf = new molecule(elemente);
    23861976    LeafWalker->Leaf->AddCopyAtom(Root);
    2387    
     1977
    23881978    OldGraphNr = CurrentGraphNr;
    23891979    Walker = Root;
     
    23961986          AtomStack->Push(Walker);
    23971987          CurrentGraphNr++;
    2398         }     
     1988        }
    23991989        do { // (3) if Walker has no unused egdes, go to (5)
    24001990          BackStepping = false; // reset backstepping flag for (8)
     
    24302020          Binder = NULL;
    24312021      } while (1);  // (2)
    2432      
     2022
    24332023      // if we came from backstepping, yet there were no more unused bonds, we end up here with no Ancestor, because Walker is Root! Then we are finished!
    24342024      if ((Walker == Root) && (Binder == NULL))
    24352025        break;
    2436        
    2437       // (5) if Ancestor of Walker is ... 
     2026
     2027      // (5) if Ancestor of Walker is ...
    24382028      *out << Verbose(1) << "(5) Number of Walker[" << Walker->Name << "]'s Ancestor[" << Walker->Ancestor->Name << "] is " << Walker->Ancestor->GraphNr << "." << endl;
    24392029      if (Walker->Ancestor->GraphNr != Root->GraphNr) {
     
    24782068        } while (OtherAtom != Walker);
    24792069        ComponentNumber++;
    2480    
     2070
    24812071        // (11) Root is separation vertex,  set Walker to Root and go to (4)
    24822072        Walker = Root;
     
    24912081
    24922082    // From OldGraphNr to CurrentGraphNr ranges an disconnected subgraph
    2493     *out << Verbose(0) << "Disconnected subgraph ranges from " << OldGraphNr << " to " << CurrentGraphNr << "." << endl;   
     2083    *out << Verbose(0) << "Disconnected subgraph ranges from " << OldGraphNr << " to " << CurrentGraphNr << "." << endl;
    24942084    LeafWalker->Leaf->Output(out);
    24952085    *out << endl;
     
    24992089      //*out << Verbose(1) << "Current next subgraph root candidate is " << Root->Name << "." << endl;
    25002090      if (Root->GraphNr != -1) // if already discovered, step on
    2501         Root = Root->next; 
     2091        Root = Root->next;
    25022092    }
    25032093  }
     
    25212111    *out << " with Lowpoint " << Walker->LowpointNr << " and Graph Nr. " << Walker->GraphNr << "." << endl;
    25222112  }
    2523  
     2113
    25242114  *out << Verbose(1) << "Final graph info for each bond is:" << endl;
    25252115  Binder = first;
     
    25322122    *out << ((Binder->rightatom->SeparationVertex) ? "SP," : "") << "L" << Binder->rightatom->LowpointNr << " G" << Binder->rightatom->GraphNr << " Comp.";
    25332123    OutputComponentNumber(out, Binder->rightatom);
    2534     *out << ">." << endl; 
     2124    *out << ">." << endl;
    25352125    if (Binder->Cyclic) // cyclic ??
    25362126      *out << Verbose(3) << "Lowpoint at each side are equal: CYCLIC!" << endl;
     
    25472137 * the other our initial Walker - and do a Breadth First Search for the Root. We mark down each Predecessor and as soon as
    25482138 * we have found the Root via BFS, we may climb back the closed cycle via the Predecessors. Thereby we mark atoms and bonds
    2549  * as cyclic and print out the cycles. 
     2139 * as cyclic and print out the cycles.
    25502140 * \param *out output stream for debugging
    25512141 * \param *BackEdgeStack stack with all back edges found during DFS scan. Beware: This stack contains the bonds from the total molecule, not from the subgraph!
     
    25582148  int *ShortestPathList = (int *) Malloc(sizeof(int)*AtomCount, "molecule::CyclicStructureAnalysis: *ShortestPathList");
    25592149  enum Shading *ColorList = (enum Shading *) Malloc(sizeof(enum Shading)*AtomCount, "molecule::CyclicStructureAnalysis: *ColorList");
    2560   class StackClass<atom *> *BFSStack = new StackClass<atom *> (AtomCount);   // will hold the current ring 
     2150  class StackClass<atom *> *BFSStack = new StackClass<atom *> (AtomCount);   // will hold the current ring
    25612151  class StackClass<atom *> *TouchedStack = new StackClass<atom *> (AtomCount);   // contains all "touched" atoms (that need to be reset after BFS loop)
    25622152  atom *Walker = NULL, *OtherAtom = NULL, *Root = NULL;
     
    25702160    ColorList[i] = white;
    25712161  }
    2572  
     2162
    25732163  *out << Verbose(1) << "Back edge list - ";
    25742164  BackEdgeStack->Output(out);
    2575  
     2165
    25762166  *out << Verbose(1) << "Analysing cycles ... " << endl;
    25772167  NumCycles = 0;
     
    25792169    BackEdge = BackEdgeStack->PopFirst();
    25802170    // this is the target
    2581     Root = BackEdge->leftatom; 
     2171    Root = BackEdge->leftatom;
    25822172    // this is the source point
    2583     Walker = BackEdge->rightatom; 
     2173    Walker = BackEdge->rightatom;
    25842174    ShortestPathList[Walker->nr] = 0;
    25852175    BFSStack->ClearStack();  // start with empty BFS stack
     
    25952185        if (Binder != BackEdge) { // only walk along DFS spanning tree (otherwise we always find SP of one being backedge Binder)
    25962186          OtherAtom = Binder->GetOtherAtom(Walker);
    2597 #ifdef ADDHYDROGEN         
     2187#ifdef ADDHYDROGEN
    25982188          if (OtherAtom->type->Z != 1) {
    25992189#endif
     
    26042194              PredecessorList[OtherAtom->nr] = Walker;  // Walker is the predecessor
    26052195              ShortestPathList[OtherAtom->nr] = ShortestPathList[Walker->nr]+1;
    2606               *out << Verbose(2) << "Coloring OtherAtom " << OtherAtom->Name << " lightgray, its predecessor is " << Walker->Name << " and its Shortest Path is " << ShortestPathList[OtherAtom->nr] << " egde(s) long." << endl; 
     2196              *out << Verbose(2) << "Coloring OtherAtom " << OtherAtom->Name << " lightgray, its predecessor is " << Walker->Name << " and its Shortest Path is " << ShortestPathList[OtherAtom->nr] << " egde(s) long." << endl;
    26072197              //if (ShortestPathList[OtherAtom->nr] < MinimumRingSize[Walker->GetTrueFather()->nr]) { // Check for maximum distance
    26082198                *out << Verbose(3) << "Putting OtherAtom into queue." << endl;
     
    26142204            if (OtherAtom == Root)
    26152205              break;
    2616 #ifdef ADDHYDROGEN         
     2206#ifdef ADDHYDROGEN
    26172207          } else {
    26182208            *out << Verbose(2) << "Skipping hydrogen atom " << *OtherAtom << "." << endl;
     
    26522242      }
    26532243    } while ((!BFSStack->IsEmpty()) && (OtherAtom != Root) && (OtherAtom != NULL)); // || (ShortestPathList[OtherAtom->nr] < MinimumRingSize[Walker->GetTrueFather()->nr])));
    2654    
     2244
    26552245    if (OtherAtom == Root) {
    26562246      // now climb back the predecessor list and thus find the cycle members
     
    26802270      *out << Verbose(1) << "No ring containing " << *Root << " with length equal to or smaller than " << MinimumRingSize[Walker->GetTrueFather()->nr] << " found." << endl;
    26812271    }
    2682    
     2272
    26832273    // now clean the lists
    26842274    while (!TouchedStack->IsEmpty()){
     
    26902280  }
    26912281  if (MinRingSize != -1) {
    2692     // go over all atoms 
     2282    // go over all atoms
    26932283    Root = start;
    26942284    while(Root->next != end) {
    26952285      Root = Root->next;
    2696      
     2286
    26972287      if (MinimumRingSize[Root->GetTrueFather()->nr] == AtomCount) { // check whether MinimumRingSize is set, if not BFS to next where it is
    26982288        Walker = Root;
     
    27312321          }
    27322322          ColorList[Walker->nr] = black;
    2733           //*out << Verbose(1) << "Coloring Walker " << Walker->Name << " black." << endl; 
     2323          //*out << Verbose(1) << "Coloring Walker " << Walker->Name << " black." << endl;
    27342324        }
    2735    
     2325
    27362326        // now clean the lists
    27372327        while (!TouchedStack->IsEmpty()){
     
    27822372void molecule::OutputComponentNumber(ofstream *out, atom *vertex)
    27832373{
    2784   for(int i=0;i<NumberOfBondsPerAtom[vertex->nr];i++) 
     2374  for(int i=0;i<NumberOfBondsPerAtom[vertex->nr];i++)
    27852375    *out << vertex->ComponentNr[i] << "  ";
    27862376};
     
    28602450{
    28612451  int c = 0;
    2862   int FragmentCount; 
     2452  int FragmentCount;
    28632453  // get maximum bond degree
    28642454  atom *Walker = start;
     
    28702460  *out << Verbose(1) << "Upper limit for this subgraph is " << FragmentCount << " for " << NoNonHydrogen << " non-H atoms with maximum bond degree of " << c << "." << endl;
    28712461  return FragmentCount;
    2872 }; 
     2462};
    28732463
    28742464/** Scans a single line for number and puts them into \a KeySet.
    28752465 * \param *out output stream for debugging
    28762466 * \param *buffer buffer to scan
    2877  * \param &CurrentSet filled KeySet on return 
     2467 * \param &CurrentSet filled KeySet on return
    28782468 * \return true - at least one valid atom id parsed, false - CurrentSet is empty
    28792469 */
     
    28832473  int AtomNr;
    28842474  int status = 0;
    2885  
     2475
    28862476  line.str(buffer);
    28872477  while (!line.eof()) {
     
    29192509  double TEFactor;
    29202510  char *filename = (char *) Malloc(sizeof(char)*MAXSTRINGSIZE, "molecule::ParseKeySetFile - filename");
    2921  
     2511
    29222512  if (FragmentList == NULL) { // check list pointer
    29232513    FragmentList = new Graph;
    29242514  }
    2925  
     2515
    29262516  // 1st pass: open file and read
    29272517  *out << Verbose(1) << "Parsing the KeySet file ... " << endl;
     
    29522542    status = false;
    29532543  }
    2954  
     2544
    29552545  // 2nd pass: open TEFactors file and read
    29562546  *out << Verbose(1) << "Parsing the TEFactors file ... " << endl;
     
    29642554        InputFile >> TEFactor;
    29652555        (*runner).second.second = TEFactor;
    2966         *out << Verbose(2) << "Setting " << ++NumberOfFragments << " fragment's TEFactor to " << (*runner).second.second << "." << endl; 
     2556        *out << Verbose(2) << "Setting " << ++NumberOfFragments << " fragment's TEFactor to " << (*runner).second.second << "." << endl;
    29672557      } else {
    29682558        status = false;
     
    30052595  if(output != NULL) {
    30062596    for(Graph::iterator runner = KeySetList.begin(); runner != KeySetList.end(); runner++) {
    3007       for (KeySet::iterator sprinter = (*runner).first.begin();sprinter != (*runner).first.end(); sprinter++) { 
     2597      for (KeySet::iterator sprinter = (*runner).first.begin();sprinter != (*runner).first.end(); sprinter++) {
    30082598        if (sprinter != (*runner).first.begin())
    30092599          output << "\t";
     
    30712661    status = false;
    30722662  }
    3073  
     2663
    30742664  return status;
    30752665};
     
    30802670 * \param **ListOfAtoms allocated (molecule::AtomCount) and filled lookup table for ids (Atom::nr) to *Atom
    30812671 * \return true - structure is equal, false - not equivalence
    3082  */ 
     2672 */
    30832673bool molecule::CheckAdjacencyFileAgainstMolecule(ofstream *out, char *path, atom **ListOfAtoms)
    30842674{
     
    30872677  bool status = true;
    30882678  char *buffer = (char *) Malloc(sizeof(char)*MAXSTRINGSIZE, "molecule::CheckAdjacencyFileAgainstMolecule: *buffer");
    3089  
     2679
    30902680  filename << path << "/" << FRAGMENTPREFIX << ADJACENCYFILE;
    30912681  File.open(filename.str().c_str(), ios::out);
     
    31462736  *out << endl;
    31472737  Free((void **)&buffer, "molecule::CheckAdjacencyFileAgainstMolecule: *buffer");
    3148  
     2738
    31492739  return status;
    31502740};
     
    31682758  for(int i=AtomCount;i--;)
    31692759    AtomMask[i] = false;
    3170  
     2760
    31712761  if (Order < 0) { // adaptive increase of BondOrder per site
    31722762    if (AtomMask[AtomCount] == true)  // break after one step
     
    32082798          line >> ws >> Value; // skip time entry
    32092799          line >> ws >> Value;
    3210           No -= 1;  // indices start at 1 in file, not 0 
     2800          No -= 1;  // indices start at 1 in file, not 0
    32112801          //*out << Verbose(2) << " - yields (" << No << "," << Value << ", " << FragOrder << ")" << endl;
    32122802
     
    32172807            // as the smallest number in each set has always been the root (we use global id to keep the doubles away), seek smallest and insert into AtomMask
    32182808            pair <map<int, pair<double,int> >::iterator, bool> InsertedElement = AdaptiveCriteriaList.insert( make_pair(*((*marker).second.begin()), pair<double,int>( fabs(Value), FragOrder) ));
    3219             map<int, pair<double,int> >::iterator PresentItem = InsertedElement.first; 
     2809            map<int, pair<double,int> >::iterator PresentItem = InsertedElement.first;
    32202810            if (!InsertedElement.second) { // this root is already present
    3221               if ((*PresentItem).second.second < FragOrder)  // if order there is lower, update entry with higher-order term 
    3222                 //if ((*PresentItem).second.first < (*runner).first)    // as higher-order terms are not always better, we skip this part (which would always include this site into adaptive increase) 
     2811              if ((*PresentItem).second.second < FragOrder)  // if order there is lower, update entry with higher-order term
     2812                //if ((*PresentItem).second.first < (*runner).first)    // as higher-order terms are not always better, we skip this part (which would always include this site into adaptive increase)
    32232813                {  // if value is smaller, update value and order
    32242814                (*PresentItem).second.first = fabs(Value);
     
    32582848        Walker = FindAtom(No);
    32592849        //if (Walker->AdaptiveOrder < MinimumRingSize[Walker->nr]) {
    3260           *out << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", setting entry " << No << " of Atom mask to true." << endl; 
     2850          *out << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", setting entry " << No << " of Atom mask to true." << endl;
    32612851          AtomMask[No] = true;
    32622852          status = true;
    32632853        //} else
    3264           //*out << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", however MinimumRingSize of " << MinimumRingSize[Walker->nr] << " does not allow further adaptive increase." << endl; 
     2854          //*out << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", however MinimumRingSize of " << MinimumRingSize[Walker->nr] << " does not allow further adaptive increase." << endl;
    32652855      }
    32662856      // close and done
     
    32962886    if ((Order == 0) && (AtomMask[AtomCount] == false))  // single stepping, just check
    32972887      status = true;
    3298      
     2888
    32992889    if (!status) {
    33002890      if (Order == 0)
     
    33042894    }
    33052895  }
    3306  
     2896
    33072897  // print atom mask for debugging
    33082898  *out << "              ";
     
    33132903    *out << (AtomMask[i] ? "t" : "f");
    33142904  *out << endl;
    3315  
     2905
    33162906  return status;
    33172907};
     
    33272917  int AtomNo = 0;
    33282918  atom *Walker = NULL;
    3329  
     2919
    33302920  if (SortIndex != NULL) {
    33312921    *out << Verbose(1) << "SortIndex is " << SortIndex << " and not NULL as expected." << endl;
     
    33852975  atom **ListOfAtoms = NULL;
    33862976  atom ***ListOfLocalAtoms = NULL;
    3387   bool *AtomMask = NULL; 
    3388  
     2977  bool *AtomMask = NULL;
     2978
    33892979  *out << endl;
    33902980#ifdef ADDHYDROGEN
     
    33952985
    33962986  // ++++++++++++++++++++++++++++ INITIAL STUFF: Bond structure analysis, file parsing, ... ++++++++++++++++++++++++++++++++++++++++++
    3397  
     2987
    33982988  // ===== 1. Check whether bond structure is same as stored in files ====
    3399  
     2989
    34002990  // fill the adjacency list
    34012991  CreateListOfBondsPerAtom(out);
     
    34032993  // create lookup table for Atom::nr
    34042994  FragmentationToDo = FragmentationToDo && CreateFatherLookupTable(out, start, end, ListOfAtoms, AtomCount);
    3405  
     2995
    34062996  // === compare it with adjacency file ===
    3407   FragmentationToDo = FragmentationToDo && CheckAdjacencyFileAgainstMolecule(out, configuration->configpath, ListOfAtoms); 
     2997  FragmentationToDo = FragmentationToDo && CheckAdjacencyFileAgainstMolecule(out, configuration->configpath, ListOfAtoms);
    34082998  Free((void **)&ListOfAtoms, "molecule::FragmentMolecule - **ListOfAtoms");
    34092999
     
    34193009  while (MolecularWalker->next != NULL) {
    34203010    MolecularWalker = MolecularWalker->next;
    3421     *out << Verbose(0) << "Analysing the cycles of subgraph " << MolecularWalker->Leaf << " with nr. " << FragmentCounter << "." << endl;
    34223011    LocalBackEdgeStack = new StackClass<bond *> (MolecularWalker->Leaf->BondCount);
    34233012//    // check the list of local atoms for debugging
     
    34283017//      else
    34293018//        *out << "\t" << ListOfLocalAtoms[FragmentCounter][i]->Name;
     3019    *out << Verbose(0) << "Gathering local back edges for subgraph " << MolecularWalker->Leaf << " with nr. " << FragmentCounter << "." << endl;
    34303020    MolecularWalker->Leaf->PickLocalBackEdges(out, ListOfLocalAtoms[FragmentCounter++], BackEdgeStack, LocalBackEdgeStack);
     3021    *out << Verbose(0) << "Analysing the cycles of subgraph " << MolecularWalker->Leaf << " with nr. " << FragmentCounter << "." << endl;
    34313022    MolecularWalker->Leaf->CyclicStructureAnalysis(out, LocalBackEdgeStack, MinimumRingSize);
     3023    *out << Verbose(0) << "Done with Analysing the cycles of subgraph " << MolecularWalker->Leaf << " with nr. " << FragmentCounter << "." << endl;
    34323024    delete(LocalBackEdgeStack);
    34333025  }
    3434  
     3026
    34353027  // ===== 3. if structure still valid, parse key set file and others =====
    34363028  FragmentationToDo = FragmentationToDo && ParseKeySetFile(out, configuration->configpath, ParsedFragmentList);
     
    34383030  // ===== 4. check globally whether there's something to do actually (first adaptivity check)
    34393031  FragmentationToDo = FragmentationToDo && ParseOrderAtSiteFromFile(out, configuration->configpath);
    3440  
    3441   // =================================== Begin of FRAGMENTATION =============================== 
    3442   // ===== 6a. assign each keyset to its respective subgraph ===== 
     3032
     3033  // =================================== Begin of FRAGMENTATION ===============================
     3034  // ===== 6a. assign each keyset to its respective subgraph =====
    34433035  Subgraphs->next->AssignKeySetsToFragment(out, this, ParsedFragmentList, ListOfLocalAtoms, FragmentList, (FragmentCounter = 0), true);
    34443036
     
    34513043    FragmentationToDo = FragmentationToDo || CheckOrder;
    34523044    AtomMask[AtomCount] = true;   // last plus one entry is used as marker that we have been through this loop once already in CheckOrderAtSite()
    3453     // ===== 6b. fill RootStack for each subgraph (second adaptivity check) ===== 
     3045    // ===== 6b. fill RootStack for each subgraph (second adaptivity check) =====
    34543046    Subgraphs->next->FillRootStackForSubgraphs(out, RootStack, AtomMask, (FragmentCounter = 0));
    34553047
     
    34603052      MolecularWalker = MolecularWalker->next;
    34613053      *out << Verbose(1) << "Fragmenting subgraph " << MolecularWalker << "." << endl;
    3462       // output ListOfBondsPerAtom for debugging
    3463       MolecularWalker->Leaf->OutputListOfBonds(out);
     3054      //MolecularWalker->Leaf->OutputListOfBonds(out);  // output ListOfBondsPerAtom for debugging
    34643055      if (MolecularWalker->Leaf->first->next != MolecularWalker->Leaf->last) {
    3465      
    34663056        // call BOSSANOVA method
    34673057        *out << Verbose(0) << endl << " ========== BOND ENERGY of subgraph " << FragmentCounter << " ========================= " << endl;
     
    34773067  delete(ParsedFragmentList);
    34783068  delete[](MinimumRingSize);
    3479  
     3069
    34803070
    34813071  // ==================================== End of FRAGMENTATION ============================================
     
    34833073  // ===== 8a. translate list into global numbers (i.e. ones that are valid in "this" molecule, not in MolecularWalker->Leaf)
    34843074  Subgraphs->next->TranslateIndicesToGlobalIDs(out, FragmentList, (FragmentCounter = 0), TotalNumberOfKeySets, TotalGraph);
    3485  
     3075
    34863076  // free subgraph memory again
    34873077  FragmentCounter = 0;
     
    35083098    }
    35093099    *out << k << "/" << BondFragments->NumberOfMolecules << " fragments generated from the keysets." << endl;
    3510    
     3100
    35113101    // ===== 9. Save fragments' configuration and keyset files et al to disk ===
    35123102    if (BondFragments->NumberOfMolecules != 0) {
    35133103      // create the SortIndex from BFS labels to order in the config file
    35143104      CreateMappingLabelsToConfigSequence(out, SortIndex);
    3515      
     3105
    35163106      *out << Verbose(1) << "Writing " << BondFragments->NumberOfMolecules << " possible bond fragmentation configs" << endl;
    3517       if (BondFragments->OutputConfigForListOfFragments(out, FRAGMENTPREFIX, configuration, SortIndex, true, true))
     3107      if (BondFragments->OutputConfigForListOfFragments(out, configuration, SortIndex))
    35183108        *out << Verbose(1) << "All configs written." << endl;
    35193109      else
    35203110        *out << Verbose(1) << "Some config writing failed." << endl;
    3521  
     3111
    35223112      // store force index reference file
    35233113      BondFragments->StoreForcesFile(out, configuration->configpath, SortIndex);
    3524      
    3525       // store keysets file 
     3114
     3115      // store keysets file
    35263116      StoreKeySetFile(out, TotalGraph, configuration->configpath);
    3527  
    3528       // store Adjacency file 
     3117
     3118      // store Adjacency file
    35293119      StoreAdjacencyToFile(out, configuration->configpath);
    3530  
     3120
    35313121      // store Hydrogen saturation correction file
    35323122      BondFragments->AddHydrogenCorrection(out, configuration->configpath);
    3533      
     3123
    35343124      // store adaptive orders into file
    35353125      StoreOrderAtSiteFile(out, configuration->configpath);
    3536      
     3126
    35373127      // restore orbital and Stop values
    35383128      CalculateOrbitals(*configuration);
    3539      
     3129
    35403130      // free memory for bond part
    35413131      *out << Verbose(1) << "Freeing bond memory" << endl;
    35423132      delete(FragmentList); // remove bond molecule from memory
    3543       Free((void **)&SortIndex, "molecule::FragmentMolecule: *SortIndex"); 
     3133      Free((void **)&SortIndex, "molecule::FragmentMolecule: *SortIndex");
    35443134    } else
    35453135      *out << Verbose(1) << "FragmentList is zero on return, splitting failed." << endl;
    3546   //} else 
     3136  //} else
    35473137  //  *out << Verbose(1) << "No fragments to store." << endl;
    35483138  *out << Verbose(0) << "End of bond fragmentation." << endl;
     
    35703160  atom *Walker = NULL, *OtherAtom = NULL;
    35713161  ReferenceStack->Push(Binder);
    3572  
     3162
    35733163  do {  // go through all bonds and push local ones
    35743164    Walker = ListOfLocalAtoms[Binder->leftatom->nr];  // get one atom in the reference molecule
    3575     if (Walker == NULL) // if this Walker exists in the subgraph ...
    3576       continue;
    3577     for(int i=0;i<NumberOfBondsPerAtom[Walker->nr];i++) {    // go through the local list of bonds
    3578       OtherAtom = ListOfBondsPerAtom[Walker->nr][i]->GetOtherAtom(Walker);
    3579       if (OtherAtom == ListOfLocalAtoms[Binder->rightatom->nr]) { // found the bond
    3580         LocalStack->Push(ListOfBondsPerAtom[Walker->nr][i]);
    3581         break;
    3582       }
    3583     }
     3165    if (Walker != NULL) // if this Walker exists in the subgraph ...
     3166        for(int i=0;i<NumberOfBondsPerAtom[Walker->nr];i++) {    // go through the local list of bonds
     3167        OtherAtom = ListOfBondsPerAtom[Walker->nr][i]->GetOtherAtom(Walker);
     3168              if (OtherAtom == ListOfLocalAtoms[Binder->rightatom->nr]) { // found the bond
     3169              LocalStack->Push(ListOfBondsPerAtom[Walker->nr][i]);
     3170                                        *out << Verbose(3) << "Found local edge " << *(ListOfBondsPerAtom[Walker->nr][i]) << "." << endl;
     3171                break;
     3172            }
     3173        }
    35843174    Binder = ReferenceStack->PopFirst();  // loop the stack for next item
     3175                *out << Verbose(3) << "Current candidate edge " << Binder << "." << endl;
    35853176    ReferenceStack->Push(Binder);
    35863177  } while (FirstBond != Binder);
    3587  
     3178
    35883179  return status;
    35893180};
     
    36613252      Walker->AdaptiveOrder = OrderArray[Walker->nr];
    36623253      Walker->MaxOrder = MaxArray[Walker->nr];
    3663       *out << Verbose(2) << *Walker << " gets order " << (int)Walker->AdaptiveOrder << " and is " << (!Walker->MaxOrder ? "not " : " ") << "maxed." << endl; 
     3254      *out << Verbose(2) << *Walker << " gets order " << (int)Walker->AdaptiveOrder << " and is " << (!Walker->MaxOrder ? "not " : " ") << "maxed." << endl;
    36643255    }
    36653256    file.close();
     
    36723263  Free((void **)&OrderArray, "molecule::ParseOrderAtSiteFromFile - *OrderArray");
    36733264  Free((void **)&MaxArray, "molecule::ParseOrderAtSiteFromFile - *MaxArray");
    3674  
     3265
    36753266  *out << Verbose(1) << "End of ParseOrderAtSiteFromFile" << endl;
    36763267  return status;
     
    37303321  Walker = start;
    37313322  while (Walker->next != end) {
    3732     Walker = Walker->next; 
     3323    Walker = Walker->next;
    37333324    *out << Verbose(4) << "Atom " << Walker->Name << "/" << Walker->nr << " with " << NumberOfBondsPerAtom[Walker->nr] << " bonds: ";
    37343325    TotalDegree = 0;
     
    37383329    }
    37393330    *out << " -- TotalDegree: " << TotalDegree << endl;
    3740   }     
     3331  }
    37413332  *out << Verbose(1) << "End of Creating ListOfBondsPerAtom." << endl << endl;
    37423333};
     
    37443335/** Adds atoms up to \a BondCount distance from \a *Root and notes them down in \a **AddedAtomList.
    37453336 * Gray vertices are always enqueued in an StackClass<atom *> FIFO queue, the rest is usual BFS with adding vertices found was
    3746  * white and putting into queue. 
     3337 * white and putting into queue.
    37473338 * \param *out output stream for debugging
    37483339 * \param *Mol Molecule class to add atoms to
     
    37533344 * \param BondOrder maximum distance for vertices to add
    37543345 * \param IsAngstroem lengths are in angstroem or bohrradii
    3755  */ 
     3346 */
    37563347void molecule::BreadthFirstSearchAdd(ofstream *out, molecule *Mol, atom **&AddedAtomList, bond **&AddedBondList, atom *Root, bond *Bond, int BondOrder, bool IsAngstroem)
    37573348{
     
    37793370  }
    37803371  ShortestPathList[Root->nr] = 0;
    3781  
     3372
    37823373  // and go on ... Queue always contains all lightgray vertices
    37833374  while (!AtomStack->IsEmpty()) {
     
    37873378    // followed by n+1 till top of stack.
    37883379    Walker = AtomStack->PopFirst(); // pop oldest added
    3789     *out << Verbose(1) << "Current Walker is: " << Walker->Name << ", and has " << NumberOfBondsPerAtom[Walker->nr] << " bonds." << endl; 
     3380    *out << Verbose(1) << "Current Walker is: " << Walker->Name << ", and has " << NumberOfBondsPerAtom[Walker->nr] << " bonds." << endl;
    37903381    for(int i=0;i<NumberOfBondsPerAtom[Walker->nr];i++) {
    37913382      Binder = ListOfBondsPerAtom[Walker->nr][i];
     
    37943385        *out << Verbose(2) << "Current OtherAtom is: " << OtherAtom->Name << " for bond " << *Binder << "." << endl;
    37953386        if (ColorList[OtherAtom->nr] == white) {
    3796           if (Binder != Bond) // let other atom white if it's via Root bond. In case it's cyclic it has to be reached again (yet Root is from OtherAtom already black, thus no problem) 
     3387          if (Binder != Bond) // let other atom white if it's via Root bond. In case it's cyclic it has to be reached again (yet Root is from OtherAtom already black, thus no problem)
    37973388            ColorList[OtherAtom->nr] = lightgray;
    37983389          PredecessorList[OtherAtom->nr] = Walker;  // Walker is the predecessor
    37993390          ShortestPathList[OtherAtom->nr] = ShortestPathList[Walker->nr]+1;
    3800           *out << Verbose(2) << "Coloring OtherAtom " << OtherAtom->Name << " " << ((ColorList[OtherAtom->nr] == white) ? "white" : "lightgray") << ", its predecessor is " << Walker->Name << " and its Shortest Path is " << ShortestPathList[OtherAtom->nr] << " egde(s) long." << endl; 
     3391          *out << Verbose(2) << "Coloring OtherAtom " << OtherAtom->Name << " " << ((ColorList[OtherAtom->nr] == white) ? "white" : "lightgray") << ", its predecessor is " << Walker->Name << " and its Shortest Path is " << ShortestPathList[OtherAtom->nr] << " egde(s) long." << endl;
    38013392          if ((((ShortestPathList[OtherAtom->nr] < BondOrder) && (Binder != Bond))) ) { // Check for maximum distance
    38023393            *out << Verbose(3);
     
    38363427              } else {
    38373428#ifdef ADDHYDROGEN
    3838                 Mol->AddHydrogenReplacementAtom(out, Binder, AddedAtomList[Walker->nr], Walker, OtherAtom, ListOfBondsPerAtom[Walker->nr], NumberOfBondsPerAtom[Walker->nr], IsAngstroem);
     3429                if (!Mol->AddHydrogenReplacementAtom(out, Binder, AddedAtomList[Walker->nr], Walker, OtherAtom, ListOfBondsPerAtom[Walker->nr], NumberOfBondsPerAtom[Walker->nr], IsAngstroem))
     3430                  exit(1);
    38393431#endif
    38403432              }
     
    38453437          // This has to be a cyclic bond, check whether it's present ...
    38463438          if (AddedBondList[Binder->nr] == NULL) {
    3847             if ((Binder != Bond) && (Binder->Cyclic) && (((ShortestPathList[Walker->nr]+1) < BondOrder))) { 
     3439            if ((Binder != Bond) && (Binder->Cyclic) && (((ShortestPathList[Walker->nr]+1) < BondOrder))) {
    38483440              AddedBondList[Binder->nr] = Mol->AddBond(AddedAtomList[Walker->nr], AddedAtomList[OtherAtom->nr], Binder->BondDegree);
    38493441              AddedBondList[Binder->nr]->Cyclic = Binder->Cyclic;
     
    38513443            } else { // if it's root bond it has to broken (otherwise we would not create the fragments)
    38523444#ifdef ADDHYDROGEN
    3853               Mol->AddHydrogenReplacementAtom(out, Binder, AddedAtomList[Walker->nr], Walker, OtherAtom, ListOfBondsPerAtom[Walker->nr], NumberOfBondsPerAtom[Walker->nr], IsAngstroem);
     3445              if(!Mol->AddHydrogenReplacementAtom(out, Binder, AddedAtomList[Walker->nr], Walker, OtherAtom, ListOfBondsPerAtom[Walker->nr], NumberOfBondsPerAtom[Walker->nr], IsAngstroem))
     3446                exit(1);
    38543447#endif
    38553448            }
     
    38593452    }
    38603453    ColorList[Walker->nr] = black;
    3861     *out << Verbose(1) << "Coloring Walker " << Walker->Name << " black." << endl; 
     3454    *out << Verbose(1) << "Coloring Walker " << Walker->Name << " black." << endl;
    38623455  }
    38633456  Free((void **)&PredecessorList, "molecule::BreadthFirstSearchAdd: **PredecessorList");
     
    38833476
    38843477  *out << Verbose(2) << "Begin of BuildInducedSubgraph." << endl;
    3885  
     3478
    38863479  // reset parent list
    38873480  *out << Verbose(3) << "Resetting ParentList." << endl;
    38883481  for (int i=Father->AtomCount;i--;)
    38893482    ParentList[i] = NULL;
    3890  
     3483
    38913484  // fill parent list with sons
    38923485  *out << Verbose(3) << "Filling Parent List." << endl;
     
    39293522 * \param *&Leaf KeySet to look through
    39303523 * \param *&ShortestPathList list of the shortest path to decide which atom to suggest as removal candidate in the end
    3931  * \param index of the atom suggested for removal 
     3524 * \param index of the atom suggested for removal
    39323525 */
    39333526int molecule::LookForRemovalCandidate(ofstream *&out, KeySet *&Leaf, int *&ShortestPathList)
     
    39353528  atom *Runner = NULL;
    39363529  int SP, Removal;
    3937  
     3530
    39383531  *out << Verbose(2) << "Looking for removal candidate." << endl;
    39393532  SP = -1; //0;  // not -1, so that Root is never removed
     
    39533546/** Stores a fragment from \a KeySet into \a molecule.
    39543547 * First creates the minimal set of atoms from the KeySet, then creates the bond structure from the complete
    3955  * molecule and adds missing hydrogen where bonds were cut. 
     3548 * molecule and adds missing hydrogen where bonds were cut.
    39563549 * \param *out output stream for debugging messages
    3957  * \param &Leaflet pointer to KeySet structure 
     3550 * \param &Leaflet pointer to KeySet structure
    39583551 * \param IsAngstroem whether we have Ansgtroem or bohrradius
    39593552 * \return pointer to constructed molecule
     
    39663559  bool LonelyFlag = false;
    39673560  int size;
    3968  
     3561
    39693562//  *out << Verbose(1) << "Begin of StoreFragmentFromKeyset." << endl;
    3970  
     3563
    39713564  Leaf->BondDistance = BondDistance;
    39723565  for(int i=NDIM*2;i--;)
    3973     Leaf->cell_size[i] = cell_size[i]; 
     3566    Leaf->cell_size[i] = cell_size[i];
    39743567
    39753568  // initialise SonList (indicates when we need to replace a bond with hydrogen instead)
     
    39843577    size++;
    39853578  }
    3986  
     3579
    39873580  // create the bonds between all: Make it an induced subgraph and add hydrogen
    39883581//  *out << Verbose(2) << "Creating bonds from father graph (i.e. induced subgraph creation)." << endl;
     
    39943587    if (SonList[FatherOfRunner->nr] != NULL)  {  // check if this, our father, is present in list
    39953588      // create all bonds
    3996       for (int i=0;i<NumberOfBondsPerAtom[FatherOfRunner->nr];i++) { // go through every bond of father 
     3589      for (int i=0;i<NumberOfBondsPerAtom[FatherOfRunner->nr];i++) { // go through every bond of father
    39973590        OtherFather = ListOfBondsPerAtom[FatherOfRunner->nr][i]->GetOtherAtom(FatherOfRunner);
    39983591//        *out << Verbose(2) << "Father " << *FatherOfRunner << " of son " << *SonList[FatherOfRunner->nr] << " is bound to " << *OtherFather;
    39993592        if (SonList[OtherFather->nr] != NULL) {
    4000 //          *out << ", whose son is " << *SonList[OtherFather->nr] << "." << endl; 
     3593//          *out << ", whose son is " << *SonList[OtherFather->nr] << "." << endl;
    40013594          if (OtherFather->nr > FatherOfRunner->nr) { // add bond (nr check is for adding only one of both variants: ab, ba)
    40023595//            *out << Verbose(3) << "Adding Bond: ";
    4003 //            *out << 
     3596//            *out <<
    40043597            Leaf->AddBond(Runner, SonList[OtherFather->nr], ListOfBondsPerAtom[FatherOfRunner->nr][i]->BondDegree);
    40053598//            *out << "." << endl;
    40063599            //NumBonds[Runner->nr]++;
    4007           } else { 
     3600          } else {
    40083601//            *out << Verbose(3) << "Not adding bond, labels in wrong order." << endl;
    40093602          }
    40103603          LonelyFlag = false;
    40113604        } else {
    4012 //          *out << ", who has no son in this fragment molecule." << endl; 
     3605//          *out << ", who has no son in this fragment molecule." << endl;
    40133606#ifdef ADDHYDROGEN
    40143607          //*out << Verbose(3) << "Adding Hydrogen to " << Runner->Name << " and a bond in between." << endl;
    4015           Leaf->AddHydrogenReplacementAtom(out, ListOfBondsPerAtom[FatherOfRunner->nr][i], Runner, FatherOfRunner, OtherFather, ListOfBondsPerAtom[FatherOfRunner->nr],NumberOfBondsPerAtom[FatherOfRunner->nr], IsAngstroem);
     3608          if(!Leaf->AddHydrogenReplacementAtom(out, ListOfBondsPerAtom[FatherOfRunner->nr][i], Runner, FatherOfRunner, OtherFather, ListOfBondsPerAtom[FatherOfRunner->nr],NumberOfBondsPerAtom[FatherOfRunner->nr], IsAngstroem))
     3609            exit(1);
    40163610#endif
    40173611          //NumBonds[Runner->nr] += ListOfBondsPerAtom[FatherOfRunner->nr][i]->BondDegree;
     
    40273621    while ((Runner->next != Leaf->end) && (Runner->next->type->Z == 1)) // skip added hydrogen
    40283622      Runner = Runner->next;
    4029 #endif       
     3623#endif
    40303624  }
    40313625  Leaf->CreateListOfBondsPerAtom(out);
     
    40603654  StackClass<atom *> *TouchedStack = new StackClass<atom *>((int)pow(4,Order)+2); // number of atoms reached from one with maximal 4 bonds plus Root itself
    40613655  StackClass<atom *> *SnakeStack = new StackClass<atom *>(Order+1); // equal to Order is not possible, as then the StackClass<atom *> cannot discern between full and empty stack!
    4062   MoleculeLeafClass *Leaflet = NULL, *TempLeaf = NULL; 
     3656  MoleculeLeafClass *Leaflet = NULL, *TempLeaf = NULL;
    40633657  MoleculeListClass *FragmentList = NULL;
    40643658  atom *Walker = NULL, *OtherAtom = NULL, *Root = NULL, *Removal = NULL;
     
    41103704                // clear snake stack
    41113705          SnakeStack->ClearStack();
    4112     //SnakeStack->TestImplementation(out, start->next);   
     3706    //SnakeStack->TestImplementation(out, start->next);
    41133707
    41143708    ///// INNER LOOP ////////////
     
    41313725        }
    41323726        if (ShortestPathList[Walker->nr] == -1) {
    4133           ShortestPathList[Walker->nr] = ShortestPathList[PredecessorList[Walker->nr]->nr]+1; 
     3727          ShortestPathList[Walker->nr] = ShortestPathList[PredecessorList[Walker->nr]->nr]+1;
    41343728          TouchedStack->Push(Walker); // mark every atom for lists cleanup later, whose shortest path has been changed
    41353729        }
     
    41693763                                OtherAtom = Binder->GetOtherAtom(Walker);
    41703764            if ((Labels[OtherAtom->nr] != -1) && (Labels[OtherAtom->nr] < Labels[Root->nr])) { // we don't step up to labels bigger than us
    4171               *out << "Label " << Labels[OtherAtom->nr] << " is smaller than Root's " << Labels[Root->nr] << "." << endl; 
     3765              *out << "Label " << Labels[OtherAtom->nr] << " is smaller than Root's " << Labels[Root->nr] << "." << endl;
    41723766              //ColorVertexList[OtherAtom->nr] = lightgray;    // mark as explored
    41733767            } else { // otherwise check its colour and element
    41743768                                if (
    41753769#ifdef ADDHYDROGEN
    4176               (OtherAtom->type->Z != 1) && 
     3770              (OtherAtom->type->Z != 1) &&
    41773771#endif
    41783772                    (ColorEdgeList[Binder->nr] == white)) {  // skip hydrogen, look for unexplored vertices
     
    41843778                //} else {
    41853779                //  *out << Verbose(3) << "Predecessor of " << OtherAtom->Name << " is " << PredecessorList[OtherAtom->nr]->Name << "." << endl;
    4186                 //} 
     3780                //}
    41873781                Walker = OtherAtom;
    41883782                break;
    41893783              } else {
    4190                 if (OtherAtom->type->Z == 1) 
     3784                if (OtherAtom->type->Z == 1)
    41913785                  *out << "Links to a hydrogen atom." << endl;
    4192                 else                 
     3786                else
    41933787                  *out << "Bond has not white but " << GetColor(ColorEdgeList[Binder->nr]) << " color." << endl;
    41943788              }
     
    42003794          *out << Verbose(3) << "We have gone too far, stepping back to " << Walker->Name << "." << endl;
    42013795        }
    4202                         if (Walker != OtherAtom) {      // if no white neighbours anymore, color it black 
     3796                        if (Walker != OtherAtom) {      // if no white neighbours anymore, color it black
    42033797          *out << Verbose(2) << "Coloring " << Walker->Name << " black." << endl;
    42043798                                ColorVertexList[Walker->nr] = black;
     
    42073801      }
    42083802        } while ((Walker != Root) || (ColorVertexList[Root->nr] != black));
    4209     *out << Verbose(2) << "Inner Looping is finished." << endl;   
     3803    *out << Verbose(2) << "Inner Looping is finished." << endl;
    42103804
    42113805    // if we reset all AtomCount atoms, we have again technically O(N^2) ...
     
    42233817    }
    42243818  }
    4225   *out << Verbose(1) << "Outer Looping over all vertices is done." << endl; 
     3819  *out << Verbose(1) << "Outer Looping over all vertices is done." << endl;
    42263820
    42273821  // copy together
    4228   *out << Verbose(1) << "Copying all fragments into MoleculeList structure." << endl; 
     3822  *out << Verbose(1) << "Copying all fragments into MoleculeList structure." << endl;
    42293823  FragmentList = new MoleculeListClass(FragmentCounter, AtomCount);
    42303824  RunningIndex = 0;
     
    42973891
    42983892  NumCombinations = 1 << SetDimension;
    4299  
     3893
    43003894  // Hier muessen von 1 bis NumberOfBondsPerAtom[Walker->nr] alle Kombinationen
    43013895  // von Endstuecken (aus den Bonds) hinzugefᅵᅵgt werden und fᅵᅵr verbleibende ANOVAOrder
    43023896  // rekursiv GraphCrawler in der nᅵᅵchsten Ebene aufgerufen werden
    4303  
     3897
    43043898  *out << Verbose(1+verbosity) << "Begin of SPFragmentGenerator." << endl;
    43053899  *out << Verbose(1+verbosity) << "We are " << RootDistance << " away from Root, which is " << *FragmentSearch->Root << ", SubOrder is " << SubOrder << ", SetDimension is " << SetDimension << " and this means " <<  NumCombinations-1 << " combination(s)." << endl;
    43063900
    4307   // initialised touched list (stores added atoms on this level) 
     3901  // initialised touched list (stores added atoms on this level)
    43083902  *out << Verbose(1+verbosity) << "Clearing touched list." << endl;
    43093903  for (TouchedIndex=SubOrder+1;TouchedIndex--;)  // empty touched list
    43103904    TouchedList[TouchedIndex] = -1;
    43113905  TouchedIndex = 0;
    4312  
     3906
    43133907  // create every possible combination of the endpieces
    43143908  *out << Verbose(1+verbosity) << "Going through all combinations of the power set." << endl;
     
    43183912    for (int j=SetDimension;j--;)
    43193913      bits += (i & (1 << j)) >> j;
    4320      
     3914
    43213915    *out << Verbose(1+verbosity) << "Current set is " << Binary(i | (1 << SetDimension)) << ", number of bits is " << bits << "." << endl;
    43223916    if (bits <= SubOrder) { // if not greater than additional atoms allowed on stack, continue
     
    43263920        bit = ((i & (1 << j)) != 0);  // mask the bit for the j-th bond
    43273921        if (bit) {  // if bit is set, we add this bond partner
    4328                 OtherWalker = BondsSet[j]->rightatom;   // rightatom is always the one more distant, i.e. the one to add 
     3922                OtherWalker = BondsSet[j]->rightatom;   // rightatom is always the one more distant, i.e. the one to add
    43293923          //*out << Verbose(1+verbosity) << "Current Bond is " << ListOfBondsPerAtom[Walker->nr][i] << ", checking on " << *OtherWalker << "." << endl;
    43303924          *out << Verbose(2+verbosity) << "Adding " << *OtherWalker << " with nr " << OtherWalker->nr << "." << endl;
    4331           TestKeySetInsert = FragmentSearch->FragmentSet->insert(OtherWalker->nr); 
     3925          TestKeySetInsert = FragmentSearch->FragmentSet->insert(OtherWalker->nr);
    43323926          if (TestKeySetInsert.second) {
    43333927            TouchedList[TouchedIndex++] = OtherWalker->nr;  // note as added
     
    43423936        }
    43433937      }
    4344      
    4345       SpaceLeft = SubOrder - Added ;// SubOrder - bits; // due to item's maybe being already present, this does not work anymore 
     3938
     3939      SpaceLeft = SubOrder - Added ;// SubOrder - bits; // due to item's maybe being already present, this does not work anymore
    43463940      if (SpaceLeft > 0) {
    43473941        *out << Verbose(1+verbosity) << "There's still some space left on stack: " << SpaceLeft << "." << endl;
     
    43713965          }
    43723966          *out << Verbose(2+verbosity) << "Calling subset generator " << SP << " away from root " << *FragmentSearch->Root << " with sub set dimension " << SubSetDimension << "." << endl;
    4373           SPFragmentGenerator(out, FragmentSearch, SP, BondsList, SubSetDimension, SubOrder-bits); 
     3967          SPFragmentGenerator(out, FragmentSearch, SP, BondsList, SubSetDimension, SubOrder-bits);
    43743968          Free((void **)&BondsList, "molecule::SPFragmentGenerator: **BondsList");
    43753969        }
     
    43803974        *out << Verbose(2) << "Found a new fragment[" << FragmentSearch->FragmentCounter << "], local nr.s are: ";
    43813975        for(KeySet::iterator runner = FragmentSearch->FragmentSet->begin(); runner != FragmentSearch->FragmentSet->end(); runner++)
    4382           *out << (*runner) << " "; 
     3976          *out << (*runner) << " ";
    43833977        *out << endl;
    43843978        //if (!CheckForConnectedSubgraph(out, FragmentSearch->FragmentSet))
     
    43883982        //Removal = StoreFragmentFromStack(out, FragmentSearch->Root, FragmentSearch->Leaflet, FragmentSearch->FragmentStack, FragmentSearch->ShortestPathList, &FragmentSearch->FragmentCounter, FragmentSearch->configuration);
    43893983      }
    4390      
     3984
    43913985      // --3-- remove all added items in this level from snake stack
    43923986      *out << Verbose(1+verbosity) << "Removing all items that were added on this SP level " << RootDistance << "." << endl;
     
    43993993      *out << Verbose(2) << "Remaining local nr.s on snake stack are: ";
    44003994      for(KeySet::iterator runner = FragmentSearch->FragmentSet->begin(); runner != FragmentSearch->FragmentSet->end(); runner++)
    4401         *out << (*runner) << " "; 
     3995        *out << (*runner) << " ";
    44023996      *out << endl;
    44033997      TouchedIndex = 0; // set Index to 0 for list of atoms added on this level
     
    44064000    }
    44074001  }
    4408   Free((void **)&TouchedList, "molecule::SPFragmentGenerator: *TouchedList"); 
     4002  Free((void **)&TouchedList, "molecule::SPFragmentGenerator: *TouchedList");
    44094003  *out << Verbose(1+verbosity) << "End of SPFragmentGenerator, " << RootDistance << " away from Root " << *FragmentSearch->Root << " and SubOrder is " << SubOrder << "." << endl;
    44104004};
     
    44154009 * \return true - connected, false - disconnected
    44164010 * \note this is O(n^2) for it's just a bug checker not meant for permanent use!
    4417  */ 
     4011 */
    44184012bool molecule::CheckForConnectedSubgraph(ofstream *out, KeySet *Fragment)
    44194013{
     
    44214015  bool BondStatus = false;
    44224016  int size;
    4423  
     4017
    44244018  *out << Verbose(1) << "Begin of CheckForConnectedSubgraph" << endl;
    44254019  *out << Verbose(2) << "Disconnected atom: ";
    4426  
     4020
    44274021  // count number of atoms in graph
    44284022  size = 0;
     
    44704064 * \param *out output stream for debugging
    44714065 * \param Order bond order (limits BFS exploration and "number of digits" in power set generation
    4472  * \param FragmentSearch UniqueFragments structure containing TEFactor, root atom and so on 
     4066 * \param FragmentSearch UniqueFragments structure containing TEFactor, root atom and so on
    44734067 * \param RestrictedKeySet Restricted vertex set to use in context of molecule
    44744068 * \return number of inserted fragments
    44754069 * \note ShortestPathList in FragmentSearch structure is probably due to NumberOfAtomsSPLevel and SP not needed anymore
    44764070 */
    4477 int molecule::PowerSetGenerator(ofstream *out, int Order, struct UniqueFragments &FragmentSearch, KeySet RestrictedKeySet) 
     4071int molecule::PowerSetGenerator(ofstream *out, int Order, struct UniqueFragments &FragmentSearch, KeySet RestrictedKeySet)
    44784072{
    44794073  int SP, AtomKeyNr;
     
    44964090    FragmentSearch.BondsPerSPCount[i] = 0;
    44974091  FragmentSearch.BondsPerSPCount[0] = 1;
    4498   Binder = new bond(FragmentSearch.Root, FragmentSearch.Root); 
     4092  Binder = new bond(FragmentSearch.Root, FragmentSearch.Root);
    44994093  add(Binder, FragmentSearch.BondsPerSPList[1]);
    4500  
     4094
    45014095  // do a BFS search to fill the SP lists and label the found vertices
    45024096  // Actually, we should construct a spanning tree vom the root atom and select all edges therefrom and put them into
    45034097  // according shortest path lists. However, we don't. Rather we fill these lists right away, as they do form a spanning
    45044098  // tree already sorted into various SP levels. That's why we just do loops over the depth (CurrentSP) and breadth
    4505   // (EdgeinSPLevel) of this tree ... 
     4099  // (EdgeinSPLevel) of this tree ...
    45064100  // In another picture, the bonds always contain a direction by rightatom being the one more distant from root and hence
    45074101  // naturally leftatom forming its predecessor, preventing the BFS"seeker" from continuing in the wrong direction.
     
    45564150    }
    45574151  }
    4558  
     4152
    45594153  // outputting all list for debugging
    45604154  *out << Verbose(0) << "Printing all found lists." << endl;
     
    45654159      Binder = Binder->next;
    45664160      *out << Verbose(2) << *Binder << endl;
    4567     } 
    4568   }
    4569  
     4161    }
     4162  }
     4163
    45704164  // creating fragments with the found edge sets  (may be done in reverse order, faster)
    45714165  SP = -1;  // the Root <-> Root edge must be subtracted!
     
    45744168    while (Binder->next != FragmentSearch.BondsPerSPList[2*i+1]) {
    45754169      Binder = Binder->next;
    4576       SP ++; 
     4170      SP ++;
    45774171    }
    45784172  }
     
    45814175    // start with root (push on fragment stack)
    45824176    *out << Verbose(0) << "Starting fragment generation with " << *FragmentSearch.Root << ", local nr is " << FragmentSearch.Root->nr << "." << endl;
    4583     FragmentSearch.FragmentSet->clear(); 
     4177    FragmentSearch.FragmentSet->clear();
    45844178    *out << Verbose(0) << "Preparing subset for this root and calling generator." << endl;
    45854179    // prepare the subset and call the generator
    45864180    BondsList = (bond **) Malloc(sizeof(bond *)*FragmentSearch.BondsPerSPCount[0], "molecule::PowerSetGenerator: **BondsList");
    45874181    BondsList[0] = FragmentSearch.BondsPerSPList[0]->next;  // on SP level 0 there's only the root bond
    4588    
     4182
    45894183    SPFragmentGenerator(out, &FragmentSearch, 0, BondsList, FragmentSearch.BondsPerSPCount[0], Order);
    4590    
     4184
    45914185    Free((void **)&BondsList, "molecule::PowerSetGenerator: **BondsList");
    45924186  } else {
     
    45974191  // remove root from stack
    45984192  *out << Verbose(0) << "Removing root again from stack." << endl;
    4599   FragmentSearch.FragmentSet->erase(FragmentSearch.Root->nr);   
     4193  FragmentSearch.FragmentSet->erase(FragmentSearch.Root->nr);
    46004194
    46014195  // free'ing the bonds lists
     
    46164210  }
    46174211
    4618   // return list 
     4212  // return list
    46194213  *out << Verbose(0) << "End of PowerSetGenerator." << endl;
    46204214  return (FragmentSearch.FragmentCounter - Counter);
     
    46474241    // remove bonds that are beyond bonddistance
    46484242    for(int i=NDIM;i--;)
    4649       Translationvector.x[i] = 0.; 
     4243      Translationvector.x[i] = 0.;
    46504244    // scan all bonds
    46514245    Binder = first;
     
    46944288        }
    46954289      }
    4696       // re-add bond   
     4290      // re-add bond
    46974291      link(Binder, OtherBinder);
    46984292    } else {
     
    47484342        IteratorB++;
    47494343      } // end of while loop
    4750     }// end of check in case of equal sizes 
     4344    }// end of check in case of equal sizes
    47514345  }
    47524346  return false; // if we reach this point, they are equal
     
    47924386 * \param graph1 first (dest) graph
    47934387 * \param graph2 second (source) graph
    4794  * \param *counter keyset counter that gets increased 
     4388 * \param *counter keyset counter that gets increased
    47954389 */
    47964390inline void InsertGraphIntoGraph(ofstream *out, Graph &graph1, Graph &graph2, int *counter)
     
    48374431  int RootKeyNr, RootNr;
    48384432  struct UniqueFragments FragmentSearch;
    4839  
     4433
    48404434  *out << Verbose(0) << "Begin of FragmentBOSSANOVA." << endl;
    48414435
     
    48604454    Walker = Walker->next;
    48614455    CompleteMolecule.insert(Walker->GetTrueFather()->nr);
    4862   } 
     4456  }
    48634457
    48644458  // this can easily be seen: if Order is 5, then the number of levels for each lower order is the total sum of the number of levels above, as
     
    48744468    //if ((MinimumRingSize[Walker->GetTrueFather()->nr] != -1) && (Walker->GetTrueFather()->AdaptiveOrder+1 > MinimumRingSize[Walker->GetTrueFather()->nr])) {
    48754469    //  *out << Verbose(0) << "Bond order " << Walker->GetTrueFather()->AdaptiveOrder << " of Root " << *Walker << " greater than or equal to Minimum Ring size of " << MinimumRingSize << " found is not allowed." << endl;
    4876     //} else 
     4470    //} else
    48774471    {
    48784472      // increase adaptive order by one
    48794473      Walker->GetTrueFather()->AdaptiveOrder++;
    48804474      Order = Walker->AdaptiveOrder = Walker->GetTrueFather()->AdaptiveOrder;
    4881  
     4475
    48824476      // initialise Order-dependent entries of UniqueFragments structure
    48834477      FragmentSearch.BondsPerSPList = (bond **) Malloc(sizeof(bond *)*Order*2, "molecule::PowerSetGenerator: ***BondsPerSPList");
     
    48864480        FragmentSearch.BondsPerSPList[2*i] = new bond();    // start node
    48874481        FragmentSearch.BondsPerSPList[2*i+1] = new bond();  // end node
    4888         FragmentSearch.BondsPerSPList[2*i]->next = FragmentSearch.BondsPerSPList[2*i+1];     // intertwine these two 
     4482        FragmentSearch.BondsPerSPList[2*i]->next = FragmentSearch.BondsPerSPList[2*i+1];     // intertwine these two
    48894483        FragmentSearch.BondsPerSPList[2*i+1]->previous = FragmentSearch.BondsPerSPList[2*i];
    48904484        FragmentSearch.BondsPerSPCount[i] = 0;
    4891       } 
    4892  
     4485      }
     4486
    48934487      // allocate memory for all lower level orders in this 1D-array of ptrs
    48944488      NumLevels = 1 << (Order-1); // (int)pow(2,Order);
     
    48964490      for (int i=0;i<NumLevels;i++)
    48974491        FragmentLowerOrdersList[RootNr][i] = NULL;
    4898      
     4492
    48994493      // create top order where nothing is reduced
    49004494      *out << Verbose(0) << "==============================================================================================================" << endl;
    49014495      *out << Verbose(0) << "Creating KeySets of Bond Order " << Order << " for " << *Walker << ", " << (RootStack.size()-RootNr) << " Roots remaining." << endl; // , NumLevels is " << NumLevels << "
    4902  
     4496
    49034497      // Create list of Graphs of current Bond Order (i.e. F_{ij})
    49044498      FragmentLowerOrdersList[RootNr][0] =  new Graph;
     
    49134507        // we don't have to dive into suborders! These keysets are all already created on lower orders!
    49144508        // this was all ancient stuff, when we still depended on the TEFactors (and for those the suborders were needed)
    4915        
     4509
    49164510//        if ((NumLevels >> 1) > 0) {
    49174511//          // create lower order fragments
     
    49204514//          for (int source=0;source<(NumLevels >> 1);source++) { // 1-terms don't need any more splitting, that's why only half is gone through (shift again)
    49214515//            // step down to next order at (virtual) boundary of powers of 2 in array
    4922 //            while (source >= (1 << (Walker->AdaptiveOrder-Order))) // (int)pow(2,Walker->AdaptiveOrder-Order))   
     4516//            while (source >= (1 << (Walker->AdaptiveOrder-Order))) // (int)pow(2,Walker->AdaptiveOrder-Order))
    49234517//              Order--;
    49244518//            *out << Verbose(0) << "Current Order is: " << Order << "." << endl;
     
    49274521//              *out << Verbose(0) << "--------------------------------------------------------------------------------------------------------------" << endl;
    49284522//              *out << Verbose(0) << "Current SubOrder is: " << SubOrder << " with source " << source << " to destination " << dest << "." << endl;
    4929 //       
     4523//
    49304524//              // every molecule is split into a list of again (Order - 1) molecules, while counting all molecules
    49314525//              //*out << Verbose(1) << "Splitting the " << (*FragmentLowerOrdersList[RootNr][source]).size() << " molecules of the " << source << "th cell in the array." << endl;
     
    49584552      RootStack.push_back(RootKeyNr); // put back on stack
    49594553      RootNr++;
    4960  
     4554
    49614555      // free Order-dependent entries of UniqueFragments structure for next loop cycle
    49624556      Free((void **)&FragmentSearch.BondsPerSPCount, "molecule::PowerSetGenerator: *BondsPerSPCount");
     
    49644558        delete(FragmentSearch.BondsPerSPList[2*i]);
    49654559        delete(FragmentSearch.BondsPerSPList[2*i+1]);
    4966       } 
     4560      }
    49674561      Free((void **)&FragmentSearch.BondsPerSPList, "molecule::PowerSetGenerator: ***BondsPerSPList");
    49684562    }
     
    49754569  Free((void **)&FragmentSearch.ShortestPathList, "molecule::PowerSetGenerator: *ShortestPathList");
    49764570  delete(FragmentSearch.FragmentSet);
    4977  
    4978   // now, FragmentLowerOrdersList is complete, it looks - for BondOrder 5 - as this (number is the ANOVA Order of the terms therein) 
     4571
     4572  // now, FragmentLowerOrdersList is complete, it looks - for BondOrder 5 - as this (number is the ANOVA Order of the terms therein)
    49794573  // 5433222211111111
    49804574  // 43221111
     
    49964590    RootKeyNr = RootStack.front();
    49974591    RootStack.pop_front();
    4998     Walker = FindAtom(RootKeyNr); 
     4592    Walker = FindAtom(RootKeyNr);
    49994593    NumLevels = 1 << (Walker->AdaptiveOrder - 1);
    50004594    for(int i=0;i<NumLevels;i++) {
     
    50094603  Free((void **)&FragmentLowerOrdersList, "molecule::FragmentBOSSANOVA: ***FragmentLowerOrdersList");
    50104604  Free((void **)&NumMoleculesOfOrder, "molecule::FragmentBOSSANOVA: *NumMoleculesOfOrder");
    5011  
     4605
    50124606  *out << Verbose(0) << "End of FragmentBOSSANOVA." << endl;
    50134607};
     
    50434637  atom *Walker = NULL;
    50444638  bool result = true; // status of comparison
    5045  
    5046   *out << Verbose(3) << "Begin of IsEqualToWithinThreshold." << endl; 
     4639
     4640  *out << Verbose(3) << "Begin of IsEqualToWithinThreshold." << endl;
    50474641  /// first count both their atoms and elements and update lists thereby ...
    50484642  //*out << Verbose(0) << "Counting atoms, updating list" << endl;
     
    50914685    if (CenterOfGravity.Distance(&OtherCenterOfGravity) > threshold) {
    50924686      *out << Verbose(4) << "Centers of gravity don't match." << endl;
    5093       result = false; 
    5094     }
    5095   }
    5096  
     4687      result = false;
     4688    }
     4689  }
     4690
    50974691  /// ... then make a list with the euclidian distance to this center for each atom of both molecules
    50984692  if (result) {
     
    51104704      OtherDistances[Walker->nr] = OtherCenterOfGravity.Distance(&Walker->x);
    51114705    }
    5112  
     4706
    51134707    /// ... sort each list (using heapsort (o(N log N)) from GSL)
    51144708    *out << Verbose(5) << "Sorting distances" << endl;
     
    51214715    for(int i=AtomCount;i--;)
    51224716      PermutationMap[PermMap[i]] = (int) OtherPermMap[i];
    5123    
     4717
    51244718    /// ... and compare them step by step, whether the difference is individiually(!) below \a threshold for all
    51254719    *out << Verbose(4) << "Comparing distances" << endl;
     
    51324726    Free((void **)&PermMap, "molecule::IsEqualToWithinThreshold: *PermMap");
    51334727    Free((void **)&OtherPermMap, "molecule::IsEqualToWithinThreshold: *OtherPermMap");
    5134      
     4728
    51354729    /// free memory
    51364730    Free((void **)&Distances, "molecule::IsEqualToWithinThreshold: Distances");
     
    51404734      result = false;
    51414735    }
    5142   } 
     4736  }
    51434737  /// return pointer to map if all distances were below \a threshold
    51444738  *out << Verbose(3) << "End of IsEqualToWithinThreshold." << endl;
     
    51494743    *out << Verbose(3) << "Result: Not equal." << endl;
    51504744    return NULL;
    5151   } 
     4745  }
    51524746};
    51534747
     
    52044798 * \param *output output stream of temperature file
    52054799 * \return file written (true), failure on writing file (false)
    5206  */ 
     4800 */
    52074801bool molecule::OutputTemperatureFromTrajectories(ofstream *out, int startstep, int endstep, ofstream *output)
    52084802{
     
    52124806  if (output == NULL)
    52134807    return false;
    5214   else 
     4808  else
    52154809    *output << "# Step Temperature [K] Temperature [a.u.]" << endl;
    52164810  for (int step=startstep;step < endstep; step++) { // loop over all time steps
Note: See TracChangeset for help on using the changeset viewer.