Esempio n. 1
0
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)
Esempio n. 2
0
    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")
Esempio n. 3
0
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")
Esempio n. 4
0
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()
Esempio n. 5
0
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
Esempio n. 6
0
def infl_far(point):
    return mue_mid * doublet_3_0_n0(paraBEM.Vector3(*point), mid_pan)
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
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()
Esempio n. 10
0
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)
Esempio n. 11
0
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 = []
Esempio n. 12
0
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")
Esempio n. 13
0
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)
Esempio n. 14
0
 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")
Esempio n. 15
0
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] +
Esempio n. 16
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()
Esempio n. 17
0
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)
Esempio n. 18
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]
Esempio n. 19
0
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)
Esempio n. 20
0
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")
Esempio n. 21
0
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)