def function_2_ellipse(x): f = 0 f = np.sin(np.pi * x[0] * x[1]) f = f * weightfunction.ellipse(radius1, radius2, x) return f
def function_1_ellipse(x): f = 0 f = np.sin(8 * x[0]) + np.sin(7 * x[1]) f = f * weightfunction.ellipse(radius1, radius2, x) return f
punkte = data['punkte'] dim = data['dim'] degree = data['degree'] level_x = data['level_x'] level_y = data['level_y'] # Pruefe ob Level hoch genug if level_x and level_y < np.log2(degree+1): print('Error: Level zu niedrig. Es muss Level >= log2(degree+1) sein ') quit() # Gitter fuer Kreis erzeugen und auswerten x0 = np.linspace(0, 1, 50) X = np.meshgrid(x0, x0) Z = weightfunction.ellipse(radius1,radius2, X) h_x = data['h_x'] h_y = data['h_y'] # Definiere Knotenfolge # Not a Knot xi = data['xi'] yi = data['yi'] # Index von Bspline auf Knotenfolge index_Bspline_x = data['index_Bspline_x'] index_Bspline_y = data['index_Bspline_y'] index_all_Bsplines = data['index_all_Bsplines']
def NNsearch(sort, j, q): xblock = np.arange(I_all[int(sort[q, 1]), 0], I_all[int(sort[q, 1]), 0] + (degree + 1) * h_x, h_x) yblock = np.arange(I_all[int(sort[q, 1]), 1], I_all[int(sort[q, 1]), 1] + (degree + 1) * h_y, h_y) block = np.meshgrid(xblock, yblock) eval_block = np.zeros(((degree + 1)**2, 1)) s = 0 for i in range(degree + 1): for t in range(degree + 1): eval_block[s] = weightfunction.ellipse( radius1, radius2, [block[0][t, i], block[1][t, i]]) s = s + 1 if np.all(eval_block > 0) == True: s = 0 for i in range(degree + 1): for t in range(degree + 1): NN[j, s] = [block[0][t, i], block[1][t, i]] s = s + 1 else: xblock = np.arange(I_all[int(sort[q, 1]), 0], I_all[int(sort[q, 1]), 0] + (degree + 1) * h_x, h_x) yblock = np.arange(I_all[int(sort[q, 1]), 1], I_all[int(sort[q, 1]), 1] - (degree + 1) * h_y, -h_y) block = np.meshgrid(xblock, yblock) s = 0 for i in range(degree + 1): for t in range(degree + 1): eval_block[s] = weightfunction.ellipse( radius1, radius2, [block[0][t, i], block[1][t, i]]) s = s + 1 if np.all(eval_block > 0) == True: s = 0 for i in range(degree + 1): for t in range(degree + 1): NN[j, s] = [block[0][t, i], block[1][t, i]] s = s + 1 else: xblock = np.arange(I_all[int(sort[q, 1]), 0], I_all[int(sort[q, 1]), 0] - (degree + 1) * h_x, -h_x) yblock = np.arange(I_all[int(sort[q, 1]), 1], I_all[int(sort[q, 1]), 1] - (degree + 1) * h_y, -h_y) block = np.meshgrid(xblock, yblock) s = 0 for i in range(degree + 1): for t in range(degree + 1): eval_block[s] = weightfunction.ellipse( radius1, radius2, [block[0][t, i], block[1][t, i]]) s = s + 1 if np.all(eval_block > 0) == True: s = 0 for i in range(degree + 1): for t in range(degree + 1): NN[j, s] = [block[0][t, i], block[1][t, i]] s = s + 1 else: xblock = np.arange( I_all[int(sort[q, 1]), 0], I_all[int(sort[q, 1]), 0] - (degree + 1) * h_x, -h_x) yblock = np.arange( I_all[int(sort[q, 1]), 1], I_all[int(sort[q, 1]), 1] + (degree + 1) * h_y, h_y) block = np.meshgrid(xblock, yblock) s = 0 for i in range(degree + 1): for t in range(degree + 1): eval_block[s] = weightfunction.ellipse( radius1, radius2, [block[0][t, i], block[1][t, i]]) s = s + 1 if np.all(eval_block > 0) == True: s = 0 for i in range(degree + 1): for t in range(degree + 1): NN[j, s] = [block[0][t, i], block[1][t, i]] s = s + 1 elif q == len(I_all) - 1: print( 'Fehler: kein (n+1)x(n+1) Block im Gebiet gefunden. Erhoehe Level.' ) quit() else: NNsearch(sort, j, q + 1) return NN
dim = 2 # Dimension radius1 = 0.45 # Radius von Kreis radius2 = 0.1 degree = 5 # Grad von B-Splines (nur ungerade) level_x = 4 # Level in x Richtung level_y = 4 # Level in y Richtung # Pruefe ob Level hoch genug if level_x and level_y < np.log2(degree + 1): print('Error: Level zu niedrig. Es muss Level >= log2(degree+1) sein ') quit() # Gitter fuer Kreis erzeugen und auswerten x0 = np.linspace(0, 1, 100) X = np.meshgrid(x0, x0) Z = weightfunction.ellipse(radius1, radius2, X) # Plot von Ellipse plt.contour(X[0], X[1], Z, 0) plt.axis('equal') #plt.show() # Gitterweite h_x = 2**(-level_x) h_y = 2**(-level_y) # Definiere Knotenfolge # Uniform # xi = np.arange(-(degree+1)/2, 1/h_x+(degree+1)/2+1, 1)*h_x # yi = np.arange(-(degree+1)/2, 1/h_y+(degree+1)/2+1, 1)*h_y
dim = data['dim'] degree = data['degree'] level_x = data['level_x'] level_y = data['level_y'] # Pruefe ob Level hoch genug if level_x and level_y < np.log2(degree + 1): print( 'Error: Level zu niedrig. Es muss Level >= log2(degree+1) sein ' ) quit() # Gitter fuer Kreis erzeugen und auswerten x0 = np.linspace(0, 1, 50) X = np.meshgrid(x0, x0) Z = weightfunction.ellipse(radius1, radius2, X) h_x = data['h_x'] h_y = data['h_y'] # Definiere Knotenfolge # Not a Knot xi = data['xi'] yi = data['yi'] # Index von Bspline auf Knotenfolge index_Bspline_x = data['index_Bspline_x'] index_Bspline_y = data['index_Bspline_y'] index_all_Bsplines = data['index_all_Bsplines'] # Index (x,y) der Bsplines mit Knotenmittelpunkt im inneren des Gebiets