Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.11 KB | None | 0 0
  1. import math
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. from tokamak.formats import geqdsk
  5.  
  6.  
  7. def generate_ellipse(k, h, r, a, b):
  8.     ellipse = []
  9.     step = math.pi / 1000
  10.     for t in np.arange(0.0, 2 * math.pi, step):
  11.         x = h + a * r * math.cos(t)
  12.         y = k + b * r * math.sin(t)
  13.         ellipse.append((x, y))
  14.     return ellipse
  15.  
  16.  
  17. def get_middle(p1, p2):
  18.     return (p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2
  19.  
  20.  
  21. def find_base_points(curve):
  22.     angles = []
  23.     N = len(curve)
  24.     min_points_dst1 = N // 10
  25.     min_points_dst2 = N // 10
  26.  
  27.     for i, p in enumerate(curve):
  28.         # three continuous points
  29.         point_1 = curve[i - 1]
  30.         point_2 = curve[i]
  31.         point_3 = curve[(i + 1) % N]
  32.         # 2 vectors to find angle
  33.         vec_1 = (point_1[0] - point_2[0], point_1[1] - point_2[1])
  34.         vec_2 = (point_1[0] - point_3[0], point_1[1] - point_3[1])
  35.         # find an angle
  36.  
  37.         if math.sqrt(vec_1[0] ** 2 + vec_1[1] ** 2) * math.sqrt(vec_2[0] ** 2 + vec_2[1] ** 2) == 0.0:
  38.             a = math.acos(1.0)
  39.         else:
  40.             a = math.acos((vec_1[0] * vec_2[0] + vec_1[1] * vec_2[1]) / (
  41.                     math.sqrt(vec_1[0] ** 2 + vec_1[1] ** 2) * math.sqrt(vec_2[0] ** 2 + vec_2[1] ** 2)))
  42.         angles.append((a, i))  # save angle and point index
  43.     angles.sort(key=lambda a: a[0])
  44.  
  45.     ind_min = [angles[0][1]]
  46.     # Find minimum, which is far from first minimum point
  47.     for i in range(1, len(angles)):
  48.         ind = angles[i][1]
  49.         dist = N // 2 - abs(abs(ind - ind_min[0]) - N // 2) + 1
  50.         if dist >= min_points_dst2:
  51.             ind_min.append(ind)
  52.             break
  53.  
  54.     ind_max = [angles[-1][1]]
  55.     # Find maximum, which is far from first maximum point
  56.     for i in range(len(angles) - 1, 0, -1):  # The more is ind, the more is angle
  57.         ind = angles[i][1]
  58.         dist = N // 2 - abs(abs(ind - ind_max[0]) - N // 2) + 1
  59.         if dist >= min_points_dst1:
  60.             ind_max.append(ind)
  61.             break
  62.     indices = ind_min + ind_max
  63.     return indices
  64.  
  65.  
  66. def deep_cut(curve, indices, depth):
  67.     n = len(curve)
  68.     for _ in range(depth):
  69.         indices.sort()
  70.         new_indices = []
  71.         for i in range(len(indices)):
  72.             # Add points between existing ones
  73.             new_ind = ((indices[i - 1] + indices[i] + (0 if indices[i - 1] < indices[i] else n)) // 2) % len(curve)
  74.             new_indices.append(new_ind)
  75.         indices += new_indices
  76.     indices.sort()
  77.     points = [(curve[i][0], curve[i][1]) for i in indices]
  78.     return points
  79.  
  80.  
  81. def tokamak_split(x, y, center):
  82.     depth_level = 0
  83.  
  84.     # Delete similar point to first one
  85.     curve = []
  86.     for i in range(len(x)):
  87.         c = (x[i], y[i])
  88.         curve.append(c)
  89.  
  90.     # del curve[-1]
  91.  
  92.     indices = find_base_points(curve)
  93.     points = deep_cut(curve, indices, depth_level)
  94.     # Define lines
  95.     # Configure line containing 2 points for each line
  96.     X = []
  97.     Y = []
  98.     for pnt in points:
  99.         X.append(pnt[0])
  100.         X.append(center[0])
  101.         Y.append(pnt[1])
  102.         Y.append(center[1])
  103.     # Define figure 2
  104.     new_curve_x = []
  105.     new_curve_y = []
  106.     for pnt in points:
  107.         mid_pnt = get_middle(pnt, center)
  108.         new_curve_x.append(mid_pnt[0])
  109.         new_curve_y.append(mid_pnt[1])
  110.     # Duplicate first point to make closed figure
  111.     new_curve_x += [new_curve_x[0]]
  112.     new_curve_y += [new_curve_y[0]]
  113.  
  114.     return [X, Y], [new_curve_x, new_curve_y]
  115.  
  116.  
  117. data = geqdsk.read("g035685.00146")
  118.  
  119. r, z = data["rbdry"], data["zbdry"]
  120.  
  121. center_x, center_y = data["bcentr"], data["zmid"]
  122.  
  123. x_0 = center_x
  124. y_0 = center_y  # center
  125.  
  126. center = (x_0, y_0)
  127. lines, new_curve = tokamak_split(r, z, center)
  128.  
  129. # paint 4 lines
  130. fig, ax = plt.subplots()
  131. ax.set_xlim(-0.0, 0.75)
  132. ax.set_ylim(-0.5, 0.5)
  133. ax.grid()
  134. ax.set_aspect(1.0)
  135.  
  136. ax.set(xlabel='r', ylabel='z',
  137.        title='tokamak')
  138. # x = []
  139. # y = []
  140.  
  141.  
  142. plt.plot(r, z, 'r')
  143. plt.plot(center[0], center[1], 'bo')
  144. plt.plot(lines[0], lines[1], 'g')
  145. plt.plot(new_curve[0], new_curve[1], 'b-')
  146.  
  147. # plt.plot(r, z, 'b-')
  148.  
  149. plt.savefig("four")
  150. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement