Редактирование: MPI решение волнового уравнения
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 3: | Строка 3: | ||
:<math>T'' = c\ddot{T}</math> | :<math>T'' = c\ddot{T}</math> | ||
− | В конце программы добавлено однопроцессорное решение для проверки | + | В конце программы добавлено однопроцессорное решение для проверки работы программы. |
− | |||
− | |||
<syntaxhighlight lang="cpp" line start="1" enclose="div"> | <syntaxhighlight lang="cpp" line start="1" enclose="div"> | ||
#include <iostream> | #include <iostream> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <math.h> | #include <math.h> | ||
− | |||
#include "include/mpi.h" | #include "include/mpi.h" | ||
using namespace std; | using namespace std; | ||
Строка 31: | Строка 28: | ||
MPI_Get_processor_name(processor_name,&namelen); | MPI_Get_processor_name(processor_name,&namelen); | ||
− | int N = | + | int N = 100 + 2; // количество частиц в цепочке, 2 частицы для г.у. |
− | double t = | + | double t = 30; // общее время расчета стержня |
− | double dt = 0.01; | + | double dt = 0.01; // шаг |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// здесь задаются начальные условия | // здесь задаются начальные условия | ||
− | double U[N], V | + | double U[N], V[N]; |
for (int i = 1; i < N - 1; i++) { | for (int i = 1; i < N - 1; i++) { | ||
− | U[i] = | + | U[i] = 0; |
− | if (i < N / | + | if (i < N / 2) V[i] = 0; |
else V[i] = 0.01; | else V[i] = 0.01; | ||
} | } | ||
− | int N_per_proc = ceil | + | int N_per_proc = ceil(N / numprocs); // количество частиц на каждый процессор |
− | for (double | + | // расчет системы |
+ | for (double i = 0; i < t; i+= dt) { | ||
// зеркальные Г.У. | // зеркальные Г.У. | ||
U[0] = U[1]; | U[0] = U[1]; | ||
Строка 60: | Строка 52: | ||
// расчет скоростей для данного шага | // расчет скоростей для данного шага | ||
for (int j = 1 + N_per_proc * myid; j < 1 + N_per_proc * (myid + 1); j++) { | for (int j = 1 + N_per_proc * myid; j < 1 + N_per_proc * (myid + 1); j++) { | ||
− | V[j] += (U[j + 1] - 2 * U[j] + U[j - 1]) * dt; | + | if (j < N - 1) { |
+ | V[j] += (U[j + 1] - 2 * U[j] + U[j - 1]) * dt; | ||
+ | } | ||
} | } | ||
+ | |||
+ | MPI_Barrier(MPI_COMM_WORLD); // здесь происходит синхронизация данных | ||
// расчет перемещений для данного шага | // расчет перемещений для данного шага | ||
for (int j = 1 + N_per_proc * myid; j < 1 + N_per_proc * (myid + 1); j++) { | for (int j = 1 + N_per_proc * myid; j < 1 + N_per_proc * (myid + 1); j++) { | ||
− | U[j] += V[j] * dt; | + | if (j < N - 1) { |
+ | U[j] += V[j] * dt; | ||
+ | } | ||
} | } | ||
− | + | MPI_Barrier(MPI_COMM_WORLD); // здесь происходит синхронизация данных | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// Если это главный процесс, вывод полученного результата | // Если это главный процесс, вывод полученного результата | ||
Строка 98: | Строка 73: | ||
// здесь происходит расчет системы на одном процессоре, для сравнения результатов | // здесь происходит расчет системы на одном процессоре, для сравнения результатов | ||
− | |||
− | |||
− | |||
− | |||
double U1[N], V1[N]; | double U1[N], V1[N]; | ||
for (int i = 1; i < N - 1; i++) { | for (int i = 1; i < N - 1; i++) { | ||
− | U1[i] = | + | U1[i] = 0; |
− | if (i < N / | + | if (i < N / 2) V1[i] = 0; |
else V1[i] = 0.01; | else V1[i] = 0.01; | ||
} | } | ||
Строка 121: | Строка 92: | ||
} | } | ||
− | + | // вывод скорости узлов стержня (MPI и однопроцессорное решение) | |
− | |||
− | // вывод | ||
for (int i = 1; i < N - 1; i++) { | for (int i = 1; i < N - 1; i++) { | ||
− | printf("i = %d, | + | printf("i = %d, V = %f, V1 = %f\n", i, V[i], V1[i]); |
} | } | ||
− | |||
− | |||
} | } | ||
Строка 136: | Строка 103: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |