TABLE OF CONTENTS
UTI/PRE/interface [ Modules ]
NOM
inter (bl,nb_bloc,nb_dom,interdom,nbl,ndim)
DESCRIPTION
Creation de la liste des blocs de chaque cote de l interface entre les domaines
pour chaque couple de domaine Di, Dj i<j
cree en position j-i+(i-1)*(2nb_dom-i)/2
une liste de 4 entiers:
- numero du bloc du domaine Di
- numero du bloc du domaine Dj
- position cumule de la liste send pour les 2 blocs
- position cumule de la liste recv
Creation of the list of blocks on each side of the interface between domains
for each pair of domains Di, Dj i<j
create at position j-i+(i-1)*(2nb_dom-i)/2
a list of 4 integers:
- domain Di block number
- number of the block in the Dj domain
- cumulative position of the send list for the 2 blocks
- cumulative position of the recv list
ENTREES / INPUT
bl : liste des blocs a repartir / list of blocks to be distributed
nb_bloc : nombre de blocs / number of blocks
nb_dom : nombre de domaines / number of domains
ndim : dimension du maillage 1/1D, 2/2D , 3/3D / mesh dimension 1/1D, 2/2D, 3/3D
SORTIES / OUTPUT
interdom : liste des blocs de chaque cote de l interface entre les domaines
/ List of blocks on each side of the interface between domains
nbl : nombre d interface de bloc par frontiere de domaine / number of block interfaces per domain border
SOURCE
! Ce logiciel est regi par la licence [CeCILL-B] ! This software is governed by the [CeCILL-B] license !=========================== DECLARATIONS ============================== !.1----- Implicit, Use use num IMPLICIT NONE !.2----- Declaration integer, intent(in) :: nb_bloc !! Nombre de blocs / Number of block integer, intent(in) :: nb_dom !! Nombre de domaine / Number of domains integer, intent(in) :: ndim !! Dimension du probleme / Problem dimension type(bloc),dimension(:),intent(inout) :: bl !! Liste des blocs a repartir / list of blocks to be distributed integer,dimension(:),intent(inout) :: nbl !! Nombre d interface de bloc par frontiere de domaine / number of block interfaces per domain border type(list_int),dimension(:), intent(inout) :: interdom !! Liste des blocs de chaque cote de l interface entre les domaines / List of blocks on each side of the interface between domains integer :: i,j,k,ib,iv,ibj integer :: nxi=0,nyi=0,nzi=0,nxj=0,nyj=0,nzj=0 !====================== START OF THE EXECUTABLE CODE ================== nbl=0 !----- Determination du nombre d interface pour chaque couple Di, Dj DO ib=1,nb_bloc i=bl(ib)%idom DO iv=1,6 j=bl(ib)%dom(iv) IF (i.lt.j) THEN k=j-i+(i-1)*(2*nb_dom-i)/2 nbl(k)=nbl(k)+1 END IF END DO END DO !----- allocation de la liste des interfaces DO i=1,nb_dom-1 DO j=i+1,nb_dom k=j-i+(i-1)*(2*nb_dom-i)/2 IF (nbl(k).ne.0) THEN allocate(interdom(k)%L(nbl(k)*4)) interdom(k)%L=0 END IF END DO END DO !----- Remplissage de la liste des interfaces !!!!!!!!!!! A VERIFIER EN 3D nbl=0 DO ib=1,nb_bloc i=bl(ib)%idom SELECT CASE (ndim) CASE (1) ! Cas 1D nxi=bl(ib)%nx*2**(bl(ib)%nrb) nyi=1 nzi=1 CASE (2) ! Cas 2D nxi=bl(ib)%nx*2**(bl(ib)%nrb) nyi=bl(ib)%ny*2**(bl(ib)%nrb) nzi=1 CASE (3) ! Cas 3D nxi=bl(ib)%nx*2**(bl(ib)%nrb) nyi=bl(ib)%ny*2**(bl(ib)%nrb) nzi=bl(ib)%nz*2**(bl(ib)%nrb) END SELECT DO iv=1,6 j=bl(ib)%dom(iv) IF (i.lt.j) THEN k=j-i+(i-1)*(2*nb_dom-i)/2 interdom(k)%L(nbl(k)*4+1)=ib ! numero du bloc appartenant au domaine Di ibj=bl(ib)%cl(iv) ! numero du bloc appartenant au domaine Dj if(ibj.lt.-100000)ibj=-ibj-100000 interdom(k)%L(nbl(k)*4+2)=ibj SELECT CASE (ndim) CASE (1) ! Cas 1D nxj=bl(ibj)%nx*2**(bl(ibj)%nrb) nyj=1 nzj=1 CASE (2) ! Cas 2D nxj=bl(ibj)%nx*2**(bl(ibj)%nrb) nyj=bl(ibj)%ny*2**(bl(ibj)%nrb) nzj=1 CASE (3) ! Cas 3D nxj=bl(ibj)%nx*2**(bl(ibj)%nrb) nyj=bl(ibj)%ny*2**(bl(ibj)%nrb) nzj=bl(ibj)%nz*2**(bl(ibj)%nrb) END SELECT IF (iv.eq.1.or.iv.eq.2) THEN interdom(k)%L(nbl(k)*4+3)= nyi*nzi ! Position dans la list_send interdom(k)%L(nbl(k)*4+4)= nyj*nzj ! Position dans la list_recv END IF IF (iv.eq.3.or.iv.eq.4) THEN interdom(k)%L(nbl(k)*4+3)= nxi*nzi ! Position dans la list_send interdom(k)%L(nbl(k)*4+4)= nxj*nzj ! Position dans la list_recv END IF IF (ndim.eq.3) THEN IF (iv.eq.5.or.iv.eq.6) THEN interdom(k)%L(nbl(k)*4+3)= nxi*nyi ! Position dans la list_send interdom(k)%L(nbl(k)*4+4)= nxj*nyj ! Position dans la list_recv END IF END IF IF (nbl(k).ne.0)interdom(k)%L(nbl(k)*4+3)=interdom(k)%L(nbl(k)*4+3)+interdom(k)%L((nbl(k)-1)*4+3) !cumul!! IF (nbl(k).ne.0)interdom(k)%L(nbl(k)*4+4)=interdom(k)%L(nbl(k)*4+4)+interdom(k)%L((nbl(k)-1)*4+4) !cumul!! nbl(k)=nbl(k)+1 END IF END DO END DO !=========================== END OF THE SUBROUTINE ==================== END SUBROUTINE inter