Смекни!
smekni.com

Алгоритмы параллельных процессов при исследовании устойчивости подкрепленных пологих оболочек (стр. 8 из 10)

После написания программы были получены серии результатов. Для каждого N (числа членов в разложении искомых функций) было проведено три эксперимента по замеру времени выполнения задачи:

Однопроцессорная система - один последовательный процесс;

Две однопроцессорных системы, связанных Ethernet патчкордом со скоростью обмена данных 100 Мбит - два параллельных процесса.

Одна однопроцессорная двухядерная система с общей памятью - два параллельных процесса.

В качестве тестовых систем были использованы следующие ПК:

Intel Core 2 Duo 2,0 Ггц, 2 Гб оперативной памяти;

Intel Xeon 2x2,66 Ггц, 4 Гб оперативной памяти.

Были получены следующие результаты:

N Последовательный процесс, сек Две однопроцессорные – по одному ядру, сек Одна однопроцессорная -два ядра, сек Maple 12, сек
1 0.051569 0.061439 0.042440 0.8
4 2.124557 0.779514 0.611919 2.9
9 5.022527 3.339019 3.080036 7.8
16 12.646657 10.744853 9.732358 13.0
25 31.078364 26.457036 23.840874 38.6
121 770.707305 644.396220 586.622127 952.3

Заключение

При исследовании устойчивости подкрепленных оболочек с учетом геометрической и физической нелинейности при последовательном вычислении требуется достаточно большое время для расчета одного варианта - до нескольких часов. Расчеты, проведенные с помощью ПК Ansys, показали, что на подготовку входных данных и расчет варианта также требуется несколько часов. Таким образом, при распараллеливании процессов вычисления время расчета одного варианта существенно сокращается, что позволит проводить вычисления самой "затратной" задачи максимум в течение часа, а критические нагрузки при линейно-упругом деформировании в течение нескольких минут.

Работа докладывалась на седьмой всероссийской конференции "Математическое моделирование и краевые задачи (ММ-2010)", проходившей 3-6 июня 2010 в г. Самара. Получила одобрение и положительные отзывы от оргкомитета и участников конференции.

Литература

1. Антонов А.С. Параллельное программирование с использованием технологии MPI - М.: Изд-во МГУ, 2004. - 71 с.

2. Бондаренко В.М., Бондаренко С.В. Инженерные методы нелинейной теории железобетона. - М.: Стройиздат, 1982. - 288 с.

3. Васильев А.Н. Самоучитель C++ с задачами и примерами - М.: Наука и Техника, 2010. - 480 с.

4. Воеводин В.В. Вычислительная математика и структура алгоритмов - М.: Изд-во МГУ, 2006. - 112 с.

5. Воеводин В.В. Математические модели и методы в параллельных процессах - М.: Наука. Гл. ред. физ. - мат. лит., 1986. - 296 с.

6. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления - СПб.: БХВ-Петербург, 2002. - 608 с.

7. Воеводин Вл.В., Жуматий С.А. Вычислительное дело и кластерные системы - М.: Изд-во МГУ, 2007. - 150 с.

8. Жгутов В.М. Математические модели и алгоритмы исследования устойчивости пологих ребристых оболочек при учете различных свойств материала // Известия Орловского гос. техн. ун-та. Серия "Строительство, транспорт". - 2007. №4. - С. 20-23.

9. Ильюшин А.А. Пластичность. М.: Гостехиздат. 1948. - 376 с.

10. Карпов В.В. Математическое моделирование, алгоритмы исследования модели, вычислительный эксперимент в теории оболочек: учеб. пособие - СПб.: СПбГАСУ, 2006. - 330 с.

11. Карпов В.В., Баранова Д.А., Беркалиев Р.Т. Программный комплекс исследования устойчивости оболочек - СПб.: СПбГАСУ, 2009. - 102 с.

12. Карпов В.В., Сальников А.Ю. Вариационные методы и вариационные принципы механики при расчете строительных конструкций: учеб. пособие - СПб.: СПбГАСУ, 2009. - 75 с.

13. Керниган Б, Ритчи Д. Язык программирования C - М.: Вильямс, 2009. - 304 с.

14. Климанов В.И., Тимашев С.А. Нелинейные задачи подкрепленных оболочек. Свердловск: УНЦ АН СССР, 1985. - 291 с.

15. Петров В.В., Овчинников И.Г., Ярославский В.И. Расчет пластинок и оболочек из нелинейно-упругого материала. - Саратов: Изд-во Сарат. ун-та, 1976. - 136 с.

