def min_func(x): global count count += 1 print("\niteration: " + str(count)) _glider2d = deepcopy(glider2d) glider_set_controlpoint(_glider2d, x) glider3d = _glider2d.get_glider_3d() panels = paraBEM_Panels( glider3d, midribs=0, profile_numpoints=40, symmetric=True, distribution=Distribution.from_nose_cos_distribution(40, 0.2), num_average=0) case = Case(panels[1], panels[2]) case.farfield = 5 case.drag_calc = "trefftz" case.A_ref = 23 case.create_wake(length=10000, count=5) case.v_inf = paraBEM.Vector3(8, 0, 1) case.trefftz_cut_pos = case.v_inf * 50 alpha = v_inf_deg_range3(case.v_inf, 5, 9, 20) polars = case.polars(alpha) vtk_writer = CaseToVTK(case, "results/vtk_opt", suffix=str(count)) vtk_writer.write_panels(data_type="point") cL = [] cD = [] for i in polars.values: cL.append(i.cL) cD.append(i.cD) return np.interp(0.6, cL, cD)
def data(self, _file, data, name="data", _type="SCALARS", data_type="CELL_DATA"): if not self._data_set: _file.write(data_type + " " + str(len(data)) + "\n") self._data_set = True if _type is "SCALARS": _file.write("SCALARS " + name + " float\n") _file.write("LOOKUP_TABLE default") for j, value in enumerate(data): if j % 5 == 0: _file.write("\n") _file.write(str(value) + " ") _file.write("\n\n") if _type is "VECTORS": _file.write("VECTORS " + name + " float\n") _file.write("\n") for point in data: v = paraBEM.Vector3(point) _file.write( str(v[0]) + " " + str(v[1]) + " " + str(v[2]) + "\n") _file.write("\n\n")
def Vector(array, *args): if args: return Vector([array] + list(args)) if len(array) == 2: return paraBEM.Vector2(*array) elif len(array) == 3: return paraBEM.Vector3(*array) else: raise AttributeError( "array has too many values, 2d and 3d is supported")
import paraBEM from paraBEM import pan3d from paraBEM.mesh import mesh_object mesh = mesh_object.from_OBJ("../mesh/wing_lift.obj") case = pan3d.DirichletDoublet0Case3(mesh.panels, mesh.trailing_edges) case.v_inf = paraBEM.Vector3(10, 0, 0) case.create_wake(length=100, count=2) case.run()
def infl_near(point): out = 0 target = paraBEM.Vector3(*point) for i, pan in enumerate(panels): out += mue[i] * doublet_3_0_sphere(target, pan) return out
def infl_far(point): return mue_mid * doublet_3_0_n0(paraBEM.Vector3(*point), mid_pan)
import numpy as np import paraBEM from paraBEM import pan3d v1 = paraBEM.PanelVector3(-0.5, -0.5, 0) v2 = paraBEM.PanelVector3(0.5, -0.5, 0) v3 = paraBEM.PanelVector3(0.5, 0.5, 0) v4 = paraBEM.PanelVector3(-0.5, 0.5, 0) p = paraBEM.Panel3([v1, v2, v3, v4]) v5 = paraBEM.Vector3(0.5, 0, 0.5) v6 = paraBEM.Vector3(0.4999, 0, 0) v7 = paraBEM.Vector3(0.5, 0.0, 0) v8 = paraBEM.Vector3(0.5001, 0, 0) checklist = [v1, v2, v3, v4, v5, v6, v7, v8, p.center] for v in checklist: dip, src = pan3d.doublet_src_3_0_vsaero(v, p) print(v, ": doublet:", dip, "source:", src)
n_x = 30 with open("glider/referenz_schirm_berg.json") as _file: glider_2d = load(_file)["data"] glider_2d.shape.set_const_cell_dist() glider = glider_2d.get_glider_3d() _, panels, trailing_edge = paraBEM_Panels( glider, midribs=3, profile_numpoints=n_x, distribution=Distribution.from_cos_2_distribution(n_x), num_average=0, symmetric=False) v_inf = [8, 0, 1] case = Case(panels, trailing_edge) case.mom_ref_point = paraBEM.Vector3(1.25, 0, 0) case.A_ref = glider_2d.shape.area case.farfield = 5 case.drag_calc = "on_body" case.v_inf = paraBEM.Vector3(v_inf) case.create_wake(length=10000, count=4) # length, count polars = case.polars(v_inf_deg_range3(case.v_inf, -5, 15, 50)) vtk_writer = CaseToVTK(case, "results/vtk_glider_case") vtk_writer.write_panels(data_type="cell") # vtk_writer.write_wake_panels() vtk_writer.write_body_stream(panels, 100)
import paraBEM from paraBEM.pan3d import DirichletDoublet0Source0Case3 as Case from paraBEM.vtk_export import CaseToVTK with open("../openglider/glider/referenz_schirm_berg.json") as _file: glider = load(_file)["data"] panels = paraBEM_Panels(glider.get_glider_3d() , 0, 30, 0, False) case = Case(panels[1], panels[2]) case.v_inf = paraBEM.Vector(glider.v_inf) case.drag_calc = "on_body" case.A_ref = glider.shape.area #wake parallel to the x axis print("* wake parallel to the x-axis") case.create_wake(50, 100, paraBEM.Vector3(1., 0., 0.)) case.run() writer = CaseToVTK(case, "results/wake/x-parallel") writer.write_panels() writer.write_wake_panels() print("F_l = ", case.cL * case.A_ref * 1.2 * 11**2 / 2., "F_w = ", case.cD * case.A_ref * 1.2 * 11**2 / 2.) #wake parallel to v_inf print("* wake parallel to v_inf") case.create_wake(50, 100, case.v_inf) case.run() writer = CaseToVTK(case, "results/wake/v_inf-parallel") writer.write_panels() writer.write_wake_panels()
for xi in x: target1 = paraBEM.PanelVector3(xi, 0., 0.0) target2 = paraBEM.PanelVector3(xi, 0, 0.5) target3 = paraBEM.PanelVector3(xi, 0, 1.0) val1 = doublet(target1, source) val2 = doublet(target2, source) val3 = doublet(target3, source) y.append([val1, val2, val3]) fig = plt.figure() ax1 = fig.add_subplot(131) ax1.plot(x, y) y = [] for xi in x: target1 = paraBEM.Vector3(0, xi, 0.0) target2 = paraBEM.Vector3(0, xi, 0.5) target3 = paraBEM.Vector3(0, xi, 1.0) val1 = doublet(target1, source) val2 = doublet(target2, source) val3 = doublet(target3, source) y.append([val1, val2, val3]) ax2 = fig.add_subplot(132) ax2.plot(x, y) y = [] for xi in x: target1 = paraBEM.Vector3(0., 0, xi) target2 = paraBEM.Vector3(0.5, 0, xi) target3 = paraBEM.Vector3(1.0, 0, xi)
import numpy as np import matplotlib matplotlib.use('Agg') from matplotlib import pyplot as plt import paraBEM from paraBEM import pan3d from paraBEM.mesh import mesh_object from paraBEM.vtk_export import CaseToVTK from paraBEM.utils import check_path, v_inf_deg_range3 mesh = mesh_object.from_OBJ("../mesh/wing_lift.obj") alpha_0 = np.deg2rad(5) v_inf = paraBEM.Vector3(np.cos(alpha_0), 0, np.sin(alpha_0)) v_inf_range = v_inf_deg_range3(v_inf, -5, 10, 20) fz = [] cmy = [] xcp = [] cL = [] cD = [] case = pan3d.DirichletDoublet0Source0Case3(mesh.panels, mesh.trailing_edges) case.farfield = 5 case.create_wake(10, 30) case.v_inf = v_inf case.create_wake(length=10000, count=4) # length, count polars = case.polars(v_inf_range) p = []
import numpy import paraBEM from paraBEM.pan3d import vortex_3_0_v from paraBEM.vtk_export import VtkWriter from paraBEM.utils import check_path v1 = paraBEM.Vector3(-1, 0, 0) v2 = paraBEM.Vector3(1, 0, 0) n = 80 a = numpy.linspace(-10, 10, n).tolist() b = [paraBEM.Vector3(i, j, k) for i in a for j in a for k in a] vel = [vortex_3_0_v(v1, v2, i) for i in b] writer = VtkWriter() with open(check_path("results/vortex_field.vtk"), "w") as _file: writer.structed_grid(_file, "vortex", [n, n, n]) writer.points(_file, b) writer.data(_file, vel, name="velocity", _type="VECTORS", data_type="POINT_DATA")
from paraBEM.utils import check_path # WingGeometry spw = 2 numpos = 50 z_fac_1 = -0.3 z_fac_2 = -0.7 y = np.sin(np.linspace(0, np.pi/2, numpos)) * spw/2 x = [0. for _ in y] z = [i**2 * z_fac_1 + i**6 * z_fac_2 for i in y] mirror = lambda xyz: [xyz[0], -xyz[1], xyz[2]] wing = list(zip(x, y, z)) wing = list(map(mirror, wing))[::-1] + list(wing)[1:] wing = [paraBEM.Vector3(*i) for i in wing] # LiftingLine lifting_line = LiftingLine(wing) lifting_line.v_inf = paraBEM.Vector3(1, 0, 0) lifting_line.solve_for_best_gamma(1) gamma = [i.best_gamma for i in lifting_line.segments] gamma_max = max(gamma) # Plot gamma_el = lambda y: gamma_max * (1 - (y / spw * 2)**2)**(1 / 2) mids = [[i.mids.x, i.mids.y, i.mids.z] for i in lifting_line.segments] x, y, z = zip(*mids) fig = plt.figure() ax1 = fig.add_subplot(3, 1, 1)
def points(self, _file, vertices): _file.write("POINTS " + str(len(vertices)) + " float\n") for point in vertices: v = paraBEM.Vector3(point) _file.write(str(v[0]) + " " + str(v[1]) + " " + str(v[2]) + "\n")
with open("results/glider/optimized.json") as _file: glider2d = load(_file)["data"] area = glider2d.shape.area aspect_ratio = glider2d.shape.aspect_ratio glider3d = glider2d.get_glider_3d() verts, panels, trailing_edge = paraBEM_Panels( glider3d, midribs=0, profile_numpoints=20, symmetric=False, distribution=Distribution.from_cos_2_distribution, num_average=0) case = DirichletDoublet0Source0Case3(panels, trailing_edge) case.v_inf = paraBEM.Vector3(*glider2d.v_inf) case.create_wake(1000, 100) case.trefftz_cut_pos = case.v_inf * 20 case.run() gamma_pan = -np.array([edge.vorticity for edge in case.trailing_edge]) ######################LiftingLine############################ te_line = [paraBEM.Vector3(0, i.y, i.z) for i in trailing_edge] lifting_line = LiftingLine(te_line) lifting_line.v_inf = case.v_inf lifting_line.solve_for_best_gamma(1) gamma = [line.best_gamma for line in lifting_line.segments] gamma_max = max(gamma) gamma_pan *= gamma_max / max(gamma_pan) line_segment_length = np.array([0] +
import paraBEM from paraBEM import pan3d v1 = paraBEM.PanelVector3(-0.5, -0.5, 0) v2 = paraBEM.PanelVector3(0.5, -0.5, 0) v3 = paraBEM.PanelVector3(0.5, 0.5, 0) v4 = paraBEM.PanelVector3(-0.5, 0.5, 0) v5 = paraBEM.PanelVector3(0.5, 1.5, 1) v6 = paraBEM.PanelVector3(-0.5, 1.5, 1) p1 = paraBEM.Panel3([v1, v2, v3, v4]) p2 = paraBEM.Panel3([v4, v3, v5, v6]) v_inf = paraBEM.Vector3(0, 1, 0) c = pan3d.DirichletDoublet0Case3([p1, p2], [v1, v2, v3]) c.run()
mat2 = fem.MembraneMaterial(10000, 0.4) mat2.rho = 0.01 mat2.d_structural = 0.000 mat2.d_velocity = 30 nodes = [fem.Node(point[0], point[1], 0) for point in mesh_points] elements = [fem.Membrane3([nodes[index] for index in tri], mat2) for tri in triangles] nodes.append(fem.Node(0.27, -2, 0)) print("number of elements: ", len(elements)) # 5: boundary conditions lines = [] for i, node in enumerate(nodes): if i in fixed: n = fem.Node(*(node.position + paraBEM.Vector3(0, -0.1, 0))) n.fixed = paraBEM.Vector3(0, 0, 0) line = fem.Truss([nodes[i], n], mat1) lines.append(line) node.fixed = paraBEM.Vector3(1, 1, 0) for i in boundary[:-1]: force = pressure[i] / 2 * panels[i].n nodes[i].add_external_force(paraBEM.Vector3(force.x, force.y, 0)) nodes[i + 1].add_external_force(paraBEM.Vector3(force.x, force.y, 0)) # 6: case case = fem.Case(elements + lines) writer = fem.vtkWriter("/tmp/paraFEM/profil_test") writer.writeCase(case, 0.0)
def v_inf_deg_range3(v_inf, alpha0, alpha1, num=10): phi = np.linspace(np.deg2rad(alpha0), np.deg2rad(alpha1), num) return [abs(v_inf) * paraBEM.Vector3(np.cos(p), 0, np.sin(p)) for p in phi]
from paraBEM.pan3d import src_3_0_vsaero from paraBEM.utils import check_path pnt1 = paraBEM.PanelVector3(-1, -1, 0) pnt2 = paraBEM.PanelVector3(1, -1, 0) pnt3 = paraBEM.PanelVector3(1, 1, 0) pnt4 = paraBEM.PanelVector3(-1, 1, 0) source = paraBEM.Panel3([pnt1, pnt2, pnt3, pnt4]) fig = plt.figure() x = np.arange(-4, 4, 0.01) y = [] for xi in x: target1 = paraBEM.Vector3(xi, 0, 0.0) target2 = paraBEM.Vector3(xi, 0, 0.5) target3 = paraBEM.Vector3(xi, 0, 1) val1 = src_3_0_vsaero(target1, source) val2 = src_3_0_vsaero(target2, source) val3 = src_3_0_vsaero(target3, source) y.append([val1, val2, val3]) ax1 = fig.add_subplot(131) ax1.plot(x, y) y = [] for xi in x: target1 = paraBEM.Vector3(0, xi, 0.0) target2 = paraBEM.Vector3(0, xi, 0.5) target3 = paraBEM.Vector3(0, xi, 1) val1 = src_3_0_vsaero(target1, source)
n_x = 50 n_y = 10 a = Airfoil.joukowsky(-0.01+1j) a.numpoints = n_x print(a.coordinates) ribs = [rib3d(a, y) for y in np.linspace(-5, 5, n_y)] panels = [] for i in range(n_y)[:-1]: for j in range(n_x): panels.append(paraBEM.Panel3([ribs[i][j], ribs[i + 1][j], ribs[i + 1][j + 1], ribs[i][j + 1]])) te = [rib[0] for rib in ribs] print(te) case = Case(panels, te) case.farfield = 5 case.v_inf = paraBEM.Vector3(1, 0, 0.0) case.create_wake(length=10000, count=3) # length, count case.run() for i in range(n_y): plt.plot(*zip(*[[pan.center.x, pan.cp] for pan in case.panels[i * n_x : (i+1) * n_x]]), marker="x") # plt.show() plt.plot(*zip(*a.coordinates)) # plt.show() vtk_writer = CaseToVTK(case, "results/joukowsky3_d") vtk_writer.write_panels(data_type="point")
import paraBEM from paraBEM.pan3d import doublet_3_0_vsaero_v, vortex_3_0_v v1 = paraBEM.PanelVector3(-0.5, -0.5, 0) v2 = paraBEM.PanelVector3(0.5, -0.5, 0) v3 = paraBEM.PanelVector3(0.5, 0.5, 0) v4 = paraBEM.PanelVector3(-0.5, 0.5, 0) source = paraBEM.Panel3([v1, v2, v3, v4]) targets = [paraBEM.Vector3([0, 0, 0])] for target in targets: print(doublet_3_0_vsaero_v(target, source)) vortex_ring = (vortex_3_0_v(target, v2, v3), vortex_3_0_v(target, v3, v4), vortex_3_0_v(target, v4, v1), vortex_3_0_v(target, v1, v2)) print(vortex_ring)