Sunday, April 26, 2015

Нэг хэмжээст тархалтын тэгшитгэлийг Латтис Больцманы арга ашиглан бодох /1D diffusion problem with LBM/

Нэг хэмжээст тархалтын тэгшитгэлийг Латтис Больцманы Арга ашиглан бодох

Молекул динамикаас макро орчны физик хэмжигдэхүүнрүү. Эх сурвалж: Transport Phenomena - Delft University of Technology

Латтис больцманы аргаар нэг хэмжээст тархалтын тэгшитгэлийг бодох код бичихэд өгөх тэмдэглэл.
Бодох тэгшитгэл:

Кодыг үе бүрчлэн тайлбарлан бичье.
      program diffusionLBM
        parameter (m=100)              ! m is the number of lattice nodes
        real f1(0:1), f2(0:m), rho(0:m), feq(0:m), x(0:m)
        integer i
        open(2,file='resultLBM.dat')
        dt=1.0                                      ! time step
        dx=1.0                                      ! space step
        x(0)=0.0
Энэ хэсэгт хэрэглэгдэх хэмжигдэхүүн, параметрүүдийг зарлаж зарим өгөгдлүүдийг өгч байна. f1(0:1) ба f2(0:m) нь зангилаанаас гарч буй түгэлтийн функцыг илтгэнэ. Эдгээр нь нэгэнт m =100 ширхэг зангилаатай учир 0 – ээс 100 хүртэл дугаарлагдах бүрдэл (array) тоо байна.
Өөрөөр хэлбэл f1 нь бодолтын алхам бүрд 100 ширхэг тоон цувааг үүсгэнэ гэсэн үг. rho(0:m) хувьсагч бөгөөд энэ бодлогийн хувьд температур нь юм. Гэхдээ температурыг масштаблан хэмжээсгүй хувьсагч болгон бодож байгаа юм. feq(0:m) нь тэнцвэрт түгэлтийн функц бөгөөд мөн л зуун ширхэг утга агуулах бүрдэл (array) юм. x(0:m) нь бодлогийн геометрийн уртыг илэрхийлэг бөгөөд зүүнээс баруун тийш тоологдоно.
        do i=1,m
           x(i)=x(i-1)+dx
        end do
        csq=dx*dx/(dt*dt)
        alpha=0.25                     ! diffusive coefficient
        omega=1.0/(alpha/(dt*csq)+0.5) ! eq.3.23
        mstep=200                      ! total number of time steps
        twall=1.0                      ! left hand wall temperature
Дээрх хэсгийн эхний гогцоо нь бодлогийн геометрийг бүтээж байна. Дараа нь тайвшралтын давтамжийг тодорхойлохын тулд температур тархалтын коэф-оор дамжуулан тэгшитгэл 3.23 ашиглан дараах байдлаар тодорхойлно.
Бодлогийг 200с хүртэл хийнэ. Зүүн хананаас өгөгдөх хэмжээсгүй температур нь twall=1.0 байна. Энэ нь гол хувьсагч болох rho(0:m) –ын анхны нөхцөл юм.
        do i=0,m
         rho(i)=0.0                     ! initial value of the domain temperature
         f1(i)=0.5*rho(i)
         f2(i)=0.5*rho(i)
        end do
Дээрх хэсэгт өгөгдсөн геомерт дотор анхны нөхцлийг бий болгож бүх зангилаан дээрх температурыг 0 гэсэн хэмжээсгүй температурт тохируулж байна. Мөн бүх түгэлтийн функцын нийлбэр нь хамаарах хэмжигдэхүүнтэй тэнцүү байна гэдгээс түгэлтийн функыг дараах байдлаар тодорхойлно.
Гэх мэтээр тодорхойлох ба энэ нь бүх зангилааны турш бодогдоно.
! main loop
        do kk=1,mstep
! collision process
          do i=0,m
           rho(i)=f1(i)+f2(i)            ! dependent variable d.function
           feq(i)=0.5*rho(i)            ! equilibrium distribution function
! since k1=k2=0.5, then feq1=feq2=feq
           f1(i)=(1.-omega)*f1(i)+omega*feq(i)
           f2(i)=(1.-omega)*f2(i)+omega*feq(i)
          enddo
! streaming process
          do i=1,m-1
           f1(m-i)=f1(m-i-1)   ! f1 streaming
           f2(i-1)=f2(i)             ! f2 streaming
          enddo
