RPN_COMM |
(RPN_COMM_adj_halo) |
SUBROUTINE RPN_COMM_xch_halo (larray,minx,maxx,miny,maxy,ni,nj,nk,halox,haloy,periodx,periody,gni,npol_row)
larray | Tableau contenant la tuile locale | real ou integer | I/O |
minx,maxx, miny, maxy | Dimensions de larray (nk pour l'axe z) | integer | I |
ni,nj,nk | Taille du problème de la tuile locale | integer | I |
halox,haloy | Largeur des halos en x et en y | integer | I |
periodx,periody | Periodicité en x et y | logical | I |
gni | Taille du problème global en x (cas semi-lag seulement) | integer | I |
npol_row | Nb de rangées de processeurs aux pôles (cas semi-lag) | integer | I |
Dimensions du tableau local larray: larray(minx:maxx,miny:maxy,nk)
Dimensions du problème local: larray(ni,nj,nk)
Dimensions du problème local + halo: larray(1-halox,ni+halox,1-haloy,nj+haloy,nk)
Dimensions d'une rangée (cas semi-lag): larray(gni,nj,nk)
maxx
minx +-------------------+ maxy
| halo
|
| +---------------+ |
| | ni
| |
| |
nj| |
| |(1,1,k)
| |
| +---------------+ |
|
|
+-------------------+ miny
Taille du problème et décomposition du domaine pour 3x3 processeurs:
1
gni
+--+--+--+
|P6|P7|P8|
+--+--+--+
|P3|P4|P5|
+--+--+--+
|P0|P1|P2|
+--+--+--+
1
gni
Exemple d'échange adjoint de halo ouest-est: la bande notée "x" s'additionne à la bande "y" du tableau local du processeur de droite:
P0 P1
+-----------+
+-------------+
| halo x|
| y+x |
| +-------+x|
| +---------+ |
| | |x| --------->
| |y+x | |
| | |x|
| |y+x | |
| +-------+x|
| +---------+ |
| halo x|
| y+x |
+-----------+
+-------------+
Exemple d'échange adjoint de halo, cas semi-lagrangien: ici, on "colle" les tableaux d'une rangée est-ouest de processeurs. À la fin du processus, tous les processeurs de la rangée ont la bande "globale"
P0
P1
P2
P0 et P1 et P2
(a=x+y, b=y+z)
+----------+ +----------+ +----------+
+---------------------+
|xxxxzzxxxx| |yyyyyyyyyy| |zzzzzzzzzz|
|xxxxxxaayyyybbzzzzzzz|
|x+------+x| |y+------+y| |z+------+z|
|x+-----------------+z|
|x|xxxxxx|x| + |y|yyyyyy|y| + |z|zzzzzz|z| -> |x|xxxxaayyyybbzzzzz|z|
|x|xxxxxx|x| |y|yyyyyy|y| |z|zzzzzz|z|
|x|xxxxaayyyybbzzzzz|z|
|x+------+x| |y+------+y| |z+------+z|
|x+-----------------+z|
|xxxxxxxxxx| |yyyyyyyyyy| |zzzzzzzzzz|
|xxxxxxaayyyybbzzzzzzz|
+----------+ +----------+ +----------+
+---------------------+
N.B.: Évidemment, il faut que minx <= 1-halox < ni+halox <= maxx (idem pour y)
Si npol_row > 0, alors l'échange adjoint semi-lagrangien sera utilisé pour les npol_row rangées de processeurs au nord et au sud.