Tuesday, May 12, 2015

Изотерм бус үл шахагдах шингэний урсгалыг ЛБА-аар загварчлах /Heated channel laminar flow with LBM/

Изотерм бус үл шахагдах шингэний урсгалыг загварчлах

Томъёоллоороо бол изо гэдэг нь ижил гэсэн утгыг илэрхийлэх ба изотерм гэдэг нь бодлогод авч үзэж буй материалд агуулагдах дулааны тоо хэмжээнд өөрчлөлт орохгүй гэдэг нөхцлийг илтгэнэ. Өөрөөр хэлбэл бодлогийн туршид температур тогтмол байх эсхүл температуртай холбоотой хэсгийг бодлогод тооцохгүй үлдээнэ гэсэн үг юм. Харин изотерм бус гэдэг нь шингэний урсгалтай хамт дулааны тоо хэмжээнд өөрчлөлт орох урсгалыг хэлнэ. Дулааны өөрчлөлт урсгалын бусад физик хэмжигдэхүүнд нөлөөлнө. Үүний нэг жишээ болгон гэрлийн чийдэн доторх аргонд дулаан хэрхэн дамжих процессыг харъя. Гэрлийн ламфан дотор вольфрамын утас цахилгаан гүйдэлийн улмаар гэрэлтэж Жоулын нэгдүгээр хуулиар дулаан ялгаруулах ба уг дулаан аргонд шингэж гэрлийн чийдэн тодорхи аргоны урсгалыг бий болгоно.



Дулаан тархах болон аргоны урсгах энэхүү холимог үзэгдлийг байгалийн конвекци гэж нэрлэдэг.


Ерөнхийдөө хоёр төрлийн дулаан тархалтын процесс байх ба үүний нэг нь дээрх жишээн д дурьдсан байгалийн конвекцийн үзэгдэл юм. Дулаан тархалт урсгалаар тархах ба ямар нэгэн хүчний улмаар тархалтын процесс идэвхижиж болно. Үүнийг хүчилсэн концвекцийн үзэгдэл гэж нэрлэнэ. Хүчилсэн конвекцийн үзэгдлийн эх үүсвэр хүч нь ихэвчлэн гадны хүч байх ба энэ төрлийн бодлогод Прандтлын тоо Prandtl number /Pr/ чухал үүрэг гүйцэтгэнэ. Энэ тоо нь хэмжээсгүй тоо бөгөөд зунгааралтын коэффициент ба дулаан тархалтын коэффицентын ноогдвороор анх Германы физикч Лудвик Прандтл илэрхийлсэн учир түүний нэрээр нэрлэжээ.
Ню нь кинематик зунгааралтын коэффициент ба ню=мю/ро [м2/с] гэж илэрхийлэгдэнэ.
Альфа нь дулаан тархалтын коэффициент ба алфа=k/(ро cp) [м2/c] гэж илэрхийлэгдэнэ.
К нь дулаан дамжуулах чадвар, [В/м К] гэсэн нэгжтэй байна. Ватт метр келвин.
Ср нь дулаан багтаамж [Ж/кг К] юм. Жоуль килограмм келвин
Прандтлын тоо нэгээс их бол гадны хүчний нөлөө их байх ба момент [хөдөлгөөний тоо хэмжээний] зонхилсон, нэгээс бага бол дулаан тархалт зонхилсон буюу байгалийн конвекцит урсгал гэж үзэж болох юм. Энд хүчилсан конвекцийн үзэгдлийн жишээг ЛБА-аар хэрхэн загварчлахыг D2Q9 сүлжээн дээр авч үзье.

Халуун хоолой доторхи ламинар урсгал

