home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 284.WINGIT.INC < prev    next >
Text File  |  1986-05-13  |  44KB  |  829 lines

  1.  
  2.  (* Procedures used by Wing Program and loaded as Include (.INC) Files.   *)
  3.  (*************************************************************************)
  4.  (* Loosely Derived from articles in Soar Tech # 2, 1983, by Armin Saxer, *)
  5.  (* pgs 38..42, Chuck Anderson, pgs 130..191, and the Schlosser Brothers, *)
  6.  (* pgs 16..22, and Soar Tech # 1, 1982, the article by Martin Simons.    *)
  7.  (* Converted from BASIC, TI-59 and HP-41 Languages to Turbo Pascal.      *)
  8.  (*   Program Source Code By Ed Karns with help from Rolf Unternaehrer    *)
  9.  (*                  VERSION 2.06 May 1986. CopyRight 1986                *)
  10.  (*                                                                       *)
  11.  (*      This program source code is offered on a "free ware" basis.      *)
  12.  (*        If you find the WING PROGRAM of value, send $25.00 to :        *)
  13.  (*         Departure Company, 16 Jess Ave., Petaluma, Ca. 94952          *)
  14.  (* In return we will send a copy of Soar Tech #2 an excellent sailplane  *)
  15.  (* publication and the source for much of this program's documentation   *)
  16.  (* and latest version of this program.                                   *)
  17.  (*************************************************************************)
  18.  
  19. Procedure Display;  Begin  (* Displays All Fixed Calculation Results *)
  20.     ClrScr; (* Clears the Screen *) Writeln;                   LowVideo;
  21.     Writeln ('                Fixed Dimensions for the Wing'); NormVideo;
  22.     Writeln;
  23.       Write ('Root Chord                      ');
  24.   If Metric = False  Then  Writeln ( RC :2:2, ' Inches')
  25.       Else   Writeln ( Root_Chord :2:2, ' Centimeters');
  26.       Write (' Root Chord Thickness            ');
  27.   If Metric = False   Then   Writeln ( RFT :2:2, ' Inches')
  28.       Else   Writeln ( Root_Foil_Thickness :2:2, ' Centimeters');
  29.       Write ('Tip Chord                       ');
  30.   If Metric = False  Then    Writeln ( TC :2:2, ' Inches')
  31.       Else   Writeln ( Tip_Chord :2:2, ' Centimeters');
  32.       Write (' Tip Chord Thickness             ');
  33.   If Metric = False  Then    Writeln ( TFT :2:2, ' Inches')
  34.        Else  Writeln ( Tip_Foil_Thickness :2:2, ' Centimeters');
  35.       Write ('  Wing Sweep RC to TC           ');
  36.   If Metric = False   Then   Writeln ( WW :2:2, ' Inches')
  37.        Else  Writeln ( ' ', Wing_Sweep :2:2, ' CentiMeters');
  38.       Write ('   Mean Wing Chord              ');
  39.   If Metric = False    Then  Writeln ( TM :2:2, ' Inches')
  40.        Else  Writeln (( Mean_Chord * 100 ) :2:2, ' CentiMeters');
  41.       Write ('    Mean Chord Thickness         ');
  42.   If Metric = False  Then
  43.     Writeln (( TM * Percent_Thickness / 100.0 ) :2:2, ' Inches')
  44.       Else
  45.     Writeln (( Mean_Chord * Percent_Thickness ) :2:2, ' CentiMeters');
  46.  Writeln ('     Mean % Chord Thickness     ', Percent_Thickness :2:2, ' %');
  47.       Writeln;
  48.       Write ('Wing Span                      ');
  49.   If Metric = False   Then  Writeln ( S :3:2, ' Inches')
  50.        Else  Writeln ('  ', Wing_Span :3:2, ' Meters');
  51.       Write (' Wing Surface Area             ');
  52.   If Metric = False   Then  Writeln ( WA :5:1, ' Square Inches')
  53.        Else  Writeln ('  ', Wing_Area :2:3, ' Square Meters');
  54.       Writeln ('  Wing Aspect Ratio             ',
  55.                   Aspect_Ratio :5:2, '  * No Units *');
  56.       Write ('   All Up Flying Weight          ');
  57.   If Metric = False  Then  Writeln (( GM + BGM ) : 2:2, ' Pounds')
  58.        Else  Writeln (( Weight + B_Weight ) : 2:2, ' Kilograms');
  59.       Write ('    Wing Loading                ');
  60.   If Metric = False   Then
  61.       Writeln (( FB * 144.0 ) :5:2, ' Ounces / Square Foot')
  62.        Else
  63.       Writeln ( Wing_Load :5:2, ' Kgrams / Square Meter');
  64.       Write ('     Wing Geo. Aero. Center     ');
  65.   If Metric = False  Then  Writeln (( Wing_GAC / 2.540 ) :5:2, ' Inches')
  66.        Else  Writeln ( Wing_GAC :5:2, ' CentiMeters');
  67.       Write ('      Wing LE to CG Point        ');
  68.   If Metric = False  Then  Writeln (( P + WG ) :2:2, ' Inches - Suggested')
  69.        Else
  70.       Writeln (( CG_Distance + Wing_GAC ) :2:2, ' CentiMeters - Suggested');
  71.       Writeln;
  72.       Writeln ('Stability Factor                ',
  73.                 Stability_Factor :1:5, '  * No Units *  Negative Number');
  74.       Writeln (' Wing Dihedral Angle             ',
  75.                  Wing_Dihedral :2:2, ' Degrees  -  Suggested');
  76.       Writeln;                                                    LowVideo;
  77.       Write ('               Press any Key to continue');
  78.      Read ( Kbd, Ans );                                           NormVideo;
  79. End; (* of Procedure Display *)
  80.  
  81.  
  82. Procedure Display_Extras;  Begin (* Displays Fixed Tail Calculation Results *)
  83.        ClrScr; Writeln;                                          LowVideo;
  84.       Writeln ('       Fixed Calculation Results for the Tail');
  85.       Writeln;                                                   Normvideo;
  86.       Write ('Tail Fin & Rud. Root Chord        ');
  87.     If Metric = False  Then
  88.       Writeln ( FR :2:2, ' Inches')
  89.        Else
  90.       Writeln ( Fin_Root :3:2, ' CentiMeters');
  91.       Write (' Tail Fin & Rud. Tip Chord        ');
  92.     If Metric = False  Then
  93.       Writeln ( FT:2:2, ' Inches')
  94.        Else
  95.       Writeln ( ' ', Fin_Tip:3:2, ' CentiMeters');
  96.       Write ('  Tail Fin & Rudder Height        ');
  97.     If Metric = False  Then
  98.       Writeln ( HT :2:2, ' Inches')
  99.        Else
  100.       Writeln ( Fin_Height :3:2, ' CentiMeters');
  101.       Write ('   Tail Fin & Rudder Sweep        ');
  102.     If Metric = False  Then
  103.       Writeln ( FW :2:2, ' Inches')
  104.        Else
  105.       Writeln ( Fin_Sweep :3:2, ' CentiMeters');
  106.       Writeln
  107.   ('      Tail Fin Aspect Ratio       ', Fin_Ratio :5:2, '  * No Units *' );
  108.  
  109.       Write ('       Wing LE to Fin LE          ');
  110.     If Metric = False  Then
  111.       Writeln ( WF :2:2, ' Inches')
  112.        Else
  113.       Writeln ( Wing_Fin :3:2, ' CentiMeters');
  114.       Write ('     Fin Geo. Aero. Center        ');
  115.   If Metric = False  Then
  116.       Writeln ( FG :5:2, ' Inches')
  117.        Else
  118.       Writeln ( Fin_GAC :5:2, ' CentiMeters');
  119.       Write ('    Tail Fin & Rudder Area       ');
  120.   If Metric = False  Then
  121.       Writeln ( SV : 5:1, ' Square Inches')
  122.        Else
  123.       Writeln ( Fin_Area : 5:1, ' Square CentiMeters');
  124.      Result1 := (Wing_Span/2) / 2 * (Root_Chord+Tip_Chord); (* S1 *)
  125.      Result2 := 3 * (Wing_Span/2) * Result1 / 50 * F_Distance;
  126.       Writeln ('       Area Change Suggested      ',
  127.         (100*Result2/Fin_Area) :3:1, ' Percent ( % )  or ');
  128.       Write   ('        Suggested Fin Area       ');
  129.   If Metric = False  Then
  130.       Writeln (( SV * Result2/Fin_Area ) : 5:1, ' Square Inches')
  131.        Else
  132.       Writeln (( Result2 ) : 5:1, ' Square CentiMeters');
  133.       Writeln;
  134.       Write ('Horiz. Stabilizer Root            ');
  135.     If Metric = False  Then
  136.       Writeln ( SR :2:2, ' Inches')
  137.        Else
  138.       Writeln ( Stab_Root :3:2, ' CentiMeters');
  139.       Write (' Horiz. Stabilizer Tip            ');
  140.     If Metric = False  Then
  141.       Writeln ( ST :2:2, ' Inches')
  142.        Else
  143.       Writeln ( Stab_Tip :3:2, ' CentiMeters');
  144.       Write ('  Horiz. Stabilizer Sweep          ');
  145.     If Metric = False  Then
  146.       Writeln ( SW :2:2, ' Inches')
  147.        Else
  148.       Writeln ( Stab_Sweep :3:2, ' CentiMeters');
  149.       Write ('   Horiz. Stabilizer Span         ');
  150.     If Metric = False  Then
  151.       Writeln ( SS :2:2, ' Inches')
  152.        Else
  153.       Writeln ( Stab_Span :3:2, ' CentiMeters');
  154.       Write ('    Horiz. Stabilizer Area      ');
  155.     If Metric = False  Then
  156.       Writeln ( ' ', SA :5:1, ' Square Inches')
  157.        Else
  158.       Writeln ( ' ', Stab_Area :5:1, ' Square CentiMeters');
  159.       Write ('     Stab Geo. Aero. Center       ');
  160.     If Metric = False  Then
  161.       Writeln ( SG :5:2, ' Inches')
  162.        Else
  163.       Writeln ( Stab_GAC :5:2, ' CentiMeters');
  164.       Writeln
  165.  ('      Stabilizer Aspect Ratio     ', Stab_Ratio :5:2, '  * No Units *' );
  166.       Write ('      Wing LE to Horiz. Stab. LE  ');
  167.     If Metric = False  Then
  168.       Writeln ( WS :2:2, ' Inches')
  169.        Else
  170.       Writeln ( Wing_Stab :3:2, ' CentiMeters');
  171.       Writeln;                                                  LowVideo;
  172.       Write ('                 Press any Key to Continue  ');
  173.      Read ( Kbd, Ans );                                         NormVideo;
  174. End; (* of Procedure Display_Extras *)
  175.  
  176.  
  177. Procedure Change_Foil_Records;  Begin (* Changes Air Foil, sets R #'s, etc *)
  178.     ClrScr; (* Clears the Screen *)                             LowVideo;
  179.     Writeln
  180. (' You may chose an Air Foil Record from this list. .. One Moment Please ..');
  181.     Writeln
  182. ('  * indicates real ( wind tunnel ) data.  c  indicate calculated data.');
  183.     Writeln
  184. (' Enter the number of the Foil to be used. Return <CR> Selects E 387 Foil.');
  185.       X := 1;  Y := 5;  File_Pointer := 1;         (* Reset Counters *)
  186.       Assign ( Foil_File, 'AIRFOIL.DAT');      ReSet ( Foil_File );                                      NormVideo;
  187.    Repeat                                          (* Repeat Until Y > 19 *)
  188.      Repeat                                        (* Repeat Until X > 50 *)
  189.       If  Y > 19  Then  X := X + 25;
  190.       If  Y > 19  Then  Y := 5;
  191.      Seek ( Foil_File, File_Pointer - 1 );  Read ( Foil_File, Foil_Record );
  192.       With Foil_Record  Do      Foil_Name := Name;
  193.        GotoXY ( X, Y );
  194.    If File_Pointer < 10   Then  Write ( File_Pointer, '  ', Foil_Name )
  195.        Else  Write ( File_Pointer, '  ', Foil_Name );
  196.        Y := Y + 1;  File_Pointer := File_Pointer + 1; (* Increment Counters *)
  197.      Until X > 50;
  198.    Until Y > 19;    (* Now X > 50 and Y > 19, Out *)
  199.      Close ( Foil_File );
  200.       GotoXY ( 1, 22 );
  201.       Write ('Enter number of the Air Foil you wish work with  >  ');
  202.       Readln ( File_Pointer );
  203.      If File_Pointer in [ 2..Number_of_Records ] Then Else  File_Pointer := 1;
  204.       ClrScr; (* Clears Screen *)
  205.       GotoXY ( 1,15 );
  206.       Write ('Getting  Air Foil Information   ...   One Moment   ...');
  207.      Assign ( Foil_File, 'AIRFOIL.DAT');     ReSet ( Foil_File );
  208.      Seek ( Foil_File, File_Pointer - 1 );  Read ( Foil_File, Foil_Record );
  209.     With Foil_Record  Do  Begin
  210.       Foil_Name := Name;
  211.       Reynolds1 := R_Number1;     Reynolds2 := R_Number2;
  212.       Reynolds3 := R_Number3;     Reynolds4 := R_Number4;
  213.      For I := 1 to 64  Do  Begin
  214.       Foil1 [I] := Drag_Array1 [I];  Foil2 [I] := Drag_Array2 [I];
  215.       Foil3 [I] := Drag_Array3 [I];  Foil4 [I] := Drag_Array4 [I];
  216.      End; (* of For I to 64 *)
  217.     End; (* of With Foil_Record Do *)
  218.    Close ( Foil_File );
  219. End; (* of Procedure Change_Foil_Records *)
  220.  
  221.  
  222. Procedure Calculate_Display;  Begin (* Calculates & Displays Simulation *)
  223.       If Foil_Name = ''  Then  Change_Foil_Records;
  224.        ClrScr; (* Clears the Screen *)  GotoXY ( 10, 10 );
  225.        Write ('Calculating    .....    One Moment   ..... ');
  226.         I := 1; (* ReInit for ReCalculations *)
  227.         Result := Calc_CD;  (* Calls Function to fill arrays *)
  228.         Result3 := 1.0; Result4 := 0.0; Result5 := -0.1; Result6 := 0.01;
  229.         Lift_Coef := 0.0; X := 1; Y := 3; I := 1;
  230.        ClrScr; (* Clears the Screen *)                         LowVideo;
  231.        Write ('Foil = ');                                      NormVideo;
  232.        Write ( Foil_Name );  GotoXY ( 28, 1 );                 LowVideo;
  233.        Write ('R# =            V =');
  234.       If Metric = False  Then  Writeln ('       MPH          Feet/Sec')
  235.        Else  Writeln ('       KPH          Meters/Sec');
  236.        Write
  237. (' CL    VX    VY    L/D  |  CL    VX    VY    L/D  |  CL    VX    VY    L/D');
  238.         GotoXY ( 1, 24 );
  239.        Write (' <Cntl> S = Stop, any key to resume  ');
  240.         GotoXY ( 42, 24 );
  241.        Write ('Total Drag C.=    ');                             NormVideo;
  242.    Repeat                                          (* Repeat Until Y > 23 *)
  243.     Repeat                                        (* Repeat Until X > 52  *)
  244.       Profile_Drag_Coef := Foil [I];  (* Looks at Foil Array before Calc  *)
  245.       Result := Flight_Speed;         (* Call Functions to get Results    *)
  246.      If  Y > 23  Then  X := X + 26;
  247.      If  Y > 23  Then  Y := 3;
  248.      If  Metric = False  Then  Speed := Speed / 0.3048;
  249.      If  Metric = False  Then  Horiz_Speed := Horiz_Speed / 0.3048;
  250.      If  Metric = False  Then  Vert_Speed := Vert_Speed / 0.3048;
  251.       (* Conversion to British units *)  (* Following Display Results *)
  252.       GotoXY ( 34, 1 ); Write ( Reynolds :7:0 ); GotoXY ( 48, 1 );
  253.      If Metric = False  Then  Write ( Speed * ( 3600/5280 ) :3:1 )
  254.       Else  Write ( Speed * ( 3600/1000 ) :3:1 ); (* Writel MPH or KPH *)
  255.       GotoXY ( 60, 1 ); Write ( Speed :3:1 );
  256.      If ( Profile_Drag_Coef / Total_Drag_Coef ) < Result6  Then   LowVideo;
  257.       GotoXY ( X, Y ); Write ( Lift_Coef :2:2 );                  NormVideo;
  258.      If  Horiz_Speed >= Result3  Then                             LowVideo;
  259.       GotoXY ( X + 5, Y ); Write ( Horiz_Speed :2:2 );            NormVideo;
  260.      If  Vert_Speed >= Result4  Then                              LowVideo;
  261.       GotoXY ( X + 12, Y ); Write  ( Vert_Speed:2:2 );            NormVideo;
  262.      If  Glide_Ratio <= Result5  Then                             LowVideo;
  263.       GotoXY ( X + 18, Y ); Write ( Glide_Ratio:2:2 );            NormVideo;
  264.      If Glide_Ratio < ( Result5 / 1.25 )  Then
  265.       If ( Profile_Drag_Coef / Total_Drag_Coef ) > ( Result6 * 0.1 )  Then
  266.        If Lift_Coef > 0.5  Then  Stall := True;
  267.         If Stall = True  Then  Begin
  268.           GotoXY ( X, Y + 1 );
  269.           Write (' >      Stall      <');
  270.           GotoXY ( X, Y + 1 );                                  LowVideo;
  271.           Write (' >>               <<');                      NormVideo;
  272.           GotoXY ( X, Y + 1 );
  273.           Write (' >>>    Stall    <<<');
  274.           GotoXY ( X, Y + 1 );                                  LowVideo;
  275.           Write (' >>>>           <<<<');                      NormVideo;
  276.           GotoXY ( X, Y + 1 );
  277.           Write (' >>>>>  Stall  <<<<<');
  278.           GotoXY ( X, Y + 1 );                                  LowVideo;
  279.           Write (' >>>>>>       <<<<<<');                      NormVideo;
  280.           GotoXY ( X, Y + 1 );
  281.           Write (' >>>>>>>     <<<<<<<');
  282.           GotoXY ( X, Y + 1 );                                  LowVideo;
  283.           Write (' >>>>>>>>   <<<<<<<<');                      NormVideo;
  284.           GotoXY ( X, Y + 1 );
  285.           Write (' >>>>>>>>> <<<<<<<<<');
  286.           GotoXY ( X, Y + 1 );                                  LowVideo;
  287.           Write (' *******************');                      NormVideo;
  288.           GotoXY ( X, Y + 1 );
  289.           Write (' <<<<<<<<< >>>>>>>>>');
  290.           GotoXY ( X, Y + 1 );
  291.           Write (' <<<<<<<<   >>>>>>>>');
  292.           GotoXY ( X, Y + 1 );                                  LowVideo;
  293.           Write (' <<<<<<<     >>>>>>>');                      NormVideo;
  294.           GotoXY ( X, Y + 1 );
  295.           Write (' <<<<<<       >>>>>>');
  296.           GotoXY ( X, Y + 1 );
  297.           Write (' <<<<<  Stall  >>>>>');
  298.           GotoXY ( X, Y + 1 );                                  LowVideo;
  299.           Write (' <<<             >>>');                      NormVideo;
  300.           GotoXY ( X, Y + 1 );
  301.           Write (' <      Stall      >');
  302.           GotoXY ( X, Y + 1 );                                  LowVideo;
  303.           Write (' *******************');                      NormVideo;
  304.         End; (* of If Stall *)
  305.        GotoXY ( 54, 24 );  Write (' ', Total_Drag_Coef : 1:4 );
  306.        GotoXY ( 60, 24 );
  307.        Write
  308.        ('       ', ((Profile_Drag_Coef/Total_Drag_Coef)*100):2:1, ' %   ');
  309.     (* End of Display, Begin Save Results for Next Comparisons *)
  310.       Result3 := Horiz_Speed;  Result4 := Vert_Speed;
  311.       Result5 := Glide_Ratio;  Result6 := Profile_Drag_Coef / Total_Drag_Coef;
  312.       Lift_Coef := Lift_Coef + 0.020;       (* Increase CL for next Display *)
  313.       Y := Y + 1;  I := I + 1;              (* Increment Counters *)
  314.      Until X > 52;
  315.    Until Y > 23;              (* Now X > 52 and Y > 23, Out *)
  316.     GotoXY ( 1, 24 );
  317.     Write ('  Press any Key to continue          ');  Read ( Kbd, Ans );
  318.        Stall := False; (* turns off Stall Warning *)
  319. End; (* of Procedure Calculate *)
  320.  
  321.  
  322. Procedure Change_Units;  Begin
  323.      (* Changes Metric to British Units or Back to Metric and Temp/Press *)
  324.     ClrScr; (* Clears the Screen *)                                LowVideo;
  325.     GotoXY ( 1, 4 );                                               LowVideo;
  326.      Writeln ('   Entering a Return <CR> accepts initial value.');
  327.      Writeln;                                                      NormVideo;
  328.      Writeln ('    Enter your choice for Units of Measure');
  329.      Writeln ('     Enter "B" for British Inches and Pounds');
  330.      Writeln ('        or "M" for Metric CentiMeters and KiloGrams');
  331.      Writeln;                                                      LowVideo;
  332.     If  Metric = False  Then  Write ('         < British >  ')
  333.         Else   Write ('         < Metric >  ');                    NormVideo;
  334.      Read ( Kbd, Ans );
  335.     If UpCase ( Ans ) = 'B'  Then   Metric := False;
  336.     If UpCase ( Ans ) = 'M'  Then   Metric := True;
  337.     If Metric = True  Then  Writeln ('     >>  Changed to Metric Units  <<')
  338.        Else  Writeln ('     >>  Changed to British Units  <<');
  339.     Writeln;
  340.   (* Changes Temperature and Air Pressure *)
  341.     If  Metric = False  Then  Units := 'Degrees Fahrenheit, F.'
  342.        Else  Units := 'Degrees Centigrade, C.';
  343.      Writeln ('Enter Temperature in ', Units );
  344.      Write ('                 < ');                                LowVideo;
  345.     If  Metric = False  Then  Write ( T:3:1, ' ', Units )
  346.        Else  Write ( Temperature :3:1, ' ', Units );               NormVideo;
  347.      Write (' > ');
  348.     If  Metric = False  Then  Readln ( T )  Else  Readln ( Temperature );
  349.     If  Metric = False  Then  Temperature := ( 5 / 9 ) * ( T - 32.0 )
  350.        Else  T := (( 9 / 5 ) * Temperature ) + 32.0;
  351.      Writeln;
  352.   (*  Get  Air  Pressure  *)
  353.     If  Metric = False  Then  Units := 'Pounds per Square Foot'
  354.        Else  Units := 'KiloGrams per Square Meter';
  355.      Writeln ('Enter Air Pressure in ', Units );
  356.      Write ('                 < ');                                LowVideo;
  357.     If  Metric = False  Then  Write ( Pr :6:0, ' ', Units )
  358.        Else  Write ( Air_Press :6:0, ' ', Units );                 NormVideo;
  359.      Write (' > ');
  360.     If  Metric = False  Then  Readln ( Pr )  Else  Readln ( Air_Press );
  361.     If  Metric = False  Then  Air_Press := ( 10132.0 / 2116.0 ) * Pr
  362.        Else  Pr := ( 2116.0 / 10132.0 ) * Air_Press;
  363.      Writeln;
  364.  (*  Get  Flying  Weight  *)
  365.     If  Metric = False  Then  Units := 'Pounds'  Else  Units := 'KiloGrams';
  366.      Write ('Enter Flying Weight in ', Units,'  < ');              LowVideo;
  367.     If  Metric = False  Then  Write ( GM :2:2, ' ', Units )
  368.        Else  Write ( Weight :2:2, ' ', Units );                    NormVideo;
  369.      Write (' > ');
  370.     If  Metric = False  Then  Readln ( GM )  Else  Readln ( Weight );
  371.     If  Metric = False  Then  Weight := GM * 0.45359237
  372.        Else  GM := Weight / 0.45359237; (* Lbs to Kilos *)
  373.      Writeln;
  374.  (*  Get  Ballast  Weight  *)
  375.     If  Metric = False  Then  Units := 'Pounds'  Else  Units := 'KiloGrams';
  376.      Write ('Enter Ballast Weight ( if any ) in ', Units,'  < ');  LowVideo;
  377.     If  Metric = False  Then  Write ( BGM :2:2, ' ', Units )
  378.        Else  Write ( B_Weight :2:2, ' ', Units );                  NormVideo;
  379.      Write (' > ');
  380.     If  Metric = False  Then  Readln ( BGM )  Else  Readln ( B_Weight );
  381.     If  Metric = False  Then  B_Weight := BGM * 0.45359237
  382.        Else  BGM := B_Weight / 0.45359237; (* Lbs to Kilos *)
  383. End; (* of Procedure Units and Change_Temp_Press *)
  384.  
  385.  
  386. Procedure Change_Wing;  Begin     (* Changes Wing Dimensions *)
  387.     ClrScr; (* Clears Screen *)
  388.     GotoXY ( 1, 4 );                                               LowVideo;
  389.     Writeln ('    Entering a Return <CR> accepts initial value.');
  390.     Writeln;                                                       NormVideo;
  391.   (*  Get  Root  Chord  *)
  392.     If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  393.      Write ('Enter ROOT Wing Chord in ', Units, '  < ');           LowVideo;
  394.     If  Metric = False  Then  Write ( RC:5:2, ' ', Units )
  395.        Else  Write ( Root_Chord :5:2, ' ', Units );                NormVideo;
  396.      Write (' > ');
  397.     If  Metric = False  Then  Readln ( RC )  Else  Readln ( Root_Chord );
  398.     If  Metric = False  Then  Root_Chord := RC * 2.540
  399.        Else  RC := Root_Chord / 2.540;
  400.      Writeln;
  401.  (*  Get  Tip  Chord  *)
  402.     If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  403.      Write ('Enter TIP Wing Chord in ', Units, '  < ');             LowVideo;
  404.     If  Metric = False  Then  Write ( TC:5:2, ' ', Units )
  405.        Else  Write ( Tip_Chord :5:2, ' ', Units );                  NormVideo;
  406.      Write (' > ');
  407.     If  Metric = False  Then  Readln ( TC )  Else  Readln ( Tip_Chord );
  408.     If  Metric = False  Then  Tip_Chord := TC * 2.540
  409.        Else  TC := Tip_Chord / 2.540;
  410.       Writeln;
  411.   (* Lead in for Percent or Measurement of Foil Thickness *)
  412.      Writeln (' Change Foil Thickness by Measurement or Percentage ??');
  413.      Write ('    Enter "P" for Percentage, "M" for Measurement  >>');
  414.       Read ( Kbd, Ans );  Writeln;  Writeln;
  415.     If UpCase ( Ans ) = 'M'  Then   Begin
  416.  (*  Get  Root  Foil  Thickness  *)
  417.     If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  418.      Write ('Enter ROOT Foil Thickness in ', Units, '  < ');      LowVideo;
  419.     If  Metric = False  Then  Write ( RFT:5:2, ' ', Units )
  420.        Else  Write ( Root_Foil_Thickness :5:2, ' ', Units );      NormVideo;
  421.      Write (' > ');
  422.     If  Metric = False  Then  Readln ( RFT )
  423.        Else  Readln ( Root_Foil_Thickness );
  424.     If  Metric = False  Then  Root_Foil_Thickness := RFT * 2.540
  425.        Else  RFT := Root_Foil_Thickness / 2.540;
  426.      Writeln;
  427.  (*  Get  Tip  Foil  Thickness  *)
  428.    If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  429.      Write ('Enter TIP Foil Thickness in ', Units, '  < ');       LowVideo;
  430.     If  Metric = False  Then  Write ( TFT:5:2, ' ', Units )
  431.        Else  Write ( Tip_Foil_Thickness :5:2, ' ', Units );       NormVideo;
  432.      Write (' > ');
  433.     If  Metric = False  Then  Readln ( TFT )
  434.        Else  Readln ( Tip_Foil_Thickness );
  435.     If  Metric = False  Then  Tip_Foil_Thickness := TFT * 2.540
  436.        Else  TFT := Tip_Foil_Thickness / 2.540;
  437.      Writeln;
  438.       Percent_Thickness :=
  439. ((Root_Foil_Thickness/Root_Chord + Tip_Foil_Thickness/Tip_Chord)/2) * 100;
  440.          (*   PD = 100 * ( DMean / TMean )  yields %   *)
  441.   End; (* of answer is M for Measurement *)
  442.  (* Get Percentage of Foil_Thickness *)
  443.     If UpCase ( Ans ) = 'P'  Then  Begin
  444.      Write ('  Enter Percentage of Foil Thickness in Percent < '); LowVideo;
  445.      Write ( Percent_Thickness : 2:2 );                            NormVideo;
  446.      Write (' > ');   Readln ( Percent_Thickness );
  447.       Root_Foil_Thickness := ( Root_Chord * Percent_Thickness ) / 100.0;
  448.       RFT := Root_Foil_Thickness / 2.540;
  449.       Tip_Foil_Thickness := ( Tip_Chord * Percent_Thickness ) / 100.0;
  450.       TFT := Tip_Foil_Thickness / 2.540;
  451.      Writeln;
  452.     End; (* of Percentage Change *)
  453.  (*  Get  Wing  Span  *)
  454.     If  Metric = False  Then  Units := 'Inches'  Else  Units := 'METERS';
  455.      Write ('Enter Wing Span in ', Units, '  < ');                LowVideo;
  456.     If  Metric = False  Then  Write ( S :5:2, ' ', Units )
  457.        Else  Write ( Wing_Span :5:2, ' ', Units );                NormVideo;
  458.      Write (' > ');
  459.    If  Metric = False  Then  Readln ( S )  Else  Readln ( Wing_Span );
  460.    If  Metric = False  Then  Wing_Span := S * ( 0.9144 / 36 )
  461.       Else  S := Wing_Span * ( 36 / 0.9144 ); (* Meters to Inches *)
  462.     Writeln;
  463.  (*  Get  Wing Root to Tip Sweep  *)
  464.    If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  465.     Write ('Enter Wing Sweep ( Root to Tip ) in ', Units, '  < ');             LowVideo;
  466.    If  Metric = False  Then  Write ( WW:5:2, ' ', Units )
  467.       Else  Write ( Wing_Sweep :5:2, ' ', Units );               NormVideo;
  468.     Write (' > ');
  469.    If  Metric = False  Then  Readln ( WW )  Else  Readln ( Wing_Sweep );
  470.    If  Metric = False  Then  Wing_Sweep := WW * 2.540
  471.       Else  WW := Wing_Sweep / 2.540;
  472.     Writeln;
  473.  (*  Get  Wing  Mount  Type  *)
  474.     Writeln ('Enter Wing Type, M for Mid, S for Shoulder, H for High Mount');
  475.     Write  ('               < '); LowVideo;
  476.    If  Wing_Position = 'S'  Then  Write ('Shoulder Mount');
  477.    If  Wing_Position = 'H'  Then  Write ('High Mount');
  478.    If  Wing_Position = 'M'  Then  Write ('Mid Section Mount');     NormVideo;
  479.     Write (' > ');  Read ( Kbd, Ans );
  480.    If Upcase ( Ans ) = 'S'  Then  Wing_Position := Upcase (Ans);
  481.    If Upcase ( Ans ) = 'H'  Then  Wing_Position := Upcase (Ans);
  482.    If Upcase ( Ans ) = 'M'  Then  Wing_Position := Upcase (Ans);
  483. End; (* of Procedure Change_Wing *)
  484.  
  485.  
  486. Procedure Change_Stab;  Begin
  487.      ClrScr; (* Clears the Screen *)
  488.      GotoXY ( 1, 6 );                                             LowVideo;
  489.      Writeln ('    Entering a Return <CR> accepts initial value.');
  490.      Writeln;                                                     NormVideo;
  491.  (*  Get  Stab Span  *)
  492.     If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  493.      Write ('Enter Total Horiz. Stab Span in ', Units, '  < ');   LowVideo;
  494.     If  Metric = False  Then  Write ( SS :5:2, ' ', Units )
  495.        Else  Write ( Stab_Span :5:2, ' ', Units );                NormVideo;
  496.      Write (' > ');
  497.     If  Metric = False  Then  Readln ( SS )  Else  Readln ( Stab_Span );
  498.     If  Metric = False  Then  Stab_Span := SS * 2.540
  499.        Else  SS := Stab_Span / 2.540;
  500.      Writeln;
  501.  (*  Get  Stab Root Chord  *)
  502.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  503.  Write ('Enter Horiz. Stabilizer Root Chord in ', Units, '  < '); LowVideo;
  504.   If  Metric = False  Then  Write ( SR :5:2, ' ', Units )
  505.    Else  Write ( Stab_Root :5:2, ' ', Units );                    NormVideo;
  506.     Write (' > ');
  507.   If  Metric = False  Then  Readln ( SR )  Else  Readln ( Stab_Root );
  508.   If  Metric = False  Then  Stab_Root := SR * 2.540
  509.    Else  SR := Stab_Root / 2.540;
  510.     Writeln;
  511.  (*  Get  Stab Tip Chord  *)
  512.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  513.    Write ('Enter Horiz. Stabilizer Tip Chord in ', Units, '  < ');  LowVideo;
  514.   If  Metric = False  Then  Write ( ST :5:2, ' ', Units )
  515.      Else  Write ( Stab_Tip :5:2, ' ', Units );                     NormVideo;
  516.    Write (' > ');
  517.   If  Metric = False  Then  Readln ( ST )  Else  Readln ( Stab_Tip );
  518.   If  Metric = False  Then  Stab_Tip := ST * 2.540
  519.      Else  ST := Stab_Tip / 2.540;
  520.    Writeln;
  521.  (*  Get  Stab Sweep Back  *)
  522.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  523.    Write ('Enter Stab Sweep Back ( Root - Tip ) in ', Units, '  < '); LowVideo;
  524.   If  Metric = False  Then  Write ( SW :5:2, ' ', Units )
  525.      Else  Write ( Stab_Sweep :5:2, ' ', Units );                    NormVideo;
  526.    Write (' > ');
  527.   If  Metric = False  Then  Readln ( SW )  Else  Readln ( Stab_Sweep );
  528.   If  Metric = False  Then  Stab_Sweep := SW * 2.540
  529.      Else  SW := Stab_Sweep / 2.540;
  530.    Writeln;
  531.  (*  Get  Distance  from  Stab LE  to  Wing LE at Root Chords  *)
  532.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  533.    Writeln ('Enter Distance from Wing LE to Stabilizer LE at Roots ');
  534.    Write   ('  Wing LE to Stab LE in ', Units, '  < ');           LowVideo;
  535.   If  Metric = False  Then  Write ( WS :5:2, ' ', Units )
  536.      Else  Write ( Wing_Stab :5:2, ' ', Units );                     NormVideo;
  537.    Write (' > ');
  538.   If  Metric = False  Then  Readln ( WS )  Else  Readln ( Wing_Stab );
  539.   If  Metric = False  Then  Wing_Stab := WS * 2.540
  540.      Else  WS := Wing_Stab / 2.540;
  541. End; (* of Procedure Change_Stab *)
  542.  
  543.  
  544. Procedure Change_Fin;  Begin
  545.      ClrScr; (* Clears the Screen *)
  546.      GotoXY ( 1, 3 );                                              LowVideo;
  547.     Writeln ('    Entering a Return <CR> accepts initial value.');
  548.     Writeln;                                                       NormVideo;
  549.  (*  Get  Tail  Type,  T Tail  or  Standard  and  V Tail  *)
  550.     Writeln
  551.     (' Enter T for a T-Tail.   Enter S for Standard or V-Tail');
  552.     Write ('              < ');                                    LowVideo;
  553.   If  T_Tail = True  Then  Write ('T-Tail')
  554.      Else  Write ( 'Standard or V-Tail' );                        NormVideo;
  555.     Write (' > ');   Read ( Kbd, Ans ); Writeln; Writeln;
  556.   If  Upcase ( Ans ) = 'T'  Then  T_Tail := True;
  557.   If  Upcase ( Ans ) = 'S'  Then  T_Tail := False;
  558.   If  Upcase ( Ans ) = 'V'  Then  T_Tail := False;
  559.  (*  Get  Rudder Height  *)
  560.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  561.     Write ('Enter Fin and Rudder Height in ', Units, '  < ');     LowVideo;
  562.   If  Metric = False  Then  Write ( HT :5:2, ' ', Units )
  563.      Else  Write ( Fin_Height :5:2, ' ', Units );                   NormVideo;
  564.     Write (' > ');
  565.   If  Metric = False  Then  Readln ( HT )  Else  Readln ( Fin_Height );
  566.   If  Metric = False  Then  Fin_Height := HT * 2.540
  567.      Else  HT := Fin_Height / 2.540;
  568.     Writeln;
  569.  (*  Get  Rudder Root Chord  *)
  570.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  571.     Write ('Enter Fin and Rudder Root Chord in ', Units, '  < ');     LowVideo;
  572.   If  Metric = False  Then  Write ( FR :5:2, ' ', Units )
  573.      Else  Write ( Fin_Root :5:2, ' ', Units );                   NormVideo;
  574.     Write (' > ');
  575.   If  Metric = False  Then  Readln ( FR )  Else  Readln ( Fin_Root );
  576.   If  Metric = False  Then  Fin_Root := FR * 2.540
  577.      Else  FR := Fin_Root / 2.540;
  578.     Writeln;
  579.  (*  Get  Rudder Tip Chord  *)
  580.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  581.     Write ('Enter Fin and Rudder Tip Chord in ', Units, '  < ');     LowVideo;
  582.   If  Metric = False  Then  Write ( FT :5:2, ' ', Units )
  583.      Else  Write ( Fin_Tip :5:2, ' ', Units );                   NormVideo;
  584.     Write (' > ');
  585.   If  Metric = False  Then  Readln ( FT )  Else  Readln ( Fin_Tip );
  586.   If  Metric = False  Then  Fin_Tip := FT * 2.540
  587.      Else  FT := Fin_Tip / 2.540;
  588.     Writeln;
  589.  (*  Get  Rudder Sweep Back  *)
  590.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  591.     Write ('Enter Fin Sweep Back ( Root - Tip ) in ', Units, '  < '); LowVideo;
  592.   If  Metric = False  Then  Write ( FW :5:2, ' ', Units )
  593.      Else  Write ( Fin_Sweep :5:2, ' ', Units );                   NormVideo;
  594.     Write (' > ');
  595.   If  Metric = False  Then  Readln ( FW )  Else  Readln ( Fin_Sweep );
  596.   If  Metric = False  Then  Fin_Sweep := FW * 2.540
  597.      Else  FW := Fin_Sweep / 2.540;
  598.     Writeln;
  599.  (*  Get  Distance  from  Rudder LE  to  Wing LE at Root Chords  *)
  600.   If  Metric = False  Then  Units := 'Inches'  Else  Units := 'CentiMeters';
  601.     Writeln ('Enter Approximate Distance from Wing LE to Fin LE at Roots ');
  602.     Write   ('  Wing LE to Fin LE ', Units, '  < ');          LowVideo;
  603.   If  Metric = False  Then  Write ( WF :5:2, ' ', Units )
  604.      Else  Write ( Wing_Fin :5:2, ' ', Units );        NormVideo;
  605.     Write (' > ');
  606.   If  Metric = False  Then  Readln ( WF )  Else  Readln ( Wing_Fin );
  607.   If  Metric = False  Then  Wing_Fin := WF * 2.540
  608.      Else  WF := Wing_Fin / 2.540;
  609. End; (* of Procedure Change_Fin *)
  610.  
  611.  
  612. Procedure Edit_AirFoil;   Begin  (* This does the actual editing of the data *)
  613.      (* Below Changes Foil_Name and Reynolds Numbers *)
  614.    Change_Foil_Records;   ClrScr; (* Clears Screen *)
  615.      GotoXY ( 1, 10 );
  616.     Write ('     Current Air Foil Name is  < ');
  617.     Write ( Foil_Name );
  618.     Write (' >');
  619.      GotoXY ( 1, 12 );
  620.     Writeln ('       Enter new name. Use up to 20 charactures.');
  621.     Writeln;
  622.     Writeln ('         Just hit Return <CR> to keep the same name.');
  623.     Writeln;
  624.     Writeln ('              <                    >');
  625.      GotoXY ( 16, 16 );
  626.        Units := ''; (* Units used here for Foil name buffer *)
  627.      Readln ( Units ); (* Double reverse to make sure file_name is correct *)
  628.   If Units = ''  Then  Foil_Name := Foil_Name
  629.     Else  Foil_Name := Units;
  630.      ClrScr; (* Clears Screen *)
  631.      GotoXY ( 1, 10 );
  632.     Write ('     Current Air Foil Name is  < ');
  633.     Write ( Foil_Name );
  634.     Write (' >');
  635.      GotoXY ( 1, 12 );
  636.     Writeln ('       Enter new Reynolds Numbers. Use Numbers Only');
  637.     Writeln;
  638.     Writeln ('    Just hit Return <CR> to keep the same Reynolds Numbers.');
  639.     Writeln;                                                        LowVideo;
  640.     Writeln ('          ', Reynolds1 : 7:0, ' <                    >');
  641.     Writeln ('          ', Reynolds2 : 7:0, ' <                    >');
  642.     Writeln ('          ', Reynolds3 : 7:0, ' <                    >');
  643.     Writeln ('          ', Reynolds4 : 7:0, ' <                    >');
  644.      GotoXY ( 25, 16 );  NormVideo; Readln ( Reynolds1 );
  645.      GotoXY ( 25, 17 );  Readln ( Reynolds2 );
  646.      GotoXY ( 25, 18 );  Readln ( Reynolds3 );
  647.      GotoXY ( 25, 19 );  Readln ( Reynolds4 );
  648.         (* Displays foist Foil Information page, F Name, R1, Foil1, CD *)
  649.       I := 1;  X := 1;  Y := 3;  Lift_Coef := 0.000;      (* Reset Counters *)
  650.      ClrScr; (* Clears Screen *)                                  LowVideo;
  651.      Write ('Reynolds Number is ');                               NormVideo;
  652.      Write ( Reynolds1 :7:0 );      (* Reynolds from file *)      LowVideo;
  653.      Write ('                 ');
  654.      Write ('Foil Name is ');                                     NormVideo;
  655.      Writeln ( Foil_Name );         (* Name from File *)          LowVideo;
  656.      Writeln
  657.   (' CL    CD     new CD   |  CL    CD    new CD    |  CL    CD    new CD   ');
  658.     GotoXY ( 1, 24 );                                             NormVideo;
  659.     Write
  660.      ('Enter new CD,  <Return> keeps old CD the same,  CD > 1 ends entrys');
  661.    Repeat                                          (* Repeat Until Y > 23 *)
  662.      Repeat                                        (* Repeat Until X > 50 *)
  663.       If  Y > 23  Then  X := X + 25;  If  Y > 23  Then  Y := 3;
  664.        GotoXY ( X, Y );   Write ( Lift_Coef :2:2 );
  665.        GotoXY ( X + 6, Y );
  666.       If Foil1 [I] = 0.0  Then Write ( Foil1 [I] : 1:1 )
  667.          Else   Write  ( Foil1 [I] :1:4 );
  668.        Lift_Coef := Lift_Coef + 0.020; (* Increment CL for next Display *)
  669.        Y := Y + 1;     I := I + 1;               (* Increment Counter *)
  670.      Until X > 50;
  671.    Until Y > 23;    (* Now X > 50 and Y > 23, Out *)
  672.        I := 1;  X := 1;  Y := 3;     (* Reset Counters *)
  673.  (* Following Display is for Edit of CD vrs CL, Group 1 *)
  674.   Repeat                                                  (* Until CD > 1 *)
  675.    If  Y > 23  Then  X := X + 25;
  676.    If  Y > 23  Then  Y := 3; (* Double reverse keeps X & Y in line *)
  677.     GotoXY ( X + 14, Y );
  678.      Profile_Drag_Coef := Foil1 [I];
  679.     Readln ( Profile_Drag_Coef );
  680.      If Profile_Drag_Coef < 0.99999999  Then
  681.        If Profile_Drag_Coef <> Foil1 [I]  Then
  682.          Foil1 [I] := Profile_Drag_Coef;
  683.    (* Makes sure nothing unseemly gets into the array *)
  684.       Y := Y + 1; I := I + 1;    (* Increment Counters *)
  685.    If I > 63  Then  Profile_Drag_Coef := 1.01;
  686.   Until Profile_Drag_Coef > 0.9999;
  687.         (* Displays second Foil Information, F Name, R2, Foil2, CD *)
  688.       I := 1;  X := 1;  Y := 3;  Lift_Coef := 0.000; (* Reset Counters *)
  689.      ClrScr; (* Clears Screen *)                                  LowVideo;
  690.      Write ('Reynolds Number is ');                               NormVideo;
  691.      Write ( Reynolds2 :7:0 );      (* Reynolds from file *)      LowVideo;
  692.      Write ('                 ');
  693.      Write ('Foil Name is ');                                     NormVideo;
  694.      Writeln ( Foil_Name );         (* Name from File *)          LowVideo;
  695.      Writeln
  696.   (' CL    CD     new CD   |  CL    CD    new CD    |  CL    CD    new CD   ');
  697.       GotoXY ( 1, 24 );                                           NormVideo;
  698.      Write
  699.  ('Enter new CD,   <Return> keeps old CD the same,   CD > 1.00 ends entrys');
  700.    Repeat                                          (* Repeat Until Y > 23 *)
  701.      Repeat                                        (* Repeat Until X > 50 *)
  702.       If  Y > 23  Then  X := X + 25;   If  Y > 23  Then  Y := 3;
  703.        GotoXY ( X, Y );
  704.       Write ( Lift_Coef:2:2 );
  705.        GotoXY ( X + 6, Y );
  706.       If Foil2 [I] = 0.0  Then  Write ( Foil2 [I] : 1:1 )   Else
  707.       Write  ( Foil2 [I] :1:4 );
  708.        I := I + 1; Y := Y + 1; (* Increment Counter *)
  709.        Lift_Coef := Lift_Coef + 0.020;      (* Increase CL for next Display *)
  710.      Until X > 50;
  711.    Until Y > 23;    (* Now X > 50 and Y > 23, Out *)
  712.        I := 1; X := 1;  Y := 3;    (* Reset Counters *)
  713.  (* Following Display is for Edit of CD vrs CL, Group 2 *)
  714.   Repeat                                                  (* Until CD > 1 *)
  715.     If  Y > 23  Then  X := X + 25;
  716.     If  Y > 23  Then  Y := 3; (* Double reverse keeps X & Y in line *)
  717.      GotoXY ( X + 14, Y );
  718.      Profile_Drag_Coef := Foil2 [I];
  719.     Readln ( Profile_Drag_Coef );
  720.      If Profile_Drag_Coef < 0.99999999  Then
  721.        If Profile_Drag_Coef <> Foil2 [I]  Then
  722.          Foil2 [I] := Profile_Drag_Coef;
  723.        (* Makes sure nothing unseemly gets into the array *)
  724.       Y := Y + 1; I := I + 1;      (* Increment Counters *)
  725.      If I > 63  Then  Profile_Drag_Coef := 1.01;
  726.   Until Profile_Drag_Coef > 0.9999;
  727.  (* Displays third Foil Information, F Name, R3, Foil3, CD *)
  728.       I := 1; X := 1;  Y := 3;  Lift_Coef := 0.000; (* Reset Counters *)
  729.     ClrScr; (* Clears Screen *)                                  LowVideo;
  730.     Write ('Reynolds Number is ');                               NormVideo;
  731.     Write ( Reynolds3 :7:0 );      (* Reynolds from file *)      LowVideo;
  732.     Write ('                 ');
  733.     Write ('Foil Name is ');                                     NormVideo;
  734.     Writeln ( Foil_Name );         (* Name from File *)          LowVideo;
  735.     Writeln
  736.   (' CL    CD     new CD   |  CL    CD    new CD    |  CL    CD    new CD   ');
  737.     GotoXY ( 1, 24 );                                             NormVideo;
  738.     Write
  739.  ('Enter new CD,   <Return> keeps old CD the same,   CD > 1.00 ends entrys');
  740.    Repeat                                          (* Repeat Until Y > 23 *)
  741.      Repeat                                        (* Repeat Until X > 50 *)
  742.       If  Y > 23  Then  X := X + 25;   If  Y > 23  Then  Y := 3;
  743.        GotoXY ( X, Y );
  744.        Write ( Lift_Coef:2:2 );
  745.        GotoXY ( X + 6, Y );
  746.       If Foil3 [I] = 0.0  Then  Write ( Foil3 [I] : 1:1 )   Else
  747.        Write  ( Foil3 [I] :1:4 );
  748.         Lift_Coef := Lift_Coef + 0.020;      (* Increase CL for next Display *)
  749.         Y := Y + 1;   I := I + 1;            (* Increment Counter *)
  750.      Until X > 50;
  751.    Until Y > 23;    (* Now X > 50 and Y > 23, Out *)
  752.        I := 1; X := 1;  Y := 3;     (* Reset Counters *)
  753. (* Following Display is for Edit of CD vrs CL, Group 3 *)
  754.   Repeat                                                  (* Until CD > 1 *)
  755.    If  Y > 23  Then  X := X + 25;
  756.    If  Y > 23  Then  Y := 3; (* Double reverse keeps X & Y in line *)
  757.     GotoXY ( X + 14, Y );
  758.    Profile_Drag_Coef := Foil3 [I];
  759.     Readln ( Profile_Drag_Coef );
  760.      If Profile_Drag_Coef < 0.99999999  Then
  761.        If Profile_Drag_Coef <> Foil3 [I]  Then
  762.          Foil3 [I] := Profile_Drag_Coef;
  763.    (* Makes sure nothing unseemly gets into the array *)
  764.       Y := Y + 1; I := I + 1;                   (* Increment Counters *)
  765.     If I > 63  Then  Profile_Drag_Coef := 1.01;
  766.   Until Profile_Drag_Coef > 0.9999;
  767.  (* Displays 4th & last Foil Information, F Name, R4, Foil4, CD *)
  768.       I := 1; X := 1;  Y := 3;  Lift_Coef := 0.000; (* Reset Counters *)
  769.     ClrScr; (* Clears Screen *)                                  LowVideo;
  770.     Write ('Reynolds Number is ');                               NormVideo;
  771.     Write ( Reynolds4 :7:0 );      (* Reynolds from file *)      LowVideo;
  772.     Write ('                 ');
  773.     Write ('Foil Name is ');                                     NormVideo;
  774.     Writeln ( Foil_Name );         (* Name from File *)          LowVideo;
  775.     Writeln
  776.   (' CL    CD     new CD   |  CL    CD    new CD    |  CL    CD    new CD   ');
  777.     GotoXY ( 1, 24 );                                             NormVideo;
  778.     Write
  779.  ('Enter new CD,   <Return> keeps old CD the same,   CD > 1.00 ends entrys');
  780.    Repeat                                          (* Repeat Until Y > 23 *)
  781.      Repeat                                        (* Repeat Until X > 50 *)
  782.       If  Y > 23  Then  X := X + 25;   If  Y > 23  Then  Y := 3;
  783.        GotoXY ( X, Y );
  784.        Write ( Lift_Coef:2:2 );
  785.        GotoXY ( X + 6, Y );
  786.      If Foil4 [I] = 0.0  Then  Write ( Foil4 [I] : 1:1 )   Else
  787.        Write  ( Foil4 [I] :1:4 );
  788.        Lift_Coef := Lift_Coef + 0.020;      (* Increase CL for next Display *)
  789.        I := I + 1; Y := Y + 1;           (* Increment Counter *)
  790.      Until X > 50;
  791.    Until Y > 23;    (* Now X > 50 and Y > 23, Out *)
  792.        I := 1; X := 1;  Y := 3;     (* Reset Counters *)
  793.  (* Following Display is for Edit of CD vrs CL, Group 4 *)
  794.   Repeat                                                  (* Until CD > 1 *)
  795.    If  Y > 23  Then  X := X + 25;
  796.    If  Y > 23  Then  Y := 3; (* Double reverse keeps X & Y in line *)
  797.     GotoXY ( X + 14, Y );
  798.     Profile_Drag_Coef := Foil4 [I];
  799.     Readln ( Profile_Drag_Coef );
  800.    If Profile_Drag_Coef < 0.99999999  Then
  801.       If Profile_Drag_Coef <> Foil4 [I]  Then
  802.          Foil4 [I] := Profile_Drag_Coef;
  803.      (* Makes sure nothing unseemly gets into the array *)
  804.       Y := Y + 1; I := I + 1;                     (* Increment Counters *)
  805.    If I > 63  Then  Profile_Drag_Coef := 1.01;
  806.  Until Profile_Drag_Coef > 0.9999;
  807.    GotoXY ( 1, 24 );                                            LowVideo;
  808.    Write
  809.   (' >        SAVING this Air Foil data on the disk        <                ');
  810.    If File_Pointer in [ 2 .. Number_of_Records ]  Then  Begin
  811.         (* Allows the saving of any airfoil except #1, E 387 *)
  812.    Assign ( Foil_File, 'AIRFOIL.DAT');    ReSet ( Foil_File );
  813.     Seek ( Foil_File, File_Pointer - 1 );
  814.     With Foil_Record  Do  Begin
  815.       Name := Foil_Name;
  816.       R_Number1 := Reynolds1;
  817.       R_Number2 := Reynolds2;
  818.       R_Number3 := Reynolds3;
  819.       R_Number4 := Reynolds4;
  820.      For I := 1 to 64  Do  Begin
  821.       Drag_Array1 [I] := Foil1 [I];     Drag_Array2 [I] := Foil2 [I];
  822.       Drag_Array3 [I] := Foil3 [I];     Drag_Array4 [I] := Foil4 [I];
  823.      End; (* of For I to 64 *)
  824.       Rec_Number := File_Pointer; (* ?? I don't know, but it seems to help *)
  825.     End; (* of With Foil_Record Do *)
  826.      Seek ( Foil_File, File_Pointer - 1 );  Write ( Foil_File, Foil_Record );
  827.      Close ( Foil_File );
  828.   End; (* of If File_Pointer in Number_of_Records *)
  829. End; (* of Procedure Edit_Foil *)