source: src/comm/domain_decomposition_mpi.cpp@ d13e27

Last change on this file since d13e27 was a72216, checked in by Olaf Lenz <olenz@…>, 13 years ago

Fixed permissions.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@2428 5161e1c8-67bf-11de-9fd5-51895aff932f

  • Property mode set to 100644
File size: 5.1 KB
RevLine 
[fcf7f6]1/*
2 * vmg - a versatile multigrid solver
3 * Copyright (C) 2012 Institute for Numerical Simulation, University of Bonn
4 *
5 * vmg is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * vmg is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
[dfed1c]19/**
20 * @file domain_decomposition_mpi.cpp
21 * @author Julian Iseringhausen <isering@ins.uni-bonn.de>
22 * @date Mon Jun 27 12:53:50 2011
23 *
24 * @brief Computes a domain decomposition which separates
25 * the finest grid equally for all processes.
26 *
27 */
28
29#ifdef HAVE_CONFIG_H
30#include <config.h>
31#endif
32
[f003a9]33#include "base/interface.hpp"
[dfed1c]34#include "comm/comm.hpp"
35#include "comm/domain_decomposition_mpi.hpp"
36#include "grid/grid.hpp"
37#include "grid/multigrid.hpp"
38
39using namespace VMG;
40
41void DomainDecompositionMPI::Compute(Comm* comm, const Interface* interface, std::vector<GlobalIndices>& global)
42{
43 GlobalIndices global_l;
44 Index remainder, procs;
45 Index last_procs = comm->GlobalProcs();
46
47 global.clear();
48
49 for (unsigned int i=0; i<interface->Global().size(); ++i) {
50
[ac6d04]51 /*
52 * Inherit global properties from interface
53 */
54 global_l.GlobalFinerBegin() = interface->Global()[i].GlobalFinerBegin();
55 global_l.GlobalFinerEnd() = interface->Global()[i].GlobalFinerEnd();
56 global_l.GlobalFinerSize() = interface->Global()[i].GlobalFinerSize();
57 global_l.FinestAbsBegin() = interface->Global()[i].FinestAbsBegin();
58 global_l.FinestAbsEnd() = interface->Global()[i].FinestAbsEnd();
59 global_l.FinestAbsSize() = interface->Global()[i].FinestAbsSize();
60 global_l.GlobalSize() = interface->Global()[i].GlobalSize();
[dfed1c]61 global_l.BoundaryType() = interface->Global()[i].BoundaryType();
62
[ac6d04]63 if (IsActive(comm, global_l.GlobalSize(), procs)) {
[dfed1c]64
65 if (i == 0) {
66
[ac6d04]67 global_l.LocalSize() = global_l.GlobalSize() / procs;
[dfed1c]68
[ac6d04]69 remainder = global_l.GlobalSize() % procs;
[dfed1c]70 for (int j=0; j<3; ++j)
71 if (comm->GlobalPos()[j] < remainder[j])
[ac6d04]72 ++(global_l.LocalSize()[j]);
[dfed1c]73
[ac6d04]74 global_l.LocalBegin() = comm->GlobalPos() * global_l.LocalSize();
[dfed1c]75
76 for (int j=0; j<3; ++j)
77 if (comm->GlobalPos()[j] >= remainder[j])
[ac6d04]78 global_l.LocalBegin()[j] += remainder[j];
79
80 global_l.LocalEnd() = global_l.LocalBegin() + global_l.LocalSize();
[dfed1c]81
[ac6d04]82 global_l.LocalFinerBegin() = 0;
83 global_l.LocalFinerEnd() = 0;
84 global_l.LocalFinerSize() = 0;
[dfed1c]85
86 }else {
87
88 for (int j=0; j<3; ++j) {
89
90 if (procs[j] == last_procs[j]) {
91
[ac6d04]92 if (global.back().LocalBegin()[j] == 0)
93 global_l.LocalBegin()[j] = 0;
94 else
95 global_l.LocalBegin()[j] = global.back().LocalBegin()[j] / 2 + global_l.GlobalFinerBegin()[j];
[dfed1c]96
[ac6d04]97 if (global.back().LocalEnd()[j] == global.back().GlobalSize()[j])
98 global_l.LocalEnd()[j] = global_l.GlobalSize()[j];
99 else
100 global_l.LocalEnd()[j] = global.back().LocalEnd()[j] / 2 + global_l.GlobalFinerBegin()[j];
[dfed1c]101
[ac6d04]102 global_l.LocalSize()[j] = global_l.LocalEnd()[j] - global_l.LocalBegin()[j];
[dfed1c]103
104 }else {
105
[ac6d04]106 global_l.LocalSize()[j] = global_l.GlobalSize()[j] / procs[j];
[dfed1c]107
[ac6d04]108 remainder[j] = global_l.GlobalSize()[j] % procs[j];
[dfed1c]109 if (comm->GlobalPos()[j] < remainder[j])
[ac6d04]110 ++(global_l.LocalSize()[j]);
[dfed1c]111
[ac6d04]112 global_l.LocalBegin()[j] = comm->GlobalPos()[j] * global_l.LocalSize()[j];
[dfed1c]113
114 if (comm->GlobalPos()[j] >= remainder[j])
[ac6d04]115 global_l.LocalBegin()[j] += remainder[j];
[dfed1c]116
[ac6d04]117 global_l.LocalEnd()[j] = global_l.LocalBegin()[j] + global_l.LocalSize()[j];
[dfed1c]118
119 }
120 }
[ac6d04]121
122 global_l.LocalFinerBegin() = global_l.LocalBegin().Clamp(global_l.GlobalFinerBegin(), global_l.GlobalFinerEnd());
123 global_l.LocalFinerEnd() = global_l.LocalEnd().Clamp(global_l.GlobalFinerBegin(), global_l.GlobalFinerEnd());
124 global_l.LocalFinerSize() = global_l.LocalFinerEnd() - global_l.LocalFinerBegin();
125
[dfed1c]126 }
[ac6d04]127
[dfed1c]128 }else {
129
[ac6d04]130 global_l.LocalBegin() = 0;
131 global_l.LocalEnd() = 0;
132 global_l.LocalSize() = 0;
133 global_l.LocalFinerBegin() = 0;
134 global_l.LocalFinerEnd() = 0;
135 global_l.LocalFinerSize() = 0;
[dfed1c]136
137 }
138
139 last_procs = procs;
140
141 global.push_back(global_l);
142
143 }
144}
145
146bool DomainDecompositionMPI::IsActive(Comm* comm, const Index& size_global, Index& procs)
147{
148 bool is_active = true;
149 const int points_min = 5;
150
151 procs = size_global / points_min + 1;
152
153 for (int i=0; i<3; ++i) {
154 procs[i] = std::min(procs[i], comm->GlobalProcs()[i]);
155 is_active &= comm->GlobalPos()[i] < procs[i];
156 }
157
158 return is_active;
159}
160
161void DomainDecompositionMPI::FineToCoarse(Comm* comm, int& begin, int& end, int levels)
162{
163 int last_point = end - 1;
164
165 for (int i=0; i<levels; ++i) {
166
167 if (begin % 2 == 0)
168 begin /= 2;
169 else
170 begin = (begin+1) / 2;
171
172 if (last_point % 2 == 0)
173 last_point /= 2;
174 else
175 last_point = (last_point-1) / 2;
176
177 }
178
179end = last_point + 1;
180}
Note: See TracBrowser for help on using the repository browser.