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.exchange_ghost_cells(key_out)
|
||||||
self.impose_boundary_conditions(key_out)
|
self.impose_boundary_conditions(key_out)
|
||||||
|
|
||||||
def init_symmetry(self,key,mirror=(True,True)):
|
def init_symmetry(self,key):
|
||||||
'''Sets the symmetries for ghost cells behind the wall'''
|
'''Sets mirror symmetries for ghost cells behind the wall. Use
|
||||||
# Example: wall in y
|
impose_symmetries_noslip() afterwards to set appropriate
|
||||||
# No-slip boundary (no mirror) free-slip boundary (mirror)
|
no-slip boundary conditions.'''
|
||||||
# u -> -u u -> u
|
|
||||||
# v -> -v v -> -v
|
|
||||||
# w -> -w w -> w
|
|
||||||
# p -> p p -> p
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
self.symmetries[key] = np.zeros((3,3,3),dtype='i')
|
self.symmetries[key] = np.zeros((3,3,3),dtype='i')
|
||||||
if not self.xperiodic:
|
for axis in range(3):
|
||||||
if key=='u':
|
self.impose_mirror_symmetry(key,axis,-1)
|
||||||
self.symmetries[key][0,1,1] = -1
|
self.impose_mirror_symmetry(key,axis,+1)
|
||||||
self.symmetries[key][2,1,1] = -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:
|
else:
|
||||||
self.symmetries[key][0,1,1] = 1 if mirror[0] else -1
|
self.symmetries[key][sl] = -1
|
||||||
self.symmetries[key][2,1,1] = 1 if mirror[1] else -1
|
return
|
||||||
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
|
|
||||||
|
|
||||||
def copy(self,key,key_out,skip_data=False,skip_symmetries=False):
|
def copy(self,key,key_out,skip_data=False,skip_symmetries=False):
|
||||||
'''Copies a field to a new key.'''
|
'''Copies a field to a new key.'''
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue