TABLE OF CONTENTS


UTI/PRE/interface [ Modules ]

[ Top ] [ 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