16. Хьюз К., Хьюз Т. Параллельное и распределенное программирование с использованием C++ - М.: Вильямс, 2004. - 672 с.

Приложения

Приложение 1. Код программы

Main. cpp:

/*

Main. cpp

Сизов А.С. ПМ5

2010 г.

*/

// Подключение необходимых заголовочных файлов

#include "mpi. h" // библиотека mpi

#include <stdio. h>

/*

stdio. h (от англ. standard input/output header -

стандартный заголовочный файл ввода/вывода) заголовочный файл

стандартной библиотеки языка Си, содержащий определения макросов,

константы и объявления функций и типов, используемых для различных

операций стандартного ввода и вывода. Функциональность унаследована

от "портативного пакета ввода/вывода" ("portable I/O package"),

написанного Майком Леском из Bell Labs в начале 1970-х.

Функции, объявленные в stdio. h, являются весьма популярными благодаря тому,

что являясь частью Стандартной библиотеки языка Си, они гарантируют работу

на любой платформе, поддерживающей Си. Приложения на отдельных платформах

могут, тем не менее, иметь причины для использования функций ввода/вывода

самой платформы вместо функций stdio. h.

*/

#include <stdlib. h>

/*

stdlib. h - заголовочный файл стандартной библиотеки

общего назначения языка Си, который содержит в себе функции,

занимающиеся выделением памяти, контроль процесса выполнения программы,

преобразования типов и другие.

*/

#include <math. h>

/*

math. h - заголовочный файл стандартной библиотеки языка программирования С,

разработанный для выполнения простых математических операций. Большинство

функций привлекают использование чисел с плавающей точкой. Все эти функции

принимают double, если не определено иначе. Для работы с типами float и

long double используются функции с постфиксами f и l соответственно.

Все функции, принимающие или возвращающие угол, работают с радианами.

*/

#include "matrix. h"

/*

matrix. h - заголовочный файл библиотеки, содержащей определения

класса матрицы matrix, использованного в дальнейшем в программе.

Содержит объявление класса, методы для работы с ним, такие как:

произведение матрицы на матрицу;

сложение матрицы с матрицей;

выделение памяти под матрицу;

выгрузка данных;

загрузка данных;

копирование матрицы;

сравнение полученной единичной матрицы с эталоном единичной матрицы;

обращение матрицы.

*/

// Объявление переменных

double *X1, *X2, *X3, *Y1, *Y2, *Y3; // Коэффициенты аппроксимирующих // функций

double *C1, *C2; // Коэффициенты системы

int N, n, m, E;

double q, h, mu, r, Pi, mu1, Kx, Ky, R1, R2, W;

double a,b;

/*

N - количество членов в приближении по методу Ритца;

n - количество ребер по x;

m - количество ребер по y;

E - модуль упругости материала;

q - поперечная равномерно-распределенная нагрузка;

h - толщина оболочки;

mu - коэффициент Пуассона;

r - ширина ребер;

Pi - число Пи;

R1 - радиус кривизны по x;

R2 - радиус кривизны по y;

a - длина оболочки по x;

b - длина оболочки по y;

*/

// Процедуры вычисления производных функций

double sin_0 (double k, double x)

{

return sin (k * x);

}

double sin_1 (double k, double x) // первая производная

{

return k * cos (k * x);

}

double sin_2 (double k, double x) // вторая производная

{

return - k * k * sin (k * x);

}

double Fx (int k, int i, int j, double arg) // выборка произведений

{ // аппроксимирующих

switch (k) // функций для х

{

case 1:

return sin_1 (X1 [i], arg) * sin_1 (X1 [j], arg);

case 2:

return sin_0 (X1 [i], arg) * sin_0 (X1 [j], arg);

case 3:

return sin_1 (X1 [i], arg) * sin_0 (X2 [j], arg);

case 4:

return sin_0 (X1 [i], arg) * sin_1 (X2 [j], arg);

case 5:

return sin_1 (X1 [i], arg) * sin_0 (X3 [j], arg);

case 6:

return sin_0 (X2 [i], arg) * sin_0 (X2 [j], arg);

case 7:

return sin_1 (X2 [i], arg) * sin_1 (X2 [j], arg);

case 8:

return sin_0 (X2 [i], arg) * sin_0 (X3 [j], arg);

case 9:

return sin_0 (X3 [i], arg) * sin_1 (X1 [j], arg);

case 10:

return sin_0 (X3 [i], arg) * sin_0 (X3 [j], arg);

case 11:

return sin_2 (X3 [i], arg) * sin_2 (X3 [j], arg);

case 12:

return sin_2 (X3 [i], arg) * sin_0 (X3 [j], arg);

case 13:

return sin_1 (X3 [j], arg) * sin_1 (X3 [j], arg);

case 14:

return sin_0 (X3 [j], arg);

default:

return 0;

}

}

