eagerGAMGProcAgglomeration.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2013-2016 OpenFOAM Foundation
9 Copyright (C) 2020 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27\*---------------------------------------------------------------------------*/
28
31#include "GAMGAgglomeration.H"
32
33// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
34
35namespace Foam
36{
38
40 (
44 );
45}
46
47
48// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
49
51(
52 GAMGAgglomeration& agglom,
54)
55:
57 mergeLevels_(controlDict.getOrDefault<label>("mergeLevels", 1))
58{}
59
60
61// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
62
65{
66 forAllReverse(comms_, i)
67 {
68 if (comms_[i] != -1)
69 {
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// ************************************************************************* //
Macros for easy insertion into run-time selection tables.
#define addToRunTimeSelectionTable(baseType, thisType, argNames)
Add to construction table with typeName as the key.
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.
label nProcs() const noexcept
Number of ranks associated with PstreamBuffers.
T & last()
Return the last element of the list.
Definition: UListI.H:216
static void freeCommunicator(const label communicator, const bool doPstream=true)
Free a previously allocated communicator.
Definition: UPstream.C:174
static label allocateCommunicator(const label parent, const labelList &subRanks, const bool doPstream=true)
Allocate a new communicator.
Definition: UPstream.C:108
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:126
'Eager' processor agglomeration of GAMGAgglomerations: at every level agglomerates 'mergeLevels' numb...
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:63
virtual label comm() const =0
Return communicator used for parallel communication.
int myProcNo() const noexcept
Return processor number.
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition: className.H:121
runTime controlDict().readEntry("adjustTimeStep"
Namespace for OpenFOAM.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:372
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
constexpr char nl
The newline '\n' character (0x0a)
Definition: Ostream.H:53
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:333
#define forAllReverse(list, i)
Reverse loop across all elements in list.
Definition: stdFoam.H:346