1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
#include <math.h>
#include <stdio.h>
#include <Vlib.h>
struct balance_data {
double weight; /* weight for this test */
VPoint rm; /* rest main gear location (input) */
VPoint rn; /* rest nose gear location (input) */
double cm, cn; /* rest compression values of each strut */
double Gm, Gn; /* strut + tire lengths */
double Km, Kn; /* string constants (output) */
double Gpz; /* the old "grounding point" Z value */
};
void
balance (s)
struct balance_data *s;
{
double theta, cosTheta, sinTheta;
double Fmz;
/*
* Determine the rest pitch angle of the aircraft body
*/
theta = - atan2 (s->rn.z - s->rm.z, s->rn.x - s->rm.x);
cosTheta = cos(theta);
sinTheta = sin(theta);
printf ("Theta = %f degrees (positive down)\n", theta * 180.0 / (double)M_PI);
/*
* Determine correct rm/rn values
*/
s->rn.z = s->rn.z - s->Gn - s->cn;
s->rm.z = s->rm.z - s->Gm - s->cm;
/*
* Determine spring constants
*/
Fmz = (s->weight * cosTheta * s->rn.x) / (s->rm.x - s->rn.x);
s->Km = - Fmz * s->cm;
s->Kn = (- Fmz - s->weight * cosTheta) * - s->cn;
/*
* Determine the initial grounding point
*/
s->Gpz = s->rm.x * sinTheta + (s->rm.z + s->Gm + s->cm) * cosTheta;
}
main()
{
struct balance_data s;
double cnMax, cmMax;
/*
* Wheel contact locations for the aircraft fully loaded at rest.
*/
VSetPoint (s.rn, 14.0, 0, 6.5);
VSetPoint (s.rm, -1.0, 0, 6.5);
/*
* Gross weight
*/
s.weight = 24326.0;
/*
* Maximum oleo extension lengths
*/
cnMax = 1.5;
cmMax = 1.5;
/*
* The length of the wheel and lower landing gear strut
*/
s.Gm = 1.5;
s.Gn = 1.5;
/*
* Rest oleo compression; must be less than cnMax or cmMax; usually about
* half the max value.
*/
s.cm = 1.0;
s.cn = 1.0;
printf ("Input:\n");
printf ("nose contact = %lf %lf %lf\n", s.rn.x, s.rn.y, s.rn.z);
printf ("main's contact = %lf %lf %lf\n", s.rm.x, s.rm.y, s.rm.z);
printf ("Weight = %lf\n", s.weight);
balance(&s);
printf ("\nOutput:\n");
printf ("rm = %lf, %lf, %lf\n", s.rm.x, s.rm.y, s.rm.z);
printf ("rn = %lf, %lf, %lf\n", s.rn.x, s.rn.y, s.rn.z);
printf ("Km = %lf\n", s.Km);
printf ("Kn = %lf\n", s.Kn);
printf ("Grounding point (z) = %lf\n", s.Gpz);
printf ("\n\"inventory\" form:\n\n");
printf ("\tRm\t\t{%lg, %lg, %lg}\n", s.rm.x, s.rm.y, s.rm.z);
printf ("\tRn\t\t{%lg, %lg, %lg}\n", s.rn.x, s.rn.y, s.rn.z);
printf ("\tKm\t\t%lg\n", s.Km);
printf ("\tKn\t\t%lg\n", s.Kn);
printf ("\tGm\t\t%lg\n", s.Gm);
printf ("\tGn\t\t%lg\n", s.Gn);
printf ("\tCmMax\t\t%lg\n", cmMax);
printf ("\tCnMax\t\t%lg\n", cnMax);
printf ("\tGroundingPoint\t{0.0, 0.0, %lg}\n", s.Gpz);
exit (0);
}
|