Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
asdwqd
0 / 0 / 0
Регистрация: 25.12.2015
Сообщений: 2
#1

Решение Диф уравнения OpenMP,MPI на С++ - C++

27.06.2017, 19:41. Просмотров 109. Ответов 0

Добрый день. Задача решить уравнение: Решение Диф уравнения OpenMP,MPI на С++
Не могу разобраться какой процесс отвечает за подсчёт каких данных( за что вообще отвечает каждый процесс и сколько их?)
Запутался, помогите пожалуйста!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "stdafx.h"
#include <cmath>
#include <fstream>
#include <iostream>
#include <mpi.h>
#include <omp.h>
long double xtStepFunction(long double wiPlus1, long double wiMinus1, long double wi, long double tau, long double h)  
{
    return wi + tau * (0.5*pow(wi, 0.5)*((pow((wiPlus1-wiMinus1)/2.0*h,2.0))+pow(wi,0.5)*((wiPlus1 - 2.0*wi + wiMinus1) / pow(h, 2.0)) +pow(wi,0.5)));
}
long double xZeroFunction(long double t)//граничные 0
{
    return pow((pow((1.0 - 10.0 * t), -1.0 / 3.0) - 1.0 / 24.0 * (1.0 - 10.0 * t)), 2.0);
}
long double xOneFunction(long double t)
{
    return pow((1.0/(1.0-10.0*t)+pow((1.0-10.0*t),-1.0/3.0)-1.0/24.0*(1.0-10.0*t)),2.0);
}
long double tZeroFunction(long double x)
{
    return pow((pow(x,2.0)-23.0/24.0),2.0);
}
long double xtCorrectFunction(long double x, long double t)
{
    return pow((1.0 / (1.0 - 10.0*t)*pow(x,2.0) + pow((1.0 - 10.0*t), -1.0 / 3.0) - 1.0 / 24.0*(1.0 - 10.0*t)), 2.0);
}
int main(int argc, char* argv[])
{
    const int numberOfStepsX = 10;
    const int numberOfStepsT = 1000;
 
    const long double stepX = 1.0 / numberOfStepsX;
    const long double stepT = 1.0 / numberOfStepsT;
 
    MPI_Init(&argc, &argv);
 
    int myid, numprocs;
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
 
    long double matrixOfCorrectAnswers[numberOfStepsT][numberOfStepsX] = { 0 };
    long double matrixOfApproximateAnswers[numberOfStepsT][numberOfStepsX] = { 0 };
 
    long double currentX = 0.0;
    long double currentT = 0.0;
    double t1, t2;
    if (myid == 0)
    {
#pragma omp parallel for
        for (int i = 0; i < numberOfStepsT; i++)
        {
            currentX = 0.0;
            for (int j = 0; j < numberOfStepsX; j++)
            {
                matrixOfCorrectAnswers[i][j] = xtCorrectFunction(currentX, currentT);
                currentX += stepX;
            }
            currentT += stepT;
        }
        
        t1 = MPI_Wtime();
        currentX = 0.0;
#pragma omp parallel for
        for (int i = 0; i < numberOfStepsX; i++)
        {
            matrixOfApproximateAnswers[0][i] = tZeroFunction(currentX);
            currentX += stepX;
        }
 
        currentT = 0.0;
#pragma omp parallel for
        for (int i = 0; i < numberOfStepsT; i++)
        {
            matrixOfApproximateAnswers[i][0] = xZeroFunction(currentT);
            matrixOfApproximateAnswers[i][numberOfStepsX - 1] = xOneFunction(currentT);
            currentT += stepT;
        }
    }
    for (int i = 1; i < numberOfStepsT; i++)
    {
        MPI_Bcast(matrixOfApproximateAnswers[i - 1], numberOfStepsX, MPI_LONG_DOUBLE, 0, MPI_COMM_WORLD);
        for (int j = myid + 1; j < numberOfStepsX - 1; j += numprocs)
        {
            matrixOfApproximateAnswers[i][j] = xtStepFunction(matrixOfApproximateAnswers[i - 1][j + 1],
                matrixOfApproximateAnswers[i - 1][j - 1], matrixOfApproximateAnswers[i - 1][j], stepT, stepX);
        }
        if (myid == 0)
        {
            for (int k = 1; k < numprocs; k++)
            {
                long double temp[numberOfStepsX];
                MPI_Recv(temp, numberOfStepsX, MPI_LONG_DOUBLE, k, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
                for (int j = k; j < numberOfStepsX - 1; j += numprocs)
                {
                    matrixOfApproximateAnswers[i][j] = temp[j];
                }
            }
        }
        else
        {
            MPI_Send(&matrixOfApproximateAnswers[i], numberOfStepsX, MPI_LONG_DOUBLE, 0, 0, MPI_COMM_WORLD);
        }
    }
 
    if (myid == 0)
    {
        
        t2 = MPI_Wtime();
        printf("Elapsed time is %f\n", t2 - t1);
        // Saving results to file
        std::ofstream fout1("/My_Designs/mykursa4/results.txt");
        std::ofstream fout2("/My_Designs/mykursa4/results_yavno.txt");
        for (int i = 0; i < numberOfStepsT; i++)
        {
            for (int j = 0; j < numberOfStepsX; j++)
            {
                fout1 << matrixOfCorrectAnswers[i][j] << '\t';
                fout2 << matrixOfApproximateAnswers[i][j] << '\t';
            }
            fout1 << std::endl;
            fout2 << std::endl;
        }
        fout1.close();
        fout2.close();
    }
    MPI_Finalize();
 
    if (myid == 0)
        system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2017, 19:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решение Диф уравнения OpenMP,MPI на С++ (C++):

Параллельная программа для метода холецкого с помощью openMp и mpi - C++
Товарищи,помогите пожалуйста с параллельным программированием: надо написать параллельную программу для метода холецкого с помощью openMp...

Решение квадратного уравнения - C++ Builder
У кого спрашивал, никто не знает( Писал решение квадратного уравнения float a,b,c,d,i,x1,x2; a=StrToFloat(Edit1-&gt;Text); ...

Решение логарифмического уравнения - C++ Builder
Добрый день! Подскажите, пожалуйста, как можно реализовать решение следуюшей задачи. Имеется уравнение x*ln(x) = 8, нужно найти...

Решение уравнения методом Ньютона - C++ Builder
Здравствуйте, Помогите пожалуйста разобраться где я ошибся. Написал программку для вычисления уравнения методом Ньютона, но почему то в...

Решение уравнения большой степени - C++ Builder
Есть вопрос по поводу решения, уравнения 4 и более степеней, типа 5x^5+6x^4-8x^3-4x^2+9x+10=0. Есть ли какой нибудь универсальный метод...

Решение нелинейного уравнения методом хорд - C++ Builder
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #include &lt;math.h&gt; #include &lt;Math.h&gt;...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2017, 19:41
Привет! Вот еще темы с ответами:

Решение квадратного уравнения. Проблемы с GUI - C++ Builder
Помогите пжл. Я только начал изучать язык. Пытался написать в билдере решение квадратного уравнения и не могу понять в чем причина. ...

Решение квадратного уравнения (через классы) - C++ Builder
Создать класс для вычисления квадратного уравнения, поля коэф.уравнения, методы само решение считает правильно, но не выводит х2, и не...

Решение трансцендентного уравнения с одной неизвестной методом Ньютона - C++ Builder
Помогите пожалуйста начинающему програмисту решить задачу. Нужно сделать в C++Builder. Отделить корни уравнения f (x)=0, который...

Решение диф. уравнения - MathCAD
Не удаётся решить следующее диф. уравнение cos(5x)-sin({x}^{2})=\frac{d}{dx}y да, я знаю, что оно не сложное, но и решить у меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru