-
Notifications
You must be signed in to change notification settings - Fork 5
/
OpenMDAO.jl
101 lines (73 loc) · 3.15 KB
/
OpenMDAO.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
module OpenMDAO
using Pkg: Pkg
using OpenMDAOCore: OpenMDAOCore
using PythonCall: PythonCall
export om, make_component, DymosifiedCompWrapper
# load python api
const om = PythonCall.pynew()
const omjlcomps = PythonCall.pynew()
function __init__()
PythonCall.pycopy!(om, PythonCall.pyimport("openmdao.api"))
Pkg.add("OpenMDAOCore")
PythonCall.pycopy!(omjlcomps, PythonCall.pyimport("omjlcomps"))
end
"""
make_component(comp::OpenMDAOCore.AbstractComp)
Convinience method for creating either a `JuliaExplicitComp` or `JuliaImplicitComp`, depending on if `comp` is `<:OpenMDAOCore.AbstractExplicitComp` or `<:OpenMDAOCore.AbstractImplicitComp`, respectively.
"""
make_component
make_component(comp::OpenMDAOCore.AbstractExplicitComp) = omjlcomps.JuliaExplicitComp(jlcomp=comp)
make_component(comp::OpenMDAOCore.AbstractImplicitComp) = omjlcomps.JuliaImplicitComp(jlcomp=comp)
"""
DymosifiedCompWrapper{Tkwargs}
Wrapper type that stores a type (not an instance) of an `<:OpenMDAOCore.AbstractComp` and the non-`num_nodes` keyword arguments (if any) used to construct the instance.
# Example
```julia-repl
julia> using OpenMDAOCore: OpenMDAOCore
julia> using OpenMDAO
julia> struct FooODE <: OpenMDAOCore.AbstractExplicitComp
num_nodes::Int
a::Float64
end
julia> FooODE(; num_nodes, a) = FooODE(num_nodes, a)
FooODE
julia> dcw = OpenMDAO.DymosifiedCompWrapper(FooODE; a=8.0)
OpenMDAO.DymosifiedCompWrapper{Base.Pairs{Symbol, Float64, Tuple{Symbol}, NamedTuple{(:a,), Tuple{Float64}}}}(FooODE, Base.Pairs(:a => 8.0))
julia> comp = dcw(num_nodes=4)
Python JuliaExplicitComp: <omjlcomps.JuliaExplicitComp object at 0x7f38429333a0>
julia>
```
"""
struct DymosifiedCompWrapper{Tkwargs}
TComp::Type{<:OpenMDAOCore.AbstractComp}
kwargs::Tkwargs
end
"""
DymosifiedCompWrapper(TComp::Type{<:OpenMDAOCore.AbstractComp}; kwargs...)
Construct a wrapper to a `<:OpenMDAOCore.AbstractComp` that can be used to create a `omjlcomps.JuliaExplicitComp` or `omjlcomps.JuliaImplicitComp` by just passing a `num_nodes` argument.
# Arguments
* `TComp`: An `OpenMDAOCore.AbstractComp` type, not an instance (so `TComp = FooComp`, not `TComp = FooComp()`, analogous to the difference between `Float64` and `1.0`),
* `kwargs`: keyword arguments, other than `num_nodes`, that are needed to construct an instance of `TComp`
# Example
```julia-repl
julia> using OpenMDAOCore: OpenMDAOCore
julia> using OpenMDAO
julia> struct FooODE <: OpenMDAOCore.AbstractExplicitComp
num_nodes::Int
a::Float64
end
julia> FooODE(; num_nodes, a) = FooODE(num_nodes, a)
FooODE
julia> dcw = OpenMDAO.DymosifiedCompWrapper(FooODE; a=8.0)
OpenMDAO.DymosifiedCompWrapper{Base.Pairs{Symbol, Float64, Tuple{Symbol}, NamedTuple{(:a,), Tuple{Float64}}}}(FooODE, Base.Pairs(:a => 8.0))
julia> comp = dcw(num_nodes=4)
Python JuliaExplicitComp: <omjlcomps.JuliaExplicitComp object at 0x7f38429333a0>
julia>
```
"""
DymosifiedCompWrapper(TComp; kwargs...) = DymosifiedCompWrapper(TComp, kwargs)
function (dc::DymosifiedCompWrapper)(; num_nodes::Integer)
return make_component(dc.TComp(; num_nodes, dc.kwargs...))
end
Base.length(::DymosifiedCompWrapper) = 1
end # module