Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/analysis_correlation.cpp

    rbd61b41 rb34306  
    1515#include "tesselation.hpp"
    1616#include "tesselationhelpers.hpp"
     17#include "triangleintersectionlist.hpp"
    1718#include "vector.hpp"
    1819#include "verbose.hpp"
     20#include "World.hpp"
    1921
    2022
     
    5557                if (Walker->nr < OtherWalker->nr)
    5658                  if ((type2 == NULL) || (OtherWalker->type == type2)) {
    57                     distance = Walker->node->PeriodicDistance(OtherWalker->node, (*MolWalker)->cell_size);
     59                    distance = Walker->node->PeriodicDistance(OtherWalker->node, World::get()->cell_size);
    5860                    //Log() << Verbose(1) <<"Inserting " << *Walker << " and " << *OtherWalker << endl;
    5961                    outmap->insert ( pair<double, pair <atom *, atom*> > (distance, pair<atom *, atom*> (Walker, OtherWalker) ) );
     
    9698  for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
    9799    if ((*MolWalker)->ActiveFlag) {
    98       double * FullMatrix = ReturnFullMatrixforSymmetric((*MolWalker)->cell_size);
     100      double * FullMatrix = ReturnFullMatrixforSymmetric(World::get()->cell_size);
    99101      double * FullInverseMatrix = InverseMatrix(FullMatrix);
    100102      eLog() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl;
     
    174176        Log() << Verbose(3) << "Current atom is " << *Walker << "." << endl;
    175177        if ((type == NULL) || (Walker->type == type)) {
    176           distance = Walker->node->PeriodicDistance(point, (*MolWalker)->cell_size);
     178          distance = Walker->node->PeriodicDistance(point, World::get()->cell_size);
    177179          Log() << Verbose(4) << "Current distance is " << distance << "." << endl;
    178180          outmap->insert ( pair<double, pair<atom *, const Vector*> >(distance, pair<atom *, const Vector*> (Walker, point) ) );
     
    208210  for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
    209211    if ((*MolWalker)->ActiveFlag) {
    210       double * FullMatrix = ReturnFullMatrixforSymmetric((*MolWalker)->cell_size);
     212      double * FullMatrix = ReturnFullMatrixforSymmetric(World::get()->cell_size);
    211213      double * FullInverseMatrix = InverseMatrix(FullMatrix);
    212214      Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl;
     
    255257
    256258  if ((Surface == NULL) || (LC == NULL) || (molecules->ListOfMolecules.empty())) {
    257     Log() << Verbose(1) <<"No Tesselation, no LinkedCell or no molecule given." << endl;
     259    eLog() << Verbose(1) <<"No Tesselation, no LinkedCell or no molecule given." << endl;
    258260    return outmap;
    259261  }
     
    261263  for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
    262264    if ((*MolWalker)->ActiveFlag) {
    263       Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl;
    264       atom *Walker = (*MolWalker)->start;
    265       while (Walker->next != (*MolWalker)->end) {
    266         Walker = Walker->next;
    267         Log() << Verbose(3) << "Current atom is " << *Walker << "." << endl;
     265      Log() << Verbose(1) << "Current molecule is " << (*MolWalker)->name << "." << endl;
     266      atom *Walker = (*MolWalker)->start;
     267      while (Walker->next != (*MolWalker)->end) {
     268        Walker = Walker->next;
     269        //Log() << Verbose(1) << "Current atom is " << *Walker << "." << endl;
    268270        if ((type == NULL) || (Walker->type == type)) {
    269           triangle = Surface->FindClosestTriangleToPoint(Walker->node, LC );
    270           if (triangle != NULL) {
    271             distance = DistanceToTrianglePlane(Walker->node, triangle);
    272             outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(distance, pair<atom *, BoundaryTriangleSet*> (Walker, triangle) ) );
    273           }
    274         }
    275       }
    276     }
     271          TriangleIntersectionList Intersections(Walker->node,Surface,LC);
     272          distance = Intersections.GetSmallestDistance();
     273          triangle = Intersections.GetClosestTriangle();
     274          outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(distance, pair<atom *, BoundaryTriangleSet*> (Walker, triangle) ) );
     275        }
     276      }
     277    } else
     278      Log() << Verbose(1) << "molecule " << (*MolWalker)->name << " is not active." << endl;
     279
    277280
    278281  return outmap;
     
    308311  }
    309312  outmap = new CorrelationToSurfaceMap;
    310   for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
    311     if ((*MolWalker)->ActiveFlag) {
    312       double * FullMatrix = ReturnFullMatrixforSymmetric((*MolWalker)->cell_size);
     313  double ShortestDistance = 0.;
     314  BoundaryTriangleSet *ShortestTriangle = NULL;
     315  for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
     316    if ((*MolWalker)->ActiveFlag) {
     317      double * FullMatrix = ReturnFullMatrixforSymmetric(World::get()->cell_size);
    313318      double * FullInverseMatrix = InverseMatrix(FullMatrix);
    314319      Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl;
     
    321326          periodicX.MatrixMultiplication(FullInverseMatrix);  // x now in [0,1)^3
    322327          // go through every range in xyz and get distance
     328          ShortestDistance = -1.;
    323329          for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++)
    324330            for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++)
     
    327333                checkX.AddVector(&periodicX);
    328334                checkX.MatrixMultiplication(FullMatrix);
    329                 triangle = Surface->FindClosestTriangleToPoint(&checkX, LC );
    330                 if (triangle != NULL) {
    331                   distance = DistanceToTrianglePlane(&checkX, triangle);
    332                   outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(distance, pair<atom *, BoundaryTriangleSet*> (Walker, triangle) ) );
     335                triangle = Surface->FindClosestTriangleToVector(&checkX, LC);
     336                distance = Surface->GetDistanceSquaredToTriangle(checkX, triangle);
     337                if ((ShortestDistance == -1.) || (distance < ShortestDistance)) {
     338                  ShortestDistance = distance;
     339                  ShortestTriangle = triangle;
    333340                }
    334           }
     341              }
     342          // insert
     343          ShortestDistance = sqrt(ShortestDistance);
     344          outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(ShortestDistance, pair<atom *, BoundaryTriangleSet*> (Walker, ShortestTriangle) ) );
     345          //Log() << Verbose(1) << "INFO: Inserting " << Walker << " with distance " << ShortestDistance << " to " << *ShortestTriangle << "." << endl;
    335346        }
    336347      }
     
    342353};
    343354
    344 /** Returns the index of the bin for a given value.
     355/** Returns the start of the bin for a given value.
    345356 * \param value value whose bin to look for
    346357 * \param BinWidth width of bin
    347358 * \param BinStart first bin
    348359 */
    349 int GetBin ( const double value, const double BinWidth, const double BinStart )
    350 {
    351   Info FunctionInfo(__func__);
    352   int bin =(int) (floor((value - BinStart)/BinWidth));
    353   return (bin);
     360double GetBin ( const double value, const double BinWidth, const double BinStart )
     361{
     362  Info FunctionInfo(__func__);
     363  double bin =(double) (floor((value - BinStart)/BinWidth));
     364  return (bin*BinWidth+BinStart);
    354365};
    355366
     
    362373{
    363374  Info FunctionInfo(__func__);
    364   *file << "# BinStart\tCount" << endl;
     375  *file << "BinStart\tCount" << endl;
    365376  for (BinPairMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
    366     *file << runner->first << "\t" << runner->second << endl;
     377    *file << setprecision(8) << runner->first << "\t" << runner->second << endl;
    367378  }
    368379};
     
    375386{
    376387  Info FunctionInfo(__func__);
    377   *file << "# BinStart\tAtom1\tAtom2" << endl;
     388  *file << "BinStart\tAtom1\tAtom2" << endl;
    378389  for (PairCorrelationMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
    379     *file << runner->first << "\t" << *(runner->second.first) << "\t" << *(runner->second.second) << endl;
     390    *file << setprecision(8) << runner->first << "\t" << *(runner->second.first) << "\t" << *(runner->second.second) << endl;
    380391  }
    381392};
     
    388399{
    389400  Info FunctionInfo(__func__);
    390   *file << "# BinStart\tAtom::x[i]-point.x[i]" << endl;
     401  *file << "BinStart\tAtom::x[i]-point.x[i]" << endl;
    391402  for (CorrelationToPointMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
    392403    *file << runner->first;
    393404    for (int i=0;i<NDIM;i++)
    394       *file << "\t" << (runner->second.first->node->x[i] - runner->second.second->x[i]);
     405      *file << "\t" << setprecision(8) << (runner->second.first->node->x[i] - runner->second.second->x[i]);
    395406    *file << endl;
    396407  }
     
    404415{
    405416  Info FunctionInfo(__func__);
    406   *file << "# BinStart\tTriangle" << endl;
    407   for (CorrelationToSurfaceMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
    408     *file << runner->first << "\t" << *(runner->second.second) << endl;
    409   }
    410 };
    411 
     417  *file << "BinStart\tTriangle" << endl;
     418  if (!map->empty())
     419    for (CorrelationToSurfaceMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) {
     420      *file << setprecision(8) << runner->first << "\t" << *(runner->second.first) << "\t" << *(runner->second.second) << endl;
     421    }
     422};
     423
Note: See TracChangeset for help on using the changeset viewer.