Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
2662803
truss-braced structure model
kanekosh May 20, 2025
ed9dcbb
renamed truss to strut
kanekosh May 20, 2025
4e0c5ba
modified AS group for strut-braced system
kanekosh May 21, 2025
f067b89
added buckling components
kanekosh Jul 3, 2025
36fddef
added safety factor for buckling stress
kanekosh Jul 3, 2025
fc02b90
added Euler column buckling for strut
kanekosh Jul 16, 2025
230fb36
support pin boundary condition for strut root
kanekosh Jul 16, 2025
96962df
pin and ball boundary conditions for strut root
kanekosh Jul 16, 2025
e400ce5
added pin joint; renamed previous joint to ball joint
kanekosh Jul 16, 2025
42d5a05
fixed Euler buckling derivative
kanekosh Jul 17, 2025
1141930
refactored wing-strut joint definitions
kanekosh Jul 30, 2025
b4f8ef0
working on jury strut, code runs but results seem wrong
kanekosh Aug 1, 2025
f7aa2d9
fixed strut nodal coordinate computation
kanekosh Aug 4, 2025
086f271
working on jury FEM, something is wrong
kanekosh Aug 5, 2025
9f87f03
jury strut works for aerostructural analysis
kanekosh Aug 8, 2025
c513559
bugfix for conventional
kanekosh Aug 18, 2025
0fe4a71
minor fix for old python
kanekosh Aug 18, 2025
c609a34
more very minor fix
kanekosh Aug 18, 2025
8fcacb2
added column length factor for Euler buckling
kanekosh Aug 26, 2025
fc1cb4f
Skip a failing test on OM 3.40 (#467)
kanekosh Sep 18, 2025
33685eb
Switch to Ruff linting and formatting (#466)
kanekosh Sep 18, 2025
ceb7c90
Composite material model and Tsai-Wu failure criterion; introduce saf…
vishhwamehta Sep 29, 2025
ccf2ffa
Merge branch 'main' of github.com:mdolab/OpenAeroStruct into truss-br…
kanekosh Oct 2, 2025
6f37fe3
fix local buckling for composite
kanekosh Oct 9, 2025
fc21057
mute debug print
kanekosh Oct 10, 2025
6ab77d3
Truss braced FEM bugfix for Windows OS (#4)
kanekosh Oct 30, 2025
23c6985
make CD0 OM variable so it can be computed upstream
kanekosh Oct 31, 2025
c2558d7
add climb Breguet fuel burn
kanekosh Nov 7, 2025
cb4a440
added fuel tank volume fraction
kanekosh Nov 19, 2025
3ede87a
style
kanekosh Nov 19, 2025
46e954c
move fuel volume factor to wingboxfuelvoldelta
kanekosh Nov 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions .flake8

This file was deleted.

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# Ignore OpenMDAO reports folders
**/reports/

# pre-commit config file that should be manually copied from the mdolab/.github repo.
.pre-commit-config.yaml

*.pyc
*.py~
*.db
Expand Down
3 changes: 1 addition & 2 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ build:
tools:
python: "3.11"

sphinx:
configuration: openaerostruct/docs/conf.py


python:
install:
Expand Down
2 changes: 1 addition & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ preferred-citation:
number: "4"
pages: "1815--1827"
date: "2018-04"
doi: "10.1007/s00158-018-1912-8"
doi: "10.1007/s00158-018-1912-8"
2 changes: 1 addition & 1 deletion openaerostruct/aerodynamics/aero_groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def initialize(self):
"compressible",
types=bool,
default=False,
desc="Turns on compressibility correction for moderate Mach number " "flows. Defaults to False.",
desc="Turns on compressibility correction for moderate Mach number flows. Defaults to False.",
)

def setup(self):
Expand Down
1 change: 1 addition & 0 deletions openaerostruct/aerodynamics/compressible_states.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Class definition for CompressibleVLMStates.
"""

import openmdao.api as om

from openaerostruct.aerodynamics.get_vectors import GetVectors
Expand Down
2 changes: 1 addition & 1 deletion openaerostruct/aerodynamics/functionals.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,5 @@ def setup(self):
)

self.add_subsystem(
"CD", TotalDrag(surface=surface), promotes_inputs=["CDv", "CDi", "CDw"], promotes_outputs=["CD"]
"CD", TotalDrag(surface=surface), promotes_inputs=["CDv", "CDi", "CDw", "CD0"], promotes_outputs=["CD"]
)
2 changes: 1 addition & 1 deletion openaerostruct/aerodynamics/geometry.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class VLMGeometry(om.ExplicitComponent):
Some of the quantities, like `normals`, are used to compute the RHS
of the AIC linear system.

parameters
Parameters
----------
def_mesh[nx, ny, 3] : numpy array
Array defining the nodal coordinates of the lifting surface.
Expand Down
2 changes: 1 addition & 1 deletion openaerostruct/aerodynamics/lift_drag.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class LiftDrag(om.ExplicitComponent):
Calculate total lift and drag in force units based on section forces.
This is for one given lifting surface.

parameters
Parameters
----------
sec_forces[nx-1, ny-1, 3] : numpy array
Contains the sectional forces acting on each panel.
Expand Down
1 change: 1 addition & 0 deletions openaerostruct/aerodynamics/mesh_point_forces.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Class definition for the MeshPointForces component.
"""

import numpy as np
import openmdao.api as om

Expand Down
8 changes: 4 additions & 4 deletions openaerostruct/aerodynamics/total_drag.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
class TotalDrag(om.ExplicitComponent):
"""Calculate total drag in force units.

parameters
Parameters
----------
CDi : float
Induced coefficient of drag (CD) for the lifting surface.
Expand All @@ -26,14 +26,14 @@ def setup(self):
self.add_input("CDi", val=1.0)
self.add_input("CDv", val=1.0)
self.add_input("CDw", val=1.0)
self.add_input("CD0", val=surface["CD0"])

self.add_output("CD", val=1.0, tags=["mphys_result"])

self.CD0 = surface["CD0"]

self.declare_partials("CD", "CDi", val=1.0)
self.declare_partials("CD", "CDv", val=1.0)
self.declare_partials("CD", "CDw", val=1.0)
self.declare_partials("CD", "CD0", val=1.0)

def compute(self, inputs, outputs):
outputs["CD"] = inputs["CDi"] + inputs["CDv"] + inputs["CDw"] + self.CD0
outputs["CD"] = inputs["CDi"] + inputs["CDv"] + inputs["CDw"] + inputs["CD0"]
4 changes: 1 addition & 3 deletions openaerostruct/aerodynamics/wave_drag.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,7 @@ def compute_partials(self, inputs, partials):
ccos = np.sum(widths * panel_mid_chords)
ccos2w = np.sum(panel_mid_chords * widths**2 / lengths_spanwise)

davgdcos = (
2 * panel_mid_chords * widths / lengths_spanwise / ccos - panel_mid_chords * ccos2w / ccos**2
)
davgdcos = 2 * panel_mid_chords * widths / lengths_spanwise / ccos - panel_mid_chords * ccos2w / ccos**2
dtocdcos = (
panel_mid_chords * t_over_c / ccos
- panel_mid_chords * np.sum(panel_mid_chords * widths * t_over_c) / ccos**2
Expand Down
54 changes: 27 additions & 27 deletions openaerostruct/docs/_n2html/generate_n2_n2.html
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@
/* transition: opacity 0.25s; */
box-shadow: 3px 3px 3px 1px rgba(0, 0, 0, 0.2);
border-radius: 10px;

overflow: hidden;
}

Expand Down Expand Up @@ -487,7 +487,7 @@
.window-theme-value-info .window-body table tbody tr td {
text-align: left;
font-size: 9pt;
margin: 0;
margin: 0;
border-top: 0;
border-left: 0;
border-bottom: 1px solid #a0a0a0;
Expand All @@ -507,7 +507,7 @@
.show_value_button {
background-color: #c1c1c1;
}

.copy_value_button {
background-color: #c1c1c1;
}
Expand Down Expand Up @@ -2858,7 +2858,7 @@ <h1>Toolbar Help</h1>
</script>
<script type="text/javascript">
(function(e){if(typeof exports=="object"&&typeof module!="undefined")module.exports=
e();else if(typeof define=="function"&&define.amd)define([],e);else{var t;typeof
e();else if(typeof define=="function"&&define.amd)define([],e);else{var t;typeof
window!="undefined"?t=window:typeof global!="undefined"?t=global:typeof self!="undefined"?
t=self:t=this,t.pako=e()}})(function(){var e,t,n;return function(){function e(t,
n,i){function s(u,a){if(!n[u]){if(!t[u]){var f="function"==typeof require&&require
Expand All @@ -2867,7 +2867,7 @@ <h1>Toolbar Help</h1>
exports,function(e){var n=t[u][1][e];return s(n||e)},c,c.exports,e,t,n,i)}return n
[u].exports}for(var o="function"==typeof require&&require,u=0;u<i.length;u++)s(i
[u]);return s}return e}()({1:[function(e,t,n){"use strict";function i(e,t){return Object
.prototype.hasOwnProperty.call(e,t)}var r=typeof Uint8Array!="undefined"&&typeof
.prototype.hasOwnProperty.call(e,t)}var r=typeof Uint8Array!="undefined"&&typeof
Uint16Array!="undefined"&&typeof Int32Array!="undefined";n.assign=function(e){var t=
Array.prototype.slice.call(arguments,1);while(t.length){var n=t.shift();if(!n)continue;
if(typeof n!="object")throw new TypeError(n+"must be non-object");for(var r in n
Expand Down Expand Up @@ -2947,7 +2947,7 @@ <h1>Toolbar Help</h1>
this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0
,this.was=0}function ot(e){var t;return!e||!e.state?g:(t=e.state,e.total_in=e.total_out=
t.total=0,e.msg="",t.wrap&&(e.adler=t.wrap&1),t.mode=S,t.last=0,t.havedict=0,t.dmax=32768
,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new r.Buf32(et),t.distcode=t.distdyn=new
,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new r.Buf32(et),t.distcode=t.distdyn=new
r.Buf32(tt),t.sane=1,t.back=-1,d)}function ut(e){var t;return!e||!e.state?g:(t=e
.state,t.wsize=0,t.whave=0,t.wnext=0,ot(e))}function at(e,t){var n,r;return!e||!
e.state?g:(r=e.state,t<0?(n=0,t=-t):(n=(t>>4)+1,t<48&&(t&=15)),t&&(t<8||t>15)?g:
Expand All @@ -2958,12 +2958,12 @@ <h1>Toolbar Help</h1>
;while(t<280)e.lens[t++]=7;while(t<288)e.lens[t++]=8;u(f,e.lens,0,288,ht,0,e.work
,{bits:9}),t=0;while(t<32)e.lens[t++]=5;u(l,e.lens,0,32,pt,0,e.work,{bits:5}),ct=!1
}e.lencode=ht,e.lenbits=9,e.distcode=pt,e.distbits=5}function vt(e,t,n,i){var s,
o=e.state;return o.window===null&&(o.wsize=1<<o.wbits,o.wnext=0,o.whave=0,o.window=new
o=e.state;return o.window===null&&(o.wsize=1<<o.wbits,o.wnext=0,o.whave=0,o.window=new
r.Buf8(o.wsize)),i>=o.wsize?(r.arraySet(o.window,t,n-o.wsize,o.wsize,0),o.wnext=0
,o.whave=o.wsize):(s=o.wsize-o.wnext,s>i&&(s=i),r.arraySet(o.window,t,n-i,s,o.wnext
),i-=s,i?(r.arraySet(o.window,t,n-i,i,0),o.wnext=i,o.whave=o.wsize):(o.wnext+=s,
o.wnext===o.wsize&&(o.wnext=0),o.whave<o.wsize&&(o.whave+=s))),0}function mt(e,t
){var n,et,tt,nt,rt,st,ot,ut,at,ft,lt,ct,ht,pt,mt=0,gt,yt,bt,wt,Et,St,xt,Tt,Nt=new
){var n,et,tt,nt,rt,st,ot,ut,at,ft,lt,ct,ht,pt,mt=0,gt,yt,bt,wt,Et,St,xt,Tt,Nt=new
r.Buf8(4),Ct,kt,Lt=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!
e.output||!e.input&&e.avail_in!==0)return g;n=e.state,n.mode===D&&(n.mode=P),rt=
e.next_out,tt=e.output,ot=e.avail_out,nt=e.next_in,et=e.input,st=e.avail_in,ut=n
Expand Down Expand Up @@ -3112,7 +3112,7 @@ <h1>Toolbar Help</h1>
}},{}],11:[function(e,t,n){"use strict";function r(){this.input=null,this.next_in=0
,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0
,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}t.exports=
r},{}],"/lib/inflate.js":[function(e,t,n){"use strict";function c(e){if(!(this instanceof
r},{}],"/lib/inflate.js":[function(e,t,n){"use strict";function c(e){if(!(this instanceof
c))return new c(e);this.options=i.assign({chunkSize:16384,windowBits:0,to:""},e||
{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t
.windowBits,t.windowBits===0&&(t.windowBits=-15)),t.windowBits>=0&&t.windowBits<16&&
Expand All @@ -3121,7 +3121,7 @@ <h1>Toolbar Help</h1>
.strm=new a,this.strm.avail_out=0;var n=r.inflateInit2(this.strm,t.windowBits);if(
n!==o.Z_OK)throw new Error(u[n]);this.header=new f,r.inflateGetHeader(this.strm,
this.header);if(t.dictionary){typeof t.dictionary=="string"?t.dictionary=s.string2buf
(t.dictionary):l.call(t.dictionary)==="[object ArrayBuffer]"&&(t.dictionary=new
(t.dictionary):l.call(t.dictionary)==="[object ArrayBuffer]"&&(t.dictionary=new
Uint8Array(t.dictionary));if(t.raw){n=r.inflateSetDictionary(this.strm,t.dictionary
);if(n!==o.Z_OK)throw new Error(u[n])}}}function h(e,t){var n=new c(t);n.push(e,!0
);if(n.err)throw n.msg||u[n.err];return n.result}function p(e,t){return t=t||{},
Expand Down Expand Up @@ -3219,7 +3219,7 @@ <h1>Toolbar Help</h1>
});

/**
* Since checking for an Array's existance as well as
* Since checking for an Array's existance as well as
* length > 0 is very common, combine the two.
*/
Array.isPopulatedArray = function (arr) {
Expand Down Expand Up @@ -3330,7 +3330,7 @@ <h1>Toolbar Help</h1>
}
}

/**
/**
* Decide what object the cell will be drawn as, based on its position
* in the matrix, type, source, target, and/or other conditions.
* @param {N2MatrixCell} cell The cell to operate on.
Expand Down Expand Up @@ -3728,13 +3728,13 @@ <h1>Toolbar Help</h1>
static uncompressModel(b64str) {
const compressedData = atob(b64str);
const jsonStr = window.pako.inflate(compressedData, { to: 'string' });

/* for ( let pos = 0; pos < jsonStr.length; pos += 100) {
console.log(pos, jsonStr.substring(pos, pos+99));
} */

// JSON5 can handle Inf and NaN
return JSON5.parse(jsonStr);
return JSON5.parse(jsonStr);
}

/**
Expand Down Expand Up @@ -4882,7 +4882,7 @@ <h1>Toolbar Help</h1>
this.bringToFront(true, 2);
modalDiv.attr('style', style)
.style('z-index', N2Window.zIndex - 1)

}
else {
modalDiv.attr('style', null);
Expand Down Expand Up @@ -5007,7 +5007,7 @@ <h1>Toolbar Help</h1>
this.header.style('cursor', cursor);
this.window.style('cursor', cursor);
this.window.select('.window-close-button').style('cursor', cursor);
this.resizerDiv.selectAll('div').style('cursor', cursor);
this.resizerDiv.selectAll('div').style('cursor', cursor);

return this;
}
Expand Down Expand Up @@ -5867,7 +5867,7 @@ <h1>Toolbar Help</h1>
.attr("ry", dims.bottomRight.y * .6);
}

/**
/**
* Get the D3 selection for the appropriate group and append a filled ellipse.
* @param {Object} svgGroup Reference to SVG <g> element associated with data.
* @param {Object} dims The cell spec to use while rendering.
Expand Down Expand Up @@ -5916,7 +5916,7 @@ <h1>Toolbar Help</h1>
return ret;
}

/**
/**
* Get the D3 selection for the appropriate group and append a filled rectangle.
* @param {Object} svgGroup Reference to SVG <g> element associated with data.
* @param {Object} dims The cell spec to use while rendering.
Expand Down Expand Up @@ -5960,7 +5960,7 @@ <h1>Toolbar Help</h1>
return ret;
}

/**
/**
* Get the D3 selection for the appropriate group and append a filled arrow.
* @param {Object} svgGroup Reference to SVG <g> element associated with data.
* @param {Object} dims The cell spec to use while rendering.
Expand Down Expand Up @@ -6062,7 +6062,7 @@ <h1>Toolbar Help</h1>
.attr("height", dims.size.height * .6);
}

/**
/**
* Get the D3 selection for the appropriate group and append a filled rectangle,
* then call _renderBorder() to put a border around it.
* @param {Object} svgGroup Reference to SVG <g> element associated with data.
Expand Down Expand Up @@ -6218,7 +6218,7 @@ <h1>Toolbar Help</h1>

static makeId(srcId, tgtId = null) {
if (! tgtId || srcId == tgtId) return "node_" + srcId;

return "conn_" + srcId + "_to_" + tgtId;
}

Expand Down Expand Up @@ -6886,7 +6886,7 @@ <h1>Toolbar Help</h1>
*/
findCellByNodeId(nodeId) {
const node = this.model.nodeIds[nodeId];
let ret = {
let ret = {
'cell': undefined, // Changed to refer to a related cell if found
'exactMatch': false, // True if nodeId matches a cell
'parentMatch': false, // True if nodeId's ancestor is a cell
Expand Down Expand Up @@ -6925,7 +6925,7 @@ <h1>Toolbar Help</h1>
return ret;
}
}

// Shouldn't really get here due to zoomedElement check at top
debugInfo(`findCellByNodeId: ${debugStr} fell through all checks!`)
return ret;
Expand Down Expand Up @@ -10661,7 +10661,7 @@ <h1>Toolbar Help</h1>
}

/**
* Output a message if the value is True.
* Output a message if the value is True.
* @typedef InfoPropMessage
*/
class InfoPropMessage extends InfoPropYesNo {
Expand All @@ -10671,8 +10671,8 @@ <h1>Toolbar Help</h1>
}

/** Return message when value is True */
output(boolVal) {
return boolVal ? this.message : '';
output(boolVal) {
return boolVal ? this.message : '';
}
}

Expand Down Expand Up @@ -11072,7 +11072,7 @@ <h1>Toolbar Help</h1>
/** Toggle the active mode */
toggle() {
if (this.active) return this.deactivate();

return this.activate();
}

Expand Down
4 changes: 2 additions & 2 deletions openaerostruct/docs/_static/copybutton.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
$(document).ready(function() {
/* Add a [>>>] button on the top-right corner of code samples to hide
* the >>> and ... prompts and the output and thus make the code
* copyable.
* copyable.
* Note: This JS snippet was taken from the official python.org
* documentation site.*/
var div = $('.highlight-python .highlight,' +
'.highlight-python3 .highlight,' +
'.highlight-python3 .highlight,' +
'.highlight-pycon .highlight')
var pre = div.find('pre');

Expand Down
1 change: 1 addition & 0 deletions openaerostruct/docs/advanced_features.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ These examples show some advanced features in OpenAeroStruct.
advanced_features/customizing_prob_setup.rst
advanced_features/mphys_coupling.rst
advanced_features/stability_derivatives.rst
advanced_features/composites_walkthrough.rst
Loading