Skip to content

Commit ad5f1c8

Browse files
committed
Zou He boundaries
1 parent 3caffaf commit ad5f1c8

File tree

10 files changed

+144
-53
lines changed

10 files changed

+144
-53
lines changed

.DS_Store

2 KB
Binary file not shown.

__pycache__/LBM_python.cpython-36.pyc

7 Bytes
Binary file not shown.

src/.DS_Store

0 Bytes
Binary file not shown.
7 Bytes
Binary file not shown.
Binary file not shown.

src/core/superLattice2D.py

Lines changed: 141 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import sys
22
import numpy
3+
import os
34
if __name__ == "__main__":
45
sys.path[0] = '/'.join(sys.path[0].split('/')[0:-2]) #go up 2 level
56
from src.geometry.Geometry2D import *
@@ -73,15 +74,13 @@ def initialize_(self):
7374

7475

7576

76-
77-
7877
def defineRhoU(self,SuperGeometry,materialNum,rho,u):
7978
for coord in self.materialCoordsDic[materialNum]:
8079
self.rhoMap[coord[0],coord[1]] = rho
8180
self.UMap[coord[0],coord[1],0] = u[0]
8281
self.UMap[coord[0],coord[1],1] = u[1]
8382

84-
def defineU_BC(self,SuperGeometry,materialNum,u,BCmethod = 'BB'):
83+
def defineU_BC(self,SuperGeometry,materialNum,u,BCmethod = 'ZH'):
8584
self.vloc = 0
8685

8786
#only support symmetrical velocity profile
@@ -96,30 +95,106 @@ def defineU_BC(self,SuperGeometry,materialNum,u,BCmethod = 'BB'):
9695
self.givenUFindRho(coord[0],coord[1],u[self.vloc,:],BCmethod)
9796
self.vloc = self.vloc + 1
9897

99-
def defineRho_BC(self,SuperGeometry,materialNum,rho,BCmethod = 'BB'):
98+
99+
def defineRho_BC(self,SuperGeometry,materialNum,rho,BCmethod = 'ZH'):
100100
for coord in self.materialCoordsDic[materialNum]:
101101
self.rhoMap[coord[0],coord[1]] = rho
102-
self.givenRhoFindU(coord[0],coord[1],BCmethod)
102+
self.givenRhoFindU(coord[0],coord[1],rho,BCmethod)
103103

104104

105-
def givenUFindRho(self,i,j,u,BCmethod):
105+
def givenUFindRho(self,i,j,u,BCmethod): #need modidfication
106106
#find rho
107107
#arrow = self.findArrow(i,j)
108108

109-
if BCmethod == 'BB':
109+
if BCmethod == 'ZH':
110110
for p in numpy.arange(1,5):
111111
if self.dynamics[(i+self.cx[p])%self.dynamics.shape[0],(j+self.cy[p])%self.dynamics.shape[1]] == 1:
112112

