pyfemtet 0.4.1__py3-none-any.whl → 0.4.2__py3-none-any.whl
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.
Potentially problematic release.
This version of pyfemtet might be problematic. Click here for more details.
- pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.py +60 -31
- pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.py +61 -39
- pyfemtet/FemtetPJTSample/gau_ex08_parametric.py +25 -22
- pyfemtet/FemtetPJTSample/her_ex40_parametric.py +59 -47
- pyfemtet/FemtetPJTSample/wat_ex14_parallel_parametric.py +31 -29
- pyfemtet/FemtetPJTSample/wat_ex14_parametric.py +29 -27
- pyfemtet/__init__.py +1 -1
- pyfemtet/opt/_femopt_core.py +3 -1
- pyfemtet/opt/interface/_femtet.py +1 -1
- pyfemtet/opt/opt/_optuna.py +6 -0
- {pyfemtet-0.4.1.dist-info → pyfemtet-0.4.2.dist-info}/METADATA +3 -2
- {pyfemtet-0.4.1.dist-info → pyfemtet-0.4.2.dist-info}/RECORD +15 -15
- {pyfemtet-0.4.1.dist-info → pyfemtet-0.4.2.dist-info}/LICENSE +0 -0
- {pyfemtet-0.4.1.dist-info → pyfemtet-0.4.2.dist-info}/WHEEL +0 -0
- {pyfemtet-0.4.1.dist-info → pyfemtet-0.4.2.dist-info}/entry_points.txt +0 -0
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""External CAD (NX) Integration
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
This script performs parametric optimization
|
|
4
|
+
using a project that has imported an external CAD model
|
|
5
|
+
that has been parametrically modeled.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
|
|
7
|
+
Please perform the following steps in preparation.
|
|
8
|
+
- Install NX.
|
|
9
|
+
- Place NX_ex01.prt, NX_ex01.femprj and .py file in the same folder.
|
|
10
|
+
- Create C:\\temp folder on your disk.
|
|
11
|
+
Note: NX exports .x_t files during optimization.
|
|
10
12
|
"""
|
|
11
13
|
|
|
12
14
|
import os
|
|
13
15
|
from pyfemtet.opt import FEMOpt, OptunaOptimizer
|
|
14
16
|
from pyfemtet.opt.interface import FemtetWithNXInterface
|
|
17
|
+
from pyfemtet.core import ModelError
|
|
15
18
|
|
|
16
19
|
|
|
17
20
|
here, me = os.path.split(__file__)
|
|
@@ -19,35 +22,60 @@ os.chdir(here)
|
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
def disp(Femtet):
|
|
22
|
-
"""
|
|
23
|
-
|
|
25
|
+
"""Obtain the maximum displacement in the Z direction from the analysis results.
|
|
26
|
+
|
|
27
|
+
Note:
|
|
28
|
+
The objective or constraint function
|
|
29
|
+
must take a Femtet as its first argument
|
|
30
|
+
and must return a single float.
|
|
31
|
+
|
|
32
|
+
Warning:
|
|
33
|
+
CAD integration may assign boundary conditions to unintended locations.
|
|
34
|
+
|
|
35
|
+
In this example, if the boundary conditions are assigned as intended,
|
|
36
|
+
the maximum displacement is always negative.
|
|
37
|
+
If the maximum displacement is positive,
|
|
38
|
+
it is assumed that boundary condition assignment has failed
|
|
39
|
+
and a ModelError is raised.
|
|
40
|
+
|
|
41
|
+
If a ModelError, MeshError, or SolveError is raised during an optimization,
|
|
42
|
+
the Optimizer considers the trial a failure
|
|
43
|
+
and skips it to the next trial.
|
|
24
44
|
"""
|
|
25
45
|
_, _, ret = Femtet.Gogh.Galileo.GetMaxDisplacement_py()
|
|
46
|
+
|
|
47
|
+
if ret >= 0:
|
|
48
|
+
raise ModelError('The boundary condition assignment is incorrect.')
|
|
26
49
|
return ret
|
|
27
50
|
|
|
28
51
|
|
|
29
52
|
def volume(Femtet):
|
|
30
|
-
"""
|
|
31
|
-
目的関数の第一引数は Femtet インスタンスである必要があります。
|
|
32
|
-
"""
|
|
53
|
+
"""Obtain the volume."""
|
|
33
54
|
_, ret = Femtet.Gogh.CalcVolume_py([0])
|
|
34
55
|
return ret
|
|
35
56
|
|
|
36
57
|
|
|
37
58
|
def C_minus_B(_, opt):
|
|
38
|
-
"""C
|
|
59
|
+
"""Calculate the difference between C and B dimensions.
|
|
39
60
|
|
|
40
|
-
|
|
41
|
-
|
|
61
|
+
The constraint function must take a Femtet instance as its first argument,
|
|
62
|
+
but this example does not use it.
|
|
42
63
|
|
|
43
|
-
|
|
44
|
-
CAD 連携を行う場合、Femtet に設計変数が設定されていないためです。
|
|
45
|
-
A = Femtet.GetVariableValue('A')
|
|
46
|
-
|
|
47
|
-
pyfemtet.opt では目的関数・拘束関数の第二引数以降に任意の変数を設定できます。
|
|
48
|
-
この例では、第二引数に FEMOpt のメンバー変数 opt を取り、
|
|
49
|
-
そのメソッド get_parameter() を用いて設計変数を取得しています。
|
|
64
|
+
Another example uses the following snippet to access design variables:
|
|
50
65
|
|
|
66
|
+
A = Femtet.GetVariableValue('A')
|
|
67
|
+
|
|
68
|
+
However, when performing CAD integration,
|
|
69
|
+
this method does not work because the variables are not set in the .femprj file.
|
|
70
|
+
|
|
71
|
+
In CAD integration, design variables are obtained in the following way.
|
|
72
|
+
|
|
73
|
+
The objective function and constraint function can take any variable after the first argument.
|
|
74
|
+
The member variable opt of FEMOpt has a method called get_parameter().
|
|
75
|
+
This method can retrieve design variables added by add_parameter().
|
|
76
|
+
By taking opt as the second argument, you can execute get_parameter()
|
|
77
|
+
in the objective function or constraint function to obtain the design variables.
|
|
78
|
+
|
|
51
79
|
"""
|
|
52
80
|
A, B, C = opt.get_parameter('values')
|
|
53
81
|
return C - B
|
|
@@ -55,35 +83,36 @@ def C_minus_B(_, opt):
|
|
|
55
83
|
|
|
56
84
|
if __name__ == '__main__':
|
|
57
85
|
|
|
58
|
-
# NX-Femtet
|
|
59
|
-
#
|
|
86
|
+
# Define NX-Femtet integration object.
|
|
87
|
+
# At this point, Python is connected to the running Femtet.
|
|
60
88
|
fem = FemtetWithNXInterface(
|
|
61
89
|
prt_path='NX_ex01.prt',
|
|
62
90
|
femprj_path='NX_ex01.femprj',
|
|
63
91
|
)
|
|
64
92
|
|
|
93
|
+
# Define mathematical optimization object.
|
|
65
94
|
opt = OptunaOptimizer(
|
|
66
95
|
sampler_kwargs=dict(
|
|
67
96
|
n_startup_trials=5,
|
|
68
97
|
)
|
|
69
98
|
)
|
|
70
99
|
|
|
71
|
-
#
|
|
100
|
+
# Define FEMOpt object (This process integrates mathematical optimization and FEM.).
|
|
72
101
|
femopt = FEMOpt(fem=fem, opt=opt)
|
|
73
102
|
|
|
74
|
-
#
|
|
103
|
+
# Add design variables (Use variable names set in NX) to the optimization problem.
|
|
75
104
|
femopt.add_parameter('A', 10, lower_bound=1, upper_bound=59)
|
|
76
105
|
femopt.add_parameter('B', 10, lower_bound=1, upper_bound=40)
|
|
77
106
|
femopt.add_parameter('C', 20, lower_bound=5, upper_bound=59)
|
|
78
107
|
|
|
79
|
-
#
|
|
108
|
+
# Add constraint to the optimization problem.
|
|
80
109
|
femopt.add_constraint(C_minus_B, 'C>B', lower_bound=1, args=femopt.opt)
|
|
81
110
|
|
|
82
|
-
#
|
|
83
|
-
femopt.add_objective(disp, name='
|
|
84
|
-
femopt.add_objective(volume, name='
|
|
111
|
+
# Add objective to the optimization problem.
|
|
112
|
+
femopt.add_objective(disp, name='displacement', direction=0)
|
|
113
|
+
femopt.add_objective(volume, name='volume', direction='minimize')
|
|
85
114
|
|
|
86
|
-
#
|
|
115
|
+
# Run optimization.
|
|
87
116
|
femopt.set_random_seed(42)
|
|
88
117
|
femopt.optimize(n_trials=20)
|
|
89
118
|
femopt.terminate_all()
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""External CAD (Solidworks) Integration
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
This script performs parametric optimization
|
|
4
|
+
using a project that has imported an external CAD model
|
|
5
|
+
that has been parametrically modeled.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
|
|
7
|
+
Please perform the following steps in preparation.
|
|
8
|
+
- Install Solidworks.
|
|
9
|
+
- Place Sldworks_ex01.SLDPRT, Sldworks_ex01.femprj and this .py file in the same folder.
|
|
10
|
+
- Create C:\\temp folder on your disk.
|
|
11
|
+
Note: NX exports .x_t files during optimization.
|
|
10
12
|
"""
|
|
11
13
|
|
|
12
14
|
import os
|
|
@@ -20,45 +22,60 @@ os.chdir(here)
|
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
def disp(Femtet):
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
+
"""Obtain the maximum displacement in the Z direction from the analysis results.
|
|
26
|
+
|
|
27
|
+
Note:
|
|
28
|
+
The objective or constraint function
|
|
29
|
+
must take a Femtet as its first argument
|
|
30
|
+
and must return a single float.
|
|
31
|
+
|
|
32
|
+
Warning:
|
|
33
|
+
CAD integration may assign boundary conditions to unintended locations.
|
|
34
|
+
|
|
35
|
+
In this example, if the boundary conditions are assigned as intended,
|
|
36
|
+
the maximum displacement is always negative.
|
|
37
|
+
If the maximum displacement is positive,
|
|
38
|
+
it is assumed that boundary condition assignment has failed
|
|
39
|
+
and a ModelError is raised.
|
|
40
|
+
|
|
41
|
+
If a ModelError, MeshError, or SolveError is raised during an optimization,
|
|
42
|
+
the Optimizer considers the trial a failure
|
|
43
|
+
and skips it to the next trial.
|
|
25
44
|
"""
|
|
26
45
|
_, _, ret = Femtet.Gogh.Galileo.GetMaxDisplacement_py()
|
|
27
46
|
|
|
28
|
-
# CAD 連携の場合、境界条件をトポロジーIDに基づいて割り当てているので、
|
|
29
|
-
# 意図しない箇所に境界条件が割り当てられることがあります。
|
|
30
|
-
# この問題では意図通りの割り当てができていれば最大変位は必ず負なので
|
|
31
|
-
# 答えが正の場合は境界条件割り当てに失敗しているとみなして
|
|
32
|
-
# ModelError を送出するようにします。
|
|
33
|
-
# 最適化ルーチン中に ModelError, MeshError, SolveError が送出された場合
|
|
34
|
-
# Optimizer はその試行を失敗とみなし、スキップして次の試行を行います。
|
|
35
47
|
if ret >= 0:
|
|
36
|
-
raise ModelError('
|
|
48
|
+
raise ModelError('The boundary condition assignment is incorrect.')
|
|
37
49
|
return ret
|
|
38
50
|
|
|
39
51
|
|
|
40
52
|
def volume(Femtet):
|
|
41
|
-
"""
|
|
42
|
-
目的関数の第一引数は Femtet インスタンスである必要があります。
|
|
43
|
-
"""
|
|
53
|
+
"""Obtain the volume."""
|
|
44
54
|
_, ret = Femtet.Gogh.CalcVolume_py([0])
|
|
45
55
|
return ret
|
|
46
56
|
|
|
47
57
|
|
|
48
58
|
def C_minus_B(_, opt):
|
|
49
|
-
"""C
|
|
50
|
-
|
|
51
|
-
拘束関数の第一引数は Femtet インスタンスである必要がありますが、
|
|
52
|
-
この例では使用していません。
|
|
59
|
+
"""Calculate the difference between C and B dimensions.
|
|
53
60
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
A = Femtet.GetVariableValue('A')
|
|
61
|
+
The constraint function must take a Femtet instance as its first argument,
|
|
62
|
+
but this example does not use it.
|
|
57
63
|
|
|
58
|
-
|
|
59
|
-
この例では、第二引数に FEMOpt のメンバー変数 opt を取り、
|
|
60
|
-
そのメソッド get_parameter() を用いて設計変数を取得しています。
|
|
64
|
+
Another example uses the following snippet to access design variables:
|
|
61
65
|
|
|
66
|
+
A = Femtet.GetVariableValue('A')
|
|
67
|
+
|
|
68
|
+
However, when performing CAD integration,
|
|
69
|
+
this method does not work because the variables are not set in the .femprj file.
|
|
70
|
+
|
|
71
|
+
In CAD integration, design variables are obtained in the following way.
|
|
72
|
+
|
|
73
|
+
The objective function and constraint function can take any variable after the first argument.
|
|
74
|
+
The member variable opt of FEMOpt has a method called get_parameter().
|
|
75
|
+
This method can retrieve design variables added by add_parameter().
|
|
76
|
+
By taking opt as the second argument, you can execute get_parameter()
|
|
77
|
+
in the objective function or constraint function to obtain the design variables.
|
|
78
|
+
|
|
62
79
|
"""
|
|
63
80
|
A, B, C = opt.get_parameter('values')
|
|
64
81
|
return C - B
|
|
@@ -66,34 +83,39 @@ def C_minus_B(_, opt):
|
|
|
66
83
|
|
|
67
84
|
if __name__ == '__main__':
|
|
68
85
|
|
|
69
|
-
# Solidworks-Femtet
|
|
70
|
-
#
|
|
86
|
+
# Define Solidworks-Femtet integration object.
|
|
87
|
+
# At this point, Python is connected to the running Femtet.
|
|
71
88
|
fem = FemtetWithSolidworksInterface(
|
|
72
89
|
sldprt_path='Sldworks_ex01.SLDPRT',
|
|
73
90
|
femprj_path='Sldworks_ex01.femprj',
|
|
74
91
|
)
|
|
75
92
|
|
|
93
|
+
# Define mathematical optimization object.
|
|
76
94
|
opt = OptunaOptimizer(
|
|
77
95
|
sampler_kwargs=dict(
|
|
78
96
|
n_startup_trials=5,
|
|
79
97
|
)
|
|
80
98
|
)
|
|
81
99
|
|
|
82
|
-
#
|
|
100
|
+
# Define FEMOpt object (This process integrates mathematical optimization and FEM.).
|
|
83
101
|
femopt = FEMOpt(fem=fem, opt=opt)
|
|
84
102
|
|
|
85
|
-
#
|
|
103
|
+
# Add design variables (Use variable names set in NX) to the optimization problem.
|
|
86
104
|
femopt.add_parameter('A', 10, lower_bound=1, upper_bound=59)
|
|
87
105
|
femopt.add_parameter('B', 10, lower_bound=1, upper_bound=40)
|
|
88
106
|
femopt.add_parameter('C', 20, lower_bound=5, upper_bound=59)
|
|
89
107
|
|
|
90
|
-
#
|
|
108
|
+
# Add constraint to the optimization problem.
|
|
109
|
+
# Note that we use the ``args`` keyword
|
|
110
|
+
# to pass femopt.opt as an argument
|
|
111
|
+
# to the constraint function ``C_minus_B``.
|
|
91
112
|
femopt.add_constraint(C_minus_B, 'C>B', lower_bound=1, args=femopt.opt)
|
|
92
113
|
|
|
93
|
-
#
|
|
94
|
-
femopt.add_objective(disp, name='
|
|
95
|
-
femopt.add_objective(volume, name='
|
|
114
|
+
# Add objective to the optimization problem.
|
|
115
|
+
femopt.add_objective(disp, name='displacement', direction=0)
|
|
116
|
+
femopt.add_objective(volume, name='volume', direction='minimize')
|
|
96
117
|
|
|
97
|
-
#
|
|
118
|
+
# Run optimization.
|
|
98
119
|
femopt.set_random_seed(42)
|
|
99
120
|
femopt.optimize(n_trials=20)
|
|
121
|
+
femopt.terminate_all()
|
|
@@ -1,26 +1,30 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Single-objective optimization: self-inductance of a finite length solenoid coil
|
|
2
2
|
|
|
3
|
-
gau_ex08_parametric.femprj
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Perform magnetic field analysis on gau_ex08_parametric.femprj
|
|
4
|
+
to find the dimensions of a finite length solenoid coil
|
|
5
|
+
that makes the self-inductance a specific value.
|
|
6
6
|
"""
|
|
7
7
|
from optuna.integration.botorch import BoTorchSampler
|
|
8
8
|
from pyfemtet.opt import FEMOpt, OptunaOptimizer
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def inductance(Femtet):
|
|
12
|
-
"""
|
|
12
|
+
"""Get the self-inductance.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
Note:
|
|
15
|
+
The objective or constraint function
|
|
16
|
+
must take a Femtet as its first argument
|
|
17
|
+
and must return a single float.
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
Params:
|
|
20
|
+
Femtet: An instance for using Femtet macros. For more information, see "Femtet Macro Help / CFemtet Class".
|
|
19
21
|
|
|
22
|
+
Returns:
|
|
23
|
+
float: Self-inductance.
|
|
20
24
|
"""
|
|
21
25
|
Gogh = Femtet.Gogh
|
|
22
26
|
|
|
23
|
-
#
|
|
27
|
+
# Get inductance.
|
|
24
28
|
cName = Gogh.Gauss.GetCoilList()[0]
|
|
25
29
|
l = Gogh.Gauss.GetL(cName, cName)
|
|
26
30
|
return l # F
|
|
@@ -28,7 +32,7 @@ def inductance(Femtet):
|
|
|
28
32
|
|
|
29
33
|
if __name__ == '__main__':
|
|
30
34
|
|
|
31
|
-
#
|
|
35
|
+
# Define mathematical optimization object.
|
|
32
36
|
opt = OptunaOptimizer(
|
|
33
37
|
sampler_class=BoTorchSampler,
|
|
34
38
|
sampler_kwargs=dict(
|
|
@@ -36,20 +40,19 @@ if __name__ == '__main__':
|
|
|
36
40
|
)
|
|
37
41
|
)
|
|
38
42
|
|
|
39
|
-
#
|
|
40
|
-
femopt = FEMOpt(opt=opt)
|
|
43
|
+
# Define FEMOpt object (This process integrates mathematical optimization and FEM.).
|
|
44
|
+
femopt = FEMOpt(opt=opt)
|
|
41
45
|
|
|
42
|
-
#
|
|
43
|
-
femopt.add_parameter("h", 3, lower_bound=1.5, upper_bound=6
|
|
44
|
-
femopt.add_parameter("r", 5, lower_bound=1, upper_bound=10
|
|
45
|
-
femopt.add_parameter("n", 3, lower_bound=1, upper_bound=5
|
|
46
|
+
# Add design variables (Use variable names set in Femtet) to the optimization problem.
|
|
47
|
+
femopt.add_parameter("h", 3, lower_bound=1.5, upper_bound=6)
|
|
48
|
+
femopt.add_parameter("r", 5, lower_bound=1, upper_bound=10)
|
|
49
|
+
femopt.add_parameter("n", 3, lower_bound=1, upper_bound=5)
|
|
46
50
|
|
|
47
|
-
#
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
)
|
|
51
|
+
# Add objective to the optimization problem.
|
|
52
|
+
# The target inductance value is 0.1 uF.
|
|
53
|
+
femopt.add_objective(inductance, name='self-inductance', direction=0.1e-06)
|
|
51
54
|
|
|
52
|
-
#
|
|
55
|
+
# Run optimization.
|
|
53
56
|
femopt.set_random_seed(42)
|
|
54
57
|
femopt.optimize(n_trials=20)
|
|
55
58
|
femopt.terminate_all()
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
"""Single-objective optimization: Resonant frequency of a circular patch antenna
|
|
2
|
+
|
|
3
|
+
Using Femtet’s electromagnetic wave analysis solver,
|
|
4
|
+
we explain an example of setting the resonant frequency
|
|
5
|
+
of a circular patch antenna to a specific value.
|
|
6
|
+
"""
|
|
1
7
|
from time import sleep
|
|
2
8
|
|
|
3
9
|
import numpy as np
|
|
@@ -8,9 +14,8 @@ from optuna.integration.botorch import BoTorchSampler
|
|
|
8
14
|
from pyfemtet.opt import OptunaOptimizer, FEMOpt
|
|
9
15
|
|
|
10
16
|
|
|
11
|
-
|
|
12
17
|
class SParameterCalculator:
|
|
13
|
-
"""S
|
|
18
|
+
"""This class is for calculating S-parameters and resonance frequencies."""
|
|
14
19
|
|
|
15
20
|
def __init__(self):
|
|
16
21
|
self.freq = []
|
|
@@ -20,51 +25,55 @@ class SParameterCalculator:
|
|
|
20
25
|
self.minimum_S = None
|
|
21
26
|
|
|
22
27
|
def get_result_from_Femtet(self, Femtet):
|
|
23
|
-
"""
|
|
28
|
+
"""Obtain the relationship between frequency and S-parameter from the Femtet analysis results."""
|
|
24
29
|
|
|
25
|
-
#
|
|
30
|
+
# Preparation
|
|
26
31
|
Femtet.OpenCurrentResult(True)
|
|
27
32
|
Gogh = Femtet.Gogh
|
|
28
33
|
|
|
29
|
-
#
|
|
34
|
+
# Obtain the frequency and S(1,1) for each mode
|
|
30
35
|
mode = 0
|
|
31
36
|
freq_list = []
|
|
32
37
|
dB_S_list = []
|
|
33
|
-
for mode in tqdm(range(Gogh.Hertz.nMode), '
|
|
34
|
-
# Femtet
|
|
38
|
+
for mode in tqdm(range(Gogh.Hertz.nMode), 'Obtaining frequency and S-parameter'):
|
|
39
|
+
# Femtet result screen mode settings
|
|
35
40
|
Gogh.Hertz.Mode = mode
|
|
36
41
|
sleep(0.01)
|
|
37
|
-
#
|
|
42
|
+
# Get frequency
|
|
38
43
|
freq = Gogh.Hertz.GetFreq().Real
|
|
39
|
-
# S
|
|
44
|
+
# Get S-parameters
|
|
40
45
|
comp_S = Gogh.Hertz.GetSMatrix(0, 0)
|
|
41
46
|
norm = np.linalg.norm((comp_S.Real, comp_S.Imag))
|
|
42
47
|
dB_S = 20 * np.log10(norm)
|
|
43
|
-
#
|
|
48
|
+
# Get results
|
|
44
49
|
freq_list.append(freq)
|
|
45
50
|
dB_S_list.append(dB_S)
|
|
46
51
|
self.freq = freq_list
|
|
47
52
|
self.S = dB_S_list
|
|
48
53
|
|
|
49
54
|
def calc_resonance_frequency(self):
|
|
50
|
-
"""
|
|
55
|
+
"""Compute the frequency that gives the first peak for S-parameter."""
|
|
51
56
|
x = -np.array(self.S)
|
|
52
57
|
peaks, _ = find_peaks(x, height=None, threshold=None, distance=None, prominence=0.5, width=None, wlen=None, rel_height=0.5, plateau_size=None)
|
|
53
58
|
from pyfemtet.core import SolveError
|
|
54
59
|
if len(peaks) == 0:
|
|
55
|
-
raise SolveError('
|
|
60
|
+
raise SolveError('No peaks detected.')
|
|
56
61
|
self.resonance_frequency = self.freq[peaks[0]]
|
|
57
62
|
self.minimum_S = self.S[peaks[0]]
|
|
58
63
|
|
|
59
64
|
def get_resonance_frequency(self, Femtet):
|
|
60
|
-
"""
|
|
61
|
-
|
|
62
|
-
Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
|
|
63
|
-
目的関数は第一引数に Femtet インスタンスを取る必要があります。
|
|
65
|
+
"""Calculate the resonant frequency.
|
|
64
66
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
Note:
|
|
68
|
+
The objective or constraint function
|
|
69
|
+
must take a Femtet as its first argument
|
|
70
|
+
and must return a single float.
|
|
67
71
|
|
|
72
|
+
Params:
|
|
73
|
+
Femtet: An instance for using Femtet macros. For more information, see "Femtet Macro Help / CFemtet Class".
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
float: A resonance frequency.
|
|
68
77
|
"""
|
|
69
78
|
self.get_result_from_Femtet(Femtet)
|
|
70
79
|
self.calc_resonance_frequency()
|
|
@@ -73,14 +82,16 @@ class SParameterCalculator:
|
|
|
73
82
|
|
|
74
83
|
|
|
75
84
|
def antenna_is_smaller_than_substrate(Femtet):
|
|
76
|
-
"""
|
|
77
|
-
|
|
78
|
-
Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
|
|
79
|
-
拘束関数は第一引数に Femtet インスタンスを取る必要があります。
|
|
85
|
+
"""Calculate the relationship between antenna size and board size.
|
|
80
86
|
|
|
81
|
-
|
|
82
|
-
|
|
87
|
+
This function is used to constrain the model
|
|
88
|
+
from breaking down while changing parameters.
|
|
83
89
|
|
|
90
|
+
Params:
|
|
91
|
+
Femtet: An instance for using Femtet macros.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
float: Difference between the board size and antenna size. Must be equal to or grater than 1 mm.
|
|
84
95
|
"""
|
|
85
96
|
ant_r = Femtet.GetVariableValue('ant_r')
|
|
86
97
|
Sx = Femtet.GetVariableValue('sx')
|
|
@@ -88,14 +99,16 @@ def antenna_is_smaller_than_substrate(Femtet):
|
|
|
88
99
|
|
|
89
100
|
|
|
90
101
|
def port_is_inside_antenna(Femtet):
|
|
91
|
-
"""
|
|
92
|
-
|
|
93
|
-
Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
|
|
94
|
-
拘束関数は第一引数に Femtet インスタンスを取る必要があります。
|
|
102
|
+
"""Calculate the relationship between the feed port location and antenna size.
|
|
95
103
|
|
|
96
|
-
|
|
97
|
-
|
|
104
|
+
This function is used to constrain the model
|
|
105
|
+
from breaking down while changing parameters.
|
|
98
106
|
|
|
107
|
+
Params:
|
|
108
|
+
Femtet: An instance for using Femtet macros.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
float: Difference between the antenna edge and the position of the feed port. Must be equal to or grater than 1 mm.
|
|
99
112
|
"""
|
|
100
113
|
ant_r = Femtet.GetVariableValue('ant_r')
|
|
101
114
|
xf = Femtet.GetVariableValue('xf')
|
|
@@ -103,10 +116,10 @@ def port_is_inside_antenna(Femtet):
|
|
|
103
116
|
|
|
104
117
|
|
|
105
118
|
if __name__ == '__main__':
|
|
106
|
-
# S
|
|
119
|
+
# Define the object for calculating S-parameters and resonance frequencies.
|
|
107
120
|
s = SParameterCalculator()
|
|
108
121
|
|
|
109
|
-
#
|
|
122
|
+
# Define mathematical optimization object.
|
|
110
123
|
opt = OptunaOptimizer(
|
|
111
124
|
sampler_class=BoTorchSampler,
|
|
112
125
|
sampler_kwargs=dict(
|
|
@@ -114,22 +127,21 @@ if __name__ == '__main__':
|
|
|
114
127
|
)
|
|
115
128
|
)
|
|
116
129
|
|
|
117
|
-
#
|
|
118
|
-
femopt = FEMOpt(
|
|
119
|
-
opt=opt,
|
|
120
|
-
) # ここで起動している Femtet が紐づけされます
|
|
130
|
+
# Define FEMOpt object (This process integrates mathematical optimization and FEM.).
|
|
131
|
+
femopt = FEMOpt(opt=opt)
|
|
121
132
|
|
|
122
|
-
#
|
|
123
|
-
femopt.add_parameter('ant_r', 10, 5, 20
|
|
124
|
-
femopt.add_parameter('sx', 50, 40, 60
|
|
125
|
-
femopt.add_parameter('xf', 5, 1, 20
|
|
126
|
-
|
|
127
|
-
#
|
|
128
|
-
femopt.add_constraint(antenna_is_smaller_than_substrate, '
|
|
129
|
-
femopt.add_constraint(port_is_inside_antenna, '
|
|
130
|
-
|
|
131
|
-
#
|
|
132
|
-
|
|
133
|
+
# Add design variables (Use variable names set in Femtet) to the optimization problem.
|
|
134
|
+
femopt.add_parameter('ant_r', 10, 5, 20)
|
|
135
|
+
femopt.add_parameter('sx', 50, 40, 60)
|
|
136
|
+
femopt.add_parameter('xf', 5, 1, 20)
|
|
137
|
+
|
|
138
|
+
# Add constraint to the optimization problem.
|
|
139
|
+
femopt.add_constraint(antenna_is_smaller_than_substrate, 'board_antenna_clearance', lower_bound=1)
|
|
140
|
+
femopt.add_constraint(port_is_inside_antenna, 'antenna_port_clearance', lower_bound=1)
|
|
141
|
+
|
|
142
|
+
# Add objective to the optimization problem.
|
|
143
|
+
# The target frequency is 3 GHz.
|
|
144
|
+
femopt.add_objective(s.get_resonance_frequency, 'First_resonant_frequency(GHz)', direction=3.0)
|
|
133
145
|
|
|
134
146
|
femopt.set_random_seed(42)
|
|
135
147
|
femopt.optimize(n_trials=20)
|
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Parallel computing / Multi-objective optimization: heating element on board
|
|
2
2
|
|
|
3
|
-
wat_ex14_parametric.femprj
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Perform thermal conduction analysis on wat_ex14_parametric.femprj
|
|
4
|
+
and search for board dimensions and chip placement dimensions that
|
|
5
|
+
minimize the board dimensions while minimizing the temperature rise
|
|
6
|
+
due to chip heat generation.
|
|
7
7
|
"""
|
|
8
|
-
|
|
9
8
|
from pyfemtet.opt import FEMOpt
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
def max_temperature(Femtet, body_name):
|
|
13
|
-
"""
|
|
12
|
+
"""Get the maximum temperature of the chip.
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
Note:
|
|
15
|
+
The objective or constraint function
|
|
16
|
+
must take a Femtet as its first argument
|
|
17
|
+
and must return a single float.
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
Params:
|
|
20
|
+
Femtet: An instance for using Femtet macros. For more information, see "Femtet Macro Help / CFemtet Class".
|
|
20
21
|
|
|
22
|
+
Returns:
|
|
23
|
+
float: Max-temperature.
|
|
21
24
|
"""
|
|
22
25
|
Gogh = Femtet.Gogh
|
|
23
26
|
|
|
@@ -27,14 +30,13 @@ def max_temperature(Femtet, body_name):
|
|
|
27
30
|
|
|
28
31
|
|
|
29
32
|
def substrate_size(Femtet):
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
|
|
33
|
-
目的関数は第一引数に Femtet インスタンスを取る必要があります。
|
|
34
|
-
|
|
35
|
-
subs_w * subs_d : XY 平面における基板の占有面積です。
|
|
36
|
-
目的関数は単一の float を返す必要があります。
|
|
33
|
+
"""Calculate the substrate size.
|
|
37
34
|
|
|
35
|
+
Params:
|
|
36
|
+
Femtet: An instance for using Femtet macros. For more information, see "Femtet Macro Help / CFemtet Class".
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
float: The area occupied by the board in the XY plane.
|
|
38
40
|
"""
|
|
39
41
|
subs_w = Femtet.GetVariableValue('substrate_w')
|
|
40
42
|
subs_d = Femtet.GetVariableValue('substrate_d')
|
|
@@ -44,20 +46,20 @@ def substrate_size(Femtet):
|
|
|
44
46
|
|
|
45
47
|
if __name__ == '__main__':
|
|
46
48
|
|
|
47
|
-
#
|
|
49
|
+
# Define FEMOpt object (This process integrates mathematical optimization and FEM.).
|
|
48
50
|
femopt = FEMOpt()
|
|
49
51
|
|
|
50
|
-
#
|
|
51
|
-
femopt.add_parameter("substrate_w", 40, lower_bound=22, upper_bound=40
|
|
52
|
-
femopt.add_parameter("substrate_d", 60, lower_bound=33, upper_bound=60
|
|
52
|
+
# Add design variables (Use variable names set in Femtet) to the optimization problem.
|
|
53
|
+
femopt.add_parameter("substrate_w", 40, lower_bound=22, upper_bound=40)
|
|
54
|
+
femopt.add_parameter("substrate_d", 60, lower_bound=33, upper_bound=60)
|
|
53
55
|
|
|
54
|
-
#
|
|
55
|
-
femopt.add_objective(max_temperature, name='
|
|
56
|
-
femopt.add_objective(max_temperature, name='
|
|
57
|
-
femopt.add_objective(substrate_size, name='
|
|
56
|
+
# Add objective to the optimization problem.
|
|
57
|
+
femopt.add_objective(max_temperature, name='main chip temp.', args=('MAINCHIP',))
|
|
58
|
+
femopt.add_objective(max_temperature, name='sub chip temp.', args=('SUBCHIP',))
|
|
59
|
+
femopt.add_objective(substrate_size, name='substrate size')
|
|
58
60
|
|
|
59
|
-
#
|
|
61
|
+
# Run optimization.
|
|
60
62
|
femopt.set_random_seed(42)
|
|
61
|
-
# femopt.
|
|
62
|
-
femopt.optimize(n_trials=20, n_parallel=3) #
|
|
63
|
+
# femopt.optimize(n_trials=20)
|
|
64
|
+
femopt.optimize(n_trials=20, n_parallel=3) # Change only this line.
|
|
63
65
|
femopt.terminate_all()
|
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Multi-objective optimization: heating element on board
|
|
2
2
|
|
|
3
|
-
wat_ex14_parametric.femprj
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Perform thermal conduction analysis on wat_ex14_parametric.femprj
|
|
4
|
+
and search for board dimensions and chip placement dimensions that
|
|
5
|
+
minimize the board dimensions while minimizing the temperature rise
|
|
6
|
+
due to chip heat generation.
|
|
7
7
|
"""
|
|
8
|
-
|
|
9
8
|
from pyfemtet.opt import FEMOpt
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
def max_temperature(Femtet, body_name):
|
|
13
|
-
"""
|
|
12
|
+
"""Get the maximum temperature of the chip.
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
Note:
|
|
15
|
+
The objective or constraint function
|
|
16
|
+
must take a Femtet as its first argument
|
|
17
|
+
and must return a single float.
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
Params:
|
|
20
|
+
Femtet: An instance for using Femtet macros. For more information, see "Femtet Macro Help / CFemtet Class".
|
|
20
21
|
|
|
22
|
+
Returns:
|
|
23
|
+
float: Max-temperature.
|
|
21
24
|
"""
|
|
22
25
|
Gogh = Femtet.Gogh
|
|
23
26
|
|
|
@@ -27,14 +30,13 @@ def max_temperature(Femtet, body_name):
|
|
|
27
30
|
|
|
28
31
|
|
|
29
32
|
def substrate_size(Femtet):
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
Femtet : マクロを使用するためのインスタンスです。詳しくは "Femtet マクロヘルプ / CFemtet クラス" をご覧ください。
|
|
33
|
-
目的関数は第一引数に Femtet インスタンスを取る必要があります。
|
|
34
|
-
|
|
35
|
-
subs_w * subs_d : XY 平面における基板の占有面積です。
|
|
36
|
-
目的関数は単一の float を返す必要があります。
|
|
33
|
+
"""Calculate the substrate size.
|
|
37
34
|
|
|
35
|
+
Params:
|
|
36
|
+
Femtet: An instance for using Femtet macros. For more information, see "Femtet Macro Help / CFemtet Class".
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
float: The area occupied by the board in the XY plane.
|
|
38
40
|
"""
|
|
39
41
|
subs_w = Femtet.GetVariableValue('substrate_w')
|
|
40
42
|
subs_d = Femtet.GetVariableValue('substrate_d')
|
|
@@ -44,19 +46,19 @@ def substrate_size(Femtet):
|
|
|
44
46
|
|
|
45
47
|
if __name__ == '__main__':
|
|
46
48
|
|
|
47
|
-
#
|
|
49
|
+
# Define FEMOpt object (This process integrates mathematical optimization and FEM.).
|
|
48
50
|
femopt = FEMOpt()
|
|
49
51
|
|
|
50
|
-
#
|
|
51
|
-
femopt.add_parameter("substrate_w", 40, lower_bound=22, upper_bound=40
|
|
52
|
-
femopt.add_parameter("substrate_d", 60, lower_bound=33, upper_bound=60
|
|
52
|
+
# Add design variables (Use variable names set in Femtet) to the optimization problem.
|
|
53
|
+
femopt.add_parameter("substrate_w", 40, lower_bound=22, upper_bound=40)
|
|
54
|
+
femopt.add_parameter("substrate_d", 60, lower_bound=33, upper_bound=60)
|
|
53
55
|
|
|
54
|
-
#
|
|
55
|
-
femopt.add_objective(max_temperature, name='
|
|
56
|
-
femopt.add_objective(max_temperature, name='
|
|
57
|
-
femopt.add_objective(substrate_size, name='
|
|
56
|
+
# Add objective to the optimization problem.
|
|
57
|
+
femopt.add_objective(max_temperature, name='main chip temp.', args=('MAINCHIP',))
|
|
58
|
+
femopt.add_objective(max_temperature, name='sub chip temp.', args=('SUBCHIP',))
|
|
59
|
+
femopt.add_objective(substrate_size, name='substrate size')
|
|
58
60
|
|
|
59
|
-
#
|
|
61
|
+
# Run optimization.
|
|
60
62
|
femopt.set_random_seed(42)
|
|
61
63
|
femopt.optimize(n_trials=20)
|
|
62
64
|
femopt.terminate_all()
|
pyfemtet/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.4.
|
|
1
|
+
__version__ = "0.4.2"
|
pyfemtet/opt/_femopt_core.py
CHANGED
|
@@ -374,7 +374,6 @@ class History:
|
|
|
374
374
|
prm_names = []
|
|
375
375
|
obj_names = []
|
|
376
376
|
cns_names = []
|
|
377
|
-
local_data = pd.DataFrame()
|
|
378
377
|
is_restart = False
|
|
379
378
|
is_processing = False
|
|
380
379
|
_future = None
|
|
@@ -397,6 +396,9 @@ class History:
|
|
|
397
396
|
self.cns_names = cns_names
|
|
398
397
|
self.additional_metadata = additional_metadata or ''
|
|
399
398
|
|
|
399
|
+
# 初期化
|
|
400
|
+
self.local_data = pd.DataFrame()
|
|
401
|
+
|
|
400
402
|
# 最適化実行中かどうか
|
|
401
403
|
self.is_processing = client is not None
|
|
402
404
|
|
|
@@ -126,7 +126,7 @@ class FemtetInterface(FEMInterface):
|
|
|
126
126
|
sleep(1)
|
|
127
127
|
sleep(1)
|
|
128
128
|
|
|
129
|
-
except AttributeError: # already dead
|
|
129
|
+
except (AttributeError, OSError): # already dead
|
|
130
130
|
pass
|
|
131
131
|
# CoUninitialize() # Win32 exception occurred releasing IUnknown at 0x0000022427692748
|
|
132
132
|
|
pyfemtet/opt/opt/_optuna.py
CHANGED
|
@@ -155,6 +155,12 @@ class OptunaOptimizer(AbstractOptimizer):
|
|
|
155
155
|
|
|
156
156
|
# add_initial_parameter で追加された初期値
|
|
157
157
|
for prm, prm_set_name in self.additional_initial_parameter:
|
|
158
|
+
if type(prm) is dict:
|
|
159
|
+
assert prm.keys() == params.keys(), '設定されたパラメータ名と add_init_parameter で追加されたパラメータ名が一致しません。'
|
|
160
|
+
else:
|
|
161
|
+
assert len(prm) == len(params.keys()), '設定されたパラメータ数と add_init_parameter で追加されたパラメータ数が一致しません。'
|
|
162
|
+
prm = dict(zip(params.keys(), prm))
|
|
163
|
+
|
|
158
164
|
self.study.enqueue_trial(
|
|
159
165
|
prm,
|
|
160
166
|
user_attrs={"message": prm_set_name}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pyfemtet
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.2
|
|
4
4
|
Summary: Design parameter optimization using Femtet.
|
|
5
5
|
Home-page: https://github.com/pyfemtet/pyfemtet
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -35,7 +35,8 @@ Description-Content-Type: text/markdown
|
|
|
35
35
|
PyFemtet is the extension package for Femtet with Python.
|
|
36
36
|
|
|
37
37
|
- Femtet Website: https://www.muratasoftware.com/
|
|
38
|
-
- Documentation: https://pyfemtet.
|
|
38
|
+
- Documentation (English): https://pyfemtet.readthedocs.io/en/stable/
|
|
39
|
+
- ドキュメント(日本語): https://pyfemtet.readthedocs.io/jp/stable/
|
|
39
40
|
- Source code: https://github.com/pyfemtet/pyfemtet
|
|
40
41
|
- Bug reports: https://github.com/pyfemtet/pyfemtet/issues
|
|
41
42
|
|
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.femprj,sha256=JfzRl_C72doQFJO0hJq8BTX6TSFB_Skh2C4l-kiWoXY,170268
|
|
2
2
|
pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.prt,sha256=3okHLeMdslrRA_wkhppZtxIe-2-ZPMfNqWCdQwUV31o,226626
|
|
3
|
-
pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.py,sha256=
|
|
3
|
+
pyfemtet/FemtetPJTSample/NX_ex01/NX_ex01.py,sha256=YJ3nszFLYfd7m4CaQ6ZG9DS_aHdgQIdSHCopmGakBWE,3980
|
|
4
4
|
pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.SLDPRT,sha256=U0Yh559Fygd5sp013NwwhZ5vRA8D_E6kmiUXDP5isJQ,83094
|
|
5
5
|
pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.femprj,sha256=omF3QvS8gzi_fSr2yobbVVaspR2YzDiUcMYvei-8ZmQ,155307
|
|
6
|
-
pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.py,sha256=
|
|
6
|
+
pyfemtet/FemtetPJTSample/Sldworks_ex01/Sldworks_ex01.py,sha256=Irv3nNXkQpCGZgy41IcWwGKVddW6oOziwe6EyantUn4,4182
|
|
7
7
|
pyfemtet/FemtetPJTSample/gau_ex08_parametric.femprj,sha256=EguPWZHcwZMMX8cX1rZhLc2Pr__P4PR8RF4_n4uxDaI,268761
|
|
8
|
-
pyfemtet/FemtetPJTSample/gau_ex08_parametric.py,sha256=
|
|
8
|
+
pyfemtet/FemtetPJTSample/gau_ex08_parametric.py,sha256=B-ibQDodTLcJ-wc8sNVb1Dxae2ksL6Fns3uNBRU7s5g,1799
|
|
9
9
|
pyfemtet/FemtetPJTSample/her_ex40_parametric.femprj,sha256=ZFQ1Rl31dmLhYW__yahRYLejKw5DdccPGdpg67CWlS0,126336
|
|
10
|
-
pyfemtet/FemtetPJTSample/her_ex40_parametric.py,sha256=
|
|
11
|
-
pyfemtet/FemtetPJTSample/wat_ex14_parallel_parametric.py,sha256=
|
|
10
|
+
pyfemtet/FemtetPJTSample/her_ex40_parametric.py,sha256=B5PQoh71Q3KN2CyLU1gP_Yh9g3o6poi0HFasWzHQ_vk,5144
|
|
11
|
+
pyfemtet/FemtetPJTSample/wat_ex14_parallel_parametric.py,sha256=UfhJffuXyhzdIWNpOrpV6xLTK1fuVvgyhlyg4Rp-628,2148
|
|
12
12
|
pyfemtet/FemtetPJTSample/wat_ex14_parametric.femprj,sha256=pxacKe0NPNUPAcxqo2cATFApsMKiVt2g2e_FOk4fpjA,172895
|
|
13
|
-
pyfemtet/FemtetPJTSample/wat_ex14_parametric.py,sha256=
|
|
14
|
-
pyfemtet/__init__.py,sha256=
|
|
13
|
+
pyfemtet/FemtetPJTSample/wat_ex14_parametric.py,sha256=LGbWxCek0Ad2YrDCKykiQkE3aIypM4g8P3mLd_2anEE,2052
|
|
14
|
+
pyfemtet/__init__.py,sha256=Y-I6FXKes4hB39WcBm3HZ1OCtCWiErPB6YZ-YSgexuE,21
|
|
15
15
|
pyfemtet/core.py,sha256=3lqfBGJ5IuKz2Nqj5pRo7YQqKwx_0ZDL72u95Ur_1p0,1386
|
|
16
16
|
pyfemtet/dispatch_extensions.py,sha256=MhWiUXVt2Cq8vDeajMK4SrajjiAmb4m2fK8gXwHLrWA,16177
|
|
17
17
|
pyfemtet/logger.py,sha256=JYD0FvzijMS2NvZN7VT7vZA5hqtHEkvS93AHlIMDePw,2507
|
|
18
18
|
pyfemtet/opt/__init__.py,sha256=_P8unESvqCRD5pmuo6-5yo7BbrPi7c0aE6UZpqUD-_I,596
|
|
19
19
|
pyfemtet/opt/_femopt.py,sha256=mkawFpY0UXENeJYuH2mkLpNgUncIWY3QYMHUj-lL-4o,20602
|
|
20
|
-
pyfemtet/opt/_femopt_core.py,sha256=
|
|
20
|
+
pyfemtet/opt/_femopt_core.py,sha256=bCSb1XvqeEfX6T2Z24eLI8nIa82omy8_Pnf5HXEmEsQ,24361
|
|
21
21
|
pyfemtet/opt/interface/__init__.py,sha256=qz5BszPuU3jZIoDnPjkPDAgvgHLlx1sYhuqh5ID798k,480
|
|
22
22
|
pyfemtet/opt/interface/_base.py,sha256=lDjdvKYmBMxSc7SfoWSu91qVijGaQ2Ng-0C7z_f4eFM,2079
|
|
23
|
-
pyfemtet/opt/interface/_femtet.py,sha256=
|
|
23
|
+
pyfemtet/opt/interface/_femtet.py,sha256=VzwJ4srviYIb9X4HNDx1_W2w2xUpNYBxa928qBZpdAc,24439
|
|
24
24
|
pyfemtet/opt/interface/_femtet_with_nx/__init__.py,sha256=-6W2g2FDEcKzGHmI5KAKQe-4U5jDpMj0CXuma-GZca0,83
|
|
25
25
|
pyfemtet/opt/interface/_femtet_with_nx/_interface.py,sha256=OU0nYmePEVKsjplokisfyuaepB-PkL6E-cwCiIhXNS0,4192
|
|
26
26
|
pyfemtet/opt/interface/_femtet_with_nx/update_model.py,sha256=t0AB7mKY7rmrI_9stP1-5qhzmugEQ19DnZ4CCrCdTSw,2856
|
|
27
27
|
pyfemtet/opt/interface/_femtet_with_sldworks.py,sha256=t3CZ-ni2kXBpbCdr9C5xEc2GHgW8LscJNMV97wJRnTk,6515
|
|
28
28
|
pyfemtet/opt/opt/__init__.py,sha256=eQh-7PJN2YEUbHZnjinbeIyb0bk1wSh76TaEAa2l8SU,191
|
|
29
29
|
pyfemtet/opt/opt/_base.py,sha256=aO71a8lIHHb5xIEoIu7oO_maynrNIEHfwt4uFFOUY58,7101
|
|
30
|
-
pyfemtet/opt/opt/_optuna.py,sha256=
|
|
30
|
+
pyfemtet/opt/opt/_optuna.py,sha256=TWtp9auU6GBWtEJVOuo8aWSvLcCHCUNUyOQRnqyln4I,9996
|
|
31
31
|
pyfemtet/opt/visualization/__init__.py,sha256=PUCHoZnuZrHjTd0QQQBgzWkCpKY2noBPTvi-lyvxQyw,193
|
|
32
32
|
pyfemtet/opt/visualization/_graphs.py,sha256=G6HaoGD3GpuwXih1nuTeFQMD0zv4jrhogedP9hxaG1c,5306
|
|
33
33
|
pyfemtet/opt/visualization/_monitor.py,sha256=WcbuMjnp5LiybwCYBnJ78ju2h7sBJJtqUf1CbUacfXI,42104
|
|
34
|
-
pyfemtet-0.4.
|
|
35
|
-
pyfemtet-0.4.
|
|
36
|
-
pyfemtet-0.4.
|
|
37
|
-
pyfemtet-0.4.
|
|
38
|
-
pyfemtet-0.4.
|
|
34
|
+
pyfemtet-0.4.2.dist-info/LICENSE,sha256=sVQBhyoglGJUu65-BP3iR6ujORI6YgEU2Qm-V4fGlOA,1485
|
|
35
|
+
pyfemtet-0.4.2.dist-info/METADATA,sha256=Dl3D0ipVFiUvEwcDOMbp5c8N3gPvLzjvg7Wuc7ahrCA,1848
|
|
36
|
+
pyfemtet-0.4.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
37
|
+
pyfemtet-0.4.2.dist-info/entry_points.txt,sha256=E_NUq8BEuKLM3z6Ou0sh6HyvaKE5O6NBDlmO-wgEGaQ,67
|
|
38
|
+
pyfemtet-0.4.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|