Wednesday, March 25, 2015

Латтис Больцманы арга D3Q19 ВГК загвар /Lattice Boltzmann BGK Model/

 Навиер-Стокесийн тэгшитгэлийн Латтис Больцманы ВГК загвар

Lattice Boltzmann BGK Model for NS equation
Боловсруулсан: Др Чен Мин


Танилцуулга

Латтис Больцманы арга (Lattice Boltzmann method – LBM, монгол товчлол ЛБА) нь Навиер-Стокесийн тэгшитгэлийг шийдвэрлэх тооцон бодох шингэний динамикийн нэгэн хувилбарт арга болж хөгжиж байна. Уламжлалт тоон аргуудтай адилгүйгээр ЛБА нь хурд, нягт гэх мэт макро-орчны хэмжигдэхүүнүүдийг шийдвэрлэдэг. ЛБА нь эгэл хэсгүүдийн түгэлтийн функцаар илэрхийлэгдэх макро-орчны кинетик тэгшитгэл дээр суурилдаг. Макро-орчны тоо хэмжээнүүд нь түгэлтийн функцын дагуу авсан моментийн интеграцаас олдох боломжтой байдаг.

Тооцон бодох шингэний динамикт хэрэглэхээр Др Чен ба түүний багийнхан дотоод судалгааны оролдлогууд дээрээ суурилж ЛБА-ын тооцон бодох бүлэг кодийг хөгжүүлсэн байна. Энэ бүлэг кодоос LBM_D3Q19 фортран код нь Сүлжээний ВГК схемийн энгийн боловсруулалтыг хэрэглэсэн ба шингэн-хатуу биеийн харилцан үйлчлэлийн бодлогийг шийдвэрлэх зорилготой юм.

Үндсэн алгоритм

Физик орон зай нь дүрмийн сүлжээнд хуваагдах ба хурдны орон нь төгсгөлөг утгатай хурд {calpha} – аар тухайлагдсан дискрет орчинг бий болгоно. Энэ нөхцөлд ВГК ойролцоолол бүхий Больцманы тэгшитгэл нь дараах байдлаар тухайлагдана.
Үүнд: delta t ба calpha*delta t нь хугацаа ба орон зайн өсөлт юм. galpha  нь alpha чиглэлийн дагуух түгэлтийн функцын дан-эгэл хэсгийн  хурд юм. galphaeq нь түгэлтийн функцийг тэнцвэржүүлэгч, thau нь дан сулралтын (тайвшрах) хугацаа юм.

ЛБА-д өөр өөр төрлийн сүлжээнүүдийг хэрэглэдэг ба сүлжээний төрлөөр нь бас ангилдаг. Олон зүйл нуршилгүй энгийн байдлаар тайлбарлавал бид доорх зурагт үзүүлсэнээр D3Q19 гэсэн загварыг авч үзэж байгаа ба энэ нь 19 хурд бүхий, 3D хэмжээст квадрат сүлжээ юм.


Зураг 1. D3Q19 загвар

Дулааны урсгалтэй шингэний хувьд, D3Q19 загвар дахь түгэлтийн функцын тэнцвэржүүлэгч нь дараах байдлаар өгөгдөнө.
Үүнд:


Макро-орчны нягт rho болон хурд u нь дараах байдлаар төгсгөлөг хурд болон түгэлтийн функцтай холбогдоно.
Чапман-Энсокийн задаргааг ашиглаж тэгшитгэл (1) – ээс хоёрдугаар эрэмбийн тохиролтой Навиер-Стокесийн тэгшитгэлийг гаргаж авч болох ба энэ үед  кинематик зунгааралт нь доорхи байдлаар өгөгдөнө.
Стандарт ЛБА-д тэгшитгэл (1) нь дараах хоёр шат процесстой байна: урсгал ба мөргөлдөөн. Иймд тэгшитгэл (1) тус хоёр алхамд дараах байддлаар бодогдоно.
Мөргөлдөөн:
Урсгал:
ЛБА тухай илүү дэлгэрэнгүйг Sauro Succi зохиогчтой The Lattice Boltzmann Equation for Fluid Dynamics and Beyond, Oxford University Press (2001) гэсэн номноос уншаарай.


Хязгаарын болон Анхны нөхцлүүд

Тооцон бодох бодлогийн хүрээ нь хайрцаг хэлбэртэй байх ба хэмжээс нь тус бүр XMAX-YMAX-ZMAX байнаРейнольдсын тоо нь
Үүнд LN нь характерийн /бодлогийн геометрийг илэрхийлж чадахуйц уртын хэмжээс/ урт ба v  нь  тэгшитгэл (5) – аар өгөгдсөн кинематик зунгааралт юмХязгаарын нөхцөл нь үл гулсах нөхцөлтэйгээр хатуу хананд өгөгдөх ба энэ хэсэгт бүх хурд үгүй болно. Энэ нь Латтис Больцманы аргад буцаж-ойх дүрмээр боловсруулагдах ба энэ дүрэмд ханыг мөргөж байгаа эгэл хэсгүүд буцаж ирсэн зүгрүүгээ ойх ёстой. Жишээлбэл бидний бодлогын хувьд ёроолын хязгаарын нөхцөл нь:
In-state:          g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18
Out-state:       g0, g1, g2, g3, g4, g6, g5, g7, g8, g9, g10, g11, g13, g12, g14, g18, g17, g16, g15

