RPN_COMM |
(RPN_COMM_xch_halo) |
SUBROUTINE RPN_COMM_xch_halo (g,minx,maxx,miny,maxy,ni,nj,nk,halox,haloy,periodx,periody,gni,npol_row)
Dimensions du tableau local g: g(minx:maxx,miny:maxy,nk)
Dimensions du problème local: g(ni,nj,nk)
Dimensions du problème local + halo: g(1-halox,ni+halox,1-haloy,nj+haloy,nk)
Dimensions d'une rangée (cas semi-lag): g(gni,nj,nk)
maxx
minx +-------------------+ maxy
| halo
|
| +---------------+ |
| | ni
| |
| |
nj| |
| |(1,1,k)
| |
| +---------------+ |
|
|
+-------------------+ miny
Taille du probè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 de halo ouest-est: la bande notée "x" se retrouve dans le halo du processeur de droite:
P0
P1
+-----------+
+-----------+
| halo x |
|x halo |
| +-----+-+ |
|x+-------+ |
| | x| | --------->
|x| | |
| | x| |
|x| | |
| +-----+-+ |
|x+-------+ |
| halo x |
|x halo |
+-----------+
+-----------+
Exemple d'échange 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 |
| +------+ | | +------+ | | +------+ |
| +---------------+ |
| |xxxxxx| | + | |xxxxxx| | + | |xxxxxx| | -> | |xxxxxxxxxxxxxxx|
|
| |xxxxxx| | | |xxxxxx| | | |xxxxxx| |
| |xxxxxxxxxxxxxxx| |
| +------+ | | +------+ | | +------+ |
| +---------------+ |
| |
| | |
| |
|
+----------+ +----------+ +----------+
+-------------------+
N.B.: Évidemment, il faut que minx <= 1-halox < ni+halox <= maxx (idem pour y)
Si npol_row > 0, alors l'échange semi-lagrangien sera utilisé pour les npol_row rangées de processeurs au nord et au sud.