' >>>>**** FACE-HARDENED ARMOR PENETRATION PROGRAM BY NATHAN OKUN ****<<<< ' >>>>**** VERSION 6.9 OF 4 MARCH 2012 ****<<<< ' >>>>**** MAIN PROGRAM MODULE "FH69MAIN.BAS" ****<<<< ' ' ** THE FOLLOWING SUBROUTINES ARE IN MODULES "FH69SBM1.BAS" & "FH69SBM2.BAS": ' DECLARE SUB ALLPROJDATA (ZZX, ZZY) DECLARE SUB ARMORINFO (ZZX) DECLARE SUB LPUS (ZZX) DECLARE SUB PENPRINT (ZZX) DECLARE SUB LPBRITISH (ZZX) DECLARE SUB LPGERMAN (ZZX) DECLARE SUB LPFRENCH (ZZX) DECLARE SUB LPITALIAN (ZZX) DECLARE SUB LPJAPANESE (ZZX) DECLARE SUB LPAUSTHUNG (ZZX) DECLARE SUB LPRUSSIAN (ZZX) DECLARE SUB SCALEFACTOR (ZZX) DECLARE SUB VERSIONPRNT (ZZX) DECLARE SUB GRSNHRVYTC () DECLARE SUB SHOWORIGARMR () DECLARE SUB SETOBMULT () DECLARE SUB OBMULT () DECLARE SUB PRNTARMR () DECLARE SUB PROJNATION () DECLARE SUB USPROJ () DECLARE SUB BRITAINPROJ () DECLARE SUB GERMANYPROJ () DECLARE SUB FRANCEPROJ () DECLARE SUB ITALYPROJ () DECLARE SUB JAPANPROJ () DECLARE SUB AUSTHUNGPROJ () DECLARE SUB RUSSIAPROJ () DECLARE SUB NUMVALHDR () DECLARE SUB LPRINTHDR () DECLARE SUB SETVALUE () DECLARE SUB NOSEDAM () DECLARE SUB PROJQMODS () DECLARE SUB PLUGCALC () DECLARE SUB YESNO () DECLARE SUB LMTSTRINGS () DECLARE SUB CALCVDF () DECLARE SUB SPLNTRPRNT () DECLARE SUB BENDLOGIC () DECLARE SUB IMPACTPRNT () DECLARE SUB NSBDYDAMPRNT () DECLARE SUB THRESHOLDCALC () DECLARE SUB CHGARMRPRNT () DECLARE SUB GETPLATETHICKNESS () DECLARE SUB ARMORBACK () DECLARE SUB BACKPRINT () DECLARE SUB OBHDSAPCAP () DECLARE SUB PROJMOTIONPRNT () DECLARE SUB OBINPUT () DECLARE SUB INITVALHDR () DECLARE SUB SCPGPRNT () DECLARE SUB LPRNTSECPG () DECLARE SUB LPRNTARMOR () DECLARE SUB DEFLECCALC () DECLARE SUB SHATRDAM () DECLARE SUB NOSEBROKE () DECLARE SUB PENVRVPLGCALC () DECLARE SUB SETMINEV () DECLARE SUB LPPROJIMPACT () DECLARE SUB EFFVELINIT () DECLARE SUB LPDAMAGE () DECLARE SUB GETPROJDWTWB () DECLARE SUB DAMAGESETUP () DECLARE SUB DOCRTGOOD () DECLARE SUB REMVELPRNT () DECLARE SUB FACECALC () DECLARE SUB MODIFYVDF () DECLARE SUB SHTRMULTSELECT () DECLARE SUB MINEVSHATCALC () DECLARE SUB THINSELECT () DECLARE SUB THINPRINT () ' ' THE FOLLOWING MUST BE IDENTICAL AT TOP OF ALL MODULES OF THIS PROGRAM !! ' COMMON SHARED NATION, PROJ, ARMOR, SC, D, PENTP, OLDVALUE, NEWVALUE, CMT, VXP COMMON SHARED Q, QDAM, UB, CARTWL, CMPND, SOFTSHAT, THNCHL, MSHAT, CRTGD COMMON SHARED TA, UBMAN, UBCALC, TPCAL, THIN, YS, MTLBACK, TRUTHIN, PSHMAX COMMON SHARED TD, LCMOD, POLMOD, POIMOD, SHAT, CART, VS, OB, OBRAD, EX, EXRAD COMMON SHARED VLMT, VLSHAT, VLTRU, VITRU, TOTPLUGWT, NORMPLUGWT, DELTAPLUGWT COMMON SHARED UBSV, QSV, QDAMSV, CARTWLSV, CMPNDSV, THNCHLSV, SOFTSHATSV, HF COMMON SHARED CRITAGL, SHATRES, NSDAMAGL, BRAAK, APCAP, LTCASE, PLIM, PDAM COMMON SHARED ALD, BLD, CLD, AED, BED, CED, NDAP, BRK, NSBRK, BDYDM, BEND, WT COMMON SHARED BKEFF, PNL, PNI, PNLSHAT, CARDONALD, PNLPR, VHSHAT, PENFLG, VLND COMMON SHARED VDFSTD, VDFUSED, VDFSTDWW1, VDFSTDWW2, VSCRIT, CAPHD, OBCRIT, WB COMMON SHARED VHOL, WTSAVE, BRAIK, VDFBND, VDFBRK, MAXDIFF, SNCSMAX, OBDF, MO COMMON SHARED THKTHN, THKTHNSV, MINEV, MINEV1, MINEV2, MINEV3, MINEV4, MINEV5 COMMON SHARED NVRFLAG, MAXOB, THVAL, THSPD, HARD, WD, VHTRU, CRTAPR, MTMP, VR COMMON SHARED CURV, CRVRL, CRVFLAG, VRATMIN, VHEXREV, VLEXREV, VHDAM, VLDAM COMMON SHARED VRAT, VRATVEL, EXMIN, TMPOBDF, NSSHAT, VNPLUG, VDPLUG, VRSHATNS COMMON SHARED OB45, OB45CALC, VHSHATMAX, VLSHATMAX, CRITVEL, SHATVDF, NOTEFLAG COMMON SHARED VDFUSEDPR, VRPR, VHND, EXTH, OBRK, TCAL, NSTEST, NSTESTV, SAMPRJ COMMON SHARED OPRIMEL, OPRIMED, OBPRNT, EXPRNT, MTMPCR, MTMPNS, VCNT, FLAG COMMON SHARED WTSVPRNT, WTPRNT, WBPRNT, SOFTQPMAX, MINSHVEL, PENCONST#, TEFF COMMON SHARED SHATMULT, VTOTAL, UBFLAG, VDFHARVEY, SHATPRT, SAMEPLATE, VSCHECK COMMON SHARED NBL1$, NBL2$, NBL3$, NBL4$, NBL5$, NBL6$, NBL7$, RESNOTE$, PSL$ COMMON SHARED HBL1$, HBL2$, HBL3$, HBL4$, HBL5$, HBL6$, HBL7$, HBL8$, HBL9$, ND$ COMMON SHARED PAND$, FLAKE$, CAP$, REMV$, NOTE1$, NOTE2$, NOTE3$, NOTE4$, NOTE5$ COMMON SHARED BDYDM1$, BDYDM2$, BDYDM3$, NSBRK1$, NSBRK2$, NSBRK3$, BD1$, BD2$ COMMON SHARED BKPRT1$, BKPRT2$, BKPRT3$, BKPRT4$, BKPRT5$, CALC$, EBL$, EFFVEL$ COMMON SHARED HBLTONBL$, N1$, N2$, N3$, N4$, H1$, H2$, H3$, H4$, PRJ$, NATN$ COMMON SHARED VELLTRU$, VELLSHAT$, VELLSHATMAX$, VELLND$, EFFPRINT1$, BDYDM4$ COMMON SHARED VELHTRU$, VELHSHAT$, VELHSHATMAX$, VELHND$, EFFPRINT2$, BDYDM5$ COMMON SHARED YS$, PEN1$, PEN2$, WBL1$, WBL2$, WBL3$, WBL4$, VEL$, NOTE5A$ COMMON SHARED ONEPC$, RVU$, DPLG$, REMVEL$, BSNS1$, BSNS2$, BSNS3$, NOTE5B$ COMMON SHARED TWOVEL$, AMPER$, NOPLG$, PEN3$ DIM SHARED M(15), MS(17) COMMON M(), MS() ' ' **** BEGIN ACTUAL PROGRAM CODE **** '* '**INITIALIZE PROGRAM FIRST TIME ONLY** '* 'INIT OB MULTIPLIER TABLES 'M()' & 'MS()' & OTHER CONSTANTS '* CALL OBMULT '* 'ENLARGE SCREEN & PRINT SCREEN HEADER MSG '* REM **** SCREEN 13 WIDTH 80, 43 CLS REM **** '* CALL INITVALHDR '* PRINT "Show DEFINITIONS & VERSION 6.8 & 6.9 Changes Information Screens? (Y/N) "; GOSUB CHKYESNO: PRINT YS$: IF (YS = 0) THEN PRINT : GOTO STARTPROG CLS : VCNT = 1: ' PAGE 1 (DEFINITIONS) CALL VERSIONPRNT(VCNT) GOSUB CHKYESNO: IF (YS = 0) THEN CLS : GOTO STARTPROG: 'SHOW 1ST CHANGE X.X PAGE IF Y = 1 CLS : VCNT = 2: ' PAGE 2 (1ST CHANGE PAGE; ALWAYS USED) CALL VERSIONPRNT(VCNT) GOSUB CHKYESNO: IF (YS = 0) THEN CLS : GOTO STARTPROG: 'NO-OP ON LAST PAGE CLS : VCNT = 3: ' PAGE 3 (2ND CHANGE PAGE; 6.8 USES) CALL VERSIONPRNT(VCNT) GOSUB CHKYESNO: IF (YS = 0) THEN CLS : GOTO STARTPROG: 'NO-OP ON LAST PAGE CLS : VCNT = 4: ' PAGE 4 (3RD CHANGE PAGE; 6.8 USES) CALL VERSIONPRNT(VCNT) GOSUB CHKYESNO: IF (YS = 0) THEN CLS : GOTO STARTPROG: 'NO-OP ON LAST PAGE CLS : VCNT = 5: ' PAGE 5 (4TH CHANGE PAGE; 6.8 USES) CALL VERSIONPRNT(VCNT) '* 'MOVE THE NEXT LINE TO JUST AFTER LAST CHANGE PAGE USED GOTO PRINFO1: '4 CHANGE PAGES IN 6.8, SO ONLY CHECK FOR START PROGRAM (ONLY 'Y' LEGAL) ' '* FOR FUTURE USE * ' 'ALLOW ONLY 5 CHANGE EXPLANATION PAGES 'CLS : VCNT = 5: ' PAGE 5 'CALL VERSIONPRNT(VCNT) 'GOSUB CHKYESNO: IF (YS = 0) THEN CLS : GOTO STARTPROG 'GOTO PRINFO1: 'ONLY X PAGES NOW (MOVED TO AFTER LAST USED PAGE & KILL GOSUB) '* END OF FOR FUTURE USE * ' PRINFO1: GOSUB CHKYESNO: IF (YS = 1) THEN CLS : ELSE GOTO PRINFO1: 'ONLY 'Y' ANSWER ALLOWED ' '*** '** TOP OF MAIN PROGRAM LOOP ** '*** ' STARTPROG: ' IF (SAMEPLATE > 0) THEN GOTO OLDARMOR 'IF NEW RUN USES SAME PLATE AS LAST RUN, SKIP ARMOR INPUTS ' 'INPUT ACTUAL PLATE THICKNESS VALUE ('TA') '* CALL GETPLATETHICKNESS '* 'SELECT ARMOR TYPE '* CALL PRNTARMR '* MX = 22: OLDSEL = ARMOR: GOSUB SELECTION: ARMOR = SEL ' IF ((OLDSEL = SEL) AND (SAMEPLATE = 2)) THEN GOTO MODARMOR 'PLATE TYPE AND THICKNESS UNCHANGED '* 'SET NEW ARMOR VALUES & FLAGS '* CALL ARMORINFO(ARMOR) '* 'SAVE NEW ARMOR VALUES AND FLAGS FROM ORIGINAL TABLE UBSV = UB: QSV = Q: QDAMSV = QDAM: CARTWLSV = CARTWL: CMPNDSV = CMPND THNCHLSV = THNCHL: SOFTSHATSV = SOFTSHAT: THKTHNSV = THKTHN ' IF ((ARMOR = 1) OR (ARMOR = 3) OR (ARMOR = 4) OR (ARMOR = 12)) THEN 'GRUSON CHILLED CAST IRON, HARVEYIZED ARMORS, & TERNI CEMENTED FACE THICKNESS PERCENT ' DECREASES ('UB' GOES UP) WITH INCREASING PLATE THICKNESS ' (GRUSON & TERNI CHANGE ESTIMATED) IF (UBMAN > 0) THEN UB = UBMAN: 'CHANGE CURRENT UB VALUE IF MANUAL VALUE USED LAST RUN IF (UB > 75) THEN THNCHL = 1 ELSE THNCHL = 0 '* CALL GRSNHRVYTC '* END IF ' MODARMOR: 'PRINT MESSAGE IF DEFAULT PARAMETERS HAVE BEEN CHANGED BY USER '* CALL CHGARMRPRNT '* GOSUB CHANGEARMOR: 'ALLOW USER TO MODIFY ARMOR PARAMETERS ' 'CHECK IF PLATE FALLS UNDER 'THIN' LOGIC '* CALL THINSELECT '* OLDARMOR: TP = TA * Q: 'PEN EFFECTIVE THICKNESS W/O BACKING TD = TA * QDAM: 'PROJ DAMAGE EFFECTIVE THICKNESS 'CURVED-PLATE RULE DEFINED: CURVED FH PLATES ELIMINATE BODY DAMAGE TO STEEL PROJ AT ' OB>45 DEG IF HBL <= VEL < NBL. IF SHATR OCCURS, RESULTS IN NOSE-ONLY SHATR INSTEAD OF ' USUAL COMPLETE SHATR. PRINT : PRINT "Is plate strongly curved (part of dome, cylinder, ellipse, etc.)? (Y/N) "; GOSUB CHKYESNO: PRINT YS$: CURV = 0: IF (YS = 1) THEN CURV = 1 PRINT : PRINT "Is there any backing material behind the face-hardened plate? (Y/N) "; GOSUB CHKYESNO: PRINT YS$: IF (YS = 0) THEN 'NO, SKIP BACKING MATERIAL ENTRIES WD = 0: CMT = 0: MTLBACK = 0: NBK = 0 BTP = 0: QBK = 0: BKEFF = 0: TEFF = TP GOTO NOBACK END IF 'ENTER BACKING DATA. THEY ONLY INCREASE RESISTANCE, NOT PROJ DAMAGE ' 'INPUT THICKNESS OF WOOD, CEMENT, &/OR METAL BACK SUPPORT LAYERS BEHIND ARMOR PLATE '* CALL ARMORBACK ' IF (MTLBACK = 0) THEN BKEFF = 0: BTP = 0: NBK = 0: QBK = 0: 'ZERO METAL BACKING PLATE VALUES ELSE GOSUB SELMTLBK: 'SELECT BACKING METAL TYPE IF (NBK = 0) THEN NBK = 1: 'SET DEFAULT = 1 IF NON-ZERO METAL BACKING THICKNESS PRINT "CURRENT NUMBER OF METAL BACKING PLATES ="; NBK PLATENMBR: INPUT "Number of (laminated) metal backing plates: ", NBK$ IF (NBK$ = "") THEN PRINT "Using"; NBK: NBKTEST = NBK ELSE NBKTEST = VAL(NBK$) END IF IF ((NBKTEST < 1) OR (NBKTEST <> INT(NBKTEST))) THEN GOTO PLATENMBR: 'BAD INPUT NBK = NBKTEST 'ALL METAL BACKING PLATES ASSUMED IDENTICAL (USUAL DESIGN) BKEFF = .5 * (NBK * (MTLBACK * QBK / NBK) ^ 1.4) ^ .714286: 'DE MARRE SPACED ARMOR/2 END IF TEFF = TP + WD + CMT + BKEFF: 'TOTAL EFFECTIVE THICKNESS OF PLATE + BACKING NOBACK: PRINT '**** 'PROJECTILE SELECTION LOGIC '**** IF (SAMPRJ = 1) THEN GOTO SAMEPROJ: ''SAMPRJ'=1 MEANS REPEAT SAME PROJ SAMEARMOR: '* GOSUB SELECTNATION: 'SELECT PROJ NATION & TYPE '* PRINT '* ' INPUT PROJ DIAM, TOTAL WT, & BODY WT & SET/CLEAR 'CAPHD' FLAG '* CALL GETPROJDWTWB '* SAMEPROJ: '* ' *BEGIN NOSE COVERINGS LOST PRIOR TO FACE-HARDENED ARMOR IMPACT LOGIC* '* IF (WB = WTSAVE) THEN PRINT "IF ANY EXISTED, ALL NOSE COVERINGS WERE ALREADY REMOVED PRIOR TO IMPACT" ELSE PRINT "YOU NEED SEPARATE NOSE COVERING WEIGHTS IF ONLY WINDSCREEN IS NOW MISSING" END IF PRINT HARD = APCAP: CAPHDRMV = 0: WT = WTSAVE: 'INIT DEFAULT VALUES FOR POSSIBLE CHANGE 'ONLY POST-WWI JAP 'DIVING' TYPE 88/91/1 AP PROJ HAD A REMOVABLE NOSE-TIP CALLED ' A 'CAP HEAD' (FLAT END UNDER IT). LOSS OF WINDSCREEN ALWAYS CAUSED LOSS OF ' CAP HEAD, WHICH WAS HELD ON ONLY BY NOTCHED WINDSCREEN THREADS. 'CAP HEAD WAS AP CAP TIP IN LARGER, CAPPED JAP TYPE 88/91/1 PROJ, SO LOSING ' CAP HEAD KEPT MOST OF AP CAP. 'UNCAPPED JAP TYPE 91 AP W/O CAP HEAD & WINDSCREEN REVERTS TO PRE-WWI UNCAPPED ' AP & COMMON PROJ (DEFAULT #3) IF (WT = WB) THEN 'DISCARD ALL NOSE COVERINGS HARD = 0: 'SET NO AP CAP FLAG 'IF CAPPED PROJ, USE AP-CAP-REMOVED BONUS, IF APPLICABLE GOTO CAPGONE: 'SKIP REST OF NOSE-COVERINGS-LOST LOGIC END IF ''HOOD' IS THIN SOFT-AP-CAP-LIKE NOSE COVERING FOR SCREWING ON WINDSCREEN. ' IT ACTS AS A LOW-GRADE SOFT AP CAP. A HOOD WILL ACT AS AN SOFT AP CAP, ' BUT IF IMPACT IS BELOW THE NBL, THE PROJECTILE NOSE BREAKS UP NO MATTER WHAT. 'HOMOGENEOUS IRON PLATES > .0805 CAL THICK & ALL FH PLATES REMOVE AP CAPS OR HOODS. 'ALMOST ALL METAL PLATES USED IN WARSHIPS REMOVE WINDSCREENS ' (ALL IMPACTS WITH ANYTHING REMOVE GERMAN WWII BRITTLE ALUMINUM WINDSCREENS OR ' EXPLOSIVE-TIPPED FRENCH/BRITISH 'K' SHELLS USED WITH DYE BAGS) IF ((APCAP > 0) AND (CAPHD <> 1) AND (WT > WB)) THEN PRINT "Has the AP Cap (and all other nose coverings) been removed? (Y/N) "; GOSUB CHKYESNO: PRINT YS$ IF (YS = 1) THEN HARD = 0: WT = WB: GOTO CAPGONE 'IF YES, SKIP REST OF NOSE-COVERINGS-LOST LOGIC END IF IF (CAPHD > 0) THEN 'JAP TYPE 88/91 AP PROJ LOGIC PRINT "IF WINDSCREEN IS REMOVED, JAPANESE TYPE 88/91/1 AP/APC CAP HEAD IS ALSO REMOVED." PRINT "THIS TURNS UNCAPPED AP PROJECTILE INTO A VERY BLUNT UNCAPPED SAP PROJECTILE WITH" PRINT " POOR FH ARMOR PENETRATION. CAPPED DESIGNS LOSE SOME PENETRATION ABILITY, TOO." PRINT PRINT "Have the Windscreen and Cap Head been removed? (Y/N) "; GOSUB CHKYESNO: PRINT YS$ IF (YS = 1) THEN 'YES CAPHDRMV = 1 IF (CAPHD = 1) THEN 'UNCAPPED TYPE 91 AP PROJ (LOSES MOST OF NOSE; MUST ALSO CHANGE PROJ PEN/DAM PARAMETERS) WT = WB: 'ONLY FLAT-NOSED BODY REMAINS ELSE 'CAPPED TYPE 88/91/1 AP PROJ (ONLY LOSES WINDSCREEN & AP CAP TIP) WTDIFF = WT - WB IF (WCHWT >= WTDIFF) THEN WCHWT = 0: 'SET WCHWT = 0 IF TOO BIG PRINT "MOST OF AP CAP REMAINS ATTACHED. SOME LOSS OF PROJECTILE QUALITY." PRINT "CURRENT COMBINED WINDSCREEN & CAP HEAD WEIGHT ="; WCHWT; "pound"; IF (WCHWT > 1!) THEN PRINT "s": ELSE PRINT WINDCPHD: INPUT "Combined Windscreen and Cap Head Weights (WCH), pounds: ", WCHWT$ IF ((WCHWT$ = "") AND (WCHWT >= 0) AND (WCHWT < WTDIFF)) THEN PRINT "Using"; WCHWT ELSE WCHWT = VAL(WCHWT$) END IF IF ((WCHWT < 0) OR (WCHWT >= WTDIFF)) THEN GOTO WINDCPHD: 'BAD INPUT WT = WT - WCHWT END IF ELSE CAPHDRMV = 0: 'CAP HEAD STILL THERE END IF 'USE WHAT'S LEFT AS 'WT' FROM NOW ON (WITH OR WITHOUT CAP HEAD & WINDSCREEN) ELSE 'LOGIC FOR ALL OTHER PROJ TYPES IF ((APCAP <= 0) AND (WT > WB)) THEN PRINT "Have both Hood, if any, and Windscreen been removed? (Y/N) "; GOSUB CHKYESNO: PRINT YS$: IF (YS = 1) THEN WT = WB: HARD = 0 END IF IF (WT > WB) THEN 'WINDSCREEN LOSS ONLY LOGIC (MINOR WEIGHT LOSS EFFECT) WDIFF = WT - WB PRINT "Has only the Windscreen, if any, been removed? (Y/N) "; GOSUB CHKYESNO: PRINT YS$ IF (YS = 1) THEN 'YES (IF NO, THEN NOTHING HAS BEEN REMOVED) IF (WWT > WDIFF) OR ((APCAP <> 0) AND (WWT = WDIFF)) THEN WWT = 0: 'SET WWT = 0 IF TOO BIG PRINT "CURRENT WINDSCREEN WEIGHT ="; WWT; "pound"; IF (WWT > 1!) THEN PRINT "s": ELSE PRINT WINDSCRNWT: INPUT "Windscreen Weight (WW), pounds: ", WWT$ IF ((WWT$ = "") AND (WWT >= 0) AND ((WWT < WDIFF) OR ((APCAP = 0) AND (WWT = WDIFF)))) THEN PRINT "Using"; WWT ELSE WWT = VAL(WWT$) END IF IF ((WWT < 0) OR (WWT > (WT - WB)) OR ((APCAP <> 0) AND (WWT = (WT - WB)))) THEN GOTO WINDSCRNWT: 'BAD INPUT END IF WT = WT - WWT: 'USE WHAT'S LEFT AS 'WT' FROM NOW ON END IF END IF END IF '* CAPGONE: 'LOSS OF AP CAP ASSUMES LOSS OF ALL PROJ NOSE COVERINGS IF (WT = WB) THEN IF ((CAPHD = 1) AND (PROJ = 10)) THEN 'WHEN UNCAPPED TYPE 91 AP PROJ LOSES ITS CAP HEAD, SWITCH TO ' PRE-WWI UNCAPPED AP & COMMON PROJ PARAMETERS (DEFAULT #3) SHATRES = 1: APCAP = 0: NSDAMAGL = 5: PLIM = .795: PDAM = .7 ALD = .000143: BLD = 2.249: CLD = .00267: CRITAGL = 0: BRAAK = 2: LTCASE = 0 AED = .000247: BED = 2.129: CED = .00172: BEND = 0: CARDONALD = 0 END IF HARD = 0: 'NO CAP REMAINING ON SHELL ELSE HARD = APCAP: 'AP CAP OR HOOD STILL THERE END IF 'END OF NOSE-COVERINGS-LOST LOGIC '*** '* DETERMINE WHEN THIN PLATE LOGIC SETS IN ' ' TA<='THIN'-->START EFFECTS; TA<='TRUTHIN'-->FULL EFFECTS '* CALL THINPRINT '* PRINT IF (VS > 0) THEN PRINT "CURRENT STRIKING VELOCITY ="; VS; IF (VS > 1!) THEN PRINT "feet/second": ELSE PRINT "foot/second" END IF STRIKEVEL: INPUT "Striking velocity (VS), feet/second (Whole number only; 1-4000): ", VS$ IF ((VS$ = "") AND (VS > 0)) THEN PRINT "Using"; VS ELSE VSTEST = VAL(VS$): VSINT = INT(VSTEST) END IF IF ((VSTEST < 1) OR (VSTEST > 4000) OR (VSTEST <> VSINT)) THEN GOTO STRIKEVEL: 'BAD INPUT VS = VSTEST '* 'PRINT DISCUSSION ON OBLIQUITY, SOFT AP CAPS, & HOODS '* CALL OBHDSAPCAP '* MAXOB = 75!: TPCAL = TP / D: IF (TPCAL < THIN) THEN MAXOB = 80! '* ' INPUT IMPACT OB IN DEG '* CALL OBINPUT '* 'CAP HEAD LOSS LOGIC FOR CAPPED JAP TYPE 88/91/1 PROJ IF ((CAPHD = 2) AND (CAPHDRMV = 1)) THEN 'CAP HEAD LOSS IN CAPPED TYPE 88/91/1 DEGRADES PEN, BUT HAS LESS EFFECT AT OB>45 DEG CAPHDLOSS = .045: 'FOR OB<45 DEG ONLY IF (OB >= 45!) THEN CAPHDLOSS = CAPHDLOSS * (COS(2 * (OB - 45!) / 57.29578)) ^ 2 ELSE CAPHDLOSS = 0 END IF '* BRAIK = BRAAK: 'IF 'BRAAK'>0, PROJ BREAKS IF VEL 2) OR ((SHATRES = 2) AND (HARD = 1) AND (OB < 20!))) AND (TOTHNFLG = 1))) THEN 'ALL-STEEL PLATE EFFECTIVE DAMAGE-CAUSING THICKNESS TOO THIN TO SHATR ANY STEEL PROJ ' OR A SOFT-CAPPED CHILLED CAST IRON PROJ WHEN CAP WORKS IF (CMPND = 1) THEN SKIPSHTR = 2 'CHECK Z-O-M-R FOR SHATR ELSE SKIPSHTR = 1: SHATPRT = 1 'NEVER SHATR, TOO THIN END IF ELSEIF ((SHATRES <> 2) AND ((ARMOR = 3) OR (ARMOR = 4))) THEN 'HARVEY ARMOR VS STEEL PROJ LOGIC IF ((BRAIK < 2) OR (BEND = 2)) THEN SKIPSHTR = 1: SHATPRT = 2 'NOT WEAKEST PROJ, SO NO SHATR ELSEIF (CMPND = 1) THEN 'COMPOUND ARMOR LOGIC SKIPSHTR = 2: 'DO Z-O-M-R LOGIC UNLESS CHANGED IF (SHATRES = 2) THEN 'CHILLED CAST IRON (GRUSON/PALLISER) PROJ LOGIC IF (HARD = 0) THEN 'UNCAPPED CHILLED CAST IRON PROJ SHAT = 1: CART = 0 'ALWAYS SHATR SKIPSHTR = 1: 'SHATR SET, SO SKIP REST OF SHATR LOGIC END IF 'IF 'HARD'<>0, THEN DO Z-O-M-R FOR SOFT-CAPPED CHILLED CAST IRON PROJ ' (NO HARD-CAPPED DESIGNS MADE) ELSE SKIPSHTR = 1 'NOT IRON PROJ, SO SKIP ALL SHATR LOGIC SHATPRT = 3 END IF END IF IF (SKIPSHTR = 1) THEN SKIPSHTR = 0: GOTO IRONPROJ: 'SKIP SHATR LOGIC IF (SKIPSHTR = 2) THEN SKIPSHTR = 0: GOTO CASTIRONCMPND: 'CHECK Z-O-M-R ' *** ' ** REGULAR SET SHATR LOGIC ** ' *** ' BRIT IMPROVED WWI KC ('SOFTSHAT' = 2) WHEN NOT VS MIDVALE UNBRKBLE PROJ ' ('CARDONALD' NOT 2) SAME AS 'SOFTSHAT' = 1 IF ((SOFTSHAT = 1) OR ((SOFTSHAT = 2) AND (CARDONALD < 2))) THEN SHATSOFT = 1: ELSE SHATSOFT = 0 ' HIGHEST QUALITY ARMOR DEF IF ((TD / D) >= .67) THEN TOOTHICK = 1: ELSE TOOTHICK = 0 'ARMOR DAMAGE-CAUSING THICKNESS IS TOO THICK FOR THIN HARD/TOUGH CAP AT OB>20 DEG IF ((HARD = 0) OR (HARD = -1)) THEN SHAT = 1: ' HOOD OR NO AP CAP VS MOST FH ARMOR ELSEIF (HARD = 1) THEN IF ((OB > 20!) OR (SHATSOFT = 1)) THEN SHAT = 1 'SOFT CAPS DO NOT WORK OVER 20 DEGR OR AGAINST HIGHEST QUALITY ARMOR ELSEIF (HARD = 3) THEN IF ((SHATSOFT = 1) AND (TOOTHICK = 1) AND (OB > 20!)) THEN SHAT = 1 'SMALL/THIN HARD CAP ONLY WORKS AT ALL OB VS THINNER HIGHEST QUALITY PLATES ELSEIF ((CAPHD = 1) AND (HARD = 2)) THEN 'CAP HEAD ON UNCAPPED TYPE 91 SHELL STILL IN PLACE SHAT = 1 'CAP HEAD PROTECTION TO UNCAPPED JAP TYPE 88/91/1 NOSE VERY LIMITED END IF ' IF (SHAT = 1) THEN IF ((HARD = 1) AND (((SOFTSHAT = 2) AND (CARDONALD < 2)) OR (SOFTSHAT = 1)) AND (OB <= 20!)) THEN NSSHAT = 1 'PUT SOFT CAP & SOFTSHAT NOSE-ONLY SHATR RULE IN FORCE ELSEIF ((HARD = -1) AND (SOFTSHAT = 0) AND (SHATRES < 2) AND (OB <= 20!)) THEN NSSHAT = 4 'PUT HOOD NON-SOFTSHAT NO-SHATTER RULE IN FORCE FOR STEEL PROJECTILES END IF END IF ' CASTIRONCMPND: IF ((OB > 15!) AND (OB <= 20!) AND (ABS(HARD) = 1)) THEN 'USER SELECTS SOFT CAP FUNCTION (RAPID ROLL-OFF W/INCREASING OB IN REAL IMPACTS) PRINT "INSIDE SOFT AP CAP & HOOD 15-20 DEGREE SHATTER ZONE OF MIXED RESULTS." IF (SHATRPRT <> 0) THEN SHATRPRT = 0: 'REGULAR SHATR LOGIC PRINT " Do you wish the projectile's SOFT AP cap or HOOD to work? (Y/N) "; GOSUB CHKYESNO: PRINT YS$ IF (YS = 0) THEN SHAT = 1: CART = 0: NSSHAT = 0: 'NO -- USE COMPLETE SHTR AGAIN END IF END IF ' MINSHVEL = 0: ' RESET MIN COMPLETE SHTR VEL IF ((SHAT = 1) AND (NSSHAT = 0)) THEN MINSHVEL = 1170 * COS(OBRAD): ' MIN VEL FOR COMPLETE SHATR FOR STRONGER SHELLS IF ((BRAIK = 0) AND (VS <= MINSHVEL)) THEN NSSHAT = 2 END IF '* IRONPROJ: ' IF (SHAT = 1) THEN CART = 0: ELSE CART = CARTWHL 'LARGE SHATR HOLE REPLACES CARTWHEEL HOLE ' HF = 0: IF ((SHAT = 0) AND (OB > 70!)) THEN HF = 1 'COMPLETE PEN NOT POSSIBLE IF 'HF' = 1 CLS : PRINT SPC(30); "USUAL RESULTS": 'PRINT SCREEN HEADER '* DO CALCULATIONS * GOSUB CALCBL: 'COMPUTE VARIOUS BALLISTIC LIMITS GOSUB BLPLUSEX: 'SELECT APPLICABLE LIMIT VELOCITIES FOR THIS CASE & COMPUTE EXIT ANGLE GOSUB DAMAGECALC: 'COMPUTE PROJ CONDITION AFTER IMPACT GOSUB PLUGWTS: 'COMPUTE EJECTED PLUG WEIGHTS GOSUB FINALRESULTS: 'DETERMINE WHAT HAPPENED TO PLATE GOSUB RESULTSPRINT: 'PRINT RESULTS '* '* END-OF-RUN LOGIC * PRINT "OUTPUT RESULTS TO PRINTER? (Y/N) "; GOSUB CHKYESNO: PRINT YS$: IF (YS = 1) THEN GOSUB HARDCOPY PRINT "ANOTHER RUN? (Y/N) "; GOSUB CHKYESNO: PRINT YS$: IF (YS = 0) THEN END: '** END OF PROGRAM ** IF (CAPHD = 1) AND (PROJ = 10) THEN 'RE-INIT UNCAPPED JAP TYPE 91 AP PROJ (15.5CM & 20.3CM) ORIGINAL PARAMETERS CRITAGL = 15: SHATRES = 1: NSDAMAGL = 20: BRAAK = 1: APCAP = 2 LTCASE = 1: PLIM = .945: PDAM = -1 ALD = .00336: BLD = 1.418: CLD = .0091701 AED = -1: BED = -1: CED = -1 END IF SAMPRJ = 0: NEWRUN = 0: SAMEPLATE = 0: PREVARMOR = ARMOR PRINT "USE SAME PROJECTILE? (Y/N) "; GOSUB CHKYESNO: PRINT YS$: IF (YS = 1) THEN NEWRUN = 1: SAMPRJ = 1 PRINT "USE SAME ARMOR PLATE (RETAIN PARAMETER CHANGES, IF ANY)? (Y/N) "; GOSUB CHKYESNO: IF (YS = 1) THEN NEWRUN = NEWRUN + 2: SAMEPLATE = 1 CLS : PRINT PENTP = 0: PENFLG = 0: SHAT = 0: NSSHAT = 0: BRK = 0: NSBRK = 0 SELECT CASE NEWRUN CASE 0 GOTO STARTPROG: 'RE-DO ALL INPUTS ('SAMPRJ' = 0) CASE 1 GOTO STARTPROG: 'RE-DO ARMOR INPUTS ONLY ('SAMPRJ' = 1, SO USE SAME PROJECTILE) CASE 2 GOTO SAMEARMOR: 'REDO PROJ INPUTS ONLY ('SAMPRJ' = 0) CASE 3 GOTO SAMEPROJ: 'USE BOTH OLD ARMOR & PROJ INPUTS ' (ONLY REDO STRIKING CONDITIONS) ('SAMPRJ' = 1) END SELECT ' '*** ' >>* END OF MAIN PROGRAM LOOP *<< '*** ' ' **** SUBROUTINES FOLLOW **** ' '* CENTRAL B.L. CALC--DO THE MATH! * CALCBL: '* 'COMPUTE SCALE FACTOR 'SC' '* CALL SCALEFACTOR(UB) '* 'SCALING FACTOR 'SC=(AZ)(D^BZ)+CZ' BASED ON UNAFFECTED BACK PERCENTAGE OF ' ACTUAL PLATE THICKNESS (STEP-FUNCTION APPROX) 'THINNER BACK = LARGER SCALING EFFECTS FROM FACE & TRANSITION LAYER SHEARING ' & BRITTLE FRACTURE FAILURE ''AZ' & 'BZ' FOR FACE & TRANSITION LAYER & 'CZ' FOR SOFT BACK LAYER '* DEN = (WT / (D ^ 3)) ^ .2: 'PROJ WEIGHT TERM '* 'THIN CHILL, HARVEY, & COMPOUND ARMORS CAN CAUSE LESS STRONG PROJ DAMAGE, ' SO IF THEY CAUSE DAMAGE, ' THE REDUCED 'QP' THEY CAUSE CAN BE INCREASED BACK UP TO 1.0 (HARD CAP) ' OR 'SOFTQPMAX' (SOFT CAP/HOOD) MAXIMUM VALUE ("PERFECT PROJ") 'BONUS TO INNATE PROJ PEN ABILITY FOR STRONGER PROJ DUE TO WEAK PLATES ' PPLUS = 0: 'RESET '****** ' WEAKEST PLATES STRESS STRONGER PROJ LESS SO PROJ QUALITY OF THOSE PROJ ' INCREASED IF (CMPND = 1) THEN 'COMPOUND ARMOR VERY WEAK IF (SHATRES = 2) THEN 'CAST IRON PROJ NOT IMPROVED PPLUS = 0 ELSEIF (BRAIK = 2) THEN 'WEAKEST STEEL PROJ SOMEWHAT IMPROVED PPLUS = .1: '10% PROJ QUALITY GAIN ELSEIF (BEND = 2) THEN 'DEFORMABLE MIDVALE STEEL PROJ SOMEWHAT IMPROVED PPLUS = .1: '10% PROJ QUALITY GAIN ELSE 'STRONG STEEL PROJ GREATLY IMPROVED PPLUS = .2: '20% PROJ QUALITY GAIN END IF ELSEIF (THNCHL = 1) THEN 'IF THINCHILL (THIN-CEMENTED FACE) PLATE, PLATE STRESSES SOME STRONG PROJ ' LESS SO THEIR PROJ QUALITY INCREASED ' STRONG STEEL PROJ IF (SHATRES = 2) THEN 'CAST IRON PROJ NOT IMPROVED PPLUS = 0 ELSEIF (BRAIK = 2) THEN 'WEAKEST STEEL PROJ NOT IMPROVED PPLUS = 0 ELSEIF (BEND = 2) THEN 'DEFORMABLE MIDVALE STEEL PROJ NOT IMPROVED PPLUS = 0 ELSE 'STRONGER STEEL PROJ IMPROVED PPLUS = .1: '10% PROJ QUALITY GAIN END IF END IF '****** '* 'PROJ PEN QUALITY LOGIC IF ((PLIM > 1!) AND (APCAP <> HARD)) THEN PLM = 1! 'IF 'PLIM'>1, AP CAP IS REASON, SO IF LOST, 'PLIM' REDUCED TO DEFAULT MAX (= 1!). ELSE PLM = PLIM - CAPHDLOSS END IF IF (PLM < 1!) THEN 'NO BONUSES USED IF PROJ QUALITY ALREADY >= 1.00 PLM = PLM + PPLUS 'BONUS CANNOT MAKE PROJ BETTER THAN ITS BEST POSSIBLE VALUE!! IF (ABS(HARD) = 1) THEN MAXPLM = SOFTQPMAX: ELSE MAXPLM = 1! ' SOFT AP CAP OR HOOD ROBS ENERGY FROM IMPACT BUT CONTRIBUTES NO ENERGY IF (PLM > MAXPLM) THEN PLM = MAXPLM END IF '* 'PROJ DAMAGE-RESISTANCE QUALITY LOGIC IF ((PLIM > 1!) AND (APCAP <> HARD)) THEN PDM = PDAM * (1! - (PLIM - 1!) / PLIM) ' LOSS OF THE AP CAP REDUCES 'PDAM' BY THE SAME AMOUNT AS 'PLIM' ELSE PDM = PDAM - CAPHDLOSS END IF IF (PDM > 0) AND (PDM < 1!) THEN PDM = PDM + PPLUS ' ONLY SOME BONUSES APPLY TO EFFECTIVE LIMIT '* ' SPECIAL BEST U.S. PROJ LOGIC FOR IMPACT EXTREME CONDITIONS ' (NO IMPROVEMENT OVER PREVIOUS DESIGNS IF LOGIC APPLIES) IF ((NATION = 1) AND (PROJ = 20)) THEN DAMCHK = (TD / D) * OB IF (DAMCHK > 32.175) THEN ' USE NEXT-BEST PROJ (= 19) UNDER EXTREME CONDITIONS PLM = .94: PDM = .94 CRITAGL = 25: NSDAMAGL = 25 END IF END IF '* ''PNI' APPLIES TO EFFECTIVE LIMIT & 'PNL' TO HBL & NBL. ' BY DEFINITION, MIN POSSIBLE EFFECTIVE COMPLETE PEN IS AT NBL. PNL = PLM '***** PENCONST# = 1.9822E-06 * D * SC * DEN: 'CONSTANT PEN FORMULA ('CORE' TERM) '***** 'CRITICAL DEFLECTION THRESHOLD ANGLE FOR "INEFFECTIVE" DAMAGE 'NEGATIVE VALUES ONLY USED FOR BRITISH 'BEND' EFFECTIVE PROJ LOGIC IF (CRITAGL <= 0) THEN CRTAPR = 0 ELSE CRTAPR = CRITAGL: 'DEFAULT TABLE VALUE END IF IF ((CRITAGL > 0) AND (CMPND = 1) AND (SHATRES < 2)) THEN CRTAPR = CRITAGL + 10 ' COMPOUND PLATES CAUSE MUCH LESS DAMAGE TO STEEL PROJ IF ((CRITAGL > 0) AND (THNCHL = 1)) THEN IF (BRAIK = 2) THEN CRTAPR = CRTAPR: ' NO CHANGE FOR WEAKEST STEEL PROJ ELSEIF (SHATRES = 2) THEN CRTAPR = CRTAPR: ' NO CHANGE FOR CAST IRON PROJ ELSE CRTAPR = CRITAGL + 5: 'THIN-FACED ARMOR STRESSES STRONGER STEEL PROJ LESS END IF END IF 'BRITISH WWII BENDING PROJ CRITICAL ANGLE 'OBCRIT' INCREASES WITH OLDER PLATES IF (BEND = 1) THEN OBCRIT = ABS(CRITAGL): ' VS WWII USUAL PLATE TYPES IF (((SOFTSHAT = 0) OR (CART > 0)) AND (THNCHL = 0)) THEN IF (CMPND = 1) THEN OBCRIT = OBCRIT + 12: ' VS COMPOUND ARMOR (ESTIMATE) ELSE OBCRIT = OBCRIT + 6: ' VS MORE BRITTLE NON-COMPOUND PLATES (ESTIMATE) END IF END IF ELSE OBCRIT = -1: ' NO-OP VALUE END IF '* 'COMPUTE OBLIQUE IMPACT THICKNESS MULTIPLIERS 'MO' & 'MSHAT' '* CALL SETOBMULT '* 'COMPUTE DAMAGE-RELATED LIGHTCASE & OBLIQUE IMPACT HBL, NBL, ' & EFFECTIVE LIMIT PROJ QUALITY MODIFIERS '* CALL PROJQMODS '* ''PNLPR' IS MAX PROJ QUALITY FACTOR ALLOWED. FOR USE WHEN VEL>=EFFECTIVE LIMIT ' FOR PROJ THAT ARE DAMAGED AT NBL IF (((PNL < 1!) AND (HARD > 1)) OR (HARD = 0)) THEN PNLPR = 1!: 'BEST PERFORMANCE W/REGULAR HARD AP CAPS OR NO CAPS ' (LATTER HAS SHATR OVERRIDE THIS, OF COURSE) ELSEIF (ABS(HARD) = 1) THEN PNLPR = SOFTQPMAX 'BEST PERFORMANCE W/SOFT AP CAPS (THEY DON'T DAMAGE PLATES WHILE BEING DESTROYED) ELSE PNLPR = PNL 'BEST PERFORMANCE FOR PROJ W/SUPERIOR HARD AP CAP DESIGN ('PNL' > 1) END IF IF (PNL > PNLPR) THEN PNL = PNLPR: ' HIT THE MAX STOP VALUE PNI = PDM: IF ((PNI < 0) OR (PNI > PNL)) THEN PNI = PNL: ' 'PNI' CAN NEVER EXCEED 'PNL' '* 'ADD THE EFFECTS OF ALL OTHER NORMAL-OB PROJ DAMAGE TO SHATR (LIGHTCASE PROJ ONLY) 'NO OBLIQUE-IMPACT-ONLY EFFECTS USED SINCE SHATTER SCRAMBLES THEM 'LOSS OF SOFT AP CAP OR HOOD INCREASES ENERGY AVAILABLE FOR PENETRATION SLIGHTLY, ' EVEN W/SHATR OCCURRING (NOT USED IF HARD CAP OR IF NO CAP OR HOOD TO START WITH!) IF ((LTCASE > 0) OR (BRAIK > 0)) THEN PNLSHAT = PNL: 'SAME QUALITY AS FOR NO SHATR IF (LTCASE = 2) THEN PNLSHAT = PNLSHAT * (1 - LCMOD): 'INCLUDE ADDED LTCASE DAMAGE IF (((ABS(APCAP) = 1)) AND (WT <> WB)) THEN PSHMAX = SOFTQPMAX 'SOFT AP CAP OR HOOD STEALS EXTRA ENERGY, SO INCLUDE THIS LOSS ELSE PSHMAX = 1! 'SHATR QUALITY IS NEVER BETTER THAN PERFECT UNCAPPED VALUE END IF IF (PNLSHAT < .095) THEN PNLSHAT = .095 'MIN MOD ALLOWED TO PREVENT PROGRAM CRASH IF (PNLSHAT > PSHMAX) THEN PNLSHAT = PSHMAX 'MAX SHTR PROJ QUALITY IS LOWER OF 1.00 OR SOFT CAP/HOOD LIMIT ELSE 'SMALL CAVITY (<4% HE WT) SEEMS TO PREVENT PROJ NON-SHATR DAMAGE IF A STRONGER PROJ SHATRS PNLSHAT = 1! PSHMAX = 1! END IF ' IF THE PROJECTILE CHANGES ITS MODE OF FAILURE AS OBLIQUITY GOES UP IN THE 0-30 DEGREES RANGE ' FROM COMPRESSION/SHOCK DAMAGE TO BENDING DAMAGE, SHATTER SEEMS TO PREVENT THE BENDING DAMAGE ' FROM OCCURRING, SO THAT THE VALUE OF 'PLIM' AT OB=0-15 DUE TO COMPRESSION/SHOCK DAMAGE GOES ' LINEARLY BACK TO 'PSHMAX' AT OB>=30, REGARDLESS OF ITS VALUE AT OB=0-15, IF UNDER 1!. IF (BEND = 1) AND (PNLSHAT < 1!) THEN IF (OB >= 30) THEN PNLSHAT = PSHMAX ELSEIF ((OB > 15) AND (OB < 30)) THEN PNLSHAT = PNLSHAT + (PSHMAX - PNLSHAT) * (OB - 15) / 15 END IF END IF IF (SHAT = 1) THEN PNI = PNLSHAT: 'NO SEPARATE EFFECTIVE LIMIT EXISTS FOR SHATR '* '*** COMPUTE ALL BALLISTIC LIMITS (NORMAL & AT GIVEN OB) *** '* 'UNDAMAGED-PROJ NBL (USED FOR POST-IMPACT RESULTS IF DAMAGE CEASES AT SOME VEL > NBL; ' ONLY REAL IF NO DAMAGE AT NBL, TOO) VLND = (TEFF * MO / (PENCONST# * PNLPR)) ^ VXP: VLND = INT(VLND) '* ' COMPUTE DIFF BETWEEN NBL & HBL FOR VARIOUS CONDITIONS '* CALL CALCVDF '* '*****>>> SHATR VEL CALC <<<***** '* 'SHATR **HBL** HAS 0%, 20%, 30%, OR 40% PLATE THICKNESS BONUS AT NORMAL OB. ' IT USUALLY DECREASES (NEVER NEGATIVE!) AT HIGHER OB. THIS CHANGES NBL. CALL SHTRMULTSELECT '* IF (OB <= 45!) THEN 'DIFF BETWEEN SHATR HBL & NBL IS INCREASE OVER HBL NEEDED TO COMPLETELY PENETRATE A PLATE SHATVDF = 1 / (1 - VDFSTD) 'BENDING OF BRITISH DEFORMABLE NON-CARDONALD PROJ HAS NO EFFECT HERE ELSE 'DIFFERENCE BETWEEN SHATR HBL & NBL DECREASES AT OB > 45 DEG (OTHERWISE USE SAME VALUE) SHATVDF = 1 / (1 - (VDFSTD * COS(2 * (OB - 45!) / 57.29578) ^ 8)) END IF '* '"PERFECT" PROJ SHATR HBL & NBL W/NO OTHER DAMAGE EFFECTS. IGNORE BRITISH PROJ MODS HERE, TOO. ' THIS HBL IS UNSHATRD HBL WHEN 'VHSHATMAX'<'VHTRU' DUE TO CONCENTRATION OF FORCE PUNCHING ' HOLE MORE EASILY. VHSHATMAX = (TEFF * SHATMULT * MSHAT / (PENCONST# * PSHMAX)) ^ VXP: VHSHATMAX = INT(VHSHATMAX) ' NORMAL OB 'VHSHATMAX' '* VLSHATMAX = SHATVDF * VHSHATMAX: VLSHATMAX = INT(VLSHATMAX): 'BEST POSSIBLE SHATR NBL '* VHSHAT = (TEFF * SHATMULT * MSHAT / (PENCONST# * PNLSHAT)) ^ VXP: VHSHAT = INT(VHSHAT) ''VHSHAT' IS THE IMPORTANT SHATRD-PROJ LIMIT, AS SOME PROJ PIECES PENETRATE THEN ''VLSHAT' MERELY ADDS SOME MORE PIECES IN MOST CASES, THOUGH FILLER MAY SOMETIMES ADD TO DAMAGE '* IF (ABS(VHSHAT - VHSHATMAX) <= 1) THEN VHSHAT = VHSHATMAX: 'FIX ROUNDING ERROR PROBLEM '* VLSHAT = SHATVDF * VHSHAT: VLSHAT = INT(VLSHAT): 'SHATR NBL DERIVED FROM SHATR HBL '* 'ACTUAL HBL & NBL TAKING ALL PROJ DAMAGE (EXCEPT SHATR) FROM IMPACTED PLATE INTO ACCOUNT VLTRU = (TEFF * MO / (PENCONST# * PNL * POLMOD)) ^ VXP: VLTRU = INT(VLTRU): 'UNSHATRD-PROJ NBL '* IF (ABS(VLTRU - VLND) <= 1) THEN VLTRU = VLND: 'FIX ROUNDING ERROR PROBLEM ''VHTRU' OR 'VHND', AS APPLICABLE, ALSO USED WHEN SHATR OCCURS W/A HARD AP CAP ' (JAP UNCAPPED TYPE 91 PROJ W/CAP HEAD ATTACHED ONLY) '* 'CALC HBL DERIVED FROM 'VLND', 'VLTRU' & (IN SOME CASES ONLY) 'VLSHAT' '* CALL MODIFYVDF '* 'EFFECTIVE PROJ LIMIT CALC IF (PNL = PNI) AND (CRITAGL <> 0) THEN VITRU = -1: 'MIN EFFECTIVE VEL WILL BE DETERMINED LATER BY CHANGE IN PROJ DIRECTION OF MOTION ' (DIFFERENT PROJ FAILURE CRITERIA) ELSE VITRU = (TEFF * MO / (PENCONST# * PNI * POIMOD)) ^ VXP: VITRU = INT(VITRU) ' LIMIT VEL ABOVE WHICH EFFECTIVE PEN OCCUR IN MOST CASES IF (VITRU < VLTRU) THEN VITRU = VLTRU: 'YOU CANNOT PENETRATE INTACT IF YOU CANNOT PENETRATE PERIOD! 'IF VEL>=NBL, PROJ ALWAYS EFFECTIVE USING 'VITRU' CRITERIA IN THIS CASE. END IF '* VSCRIT = VHSHAT / (1 - .83 * VDFSTD): 'AVE CRITICAL BRITISH CARDONALD PROJ VEL VSCRIT = INT(VSCRIT): ' ALWAYS USE INTEGER VALUE (TRUNCATED, NOT ROUNDED) '* '* ALL BALLISTIC LIMITS NOW CALCULATED FOR FURTHER LOGIC USE * '* RETURN ' SELECTNATION: 'SELECT PROJ NATION CALL PROJNATION MX = 8: OLDSEL = NATION: GOSUB SELECTION: NATION = SEL IF (OLDSEL <> SEL) THEN PROJ = 0: 'OLD PROJECTILE SELECTION INVALID IF NATION CHANGES PRINT : PRINT ON NATION GOSUB SELUS, SELBRIT, SELGERM, SELFR, SELIT, SELJAP, SELAH, SELRU RETURN ' SELMTLBK: ' 'PRINT METAL BACKING PLATE TYPES '* CALL BACKPRINT ' IF (BTP > 0) THEN PRINT "CURRENT METAL BACKING PLATE TYPE SELECTION ="; BTP MX = 5: OLDSEL = BTP: GOSUB SELECTION: BTP = SEL PRINT QBK = .5 + (BTP / 10): 'GOOD-ENOUGH APPROX HERE RETURN ' '** SELECT APPLICABLE LIMIT VEL & CALC EXIT ANGLE 'EX' ** ' 'MAX 'EX'= OB = NO DEFLECTION. 'EX' = 0 AT HBL. ' W/SHATR, NBL IS NOT INVOLVED IN 'EX' CALC ('EXMIN' = 0). 'W/O SHATR: ' BETWEEN HBL & NBL, 'EX' GOES FROM 0 TO OB LINEARLY AS VEL INCREASES. ' IF OB <= 15 DEG, AT NBL 'EX' = OB (NO DEFLECTION) ' IF OB > 15 DEG, AT NBL 'EX' = 15 DEG = 'EXMIN' FOR VEL >= NBL ''PENFLG' = 2 MEANS COMPLETE PEN (FOR PROJ DAMAGE LOGIC); 'PENFLG' = 1 MEANS HOLING ONLY; ' & 'PENFLG' = 0 MEANS NO LARGE HOLE BLPLUSEX: 'INIT VARIABLES N1$ = "": N2$ = "": N3$ = "": N4$ = "": H1$ = "": H2$ = "": H3$ = "": H4$ = "" PENFLG = 2: VRAT = 0: OB45 = 0: OB45CALC = 0 VHDAM = 0: VLDAM = 0: 'INIT DAMAGE LIMITS 'VHDAM' & 'VLDAM' USED IN 'EX' LOGIC CRVFLAG = 0 IF ((CURV = 1) AND (OB > 45!) AND (SHATRES < 2)) THEN CRVFLAG = 1: 'CURVED-PLATE RULE CAN APPLY EXMIN = 15!: IF (OB <= 15!) THEN EXMIN = OB: 'UNSHATRD PROJ CRTGD = 0: 'DEFAULT 'CRITAGL'/'NSDAMAGL' COMBINED TEST FLAG IS SET TO FAILURE VSCHECK = 0: 'FOR DEFORMING BRITISH PROJECTILES '* IF ((SHAT = 1) AND (HARD <> 2) AND (VS >= VHSHAT)) THEN EXMIN = 0 'SHATR HAS NO 'EXMIN' ABOVE HBL (EXCEPT IF UNCAPPED JAP TYPE 91 AP 'VS' < SHATRD HBL) MAXDFDEG = OB - EXMIN: IF (MAXDFDEG > 45!) THEN MAXDFDEG = 45! 'FORMULA DOES NOT WORK FOR (OB - EXMIN)>45 DEG WITH FH ARMOR, SO EXTRA LOGIC RQD MAXDF = MAXDFDEG / 57.29578: SNCSMAX = SIN(MAXDF) * COS(MAXDF): 'MAX CHANGE IN DIRECTION FUNCTION '* '**SELECT ALL LIMIT VEL THAT APPLY TO IMPACT ('!' IS FOR PEN & '#' IS FOR POST-IMPACT EFFECTS)** '* IF ((SHAT = 0) OR ((SHAT = 1) AND (HARD = 2))) THEN 'NO SHATR OR SHATR W/HARD AP CAP (ONLY USED FOR JAP UNCAPPED TYPE 91 PROJ ('HARD'=1 & 'SHAT'=1)). ' JAP CAP-HEAD DOES NOT STOP SHATR, BUT DOES ALLOW PROJ TO USE UNSHATRD HBL LOGIC. 'IF NO PEN-LIMITING DAMAGE, USE BEST-POSSIBLE NBL. IF (SHAT = 1) THEN 'SHATR OF JAP UNCAPPED TYPE 91 AP ONLY VLMT = VLSHAT: VLDAM = VLSHAT: N2$ = "-!#-" 'SHATR OF HARD-CAPPED PROJ VHOL = VHTRU: VHDAM = VHTRU: H1$ = "-!#-" 'HOLING BL USES UNSHATRD VALUES IF (VHOL >= VHSHAT) THEN 'REGULAR HOLING BL LOGIC FOR HIGH OB APPLIES VHOL = VHSHAT: VHDAM = VHSHAT: H1$ = "": H2$ = "-!#-" END IF IF (VHSHAT = VHSHATMAX) THEN N2$ = "": N3$ = "-!#-" 'BEST POSSIBLE SHATR RESULT IF (H2$ = "-!#-") THEN H3$ = "-!#-" END IF ELSE 'NO SHATR 'IF 'VLTRU'>'VLND' ('PLIM'= OBCRIT)) THEN VSCHECK = 9999 'BRITISH NON-CARDONALD DEFORMABLE PROJ ALWAYS BREAKS ('OBCRIT=-1' IF NOT USED) ELSEIF ((CARDONALD = 1) AND (OB >= OBCRIT)) THEN VSCHECK = VSCRIT 'BRITISH CARDONALD PROJ BREAKS BELOW CRITICAL VEL ONLY ELSEIF ((BEND = 1) AND (OB < OBCRIT)) THEN VSCHECK = 0 'NO-OP FOR BRITISH DEFORMABLE PROJ AT BELOW CRITICAL OBLIQUITY ELSE VSCHECK = -1 'NO-OP FOR ALL OTHER PROJ END IF IF (VLTRU = VLND) THEN 'DAMAGE DOES NOT OCCUR OR DOES NOT CHANGE PENETRATION ABILITY VLMT = VLND: VLDAM = VLND: N1$ = "": N4$ = "-!#-" VHOL = VHND: VHDAM = VHND: H1$ = "": H4$ = "-!#-" ELSE VSCHKFLG = 0 IF ((VSCHECK = -1) AND (VLTRU > VLND) AND (VITRU >= 0) AND (VS >= VITRU)) THEN VSCHKFLG = 1 IF ((VSCHECK > 0) AND (VS >= VSCHECK)) THEN VSCHKFLG = 2 IF (VSCHECK = 0) THEN VSCHKFLG = 3 IF (VSCHKFLG <> 0) THEN 'NO DAMAGE OCCURRED, BUT WOULD IF BELOW EFFECTIVE BL VLDAM = VLND: N1$ = "-!-": N4$ = "-#-" VHDAM = VHND: H1$ = "-!-": H4$ = "-#-" END IF END IF 'IF OB <= 45 DEG, MAX (WORST-CASE DAMAGE) NOSE-FIRST HBL & NBL ARE SHATRD PROJ LIMITS. ' THIS CAN OCCUR WITH AN UNDAMAGED ('VLMT' = 'VLND') PROJ IF A 'NON-THICK' PLATE IS HIT. 'IF OB > 45 DEG, ONLY HBL RESTRICTED IF ((OB <= 45!) AND (BEND = 0)) THEN 'AT LOW OB WHERE NOSE-FIRST PEN OCCUR, 'VLSHATMAX' IS WORST POSSIBLE CASE FOR UNDAMAGED NBL ' IF VS= VLSHAT)) THEN 'NBL LID FOR UNDER 45 DEG VLMT = VLSHATMAX: VLDAM = VLSHATMAX N1$ = "": N2$ = "": N4$ = "": N3$ = "-!#-" VHOL = VHSHATMAX: VHDAM = VHSHATMAX H1$ = "": H2$ = "": H4$ = "": H3$ = "-!#-" ELSEIF ((N4$ = "-#-") AND (VLMT >= VLSHAT)) THEN 'DITTO VLMT = VLSHAT: VLDAM = VLSHATMAX N1$ = "": N4$ = "": N2$ = "-!-": N3$ = "-#-" VHOL = VHSHAT: VHDAM = VHSHATMAX H1$ = "": H4$ = "": H2$ = "-!-": H3$ = "-#-" ELSEIF (VLMT >= VLSHAT) THEN 'DITTO FOR 'VLTRU'<>'VLND' VLMT = VLSHAT: VLDAM = VLSHAT VHOL = VHSHAT: VHDAM = VHSHAT IF (N1$ = "-!#-") THEN 'LID IF IMPACT & POST-IMPACT DO NOT USE 'VLND' N1$ = "": N3$ = "": N4$ = "": N2$ = "-!#-" H1$ = "": H3$ = "": H4$ = "": H2$ = "-!#-" IF (VLSHAT = VLSHATMAX) THEN 'IF 'VLSHAT'='VLSHATMAX' BOTH RESULTS USE SAME VELOCITY N2$ = "": N3$ = "-!#-" H2$ = "": H3$ = "-!#-" END IF ELSE 'LID IF POST-IMPACT USES 'VLND' N1$ = "": N4$ = "": N2$ = "-!-": N3$ = "-#-" H1$ = "": H4$ = "": H2$ = "-!-": H3$ = "-#-" IF (VLSHAT = VLSHATMAX) THEN 'IF 'VLSHAT'='VLSHATMAX' BOTH RESULTS USE SAME VELOCITY N2$ = "": N3$ = "-!#-" H2$ = "": H3$ = "-!#-" END IF END IF ELSEIF (VHOL >= VHSHAT) THEN 'HBL LID FOR NON-BRITISH PROJ AT <45 DEG IF (VHDAM < VHOL) THEN IF (VHDAM > VHSHATMAX) THEN VHDAM = VHSHATMAX: XDAM = 1 ELSE XDAM = 2 END IF ELSE XDAM = 0 END IF IF ((N4$ = "-!#-") OR ((N4$ = "-#-") AND (VLSHAT = VLSHATMAX))) THEN VHOL = VHSHATMAX IF (XDAM = 2) THEN IF (N4$ = "-!#-") THEN H1$ = "": H2$ = "": H3$ = "-!-": H4$ = "-#-" END IF ELSE VHDAM = VHSHATMAX H1$ = "": H2$ = "": H4$ = "": H3$ = "-!#-" END IF ELSEIF (N4$ = "-#-") THEN VHOL = VHSHAT IF (XDAM < 2) THEN VHDAM = VHSHATMAX H1$ = "": H4$ = "": H2$ = "-!-": H3$ = "-#-" END IF ELSE 'DITTO FOR 'VLTRU'<>'VLND' VHOL = VHSHAT: VHDAM = VHSHAT IF (H1$ = "-!#-") THEN 'LID IF IMPACT & POST-IMPACT DO NOT USE 'VLND' H1$ = "": H3$ = "": H4$ = "": H2$ = "-!#-" IF (VHSHAT = VHSHATMAX) THEN H2$ = "": H3$ = "-!#-" END IF ELSE 'LID IF POST-IMPACT USES 'VLND' H1$ = "": H4$ = "": H2$ = "-!-": H3$ = "-#-" IF (VHSHAT = VHSHATMAX) THEN H2$ = "": H3$ = "-!#-" END IF END IF END IF END IF ELSE 'HBL LID FOR ALL PROJ (INCLUDING BRITISH DEFORMABLE PROJ) AT ALL OB IF (VHOL >= VHSHAT) THEN IF (VHDAM < VHOL) THEN IF (VHDAM > VHSHATMAX) THEN VHDAM = VHSHATMAX: XDAM = 1 ELSE XDAM = 2 END IF ELSE XDAM = 0 END IF IF ((H4$ = "-!#-") OR ((H4$ = "-#-") AND (VLSHAT = VLSHATMAX))) THEN VHOL = VHSHATMAX IF (XDAM = 2) THEN H1$ = "": H2$ = "": H3$ = "-!-": H4$ = "-#-" ELSE VHDAM = VHSHATMAX H1$ = "": H2$ = "": H4$ = "": H3$ = "-!#-" END IF ELSEIF (H4$ = "-#-") THEN VHOL = VHSHAT IF (XDAM < 2) THEN VHDAM = VHSHATMAX H1$ = "": H4$ = "": H2$ = "-!-": H3$ = "-#-" END IF ELSE 'DITTO FOR 'VLTRU'<>'VLND' VHOL = VHSHAT: VHDAM = VHSHAT IF (H1$ = "-!#-") THEN 'LID IF IMPACT & POST-IMPACT DO NOT USE 'VLND' H1$ = "": H3$ = "": H4$ = "": H2$ = "-!#-" IF (VHSHAT = VHSHATMAX) THEN H2$ = "": H3$ = "-!#-" END IF ELSEIF (H1$ = "-!-") THEN 'LID IF POST-IMPACT USES 'VLND' H1$ = "": H4$ = "": H2$ = "-!-": H3$ = "-#-" IF (VHSHAT = VHSHATMAX) THEN H2$ = "": H3$ = "-!#-" END IF END IF END IF END IF END IF END IF ELSE '*NORMAL SHATR 'NOSE-ONLY SHATTER OCCURS WHEN CURVE-PLATE RULE OR SOFT AP CAP USED AGAINST SOFTSHAT PLATE ''EX' VEL RATIO FORMULA USED IF VEL>='VHSHAT' IF SHATR W/O SPECIAL JAP CAP-HEAD EFFECTS VLMT = VLSHAT: VLDAM = VLSHAT: N2$ = "-!#-" VHOL = VHSHAT: VHDAM = VHSHAT: H2$ = "-!#-" IF (VHSHAT = VHSHATMAX) THEN 'BEST POSSIBLE SHATR RESULT N2$ = "": N3$ = "-!#-" H2$ = "": H3$ = "-!#-" END IF IF ((VS >= VHOL) AND (VS < VLMT)) THEN PENFLG = 1 'PARTIAL SHATRD PEN IF 'PENFLG' = 1 END IF '* ' *FINAL 'PENFLG' & 'EX' CALC LOGIC* '* 'IF NO SHATR, 'EX' LINEARLY INCREASES FROM 0 TO 'EXMIN' AS VEL INCREASES FROM HBL TO NBL. 'ALWAYS USE DESIGNATED LIMITS FOR THAT POST-IMPACT PROJ DAMAGE LEVEL. '* 'IF VEL 2) AND (VS >= VHSHAT)) THEN VRATMIN = VHOL: ' SHATR REPLACEMENT VALUE IF (VS < VHOL) THEN VRAT = -1: PENFLG = 0: EX = -1: EXRAD = -1: OBDF = -1 'MUST ALWAYS SET 'OB45' FOR REVERSE 'EX' CALC IN EFFCTV PROJ LIMIT LOGIC IF ((OB - EXMIN) > 45!) THEN OB45 = ((OB - EXMIN) - 45!) / 45! ''OB45' = FRACTION OF (OB-EXMIN)>45 DEG ELSE OB45 = 0 'DEFAULT (<=45 DEG) VALUE RESTORED END IF RTNNOW = 1: 'FINISHED HERE END IF IF (RTNNOW = 1) THEN RTNNOW = 0: RETURN '* 'VEL RATIO STARTS WHEN VEL='VLMT' IF NO SHATR OR IF HARD-CAPPED SHATR. ' IF REGULAR SHTR, THEN VEL='VHOL' IF ((SHAT = 0) OR ((SHAT = 1) AND (HARD = 2))) THEN 'UNCAPPED JAP TYPE 91 AP W/'VS'<=VHSHAT' ACTS LIKE UNSHATRD PROJ IF ((VS >= VHOL) AND (VS < VLMT)) THEN 'BETWEEN HBL & NBL & NO SHATR EXNBL = EXMIN: PENFLG = 1 EX = EXMIN * (VS - VHOL) / (VLMT - VHOL) 'LINEAR INCREASE IN 'EX' 'MUST ALWAYS SET 'OB45' FOR REVERSE 'EX' CALC IN EFFCTV PROJ LIMIT LOGIC IF ((OB - EXMIN) > 45!) THEN OB45 = ((OB - EXMIN) - 45!) / 45! ''OB45'=FRACTION OF (OB-EXMIN)>45 DEG ELSE OB45 = 0 'DEFAULT (=<45 DEG) VALUE RESTORED END IF GOTO EXFINISH: 'SET RADIANS & FINAL DEFLECTION ANGLE END IF ELSE 'BETWEEN HBL & NBL W/SHATR IF ((VS >= VHSHAT) AND (VS < VLSHAT)) THEN PENFLG = 1 END IF '* 'NO SHTR COMPLETE PEN OR SHTR HOLING LOGIC IF ((SHAT = 1) OR (OB > 15!)) THEN ''EX' VEL RATIO FORMULA 'FOR COMPLETE PEN AT OB > 15 DEG W/O SHATR OR ALL HITS AT VEL >= HBL W/SHATR ''EX' -> OB (DEFLECTION = OB - 'EX' = 'OBDF' -> 0) AS VEL INCREASES ' (ASSUMES PROJ DAMAGE HELD CONSTANT) IN A CONTINOUSLY-SLOWING (ASYMPTOTIC) RATE. ''OBDF' IS FOUND BY SOLVING: ' (SEE DEFINITIONS ABOVE & BELOW) ' SIN(OBDF)*COS(OBDF) = SNCSMAX/[VRAT^2 + VRAT*SQR(VRAT^2 - 1)] 'IF (OB-EXMIN)>45 DEG THEN ADD FRACTION OF (OB-EXMIN)>45 DEG TO 'OBDF' IF (OB <= .005) THEN EX = 0: EXNBL = 0: 'PREVENT DIVIDE-BY-ZERO ERROR FOR SHTR ONLY ELSE VRATVEL = VS ' GOSUB DEFLECTION ' OB45 = OB45CALC 'ACTUAL 'EX' (ALWAYS>='EXMIN') EX = OB - TMPOBDF ''EX' AT NBL FOR 'VR' CALC ONLY IF (SHAT = 1) THEN VRATVEL = VLSHAT ' GOSUB DEFLECTION ' EXNBL = OB - TMPOBDF: ''EX' AT NBL W/SHATR ELSE EXNBL = EXMIN: ''EX' AT NBL W/O SHATR END IF END IF ELSE 'IF NO SHATR & OB<=15 DEG, THEN NO DEFLECTION IF VEL>=NBL EX = OB: EXNBL = OB END IF EXFINISH: EXRAD = EX / 57.29578: OBDF = OB - EX: 'RADIANS FOR CALC & DEFLECTION ANGLE RETURN ' 'CALCULATE 'EX' FROM 'OB' & 'VS' (STARTS AT 'EXMIN'; BELOW 'EXMIN' LINEAR INCREASE IN 'EX') 'FORMULA ALWAYS CALCULATES 'TMPOBDF' <= 45 DEG ("MIRROR IMAGE" IF (OB - EXMIN) > 45 DEG), ' SO SPECIAL LOGIC NEEDED DEFLECTION: '* CALL DEFLECCALC '* RETURN ' '* 'TYPICAL' PROJ NOSE & BODY DAMAGE LOGIC * DAMAGECALC: 'INIT VARIABLES CRVRL = 0: BDYDM = 0: BRK = 0: NSBRK = 0 OBRK = 40: IF (CMPND = 1) THEN OBRK = 50 'COMPOUND ARMOR IS WEAKER SO ITS PROJ BREAK ANGLE IS 10 DEG HIGHER IF ((PENFLG = 1) AND (CRVFLAG = 1)) THEN CRVRL = 1: 'SET CURVED-PLATE RULE IN FORCE FLAGS '* 'SHATRD PROJ DAMAGE LOGIC IF (SHAT = 1) THEN ' CALL SHATRDAM '* ELSE '* 'BEGIN UNSHATRD PROJ LOGIC ' 'UNSHATRD PROJ COMPLETE PEN NOSE & BODY DAM LOGIC '* '*NOSE DAMAGE CRITICAL OB MOD CALC* '* 'MODIFY 'NDAP' CRITIAL OB THRESHOLD FOR NOSE DAMAGE ' CALL NOSEDAM ' 'ONLY COMPUTE NOSE DAMAGE USING CRIT NOSE (OB-EX) LOGIC IF VEL>=HBL ('PENFLG'>0), ' WHICH RELIEVES FORCE ON NOSE DUE TO INITIAL IMPACT, BUT ADDS TO TWISTING FORCES ON NOSE ' IF (PENFLG < 2) THEN ' ' ''NSBRK' INCOMPLETE PEN FLAG LOGIC (SEE SUBROUTINE FOR DETAILS) ' CALL NOSEBROKE ' ELSE ' '** COMPLETE PENETRATION ** ' '* NOSE DAMAGE CRIT OB CALC FOR COMPLETE PEN * IF ((OB - EX) > NDAP) THEN NSBRK = 3 'FLAG SET TO PRINT "PROJ NOSE BROKEN" MESSAGE ' ELSEIF (((ARMOR = 3) OR (ARMOR = 4)) AND (BEND = 2)) THEN '*HARVEY ARMOR VERSUS TOUGH 1895-1910 MIDVALE PROJ* NSBRK = 8 'NOSE DEFORMED RATHER THAN BROKEN IF NO OTHER DAMAGE END IF END IF END IF '* IF (VITRU = -1) THEN 'LOWER BODY DAMAGE OCCURS USING CRITICAL ANGLE FORMULA TO U.S. WWII STANDARD-TYPE PROJ ' IF VEL >= HBL & CURVED-PLATE RULE IS NOT IN FORCE 'ONLY APPLY LOWER BODY TEST IF NOSE IS BROKEN OR COMPLETE PENETRATION OCCURRED ' (LOWER BODY HITS PLATE, TOO) ' CALL DOCRTGOOD ' 'DO BRITISH DEFORMABLE PROJ BREAKAGE LOGIC '* CALL BENDLOGIC '* ELSE IF ((VS < VITRU) AND (BRK = 0) AND (PENFLG = 2)) THEN BRK = 3 ' BREAK PROJ IF REGULAR BREAK LOGIC APPLIES & PROJ HITS AT TOO LOW A VEL END IF '* IF ((PENFLG < 2) AND (BRK = 0)) THEN 'RICOCHET & HOLING-ONLY PEN LOGIC (SKIP IF COMPLETE PEN) W/O CURVED-PLATE RULE, ' FOR STEEL PROJ THAT ALWAYS BREAK AT VEL 0) AND ((CMPND = 0) OR ((CMPND = 1) AND (SHTRSFLG = 1)))) THEN BRK = 5 'ALL PROJ INEFFECTIVE AT OB>40 (>50 IF COMPOUND ARMOR) DEG IF VEL OBRK) AND ((PENFLG = 0) OR (SHATRES > 0))) THEN BRK = 6 'MAX EFFECTIVE OB RULE ELSEIF (VITRU > VLMT) THEN BRK = 3 'BREAK PROJ IF PLATE HIT AT OR UNDER 'VITRU'>=0 WHEN 'VITRU'>NBL (IS BEING USED) END IF END IF ' GOOD PROJ DO NOT BREAK IF THEY HOLE, BUT NOT COMPLETELY PEN, A CURVED PLATE ' OR IF SOFT AP CAP VS A 'SOFTSHAT'>0 OR HOOD VS A 'SOFTSHAT'=0 PLATE ' OR UNDER MIN FULL SHATR VEL FOR STEEL ARMOR IF (NSSHAT = 2) THEN BRK = 0 ' LOW VELOCITY NOSE-ONLY SHATTER ELSEIF ((CRVRL = 1) AND (BRAIK = 0)) THEN 'STILL SHATRD PROJ BRK = 0 NSSHAT = 3 'ONLY NOSE BREAKS IF SHATR WITH CURVED-PLATE RULE ELSEIF (((NSSHAT = 1) OR (NSSHAT = 4)) AND (VS >= VLMT)) THEN BRK = 0 'HOOD OR SOFT CAP NOSE-ONLY SHTR RULE END IF '* IF (BRK > 0) THEN IF (SHATRES = 2) THEN IF (NSBRK = 0) THEN NSBRK = 1 'SET IF NOT ALREADY SET BDYDM = 2 'IF CHILLED CAST IRON PROJ LOWER BODY BREAKS, ALL OF IT BREAKS. ELSE IF (BDYDM = 0) THEN BDYDM = 1 'BODY RENDERED INEFFECTIVE. HOWEVER, DAMAGE SOMETIMES MIGHT NOT EFFECT FURTHER PEN. END IF END IF '* RETURN 'END OF PROJ NOSE & BODY DAM LOGIC ' PLUGWTS: '** CALC EJECTED ARMOR PLUG WEIGHTS ** '* CALL PLUGCALC '* RETURN ' '** COMPUTE FINAL PEN RESULTS ** 'WHEN ANY U.S.-STANDARD-TYPE PROJ COMPLETELY PEN, THEY ALWAYS ARE ASSUMED TO BE ABOVE ' THE 'QE'-CALCULATED EFFECTIVE LIMIT (NO MAJOR BODY DAMAGE) 'THE DAMAGE COMPUTATIONS FOR U.S.-STANDARD-TYPE PROJ (CRITICAL BODY & NOSE DAMAGE) DON'T MODIFY ' PEN INTO PLATE CAUSING DAMAGE, SO ANY COMPLETE PEN IS ASSUMED, AS W/'QE'-USING PROJ WHEN ' VEL>='VITRU', TO BE "PERFECT" HERE. 'THESE FORMULAE DETERMINE WHETHER PEN IS ACHIEVED, WHAT KIND OF PEN, POST-IMPACT CONDITION OF PROJ, ' & ITS REMAINING (EXIT) VEL IF IT (OR PIECES OF IT) PASS THRU PLATE. 'ALWAYS USE 'VHDAM' & 'VLDAM' FOR THESE COMPUTATIONS, SINCE ABOVE EFFECTIVE LIMIT, ENERGY LOST ' DURING PEN IS REDUCED FINALRESULTS: '* IF (VS < VHOL) THEN 'NEXT LINES GIVE EFFECTS IF NO HOLE MADE COMPLETELY THRU PLATE ''PENTP=0' MEANS THAT ONLY SHOCK EFFECTS OCCUR BEHIND PLATE UNLESS NEXT LINE ' MODIFIES THIS TO 'PENTP = 1' FOR SPLINTERS BEING KNOCKED FROM PLATE BACK '* '*NO PEN THRU PLATE ACHIEVED (EXCEPT FOR SMALL POSSIBLE BACK-SPALLING & A SMALL HOLE IF SHATR NEAR HBL)* '* PENTP = 0 IF ((BKEFF <= 0) AND (CART > 0)) THEN PENTP = 1: 'NO BIG HOLE BUT BRITTLE PLATE SPRAYS FRAGMENTS UNLESS BACKING MATERIALS STOP THEM END IF TOTPLUGWT = 0: NORMPLUGWT = 0: DELTAPLUGWT = 0: VR = -1: VNPLUG = -1 VDPLUG = -1: EX = -1: EXRAD = -1: OBDF = -1: HF = -1: VRPR = -1 RETURN END IF '* '*SOME FORM OF PEN ENTIRELY THRU PLATE ACHIEVED (VEL>=HBL)* '* 'FACE IS CRACKED THRU AT A VEL<'VHOL', THEN SLOWS PROJ DOWN BY CONSERVATION OF MOMENTUM, ' THEN ADDS ITSELF TO PROJ NOSE DURING PUSHING OUT OF NORMAL PLUG THRU BACK LAYER. ' ONCE PUNCHED OUT, BACK LAYER NOW ALSO ADDS TO PROJ NOSE TO FORM NORMAL PLUG & ENTIRE MASS IS SLOWED ' TO A STOP IF VEL<=HBL (AT HIGH OBLIQUITY, PROJECTILE WILL RICOCHET AT AN ANGLE AS ITS SIDEWAYS ' VELOCITY PORTION IS NOT REDUCED). AT HIGHER VEL, NORMAL PLUG KEEPS GOING AFTER PROJ SLOWS DOWN TO ' A STOP OR RICOCHETS IF VEL 0) THEN BFRACT = .5 'HALF OF BROKEN PROJ ASSUMED TO PEN BETWEEN HBL & NBL IF PARTIAL PEN SET ' ('PENTP'=5 @ 'OB'<45 DEG OR 'PENTP'=4 OTHERWISE) ELSEIF (NSBRK > 0) THEN BFRACT = .667 'ONLY 1/3 OF PROJ PIECES (OF NOSE) PEN BETWEEN HBL & NBL IF PROJ NOSE BREAKS OR SHATTERS ' ('PENTP'=3 @ 'OB'<45 DEG) ELSE BFRACT = 1 'IF NO NOSE DAMAGE & NO BODY BREAKAGE, ENTIRE PROJ (MINUS AP CAP & WINDSCREEN) PEN AT NBL ONLY END IF '* ''VRSHATNS' = VEL OF PENETRATING BROKEN-UP NOSE PIECES AT LOW OB OR BROKEN-UP LOWER BODY PIECES ' AT HIGH OB BETWEEN HBL & NBL VRSHATNS = V2 * SQR(WB / (WB + (1 - BFRACT) * DELTAPLUGWT)): 'BOTH EQUAL IF NO DELTAPLUG '* IF (VS < VLMT) THEN VRPR = -1 'REMAINING VEL 'VRPR' NOT DEFINED BELOW NBL ELSE IF (SHAT = 1) THEN VDFCALC = SHATVDFPR: ELSE VDFCALC = VDFUSEDPR 'PROJ REMAINING VEL CALC ABOVE NBL ONLY ''VRPR' = PROJ REMAINING VEL (BASE PIECES ONLY IF SHATR) FOR VS>=NBL (NOT DEFINED IF VS VHOL) OR (NOTEFLAG = 3) OR (BRAIK > 0))) THEN BRK = 10: BDYDM = 1 END IF '* '*SET UP FOR PROJ, PLATE, & IMPACT DATA & DESCRIPTION OF RESULTS* '* ' **** BEGIN 1ST DISPLAY **** '* 'PRINT WHAT HAPPENED TO PLATE AND PROJECTILE '* CALL PENPRINT(PENTP) '* CALL NSBDYDAMPRNT '* TAPRNT = INT(100 * TA + .5) / 100: TEFFPRNT = INT(100 * TEFF + .5) / 100 PRINT "Plate Type ="; ARMOR PRINT "Plate Thickness, inches: Actual ="; TAPRNT; "& Effective ('Q'+backing) ="; TEFFPRNT PRINT "Backing Thickness, inches: "; IF ((WD = 0) AND (CMT = 0) AND (MTLBACK = 0)) THEN PRINT "NONE USED." ELSE IF (WD > 0) THEN PRINT "WOOD ="; 100 * WD; : AMPER$ = "& " IF (CMT > 0) THEN PRINT "CEMENT ="; 25 * CMT; : AMPER$ = "& " IF (MTLBACK = 0) THEN PRINT : 'NO METAL BACK SUPPORT PLATES ELSE S$ = "": IF (NBK > 1) THEN S$ = "s" PLTNMBR$ = LTRIM$(STR$(NBK)) MTLPRNT$ = " (" + PLTNMBR$ + " plate" + S$ + ")" PRINT AMPER$; "METAL ="; MTLBACK; MTLPRNT$ SELECT CASE BTP CASE 1 BCKPRNT$ = BKPRT1$ CASE 2 BCKPRNT$ = BKPRT2$ CASE 3 BCKPRNT$ = BKPRT3$ CASE 4 BCKPRNT$ = BKPRT4$ CASE 5 BCKPRNT$ = BKPRT5$ END SELECT PRINT "*TYPE: "; BCKPRNT$ END IF END IF '* 'PRINT PROJ IMPACT CONDITIONS & EXIT ANGLE '* CALL IMPACTPRNT '* IF (PENFLG >= 2) THEN '* ' PRINT DAMAGE EFFECTS ON POST-IMPACT PROJ MOTION '* CALL PROJMOTIONPRNT '* END IF '* NPWPRNT = INT(10 * NORMPLUGWT + .5) / 10: DPWPRNT = INT(10 * DELTAPLUGWT + .5) / 10 IF (NORMPLUGWT <= .05) THEN NOPLG$ = "No plugs ejected from plate.": PRINT NOPLG$ ELSE PRINT "Plug Weights, pounds: Normal ="; NPWPRNT; "& Delta ="; DPWPRNT END IF '* 'PRINT MSG ABOUT SPLINTERS THROWN FROM PLATE BACK BELOW HBL '* CALL SPLNTRPRNT '* IF (NORMPLUGWT > .05) THEN PRINT "Normal Plug Velocity ="; VNPLUG; "ft/sec" '* IF (BDYDM > 0) THEN TWOVEL$ = "IF PROJECTILE BODY BREAKS, ASSUME 50% OF BODY WEIGHT IN UPPER AND LOWER HALVES." PRINT TWOVEL$ END IF '* 'PROJ REMAINING VELOCITY PRINTOUT '* CALL REMVELPRNT '* ' **** END OF 1ST DISPLAY **** '* CALC$ = "CALCULATED HOLING, NAVY, AND EFFECTIVE BALLISTIC LIMITS" PRINT "DISPLAY "; CALC$; "? (Y/N) "; GOSUB CHKYESNO: PRINT YS$ '* ' **** DISPLAY SECOND PAGE WITH B.L. DETAILS IF SELECTED BY USER **** '* IF (YS = 1) THEN 'PRINT BALLISTIC LIMITS ONLY IF 'YS$' = 'Y' TO LAST QUESTION ABOVE '* CALL SCPGPRNT '* ' **** DONE WITH OPTIONAL 2ND SCREEN DISPLAY **** END IF RETURN ' '* MIN EFFECT PEN VEL USING 'CRTAPR' LOGIC * APCRITICALV: THVAL = CRTAPR VLEXREV = VLMT: VHEXREV = VHOL ' GOSUB THRESHOLDVEL ' CRITVEL = THSPD RETURN ' '* MIN NO NOSE DAMAGE VEL * NSCRITICALV: THVAL = NDAP VLEXREV = VLMT: VHEXREV = VHOL ' GOSUB THRESHOLDVEL ' NSV = THSPD 'ITS NOSE BREAKS IF VEL < HBL ('BRAAK'>0) IF (NSTEST = 1) THEN IF (VHOL >= NSV) THEN NSTESTV = VHOL: ELSE NSTESTV = NSV: ' MIN EFF VEL TEST ELSE IF (VHOL >= NSV) THEN NSVEL = VHOL: ELSE NSVEL = NSV: 'LIGHTCASE PROJ TEST END IF RETURN ' '*MIN (THRESHOLD) EFFECTIVE PROJ VEL CALC LOGIC (ALL 'CRTAPR' & FOR LIGHTCASE PROJ 'NDAP')* THRESHOLDVEL: ' CALL THRESHOLDCALC ' RETURN ' '* MAX PRINTOUT VEL LOGIC * FOURKCHK: FTSC$ = " ft/sec" IF (VEL > 4000) THEN VEL$ = ">4000 ft/sec" ELSE VEL1$ = STR$(VEL): VEL$ = VEL1$ + FTSC$ END IF RETURN ' '* ALLOW USER TO CHANGE PLATE DATA CHANGEARMOR: PRINT PRINT "Do you want to modify armor plate's parameters? (Y/N) "; GOSUB CHKYESNO: PRINT YS$ IF (YS = 1) THEN 'YES, DISPLAY CURRENT AND ORIGINAL PARAMETERS '* CALL NUMVALHDR CALL SHOWORIGARMR '* PRINT "Restore all original armor values? (Y/N) "; GOSUB CHKYESNO: PRINT YS$ IF (YS = 1) THEN 'YES, RESTORE ARMOR'S DEFAULT TABLE VALUES '* CALL ARMORINFO(ARMOR) '* UBMAN = 0: UBSV = UB: QSV = Q: QDAMSV = QDAM: CARTWLSV = CARTWL CMPNDSV = CMPND: THNCHLSV = THNCHL: SOFTSHATSV = SOFTSHAT THKTHNSV = THKTHN END IF PRINT "Change any armor values? (Y/N) "; GOSUB CHKYESNO: PRINT YS$ PRINT IF (YS = 1) THEN 'YES PRINT "EFFECT OF 'UB' VALUE ONLY CHANGES WHEN 'UB' > 30, 52, 62, 67.5, 75, OR 90." PRINT "MINIMUM 'Q' & 'QDAM' IS 0.1 AND MAXIMUM 'QDAM' IS 'Q' (USUAL VALUE)." PRINT PRINT "UB: "; : OLDVALUE = UB: FLAG = 0: GOSUB NEWARMOR: UBTEMP = NEWVALUE IF ((ARMOR = 1) OR (ARMOR = 3) OR (ARMOR = 4) OR (ARMOR = 12)) THEN IF (UBCALC <> UBTEMP) THEN PRINT " *** GRUSON/HARVEY/TC ARMORS: Manual Value used for UB (Rounded to Integer)" UBMAN = NEWVALUE UB = UBMAN ELSE PRINT " *** GRUSON/HARVEY/TC ARMORS: Calculated Value used for UB" UBMAN = 0 UB = UBCALC END IF ELSE UB = UBTEMP: UBMAN = 0 END IF UBTEMP = 0 IF (UB > 75) THEN THNCHL = 1 ELSE THNCHL = 0 PRINT "Q: "; : OLDVALUE = Q: FLAG = 2: GOSUB NEWARMOR: Q = NEWVALUE PRINT "QDAM: "; : OLDVALUE = QDAM: FLAG = 3: GOSUB NEWARMOR: QDAM = NEWVALUE PRINT "CARTWL: "; : OLDVALUE = CARTWL: FLAG = 4: GOSUB NEWARMOR: CARTWL = NEWVALUE PRINT "CMPND: "; : OLDVALUE = CMPND: FLAG = 1: GOSUB NEWARMOR: CMPND = NEWVALUE PRINT "THNCHL: "; : OLDVALUE = THNCHL: FLAG = 1: GOSUB NEWARMOR: THNCHL = NEWVALUE PRINT "SOFTSHAT: "; : OLDVALUE = SOFTSHAT: FLAG = 4: GOSUB NEWARMOR: SOFTSHAT = NEWVALUE PRINT "THKTHN: "; : OLDVALUE = THKTHN: FLAG = 4: GOSUB NEWARMOR: THKTHN = NEWVALUE PRINT END IF ELSE PRINT : 'NO CHANGES IF (UBMAN > 0) THEN UB = UBMAN: UBSV = UBMAN IF (UB > 75) THEN THNCHL = 1 ELSE THNCHL = 0 END IF RETURN ' '* CHANGE SELECTED ARMOR DATA NEWARMOR: ' CALL SETVALUE ' RETURN ' '* PROJ TYPE ENTRY HEADER * SELPROJHDR: CLS : PRINT : PRINT "SELECT SPECIFIC PROJECTILE TYPE:" RETURN ' '* PERFORM YES/NO ANSWER LOGIC * CHKYESNO: ' CALL YESNO ' RETURN ' '* PROJ SELECTION LOGIC * SELECTPROJ: IF (PROJ > 0) THEN PRINT "CURRENT PROJECTILE SELECTION ="; PROJ; "-- "; OLDSEL = PROJ: GOSUB SELECTION: PROJ = SEL RETURN ' '* GENERAL-PURPOSE SELECTION LOGIC * SELECTION: 'SELECTION IS WHOLE NUMBER>=1 & <=MAXIMUM VALUE ALLOWED ('MX') INPUT "SELECTION"; SL$ IF ((SL$ = "") AND (OLDSEL > 0)) THEN SEL = OLDSEL: PRINT "Using"; OLDSEL ELSE SEL = VAL(SL$) END IF IF ((SEL < 1) OR (SEL > MX) OR (SEL <> INT(SEL))) THEN GOTO SELECTION: 'BAD INPUT RETURN ' '* SELECT PROJ TYPE BY NATION * ' '** U.S. SELUS: GOSUB SELPROJHDR CALL USPROJ MX = 20: GOSUB SELECTPROJ 'GET DATA CALL ALLPROJDATA(NATION, PROJ) RETURN ' '** BRITAIN SELBRIT: GOSUB SELPROJHDR CALL BRITAINPROJ MX = 17: GOSUB SELECTPROJ 'GET DATA CALL ALLPROJDATA(NATION, PROJ) RETURN ' '** GERMANY SELGERM: GOSUB SELPROJHDR CALL GERMANYPROJ MX = 15: GOSUB SELECTPROJ 'GET DATA CALL ALLPROJDATA(NATION, PROJ) RETURN ' '** FRANCE SELFR: GOSUB SELPROJHDR CALL FRANCEPROJ MX = 9: GOSUB SELECTPROJ 'GET DATA CALL ALLPROJDATA(NATION, PROJ) RETURN ' '** ITALY SELIT: GOSUB SELPROJHDR CALL ITALYPROJ MX = 12: GOSUB SELECTPROJ 'GET DATA CALL ALLPROJDATA(NATION, PROJ) RETURN ' '** JAPAN SELJAP: GOSUB SELPROJHDR CALL JAPANPROJ MX = 10: GOSUB SELECTPROJ 'GET DATA CALL ALLPROJDATA(NATION, PROJ) RETURN ' '** AUSTRO-HUNGARY SELAH: GOSUB SELPROJHDR CALL AUSTHUNGPROJ MX = 8: GOSUB SELECTPROJ 'GET DATA CALL ALLPROJDATA(NATION, PROJ) RETURN ' '** RUSSIA SELRU: GOSUB SELPROJHDR CALL RUSSIAPROJ MX = 8: GOSUB SELECTPROJ 'GET DATA CALL ALLPROJDATA(NATION, PROJ) RETURN ' HARDCOPY: '* OUTPUT ALL RESULTS TO PRINTER * ' '* BEGIN 1ST PAGE (PROJ/PLATE/RESULTS) * ' GOSUB LPARMOR: 'PRINT ARMOR TYPE 'PRINT PROJ NATION & TYPE LPRINT SELECT CASE NATION CASE 1 CALL LPUS(PROJ) CASE 2 CALL LPBRITISH(PROJ) CASE 3 CALL LPGERMAN(PROJ) CASE 4 CALL LPFRENCH(PROJ) CASE 5 CALL LPITALIAN(PROJ) CASE 6 CALL LPJAPANESE(PROJ) CASE 7 CALL LPAUSTHUNG(PROJ) CASE 8 CALL LPRUSSIAN(PROJ) END SELECT '* LPRINT LPRINT SPC(26); "SPECIFIC IMPACT CONDITIONS:" LPRINT "Plate Thickness, inches: Actual ="; TAPRNT; LPRINT "& Effective ('Q'+backing) ="; TEFFPRNT LPRINT "Backing Thickness, inches: "; IF ((WD <> 0) OR (CMT <> 0) OR (MTLBACK <> 0)) THEN IF (WD > 0) THEN LPRINT "WOOD ="; WDTRU; IF (CMT <> 0) OR (MTLBACK <> 0) THEN LPRINT "-- "; : ELSE LPRINT END IF IF (CMT > 0) THEN LPRINT "CEMENT ="; CMTTRU; IF (MTLBACK <> 0) THEN LPRINT "-- "; : ELSE LPRINT END IF IF (MTLBACK <> 0) THEN LPRINT "METAL ="; MTLBACK; MTLPRNT$ LPRINT "*TYPE: "; BCKPRNT$ END IF ELSE LPRINT "NONE USED." END IF '* ' PRINT 'D', 'VS', & 'OB' TO PRINTER '* CALL LPPROJIMPACT '* LPRINT REMV$ '* LPRINT "Projectile Weights, pounds: Original="; WTSVPRNT; LPRINT "*Impact="; WTPRNT; "*Body="; WBPRNT '* LPRINT SPC(30); "POST-IMPACT RESULTS:" LPRINT PEN1$: LPRINT PEN2$ IF (PEN3$ <> "") THEN LPRINT PEN3$ '* ' PRINT TO PRINTER NOSE & BODY DAMAGE INFO '* CALL LPDAMAGE '* IF (EX >= 0) THEN LPRINT "Projectile Exit Angle ="; EXPRNT; "degrees" ELSE LPRINT "Projectile Exit Angle NOT DEFINED." END IF '* IF (PENFLG >= 2) THEN LPRINT "Projectile "; WBL1$; WBL2$; WBL3$; WBL4$ '* IF (NOPLG$ = "") THEN LPRINT "Plug Weights, pounds: Normal ="; NPWPRNT; "& Delta ="; DPWPRNT ELSE LPRINT NOPLG$: 'NO PLUG THROWN END IF '* IF (FLAKE$ <> "") THEN LPRINT FLAKE$ '* IF (NORMPLUGWT > .05) THEN LPRINT "Normal Plug Velocity ="; VNPLUG; "ft/sec" '* IF (TWOVEL$ <> "") THEN LPRINT TWOVEL$ '* IF (RVU$ = "") THEN 'PARTIAL OR COMPLETE PEN OCCURRED IF (BSNS1$ <> "") THEN LPRINT REMVEL$; BSNS1$; DPLG$; IF (VDPLUG >= 25) THEN LPRINT "="; VDPLUG; "ft/sec" ELSE LPRINT "ARE VERY SLOW" END IF END IF IF (BSNS2$ <> "") THEN LPRINT REMVEL$; BSNS2$; IF (VR >= 25) THEN LPRINT "="; VR; "ft/sec" ELSE LPRINT "ARE VERY SLOW" END IF END IF IF (ONEPC$ <> "") THEN 'UNSHATRD PROJ, BUT INCLUDING JAP UNCAPPED TYPE 91 AP W/'VS'<'VHSHAT' & 'VS'>'VHOL' IF (PENFLG = 2) THEN LPRINT ONEPC$; DPLG$; IF (DPLG$ = "") THEN LPRINT "has"; : ELSE LPRINT "have"; IF (VTOTAL >= 25) THEN LPRINT " Remaining Velocity ="; VTOTAL; "ft/sec" ELSE LPRINT " VERY SLOW Remaining Velocity" END IF IF (BSNS3$ <> "") THEN LPRINT BSNS3$ ELSE IF (BSNS3$ <> "") THEN LPRINT BSNS3$ LPRINT ONEPC$ END IF ELSE IF (BSNS3$ <> "") THEN LPRINT BSNS3$ END IF ELSE LPRINT RVU$: 'NO PARTIAL OR COMPLETE PEN END IF '* 'BEGIN 2ND PAGE (ALL BALLISTIC LIMITS) '* CALL LPRNTSECPG '* RETURN '* '* PRINT ARMOR TYPE ON PAPER * LPARMOR: '* CALL LPRINTHDR CALL LPRNTARMOR '* RETURN '* SETUPSECPG: '* CALL LMTSTRINGS '* VEL = VLTRU: GOSUB FOURKCHK: VELLTRU$ = VEL$ VEL = VLSHAT: GOSUB FOURKCHK: VELLSHAT$ = VEL$ VEL = VLSHATMAX: GOSUB FOURKCHK: VELLSHATMAX$ = VEL$ VEL = VLND: GOSUB FOURKCHK: VELLND$ = VEL$ '* VEL = VHTRU: GOSUB FOURKCHK: VELHTRU$ = VEL$ VEL = VHSHAT: GOSUB FOURKCHK: VELHSHAT$ = VEL$ VEL = VHSHATMAX: GOSUB FOURKCHK: VELHSHATMAX$ = VEL$ VEL = VHND: GOSUB FOURKCHK: VELHND$ = VEL$ '* '**** CALCULATE 'EFFECTIVE' LIMIT 'MINEV' FOR THIS IMPACT FROM ALL DATA **** '* ' INIT EFF VEL CALC VARIABLES '* CALL EFFVELINIT '* IF (SHAT = 1) THEN '***SHATRD PROJ*** '* CALL MINEVSHATCALC '* ELSE '***NO PROJ SHATR*** IF (LTCASE > 0) THEN IF (LTCASE = 2) THEN ''LIGHTCASE=2' NOSE DAMAGE INCL >6% CAVITY, CHANGING CRITICAL VEL CHK GOSUB NSCRITICALV: MTMP = INT(NSVEL) IF (MTMP = NSVEL) THEN MINEV2 = MTMP ELSE MINEV2 = MTMP + 1 END IF ELSE ''LIGHTCASE=1' NOSE DAMAGE EFFECTS CAVITY TOO (4-6% CAVITY VOLUME INCL ANY CUSHION) MINEV2 = VLMT END IF ELSE MINEV2 = 0: ' NOT USED END IF IF ((VITRU = -1) AND (CRTAPR > 0)) THEN 'CRITICAL VEL BODY DAMAGE TEST (CRTAPR DEFLECTN TEST W/O BENDING PROJ) ' GOSUB APCRITICALV MTMPCR = INT(CRITVEL) IF (MTMPCR < CRITVEL) THEN MTMPCR = MTMPCR + 1: ' ROUND TO NEAREST WHOLE VEL ' 'GET NOSE BROKEN MIN VEL FOR CRIT VEL USE, IF NEEDED NSTEST = 1 GOSUB NSCRITICALV MTMPNS = INT(NSTESTV) IF (MTMPNS < NSTESTV) THEN MTMPNS = MTMPNS + 1: ' ROUND TO NEAREST WHOLE VEL NTSTV$ = STR$(MTMPNS): ' NEED NOSE DAM LIMIT STRING FOR 'NOTE5$' ' ' CRIT VEL TEST ONLY MADE IF NOSE BREAKS OR PROJ COMPLETELY PENETRATES 'FIND 'MINEV3' MIN EFFECTIVE VEL IF (MTMPNS >= VLMT) THEN MTMP = MTMPCR 'USE BODY DAMAGE THRESHOLD ' (BODY TEST USED SEPARATELY IF NOT OK WHEN 'VS'>=NBL; IF BODY TEST BECOMES OK ' WHEN 'VS' MTMPNS) AND (MTMPCR < VLMT)) THEN MTMP = MTMPNS 'USE NOSE DAMAGE THRESHOLD ' (BODY TEST NEVER USED IF 'VS'>'NSTESTV' (NOSE NOT BROKEN), SO NOSE IS THE LOWEST) ELSE ' 'MTMPNS'<'VLMT' AND 'MTMPCR'>'MTMPNS' AND 'MTMPCR'>='VLMT' MTMP = MTMPCR 'USE BODY DAMAGE THRESHOLD ' (BOTH TESTS USED IF NOSE BREAKS FOR 'VS'<='NSTESTV'; ' BODY TEST ALONE USED ONLY IF 'VS'>='VLMT') NOTE5$ = "NO NOSE OR BODY DAMAGE IF VEL IS BETWEEN" NOTE5$ = NOTE5$ + NTSTV$ + " FT/SEC (NOSE MAX) & NBL (BODY MIN)" END IF MINEV3 = MTMP IF ((NOTE5$ = "") AND (VLMT = VLND) AND (BRAIK = 0) AND (MINEV3 < VLMT)) THEN MINEV3 = VHOL IF (SHATRES > 0) THEN NOTE5$ = NOTE5A$ ELSE NOTE5$ = NOTE5B$ END IF END IF ELSEIF (VITRU > -1) THEN MINEV3 = VITRU 'PROJ USES 'QE' FORMULA IF ((VITRU = VLND) AND (BRAIK = 0)) THEN MINEV3 = VHOL IF (SHATRES > 0) THEN NOTE5$ = NOTE5A$ ELSE NOTE5$ = NOTE5B$ END IF END IF ELSEIF ((BEND = 1) AND (OB >= OBCRIT)) THEN 'PROJ USES BRITISH DEFORMING PROJ RULES IF (CARDONALD = 1) THEN MINEV3 = VSCRIT NOTE5$ = "BRITISH DEFORMING CARDONALD PROJECTILE" ELSE MINEV3 = -1: ' SPECIAL FLAG FOR CURVED-PLATE RULE NOTE5$ = "BRITISH DEFORMING NON-CARDONALD PROJECTILE" END IF ELSE MINEV3 = 0: ' NOT USED END IF IF (OB > OBRK) THEN ''OBRK' IS MAX OB TO REMAIN EFFECTIVE IF 'VS' < 'VLMT' ' UNLESS STEEL PROJ HITS CURVED ARMOR, WHICH HAS SPECIAL LOGIC IF (CRVFLAG = 0) THEN MINEV4 = VLMT 'RAISE EFFECTIVE BL TO NBL IF OB TOO HIGH ELSE MINEV4 = 0 'NOT USED END IF END IF IF (BRAIK > 0) THEN 'WEAK-BODIED STEEL PROJ VS. STEEL ARMOR OR COMPOUND ARMOR. ' CHILLED CAST IRON PROJ ON COMPOUND ARMOR ACTS AS STEEL-ON-STEEL HERE. IF ((CMPND = 1) AND (SHATRES < 2)) THEN MINEV5 = VHOL 'COMPOUND ARMOR BREAKS WEAK STEEL PROJ ONLY IF NO HOLE MADE ELSE MINEV5 = VLMT 'STEEL ARMOR BREAKS THEM ONLY IF BELOW NBL (INCL CAST IRON PROJ ON COMPOUND ARMOR) END IF ELSE MINEV5 = 0 'NOT USED END IF END IF '* 'SORT OUT TRUE MIN EFF VEL '* CALL SETMINEV '* VEL = MINEV: GOSUB FOURKCHK: 'LIMIT MINIMUM EFFECTIVE BL TO 4000 FT/SEC MAXIMUM '* ' **** DETERMINE DAMAGE TO PLATE & PROJ USING VARIOUS B.L. VALUES **** '* CALL DAMAGESETUP '* RETURN '* '*** END OF PROGRAM CODE FOR MAIN MODULE "FH69MAIN.BAS" ***