inter.f90

### TABLE OF CONTENTS

- 1. UTI/PRE/interface

## 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