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

Comparing trunk/src/math/ConvexHull.cpp (file contents):
Revision 1374 by chuckv, Tue Oct 20 20:05:28 2009 UTC vs.
Revision 1384 by gezelter, Thu Oct 22 19:43:10 2009 UTC

# Line 44 | Line 44
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.16 2009-10-20 20:05:28 chuckv Exp $
47 > *  @version $Id: ConvexHull.cpp,v 1.20 2009-10-22 19:43:10 gezelter Exp $
48   *
49   */
50  
# Line 77 | Line 77 | extern "C"
77   #include <qhull/stat.h>
78   }
79  
80 /* Old options Qt Qu Qg QG0 FA */
81 /* More old opts Qc Qi Pp*/
82
80   ConvexHull::ConvexHull() : Hull(), dim_(3), options_("qhull Qt Pp") {
81   }
82  
# Line 94 | Line 91 | void ConvexHull::computeHull(std::vector<StuntDouble*>
91    setT *vertices;
92    int curlong, totlong;
93    
94 <  std::vector<double> ptArray(numpoints*3);
98 <  std::vector<bool> isSurfaceID(numpoints);
94 >  std::vector<double> ptArray(numpoints*dim_);
95  
96    // Copy the positon vector into a points vector for qhull.
97    std::vector<StuntDouble*>::iterator SD;
# Line 127 | Line 123 | void ConvexHull::computeHull(std::vector<StuntDouble*>
123    int nproc = MPI::COMM_WORLD.Get_size();
124    int myrank = MPI::COMM_WORLD.Get_rank();
125    int localHullSites = 0;
130  int* hullSitesOnProc = new int[nproc];
131  int* coordsOnProc = new int[nproc];
132  int* displacements = new int[nproc];
133  int* vectorDisplacements = new int[nproc];
126  
127 +  std::vector<int> hullSitesOnProc(nproc, 0);
128 +  std::vector<int> coordsOnProc(nproc, 0);
129 +  std::vector<int> displacements(nproc, 0);
130 +  std::vector<int> vectorDisplacements(nproc, 0);
131 +
132    std::vector<double> coords;
133    std::vector<double> vels;
134 <  std::vector<int> objectIDs;
134 >  std::vector<int> indexMap;
135    std::vector<double> masses;
136  
137    FORALLvertices{
138      localHullSites++;
139      
140      int idx = qh_pointid(vertex->point);
141 +
142 +    indexMap.push_back(idx);
143 +
144      coords.push_back(ptArray[dim_  * idx]);
145      coords.push_back(ptArray[dim_  * idx + 1]);
146      coords.push_back(ptArray[dim_  * idx + 2]);
# Line 159 | Line 159 | void ConvexHull::computeHull(std::vector<StuntDouble*>
159                              1, MPI::INT);
160  
161    int globalHullSites = 0;
162 <  for (int iproc = 0; i < nproc; iproc++){
162 >  for (int iproc = 0; iproc < nproc; iproc++){
163      globalHullSites += hullSitesOnProc[iproc];
164      coordsOnProc[iproc] = dim_ * hullSitesOnProc[iproc];
165    }
# Line 167 | Line 167 | void ConvexHull::computeHull(std::vector<StuntDouble*>
167    displacements[0] = 0;
168    vectorDisplacements[0] = 0;
169    
170 <  for (int iproc = 1; i < nproc; iproc++){
170 >  for (int iproc = 1; iproc < nproc; iproc++){
171      displacements[iproc] = displacements[iproc-1] + hullSitesOnProc[iproc-1];
172      vectorDisplacements[iproc] = vectorDisplacements[iproc-1] + coordsOnProc[iproc-1];
173    }
174  
175 <  std::vector<double> globalCoords(dim_*globalHullSites);
176 <  std::vector<double> globalVels(dim_*globalHullSites);
175 >  std::vector<double> globalCoords(dim_ * globalHullSites);
176 >  std::vector<double> globalVels(dim_ * globalHullSites);
177    std::vector<double> globalMasses(globalHullSites);
178 +
179    int count = coordsOnProc[myrank];
180    
181 <  MPI::COMM_WORLD.Allgatherv(&coords[0], count, MPI::DOUBLE,
182 <                             &globalCoords[0], &coordsOnProc[0], &vectorDisplacements[0],
181 >  MPI::COMM_WORLD.Allgatherv(&coords[0], count, MPI::DOUBLE, &globalCoords[0],
182 >                             &coordsOnProc[0], &vectorDisplacements[0],
183                               MPI::DOUBLE);
184  
185 <  MPI::COMM_WORLD.Allgatherv(&vels[0], count, MPI::DOUBLE,
186 <                             &globalVels[0], &coordsOnProc[0], &vectorDisplacements[0],
185 >  MPI::COMM_WORLD.Allgatherv(&vels[0], count, MPI::DOUBLE, &globalVels[0],
186 >                             &coordsOnProc[0], &vectorDisplacements[0],
187                               MPI::DOUBLE);
188  
189    MPI::COMM_WORLD.Allgatherv(&masses[0], localHullSites, MPI::DOUBLE,
190 <                             &globalMasses[0], &hullSitesOnProc[0], &displacements[0],
191 <                             MPI::DOUBLE);
190 >                             &globalMasses[0], &hullSitesOnProc[0],
191 >                             &displacements[0], MPI::DOUBLE);
192  
193    // Free previous hull
194    qh_freeqhull(!qh_ALL);
# Line 225 | Line 226 | void ConvexHull::computeHull(std::vector<StuntDouble*>
226      Vector3d faceVel = V3Zero;
227      Vector3d p[3];
228      RealType faceMass = 0.0;
229 +
230      int ver = 0;
231  
232      FOREACHvertex_(vertices){
# Line 242 | Line 244 | void ConvexHull::computeHull(std::vector<StuntDouble*>
244                       globalVels[dim_ * id + 2]);
245        mass = globalMasses[id];
246  
247 <      // localID will be between 0 and hullSitesOnProc[myrank] if we own this guy.
247 >      // localID will be between 0 and hullSitesOnProc[myrank] if we
248 >      // own this guy.
249 >
250        int localID = id - displacements[myrank];
251 <      if (id >= 0 && id < hullSitesOnProc[myrank])
252 <        face.addVertexSD(bodydoubles[localID]);
253 <      else
254 <        face.addVertexSD(NULL);
251 >
252 >      if (localID >= 0 && localID < hullSitesOnProc[myrank])
253 >        face.addVertexSD(bodydoubles[indexMap[localID]]);
254 >      
255   #else
256        vel = bodydoubles[id]->getVel();
257        mass = bodydoubles[id]->getMass();
# Line 271 | Line 275 | void ConvexHull::computeHull(std::vector<StuntDouble*>
275    volume_ = qh totvol;
276    area_ = qh totarea;
277  
274 #ifdef IS_MPI
275  delete [] hullSitesOnProc;
276  delete [] coordsOnProc;
277  delete [] displacements;
278  delete [] vectorDisplacements;
279 #endif
280  
278    qh_freeqhull(!qh_ALL);
279    qh_memfreeshort(&curlong, &totlong);
280    if (curlong || totlong)
# Line 285 | Line 282 | void ConvexHull::computeHull(std::vector<StuntDouble*>
282                << totlong << curlong << std::endl;    
283   }
284  
288
289
285   void ConvexHull::printHull(const std::string& geomFileName) {
286 +
287 + #ifdef IS_MPI
288 +  if (worldRank == 0)  {
289 + #endif
290    FILE *newGeomFile;
291    
292    //create new .md file based on old .md file
# Line 297 | Line 296 | void ConvexHull::printHull(const std::string& geomFile
296      qh_printfacets(newGeomFile, qh PRINTout[i], qh facet_list, NULL, !qh_ALL);
297    
298    fclose(newGeomFile);
299 + #ifdef IS_MPI
300 +  }
301 + #endif
302   }
303   #endif //QHULL

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines