Vous êtes sur la page 1sur 5

!

USTO- Fac-G-Mecanique
! AZZI ABBES, www.abbesazzi.com
! Programme pour generation de maillage
! canal a section droite carree et paroi inferieure ondulee
program grid
implicit none
integer*4 I, J,k, ni,nj,nk,nx,ny,nz,nkd,njd,n,l,no
real*8 x,y,z,ray1,ray2,rax,raz1,raz2,xl,yl,zl,zldemi,yldemi,dz,scale,am,arg,pi,c
pi,beta,alfa
PARAMETER (NX=160,NY=50,NZ=50)
common/first/x(nx,ny,nz),y(nx,ny,nz),z(nx,ny,nz)
!**********************************************************************
!**********************************************************************
character*35 filegri
! fichier output, maillage pour compress
character*35 filetec
! fichier output, visualisation sur tecplot
NI=160
;
NK=50 ; NJ=50 !
NJD=25 ; NKD=25
RAY1=1.08 ;RAY2=0.92 ; RAZ1=1.08 ; RAZ2=0.92 ; RAX=1.0
XL=14.0
! longueur du canal
ZL=1.0 ; ZLDEMI=0.5*ZL ! largeur
YL=1.0 ; YLDEMI=0.5*YL ! hauteur
scale=1.0
no=14
! nbre d'ondulations
am=0.05
! amplitude des ondulations
filegri= 'grid2'
filetec= 'grid2.plt'
open(50,file=filetec)
open(51,file=filegri,form='unformatted')
! initialisation
do k=1,nk
do i=1,ni
do j=1,nj
z(i,j,k)=.0
y(i,j,k)=.0
x(i,j,k)=.0
enddo
enddo
enddo
! les six points de la surface a z=0
!"
On commence par gnrer les points 1, 2, 3 et 4.
call point(1,1,1,.0,.0,.0)
call point(ni,1,1,xl,.0,.0)
call point(1,nj,1,.0,yl,.0)
call point(ni,nj,1,xl,yl,.0)
!"
Les points 5 et 6 permettent de pratiquer un raffinement du maillage dan
s les deux zones proche-paroi.
call point(1,njd,1,.0,yldemi,.0)
call point(ni,njd,1,xl,yldemi,.0)
! les lignes
!"
Les six points sont ensuite relis par des lignes tout en imposant le raff
inement travers les coefficients ray1 et ray2.
call lines(rax, 1,1,1 ,
ni,1,1)
call lines(rax, 1,nj,1, ni,nj,1)
call lines(ray1, 1,1,1, 1,njd,1 )
call lines(ray2, 1,njd,1, 1,nj,1)
call lines(ray1, ni,1,1, ni,njd,1 )
call lines(ray2, ni,njd,1, ni,nj,1)
! l'ondulation, a y=0

!"
L'ondulation est applique sur la ligne y=0 travers le changement de la co
ordonne y.
k=1
j=1
DO i=2,ni-1
ARG=no*2.0*3.1415*x(I,J,1)/XL
y(I,J,k)=y(I,J,k)-AM*(1.0-COS(ARG))
enddo
! generation de la surface
!"
Enfin, on construit la surface limite par les six lignes.
call bgrid(x,3,2,2,1,ni-1,nj-1,1) !,ni,nj,nk)
call bgrid(y,3,2,2,1,ni-1,nj-1,1) !,ni,nj,nk)
call bgrid(z,3,2,2,1,ni-1,nj-1,1) !,ni,nj,nk)
!"
Les coordonnes x et z sont ensuite injectes sur tout le domaine de calcul.
do k=1,nk
do i=1,ni
do j=1,nj
x(i,j,k)=x(i,j,1)
y(i,j,k)=y(i,j,1)
enddo
enddo
enddo
! les^points de la surface a x=0
!"
L'tape suivante consiste gnrer les 4 points manquants sur la face x=0.
call point(1,1,nk,.0,.0,zl)
call point(1,nj,nk,.0,yl,zl)
call point(1,1,nkd,.0,.0,zldemi)
call point(1,nj,nkd,.0,yl,zldemi)
!"
Deux lignes sont ensuite ncessaire pour imposer le raffinement du maillag
e (raz1 et raz2)
call lines(raz1, 1,nj,1, 1,nj,nkd )
call lines(raz2, 1,nj,nkd, 1,nj,nk)
!"
La dernire tape consiste translater la distribution de la coordonne z sur t
out le domaine de calcul.
do k=1,nk
do i=1,ni
do j=1,nj
z(i,j,k)=z(1,nj,k)
enddo
enddo
enddo
2000 continue
! scaling
!"
Finalement, on termine par une opration de mise l'chelle (si ncessaire)
do i=1,ni
do j=1,nj
do k=1,nk
x(i,j,k)=x(i,j,k)*scale
y(i,j,k)=y(i,j,k)*scale
z(i,j,k)=z(i,j,k)*scale
enddo
enddo
enddo
!et la sauvegarde des fichiers de maillage en fonction du code CFD et aussi pour
visualisation (ici c'est Tecplot
! fichier pr compress
write(51) 1
write(51) ni,nj,nk
write(51) (((x(i,j,k),i=1,ni),j=1,nj),k=1,nk)

write(51) (((y(i,j,k),i=1,ni),j=1,nj),k=1,nk)
write(51) (((z(i,j,k),i=1,ni),j=1,nj),k=1,nk)
CLOSE(51)
filegri= 'grid3'
open(51,file=filegri,form='unformatted')
write(51) 1
write(51) ni,nj,nk
write(51) (((x(i,j,k),i=1,ni),j=1,nj),k=1,nk)
write(51) (((y(i,j,k),i=1,ni),j=1,nj),k=1,nk)
write(51) (((z(i,j,k),i=1,ni),j=1,nj),k=1,nk)
CLOSE(51)
! fichier tecplot
write(50,*)' TITLE = bla bla'
write(50,*) 'VARIABLES ="X","Y","Z"'
write(50,*)' zone I=',ni,', J=',nj,' k=',nk,', F=BLOCK'
write(50,*)(((x(i,j,k),i=1,ni),j=1,nj),k=1,nk)
write(50,*)(((y(i,j,k),i=1,ni),j=1,nj),k=1,nk)
write(50,*)(((z(i,j,k),i=1,ni),j=1,nj),k=1,nk)
close(50)
write(6,*)' grid file generated',filegri
write(*,*)' grid file generated',filegri
write(*,*) ' writting grid file ok'
end
!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine point(i,j,k,xi,yj,zk)
implicit none
integer*4 i,j,k
real*8 xi,yj,zk,x,y,z,nx,ny,nz
PARAMETER (NX=160,NY=50,NZ=50)
common/first/x(nx,ny,nz),y(nx,ny,nz),z(nx,ny,nz)
x(i,j,k)=xi
y(i,j,k)=yj
z(i,j,k)=zk
write(*,*)' point:',i,j,k,'
:ok'
return
end
!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine lines(rax,is,js,ks,ie,je,ke)
implicit none
integer*4 is,js,ks,ie,je,ke,nx,ny,nz,nn,i,j,k
real*8 rax,small,great,x,y,z,dx,dy,dz,amod,toy,dyy,dxx,dzz
PARAMETER (NX=160,NY=50,NZ=50)
parameter (small=1.e-30,great=1.e30)
common/first/x(nx,ny,nz),y(nx,ny,nz),z(nx,ny,nz)
dx=x(ie,je,ke)-x(is,js,ks)
dy=y(ie,je,ke)-y(is,js,ks)
dz=z(ie,je,ke)-z(is,js,ks)
amod=sqrt(dx**2+dy**2+dz**2)
if (is.eq.ie.and.ks.eq.ke) then
nn=(je-js)+1

! sens js ---> je

toy=.0
do j=js+1,je
toy=toy+rax**(j-js-1)
enddo
dyy=amod/toy
do j=js+1,je-1
x(is,j,ks)=x(is,j-1,ks)+(dx*dyy/amod)*rax**(j-js-1)
y(is,j,ks)=y(is,j-1,ks)+(dy*dyy/amod)*rax**(j-js-1)
z(is,j,ks)=z(is,j-1,ks)+(dz*dyy/amod)*rax**(j-js-1)
enddo
else if(js.eq.je.and.ks.eq.ke) then ! sens is ---> ie
nn=(ie-is)+1
toy=.0
do i=is+1,ie
toy=toy+rax**(i-is-1)
enddo
dxx=amod/toy
do i=is+1,ie-1
x(i,js,ks)=x(i-1,js,ks)+(dx*dxx/amod)*rax**(i-is-1)
y(i,js,ks)=y(i-1,js,ks)+(dy*dxx/amod)*rax**(i-is-1)
z(i,js,ks)=z(i-1,js,ks)+(dz*dxx/amod)*rax**(i-is-1)
enddo
else if(is.eq.ie.and.js.eq.je) then ! sens ks----> ke
nn=(ke-ks)+1
toy=.0
do k=ks+1,ke
toy=toy+rax**(k-ks-1)
enddo
dzz=amod/toy
do k=ks+1,ke-1
x(is,js,k)=x(is,js,k-1)+(dx*dzz/amod)*rax**(k-ks-1)
y(is,js,k)=y(is,js,k-1)+(dy*dzz/amod)*rax**(k-ks-1)
z(is,js,k)=z(is,js,k-1)+(dz*dzz/amod)*rax**(k-ks-1)
enddo
else
write(*,*)' valeurs des indexes fausses',is,js,ks,ie,je,ke
stop
endif
return
end
!c**************************************************************************
subroutine bgrid(phi,ijk,is,js,ks,ie,je,ke) !,ni,nj,nk)
implicit none
integer*4 i,j,k,is,js,ks,ie,je,ke,ijk,nx,ny,nz,jsp,ksp,isp,jep,kep,iep
real*8 phi,small,great,z1,y1,sj,y1j,ynj,z1k,sk,si,s1i,sni,x1,xni,x1i
parameter (small=1.e-30,great=1.e30)
PARAMETER (NX=160,NY=50,NZ=50)
!c*************************************************************************
dimension phi(nx,ny,nz)
goto(100,200,300),ijk
100 jsp=js-1
ksp=ks-1
jep=je+1
kep=ke+1
z1=1./float(kep-ksp)
y1=1./float(jep-jsp)
do 110 i=is,ie
do 110 j=js,je

sj=(j-jsp)*y1
y1j=(1.-sj)*phi(i,jsp,ksp)+sj*phi(i,jep,ksp)
ynj=(1.-sj)*phi(i,jsp,kep)+sj*phi(i,jep,kep)
do 110 k=ks,ke
z1k=(1.-sj)*phi(i,jsp,k)+sj*phi(i,jep,k)
sk=(k-ksp)*z1
110 phi(i,j,k)=z1k+(1.-sk)*(phi(i,j,ksp)-y1j)+sk*(phi(i,j,kep)-ynj)
return
200 isp=is-1
ksp=ks-1
iep=ie+1
kep=ke+1
x1=1./float(iep-isp)
z1=1./float(kep-ksp)
do 210 j=js,je
do 210 i=is,ie
si=(i-isp)*x1
x1i=(1.-si)*phi(isp,j,ksp)+si*phi(iep,j,ksp)
xni=(1.-si)*phi(isp,j,kep)+si*phi(iep,j,kep)
do 210 k=ks,ke
z1k=(1.-si)*phi(isp,j,k)+si*phi(iep,j,k)
sk=(k-ksp)*z1
210 phi(i,j,k)=z1k+(1.-sk)*(phi(i,j,ksp)-x1i)+sk*(phi(i,j,kep)-xni)
return
300 isp=is-1
jsp=js-1
iep=ie+1
jep=je+1
x1=1./float(iep-isp)
y1=1./float(jep-jsp)
do 310 k=ks,ke
do 310 i=is,ie
si=(i-isp)*x1
x1i=(1.-si)*phi(isp,jsp,k)+si*phi(iep,jsp,k)
xni=(1.-si)*phi(isp,jep,k)+si*phi(iep,jep,k)
do 310 j=js,je
y1j=(1.-si)*phi(isp,j,k)+si*phi(iep,j,k)
sj=(j-jsp)*y1
310 phi(i,j,k)=y1j+(1.-sj)*(phi(i,jsp,k)-x1i)+sj*(phi(i,jep,k)-xni)
return
end

Vous aimerez peut-être aussi