implemented proper no-slip symmetries

This commit is contained in:
Michael Krayer 2021-07-30 22:17:41 +02:00
parent e147024374
commit 1e2488a9bf
1 changed files with 48 additions and 28 deletions

View File

@ -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.'''