Гаднаас үйлчлэх хүч нь температураас хамаарах функц биш учраас моментийн тэгшитгэл болон скаляр орны тэгшитгэлүүд тусдаа бодогдох болно. Скаляр оронд бидний авч үзэх температур эсвэл ууссан бодис, масс тархалт, энергийн тэгшитгэл гэх мэт хамаарах болно. Харин байгалийн конвекцийн үзэгдэлд урсгал ба дулаан тархалтыг идэвхижүүлэгч нь дулаанаас хамааралтай функц байх учир дээрх тэгшитгэлүүд нэгэн дор тооцогдож болно. Иймд хоёр өөр түгэлтийн функц тус бүр моментийн тэгшитгэлд f, температурын орны тэгшитгэлд g гээд дараах байдлаар тооцогдоно.
Дээрхи мөргөлдөөний тэгшитгэлд байх тайвшралтын давтамж нь момент ба скаляр оронд мөн өөр байдлаар тодорхойлогдох ёстой.
Үүнд алфа ба ню нь томъёо 1-д ашигласантай ижил. Тэнцвэрт түгэлтийн функцыг адвекцийн бодлогын хувьд дараах байдлаар тодорхойлно.
Хүйтэн tin=20oC шингэн халуун tw=80oC хоолой [тэгш өнцөгт] дундуур анхны хурд uin=0.001м/с хурдтай урсана гэж бодлогын өгөгдлийг авъя. Хоолойн хана тогтмол температураа бодлогийн туршид барих ба хоолойн өндөр 6.0см, урт нь 120см байна. Бодлогын хувьд дундаж температур болох 50oC градустай үе дахь кинематик зунгааралт ба дулаан тархалтын коэффициент тус бүр ню=6.0x10-7 м2/c, алфа=1.58x10-7 м2/c байна. Рейнольдсын тоо ба Прандтлын тоог тус бүр тодорхойлбол:
Хэмжээсгүй температурыг дараах байдлаар тодорхойлно.
ЛБА-д геометрийн нөлөөллийг тусгахын тулд уртын масштабыг өндөрөөр авъя. Бодлогийн геометрийг тайлбарлавал,
Хэмжээсгүй температурын хувьд x=0 үед төттө=0, у=0 ба y/H=1.0 үед төттө=1.0 байна.  хоолойн гаралтын хэсэгт x=L үед хэмжээсгүй температурын орон зайн өөрчлөлт 0 байна гэж үзнэ. Ингээд фортран кодыг эхнээс нь тайлбарлая.
      parameter (n=1000,m=50)
      real f(0:8,0:n,0:m)
      real feq(0:8,0:n,0:m),rho(0:n,0:m)
      real w(0:8), cx(0:8), cy(0:8)
      real u(0:n,0:m), v(0:n,0:m)
      real g(0:8,0:n,0:m), geq(0:8,0:n,0:m), th(0:n,0:m)
      integer i
Босоо чиглэлд 50 сүлжээ 6см-ийн зайнд, хэвтээ чиглэлд 1000 сүлжээ 120см зайнд тус тус багтана. Масштабны коэффициент 0.12см байна. Момент ба температур тархалт тус бүрдээ тооцогдох учраас тус бүрд түгэлтийн функц f(0:8,0:n,0:m), g(0:8,0:n,0:m) гэж, тэнцвэрт түгэлт мөн л feq(0:8,0:n,0:m), geq(0:8,0:n,0:m) гэж зарлагдана. real w(0:8), cx(0:8), cy(0:8) гэдэг мөрөнд эхнийх нь сүлжээний жинлэх хүчин зүйл, сүүлчийн хоёр нь босоо ба хэвтээ сүлжээний хурднууд сүлжээний чиглэл дүрт харгалзах болно. real u(0:n,0:m), v(0:n,0:m) нь макро орчин дахь хэвтээ ба босоо хурдны байгуулагчууд rho(0:n,0:m), th(0:n,0:m) нар тус бүр нягт ба хэмжээсгүй температурууд болно. Зарлах хэсэг дууссан учир тогтмол параметрүүдийг дараах байдлаар өгнө.
      cx(:)=(/0.0,1.0,0.0,-1.0,0.0,1.0,-1.0,-1.0,1.0/)
      cy(:)=(/0.0,0.0,1.0,0.0,-1.0,1.0,1.0,-1.0,-1.0/)
      w(:)=(/4./9.,1./9.,1./9.,1./9.,1./9.,1./36.,1./36.,1./36.,1./36./)
      uo=0.1
      rhoo=5.00
      dx=1.0
      dy=dx
      dt=1.0
      tw=1.0
      th=0.0
      g=0.0
      visco=0.05
      pr=3.8
      alpha=visco/pr
      Re=uo*m/alpha
      omega=1.0/(3.*visco+0.5)
      omegat=1.0/(3.*alpha+0.5)
Эхний гурван мөрөөр сүлжээний хэвтээ, босоо хурд, жинлэх хүчин зүйлийг өгч байна. Сүлжээний хурд сүлжээ бүрт 9 ширхэг байх ба байгуулагчийг өмнөх жишээний /хөндийн урсгал/ зурагтай харьцуулж харж болно. Анхны хурдыг uo=0.1, анхны нягтыг rhoo=5.00, орон зайн ба хугацааны алхамыг dx=dy=dt=1.0, ханын температурыг tw=1.0, анхны шингэний температурыг th=0.0 өгч Рейнольдсын тоог (6)-аар, тайвшралтын хэлбэлзлүүдийг тус бүр (4)-өөр omega-wm, omegat-ws гэж тодорхойлов. Ингээд шингэний анхны нөхцлийг дараах байдлаар өгнө.
      do j=0,m
      do i=0,n
      rho(i,j)=rhoo
      u(i,j)=0.0
      v(i,j)=0.0
      end do
      end do
      do j=1,m-1
      u(0,j)=uo
      v(0,j)=0.0
      end do
Эхний хоёр гогцоонд шингэний нягт ба хурднуудыг бүх сүлжээний хувьд анхны байдлаар өгнө. Үүний дараа оролтын хэсэгт хэвтээ хурд оролтын хурдтай тэнцүү байх учир дахин j=1,m-1 үед u(0,j)=uo гэж өгнө. Ингэснээр урсгалыг эхлүүлэх боломж бий болно. Температурын орон нэгэнт 0 учир түүнийг өгөхгүйгээр бодлогийн гол гогцоог эхлүүлж болно. Анхны нөхцлийг өгч дууссан учир бодлогийн гол гогцоонд шилжье.
      DO kk=1,mstep
      call collesion(u,v,f,feq,rho,omega,w,cx,cy,n,m)
      call streaming(f,n,m)
      call sfbound(f,n,m,uo)
      call rhouv(f,rho,u,v,cx,cy,n,m)
      do j=0,m
      do i=0,n
      sum=0.0
      do k=0,8
      sum=sum+g(k,i,j)
      th(i,j)=sum
      end do
      end do
      end do
! collision for scalar
      call collt(u,v,g,geq,th,omegat,w,cx,cy,n,m)
! streaming for scalar
      call streaming(g,n,m)
      call gbound(g,tw,w,n,m)
      print *, th(n/2,m/2),v(0,m/2),rho(0,m/2),u(n,m/2)
      print*, v(n,m/2),rho(n,m/2)
      END DO
Эхний ногоон хэсэгт өмнөх бодлоготой ижилээр моментийн тэгшитгэлийг шийдвэрлэж нягт ба хурдны бүрдүүлэгчийг тооцох дэд програмууд байна. Харин дараагийн цэнхэр хэсэгт шинээр нэмэгдэж орж буй температурын тархалтыг бодохын тулд бүх сүлжээнд температурыг түгэлтийн функаар тодорхойлох гогцоог оруулж өгч байна. Энд байх g(k,i,j) нь температурын орны түгэлтийн функц ба параметрийн өгөгдлийн хэсэгт g=0.0 гэж өгөгдсөн байгаа. Харин th(i,j) нь хэмжээсгүй температурыг илэрхийлэх төттө юм. Сүүлчийн ногоон хэсэгт температурын хувьд мөргөлдөх процессийг дэд програмаар call collt, урсгалыг call streaming(g,n,m) дэд програмаар гэхдээ моменттой ямарч ялгаагүй, тус тус үнэлж хязгаарын нөхцлийг call gbound(g,tw,w,n,m) –аар шийдвэрлэнэ. Ингээд сүүлийн ногоонд дурьдагдсан дэд кодуудыг тайлбарлая.

Дулаан тархалтын мөргөлдөх процесс call collt

Моментийн тэгшитгэлээр үнэлэгдсэн хурд дулааны тархалтанд хэрэглэгдэнэ. Учир нь дулаан урсгалын хурдаар тархах ёстой.
      subroutine collt(u,v,g,geq,th,omegat,w,cx,cy,n,m)
      do i=0,n
      do j=0,m
      do k=0,8
      geq(k,i,j)=th(i,j)*w(k)*(1.0+3.0*(u(i,j)*cx(k)+v(i,j)*cy(k)))
      g(k,i,j)=omegat*geq(k,i,j)+(1.0-omegat)*g(k,i,j)
      end do
      end do
      end do
      return
      end
Гол үйлдэл цэнхэрээр ялгасан хэсэгт бий болох ба эхний мөр нь тэгшитгэл (5)- ийн дагуу температурын тэнцвэрт түгэлтийн функцийг geq(k,i,j)=th(i,j)*w(k)*(1.0+3.0*(u(i,j)*cx(k)+v(i,j)*cy(k))) гэж тодорхойлно. Үүнд дээрх өгүүлбэр ёсоор макро орчны хурднууд нь моментийн бодолтоос олдсон байна. Хоёр дахь мөр нь мөргөлдөх алхамыг тэгшитгэл (3) – ийн дагуу бодно.

Моментийн бодолтын хязгаарын нөхцөл call sfbound

Тэг эрэмбийн момент тархалт буюу нягтын бодолтын хувьд хязгаарын нөхцөл нь өмнөх жишээ болох хөндийн урсгалтай ижил боловч оролт ба гаралтын нөхцөл үл ялиг ялгаатай байна.  Үүнийг тасдаж аван доор талйбарлая.
! flow in on west boundary
      rhow=(f(0,0,j)+f(2,0,j)+f(4,0,j)+2.*(f(3,0,j)+f(6,0,j)+f(7,0,j)))
      rhow=rhow/(1.-uo)
      f(1,0,j)=f(3,0,j)+2.*rhow*uo/3.
      f(5,0,j)=f(7,0,j)+rhow*uo/6.
      f(8,0,j)=f(6,0,j)+rhow*uo/6.
      end do
! account for open boundary condition at the outlet
      do j=1,m
      f(1,n,j)=2.*f(1,n-1,j)-f(1,n-2,j)
      f(5,n,j)=2.*f(5,n-1,j)-f(5,n-2,j)
      f(8,n,j)=2.*f(8,n-1,j)-f(8,n-2,j)
      end do
      return
      end
Баруун хэсэгт хоолойн урсгалын оролтын хэсэг байх учир оролтын хязгаарын нөхцлийг өгнө. Энэ хэсэгт f1, f5, f8 нар урсгалын процессоос олдохгүй учир тэдгээрийг f3, f7, f6 –аар дамжуулан тодорхойлох болно. Ингэхдээ хязгаарын нөхцөлтэй нормал тэнцвэрт нөхцлийг ашиглана.
Дээрхи хоёр тэгшитгэлээс хөөн хязгаарын нөхцлийг дараах байдлаар тодорхойлж болно. Тод хараах бичигдсэн макро орчны хурд, сүлжээний хурд нь вектор хэлбэрээр байгаа учир тод хараах тэмдэглэсэн болно.
Дээрх тэгшитгэлд индекс w нь зөвхөн west гэдэг утгыг илэрхийлж байгаа юм. Нягтыг эхний тэгшитгэл ёсоор rhow=(f(0,0,j)+f(2,0,j)+f(4,0,j)+2.*(f(3,0,j)+f(6,0,j)+f(7,0,j)))/(1.-uo) гэж тодорхойлох ба код урт учир таслан хоёр мөр болгон бичсэн болно. Ингээд f1, f5, f8 тус бүрийг томъёо ёсоор тодорхойлно. Хоёр дахь хэсэгт гаралтын хэсэгт зориулан нээлттэй хязгаарын нөхцлийг өгнө. Бид гаралтын хурд ямар байхыг мэдэхгүй, мөн сүлжээний f3, f6, f7 гэсэн түгэлтийн функцуудыг мэдэхгүй учир буцаж ойх хязгаарын нөхцлөөс ялгаатайгаар түгэлтийн функцад экстраполяци хийж тодорхойлно. Үүнийг нээлттэй хязгаарын нөхцөл гэж нэрлэнэ.

Дулаан тархалтын хязгаарын нөхцөл call gbound

! West boundary condition, the temperature is 0
      do j=0,m
      g(1,0,j)=-g(3,0,j)
      g(5,0,j)=-g(7,0,j)
      g(8,0,j)=-g(6,0,j)
      end do
! Right hand boundary condition, open
      do j=0,m
      g(6,n,j)=2.*g(6,n-1,j)-g(6,n-2,j)
      g(3,n,j)=2.*g(3,n-1,j)-g(3,n-2,j)
      g(7,n,j)=2.*g(7,n-1,j)-g(7,n-2,j)
      g(2,n,j)=2.*g(2,n-1,j)-g(2,n-2,j)
      g(0,n,j)=2.*g(0,n-1,j)-g(0,n-2,j)
      g(1,n,j)=2.*g(1,n-1,j)-g(1,n-2,j)
      g(4,n,j)=2.*g(4,n-1,j)-g(4,n-2,j)
      g(5,n,j)=2.*g(5,n-1,j)-g(5,n-2,j)
      g(8,n,j)=2.*g(8,n-1,j)-g(8,n-2,j)
      end do
! Top boundary conditions, T=1.0
      do i=0,n
      g(8,i,m)=tw*(w(8)+w(6))-g(6,i,m)
      g(7,i,m)=tw*(w(7)+w(5))-g(5,i,m)
      g(4,i,m)=tw*(w(4)+w(2))-g(2,i,m)
      g(1,i,m)=tw*(w(1)+w(3))-g(3,i,m)
      end do
!Bottom boundary conditions
      do i=0,n
      g(2,i,0)=tw*(w(2)+w(4))-g(4,i,0)
      g(6,i,0)=tw*(w(6)+w(8))-g(8,i,0)
      g(5,i,0)=tw*(w(5)+w(7))-g(7,i,0)
      end do
      return
      end
Эхний хэсэгт оролтын хэсгийн хязгаарын нөхцлийг буцаж ойх нөхцлөөр тодорхойлсон байна. Ингэхдээ сөрөг тэмдэг авах нь тооцоолол сүлжээний хурдны байгуулагчийн сөрөг тэмдэгийг арилгах үүрэгтэй юм. Баруун гар тал буюу гаралтын хэсэг дээр өмнөхтэй адил байдлаар нээлттэй хязгаарын нөхцлийг хэрэглэнэ. Хамгийн сүүлчийн сүлжээний түгэлтийн функцууд нь сүүлээсээ хоёр ба гуравдах сүлжээний түгэлтийн функцыг ашиглан арифметик дундажаар тодорхойлогдоно.  Энэ нь гаралтын хэсэгт температурын өөрчлөлт байхгүй dтөттө/dt=0 гэдэгтэй утга нэг нөхцөл юм. Дээд ба доод хана нь тогтмол температураар шингэнийг халаах учир Диричлет /нэг хэмжээст бодлогийг харах/ хязгаарын нөхцлийг ашиглана. Энэ хязгаарын нөхцөлд хязгаар дахь цүлхэлтийн утга 0 байх ёстой гэсэнд үндэслэн дараах тэгшитгэлийг жишээ болгон бичиж болно.
Энд байх тэнцвэрт түгэлтийн функцуудыг дараах байдлаар тодорхойлж болно.
Эндээс g6 нь урсгалын процессоос тооцогдох боломжтой учир хязгаарын нөхцөл g8-ийн хувьд дараах байдалтай болно.
Дээрх тэгшитгэлээр бичсэн код нь g(8,i,m)=tw*(w(8)+w(6))-g(6,i,m) бөгөөд бусад үл мэдэгдэх g4, g7, g1, доод хязгаарт g2, g6, g5 – ийн хувьд ижил байдлаар бодогдоно.

Температурын тархалтыг үнэлэх дэд програм subroutine tcalcu

Хязгаарын нөхцлийг өгч дууссаны дараа бодлогийн хүрээнд тодорхойлогдоогүй түгэлтийн функц байхгүй болно. Иймд хугацааны алхамд харгалзах температурын тархалтыг бодох боломж бий болно.
      do j=1,m-1
      do i=1,n-1
      ssumt=0.0
      do k=0,8
      ssumt=ssumt+g(k,i,j)
      end do
      th(i,j)=ssumt
      end do
      end do
      return
      end

Дулааны тэгшитгэлд бодогдсон түгэлтийн функцуудын нийлбэр макро орчин дахь хэмжээсгүй температурыг тодорхойлно. Харин моментийн хэсэгт шингэний нягт ба хурдыг тодорхойлно.

Үр дүн

Оролтын хэсэг дах температурын тархалт

Оролтын хэсэг дахь босоо хурдны байгуулагч

Оролтын хэсэг дахь хэвтээ хурдны байгуулагч

Ламинар урсгалын төлөвших үе

Ингээд бүрэн кодыг хавсаргая.
ЛБА-аар халуун хоолой дотуурх ламинар ургалыг тооцох фортран код

1:     program heatedchannel  
2:     parameter (n=1000,m=50)  
3:     real f(0:8,0:n,0:m)  
4:     real feq(0:8,0:n,0:m),rho(0:n,0:m)  
5:     real w(0:8), cx(0:8),cy(0:8)  
6:     real u(0:n,0:m), v(0:n,0:m)  
7:     real g(0:8,0:n,0:m), geq(0:8,0:n,0:m),th(0:n,0:m)  
8:     integer i  
9:     open(2,file='uvfield.data')  
10:     open(3,file='uvely.data')  
11:     open(4,file='vvelx.data')  
12:  !  
13:     cx(:)=(/0.0,1.0,0.0,-1.0,0.0,1.0,-1.0,-1.0,1.0/)  
14:     cy(:)=(/0.0,0.0,1.0,0.0,-1.0,1.0,1.0,-1.0,-1.0/)  
15:     w(:)=(/4./9.,1./9.,1./9.,1./9.,1./9.,1./36.,1./36.,1./36.,1./36./)  
16:     uo=0.1  
17:     rhoo=5.00  
18:     dx=1.0  
19:     dy=dx  
20:     dt=1.0  
21:     tw=1.0  
22:     th=0.0  
23:     g=0.0  
24:     visco=0.05  
25:     pr=3.8  
26:     alpha=visco/pr  
27:     Re=uo*m/alpha  
28:     print *, 'Re=', Re  
29:     omega=1.0/(3.*visco+0.5)  
30:     omegat=1.0/(3.*alpha+0.5)  
31:     mstep=10000  
32:     do j=0,m  
33:     do i=0,n  
34:     rho(i,j)=rhoo  
35:     u(i,j)=0.0  
36:     v(i,j)=0.0  
37:     end do  
38:     end do  
39:     do j=1,m-1  
40:     u(0,j)=uo  
41:     v(0,j)=0.0  
42:     end do  
43:  ! main loop  
44:     do kk=1,mstep  
45:     call collesion(u,v,f,feq,rho,omega,w,cx,cy,n,m)  
46:     call streaming(f,n,m)  
47:     call sfbound(f,n,m,uo)  
48:     call rhouv(f,rho,u,v,cx,cy,n,m)  
49:     do j=0,m  
50:     do i=0,n  
51:     sum=0.0  
52:     do k=0,8  
53:     sum=sum+g(k,i,j)  
54:     th(i,j)=sum  
55:     end do  
56:     end do  
57:     end do  
58:  ! collision for scalar  
59:     call collt(u,v,g,geq,th,omegat,w,cx,cy,n,m)  
60:  ! streaming for scalar  
61:     call streaming(g,n,m)  
62:     call gbound(g,tw,w,n,m)  
63:     print *, th(n/2,m/2),v(0,m/2),rho(0,m/2),u(n,m/2)  
64:     print*, v(n,m/2),rho(n,m/2)  
65:     END DO  
66:  ! end of the main loop  
67:     call result(u,v,th,uo,n,m)  
68:     stop  
69:     end program  
70:  ! end of the main program  
71:     subroutine collesion(u,v,f,feq,rho,omega,w,cx,cy,n,m)  
72:     real f(0:8,0:n,0:m)  
73:     real feq(0:8,0:n,0:m),rho(0:n,0:m)  
74:     real w(0:8), cx(0:8),cy(0:8)  
75:     real u(0:n,0:m), v(0:n,0:m)  
76:     DO i=0,n  
77:     DO j=0,m  
78:     t1=u(i,j)*u(i,j)+v(i,j)*v(i,j)  
79:     DO k=0,8  
80:     t2=u(i,j)*cx(k)+v(i,j)*cy(k)  
81:     feq(k,i,j)=rho(i,j)*w(k)*(1.0+3.0*t2+4.50*t2*t2-1.50*t1)  
82:     f(k,i,j)=omega*feq(k,i,j)+(1.-omega)*f(k,i,j)  
83:     END DO  
84:     END DO  
85:     END DO  
86:     return  
87:     end  
88:     subroutine collt(u,v,g,geq,th,omegat,w,cx,cy,n,m)  
89:     real g(0:8,0:n,0:m),geq(0:8,0:n,0:m),th(0:n,0:m)  
90:     real w(0:8),cx(0:8),cy(0:8)  
91:     real u(0:n,0:m),v(0:n,0:m)  
92:     do i=0,n  
93:     do j=0,m  
94:     do k=0,8  
95:     geq(k,i,j)=th(i,j)*w(k)*(1.0+3.0*(u(i,j)*cx(k)+v(i,j)*cy(k)))  
96:     g(k,i,j)=omegat*geq(k,i,j)+(1.0-omegat)*g(k,i,j)  
97:     end do  
98:     end do  
99:     end do  
100:     return  
101:     end  
102:     subroutine streaming(f,n,m)  
103:     real f(0:8,0:n,0:m)  
104:  ! streaming  
105:     DO j=0,m  
106:     DO i=n,1,-1 !RIGHT TO LEFT  
107:     f(1,i,j)=f(1,i-1,j)  
108:     END DO  
109:     DO i=0,n-1 !LEFT TO RIGHT  
110:     f(3,i,j)=f(3,i+1,j)  
111:     END DO  
112:     END DO  
113:     DO j=m,1,-1 !TOP TO BOTTOM  
114:     DO i=0,n  
115:     f(2,i,j)=f(2,i,j-1)  
116:     END DO  
117:     DO i=n,1,-1  
118:     f(5,i,j)=f(5,i-1,j-1)  
119:     END DO  
120:     DO i=0,n-1  
121:     f(6,i,j)=f(6,i+1,j-1)  
122:     END DO  
123:     END DO  
124:     DO j=0,m-1 !BOTTOM TO TOP  
125:     DO i=0,n  
126:     f(4,i,j)=f(4,i,j+1)  
127:     END DO  
128:     DO i=0,n-1  
129:     f(7,i,j)=f(7,i+1,j+1)  
130:     END DO  
131:     DO i=n,1,-1  
132:     f(8,i,j)=f(8,i-1,j+1)  
133:     END DO  
134:     END DO  
135:     return  
136:     end  
137:     subroutine sfbound(f,n,m,uo)  
138:     real f(0:8,0:n,0:m)  
139:     do j=0,m  
140:  ! flow in on west boundary  
141:     rhow=(f(0,0,j)+f(2,0,j)+f(4,0,j)+2.*(f(3,0,j)+f(6,0,j)+f(7,0,j)))  
142:     rhow=rhow/(1.-uo)  
143:     f(1,0,j)=f(3,0,j)+2.*rhow*uo/3.  
144:     f(5,0,j)=f(7,0,j)+rhow*uo/6.  
145:     f(8,0,j)=f(6,0,j)+rhow*uo/6.  
146:     end do  
147:  ! bounce back on south boundary  
148:     do i=0,n  
149:     f(2,i,0)=f(4,i,0)  
150:     f(5,i,0)=f(7,i,0)  
151:     f(6,i,0)=f(8,i,0)  
152:     end do  
153:  ! bounce back, north boundary  
154:     do i=0,n  
155:     f(4,i,m)=f(2,i,m)  
156:     f(8,i,m)=f(6,i,m)  
157:     f(7,i,m)=f(5,i,m)  
158:     end do  
159:  ! account for open boundary condition at the outlet  
160:     do j=1,m  
161:     f(1,n,j)=2.*f(1,n-1,j)-f(1,n-2,j)  
162:     f(5,n,j)=2.*f(5,n-1,j)-f(5,n-2,j)  
163:     f(8,n,j)=2.*f(8,n-1,j)-f(8,n-2,j)  
164:     end do  
165:     return  
166:     end  
167:     subroutine gbound(g,tw,w,n,m)  
168:     real g(0:8,0:n,0:m)  
169:     real w(0:8)  
170:  ! Boundary conditions  
171:  ! West boundary condition, the temperature is given, tw  
172:     do j=0,m  
173:     g(1,0,j)=-g(3,0,j)  
174:     g(5,0,j)=-g(7,0,j)  
175:     g(8,0,j)=-g(6,0,j)  
176:     end do  
177:  ! Right hand boundary condition, open  
178:     do j=0,m  
179:     g(6,n,j)=2.*g(6,n-1,j)-g(6,n-2,j)  
180:     g(3,n,j)=2.*g(3,n-1,j)-g(3,n-2,j)  
181:     g(7,n,j)=2.*g(7,n-1,j)-g(7,n-2,j)  
182:     g(2,n,j)=2.*g(2,n-1,j)-g(2,n-2,j)  
183:     g(0,n,j)=2.*g(0,n-1,j)-g(0,n-2,j)  
184:     g(1,n,j)=2.*g(1,n-1,j)-g(1,n-2,j)  
185:     g(4,n,j)=2.*g(4,n-1,j)-g(4,n-2,j)  
186:     g(5,n,j)=2.*g(5,n-1,j)-g(5,n-2,j)  
187:     g(8,n,j)=2.*g(8,n-1,j)-g(8,n-2,j)  
188:     end do  
189:  ! Top boundary conditions, T=1.0  
190:     do i=0,n  
191:     g(8,i,m)=tw*(w(8)+w(6))-g(6,i,m)  
192:     g(7,i,m)=tw*(w(7)+w(5))-g(5,i,m)  
193:     g(4,i,m)=tw*(w(4)+w(2))-g(2,i,m)  
194:     g(1,i,m)=tw*(w(1)+w(3))-g(3,i,m)  
195:     end do  
196:  !Bottom boundary conditions, Adiabatic  
197:  ! g(1,i,0)=g(1,i,1)  
198:  ! g(2,i,0)=g(2,i,1)  
199:  ! g(3,i,0)=g(3,i,1)  
200:  ! g(4,i,0)=g(4,i,1)  
201:  ! g(5,i,0)=g(5,i,1)  
202:  ! g(6,i,0)=g(6,i,1)  
203:  ! g(7,i,0)=g(7,i,1)  
204:  ! g(8,i,0)=g(8,i,1)  
205:  ! T=0.0  
206:     do i=0,n  
207:     g(2,i,0)=tw*(w(2)+w(4))-g(4,i,0)  
208:     g(6,i,0)=tw*(w(6)+w(8))-g(8,i,0)  
209:     g(5,i,0)=tw*(w(5)+w(7))-g(7,i,0)  
210:     end do  
211:     return  
212:     end  
213:     subroutine tcalcu(g,th,n,m)  
214:     real g(0:8,0:n,0:m),th(0:n,0:m)  
215:     do j=1,m-1  
216:     do i=1,n-1  
217:     ssumt=0.0  
218:     do k=0,8  
219:     ssumt=ssumt+g(k,i,j)  
220:     end do  
221:     th(i,j)=ssumt  
222:     end do  
223:     end do  
224:     return  
225:     end  
226:     subroutine rhouv(f,rho,u,v,cx,cy,n,m)  
227:     real f(0:8,0:n,0:m),rho(0:n,0:m),u(0:n,0:m),v(0:n,0:m)  
228:     real cx(0:8),cy(0:8)  
229:     do j=0,m  
230:     do i=0,n  
231:     ssum=0.0  
232:     do k=0,8  
233:     ssum=ssum+f(k,i,j)  
234:     end do  
235:     rho(i,j)=ssum  
236:     end do  
237:     end do  
238:     DO i=1,n  
239:     DO j=1,m-1  
240:     usum=0.0  
241:     vsum=0.0  
242:     DO k=0,8  
243:     usum=usum+f(k,i,j)*cx(k)  
244:     vsum=vsum+f(k,i,j)*cy(k)  
245:     END DO  
246:     u(i,j)=usum/rho(i,j)  
247:     v(i,j)=vsum/rho(i,j)  
248:     END DO  
249:     END DO  
250:     do j=0,m  
251:     v(n,j)=0.0  
252:     end do  
253:     return  
254:     end  
255:     subroutine result(u,v,th,uo,n,m)  
256:     real u(0:n,0:m),v(0:n,0:m),th(0:n,0:m)  
257:     write(2,*)'VARIABLES =X, Y, U, V, T'  
258:     write(2,*)'ZONE ','I=',n+1,'J=',m+1,',','F=BLOCK'  
259:     do j=0,m  
260:     write(2,*)(i,i=0,n)  
261:     end do  
262:     do j=0,m  
263:     write(2,*)(j,i=0,n)  
264:     end do  
265:     do j=0,m  
266:     write(2,*)(u(i,j),i=0,n)  
267:     end do  
268:     do j=0,m  
269:     write(2,*)(v(i,j),i=0,n)  
270:     end do  
271:     do j=0,m  
272:     write(2,*)(th(i,j),i=0,n)  
273:     end do  
274:     do j=0,m  
275:     write(3,*)j/float(m),u(5,j)/uo,u(n/2,j)/uo,u(n-10,j)/uo  
276:     end do  
277:     do i=0,n  
278:     write(4,*) i/float(n),v(i,m/2)/uo  
279:     end do  
280:     return  
281:     end  
Төгсөв.

No comments:

Post a Comment