TABLE OF CONTENTS
UTI/PRE/splitdom_curve [ 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