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 1376 by gezelter, Tue Oct 20 20:36:56 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.17 2009-10-20 20:36:56 gezelter 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 155 | Line 155 | void ConvexHull::computeHull(std::vector<StuntDouble*>
155      masses.push_back(sd->getMass());
156    }
157  
158
159
158    MPI::COMM_WORLD.Allgather(&localHullSites, 1, MPI::INT, &hullSitesOnProc[0],
159                              1, MPI::INT);
160  
161    int globalHullSites = 0;
162    for (int iproc = 0; iproc < nproc; iproc++){
165    std::cerr << "iproc = " << iproc << " sites = " << hullSitesOnProc[iproc] << "\n";
163      globalHullSites += hullSitesOnProc[iproc];
164      coordsOnProc[iproc] = dim_ * hullSitesOnProc[iproc];
165    }
# Line 175 | Line 172 | void ConvexHull::computeHull(std::vector<StuntDouble*>
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 228 | 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 245 | 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 274 | Line 275 | void ConvexHull::computeHull(std::vector<StuntDouble*>
275    volume_ = qh totvol;
276    area_ = qh totarea;
277  
277 #ifdef IS_MPI
278  delete [] hullSitesOnProc;
279  delete [] coordsOnProc;
280  delete [] displacements;
281  delete [] vectorDisplacements;
282 #endif
283  
278    qh_freeqhull(!qh_ALL);
279    qh_memfreeshort(&curlong, &totlong);
280    if (curlong || totlong)
# Line 288 | Line 282 | void ConvexHull::computeHull(std::vector<StuntDouble*>
282                << totlong << curlong << std::endl;    
283   }
284  
291
292
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 300 | 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