ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/math/AlphaHull.cpp
(Generate patch)

Comparing trunk/src/math/AlphaHull.cpp (file contents):
Revision 1402 by chuckv, Fri Jan 8 17:15:27 2010 UTC vs.
Revision 1879 by gezelter, Sun Jun 16 15:15:42 2013 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 2008, 2009, 2010 The University of Notre Dame. All Rights Reserved.
1 > /* Copyright (c) 2010 The University of Notre Dame. All Rights Reserved.
2   *
3   * The University of Notre Dame grants you ("Licensee") a
4   * non-exclusive, royalty free, license to use, modify and
# Line 32 | Line 32
32   * research, please cite the appropriate papers when you publish your
33   * work.  Good starting points are:
34   *                                                                      
35 < * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
36 < * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
37 < * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).          
38 < * [4]  Vardeman & Gezelter, in progress (2009).                        
35 > * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
36 > * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
37 > * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).          
38 > * [4] Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
39 > * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
40   *
40 *
41   *  AlphaHull.cpp
42   *
43 < *  Purpose: To calculate Alpha hull, hull volume libqhull.
44 < *
45 < *  Created by Charles F. Vardeman II on 11 Dec 2006.
46 < *  @author  Charles F. Vardeman II
47 < *  @version $Id: ConvexHull.cpp,v 1.21 2009-11-25 20:02:01 gezelter Exp $
48 < *
43 > *  Purpose: To calculate an alpha-shape hull.
44   */
45  
46   /* Standard includes independent of library */
# Line 55 | Line 50
50   #include <list>
51   #include <algorithm>
52   #include <iterator>
58 #include <utility>
53   #include "math/AlphaHull.hpp"
54   #include "utils/simError.h"
55  
# Line 63 | Line 57
57   #include <mpi.h>
58   #endif
59  
60 < using namespace OpenMD;
60 > #include "math/qhull.hpp"
61  
62   #ifdef HAVE_QHULL
63 < extern "C"
64 < {
71 < #include <qhull/qhull.h>
72 < #include <qhull/mem.h>
73 < #include <qhull/qset.h>
74 < #include <qhull/geom.h>
75 < #include <qhull/merge.h>
76 < #include <qhull/poly.h>
77 < #include <qhull/io.h>
78 < #include <qhull/stat.h>
79 < }
80 < double calculate_circumradius(pointT* p0,pointT* p1,pointT* p2, int dim);
63 > using namespace std;
64 > using namespace OpenMD;
65  
66 < AlphaHull::AlphaHull(double alpha) : Hull(), dim_(3), alpha_(alpha), options_("qhull d QJ Tcv ") {
66 > double calculate_circumradius(pointT* p0, pointT* p1, pointT* p2, int dim);
67 >
68 > AlphaHull::AlphaHull(double alpha) : Hull(), dim_(3), alpha_(alpha),
69 >                                     options_("qhull d QJ Tcv Pp") {
70   }
71  
72 < void AlphaHull::computeHull(std::vector<StuntDouble*> bodydoubles) {
72 > void AlphaHull::computeHull(vector<StuntDouble*> bodydoubles) {
73  
74    int numpoints = bodydoubles.size();
88  bool alphashape=true;
75    
76    Triangles_.clear();
77    
78 <  vertexT *vertex, **vertexp;
78 >  vertexT *vertex;
79    facetT *facet, *neighbor;
80 <  setT *vertices;
80 >  pointT *interiorPoint;
81    int curlong, totlong;
82    
83 <  std::vector<double> ptArray(numpoints*dim_);
84 <
83 >  
84 >  vector<double> ptArray(numpoints*dim_);
85 >  
86    // Copy the positon vector into a points vector for qhull.
87 <  std::vector<StuntDouble*>::iterator SD;
87 >  vector<StuntDouble*>::iterator SD;
88    int i = 0;
89    for (SD =bodydoubles.begin(); SD != bodydoubles.end(); ++SD){
90      Vector3d pos = (*SD)->getPos();      
# Line 106 | Line 93 | void AlphaHull::computeHull(std::vector<StuntDouble*>
93      ptArray[dim_ * i + 2] = pos.z();
94      i++;
95    }
96 <
97 <    /* Clean up memory from previous convex hull calculations*/
96 >  
97 >  /* Clean up memory from previous convex hull calculations*/
98    boolT ismalloc = False;
99 <
100 <  int ridgesCount=0;
99 >  
100 >  /* compute the hull for our local points (or all the points for single
101 >     processor versions) */
102    if (qh_new_qhull(dim_, numpoints, &ptArray[0], ismalloc,
103                     const_cast<char *>(options_.c_str()), NULL, stderr)) {
104 <
104 >    
105      sprintf(painCave.errMsg, "AlphaHull: Qhull failed to compute convex hull");
106      painCave.isFatal = 1;
107      simError();
108      
109    } //qh_new_qhull
110 <
111 <
110 >  
111 >  
112   #ifdef IS_MPI
113    //If we are doing the mpi version, set up some vectors for data communication
114    
# Line 128 | Line 116 | void AlphaHull::computeHull(std::vector<StuntDouble*>
116    int myrank = MPI::COMM_WORLD.Get_rank();
117    int localHullSites = 0;
118  
119 <  std::vector<int> hullSitesOnProc(nproc, 0);
120 <  std::vector<int> coordsOnProc(nproc, 0);
121 <  std::vector<int> displacements(nproc, 0);
122 <  std::vector<int> vectorDisplacements(nproc, 0);
119 >  vector<int> hullSitesOnProc(nproc, 0);
120 >  vector<int> coordsOnProc(nproc, 0);
121 >  vector<int> displacements(nproc, 0);
122 >  vector<int> vectorDisplacements(nproc, 0);
123  
124 <  std::vector<double> coords;
125 <  std::vector<double> vels;
126 <  std::vector<int> indexMap;
127 <  std::vector<double> masses;
124 >  vector<double> coords;
125 >  vector<double> vels;
126 >  vector<int> indexMap;
127 >  vector<double> masses;
128  
129    FORALLvertices{
130      localHullSites++;
# Line 176 | Line 164 | void AlphaHull::computeHull(std::vector<StuntDouble*>
164      vectorDisplacements[iproc] = vectorDisplacements[iproc-1] + coordsOnProc[iproc-1];
165    }
166  
167 <  std::vector<double> globalCoords(dim_ * globalHullSites);
168 <  std::vector<double> globalVels(dim_ * globalHullSites);
169 <  std::vector<double> globalMasses(globalHullSites);
167 >  vector<double> globalCoords(dim_ * globalHullSites);
168 >  vector<double> globalVels(dim_ * globalHullSites);
169 >  vector<double> globalMasses(globalHullSites);
170  
171    int count = coordsOnProc[myrank];
172    
# Line 197 | Line 185 | void AlphaHull::computeHull(std::vector<StuntDouble*>
185    // Free previous hull
186    qh_freeqhull(!qh_ALL);
187    qh_memfreeshort(&curlong, &totlong);
188 <  if (curlong || totlong)
189 <    std::cerr << "qhull internal warning (main): did not free %d bytes of long memory (%d pieces) "
190 <              << totlong << curlong << std::endl;
188 >  if (curlong || totlong) {
189 >    sprintf(painCave.errMsg, "AlphaHull: qhull internal warning:\n"
190 >            "\tdid not free %d bytes of long memory (%d pieces)",
191 >            totlong, curlong);
192 >    painCave.isFatal = 1;
193 >    simError();
194 >  }
195    
196    if (qh_new_qhull(dim_, globalHullSites, &globalCoords[0], ismalloc,
197                     const_cast<char *>(options_.c_str()), NULL, stderr)){
198      
199 <    sprintf(painCave.errMsg, "AlphaHull: Qhull failed to compute global convex hull");
199 >    sprintf(painCave.errMsg,
200 >            "AlphaHull: Qhull failed to compute global convex hull");
201      painCave.isFatal = 1;
202      simError();
203 <    
203 >        
204    } //qh_new_qhull
205  
213
206   #endif
207  
208    //Set facet->center as the Voronoi center
# Line 242 | Line 234 | void AlphaHull::computeHull(std::vector<StuntDouble*>
234    
235    qh visit_id++;
236    int numFacets=0;
237 <  std::vector<std::vector <int> > facetlist;
237 >  vector<vector <int> > facetlist;
238 >  interiorPoint = qh interior_point;
239    FORALLfacet_(qh facet_list) {
240      numFacets++;
241      if (!facet->upperdelaunay) {
# Line 307 | Line 300 | void AlphaHull::computeHull(std::vector<StuntDouble*>
300    //assert(numFacets== qh num_facets);
301    
302    //Filter the triangles (only the ones on the boundary of the alpha complex) and build the mesh
303 +
304 +  int ridgesCount=0;
305    
306    ridgeT *ridge, **ridgep;
307    FOREACHridge_(set) {
# Line 319 | Line 314 | void AlphaHull::computeHull(std::vector<StuntDouble*>
314        // Vector3d V3dNormal(facet->normal[0], facet->normal[1], facet->normal[2]);
315        //face.setNormal(V3dNormal);
316        
322      // RealType faceArea = qh_facetarea(facet);
323      //face.setArea(faceArea);
317        
318 <      //vertices = qh_facet3vertex(facet);
319 <      
327 <      //coordT *center = qh_getcenter(vertices);
318 >      //coordT *center = qh_getcenter(ridge->vertices);
319 >      //cout << "Centers are " << center[0] << "  " <<center[1] << "  " << center[2] << endl;
320        //Vector3d V3dCentroid(center[0], center[1], center[2]);
321        //face.setCentroid(V3dCentroid);
322 +
323        
324 <      //Vector3d faceVel = V3Zero;
324 >      Vector3d faceVel = V3Zero;
325        Vector3d p[3];
326 <      //RealType faceMass = 0.0;
326 >      RealType faceMass = 0.0;
327        
328        int ver = 0;
329 <      std::vector<int> virtexlist;
329 >      vector<int> virtexlist;
330        FOREACHvertex_i_(ridge->vertices){
331          int id = qh_pointid(vertex->point);
332          p[ver][0] = vertex->point[0];
# Line 343 | Line 336 | void AlphaHull::computeHull(std::vector<StuntDouble*>
336          RealType mass;
337          ver++;
338          virtexlist.push_back(id);
339 <      }
347 <      facetlist.push_back(virtexlist);
339 >        // cout << "Ridge: " << ridgesCount << " Vertex " << id << endl;
340  
341 +        vel = bodydoubles[id]->getVel();
342 +        mass = bodydoubles[id]->getMass();
343 +        face.addVertexSD(bodydoubles[id]);
344 +
345 +
346 +        faceVel = faceVel + vel;
347 +        faceMass = faceMass + mass;
348 +      } //FOREACH Vertex
349 +      facetlist.push_back(virtexlist);
350 +      face.addVertices(p[0],p[1],p[2]);
351 +      face.setFacetMass(faceMass);
352 +      face.setFacetVelocity(faceVel / RealType(3.0));
353 +      
354 +      RealType area = face.getArea();
355 +      area_ += area;
356 +      Vector3d normal = face.getUnitNormal();
357 +      RealType offset =  ((0.0-p[0][0])*normal[0] + (0.0-p[0][1])*normal[1] + (0.0-p[0][2])*normal[2]);
358 +      RealType dist =  normal[0] * interiorPoint[0] + normal[1]*interiorPoint[1] + normal[2]*interiorPoint[2];
359 +     cout << "Dist and normal and area are: " << normal << endl;
360 +      volume_ += dist *area/qh hull_dim;
361 +      
362 +      Triangles_.push_back(face);
363      }
364    }
351                
365  
366 < //assert(pm.cm.fn == ridgesCount);
366 >  cout << "Volume is: " << volume_ << endl;
367  
368 + //assert(pm.cm.fn == ridgesCount);
369 + /*
370    std::cout <<"OFF"<<std::endl;
371    std::cout << bodydoubles.size() << "  " << facetlist.size() << "  " << 3*facetlist.size() << std::endl;
372    for (SD =bodydoubles.begin(); SD != bodydoubles.end(); ++SD){
# Line 370 | Line 385 | void AlphaHull::computeHull(std::vector<StuntDouble*>
385      }
386      std::cout << std::endl;
387    }
388 + */
389  
390  
391  
376
392   /*  
393    FORALLfacets {  
394      Triangle face;
# Line 438 | Line 453 | void AlphaHull::computeHull(std::vector<StuntDouble*>
453  
454    } //FORALLfacets
455   */
456 <  qh_getarea(qh facet_list);
457 <  volume_ = qh totvol;
458 <  area_ = qh totarea;
456 >  // qh_getarea(qh facet_list);
457 >  //volume_ = qh totvol;
458 >  // area_ = qh totarea;
459  
460    qh_freeqhull(!qh_ALL);
461    qh_memfreeshort(&curlong, &totlong);
462 <  if (curlong || totlong)
463 <    std::cerr << "qhull internal warning (main): did not free %d bytes of long memory (%d pieces) "
464 <              << totlong << curlong << std::endl;    
462 >  if (curlong || totlong) {
463 >    sprintf(painCave.errMsg, "AlphaHull: qhull internal warning:\n"
464 >            "\tdid not free %d bytes of long memory (%d pieces)",
465 >            totlong, curlong);
466 >    painCave.isFatal = 1;
467 >    simError();
468 >  }
469   }
470  
471 < void AlphaHull::printHull(const std::string& geomFileName) {
472 <
471 > void AlphaHull::printHull(const string& geomFileName) {
472 >  
473   #ifdef IS_MPI
474    if (worldRank == 0)  {
475   #endif
476 <  FILE *newGeomFile;
477 <  
478 <  //create new .md file based on old .md file
479 <  newGeomFile = fopen(geomFileName.c_str(), "w");
480 <  qh_findgood_all(qh facet_list);
481 <  for (int i = 0; i < qh_PRINTEND; i++)
482 <    qh_printfacets(newGeomFile, qh PRINTout[i], qh facet_list, NULL, !qh_ALL);
483 <  
484 <  fclose(newGeomFile);
476 >    FILE *newGeomFile;
477 >    
478 >    //create new .md file based on old .md file
479 >    newGeomFile = fopen(geomFileName.c_str(), "w");
480 >    qh_findgood_all(qh facet_list);
481 >    for (int i = 0; i < qh_PRINTEND; i++)
482 >      qh_printfacets(newGeomFile, qh PRINTout[i], qh facet_list, NULL, !qh_ALL);
483 >    
484 >    fclose(newGeomFile);
485   #ifdef IS_MPI
486    }
487   #endif  

Comparing trunk/src/math/AlphaHull.cpp (property svn:keywords):
Revision 1402 by chuckv, Fri Jan 8 17:15:27 2010 UTC vs.
Revision 1879 by gezelter, Sun Jun 16 15:15:42 2013 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines