diff --git a/parallel.py b/parallel.py index 5b565bc..a80ff39 100644 --- a/parallel.py +++ b/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.'''