eagerGAMGProcAgglomeration.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2013-2019 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
28 #include "GAMGAgglomeration.H"
29 
30 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
31 
32 namespace Foam
33 {
35 
37  (
41  );
42 }
43 
44 
45 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
46 
47 
48 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
49 
51 (
52  GAMGAgglomeration& agglom,
53  const dictionary& controlDict
54 )
55 :
57  mergeLevels_(controlDict.lookupOrDefault<label>("mergeLevels", 1))
58 {}
59 
60 
61 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
62 
65 {
66  forAllReverse(comms_, i)
67  {
68  if (comms_[i] != -1)
69  {
70  UPstream::freeCommunicator(comms_[i]);
71  }
72  }
73 }
74 
75 
76 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
77 
79 {
80  if (debug)
81  {
82  Pout<< nl << "Starting mesh overview" << endl;
83  printStats(Pout, agglom_);
84  }
85 
86  if (agglom_.size() >= 1)
87  {
88  // Agglomerate one but last level (since also agglomerating
89  // restrictAddressing)
90  for
91  (
92  label fineLevelIndex = 2;
93  fineLevelIndex < agglom_.size();
94  fineLevelIndex++
95  )
96  {
97  if (agglom_.hasMeshLevel(fineLevelIndex))
98  {
99  // Get the fine mesh
100  const lduMesh& levelMesh = agglom_.meshLevel(fineLevelIndex);
101  label levelComm = levelMesh.comm();
102  label nProcs = UPstream::nProcs(levelComm);
103 
104  if (nProcs > 1)
105  {
106  // Processor restriction map: per processor the coarse
107  // processor
108  labelList procAgglomMap(nProcs);
109 
110  forAll(procAgglomMap, proci)
111  {
112  procAgglomMap[proci] = proci/(1<<mergeLevels_);
113  }
114 
115  // Master processor
116  labelList masterProcs;
117  // Local processors that agglomerate. agglomProcIDs[0]
118  // is in masterProc.
119  List<label> agglomProcIDs;
121  (
122  levelComm,
123  procAgglomMap,
124  masterProcs,
125  agglomProcIDs
126  );
127 
128  // Allocate a communicator for the processor-agglomerated
129  // matrix
130  comms_.append
131  (
133  (
134  levelComm,
135  masterProcs
136  )
137  );
138 
139  // Use processor agglomeration maps to do the actual
140  // collecting.
141  if (Pstream::myProcNo(levelComm) != -1)
142  {
144  (
145  fineLevelIndex,
146  procAgglomMap,
147  masterProcs,
148  agglomProcIDs,
149  comms_.last()
150  );
151  }
152  }
153  }
154  }
155  }
156 
157  // Print a bit
158  if (debug)
159  {
160  Pout<< nl << "Agglomerated mesh overview" << endl;
161  printStats(Pout, agglom_);
162  }
163 
164  return true;
165 }
166 
167 
168 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
#define forAllReverse(list, i)
Reverse loop across all elements in list.
Definition: UList.H:446
Macros for easy insertion into run-time selection tables.
Geometric agglomerated algebraic multigrid agglomeration class.
static void calculateRegionMaster(const label comm, const labelList &procAgglomMap, labelList &masterProcs, List< label > &agglomProcIDs)
Given fine to coarse processor map determine:
Processor agglomeration of GAMGAgglomerations.
virtual bool agglomerate()=0
Modify agglomeration. Return true if modified.
T & last()
Return the last element of the list.
Definition: UListI.H:128
static void freeCommunicator(const label communicator, const bool doPstream=true)
Free a previously allocated communicator.
Definition: UPstream.C:314
static label nProcs(const label communicator=0)
Number of processes in parallel run.
Definition: UPstream.H:411
static label allocateCommunicator(const label parent, const labelList &subRanks, const bool doPstream=true)
Allocate a new communicator.
Definition: UPstream.C:248
static int myProcNo(const label communicator=0)
Number of this process (starting from masterNo() = 0)
Definition: UPstream.H:429
A list of keyword definitions, which are a keyword followed by any number of values (e....
Definition: dictionary.H:160
'Eager' processor agglomeration of GAMGAgglomerations: at every level agglomerates 'mergeLevels' numb...
eagerGAMGProcAgglomeration(GAMGAgglomeration &agglom, const dictionary &controlDict)
Construct given agglomerator and controls.
virtual bool agglomerate()
Modify agglomeration. Return true if modified.
Abstract base class for meshes which provide LDU addressing for the construction of lduMatrix and LDU...
Definition: lduMesh.H:60
virtual label comm() const =0
Return communicator used for parallel communication.
Namespace for OpenFOAM.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
defineTypeNameAndDebug(combustionModel, 0)
prefixOSstream Pout(cout, "Pout")
Definition: IOstreams.H:53
static const char nl
Definition: Ostream.H:260
addToRunTimeSelectionTable(ensightPart, ensightPartCells, istream)
runTime controlDict().lookup("adjustTimeStep") >> adjustTimeStep