Оролтын хэсэг дахь хязгаарын нөхцөл нь дараах байдлаар илэрхийлэгдэнэ.

Фортран кодийн бүтэц

Програмын код нь үндсэндээ input.dat болон LBM_D3Q19.f гэсэн файлуудаас бүрдэнэ.

Input.dat бол зарим параметрүүдийн утгыг өгөхөд хэрэглэгдэнэ. Дараах параметрүүд бол квадрат хайрцаган дахь урсгалыг симуляци хийх параметрүүд юм.

TMAX=       Итерацийн хамгийн их тоо                        2001
XMAX=       х тэнхлэгийн дагуу торны хэмжээ             41
YMAX=       у тэнхлэгийн дагуу торны хэмжээ             41
ZMAX=       z тэнхлэгийн дагуу торны хэмжээ              41
NUMAX=     Үр дүнг хэвлэх давтамж                             1000
U0=           Оролтын хэсгийн хурд (U0 < 0.1)                  0.02

LBM_D3Q19.f нь 7 ширхэг дэд програмтай.
wall_coordinate    Хатуу хананы координатыг оруулах
init_density           нягтын түгэлтийн n функцыг тэнвэржүүлэгчтэй эхлүүлэх
velocity_bc           Хурдны хязгаарын нөхцлийг тохируулах
streaming             шингэний нягтыг тэдгээрийн дараачийн хөрш зангилааруу түгээх
bounceback      Шингэний нягтууд эргэлдэх хөдөлгөөнд байна. Дараагийн түгэлтийн шатанд хязгаар орчмын нягтууд буцаж ойх болно.
collision                Дан алхамт нягтуудын мөргөлдөөний процесс
write_results        Үр дүнг 'T100XXX.dat' файлаар хэвлэх

T100XXX.dat файлын формат

VARIABLES = X, Y, Z, U, V, W, PRESS
 ZONE I=  41,    J=          41, K=          41,  F=POINT
1  1  1  0.000000E+00   0.000000E+00   0.000000E+00   0.333333E+00
2  1  1  0.000000E+00   0.000000E+00   0.000000E+00   0.333333E+00
3  1  1  0.000000E+00   0.000000E+00   0.000000E+00   0.333333E+00
4  1  1  0.000000E+00   0.000000E+00   0.000000E+00   0.333333E+00
5  1  1  0.000000E+00   0.000000E+00   0.000000E+00   0.333333E+00
X  Y  Z        Ux             Uy                 Uz                  P

Үүнд:
I      х тэнхлэг дахь торны хэмжээ
J     y тэнхлэг дахь торны хэмжээ
X     x координат
Y     y координат
Z     z координат
Ux    х чиглэл дахь хурд
Uy    y чиглэл дахь хурд
Uz    z чиглэл дахь хурд
P     даралт

T100XXX.dat файлууд нь TECPLOT програмаар уншигдана /нээгдэнэ/.

Симуляцийн үр дүн "Хөндийн" урсгалын жишээ
Видео үр дүн



 Фортран код

1. Input.dat

1:  TMAX=    Maximum number of iterations  
2:      80001  
3:  XMAX  =    Grid size in x dimension  
4:      41  
5:  YMAX  =    Grid size in y dimension  
6:      41  
7:  ZMAX  =    Grid size in z dimension  
8:      41  
9:  NUMAX =    Output frequency  
10:      1000  
11:  U0   =    Incoming velocity (U0 < 0.1)  
12:      0.02  

2. Үндсэн код LBM_D3Q19.f



