1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
| PROGRAM Raff
IMPLICIT NONE
parameter n=100,m=100,NI=100,NJ=100, NI_RAFF=200, NJ_RAFF=200
REAL(KIND=8), ALLOCATABLE, DIMENSION(:,:) :: TAB, TAB_RAFF !Un tableau et
!un tableau raffiné correspondant aux valeurs de champs 2D sur le maillage défini !ci-dessous
REAL(KIND=8), ALLOCATABLE, DIMENSION(:) :: MX, MY, MX_RAFF,
& MY_RAFF
real f1(0:n,0:m),f2(0:n,0:m),f3(0:n,0:m),f4(0:n,0:m)
real rho(0:n,0:m),feq
!Points de grille et points de grille raffinés
! INTEGER :: NI=10, NJ=10, NI_RAFF=20, NJ_RAFF=20 !Nombre de points de
!grille associés au maillage et à la version raffinée
INTEGER :: I,J,K !Les très classiques indices de boucles
INTERFACE
subroutine INTERPOL_BARI(X,CHAMP,MAILLX,MAILLY,INTERPOL)
!==========INTERPOL_BARI===============
!SUBROUTINE permettant l'interpolation lineaire en un point donne
!afin de calculer la valeur d'un vecteur en ce meme point.
!Entree : X, vecteur position, MAILL : maillage, CHAMP : les valeur du champ
!dont on souhaite connaitre la valeur en X.
!Sortie : INTERPOL: la valeur interpolee du champ a la position X
!Marlan, 2011
implicit none
real(kind=8),dimension(:),intent(in) :: X, MAILLX, MAILLY
real(kind=8),dimension(:,:),intent(in) :: CHAMP
real(kind=8),intent(out)::INTERPOL
END SUBROUTINE INTERPOL_BARI
END INTERFACE
open (2,file='champ.dat')
open (3,file='champinter.dat')
open(4,file='ro.dat')
!On alloue les tableaux dynamiques correspondant au maillage
ALLOCATE(MX(NI),MY(NJ),MX_RAFF(NI_RAFF),MY_RAFF(NJ_RAFF))
!On alloue les tableaux dynamiques correspondant aux valeur du champ
ALLOCATE(TAB(NI,NJ),TAB_RAFF(NI_RAFF,NJ_RAFF))
TAB=0.0
!On remplit TAB de valeurs bidons pour l'exemple
DO I=1,size(TAB,dim=1)
MX(I)=I
print*,I,MX(I)
end do
pause
DO J=1,size(TAB,dim=2)
MY(J)=J
print*,J,MY(J)
END DO
pause
call dab(n,m,f1,f2,f3,f4,rho,feq)
DO I=1,NI
DO J=1,NJ
TAB(I,J)=rho(I,J)
end do
END DO
continue
DO I=1,NI
DO J=1,NJ
100 format(1X,3f12.6,1X)
write(2,100) MY(I),MX(J),TAB(I,J)
end do
end do
DO I=1,size(TAB_RAFF,dim=1)
MX_RAFF(I)=I/2.0
end do
DO J=1,size(TAB_RAFF,dim=2)
MY_RAFF(J)=J/2.0
END DO
!On veut maintenant avoir les vlaeurs de TAB_RAFF en fonction de celles de TAB en !utilisant la routine INTERPOL_BARI
DO I=1,size(TAB_RAFF,dim=1)
DO J=1,size(TAB_RAFF,dim=2)
CALL INTERPOL_BARI((/MX_RAFF(I),MY_RAFF(J)/),TAB,MX,MY,
& TAB_RAFF(I,J))
END DO
END DO
DO I=1,NI_RAFF
DO J=1,NJ_RAFF
write(3,100) MX_RAFF(I),MY_RAFF(J),TAB_RAFF(I,J)
end do
end do
END PROGRAM Raff
c***********************************************************************************************
subroutine dab(n,m,f1,f2,f3,f4,rho,feq)
!parameter (n=100,m=200)
real f1(0:n,0:m),f2(0:n,0:m),f3(0:n,0:m),f4(0:n,0:m)
real rho(0:n,0:m),feq
!integer i,j,kk
dx=1.
dy=dx
dt=1.
csq=dx*dx/(dt*dt)
alpha=0.25
omega=1.0/(2.*alpha/(dt*csq)+0.5)
mstep=400
do j=0,m
do i=0,n
rho(i,j)=0.0
end do
end do
do j=0,m
do i=0,n
f1(i,j)=0.25*rho(i,j)
f2(i,j)=0.25*rho(i,j)
f3(i,j)=0.25*rho(i,j)
f4(i,j)=0.25*rho(i,j)
end do
end do
do kk=1, mstep
do j=0,m
do i=0,n
feq=0.25*rho(i,j)
f1(i,j)=omega*feq+(1.-omega)*f1(i,j)
f2(i,j)=omega*feq+(1.-omega)*f2(i,j)
f3(i,j)=omega*feq+(1.-omega)*f3(i,j)
f4(i,j)=omega*feq+(1.-omega)*f4(i,j)
end do
end do
do j=0,m
do i=1,n
f1(n-i,j)=f1(n-i-1,j)
f2(i-1,j)=f2(i,j)
end do
end do
do i=0,n
do j=1,m
f3(i,m-j)=f3(i,m-j-1)
f4(i,j-1)=f4(i,j)
end do
end do
do j=0,m
f1(0,j)=0.5-f2(0,j)
f3(0,j)=0.5-f4(0,j)
f1(n,j)=0.0
f2(n,j)=0.0
f3(n,j)=0.0
f4(n,j)=0.0
end do
do i=0,n
f1(i,m)=0.0
f2(i,m)=0.0
f3(i,m)=0.0
f4(i,m)=0.0
f1(i,0)=f1(i,1)
f2(i,0)=f1(i,1)
f3(i,0)=f1(i,1)
f4(i,0)=f1(i,1)
end do
do j=0,m
do i=0,n
rho(i,j)=f1(i,j)+f2(i,j)+f3(i,j)+f4(i,j)
end do
end do
end do
do j=0,m
do i=0,n
write(4,*)i,j,rho(i,j)
end do
end do
return
end
c*********************************************************
subroutine INTERPOL_BARI(X,CHAMP,MAILLX,MAILLY,INTERPOL)
!==========INTERPOL_BARI===============
!SUBROUTINE permettant l'interpolation lineaire en un point donne
!afin de calculer la valeur d'un vecteur en ce meme point.
!Entree : X, vecteur position, MAILL : maillage, CHAMP : les valeur du champ
!dont on souhaite connaitre la valeur en X.
!Sortie : INTERPOL: la valeur interpolee du champ a la position X
!Marlan, 2011
implicit none
real(kind=8),dimension(:),intent(in) :: X, MAILLX, MAILLY
real(kind=8),dimension(:,:),intent(in) :: CHAMP
real(kind=8),intent(out)::INTERPOL
real(kind=8),dimension(size(MAILLX)):: TEMPMAILLX
real(kind=8),dimension(size(MAILLY)):: TEMPMAILLY
real(kind=8) :: HI,HJ,INTERPOL1,INTERPOL2
integer,dimension(2,2):: POSXY
TEMPMAILLX=MAILLX
POSXY(1,1)=minloc(abs(X(1)-TEMPMAILLX),dim=1)
if(minval(abs(X(1)-TEMPMAILLX))/=0.0) TEMPMAILLX(POSXY(1,1))=
& TEMPMAILLX(POSXY(1,1))+10.0
POSXY(2,1)=minloc(abs(X(1)-TEMPMAILLX),dim=1)
TEMPMAILLY=MAILLY
POSXY(1,2)=minloc(abs(X(2)-TEMPMAILLY),dim=1)
if(minval(abs(X(2)-TEMPMAILLY))/=0.0) TEMPMAILLY(POSXY(1,2))=
& TEMPMAILLY(POSXY(1,2))+10.0
POSXY(2,2)=minloc(abs(X(2)-TEMPMAILLY),dim=1)
if(minval(abs(X(1)-TEMPMAILLX))/=0.0) HI=
& -(MAILLX(POSXY(1,1))-X(1))/
& (MAILLX(POSXY(2,1))-MAILLX(POSXY(1,1)))
if(minval(abs(X(2)-TEMPMAILLY))/=0.0) HJ=
& -(MAILLY(POSXY(1,2))-X(2))/
& (MAILLY(POSXY(2,2))-MAILLY(POSXY(1,2)))
INTERPOL1=(1-HI)*CHAMP(POSXY(1,1),POSXY(1,2))+HI*
& CHAMP(POSXY(2,1),POSXY(1,2))
INTERPOL2=(1-HI)*CHAMP(POSXY(1,1),POSXY(2,2))+HI*
& CHAMP(POSXY(2,1),POSXY(2,2))
INTERPOL=(1-HJ)*INTERPOL1+HJ*INTERPOL2
end subroutine INTERPOL_BARI |
Partager