diff --git a/lbmpy/sparse/mapping.py b/lbmpy/sparse/mapping.py index a43aba664a6efddd813577c24664cb7b1c095a45..21e775bb5377ec5cffa0de518004aaf9dbf99753 100644 --- a/lbmpy/sparse/mapping.py +++ b/lbmpy/sparse/mapping.py @@ -189,19 +189,22 @@ class SparseLbPeriodicityMapper: else: return self.mapping._sorter[left] - def create_index_arr(self): + def create_index_arr(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): + if all(d_i == 0 for d_i in direction): # direction (0,0) irrelevant continue - #print("direction:", direction, ", ", direction_idx) - for pos in range(0,2): + 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 + # 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] @@ -212,17 +215,21 @@ class SparseLbPeriodicityMapper: 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]: - result.append(tuple(index_array)) + #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("write:", write, "read:", cur_read) + 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]) + #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 + + # 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] @@ -233,10 +240,11 @@ class SparseLbPeriodicityMapper: 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) + print("write:", write, "read:", read) inner.append([direction_idx, write, read]) - if direction[pos] == 0: - # inner + 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) @@ -246,18 +254,25 @@ class SparseLbPeriodicityMapper: 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) + print("write:", write, "read:", read) inner.append([direction_idx, write, read]) - result = list(dict.fromkeys(result)) - list_result = [] + # 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 i_a in list_result: - print(i_a) + + for index_array in list_result: + print(index_array) return list_result diff --git a/lbmpy_tests/test_sparse_lbm.ipynb b/lbmpy_tests/test_sparse_lbm.ipynb index cbbbbda9bb1542917565fd5677d376560f5abeed..d7d903ef853e1cecc40f066994e715ac46d280e0 100644 --- a/lbmpy_tests/test_sparse_lbm.ipynb +++ b/lbmpy_tests/test_sparse_lbm.ipynb @@ -216,12 +216,12 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "mapping = SparseLbMapper(method.stencil, flag_arr, flags['fluid'], flags[noslip], 0, 0) #Warum müssen (dürfen!) hier Nullen stehen?\n", - "#index_arr = mapping.create_index_array(ghost_layers)\n", + "#index_arr = mapping.create_index_array(ghost_layers) # funktioniert nicht solange am Rand fluid Zellen sind!\n", "#print(index_arr)\n", "\n", "# Arrays\n", @@ -274,7 +274,147 @@ "output_type": "stream", "text": [ "domain_size: (4, 3)\n", - "[((1, 12, 14), (1, 15, 17), (1, 18, 20), (1, 21, 23)), ((2, 26, 24), (2, 29, 27), (2, 32, 30), (2, 35, 33)), ((3, 45, 36), (3, 46, 37), (3, 47, 38)), ((4, 48, 57), (4, 49, 58), (4, 50, 59)), ((5, 69, 62),), ((5, 70, 60), (5, 71, 61)), ((5, 60, 65), (5, 63, 68), (5, 66, 71)), ((5, 69, 62),), ((6, 72, 83),), ((6, 73, 81), (6, 74, 82)), ((6, 72, 83),), ((6, 75, 74), (6, 78, 77), (6, 81, 80)), ((7, 93, 85), (7, 94, 86)), ((7, 95, 84),), ((7, 86, 87), (7, 89, 90), (7, 92, 93)), ((7, 95, 84),), ((8, 96, 106), (8, 97, 107)), ((8, 98, 105),), ((8, 98, 105),), ((8, 101, 96), (8, 104, 99), (8, 107, 102))]\n", + "\n", + " New direction: (0, 1) , 1\n", + "(inner)\n", + "write: [1, 2] read: [1, 1]\n", + "write: [2, 2] read: [2, 1]\n", + "(periodic)\n", + "write: [0, 0] read: [0, 2]\n", + "write: [1, 0] read: [1, 2]\n", + "write: [2, 0] read: [2, 2]\n", + "write: [3, 0] read: [3, 2]\n", + "(inner)\n", + "write: [0, 2] read: [0, 1]\n", + "write: [0, 1] read: [0, 0]\n", + "write: [3, 2] read: [3, 1]\n", + "write: [3, 1] read: [3, 0]\n", + "\n", + " New direction: (0, -1) , 2\n", + "(inner)\n", + "write: [1, 0] read: [1, 1]\n", + "write: [2, 0] read: [2, 1]\n", + "(periodic)\n", + "write: [0, 2] read: [0, 0]\n", + "write: [1, 2] read: [1, 0]\n", + "write: [2, 2] read: [2, 0]\n", + "write: [3, 2] read: [3, 0]\n", + "(inner)\n", + "write: [0, 0] read: [0, 1]\n", + "write: [0, 1] read: [0, 2]\n", + "write: [3, 0] read: [3, 1]\n", + "write: [3, 1] read: [3, 2]\n", + "\n", + " New direction: (-1, 0) , 3\n", + "(periodic)\n", + "write: [3, 0] read: [0, 0]\n", + "write: [3, 1] read: [0, 1]\n", + "write: [3, 2] read: [0, 2]\n", + "(inner)\n", + "write: [0, 0] read: [1, 0]\n", + "write: [1, 0] read: [2, 0]\n", + "write: [2, 0] read: [3, 0]\n", + "write: [0, 2] read: [1, 2]\n", + "write: [1, 2] read: [2, 2]\n", + "write: [2, 2] read: [3, 2]\n", + "(inner)\n", + "write: [0, 1] read: [1, 1]\n", + "\n", + " New direction: (1, 0) , 4\n", + "(periodic)\n", + "write: [0, 0] read: [3, 0]\n", + "write: [0, 1] read: [3, 1]\n", + "write: [0, 2] read: [3, 2]\n", + "(inner)\n", + "write: [3, 0] read: [2, 0]\n", + "write: [2, 0] read: [1, 0]\n", + "write: [1, 0] read: [0, 0]\n", + "write: [3, 2] read: [2, 2]\n", + "write: [2, 2] read: [1, 2]\n", + "write: [1, 2] read: [0, 2]\n", + "(inner)\n", + "write: [3, 1] read: [2, 1]\n", + "\n", + " New direction: (-1, 1) , 5\n", + "(periodic)\n", + "write: [3, 0] read: [0, 2]\n", + "--cut--\n", + "write: [3, 1] read: [0, 0]\n", + "write: [3, 2] read: [0, 1]\n", + "(inner)\n", + "write: [0, 2] read: [1, 1]\n", + "write: [1, 2] read: [2, 1]\n", + "write: [2, 2] read: [3, 1]\n", + "(periodic)\n", + "write: [0, 0] read: [1, 2]\n", + "write: [1, 0] read: [2, 2]\n", + "write: [2, 0] read: [3, 2]\n", + "--cut--\n", + "write: [3, 0] read: [0, 2]\n", + "(inner)\n", + "write: [0, 2] read: [1, 1]\n", + "write: [0, 1] read: [1, 0]\n", + "\n", + " New direction: (1, 1) , 6\n", + "(periodic)\n", + "write: [0, 0] read: [3, 2]\n", + "--cut--\n", + "write: [0, 1] read: [3, 0]\n", + "write: [0, 2] read: [3, 1]\n", + "(inner)\n", + "write: [3, 2] read: [2, 1]\n", + "write: [2, 2] read: [1, 1]\n", + "write: [1, 2] read: [0, 1]\n", + "(periodic)\n", + "write: [0, 0] read: [3, 2]\n", + "--cut--\n", + "write: [1, 0] read: [0, 2]\n", + "write: [2, 0] read: [1, 2]\n", + "write: [3, 0] read: [2, 2]\n", + "(inner)\n", + "write: [3, 2] read: [2, 1]\n", + "write: [3, 1] read: [2, 0]\n", + "\n", + " New direction: (-1, -1) , 7\n", + "(periodic)\n", + "write: [3, 0] read: [0, 1]\n", + "write: [3, 1] read: [0, 2]\n", + "--cut--\n", + "write: [3, 2] read: [0, 0]\n", + "(inner)\n", + "write: [0, 0] read: [1, 1]\n", + "write: [1, 0] read: [2, 1]\n", + "write: [2, 0] read: [3, 1]\n", + "(periodic)\n", + "write: [0, 2] read: [1, 0]\n", + "write: [1, 2] read: [2, 0]\n", + "write: [2, 2] read: [3, 0]\n", + "--cut--\n", + "write: [3, 2] read: [0, 0]\n", + "(inner)\n", + "write: [0, 0] read: [1, 1]\n", + "write: [0, 1] read: [1, 2]\n", + "\n", + " New direction: (1, -1) , 8\n", + "(periodic)\n", + "write: [0, 0] read: [3, 1]\n", + "write: [0, 1] read: [3, 2]\n", + "--cut--\n", + "write: [0, 2] read: [3, 0]\n", + "(inner)\n", + "write: [3, 0] read: [2, 1]\n", + "write: [2, 0] read: [1, 1]\n", + "write: [1, 0] read: [0, 1]\n", + "(periodic)\n", + "write: [0, 2] read: [3, 0]\n", + "--cut--\n", + "write: [1, 2] read: [0, 0]\n", + "write: [2, 2] read: [1, 0]\n", + "write: [3, 2] read: [2, 0]\n", + "(inner)\n", + "write: [3, 0] read: [2, 1]\n", + "write: [3, 1] read: [2, 2]\n", + "[((1, 12, 14), (1, 15, 17), (1, 18, 20), (1, 21, 23)), ((2, 26, 24), (2, 29, 27), (2, 32, 30), (2, 35, 33)), ((3, 45, 36), (3, 46, 37), (3, 47, 38)), ((4, 48, 57), (4, 49, 58), (4, 50, 59)), ((5, 69, 62),), ((5, 70, 60), (5, 71, 61)), ((5, 60, 65), (5, 63, 68), (5, 66, 71)), ((6, 72, 83),), ((6, 73, 81), (6, 74, 82)), ((6, 75, 74), (6, 78, 77), (6, 81, 80)), ((7, 93, 85), (7, 94, 86)), ((7, 95, 84),), ((7, 86, 87), (7, 89, 90), (7, 92, 93)), ((8, 96, 106), (8, 97, 107)), ((8, 98, 105),), ((8, 101, 96), (8, 104, 99), (8, 107, 102))]\n", "[[1, 12, 14], [1, 15, 17], [1, 18, 20], [1, 21, 23]]\n", "[[2, 26, 24], [2, 29, 27], [2, 32, 30], [2, 35, 33]]\n", "[[3, 45, 36], [3, 46, 37], [3, 47, 38]]\n", @@ -290,7 +430,8 @@ "[[7, 86, 87], [7, 89, 90], [7, 92, 93]]\n", "[[8, 96, 106], [8, 97, 107]]\n", "[[8, 98, 105]]\n", - "[[8, 101, 96], [8, 104, 99], [8, 107, 102]]\n" + "[[8, 101, 96], [8, 104, 99], [8, 107, 102]]\n", + "[[1, [1, 2], [1, 1]], [1, [2, 2], [2, 1]], [1, [0, 2], [0, 1]], [1, [0, 1], [0, 0]], [1, [3, 2], [3, 1]], [1, [3, 1], [3, 0]], [2, [1, 0], [1, 1]], [2, [2, 0], [2, 1]], [2, [0, 0], [0, 1]], [2, [0, 1], [0, 2]], [2, [3, 0], [3, 1]], [2, [3, 1], [3, 2]], [3, [0, 0], [1, 0]], [3, [1, 0], [2, 0]], [3, [2, 0], [3, 0]], [3, [0, 2], [1, 2]], [3, [1, 2], [2, 2]], [3, [2, 2], [3, 2]], [3, [0, 1], [1, 1]], [4, [3, 0], [2, 0]], [4, [2, 0], [1, 0]], [4, [1, 0], [0, 0]], [4, [3, 2], [2, 2]], [4, [2, 2], [1, 2]], [4, [1, 2], [0, 2]], [4, [3, 1], [2, 1]], [5, [0, 2], [1, 1]], [5, [1, 2], [2, 1]], [5, [2, 2], [3, 1]], [5, [0, 2], [1, 1]], [5, [0, 1], [1, 0]], [6, [3, 2], [2, 1]], [6, [2, 2], [1, 1]], [6, [1, 2], [0, 1]], [6, [3, 2], [2, 1]], [6, [3, 1], [2, 0]], [7, [0, 0], [1, 1]], [7, [1, 0], [2, 1]], [7, [2, 0], [3, 1]], [7, [0, 0], [1, 1]], [7, [0, 1], [1, 2]], [8, [3, 0], [2, 1]], [8, [2, 0], [1, 1]], [8, [1, 0], [0, 1]], [8, [3, 0], [2, 1]], [8, [3, 1], [2, 2]]]\n" ] }, { @@ -311,7 +452,53 @@ " [[7, 86, 87], [7, 89, 90], [7, 92, 93]],\n", " [[8, 96, 106], [8, 97, 107]],\n", " [[8, 98, 105]],\n", - " [[8, 101, 96], [8, 104, 99], [8, 107, 102]]]" + " [[8, 101, 96], [8, 104, 99], [8, 107, 102]],\n", + " [[1, [1, 2], [1, 1]],\n", + " [1, [2, 2], [2, 1]],\n", + " [1, [0, 2], [0, 1]],\n", + " [1, [0, 1], [0, 0]],\n", + " [1, [3, 2], [3, 1]],\n", + " [1, [3, 1], [3, 0]],\n", + " [2, [1, 0], [1, 1]],\n", + " [2, [2, 0], [2, 1]],\n", + " [2, [0, 0], [0, 1]],\n", + " [2, [0, 1], [0, 2]],\n", + " [2, [3, 0], [3, 1]],\n", + " [2, [3, 1], [3, 2]],\n", + " [3, [0, 0], [1, 0]],\n", + " [3, [1, 0], [2, 0]],\n", + " [3, [2, 0], [3, 0]],\n", + " [3, [0, 2], [1, 2]],\n", + " [3, [1, 2], [2, 2]],\n", + " [3, [2, 2], [3, 2]],\n", + " [3, [0, 1], [1, 1]],\n", + " [4, [3, 0], [2, 0]],\n", + " [4, [2, 0], [1, 0]],\n", + " [4, [1, 0], [0, 0]],\n", + " [4, [3, 2], [2, 2]],\n", + " [4, [2, 2], [1, 2]],\n", + " [4, [1, 2], [0, 2]],\n", + " [4, [3, 1], [2, 1]],\n", + " [5, [0, 2], [1, 1]],\n", + " [5, [1, 2], [2, 1]],\n", + " [5, [2, 2], [3, 1]],\n", + " [5, [0, 2], [1, 1]],\n", + " [5, [0, 1], [1, 0]],\n", + " [6, [3, 2], [2, 1]],\n", + " [6, [2, 2], [1, 1]],\n", + " [6, [1, 2], [0, 1]],\n", + " [6, [3, 2], [2, 1]],\n", + " [6, [3, 1], [2, 0]],\n", + " [7, [0, 0], [1, 1]],\n", + " [7, [1, 0], [2, 1]],\n", + " [7, [2, 0], [3, 1]],\n", + " [7, [0, 0], [1, 1]],\n", + " [7, [0, 1], [1, 2]],\n", + " [8, [3, 0], [2, 1]],\n", + " [8, [2, 0], [1, 1]],\n", + " [8, [1, 0], [0, 1]],\n", + " [8, [3, 0], [2, 1]],\n", + " [8, [3, 1], [2, 2]]]]" ] }, "execution_count": 10,