113-
self.rhoMap[i,j] = 1.5*self.rhoMap[i+self.cx[p],j+self.cy[p]] - 0.5*self.rhoMap[i+2*self.cx[p],j+2*self.cy[p]]
114-
115-
116-
def givenRhoFindU(self,i,j,BCmethod):
113+
# self.rhoMap[i,j] = 1.5*self.rhoMap[i+self.cx[p],j+self.cy[p]] - 0.5*self.rhoMap[i+2*self.cx[p],j+2*self.cy[p]]
114+
# # the following codes have sign error !!!!!!
115+
if p == 1 : #left/west
116+
self.rhoMap[i,j] = 1/(1-u[0])*(self.f[i,j,0]+self.f[i,j,2]+self.f[i,j,4]+2*(self.f[i,j,3]+self.f[i,j,6]+self.f[i,j,7]))
117+
self.f[i,j,1] = self.f[i,j,3]+2/3*self.rhoMap[i,j]*u[0]
118+
self.f[i,j,5] = self.f[i,j,7]-1/2*(self.f[i,j,2]-self.f[i,j,4])+1/6*self.rhoMap[i,j]*u[0]+1/2*self.rhoMap[i,j]*u[1]
119+
self.f[i,j,8] = self.f[i,j,6]+1/2*(self.f[i,j,2]-self.f[i,j,4])+1/6*self.rhoMap[i,j]*u[0]-1/2*self.rhoMap[i,j]*u[1]
120+
elif p == 2: #bottom/south
121+
self.rhoMap[i,j] = 1/(1-u[1])*(self.f[i,j,0]+self.f[i,j,1]+self.f[i,j,3]+2*(self.f[i,j,4]+self.f[i,j,7]+self.f[i,j,8]))
122+
self.f[i,j,2] = self.f[i,j,4]+2/3*self.rhoMap[i,j]*u[1]
123+
self.f[i,j,5] = self.f[i,j,7]-1/2*(self.f[i,j,1]-self.f[i,j,3])+1/2*self.rhoMap[i,j]*u[0]+1/6*self.rhoMap[i,j]*u[1]
124+
self.f[i,j,6] = self.f[i,j,8]+1/2*(self.f[i,j,1]-self.f[i,j,3])-1/2*self.rhoMap[i,j]*u[0]+1/6*self.rhoMap[i,j]*u[1]
125+
126+
elif p == 3: #right/east
127+
#print(self.f[i,j,:])
128+
self.rhoMap[i,j] = 1/(1+u[0])*(self.f[i,j,0]+self.f[i,j,2]+self.f[i,j,4]+2*(self.f[i,j,1]+self.f[i,j,5]+self.f[i,j,8]))
129+
self.f[i,j,3] = self.f[i,j,1]-2/3*self.rhoMap[i,j]*u[0]
130+
self.f[i,j,7] = self.f[i,j,5]+1/2*(self.f[i,j,2]-self.f[i,j,4])-1/6*self.rhoMap[i,j]*u[0]-1/2*self.rhoMap[i,j]*u[1]
131+
self.f[i,j,6] = self.f[i,j,8]-1/2*(self.f[i,j,2]-self.f[i,j,4])-1/6*self.rhoMap[i,j]*u[0]+1/2*self.rhoMap[i,j]*u[1]
132+
#print(self.rhoMap[i,j])
133+
elif p == 4: #top/north
134+
self.rhoMap[i,j] = 1/(1+u[1])*(self.f[i,j,0]+self.f[i,j,1]+self.f[i,j,3]+2*(self.f[i,j,2]+self.f[i,j,5]+self.f[i,j,6]))
135+
self.f[i,j,4] = self.f[i,j,2]-2/3*self.rhoMap[i,j]*u[1]
136+
self.f[i,j,7] = self.f[i,j,5]+1/2*(self.f[i,j,1]-self.f[i,j,3])-1/2*self.rhoMap[i,j]*u[0]-1/6*self.rhoMap[i,j]*u[1]
137+
self.f[i,j,8] = self.f[i,j,6]-1/2*(self.f[i,j,1]-self.f[i,j,3])+1/2*self.rhoMap[i,j]*u[0]-1/6*self.rhoMap[i,j]*u[1]
138+
# self.rhoMap[i,j] = self.f[i,j].sum()
139+
# print(self.rhoMap[i,j])
140+
141+
142+
def givenRhoFindU(self,i,j,rho,BCmethod): #need modidfication
117143
#find U
118144
#arrow = findArrow(i,j)
119-
if BCmethod == 'BB':
145+
if BCmethod == 'ZH':
120146
for p in numpy.arange(1,5):
121147
if self.dynamics[(i+self.cx[p])%self.dynamics.shape[0],(j+self.cy[p])%self.dynamics.shape[1]] == 1:
122-
self.UMap[i,j] = 1.5*self.UMap[i+self.cx[p],j+self.cy[p]]-0.5*self.UMap[i+2*self.cx[p],j+2*self.cy[p]]
148+
# self.UMap[i,j] = 1.5*self.UMap[i+self.cx[p],j+self.cy[p]]-0.5*self.UMap[i+2*self.cx[p],j+2*self.cy[p]]
149+
if p == 1:
150+
self.UMap[i,j,0] = 1 - (self.f[i,j,0]+self.f[i,j,2]+self.f[i,j,4]+2*(self.f[i,j,3]+self.f[i,j,6]+self.f[i,j,7]))/rho
151+
self.UMap[i,j,1] = 0
152+
self.f[i,j,1] = self.f[i,j,3]+2/3*rho*self.UMap[i,j,0]
153+
self.f[i,j,5] = self.f[i,j,7]-1/2*(self.f[i,j,2]-self.f[i,j,4])+1/6*rho*self.UMap[i,j,0]
154+
self.f[i,j,8] = self.f[i,j,6]+1/2*(self.f[i,j,2]-self.f[i,j,4])+1/6*rho*self.UMap[i,j,0]
155+
elif p == 2:
156+
self.UMap[i,j,0] = 0
157+
self.UMap[i,j,1] = 1 - (self.f[i,j,0]+self.f[i,j,1]+self.f[i,j,3]+2*(self.f[i,j,4]+self.f[i,j,7]+self.f[i,j,8]))/rho
158+
self.f[i,j,2] = self.f[i,j,4]+2/3*rho*self.UMap[i,j,1]
159+
self.f[i,j,5] = self.f[i,j,7]-1/2*(self.f[i,j,1]-self.f[i,j,3])+1/6*rho*self.UMap[i,j,1]
160+
self.f[i,j,6] = self.f[i,j,8]+1/2*(self.f[i,j,1]-self.f[i,j,3])+1/6*rho*self.UMap[i,j,1]
161+
elif p == 3:
162+
#print('good')
163+
self.UMap[i,j,0] = -1 + (self.f[i,j,0]+self.f[i,j,2]+self.f[i,j,4]+2*(self.f[i,j,1]+self.f[i,j,5]+self.f[i,j,8]))/rho
164+
self.UMap[i,j,1] = 0
165+
self.f[i,j,3] = self.f[i,j,1]-2/3*rho*self.UMap[i,j,0]
166+
self.f[i,j,7] = self.f[i,j,5]+1/2*(self.f[i,j,2]-self.f[i,j,4])-1/6*rho*self.UMap[i,j,0]
167+
self.f[i,j,6] = self.f[i,j,8]-1/2*(self.f[i,j,2]-self.f[i,j,4])-1/6*rho*self.UMap[i,j,0]
168+
elif p == 4:
169+
self.UMap[i,j,0] = 0
170+
self.UMap[i,j,1] = -1 + (self.f[i,j,0]+self.f[i,j,1]+self.f[i,j,3]+2*(self.f[i,j,2]+self.f[i,j,5]+self.f[i,j,6]))/rho
171+
self.f[i,j,4] = self.f[i,j,2]-2/3*rho*self.UMap[i,j,1]
172+
self.f[i,j,7] = self.f[i,j,5]+1/2*(self.f[i,j,1]-self.f[i,j,3])-1/6*rho*self.UMap[i,j,1]
173+
self.f[i,j,8] = self.f[i,j,6]-1/2*(self.f[i,j,1]-self.f[i,j,3])-1/6*rho*self.UMap[i,j,1]
174+
175+
def openBC(self,SuperGeometry,materialNum):
176+
for coord in self.materialCoordsDic[materialNum]:
177+
for p in numpy.arange(1,5):
178+
if self.dynamics[(coord[0]+self.cx[p])%self.dynamics.shape[0],(coord[1]+self.cy[p])%self.dynamics.shape[1]] == 1:
179+
if p == 1:
180+
#print(2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],1] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],1])
181+
self.f[coord[0],coord[1],1] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],1] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],1]
182+
self.f[coord[0],coord[1],5] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],5] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],5]
183+
self.f[coord[0],coord[1],8] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],8] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],8]
184+
elif p == 2:
185+
self.f[coord[0],coord[1],2] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],2] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],2]
186+
self.f[coord[0],coord[1],5] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],5] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],5]
187+
self.f[coord[0],coord[1],6] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],6] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],6]
188+
elif p == 3:
189+
self.f[coord[0],coord[1],3] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],3] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],3]
190+
self.f[coord[0],coord[1],7] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],7] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],7]
191+
self.f[coord[0],coord[1],6] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],6] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],6]
192+
elif p == 4:
193+
self.f[coord[0],coord[1],4] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],4] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],4]
194+
self.f[coord[0],coord[1],7] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],7] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],7]
195+
self.f[coord[0],coord[1],8] = 2 * self.f[coord[0]+self.cx[p],coord[1]+self.cy[p],8] - self.f[coord[0]+2*self.cx[p],coord[1]+2*self.cy[p],8]
196+
197+
123198

124199
def findArrow(self,i,j):
125200
arrow = numpy.zeros(8)
@@ -142,23 +217,26 @@ def collide(self):
142217
if self.initialization == 0:
143218
self.initialize_()
144219

145-
self.BGKcollide()
146-
147-
148-
149-
220+
self.updateRhoU() #13
221+
self.BGKcollide() #25
150222

151223
def BGKcollide(self):
224+
152225
self.t1 = self.UMap[:,:,0]*self.UMap[:,:,0] + self.UMap[:,:,1]*self.UMap[:,:,1]
153226
if not hasattr(self,'t2'):
154227
self.t2 = numpy.zeros(self.f.shape)
155-
for k in numpy.arange(9):
156-
self.t2[:,:,k] = self.UMap[:,:,0]*self.cx[k]+self.UMap[:,:,1]*self.cy[k]
157-
self.feq[:,:,k] = self.rhoMap*self.distribution[k]*(1+3*self.t2[:,:,k]+4.5*self.t2[:,:,k]*self.t2[:,:,k]-1.5*self.t1)
158228

229+
self.t2 = self.UMap[:,:,0]*numpy.swapaxes([[self.cx]],0,2)+self.UMap[:,:,1]*numpy.swapaxes([[self.cy]],0,2)
230+
self.feq = self.rhoMap*numpy.swapaxes([[self.distribution]],0,2)*(1+3*self.t2+4.5*self.t2*self.t2-1.5*self.t1)
231+
self.feq = numpy.swapaxes(numpy.swapaxes(self.feq,0,1),1,2)
232+
233+
# for k in numpy.arange(9):
234+
# self.t2[:,:,k] = self.UMap[:,:,0]*self.cx[k]+self.UMap[:,:,1]*self.cy[k]
235+
# self.feq[:,:,k] = self.rhoMap*self.distribution[k]*(1+3*self.t2[:,:,k]+4.5*self.t2[:,:,k]*self.t2[:,:,k]-1.5*self.t1)
159236
self.f = self.f + self.omega_9*(self.feq - self.f)
160237

161238

239+
162240
def stream(self):
163241
#bounceback 2 # 75% computation time
164242
# for i in numpy.arange(self.dynamics.shape[0]):
@@ -168,6 +246,8 @@ def stream(self):
168246
# #if self.surrundingDynamics[i,j,k] in [1,3,4]: #half way bounceback: modify f on near bulk fluids
169247
# self.f[i,j,k] = self.f[(i+self.cx[k])%self.f.shape[0],(j+self.cy[k])%self.f.shape[1],self.opposite[k]]
170248

249+
250+
171251
#pre-stream for bounceBack
172252
self.tmp_f = self.f.copy()
173253
for k in numpy.arange(1,9):
@@ -179,7 +259,9 @@ def stream(self):
179259
self.f[:,:,k] = numpy.roll(numpy.roll(self.f[:,:,k],self.cx[k],0),self.cy[k],1)
180260

181261
#calculate rhoMap given f after stream
182-
self.updateRhoU()
262+
263+
264+
183265

184266
def updateRhoU(self):
185267
self.rhoMap = self.f.sum(2)
@@ -235,12 +317,11 @@ def getDynamicsCoords(self,dynamicsIndex):
235317
return numpy.int_(dynamicsCoords)
236318

237319

238-
239320
if __name__ == "__main__":
240321
#parameters
241322
numpy.set_printoptions(3)
242-
nx = 11
243-
ny = 5
323+
nx = 30
324+
ny = 10
244325
center_x = 3
245326
center_y = 3
246327
radius = 2
@@ -281,41 +362,52 @@ def getDynamicsCoords(self,dynamicsIndex):
281362

282363
sLattice.defineDynamics(superG,1,bulk1)# SuperGeometry, materialNum, dynamics
283364
sLattice.defineDynamics(superG,2,bulk1)
284-
sLattice.defineDynamics(superG,3,BBvelocity(omega))
285-
sLattice.defineDynamics(superG,4,BBpressure(omega))
365+
sLattice.defineDynamics(superG,4,BBvelocity(omega))
366+
#sLattice.defineDynamics(superG,4,BBpressure(omega))
367+
sLattice.defineDynamics(superG,3,BBpressure(omega))
286368
sLattice.defineDynamics(superG,5,BBwall())
287369

288-
289-
290370
#print(sLattice.dynamics)
291371
#print(sLattice.omega)
292372
#print(sLattice.dynamics)
293373

294374
#print(sLattice.getUyMap())
375+
376+
377+
378+
outputDirectory = 'data'
379+
if not os.path.exists(outputDirectory):
380+
os.makedirs(outputDirectory)
381+
382+
295383
print('initial average rho: {}'.format(sLattice.getAverageRho()))
296-
maxVelocity = numpy.array([-0.1,0])
384+
maxVelocity = numpy.array([0.1,0])
297385
#poV = Poiseuille2D(superG,3,maxVelocity,0.5).getVelocityField() #SuperGeometry,materialNum,maxVelocity,distance2Wall
298-
poV = numpy.array([-0.1,0])
299-
sLattice.defineU_BC(superG,3,poV)
300-
sLattice.defineRho_BC(superG,4,1)
386+
poV = numpy.array(maxVelocity)
301387

388+
sLattice.defineU_BC(superG,4,poV)
389+
sLattice.defineRho_BC(superG,3,1)
390+
#sLattice.openBC(superG,4)
302391
#print('initial Ux:\n{}\n==============================='.format(sLattice.getUxMap()))
303-
304-
print(sLattice.getUxMap())
305392
numpy.set_printoptions(3)
306393

307-
print(sLattice.initialization)
308-
for i in numpy.arange(1000):
309-
if i%100 == 0:
310-
print('{}/1000'.format(i))
394+
395+
print(sLattice.getUxMap())
396+
print(sLattice.rhoMap)
397+
for iT in numpy.arange(1000 ):
398+
# if iT%1000 == 0:
399+
# print('{}/1000'.format(iT))
400+
# print(sLattice.getUxMap())
311401

312402
sLattice.collide()
313403
sLattice.stream()
314-
sLattice.defineU_BC(superG,3,poV)
315-
sLattice.defineRho_BC(superG,4,1)
316-
317-
318-
404+
sLattice.defineU_BC(superG,4,poV)
405+
sLattice.defineRho_BC(superG,3,1)
406+
#sLattice.defineRho_BC(superG,3,1)
407+
#sLattice.openBC(superG,4)
408+
# if iT%500==0:
409+
# numpy.savetxt('{}/VelocityProfile_{}'.format(outputDirectory,iT),sLattice.getUxMap())
410+
# print('{}/10000'.format(iT))
319411

320412
#print(sLattice.getUxMap())
321413
#print(sLattice.getAverageRho())
@@ -325,13 +417,15 @@ def getDynamicsCoords(self,dynamicsIndex):
325417
#print(sLattice.surrundingDynamics[:,:,1])
326418

327419
#print(sLattice.f[:,:,1])
328-
print('final Ux:\n{}\n==============================='.format(sLattice.getUxMap()))
420+
print('===============================final Ux:\n{}\n'.format(sLattice.getUxMap()))
421+
print('===============================final Uy:\n{}\n'.format(sLattice.getUyMap()))
329422
#print(sLattice.getUyMap())
330423
#print(sLattice.getRhoMap())
331424
#print(sLattice.getRhoMap().sum())
332425
print('final average rho: {}'.format(sLattice.getAverageRho()))
333426
print(sLattice.getRhoMap())
334427

335428
#print(sLattice.dynamics)
336-
print(sLattice.f.shape)
337-
#numpy.savetxt('tmp_file_Ux.txt',sLattice.getUxMap())
429+
#numpy.savetxt('tmp_file_Ux.txt',sLattice.getUxMap())
430+
#print(sLattice.dynamics)
431+
Binary file not shown.
Binary file not shown.
Binary file not shown.

test_numpy.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import numpy
2-
import time
32

4-
x = [1,2,3,4,5,6,7]
5-
y = x.copy()
6-
y = 1
7-
x[2] = 0
83

9-
print(y)
4+
x = numpy.array([[1,2,3,4,5,6,7],[7,6,5,4,3,2,1]])
5+
6+
print(x[0,2:6])

0 commit comments

Comments
 (0)