1:  c File   : LBM_D3Q19.f  
2:  c Author  : Cheng Ming (chengm@ihpc.a-star.edu.sg)  
3:  c Date   : 25-010-2006  
4:  c Revision : 1.0  
5:  c DESCRIPTION  
6:  c This is a Fortan 77 LBM_D3Q19 code for 3D viscous incompressible flow   
7:     PROGRAM LBM3D  
8:  c             Varibles and parameters  
9:     implicit none  
10:  ! XMAX,YMAX.ZMAX.grid size in x y dimension  
11:     integer XMAX,YMAX,ZMAX,NSTART,NUMB,NPLUS,NUMAX  
12:  ! density........fluid density per link  
13:     real*8 density   ! *8 is same as double precision  
14:  ! omega............collision2 parameter  
15:     real*8 omega   
16:  ! TMAX.....maximum number of iterations  
17:     integer TMAX  
18:  ! time................iteration counter  
19:     integer time  
20:  ! obst(81,81,81)........obstacle array  
21:     logical obst(81,81,81)  
22:  ! g(0:18,81,81,81)......fluid densities  
23:     real*8 g(0:18,81,81,81)  
24:  ! gprop...rray of temporareYMAX storage  
25:     real*8 gprop(0:18,81,81,81)  
26:  ! vel............mean velocity computed  
27:     real*8 vel,Re  
28:     REAL*8 UW  
29:  !  ==================================================================  
30:  !  |         Begin initialisation             |  
31:  !  ==================================================================  
32:  !  Input calculation parameter  
33:     OPEN(30,file='input0.dat')  
34:     read(30,*)     
35:     read(30,*) TMAX   
36:     read(30,*)     
37:     read(30,*) XMAX   
38:     read(30,*)     
39:     read(30,*) YMAX   
40:     read(30,*)     
41:     read(30,*) ZMAX   
42:     read(30,*)     
43:     read(30,*) NUMAX  
44:     read(30,*)     
45:     read(30,*) UW    
46:     density=1.0d0  
47:  ! omega.....................collision2 parameter  
48:     omega=1.85  
49:  ! read obstacle  
50:     call wall_coordinate(obst,XMAX,YMAX,ZMAX)   
51:  ! initialize lattice velocity  
52:     call init_density(XMAX,YMAX,ZMAX,density,g)  
53:     Re=UW*XMAX*3.0/(1.0/omega-0.5)  
54:     PRINT*,'RE=',Re   
55:  ! mean sqaure flow is stored in file  
56:  !  ==================================================================  
57:  !  |         End initialisation              |  
58:  !  ==================================================================  
59:  !  ==================================================================  
60:  !  |         Begin iterations               |  
61:  !  ==================================================================  
62:     NSTART=1  
63:  1   NUMB =1  
64:     do time = NSTART, TMAX  
65:        IF (NUMB.LE.NUMAX) THEN  
66:          NUMB=NUMB+1  
67:       END IF  
68:  ! velocity boundary condition   
69:      call velocity_bc(density,UW,XMAX,YMAX,ZMAX,g)     
70:  ! density propagation  
71:      call streaming(XMAX,YMAX,ZMAX,g,gprop)  
72:  ! bounc back from obstacles  
73:      call bounceback(XMAX,YMAX,ZMAX,obst,g,gprop)  
74:  ! density collision2  
75:      call collision(density,omega,XMAX,YMAX,ZMAX,g,gprop,obst)  
76:  ! each TMAX/10 iteration  
77:      if (NUMB.GT.NUMAX) then     
78:  ! output results  
79:      call write_results(XMAX,YMAX,ZMAX,obst,g,density,time,NUMAX,UW)  
80:        NUMB=1  
81:      end if  
82:       end do  
83:  !  ==================================================================  
84:  !  |          End iterations               |  
85:  !  ==================================================================  
86:     close(10)  
87:     end  
88:  !   ****************************************************************  
89:  !   *                               *  
90:  !   *    No obstacles coordinates of a driven cavity flow    *  
91:  !   *                               *  
92:  !   ****************************************************************  
93:     subroutine wall_coordinate(obst,XMAX,YMAX,ZMAX)  
94:     implicit none   
95:     integer XMAX,YMAX,ZMAX  
96:     logical obst(81,81,81)  
97:  ! local variables  
98:     integer x,y,z  
99:      do y = 1, YMAX  
100:      do x = 1, XMAX  
101:      do z = 1, ZMAX  
102:         obst(x,y,z) = .false.  
103:      end do  
104:      end do  
105:      end do  
106:     DO x=1, XMAX  
107:     DO z=1, ZMAX  
108:        obst(x,1  ,z)= .true.  
109:        obst(x,YMAX,z)= .true.  
110:     END DO  
111:     END DO  
112:     DO x=1, XMAX  
113:     DO y=1, YMAX  
114:        obst(x,y,1)= .true.  
115:     END DO  
116:     END DO  
117:     DO y=1, YMAX  
118:     DO z=1, ZMAX  
119:        obst(1  ,y,z)= .true.  
120:        obst(XMAX,y,z)= .true.  
121:     END DO  
122:     END DO  
123:     END  
124:  !   ****************************************************************  
125:  !   *                               *  
126:  !   * Initialize density distribution function n with equilibrium *  
127:  !   * for zero velocity                      *  
128:  !   *                               *  
129:  !   ****************************************************************  
130:     subroutine init_density(XMAX,YMAX,ZMAX,density,g)  
131:     implicit none  
132:     integer XMAX,YMAX,ZMAX  
133:     real*8 density,g(0:18,81,81,81)  
134:  ! local variables  
135:     integer x,y,z  
136:     real*8 t0,t1,t2  
137:  ! compute weighting factors (depending on lattice geometry)  
138:     t0 = density / 3.0d0  
139:     t1 = density / 18.d0  
140:     t2 = density / 36.d0  
141:  !   z=1  
142:  !   y=1  
143:  ! loop over computational domain  
144:     do x = 1, XMAX  
145:     do y = 1, YMAX  
146:     DO z = 1, ZMAX  
147:       g(0,x,y,z) =t0  
148:       g(1,x,y,z) =t1  
149:       g(2,x,y,z) =t1  
150:       g(3,x,y,z) =t1  
151:       g(4,x,y,z) =t1  
152:       g(5,x,y,z) =t1  
153:       g(6,x,y,z) =t1  
154:       g(7,x,y,z) =t2  
155:       g(8,x,y,z) =t2  
156:       g(9,x,y,z) =t2  
157:       g(10,x,y,z)=t2  
158:       g(11,x,y,z)=t2  
159:       g(12,x,y,z)=t2  
160:       g(13,x,y,z)=t2  
161:       g(14,x,y,z)=t2  
162:       g(15,x,y,z)=t2  
163:       g(16,x,y,z)=t2  
164:       g(17,x,y,z)=t2  
165:       g(18,x,y,z)=t2  
166:     END DO  
167:     end do  
168:     end do  
169:     end  
170:  !   ****************************************************************  
171:  !   *                               *  
172:  !   *        Velocity bounday condition          *  
173:  !   *                               *  
174:  !   ****************************************************************  
175:     subroutine velocity_bc(density,UW,XMAX,YMAX,ZMAX,g)  
176:     implicit none  
177:     integer XMAX,YMAX,ZMAX  
178:     real*8  density,g(0:18,81,81,81),UW  
179:     integer x,y,z,i  
180:     real*8 C1,C2,C3,t0,t1,t2,U,V,W,un(18),usqu,d_loc  
181:     real*8 dt0,dt1,dt2  
182:     t0 = 1.d0 / 3.d0  
183:     t1 = 1.d0 / 18.d0  
184:     t2 = 1.d0 / 36.d0  
185:  ! square speed of sound  
186:     C1 = 1.d0 / 3.d0     
187:     C2 = 2.d0 * C1 ** 2.d0  
188:     C3 = 2.d0 * C1      
189:     d_loc = density  
190:     dt0=t0*d_loc  
191:     dt1=t1*d_loc  
192:     dt2=t2*d_loc  
193:  !   z=1  
194:  !   y=1  
195:  !   y = YMAX  
196:      z = ZMAX  
197:     do x = 1, XMAX  
198:     do y = 1, YMAX  
199:        U = UW  
200:        V = 0.0d0  
201:        W = 0.0d0  
202:        usqu = (U * U + V * V + W * W)/C3  
203:        un(1) =  U    
204:        un(2) = -U    
205:        un(3) =  V    
206:        un(4) = - V    
207:        un(5) =  W    
208:        un(6) = - W    
209:        un(7) =  U + V  
210:        un(8) =  U - V  
211:        un(9) = - U + V  
212:        un(10)= - U - V  
213:        un(11)=  U + W  
214:        un(12)= - U + W  
215:        un(13)=  U - W  
216:        un(14)= - U - W  
217:        un(15)=  V + W  
218:        un(16)=  V - W  
219:        un(17)= - V + W  
220:        un(18)= - V - W  
221:     g(0, x,y,z)=dt0*(1.d0             -usqu)  
222:     g(1, x,y,z)=dt1*(1.d0+un( 1)/C1+un( 1)**2.d0/C2-usqu)  
223:     g(2, x,y,z)=dt1*(1.d0+un( 2)/C1+un( 2)**2.d0/C2-usqu)  
224:     g(3, x,y,z)=dt1*(1.d0+un( 3)/C1+un( 3)**2.d0/C2-usqu)  
225:     g(4, x,y,z)=dt1*(1.d0+un( 4)/C1+un( 4)**2.d0/C2-usqu)  
226:     g(5, x,y,z)=dt1*(1.d0+un( 5)/C1+un( 5)**2.d0/C2-usqu)  
227:     g(6, x,y,z)=dt1*(1.d0+un( 6)/C1+un( 6)**2.d0/C2-usqu)  
228:     g(7, x,y,z)=dt2*(1.d0+un( 7)/C1+un( 7)**2.d0/C2-usqu)  
229:     g(8, x,y,z)=dt2*(1.d0+un( 8)/C1+un( 8)**2.d0/C2-usqu)  
230:     g(9, x,y,z)=dt2*(1.d0+un( 9)/C1+un( 9)**2.d0/C2-usqu)  
231:     g(10,x,y,z)=dt2*(1.d0+un(10)/C1+un(10)**2.d0/C2-usqu)  
232:     g(11,x,y,z)=dt2*(1.d0+un(11)/C1+un(11)**2.d0/C2-usqu)  
233:     g(12,x,y,z)=dt2*(1.d0+un(12)/C1+un(12)**2.d0/C2-usqu)  
234:     g(13,x,y,z)=dt2*(1.d0+un(13)/C1+un(13)**2.d0/C2-usqu)  
235:     g(14,x,y,z)=dt2*(1.d0+un(14)/C1+un(14)**2.d0/C2-usqu)  
236:     g(15,x,y,z)=dt2*(1.d0+un(15)/C1+un(15)**2.d0/C2-usqu)  
237:     g(16,x,y,z)=dt2*(1.d0+un(16)/C1+un(16)**2.d0/C2-usqu)  
238:     g(17,x,y,z)=dt2*(1.d0+un(17)/C1+un(17)**2.d0/C2-usqu)  
239:     g(18,x,y,z)=dt2*(1.d0+un(18)/C1+un(18)**2.d0/C2-usqu)  
240:     end do  
241:     end do  
242:     end  
243:  !   ****************************************************************  
244:  !   *                               *  
245:  !   *  streaming2 fluid densities to their next neighbour nodes  *  
246:  !   *                               *  
247:  !   ****************************************************************  
248:     subroutine streaming(XMAX,YMAX,ZMAX,g,gprop)  
249:     implicit none  
250:     integer XMAX,YMAX,ZMAX  
251:     real*8  g(0:18,81,81,81),gprop(0:18,81,81,81)  
252:     integer x,y,z,x_e,x_w,y_n,y_s,z_t,z_b  
253:  !   z=1  
254:  !   y=1  
255:     do x = 1, XMAX  
256:     do y = 1, YMAX  
257:     do z = 1, ZMAX  
258:       x_e = mod(x,XMAX) + 1  
259:       y_n = mod(y,YMAX) + 1  
260:       z_t = mod(z,ZMAX) + 1  
261:       x_w = XMAX - mod(XMAX + 1 - x, XMAX)  
262:       y_s = YMAX - mod(YMAX + 1 - y, YMAX)  
263:       z_b = ZMAX - mod(ZMAX + 1 - z, ZMAX)  
264:       gprop( 0, x , y , z ) = g( 0,x,y,z)  
265:       gprop( 1, x_e, y , z ) = g( 1,x,y,z)  
266:       gprop( 2, x_w, y , z ) = g( 2,x,y,z)  
267:       gprop( 3, x , y_n, z ) = g( 3,x,y,z)  
268:       gprop( 4, x , y_s, z ) = g( 4,x,y,z)  
269:       gprop( 5, x , y , z_t) = g( 5,x,y,z)  
270:       gprop( 6, x , y , z_b) = g( 6,x,y,z)  
271:       gprop( 7, x_e, y_n, z ) = g( 7,x,y,z)  
272:       gprop( 8, x_e, y_s, z ) = g( 8,x,y,z)  
273:       gprop( 9, x_w, y_n, z ) = g( 9,x,y,z)  
274:       gprop(10, x_w, y_s, z ) = g(10,x,y,z)  
275:       gprop(11, x_e, y , z_t) = g(11,x,y,z)  
276:       gprop(12, x_w, y , z_t) = g(12,x,y,z)  
277:       gprop(13, x_e, y , z_b) = g(13,x,y,z)  
278:       gprop(14, x_w, y , z_b) = g(14,x,y,z)  
279:       gprop(15, x , y_n, z_t) = g(15,x,y,z)  
280:       gprop(16, x , y_n, z_b) = g(16,x,y,z)  
281:       gprop(17, x , y_s, z_t) = g(17,x,y,z)  
282:       gprop(18, x , y_s, z_b) = g(18,x,y,z)  
283:     end do  
284:     end do  
285:     end do  
286:     end  
287:  !   ****************************************************************  
288:  !   *                               *  
289:  !   * Fluid densities are rotated. By the next propagation step, *  
290:  !   *  this results in a bounce back from obstacle nodes.    *  
291:  !   *                               *  
292:  !   ****************************************************************  
293:     subroutine bounceback(XMAX,YMAX,ZMAX,obst,g,gprop)  
294:     implicit none  
295:     integer XMAX,YMAX,ZMAX  
296:     logical obst(81,81,81)  
297:     real*8  g(0:18,81,81,81),gprop(0:18,81,81,81)  
298:  ! local variables  
299:     integer x,y,z  
300:  !   z=1  
301:  !   y=1  
302:     do x = 1, XMAX  
303:     do y = 1, YMAX  
304:     do z = 1, ZMAX  
305:     if (obst(x,y,z)) then  
306:        g( 1, x,y,z) = gprop( 2, x,y,z)  
307:        g( 2, x,y,z) = gprop( 1, x,y,z)  
308:        g( 3, x,y,z) = gprop( 4, x,y,z)  
309:        g( 4, x,y,z) = gprop( 3, x,y,z)  
310:        g( 5, x,y,z) = gprop( 6, x,y,z)  
311:        g( 6, x,y,z) = gprop( 5, x,y,z)  
312:        g( 7, x,y,z) = gprop(10, x,y,z)  
313:        g( 8, x,y,z) = gprop( 9, x,y,z)  
314:        g( 9, x,y,z) = gprop( 8, x,y,z)  
315:        g(10, x,y,z) = gprop( 7, x,y,z)  
316:        g(11, x,y,z) = gprop(14, x,y,z)  
317:        g(12, x,y,z) = gprop(13, x,y,z)  
318:        g(13, x,y,z) = gprop(12, x,y,z)  
319:        g(14, x,y,z) = gprop(11, x,y,z)  
320:        g(15, x,y,z) = gprop(18, x,y,z)  
321:        g(16, x,y,z) = gprop(17, x,y,z)  
322:        g(17, x,y,z) = gprop(16, x,y,z)  
323:        g(18, x,y,z) = gprop(15, x,y,z)  
324:     end if  
325:     end do  
326:     end do  
327:     end do  
328:     end  
329:  !   ****************************************************************  
330:  !   *                               *  
331:  !   *     One-step density collision2 process         *  
332:  !   *                               *  
333:  !   ****************************************************************  
334:     subroutine collision(density,omega,XMAX,YMAX,ZMAX,g,gprop,obst)  
335:     implicit none  
336:     integer XMAX,YMAX,ZMAX  
337:     logical obst(81,81,81)  
338:     real*8  density,omega,g(0:18,81,81,81),gprop(0:18,81,81,81)  
339:  ! local variables  
340:     integer x,y,z,i  
341:     real*8 C1,C2,C3,t0,t1,t2,U,V,W,un(18),gq(0:18),usqu,d_loc  
342:     real*8 dt0,dt1,dt2,omega1  
343:     t0 = 1.d0 / 3.d0  
344:     t1 = 1.d0 / 18.d0  
345:     t2 = 1.d0 / 36.d0  
346:     C1 = 1.d0 / 3.d0  
347:     C2 = 2.d0 * C1 ** 2.d0  
348:     C3 = 2.d0 * C1  
349:     t0 = omega*t0  
350:     t1 = omega*t1  
351:     t2 = omega*t2  
352:     omega1=1.0d0-omega  
353:  !    z=1  
354:  !    y=1  
355:     do x = 1, XMAX  
356:     do y = 1, YMAX  
357:     do z = 1, ZMAX  
358:  ! only free nodes are considered here  
359:     if (.not. obst(x,y,z)) then  
360:  ! calculate local density d_loc  
361:     d_loc = gprop( 0, x,y,z)  
362:     &   + gprop( 1, x,y,z) + gprop( 2, x,y,z)  
363:     &   + gprop( 3, x,y,z) + gprop( 4, x,y,z)  
364:     &   + gprop( 5, x,y,z) + gprop( 6, x,y,z)  
365:     &   + gprop( 7, x,y,z) + gprop( 8, x,y,z)  
366:     &   + gprop( 9, x,y,z) + gprop(10, x,y,z)  
367:     &   + gprop(11, x,y,z) + gprop(12, x,y,z)  
368:     &   + gprop(13, x,y,z) + gprop(14, x,y,z)  
369:     &   + gprop(15, x,y,z) + gprop(16, x,y,z)  
370:     &   + gprop(17, x,y,z) + gprop(18, x,y,z)  
371:  !   d_loc = density  
372:  ! calculate velocity components  
373:      U = gprop(1 , x,y,z) - gprop( 2, x,y,z)  
374:     &   + gprop(7 , x,y,z) + gprop( 8, x,y,z)  
375:     &   - gprop(9 , x,y,z) - gprop(10, x,y,z)  
376:     &   + gprop(11, x,y,z) - gprop(12, x,y,z)  
377:     &   + gprop(13, x,y,z) - gprop(14, x,y,z)  
378:      U = U / d_loc  
379:      V = gprop( 3, x,y,z) - gprop( 4, x,y,z)  
380:     &   + gprop( 7, x,y,z) - gprop( 8, x,y,z)  
381:     &   + gprop( 9, x,y,z) - gprop(10, x,y,z)  
382:     &   + gprop(15, x,y,z) + gprop(16, x,y,z)  
383:     &   - gprop(17, x,y,z) - gprop(18, x,y,z)  
384:      V = V / d_loc  
385:      W = gprop( 5, x,y,z) - gprop( 6, x,y,z)  
386:     &   + gprop(11, x,y,z) + gprop(12, x,y,z)  
387:     &   - gprop(13, x,y,z) - gprop(14, x,y,z)  
388:     &   + gprop(15, x,y,z) - gprop(16, x,y,z)  
389:     &   + gprop(17, x,y,z) - gprop(18, x,y,z)  
390:      W = W / d_loc  
391:        usqu = (U * U + V * V + W*W)/C3  
392:        un( 1) =  U    
393:        un( 2) = -U    
394:        un( 3) =  V    
395:        un( 4) = - V    
396:        un( 5) =  W    
397:        un( 6) = - W    
398:        un( 7) =  U + V  
399:        un( 8) =  U - V  
400:        un( 9) = - U + V  
401:        un(10) = - U - V  
402:        un(11) =  U + W  
403:        un(12) = - U + W  
404:        un(13) =  U - W  
405:        un(14) = - U - W  
406:        un(15) =  V + W  
407:        un(16) =  V - W  
408:        un(17) = - V + W  
409:        un(18) = - V - W  
410:     dt0=t0*d_loc  
411:     dt1=t1*d_loc  
412:     dt2=t2*d_loc  
413:     gq( 0) =dt0*(1.d0             -usqu)  
414:     gq( 1)= dt1*(1.d0+un( 1)/C1+un( 1)**2.d0/C2-usqu)  
415:     gq( 2)= dt1*(1.d0+un( 2)/C1+un( 2)**2.d0/C2-usqu)  
416:     gq( 3)= dt1*(1.d0+un( 3)/C1+un( 3)**2.d0/C2-usqu)  
417:     gq( 4)= dt1*(1.d0+un( 4)/C1+un( 4)**2.d0/C2-usqu)  
418:     gq( 5)= dt1*(1.d0+un( 5)/C1+un( 5)**2.d0/C2-usqu)  
419:     gq( 6)= dt1*(1.d0+un( 6)/C1+un( 6)**2.d0/C2-usqu)  
420:     gq( 7)= dt2*(1.d0+un( 7)/C1+un( 7)**2.d0/C2-usqu)  
421:     gq( 8)= dt2*(1.d0+un( 8)/C1+un( 8)**2.d0/C2-usqu)  
422:     gq( 9)= dt2*(1.d0+un( 9)/C1+un( 9)**2.d0/C2-usqu)  
423:     gq(10)= dt2*(1.d0+un(10)/C1+un(10)**2.d0/C2-usqu)  
424:     gq(11)= dt2*(1.d0+un(11)/C1+un(11)**2.d0/C2-usqu)  
425:     gq(12)= dt2*(1.d0+un(12)/C1+un(12)**2.d0/C2-usqu)  
426:     gq(13)= dt2*(1.d0+un(13)/C1+un(13)**2.d0/C2-usqu)  
427:     gq(14)= dt2*(1.d0+un(14)/C1+un(14)**2.d0/C2-usqu)  
428:     gq(15)= dt2*(1.d0+un(15)/C1+un(15)**2.d0/C2-usqu)  
429:     gq(16)= dt2*(1.d0+un(16)/C1+un(16)**2.d0/C2-usqu)  
430:     gq(17)= dt2*(1.d0+un(17)/C1+un(17)**2.d0/C2-usqu)  
431:     gq(18)= dt2*(1.d0+un(18)/C1+un(18)**2.d0/C2-usqu)  
432:     g( 0, x,y,z) = omega1*gprop( 0, x,y,z)+gq( 0)   
433:     g( 1, x,y,z) = omega1*gprop( 1, x,y,z)+gq( 1)   
434:     g( 2, x,y,z) = omega1*gprop( 2, x,y,z)+gq( 2)   
435:     g( 3, x,y,z) = omega1*gprop( 3, x,y,z)+gq( 3)   
436:     g( 4, x,y,z) = omega1*gprop( 4, x,y,z)+gq( 4)   
437:     g( 5, x,y,z) = omega1*gprop( 5, x,y,z)+gq( 5)   
438:     g( 6, x,y,z) = omega1*gprop( 6, x,y,z)+gq( 6)   
439:     g( 7, x,y,z) = omega1*gprop( 7, x,y,z)+gq( 7)   
440:     g( 8, x,y,z) = omega1*gprop( 8, x,y,z)+gq( 8)   
441:     g( 9, x,y,z) = omega1*gprop( 9, x,y,z)+gq( 9)   
442:     g(10, x,y,z) = omega1*gprop(10, x,y,z)+gq(10)   
443:     g(11, x,y,z) = omega1*gprop(11, x,y,z)+gq(11)   
444:     g(12, x,y,z) = omega1*gprop(12, x,y,z)+gq(12)   
445:     g(13, x,y,z) = omega1*gprop(13, x,y,z)+gq(13)   
446:     g(14, x,y,z) = omega1*gprop(14, x,y,z)+gq(14)   
447:     g(15, x,y,z) = omega1*gprop(15, x,y,z)+gq(15)   
448:     g(16, x,y,z) = omega1*gprop(16, x,y,z)+gq(16)   
449:     g(17, x,y,z) = omega1*gprop(17, x,y,z)+gq(17)   
450:     g(18, x,y,z) = omega1*gprop(18, x,y,z)+gq(18)   
451:     end if  
452:     end do  
453:     end do  
454:     end do  
455:     end  
456:  !   ****************************************************************  
457:  !   *                               *  
458:  !   *      Output of rsults to file 'result.dat'       *  
459:  !   *                               *  
460:  !   ****************************************************************  
461:     subroutine write_results(XMAX,YMAX,ZMAX,obst,g,density  
462:     &               ,time,NUMAX,UW)  
463:     implicit none   
464:     integer XMAX,YMAX,ZMAX,time,NUMAX  
465:     real*8 g(0:18,81,81,81),density,UW  
466:     logical obst(81,81,81)  
467:  ! local variables  
468:     integer  x,y,z,i  
469:     real*8  U,V,W,d_loc,press,c_squ  
470:     CHARACTER *6 rr  
471:  ! square speed of sound  
472:     c_squ = 1.d0 / 3.d0     
473:  ! open results output file  
474:  cccccc   rr=character(time)  
475:     print*,'time=',time  
476:     WRITE (rr,200) 100000+time/NUMAX  
477:  200  FORMAT (I6)   
478:     open(11,file='T'//TRIM(rr)//'.dat')  
479:  !  
480:  ! write header for postprocessing with TECPLOT  
481:     write(11,*) 'VARIABLES = X, Y, Z, U, V, W, PRESS'   
482:     write(11,*) 'ZONE I=',XMAX,', J=', YMAX,', K=',ZMAX,', F=POINT'  
483:  !   y=20  
484:     do z = 1, ZMAX  
485:     do y = 1, YMAX  
486:     do x = 1, XMAX  
487:  ! if obstacle node, nothing is to do  
488:       if (obst(x,y,z)) then   
489:  ! velocity components = 0  
490:        U = 0.d0  
491:        V = 0.d0  
492:        W = 0.d0  
493:  ! pressure = average pressure  
494:        press = density * c_squ  
495:       else  
496:  ! calculate local density d_loc  
497:     d_loc = g( 0,x,y,z)  
498:     &   + g( 1,x,y,z) + g( 2,x,y,z)  
499:     &   + g( 3,x,y,z) + g( 4,x,y,z)  
500:     &   + g( 5,x,y,z) + g( 6,x,y,z)  
501:     &   + g( 7,x,y,z) + g( 8,x,y,z)  
502:     &   + g( 9,x,y,z) + g(10,x,y,z)  
503:     &   + g(11,x,y,z) + g(12,x,y,z)  
504:     &   + g(13,x,y,z) + g(14,x,y,z)  
505:     &   + g(15,x,y,z) + g(16,x,y,z)  
506:     &   + g(17,x,y,z) + g(18,x,y,z)  
507:      U =  g( 1,x,y,z) - g(2, x,y,z)  
508:     &   + g( 7,x,y,z) + g(8, x,y,z)  
509:     &   - g( 9,x,y,z) - g(10,x,y,z)  
510:     &   + g(11,x,y,z) - g(12,x,y,z)  
511:     &   + g(13,x,y,z) - g(14,x,y,z)  
512:      U = U/ d_loc  
513:      V =  g( 3,x,y,z) - g( 4,x,y,z)  
514:     &   + g( 7,x,y,z) - g( 8,x,y,z)  
515:     &   + g( 9,x,y,z) - g(10,x,y,z)  
516:     &   + g(15,x,y,z) + g(16,x,y,z)  
517:     &   - g(17,x,y,z) - g(18,x,y,z)  
518:      V = V/ d_loc  
519:      W =  g( 5,x,y,z) - g( 6,x,y,z)  
520:     &   + g(11,x,y,z) + g(12,x,y,z)  
521:     &   - g(13,x,y,z) - g(14,x,y,z)  
522:     &   + g(15,x,y,z) - g(16,x,y,z)  
523:     &   + g(17,x,y,z) - g(18,x,y,z)  
524:      W = W/ d_loc  
525:  ! calculate pressure  
526:        press = d_loc * c_squ  
527:       end if  
528:        if (z.eq.ZMAX) then  
529:        U = UW  
530:        V = 0.0d0  
531:        W = 0.0d0  
532:        press = density * c_squ  
533:        end if  
534:  ! write results to file  
535:       write(11,100) x,y,z,U,V,W, press  
536:  100    format(3I8,4E15.6)  
537:     end do  
538:     end do  
539:     end do  
540:  ! close file 'result.dat'  
541:     close(11)  
542:     end  

No comments:

Post a Comment