{$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 RL<RCRIT THEN CDF:=CDF_L
ELSE IF RCRIT=0 THEN CDF:=CDF_T
ELSE
BEGIN
  B:=RCRIT*(CDF_T-CDF_L);
  CDF:=CDF_T-B/(RL);
END;
END;
{============================================================================}
PROCEDURE EXEC;

BEGIN


AX:=3.14159*DM*DM/4.0;

LNDM:=LN1/DM;
IF NOSE='O' THEN SSSMNOSE:=2.67*LNDM
ELSE IF NOSE='C' THEN  SSSMNOSE := 2.0*SQRT(0.25+SQR(LNDM))
ELSE
BEGIN
  SSSMNOSE:=1.0+2*LNDM/SQRT(1.0+SQR(LNDM));
  WORK:=SQRT(1.0-SQR(1.0/(2*LNDM)));
  WORK:=ARCTAN(WORK/SQRT(1.0-SQR(WORK)));
  SSSMNOSE:=SSSMNOSE*WORK;
END;

SSSMBODY:=4.0*LB/DM1;

IF LT>0 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.
