Skip to content
Snippets Groups Projects
Commit 554548fc authored by Maja Warlich's avatar Maja Warlich
Browse files

Default Mapping skipps border fluid cells.

parent bc8dfedf
Branches
No related merge requests found
......@@ -16,4 +16,5 @@ _local_tmp
doc/bibtex.json
/db
/lbmpy/phasefield/simplex_projection.*.so
/lbmpy/phasefield/simplex_projection.c
\ No newline at end of file
/lbmpy/phasefield/simplex_projection.c
*.swp
......@@ -132,13 +132,14 @@ class SparseLbMapper:
print("flag:", self.flag_array)
fucking_counter = 0
for direction_idx, direction in enumerate(stencil):
print("dir:", direction_idx)
if all(d_i == 0 for d_i in direction):
assert direction_idx == 0
continue
for own_cell_idx, cell in enumerate(self.fluid_coordinates):
if (cell[0] == 0 or cell[0] == self.domain_size[0]-1 or cell[1] == 0 or cell[1] == self.domain_size[1]-1):
fucking_counter += 1
continue #ignore fluid cells at the border ...
fucking_counter += 1 #count skipped border cells for reshape function later
continue #ignore fluid cells at the border ...
domain_size = (len(self.flag_array), len(self.flag_array[0]))
test = []
inv_neighbor_cell = np.array([cell_i - dir_i for cell_i, dir_i in zip(cell, direction)])
......@@ -171,8 +172,9 @@ class SparseLbMapper:
#print(test)
index_array = np.array(result, dtype=np.uint32)
index_arr = index_array.reshape([len(stencil) - 1, self.num_fluid_cells-fucking_counter])
index_arr = index_arr.swapaxes(0, 1)
print("number of fluid:", self.num_fluid_cells, "counter:", fucking_counter//8)
index_arr = index_array.reshape([len(stencil) - 1, self.num_fluid_cells-fucking_counter//8])
index_arr = index_arr.swapaxes(0, 1)
return index_arr
......@@ -206,11 +208,11 @@ class SparseLbPeriodicityMapper:
stencil = self.method.stencil
print("domain_size:", self.domain_size)
result = []
inner = []
inner_idx_array = []
write = [0,0]
fluid_boundary_mask = self.fluid_flag | self.ubb_flag | self.density_flag
for direction_idx, direction in enumerate(stencil):
if all(d_i == 0 for d_i in direction) or direction_idx < 5:#(direction_idx != 5 and direction_idx != 1) or direction_idx < 5: # direction (0,0) irrelevant
if all(d_i == 0 for d_i in direction):#(direction_idx != 5 and direction_idx != 1) or direction_idx < 5: # direction (0,0) irrelevant
continue
print("\n New direction:", direction, ", ", direction_idx)
for pos in range(0,2): # einmal für x, einmal für y Richtung ...
......@@ -219,7 +221,7 @@ class SparseLbPeriodicityMapper:
if direction[pos] != 0:
# periodic/parallel: wird an anderen Block geschickt/periodisch gewrappt
print("(periodic:)")
index_array = []
periodic_idx_array = []
coord = int((self.domain_size[pos]-1)*(1-direction[pos])/2)
print("first")
start = 1 if direction[sop] == 1 else 0
......@@ -231,15 +233,16 @@ class SparseLbPeriodicityMapper:
if not (self.flag_arr[tuple(write)] & self.fluid_flag):
continue
read = [(write_i - dir_i)%ds_i for write_i, dir_i, ds_i in zip(write, direction, self.domain_size)]
if self.flag_arr[tuple(read)] & self.no_slip_flag:
print("Read cell is a no_slip. Hmpf.")
write_idx = pdf_index(self.cell_idx(tuple(write)), direction_idx, len(self.mapping))
read_idx = pdf_index(self.cell_idx(tuple(read)), direction_idx, len(self.mapping))
if self.flag_arr[tuple(read)] & self.no_slip_flag: # Read cell is no-slip: flip PDF!
#read from write cell, inverse direction
read_idx = pdf_index(write_idx, inverse_idx(stencil, direction_idx), len(self.mapping))
periodic_idx_array.append([direction_idx, write_idx, read_idx])
# "Die Zelle "write" bekommt ihren neuen Wert der jeweiligen direction von der Zelle "read"
print("write:", write, "read:", read)
#write_idx = self.cell_idx(tuple(write))
#read_idx = self.cell_idx(tuple(read))
#index_array.append((direction_idx, pdf_index(write_idx, direction_idx, len(self.mapping)), pdf_index(read_idx, direction_idx, len(self.mapping))))
index_array.append([direction_idx, write, read]) #nur zu debug Zwecken
result.append(tuple(index_array))
#periodic_idx_array.append([direction_idx, write, read]) #nur zu debug Zwecken
result.append(tuple(periodic_idx_array))
# inner: wird zwischen benachbarten Zellen *im gleichen Block* geschickt
print("(inner:)")
pos_bound = int((self.domain_size[pos]-1)*(1+direction[pos])/2)
......@@ -255,10 +258,14 @@ class SparseLbPeriodicityMapper:
if not (self.flag_arr[tuple(write)] & self.fluid_flag):
continue
read = [write_i - dir_i for write_i, dir_i in zip(write, direction)]
if self.flag_arr[tuple(read)] & self.no_slip_flag:
print("Read cell is a no_slip. Hmpf.")
write_idx = pdf_index(self.cell_idx(tuple(write)), direction_idx, len(self.mapping))
read_idx = pdf_index(self.cell_idx(tuple(read)), direction_idx, len(self.mapping))
if self.flag_arr[tuple(read)] & self.no_slip_flag: # Read cell is no-slip: flip PDF!
#read from write cell, inverse direction
read_idx = pdf_index(write_idx, inverse_idx(stencil, direction_idx), len(self.mapping))
inner_idx_array.append([direction_idx, write_idx, read_idx])
print("write:", write, "read:", read)
inner.append([direction_idx, write, read])
#inner_idx_array.append([direction_idx, write, read]) #for debug
if direction[pos] == 0: #spricht directions 1, 2, 3 und 4 an
# inner: wird zwischen benachbarte Zellen *im gleichen Block* geschickt
print("(inner:)")
......@@ -274,21 +281,29 @@ class SparseLbPeriodicityMapper:
if not (self.flag_arr[tuple(write)] & self.fluid_flag):
continue
read = [write_i - dir_i for write_i, dir_i in zip(write, direction)]
if self.flag_arr[tuple(read)] & self.no_slip_flag:
print("Read cell is a no_slip. Hmpf.")
write_idx = pdf_index(self.cell_idx(tuple(write)), direction_idx, len(self.mapping))
read_idx = pdf_index(self.cell_idx(tuple(read)), direction_idx, len(self.mapping))
if self.flag_arr[tuple(read)] & self.no_slip_flag: # Read cell is no-slip: flip PDF!
#read from write cell, inverse direction
read_idx = pdf_index(write_idx, inverse_idx(stencil, direction_idx), len(self.mapping))
inner_idx_array.append([direction_idx, write_idx, read_idx])
print("write:", write, "read:", read)
inner.append([direction_idx, write, read])
write = [int((self.domain_size[0]-1)*(1-direction[0])/2),int((self.domain_size[1]-1)*(1-direction[1])/2)]
if not (self.flag_arr[tuple(write)] & self.fluid_flag):
continue
read = [(write_i - dir_i)%ds_i for write_i, dir_i, ds_i in zip(write, direction, self.domain_size)]
#write_idx = self.cell_idx(tuple(write))
#read_idx = self.cell_idx(tuple(read))
#index_array.append((direction_idx, pdf_index(write_idx, direction_idx, len(self.mapping)), pdf_index(read_idx, direction_idx, len(self.mapping))))
index_array = []
index_array.append([direction_idx, write, read]) #nur zu debug Zwecken
result.append(tuple(index_array))
print("(Ecke) write:", write, "read:", read)
#inner_idx_array.append([direction_idx, write, read]) #for debug
#Four corners: extra periodic_idx_array for each direction 5, 6, 7, 8
if (direction[0]*direction[1] != 0):
write = [int((self.domain_size[0]-1)*(1-direction[0])/2),int((self.domain_size[1]-1)*(1-direction[1])/2)]
if not (self.flag_arr[tuple(write)] & self.fluid_flag):
continue
read = [(write_i - dir_i)%ds_i for write_i, dir_i, ds_i in zip(write, direction, self.domain_size)]
write_idx = pdf_index(self.cell_idx(tuple(write)), direction_idx, len(self.mapping))
read_idx = pdf_index(self.cell_idx(tuple(read)), direction_idx, len(self.mapping))
if self.flag_arr[tuple(read)] & self.no_slip_flag: # Read cell is no-slip: flip PDF!
#read from write cell, inverse direction
read_idx = pdf_index(write_idx, inverse_idx(stencil, direction_idx), len(self.mapping))
periodic_idx_array.append([direction_idx, write_idx, read_idx])
#periodic_idx_array.append([direction_idx, write, read]) #nur zu debug Zwecken
result.append(tuple(periodic_idx_array))
print("(Ecke) write:", write, "read:", read)
# result enthält *mehrere* index arrays
#result = list(dict.fromkeys(result)) # entferne doppelte index_arrays: speziell Ecken der Domain
......@@ -303,101 +318,12 @@ class SparseLbPeriodicityMapper:
list_result.append(list_index_array)
# zu den periodischen/parralel-orientierten index_arrays kommt noch der index array für die Werte, die nur innerhalb des Blocks verschickt werden:
list_result.append(inner)
print("start")
list_result.append(inner_idx_array)
for index_array in list_result:
print(index_array)
print("end")
return list_result
def create_index_arr_old(self): # erstellt index arrays für ALLE fluid Zellen, die sich am Rand der domain befinden.
# ein index array für alle Werte, die innerhalb des Blocks verschickt werden
# jeweils ein index array für Werte, die zu jeweils verschiedenen benachbarten Blocks geschickt werden (wenn verschiedene Kerne verschiedene Blöcke innerhalb einer Domain bearbeiten)
stencil = self.method.stencil
print("domain_size:", self.domain_size)
result = []
inner = []
for direction_idx, direction in enumerate(stencil):
if all(d_i == 0 for d_i in direction): # direction (0,0) irrelevant
continue
print("\n New direction:", direction, ", ", direction_idx)
for pos in range(0,2): # einmal für x, einmal für y Richtung ...
sop = (pos+1)%2
if direction[pos] != 0:
# periodic/parallel: wird an anderen Block geschickt/periodisch gewrappt
print("(periodic:)")
index_array = []
coord = int((self.domain_size[pos]-1)*(1-direction[pos])/2)
prev_read = [0,0]
for i in range(0, self.domain_size[sop]):
write = [0,0]
cur_read = [0,0]
write[pos] = coord
write[sop] = i
cur_read = [(write_i - dir_i)%ds_i for write_i, dir_i, ds_i in zip(write, direction, self.domain_size)]
if cur_read[pos] < prev_read[pos] or cur_read[sop] < prev_read[sop]:
#index_array wird abgetrennt und neu begonnen, da hier Kommunikation mit einem anderen Block als vorher geschieht
result.append(tuple(index_array))
index_array = []
print("--cut--")
print("write:", write, "read:", cur_read) # "Die Zelle "write" bekommt ihren neuen Wert der jeweiligen direction von der Zelle "read"
write_idx = self.cell_idx(tuple(write))
read_idx = self.cell_idx(tuple(cur_read))
index_array.append((direction_idx, pdf_index(write_idx, direction_idx, len(self.mapping)), pdf_index(read_idx, direction_idx, len(self.mapping))))
#index_array.append([direction_idx, write, cur_read]) #nur zu debug Zwecken
prev_read[pos] = cur_read[pos]
prev_read[sop] = cur_read[sop]
result.append(tuple(index_array))
# inner: wird zwischen benachbarten Zellen *im gleichen Block* geschickt
print("(inner:)")
pos_bound = int((self.domain_size[pos]-1)*(1+direction[pos])/2)
pos_mid = pos_bound+direction[pos]*(-self.domain_size[pos]+1)
sop_position = [int((self.domain_size[sop]-1)*(1+direction[sop])/2)] if direction[sop] != 0 else [0, self.domain_size[sop]-1]
#print("pos_bound:", pos_bound, "pos_mid", pos_mid, "sop_position:", sop_position)
for b in sop_position:
for i in range(pos_bound, pos_mid, -direction[pos]):
write = [0,0]
write[pos] = i
write[sop] = b
read = [write_i - dir_i for write_i, dir_i in zip(write, direction)]
print("write:", write, "read:", read)
inner.append([direction_idx, write, read])
if direction[pos] == 0: #spricht directions 1, 2, 3 und 4 an
# inner: wird zwischen benachbarte Zellen *im gleichen Block* geschickt
print("(inner:)")
pos_low = 1
pos_high = self.domain_size[pos]-1
sop_position = int((self.domain_size[sop]-1)*(1+direction[sop])/2)
#print("pos_low:", pos_low, "pos_high:", pos_high, "sop_position:", sop_position)
for i in range(pos_low, pos_high):
write = [0,0]
write[pos] = i
write[sop] = sop_position
read = [write_i - dir_i for write_i, dir_i in zip(write, direction)]
print("write:", write, "read:", read)
inner.append([direction_idx, write, read])
# result enthält *mehrere* index arrays
result = list(dict.fromkeys(result)) # entferne doppelte index_arrays: speziell Ecken der Domain
# result ist eine liste von tuples von tuples --> [((...), (...)), ((...), (...), (...))]
print(result)
# wandel result in list_result (liste von liste von listen) um: -->[[[...], [...]], [[...], [...], [...]]]
list_result = []
for index_array in result:
list_index_array = []
for write_read_pair in index_array:
list_index_array.append(list(write_read_pair))
list_result.append(list_index_array)
# zu den periodischen/parralel-orientierten index_arrays kommt noch der index array für die Werte, die nur innerhalb des Blocks verschickt werden:
list_result.append(inner)
for index_array in list_result:
print(index_array)
return list_result
class SparseLbBoundaryMapper:
NEIGHBOR_IDX_NAME = 'nidx{}'
DIR_SYMBOL = TypedSymbol("dir", np.int64)
......
This diff is collapsed.
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment