implemented proper no-slip symmetries
This commit is contained in:
parent
e147024374
commit
1e2488a9bf
76
parallel.py
76
parallel.py
|
|
@ -490,37 +490,57 @@ class PPP:
|
|||
self.exchange_ghost_cells(key_out)
|
||||
self.impose_boundary_conditions(key_out)
|
||||
|
||||
def init_symmetry(self,key,mirror=(True,True)):
|
||||
'''Sets the symmetries for ghost cells behind the wall'''
|
||||
# Example: wall in y
|
||||
# No-slip boundary (no mirror) free-slip boundary (mirror)
|
||||
# u -> -u u -> u
|
||||
# v -> -v v -> -v
|
||||
# w -> -w w -> w
|
||||
# p -> p p -> p
|
||||
def init_symmetry(self,key):
|
||||
'''Sets mirror symmetries for ghost cells behind the wall. Use
|
||||
impose_symmetries_noslip() afterwards to set appropriate
|
||||
no-slip boundary conditions.'''
|
||||
import numpy as np
|
||||
self.symmetries[key] = np.zeros((3,3,3),dtype='i')
|
||||
if not self.xperiodic:
|
||||
if key=='u':
|
||||
self.symmetries[key][0,1,1] = -1
|
||||
self.symmetries[key][2,1,1] = -1
|
||||
for axis in range(3):
|
||||
self.impose_mirror_symmetry(key,axis,-1)
|
||||
self.impose_mirror_symmetry(key,axis,+1)
|
||||
return
|
||||
|
||||
def impose_mirror_symmetry(self,key,axis,wall):
|
||||
'''Applies symmetry: [u,v,w](x,-y,z) -> [u,-v,w](x,y,z)
|
||||
Proposed by Lozano-Duran JFM 2016 and used for free-slip.'''
|
||||
if self.periodicity[axis]:
|
||||
return
|
||||
if wall in (-1,'low'): iwall = 0
|
||||
elif wall in (1,'high'): iwall = 2
|
||||
else: raise ValueError('Invalid value for "wall". Valid values are -1 / "low" or 1 / "high".')
|
||||
keyu = ('u','v','w')
|
||||
# Get position in symmetries array to be edited
|
||||
sl = [1,1,1]
|
||||
sl[axis] = iwall
|
||||
sl = tuple(sl)
|
||||
if key==keyu[axis]:
|
||||
self.symmetries[key][sl] = -1
|
||||
else:
|
||||
self.symmetries[key][sl] = 1
|
||||
return
|
||||
|
||||
def set_noslip_bc(self,axis,wall):
|
||||
'''Applies symmetry: [u,v,w](x,-y,z) -> [-u,v,-w](x,y,z)
|
||||
The boundary conditions are only applied to fields which have already been loaded!'''
|
||||
if self.periodicity[axis]:
|
||||
return
|
||||
if wall in (-1,'low'): iwall = 0
|
||||
elif wall in (1,'high'): iwall = 2
|
||||
else: raise ValueError('Invalid value for "wall". Valid values are -1 / "low" or 1 / "high".')
|
||||
keyu = ('u','v','w')
|
||||
for key in keyu:
|
||||
if not key in self.symmetries:
|
||||
continue
|
||||
# Get position in symmetries array to be edited
|
||||
sl = [1,1,1]
|
||||
sl[axis] = iwall
|
||||
sl = tuple(sl)
|
||||
if key==keyu[axis]:
|
||||
self.symmetries[key][sl] = 1
|
||||
else:
|
||||
self.symmetries[key][0,1,1] = 1 if mirror[0] else -1
|
||||
self.symmetries[key][2,1,1] = 1 if mirror[1] else -1
|
||||
if not self.yperiodic:
|
||||
if key=='v':
|
||||
self.symmetries[key][1,0,1] = -1
|
||||
self.symmetries[key][1,2,1] = -1
|
||||
else:
|
||||
self.symmetries[key][1,0,1] = 1 if mirror[0] else -1
|
||||
self.symmetries[key][1,2,1] = 1 if mirror[1] else -1
|
||||
if not self.zperiodic:
|
||||
if key=='w':
|
||||
self.symmetries[key][1,1,0] = -1
|
||||
self.symmetries[key][1,1,2] = -1
|
||||
else:
|
||||
self.symmetries[key][1,1,0] = 1 if mirror[0] else -1
|
||||
self.symmetries[key][1,1,2] = 1 if mirror[1] else -1
|
||||
self.symmetries[key][sl] = -1
|
||||
return
|
||||
|
||||
def copy(self,key,key_out,skip_data=False,skip_symmetries=False):
|
||||
'''Copies a field to a new key.'''
|
||||
|
|
|
|||
Loading…
Reference in New Issue