Changeset 9ec12c


Ignore:
Timestamp:
Sep 10, 2016, 4:14:02 PM (9 years ago)
Author:
Frederik Heber <heber@…>
Branches:
SaturateAtoms_singleDegree
Children:
aa91e63
Parents:
899cc9
git-author:
Frederik Heber <heber@…> (05/10/16 21:50:32)
git-committer:
Frederik Heber <heber@…> (09/10/16 16:14:02)
Message:

SaturateAction reduces polygon edge count by surplus bond degrees.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/AtomAction/SaturateAction.cpp

    r899cc9 r9ec12c  
    8484    // check for any bonds and get vacant positions
    8585    SphericalPointDistribution::Polygon_t vacant_positions;
    86 //    const BondList& ListOfBonds = _atom->getListOfBonds();
    87 //    SphericalPointDistribution PointSphere(typical_distance);
    88 //    if (ListOfBonds.size() == 0) {
    89 //      vacant_positions = PointSphere.getSimplePolygon(_atom->getType()->getNoValenceOrbitals());
    90 //      LOG(3, "DEBUG: Using ideal positions as " << vacant_positions);
    91 //    } else {
    92 //      // get ideal polygon and currently occupied positions
    93 //      const SphericalPointDistribution::Polygon_t ideal_positions =
    94 //          PointSphere.getSimplePolygon(_atom->getType()->getNoValenceOrbitals());
    95 //      LOG(3, "DEBUG: ideal positions are " << ideal_positions);
    96 //      SphericalPointDistribution::Polygon_t current_positions;
    97 //      for (BondList::const_iterator bonditer = ListOfBonds.begin();
    98 //          bonditer != ListOfBonds.end(); ++bonditer) {
    99 //        const Vector position =
    100 //            (*bonditer)->GetOtherAtom(_atom)->getPosition().getVectorToPoint(_atom->getPosition());
    101 //        current_positions.push_back((1./position.Norm())*position);
    102 //      }
    103 //      LOG(3, "DEBUG: current occupied positions are " << current_positions);
    104 //
    105 //      // find the best matching rotated polygon
    106 //      vacant_positions = SphericalPointDistribution::matchSphericalPointDistributions(
    107 //          current_positions,
    108 //          ideal_positions);
    109 //      LOG(3, "DEBUG: Resulting vacant positions are " << vacant_positions);
    110 //
    111 //      // scale vacant positions to typical_distance
    112 //      std::for_each(
    113 //          vacant_positions.begin(), vacant_positions.end(),
    114 //          boost::bind(&Vector::Scale, _1, boost::cref(typical_distance)));
    115 //    }
     86    const BondList& ListOfBonds = _atom->getListOfBonds();
     87    SphericalPointDistribution PointSphere(typical_distance);
     88    if (ListOfBonds.size() == 0) {
     89      vacant_positions = PointSphere.getSimplePolygon(_atom->getType()->getNoValenceOrbitals());
     90      LOG(3, "DEBUG: Using ideal positions as " << vacant_positions);
     91    } else {
     92      // get ideal polygon and currently occupied positions
     93      SphericalPointDistribution::Polygon_t current_positions;
     94      int number_vacant_positions = _atom->getType()->getNoValenceOrbitals();
     95      for (BondList::const_iterator bonditer = ListOfBonds.begin();
     96          bonditer != ListOfBonds.end(); ++bonditer) {
     97        const Vector position =
     98            (*bonditer)->GetOtherAtom(_atom)->getPosition().getVectorToPoint(_atom->getPosition());
     99        current_positions.push_back((1./position.Norm())*position);
     100        number_vacant_positions -= (*bonditer)->getDegree() - 1;
     101      }
     102      LOG(3, "DEBUG: current occupied positions are " << current_positions);
     103      ASSERT( number_vacant_positions >= 0,
     104          "AtomSaturateAction::performCall() - negative number of vacant positions?");
     105      LOG(3, "DEBUG: There remain " << number_vacant_positions << " vacant positions.");
     106
     107      const SphericalPointDistribution::Polygon_t ideal_positions =
     108          PointSphere.getSimplePolygon(number_vacant_positions);
     109      LOG(3, "DEBUG: ideal positions are " << ideal_positions);
     110
     111      // find the best matching rotated polygon
     112      vacant_positions = SphericalPointDistribution::matchSphericalPointDistributions(
     113          current_positions,
     114          ideal_positions);
     115      LOG(3, "DEBUG: Resulting vacant positions are " << vacant_positions);
     116
     117      // scale vacant positions to typical_distance
     118      std::for_each(
     119          vacant_positions.begin(), vacant_positions.end(),
     120          boost::bind(&Vector::Scale, _1, boost::cref(typical_distance)));
     121    }
    116122
    117123    // add the hydrogens
Note: See TracChangeset for help on using the changeset viewer.