The Axial Control framework is a front end for axial and FFD-based control in Jetstream. It essentially provides the ability to set axial/xsection variable bounds for individual axial points and xsections, set common linear constraints (chord, thickness, etc.), and some additional nonlinear constraints (sweep, taper, etc.) It is currently the preferred method for general aerodynamic shape optimization problems. All of this is done through the axial.ctrl file. The axial.con file is still needed to set the degrees-of-freedom for the axial points and xsection variables. Use of the Axial Control functionality is by specifying jtstrm%axial_control = .true. (basic axial functionality must also be set with jtstrm% ffd = .true. and jtsrm% axlffd = .true.). Basic optimization using Axial Control uses the subroutines initAxlCtrlOptimize() and usrfunAxlCtrl(). However, if you are doing a case-specific optimization but still want to use the Axial Control functionality, you can use simply the geometric control elements as described below. The remainder of this page describes the nuts and bolts of the method, and the axial.ctrl input file structure. This functionality was added by Tom Reist. If you have any questions, or would like any features added, contact him.
The Axial Control framework simply provides a generic front end whereby constraints (mostly linear) are imposed on the optimization problem based on the Axial Control file. As most of the constraints are linear, the majority of calls related to the Axial Control framework happen in initOptimize(), or a derivative thereof. The geometric control elements of the Axial Control framework are modular so they can be easily incorporated into other case-specific versions of initOptimize() and usrfun(). This incorporation is described here.
In initOptimize() or its derivatives:
When counting nonlinear constraints, make a call to numNonLinAxialControlCnstrnts(numNonlinCon)
When counting linear constraints, make a call to numLinAxialControlCnstrnts(numLinCon)
When counting nonlinear constraint dependencies, make a call to countNonLinAxialControlDependencies(cntCnstr, fncidx, ngeodv)
When counting linear constraint dependencies, make a call to countLinAxialControlDependencies(cntCnstr, fncidx)
When setting nonlinear constraint indices, make a call to setNonLinAxialControlIndices(iGfun, jGvar, ptr, Flow, Fupp, fncidx, ngeodv)
When setting linear constraint indices, make a call to setLinAxialControlGrad(iLfun, jLvar, LinG, Flow, Fupp, fncidx, ptr)
In usrfun() or its derivatives:
When calculating nonlinear constraints, make a call to calcNonLinAxialControlConstraints(f, fncidx, needG, G, ptr, ngeodv, .true.)
Everything else, such as specifying pnt and xsec bounds, will be done automatically.
Most users will only interact with the Axial Control framework through the Axial Control file, axial.ctrl. A sample file is shown below for a case with two axials, with three control points on each, five xsecs on the first axial and three xsecs on the second. This example will be used to demonstrate a few features.
The Axial Control file consists of three sections. The first sets control of the xsecs, including variable bounds, constraints, and linking. The second controls the movement of the axial points. The third applies constraints which allow the control of 'intuitive' design parameters. The first two sections set variable bounds and linear constraints. All the constraints imposed in the last section are nonlinear. Each section is described in detail below, but first, a note on bit-wise variable/constraint specification. Axial/FFD design variable freedom is specified by converting a number of bits to the equivalent decimal input as follows. Section variables, i.e. those in xsec, have three possible freedom variables: twist, chord, and section shape variables (and specified in that order). The activity of these variables is turned on/off by assigning a bit of either 0 or 1 for each. This gives a bit number with three entries which can then be converted to a decimal number between 0-7 which is used in the input. Note that bit numbers are specified right-to-left. Below are a few examples:.
| shape | chord | twist || Decimal input |
-------------------------------------------
0 0 0 0 <-- none active
0 0 1 1 <-- twist active
. . . .
. . . .
. . . .
. . . .
1 1 0 6 <-- chord and shape active
1 1 1 7 <-- all active
A similar method is used for specifying point freedom
| delta z | delta y | delta x || Decimal input |
-------------------------------------------------
0 0 0 0 <-- none active
0 0 1 1 <-- x active
. . . .
. . . .
. . . .
. . . .
1 1 0 6 <-- y and z active
1 1 1 7 <-- all active
Binary numbers are specified from right to left, so the same convention is adopted for the DOF/DOA inputs. However, there is sometimes confusion since the order in which the variables or constraints are listed in the axial.ctrl files is left to right. So, for example consider specifying the DOA for the planform constraints in the axial.ctrl file (these constrains are described below, but for now we will just concern ourselves with their activity.) Say a constraint on sweep, aspect ratio, and taper ratio was required. Looking at the last table in the axial.ctrl file
| Sweep | Span | Dihedral | Area | Aspect ratio | Taper ratio| Binary Decimal
--------------------------------------------------------------
1 0 0 0 1 1 -> 100011 -> 35 <- THIS IS NOT CORRECT
-> 110001 -> 49 <- THIS IS CORRECT
Note that the second binary specification is correct since the binary numbers are specified right to left. I.e. sweep is in the 1st position, and aspect ratio and taper ratio are in the last two.
A line is required for each xsec on each axial. Each line specifies the lower and upper bounds for the twist, chord, and section shape xsec variables. Twist bounds are in radians, the chord and section shape variables are in factors of the initial. In the example above, twist is bounded by +/-15deg (a positive axial twist variables corresponds to positive washout, i.e. positive twist corresponds to a LE down twist), the chord can halve or double, and the section shape variables can vary between 5% and 2000% of their initial 'height'. In addition, thickness constraints can be set (note that they are always active). Lower and upper bounds can be set, and are in fractions of the initial thickness. In the example, the thickness can vary between 0.75 and 2.00 of the initial. These constraints are applied at each pairs of xsec shape variables along the chord and are formulated at each pair as t = (xsec_shape_variable_LS + xsec_shape_variable_US)/2. Note that there is an additional constraint imposed at the LE and TE of each xsec. This constraint forces the shape variables on the LS and US to move in equal-and-opposite directions. This maintains the LE and TE of the embedded surface at the original position and removes variable redundancy which would otherwise result, as twist could be added by both the twist variable as well as the shape variables.
The only complicated part of the xsec control is 'Linking'. Linking is a way to link/interpolate xsec variables at different stations. There are four inputs for it:
DOA (Degree of Activity): Turns linking on/off for this section. Specified in a bit-wise manner, e.g. 6 -> 110 -> chord and shape variables are linked. An entry of 0 means the variables at this section aren't linked to anything, e.g. are completely free.
Type: Two types of linking are available. Type 0 corresponds to linking of the variable itself. Type 1 corresponds to linking of the quantity after the appropriate design variable is applied, i.e. to the absolute value, not the delta/factor. Currently, type 1 is only supported for chord variables (type 0 and 1 would be equivalent for twist). Even though currently only chord freedom is supported, type is specified bit-wise. When type 0 is applied to chord linking, the chord scaling factor (i.e. the actual design variable) is linked. When type 1 is applied, the chord itself is linked. For a linearly tapered wing both of these options produce the same result. However, for a nonlinearly tapered wing they differ. For example, consider a nonlinearly tapered wing with three control stations. If type 0 linking is applied to the middle station to interpolate it between the 1st and last station, then the wing will remain nonlinear. If type 1 linking is applied, the chord of the middle station will be snapped to be an interpolation of the 1st and last chord, thus producing a linearly tapered wing.
xsec1/xsec2: This specifies the two xsecs between which a given xsec is linked. For each line, i.e. xsec, the variables specified in DOA are interpolated between the corresponding variables at sections xsec2 and xsec2. If xsec1 = xsec2 then the variable will be constrained to have the same value at xsec as is had by xsec1 and xsec2.
The final entry in the xsec control section is the Junction option. This is applied at the junction between two axials. The value specified is a bit-wise number specifying which variables should have junction smoothing activated. It enforces the xsec variables at the junction, and the two xsecs adjacent to the junction to be equal (one on each of the joined axials). It is specified in a bit-wise manner. This aids in having smooth transitions between axials, and can be used in conjunction with linking to enforce linking across multiple axials. On the root axial, specifying a junction constraint enforces the xsec variables at the 1st and 2nd stations to be equal, i.e. making the geometry perpendicular to the symmetry plane, i.e. smooth with respect to the imaginary other half of the geometry.
In the above example file, the linking section specifies the following constraints:
On axial 1, which has 5 xsecs, the xsecs 2-4 have twist, chord, and shape variables interpolated between the root and tip xsec. The chord has type = 1 specified, so the actual chord will be interpolated. Thus, if the original wing is nonlinear, axial 1 will be snapped to a linearly tapered wing.
On axial 1, the twist of the tip xsec is linked to the root xsec, so the root and tip of axial 1 will have the same twist variable. When combined with the linking of xsecs 2-4 described above, this will enforce the twist at each xsec to be equal.
On axial 2, all xsecs are independent from each other.
In addition to the linking section, a smooth Junction is specified on axial 2. This corresponds to the interpolation of all three variables across the junction between axials 1 and 2.
The linking section is quite powerful. With creativity, it can be used to link control of sections in a large number of ways. It should handle most cases you may need if you give it some thought to come up with a combination of links.
The second section controls the axial control point design variable bounds and linking. The low/upp inputs are simply the bounds, in grid units, of the dx, dy, dz point movement. Linking is similar to that for the xsecs, where it links the point locations or movement. There are four inputs for it:
DOA (Degree of Activity): Turns linking on/off for this point. Specified in a bit-wise manner, e.g. 6 -> 110 -> dy and dz variables are linked. An entry of 0 means the variables at this point aren't linked to anything, e.g. are completely free.
Type: Two types of linking are available. Type 0 corresponds to linking of the variable itself, i.e. dx, dy, dz. Type 1 corresponds to linking of the point's x, y, z position. For example, consider a wing with a nonlinear axial curve controlled by a number of points with dx point freedom. With type = 0 specified on the interior points linked to the root and tip points, any movement of the tip point would result in a corresponding movement of the interior points which would maintain the shape of the nonlinear axial but could increase the sweep. With type = 1 specified on the interior points, the interior points would snap to form a linear axial curve. Type 0 can be useful for linking movement of axials. For example, consider a wing with sweep freedom which had a winglet. If you wanted to design the sweep of the wing but wanted the shape of the winglet to remain the same, you could like all the points on the winglet to the tip point of the wing axial with type 0 linking. Thus, as the wing swept, the winglet would move with it, but keep its shape.
pnt1/pnt2: This specifies the two pnts between which a given pnt is linked. For each line, i.e. pnt, the variables specified in DOA are interpolated between the corresponding variables at sections pnt1 and pnt2. If pnt1 = pnt2 then the variable will be constrained to have the same value at pnt as is had by pnt1 and pnt2.
Some of these features will be demonstrated with the example file above. On the first axial, i.e. points 1-3, point 2 is linked to points 1 and 3 for all the x and z DOFs. The x DOF is linked with type 1 while the z DOF is linked with type 0. Thus, the x coordinate of point 2 will be interpolated between point 1 and 3, while the change in z, dz, of point 2 will be interpolated. On the second axial, i.e. points 3-5 (note that point 3 is shared between both axials), the change in x of points 4 and 5 will be linked to that of point 3. I.e., as the x coordinate of point 3 moves, the x coordinate of points 4 and 5 will move equally.
The final section allows the imposition of nonlinear constraints on quantities which are not inherently calculated when using axials/FFDs, but are useful, such as span or sweep. The following quantities can be constrained for each axial:
Sweep: Calculated as the angle between a straight line from the root point to the tip point of each axial and the y-z plane
Span: Calculated as the length of a straight line from the root point to the tip point of each axial projected on the y-z plane
Dihedral: Calculated as the angle between a straight line from the root point to the tip point of each axial and the x-y plane
Area: This is an approximation based on the FFD. It does not correspond exactly to the area of the embedded geometry!! It is calculated by doing a quadrature on the chord of each xsec on the FFD of this axial.
Aspect ratio: This is an approximation based on the FFD. It does not correspond exactly to the taper ratio of the embedded geometry!! The area and span calculated above are used in its calculation.
Taper ratio: This is an approximation based on the FFD. It does not correspond exactly to the taper ratio of the embedded geometry!! It is the ratio of the tip xsec chord to the root xsec chord.
The low/upp bounds are specified in radians, grid units, or nondimensional, as appropriate. The degree-of-activity (DOA) is used to specify which values are constrained, and are input in bit-wise format. In the example axial.ctrl file above, on axial 2, the sweep, span, aspect ratio, and taper ratio constraints are active. It is also possible to force the above quantities to be equal between different axials, by setting the DOA to 1 for the respective bit in the DOA column and setting the target axial. In the example axial.ctrl file above, the sweep of axial 2 is constrained to be equal to the sweep of axial 1.