|
[Sponsors] |
Combining Lists distributed amongst processors |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
June 23, 2010, 14:06 |
Combining Lists distributed amongst processors
|
#1 |
Member
Matthew J. Churchfield
Join Date: Nov 2009
Location: Boulder, Colorado, USA
Posts: 49
Rep Power: 19 |
Hello,
I have set up a piece of code which searches my mesh for all the different distinct heights of cell centers. It is a simple block shaped mesh in which each layer is at a different height, so if there are 20 cells in the vertical direction then the list of heights is 20 elements long. This works fine in serial. What I would like to do is extend this to parallel such that at the end of the search, each processor has a global list of distinct heights. Is there a way to take each list of heights that each processor creates, collect them on the master processor, combine them into one global list, and give the global list back to each processor? Thank you, Matt |
|
June 24, 2010, 06:35 |
|
#2 |
Senior Member
Laurence R. McGlashan
Join Date: Mar 2009
Posts: 370
Rep Power: 23 |
Yes, I've done something really similar with lagrangian flamelets. The code is a mess but I can tidy it up and post it up if you like. Otherwise the outline of the approach I took is below:
Create a vector of stuff on each processor: Code:
for(int i=0;i<mesh_.nCells();++i) { stuff.push_back(mesh_.C().internalField()[i].component(heightDirection)); } Code:
// Create lists of the variables on each processor so that they can be // gathered onto the master processor later. List<scalar> stuffList(stuff.size()); // Populate the above lists. for(unsigned int I=0; I<someSize.size(); ++I) { stuffList[I] = stuff[I]; } // Create lists of the lists of the above variables, with size equal to the // number of processors. List< List<scalar> > gatheredStuff(Pstream::nProcs()); // Populate and gather the stuff onto the master processor. gatheredStuff[Pstream::myProcNo()] = stuffList; Pstream::gatherList(gatheredStuff); Code:
for(unsigned int i=0;i<stuff.size();++i) { std::sort(stuff.begin(), stuff.end()); stuff.erase(std::unique(stuff.begin(), stuff.end(), equalToTolerance), stuff.end()); }
__________________
Laurence R. McGlashan :: Website |
|
June 25, 2010, 10:48 |
|
#3 |
Member
Matthew J. Churchfield
Join Date: Nov 2009
Location: Boulder, Colorado, USA
Posts: 49
Rep Power: 19 |
Laurence,
Thanks for the reply. It worked well! Matt Churchfield |
|
February 4, 2020, 12:07 |
|
#4 | |
Member
David Andersson
Join Date: Oct 2019
Posts: 46
Rep Power: 7 |
Quote:
I am having a similar problem as Matthew had - I have written a function object that works perfectly in series and now I want to expand it to also work in parallel, but I have a hard time understanding how I should do it. I've based my function on the "forces" function object and there they use: Code:
Pstream::listCombineGather(force_, plusEqOp<vectorField>()); Pstream::listCombineScatter(force_); I would really appreciate your help on this. Thanks, David |
||
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
HP MPI warning...Distributed parallel processing | Peter | CFX | 10 | May 14, 2011 07:17 |
polyhedral mesh with multiple processors | user1 | Siemens | 7 | August 22, 2008 11:59 |
Firewall settings bproc distributed file syntax | mike_jaworski | OpenFOAM | 2 | January 14, 2008 11:46 |
Parallel Computing on Multi-Core Processors | Upgrading Hardware | CFX | 6 | June 7, 2007 16:54 |
64-bit processors for home computing | Ananda Himansu | Main CFD Forum | 2 | March 16, 2004 13:48 |