PARALLEL.RU

Дискуссионный клуб по параллельным вычислениям
Текущее время: 24 ноя 17 8:46

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: 16 фев 06 16:48 
Не в сети

Зарегистрирован: 15 фев 06 19:03
Сообщения: 3
Откуда: Екатеринбург
Помогите, пожалуста, распараллелить решение ленточной матрицы методом Гаусса. Уже три месяца борюсь с этой проблемой, но удовлетворительных результатов так и не достигла. Языки MPI или ОpenMP. Буду рада любой информации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 16 фев 06 17:09 
Не в сети

Зарегистрирован: 18 ноя 02 16:40
Сообщения: 168
Откуда: Москва
Не очень понятно, нужно разработать новый параллеьный алгоритм или распараллелить уже имеющийся последовательный алгоритм?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 20 фев 06 15:11 
Не в сети

Зарегистрирован: 15 фев 06 19:03
Сообщения: 3
Откуда: Екатеринбург
Существует последовательный алгоритм. Необходимо его распараллелить.
Вот алгоритм:
// Linsurkel4U.cpp
// Решение ЛСУ в МКЭ для ленточной матрицы

#include <vcl.h>
#pragma hdrstop

#include "Linsurkel2D.h"
#include "Main2D.h"
#include "Masiva2D.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
// Решение ЛСУ в МКЭ для ленточной матрицы
void LinsurSkorostey(void)
{
// исходные данные:
// mgesk[kper][shirina] - матрица жесткости,
// kper - общее кол-во неизвестных
// b - полуширина ленты
// shirina - ширина ленты, равная 2*b + 1
// vs[kper] - массив неизвестных

// прямой ход Гаусса для mgesk[][]
fgauspramo(strmgestk.kper, strmgestk.shirina, strmgestk.b);
// обратный ход Гаусса
fgausobratno(strmgestk.kper, strmgestk.shirina, strmgestk.b);
}
//----------------------------------------------------------------------------
void fgauspramo(int kper, int shirina, int b)
{ // прямой ход Гаусса для массива mgesk[][]
int i, b1, kper0, ipr, k, k1, p, n1, j, jj2, kk2, delta;
double r1, c, v1;

b1=b+1;
kper0=kper - 1;
ipr=kper - b1;
kk2=shirina;
jj2=b1;
for(i=0; i < kper0; i++)
{
c=mgesk[i][b];
delta=i - ipr;
if(delta > 0)
{
kk2=shirina - delta;
jj2=b1-delta;
}
for(k=b1; k < kk2; k++)
if( fabs(mgesk[i][k]) > 1.E-11)
mgesk[i][k]=mgesk[i][k]/c;
//правая часть
vs[i]=vs[i]/c;
v1=vs[i];

// обнуляем под диагональю i-й столбец массива mgesk[j][i]
for(j=1; j < jj2; j++)
{
p=i+j;
n1=b-j;
r1=mgesk[p][n1];
if(fabs(r1) > 1.E-11)
{
for(k=1; k < jj2; k++)
{
k1=n1+k;
mgesk[p][k1]=mgesk[p][k1] - r1*mgesk[i][b+k];
}
//правая часть
vs[p]=vs[p] - r1*v1;
}
}//end p
} // end i
vs[kper0]=vs[kper0]/mgesk[kper0][b];
}
//----------------------------------------------------------
void fgausobratno(int kper, int shirina, int b) // обратный ход Гаусса в конце
{
int i, b1, kper0, j, jj2, p, pn, pk, k, kv;
double v1;

b1=b+1;
kper0=kper-1;
// обнуляем над диагональю k-й столбец массива mgesk[i][k]
for(i=kper0; i > 0; i--)
{
v1=vs[i];
if(fabs(v1) > 1.E-11)
{
for(j=1; j < b1; j++)
{
p=i-j;
k=b+j;
if(p < 0 )goto metka;
if( fabs(mgesk[p][k]) > 1.E-11)
vs[p]=vs[p] - mgesk[p][k]*v1;
}
}
metka:;
}
}
//-----------------------------------------------------------

Буду рада любой помощи.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB