home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / educatin / mdlplne2.lbr / FOIL22.PQS / FOIL22.PAS
Pascal/Delphi Source File  |  1986-08-09  |  16KB  |  512 lines

  1. PROGRAM Foil22;
  2.  
  3. {Foil22.pas version 2.2 14 July 1986 Curtis W. Givens, Dayton,Oh. Versions}
  4. {1.0 thru 1.4 not released. Version 1.5 released on CIS-ModelNet 11 Apr 86}
  5. {This program will accept up to 20 sets of user provided airfoil ordinates}
  6. {and output the calculated co-ordiantes to either}
  7. {the screen or the printer. It will allow the user to change the chord without}
  8. {re-entering the ordinates for the current airfoil. Writen with Turbo 2.0 and}
  9. {tested under CPM 2.2. Further developments anticipated as time permitts.}
  10. {The intent of this release is to allow the program to save the input data}
  11. {to disk in order to eliminate the necessity of entering the ordinates each time}
  12. {you wish to do calculations on a given airfoil. In the author's experience}
  13. {this is the area with the greatest potential for error. A procedure has also}
  14. {been added to take into account those airfoils that have their leading edge,}
  15. {LE,and/or trailing edge,TE, specified as some percentage of the chord.}
  16. {Suggestion, problems etc should be addressed}
  17. {to the author on CIS ppn 75136,2356,or GEnie mail:Balsadust}
  18.  
  19. VAR
  20.    Chord: Real;
  21.    O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12, O13, O14,
  22.    O15, O16, O17, O18, O19, O20:Real;{offset from leading edge}
  23.    U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12, U13, U14,
  24.    U15, U16, U17, U18, U19, U20:Real;{points above the chord line}
  25.    L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14,
  26.    L15, L16, L17, L18, L19, L20:Real;{points below the Chord line}
  27.    LE:Real;{value for leading edge radius calculations}
  28.    TE:Real;{value for trailing edge radius calculations}
  29.    AirfoilName:String[8];
  30.    LeadingEdge : Boolean;
  31.    TrailingEdge : Boolean;
  32.  
  33. PROCEDURE GetName;
  34. BEGIN
  35.      WRITELN('This program will calculate airfoil plotting coordinates from user provide ordinate data.');
  36.      WRITELN;
  37.      WRITELN('Please input the airfoil name - no more than 8 characters');
  38.      READLN(AirfoilName);
  39.      WRITELN('The airfoil name is ',AirfoilName); {Allows user to check input}
  40. END; {GetName}
  41.  
  42. PROCEDURE AreEdgesSpecified;
  43. {This procedure properly sets the LeadingEdge and TrailingEdge variables}
  44. {for the procedures that follow.}
  45.  
  46. VAR
  47. AnswerLE : integer;
  48. AnswerTE : integer;
  49.  
  50. Begin
  51.      WRITELN('Some airfoils have the Leading Edge radius expressed as');
  52.      WRITELN('a precentage of the chord. If your airfoil is one of these');
  53.      WRITELN('input a 1 otherwise please input a 2.');
  54.      READLN(AnswerLE);
  55.      IF AnswerLE = 1 THEN LeadingEdge:=True
  56.      ELSE LeadingEdge:=False;
  57.      WRITELN('Some airfoils have the trailing edge radius expressed as a');
  58.      WRITELN('percentage of the chord. If your airfoil has this feature enter');
  59.      WRITELN('a 1 otherwise please enter a 2.');
  60.      READLN(AnswerTE);
  61.      IF AnswerTE = 1 THEN TrailingEdge:=True
  62.      ELSE TrailingEdge:=False;
  63. END;
  64.  
  65.  
  66. PROCEDURE GetChord;
  67. BEGIN
  68.      WRITELN('Please input the chord - decimal fractions only');
  69.      READLN(Chord);
  70.      WRITELN('The chord is',Chord:7:3); {Allow user to check input}
  71. END; {GetChord}
  72.  
  73. PROCEDURE GetOrdinates;
  74. BEGIN
  75.      WRITELN('Please input the data from the airfoil ordinate table');
  76.      WRITELN('as follows: Offset Upper Lower. Convert percentages to decimal');
  77.      WRITELN('fractions i.e., 3.5% should be entered as .035. Example - the first');
  78.      WRITELN('set of entries for a Clark - Y would be 0 .035 .035 <cr>.');
  79.      WRITELN('Note do not insert commas between entries');
  80.      WRITELN('Input 0.0 where the ordinate table lacks entries.Program will');
  81.      WRITELN('allow up to 20 sets of data.');
  82.      WRITELN('Input first set.');
  83.      READLN(O1, U1, L1);
  84.      WRITELN('Input second set');
  85.      READLN(O2, U2, L2);
  86.      WRITELN('Input third set');
  87.      READLN(O3, U3, L3);
  88.      WRITELN('Input 4th set');
  89.      READLN(O4, U4, L4);
  90.      WRITELN('Input 5th set');
  91.      READLN(O5, U5, L5);
  92.      WRITELN('Input 6th set');
  93.      READLN(O6, U6, L6);
  94.      WRITELN('Input 7th set');
  95.      READLN(O7, U7, L7);
  96.      WRITELN('Input 8th set');
  97.      READLN(O8, U8, L8);
  98.      WRITELN('Input 9th set');
  99.      READLN(O9, U9, L9);
  100.      WRITELN('Input 10th set');
  101.      READLN(O10, U10, L10);
  102.      WRITELN('Input 11th set');
  103.      READLN(O11, U11, L11);
  104.      WRITELN('Input 12th set');
  105.      READLN(O12, U12, L12);
  106.      WRITELN('Input 13th set');
  107.      READLN(O13, U13, L13);
  108.      WRITELN('Input 14th set');
  109.      READLN(O14, U14, L14);
  110.      WRITELN('Input 15th set');
  111.      READLN(O15, U15, L15);
  112.      WRITELN('Input 16th set');
  113.      READLN(O16, U16, L16);
  114.      WRITELN('Input 17th set');
  115.      READLN(O17, U17, L17);
  116.      WRITELN('Input 18th set');
  117.      READLN(O18, U18, L18);
  118.      WRITELN('Input 19th set');
  119.      READLN(O19, U19, L19);
  120.      WRITELN('Input 20th set');
  121.      READLN(O20, U20, L20);
  122.           IF LeadingEdge THEN
  123.           BEGIN
  124.           WRITELN('Input the percentage for LE radius as a decimal fraction');
  125.           READLN(LE);
  126.           IF TrailingEdge THEN
  127.           BEGIN
  128.           WRITELN('Input the Trailing Edge percentage as a decimal fraction.');
  129.           READLN(TE);
  130.           END;
  131.           END;
  132. END;{GetOrdinates}
  133.  
  134.  
  135. PROCEDURE SaveOrd;
  136.  
  137. VAR
  138. Answer: Integer;
  139. FileName: String[12];
  140. OrdFile: text;
  141. Disk: Boolean;
  142.  
  143. BEGIN
  144.      WRITELN('Do you want to save these ordinates to a disk file?');
  145.      WRITELN('Yes = 1 No = 2');
  146.      READLN(Answer);
  147.      IF Answer=1 THEN Disk:=True
  148.      ELSE Disk:=False;
  149.      IF Disk THEN
  150.      BEGIN
  151.           WRITELN('Please input the name for this disk file.');
  152.           WRITELN('In CPM suggested form is  "airfoilname.ord"');
  153.           READLN(FileName);
  154.           ASSIGN(OrdFile,FileName);
  155.           REWRITE(OrdFIle);
  156.           WRITELN(OrdFile,O1,U1,L1);
  157.           WRITELN(OrdFile,O2,U2,L2);
  158.           WRITELN(OrdFile,O3,U3,L3);
  159.           WRITELN(OrdFile,O4,U4,L4);
  160.           WRITELN(OrdFile,O5,U5,L4);
  161.           WRITELN(OrdFile,O6,U6,L6);
  162.           WRITELN(OrdFile,O7,U7,L7);
  163.           WRITELN(OrdFile,O8,U8,L8);
  164.           WRITELN(OrdFile,O9,U9,L9);
  165.           WRITELN(OrdFile,O10,U10,L10);
  166.           WRITELN(OrdFile,O11,U11,L11);
  167.           WRITELN(OrdFile,O12,U12,L12);
  168.           WRITELN(OrdFile,O13,U13,L13);
  169.           WRITELN(OrdFile,O14,U14,L14);
  170.           WRITELN(OrdFile,O15,U15,L15);
  171.           WRITELN(OrdFile,O16,U16,L16);
  172.           WRITELN(OrdFile,O17,U17,L17);
  173.           WRITELN(OrdFile,O18,U18,L18);
  174.           WRITELN(OrdFile,O19,U19,L19);
  175.           WRITELN(OrdFile,O20,U20,L20);
  176.              IF LeadingEdge THEN
  177.              WRITELN(OrdFile,LE);
  178.              IF TrailingEdge THEN
  179.              WRITELN(OrdFile,TE);
  180.           CLOSE(OrdFile);
  181.       END;
  182. END;
  183.  
  184. PROCEDURE OutputResults;
  185.  
  186. BEGIN
  187. CLRSCR;
  188. WRITELN('Plotting dimensions for ',AirfoilName,' with chord = ',Chord:7:3);
  189. WRITELN;
  190. WRITELN('STATION       OFFSET       UPPER       LOWER');
  191. WRITELN('============================================');
  192. WRITELN;
  193. WRITE(O1*100:6:2,'       ');
  194. WRITE(O1*Chord:7:3,'       ');
  195. WRITE(U1*Chord:7:3,'       ');
  196. WRITELN(L1*Chord:7:3);
  197. WRITE(O2*100:6:2,'       ');
  198. WRITE(O2*Chord:7:3,'       ');
  199. WRITE(U2*Chord:7:3,'       ');
  200. WRITELN(L2*Chord:7:3);
  201. WRITE(O3*100:6:2,'       ');
  202. WRITE(O3*Chord:7:3,'       ');
  203. WRITE(U3*Chord:7:3,'       ');
  204. WRITELN(L3*Chord:7:3);
  205. WRITE(O4*100:6:2,'       ');
  206. WRITE(O4*Chord:7:3,'       ');
  207. WRITE(U4*Chord:7:3,'       ');
  208. WRITELN(L4*Chord:7:3);
  209. WRITE(O5*100:6:2,'       ');
  210. WRITE(O5*Chord:7:3,'       ');
  211. WRITE(U5*Chord:7:3,'       ');
  212. WRITELN(L5*Chord:7:3);
  213. WRITE(O6*100:6:2,'       ');
  214. WRITE(O6*Chord:7:3,'       ');
  215. WRITE(U6*Chord:7:3,'       ');
  216. WRITELN(L6*Chord:7:3);
  217. WRITE(O7*100:6:2,'       ');
  218. WRITE(O7*Chord:7:3,'       ');
  219. WRITE(U7*Chord:7:3,'       ');
  220. WRITELN(L7*Chord:7:3);
  221. WRITE(O8*100:6:2,'       ');
  222. WRITE(O8*Chord:7:3,'       ');
  223. WRITE(U8*Chord:7:3,'       ');
  224. WRITELN(L8*Chord:7:3);
  225. WRITE(O9*100:6:2,'       ');
  226. WRITE(O9*Chord:7:3,'       ');
  227. WRITE(U9*Chord:7:3,'       ');
  228. WRITELN(L9*Chord:7:3);
  229. WRITE(O10*100:6:2,'       ');
  230. WRITE(O10*Chord:7:3,'       ');
  231. WRITE(U10*Chord:7:3,'       ');
  232. WRITELN(L10*Chord:7:3);
  233. WRITE(O11*100:6:2,'       ');
  234. WRITE(O11*Chord:7:3,'       ');
  235. WRITE(U11*Chord:7:3,'       ');
  236. WRITELN(L11*Chord:7:3);
  237. WRITE(O12*100:6:2,'       ');
  238. WRITE(O12*Chord:7:3,'       ');
  239. WRITE(U12*Chord:7:3,'       ');
  240. WRITELN(L12*Chord:7:3);
  241. WRITE(O13*100:6:2,'       ');
  242. WRITE(O13*Chord:7:3,'       ');
  243. WRITE(U13*Chord:7:3,'       ');
  244. WRITELN(L13*Chord:7:3);
  245. WRITE(O14*100:6:2,'       ');
  246. WRITE(O14*Chord:7:3,'       ');
  247. WRITE(U14*Chord:7:3,'       ');
  248. WRITELN(L14*Chord:7:3);
  249. WRITE(O15*100:6:2,'       ');
  250. WRITE(O15*Chord:7:3,'       ');
  251. WRITE(U15*Chord:7:3,'       ');
  252. WRITELN(L15*Chord:7:3);
  253. WRITE(O16*100:6:2,'       ');
  254. WRITE(O16*Chord:7:3,'       ');
  255. WRITE(U16*Chord:7:3,'       ');
  256. WRITELN(L16*Chord:7:3);
  257. WRITE(O17*100:6:2,'       ');
  258. WRITE(O17*Chord:7:3,'       ');
  259. WRITE(U17*Chord:7:3,'       ');
  260. WRITELN(L17*Chord:7:3);
  261. WRITE(O18*100:6:2,'        ');
  262. WRITE(O18*Chord:7:3,'       ');
  263. WRITE(U18*Chord:7:3,'       ');
  264. WRITELN(L18*Chord:7:3);
  265. WRITE(O19*100:6:2,'        ');
  266. WRITE(O19*Chord:7:3,'       ');
  267. WRITE(U19*Chord:7:3,'       ');
  268. WRITELN(L19*Chord:7:3);
  269. WRITE(O20*100:6:2,'        ');
  270. WRITE(O20*Chord:7:3,'       ');
  271. WRITE(U20*Chord:7:3,'       ');
  272. WRITELN(L20*Chord:7:3);
  273.     IF LeadingEdge THEN
  274.     WRITELN('Leading Edge Radius is', LE*Chord:7:3);
  275.     IF TrailingEdge THEN
  276.     WRITELN('Trailing Edge Radius is', TE*Chord:7:3);
  277. END;{procedure OutPutResults}
  278.  
  279. PROCEDURE PrintCopy;
  280. VAR
  281.    Answer : Integer;
  282.    HardCopy: Boolean;
  283.  
  284. BEGIN
  285. WRITELN('Do you want a hard copy? yes = 1, no = 2');
  286. READLN(Answer);
  287. IF Answer = 1 THEN HardCopy:=True
  288. ELSE HardCopy:=False;
  289. IF HardCopy THEN
  290. BEGIN
  291. WRITELN(LST,'Plotting dimensions for ',AirfoilName,' with chord = ',Chord:7:3);
  292. WRITELN(LST);
  293. WRITELN(LST,'STATION        OFFSET         UPPER        LOWER');
  294. WRITELN(LST,'================================================');
  295. WRITE(LST,O1*100:6:2,'       ');
  296. WRITE(LST,O1*Chord:7:3,'       ');
  297. WRITE(LST,U1*Chord:7:3,'       ');
  298. WRITELN(LST,L1*Chord:7:3);
  299. WRITE(LST,O2*100:6:2,'       ');
  300. WRITE(LST,O2*Chord:7:3,'       ');
  301. WRITE(LST,U2*Chord:7:3,'       ');
  302. WRITELN(LST,L2*Chord:7:3);
  303. WRITE(LST,O3*100:6:2,'       ');
  304. WRITE(LST,O3*Chord:7:3,'       ');
  305. WRITE(LST,U3*Chord:7:3,'       ');
  306. WRITELN(LST,L3*Chord:7:3);
  307. WRITE(LST,O4*100:6:2,'       ');
  308. WRITE(LST,O4*Chord:7:3,'       ');
  309. WRITE(LST,U4*Chord:7:3,'       ');
  310. WRITELN(LST,L4*Chord:7:3);
  311. WRITE(LST,O5*100:6:2,'       ');
  312. WRITE(LST,O5*Chord:7:3,'       ');
  313. WRITE(LST,U5*Chord:7:3,'       ');
  314. WRITELN(LST,L5*Chord:7:3);
  315. WRITE(LST,O6*100:6:2,'       ');
  316. WRITE(LST,O6*Chord:7:3,'       ');
  317. WRITE(LST,U6*Chord:7:3,'       ');
  318. WRITELN(LST,L6*Chord:7:3);
  319. WRITE(LST,O7*100:6:2,'       ');
  320. WRITE(LST,O7*Chord:7:3,'       ');
  321. WRITE(LST,U7*Chord:7:3,'       ');
  322. WRITELN(LST,L7*Chord:7:3);
  323. WRITE(LST,O8*100:6:2,'       ');
  324. WRITE(LST,O8*Chord:7:3,'       ');
  325. WRITE(LST,U8*Chord:7:3,'       ');
  326. WRITELN(LST,L8*Chord:7:3);
  327. WRITE(LST,O9*100:6:2,'       ');
  328. WRITE(LST,O9*Chord:7:3,'       ');
  329. WRITE(LST,U9*Chord:7:3,'       ');
  330. WRITELN(LST,L9*Chord:7:3);
  331. WRITE(LST,O10*100:6:2,'       ');
  332. WRITE(LST,O10*Chord:7:3,'       ');
  333. WRITE(LST,U10*Chord:7:3,'       ');
  334. WRITELN(LST,L10*Chord:7:3);
  335. WRITE(LST,O11*100:6:2,'       ');
  336. WRITE(LST,O11*Chord:7:3,'       ');
  337. WRITE(LST,U11*Chord:7:3,'       ');
  338. WRITELN(LST,L11*Chord:7:3);
  339. WRITE(LST,O12*100:6:2,'       ');
  340. WRITE(LST,O12*Chord:7:3,'       ');
  341. WRITE(LST,U12*Chord:7:3,'       ');
  342. WRITELN(LST,L12*Chord:7:3);
  343. WRITE(LST,O13*100:6:2,'       ');
  344. WRITE(LST,O13*Chord:7:3,'       ');
  345. WRITE(LST,U13*Chord:7:3,'       ');
  346. WRITELN(LST,L13*Chord:7:3);
  347. WRITE(LST,O14*100:6:2,'       ');
  348. WRITE(LST,O14*Chord:7:3,'       ');
  349. WRITE(LST,U14*Chord:7:3,'       ');
  350. WRITELN(LST,L14*Chord:7:3);
  351. WRITE(LST,O15*100:6:2,'       ');
  352. WRITE(LST,O15*Chord:7:3,'       ');
  353. WRITE(LST,U15*Chord:7:3,'       ');
  354. WRITELN(LST,L15*Chord:7:3);
  355. WRITE(LST,O16*100:6:2,'       ');
  356. WRITE(LST,O16*Chord:7:3,'       ');
  357. WRITE(LST,U16*Chord:7:3,'       ');
  358. WRITELN(LST,L16*Chord:7:3);
  359. WRITE(LST,O17*100:6:2,'       ');
  360. WRITE(LST,O17*Chord:7:3,'       ');
  361. WRITE(LST,U17*Chord:7:3,'       ');
  362. WRITELN(LST,L17*Chord:7:3);
  363. WRITE(LST,O18*100:6:2,'       ');
  364. WRITE(LST,O18*Chord:7:3,'       ');
  365. WRITE(LST,U18*Chord:7:3,'       ');
  366. WRITELN(LST,L18*Chord:7:3);
  367. WRITE(LST,O19*100:6:2,'       ');
  368. WRITE(LST,O19*Chord:7:3,'       ');
  369. WRITE(LST,U19*Chord:7:3,'       ');
  370. WRITELN(LST,L19*Chord:7:3);
  371. WRITE(LST,O20*100:6:2,'       ');
  372. WRITE(LST,O20*Chord:7:3,'       ');
  373. WRITE(LST,U20*Chord:7:3,'       ');
  374. WRITELN(LST,L20*Chord:7:3);
  375. WRITELN;
  376.      IF LeadingEdge THEN
  377.      WRITELN(LST,'Leading Edge Radius is', LE*Chord:7:3);
  378.      WRITELN;
  379.      IF TrailingEdge THEN
  380.      WRITELN(LST,'Trailing Edge Raius is', TE*Chord:7:3);
  381.      WRITELN;
  382. END;
  383. END;
  384.  
  385. PROCEDURE ChangeChord;
  386. VAR
  387.    Answer : Integer;
  388.    NewChord: Boolean;
  389. BEGIN
  390. WRITELN('Do you wish to do the same airfoil with a different');
  391. WRITELN('chord? yes = 1, no = 2');
  392. READLN(Answer);
  393. IF answer = 1 THEN NewChord:=True
  394. ELSE NewChord:=False;
  395. IF NewChord THEN
  396. BEGIN
  397. WRITELN('Input new chord');
  398. READLN(Chord);
  399. OutputResults;
  400. PrintCopy;
  401. ChangeChord;
  402. END;
  403. END;
  404.  
  405. PROCEDURE GetDisk;
  406.  
  407. VAR
  408.    FileName : String[14];
  409.    InFile : text;
  410.  
  411. BEGIN
  412.      WRITELN('Please input the name of the file you wish to have read.');
  413.      READLN(FileName);
  414.      ASSIGN(InFile,FileName);
  415.      RESET(InFile);
  416.      READLN(InFile,O1, U1, L1);
  417.      READLN(InFile,O2, U2, L2);
  418.      READLN(InFile,O3, U3, L3);
  419.      READLN(InFile,O4, U4, L4);
  420.      READLN(InFile,O5, U5, L5);
  421.      READLN(InFile,O6, U6, L6);
  422.      READLN(InFile,O7, U7, L7);
  423.      READLN(InFile,O8, U8, L8);
  424.      READLN(InFile,O9, U9, L9);
  425.      READLN(InFile,O10, U10, L10);
  426.      READLN(InFile,O11, U11, L11);
  427.      READLN(InFile,O12, U12, L12);
  428.      READLN(InFile,O13, U13, L13);
  429.      READLN(InFile,O14, U14, L14);
  430.      READLN(InFile,O15, U15, L15);
  431.      READLN(InFile,O16, U16, L16);
  432.      READLN(InFile,O17, U17, L17);
  433.      READLN(InFile,O18, U18, L18);
  434.      READLN(InFile,O19, U19, L19);
  435.      READLN(InFile,O20, U20, L20);
  436.           IF LeadingEdge THEN
  437.           BEGIN
  438.           READLN(InFile,LE);
  439.           IF TrailingEdge THEN
  440.           BEGIN
  441.           READLN(InFile,TE);
  442.           CLOSE(InFile);
  443.           END;
  444.           END;
  445. END;{GetDisk}
  446.  
  447.  
  448. PROCEDURE A;
  449.  
  450. BEGIN
  451.      GetOrdinates;
  452.      OutPutResults;
  453.      SaveOrd;
  454.      PrintCopy;
  455.      ChangeChord;
  456. END;
  457.  
  458. PROCEDURE B;
  459.  
  460. BEGIN
  461.      GetDisk;
  462.      OutPutResults;
  463.      PrintCopy;
  464.      ChangeChord;
  465. END;
  466.  
  467. PROCEDURE InputSource;
  468.  
  469. VAR
  470.   Answer: Integer;
  471.   Choice: Boolean;
  472.  
  473. BEGIN
  474.      WRITELN('Will the data for this run be entered from the keyboard = 1');
  475.      WRITELN('or from a disk file = 2 ?');
  476.      READLN(Answer);
  477.      IF Answer = 1 THEN Choice:=True
  478.      ELSE Choice:=False;
  479.      IF Choice THEN A
  480.      ELSE B
  481. END;{InputSource}
  482.  
  483. PROCEDURE DiffRun;
  484.  
  485. VAR
  486.   Answer : Integer;
  487.   NewRun: Boolean;
  488.  
  489. BEGIN
  490.      WRITELN('Do you want to do another run with a different');
  491.      WRITELN('airfoil? yes = 1, no = 2');
  492.      READLN(Answer);
  493.      IF Answer = 1 THEN NewRun:=True
  494.      ELSE NewRun:=False;
  495.      IF NewRun THEN
  496.      BEGIN
  497.      GetName;
  498.      AreEdgesSpecified;
  499.      GetChord;
  500.      InputSource;
  501.      DiffRun;
  502.      END;
  503. END;
  504.  
  505.  
  506. BEGIN
  507.      GetName;
  508.      AreEdgesSpecified;
  509.      GetChord;
  510.      InputSource;
  511.      DiffRun;
  512. END.