{$R-} {Range checking off} {$B+} {Boolean complete evaluation on} {$S+} {Stack checking on} {$I+} {I/O checking on} {$N-} {No numeric coprocessor} {$M 65500,16384,655360} {Turbo 3 default stack and heap} PROGRAM DRAGFILE; {THIS PROGRAM PRETENDS TO PREDICT DRAG COEFFICIENT IN THE SAME WAY THE USAF PRETENDED TO PREDICT IT IN 1977: DATCOM THIS VERSION PUTS OUT A FILE WITH DRAG COEFFICIENTS FROM 0 (.0001) M/SEC TO 250 M/SEC. THIS FILE IS TO BE READ BY A RASP PROGRAM FOR VARIABLE Cd TRAJECTORY CALCULATIONS. } Uses Crt; {Unit found in TURBO.TPL} TYPE NAMETYPE=STRING[40]; CONST RCRIT1=5E5; NU:REAL=1.495E-5; DLUG1:REAL=0.4; MISSING:REAL=-9E9; XPOS:INTEGER=60; XPOS1:INTEGER=20; DRAGSIZE=250; CR=32; VAR IA12 :INTEGER; OUTFNAME :NAMETYPE; OUTFILE :TEXT; DLUG,VWORK,RCRIT,LTOT,LUGCON :REAL; A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A13 :REAL; Ax,RL_B,RL_F,WORK,V,DM,DM1,LN1,LT,DB,C,T,NUMFINS :REAL; ROOT,SPAN,B,L,CF_B,CB,C0_B,C0FB,CC_B,CF_F,LNDM,LB :REAL; SSSMNOSE,SSSMBODY,SSSMTAIL,SSSM,SF,SM,SFSM :REAL; CD0_FB,CDF_F,CDF_B,CDF_BL,CDF_BT :REAL; UTILCHAR,NOSE,LUGPOS :CHAR; NOSE1,LUGPOS1 :STRING[1]; FIRST,COLOR :BOOLEAN; IWORK :INTEGER; TITLE :NAMETYPE; {============================================================================} PROCEDURE GETVAL(VAR REALVAR:REAL;FRAC,POSX,POSY:INTEGER); VAR CODE:INTEGER; STRBUF:STRING[12]; REALBUF:REAL; BEGIN STR(REALVAR,STRBUF); REALBUF:=REALVAR; REPEAT GOTOXY(POSX,POSY); IF REALVAR<>MISSING THEN BEGIN WRITE(REALVAR:9:FRAC); GOTOXY(POSX,POSY); END; READLN(STRBUF); CODE:=0; IF ORD(STRBUF[1])<>CR THEN VAL(COPY(STRBUF,1,LENGTH(STRBUF)),REALBUF,CODE); IF((CODE<>0)OR(REALBUF=MISSING)OR(REALBUF<0))THEN BEGIN SOUND(440); DELAY(500); NOSOUND; END; UNTIL((CODE=0)AND(REALBUF<>MISSING)AND(REALBUF>=0)); REALVAR:=REALBUF; GOTOXY(POSX,POSY); WRITELN(REALVAR:9:FRAC); END; {============================================================================} PROCEDURE GETSTR(VAR STRVAR:NAMETYPE;POSX,POSY:INTEGER); {$V+} VAR STRBUF1:NAMETYPE; II:INTEGER; BEGIN REPEAT STRBUF1:=STRVAR; GOTOXY(POSX,POSY); IF STRVAR<>' ' THEN BEGIN WRITE(STRVAR:40); GOTOXY(POSX,POSY); END; READLN(STRBUF1); IF STRBUF1='' THEN STRBUF1:=STRVAR; IF((STRBUF1=' '))THEN BEGIN SOUND(440); DELAY(500); NOSOUND; END; UNTIL((STRBUF1<>' ')); STRVAR:=STRBUF1; GOTOXY(POSX,POSY); WRITE(' ':40); GOTOXY(POSX,POSY); II:=(80-LENGTH(STRVAR))DIV 2; WRITELN(' ':II-5,STRVAR:LENGTH(STRVAR)); END; {============================================================================} PROCEDURE MENU(VAR UTILCHAR:CHAR); BEGIN CLRSCR; GOTOXY(18,12); WRITE('PRESS ''Q'' TO QUIT OR ANYTHING ELSE TO REPEAT '); UTILCHAR:=READKEY; UTILCHAR:=UPCASE(UTILCHAR); END; {============================================================================} PROCEDURE SUMDRAG(VAR CD0_FB:REAL;CF_B,CF_F:REAL); VAR WORK,CDF_B,CDB,CD0_B,CD0_F:REAL; BEGIN WORK:=L/DM; CDF_B:=CF_B*(1.0+60.0/(SQR(WORK)*WORK)+0.0025*WORK)*SSSM; WORK:=DB/DM; CDB:=0.029*SQR(WORK)*WORK/SQRT(CDF_B); CD0_B:=CDF_B+CDB; CD0_F:=2*CF_F*(1.0+2.0*T/C); CD0_FB:=CD0_F*SFSM+CD0_B; END; {============================================================================} PROCEDURE INIT; BEGIN TITLE:=''; OUTFNAME:=''; NOSE:='O'; NOSE1:='O'; LUGPOS1:='B'; LUGPOS:='B'; A1:=MISSING; A2:=MISSING; A3:=MISSING; A4:=0; A5:=MISSING; A6:=MISSING; A7:=MISSING; A8:=MISSING; A9:=MISSING; A10:=MISSING; A13:=DLUG1; RCRIT:=RCRIT1; END; {============================================================================} PROCEDURE READIN; BEGIN CLRSCR; WRITE('TITLE'); GETSTR(TITLE,7,WHEREY); WRITELN; WRITE('OUTPUT FILE'); GETSTR(OUTFNAME,13,WHEREY); WRITELN; IF OUTFNAME='' THEN OUTFNAME:='NUL'; ASSIGN(OUTFILE,OUTFNAME); REWRITE(OUTFILE); WRITE('CRITICAL REYNOLDS NUMBER '); GETVAL(RCRIT,0,XPOS,WHEREY); WRITE('BODY TUBE DIAMETER IN CM'); GETVAL(A1,4,XPOS,WHEREY); DM:=A1; DM:=DM/100.0; DM1:=DM; WRITE('OVERALL LENGTH IN CM'); {READLN(LB);} GETVAL(A2,4,XPOS,WHEREY); LTOT:=A2/100.0; WRITE('LENGTH OF NOSE CONE IN CM'); {READLN(LN1);} GETVAL(A3,4,XPOS,WHEREY); LN1:=A3; LN1:=LN1/100.0; LB:=LTOT-LN1; WRITE('LENGTH OF BOAT TAIL IN CM'); {READLN(LT);} GETVAL(A4,4,XPOS,WHEREY); LT:=A4; LT:=LT/100.0; IF LT>0 THEN BEGIN WRITE('DIAMETER AT BASE IN CM'); GETVAL(A5,4,XPOS,WHEREY); DB:=A5; DB:=DB/100.0; END ELSE BEGIN A5:=MISSING; DB:=DM; END; WRITE('AVERAGE FIN CHORD IN CM'); {READLN(C);} GETVAL(A6,4,XPOS,WHEREY); C:=A6; C:=C/100.0; WRITE('VERTICLE FIN WIDTH IN CM'); {READLN(SPAN);} GETVAL(A7,4,XPOS,WHEREY); SPAN:=A7; SPAN:=SPAN/100.0; WRITE('ROOT CHORD IN CM'); {READLN(SF);} GETVAL(A8,4,XPOS,WHEREY); ROOT:=A8/100.0; SF:=ROOT*DM1*0.5 + SPAN*C; WRITE('MAXIMUM FIN THICKNESS IN CM'); {READLN(T);} GETVAL(A9,4,XPOS,WHEREY); T:=A9; T:=T/100.0; WRITE('NUMBER OF FINS '); {READLN(NUMFINS);} GETVAL(A10,4,XPOS,WHEREY); NUMFINS:=A10; WRITE('LAUNCH LUG DIAMETER IN CM'); GETVAL(A13,4,XPOS,WHEREY); DLUG:=A13; DLUG:=DLUG/100.0; IWORK:=WHEREY; FIRST:=TRUE; REPEAT IF NOT FIRST THEN BEGIN SOUND(440); DELAY(500); NOSOUND; END ELSE FIRST:=FALSE; GOTOXY(XPOS+3,IWORK); WRITE(' '); GOTOXY(1,IWORK); WRITE('LUG POSITION '); WRITE('B=BODY J=JOINT '); GOTOXY(XPOS+3,IWORK); WRITE(LUGPOS); GOTOXY(XPOS+3,IWORK); READLN(LUGPOS1); IF LUGPOS1<>'' THEN BEGIN LUGPOS:=LUGPOS1[1]; LUGPOS:=UPCASE(LUGPOS); END; UNTIL LUGPOS IN['B', 'J']; IF LUGPOS='B' THEN LUGCON :=5.75*SQR(DLUG/DM) ELSE LUGCON :=3.45*SQR(DLUG/DM); IWORK:=WHEREY; FIRST:=TRUE; REPEAT IF NOT FIRST THEN BEGIN SOUND(440); DELAY(500); NOSOUND; END ELSE FIRST:=FALSE; GOTOXY(XPOS+3,IWORK); WRITE(' '); GOTOXY(1,IWORK); WRITE('NOSE TYPE '); WRITE('O=OGIVE C=CONE E=ELLIPSE '); GOTOXY(XPOS+3,IWORK); WRITE(NOSE); GOTOXY(XPOS+3,IWORK); READLN(NOSE1); IF NOSE1<>'' THEN BEGIN NOSE:=NOSE1[1]; NOSE:=UPCASE(NOSE); END; UNTIL NOSE IN['O','C','E','0']; IF NOSE='0' THEN NOSE:='O'; END; {============================================================================} PROCEDURE GETCOLOR(VAR COLOR:BOOLEAN); VAR UTILCHAR:CHAR; BEGIN CLRSCR; REPEAT GOTOXY(15,10); WRITE ('IF YOU HAVE A COLOR MONITOR THEN ENTER C'); GOTOXY(15,12); WRITELN('IF YOU HAVE A MONOCHROME MONITOR ENTER M'); UTILCHAR:=READKEY; {READ(KBD,UTILCHAR);} UNTIL(UTILCHAR IN ['c','C','m','M']); IF (UPCASE(UTILCHAR)='C')THEN COLOR:=TRUE ELSE COLOR:=FALSE; END; {============================================================================} PROCEDURE GETCDF(VAR CDF,RL:REAL; LEN,RCRIT:REAL); VAR CDF_L,CDF_T:REAL; BEGIN RL:=VWORK*LEN/NU; CDF_L:=1.328/SQRT(RL); WORK:=LN(RL)*0.2; CDF_T:=0.074/EXP(WORK); IF RL0 THEN SSSMTAIL:=2.0*(DM1-DB)*LT*SQRT(1.0+SQR(DM1-DB)/(2.0*LT))/ SQR(DM1) ELSE SSSMTAIL:=0.0; L:=LB+LN1+LT; SSSM:=SSSMNOSE+SSSMBODY+SSSMTAIL; SFSM:=NUMFINS*SF/AX; GETCDF(CDF_F,RL_F,C,RCRIT); IF NOSE='C' THEN GETCDF(CDF_B,RL_B,L,0.0) ELSE GETCDF(CDF_B,RL_B,L,RCRIT); SUMDRAG(CD0_FB,CDF_B,CDF_F); WRITELN(OUTFILE,CD0_FB+LUGCON :7:4); END; {============================================================================} BEGIN INIT; GETCOLOR(COLOR); IF COLOR THEN BEGIN TEXTMODE(C80); TEXTCOLOR(WHITE); TEXTBACKGROUND(BLUE); END ELSE TEXTMODE(BW80); REPEAT CLRSCR; READIN; WRITELN(OUTFILE,TITLE); WRITELN(OUTFILE,RCRIT,' ',A1,' ',A2,' ',A3); WRITELN(OUTFILE,A4,' ',A5,' ',A6,' ',A7); WRITELN(OUTFILE,A8,' ',A9,' ',A10,' ',A13); WRITELN(OUTFILE,LUGPOS,' ',NOSE); FOR IA12:=0 TO DRAGSIZE DO BEGIN IF IA12>0 THEN VWORK:=IA12 ELSE VWORK:=0.001; EXEC; END; CLOSE(OUTFILE); {READ(KBD,UTILCHAR);} MENU(UTILCHAR); UNTIL UTILCHAR='Q'; TEXTMODE(CO80); CLRSCR; END.