Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linkedcell.cpp

    rcaf4ba r717e0c  
     1/** \file linkedcell.cpp
     2 *
     3 * Function implementations for the class LinkedCell.
     4 *
     5 */
     6
     7
     8#include "atom.hpp"
     9#include "helpers.hpp"
    110#include "linkedcell.hpp"
    2 #include "molecules.hpp"
     11#include "log.hpp"
     12#include "molecule.hpp"
    313#include "tesselation.hpp"
     14#include "vector.hpp"
    415
    516// ========================================================= class LinkedCell ===========================================
     
    2334 * \param RADIUS edge length of cells
    2435 */
    25 LinkedCell::LinkedCell(PointCloud *set, double radius)
     36LinkedCell::LinkedCell(const PointCloud * const set, const double radius)
    2637{
    2738  TesselPoint *Walker = NULL;
     
    3445  max.Zero();
    3546  min.Zero();
    36   cout << Verbose(1) << "Begin of LinkedCell" << endl;
    37   if ((set == NULL) || (set->IsEmpty())) {
    38     cerr << "ERROR: set is NULL or contains no linked cell nodes!" << endl;
     47  Log() << Verbose(1) << "Begin of LinkedCell" << endl;
     48  if (set->IsEmpty()) {
     49    eLog() << Verbose(1) << "set contains no linked cell nodes!" << endl;
    3950    return;
    4051  }
     
    4758  }
    4859  set->GoToFirst();
    49   while (!set->IsLast()) {
     60  while (!set->IsEnd()) {
    5061    Walker = set->GetPoint();
    5162    for (int i=0;i<NDIM;i++) {
     
    5768    set->GoToNext();
    5869  }
    59   cout << Verbose(2) << "Bounding box is " << min << " and " << max << "." << endl;
     70  Log() << Verbose(2) << "Bounding box is " << min << " and " << max << "." << endl;
    6071
    6172  // 2. find then number of cells per axis
     
    6374    N[i] = (int)floor((max.x[i] - min.x[i])/RADIUS)+1;
    6475  }
    65   cout << Verbose(2) << "Number of cells per axis are " << N[0] << ", " << N[1] << " and " << N[2] << "." << endl;
     76  Log() << Verbose(2) << "Number of cells per axis are " << N[0] << ", " << N[1] << " and " << N[2] << "." << endl;
    6677
    6778  // 3. allocate the lists
    68   cout << Verbose(2) << "Allocating cells ... ";
     79  Log() << Verbose(2) << "Allocating cells ... ";
    6980  if (LC != NULL) {
    70     cout << Verbose(1) << "ERROR: Linked Cell list is already allocated, I do nothing." << endl;
     81    eLog() << Verbose(1) << "Linked Cell list is already allocated, I do nothing." << endl;
    7182    return;
    7283  }
     
    7586    LC [index].clear();
    7687  }
    77   cout << "done."  << endl;
     88  Log() << Verbose(0) << "done."  << endl;
    7889
    7990  // 4. put each atom into its respective cell
    80   cout << Verbose(2) << "Filling cells ... ";
     91  Log() << Verbose(2) << "Filling cells ... ";
    8192  set->GoToFirst();
    82   while (!set->IsLast()) {
     93  while (!set->IsEnd()) {
    8394    Walker = set->GetPoint();
    8495    for (int i=0;i<NDIM;i++) {
     
    8798    index = n[0] * N[1] * N[2] + n[1] * N[2] + n[2];
    8899    LC[index].push_back(Walker);
    89     //cout << Verbose(2) << *Walker << " goes into cell " << n[0] << ", " << n[1] << ", " << n[2] << " with No. " << index << "." << endl;
     100    //Log() << Verbose(2) << *Walker << " goes into cell " << n[0] << ", " << n[1] << ", " << n[2] << " with No. " << index << "." << endl;
    90101    set->GoToNext();
    91102  }
    92   cout << "done."  << endl;
    93   cout << Verbose(1) << "End of LinkedCell" << endl;
     103  Log() << Verbose(0) << "done."  << endl;
     104  Log() << Verbose(1) << "End of LinkedCell" << endl;
     105};
     106
     107
     108/** Puts all atoms in \a *mol into a linked cell list with cell's lengths of \a RADIUS
     109 * \param *set LCNodeSet class with all LCNode's
     110 * \param RADIUS edge length of cells
     111 */
     112LinkedCell::LinkedCell(LinkedNodes *set, const double radius)
     113{
     114  class TesselPoint *Walker = NULL;
     115  RADIUS = radius;
     116  LC = NULL;
     117  for(int i=0;i<NDIM;i++)
     118    N[i] = 0;
     119  index = -1;
     120  max.Zero();
     121  min.Zero();
     122  Log() << Verbose(1) << "Begin of LinkedCell" << endl;
     123  if (set->empty()) {
     124    eLog() << Verbose(1) << "set contains no linked cell nodes!" << endl;
     125    return;
     126  }
     127  // 1. find max and min per axis of atoms
     128  LinkedNodes::iterator Runner = set->begin();
     129  for (int i=0;i<NDIM;i++) {
     130    max.x[i] = (*Runner)->node->x[i];
     131    min.x[i] = (*Runner)->node->x[i];
     132  }
     133  for (LinkedNodes::iterator Runner = set->begin(); Runner != set->end(); Runner++) {
     134    Walker = *Runner;
     135    for (int i=0;i<NDIM;i++) {
     136      if (max.x[i] < Walker->node->x[i])
     137        max.x[i] = Walker->node->x[i];
     138      if (min.x[i] > Walker->node->x[i])
     139        min.x[i] = Walker->node->x[i];
     140    }
     141  }
     142  Log() << Verbose(2) << "Bounding box is " << min << " and " << max << "." << endl;
     143
     144  // 2. find then number of cells per axis
     145  for (int i=0;i<NDIM;i++) {
     146    N[i] = (int)floor((max.x[i] - min.x[i])/RADIUS)+1;
     147  }
     148  Log() << Verbose(2) << "Number of cells per axis are " << N[0] << ", " << N[1] << " and " << N[2] << "." << endl;
     149
     150  // 3. allocate the lists
     151  Log() << Verbose(2) << "Allocating cells ... ";
     152  if (LC != NULL) {
     153    eLog() << Verbose(1) << "Linked Cell list is already allocated, I do nothing." << endl;
     154    return;
     155  }
     156  LC = new LinkedNodes[N[0]*N[1]*N[2]];
     157  for (index=0;index<N[0]*N[1]*N[2];index++) {
     158    LC [index].clear();
     159  }
     160  Log() << Verbose(0) << "done."  << endl;
     161
     162  // 4. put each atom into its respective cell
     163  Log() << Verbose(2) << "Filling cells ... ";
     164  for (LinkedNodes::iterator Runner = set->begin(); Runner != set->end(); Runner++) {
     165    Walker = *Runner;
     166    for (int i=0;i<NDIM;i++) {
     167      n[i] = (int)floor((Walker->node->x[i] - min.x[i])/RADIUS);
     168    }
     169    index = n[0] * N[1] * N[2] + n[1] * N[2] + n[2];
     170    LC[index].push_back(Walker);
     171    //Log() << Verbose(2) << *Walker << " goes into cell " << n[0] << ", " << n[1] << ", " << n[2] << " with No. " << index << "." << endl;
     172  }
     173  Log() << Verbose(0) << "done."  << endl;
     174  Log() << Verbose(1) << "End of LinkedCell" << endl;
    94175};
    95176
     
    112193 * \return if all in intervals - true, else -false
    113194 */
    114 bool LinkedCell::CheckBounds()
     195bool LinkedCell::CheckBounds() const
    115196{
    116197  bool status = true;
     
    118199    status = status && ((n[i] >=0) && (n[i] < N[i]));
    119200  if (!status)
    120   cerr << "ERROR: indices are out of bounds!" << endl;
     201  eLog() << Verbose(1) << "indices are out of bounds!" << endl;
     202  return status;
     203};
     204
     205/** Checks whether LinkedCell::n[] plus relative offset is each within [0,N[]].
     206 * Note that for this check we don't admonish if out of bounds.
     207 * \param relative[NDIM] relative offset to current cell
     208 * \return if all in intervals - true, else -false
     209 */
     210bool LinkedCell::CheckBounds(const int relative[NDIM]) const
     211{
     212  bool status = true;
     213  for(int i=0;i<NDIM;i++)
     214    status = status && ((n[i]+relative[i] >=0) && (n[i]+relative[i] < N[i]));
    121215  return status;
    122216};
     
    126220 * \return LinkedAtoms pointer to current cell, NULL if LinkedCell::n[] are out of bounds.
    127221 */
    128 LinkedNodes* LinkedCell::GetCurrentCell()
     222const LinkedNodes* LinkedCell::GetCurrentCell() const
    129223{
    130224  if (CheckBounds()) {
     
    136230};
    137231
     232/** Returns a pointer to the current cell.
     233 * \param relative[NDIM] offset for each axis with respect to the current cell LinkedCell::n[NDIM]
     234 * \return LinkedAtoms pointer to current cell, NULL if LinkedCell::n[]+relative[] are out of bounds.
     235 */
     236const LinkedNodes* LinkedCell::GetRelativeToCurrentCell(const int relative[NDIM]) const
     237{
     238  if (CheckBounds(relative)) {
     239    index = (n[0]+relative[0]) * N[1] * N[2] + (n[1]+relative[1]) * N[2] + (n[2]+relative[2]);
     240    return (&(LC[index]));
     241  } else {
     242    return NULL;
     243  }
     244};
     245
    138246/** Calculates the index for a given LCNode *Walker.
    139247 * \param *Walker LCNode to set index tos
    140248 * \return if the atom is also found in this cell - true, else - false
    141249 */
    142 bool LinkedCell::SetIndexToNode(TesselPoint *Walker)
     250bool LinkedCell::SetIndexToNode(const TesselPoint * const Walker) const
    143251{
    144252  bool status = false;
     
    152260    return status;
    153261  } else {
    154     cerr << Verbose(1) << "ERROR: Node at " << *Walker << " is out of bounds." << endl;
     262    eLog() << Verbose(1) << "Node at " << *Walker << " is out of bounds." << endl;
    155263    return false;
     264  }
     265};
     266
     267/** Calculates the interval bounds of the linked cell grid.
     268 * \param *lower lower bounds
     269 * \param *upper upper bounds
     270 */
     271void LinkedCell::GetNeighbourBounds(int lower[NDIM], int upper[NDIM]) const
     272{
     273  for (int i=0;i<NDIM;i++) {
     274    lower[i] = ((n[i]-1) >= 0) ? n[i]-1 : 0;
     275    upper[i] = ((n[i]+1) < N[i]) ? n[i]+1 : N[i]-1;
     276    //Log() << Verbose(0) << " [" << Nlower[i] << "," << Nupper[i] << "] ";
     277    // check for this axis whether the point is outside of our grid
     278    if (n[i] < 0)
     279      upper[i] = lower[i];
     280    if (n[i] > N[i])
     281      lower[i] = upper[i];
     282
     283    //Log() << Verbose(0) << "axis " << i << " has bounds [" << lower[i] << "," << upper[i] << "]" << endl;
    156284  }
    157285};
     
    161289 * \return Vector is inside bounding box - true, else - false
    162290 */
    163 bool LinkedCell::SetIndexToVector(Vector *x)
     291bool LinkedCell::SetIndexToVector(const Vector * const x) const
    164292{
    165293  bool status = true;
Note: See TracChangeset for help on using the changeset viewer.