NumOpt 0.0.2__tar.gz → 0.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- numopt-0.0.4/NumOpt/FSI/__init__.py +0 -0
- numopt-0.0.4/NumOpt/FSI/tools.py +33 -0
- numopt-0.0.4/NumOpt/__init__.py +4 -0
- numopt-0.0.4/NumOpt/airfoil/bezier.py +198 -0
- numopt-0.0.4/NumOpt/cprint.py +9 -0
- numopt-0.0.4/NumOpt/nx/__init__.py +0 -0
- numopt-0.0.4/NumOpt/nx/tools.py +89 -0
- {numopt-0.0.2 → numopt-0.0.4}/NumOpt/opti.py +2 -9
- numopt-0.0.4/NumOpt/optimize/__init__.py +0 -0
- numopt-0.0.4/NumOpt/optimize/hxy_optimization.py +39 -0
- numopt-0.0.4/NumOpt/preprocess/scaler.py +31 -0
- {numopt-0.0.2 → numopt-0.0.4}/NumOpt.egg-info/PKG-INFO +1 -1
- numopt-0.0.4/NumOpt.egg-info/SOURCES.txt +21 -0
- {numopt-0.0.2 → numopt-0.0.4}/PKG-INFO +1 -1
- numopt-0.0.4/test/test01.py +146 -0
- numopt-0.0.2/NumOpt/__init__.py +0 -3
- numopt-0.0.2/NumOpt.egg-info/SOURCES.txt +0 -11
- {numopt-0.0.2 → numopt-0.0.4}/LICENSE.txt +0 -0
- {numopt-0.0.2 → numopt-0.0.4}/NumOpt.egg-info/dependency_links.txt +0 -0
- {numopt-0.0.2 → numopt-0.0.4}/NumOpt.egg-info/requires.txt +0 -0
- {numopt-0.0.2 → numopt-0.0.4}/NumOpt.egg-info/top_level.txt +0 -0
- {numopt-0.0.2 → numopt-0.0.4}/README.md +0 -0
- {numopt-0.0.2 → numopt-0.0.4}/pyproject.toml +0 -0
- {numopt-0.0.2 → numopt-0.0.4}/setup.cfg +0 -0
- {numopt-0.0.2 → numopt-0.0.4}/setup.py +0 -0
|
File without changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from ..cprint import cprint_green
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def deal_name(nasfile, outfile, simplify=True):
|
|
7
|
+
def sub_func(match):
|
|
8
|
+
old_str: list = match.group().split("\n")
|
|
9
|
+
pshell_name = match.group("name")
|
|
10
|
+
if simplify:
|
|
11
|
+
pshell_name = pshell_name.split(":")[0]
|
|
12
|
+
pshell_id = match.group("id")
|
|
13
|
+
insert_str = f"$ANSA_NAME_COMMENT;{pshell_id};PSHELL;{pshell_name};"
|
|
14
|
+
old_str.insert(1, insert_str)
|
|
15
|
+
new_str = "\n".join(old_str)
|
|
16
|
+
return new_str
|
|
17
|
+
|
|
18
|
+
pattern = r"\$\*\s+Property:\s(?P<name>.*)\nPSHELL\s+(?P<id>\d+)\s+.*\n"
|
|
19
|
+
pattern = re.compile(pattern)
|
|
20
|
+
|
|
21
|
+
content = Path(nasfile).read_text()
|
|
22
|
+
new_content = re.sub(pattern, sub_func, content)
|
|
23
|
+
outfile = Path(outfile)
|
|
24
|
+
if not outfile.parent.exists():
|
|
25
|
+
outfile.parent.mkdir(exist_ok=True)
|
|
26
|
+
outfile.write_text(new_content)
|
|
27
|
+
cprint_green(f"new nastran file `{outfile.as_posix()}` is generated.")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
if __name__ == "__main__":
|
|
32
|
+
nasfile = "./bulk.dat"
|
|
33
|
+
deal_name(nasfile, "new_bulk.dat")
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
from ..opti import asb, anp, cas, np
|
|
2
|
+
from scipy.special import comb
|
|
3
|
+
from ..cprint import cprint_green
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Bezier:
|
|
7
|
+
def __init__(self, control_points):
|
|
8
|
+
self.control_points = control_points
|
|
9
|
+
self.setup()
|
|
10
|
+
|
|
11
|
+
def setup(self):
|
|
12
|
+
self.order = self.control_points.shape[0] - 1
|
|
13
|
+
self.ndim = self.control_points.shape[1]
|
|
14
|
+
self._K = comb(self.order, np.arange(self.order + 1))
|
|
15
|
+
self._C = np.tile(self._K, (self.ndim, 1)).T * self.control_points
|
|
16
|
+
|
|
17
|
+
def __call__(self, t):
|
|
18
|
+
t = anp.reshape(t, (1, -1))
|
|
19
|
+
ti = []
|
|
20
|
+
t_ni = []
|
|
21
|
+
t_ = 1 - t
|
|
22
|
+
for i in range(self.order + 1):
|
|
23
|
+
ti.append(t**i)
|
|
24
|
+
t_ni.append(t_ ** (self.order - i))
|
|
25
|
+
ti = anp.concatenate(ti, axis=0)
|
|
26
|
+
t_ni = anp.concatenate(t_ni, axis=0)
|
|
27
|
+
t_mat = (ti * t_ni).T
|
|
28
|
+
pts = t_mat @ self._C
|
|
29
|
+
return pts
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class BezierAirfoil:
|
|
33
|
+
def __init__(self, ctu, ctl):
|
|
34
|
+
self.ctu = ctu
|
|
35
|
+
self.ctl = ctl
|
|
36
|
+
|
|
37
|
+
self.bezier_upper = Bezier(self.ctu)
|
|
38
|
+
self.bezier_lower = Bezier(self.ctl)
|
|
39
|
+
|
|
40
|
+
self.__thickness = self.ctu[-1, 1] - self.ctl[-1, 1]
|
|
41
|
+
self.__symmetry = False
|
|
42
|
+
|
|
43
|
+
def upper_coordinates(self, t):
|
|
44
|
+
pts = self.bezier_upper(t)[::-1, :]
|
|
45
|
+
return pts
|
|
46
|
+
|
|
47
|
+
def lower_coordinates(self, t):
|
|
48
|
+
pts = self.bezier_lower(t)
|
|
49
|
+
return pts
|
|
50
|
+
|
|
51
|
+
def coordinates(self, t):
|
|
52
|
+
pts_u = self.upper_coordinates(t)
|
|
53
|
+
pts_l = self.lower_coordinates(t)
|
|
54
|
+
|
|
55
|
+
pts = anp.concatenate([pts_u[:-1, :], pts_l])
|
|
56
|
+
return pts
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def thickness(self):
|
|
60
|
+
return self.__thickness
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def symmetry(self):
|
|
64
|
+
return self.__symmetry
|
|
65
|
+
|
|
66
|
+
def set_thickness(self, thickness):
|
|
67
|
+
thickness = thickness
|
|
68
|
+
old_thickness = self.thickness
|
|
69
|
+
delta_thickness = thickness - old_thickness
|
|
70
|
+
|
|
71
|
+
t = anp.cosspace(0, 1, 100)
|
|
72
|
+
|
|
73
|
+
upper_coords = self.upper_coordinates(t)
|
|
74
|
+
upper_coords[:, 1] += upper_coords[:, 0] * delta_thickness / 2.0
|
|
75
|
+
lower_coords = self.lower_coordinates(t)
|
|
76
|
+
lower_coords[:, 1] -= lower_coords[:, 0] * delta_thickness / 2.0
|
|
77
|
+
|
|
78
|
+
new_af = self.fit(upper_coords, lower_coords, nctu=self.ctu.shape[0], nctl=self.ctl.shape[0], symmetry=self.symmetry)
|
|
79
|
+
return new_af
|
|
80
|
+
|
|
81
|
+
@staticmethod
|
|
82
|
+
def fit(upper_coordinates, lower_coordinates, nctu=7, nctl=7, symmetry=False):
|
|
83
|
+
default_options = {
|
|
84
|
+
"ipopt.sb": "yes",
|
|
85
|
+
"ipopt.max_iter": 1000,
|
|
86
|
+
"ipopt.max_cpu_time": 1e20,
|
|
87
|
+
"ipopt.mu_strategy": "adaptive",
|
|
88
|
+
"ipopt.fast_step_computation": "yes",
|
|
89
|
+
"detect_simple_bounds": False,
|
|
90
|
+
"expand": True,
|
|
91
|
+
# =======================
|
|
92
|
+
# if verbose
|
|
93
|
+
# "ipopt.print_level": 5,
|
|
94
|
+
# =======================
|
|
95
|
+
# =============================
|
|
96
|
+
# if no verbose
|
|
97
|
+
"print_time": False,
|
|
98
|
+
"ipopt.print_level": 0,
|
|
99
|
+
# =============================.
|
|
100
|
+
# ============================
|
|
101
|
+
# This is a heuristic that tends to result in more robust convergence on highly nonconvex problems.
|
|
102
|
+
# On convex problems and larger problems, the default setting ("adaptive") tends to result in faster convergence.
|
|
103
|
+
# ===========================
|
|
104
|
+
# "ipopt.mu_strategy": "monotone",
|
|
105
|
+
# ===============================
|
|
106
|
+
# This is another heuristic that tells the optimizer to focus on finding the feasible space initially.
|
|
107
|
+
# This can be good when you know your initial guess is very far from satisfying all constraints.
|
|
108
|
+
# "ipopt.start_with_resto": "yes",
|
|
109
|
+
# ===============================
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
# ------------------------ upper -------------------------------
|
|
113
|
+
opti = cas.Opti()
|
|
114
|
+
ctu = opti.variable(nctu, 2)
|
|
115
|
+
ctl = opti.parameter(nctl, 2)
|
|
116
|
+
|
|
117
|
+
af = BezierAirfoil(ctu=ctu, ctl=ctl)
|
|
118
|
+
# t = anp.cosspace(0, 1, upper_coordinates.shape[0])
|
|
119
|
+
t = opti.variable(upper_coordinates.shape[0])
|
|
120
|
+
coords = af.upper_coordinates(t)
|
|
121
|
+
|
|
122
|
+
# residual = cas.sum((coords[:, 1] - upper_coordinates[:, 1]) ** 2)
|
|
123
|
+
dist = coords - upper_coordinates
|
|
124
|
+
residual = cas.sum(cas.dot(dist, dist))
|
|
125
|
+
|
|
126
|
+
opti.subject_to(
|
|
127
|
+
[
|
|
128
|
+
# coords[:, 0] == upper_coordinates[:, 0],
|
|
129
|
+
ctu[0, 0] == 0.0,
|
|
130
|
+
ctu[0, 1] == 0.0,
|
|
131
|
+
ctu[1, 0] == 0.0,
|
|
132
|
+
ctu[-1, 0] == 1.0,
|
|
133
|
+
ctu[-1, 1] == upper_coordinates[0, 1],
|
|
134
|
+
opti.bounded(0.0, t, 1.0),
|
|
135
|
+
opti.bounded(0.0, ctu[:, 0], 1.0),
|
|
136
|
+
cas.diff(t) >= 0.0,
|
|
137
|
+
cas.diff(ctu[:, 0]) >= 0.0,
|
|
138
|
+
]
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
opti.minimize(residual)
|
|
142
|
+
opti.solver("ipopt", default_options)
|
|
143
|
+
opti.set_initial(ctu[:, 0], np.linspace(0, 1, nctu))
|
|
144
|
+
opti.set_initial(ctu[:, 1], 0.05)
|
|
145
|
+
opti.set_initial(t, np.linspace(0, 1, upper_coordinates.shape[0]))
|
|
146
|
+
|
|
147
|
+
# cprint_green("fit upper...")
|
|
148
|
+
sol = opti.solve()
|
|
149
|
+
|
|
150
|
+
ctu_sol = sol.value(ctu)
|
|
151
|
+
|
|
152
|
+
# --------------------------- lower ------------------------------------------
|
|
153
|
+
if symmetry:
|
|
154
|
+
ctl_sol = np.array(ctu_sol)
|
|
155
|
+
ctl_sol[:, 1] = -ctl_sol[:, 1]
|
|
156
|
+
else:
|
|
157
|
+
opti = cas.Opti()
|
|
158
|
+
ctu = opti.parameter(nctu, 2)
|
|
159
|
+
ctl = opti.variable(nctl, 2)
|
|
160
|
+
|
|
161
|
+
af = BezierAirfoil(ctu=ctu, ctl=ctl)
|
|
162
|
+
# t = anp.cosspace(0, 1, upper_coordinates.shape[0])
|
|
163
|
+
t = opti.variable(lower_coordinates.shape[0])
|
|
164
|
+
coords = af.lower_coordinates(t)
|
|
165
|
+
|
|
166
|
+
dist = coords - lower_coordinates
|
|
167
|
+
# residual = cas.sum((coords[:, 1] - lower_coordinates[:, 1]) ** 2)
|
|
168
|
+
residual = cas.sum(cas.dot(dist, dist))
|
|
169
|
+
|
|
170
|
+
opti.subject_to(
|
|
171
|
+
[
|
|
172
|
+
# coords[:, 0] == lower_coordinates[:, 0],
|
|
173
|
+
ctl[0, 0] == 0.0,
|
|
174
|
+
ctl[0, 1] == 0.0,
|
|
175
|
+
ctl[1, 0] == 0.0,
|
|
176
|
+
ctl[-1, 0] == 1.0,
|
|
177
|
+
ctl[-1, 1] == lower_coordinates[-1, 1],
|
|
178
|
+
opti.bounded(0.0, t, 1.0),
|
|
179
|
+
opti.bounded(0.0, ctl[:, 0], 1.0),
|
|
180
|
+
cas.diff(t) >= 0.0,
|
|
181
|
+
cas.diff(ctl[:, 0]) >= 0.0,
|
|
182
|
+
]
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
opti.minimize(residual)
|
|
186
|
+
opti.solver("ipopt", default_options)
|
|
187
|
+
opti.set_initial(ctl[:, 0], np.linspace(0, 1, nctl))
|
|
188
|
+
opti.set_initial(ctl[:, 1], -0.1)
|
|
189
|
+
opti.set_initial(t, np.linspace(0, 1, lower_coordinates.shape[0]))
|
|
190
|
+
|
|
191
|
+
# cprint_green("fit lower...")
|
|
192
|
+
sol = opti.solve()
|
|
193
|
+
|
|
194
|
+
ctl_sol = sol.value(ctl)
|
|
195
|
+
|
|
196
|
+
af = BezierAirfoil(ctu=ctu_sol, ctl=ctl_sol)
|
|
197
|
+
af.__symmetry = symmetry
|
|
198
|
+
return af
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from termcolor import cprint
|
|
2
|
+
from functools import partial
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
cprint_green = partial(cprint, color="green", attrs=["bold"])
|
|
6
|
+
cprint_magenta = partial(cprint, color="magenta", attrs=["bold"])
|
|
7
|
+
cprint_blue = partial(cprint, color="blue", attrs=["bold"])
|
|
8
|
+
cprint_red = partial(cprint, color="red", attrs=["bold"])
|
|
9
|
+
cprint_yellow = partial(cprint, color="yellow", attrs=["bold"])
|
|
File without changes
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import NXOpen
|
|
2
|
+
import NXOpen.Features
|
|
3
|
+
from NXOpen import ParasolidExporter
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def create_af(coords, session: NXOpen.Session):
|
|
11
|
+
part = session.Parts.Work
|
|
12
|
+
|
|
13
|
+
markid = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "create airfoil")
|
|
14
|
+
splineEX = part.Features.CreateStudioSplineBuilderEx(NXOpen.NXObject.Null)
|
|
15
|
+
for i in coords:
|
|
16
|
+
pt = NXOpen.Point3d(i[0] * 1000.0, i[1] * 1000.0, 0.0)
|
|
17
|
+
pt = part.Points.CreatePoint(pt)
|
|
18
|
+
gcons = splineEX.ConstraintManager.CreateGeometricConstraintData()
|
|
19
|
+
gcons.Point = pt
|
|
20
|
+
splineEX.ConstraintManager.Append(gcons)
|
|
21
|
+
spline = splineEX.Commit()
|
|
22
|
+
splineEX.Destroy()
|
|
23
|
+
session.UpdateManager.DoUpdate(markid)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def modify_af(coords, name, session: NXOpen.Session):
|
|
27
|
+
part = session.Parts.Work
|
|
28
|
+
|
|
29
|
+
markid = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "modify airfoil")
|
|
30
|
+
spline = part.Features.FindObject(name)
|
|
31
|
+
splineEX = part.Features.CreateStudioSplineBuilderEx(spline)
|
|
32
|
+
for i, vi in enumerate(coords):
|
|
33
|
+
gcons = splineEX.ConstraintManager.FindItem(i)
|
|
34
|
+
pt = gcons.Point
|
|
35
|
+
pt.SetCoordinates(NXOpen.Point3d(vi[0] * 1000.0, vi[1] * 1000.0, 0.0))
|
|
36
|
+
splineEX.Evaluate()
|
|
37
|
+
spline = splineEX.Commit()
|
|
38
|
+
splineEX.Destroy()
|
|
39
|
+
session.UpdateManager.DoUpdate(markid)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def modify_expr(expr_name: str, value: float, session: NXOpen.Session, unit: str = None, update: bool = False):
|
|
43
|
+
markid = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, f"modify {expr_name}")
|
|
44
|
+
part = session.Parts.Work
|
|
45
|
+
expr = part.Expressions.FindObject(expr_name)
|
|
46
|
+
unit = NXOpen.Unit.Null if unit is None else part.UnitCollection.FindObject(unit)
|
|
47
|
+
part.Expressions.EditExpressionWithUnits(expr, unit, f"{value:.6f}")
|
|
48
|
+
if update:
|
|
49
|
+
session.UpdateManager.DoUpdate(markid)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def export_solid(solid_name: list[str], outfile: str, session: NXOpen.Session):
|
|
53
|
+
markid = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "export parasoild")
|
|
54
|
+
|
|
55
|
+
part = session.Parts.Work
|
|
56
|
+
parasolidExporter: ParasolidExporter = session.DexManager.CreateParasolidExporter()
|
|
57
|
+
parasolidExporter.InputFile = part.FullPath
|
|
58
|
+
parasolidExporter.OutputFile = outfile
|
|
59
|
+
|
|
60
|
+
parasolidExporter.ExportSelectionBlock.SelectionScope = NXOpen.ObjectSelector.Scope.SelectedObjects
|
|
61
|
+
for i in solid_name:
|
|
62
|
+
solid = part.Bodies.FindObject(i)
|
|
63
|
+
parasolidExporter.ExportSelectionBlock.SelectionComp.Add(solid)
|
|
64
|
+
parasolidExporter.Commit()
|
|
65
|
+
session.UpdateManager.DoUpdate(markid)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def saveAs(outfile, session: NXOpen.Session, overwrite: False):
|
|
69
|
+
outfile = Path(outfile)
|
|
70
|
+
if overwrite:
|
|
71
|
+
if outfile.exists():
|
|
72
|
+
os.unlink(outfile)
|
|
73
|
+
else:
|
|
74
|
+
if outfile.exists():
|
|
75
|
+
raise (f"{outfile} has been existed.")
|
|
76
|
+
|
|
77
|
+
markid = session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, f"save as")
|
|
78
|
+
part = session.Parts.Work
|
|
79
|
+
part.SaveAs(outfile.as_posix())
|
|
80
|
+
session.UpdateManager.DoUpdate(markid)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
if __name__ == "__main__":
|
|
84
|
+
with open("C:/Users/Zcaic/Desktop/hxy_ppt/coords.json", "r") as fin:
|
|
85
|
+
data = json.load(fin)
|
|
86
|
+
|
|
87
|
+
session = NXOpen.Session.GetSession()
|
|
88
|
+
# create_af(data["init_coords"],session=session)
|
|
89
|
+
modify_af(coords=data["init_coords"], name="SPLINE(1)", session=session)
|
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
import aerosandbox.numpy as anp
|
|
2
2
|
import aerosandbox as asb
|
|
3
|
+
import numpy as np
|
|
3
4
|
import casadi as cas
|
|
4
|
-
from termcolor import cprint
|
|
5
|
-
from functools import partial
|
|
6
5
|
from typing import Callable, Any, Dict
|
|
7
|
-
|
|
8
|
-
cprint_green = partial(cprint, color="green", attrs=["bold"])
|
|
9
|
-
cprint_magenta = partial(cprint, color="magenta", attrs=["bold"])
|
|
10
|
-
cprint_blue = partial(cprint, color="blue", attrs=["bold"])
|
|
11
|
-
cprint_red = partial(cprint, color="red", attrs=["bold"])
|
|
12
|
-
cprint_yellow = partial(cprint, color="yellow", attrs=["bold"])
|
|
13
|
-
|
|
6
|
+
from .cprint import cprint_yellow
|
|
14
7
|
|
|
15
8
|
# def trape(y, x):
|
|
16
9
|
# y = anp.array(y)
|
|
File without changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from scipy.spatial import Delaunay as DelaunayND
|
|
3
|
+
|
|
4
|
+
from ..cprint import cprint_green,cprint_magenta
|
|
5
|
+
|
|
6
|
+
class Delaunay1D(object):
|
|
7
|
+
def __init__(self,points):
|
|
8
|
+
self.points=np.reshape(points,(-1,1))
|
|
9
|
+
self.dim=len(self.points)
|
|
10
|
+
@property
|
|
11
|
+
def vertex_neighbor_vertices(self):
|
|
12
|
+
sord_idx=np.argsort(self.points.flatten())
|
|
13
|
+
idxptr=[0]
|
|
14
|
+
idx=[]
|
|
15
|
+
sort_points=np.arange(self.dim)[sord_idx]
|
|
16
|
+
ranks=np.argsort(sord_idx)
|
|
17
|
+
for _,vi in enumerate(ranks):
|
|
18
|
+
len_idx=len(idx)
|
|
19
|
+
if vi==0:
|
|
20
|
+
right=vi+1
|
|
21
|
+
right=sort_points[right]
|
|
22
|
+
idxptr.append(len_idx+1)
|
|
23
|
+
idx.append(right)
|
|
24
|
+
elif vi==self.dim-1:
|
|
25
|
+
left=vi-1
|
|
26
|
+
left=sort_points[left]
|
|
27
|
+
idxptr.append(len_idx+1)
|
|
28
|
+
idx.append(left)
|
|
29
|
+
else:
|
|
30
|
+
left=vi-1
|
|
31
|
+
left=sort_points[left]
|
|
32
|
+
right=vi+1
|
|
33
|
+
right=sort_points[right]
|
|
34
|
+
idxptr.append(len_idx+2)
|
|
35
|
+
idx.extend([left,right])
|
|
36
|
+
|
|
37
|
+
idxptr=np.array(idxptr)
|
|
38
|
+
idx=np.array(idx)
|
|
39
|
+
return idxptr,idx
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from ..cprint import cprint_green, cprint_red
|
|
3
|
+
|
|
4
|
+
class NormalScaler:
|
|
5
|
+
def __init__(self):
|
|
6
|
+
self._mean = None
|
|
7
|
+
self._std = None
|
|
8
|
+
|
|
9
|
+
def fit(self, dataset):
|
|
10
|
+
if dataset.ndim != 2:
|
|
11
|
+
cprint_red("The dataset ndim must = 2.\n")
|
|
12
|
+
exit(-1)
|
|
13
|
+
self._mean = np.mean(dataset, axis=0)
|
|
14
|
+
self._std = np.std(dataset, axis=0, ddof=1)
|
|
15
|
+
return self
|
|
16
|
+
|
|
17
|
+
def transform(self, dataset, target_mean, target_std):
|
|
18
|
+
new_dataset = (dataset - self._mean) / self._std
|
|
19
|
+
new_dataset = new_dataset * target_std + target_mean
|
|
20
|
+
return new_dataset
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
if __name__ == "__main__":
|
|
24
|
+
x = np.random.normal(0.0, 0.1, (1000, 1))
|
|
25
|
+
|
|
26
|
+
scaler = NormalScaler().fit(x)
|
|
27
|
+
print(scaler._mean, scaler._std)
|
|
28
|
+
|
|
29
|
+
new_x = scaler.transform(dataset=x, target_mean=2.0, target_std=10)
|
|
30
|
+
new_scaler=NormalScaler().fit(new_x)
|
|
31
|
+
print(new_scaler._mean,new_scaler._std)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
LICENSE.txt
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
setup.py
|
|
5
|
+
NumOpt/__init__.py
|
|
6
|
+
NumOpt/cprint.py
|
|
7
|
+
NumOpt/opti.py
|
|
8
|
+
NumOpt.egg-info/PKG-INFO
|
|
9
|
+
NumOpt.egg-info/SOURCES.txt
|
|
10
|
+
NumOpt.egg-info/dependency_links.txt
|
|
11
|
+
NumOpt.egg-info/requires.txt
|
|
12
|
+
NumOpt.egg-info/top_level.txt
|
|
13
|
+
NumOpt/FSI/__init__.py
|
|
14
|
+
NumOpt/FSI/tools.py
|
|
15
|
+
NumOpt/airfoil/bezier.py
|
|
16
|
+
NumOpt/nx/__init__.py
|
|
17
|
+
NumOpt/nx/tools.py
|
|
18
|
+
NumOpt/optimize/__init__.py
|
|
19
|
+
NumOpt/optimize/hxy_optimization.py
|
|
20
|
+
NumOpt/preprocess/scaler.py
|
|
21
|
+
test/test01.py
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
from NumOpt.airfoil.bezier import Bezier, BezierAirfoil
|
|
2
|
+
from NumOpt.opti import cas,Opti
|
|
3
|
+
import numpy as np
|
|
4
|
+
import aerosandbox as asb
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test1():
|
|
8
|
+
opti=Opti()
|
|
9
|
+
T=opti.variable(init_guess=2.8e3*9.8)
|
|
10
|
+
|
|
11
|
+
A=np.pi*3.5**2
|
|
12
|
+
vi=(T/(2*1.225*A))**0.5
|
|
13
|
+
|
|
14
|
+
Pin=743e3
|
|
15
|
+
|
|
16
|
+
eta=T*vi/Pin
|
|
17
|
+
|
|
18
|
+
opti.subject_to([
|
|
19
|
+
eta==0.80
|
|
20
|
+
])
|
|
21
|
+
|
|
22
|
+
opti.solver()
|
|
23
|
+
sol=opti.solve()
|
|
24
|
+
print(sol(T))
|
|
25
|
+
|
|
26
|
+
def test2():
|
|
27
|
+
af=asb.Airfoil("naca0012")
|
|
28
|
+
af_new=BezierAirfoil.fit(upper_coordinates=af.upper_coordinates(),lower_coordinates=af.lower_coordinates(),symmetry=True)
|
|
29
|
+
af_new=af_new.set_thickness(5e-3)
|
|
30
|
+
print(af_new.thickness)
|
|
31
|
+
coords = af_new.coordinates(np.linspace(0, 1, 100))
|
|
32
|
+
|
|
33
|
+
import matplotlib.pyplot as plt
|
|
34
|
+
|
|
35
|
+
fig = plt.figure()
|
|
36
|
+
ax = fig.add_subplot()
|
|
37
|
+
ax.plot(coords[:, 0], coords[:, 1],label="fit")
|
|
38
|
+
ax.plot(af.coordinates[:,0],af.coordinates[:,1],label="ori")
|
|
39
|
+
ax.plot(af_new.ctu[:,0],af_new.ctu[:,1],"o--",label="ctu")
|
|
40
|
+
ax.plot(af_new.ctl[:,0],af_new.ctl[:,1],"o--",label="ctl")
|
|
41
|
+
ax.legend()
|
|
42
|
+
plt.show()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test3():
|
|
47
|
+
nx = 5
|
|
48
|
+
|
|
49
|
+
# inputs
|
|
50
|
+
# x = cas.GenMX.sym("x", nx, 1)
|
|
51
|
+
|
|
52
|
+
# max_x = anp.max(x)
|
|
53
|
+
|
|
54
|
+
# max_x_index = cas.find(max_x == x)
|
|
55
|
+
|
|
56
|
+
# ret = anp.concatenate([max_x_index, max_x], axis=1)
|
|
57
|
+
|
|
58
|
+
# func = cas.Function("func", [x], [ret])
|
|
59
|
+
|
|
60
|
+
# print(func(anp.array([1, 3, 3, 3, 5])))
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test4():
|
|
64
|
+
opti = cas.Opti()
|
|
65
|
+
|
|
66
|
+
# 声明变量K并设置为整数类型
|
|
67
|
+
K = opti.variable()
|
|
68
|
+
opti.set_domain(K, "integer")
|
|
69
|
+
|
|
70
|
+
# 定义数组并转换为MX类型
|
|
71
|
+
A = [3, 2, 1, 2, 3]
|
|
72
|
+
A = cas.MX(A)
|
|
73
|
+
|
|
74
|
+
# 构建目标函数:最小化A[K]
|
|
75
|
+
opti.minimize(A[K])
|
|
76
|
+
|
|
77
|
+
# 添加约束:确保K在数组有效范围内
|
|
78
|
+
opti.subject_to(0 <= (K <= 4))
|
|
79
|
+
|
|
80
|
+
# 设置求解器并求解
|
|
81
|
+
opti.solver("bonmin")
|
|
82
|
+
sol = opti.solve()
|
|
83
|
+
|
|
84
|
+
# 输出结果
|
|
85
|
+
print(sol.value(K))
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test5():
|
|
89
|
+
import sympy as sp
|
|
90
|
+
|
|
91
|
+
p = sp.symbols("p", complex=True)
|
|
92
|
+
v = sp.symbols("v")
|
|
93
|
+
m = sp.symbols("m")
|
|
94
|
+
r = sp.symbols("r")
|
|
95
|
+
b = sp.symbols("b")
|
|
96
|
+
K_h = sp.symbols("K_h")
|
|
97
|
+
K_alpha = sp.symbols("K_alpha")
|
|
98
|
+
S_alpha = sp.symbols("S_alpha")
|
|
99
|
+
I_alpha = sp.symbols("I_alpha")
|
|
100
|
+
a = sp.symbols("a")
|
|
101
|
+
pi = np.pi
|
|
102
|
+
|
|
103
|
+
A = sp.Matrix(
|
|
104
|
+
[
|
|
105
|
+
[
|
|
106
|
+
m * p**2 + 2 * pi * r * v * b * p + K_h,
|
|
107
|
+
S_alpha * p**2 + (1 - 2 * a) * pi * r * v * b**2 * p + 2 * pi * r * v**2 * b,
|
|
108
|
+
],
|
|
109
|
+
[
|
|
110
|
+
S_alpha * p**2 - (2 * a + 1) * pi * r * v * b**2 * p,
|
|
111
|
+
I_alpha * p**2 + (2 * a *a) * pi * r * v * b**3 * p + K_alpha - (2 * a + 1) * pi * r * v**2 * b**2,
|
|
112
|
+
],
|
|
113
|
+
]
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
detA=A.det()
|
|
117
|
+
|
|
118
|
+
p_expr=sp.solve(detA,p)
|
|
119
|
+
|
|
120
|
+
# p_expr=sp.lambdify([v,m,r,b,K_h,K_alpha,S_alpha,I_alpha,a],p_expr)
|
|
121
|
+
return p_expr
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def test6():
|
|
126
|
+
ctu = np.array([[0.0, 0.0], [0.0, 26.8], [122.7, 52.9], [392.0, 110.2], [710.4, 41.6], [850.5, 12.9], [1000.0, 0.0]])
|
|
127
|
+
ctl = np.array([[0.0, 0.0], [0.0, -26.6], [160.1, -36.0], [421.5, -71.3], [716.2, -20.8], [850.8, 8.5], [1000.0, 0.0]])
|
|
128
|
+
|
|
129
|
+
af = BezierAirfoil(ctu=ctu, ctl=ctl)
|
|
130
|
+
coords = af.coordinates(np.linspace(0, 1, 100))
|
|
131
|
+
|
|
132
|
+
import matplotlib.pyplot as plt
|
|
133
|
+
|
|
134
|
+
fig = plt.figure()
|
|
135
|
+
ax = fig.add_subplot()
|
|
136
|
+
ax.plot(coords[:, 0], coords[:, 1])
|
|
137
|
+
plt.show()
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
if __name__ == "__main__":
|
|
141
|
+
# test1()
|
|
142
|
+
test2()
|
|
143
|
+
# test3()
|
|
144
|
+
# test4()
|
|
145
|
+
# test5()
|
|
146
|
+
# test6()
|
numopt-0.0.2/NumOpt/__init__.py
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|