MINIMIZING STRUCTURAL JITTER IN OPTICAL SENSOR SYSTEMS USING PARAMETRIC DYNAMIC RESPONSE OPTIMIZATION

by

RICHARD L. SCOTT

DISSERTATION

Submitted in partial fulfillment of the requirements for the degree of Doctor of Philosophy at The University of Texas at Arlington December 2018

Arlington, Texas

Supervising Committee:

B. P. Wang, Committee Chair Ashfaq Adnan Brian Dennis Kent Lawrence Seiichi Nomura ABSTRACT

MINIMIZING STRUCTURAL JITTER IN OPTICAL SENSOR SYSTEMS

USING PARAMETRIC DYNAMIC RESPONSE OPTIMIZATION

Richard L. Scott, PhD

The University of Texas at Arlington, 2018

Supervising Professor: B. P. Wang

Deployed in manned and unmanned aircraft, military and commercial ground vehicles, and security and monitoring systems, optical sensor systems are ubiquitous. Developing an optical sensor system includes calculating image motion due to structural dynamics—hereafter, “structural jitter”—and adjusting system design to reduce structural jitter and meet requirements. The current process for adjusting the structural design to reduce structural jitter is manual, labor intensive, and driven mostly by engineering judgment. This paper proposes a well-defined optimization process that provides a more explicit approach to the structural design and likely will reduce labor as the process matures.

This project focuses on employing dynamic response optimization to minimize structural jitter caused by random vibration. Investigation of the literature has also shown that performing this optimization during the design

ii phase of an optical path-supporting structure has not been documented previously. This dissertation details the optimization process so that researchers and designers may implement it in their efforts to improve image quality in sensor systems.

iii

Copyright by

Richard L. Scott

2018

LIST OF FIGURES

Figure 1. Multispectral Targeting System on the General Atomics MQ-1 Predator © 2018 Raytheon Company ...... 11

Figure 2. Venn diagram of researcher’s areas of interest relative to structural jitter ...... 12

Figure 3. Examples of Raytheon electro-optic / infrared sensor systems. © 2017 Raytheon Company ...... 13

Figure 4. Image blur due to sensor motion ...... 18

Figure 5. Example two-axis optical sensor system used for structural jitter calculations and optimization ...... 19

Figure 6. Differences between Doyle (2007) work and research in this dissertation ...... 27

Figure 7. Jitter Minimization Calculation Process ...... 31

Figure 8. Jitter Minimization User Process ...... 43

Figure 9. Three-beam design………………………………………………...52

Figure 10. Finite element model of the three-beam design ...... 55

Figure 11. Plots of the final design variables and convergence of the objective function for Example 1 ...... 58

Figure 12. Stepped shell design ...... 60

Figure 13. Plots of the final design variables and convergence of the objective function for Example 2 ...... 62

Figure 14. Two-axis, optical imaging system ...... 63

Figure 15. The six design variables for the imaging system optimization ...... 65

v Figure 16. Plots of the final design variables and convergence of the objective function for the optical imaging system design ...... 71

vi LIST OF TABLES

Table 1. References that discuss the minimization of image motion due to dynamic loads or image shift due to static loads ...... 25

vii Table of Contents

ABSTRACT ...... ii

List of Figures ...... v

List of Tables ...... vii

CHAPTER 1: INTRODUCTION ...... 11

Motivation for research ...... 11

Research methodology ...... 14

Research objective ...... 14

Scope of work ...... 15

CHAPTER 2: LITERATURE SURVEY ...... 17

Areas of interest and gaps in the literature ...... 17

Investigation of structural jitter ...... 18

Investigation of dynamic response optimization ...... 20

Search for use of dynamic response optimization to minimize structural

jitter ...... 24

CHAPTER 3: RESEARCH AND RESULTS...... 28

Investigation summary ...... 28

Calculation Process ...... 31

Matlab user parameters module ...... 32

Matlab Main module ...... 32

Matlab objFun module ...... 37

viii Matlab Read Data module ...... 38

Matlab Modify FEM Input module ...... 39

Matlab Read Modal Data module ...... 39

Matlab Calculate Dynamics module ...... 40

Matlab conFun Module ...... 42

User Process ...... 42

CHAPTER 4: EXAMPLES ...... 51

Three beam design ...... 51

Stepped shell design ...... 59

Optical imaging system design ...... 63

CHAPTER 5: SUMMARY, CONCLUSIONS, AND RECOMMENDATIONS

...... 72

References ...... 75

Appendix A...... 79

An Investigation of Methods Used to Calculate Image Motion Due to

Structural Flexure in Optical Systems ...... 79

Appendix B...... 141

Code for Example 1 ...... 141

Appendix C...... 189

Code for Example 2 ...... 189

Appendix D...... 231

ix Code for Example 3 ...... 231

Biographical Information ...... 280

x

CHAPTER 1: INTRODUCTION

Motivation for research

As a structural analyst at Raytheon Company, I perform structural design, analysis, and testing of electro-optic/infrared imaging systems. An example of these systems is the Multi-Spectral Targeting System on the

General Atomics MQ-1 Predator shown in Figure 1:

Figure 1. Multispectral Targeting System on the General Atomics MQ-1 Predator © 2018 Raytheon Company. Images taken from https://www.raytheon.com. License per https://www.raytheon.com/legal/

A key task of the structural analyst on this type of program is to calculate image motion due to structural dynamics, hereafter referred to as structural jitter, and to guide the mechanical design to meet the structural jitter requirements. I questioned whether an optimization process existed to aid in these tasks, and I further considered whether research in my areas of interest might support the task of structural jitter analysis. Three major areas of interest are structural dynamics, opto-mechanical analysis,

11

and structural optimization. Figure 2 shows a Venn diagram of these subject areas. The structural jitter work task and the overlapping region of these subject areas of interest suggested that research in structural optimization to minimize structural jitter would be fruitful. This intersection of interests led me to pose the preliminary research question: How might structural optimization be applied to reduce jitter in imaging systems?

Figure 2. Venn diagram of researcher’s areas of interest relative to structural jitter

The need to answer this question is substantiated by the amount of practical work in sensor companies and the importance of providing quality imagery for customers. It is readily apparent that imaging systems are common and becoming ubiquitous. They are employed in manned and unmanned aircraft, military and commercial vehicles, and security and monitoring systems. Examples of systems that employ Raytheon imaging systems are shown in Figure 3 below. Having this imagery of high quality is demanded by the need to clearly recognize, identify, and track targets.

12

Many engineering disciplines support this effort, such as optical design, control systems, and imaging processing. For the structural analyst, optimizing the structural design to limit structural jitter is a key task.

Figure 3. Examples of Raytheon electro-optic / infrared sensor systems. © 2017 Raytheon Company. Images taken from https://www.raytheon.com. License per https://www.raytheon.com/legal/

Further merit of answering the research question was found by examining the current structural jitter analysis process. The process starts with an initial jitter calculation using a preliminary, simplified, finite element model (FEM). The analyst examines the responses, and works to identify significant contributors using experience, engineering judgment, and design trades. These design trades examine the impact of changing the stiffness of whole parts, part features, and structural interfaces. This

13

process is typically performed in both the preliminary and detailed design phases. Additional detail is added to the FE model and structural jitter is recalculated when design changes are deemed significant. Since this process is manual, labor intensive, and driven by engineering judgment, a well-defined optimization process was expected to provide a more explicit approach during the structural design and may even reduce labor.

Research methodology

A preliminary literature survey led me to select subtopics that focused on answering the research question noted above. These subtopics are structural jitter analysis within the opto-mechanical analysis area and dynamic response optimization within the area of structural optimization. Given these subtopics, I refined my research question to investigate how dynamic response optimization might be applied to minimize structural jitter in optical sensor systems. Given the revised research question, I proceeded to a more detailed and extensive investigation of the literature. Further details of the literature survey are presented in the literature survey chapter of this proposal.

Research objective

Can a form of dynamic response optimization by used to minimize structural jitter in optical imaging systems? My hypothesis was yes.

Further, I expected that employing this optimization process would provide

14

an explicit approach to guide the mechanical design process. Therefore, the objective of the proposed research was to develop this process.

Scope of work

The general statement of the research scope was to identify and document a process of using dynamic response optimization to minimize structural jitter during the design phase of an optical sensor system structure. Further definition of the scope was as follows.

The resulting process was expected to be immediately deployable.

That is, I would be able to use the process to aid the structural design of optical imaging systems at Raytheon. While the process required finite element software, optimization software, and method to pass data between these, the resulting process was expected to be adjustable to allow for easy migration from one set of software tools to another. I did expect that formatting of data interface files would be required as different tools are used.

I limited the design variables to parametric values that would be transferred between the FE software and the optimization software. The number of design variables utilized within the development was limited to the number necessary to substantiate the process. I expected that the number of design variables in the resulting process may be increased when deployed in future projects.

15

Selection of the best optimization algorithm, the best software tools, or the best model approximation method was not within the scope of this research. The objective was to develop an immediately deployable process. Again, process improvements could take place in the future.

The research would include implementation of the process using one or more example problems. These examples would be used to validate the process and explain.

16

CHAPTER 2: LITERATURE SURVEY

Areas of interest and gaps in the literature

A preliminary survey of the literature in the areas of interest was conducted to evaluate the feasibility of answering the preliminary research question and to identify potential gaps in the literature. Key search phrases include “jitter” (or, “image motion”), “imaging systems,” and

“structural optimization.” Jitter has various components. In this dissertation, I focus on structural jitter, which is that portion of jitter allowed by dynamic responses of mounting structures. Since various types of systems form images, I here pinpoint “imaging systems” to “optical sensor systems,” which have lenses and mirrors that form an image on the image plane of a sensor. Further, since the broad term “structural optimization” encompasses statics as well as dynamics, this dissertation distinguishes relevant literature by searching for the term, “dynamic response optimization.” These subject area revisions aligned my research question with my areas of interest and also with potential gaps in the literature.

The revised research question inspired more detailed subtopic interests: How do engineers calculate structural jitter? What methods exist for dynamic response optimization? Have methods of dynamic response optimization been employed in minimizing structural jitter? The following literature survey addresses these questions.

17

Investigation of structural jitter

For the purposes of this investigation, structural jitter entails image motion allowed by structural flexure in optical systems. Scant research exists on the phenomenon itself or on the most efficient methods for measuring structural jitter. However, I here found Fiete and Paul (2014), who describe image motion as seen in Figure 4 below:

Figure 4. Image blur due to sensor motion (Fiete and Paul 2014). Used with permission.

In addition, research completed for this dissertation has already led to “An Investigation of Methods Used to Calculate Image Motion Due to

Structural Flexure in Optical Systems” (Scott 2018), which is available as

Appendix A to follow. That paper presents calculations methods, terminology, and mitigation strategies for structural jitter. It also provides a detailed example of calculating structural jitter in a single field-of-view optical sensor mounted to a two-axis gimbal system. The example optical sensor is shown below in Figure 5:

18

Figure 5. Example two-axis optical sensor system used for structural jitter calculations and optimization.

I documented this structural jitter investigation in a separate paper for two reasons. First, Scott (2018) reviewed the state of the field, the advancement of which is my current objective. Second, the paper substantiated my claim that structural jitter calculation methods are readily available in the literature. Therefore, my employer, Raytheon Company, had no concerns about publishing conclusions reached outside of patent.

The paper demonstrates the complexity of calculating structural jitter. Since the process is lengthy, opportunities for error abound. After executing the process, the analyst must rely on diverse checks and trades to guide the mechanical design changes necessary to meet structural jitter requirements. I propose that the manual process will be improved in

19

accuracy and efficiency when engineers develop and employ an optimization process for calculating structural jitter.

Investigation of dynamic response optimization

Before testing the hypothesis of this dissertation—again, that dynamic response optimization will minimize structural jitter—I studied the history of the practice, from early- to mid-twentieth-century efforts in structural optimization to the emergence of dynamic response optimization in the 1970s. Rao (2009) and Vanderplaats (2007) provide detailed histories of structural optimization, so I refer readers to them for a thorough context. Thus, this project documents a brief history from genesis to dynamic response optimization here. Giorgi and Kjeldsen

(2013) propose that one of the earliest works on optimization was the use of multipliers by Joseph Louis Lagrange in 1788. Lagrange practiced structural optimization by introducing multipliers to address constraints in mechanics (Querido and Kim 2008). Engineers began studying linear programming in the early 1900s and were propelled by operations research during World War II in the early 1940s. Wasiutynshi and Brandt

(1963) and Vanderplaats (2007) attributed the contemporary discourse of

“structural optimization” to Lucien Schmit’s 1960s studies (Schmit 1960;

Fox and Schmit, L. 1965; Fox and Schmit, L. A. 1966).

20

Park (2007) chronicles various researchers who began documenting investigations into dynamic response optimization in the

1970s. Because terms and discourses are often inconsistent in a nascent field, the beginnings of dynamic response optimization are difficult to identify. While Fox and Kapoor (1970) worked on computation and on the time domain, Pierson (1972) published his studies in the frequency domain just two years later. However, researchers in the field did not classify dynamic response optimization into time domain or frequency domain methods until Choi and Park (2002).

Park (2007) further delineated time domain methods into direct methods (as in studies of transient response) and equivalent static load

(ESL) methods. His research also advanced the field by categorizing frequency domain methods into three groups: optimization of eigenvalues; optimization of harmonic responses; and optimization of random responses.

The literature is replete with studies of optimization within the time domain, and many authors have contributed to understanding and standardizing these methods. In general, models optimized by direct methods had to be small due to the computational expense of solving the second-order differential equations of motion. By introducing a transformation of dynamic loads into ESL, Choi and Park (1999) increased

21

efficiency significantly. Subsequently, Kang, Choi, and Park (2001) and

Choi and Park (2002) employed that process of transformation in conjunction with a structural optimization. Their work calculated equivalent displacement fields of a structure for a selected number of time points and solved each of these static loading conditions during the optimization process. Since that time, ESL methods have become common.

Many of the aforementioned methods were eliminated from this research. Since vibration inputs for optical imaging system are mostly specified using random vibration profiles, I chose against developing a time domain process for minimizing structural jitter. While time domain methods may prove useful for comparison, the research that comprises this dissertation did not need to transform inputs from the frequency domain to the time domain. Furthermore, random vibration profiles may be represented by an essentially unlimited number of time histories. Also, while optimizing eigenvalues or eigenvectors may prove useful in indirectly reducing structural jitter, this project is concerned with minimizing the structural jitter random response.

Random vibrations are included in the sum of a structure’s responses due both to structural characteristics—as in natural frequencies—and to input characteristics—as in peaks in the platform vibration profiles. However, my goal was to develop a process to minimize

22

structural jitter of an imaging system regardless of the platform on which engineers placed the system. To accomplish that goal, I had two choices: minimize the random response due to a flat random vibration input profile or minimize the frequency response function of the structure. Because I chose the latter, I then employed harmonic response optimization (as opposed to random response optimization) to minimize the characteristic dynamics of a structure in the form of a frequency response function—that is, a transfer function in the frequency domain.

For this dissertation, I had access to several software tools through my employer, Raytheon Company. In identifying an appropriate method, I considered finite element software, code and solving software, and interfacing software. Structural optimization implemented within finite element (FE) software has been predominantly nonparametric and is usually categorized as topology optimization, shape optimization, or size optimization. After careful consideration of these conventional techniques,

I instead developed a parametric process, wherein I use whatever values might be available in the finite element solver input files. This research component is further discussed in the Research and Results section below.

23

Search for use of dynamic response optimization to minimize structural

jitter

Upon electing dynamic response optimization, I consulted the literature to identify previous studies that entailed the application of dynamic response optimization techniques to minimize structural jitter in optical sensor systems. Here, the term optimization is not used to indicate simply the application of recommended steps to reach a design goal specifically. Instead, “optimization” connotes an automated process. While

I identified several resources describing the use of structural optimization to improve image quality, those studies focused on minimizing wave front error due to static loads. Few references were found that presented the minimization of structural jitter. Only the five references in Table 1 below were found to discuss the minimization of image motion due to dynamic loads or image shift due to static loads.

24

Table 1. References that discuss the minimization of image motion due to dynamic loads or image shift due to static loads.

Research Subtopics Dynamic Research Minimization Dynamic Dynamic Dynamic Dynamic Calculation Response Proposal Pub of Structural Response Response Response Response Author Title of Optim: Ref Date Jitter or Static Optim: Optim: Optim: Optim: Structural Eigenvalues Number Boresight Harmonic Random Time ESL Jitter and Shift Response Inputs Domain Methods Eigenvectors

Optimal Structural Doyle 22 Design of the Airborne 1995 X X X et al Infrared Imager Simultaneous Design Williams Optimization of 20 1999 X et al Optomechanical Systems Optimization Design Sun Method of Satellite 21 2014 X et al Imaging Chain Related with Optical Axis Jitter

Integrated Doyle 23 Optomechanical 2012 XX X et al Analysis, 2nd Ed

Design Optimization of a Dual Mode Multi- 24 Doyle Axis Passive Isolation 2007 XXX X Configuration for MLCD

Of those five studies, Williams, Genberg, and Gracewski (1999) addressed image shift under static loads only. In addition, Sun, Wang, and

Wang (2014) investigated allocation of a jitter budget among extant sources, but they did not address minimizing a jitter response.

Only three of the five references in Table 1 were found to discuss the application of some type of structural optimization to minimize structural jitter caused by vibration of a structure. Doyle, Cerrati, and

Forman (1995) presented optimization of a structure to maximize the fundamental frequency, and they learned that by doing so, they lowered

25

the resulting structural jitter. However, this approach does not always work to reduce jitter (Scott 2018).

The final two references, Doyle, Genberg, and Michels (2012) and

Doyle (2007), specifically discuss the employment of dynamic response optimization to reduce structural jitter. In the former paper, authors extensively examine structural jitter and other opto-mechanical topics.

They consider the use of random response optimization to minimize structural jitter, but they did not provide examples or data on optimization calculations.

Therefore, I find Doyle (2007) to be the study most closely aligned with my methods and objectives. Doyle optimized the configuration and stiffness of base isolators in a hexapod design to minimize the root-mean- square (RMS) of the structural jitter frequency response of an imaging system that was already designed. I am inclined to optimize a structure to which optics are mounted during the mechanical design, not afterwards.

Base motion isolators may be later applied to the structure if needed.

These differences identify the current gap in the literature and may be observed in Figure 6 below:

26

Figure 6. Differences between Doyle (2007) and research in this dissertation. Doyle (2007) image used with permission.

This literature survey ends with identification of this gap in the literature, which substantiates the need for the project presented in this dissertation.

27

CHAPTER 3: RESEARCH AND RESULTS

Investigation summary

To develop the proposed optimization process, I executed the tasks as agreed upon in my research proposal. Those tasks are listed below along with a brief discussion of choices made during tasks 1–6 with the purpose of providing a summary anticipating the results of my study. The results of tasks 7–8 are presented in the next two sections of this chapter:

Calculation Process and User Process. The results of task nine are presented in Chapter 5. Finally, the result of task ten is this document.

1. Select the finite element software used for the process

development;

2. Investigate parameterization with finite element (FE) software for

selection of design variables;

3. Investigate optimization methods;

4. Investigate optimization software and algorithms;

5. Select design variables and constraints;

6. Investigate data interface method with required software or code;

7. Develop process flow;

8. Write necessary code;

9. Solve examples; and

10. Document the optimization process.

28

I chose Abaqus by Dassault Systemes Simulia Corp. as the FE code for this optimization process due to my familiarity with the software.

While the process is intended to be mostly independent of the FE tool, a tool was necessary for the development. I expect that, when using most other FE software, little to no change would be required in the overall optimization process, and researchers need change only a small portion of the code.

As noted, I intended this optimization process to be parametric.

After investigating the Abaqus documentation, I found that parameterization of the input file was easily accomplished by assigning variables with the *PARAMETER1 keyword. I present details later in this chapter.

In my search for dynamic response optimization methods, I encountered the work of Park (2007), who discusses frequency domain methods. Specifically, Park (2007) proposes two methods of minimizing harmonic responses: first, minimizing the maximum amplitude; or second, minimizing the area under the curve. Harmonic responses to unity acceleration inputs are used to generate frequency response functions

(FRF) for structural dynamics. Given FRF, an engineer can calculate the response to random vibration by squaring the magnitude of the FRF and

1 Abaqus User Assistance Guide. 2017.

29

multiplying it by the input acceleration power spectral density (APSD). This background allowed me to select the area under the harmonic response curve as the objective function for minimizing structural jitter due to characteristic structural dynamics.

I considered the following options for optimization software and algorithms: 1) writing the optimization routines using Python or C++; 2) gathering published optimization modules from Python or C++ libraries and writing the code which would employ these modules; or 3) writing

Matlab code to employ the Matlab optimization capabilities. I chose Matlab because of the program’s advanced capabilities and the large number of optimization routines it makes available. Since this study’s objective functions and constraint functions are often nonlinear, I chose the Matlab fmincon() function. Investigation of the algorithms available with the fmincon() function led me to chose sequential quadratic programming

(SQP) for the optimization algorithm, which is highly efficient and does not require analytical gradients.

Given the selections of the Abaqus software and the ability to parameterize the Abaqus input file, I learned that any numeric value written from the Abaqus user interface to the input file may be selected as a design variable. Further, any information that could be read from the

Abaqus output text file (.dat) or any relationships that can be precalculated

30

using the design variables could be used as constraints in the optimization process. Given that Matlab code could be written which would read both the Abaqus input and output files, no other data interface software was required.

With these choices made, I was able to design the calculation process discussed next.

Calculation Process

The jitter minimization calculation process is shown in Figure 7 on the following page. This process is carried out by Matlab code, which is modular in design, meaning that each module performs a set of functions.

A code listing of all modules is provided in Appendix 2. Running the

Matlab Main module executes the process.

Matlab code module Matlab Matlab Text files User conFun Parameters Abaqus software

Matlab Matlab Abaqus Start Main Finish Modify (optimization Input File function) FEM Input (.inp)

Abaqus Matlab Matlab Solver Calculate objFun Modal Dynamics Analysis

Optics Matlab Read Matlab Read Abaqus Coef File Optics Data Modal Data Output File (.bs) (.dat)

Figure 7. Jitter Minimization Calculation Process.

31

Matlab user parameters module

Before describing this process, I will explain the Matlab User

Parameters module, which is the module containing the information supplied by the user. This module provides user-entered information to all other modules that request it. It enables the user to define analysis parameters, such as the acceleration of gravity, the modal damping ratio, input and output file names, initial starting points for the design variables, and upper and lower limits of the design variables. Also within this module, the user defines any eliminated structural modes, the input and output nodes and degrees-of-freedom (DOF) for the dynamic response, and input acceleration power spectral density (PSD) parameters for calculating structural jitter at the end of the optimization. Finally, the user defines scaling factors for appropriate numerical conditioning of the optimization algorithm. These scaling factors are discussed with the Matlab Main module.

Matlab Main module

The user initiates the structural jitter minimization process by running the Matlab Main module. All other modules are subsequent to this initiation. When the minimization process is complete, this module

32

calculates the reduced structural jitter from the latest design variables, and the process ends.

This module begins by setting preliminaries. That is, it starts a timer, clears Matlab variables, closes any figures, sets the format for output to the command window, and creates the global variables that will be needed later for output to the user and for calculating the resulting structural jitter. These global variables contain history data of design variables and the objective function, azimuth and elevation jitter frequency response functions (FRF), and azimuth and elevation jitter response power spectral densities (PSD). Next, this module, like all the other modules, obtains required information from the Matlab User Parameters module.

Upon receiving the starting point, upper limit, and lower limit design variable vectors from the User Parameters module, the Main Module scales these values using the scaling factors provided by the user. The purpose of these scaling factors is to improve numerical conditioning for the optimization algorithm. I implemented scaling into this calculation process after investigating numerical conditioning in Messac (2015). Along with provided an enlightening discussion on the need for good numerical conditioning in optimization problems, Messac (2015) shows that Matlab’s nonlinear, constrained minimization functions are more stable and more

33

efficient when the design variables, objective function, and constraints are scaled to unity. The scaling factors in the Main Module provide users with these abilities.

After scaling, the Matlab Main module sets several parameters and tolerances for the optimization function. More important parameters provide the names of the objective and constraint functions and the choice of optimization function and algorithm used. I selected the fmincon() optimization function with the sequential quadratic programming (SQP) algorithm for the following reasons.

First, this function was developed for constrained, nonlinear optimization. The objective function of the minimization process is the area under the jitter FRF curve, which is nonlinear. Second, I wanted to allow the user to implement both linear and nonlinear constraints. Within the fmincon() function, I selected a highly efficient algorithm for solving smooth nonlinear problems, SQP. Of the five algorithm choices for fmincon(), SQP is the most efficient algorithm that does not require analytical constraint and objective gradients to be specified by the user.

Instead, this algorithm estimates the gradients via finite difference. Many authors discuss the advantages of SQP over other algorithms.

Specifically, Boggs and Tolle (1995) argued that SQP had become the most successful constrained minimization algorithm of the time, and Rao

34

(2009) refers to SQP and one of the most recently developed and best algorithms. Readers may refer to these authors on the specific workings of

SQP. The more important optimization tolerances set within the Matlab

Main module are the optimality tolerance, the function tolerance, the constraint tolerance, the step tolerance, and the minimum change in design variables. After various tests, I set each of these values to measures reasonable for typical mechanical parameters that have been scaled to unity.

With the aforementioned parameters and tolerances set, the Matlab

Main module initiates the fmincon() function, which begins the minimization interation process. This process includes calculating the objective function using the Matlab objFun module and calculating the constraint function using the Matlab conFun module. When the tolerances have been met for fmincon() termination, or the user stops the optimization process, the Matlab Main module then unscales the resulting design variables and objective function and provides these to the user via the command window. Finally, this module proceeds to calculate and plot uncorrected, azimuth and elevation structural jitter using these optimized design variables.

While Appendix A presents a detailed discussion of calculating structural jitter, I provide a summary here for convenience. Two-axis

35

structural jitter is calculated as shown in equations (1) and (2), where ϕ푎z and ϕ푒푙 are the azimuth and elevation jitter, [ 퐶 ] and [ 퐶 ] are the azimuth and elevation optical coefficients, {U } are the displacements of each optical element DOF, and 휙푺푴풂풛 and 흓푭푺푴풆풍 are fast-steering mirror correction terms.

(1) 흓풂풛 = [ 푪풂풛 ] 푼 + 흓푭푺푴풂풛

(2) 흓풆풍 = [ 푪풆풍 ] 푼 + 흓푭푺푴풆풍

The manner in which these equations are calculated within this jitter minimization process results in each of these terms being rotational displacement FRFs with respect to base motion input. On the right-hand side of each equation, the first term is uncorrected jitter and the second term is the correction generated from the sensor to fast-steering mirror transfer function. Since the objective of this minimization process is to reduce the jitter generated from the characteristic dynamics of the sensor, the correction term is not used. This Matlab Main module receives the uncorrected ϕ푎z and ϕ푒푙 from the Matlab objFun via global variables.

Letting 푯 흓 (풇) =ϕ푎z and 푯 흓 (풇) =ϕ푒푙 , the Matlab Main module then 풂풛 풆풍 푩푴풋 푩푴풋

36

calculates the azimuth and elevation power spectral density (PSD) jitter responses, 흓풂풛풋(풇) and 흓풆풍풋(풇) as shown in equations (3) and (4). Here,

푾풋(풇) is the input random vibration PSD, which can either be the same or different for each axis, and 풋 is the translational input direction.

ퟐ (3) 흓 (풇) = 푾 (풇) ∗ 푯 흓 (풇) , 풋 = ퟏ, ퟐ, ퟑ 풂풛풋 풋 풂풛 푩푴풋

ퟐ (4) 흓 (풇) = 푾 (풇) ∗ 푯 흓 (풇) , 풋 = ퟏ, ퟐ, ퟑ 풆풍풋 풋 풆풍 푩푴풋

Note that this module is one of the three that must be adjusted by the user prior to running the minimization process. This will be discussed further in the User Process section.

Matlab objFun module

The primary purpose of the Matlab objFun module is to receive the current values of the design variables from fmincon() and calculate the objective function, which is to be minimized in order to select the optimized design variables. In jitter minimization process, the objective function is the area under the structural jitter FRF curve. After receiving the design variable values, this module proceeds to preliminaries. It closes all data files, recognizes the global variables, and obtains user parameters from the Matlab User Parameters module. Since the design variables initially sent into fmincon() were scaled, this objFun module unscales them

37

for objective function calculations. Since the objective function is structural jitter, this module next obtains optical coefficients from the Matlab Read

Optics Data module. This module then sends the latest design variable values to the Matlab Modify FEM Input module and tells the Matlab

Calculate Dynamics module to start dynamics calculations, which will use the FEM. When the FEM and dynamics calculations are complete, this module receives the required dynamic displacement FRFs to be used with the structural jitter coefficients and calculates the uncorrected azimuth and

elevation structural jitter FRFs, 푯 흓 (풇) =ϕ푎z and 푯 흓 (풇)=ϕ푒푙. Again, 풂풛 풆풍 푩푴풋 푩푴풋 the uncorrected term is the first term on the right-hand side of both equation (1) and equation (2). Finally, this module calculates the area under either the azimuth jitter FRF, the elevation jitter FRF, or both using the trapezoid method of numerical integration. Prior to returning this area under the curve value to fmincon(), this module rescales it using the initial scaling factors provided by the user.

Matlab Read Optics Data module

As previously indicated, the purpose of the Matlab Read Optics

Data module is to provide the optical coefficients, [ 푪풂풛 ] and [ 푪풆풍 ] of equations (1) and (2), to the Matlab objFun module for calculation of structural jitter. It obtains the name of the optics coefficient text file with the

38

rest of the parameters from the Matlab User Parameters module. Given the file name, it opens the file, searches for the required coefficients, reads the coefficients, and parses them into matrices that will be used by the Matlab objFun module for jitter calculations. Note that an optics engineer provides the optics coefficient text file. Therefore, these data must be obtained for a given design prior to running this jitter minimization process.

Matlab Modify FEM Input module

The finite element model of the design being optimized is written to an input file for the Abaqus solver. This input file contains all of the information required to solve for the eigenvectors and eigenvalues, or mode shapes and natural frequencies, of the structure. Within this information are values of the design variables selected by the user of this minimization process. This module receives the name of the input file from the Matlab User Parameters module, receives the current value of the design variables from the Matlab objFun module, and modifies the values of the design variables within the input file in preparation for a new eigenpair solution from the Abaqus solver.

Matlab Read Modal Data module

When the Abaqus solver completes the eigenpair solution, these modal results are written to an output data file. This module receives the

39

name of this output file from the Matlab User Parameters module, as well as a list of structural modes that the user wants to eliminate from the optimization process. This module reads the modal data from the file, eliminates the necessary modes, parses the modal data, and returns this modal data to the Matlab Calculate Dynamics module to be used in calculating the dynamic responses of the optical element DOF.

Matlab Calculate Dynamics module

The primary purpose of the Matlab Calculate Dynamics module is to provide the optical element dynamic displacements, {U } in equations

(1) and (2), to the Matlab objFun module for calculation of structural jitter,

ϕ푎z and ϕ푒푙. After obtaining parameters from the Matlab User Parameters module, this module starts the Abaqus solver using a parameterized input file and pauses execution of this minimization process until the Abaqus solver completes. The method used for initiating Abaqus was taken from

Papazafeiropoulos et al (2017). When the Abaqus solver is finished, this module requests the modal data that is in the Abaqus output file from the

Matlab Read Modal Data module. With the modal data, this module builds the modal state space model of equations (5) and (6), where the coefficient matrices for each mode, 풊, are specified in equation (7), and these modal coefficient matrices are combined to form the state coefficient

40

matrices as shown in equation (8). In these equations, 풙 is the state

vector, 풖 is the input vector, 흎풊is the natural frequency for mode 풊, 휻풊is

the modal damping of mode 풊, 풃풎풊 is the input eigenvector term for mode

풊, 풄풎풒풊 is the output displacement eigenvector term for mode 풊, 풄풎풗풊 is the output velocity eigenvector term for mode 풊, and 풏 is the number of modes. Since jitter is calculated from only displacements, 풄풎풗풊 = ퟎ. This form of state space model was taken from Gawronski (2004).

(5) 풙̇ = 푨풎 풙 + 푩풎 풖

(6) 풚 = 푪풎 풙

풄 ퟎ 흎풊 ퟎ 풎풒풊 (7) 푨풎풊 = , 푩풎풊 = , 푪풎풊 = 풄풎풗풊 −흎풊 −ퟐ휻풊흎풊 풃풎풊 흎풊

푩풎ퟏ (8) 푩 푨 = 풅풊풂품(푨 ) , 푩 = 풎ퟐ , 푪 = [푪 푪 … 푪 ] 풎 풎풊 풎 ⋮ 풎 풎ퟏ 풎ퟐ 풎풏 푩풎

With the modal state space model, this module calculates the absolute displacement of the optical elements. Since jitter calculations require the relative displacement of the optical elements, this module adds

41

base motion displacement prior to sending these displacements back to the Matlab objFun module.

Matlab conFun Module

The Matlab conFun module calculates the value of the constraint functions used by the Matlab constrained minimization function, fmincon().

To calculate these constraint functions, it receives the scaled design variables from fmincon(), obtains scaling factors from the Matlab User

Parameters module, and unscales the design variables. In addition to the design variables, this module needs modal data from the FEM, so it obtains these data from the Matlab Read Modal Data module. With the unscaled design variables and the necessary modal data, it calculates values of the constraint functions that have been created by the user.

Finally, it scales these constraint function values using the previously obtained scaling factors and sends these values back to the fmincon() function.

User Process

The jitter minimization user process is shown in Figure 8 on the following page. These are the steps that a user must follow when using the code to successfully execute the minimization process and reduce structural jitter in a design.

42

Figure 8. Jitter Minimization User Process. Matlab code Text files Abaqus software

Define optimization problem: Adjust Parameterize Start A. Design variables FE FEM input file B. Objective function model C. Constraints

Tune Set Matlab Set Matlab Matlab optimization Run optimization optimization Finish user code constraints options and parameters tolerances

Of fundamental importance is that the user understands and defines the problem being solved. To do this, the user should state the problem as follows.

43

풃 ⎧ ퟏ ⎫ ⎪풃ퟐ ⎪ Find the vector of design variables 풃 = 풃ퟑ ⎨ ⎬ ⎪ ⋮ ⎪ ⎩풃풎⎭

to minimize the objective function(s) 풇(풃) = 흓풂풛 = [ 푪풂풛 ] 푼(풃)

and/or 풇(풃) = 흓풆풍 = [ 푪풆풍 ] 푼(풃)

where [푴]푼̈ (풃) + [푪]푼̇ (풃) + [푲]{푼(풃)} = {푷} subject to constraints

품풋(풃)≤ ퟎ, 풋 = ퟏ,…, 풏 inequality constraints

풉풌(풃)= ퟎ, 풌 = ퟏ,…, 풑 equality constraints

풃푳 ≤ 풃 ≤ 풃푼 side constraints (limits)

For the parametric process presented here, each design variable

풃풊must be a value that is written to the Abaqus input file so that it is available for modification by the process code. Since the purpose of this process is to minimize structural jitter, the objective function being minimized is the area under the uncorrected portion of the structural jitter

FRFs. This minimization is subject to the inequality and equality constraints that the user defines in the Matlab conFun module, and the side constraints, or limits, that the user sets for the design variables in the

44

Matlab User Parameters module. Understanding the problem, the user can proceed to preparing the finite element model and minimization code.

The paper in Appendix A discusses how to set up the FE model for calculation of structural jitter. To prepare the model for this jitter minimization process, the user must set up the model to use the large mass method of base motion excitation. Often, FE models are set up to use a fixed base method of base motion where input eigenvector terms are replaced by base motion participation factors. However, the minimization process discussed here uses the large mass method. This method is more flexible because is allows multiple bases and loads in the dynamic response calculations that occur after the eigensolution.

Therefore, if the FE model was already set up with the fixed mass method, the user must change the model to the large mass method. To do this, the user must remove any boundary conditions at the base and add an element containing a mass of approximately 1000 times the model mass and inertias of approximately 1000 times the model inertias. These large mass and inertia values will prevent dynamic forces, which result from structural excitations, from influencing the motion at the base. If the values are too large, numerical conditioning errors can occur. When the FE model has been adjusted, the user can write the FEM input file.

45

During the structural jitter minimization process, changes to the

FEM are made by changing values in the FEM input file. To allow for these changes, the user must parameterize the input file. This is accomplished with two changes to the file. First, the user must enter the

Abaqus *PARAMETER keyword, followed by the parameter definition, at the beginning of the file. For example, the following lines of code could be used for an optimization process with three design variables.

10 ** ------

11 *PARAMETER

12 designVar1 = 0.050

13 designVar2 = 0.040

14 designVar3 = 0.025

15 ** ------

The double asterisks allow for a remark statement. The

*PARAMETER keyword tells the solver that parameter definitions follow.

Then designVar1, designVar2, and designVar3 are assigned values. The second change to the file is to replace all occurrences of the value with the parameter name. If the first design variable is a shell section thickness of

0.050 inches, every value of 0.050 used in the file to specify this shell section thickness would be replaced with . For example,

46

lines 173 and 174, which specify the thickness of the shell section used for surface_a, would be changed

from

173 *Shell Section, elset=base-1_Set-surface_a,

material=base_a

174 0.05, 5

to

173 *Shell Section, elset=base-1_Set-surface_a,

material=base_a

174 , 5

When the FEM input file is parameterized, it is ready for use by the jitter minimization code. So, the next steps are to prepare the code.

The user must make modifications to three modules within the minimization code: the Matlab User Parameters module, the Matlab conFun module, and the Matlab Main module. First, in the Matlab User

Parameters module, the user must update all parameters that will change for the specific analysis at hand. These include updating the names of the

FEM input file, the FEM output file, and the optical coefficients file. Within this module, the user sets the values of design variables at the starting point, lower limit, and upper limit. The size of the starting point design variable vector here sets the number of design variables in throughout

47

minimization process. Here the user sets the value of the modal damping ratio, lists any structural modes which are eliminated from the analysis, identifies the node number and DOF where the input vibration is applied, identifies the output node numbers and DOF where dynamic responses are desired, and defines scaling factors for the design variables, the objective function, and constraint functions. Finally, the user employs an unlimited number of fixed parameter variables to pass values from this parameter module to other modules. For example, these fixed parameter variables can be used to pass surface areas and material densities to the

Matlab conFun module for calculation of mass added by shell thickness design variables. Other examples are to use these fixed parameter variables to pass values of minimum structural frequency or maximum total mass for constraints.

Second, the user must set up the desired constraint functions in the

Matlab conFun module. To do this the user employs the design variables passed from the fmincon() function in the Matlab Main module and the fixed parameters passed from the Matlab User Parameters module and calculates the value of constraint functions at the current design variables.

An example is to set up the calculation of mass of a specific surface controlled by a design variable thickness, a fixed parameter surface area,

48

and a fixed parameter material density and compare this with a fixed parameter allowable mass for that surface.

Finally, to prepare the Matlab code, the user may set the options and tolerances for the fmincon() function in the Matlab Main module. This step is optional. The user may find that the current default settings are appropriate and efficient for the problem at hand. But, the user may desire to adjust these settings after seeing the rate of convergence or initial results. A brief discussion of some of the fmincon() options and tolerances is provided here to guide the user.

Seven option and tolerance settings for the fmincon() function may be of interest to the user. First, the optimization process will terminate when the number of design variable iterations becomes equal to

MaxIterations or the number of objective function evaluations becomes equal to MaxFunctionEvaluations. These are currently set to twenty and two hundred, respectively. Next, the minimum change in design variables for calculating finite difference gradients is set by DiffMinChange.

Investigation showed that the Matlab default value resulted in premature termination of the optimization process. Finally, there are four tolerances, three of which will terminate the solver. The solver will terminate when difference between the current design variables and projected optimum design variables is less than OptimalityTolerance, when the difference

49

between the current value of the design variables and the previous value of design variables is less than StepTolerance, or when the difference between the current value of the objective function and the previous value of the objective function is less than FunctionTolerance. Although the final tolerance, the constraint tolerance, will not stop the optimization process, it will send a report to the user when there is a constraint violation. For example, it will send a report when the difference between the current value of a design variable and the upper bound of a design variable exceeds ConstraintTolerance. These settings and tolerances operate on the scaled values of design variables, objective function, and constraint functions sent to fmincon(). Setting these improperly may result in premature termination of the process. Further explanation of these settings may be found in the Matlab User Documentation2. The defaults currently specified have been found adequate for solving the examples provided in Chapter IV.

As shown in Figure 8, the user may execute the code after these various preparations. Experience has shown that the user may terminate the process prior to complete convergence and still obtain excellent values of the current design variables. Terminating the process early is further discussed in the examples of Chapter IV.

2 Matlab User’s Guide. 2019.

50

CHAPTER 4: EXAMPLES

To explore methods for reducing structural jitter, I developed and solved three example problems to both test and to demonstrate the structural jitter minimization process. These examples are presented here in order of complexity.

Three beam design

The simple three-beam design shown in Figure 9, below, is intended to allow the reader to solve the problem without the code and compare the results of their solution to the solution using the code. It consists of three aluminum beams which are each constrained at the left end to a large ground mass used for base motion excitation. The response to be minimized is elevation jitter, 흓풆풍, due to a vertical base motion input

(BM), where elevation is measured about the z-axis coming out of the page. The properties used for the aluminum are density = 0.098 lbm/in3, modulus of elasticity = 10 Mpsi, and Poisson’s ratio = 0.33. Each of the three beams supports a 0.5 lbm optical mass on the right end. With respect to structural jitter, these optical masses notionally represent a lens or a mirror in an imaging system. The lengths of the beams are set at five inches, ten inches, and fifteen inches, and each is 0.30 inches wide. The depths of each beam, labeled a, b, and c in the figure, are the design variables to be determined. The starting dimensions for these beam

51

depths are 0.60, 1.20, and 1.80 inches, respectively. The minimum values of the design variables are 0.30, 0.60, and 0.90 inches, and the maximum values are 1.20, 2.40, and 3.60 inches, respectively. The total mass of the three beams at the starting point design is 1.235 lbm, and the final design cannot exceed this value. The minimum natural frequency of all three beams must be greater than 16 Hz.

.30” .30” .30” a b c

y optics optics optics mass 1 mass 2 mass 3 x 15.0” 5.0” 10.0”

large ground 퐵푀 mass Figure 9. Three-beam design.

We proceed by following the jitter minimization user process shown in

Chapter III, Figure 8. First, we state the problem in the standard optimization problem formulation as follows.

52

풃ퟏ 풂 Find the vector of design variables 풃 = 풃ퟐ = 풃 풃ퟑ 풄 to minimize the objective function 푭(풃) = 푹푴푺{흓풆풍(풇)}

where 흓풆풍 = [ 푪풆풍 ] 푼(풃)

[푴]푼̈ (풃) + [푪]푼̇ (풃) + [푲]{푼(풃)} = {푷}

subject to 품ퟏ(풃) = 풇풂풍풍풐풘풂풃풍풆 − 풇풎풊풏 ≤ ퟎ

= ퟏퟔ − 풇풎풊풏 ≤ ퟎ

품ퟐ(풃) = 풎풂풔풔풕풐풕풂풍 − 풎풂풔풔풂풍풍풐풘풂풃풍풆 ≤ ퟎ

= 풎풂풔풔풕풐풕풂풍 − ퟏ. ퟐퟑퟓ/ퟑퟖퟔ. ퟏ ≤ ퟎ

ퟎ. ퟑ ퟏ. ퟐ 풃푳 ≤ 풃 ≤ 풃푼 → ퟎ. ퟔ ≤ 풃 ≤ ퟐ. ퟒ ퟎ. ퟗ ퟑ. ퟔ

Here 푪풆풍 is the row vector of constant optical coefficients and is read from a text file. Each optical node requires six optical coefficients to match the six DOF for each node. For this simple example, all eighteen optical coefficients are set to zero except those for translation in the vertical or y-direction. These are arbitrarily set to 0.5, 2.0, and 1.0 radians per inch for nodes one, two, and three, respectively. 푼(풃), the column vector of optical element DOF displacements, and 풇풎풊풏 , the lowest structural frequency, are calculated from the equation of motion (EOM) via

53

the finite element model and are dependent upon the design variables.

풎풂풔풔풕풐풕풂풍 is calculated in the constraint function using constant values of the beam dimensions, the material density, and the design variables.

풎풂풔풔풂풍풍풐풘풂풃풍풆 and 풇풂풍풍풐풘풂풃풍풆 are set by the user in the Matlab User

Parameters module.

The next step in the jitter minimization user process is to adjust the finite element model (FEM), which is shown in Figure 10. This model must be set to use the large mass method for base motion excitation. That is, all boundary conditions are removed, so the resulting eigenpairs will show six rigid body modes. Also, it must be set so that the base motion input node and the three response nodes have the lowest node numbers in the model, here nodes 1-4. Further, the FEM must be set to normalize the eigenvectors with respect to unity mass, ensuring that the generalized mass will be unity for all modes. Finally, it must be set to write the eigenvectors to the output data file (.dat) when the model is solved, so that the Matlab Read Modal Data module will be able to read these eigenvectors when it reads the eigenvalues.

54

Figure 10. Finite element model of the three-beam design.

Keeping with the user process shown in Chapter III, Figure 8, the next step is to parameterize the FEM input file. For the three beam design we set the parameters at the starting point design variables on lines six through eleven,

6 ** ------

7 *PARAMETER

8 designVar1 = 0.6

9 designVar2 = 1.2

10 designVar3 = 1.8

11 ** ------

55

and replace the values of the beam depths with the variables

, , and on lines 113, 117, and

121.

111 ** Section: beam_b Profile: beam_b

112 *Beam Section, elset=beams-1_Set-b, material=beam_b, temperature=GRADIENTS, section=RECT

113 0.3,

114 0.,0.,-1.

115 ** Section: beam_a Profile: beam_a

116 *Beam Section, elset=beams-1_Set-a, material=beam_a, temperature=GRADIENTS, section=RECT

117 0.3,

118 0.,0.,-1.

119 ** Section: beam_c Profile: beam_c

120 *Beam Section, elset=beams-1_Set-c, material=beam_c, temperature=GRADIENTS, section=RECT

121 0.3,

122 0.,0.,-1.

The next three steps are to prepare the Matlab code. Setting the

Matlab optimization user parameters is done in the Matlab User

Parameters module, setting the Matlab optimization constraints is done in

56

the Matlab conFun module, and tuning the optimization options and tolerances is done in the Matlab Main module. Listings of all code modules for this example are provided in Appendix B. Note in the Matlab Main module that, while multi-start and global search functions are available in the code, they are not employed in this example. Instead, this example is run as a local only search.

The final step is to run the code and, either allow the code to run until one of the termination criteria are satisfied, or stop the code using the stop button on the design variable and objective function plot window when convergence appears acceptable to the user.

For this three-beam design, the optimization was stopped by the user after eight iterations. The resulting design variable and objective function plots are shown in Figure 11. These plots give a pictorial representation of the final scaled design variables and the history of the scaled objective function. The optimized values of the scaled design variables are 풃ퟏ = ퟎ. ퟓퟒퟖ, 풃ퟐ = ퟏ. ퟐퟑퟓ, 풃ퟑ = ퟏ. ퟕퟗퟓ inches. Since the scale factor for design variables was one, these are also the values of the final unscaled design variables. The scaled objective function started at 2.21 radians RMS and ended at 0.929 radians RMS. Since the objective function was scaled by a factor of 1000, the RMS value of the elevation jitter, 흓풆풍, due to a vertical base motion input went from 2.21 milliradians to

57

0.929 milliradians. This is a 58% reduction. The lowest natural frequency of the new design is 22.2 Hz, which meets the requirement of being greater than or equal to 16 Hz. The total mass of the three beams was

1.235 lbm, which meets the requirement of being less than or equal to the starting point mass of 1.235 lbm within the constraint function tolerance.

The total solution time for this small model was 22.4 minutes, which included solving the objective function 110 times. An examination of the objective function plot indicates that the solver could have been terminated after four or five iterations of the design variables while still obtaining a significant improvement from the starting point.

Figure 11. Plots of the final design variables and convergence of the objective function for Example 1.

58

Stepped shell design

The stepped shell design is a small problem, like the previous example, but it has three notable differences. First, the stepped shell design is of smaller dimensional scale, meaning the scaling factors must be adjusted appropriately to obtain proper numerical conditioning for the optimization algorithm. Second, the code is adjusted to allow three starting points for the optimization. This aids in finding the optimum design when multiple minimums exist. Finally, since the code will take longer to solve with multiple starting points, the objective function in the code has been changed from the RMS jitter value to the area under the jitter FRF. This moves the RMS jitter calculation to the end of the code so that it doesn’t have to be calculated on every iteration of the optimization process. This greatly speeds up the solution process.

The stepped shell design is illustrated in Figure 12, below. The objective is to optimize the thicknesses, ta, tb, and tc, of three shell sections to minimize elevation structural jitter, 흓풆풍, due to vertical base motion input, BM. These shells are indicated as shell a, shell b, and shell c, in the figure. Each has material properties of aluminum with density = 0.098 lbm/in3, modulus of elasticity = 10 Mpsi, and Poisson’s ratio = 0.33. The widths (z-direction) of the three shells are 0.500, 0.500, and 0.250 inches, respectively, and lengths (x-direction) of the three shells are 0.500, 1.000,

59

and 1.500 inches, respectively. Point masses are placed at nodes 1-3 to represent the optical elements: 0.02 lbm at nodes 1 and 3, and 0.01 lbm at node 2. A relatively large ground mass of 1.00 lbm is placed at node 4 and enables the vertical base motion input. The initial starting point for the design variables, that is, the shell thicknesses, is 0.040 inches for each section, but, as previously stated, there will be a total of three starting points. The design variable lower limits are 0.040, 0.030, 0.020 inches, respectively, and the upper limits are 0.080 inches for each. The total mass of the shells cannot exceed the mass at the initial design, which is

0.004288 lbm. The lowest structural natural frequency when the design is optimized must be higher than 17 Hz.

Figure 12. Stepped shell design.

The problem is defined as follows.

풃ퟏ 풕풂 Find the vector of design variables 풃= 풃ퟐ = 풕풃 풃ퟑ 풕풄

60

to minimize the objective function 푭(풃) = ∫ 푯 흓 풅풇 풆풍 푩푴

where 흓풆풍 = [ 푪풆풍 ] 푼(풃)

[푴]푼̈ (풃) + [푪]푼̇ (풃) + [푲]{푼(풃)} = {푷}

subject to 품ퟏ(풃) = 풇풂풍풍풐풘풂풃풍풆 − 풇풎풊풏 ≤ ퟎ

= ퟏퟕ − 풇풎풊풏 ≤ ퟎ

품ퟐ(푏) = 풎풂풔풔풔풉풆풍풍풔 − 풎풂풔풔풂풍풍풐풘풂풃풍풆 ≤ ퟎ

= 풎풂풔풔풔풉풆풍풍풔 − ퟎ. ퟎퟎퟒퟐퟖퟖ/ퟑퟖퟔ. ퟏ ≤ ퟎ

ퟎ. ퟎퟒퟎ ퟎ. ퟎퟖퟎ 풃푳 ≤ 풃 ≤ 풃푼 → ퟎ. ퟎퟑퟎ ≤ 풃 ≤ ퟎ. ퟎퟖퟎ ퟎ. ퟎퟐퟎ ퟎ. ퟎퟖퟎ

Once the objective function, 푭(풃), has been minimized, the structural jitter is calculated for the optimized design as shown in Chapter

III, equation (4).

Next, the FEM input file is parameterized, and the Matlab User

Parameters module, the Matlab conFun module, and the Matlab Main module are set up similarly to the first example. As previously mentioned, the scaling factors must changed significantly for the size of the structure.

The design variable scale factor is set to alpha = 1/0.01, the objective function scaling factor is set to beta = 1/1.0, the frequency constraint

61

scaling factor is set to 1/1.0, and the mass constraint scaling factor is set to 1/1E-9. Listings of the Matlab modules are provided in Appendix C.

Finally, the code is executed and either allowed to terminate after each trial or stopped by the user as convergence is approached. For this example, the first of the three starting points converged to the lowest objective function. The objective function history and plot of the optimized design variables for this starting point are shown in Figure 13.

Figure 13. Plots of the final design variables and convergence of the objective function for Example 2.

For this design, the RMS value of the elevation jitter, 흓풆풍, due to a vertical base motion input went from 13.4 milliradians to 13.0 milliradians.

This reduction of 3.1% appears small, but the improvement was limited

62

due to the scale and constraints of the design. Nonetheless, this example has demonstrated use of the structural jitter minimization process for small scale structures.

Optical imaging system design

The final example demonstrates the structural jitter minimization process with a larger and practical example, the two-axis, optical imaging system of Appendix A. This sensor system is illustrated in Figure 14.

Figure 14. Two-axis, optical imaging system.

The structural jitter values for this system without , referred to as uncorrected structural jitter, were calculated in

Appendix A to be 49.4 µrad RMS in azimuth and 39.7 µrad RMS in elevation due to lateral base motion input, 91.9 µrad RMS in azimuth and

63

138 µrad RMS in elevation due to vertical base motion input, and 20.0

µrad RMS in azimuth and 81.7 µrad RMS in elevation due to longitudinal base motion input. As discussed in the appendix, these values are typically calculated for each axis separately. In this example we focus on the worst case values and simultaneously reduce the azimuth and elevation structural jitter due to vertical base motion input.

Six variables are selected to optimize this design. These are shown in Figure 15. The first is the thickness of a 0.500-inch wide shell placed around the solid elements at the forward opening of the afocal housing.

This shell thickness represents the height of a stiffening rib beyond the thickness of the solid elements themselves. The small lower limit of this thickness is .001 inch and represents a case where the rib is not present.

The upper limit is set to 0.500 inch, and the starting point is 0.125 inch.

The second design variable is the thickness of a shell, which is wrapped around the solid elements of the cylinder on afocal housing aft of the forward rib. This shell represents an additional thickness above the height of the original solid cylinder wall. Like the first variable, the lower limit of this variable is .001 inch, allowing for a case where this additional thickness is not present. The upper limit of this variable, the maximum additional thickness, is set to 0.125 inch, and the starting point is set to

0.063 inch. The third design variable is the thickness of all shells

64

representing the primary mirror mount, which is modeled only with shell elements. The starting point for this thickness is 0.125 inches, the lower limit is 0.063 inches, and the upper limit is 0.250 inches. The fourth, fifth, and sixth design variables are the thicknesses of shells a, b, and c of the imager housing. Like the primary mirror mount, the imager housing is modeled of only shell elements. The starting point, lower limit, and upper limit for each of these shell thicknesses is 0.125, 0.050, and 0.250, respectively.

Figure 15. The six design variables for the imaging system optimization.

The objective function to be minimized in this design is the root sum square (RSS) of the RMS values of the areas under the azimuth and elevation jitter FRFs. The constraints are to prevent the mass of the

65

optimized design from exceeding the mass of the starting point design and to keep the first structural mode equal to or above 45 Hz.

In keeping with the jitter minimization user process, the problem is mathematically defined as follows.

풃ퟏ ⎧풃 ⎫ ⎪ ퟐ⎪ 풃 Find the vector of design variables 풃 = ퟑ ⎨풃ퟒ⎬ ⎪풃ퟓ⎪ ⎩풃ퟔ⎭

ퟐ to minimize the objective function 푭(풃) = 푯 흓 풅풇 + ∫ 풂풛 푩푴

ퟏ ퟐ ퟐ ∫ 푯 흓 풅풇 풆풍 푩푴

where 흓풂풛 = [ 푪풂풛 ] 푼(풃)

흓풆풍 = [ 푪풆풍 ] 푼(풃)

[푴]푼̈ (풃) + [푪]푼̇ (풃) + [푲]{푼(풃)} = {푷}

subject to 푔(푏) = 푓 − 푓 ≤0

= 45− 푓 ≤0

푔(푏) = 푚푎푠푠 − 푚푎푠푠 ≤0

= 푚푎푠푠 − 2.69/386.1 ≤ 0

66

0.001 0.500 ⎧ ⎫ ⎧ ⎫ ⎪0.001⎪ ⎪0.125⎪ 0.063 0.250 푏 ≤ 푏 ≤ 푏 → ≤ 푏 ≤ ⎨0.050⎬ ⎨0.250⎬ ⎪0.050⎪ ⎪0.250⎪ ⎩0.050⎭ ⎩0.250⎭

Once the objective function, 퐹(푏), has been minimized, the structural jitter is calculated for the optimized design as shown in Chapter

III, equation (4). The input PSD is shown in Figure 13 of Appendix A.

Next, the FEM is adjusted by removing the boundary conditions and creating a large mass at the base motion location. This allows for the initial six rigid body modes. For this model, there are two additional rigid body modes, the motion of the azimuth gimbal axis and the motion of the elevation gimbal axis, resulting in a total of eight rigid body modes. Using this model, the user writes the FEM input file and parameterizes it to allow for the six design variables. This is shown in lines 6 through 14, below.

6 ** ------

7 *PARAMETER

8 designVar1 = 0.10184

9 designVar2 = 0.028164

10 designVar3 = 0.25

11 designVar4 = 0.13302

12 designVar5 = 0.14948

13 designVar6 = 0.14609

67

14 ** ------

Then the user replaces all usage of these values with the design variable names as shown in the various lines of the FEM input file below.

55887 ** Section: afocal_hous_fwd_lip

55888 *Shell Section, elset=RICK_SCOTT_AFOCAL_HOUS_Set-

fwd_lip, material=afocal_hous, offset=SNEG

55889 , 5

55890 ** Section: afocal_hous_cyl_thk

55891 *Shell Section, elset=RICK_SCOTT_AFOCAL_HOUS_Set-

cyl_thk, material=afocal_hous, offset=SNEG

55892 , 5

94639 ** Section: primary_mirror_mount_shells

94640 *Shell Section, elset=primary_mirror_mount_shells-

1__PickedSet21, material=primary_mirror_mount

94641 , 5

125385 ** Section: imager_hous_shells_back_c

125386 *Shell Section, elset=imager_hous_shells-2__PickedSet91,

material=imager_hous

125387 , 5

68

125388 ** Section: imager_hous_shells_front_a

125389 *Shell Section, elset=imager_hous_shells-2__PickedSet89,

material=imager_hous

125390 , 5

125397 ** Section: imager_hous_shells_top_b

125398 *Shell Section, elset=imager_hous_shells-2__PickedSet90,

material=imager_hous

125399 , 5

The next steps for the user are to set the parameters in the Matlab

User Parameters module, create the constraints in the Matlab conFun module, and tune the optimization options and tolerances in the Matlab

Main module. These modules, as well as all other modules for this example, are provided in Appendix D. Finally, the user runs the code.

There are some important points to note in the lines of code for this design. First, structural modes seven and eight, the azimuth and elevation rigid body modes, are listed in the Matlab User Parameters module for elimination. As stated in Appendix A, rigid body modes are eliminated from the structural jitter calculation because this motion is addressed in the control systems jitter calculation. Second, as in the stepped shell design, optimization occurs by minimizing the areas under the structural jitter

69

FRFs, and the calculation of the jitter PSD response is moved to after the optimization algorithm is complete. These modifications significantly reduce the time required to complete the optimization process.

For this problem, the user stopped the optimization process after seven iterations because significant progress had been made and continued convergence was progressing slowly. The plot of final design values and plot of convergence history is shown in Figure 16. The final

푏 ⎧ ⎫ 0.208 푏 ⎧ ⎫ ⎪ ⎪ ⎪0.010⎪ 푏 0.250 values of the design variables are 푏 = = 푏 = inch, which ⎨푏⎬ ⎨0.144⎬ ⎪푏⎪ ⎪0.119⎪ ⎩ ⎭ ⎩푏⎭ 0.118 have been rounded to the nearest 1/1000 inch for reasonable mechanical dimensions. The scaled objective function started at 1.0257 and ended at

0.3723. The resulting uncorrected structural jitter values are 47.3 µrad

RMS in azimuth and 43.0 µrad RMS in elevation, which are reductions from the starting point values of 48.5% and 68.8%, respectively. The time required to run this optimization and calculate the resulting structural jitter values was two hours and twelve minutes.

70

Figure 16. Plots of the final design variables and convergence of the objective function for the optical imaging system design.

71

CHAPTER 5: SUMMARY, CONCLUSIONS, AND RECOMMENDATIONS

This chapter summarizes the investigation and results. I draw conclusions about the final optimization process, discuss practical implications, provide recommendations for the user of the process, and recommend research tasks to further this work.

Since optical sensor systems are becoming ubiquitous, calculating image jitter is likely becoming a more common task among engineers who develop these systems. A portion of this jitter comes from structural dynamics, so I posed the question of whether minimizing this structural jitter could be aided by using automated structural optimization. I surveyed the literature and found that no authors had published works on the more focused topic of using dynamic response optimization to reduce structural jitter during the mechanical design phase of an optical sensor system.

Given this topic, I undertook the task of developing a parametric, dynamic response optimization process implemented in the frequency domain. The results of that effort are presented herein.

After developing this process, I applied it in solving three example design problems to both test it and illustrate its use. The first example is a small design problem that a user can solve with the automated process and by hand calculations for comparison. The second example illustrates how the process may be adjusted for designs of smaller scale. The final

72

and most practical example is the reduction of structural jitter for the two- axis, imaging sensor system of the paper presented in Appendix A. In this example, six design variables were optimized, reducing azimuth and elevation structural jitter due to vertical base motion input by 49% and

69%, respectively. The optimization solver took only two hours and twelve minutes, and I expect that, without the automation, this improvement process would have taken one or two days.

Therefore, the process documented here does answer the research question. This document shows that parametric dynamic response optimization can be applied to reduce structural jitter in optical sensor systems. The practical implication is that the developed process will reduce the time and labor required to perform this task. Further, the documented process provides an explicit design approach for mechanical engineers. With this process they will rely less on engineering judgment and more on sensitivities of the design variables.

I next recommend different uses of the process. First, recognizing the value of the constraint functions is not as simple as recognizing the value of the objective function and design variables. When setting the constraint function scale factors, the user might run the code with the number of iterations set to zero so the code will verify the constraint function values, enabling the user to check the scale factors. Second, the

73

user should try multiple starting points to aid in finding the optimum among multiple minimums. This is a common recommendation in the optimization community. Next, the user should consider running an optimization using the moduli of elasticity of all parts as design variables to identify which parts are the most significant contributors. Finally, the user should perform a sensitivity analysis of all desired variables using the finite difference calculation from the Matlab fmincon() function. This can be done by setting the number of iterations in the code to zero. Then, the code will calculate gradients for each variable near the starting point. The gradients will change as the optimization process progresses towards the minimum, but the starting gradients will help the user to prioritize design variables.

There are numerous opportunities to increase capability, improve performance, and improve the user interface. Some considerations are as follows.

 Add error checking throughout code.

 Continue inspection of code to identify opportunities to

increase efficiency and reduce solution time.

 Adjust the code to calculate dynamic displacement, velocity,

or acceleration responses at any response node.

 Include remeshing of Abaqus model to allow for use of solid

model dimensions as design variables.

74

REFERENCES

Boggs, P. T. and J. W. Tolle. 1995. “Sequential Quadratic

Programming.” Acta Numerica 4: 1–51.

Choi, W. and G. Park. 1999. "Transformation of Dynamic Loads into

Equivalent Static Loads Based on Modal Analysis." International

Journal for Numerical Methods in Engineering 46, no. 1: 29–43.

Choi, W. and G. Park. 2002. "Structural Optimization using Equivalent

Static Loads at all Time Intervals." Computer Methods in Applied

Mechanics and Engineering 191, nos. 19–20: 2105–2122.

Doyle, K. B. 2007. "Design optimization of a dual mode multi-axis passive

isolation configuration for MLCD." Optical Engineering Applications,

Anonymous International Society for Optics and Photonics 66650G-

66650G-12.

Doyle, K. B., V. J. Cerrati, and S. E. Forman. 1995. "Optimal structural

design of the airborne infrared imager." Optomechanical and

Precision Instrument Design, Anonymous International Society for

Optics and Photonics 2542: 11–23.

Doyle, K. B., V. L. Genberg, and G. J. Michels. 2012. Integrated

Optomechanical Analysis. 2nd ed. Bellingham, WA: SPIE Press.

Fiete, R. D. and B. D. Paul. 2014. "Modeling the Optical Transfer Function

in the Imaging Chain." Optical Engineering 53, no. 8: 83103–83103.

75

Fox, R. and M. Kapoor. 1970. "Structural Optimization in the Dynamics

Response Regime-A Computational Approach." AIAA Journal 8,

no. 10: 1798–1804.

Fox, R. and L. Schmit. 1965. "An Integrated Approach to Structural

Synthesis and Analysis." AIAA Journal 3, no. 6: 1104–1112.

Fox, R. and L. A. Schmit, Jr. 1966. "Advances in the Integrated Approach

to Structural Synthesis." Journal of Spacecraft and Rockets 3, no.

6: 858–866.

Giorgi, G. and T. H. Kjeldsen. 2013. Traces and Emergence of Nonlinear

Programming. New York: Springer Science and Business Media.

Kang, B., W. Choi, and G. Park. 2001. "Structural Optimization Under

Equivalent Static Loads Transformed from Dynamic Loads Based

on Displacement." Computers and Structures 79, no. 2: 145–154.

Messac, A. 2015. Optimization in Practice with MATLAB®: For

Engineering Students and Professionals. London: Cambridge

University Press.

Park, G. 2007. Analytic Methods for Design Practice. London: Springer.

Pierson, B. L. 1972. "A Survey of Optimal Structural Design Under

Dynamic Constraints." International Journal for Numerical Methods

in Engineering 4, no. 4: 491–499.

76

Querido, T. and D. Kim. 2008. "Lagrange, Joseph-Louis." Encyclopedia of

Optimization, eds. C. A. Floudas and P. M. Pardalos 3: 120–122.

Kluwer Academic Publishers.

Rao, S. S. and S. S. Rao. 2009. Engineering Optimization: Theory and

Practice. Hoboken, NJ: John Wiley & Sons.

Schmit, L. 1960. "Structural Design by Systematic Synthesis."

Proceedings: 2nd Conference on Electronic Computation, ASCE:

105.

Scott, R. L. 2018. "An Investigation of Methods used to Calculate Image

Motion due to Structural Flexure in Optical Systems." See Appendix

A.

Sun, X., H. Wang, and S. Wang. 2014. "Optimization Design Method of

Satellite Imaging Chain Related with Optical Axis Jitter."

International Symposium on Optoelectronic Technology and

Application 2014: Imaging Spectroscopy; and Telescopes and

Large Optics 9298: 92981.

Vanderplaats, G. N. 2007. Multidiscipline Design Optimization.

Vanderplaats Research & Development, Incorporated.

Wasiutynshi, Z. and A. Brandt. 1963. “The Present State of Knowledge in

the Field of Optimum Design of Structures.” Applied Mechanics

Reviews 16, no. 5: 341–350.

77

Williams, A. L., V. L. Genberg, and S. M. Gracewski. 1999. "Simultaneous

Design Optimization of Optomechanical Systems." Optomechanical

Engineering and Vibration Control 3786: 236–248.

78

APPENDIX A

An Investigation of Methods Used to Calculate Image Motion Due to

Structural Flexure in Optical Systems

Richard L. Scott, PE

Raytheon Company [email protected]

B.P. Wang, PhD

The University of Texas at Arlington, Department of Mechanical &

Aerospace Engineering [email protected]

Submitted for publication.

February 2018

79

I. Abstract

The literature of the field identifies documented methods for calculating image motion produced by structural jitter—that is, by structural flexure in optical systems. This paper presents terminology, calculation methods, and mitigation methods useful in reducing structural jitter. Included here is a detailed example of calculating structural jitter in a notional, yet modeled, single field-of-view imaging sensor mounted to a two axis gimbal system and subjected to performance-level vibration. All methods presented here are documented in publically-available literature.

II. Introduction

Motivation for the Study

Often, the performance of a structure is determined by its displacement under load instead of its strength. This standard of measurement guides performance assessment for many pointing systems, like lasers and imaging systems. As shown in Figure 1, with base motion input, the telescope’s structure will experience both rigid body

Figure 1. Flexure of telescope during vertical vibration.

80

and elastic displacements. Thus, the optical elements mounted inside the structure will be displaced from their original alignment. Displacement of these elements, both translational and rotational, causes line-of-sight

(LOS) pointing error, which manifests as motion of the image at the eye or sensor. In the electro-optics industry, this image motion is called jitter, and it is a significant contributor to poor image quality.

Reducing jitter in imaging systems is referred to as image stabilization or LOS stabilization. Because the task combines techniques from optics, structural dynamics, and control systems, it is interdisciplinary. In high-performance systems, this task is challenging because the components and sources of jitter are diverse. Separating those components and sources allows a design team to create a jitter budget and track jitter predictions. Typically, jitter from rigid body motions is addressed actively with the implementation of sensors and actuators. In contrast, jitter from structural flexure—hereafter referred to as structural jitter—is addressed, in general, passively with an improved structural design. Calculating structural jitter is the focus of this paper.

Objective and Scope

To identify documented methods of calculating structural jitter, the authors turned to extant literature in optics, structural dynamics, and control systems. The scope of this paper is to present terminology,

81

calculation methods, and mitigation strategies for structural jitter. The history of advances in these fields is largely irrelevant and therefore generally omitted. This paper includes a detailed example of calculating structural jitter in a single field-of-view optical system mounted to a two- axis gimbal system. Note that all methods presented are documented in publically-available literature.

Besides creating structural jitter, dynamic structural flexure also degrades image quality by distorting image wavefront. Such degradation is similar to the distortion of a mirror by a static bolt-up load or the dynamic wavefront error that occurs at higher frequencies. These wavefront errors are not part of the current discussion. The authors here address pointing error, or structural jitter, although we do consider averaging nodal displacements of large optical surfaces to obtain the average pointing error of the element.

Assumptions that demarcate the scope of this study follow. First, we assume that we will implement some active LOS correction techniques using sensors and actuators, so we must account for those in our calculations. Second, in the interests of improving the mechanical design, we prefer passive mitigation strategies. Third, we assume that examining structural jitter response to rotational base motion inputs is unnecessary.

Granted, real vibrating platforms generate base motion inputs in all six

82

degrees-of-freedom, but the rotational vibrations typically have significant levels only in low frequencies. In addition, these motions are often addressed with rotational control systems and without the need to adjust the mechanical design. The calculations presented here with translational inputs are suitable for rotational inputs if the reader so desires.

III. Background and Relevant Terminology

This section introduces brief background information, presents electro-optic terminology relevant in later sections, and identifies the literature that employs similar terms.

Image Motion

Hilkert and Amil (2010) provide a thorough overview of the various effects that structural dynamics have on precision pointing systems, such as lasers and imaging systems. This paper focuses on the first structural effect considered by Hilkert and Amil (2010), which is bending. As previously mentioned, flexure of the structure results in motion of the optical elements, which in turn causes structural jitter (motion of the LOS and image). Genberg, Doyle and Michels (2004, 1) describe jitter as “the apparent motion of a stationary object as viewed by an optical sensor” and

“the motion of the gut [light] ray on the image plane.” Accordingly, we define structural jitter as the component of this image motion caused by structural flexure. Structural flexure may be caused by base motion

83

vibration, on-board self-excitation (as from fans or actuators), or simply static acceleration from gravity or vehicle maneuvers.

Figure 2. Image blur due to sensor motion (Fiete and Paul 2014).

Structural jitter, and jitter in general, degrades images. However, the ways in which images are degraded are measured by the characteristics of degradation that they exhibit. Lucke, Sirlin and San

Martin (1992) were among the earliest scholars to investigate the phenomenon of jitter, the effects of which they categorized as either AC or

DC. While AC effects constituted distortion of the image, DC effects entailed a shift in the image. More recent works by Pittelkau and McKinley

(2014; 2016) specified the decomposition of images due to jitter into three categories: 1) “displacement,” an average offset of the image; 2) “smear,” a streaking of the image typically caused by constant velocity or low frequency motion; and 3) “jitter,” image blur, typically caused by vibration.

Figure 2, used here with permission from Fiete and Paul (2014), shows

84

example images with no blur, blur due to smear, and blur due to jitter, respectively.

Regardless of image decomposition, this image motion falls on the frequency domain between rigid body, zero Hertz, and very high frequency. Experimenters may reduce low frequency content by implementing active stabilization and image processing. However, image motion of high frequency content, or higher frequency than the sensor integration time, will appear as image blur. Doyle, Genberg and

Michels (2012) call the low frequency component “drift” and the high frequency component “jitter.” They propose functions of the sensor integration time, which they took from Lucke, Sirlin and San Martin (1992), to separate these components.

Metrics of image quality are many, and examining these various metrics is beyond the scope of this paper. The measure most commonly used for evaluating the degradation of image quality is known as the modulation transfer function (MTF). MTF is a plot of image contrast as a function of spatial frequency. While Doyle, Genberg and Michels (2012) overview MTF and other optical measures, Pittelkau and McKinley (2014;

2016) are detailed in their mathematical discussion of such measures.

When researchers determine MTF for each contributor, such as structural

85

jitter and wavefront error, those figures are multiplied to reach the total system MTF.

A Common Telescope

An imaging system transforms an image from object space to image space for observation or recording. Figure 3 identifies the major components of a common imaging system known as a Cassegrain telescope (King 1955). Here, the observed object is defined in object space by azimuth and elevation angles, identified as ϕ푎z and ϕ푒푙. Light rays from the far-away object pass through a window and enter the system as parallel, or collimated, rays. Collimated light rays are gathered and reflected by the primary mirror, reflected by the secondary mirror and focused on the image plane of the sensor. This image plane exists within two-dimensional image space and is defined by transverse and vertical translations, x and y.

Figure 3. Some nomenclature for a common Cassegrain telescope.

86

At the image plane, a two-dimensional array of sensor detectors captures the image, as shown in Figure 4. These detectors may sense in the visible or infrared frequencies of the electromagnetic spectrum. If the detector array is coarse, image motion is less significant because image features stay on a detector more often. As sensors are produced with higher resolution, the detectors have become smaller to limit size and weight, so image features will move off of detectors more often and cause image distortion.

Figure 4. Image spot on an array of detectors/.

Note that the captured image data is observed in blocks referred to as

“pixels.” The terms “detector” and “” are often used interchangeably in the electro-optic sensor industry, so it is appropriate to say that the image plane of the detector is comprised of an array of pixels.

As with any plane, the image plane has only two independent degrees of freedom (DOF). Here, we use x and y. Importantly, image

87

motion in object space may be mapped to the two-dimensional image space, and vice versa. If the angles ϕ푎z and ϕ푒푙 are small, so that tan휙 ≈ 휙, then the transformation between object space and image space is simply

∆푥 = 퐸퐹퐿 ∗ 휙 (1)

훥푦 = 퐸퐹퐿 ∗ 휙 (2) where EFL is the effective of the system. “Roll” of the object in object space is a change in azimuth and elevation angular location that varies linearly with radial location. This roll motion may be transformed to image space using the relationships in (1) and (2) if the radial variation in image space remains linear.

Figure 5. Six DOF rigid-body displacements of an optical element about its vertex.

Like any mass, each of the optical elements mounted within the system, whether lenses or mirrors or the sensor, have six DOF: three translations and three rotations. Figure 5 shows terminology for these motions in the field of electro-optics. “Decenter” describes lateral translation, either transverse or vertical, of the element away from the

88

center axis. “Despace” describes translation along the center axis. “Tilt,” or sometimes “tip,” describes rotations of the element about the horizontal axis (“pitch”) or vertical axis (“yaw”). Finally, “roll” defines rotation about the center axis. Motion of the supporting structure will result in displacements of the optical element in any of these six DOF, and each of the displacements may result in motion of the image on the image plane.

Example Imaging System

Figure 6 shows two-dimensional and three-dimensional views of the optical layout for this paper’s example imaging system. The incoming rays first reflect off of the primary mirror, then the secondary mirror, the fold mirror, the tertiary mirror, and fast steering mirror. After the reflecting off the fast-steering mirror, rays proceed through the lenses of the front and rear lens groups and focus on the image plane of the camera sensor.

The forward elements of the optical system, from the incoming collimated light rays in front of the primary mirror to the collimated light rays after the tertiary mirror, are referred to as an “afocal” system because neither rays entering nor rays exiting are focused.

89

Figure 6. Optics layout for example imaging system.

All of the optical elements are mounted into the afocal and imager assemblies, as shown in the section view of Figure 6. As the name indicates, the afocal assembly contains the previously defined afocal system and its supporting structure. The afocal assembly is sometimes referred to as the telescope because it contains the elements that magnify the image. The imager assembly contains the lens assemblies, focus mechanism, the camera, and its supporting structure.

Between the afocal system and the imager optics is the two-axis fast-steering mirror (FSM). This FSM is similar to that shown in Figure 7, which is a FSM produced by Ball Aerospace & Technologies Corporation.

The FSM is the actuating component of the image motion compensation

(IMC) system, a system implemented as part of the image stabilization

90

effort. The IMC measures motion with a sensor and moves a mirror at a high rate to adjust, or compensate, for the motions sensed. The sensors for this paper are azimuth and elevation rate gyros, which are mounted to the imager housing. These gyros measure azimuth and elevation rate relative to an inertial reference frame, the integral of which is used in a control signal sent to the FSM:

Figure 7. Fast steering mirror produced by Ball Aerospace for the Guardian program. Image used with permission from Ball Aerospace & Technologies Corp. and taken from http://www.ball.com/aerospace/programs/guardian .

Figure 8 shows the two-axis gimbal system used in this example:

91

Figure 8. Example two-axis imaging system.

The elevation gimbal is actuated by a motor on the starboard side of the system and is supported by bearings on both the starboard and port sides.

The elevation range is -45° to +45° from horizontal. The azimuth gimbal is actuated and supported by a motor and bearing set, which are located in the mount. The azimuth range is -90° to +90° from forward. Using two elevation shafts, the entire receiver is supported by the yoke.

The example system discussed here is simplified for the purposes of this research. Typically, power would be supplied via cable from an off- board power supply, and the system would require circuit boards—such as a power regulating board, a video processing board, and a control system board—to be mounted to the afocal assembly. The typical system would have covers with a front window. The covers would reduce drag

92

and prevent dust and other contaminants from accumulating on the optics and degrading the image. Because this project proposes methods for reducing structural jitter, such non-structural details are unnecessary for this paper. Furthermore, imaging systems may have more than two gimbal axes and often have multiple with multiple fields of view, which would require that the sensor have various switching mechanisms. In contrast, our simplified example system has two gimbal axes, azimuth and elevation, and one field of view, or optical path, which enters the system and travels from the primary mirror to the camera sensor.

Structural Jitter Requirements

The structural jitter requirement—that is, the maximum allowable jitter—is determined from the jitter budget for the entire system. As noted above, modulation transfer function (MTF) is calculated for each of the budget items, and experimenters multiply these MTFs to determine the system level MTF. Prior to this detailed budget allocation, an estimate or preliminary determination of the allowable structural jitter may be determined using the sensor pixel size as follows.

To limit blur, we desire that a light ray stay on a single detector during sensor time. For frequencies faster than the sensor integration time, it is helpful to limit the structural jitter in image space to a fraction of the individual detector size. We equate pixel size with detector

93

size and conclude that the structural jitter in image space should be limited to a fraction of the published pixel size. Though the requirement is determined in image space using pixel size, it is typically calculated as object space angles, ϕ푎z and ϕ푒푙, using the relationships of (1) and (2), above.

Since most platform specifications give random vibration profiles as the performance vibration requirement, the root mean square (RMS) value of structural jitter, which is equivalent to the standard deviation (σ) for random vibration profiles, should stay below the ϕ푎z and ϕ푒푙 specified.

Lucke, Sirlin and San Martin (1992) note that a 1σ requirement is an appropriate specification because much of the light from a ray falls outside of the detector element anyway, so attempting to limit the image motion beyond 1σ is excessive. While Genberg, Doyle and Michels (2004) recommend the object space angle equivalent of a quarter of a pixel, larger fractions than a quarter have proved useful for two reasons: first, the quarter fraction can be a challenging requirement for today’s high- resolution sensors with small pixels; and second, statistical methods are employed in the jitter budget rollup and calculation of system level jitter.

Therefore, in the analysis that follows, we use half of a pixel as a threshold and a quarter pixel as the goal.

94

Thus, by proposing that our optical system has an EFL of 600mm and that the camera in our system has a pixel size of 5.86um horizontally by 5.86um vertically, we assume the maximum allowable structural jitter values calculated from (1) and (2) are ϕ푎z = 2.4 µrad RMS goal and 4.9

µrad RMS threshold; and ϕ푒푙 = 2.4 µrad RMS goal and 4.9 µrad RMS threshold.

Importantly, because limiting image motion is a performance requirement, we compare this jitter requirement to structural jitter calculated during performance vibration level inputs.

IV. Calculation of structural jitter

Modeling process

Early in the development of the sensor, the mechanical engineer and optics designer should agree on an appropriate location and orientation of the global coordinate system. Such coordination ensures that finite element global displacements are consistent with optical element locations and optical coefficients generated by the optics code.

For the example system in this paper, the model coordination process proceeded as follows.

With a general understanding of the system envelope, the optics designer provided the initial optical system layout of Figure 6, above.

Then, the mechanical engineer created the structure of Figure 8, also

95

above, and specified the location and orientation of the global coordinate system relative to a local coordinate system in the optical layout. For this sensor, the global coordinate system was located relative to the vertex of the primary mirror, as shown in Figure 9, below, with the X-axis pointing to port, the Y-axis pointing upward, and the Z-axis pointing forward. The mechanical engineer located the global coordinate system at the intersection of the gimbal axes to ensure that rigid body displacements of the control system model were consistent with the finite element and optics models.

Figure 9. Definition of global coordinate system at the intersection of the gimbal azimuth and elevation axes.

Next, the optical designer updated the optical model using the coordinate system specified and provided the optical element locations shown in Table 1, below, and the optical coefficients shown in Table 2 and

96

Table 3, also below. We do not provide roll coefficients for the example system here because we did not calculate roll jitter, which researchers often omit in systems analysis since it has proven insignificant when compared to azimuth and elevation jitter. Although roll jitter increases in relevance as systems move toward higher resolutions, those additional calculations do not add value to the discussion in this paper.

Table 1. Optical element locations with respect to global coordinate system.

Optical Coordinates (inch) Element Description Number X Y Z 1 PRIMARY MIRROR 0.000000 -3.670002 -2.660002 2 SECONDARY MIRROR 0.000000 2.439149 12.334915 3 AFOCAL FOLD MIRROR 0.000000 4.069347 -0.978661 4 TERTIARY MIRROR 0.000000 -8.558473 0.496387 5 FAST STEER MIRROR 0.000000 5.745985 0.575889 6 FRONT LENS GROUP 0.000000 5.745985 -0.998914 7 REAR LENS GROUP 0.000000 5.745985 -3.458599 8 CAMERA SENSOR 0.000000 5.745985 -5.966739

Table 2. Azimuth optical coefficients with respect to global coordinate system.

Optical Azimuth/Displacement (rad/inch or rad/rad) Element Number 휕휙/휕푥 휕휙/휕y 휕휙/휕z 휕휙/휕rx 휕휙/휕ry 휕휙/휕rz 1 0.04734688 0 0 0 1.92603189 -0.37728589 2 -0.03203858 0 0 0 -0.44772005 0.05968181 3 0.00000000 0 0 0 0.03109057 0.03126387 4 -0.01530414 0 0 0 0.01839806 0.33198166 5 0.00000000 0 0 0 0.16749711 -0.16656864 6 -0.02227797 0 0 0 -0.03337946 0.00000000 7 -0.02003215 0 0 0 0.02908803 0.00000000 8 0.04230595 0 0 0 -0.00138181 0.00000000

97

Table 3. Elevation optical coefficients with respect to global coordinate system.

Optical Elevation/Displacement (rad/inch or rad/rad) Element Number 휕휙/휕푥 휕휙/휕y 휕휙/휕z 휕휙/휕rx 휕휙/휕ry 휕휙/휕rz 1 0 -0.04379617 0.01784383 1.99875928 0.00019199 0.00023540 2 0 0.02861851 -0.01970690 -0.46611496 0.00002389 -0.00003131 3 0 0.01340805 -0.01332954 0.05595617 0.00002509 0.00000000 4 0 0.00177521 0.01519260 0.33296106 0.00000949 0.00004475 5 0 0.00000000 0.00000000 -0.33292085 0.00000307 -0.00016553 6 0 -0.02226390 0.00000000 0.03335462 0.00001048 0.00000000 7 0 -0.02001848 0.00000000 -0.02906804 0.00000761 0.00000000 8 0 0.04227677 0.00000000 0.00138086 0.00000000 0.00000000

Optical coefficients

An optical coefficient relates the motion of an optical element or group of optical elements to image motion on the image plane, either in object space or image space. Researchers have employed various terms for these coefficients: “optical sensitivity coefficient” (Genberg, Doyle, and

Michels 2004; Doyle 2007; Genberg, Michels, and Doyle 2011); “structural influence coefficient” (DeBruin and Johnson 1994a; 1994b); and “opto- mechanical influence function” (Hatheway 2016). “Boresight coefficient” is also in use but typically implies the response to static loads, such boresight shift under temperature change and boresight shift under bolt-up loads. Debruin and Johnson (1994b) provide both a history of image motion caused by structural flexure and an in-depth definition and derivation of optical coefficients.

98

These coefficients are dependent upon the location chosen as the reference point for the optical element or group. In this paper, the image motions are caused by linear vibration, so the coefficients are calculated as linear perturbations about that reference point. Specifically, the coefficients for a particular optical element or group are the rate of change of azimuth and elevation angular motion with respect to each of the six

DOF of that optical element, as shown in equations (3) and (4).

휕휙 (3) 퐶 = , 푖 = 1,2, . . .6 휕푢

휕휙 (4) 퐶 = , 푖 = 1,2, . . .6 휕푢 As shown in these equations and in Tables 2 and 3 above, for each optical element for each response angle, there are six optical coefficients, which may be determined analytically or numerically. For the example problem in this study, researchers determined the coefficients numerically using optical modeling software—that is, by moving the optical element in that DOF and calculating the resulting movement of the image on the image plane. The analytical method has been employed in past studies

(Doyle, Genberg, and Michels 2012; DeBruin and Johnson 1994a; 1994b;

Burge 2006). In addition, Hatheway (2016) also exhibits the accuracy of using analytical methods using hand calculations, spreadsheet methods,

99

and automated methods. Since the primary mirror typically has the largest magnification, it will usually have the largest optical coefficient. Therefore, structural jitter is most sensitive to this optical element.

Finite element modeling

Optics

Given the optical element locations of Table 1, the mechanical engineer for this study created the optical path of Figure 10 in the preliminary finite element model of the example imaging system.3 This optical path was created by inserting a node with six DOF for each optical element or group at the location specified in Table 1. Six DOF were required because the analysis process required these six DOF be multiplied by the six optical coefficients for each. High-accuracy locations of these nodes were required because we are concerned with very small angles when calculating structural jitter. Figure 10 shows these nodes attached with straight lines to indicate the progression of light from the primary mirror to the camera sensor. These lines contributed no mass or stiffness to the model. The nodes in Figure 10 may be compared to the optical elements shown in Figure 6 using the descriptions in Table 1.

3 All finite element modeling and solving discussed in this paper was performed using Abaqus, a finite element suite distributed by Dassault Systèmes Simulia Corp.

100

Figure 10. Optical path within the example finite element model.

In building the finite element model, the mechanical engineer considered the potential that the compliance of each part in the system might have a negative impact on structural jitter. If the compliance of a particular part was determined significant, then the engineer included this compliance. If a part’s compliance was determined insignificant, it was modeled with a mass element or mass and inertia elements. Given this criterion, component parts are represented in Table 4 below, which separates parts into groups to facilitate further discussion.

The eight optical nodes were constrained to seven optical parts in the model. Optical nodes 1–5 and optical node 8 were each constrained to a continuum or mass representation of itself. Optical node 6, the front lens group, and optical node 7, the rear lens group, were both constrained to the mass representation of the lens assembly. The primary mirror and the tertiary mirror were represented with tetrahedral elements because these

101

mirrors were large enough to expect that their compliance might have an effect on the structural jitter response.

The structural jitter calculation, presented below, assumes that each optical element is represented by the six DOF of a single node. This assumption is straightforward for optical nodes constrained to a mass and inertia representation because the six DOF of the optical node may simply be constrained to the six DOF of the node with the mass and inertia. For optical nodes constrained to continuum representations, such as the primary and tertiary mirrors, some technique must be applied to represent the motion of the continuum with a single node. Doyle, Genberg and

Michels (2012) propose using an interpolation element, a least squares best fit, or an area-weighted average motion constraint equation. For the example imaging system here, the engineer used a continuum distributing constraint in Abaqus, which allows for the selection of a uniform, linear, quadratic, or cubic weighting method.

102

Table 4. Element type used to represent each part or feature in the example imaging system.

Groups Part or feature description Element type Primary mirror Tetrahedrons Secondary mirror Mass, inertia Fold mirror Mass, inertia Optics Tertiary mirror Tetrahedrons Fast steering mirror Mass, inertia Lens assembly Mass, inertia Camera sensor Mass, inertia Afocal housing Tetrahedrons Imager housing Tetrahedrons Parts with Primary mirror mount Shells continuum Elevation shaft (2) Shells, beams representations Yoke Tetrahedrons Mount Tetrahedrons Linear slide carriage Mass, inertia Linear slide base Mass, inertia Linear slide compliance Connector Azimuth gyro Mass, inertia Elevation gyro Mass, inertia Parts or features Gyro balance mass Mass with simplified Elevation balance mass Mass representations Azimuth balance mass Mass Port elevation bearing Connector, mass Starboard elevation bearing Connector, mass Elevation motor Connector, mass, inertia Azimuth motor None Azimuth bearing Connector

Parts with continuum representations

Again, the mechanical engineer evaluated the compliance of the supporting structure and determined that the parts listed in Table 4 had compliance that could affect the structural jitter response. The afocal

103

housing, imager housing, yoke, and mount were modeled by automeshing solid cells with tetrahedral elements. The primary mirror mount was easily modeled with shell elements and the elevation shafts were easily modeled with a combination of shells and beams. Figure 11 shows the full finite element model for the example imaging system. The mesh is somewhat coarse because we were interested in dynamic displacements, not stresses that would require more refinement to obtain good results.

Figure 11. Two views of the finite element model for the example two-axis imaging system.

Parts or features with simplified representations

We modeled several required parts and features with simplified representations. The carriage and the base of the linear slide are very stiff, so they were modeled as mass and inertia elements at single nodes. The carriage was constrained to the base using a connector element that allowed for the compliance across the bearings between them. Connector

104

elements were also included to account for compliance in the azimuth and elevation bearings and the elevation motor shaft. The azimuth motor was not included because it resides at the boundary condition so that it has negligible effect on the dynamic response. The azimuth and elevation gyros, the displacements of which will be used in calculations of image motion correction, were represented as single points with mass and inertia elements. Finally, a point mass was used to represent a part that will be used to counterbalance the elevation gyro.

Assembly

When a part was represented by mass or mass and inertia at a single node, that node was constrained to the mating part using a continuum constraint. This constraint allowed for distribution of the forces based on a selected weighting method and helped to prevent over- stiffening the structure. When mating parts were both represented with a continuum mesh, those parts were held together with connector elements that represented individual fasteners. This method allowed for localized compliance.

Many optical systems use pins to align parts during assembly, but pins do not carry loads unless parts slip or a large amount of deflection occurs. In modal dynamics, responses are typically assumed to be small

105

linear perturbations about an equilibrium point. Therefore, we include no alignment pins in the model.

Most gimbaled imaging systems are balanced to reduce required motor torque and to reduce torque effects on the structure. Thus, we included point mass elements to balance the azimuth and elevation gimbal axes in this model. After balancing this system, the total mass was 43.3 pounds with the center of gravity at (X,Y,Z) = (0.456E-3, 4.544, -9.121E-6) inches with respect to the global coordinate system. Both gimbal axes were free to rotate and resulted in rigid body modes. The boundary conditions of the model were defined by fixing all six DOF of the outside node of the azimuth bearing.

In the development of a complex imaging sensor, structural jitter should be calculated throughout the design process to allow the engineering team to determine whether the design is converging on a solution that will meet the requirements. When design changes are expected to have a significant effect on jitter, the team should add detail to the model as the design progresses. Each subsequent jitter analysis gives a more realistic prediction of the final design. Doyle (2007) demonstrates this gradual process in updating the structural jitter calculation of the transmit terminal of the Mars Laser Communications Demonstrator as the design of the terminal isolators progressed. The analysis presented here

106

comprises only the initial structural jitter calculations using the preliminary model.

Modal data

The Abaqus/Standard Lanczos eigensolver was used to extract the required modal data for analysis of dynamic response to base motion: eigenvectors, eigenvalues, and modal masses. These data were extracted to 600 Hertz to capture appropriate characteristic dynamics to an input out to 500 Hertz. Twenty-nine structural modes were found in this range.

Table 5 shows the first twelve of these modes followed by several other modes of interest: 13 – 17, 21, and 25.

The 29 modes indicated accounted for 67%, 72%, and 73% of the total mass of the model in the X, Y, and Z-directions, respectively. See below for an examination of the roll-off of the structural jitter response as a determination of the suitability of these mass percentages. If more mass is required, additional natural modes may be extracted or residual modes may be employed. Regardless of the selected method, the solution must be accurate enough to calculate the small rotational displacements necessary for the structural jitter solution.

Researchers must verify that the first few elastic modes are not too low in frequency. Low modes—that is, 0–30 Hertz—may indicate that the structure will degrade the control system or will couple with base isolators

107

that may be incorporated later. In the example system here, the yoke was stiffened to move the lowest elastic mode frequency from 30 Hertz to 48

Hertz.

Table 5. Structural modes extracted from the finite element model of the example imaging

Mode Frequency Description Number (Hz) 1 0 Rigid body azimuth 2 0 Rigid body elevation 3 48.0 Lateral sway of yoke 4 49.9 Longitudinal sway of yoke 5 129 Distortion of afocal housing 6 133 Distortion of afocal housing 7 148 Yaw of receiver assembly 8 170 Distortion of afocal housing 9 181 Roll of receiver assembly Pitching of lens assembly out of phase with pitching of 10 202 afocal housing 11 216 Distortion of afocal housing 12 222 Distortion of afocal housing 13 262 Yaw of lens assembly 14 279 Pitch and roll of primary mirror on primary mirror mount Pitch and roll of primary mirror on primary mirror mount 15 294 and yaw of lens assembly Pitch of primary mirror on primary mirror mount out of 16 295 phase with vertical bending of imager housing Roll of primary mirror on primary mirror mount out of 17 307 phase with roll of afocal housing Pitch of primary mirror on primary mirror mount out of 21 382 phase with vertical bending of imager housing 25 487 Vertical bending of imager housing

108

Image motion equations

With the modal data extracted from the finite element model, researchers may calculate the six DOF dynamic displacement responses of each of the optical nodes. Given these displacements and the optical coefficients, which again are the rate of change of image displacement with respect to the optic element displacement, the total image motion in azimuth and elevation may be calculated using the equations below.

These equations are referred by different terms in different studies: “image motion equations” (Genberg, Doyle, and Michels 2004); “LOS jitter equations” (Doyle, Genberg, and Michels 2012); “system LOS shift equations” (DeBruin and Johnson 1994a; 1994b); and “opto-mechanical constraint equations” (Hatheway 2016). The azimuth and elevation angular displacements an image in object space, ϕ푎z and ϕ푒푙, are simply a linear summation of the individual image motion contributions of each optical element. [ 퐶 ] and [ 퐶 ] are row vectors of optical coefficients for each DOF of each optical element. {U } is the column vector of displacements for each DOF of each optical element.

(5) 휙 = [ 퐶 ] 푈

109

(6) 휙 = [ 퐶 ] 푈

This methodology makes the following reasonable assumptions for small displacements: first, that the image motion is a linear function of the optical node displacement; and second, that the rotations are not order dependent.

Error checks for the image motion equations

The image motion equations of (5) and (6) should be checked to verify that the coefficients are accurate and that the equations have been constructed properly for the upcoming analysis. Doyle, Genberg and

Michels (2012) and Hatheway (2016) propose rigid body checks similar to those described as follows.

Consider an optical system viewing an object at infinity. Because the object is far away, the light rays entering the system are collimated.

Therefore, if researchers translate the optical nodes together as a rigid body (or simply translate the entire finite element model as a rigid body), the azimuth and elevation angles calculated from equations (5) and (6) should be zero. If we rotate the optical system as a rigid body about the azimuth or elevation axis, the image motion resulting from equations (5) and (6) should match the angle of system rotation. If the equations were constructed properly, the deviations from these expected results would be

110

small. These deviations are residual errors, which may be significant to the jitter prediction if they are too large. These rigid body checks were applied to the example optical system, and the results are shown in Table

6.

Table 6. Results of rigid body checks. Rigid Body Azimuth Elevation Rigid Body Azimuth Elevation Displacement error error Displacement jitter jitter Value (µrad/in or (µrad/in or Direction (rad) (rad) (in or rad) µrad/°) µrad/°) X 1.000 6.939E-18 0.00 0.000E+00 0.00 Y 1.000 0.000E+00 0.00 6.939E-18 0.00 Z 1.000 0.000E+00 0.00 0.000E+00 0.00 RX 0.001 0.000E+00 0.00 1.000E-03 0.00 RY 0.001 1.000E-03 0.00 2.716E-07 4.74 RZ 0.001 2.671E-08 0.47 8.331E-08 1.45

First, the optical nodes were translated one inch in the X-direction, and equations (5) and (6) resulted in azimuth and elevation jitter angles of essentially zero. The same calculation was repeated for a translation in the Y-direction and a translation in the Z-direction, both giving results of zero. Next, the system was rotated one milliradian about the X axis, or elevation axis. This rotation resulted in azimuth jitter of zero and elevation jitter of one milliradian, equaling the system rotation as expected. When the system was rotated one milliradian about the Y axis, or azimuth axis, the jitter results were one milliradian in azimuth and 0.27 µrad in elevation.

If the optical coefficients were completely free of error, this 0.27 µrad

111

would be zero. However, our result is 0.27 µrad of residual error when the system is rotated one milliradian, or 4.74 µrad/°. Similarly, rotating the system one milliradian about the Z axis, or roll axis, resulted in 0.027 µrad of jitter in the azimuth axis and 0.083 µrad of jitter in the elevation axis, both of which measurements result in calculated errors of 0.47 and 1.45

µrad/°, respectively. Tables 7 and 8 give the details of the calculations for azimuth jitter due to one-inch translation in the X-direction and azimuth jitter due to one milliradian rotation about the azimuth axis.

If the image motion equations produce the expected results and if the residual errors are acceptable, we can insert these equations into the finite element model or a postprocessor and move forward with the analysis.

112

Table 7. Azimuth jitter due to 1-inch translation in X axis. Node Displ Coef Azimuth jitter DOF Number (in or rad) (rad/in or rad/rad) (rad) x 1.000 0.04734688 0.047346883 y0 0 0 z0 0 0 1 Rx0 0 0 Ry 0 1.92603189 0 Rz 0 -0.37728589 0 x 1.000 -0.03203858 -0.032038577 y0 0 0 z0 0 0 2 Rx0 0 0 Ry 0 -0.44772005 0 Rz 0 0.05968181 0 x 1.000 0 0.000000000 y0 0 0 z0 0 0 3 Rx0 0 0 Ry 0 0.03109057 0 Rz 0 0.03126387 0 x 1.000 -0.01530414 -0.015304139 y0 0 0 z0 0 0 4 Rx0 0 0 Ry 0 0.01839806 0 Rz 0 0.33198166 0 x 1.000 0 0.000000000 y0 0 0 z0 0 0 5 Rx0 0 0 Ry 0 0.16749711 0 Rz 0 -0.16656864 0 x 1.000 -0.02227797 -0.022277971 y0 0 0 z0 0 0 6 Rx0 0 0 Ry 0 -0.03337946 0 Rz0 0 0 x 1.000 -0.02003215 -0.020032150 y0 0 0 z0 0 0 7 Rx0 0 0 Ry 0 0.02908803 0 Rz0 0 0 x 1.000 0.04230595 0.042305955 y0113 0 0 z0 0 0 8 Rx0 0 0 Ry 0 -0.00138181 0 Rz0 0 0 Sum 0.000000000

Table 8. Azimuth jitter due to 1-mrad rotation about Y Node Displ Coef Azimuth jitter DOF Number (in or rad) (rad/in or rad/rad) (rad) x -0.002660002 0.04734688 -0.000125943 y0 0 0 z0 0 0 1 Rx0 0 0 Ry 0.001 1.92603189 0.001926032 Rz 0 -0.37728589 0 x 0.012334915 -0.03203858 -0.000395193 y0 0 0 z0 0 0 2 Rx0 0 0 Ry 0.001 -0.44772005 -0.00044772 Rz 0 0.05968181 0 x -0.000978661 0 0.000000000 y0 0 0 z0 0 0 3 Rx0 0 0 Ry 0.001 0.03109057 3.10906E-05 Rz 0 0.03126387 0 x 0.000496387 -0.01530414 -0.000007597 y0 0 0 z0 0 0 4 Rx0 0 0 Ry 0.001 0.01839806 1.83981E-05 Rz 0 0.33198166 0 x 0.000575889 0 0.000000000 y0 0 0 z0 0 0 5 Rx0 0 0 Ry 0.001 0.16749711 0.000167497 Rz 0 -0.16656864 0 x -0.000998914 -0.02227797 0.000022254 y0 0 0 z0 0 0 6 Rx0 0 0 Ry 0.001 -0.03337946 -3.33795E-05 Rz0 0 0 x -0.003458599 -0.02003215 0.000069283 y0 0 0 z0 0 0 7 Rx0 0 0 Ry 0.001 0.02908803 2.9088E-05 Rz0 0 0 x -0.005966739 0.04230595 -0.000252429 y0 0 0 z0 0 0 8 Rx0114 0 0 Ry 0.001 -0.00138181 -1.38181E-06 Rz0 0 0 Sum 0.001000000

Image motion transfer functions

Engineers typically define functional vibration requirements as base motion inputs to the imaging system. Although our objective is to calculate structural jitter using equations (5) and (6), we start by calculating the characteristic dynamics of structural jitter relative to base motion (BM) inputs in the form of frequency response functions (FRF). These functions are often referred to as transfer functions of the frequency domain.

Consult structural dynamics texts by Gawronski (2004) and Preumont

(2011) for useful FRF forms and discussions.

115

Figure 12. Image displacement/base motion (BM) acceleration frequency response functions for example imaging system.

To obtain these FRFs, equations (5) and (6) were calculated at every frequency step using the six DOF responses of nodes one through eight due to a one g sinusoidal input from 1–500 Hz. This type of input is often referred to as steady state vibration or a sine sweep. The result gives the

base motion to image FRFs, 퐻 and 퐻 , shown in Figure 12

116

above, where j is the base motion input direction. These FRFs were calculated using all elastic modes extracted out to 600 Hz. The two rigid body modes were eliminated because rigid body motion is accounted for in the control systems analysis. While these rigid body modes are eliminated in the structural jitter calculations, the rigid body motion should not be constrained in the finite element model.

Recall that node five of the optical path represents the fast steering mirror. For the FRFs of Figure 13, below, the fast steering mirror is assumed to be fixed. That is, no control signal is applied, and the mirror remains fixed in the nominal position. Accounting for fast steering mirror motion will be addressed in subsequent sections of this paper.

Inputs to the structural model

Vibration requirements for moving platforms, like ground vehicles and aircraft, are typically specified as base motion random vibration or random vibration with overlaying sine tones or narrow frequency bands.

These specifications are often conservative because researchers want the product to meet certain structural integrity expectations with a margin of safety. If accurate jitter predictions are necessary, researchers should use performance vibration levels as inputs for structural jitter calculations.

These performance levels, sometimes referred to as “functional levels,” may be even lower than operational levels if the term “operational” simply

117

indicates the application of power. The design entity should perform vibration testing to get a true measure of the vibration under which the imaging sensor must perform.

Figure 13. Vibration input for example imaging system.

The vibration profile of Figure 13 applies to the analysis of our example imaging system in each of the three orthogonal axes at the base of the structure. The flat profile allows the response peaks to align with transfer function peaks without influence from the input. Typically, the analyst assumes that the inputs for each direction act independently because, first, most vibration testing is performed one axis at a time, and second, jitter reduction is easier to address one input axis at a time.

In addition to the base motion requirements, the imaging system itself may introduce on-board sources of excitation, as in the cases of control system actuators or cooling fans. Researchers should combine the

118

structural jitter from these sources with base motion jitter if low levels of jitter are being evaluated.

Structural jitter without image stabilization

Given the image motion with respect to base motion acceleration

FRFs of Figure 12 and given the base motion vibration input of Figure 13, on the following page, we used equations (7) and (8), below, to calculate the structural jitter, or image motion, responses shown in Figure 14. In these equations, j is the base motion input direction, W is the base motion random vibration power spectral density (PSD) value, and H is the symbol typically used for FRFs. Researchers can find these common equations in most publications regarding responses to random vibrations (Doyle,

Genberg, and Michels 2012; Harris and Piersol 2001).

119

(7) 휙 (푓) = 푊 (푓) ∗ 퐻 (푓) , 푗 = 1, 2, 3

(8) 휙 (푓) = 푊 (푓) ∗ 퐻 (푓) , 푗 = 1, 2, 3

Figure 14. Structural jitter of example imaging system without image stabilization.

Figure 14 shows six responses, including an azimuth and elevation response for each of the three orthogonal input translations. The legend shows the RMS, or one-sigma values, for each of these curves. These values are well above the 4.9 µrad RMS threshold, but they are only the first-pass calculations. These responses do not account for any design improvements or image stabilization. As indicated in the discussion of the image motion FRFs, the fast steering mirror, which is part of the IMC system, was fixed in the nominal position.

120

Researchers should check calculations when reasonable. As in comparing the 0 Hertz FRF response with a static load, these displacement spectral density responses may be roughly checked by comparing the area under the curve prior to the first mode to static flexure due to an equivalent load.

Image stabilization

Image stabilization is a broad task that incorporates various disciplines to reduce, or stabilize, the motion of the image on the image plane. Methods of image stabilization may be passive—as in stiffening the structure, moving components in the mechanical design, or implementing base motion isolation. Methods may also be active, wherein control systems are implemented using local optical detectors or system motion sensors with fast steering mirrors. The Image Motion Compensation system (IMC) in our example imaging system entails an active stabilization method. When rate gyros sense motion, this signal is integrated, and command signals are sent to the fast-steering mirror to compensate for the motion sensed. Optical sensor companies continually work to improve active image stabilization. The details of these improvements are usually proprietary.

This paper limits discussion of methods of including image stabilization in structural jitter calculations to two. The first is a general

121

approximation technique (Doyle, Genberg, and Michels 2012). The second method is common and incorporates sensor to actuator transfer functions into dynamic response calculations. This second method will be applied to our example imaging system.

The first method uses a rejection function applied by multiplying it by the base motion to image response FRFs prior to squaring the magnitude of the FRF and then multiplying it by the base motion input.

See equation (9) below. The rejection function is developed by control systems and optics engineers so that, when applied to the structural motion, it would include various effects upon the image motion, such as

"signal-to-noise ratio, camera frame rate, and the fast-steering mirror bandwidth" (Doyle, Genberg, and Michels 2012, 234).

퐼푚푎푔푒 푅푒푠푝표푛푠푒 푃푆퐷 = |퐻(푓) ∗ 푅푒푗푒푐푡푖표푛(푓)| ∗ 퐼푛푝푢푡 푃푆퐷(푓 (9)

The second method, which is applied to the example system, includes passive dynamics at the sensor and active dynamics at the actuator. The passive dynamic response of the sensor is available from the modal dynamics of the finite element model. The active dynamics at the actuator are obtained by applying a sensor to actuator transfer function to the response of the sensor. In our example system, the azimuth or elevation gyro is the sensor, and the fast-steering mirror is the actuator.

122

Importantly, this paper shows that we include these dynamics with the image motion equations. As noted above, image motion equations (5) and (6) calculate simple summations of the individual contributions of the optical elements, and they result in the FRFs of Figure 13 when calculated at each frequency step. Because we construct those equations as simple summations, we can thus include or exclude contributors by including or excluding summation terms. Furthermore, the FRFs of Figure 13 could have been achieved by calculating the FRF for each of the optical elements’ DOF, multiplying the FRFs by their optical coefficients, and then summing these scaled FRFs. Because of this summation, we can simply add another term to the summation of contributors for the active dynamics of the fast-steering mirror. This measure is the motion at the sensor times the sensor to fast-steering mirror transfer function, as shown in equations

(10) and (11). Since the motion at the sensor is intended to be subtracted from the IMC, these terms are negative.

휙 (푓) = −휙 (푓) ∗ 퐻 (푓) (10)

휙 (푓) = −휙 (푓) ∗ 퐻 (푓) (11)

123

Figure 15. FSM / gyro frequency response function for example imaging system.

The gyro to fast-steering mirror transfer functions, 퐻 and 퐻 , would be supplied by the control systems engineer. For our example system, we use the second order FRF shown in Figure 15, above, for both azimuth and elevation. Note that, if the IMC were perfect, this transfer function would be unity. That is, the FSM would respond exactly as sensed by the gyros. Figure 16, below, shows the response of the azimuth and elevation gyro nodes, 휙 and 휙 , due to one g sinusoidal

inputs at the base from one to 500 Hz, giving 퐻 and 퐻 .

Figure 17, also below, shows the resulting image motion, ϕ푎z and ϕ푒푙,

124

after summing the results of equations (10) and (11) with equations (5)

and (6), giving the base motion to image FRFs, 퐻 and 퐻 , with image stabilization incorporated.

Figure 16. Gyro displacement/base motion (BM) acceleration frequency response functions for example imaging system.

125

Figure 17. Image displacement/base motion (BM) acceleration frequency response functions with stabilization for example imaging system.

Imaging systems on moving platforms typically require active stabilization to reject rigid body motions. When an actuator is located within the optical path being evaluated, the active actuator dynamics contribute to the structural jitter and must be included in the calculations.

The actuator dynamics should decrease structural jitter, but they can sometimes increase structural jitter if the sensor is not in phase with the

126

image response—or, more specifically, the primary mirror—from low frequency (static flexure) up to some reasonably high frequency

(vibration).

If the sensor (the gyro, in our example) closely follows the primary mirror, which has the largest optical coefficient, then the actuator (the fast steering mirror, in our example) will reduce structural jitter at low frequencies. Figure 17 shows that the active dynamics may cause the structural jitter to increase at higher frequencies.

Structural jitter with image stabilization

Given the base motion to image motion FRFs of Figure 17, we calculated structural jitter with image stabilization using equations (7) and

(8). That is, the magnitudes of the transfer functions shown in Figure 17 were squared and multiplied by the random vibration base motion of

Figure 13. The resulting random response image motion is shown in

Figure 18, including RMS values.

127

Figure 18. Structural jitter of example imaging system with image stabilization.

V. Structural Jitter Effects on Image Quality

To this point, we have made the first-pass calculations to quantify structural jitter for each of the three translational base motion inputs. First- pass values, shown as RMS values in Figure 18, are well above the specified threshold of 4.9 µrad RMS. In this next section, we discuss strategies for reducing these values. We further discuss methods for evaluating them.

Researchers have much to learn regarding system structure, measurements, and methodological consistency regarding the reduction of structural jitter. Based on results like those in Figure 18, a systems engineer typically determines modifications in system metrics to predict

128

the actual image quality that will be observed in the system. If the structural jitter values are to be combined with other requirements, such as control systems and imaging processing metrics, then the six RMS values shown may be useful as they are given. Keeping these values separated reveals to researchers exactly which image axis and which input direction resulted in the higher values. Thus, the engineering team has direction for jitter reduction efforts. As jitter decreases, researchers can report and track fewer values. For instance, after the analysis is complete, researchers often take the square root of the sum of the squares (RSS) of the azimuth and elevation RMS values for each input direction. Such an equation does not produce an accurate vector summation of the azimuth and elevation angles, but it gives a reasonable and useful approximation.

The MTF of an imaging system is simply the product of the MTFs of all of the contributors, so another approach to evaluating structural jitter results is to calculate contributors’ MTFs. This process involves three steps. First, research indicates that the transverse and vertical image displacements, which represent azimuth and elevation on the image plane, should be combined into a vector sum that represents a radial motion (Doyle, Genberg, and Michels 2012; Genberg, Michels, and Doyle

2011). This combination process results in three vector sum curves

129

instead of the six curves shown in Figure 18. Next, researchers propose decomposing the structural jitter into shift (or, drift) and distortion components because only the distortion component, which is caused by flexure, will be related to structural jitter (Lucke, Sirlin, and San Martin

1992; Pittelkau and McKinley 2012; 2016). To accomplish this, Lucke,

Sirlin and San Martin (1992) provided the weighting function shown in equation (12), where C = 2πfT, and T is the camera sensor integration time. This weighting function is multiplied by the image response FRFs to obtain only the distortion component of the image response. Finally,

Doyle, Genberg and Michels (2012) propose that the MTF due to random response structural jitter may be calculated using equation (13), where

RMS is the RMS value of the vector sum structural jitter in image space and  is the spatial frequency in cycles per mm. This equation produces an MTF curve in the spatial frequency domain for each of the input directions.

2[1 − cos(퐶)] (12) 푊 = 1 − 퐶

∆ (13) 푀푇퐹(휉) = 푒

130

VI. Structural Jitter Mitigation Methods

If the system design has not been previously analyzed and optimized, first-pass structural jitter results typically exceed requirements, and engineers must modify system design to reduce those values. We recommend a three-stage process. First, perform model checks to verify the results. Second, perform tasks that identify and rank the major contributors. Finally, perform trade studies to improve results.

Perform Model Checks

Prior to investing significant effort in reducing the structural jitter, the mechanical engineer should perform model checks to build confidence in the first-pass results. Recommendations follow.

1. Check that the total mass of the model is accurate.

2. Check that the boundary conditions appropriately represent those

of the mounting structure.

3. Verify that enough modes have been extracted to represent the

dynamics and provide sufficient mass.

4. Examine mode shapes to verify that they are intuitive.

5. Verify that all optical nodes have six DOF.

6. Check for unconstrained or poorly constrained DOF for optical and

sensor nodes.

131

7. Apply azimuth and elevation torque sine sweeps to the model, and

verify that all optical and sensor nodes move together at low

frequencies.

8. Verify that the input PSD level is appropriate for the platform.

9. Recheck optical coefficients.

Identify Significant Contributors

After establishing confidence in the model, the mechanical engineer should identify and rank significant contributors. Three areas to investigate are active stabilization sensor placement, optical element contributions, and structural mode contributions.

First, the mechanical engineer should investigate the placement of stabilization sensors. In our example system, these sensors are the gyros.

Tables 2 and 3, above, show that the primary mirror has the highest optical coefficients by far. Since the response at the gyros will be subtracted from the image motion using the fast-steering mirror, the gyros should be placed as close as possible to the optical center of the primary mirror to limit the compliance between the two. The engineer should check two items to verify limited compliance. First, the structural jitter results with active stabilization should be lower than the results without active stabilization. A comparison of the RMS values shown in Figures 14 and 18 shows that IMC has decreased only two responses: azimuth jitter due to

132

transverse input and azimuth jitter due to longitudinal input. If the gyro and the primary mirror were moving together, we would expect all jitter values to be lower with IMC. Second, the FRFs for the individual responses should show that the gyros and the primary mirror are moving in-phase with each other from low frequency to as high a frequency as possible.

Our second recommended check for significant contributors to inaccurate first-pass results concerns the individual contribution of each optical element to the total image motion. All of the optical elements may be ranked by their optical sensitivity. However, due to this project’s emphasis on jitter, we suggest instead that researchers consider the optical coefficient with the element’s displacement by calculating the base motion to image motion FRFs—that is, the structural jitter for each optical element. The process of ranking elements from most to least by their contributions of image motion more accurately indicates problem areas.

Because some image motion terms are positive and some are negative, certain terms will combine or cancel one another; therefore, minimizing each individual contribution may not minimize image motion altogether.

Still, focusing on the largest jitter contributors is productive.

The third useful task is investigating the contributions of structural modes, and two tools are particularly apt to this part of the system revision process. The first is the cumulative RMS plot (Doyle, Genberg, and

133

Michels 2012; Genberg, Michels, and Doyle 2011; Doyle 2007). These plots show the increase in the structural jitter RMS values in the frequency domain. Vertical movement of the plots indicate important modes, and the height of the vertical movement indicates the contributions of those modes. An abundance of vertical motion in low frequencies indicates a large amount of static flexure. Figure 19 shows cumulative RMS plots of structural jitter for the example system without IMC. Doyle, Genberg and

Michels (2012); Genberg, Michels and Doyle (2011); and Doyle (2007) also recommend the second tool mentioned above: a mode sensitivity analysis, which will rank the contribution of each mode to the total structural jitter. These rankings involve calculating the structural jitter response for each mode by itself, calculating the RMS, and ranking them accordingly. Again, reduction efforts should be focused on structural modes with the highest contributions to the overall jitter.

134

Figure 19. Structural jitter cumulative RMS of example imaging system without image stabilization.

Perform Design Trade Studies

After identifying the most significant contributors to structural jitter, design trade studies are undertaken to identify stiffness changes that will help reduce these contributions. A useful trade study includes changing the modulus of elasticity of one part at a time, recalculating structural jitter, and ranking the results. Another useful study involves examining stiffness changes to structural interfaces, such as bolted joints and bearings, if those locations are shown to be significant contributors.

Researchers sometimes mistake that stiffening all parts of a system will decrease structural jitter. However, since both the displacements and

135

optical coefficients of equations (5) and (6) may be negative, some of the summation terms will be negative. Therefore, canceling of terms is likely, and those cancellations can either reduce or increase jitter measurements.

One trade option is to include base motion isolators. This inclusion can attenuate the input vibration and thereby reduce flexure of the optical path at high frequencies. Typically, after implementing base motion isolators, the majority of structural jitter can be attributed to static flexure of the optical path at the isolator modes. Importantly, base isolators may increase phase loss in control systems if actuators are pushing against a soft base. This scenario indicates a limit to lowness of an isolator frequency even if sway space is unlimited.

Analysis of new designs with high-precision equipment seldom results in accurate predictions. These inaccuracies are the result of omitted variables with which researchers do not concern themselves, either intentionally because of the assumption of accuracy in the technology or unintentionally due knowledge gaps. Structural jitter calculations follow suit. First-pass results of the initial analysis provide the engineering team with an approximation. Then, design trades are made and analysis updates are compared to the initial results. The team can be more confident in an amount of improvement than they can in predictions

136

of actual values. Confidence in predictions comes after prototypes are tested and models are tuned to match reality.

VII. Conclusions

This paper presents background, terminology, and methods for calculating image motion due to structural flexure, also known as structural jitter, under performance vibration levels. We developed and illustrate here an example imaging system to clarify our methods and to show calculations details. Included in these calculations is a method to include active stabilization. We present structural jitter results for the example both with and without stabilization. The results do not meet the system requirements presented early in the paper, so more work is necessary to improve the design. We suggest design improvements here, and we present tasks and tools for identifying contributors and performing design trade studies.

VIII. Opportunities for Further Investigation

Given the structural jitter calculation process presented here, opportunities abound to improve this process. Two opportunities for consideration follow.

1. Researchers understand that structural jitter comes only from

distortion or structural flexure of the optical path. Genberg, Doyle

and Michels (2003) and Genberg, Michels and Doyle (2011) state

137

that structural modes may be decomposed into a rigid body portion

and an elastic portion, but they do not present these methods. The

field would benefit from an investigation of this decomposition

process and its methodology.

2. Given the need to perform design trade studies to reduce the

structural jitter response, researchers may investigate optimization

techniques and identify one or more methods that will aid in

minimizing structural jitter.

IX. References

Burge, J. 2006. "An Easy Way to Relate Optical Element Motion to

System Pointing Stability." Society of Photographic Instrumentation

Engineers (SPIE) Paper 6288.

DeBruin, J. C. and D. B. Johnson. 1994a. "Derivation of Structural

Influence Coefficients for Long-Focus Imaging Optical Systems.”

Proceedings SPIE 2263: 341–368.

DeBruin, J. C. and D. B. Johnson. 1994b. "Derivation of Structural

Influence Coefficients for Plane-Mirror Optical Systems."

Proceedings SPIE 2221: 379–401.

Doyle, K. B. 2007. “Structural Line-of-Sight Jitter Analysis for MLCD."

Proceedings SPIE 6665: 379–401.

138

Doyle, K. B., V. L. Genberg, and G. J. Michels. 2012. Integrated

Optomechanical Analysis. 2nd ed. Bellingham, WA: SPIE Press.

Fiete, R. D., and B. D. Paul. 2014. "Modeling the Optical Transfer Function

in the Imaging Chain." Optical Engineering 53, no. 8.

Gawronski, W. 2004. Advanced Structural Dynamics and Active Control of

Structures. New York: Springer Science and Business Media.

Genberg, V. L., K. B. Doyle, and G. J. Michels. 2003. “Optical

Performance as a Function of Dynamic Mechanical Loading."

Society of Photographic Instrumentation Engineers (SPIE) Paper

5178-4.

Genberg, V. L., G. J. Michels, and K. B. Doyle. 2011. "Integrated Modeling

of Jitter MTF Due to Random Loads," SPIE Optical Engineering

Applications, Anonymous International Society for Optics and

Photonics.

Harris, Cyril M. and Allan G. Piersol. 2001. Harris' Shock and Vibration

Handbook. Chicago: McGraw Hill.

Hatheway, Alson E. 2016. "The Optomechanical Constraint Equations:

Theory and Applications." Society of Photo-Optical Instrumentation

Engineers.

139

Hilkert, J. and D. L. Amil. 2010. “Structural Effects and Techniques in

Precision Pointing and Tracking Systems: A Tutorial Overview." In

SPIE Proceedings 7696.

King, H. C. 1955. The History of the Telescope. Courier Corporation.

Lucke, R. L., S. W. Sirlin, and A. M. San Martin. 1992. "New Definitions of

Pointing Stability-AC and DC Effects." Journal of the Astronautical

Sciences 40, no. 4: 557–576.

Pittelkau, M., and W. McKinley. 2012. "Pointing Error Metrics:

Displacement, Smear, Jitter, and Smitter with Application to Image

Motion MTF." AIAA/AAS Astrodynamics Specialist Conference,

Minneapolis, MN, 2012: 4869–4888.

Pittelkau, M., and W. McKinley. 2016. "Optical Transfer Functions,

Weighting Functions, and Metrics for Images with Two-Dimensional

Line-of-Sight Motion." Optical Engineering 55, no. 6.

Preumont, A. 2011. Vibration Control of Active Structures: An Introduction.

New York: Springer Science and Business Media.

140

APPENDIX B

Code for Example 1

Listing of Matlab User Parameters module

1 function [ g, zeta, input_accel_amplitude,...

2 inpFile, datFile, optFile,...

3 XL, XU, X0, fixedParameters,...

4 elimModes,...

5 input_node_dof, input_dof, output_dof,...

6 inAPSD, fPSD, wPSD,...

7 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717

8 % Initial parameters are set in this function

9 %

10 % Input is acceleration. If desired, this can be changed to

11 % displacement later.

12 %

13 %

14 %

15 %%

16 % global histData

141

17 %

18 %% Define constants

19 %

20 g = 386.1;

21 zeta = .025;

22 input_accel_amplitude = 386.1;

23 %

24 %% Define file names

25 %

26 inpFile = 'three_beam_lm_modes_mass_fil_opt_20180728.inp';

27 datFile = 'three_beam_lm_modes_mass_fil_opt_20180728.dat';

28 optFile = 'three_beam.bs';

29 %

30 %% Define design variable starting point and bounds

31 %

32 % beam depths for beams a, b, and c

33 X0 = [0.6, 1.2, 1.8]';

34 XL = [0.3, 0.6, 0.9]';

35 XU = [1.2, 2.4, 3.6]';

142

36 %

37 %% Define fixed parameters to pass to functions

38 %

39 fixedParameters(1,1) = 0.3; % beam a thickness

40 fixedParameters(1,2) = 5.0; % beam a length

41 fixedParameters(1,3) = 0.098/386.1; % beam a density

42 fixedParameters(2,1) = 0.3; % beam b thickness

43 fixedParameters(2,2) = 10.0; % beam b length

44 fixedParameters(2,3) = 0.098/386.1; % beam b density

45 fixedParameters(3,1) = 0.3; % beam c thickness

46 fixedParameters(3,2) = 15.0; % beam c length

47 fixedParameters(3,3) = 0.098/386.1; % beam c density

48 %

49 fixedParameters(4,:) = [1.235/386.1,0,0]; % allowable mass of all beams

50 fixedParameters(5,:) = [16,0,0]; % min natural freq

51 %

52 %% Define eliminated modes - not total rigid body modes, but gimbal axes

53 %

54 elimModes = [];

143

55 %

56 %% Define input and output nodes and DOF

57 %

58 input_node = 4;

59 input_node_dof = 2;

60 output_nodes = [1,1,1,1,1,1,...

61 2,2,2,2,2,2,...

62 3,3,3,3,3,3,...

63 4,4,4,4,4,4]; % include all optical, input, and output nodes

64 output_node_dof = [1,2,3,4,5,6,...

65 1,2,3,4,5,6,...

66 1,2,3,4,5,6,...

67 1,2,3,4,5,6]; % include all optical, input, and output nodes

68 %

69 input_dof=(input_node - 1)*6 + input_node_dof;

70 output_dof=(output_nodes - 1)*6 + output_node_dof;

71 %

72 %% Optimize on Az jitter, El jitter, or both?

73 AzElorBoth = 'El'; % type Az, El, or 'Both'

144

74 %

75 %% Define input PSD

76 fPSD = (5:1:500)';

77 wPSD = 2*pi.*fPSD;

78 inAPSDmag = .000505 * ones(length(fPSD),1);

79 inAPSD_RMS = sqrt(trapz(fPSD,inAPSDmag)); % calc RMS value

80 inAPSD = frd(inAPSDmag',fPSD','units','Hz'); % gen freq model of input

81 % figure;

82 % h3 = bodeplot(inAPSD);

83 % setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

84 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

85 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

86 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

87 %

88 %% Define scaling factors

89 %

90 alpha = 1/1.0; % design variable scaling

91 beta = 1/0.001; % objective function scaling

92 gamma(1) = 1/10.0; % constraint function scaling for frequency

145

93 gamma(2) = 1/0.001; % constraint function scaling for mass

94 %

95 end

96

Listing of Matlab Main module

1 %% Structural Jitter Minimization Rick Scott

2 % Run jitter minimization and store history of design variables

3 % and objective function values

4 %

5 %%

6 tic

7 clear; clc;

8 close all;

9 format compact

10 format long

11 %

12 %% Set up saved history info

146

13 global objFhistData conFhistData Gaztotal Geltotal

14 objFhistData = [];

15 conFhistData = [];

16 Gaztotal = [];

17 Geltotal = [];

18 % azjitterPSD = [];

19 % eljitterPSD = [];

20 %

21 %%

22 % XL = [0.040, 0.030, 0.020]';

23 % XU = [0.080, 0.080, 0.080]';

24 % X0 = [0.6, 1.2, 1.8]';

25 %

26 %% Obtain parameters

27 [ g, zeta, input_accel_amplitude,...

28 inpFile, datFile, optFile,...

29 XL, XU, X0, fixedParameters,...

30 elimModes,...

31 input_node_dof, input_dof, output_dof,...

147

32 inAPSD, fPSD, wPSD,...

33 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

34 %

35 %%

36 XLS = alpha .* XL;

37 XUS = alpha .* XU;

38 X0S = alpha .* X0;

39

40 objF = @ sj_objFun_20180812;

41 conF = @ sj_conF_20180717;

42 % outputF = @ ouputF_20180715;

43

44 options = optimoptions('fmincon','Algorithm','sqp',...

45 'Display','iter',...

46 'PlotFcn',{@optimplotx,@optimplotfval},...

47 'MaxIterations',12,'MaxFunctionEvaluations',200,...

48 'DiffMinChange',.0001,...

49 'OptimalityTolerance',.001,...

50 'FunctionTolerance',.001,'ConstraintTolerance',.0001,...

148

51 'StepTolerance',1e-6);

52

53 problem = createOptimProblem('fmincon','x0',X0S,'objective',objF,...

54 'lb',XLS,'ub',XUS,'nonlcon',conF,'options',options);

55 %

56 %% Local search only

57 %

58 [XoptS, objFS] = fmincon(problem)

59 Xopt = XoptS ./ alpha;

60 objF = objFS ./ beta;

61 %

62 %% Multistart

63 %

64 % ms = MultiStart('Display','final',...

65 % 'FunctionTolerance',.001,...

66 % 'XTolerance',.001);

67 % % ,...

68 % % 'StartPointsToRun','bounds-ineqs');

69 % % ,...

149

70 % % 'UseParallel','true');

71 % % ptmatrix = [.050,.040,.030;

72 % % .070,.040,.050;

73 % % .070,.080,.040];

74 % % sptmatrix = alpha .* ptmatrix;

75 % % tpoints = CustomStartPointSet(sptmatrix);

76 % ms = MultiStart('Display','final');

77 % % [XoptS,objFS,eflag,output,manymins] = run(ms,problem,tpoints);

78 % [XoptS,objFS,eflag,output,manymins] = run(ms,problem,4);

79 % Xopt = XoptS ./ alpha;

80 % objF = objFS ./ beta;

81 %

82 %% Global Search

83 %

84 % gs = GlobalSearch('Display','final',...

85 % 'FunctionTolerance',.001,...

86 % 'XTolerance',.001,...

87 % 'NumStageOnePoints',4,...

88 % 'NumTrialPoints',5,...

150

89 % 'StartPointsToRun','bounds-ineqs');

90 % [Xopt, objF] = run(gs,problem);

91 %

92 %% Show results

93 Xopt = vpa(Xopt,5) % Show results

94 objF = vpa(objF,5)

95 %

96 %% Calculate structural jitter PSD responses

97 Gaztotal = prescale(Gaztotal, {wPSD(1),wPSD(end)});

98 Geltotal = prescale(Geltotal, {wPSD(1),wPSD(end)});

99 azFRF = frd(Gaztotal,fPSD,'Hz');

100 elFRF = frd(Geltotal,fPSD,'Hz');

101 azPSD = inAPSD*azFRF^2;

102 elPSD = inAPSD*elFRF^2;

103 % figure

104 % h5 = bodeplot(inAPSD,azPSD,elPSD);

105 % setoptions(h5,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

106 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

107 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

151

108 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

109 [azPSDmag,azPSDphase,azPSDwout] = bode(azPSD,wPSD);

110 azPSD_RMS = sqrt(trapz(fPSD,azPSDmag)) % calc RMS value

111 [elPSDmag,elPSDphase,elPSDwout] = bode(elPSD,wPSD);

112 elPSD_RMS = sqrt(trapz(fPSD,elPSDmag)) % calc RMS value

113 %

114 %% Generate structural jitter plots

115 figure

116 h1 = bodeplot(Gaztotal, Geltotal);

117 setoptions(h1,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

118 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

119 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

120 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

121 figure

122 h2 = bodeplot(azPSD,elPSD);

123 setoptions(h2,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

124 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

125 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

126 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

152

127 figure

128 h3 = bodeplot(inAPSD);

129 setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

130 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

131 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

132 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

133 %%

134 objFhistData

135 conFhistData

136 toc

137 beep

Listing of Matlab objFun module

1 function [ objFS ] = sj_objFun_20180804( XS )

2 % Calculate structural jitter as the objective function to be

3 % minimized.

4 %

5 %

153

6 %% Initial settings

7 % clear; clc;

8 % close all;

9 % format compact

10 fclose('all');

11 %

12 %% Global variables

13 global objFhistData Gaztotal Geltotal

14 %

15 %% Obtain parameters

16 [ g, zeta, input_accel_amplitude,...

17 inpFile, datFile, optFile,...

18 XL, XU, X0, fixedParameters,...

19 elimModes,...

20 input_node_dof, input_dof, output_dof,...

21 inAPSD, fPSD, wPSD,...

22 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

23 %

24 %% Design variables for testing

154

25 %

26 % X0 = [0.6, 1.2, 1.8]';

27 % XL = [0.3, 0.6, 0.9]';

28 % XU = [1.2, 2.4, 3.6]';

29 % X = XU;

30 % XS = X .* alpha;

31 %

32 %%

33 X = XS ./ alpha;

34 %

35 %% Obtain optical coef data

36 [ azCoef, elCoef ] = sj_read_opt_coef_20180717;

37 % allCoef = [ azCoef, elCoef ];

38 % [ coefRows, coefCols ] = size(allCoef);

39 %

40 %% Modify the Abaqus input file

41 designVar = X;

42 sj_mod_FEM_20180717(designVar);

43 %

155

44 %% Calculate dynamics

45 [ Greldisplc, Gabsdispl, Gabsaccel ] = sj_calc_dyn_20180717;

46 %

47 %% Multiply optical coefficients by displacements

48 for i = 1:1:length(azCoef)

49 Gazc{i} = Greldisplc{i}*azCoef(i);

50 end

51 for i = 1:1:length(elCoef)

52 Gelc{i} = Greldisplc{i}*elCoef(i);

53 end

54 %

55 %% Sum optical responses

56 Gaztotal = Gazc{1};

57 for i = 2:1:length(Gazc)

58 Gaztotal = parallel(Gaztotal,Gazc{i});

59 end

60 Geltotal = Gelc{1};

61 for i = 2:1:length(Gelc)

62 Geltotal = parallel(Geltotal,Gelc{i});

156

63 end

64 %

65 %% Plot FRFs

66 % figure;

67 % h1 = bodeplot(Gabsaccel(input_dof),Gabsaccel(2),Gabsaccel(8),Gabsaccel(14));

68 % setoptions(h1,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

69 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

70 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

71 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

72 % figure;

73 % h2 = bodeplot(Gaztotal, Geltotal);

74 % setoptions(h2,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

75 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

76 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

77 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

78 %

79 %% Generate FRF data and area values for jitter, and specify objF

80 f = 1:1:500;

81 w = 2*pi.*f;

157

82 frequency = w ./ (2*pi);

83 frequency = transpose(frequency);

84 if ismember(AzElorBoth,{'az','Az','AZ','a','A'})

85 [Gaztotalmag,~,~] = bode(Gaztotal,w);

86 Gaztotalmag_Area = trapz(frequency,Gaztotalmag);

87 objF = Gaztotalmag_Area;

88 elseif ismember(AzElorBoth,{'el','El','EL','e','E'})

89 [Geltotalmag,~,~] = bode(Geltotal,w);

90 Geltotalmag_Area = trapz(frequency,Geltotalmag);

91 objF = Geltotalmag_Area;

92 elseif ismember(AzElorBoth,{'both','Both','BOTH','b','B'})

93 [Gaztotalmag,~,~] = bode(Gaztotal,w);

94 [Geltotalmag,~,~] = bode(Geltotal,w);

95 Gaztotalmag_Area = trapz(frequency,Gaztotalmag);

96 Geltotalmag_Area = trapz(frequency,Geltotalmag);

97 objF = sqrt(Gaztotalmag_Area^2 + Geltotalmag_Area^2);

98 else

99 displ('type Az, El, or Both in parameters');

100 return

158

101 end

102 %

103 %% Generate FRF data for dynamic responses

104 % [Greldisplmag,Greldisplphase,Greldisplwout] = bode(Greldisplc{8},w);

105 % [Gaztotalreal,Gaztotalim] = pol2cart(Gaztotalphase,Gaztotalmag);

106 % [nr,nc,nl] = size(Gaztotalreal);

107 % Gaztotalreal = reshape(Gaztotalreal,[nl,1]);

108 % Gaztotalim = reshape(Gaztotalim,[nl,1]);

109 % [Geltotalreal,Geltotalim] = pol2cart(Geltotalphase,Geltotalmag);

110 % Geltotalreal = reshape(Geltotalreal,[nl,1]);

111 % Geltotalim = reshape(Geltotalim,[nl,1]);

112 % dataAz = [frequency,Gaztotalreal,Gaztotalim];

113 % dataEl = [frequency,Geltotalreal,Geltotalim];

114 %

115 %% Write output data for SPIF

116 % fileID = fopen('dataAz.dat','w');

117 % dataAz = transpose(dataAz);

118 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

119 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataAz);

159

120 % fclose(fileID);

121 % %

122 % fileID = fopen('dataEl.dat','w');

123 % dataEl = transpose(dataEl);

124 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

125 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataEl);

126 % fclose(fileID);

127 %

128 %% Generate PSD input

129 % fPSD = (5:1:500)';

130 % wPSD = 2*pi.*fPSD;

131 % inAPSDmag = .000505 * ones(length(fPSD),1);

132 % inAPSD_RMS = sqrt(trapz(fPSD,inAPSDmag)); % calc RMS value

133 % inAPSD = frd(inAPSDmag',fPSD','units','Hz'); % gen freq model of input

134 % figure;

135 % h3 = bodeplot(inAPSD);

136 % setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

137 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

138 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

160

139 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

140 %

141 %% Calculate misc PSD responses

142 % accelFRF2 = frd(Gabsaccel(2),fPSD,'Hz');

143 % accelFRF8 = frd(Gabsaccel(8),fPSD,'Hz');

144 % accelFRF14 = frd(Gabsaccel(14),fPSD,'Hz');

145 % respAPSD2 = inAPSD*accelFRF2^2;

146 % respAPSD8 = inAPSD*accelFRF8^2;

147 % respAPSD14 = inAPSD*accelFRF14^2;

148 % figure

149 % h4 = bodeplot(inAPSD,respAPSD2,respAPSD8,respAPSD14);

150 % setoptions(h4,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

151 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

152 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

153 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

154 % [respAPSD2mag,respAPSD2phase,respAPSD2wout] = bode(respAPSD2,wPSD);

155 % [respAPSD8mag,respAPSD8phase,respAPSD8wout] = bode(respAPSD8,wPSD);

156 % [respAPSD14mag,respAPSD14phase,respAPSD14wout] = bode(respAPSD14,wPSD);

161

157 % respAPSD2_RMS = sqrt(trapz(fPSD,respAPSD2mag)); % calc RMS value

158 % respAPSD8_RMS = sqrt(trapz(fPSD,respAPSD8mag)); % calc RMS value

159 % respAPSD14_RMS = sqrt(trapz(fPSD,respAPSD14mag)); % calc RMS value

160 %

161 %% Calculate structural jitter PSD responses

162 % Gaztotal = prescale(Gaztotal, {wPSD(1),wPSD(end)});

163 % Geltotal = prescale(Geltotal, {wPSD(1),wPSD(end)});

164 % azFRF = frd(Gaztotal,fPSD,'Hz');

165 % elFRF = frd(Geltotal,fPSD,'Hz');

166 % azPSD = inAPSD*azFRF^2;

167 % elPSD = inAPSD*elFRF^2;

168 % figure

169 % h5 = bodeplot(inAPSD,azPSD,elPSD);

170 % setoptions(h5,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

171 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

172 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

173 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

174 % [azPSDmag,~,~] = bode(azPSD,wPSD);

175 % azPSD_RMS = sqrt(trapz(fPSD,azPSDmag)); % calc RMS value

162

176 % [elPSDmag,~,~] = bode(elPSD,wPSD);

177 % elPSD_RMS = sqrt(trapz(fPSD,elPSDmag)); % calc RMS value

178 %

179 %% Write history data

180 % objF = elPSD_RMS;

181 % objF = sqrt(Gaztotalmag_Area^2 + Geltotalmag_Area^2);

182 % objF = sqrt(trapz(frequency,Greldisplmag));

183 % Gaz = Gaztotal;

184 % Gel = Geltotal;

185 % azjitterPSD = azPSD;

186 % eljitterPSD = elPSD;

187 %

188 objFS = beta .* objF;

189 objFhistData = [objFhistData;double([X' objF])];

190 end

191

192

163

Listing of Matlab Read Optics Data module

1 function [ azCoef, elCoef ] = sj_read_opt_coef_20180717

2 % Get optical coefficients from .bs file

3 %

4 % %% Initial settings

5 % clear; clc;

6 % close all;

7 % format compact

8 % %

9 %% Obtain parameters

10 [ g, zeta, input_accel_amplitude,...

11 inpFile, datFile, optFile,...

12 XL, XU, X0, fixedParameters,...

13 elimModes,...

14 input_node_dof, input_dof, output_dof,...

15 inAPSD, fPSD, wPSD,...

16 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

17 %

18 %% Read Abaqus .dat file

164

19 fileID = fopen(optFile,'r');

20 opticalData = textscan(fileID,'%s','Delimiter','\r\n');

21 %

22 %% Obtain azimuth coefficients

23 [rowOCT,colOCT] = find(strcmp(opticalData{1},...

24 'Echo of optical coefficients'), 2, 'first');

25 [rowCVT,colCVT] = find(strcmp(opticalData{1},...

26 'AZIMUTH COEFFICIENT VERIFICATION'), 2, 'first');

27 rowBeforeAzStart = rowOCT+2;

28 rowAfterElEnd = rowCVT-2;

29 numOptNodes = (rowAfterElEnd - rowBeforeAzStart - 4) / 2;

30 for n = 1:1:numOptNodes

31 nodeLine = opticalData{1}{rowBeforeAzStart + n,colCVT};

32 nodeLine = regexprep(nodeLine,' +',' ');

33 nodeLine = str2num(nodeLine);

34 azVec(n,:) = nodeLine;

35 end

36 % Remove first column of matrix, reshape coefficients to single column

37 azVec(:,1) = [];

165

38 [nr,nc]=size(azVec);

39 azCoef = reshape(azVec',[nr*nc,1]);

40 %

41 %% Obtain elevation coefficients

42 rowBeforeElStart = rowOCT + numOptNodes + 5;

43 for n = 1:1:numOptNodes

44 nodeLine = opticalData{1}{rowBeforeElStart + n,colCVT};

45 nodeLine = regexprep(nodeLine,' +',' ');

46 nodeLine = str2num(nodeLine);

47 elVec(n,:) = nodeLine;

48 end

49 % Remove first column of matrix, reshape coefficients to single column

50 elVec(:,1) = [];

51 [nr,nc]=size(elVec);

52 elCoef = reshape(elVec',[nr*nc,1]);

53 %

54 end

166

Listing of Matlab Modify FEM Input module

1 function sj_mod_FEM_20180717(designVar)

2 % Function receives design variables and modifies the Abaqus input file

3 %

4 % %% Initial settings while testing

5 % clear; clc;

6 % close all;

7 % format compact

8 % X = [0.0255 0.0155 0.03 0.02]; % Design variables for testing

9 % %

10 %%

11 % global histData

12 %

13 %% Obtain parameters

14 [ g, zeta, input_accel_amplitude,...

15 inpFile, datFile, optFile,...

16 XL, XU, X0, fixedParameters,...

17 elimModes,...

18 input_node_dof, input_dof, output_dof,...

167

19 inAPSD, fPSD, wPSD,...

20 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

21 %

22 %%

23 % %% Method A using fgetl and fprintf

24 % tic

25 % fidIn = fopen(inpFile,'r');

26 % fidOut = fopen('tempfileA.dat','w');

27 % while ~feof(fidIn)

28 % textline = fgetl(fidIn); % Read line

29 % if contains(textline,'*PARAMETER')

30 % fprintf(fidOut,'%s\n',textline);

31 % for i = 1:1:length(X)

32 % textline = fgetl(fidIn);

33 % textline = ['designVar',num2str(i),' = ',num2str(X(i))];

34 % fprintf(fidOut,'%s\n',textline);

35 % end

36 % else

37 % fprintf(fidOut,'%s\n',textline);

168

38 % end

39 % end

40 % fclose(fidIn);

41 % fclose(fidOut);

42 % toc

43 % movefile('tempfileA.dat',inpFile);

44 % %

45 %% Method B using textscan

46 % tic

47 fidIn = fopen(inpFile,'r');

48 fidOut = fopen('tempfileB.dat','w');

49 inputData = textscan(fidIn,'%s','Delimiter','\r\n');

50 [rowPar,colPar] = find(strcmp(inputData{1},...

51 '*PARAMETER'), 2, 'first');

52 for i = 1:1:length(designVar)

53 inputData{1}{rowPar,colPar};

54 inputData{1}{rowPar+i,colPar} = ['designVar',num2str(i),' = ',num2str(designVar(i))];

55 end

56 fprintf(fidOut,'%s\n',inputData{1}{:,colPar});

169

57 fclose(fidIn);

58 fclose(fidOut);

59 % toc

60 movefile('tempfileB.dat',inpFile);

61 %

62 end

63

Listing of Matlab Read Modal Data module

1 function [ totalmodelMass, numModes, numNodes, freq,...

2 Phi ] = sj_read_modal_data_20180717

3 % Get modal data from Abaqus .dat file

4 %

5 % %% Initial settings

6 % clear; clc;

7 % close all;

8 % format compact;

9 % %

170

10 %% Obtain parameters

11 [ g, zeta, input_accel_amplitude,...

12 inpFile, datFile, optFile,...

13 XL, XU, X0, fixedParameters,...

14 elimModes,...

15 input_node_dof, input_dof, output_dof,...

16 inAPSD, fPSD, wPSD,...

17 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

18 %

19 %% Read Abaqus .dat file

20 fileID = fopen(datFile,'r');

21 modalData = textscan(fileID,'%s','Delimiter','\r\n');

22 % disp(modalData{1});

23 %

24 %% Obtain "TOTAL MASS OF MODEL"

25 [rowTM,colTM] = find(strcmp(modalData{1},...

26 'TOTAL MASS OF MODEL'), 2, 'first');

27 rowTM = rowTM(end);

28 colTM = colTM(end);

171

29 totalmodelMass = str2num(modalData{1}{rowTM+2,colTM});

30 %

31 %% Obtain structural frequencies

32 % Use rows between participation factors and effective mass to

33 % count the number of modes because the number of rows between

34 % frequencies and participation factors changes depending if

35 % Abaqus writes the note about rigid body modes

36 [rowEO,colEO] = find(strcmp(modalData{1},...

37 '(RAD/TIME) (CYCLES/TIME)'), 2, 'first');

38 [rowPF,colPF] = find(strcmp(modalData{1},...

39 'P A R T I C I P A T I O N F A C T O R S'), 2, 'first');

40 [rowEM,colEM] = find(strcmp(modalData{1},...

41 'E F F E C T I V E M A S S'), 2, 'first');

42 rowBeforeFreqStart = rowEO+2;

43 rowBeforePFStart = rowPF+3;

44 rowAfterPFEnd = rowEM-2;

45 numModes = rowAfterPFEnd - rowBeforePFStart - 1;

46 for f = 1:1:numModes

47 freqLine = modalData{1}{rowBeforeFreqStart+f,colEO};

172

48 freqLine = regexprep(freqLine,' +',' ');

49 freqLine = textscan(freqLine,'%s','Delimiter',' ')';

50 freqLine = freqLine{:}';

51 freq(f) = str2num(freqLine{4});

52 end

53 freq = freq';

54 %

55 %% Obtain eigenvectors prior to the last one

56 vecText = 'E I G E N V A L U E N U M B E R';

57 for v = 1:1:numModes - 1

58 vecNum = num2str(v);

59 formatSpec = '%6s';

60 vecNum = sprintf(formatSpec,vecNum);

61 vecTitle = strcat(vecText,vecNum);

62 [rowVec,colVec] = find(strcmp(modalData{1},vecTitle), 2, 'first');

63 vecNext = num2str(v+1);

64 vecNext = sprintf(formatSpec,vecNext);

65 vecNextTitle = strcat(vecText,vecNext);

66 [rowVecNext,colVecNext] = find(strcmp(modalData{1},vecNextTitle), 2, 'first');

173

67 rowBeforeVecStart = rowVec+14;

68 rowAfterVecEnd = rowVecNext-10;

69 numNodes = rowAfterVecEnd - rowBeforeVecStart - 1;

70 for n = 1:1:numNodes

71 nodeLine = modalData{1}{rowBeforeVecStart + n,colVec};

72 nodeLine = regexprep(nodeLine,' +',' ');

73 nodeLine = str2num(nodeLine);

74 vec(n,:) = nodeLine;

75 end

76 eigvec(:,:,v) = vec;

77 end

78 %% Obtain last eigenvector with numNodes instead of vecNext

79 v = v + 1;

80 vecNum = num2str(v);

81 formatSpec = '%6s';

82 vecNum = sprintf(formatSpec,vecNum);

83 vecTitle = strcat(vecText,vecNum);

84 [rowVec,colVec] = find(strcmp(modalData{1},vecTitle), 2, 'first');

85 rowBeforeVecStart = rowVec+14;

174

86 rowAfterVecEnd = rowVec+14+numNodes+1;

87 for n = 1:1:numNodes

88 nodeLine = modalData{1}{rowBeforeVecStart + n,colVec};

89 nodeLine = regexprep(nodeLine,' +',' ');

90 nodeLine = str2num(nodeLine);

91 vec(n,:) = nodeLine;

92 end

93 eigvec(:,:,v) = vec;

94 eigvec(:,1,:) = [];

95 % eigvecTemp = eigvec;

96 % eigvecTemp(:,1,:) = [];

97 % eigvec(:,:,3)

98 % eigvecTemp(:,:,1)

99 % eigvec(:,:,3) - eigvecTemp(:,:,1)

100 fclose(fileID);

101 %% Eliminate modes

102 % elimModes = [1 2 4 6];

103 % eigvecTemp = eigvec;

104 % eigvecTemp(:,:,elimModes) = [];

175

105 numModes = numModes - length(elimModes);

106 eigvec(:,:,elimModes) = [];

107 freq(elimModes) = [];

108 % tempA = [1 1 2 3;...

109 % 2 4 5 6;...

110 % 3 7 8 9;...

111 % 4 10 11 12;...

112 % 5 13 14 15;...

113 % 6 16 17 18;...

114 % 7 19 20 21]';

115 % elimModes = [1 2 4 6];

116 % tempA(:,elimModes) = [];

117 %

118 %% Reshape eigenvectors to single column

119 for m = 1:1:numModes

120 vec = eigvec(:,:,m);

121 % vec(:,1) = [];

122 [nr,nc]=size(vec);

123 vec = reshape(vec',[nr*nc,1]);

176

124 Phi(:,m) = vec;

125 end

126

127 %%

128 % NumModes

129 % NumNodes

130 % Phi

131 end

Listing of Matlab Calculate Dynamics module

1 function [ Greldisplc, Gabsdispl, Gabsaccel ] = sj_calc_dyn_20180717

2 % Generate response / base motion transfer functions using large mass

3 % method.

4 %

5 % See read me.docx

6 %

7

8 %% Initial settings

177

9 % clear; clc;

10 % close all;

11 % format compact

12 %

13 %%

14 % global histData

15 %

16 %% Obtain parameters

17 [ g, zeta, input_accel_amplitude,...

18 inpFile, datFile, optFile,...

19 XL, XU, X0, fixedParameters,...

20 elimModes,...

21 input_node_dof, input_dof, output_dof,...

22 inAPSD, fPSD, wPSD,...

23 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

24 %

25 %% Run Abaqus model - Credit Papazafeiropoulos et al for this section

26 % inputFile = 'stpbeam_modes_lm_mass_fil_opt_20180707';

27 inpFile = inpFile(1:end-4);

178

28 %system(['abaqus job=' inpFile ' cpus=4']);

29 system(['abaqus job=' inpFile]);

30 pause(10) % Pause matlab to give Abaqus time to create .lck file

31 while exist([inpFile '.lck'],'file')==2

32 pause(0.1)

33 end

34 %

35 %% Define s as transfer function for differentiation and integration

36 s = ss(tf([1 0], [0 1]));

37 %

38

39 %% Read modal data

40 [ totalmodelMass, numModes, numNodes, freq,...

41 Phi ] = sj_read_modal_data_20180717;

42 totalmodelMass;

43 numModes;

44 numNodes;

45 numDOF = numNodes * 6;

46 freq;

179

47 w = 2*pi*freq;

48 Phi;

49 input_force = totalmodelMass*input_accel_amplitude;% accel resp std

50 % input_force = totalmodelMass*input_accel_amplitude/g;% accel resp gs

51 %

52 %% Build system matrix A from individual mode system matrices ai

53 numStates = numModes * 2;

54 A = zeros(numStates);

55 for i = 1:1:numModes

56 a(:,:,i) = [0, 1; -w(i).^2, -2*zeta*w(i)]; % keep individual mode system matrices

57 A(2*i-1:2*i,2*i-1:2*i) = a(:,:,i); % combine to create total system matrix

58 end

59 %

60 %% Build input matrix B from individual mode input matrices bi

61 B = zeros(numStates,1);

62 for i = 1:1:numModes

63 b(:,i) = [0;Phi(input_dof,i)];

64 B(2*i-1:2*i) = b(:,i);

65 end

180

66 %

67 %% Create output matrix C from individual mode output matrices ci

68 C = zeros(length(output_dof),numStates);

69 for i = 1:1:numModes

70 c(:,1,i) = transpose(Phi(output_dof(1):output_dof(end),i));

71 c(:,2,i) = zeros(length(output_dof),1);

72 C(:,2*i-1:2*i) = c(:,:,i);

73 end

74 %

75 %% Create feed-through matrix D

76 D = [];

77 %

78 %% Generate the system state space models

79 Gabsdispl = input_force*ss(A,B,C,D); % abs displ resp / force input of mass*accel

80 Gabsaccel = Gabsdispl*s^2;

81 for x = 1:1:length(Gabsaccel)

82 Gabsaccelc{x} = Gabsaccel(x);

83 end

84 %

181

85 %% Add base motion to system model to obtain relative displacement

86 Greldispl = Gabsdispl;% rel and abs are same except for bm direction

87 for x = 1:1:length(Greldispl)

88 Greldisplc{x} = Greldispl(x);

89 end

90 for n = input_node_dof:6:length(output_dof)

91 Greldisplc{n} = parallel(Gabsdispl(n),-1*Gabsdispl(input_dof));% displ rel to bm

92 end

93 %

94 %% Plot FRFs

95 % figure;

96 % h1 = bodeplot(Gabsaccel(input_dof),Gabsaccel(2),Gabsaccel(8),Gabsaccel(14));

97 % setoptions(h1,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

98 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

99 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

100 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

101 % figure;

102 % h3 = bodeplot(Gaztotal, Geltotal);

103 % setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

182

104 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

105 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

106 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

107 %

108 %% Generate data

109 % f = 1:1:500;

110 % w = 2*pi.*f;

111 % [Gaztotalmag,Gaztotalphase,Gaztotalwout] = bode(Gaztotal,w);

112 % [Geltotalmag,Geltotalphase,Geltotalwout] = bode(Geltotal,w);

113 % frequency = w ./ (2*pi);

114 % frequency = transpose(frequency);

115 % [Gaztotalreal,Gaztotalim] = pol2cart(Gaztotalphase,Gaztotalmag);

116 % [nr,nc,nl] = size(Gaztotalreal);

117 % Gaztotalreal = reshape(Gaztotalreal,[nl,1]);

118 % Gaztotalim = reshape(Gaztotalim,[nl,1]);

119 % [Geltotalreal,Geltotalim] = pol2cart(Geltotalphase,Geltotalmag);

120 % Geltotalreal = reshape(Geltotalreal,[nl,1]);

121 % Geltotalim = reshape(Geltotalim,[nl,1]);

122 % dataAz = [frequency,Gaztotalreal,Gaztotalim];

183

123 % dataEl = [frequency,Geltotalreal,Geltotalim];

124 %

125 %% Calculate RMS values - Could change this to simply area under curve

126 % since they are not PSDs

127 % Gaztotalmag_RMS = sqrt(trapz(frequency,Gaztotalmag))

128 % Geltotalmag_RMS = sqrt(trapz(frequency,Geltotalmag))

129 %

130 %% Write output data

131 % fileID = fopen('dataAz.dat','w');

132 % dataAz = transpose(dataAz);

133 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

134 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataAz);

135 % fclose(fileID);

136 % %

137 % fileID = fopen('dataEl.dat','w');

138 % dataEl = transpose(dataEl);

139 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

140 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataEl);

141 % fclose(fileID);

184

142 %

143 end

144

145

Listing of Matlab conFun module

1 function [ gineqS, heqS ] = sj_conF_20180717( XS )

2 % Constraint function

3 %

4 %% Global variables

5 global conFhistData

6 %

7 %% Obtain parameters

8 [ g, zeta, input_accel_amplitude,...

9 inpFile, datFile, optFile,...

10 XL, XU, X0, fixedParameters,...

11 elimModes,...

12 input_node_dof, input_dof, output_dof,...

185

13 inAPSD, fPSD, wPSD,...

14 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

15 %

16 %% Design variables for testing

17 % X = X0;

18 % XS = X .* alpha;

19 %

20 %% Unscale

21 X = XS ./ alpha;

22 %

23 %% Read modal data

24 [ totalmodelMass, numModes, numNodes, freq,...

25 Phi ] = sj_read_modal_data_20180717;

26 totalmodelMass;

27 numModes;

28 numNodes;

29 numDOF = numNodes * 6;

30 freq;

31 %

186

32 %% Apply constraints

33 %

34 % fixedParameters(5,1) - freq(1) <= 0;

35 gineq(1) = fixedParameters(5,1) - freq(1);

36 % massBeams - massBeamsAllow <= 0;

37 % X = Xopt;

38 massa = (X(1)*fixedParameters(1,1)*fixedParameters(1,2)*fixedParameters(1,3));

39 massb = (X(2)*fixedParameters(2,1)*fixedParameters(2,2)*fixedParameters(2,3));

40 massc = (X(3)*fixedParameters(3,1)*fixedParameters(3,2)*fixedParameters(3,3));

41 massBeams = massa + massb + massc;

42 massBeamsAllow = fixedParameters(4,1);

43 gineq(2) = massBeams - massBeamsAllow; % inequality constraint

44 gineq = gineq';

45 heq = 0; % no equality constraints

46 %

47 %% Scale

48 gineqS(1) = gamma(1) .* gineq(1);

49 gineqS(2) = gamma(2) .* gineq(2);

50 heqS = gamma(1) .* heq;

187

51 %

52 conFhistData = [conFhistData;double([gineqS heqS gineq' heq])];

53 %

54 end

188

APPENDIX C

Code for Example 2

Listing of Matlab User Parameters module

1 function [ g, zeta, input_accel_amplitude,...

2 inpFile, datFile, optFile,...

3 XL, XU, X0, fixedParameters,...

4 elimModes,...

5 input_node_dof, input_dof, output_dof,...

6 inAPSD, fPSD, wPSD,...

7 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717

8 % Initial parameters are set in this function

9 %

10 % Input is acceleration. If desired, this can be changed to

11 % displacement later.

12 %

13 %% Define constants

14 %

15 g = 386.1;

16 zeta = .025;

189

17 input_accel_amplitude = 386.1;

18 %

19 %% Define file names

20 %

21 inpFile = 'stpshell_lm_modes_mass_fil_opt_20180726.inp';

22 datFile = 'stpshell_lm_modes_mass_fil_opt_20180726.dat';

23 optFile = 'stepped_shell.bs';

24 %

25 %% Define design variable starting point and bounds

26 %

27 % beam depths for beams a, b, and c

28 X0 = [0.051, 0.040, 0.028]';

29 XL = [0.04, 0.03, 0.02]';

30 XU = [0.08, 0.08, 0.08]';

31 %

32 %% Define fixed parameters to pass to functions

33 %

34 fixedParameters(1,1) = 0.250; % shell a area

35 fixedParameters(1,2) = 0.098/386.1; % shell a density

190

36 fixedParameters(2,1) = 0.500; % shell b area

37 fixedParameters(2,2) = 0.098/386.1; % shell b density

38 fixedParameters(3,1) = 0.375; % shell c area

39 fixedParameters(3,2) = 0.098/386.1; % shell c density

40 %

41 fixedParameters(4,:) = [0.004288/386.1,0]; % allowable mass of all shells

42 fixedParameters(5,:) = [17,0]; % min natural freq

43 %

44 %% Define eliminated modes - not total rigid body modes, but gimbal axes

45 %

46 elimModes = [];

47 %

48 %% Define input and output nodes and DOF

49 %

50 input_node = 4;

51 input_node_dof = 2;

52 output_nodes = [1,1,1,1,1,1,...

53 2,2,2,2,2,2,...

54 3,3,3,3,3,3,...

191

55 4,4,4,4,4,4]; % include all optical, input, and output nodes

56 output_node_dof = [1,2,3,4,5,6,...

57 1,2,3,4,5,6,...

58 1,2,3,4,5,6,...

59 1,2,3,4,5,6]; % include all optical, input, and output nodes

60 %

61 input_dof=(input_node - 1)*6 + input_node_dof;

62 output_dof=(output_nodes - 1)*6 + output_node_dof;

63 %

64 %% Optimize on Az jitter, El jitter, or both?

65 AzElorBoth = 'El'; % type Az, El, or 'Both'

66 %

67 %% Define input PSD

68 fPSD = (5:1:500)';

69 wPSD = 2*pi.*fPSD;

70 inAPSDmag = .000505 * ones(length(fPSD),1);

71 inAPSD_RMS = sqrt(trapz(fPSD,inAPSDmag)); % calc RMS value

72 inAPSD = frd(inAPSDmag',fPSD','units','Hz'); % gen freq model of input

73 % figure;

192

74 % h3 = bodeplot(inAPSD);

75 % setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

76 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

77 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

78 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

79 %

80 %% Define scaling factors

81 %

82 alpha = 1/0.01; % design variable scaling

83 beta = 1/1.0; % objective function scaling

84 gamma(1) = 1/1.0; % constraint function scaling for frequency

85 gamma(2) = 1/1e-9; % constraint function scaling for mass

86 %

87 end

88

Listing of Matlab Main module

1 %% Structural Jitter Minimization Rick Scott

193

2 % Run jitter minimization and store history of design variables

3 % and objective function values

4 %

5 %%

6 tic

7 clear; clc;

8 close all;

9 format compact

10 format long

11 %

12 %% Set up saved history info

13 global objFhistData conFhistData Gaztotal Geltotal

14 objFhistData = [];

15 conFhistData = [];

16 Gaztotal = [];

17 Geltotal = [];

18 % azjitterPSD = [];

19 % eljitterPSD = [];

20 %

194

21 %%

22 % XL = [0.040, 0.030, 0.020]';

23 % XU = [0.080, 0.080, 0.080]';

24 % X0 = [0.6, 1.2, 1.8]';

25 %

26 %% Obtain parameters

27 [ g, zeta, input_accel_amplitude,...

28 inpFile, datFile, optFile,...

29 XL, XU, X0, fixedParameters,...

30 elimModes,...

31 input_node_dof, input_dof, output_dof,...

32 inAPSD, fPSD, wPSD,...

33 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

34 %

35 %%

36 XLS = alpha .* XL;

37 XUS = alpha .* XU;

38 X0S = alpha .* X0;

39

195

40 objF = @ sj_objFun_20180812;

41 conF = @ sj_conF_20180717;

42 % outputF = @ ouputF_20180715;

43

44 options = optimoptions('fmincon','Algorithm','sqp',...

45 'Display','iter',...

46 'PlotFcn',{@optimplotx,@optimplotfval},...

47 'MaxIterations',0,'MaxFunctionEvaluations',200,...

48 'DiffMinChange',.0001,...

49 'OptimalityTolerance',.001,...

50 'FunctionTolerance',.001,'ConstraintTolerance',.0001,...

51 'StepTolerance',1e-6);

52

53 problem = createOptimProblem('fmincon','x0',X0S,'objective',objF,...

54 'lb',XLS,'ub',XUS,'nonlcon',conF,'options',options);

55 %

56 %% Local search only

57 %

58 [XoptS, objFS] = fmincon(problem)

196

59 Xopt = XoptS ./ alpha;

60 objF = objFS ./ beta;

61 %

62 %% Multistart

63 %

64 % ms = MultiStart('Display','final',...

65 % 'FunctionTolerance',.001,...

66 % 'XTolerance',.001);

67 % % ,...

68 % % 'StartPointsToRun','bounds-ineqs');

69 % % ,...

70 % % 'UseParallel','true');

71 % ptmatrix = [.040,.040,.040;

72 % .080,.070,.050;

73 % .060,.080,.040];

74 % sptmatrix = alpha .* ptmatrix;

75 % tpoints = CustomStartPointSet(sptmatrix);

76 % ms = MultiStart('Display','final');

77 % [XoptS,objFS,eflag,output,manymins] = run(ms,problem,tpoints);

197

78 % % [XoptS,objFS,eflag,output,manymins] = run(ms,problem,4);

79 % Xopt = XoptS ./ alpha;

80 % objF = objFS ./ beta;

81 %

82 %% Global Search

83 %

84 % gs = GlobalSearch('Display','final',...

85 % 'FunctionTolerance',.001,...

86 % 'XTolerance',.001,...

87 % 'NumStageOnePoints',4,...

88 % 'NumTrialPoints',5,...

89 % 'StartPointsToRun','bounds-ineqs');

90 % [Xopt, objF] = run(gs,problem);

91 %

92 %% Show results

93 Xopt = vpa(Xopt,5) % Show results

94 objF = vpa(objF,5)

95 %

96 %% Calculate structural jitter PSD responses

198

97 Gaztotal = prescale(Gaztotal, {wPSD(1),wPSD(end)});

98 Geltotal = prescale(Geltotal, {wPSD(1),wPSD(end)});

99 azFRF = frd(Gaztotal,fPSD,'Hz');

100 elFRF = frd(Geltotal,fPSD,'Hz');

101 azPSD = inAPSD*azFRF^2;

102 elPSD = inAPSD*elFRF^2;

103 % figure

104 % h5 = bodeplot(inAPSD,azPSD,elPSD);

105 % setoptions(h5,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

106 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

107 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

108 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

109 [azPSDmag,azPSDphase,azPSDwout] = bode(azPSD,wPSD);

110 azPSD_RMS = sqrt(trapz(fPSD,azPSDmag)) % calc RMS value

111 [elPSDmag,elPSDphase,elPSDwout] = bode(elPSD,wPSD);

112 elPSD_RMS = sqrt(trapz(fPSD,elPSDmag)) % calc RMS value

113 %

114 %% Generate structural jitter plots

115 figure

199

116 h1 = bodeplot(Gaztotal, Geltotal);

117 setoptions(h1,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

118 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

119 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

120 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

121 figure

122 h2 = bodeplot(azPSD,elPSD);

123 setoptions(h2,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

124 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

125 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

126 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

127 figure

128 h3 = bodeplot(inAPSD);

129 setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

130 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

131 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

132 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

133 %%

134 objFhistData

200

135 conFhistData

136 toc

137 beep

>>

Listing of Matlab objFun module

1 function [ objFS ] = sj_objFun_20180804( XS )

2 % Calculate structural jitter as the objective function to be

3 % minimized.

4 %

5 %

6 %% Initial settings

7 % clear; clc;

8 % close all;

9 % format compact

10 fclose('all');

11 %

12 %% Global variables

201

13 global objFhistData Gaztotal Geltotal

14 %

15 %% Obtain parameters

16 [ g, zeta, input_accel_amplitude,...

17 inpFile, datFile, optFile,...

18 XL, XU, X0, fixedParameters,...

19 elimModes,...

20 input_node_dof, input_dof, output_dof,...

21 inAPSD, fPSD, wPSD,...

22 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

23 %

24 %%

25 X = XS ./ alpha;

26 %

27 %% Obtain optical coef data

28 [ azCoef, elCoef ] = sj_read_opt_coef_20180717;

29 % allCoef = [ azCoef, elCoef ];

30 % [ coefRows, coefCols ] = size(allCoef);

31 %

202

32 %% Modify the Abaqus input file

33 designVar = X;

34 sj_mod_FEM_20180717(designVar);

35 %

36 %% Calculate dynamics

37 [ Greldisplc, Gabsdispl, Gabsaccel ] = sj_calc_dyn_20180717;

38 %

39 %% Multiply optical coefficients by displacements

40 for i = 1:1:length(azCoef)

41 Gazc{i} = Greldisplc{i}*azCoef(i);

42 end

43 for i = 1:1:length(elCoef)

44 Gelc{i} = Greldisplc{i}*elCoef(i);

45 end

46 %

47 %% Sum optical responses

48 Gaztotal = Gazc{1};

49 for i = 2:1:length(Gazc)

50 Gaztotal = parallel(Gaztotal,Gazc{i});

203

51 end

52 Geltotal = Gelc{1};

53 for i = 2:1:length(Gelc)

54 Geltotal = parallel(Geltotal,Gelc{i});

55 end

56 %

57 %% Generate FRF data and area values for jitter, and specify objF

58 f = 1:1:500;

59 w = 2*pi.*f;

60 frequency = w ./ (2*pi);

61 frequency = transpose(frequency);

62 if ismember(AzElorBoth,{'az','Az','AZ','a','A'})

63 [Gaztotalmag,~,~] = bode(Gaztotal,w);

64 Gaztotalmag_Area = trapz(frequency,Gaztotalmag);

65 objF = Gaztotalmag_Area;

66 elseif ismember(AzElorBoth,{'el','El','EL','e','E'})

67 [Geltotalmag,~,~] = bode(Geltotal,w);

68 Geltotalmag_Area = trapz(frequency,Geltotalmag);

69 objF = Geltotalmag_Area;

204

70 elseif ismember(AzElorBoth,{'both','Both','BOTH','b','B'})

71 [Gaztotalmag,~,~] = bode(Gaztotal,w);

72 [Geltotalmag,~,~] = bode(Geltotal,w);

73 Gaztotalmag_Area = trapz(frequency,Gaztotalmag);

74 Geltotalmag_Area = trapz(frequency,Geltotalmag);

75 objF = sqrt(Gaztotalmag_Area^2 + Geltotalmag_Area^2);

76 else

77 displ('type Az, El, or Both in parameters');

78 return

79 end

80 %

81 %% Write history data

82 %

83 objFS = beta .* objF;

84 objFhistData = [objFhistData;double([X' objF])];

85 end

86

87

205

Listing of Matlab Read Optics Data module

1 function [ azCoef, elCoef ] = sj_read_opt_coef_20180717

2 % Get optical coefficients from .bs file

3 %

4 % %% Initial settings

5 % clear; clc;

6 % close all;

7 % format compact

8 % %

9 %% Obtain parameters

10 [ g, zeta, input_accel_amplitude,...

11 inpFile, datFile, optFile,...

12 XL, XU, X0, fixedParameters,...

13 elimModes,...

14 input_node_dof, input_dof, output_dof,...

15 inAPSD, fPSD, wPSD,...

16 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

17 %

18 %% Read Abaqus .dat file

206

19 fileID = fopen(optFile,'r');

20 opticalData = textscan(fileID,'%s','Delimiter','\r\n');

21 %

22 %% Obtain azimuth coefficients

23 [rowOCT,colOCT] = find(strcmp(opticalData{1},...

24 'Echo of optical coefficients'), 2, 'first');

25 [rowCVT,colCVT] = find(strcmp(opticalData{1},...

26 'AZIMUTH COEFFICIENT VERIFICATION'), 2, 'first');

27 rowBeforeAzStart = rowOCT+2;

28 rowAfterElEnd = rowCVT-2;

29 numOptNodes = (rowAfterElEnd - rowBeforeAzStart - 4) / 2;

30 for n = 1:1:numOptNodes

31 nodeLine = opticalData{1}{rowBeforeAzStart + n,colCVT};

32 nodeLine = regexprep(nodeLine,' +',' ');

33 nodeLine = str2num(nodeLine);

34 azVec(n,:) = nodeLine;

35 end

36 % Remove first column of matrix, reshape coefficients to single column

37 azVec(:,1) = [];

207

38 [nr,nc]=size(azVec);

39 azCoef = reshape(azVec',[nr*nc,1]);

40 %

41 %% Obtain elevation coefficients

42 rowBeforeElStart = rowOCT + numOptNodes + 5;

43 for n = 1:1:numOptNodes

44 nodeLine = opticalData{1}{rowBeforeElStart + n,colCVT};

45 nodeLine = regexprep(nodeLine,' +',' ');

46 nodeLine = str2num(nodeLine);

47 elVec(n,:) = nodeLine;

48 end

49 % Remove first column of matrix, reshape coefficients to single column

50 elVec(:,1) = [];

51 [nr,nc]=size(elVec);

52 elCoef = reshape(elVec',[nr*nc,1]);

53 %

54 end

Listing of Matlab Modify FEM Input module

208

1 function sj_mod_FEM_20180717(designVar)

2 % Function receives design variables and modifies the Abaqus input file

3 %

4 % %% Initial settings while testing

5 % clear; clc;

6 % close all;

7 % format compact

8 % X = [0.0255 0.0155 0.03 0.02]; % Design variables for testing

9 % %

10 %%

11 % global histData

12 %

13 %% Obtain parameters

14 [ g, zeta, input_accel_amplitude,...

15 inpFile, datFile, optFile,...

16 XL, XU, X0, fixedParameters,...

17 elimModes,...

18 input_node_dof, input_dof, output_dof,...

19 inAPSD, fPSD, wPSD,...

209

20 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

21 %

22 %%

23 % %% Method A using fgetl and fprintf

24 % tic

25 % fidIn = fopen(inpFile,'r');

26 % fidOut = fopen('tempfileA.dat','w');

27 % while ~feof(fidIn)

28 % textline = fgetl(fidIn); % Read line

29 % if contains(textline,'*PARAMETER')

30 % fprintf(fidOut,'%s\n',textline);

31 % for i = 1:1:length(X)

32 % textline = fgetl(fidIn);

33 % textline = ['designVar',num2str(i),' = ',num2str(X(i))];

34 % fprintf(fidOut,'%s\n',textline);

35 % end

36 % else

37 % fprintf(fidOut,'%s\n',textline);

38 % end

210

39 % end

40 % fclose(fidIn);

41 % fclose(fidOut);

42 % toc

43 % movefile('tempfileA.dat',inpFile);

44 % %

45 %% Method B using textscan

46 % tic

47 fidIn = fopen(inpFile,'r');

48 fidOut = fopen('tempfileB.dat','w');

49 inputData = textscan(fidIn,'%s','Delimiter','\r\n');

50 [rowPar,colPar] = find(strcmp(inputData{1},...

51 '*PARAMETER'), 2, 'first');

52 for i = 1:1:length(designVar)

53 inputData{1}{rowPar,colPar};

54 inputData{1}{rowPar+i,colPar} = ['designVar',num2str(i),' = ',num2str(designVar(i))];

55 end

56 fprintf(fidOut,'%s\n',inputData{1}{:,colPar});

57 fclose(fidIn);

211

58 fclose(fidOut);

59 % toc

60 movefile('tempfileB.dat',inpFile);

61 %

62 end

63

Listing of Matlab Read Modal Data module

1 function [ totalmodelMass, numModes, numNodes, freq,...

2 Phi ] = sj_read_modal_data_20180717

3 % Get modal data from Abaqus .dat file

4 %

5 % %% Initial settings

6 % clear; clc;

7 % close all;

8 % format compact;

9 % %

10 %% Obtain parameters

11 [ g, zeta, input_accel_amplitude,...

212

12 inpFile, datFile, optFile,...

13 XL, XU, X0, fixedParameters,...

14 elimModes,...

15 input_node_dof, input_dof, output_dof,...

16 inAPSD, fPSD, wPSD,...

17 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

18 %

19 %% Read Abaqus .dat file

20 fileID = fopen(datFile,'r');

21 modalData = textscan(fileID,'%s','Delimiter','\r\n');

22 % disp(modalData{1});

23 %

24 %% Obtain "TOTAL MASS OF MODEL"

25 [rowTM,colTM] = find(strcmp(modalData{1},...

26 'TOTAL MASS OF MODEL'), 2, 'first');

27 rowTM = rowTM(end);

28 colTM = colTM(end);

29 totalmodelMass = str2num(modalData{1}{rowTM+2,colTM});

30 %

213

31 %% Obtain structural frequencies

32 % Use rows between participation factors and effective mass to

33 % count the number of modes because the number of rows between

34 % frequencies and participation factors changes depending if

35 % Abaqus writes the note about rigid body modes

36 [rowEO,colEO] = find(strcmp(modalData{1},...

37 '(RAD/TIME) (CYCLES/TIME)'), 2, 'first');

38 [rowPF,colPF] = find(strcmp(modalData{1},...

39 'P A R T I C I P A T I O N F A C T O R S'), 2, 'first');

40 [rowEM,colEM] = find(strcmp(modalData{1},...

41 'E F F E C T I V E M A S S'), 2, 'first');

42 rowBeforeFreqStart = rowEO+2;

43 rowBeforePFStart = rowPF+3;

44 rowAfterPFEnd = rowEM-2;

45 numModes = rowAfterPFEnd - rowBeforePFStart - 1;

46 for f = 1:1:numModes

47 freqLine = modalData{1}{rowBeforeFreqStart+f,colEO};

48 freqLine = regexprep(freqLine,' +',' ');

49 freqLine = textscan(freqLine,'%s','Delimiter',' ')';

214

50 freqLine = freqLine{:}';

51 freq(f) = str2num(freqLine{4});

52 end

53 freq = freq';

54 %

55 %% Obtain eigenvectors prior to the last one

56 vecText = 'E I G E N V A L U E N U M B E R';

57 for v = 1:1:numModes - 1

58 vecNum = num2str(v);

59 formatSpec = '%6s';

60 vecNum = sprintf(formatSpec,vecNum);

61 vecTitle = strcat(vecText,vecNum);

62 [rowVec,colVec] = find(strcmp(modalData{1},vecTitle), 2, 'first');

63 vecNext = num2str(v+1);

64 vecNext = sprintf(formatSpec,vecNext);

65 vecNextTitle = strcat(vecText,vecNext);

66 [rowVecNext,colVecNext] = find(strcmp(modalData{1},vecNextTitle), 2, 'first');

67 rowBeforeVecStart = rowVec+14;

68 rowAfterVecEnd = rowVecNext-10;

215

69 numNodes = rowAfterVecEnd - rowBeforeVecStart - 1;

70 for n = 1:1:numNodes

71 nodeLine = modalData{1}{rowBeforeVecStart + n,colVec};

72 nodeLine = regexprep(nodeLine,' +',' ');

73 nodeLine = str2num(nodeLine);

74 vec(n,:) = nodeLine;

75 end

76 eigvec(:,:,v) = vec;

77 end

78 %% Obtain last eigenvector with numNodes instead of vecNext

79 v = v + 1;

80 vecNum = num2str(v);

81 formatSpec = '%6s';

82 vecNum = sprintf(formatSpec,vecNum);

83 vecTitle = strcat(vecText,vecNum);

84 [rowVec,colVec] = find(strcmp(modalData{1},vecTitle), 2, 'first');

85 rowBeforeVecStart = rowVec+14;

86 rowAfterVecEnd = rowVec+14+numNodes+1;

87 for n = 1:1:numNodes

216

88 nodeLine = modalData{1}{rowBeforeVecStart + n,colVec};

89 nodeLine = regexprep(nodeLine,' +',' ');

90 nodeLine = str2num(nodeLine);

91 vec(n,:) = nodeLine;

92 end

93 eigvec(:,:,v) = vec;

94 eigvec(:,1,:) = [];

95 % eigvecTemp = eigvec;

96 % eigvecTemp(:,1,:) = [];

97 % eigvec(:,:,3)

98 % eigvecTemp(:,:,1)

99 % eigvec(:,:,3) - eigvecTemp(:,:,1)

100 fclose(fileID);

101 %% Eliminate modes

102 % elimModes = [1 2 4 6];

103 % eigvecTemp = eigvec;

104 % eigvecTemp(:,:,elimModes) = [];

105 numModes = numModes - length(elimModes);

106 eigvec(:,:,elimModes) = [];

217

107 freq(elimModes) = [];

108 % tempA = [1 1 2 3;...

109 % 2 4 5 6;...

110 % 3 7 8 9;...

111 % 4 10 11 12;...

112 % 5 13 14 15;...

113 % 6 16 17 18;...

114 % 7 19 20 21]';

115 % elimModes = [1 2 4 6];

116 % tempA(:,elimModes) = [];

117 %

118 %% Reshape eigenvectors to single column

119 for m = 1:1:numModes

120 vec = eigvec(:,:,m);

121 % vec(:,1) = [];

122 [nr,nc]=size(vec);

123 vec = reshape(vec',[nr*nc,1]);

124 Phi(:,m) = vec;

125 end

218

126

127 %%

128 % NumModes

129 % NumNodes

130 % Phi

131 end

Listing of Matlab Calculate Dynamics module

1 function [ Greldisplc, Gabsdispl, Gabsaccel ] = sj_calc_dyn_20180717

2 % Generate response / base motion transfer functions using large mass

3 % method.

4 %

5 % See read me.docx

6 %

7

8 %% Initial settings

9 % clear; clc;

10 % close all;

11 % format compact

219

12 %

13 %%

14 % global histData

15 %

16 %% Obtain parameters

17 [ g, zeta, input_accel_amplitude,...

18 inpFile, datFile, optFile,...

19 XL, XU, X0, fixedParameters,...

20 elimModes,...

21 input_node_dof, input_dof, output_dof,...

22 inAPSD, fPSD, wPSD,...

23 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

24 %

25 %% Run Abaqus model - Credit Papazafeiropoulos et al for this section

26 % inputFile = 'stpbeam_modes_lm_mass_fil_opt_20180707';

27 inpFile = inpFile(1:end-4);

28 %system(['abaqus job=' inpFile ' cpus=4']);

29 system(['abaqus job=' inpFile]);

30 pause(10) % Pause matlab to give Abaqus time to create .lck file

220

31 while exist([inpFile '.lck'],'file')==2

32 pause(0.1)

33 end

34 %

35 %% Define s as transfer function for differentiation and integration

36 s = ss(tf([1 0], [0 1]));

37 %

38

39 %% Read modal data

40 [ totalmodelMass, numModes, numNodes, freq,...

41 Phi ] = sj_read_modal_data_20180717;

42 totalmodelMass;

43 numModes;

44 numNodes;

45 numDOF = numNodes * 6;

46 freq;

47 w = 2*pi*freq;

48 Phi;

49 input_force = totalmodelMass*input_accel_amplitude;% accel resp std

221

50 % input_force = totalmodelMass*input_accel_amplitude/g;% accel resp gs

51 %

52 %% Build system matrix A from individual mode system matrices ai

53 numStates = numModes * 2;

54 A = zeros(numStates);

55 for i = 1:1:numModes

56 a(:,:,i) = [0, 1; -w(i).^2, -2*zeta*w(i)]; % keep individual mode system matrices

57 A(2*i-1:2*i,2*i-1:2*i) = a(:,:,i); % combine to create total system matrix

58 end

59 %

60 %% Build input matrix B from individual mode input matrices bi

61 B = zeros(numStates,1);

62 for i = 1:1:numModes

63 b(:,i) = [0;Phi(input_dof,i)];

64 B(2*i-1:2*i) = b(:,i);

65 end

66 %

67 %% Create output matrix C from individual mode output matrices ci

68 C = zeros(length(output_dof),numStates);

222

69 for i = 1:1:numModes

70 c(:,1,i) = transpose(Phi(output_dof(1):output_dof(end),i));

71 c(:,2,i) = zeros(length(output_dof),1);

72 C(:,2*i-1:2*i) = c(:,:,i);

73 end

74 %

75 %% Create feed-through matrix D

76 D = [];

77 %

78 %% Generate the system state space models

79 Gabsdispl = input_force*ss(A,B,C,D); % abs displ resp / force input of mass*accel

80 Gabsaccel = Gabsdispl*s^2;

81 for x = 1:1:length(Gabsaccel)

82 Gabsaccelc{x} = Gabsaccel(x);

83 end

84 %

85 %% Add base motion to system model to obtain relative displacement

86 Greldispl = Gabsdispl;% rel and abs are same except for bm direction

87 for x = 1:1:length(Greldispl)

223

88 Greldisplc{x} = Greldispl(x);

89 end

90 for n = input_node_dof:6:length(output_dof)

91 Greldisplc{n} = parallel(Gabsdispl(n),-1*Gabsdispl(input_dof));% displ rel to bm

92 end

93 %

94 %% Plot FRFs

95 % figure;

96 % h1 = bodeplot(Gabsaccel(input_dof),Gabsaccel(2),Gabsaccel(8),Gabsaccel(14));

97 % setoptions(h1,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

98 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

99 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

100 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

101 % figure;

102 % h3 = bodeplot(Gaztotal, Geltotal);

103 % setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

104 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

105 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

106 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

224

107 %

108 %% Generate data

109 % f = 1:1:500;

110 % w = 2*pi.*f;

111 % [Gaztotalmag,Gaztotalphase,Gaztotalwout] = bode(Gaztotal,w);

112 % [Geltotalmag,Geltotalphase,Geltotalwout] = bode(Geltotal,w);

113 % frequency = w ./ (2*pi);

114 % frequency = transpose(frequency);

115 % [Gaztotalreal,Gaztotalim] = pol2cart(Gaztotalphase,Gaztotalmag);

116 % [nr,nc,nl] = size(Gaztotalreal);

117 % Gaztotalreal = reshape(Gaztotalreal,[nl,1]);

118 % Gaztotalim = reshape(Gaztotalim,[nl,1]);

119 % [Geltotalreal,Geltotalim] = pol2cart(Geltotalphase,Geltotalmag);

120 % Geltotalreal = reshape(Geltotalreal,[nl,1]);

121 % Geltotalim = reshape(Geltotalim,[nl,1]);

122 % dataAz = [frequency,Gaztotalreal,Gaztotalim];

123 % dataEl = [frequency,Geltotalreal,Geltotalim];

124 %

125 %% Calculate RMS values - Could change this to simply area under curve

225

126 % since they are not PSDs

127 % Gaztotalmag_RMS = sqrt(trapz(frequency,Gaztotalmag))

128 % Geltotalmag_RMS = sqrt(trapz(frequency,Geltotalmag))

129 %

130 %% Write output data

131 % fileID = fopen('dataAz.dat','w');

132 % dataAz = transpose(dataAz);

133 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

134 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataAz);

135 % fclose(fileID);

136 % %

137 % fileID = fopen('dataEl.dat','w');

138 % dataEl = transpose(dataEl);

139 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

140 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataEl);

141 % fclose(fileID);

142 %

143 end

144

226

145

Listing of Matlab conFun module

1 function [ gineqS, heqS ] = sj_conF_20180717( XS )

2 % Constraint function

3 %

4 %% Global variables

5 global conFhistData

6 %

7 %% Obtain parameters

8 [ g, zeta, input_accel_amplitude,...

9 inpFile, datFile, optFile,...

10 XL, XU, X0, fixedParameters,...

11 elimModes,...

12 input_node_dof, input_dof, output_dof,...

13 inAPSD, fPSD, wPSD,...

14 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

15 %

227

16 %% Design variables for testing

17 % X = X0;

18 % XS = X .* alpha;

19 %

20 %% Unscale

21 X = XS ./ alpha;

22 %

23 %% Read modal data

24 [ totalmodelMass, numModes, numNodes, freq,...

25 Phi ] = sj_read_modal_data_20180717;

26 totalmodelMass;

27 numModes;

28 numNodes;

29 numDOF = numNodes * 6;

30 freq;

31 %

32 %% Apply constraints

33 % fixedParameters(5,1) - freq(1) <= 0;

34 gineq(1) = fixedParameters(5,1) - freq(7);

228

35 massa = (X(1)*fixedParameters(1,1)*fixedParameters(1,2));

36 massb = (X(2)*fixedParameters(2,1)*fixedParameters(2,2));

37 massc = (X(3)*fixedParameters(3,1)*fixedParameters(3,2));

38 massShells = massa + massb + massc;

39 massShellsAllow = fixedParameters(4,1);

40 % massShells - massShellsAllow <= 0;

41 gineq(2) = massShells - massShellsAllow; % inequality constraint

42 gineq = gineq';

43 heq = 0; % no equality constraints

44 %

45 %% Scale

46 gineqS(1) = gamma(1) .* gineq(1);

47 gineqS(2) = gamma(2) .* gineq(2);

48 heqS = gamma(1) .* heq;

49 %

50 conFhistData = [conFhistData;double([gineqS heqS gineq' heq])];

51 %

52 end

229

230

APPENDIX D

Code for Example 3

Listing of Matlab User Parameters module

1 function [ g, zeta, input_accel_amplitude,...

2 inpFile, datFile, optFile,...

3 XL, XU, X0, fixedParameters,...

4 elimModes,...

5 input_node_dof, input_dof, output_dof,...

6 inAPSD, fPSD, wPSD,...

7 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717

8 % Initial parameters are set in this function

9 %

10 % Input is acceleration. If desired, this can be changed to

11 % displacement later.

12 %

13 %

14 %

15 %%

231

16 % global histData

17 %

18 %% Define constants

19 %

20 g = 386.1;

21 zeta = .025;

22 input_accel_amplitude = 386.1;

23 %

24 %% Define file names

25 %

26 inpFile = 'sensor_modes_lm_mass_fil_opt_6var_20180819.inp';

27 datFile = 'sensor_modes_lm_mass_fil_opt_6var_20180819.dat';

28 optFile = 'two_axis_sensor_opt_path.bs';

29 %

30 %% Define design variable starting point and bounds

31 %

32 % Input file parameterization

33 % *PARAMETER

34 % designVar1 = 0.125

232

35 % designVar2 = 0.063

36 % designVar3 = 0.125

37 % designVar4 = 0.125

38 % designVar5 = 0.125

39 % designVar6 = 0.125

40 % **fwdlip = 0.125

41 % **cylthk = 0.063

42 % **pmm = 0.125

43 % **surfa = 0.125

44 % **surfb = 0.125

45 % **surfc = 0.125

46 %

47 % thickness of fwdlip, cylthk, pmm, surfa, surfb, surfc

48 X0 = [0.125, 0.063, 0.125, 0.125, 0.125, 0.125]';

49 XL = [0.001, 0.001, 0.063, 0.050, 0.050, 0.050]';

50 XU = [0.500, 0.125, 0.250, 0.250, 0.250, 0.250]';

51 %

52 %% Define fixed parameters to pass to functions

53 %

233

54 fixedParameters(1,1) = 18.18; % fwdlip area

55 fixedParameters(1,2) = 0.098/386.1; % fwdlip density

56 fixedParameters(2,1) = 212.08; % cylthk area

57 fixedParameters(2,2) = 0.098/386.1; % cylthk density

58 fixedParameters(3,1) = 56.92; % pmm area

59 fixedParameters(3,2) = 0.098/386.1; % pmm density

60 fixedParameters(4,1) = 15.03; % surfa area

61 fixedParameters(4,2) = 0.098/386.1; % surfa density

62 fixedParameters(5,1) = 14.44; % surfb area

63 fixedParameters(5,2) = 0.098/386.1; % surfb density

64 fixedParameters(6,1) = 7.77; % surfc area

65 fixedParameters(6,2) = 0.098/386.1; % surfc density

66 %

67 fixedParameters(7,:) = [2.69/386.1,0]; % max allow mass from X0

68 fixedParameters(8,:) = [45,0]; % min natural freq

69 fixedParameters(9,:) = [9,0]; % number of first elastic mode

70 %

71 %% Define eliminated modes - not total rigid body modes, but gimbal axes

72 %

234

73 elimModes = [7,8];

74 %

75 %% Define input and output nodes and DOF

76 %

77 input_node = 15;

78 input_node_dof = 2;

79 output_nodes = [1,1,1,1,1,1,...

80 2,2,2,2,2,2,...

81 3,3,3,3,3,3,...

82 4,4,4,4,4,4,...

83 5,5,5,5,5,5,...

84 6,6,6,6,6,6,...

85 7,7,7,7,7,7,...

86 8,8,8,8,8,8,...

87 9,9,9,9,9,9,...

88 10,10,10,10,10,10,...

89 11,11,11,11,11,11,...

90 12,12,12,12,12,12,...

91 13,13,13,13,13,13,...

235

92 14,14,14,14,14,14,...

93 15,15,15,15,15,15,...

94 16,16,16,16,16,16]; % include all optical, input, and output nodes

95 output_node_dof = [1,2,3,4,5,6,...

96 1,2,3,4,5,6,...

97 1,2,3,4,5,6,...

98 1,2,3,4,5,6,...

99 1,2,3,4,5,6,...

100 1,2,3,4,5,6,...

101 1,2,3,4,5,6,...

102 1,2,3,4,5,6,...

103 1,2,3,4,5,6,...

104 1,2,3,4,5,6,...

105 1,2,3,4,5,6,...

106 1,2,3,4,5,6,...

107 1,2,3,4,5,6,...

108 1,2,3,4,5,6,...

109 1,2,3,4,5,6,...

110 1,2,3,4,5,6]; % include all optical, input, and output nodes

236

111 %

112 input_dof=(input_node - 1)*6 + input_node_dof;

113 output_dof=(output_nodes - 1)*6 + output_node_dof;

114 %

115 %% Optimize on Az jitter, El jitter, or both?

116 AzElorBoth = 'Both'; % type Az, El, or 'Both'

117 %

118 %% Define input PSD

119 fPSD = (5:1:500)';

120 wPSD = 2*pi.*fPSD;

121 inAPSDmag = .000505 * ones(length(fPSD),1);

122 inAPSD_RMS = sqrt(trapz(fPSD,inAPSDmag)); % calc RMS value

123 inAPSD = frd(inAPSDmag',fPSD','units','Hz'); % gen freq model of input

124 % figure;

125 % h3 = bodeplot(inAPSD);

126 % setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

127 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

128 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

129 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

237

130 %

131 %% Define scaling factors

132 %

133 alpha = 1/0.1; % design variable scaling

134 beta = 1/0.1; % objective function scaling

135 gamma(1) = 1/10.0; % constraint function scaling for frequency

136 gamma(2) = 1/0.001; % constraint function scaling for mass

137 %

138 end

139

Listing of Matlab Main module

1 %% Structural Jitter Minimization Rick Scott

2 % Run jitter minimization and store history of design variables

3 % and objective function values

4 %

5 %%

6 tic

7 clear; clc;

238

8 close all;

9 format compact

10 format long

11 %

12 %% Set up saved history info

13 global histData Gaztotal Geltotal

14 histData = [];

15 Gaz = [];

16 Gel = [];

17 azjitterPSD = [];

18 eljitterPSD = [];

19 %

20 %%

21 % XL = [0.040, 0.030, 0.020]';

22 % XU = [0.080, 0.080, 0.080]';

23 % X0 = [0.6, 1.2, 1.8]';

24 %

25 %% Obtain parameters

26 [ g, zeta, input_accel_amplitude,...

239

27 inpFile, datFile, optFile,...

28 XL, XU, X0, fixedParameters,...

29 elimModes,...

30 input_node_dof, input_dof, output_dof,...

31 inAPSD, fPSD, wPSD,...

32 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

33 %

34 %%

35 XLS = alpha .* XL;

36 XUS = alpha .* XU;

37 X0S = alpha .* X0;

38

39 objF = @ sj_objFun_20180812;

40 conF = @ sj_conF_20180717;

41 % outputF = @ ouputF_20180715;

42

43 options = optimoptions('fmincon','Algorithm','sqp',...

44 'Display','iter',...

45 'PlotFcn',{@optimplotx,@optimplotfval},...

240

46 'MaxIterations',10,'MaxFunctionEvaluations',100,...

47 'DiffMinChange',.01,...

48 'OptimalityTolerance',.01,...

49 'FunctionTolerance',.001,'ConstraintTolerance',.01,...

50 'StepTolerance',1e-6);

51

52 % problem = createOptimProblem('fmincon','x0',X0S,'objective',objF,...

53 % 'lb',XLS,'ub',XUS,'nonlcon',conF,'options',options);

54 %

55 %% Local search only

56 %

57 [XoptS,objFS,exitflag,~,~,grad,~]...

58 = fmincon(objF,X0S,[],[],[],[],XLS,XUS,conF,options)

59 % [XoptS, objFS] = fmincon(problem) % for use with createOptimProblem

60 Xopt = XoptS ./ alpha;

61 objF = objFS ./ beta;

62 %

63 %% Multistart

64 %

241

65 % ms = MultiStart('Display','final',...

66 % 'FunctionTolerance',.001,...

67 % 'XTolerance',.001,...

68 % 'StartPointsToRun','bounds-ineqs',...

69 % 'UseParallel','true');

70 % ms = MultiStart('Display','final');

71 % [XoptS,objFS,eflag,output,manymins] = run(ms,problem,3);

72 % Xopt = XoptS ./ alpha;

73 % objF = objFS ./ beta;

74 %

75 %% Global Search

76 %

77 % gs = GlobalSearch('Display','final',...

78 % 'FunctionTolerance',.001,...

79 % 'XTolerance',.001,...

80 % 'NumStageOnePoints',4,...

81 % 'NumTrialPoints',5,...

82 % 'StartPointsToRun','bounds-ineqs');

83 % [Xopt, objF] = run(gs,problem);

242

84 %

85 %% Show results

86 Xopt = vpa(Xopt,5) % Show results

87 objF = vpa(objF,5)

88 histData

89 %

90 %% Calculate structural jitter PSD responses

91 Gaztotal = prescale(Gaztotal, {wPSD(1),wPSD(end)});

92 Geltotal = prescale(Geltotal, {wPSD(1),wPSD(end)});

93 azFRF = frd(Gaztotal,fPSD,'Hz');

94 elFRF = frd(Geltotal,fPSD,'Hz');

95 azPSD = inAPSD*azFRF^2;

96 elPSD = inAPSD*elFRF^2;

97 % figure

98 % h5 = bodeplot(inAPSD,azPSD,elPSD);

99 % setoptions(h5,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

100 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

101 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

102 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

243

103 [azPSDmag,azPSDphase,azPSDwout] = bode(azPSD,wPSD);

104 azPSD_RMS = sqrt(trapz(fPSD,azPSDmag)) % calc RMS value

105 [elPSDmag,elPSDphase,elPSDwout] = bode(elPSD,wPSD);

106 elPSD_RMS = sqrt(trapz(fPSD,elPSDmag)) % calc RMS value

107 %

108 %% Generate structural jitter plots

109 figure

110 h1 = bodeplot(Gaztotal, Geltotal);

111 setoptions(h1,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

112 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

113 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

114 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

115 figure

116 h2 = bodeplot(azPSD,elPSD);

117 setoptions(h2,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

118 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

119 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

120 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

121 figure

244

122 h3 = bodeplot(inAPSD);

123 setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

124 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

125 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

126 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

127 %%

128 toc

129 beep

Listing of Matlab objFun module

1 function [ objFS ] = sj_objFun_20180804( XS )

2 % Calculate structural jitter as the objective function to be

3 % minimized.

4 %

5 %

6 %% Initial settings

7 % clear; clc;

8 % close all;

9 % format compact

245

10 fclose('all');

11 %

12 %% Global variables

13 global histData Gaztotal Geltotal

14 %

15 %% Obtain parameters

16 [ g, zeta, input_accel_amplitude,...

17 inpFile, datFile, optFile,...

18 XL, XU, X0, fixedParameters,...

19 elimModes,...

20 input_node_dof, input_dof, output_dof,...

21 inAPSD, fPSD, wPSD,...

22 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

23 %

24 %% Design variables for testing

25 %

26 % X0 = [0.6, 1.2, 1.8]';

27 % XL = [0.3, 0.6, 0.9]';

28 % XU = [1.2, 2.4, 3.6]';

246

29 % X = XU;

30 % XS = X .* alpha;

31 %

32 %%

33 X = XS ./ alpha;

34 %

35 %% Obtain optical coef data

36 [ azCoef, elCoef ] = sj_read_opt_coef_20180717;

37 % allCoef = [ azCoef, elCoef ];

38 % [ coefRows, coefCols ] = size(allCoef);

39 %

40 %% Modify the Abaqus input file

41 designVar = X;

42 sj_mod_FEM_20180717(designVar);

43 %

44 %% Calculate dynamics

45 [ Greldisplc, Gabsdispl, Gabsaccel ] = sj_calc_dyn_20180717;

46 %

47 %% Multiply optical coefficients by displacements

247

48 for i = 1:1:length(azCoef)

49 Gazc{i} = Greldisplc{i}*azCoef(i);

50 end

51 for i = 1:1:length(elCoef)

52 Gelc{i} = Greldisplc{i}*elCoef(i);

53 end

54 %

55 %% Sum optical responses

56 Gaztotal = Gazc{1};

57 for i = 2:1:length(Gazc)

58 Gaztotal = parallel(Gaztotal,Gazc{i});

59 end

60 Geltotal = Gelc{1};

61 for i = 2:1:length(Gelc)

62 Geltotal = parallel(Geltotal,Gelc{i});

63 end

64 %

65 %% Plot FRFs

66 % figure;

248

67 % h1 = bodeplot(Gabsaccel(input_dof),Gabsaccel(2),Gabsaccel(8),Gabsaccel(14));

68 % setoptions(h1,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

69 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

70 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

71 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

72 % figure;

73 % h2 = bodeplot(Gaztotal, Geltotal);

74 % setoptions(h2,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

75 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

76 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

77 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

78 %

79 %% Generate FRF data and area values for jitter, and specify objF

80 f = 1:1:500;

81 w = 2*pi.*f;

82 frequency = w ./ (2*pi);

83 frequency = transpose(frequency);

84 if ismember(AzElorBoth,{'az','Az','AZ','a','A'})

85 [Gaztotalmag,~,~] = bode(Gaztotal,w);

249

86 Gaztotalmag_Area = trapz(frequency,Gaztotalmag);

87 objF = Gaztotalmag_Area;

88 elseif ismember(AzElorBoth,{'el','El','EL','e','E'})

89 [Geltotalmag,~,~] = bode(Geltotal,w);

90 Geltotalmag_Area = trapz(frequency,Geltotalmag);

91 objF = Geltotalmag_Area;

92 elseif ismember(AzElorBoth,{'both','Both','BOTH','b','B'})

93 [Gaztotalmag,~,~] = bode(Gaztotal,w);

94 [Geltotalmag,~,~] = bode(Geltotal,w);

95 Gaztotalmag_Area = trapz(frequency,Gaztotalmag);

96 Geltotalmag_Area = trapz(frequency,Geltotalmag);

97 objF = sqrt(Gaztotalmag_Area^2 + Geltotalmag_Area^2);

98 else

99 displ('type Az, El, or Both in parameters');

100 return

101 end

102 %

103 %% Generate FRF data for dynamic responses

104 % [Greldisplmag,Greldisplphase,Greldisplwout] = bode(Greldisplc{8},w);

250

105 % [Gaztotalreal,Gaztotalim] = pol2cart(Gaztotalphase,Gaztotalmag);

106 % [nr,nc,nl] = size(Gaztotalreal);

107 % Gaztotalreal = reshape(Gaztotalreal,[nl,1]);

108 % Gaztotalim = reshape(Gaztotalim,[nl,1]);

109 % [Geltotalreal,Geltotalim] = pol2cart(Geltotalphase,Geltotalmag);

110 % Geltotalreal = reshape(Geltotalreal,[nl,1]);

111 % Geltotalim = reshape(Geltotalim,[nl,1]);

112 % dataAz = [frequency,Gaztotalreal,Gaztotalim];

113 % dataEl = [frequency,Geltotalreal,Geltotalim];

114 %

115 %% Write output data for SPIF

116 % fileID = fopen('dataAz.dat','w');

117 % dataAz = transpose(dataAz);

118 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

119 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataAz);

120 % fclose(fileID);

121 % %

122 % fileID = fopen('dataEl.dat','w');

123 % dataEl = transpose(dataEl);

251

124 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

125 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataEl);

126 % fclose(fileID);

127 %

128 %% Generate PSD input

129 % fPSD = (5:1:500)';

130 % wPSD = 2*pi.*fPSD;

131 % inAPSDmag = .000505 * ones(length(fPSD),1);

132 % inAPSD_RMS = sqrt(trapz(fPSD,inAPSDmag)); % calc RMS value

133 % inAPSD = frd(inAPSDmag',fPSD','units','Hz'); % gen freq model of input

134 % figure;

135 % h3 = bodeplot(inAPSD);

136 % setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

137 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

138 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

139 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

140 %

141 %% Calculate misc PSD responses

142 % accelFRF2 = frd(Gabsaccel(2),fPSD,'Hz');

252

143 % accelFRF8 = frd(Gabsaccel(8),fPSD,'Hz');

144 % accelFRF14 = frd(Gabsaccel(14),fPSD,'Hz');

145 % respAPSD2 = inAPSD*accelFRF2^2;

146 % respAPSD8 = inAPSD*accelFRF8^2;

147 % respAPSD14 = inAPSD*accelFRF14^2;

148 % figure

149 % h4 = bodeplot(inAPSD,respAPSD2,respAPSD8,respAPSD14);

150 % setoptions(h4,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

151 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

152 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

153 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

154 % [respAPSD2mag,respAPSD2phase,respAPSD2wout] = bode(respAPSD2,wPSD);

155 % [respAPSD8mag,respAPSD8phase,respAPSD8wout] = bode(respAPSD8,wPSD);

156 % [respAPSD14mag,respAPSD14phase,respAPSD14wout] = bode(respAPSD14,wPSD);

157 % respAPSD2_RMS = sqrt(trapz(fPSD,respAPSD2mag)); % calc RMS value

158 % respAPSD8_RMS = sqrt(trapz(fPSD,respAPSD8mag)); % calc RMS value

159 % respAPSD14_RMS = sqrt(trapz(fPSD,respAPSD14mag)); % calc RMS value

160 %

253

161 %% Calculate structural jitter PSD responses

162 % Gaztotal = prescale(Gaztotal, {wPSD(1),wPSD(end)});

163 % Geltotal = prescale(Geltotal, {wPSD(1),wPSD(end)});

164 % azFRF = frd(Gaztotal,fPSD,'Hz');

165 % elFRF = frd(Geltotal,fPSD,'Hz');

166 % azPSD = inAPSD*azFRF^2;

167 % elPSD = inAPSD*elFRF^2;

168 % figure

169 % h5 = bodeplot(inAPSD,azPSD,elPSD);

170 % setoptions(h5,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

171 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

172 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

173 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

174 % [azPSDmag,~,~] = bode(azPSD,wPSD);

175 % azPSD_RMS = sqrt(trapz(fPSD,azPSDmag)); % calc RMS value

176 % [elPSDmag,~,~] = bode(elPSD,wPSD);

177 % elPSD_RMS = sqrt(trapz(fPSD,elPSDmag)); % calc RMS value

178 %

179 %% Write history data

254

180 % objF = elPSD_RMS;

181 % objF = sqrt(Gaztotalmag_Area^2 + Geltotalmag_Area^2);

182 % objF = sqrt(trapz(frequency,Greldisplmag));

183 histData = [histData;double([X' objF])];

184 % Gaz = Gaztotal;

185 % Gel = Geltotal;

186 % azjitterPSD = azPSD;

187 % eljitterPSD = elPSD;

188 %

189 objFS = beta .* objF;

190 end

Listing of Matlab Read Optics Data module

1 function [ azCoef, elCoef ] = sj_read_opt_coef_20180717

2 % Get optical coefficients from .bs file

3 %

4 % %% Initial settings

5 % clear; clc;

6 % close all;

255

7 % format compact

8 % %

9 %% Obtain parameters

10 [ g, zeta, input_accel_amplitude,...

11 inpFile, datFile, optFile,...

12 XL, XU, X0, fixedParameters,...

13 elimModes,...

14 input_node_dof, input_dof, output_dof,...

15 inAPSD, fPSD, wPSD,...

16 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

17 %

18 %% Read Abaqus .dat file

19 fileID = fopen(optFile,'r');

20 opticalData = textscan(fileID,'%s','Delimiter','\r\n');

21 %

22 %% Obtain azimuth coefficients

23 [rowOCT,colOCT] = find(strcmp(opticalData{1},...

24 'Echo of optical coefficients'), 2, 'first');

25 [rowCVT,colCVT] = find(strcmp(opticalData{1},...

256

26 'AZIMUTH COEFFICIENT VERIFICATION'), 2, 'first');

27 rowBeforeAzStart = rowOCT+2;

28 rowAfterElEnd = rowCVT-2;

29 numOptNodes = (rowAfterElEnd - rowBeforeAzStart - 4) / 2;

30 for n = 1:1:numOptNodes

31 nodeLine = opticalData{1}{rowBeforeAzStart + n,colCVT};

32 nodeLine = regexprep(nodeLine,' +',' ');

33 nodeLine = str2num(nodeLine);

34 azVec(n,:) = nodeLine;

35 end

36 % Remove first column of matrix, reshape coefficients to single column

37 azVec(:,1) = [];

38 [nr,nc]=size(azVec);

39 azCoef = reshape(azVec',[nr*nc,1]);

40 %

41 %% Obtain elevation coefficients

42 rowBeforeElStart = rowOCT + numOptNodes + 5;

43 for n = 1:1:numOptNodes

44 nodeLine = opticalData{1}{rowBeforeElStart + n,colCVT};

257

45 nodeLine = regexprep(nodeLine,' +',' ');

46 nodeLine = str2num(nodeLine);

47 elVec(n,:) = nodeLine;

48 end

49 % Remove first column of matrix, reshape coefficients to single column

50 elVec(:,1) = [];

51 [nr,nc]=size(elVec);

52 elCoef = reshape(elVec',[nr*nc,1]);

53 %

54 end

Listing of Matlab Modify FEM Input module

1 function sj_mod_FEM_20180717(designVar)

2 % Function receives design variables and modifies the Abaqus input file

3 %

4 % %% Initial settings while testing

5 % clear; clc;

6 % close all;

7 % format compact

258

8 % X = [0.0255 0.0155 0.03 0.02]; % Design variables for testing

9 % %

10 %%

11 % global histData

12 %

13 %% Obtain parameters

14 [ g, zeta, input_accel_amplitude,...

15 inpFile, datFile, optFile,...

16 XL, XU, X0, fixedParameters,...

17 elimModes,...

18 input_node_dof, input_dof, output_dof,...

19 inAPSD, fPSD, wPSD,...

20 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

21 %

22 %%

23 % %% Method A using fgetl and fprintf

24 % tic

25 % fidIn = fopen(inpFile,'r');

26 % fidOut = fopen('tempfileA.dat','w');

259

27 % while ~feof(fidIn)

28 % textline = fgetl(fidIn); % Read line

29 % if contains(textline,'*PARAMETER')

30 % fprintf(fidOut,'%s\n',textline);

31 % for i = 1:1:length(X)

32 % textline = fgetl(fidIn);

33 % textline = ['designVar',num2str(i),' = ',num2str(X(i))];

34 % fprintf(fidOut,'%s\n',textline);

35 % end

36 % else

37 % fprintf(fidOut,'%s\n',textline);

38 % end

39 % end

40 % fclose(fidIn);

41 % fclose(fidOut);

42 % toc

43 % movefile('tempfileA.dat',inpFile);

44 % %

45 %% Method B using textscan

260

46 % tic

47 fidIn = fopen(inpFile,'r');

48 fidOut = fopen('tempfileB.dat','w');

49 inputData = textscan(fidIn,'%s','Delimiter','\r\n');

50 [rowPar,colPar] = find(strcmp(inputData{1},...

51 '*PARAMETER'), 2, 'first');

52 for i = 1:1:length(designVar)

53 inputData{1}{rowPar,colPar};

54 inputData{1}{rowPar+i,colPar} = ['designVar',num2str(i),' = ',num2str(designVar(i))];

55 end

56 fprintf(fidOut,'%s\n',inputData{1}{:,colPar});

57 fclose(fidIn);

58 fclose(fidOut);

59 % toc

60 movefile('tempfileB.dat',inpFile);

61 %

62 end

Listing of Matlab Read Modal Data module

261

1 function [ totalmodelMass, numModes, numNodes, freq,...

2 Phi ] = sj_read_modal_data_20180717

3 % Get modal data from Abaqus .dat file

4 %

5 % %% Initial settings

6 % clear; clc;

7 % close all;

8 % format compact;

9 % %

10 %% Obtain parameters

11 [ g, zeta, input_accel_amplitude,...

12 inpFile, datFile, optFile,...

13 XL, XU, X0, fixedParameters,...

14 elimModes,...

15 input_node_dof, input_dof, output_dof,...

16 inAPSD, fPSD, wPSD,...

17 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

18 %

19 %% Read Abaqus .dat file

262

20 fileID = fopen(datFile,'r');

21 modalData = textscan(fileID,'%s','Delimiter','\r\n');

22 % disp(modalData{1});

23 %

24 %% Obtain "TOTAL MASS OF MODEL"

25 [rowTM,colTM] = find(strcmp(modalData{1},...

26 'TOTAL MASS OF MODEL'), 2, 'first');

27 rowTM = rowTM(end);

28 colTM = colTM(end);

29 totalmodelMass = str2num(modalData{1}{rowTM+2,colTM});

30 %

31 %% Obtain structural frequencies

32 % Use rows between participation factors and effective mass to

33 % count the number of modes because the number of rows between

34 % frequencies and participation factors changes depending if

35 % Abaqus writes the note about rigid body modes

36 [rowEO,colEO] = find(strcmp(modalData{1},...

37 '(RAD/TIME) (CYCLES/TIME)'), 2, 'first');

38 [rowPF,colPF] = find(strcmp(modalData{1},...

263

39 'P A R T I C I P A T I O N F A C T O R S'), 2, 'first');

40 [rowEM,colEM] = find(strcmp(modalData{1},...

41 'E F F E C T I V E M A S S'), 2, 'first');

42 rowBeforeFreqStart = rowEO+2;

43 rowBeforePFStart = rowPF+3;

44 rowAfterPFEnd = rowEM-2;

45 numModes = rowAfterPFEnd - rowBeforePFStart - 1;

46 for f = 1:1:numModes

47 freqLine = modalData{1}{rowBeforeFreqStart+f,colEO};

48 freqLine = regexprep(freqLine,' +',' ');

49 freqLine = textscan(freqLine,'%s','Delimiter',' ')';

50 freqLine = freqLine{:}';

51 freq(f) = str2num(freqLine{4});

52 end

53 freq = freq';

54 %

55 %% Obtain eigenvectors prior to the last one

56 vecText = 'E I G E N V A L U E N U M B E R';

57 for v = 1:1:numModes - 1

264

58 vecNum = num2str(v);

59 formatSpec = '%6s';

60 vecNum = sprintf(formatSpec,vecNum);

61 vecTitle = strcat(vecText,vecNum);

62 [rowVec,colVec] = find(strcmp(modalData{1},vecTitle), 2, 'first');

63 vecNext = num2str(v+1);

64 vecNext = sprintf(formatSpec,vecNext);

65 vecNextTitle = strcat(vecText,vecNext);

66 [rowVecNext,colVecNext] = find(strcmp(modalData{1},vecNextTitle), 2, 'first');

67 rowBeforeVecStart = rowVec+14;

68 rowAfterVecEnd = rowVecNext-10;

69 numNodes = rowAfterVecEnd - rowBeforeVecStart - 1;

70 for n = 1:1:numNodes

71 nodeLine = modalData{1}{rowBeforeVecStart + n,colVec};

72 nodeLine = regexprep(nodeLine,' +',' ');

73 nodeLine = str2num(nodeLine);

74 vec(n,:) = nodeLine;

75 end

76 eigvec(:,:,v) = vec;

265

77 end

78 %% Obtain last eigenvector with numNodes instead of vecNext

79 v = v + 1;

80 vecNum = num2str(v);

81 formatSpec = '%6s';

82 vecNum = sprintf(formatSpec,vecNum);

83 vecTitle = strcat(vecText,vecNum);

84 [rowVec,colVec] = find(strcmp(modalData{1},vecTitle), 2, 'first');

85 rowBeforeVecStart = rowVec+14;

86 rowAfterVecEnd = rowVec+14+numNodes+1;

87 for n = 1:1:numNodes

88 nodeLine = modalData{1}{rowBeforeVecStart + n,colVec};

89 nodeLine = regexprep(nodeLine,' +',' ');

90 nodeLine = str2num(nodeLine);

91 vec(n,:) = nodeLine;

92 end

93 eigvec(:,:,v) = vec;

94 eigvec(:,1,:) = [];

95 % eigvecTemp = eigvec;

266

96 % eigvecTemp(:,1,:) = [];

97 % eigvec(:,:,3)

98 % eigvecTemp(:,:,1)

99 % eigvec(:,:,3) - eigvecTemp(:,:,1)

100 fclose(fileID);

101 %% Eliminate modes

102 % elimModes = [1 2 4 6];

103 % eigvecTemp = eigvec;

104 % eigvecTemp(:,:,elimModes) = [];

105 numModes = numModes - length(elimModes);

106 eigvec(:,:,elimModes) = [];

107 freq(elimModes) = [];

108 % tempA = [1 1 2 3;...

109 % 2 4 5 6;...

110 % 3 7 8 9;...

111 % 4 10 11 12;...

112 % 5 13 14 15;...

113 % 6 16 17 18;...

114 % 7 19 20 21]';

267

115 % elimModes = [1 2 4 6];

116 % tempA(:,elimModes) = [];

117 %

118 %% Reshape eigenvectors to single column

119 for m = 1:1:numModes

120 vec = eigvec(:,:,m);

121 % vec(:,1) = [];

122 [nr,nc]=size(vec);

123 vec = reshape(vec',[nr*nc,1]);

124 Phi(:,m) = vec;

125 end

126

127 %%

128 % NumModes

129 % NumNodes

130 % Phi

131 end

Listing of Matlab Calculate Dynamics module

268

1 function [ Greldisplc, Gabsdispl, Gabsaccel ] = sj_calc_dyn_20180717

2 % Generate response / base motion transfer functions using large mass

3 % method.

4 %

5 % See read me.docx

6 %

7

8 %% Initial settings

9 % clear; clc;

10 % close all;

11 % format compact

12 %

13 %%

14 % global histData

15 %

16 %% Obtain parameters

17 [ g, zeta, input_accel_amplitude,...

18 inpFile, datFile, optFile,...

19 XL, XU, X0, fixedParameters,...

269

20 elimModes,...

21 input_node_dof, input_dof, output_dof,...

22 inAPSD, fPSD, wPSD,...

23 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

24 %

25 %% Run Abaqus model - Credit Papazafeiropoulos et al for this section

26 % inputFile = 'stpbeam_modes_lm_mass_fil_opt_20180707';

27 inpFile = inpFile(1:end-4);

28 system(['abaqus job=' inpFile ' cpus=4']);

29 pause(10) % Pause matlab to give Abaqus time to create .lck file

30 while exist([inpFile '.lck'],'file')==2

31 pause(0.1)

32 end

33 %

34 %% Define s as transfer function for differentiation and integration

35 s = ss(tf([1 0], [0 1]));

36 %

37

38 %% Read modal data

270

39 [ totalmodelMass, numModes, numNodes, freq,...

40 Phi ] = sj_read_modal_data_20180717;

41 totalmodelMass;

42 numModes;

43 numNodes;

44 numDOF = numNodes * 6;

45 freq;

46 w = 2*pi*freq;

47 Phi;

48 input_force = totalmodelMass*input_accel_amplitude;% accel resp std

49 % input_force = totalmodelMass*input_accel_amplitude/g;% accel resp gs

50 %

51 %% Build system matrix A from individual mode system matrices ai

52 numStates = numModes * 2;

53 A = zeros(numStates);

54 for i = 1:1:numModes

55 a(:,:,i) = [0, 1; -w(i).^2, -2*zeta*w(i)]; % keep individual mode system matrices

56 A(2*i-1:2*i,2*i-1:2*i) = a(:,:,i); % combine to create total system matrix

57 end

271

58 %

59 %% Build input matrix B from individual mode input matrices bi

60 B = zeros(numStates,1);

61 for i = 1:1:numModes

62 b(:,i) = [0;Phi(input_dof,i)];

63 B(2*i-1:2*i) = b(:,i);

64 end

65 %

66 %% Create output matrix C from individual mode output matrices ci

67 C = zeros(length(output_dof),numStates);

68 for i = 1:1:numModes

69 c(:,1,i) = transpose(Phi(output_dof(1):output_dof(end),i));

70 c(:,2,i) = zeros(length(output_dof),1);

71 C(:,2*i-1:2*i) = c(:,:,i);

72 end

73 %

74 %% Create feed-through matrix D

75 D = [];

76 %

272

77 %% Generate the system state space models

78 Gabsdispl = input_force*ss(A,B,C,D); % abs displ resp / force input of mass*accel

79 Gabsaccel = Gabsdispl*s^2;

80 for x = 1:1:length(Gabsaccel)

81 Gabsaccelc{x} = Gabsaccel(x);

82 end

83 %

84 %% Add base motion to system model to obtain relative displacement

85 Greldispl = Gabsdispl;% rel and abs are same except for bm direction

86 for x = 1:1:length(Greldispl)

87 Greldisplc{x} = Greldispl(x);

88 end

89 for n = input_node_dof:6:length(output_dof)

90 Greldisplc{n} = parallel(Gabsdispl(n),-1*Gabsdispl(input_dof));% displ rel to bm

91 end

92 %

93 %% Plot FRFs

94 % figure;

95 % h1 = bodeplot(Gabsaccel(input_dof),Gabsaccel(2),Gabsaccel(8),Gabsaccel(14));

273

96 % setoptions(h1,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

97 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

98 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

99 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

100 % figure;

101 % h3 = bodeplot(Gaztotal, Geltotal);

102 % setoptions(h3,'FreqUnits','Hz','FreqScale','log','MagUnits','abs',...

103 % 'MagScale','log','PhaseUnits','deg','PhaseMatching','on',...

104 % 'PhaseMatchingFreq',1,'PhaseMatchingValue',0,...

105 % 'grid','on','XLimMode',{'manual'},'Xlim',{[1 1000]});

106 %

107 %% Generate data

108 % f = 1:1:500;

109 % w = 2*pi.*f;

110 % [Gaztotalmag,Gaztotalphase,Gaztotalwout] = bode(Gaztotal,w);

111 % [Geltotalmag,Geltotalphase,Geltotalwout] = bode(Geltotal,w);

112 % frequency = w ./ (2*pi);

113 % frequency = transpose(frequency);

114 % [Gaztotalreal,Gaztotalim] = pol2cart(Gaztotalphase,Gaztotalmag);

274

115 % [nr,nc,nl] = size(Gaztotalreal);

116 % Gaztotalreal = reshape(Gaztotalreal,[nl,1]);

117 % Gaztotalim = reshape(Gaztotalim,[nl,1]);

118 % [Geltotalreal,Geltotalim] = pol2cart(Geltotalphase,Geltotalmag);

119 % Geltotalreal = reshape(Geltotalreal,[nl,1]);

120 % Geltotalim = reshape(Geltotalim,[nl,1]);

121 % dataAz = [frequency,Gaztotalreal,Gaztotalim];

122 % dataEl = [frequency,Geltotalreal,Geltotalim];

123 %

124 %% Calculate RMS values - Could change this to simply area under curve

125 % since they are not PSDs

126 % Gaztotalmag_RMS = sqrt(trapz(frequency,Gaztotalmag))

127 % Geltotalmag_RMS = sqrt(trapz(frequency,Geltotalmag))

128 %

129 %% Write output data

130 % fileID = fopen('dataAz.dat','w');

131 % dataAz = transpose(dataAz);

132 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

133 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataAz);

275

134 % fclose(fileID);

135 % %

136 % fileID = fopen('dataEl.dat','w');

137 % dataEl = transpose(dataEl);

138 % % fprintf(fileID,'%16s %16s %16s\n','frequency','real','imaginary');

139 % fprintf(fileID,'%6.9e %6.9e %6.9e\n',dataEl);

140 % fclose(fileID);

141 %

142 end

Listing of Matlab conFun module

1 function [ gineqS, heqS ] = sj_conF_20180717( XS )

2 % Constraint function

3 %

4 %% Global variables

5 % global histData

6 %

7 %% Obtain parameters

8 [ g, zeta, input_accel_amplitude,...

276

9 inpFile, datFile, optFile,...

10 XL, XU, X0, fixedParameters,...

11 elimModes,...

12 input_node_dof, input_dof, output_dof,...

13 inAPSD, fPSD, wPSD,...

14 alpha, beta, gamma, AzElorBoth] = sj_parameters_20180717;

15 %

16 %% Design variables for testing

17 % X = XU;

18 % XS = X .* alpha;

19 %

20 %% Unscale

21 X = XS ./ alpha;

22 %

23 %% Read modal data

24 [ totalmodelMass, numModes, numNodes, freq,...

25 Phi ] = sj_read_modal_data_20180717;

26 totalmodelMass;

27 numModes;

277

28 numNodes;

29 numDOF = numNodes * 6;

30 freq;

31 %

32 %% Apply constraints

33 % 1st elastic mode must be less than some value;

34 freq1st = freq(fixedParameters(9,1));

35 freqMinAllow = fixedParameters(8,1);

36 gineq(1) = freqMinAllow - freq1st;

37 % Mass of shells must be less than specified value;

38 massa = (X(1)*fixedParameters(1,1)*fixedParameters(1,2));

39 massb = (X(2)*fixedParameters(2,1)*fixedParameters(2,2));

40 massc = (X(3)*fixedParameters(3,1)*fixedParameters(3,2));

41 massd = (X(4)*fixedParameters(4,1)*fixedParameters(4,2));

42 masse = (X(5)*fixedParameters(5,1)*fixedParameters(5,2));

43 massf = (X(6)*fixedParameters(6,1)*fixedParameters(6,2));

44 massShells = massa + massb + massc + massd + masse + massf;

45 massShellsAllow = fixedParameters(7,1);

46 gineq(2) = massShells - massShellsAllow; % inequality constraint

278

47 gineq = gineq';

48 heq = 0; % no equality constraints

49 %

50 %% Rescale

51 gineqS(1) = gamma(1) .* gineq(1);

52 gineqS(2) = gamma(2) .* gineq(2);

53 heqS = gamma(1) .* heq;

54 %

55 end

279

BIOGRAPHICAL INFORMATION

Richard “Rick” Scott is a Senior Principal Mechanical Engineer at

Raytheon Company in McKinney, Texas, an adjunct professor at The

University of Texas at Arlington, and a Registered Professional Engineer in the state of Texas. In his 26-year career as an engineer, Rick has spent

14 years in structural analysis, three years in electronics cooling, and nine years in mechanical design. His skill set includes mechanical, opto- mechanical, and electro-mechanical design; structural dynamics modeling; control-structure interactions; stress analysis; and dynamics testing. Field expertise aside, his favorite professional capacties include teaching and mentoring. His primary passion is to encourage others to get excited about learning. In 1992, Rick earned his Bachelor of Science degree from

Oklahoma State University, and he received his Master of Science degree from The University of Texas at Arlington in 2007. The submission of this dissertation culminates his PhD program at The University of Texas at

Arlington in December 2018.

280