The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа
next up previous contents
Next: Управление исполнительной средой MPI Up: Топологии процессов Previous: Топологические функции низкого уровня   Contents

Прикладной пример

Пример 6.6 Этот пример показывает, как могут использоваться в прикладной программе функции формирования решетки и функции запроса. Дифференциальные уравнения в частных производных, например, уравнение Пуассона, могут быть решены на прямоугольной решетке. Сначала процессы располагаются в двумерной структуре. Каждый процесс затем запрашивает номера соседей в четырех направлениях (вверх, вниз, вправо, влево). Числовая задача решается итерационным методом, детали которого скрыты в подпрограмме.

На каждой итерации каждый процесс вычисляет новые значения для функции в области решетки, за которую он ответственен. Затем процесс на своих границах должен обменяться значениями функции с соседними процессами. Например, подпрограмма обмена может содержать вызов функции MPI_SEND(..., neigh_rank (1), ...) , чтобы затем послать модифицированные значения функции левому соседу (i-1, j).

    Integer ndims, num_neihg
    Logical reorder
    Parameter (ndims=2,num_neigh=4,reorder=.true.)
    Integer comm, comm_cart, dims (ndims), neigh_def (ndims), ierr
    Integer neigh_rank (num_neigh), own_position (ndims), i,j
    Logical periods (ndims)
    Real*8 u(0:101,0:101), f(0:101,0:101)
    Data dims /ndims*0/
    Comm = MPI_COMM_WORLD
C    устанавливает размер решетки и периодичность 
    Call MPI_DIMS_CREATE (comm, ndims, dims, ierr)
    Periods (1) = .TRUE.
    Periods (2) = .TRUE.     
C   создает структуру решетки в группе WORLD
C    и запрашивает собственную позицию
    Call MPI_CART_CREATE (comm, ndims, dims,
       periods, reorder, comm_cart, ierr)
    Call MPI_CART_GET (comm_cart, ndims, dims, periods, own_position, ierr)
C   просматривает номера соседей. Собственные координаты есть
C   (i,j). Соседями являются процессы с номерами
C    (i-1,j), (i+1,j), (i,j-1), (i,j+1)
    I = own_position(1)
    J = own_position(2)
    Neigh_def(1)= i-1
    Neigh_def(2)= j
    Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(1), ierr)
    Neigh_def(1)= i+1
    Neigh_def(2)= j
    Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(2), ierr)
    Neigh_def(1)= i
    Neigh_def(2)= j-1
    Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(3), ierr)
    Neigh_def(1)= i
    Neigh_def(2)= j+1
    Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(4), ierr)
C   инициализация функций решеток и начало итерации
    Call init (u,f)
    Do 10 it=1,100
    Call relax (u,f)
C   обмен данными с соседними процессами
    сall exchange (u, comm_cart, neigh_rank, num_neigh)
10  continue
    call output (u)
    end


Alex Otwagin 2002-12-10



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру