splitdom_Z.f90

### TABLE OF CONTENTS

- 1. UTI/PRE/splitdom_curve

## UTI/PRE/splitdom_curve [ Modules ]

[ Top ] [ Modules ]

NOM

      splitdom_curve (bl,nb_bloc,nbdv,ndim)

DESCRIPTION

      Affectation de numeros de domaines pour les courbes (zorder, Hilbert,...)
      Assign domain numbers for curves (zorder, Hilbert,...)

        ENTREES / INPUT
     bl      : liste des blocs a repartir / list of blocks to distribute
     nb_bloc : nombre de blocs / number of blocks
     nbdv    : nombre de domaines desires / number of domains required
     ndim    : dimension du maillage 1/1D, 2/2D , 3/3D  / mesh dimension 1/1D, 2/2D, 3/3D

        SORTIES / OUTPUT
     bl      : liste des blocs avec un numero de domaine attribue / list of blocks with assigned domain number

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
      !USE uti
      IMPLICIT NONE
    !.2-----  Declaration

      integer, intent(in)                   :: nb_bloc !! Nombre de blocs / Number of blocks
      integer, intent(in)                   :: nbdv  !! Nombre de domaines desires / Number of domains required
      integer, intent(in)                   :: ndim !! Dimension du probleme / Problem dimension
      type(bloc),dimension(:),intent(inout) :: bl !! Liste des blocs / list of blocks

      integer,allocatable,dimension(:,:)      :: inum
      integer                               :: ib, nbcell_obj,nbd_obj,numdom,nbcell_deb
    !====================== START OF THE EXECUTABLE CODE  ==================
    IF (nbdv.gt.nb_bloc)  call print_err('SPLITDOM_Z', 'Oupsss ....')

      allocate(inum(nb_bloc,3))
      DO ib=1,nb_bloc
            inum(bl(ib)%morton,1)=ib ! position du bloc dans la liste z-order
            IF (ndim.eq.1) inum(bl(ib)%morton,2)=bl(ib)%nx*2**(bl(ib)%nrb) ! nbre de cellules du bloc
            IF (ndim.eq.2) inum(bl(ib)%morton,2)=bl(ib)%nx*2**(bl(ib)%nrb)*bl(ib)%ny*2**(bl(ib)%nrb)
            IF (ndim.eq.3) inum(bl(ib)%morton,2)=bl(ib)%nx*2**(bl(ib)%nrb)*bl(ib)%ny*2**(bl(ib)%nrb)*bl(ib)%nz*2**(bl(ib)%nrb)
      END DO
       inum(1,3)=inum(1,2)
      DO ib=2,nb_bloc
            inum(ib,3)=inum(ib,2)+inum(ib-1,3) ! nombre de cellules cumule  en suivant le z-order
      END DO

      nbcell_obj=int(inum(nb_bloc,3)/nbdv) ! Objectif Nbre de cellule par domaine
      numdom=1
      nbd_obj=nbdv ! nbre de domaines restant a traiter
      nbcell_deb=0
      do ib=1,nb_bloc
          bl(inum(ib,1))%idom=numdom
          if(inum(ib,3)-nbcell_deb.ge.nbcell_obj)then
              numdom=numdom+1
              nbd_obj=nbd_obj-1
              nbcell_deb=inum(ib,3)
              if(nbd_obj.eq.1)nbcell_obj=inum(nb_bloc,3)-nbcell_deb+1
              !nbcell_obj=nbcell_obj+inum(ib,3) !int((inum(nb_bloc,3)-inum(ib,3))/nbd_obj)
          endif
      enddo
    deallocate(inum)

    !===========================   END OF THE SUBROUTINE    ====================
    END SUBROUTINE splitdom_Z