VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
Parallel.cpp
Go to the documentation of this file.
1/*--------------------------------*- VM2D -*-----------------*---------------*\
2| ## ## ## ## #### ##### | | Version 1.14 |
3| ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2026/03/06 |
4| ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5| #### ## ## ## ## ## | Open Source Code |
6| ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7| |
8| Copyright (C) 2017-2026 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9*-----------------------------------------------------------------------------*
10| File name: Parallel.cpp |
11| Info: Source code of VM2D |
12| |
13| This file is part of VM2D. |
14| VM2D 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| VM2D 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 VM2D. If not, see <http://www.gnu.org/licenses/>. |
26\*---------------------------------------------------------------------------*/
27
28
40#include "Parallel.h"
41
42using namespace VMlib;
43
44// Распределение задач по процессорам
45parProp Parallel::SplitMPIone(size_t n, bool bcastAll) const
46{
47 parProp par;
48
49 par.totalLen = static_cast<int>(n);
50
51#ifdef USE_MPI
52 MPI_Bcast(&par.totalLen, 1, MPI_INT, 0, commWork);
53#endif
54
55 if (myidWork == 0)
56 {
57 par.len.clear();
58 par.disp.clear();
59
60 par.len.push_back(static_cast<int>(n));
61 par.disp.push_back(0);
62
63 for (int s = 1; s < nProcWork; ++s)
64 {
65 par.len.push_back(0);
66 par.disp.push_back(static_cast<int>(n-1));
67 }
68 }
69
70#ifdef USE_MPI
71 MPI_Scatter(par.len.data(), 1, MPI_INT, &par.myLen, 1, MPI_INT, 0, commWork);
72 MPI_Scatter(par.disp.data(), 1, MPI_INT, &par.myDisp, 1, MPI_INT, 0, commWork);
73#else
74 par.myLen = par.len[0];
75 par.myDisp = par.disp[0];
76#endif
77
78#ifdef USE_MPI
79 if (bcastAll)
80 {
81 if (myidWork != 0)
82 {
83 par.len.resize(nProcWork);
84 par.disp.resize(nProcWork);
85 }
86 MPI_Bcast(par.len.data(), nProcWork, MPI_INT, 0, commWork);
87 MPI_Bcast(par.disp.data(), nProcWork, MPI_INT, 0, commWork);
88 }
89#endif
90
91 return par;
92
93}//SplitMPIone(...)
94
95
96// Распределение задач по процессорам
97parProp Parallel::SplitMPI(size_t n, bool bcastAll) const
98{
99 parProp par;
100
101 par.totalLen = static_cast<int>(n);
102
103#ifdef USE_MPI
104 MPI_Bcast(&par.totalLen, 1, MPI_INT, 0, commWork);
105#endif
106
107 if (myidWork == 0)
108 {
109 par.len.clear();
110 par.disp.clear();
111
112 int nPerP = static_cast<int>(n / nProcWork);
113
114 for (int s = 0; s < nProcWork - 1; ++s)
115 {
116 par.len.push_back(nPerP);
117 par.disp.push_back(s*nPerP);
118 }
119
120 par.len.push_back(static_cast<int>(n) - nPerP * (nProcWork - 1));
121 par.disp.push_back(nPerP * (nProcWork - 1));
122 }
123
124#ifdef USE_MPI
125 MPI_Scatter(par.len.data(), 1, MPI_INT, &par.myLen, 1, MPI_INT, 0, commWork);
126 MPI_Scatter(par.disp.data(), 1, MPI_INT, &par.myDisp, 1, MPI_INT, 0, commWork);
127#else
128 par.myLen = par.len[0];
129 par.myDisp = par.disp[0];
130#endif
131
132#ifdef USE_MPI
133 if (bcastAll)
134 {
135 if (myidWork != 0)
136 {
137 par.len.resize(nProcWork);
138 par.disp.resize(nProcWork);
139 }
140 MPI_Bcast(par.len.data(), nProcWork, MPI_INT, 0, commWork);
141 MPI_Bcast(par.disp.data(), nProcWork, MPI_INT, 0, commWork);
142 }
143#endif
144
145 return par;
146
147}//SplitMPI(...)
148
149
Заголовочный файл с описанием класса Parallel и структуры parProp.
int nProcWork
Число процессоров, решающих конкретную задачу
Definition Parallel.h:100
parProp SplitMPI(size_t n, bool bcastAll=false) const
Распределение задач по процессорам
Definition Parallel.cpp:97
int myidWork
Локальный номер процессора, решающего конкретную задачу
Definition Parallel.h:97
int commWork
Коммуникатор для решения конкретной задачи
Definition Parallel.h:93
parProp SplitMPIone(size_t n, bool bcastAll=false) const
Распределение задач по процессорам
Definition Parallel.cpp:45
Стрктура, содержащая параметры исполнения задачи в параллельном MPI-режиме
Definition Parallel.h:58
int myLen
Число витков, предназначенное текущему процессору
Definition Parallel.h:66
std::vector< int > disp
Список, определяющий номер витка цикла, с которого должен начинать работу данный процессор
Definition Parallel.h:63
std::vector< int > len
Список из чисел витков циклов, предназначенных для каждого процессора
Definition Parallel.h:60
int myDisp
Индекс первого витка из числа витков, предназначенных текущему процессору
Definition Parallel.h:69
int totalLen
Общее число витков, разделенное между всеми процессорами
Definition Parallel.h:72