Новосибирский государственный технический университет
Кафедра параллельных вычислительных технологий
Лабораторная работа №3
по теме: “Архитектура ЭВМ и вычислительных систем”
Факультет: ПМИ
Группа: ПМ-71
Студент: Гурьева А., Данилова И.
Проверил: Куликов И.М.
Новосибирск
2008
Задание
1. Разобрать последовательный вариант программы.
2. Реализовать параллельный вариант программы с использованием библиотеки OpenMP. Функция решения СЛАУ должна находиться в параллельном регионе.
3. Посчитать теоретическое и практическое ускорение параллельной программы.
Текст программы
// sss.cpp : Defines the entry point for the console application.
//
/*
Решение тепловой задачи
Структура входного файла param.dat:
- размер области по оси x
- размер области по оси y
- количество элементов по оси x
- количество элементов по оси y
- x координата нижнего левого угла инородного элемента
- y координата нижнего левого угла инородного элемента
- x координата верхнего правого угла инородного элемента
- y координата верхнего правого угла инородного элемента
- значение коэффициента теплопроводности для области
- значение коэффициента теплопроводности для элемента
- значение источника для элемента
Пример param.dat
1.0 1.0
100 100
0.0 0.2 0.5 0.4
1.0 10.0
1.0
*/
#include <stdio.h>
#include "imvlparam.h"
#include <stdlib.h>
#include <time.h>
#include <conio.h>
int jk=0,mk=0;
/* Параметры задачи */
real sx, sy; // размер области
integer nx, ny; // количество элементов
real dx1, dy1, dx2, dy2;// прямоугольник инородного объекта
real muSpace, muObject; // теплопроводности объекта и области
real hx, hy; // шаги по осям
real qt; // источник тепла
/* Коэффициент теплопроводности */
real GetMu(real x, real y)
{
if( dx1<=x && x<=dx2 && dy1<=y && y<=dy2 ) return muObject;
return muSpace;
}
/* Источник тепла */
real GetF(real x, real y)
{
if( dx1<=x && x<=dx2 && dy1<=y && y<=dy2 ) return qt;
return 1.0;
}
/* Основная функция */
int main()
{ float start;
start = clock();
/* Локальные переменные */
integer i, k, n1, n2, n3, n4;
real hx2, hy2, tmp, u1, u2, u3, ud, mu, f1, f2, f3,f4;
real B[4][4], C[4][4], F[4];
FILE* FSolve;
/* Чтение параметров задачи */
FILE *FParam = fopen("param.dat","r");
fscanf(FParam,"%lf %lf",&sx,&sy);
fscanf(FParam,"%d %d",&nx,&ny);
fscanf(FParam,"%lf %lf %lf %lf",&dx1,&dy1,&dx2,&dy2);
fscanf(FParam,"%lf %lf",&muSpace,&muObject);
fscanf(FParam,"%lf",&qt);
hx = sx/(real)nx;
hy = sy/(real)ny;
hx2 = hx*hx;
hy2 = hy*hy;
fclose(FParam);
/* Создание матрицы */
IMVL_CreateMatrix((nx+1)*(ny+1),4194304,1.0e-30);
/* Построение портрета матрицы */
for(i=0 ; i<nx ; i++)
for(k=0 ; k<ny ; k++)
{
/* Нахождение опорной точки */
n1 = k*(nx+1)+i;
n2 = k*(nx+1)+i+1;
n3 = (k+1)*(nx+1)+i;
n4 = (k+1)*(nx+1)+i+1;
/* Создание элементов матрицы */
IMVL_CreateElement(n1,n1);
IMVL_CreateElement(n1,n2);
IMVL_CreateElement(n1,n3);
IMVL_CreateElement(n1,n4);
IMVL_CreateElement(n2,n1);
IMVL_CreateElement(n2,n2);
IMVL_CreateElement(n2,n3);
IMVL_CreateElement(n2,n4);
IMVL_CreateElement(n3,n1);
IMVL_CreateElement(n3,n2);
IMVL_CreateElement(n3,n3);
IMVL_CreateElement(n3,n4);
IMVL_CreateElement(n4,n1);
IMVL_CreateElement(n4,n2);
IMVL_CreateElement(n4,n3);
IMVL_CreateElement(n4,n4);
}
/* Достроим портрет */
IMVL_CreatePortrait();
/* Формирование матрицы жёсткости */
tmp = 1.0/(hx*hy);
ud = (hx2+hy2)*tmp/3.0;
u1 = (hx2-2.0*hy2)*tmp/6.0;
u2 =-(2.0*hx2-hy2)*tmp/6.0;
u3 =-(hx2+hy2)*tmp/6.0;
B[0][0] = ud; B[0][1] = u1; B[0][2] = u2; B[0][3] = u3;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.