! boundary condition
          f1(0)=twall-f2(0)   ! constant temperature boundary condition, x=0
          f1(m)=f1(m-1)       ! adiabatic boundary condition, x=L
          f2(m)=f2(m-1)       ! adiabatic boundary condition, x=L
        enddo
Дээрх нь гол бодолтын гогцоог харуулах ба хэсэг бүрт нь тайлбарлавал мөргөлдөөн, урсгал, хязгаарын нөхцлийн шинэчлэл гэсэн гурван хэсгээс тогтоно. Эхний гогцоонд өгөгдсөн түгэлтийн функцаар гогцоо бүрийн хамаарах хэмжигдэхүүнийг (rho(i)=f1(i)+f2(i)) тодорхойлно. Үүний дараа тэнцвэрт түгэлтийн функцыг тодорхойлохдоо уг хамаарах хэмжигдэхүүнийг ашиглана.
Бодлогод D1Q2 схем хэрэглэж байгаа учраас k индекс нь 1 ба 2 гэсэн утга авах ба тэнцвэрт түгэлтийн функц нь 2 ширхэг байна. Гэвч ижил үр дүн гарах учир бодлогод зөвхөн feq1=feq2=feq хэмээн feq – ээр авсан болно. Жинлэх хүчин зүйл нь w1 + w2 = 1 байна гэдгээр тус бүр нь 0.5тай (k1=k2=0.5) тэнцэх ёстой. Ингээд мөргөлдөх алхамыг f1(i)=(1.-omega)*f1(i)+omega*feq(i) байдлаар зангилаа бүрд, түгэлтийн функц бүрд бодно. Мөргөлдөх үеийн түгэлтийн функц нь өмнөх урсгалаас ирсэн түгэлтийн функц, тэнцвэрт түгэлтийн функцаар тодорхойлогдоно. Харин мөргөлдсөний дараа чиглэлийн дагуу дараачийн зангилааруу шилжих болно.
Энэ зурганд тасархай зураасаар f2(i) түгэлтийн функцыг, тод зураасаар f1(i) функыг харуулсан болно. Мөргөлдөөний дараа чиглэлийн дагуу f1(i) нь зүүнээс баруунлуу шилжих ба f1(1)=f1(0) тэнцүү, харин f1(2)=f1(1) тэй тэнцүү гэх мэтээр эцэстээ f1(100)=f1(99) байх ёстой. Харин f2(i) түгэлтийн функцын хувьд чиглэлийн дагуу баруунаас зүүнлүү урсах ба илэрхийлбэл f2(0)=f2(1), харин f2(1)=f2(2), эцэстээ f2(99)=f2(100) болно. Хязгаарын нөхцл баруун ба зүүн захад байх ёстой ба зүүн захын 0 гэсэн зангилаан дээр хэмжээсгүй температур 1 гэсэн утгыг өгөх ёстой. Иймд 0 цэгийн хувьд хоёр дахь тэгшитгэлээс улбаалан f1(0)=Twall-f2(0) байна. Бодолтын алхам бүрд 0 цэгийн нэгдүгээр түгэлтийн функц нь энэ утгыг дамжуулах болно. Энэ бол зүүн зах дээрх Диричлетийн хязгаарын нөхцөл юм. Сүүлийн хоёр нь температурын графиент тэг байх адиабат хязгаарын нөхцөл юм. Энэ мэтээр дээрх бодолтыг 200 хүртэл давтан хийнэ. Энэ үед бодогдсон урсгалаар тодорхойлогдсон түгэлтийн функцууд хамаарах хэмжигдэхүүнийг тодорхойлж улмаар мөргөлдөөний үеийн түгэлтийн функцыг тодорхойлох болно.
       do i=0,m
          write(2,*) x(i), rho(i)
        enddo
Ингээд бодолт дуусаж үр дүнг хэвлэнэ. Энэ аргаар бодсон үр дүнг Төгсгөлөг ялгаварын аргаар бодсон үр дүнтэй харьцуулж харуулбал


Тооцоонд бараг ялгаа гарсангүй. Учир нь тархалтын тэгшитгэлийн төгсгөлөг ялгаварын тэгшитгэл болон ЛБА-ын мөргөлдөөний тэгшитгэлүүд нь бараг адилтгал тэгшитгэлүүд болж таардаг. Нюфлотоор хэрхэн дээрх графикийг байгаалах кодыг авч үзье.
gnuplot> plot [0:30] 'resultFDM.dat' w points pt 7, 'resultLBM.dat' w linespoints
gnuplot> set term png                                                           
Terminal type set to 'png'
Options are 'nocrop font "arial,12" fontscale 1.0 size 640,480 '
gnuplot> set output 'result.png'                                                
gnuplot> replot                                                                 
gnuplot> set term win                                                           
Terminal type set to 'windows'
Options are '0 color solid noenhanced'