double simpsonFx (double a, double b, int k, int i, int j)

{ // метод Симпсона для х

int n = 1000;

double locI, h, xi, s1 = 0.0, s2 = 0.0, y [10000] ;

int f;

h = (b - a) / n;

xi = a;

for (f = 0; f <= 2 * n; f++)

{

y [f] = Fx (k, i,j,xi);

xi = xi + h/2;

}

locI = y [0] + y [2*n] ;

for (f = 2; f < 2*n; f = f + 2)

s1 = s1 + y [f] ;

for (f = 1; f < 2*n; f = f + 2)

s2 = s2 + y [f] ;

locI = (locI + 2.0 * s1 + 4.0 * s2) * (h / 6);

return (locI);

}

double Fy (int k, int i, int j, double arg) // выборка произведений

{ // аппроксимирующих

switch (k) // функций для y

{

case 1:

return sin_0 (Y1 [i], arg) * sin_0 (Y1 [j], arg);

case 2:

return sin_1 (Y1 [i], arg) * sin_1 (Y1 [j], arg);

case 3:

return sin_0 (Y1 [i], arg) * sin_1 (Y2 [j], arg);

case 4:

return sin_1 (Y1 [i], arg) * sin_0 (Y2 [j], arg);

case 5:

return sin_0 (Y1 [i], arg) * sin_0 (Y3 [j], arg);

case 6:

return sin_1 (Y2 [i], arg) * sin_1 (Y2 [j], arg);

case 7:

return sin_0 (Y2 [i], arg) * sin_0 (Y2 [j], arg);

case 8:

return sin_1 (Y2 [i], arg) * sin_0 (Y3 [j], arg);

case 9:

return sin_0 (Y3 [i], arg) * sin_0 (Y1 [j], arg);

case 10:

return sin_0 (Y3 [i], arg) * sin_0 (Y3 [j], arg);

case 11:

return sin_2 (Y3 [i], arg) * sin_2 (Y3 [j], arg);

case 12:

return sin_2 (Y3 [i], arg) * sin_0 (Y3 [j], arg);

case 13:

return sin_1 (Y3 [i], arg) * sin_1 (Y3 [j], arg);

case 14:

return sin_0 (Y3 [j], arg);

default:

return 0;

}

}

double simpsonFy (double a, double b, int k, int i, int j)

{ // метод Симпсона для y

int n = 1000;

double locI, h, xi, s1 = 0.0, s2 = 0.0, y [10000] ;

int f;

h = (b - a) / n;

xi = a;

for (f = 0; f <= 2 * n; f++)

{

y [f] = Fy (k, i,j,xi);

xi = xi + h/2;

}

locI = y [0] + y [2*n] ;

for (f = 2; f < 2*n; f = f + 2)

s1 = s1 + y [f] ;

for (f = 1; f < 2*n; f = f + 2)

s2 = s2 + y [f] ;

locI = (locI + 2.0 * s1 + 4.0 * s2) * (h / 6);

return (locI);

}

double C (int k, int i, int j) // коэффициэнты в ФПЭД

{

switch (k)

{

case 1:

return 2*h*simpsonFx (0.0,a,1, i,j) *simpsonFy (0.0,a,1, i,j) +2*mu1*h*simpsonFx (0.0,a,2, i,j) *simpsonFy (0.0,a,2, i,j);

case 2:

return 2*h*mu*simpsonFx (0.0,a,3, i,j) *simpsonFy (0.0,a,3, i,j) +2*mu1*h*simpsonFx (0.0,a,4, i,j) *simpsonFy (0.0,a,4, i,j);

case 3:

return - 2*h* (Kx+mu*Ky) *simpsonFx (0.0,a,5, i,j) *simpsonFy (0.0,a,5, i,j);

case 4:

return 2*h*mu*simpsonFx (0.0,a,3, i,j) *simpsonFy (0.0,a,3, i,j) +2*mu1*h*simpsonFx (0.0,a,4, i,j) *simpsonFy (0.0,a,4, i,j);

case 5:

return 2*h*simpsonFx (0.0,a,6, i,j) *simpsonFy (0.0,a,6, i,j) +2*mu1*h*simpsonFx (0.0,a,7, i,j) *simpsonFy (0.0,a,7, i,j);