Дээрх цэнхэрээр ялгасан нь терминалийн өөрөө хэвлэх мэссэж юм. Ингээд ЛБА ба ТЯА-ын фортран кодуудыг хавсаргавал.
Латтис Больцманы код
1:     program diffusionLBM  
2:      parameter (m=100)       ! m is the number of lattice nodes  
3:      real fo(0:m), f1(0:1), f2(0:m), rho(0:m), feq(0:m), x(0:m)  
4:      integer i  
5:      open(2,file='resultLBM.dat')  
6:      dt=1.0  
7:      dx=1.0  
8:      x(0)=0.0  
9:  ! lattice arrangement  
10:      do i=1,m  
11:        x(i)=x(i-1)+dx  
12:      end do  
13:      csq=dx*dx/(dt*dt)  
14:      alpha=0.25           ! diffusive coefficient  
15:      omega=1.0/(alpha/(dt*csq)+0.5) ! eq.3.23  
16:      mstep=200           ! total number of time steps  
17:      twall=1.0           ! left hand wall temperature  
18:  ! initial condition  
19:      do i=0,m  
20:       rho(i)=0.0           ! initial value of the domain temperature  
21:       f1(i)=0.5*rho(i)  
22:       f2(i)=0.5*rho(i)  
23:      end do  
24:      do kk=1,mstep  
25:  ! main loop  
26:  ! collision process  
27:       do i=0,m  
28:        rho(i)=f1(i)+f2(i)      ! dependent variable d.function  
29:        feq(i)=0.5*rho(i)      ! equilibrium distribution function   
30:  ! since k1=k2=0.5, then feq1=feq2=feq  
31:        f1(i)=(1.-omega)*f1(i)+omega*feq(i)  
32:        f2(i)=(1.-omega)*f2(i)+omega*feq(i)  
33:       enddo  
34:  ! streaming process  
35:       do i=1,m-1  
36:        f1(m-i)=f1(m-i-1)  ! f1 streaming  
37:        f2(i-1)=f2(i)    ! f2 streaming  
38:       enddo  
39:  ! boundary condition  
40:       f1(0)=twall-f2(0)  ! constant temperature boundary condition, x=0  
41:       f1(m)=f1(m-1)    ! adiabatic boundary condition, x=L  
42:       f2(m)=f2(m-1)    ! adiabatic boundary condition, x=L  
43:      enddo  
44:  ! end of loop  
45:      do i=0,m  
46:       write(2,*) x(i), rho(i)  
47:      enddo  
48:      stop  
49:      close(2)  
50:      end program  

Төгсгөлөг ялгаварын аргын код

1:     program diffusionfdm  
2:     parameter (m=100)  
3:     real dens,fo(0:m),f(0:m)  
4:     integer i  
5:     open(2,file='resultFDM.dat')  
6:     dx=1.0  
7:     dt=0.500  
8:     alpha=0.25  
9:     mstep=400  
10:     do i=0,m  
11:     fo(i)=0.0  
12:     end do  
13:     fo(0)=1.0   ! initial condition for old value of f at x=0.  
14:     f(0)=1.0   ! initial condition for updated value of f at x=0.  
15:     fo(m)=fo(m-1) ! initial condition for old value of f at x=L  
16:     f(m)=f(m-1)  ! initial condition for updated value of f at x=L  
17:     do kk=1,mstep  
18:  ! main loop  
19:     do i=1,m-1  
20:     f(i)=fo(i)+dt*alpha*(fo(i+1)-2.*fo(i)+fo(i-1))/(dx*dx)  
21:     end do  
22:     do i=1,m-1  
23:     fo(i)=f(i)  ! updating  
24:     end do  
25:     fo(m)=f(m-1) ! updating the boundary condition at x=L  
26:     end do  
27:  ! end of the main loop  
28:     x=0.0  
29:     do i=0,m  
30:     write(2,*) x,f(i)  
31:     x=x+dx  
32:     end do  
33:     stop  
34:     end  
Төгсөв.

No comments:

Post a Comment