GNU Exterior Ballistics Computer v1.00
Created by: Derek R. Yates
Released on: February, 2008
Built using: Mingw32 / GCC compiler
Note from the Creator:
GNU Exterior Ballistics Computer was created as an open-sourced alternative to the multitude of commercial ballistics computers. As an avid shooter, I have purchased several commercial packages over the years, but never found exactly what I wanted in any of them. I have created this program, and released it under the GNU GPL License in order to create what I am looking for in a program, and to give you a base on which to build and improve what I've started. The unique features I have included are a multitude of data export features, making it easy to load your data into a variety of analysis software, from OpenOffice to Microsoft Excel, and also in Adobe PDF format. Never before has so much ballistics information been available so freely.
This program was written in C++, and uses the excellent GNU Exterior ballistics library (which I wrote previously for personal use). The solutions are based on the three degrees of freedom differential equations and solved numerically to get a very accurate solution. In general the range data is accurate to within 0.1 yards, and the drop data is accurate to within a fraction of an inch. Standard drag models from G1-G8 are supported making this program very flexible for advanced ballistics use.
The GUI was created using FLTK, to allow both Windows and Linux users to build the source. PDF creation is done using the LibHaru library, which is highly recommended should you ever need a C++ library for PDF creation.
I hope you have as much fun using this program as I have had creating it, and wish you the best shooting.
GNU 외장 탄도 컴퓨터 v1.00
작성자: 데릭 R. 예이츠
출시일: 2008년 2월
다음을 사용하여 빌드됨: Mingw32 / GCC 컴파일러
개발자의 메모:
GNU 외탄도 컴퓨터는 다양한 상업용 탄도 컴퓨터에 대한 오픈 소스 대안으로 만들어졌습니다. 열렬한 슈팅 게임 애호가로서 저는 수년 동안 여러 상업용 패키지를 구매했지만, 그 중 어느 것도 제가 원하는 것을 정확히 찾지 못했습니다. 이 프로그램을 만들고 GNU GPL 라이선스 하에 출시하여 제가 원하는 프로그램을 만들고, 제가 시작한 프로그램을 구축하고 개선할 수 있는 기반을 제공하고자 합니다. 제가 포함한 독특한 기능은 다양한 데이터 내보내기 기능으로, OpenOffice부터 Microsoft Excel, Adobe PDF 형식에 이르기까지 다양한 분석 소프트웨어에 데이터를 쉽게 로드할 수 있게 해줍니다. 이렇게 많은 탄도 정보를 이렇게 자유롭게 이용할 수 있었던 적은 없었습니다.
이 프로그램은 C++로 작성되었으며, 개인 용도로 이전에 작성한 우수한 GNU 외탄도 라이브러리를 사용합니다. 이 솔루션들은 세 가지 자유도 미분 방정식을 기반으로 하며, 매우 정확한 솔루션을 얻기 위해 수치적으로 계산합니다. 일반적으로 범위 데이터는 0.1야드 이내로 정확하며, 드롭 데이터는 1인치 이내로 정확합니다. G1-G8의 표준 드래그 모델이 지원되므로 이 프로그램은 고급 탄도학 사용에 매우 유연합니다.
GUI는 Windows와 Linux 사용자 모두 소스를 빌드할 수 있도록 FLTK를 사용하여 만들어졌습니다. PDF 생성은 LibHaru 라이브러리를 사용하여 이루어지며, PDF 생성을 위해 C++ 라이브러리가 필요할 경우 강력히 권장됩니다.
이 프로그램을 제가 만든 것만큼 재미있게 사용하시길 바라며, 최고의 슈팅을 기원합니다.




!
! BALLISTIC GNU BALLISTICS LIBRARY
!
! ORIGINALLY CREATED BY DEREK YATES
!
MODULE GLOBAL
IMPLICIT NONE
REAL,PARAMETER :: PI = 2.0*ASIN(1.0)
REAL,PARAMETER :: RERTH = 0.000072921159 ! RAD/S
REAL,PARAMETER :: GRAV = -32.17405 ! FT/S/S
REAL :: PROCALI,PROWEIT,PROLENG,DRAGCOEF,VI
REAL :: STAB,SHOTANGL,ZEROANGL
REAL :: TEMP,ALT,PRES,RH,WINDANGL,WINDSPED,LAT,AZIM
REAL :: SIGTHEGT,TWIST,MUZLVEL,ZERORANG
INTEGER :: DRAGFUNC
REAL,DIMENSION(10000) :: RANGVALU,DROPVALU,DROPMOA,ENGYVALU
REAL,DIMENSION(10000) :: VEL,VELX,VELY
REAL,DIMENSION(10000) :: WINDVALU,WINDMOA,TIME
END MODULE GLOBAL
PROGRAM BALLISTICS
USE GLOBAL
CHARACTER(LEN=100) :: BULLET
REAL :: V, VX, VY, VX1, VY1, DV, DVX, DVY, X, Y
REAL :: WIND, HEADWIND, CROSWIND, GX, GY, T, DT
INTEGER :: N,STEP,IATMOS,ISPIN,ITWST,ICORIOLI
OPEN (UNIT=6,FILE='RESULTS.OUT')
!
BULLET='308 WIN MATCH, 168GR SIERRA MATCH KING'
!
DRAGCOEF=0.465 ! DRAG COEFFICIENT OF PROJECTILE
PROWEIT=168 ! PROJECTILE WEIGHT (GRAIN)
PROCALI=0.308 ! PROJECTILE DIAMETER (IN)
MUZLVEL=2650.0 ! MUZZLE INITIAL VELOCITY (FT/S)
SIGTHEGT=1.6 ! SIGHT HEIGHT (IN)
SHOTANGL=0.0 ! SHOOTING ANGLE (DEG)
ZERORANG=200 ! ZERO RANGE (YDS)
WINDSPED=0.0 ! WIND VELOCITY (MI/HR)
WINDANGL=0.0 ! WIND ANGLE (0~360 DEG)
!
ALT=0.0 ! ALTITUDE (FT)
TEMP=59.0 ! TEMPERATURE (F)
PRES=29.53 ! PRESSURE (IN HG)
REHU=78 ! RELATIVE HUMIDITY (%)
!
LAT=24.5 ! SHOOT LATITUDE (DEG)
AZIM=0.0 ! SHOOT DIRECTION (DEG) (N=0,E=90,S=180,W=270)
PROLENG=1.236 ! BULLET LENGTH (IN)
TWIST=7*25.4 ! BARREL TWIST (IN)
!
RMIN=0 ! RANGE (YARD)
RMAX=1000 ! RANGE (YARD)
STEP=10 ! STEP (YARD)
!
DRAGFUNC=1 ! DRAG FUNCTION
IATMOS=0 ! ATMOSPHERIC CORRECTION
ISPIN=0 ! SPIN DRIFT(0:EXCLUDE,1:INCLUDE)
ITWST=0 ! SPIN DIRECTION(0:RIGHT,1:LEFT)
ICORIOLI=0 ! CORIOLI CORRECTION
! ******************************************************************
WRITE(6,*) BULLET
WRITE(6,"(/'DRAG COEFFICIENT: ',F10.3)") DRAGCOEF
WRITE(6,"('PROJECTILE WEIGHT: ',F10.3,' GRAINS')") PROWEIT
WRITE(6,"('INITIAL VELOCITY: ',F10.3,' (FT/S)')") MUZLVEL
WRITE(6,"('ZERO RANGE: ',F10.3,' (YARDS)')") ZERORANG
WRITE(6,"('SHOOTING ANGLE: ',F10.3,' (DEGREES)')") SHOTANGL
WRITE(6,"('WIND VELOCITY: ',F10.3,' (MPH)')") WINDSPED
WRITE(6,"('WIND DIRECTION: ',F10.3,' (DEGREES)')") WINDANGL
WRITE(6,"('ALTITUDE: ',F10.3,' (FEET)')") ALT
WRITE(6,"('PRESSURE: ',F10.3,' (IN-HG)')") PRES
WRITE(6,"('TEMPERATURE: ',F10.3,' (F)')") TEMP
WRITE(6,"('RELATIVE HUMIDITY: ',F10.3,' (%)'/)") REHU
! ******************************************************************
!
! SOLVE
!
! ******************************************************************
!
! ATMOSPHERIC CORRECTION
!
! ******************************************************************
! THE COEFFICIENT OF DRAG FOR THE PROJECTILE.
! DRAGCOEF AT VACCUM = 0.0
! ABSOLUTE ZERO : 0 K = -273.15 C = -459.67 F
! ALTITUDE TEMPERATURE(F DEG.) FACTOR 0.0036 F DEG./FT
! STANDARD TEMPERATURE +15.0 C DEG. = +59.0 F DEG.
! RELATIVE HUMIDITY RISES WHEN THE TEMPERATURE DROPS.
! STANDARD HUMIDITY : 0 %
! THE PRESSURE IN INCHES OF MERCURY (IN HG).
! THIS IS NOT "ABSOLUTE" PRESSURE, IT IS THE 'STANDARDIZED' PRESSURE
! REPORTED IN THE PAPERS AND NEWS.
! STANDARD PRESSURE 29.921 IN-HG
! ******************************************************************
IF (IATMOS==1) THEN
FA=1.0/(-4E-15*(ALT**3)+4E-10*(ALT**2)-3E-5*ALT+1)
TSTD=-0.0036*ALT+59.0
FT=(TEMP-TSTD)/(459.67+TSTD)
VPW=4E-6*TEMP**3-0.0004*TEMP**2+0.0234*TEMP-0.2517
FR=0.995*(PRES/(PRES-(0.3783)*(RH)*VPW))
PSTD=29.921
FP=(PRES-PSTD)/(PSTD)
CF=(FA*(1+FT-FP)*FR)
DRAGCOEF=DRAGCOEF*CF
END IF
WRITE(6,"('DRAG COEFFICIENT AT THE ALTITUDE: ',F10.3/)") DRAGCOEF
! ******************************************************************
! ZERO ANGLE
! ******************************************************************
VI=MUZLVEL
DT=1/VI ! S/FT
ANGLE=0.0
DA=14.0*PI/180 ! RAD
T=0.0
DO
VY=VI*SIN(ANGLE)
VX=VI*COS(ANGLE)
GX=GRAV*SIN(ANGLE)
GY=GRAV*COS(ANGLE)
X=0.0
Y=-SIGTHEGT/12
DO
T=T+DT
VY1=VY
VX1=VX
V=SQRT((VX**2)+(VY**2))
DT=1/V
DV=RETARD(DRAGFUNC,DRAGCOEF,V)
DVY=-DV*VY/V*DT
DVX=-DV*VX/V*DT
VX=VX+DVX
VY=VY+DVY
VY=VY+DT*GY
VX=VX+DT*GX
X=X+DT*(VX+VX1)/2
Y=Y+DT*(VY+VY1)/2
IF (VY < 0 .AND. Y < 0) EXIT
IF (VY > 3*VX) EXIT
IF (X > ZERORANG*3) EXIT
END DO
IF (Y > 0 .AND. DA > 0) DA=-DA/2
IF (Y < 0 .AND. DA < 0) DA =-DA/2
ANGLE=ANGLE+DA
IF (ABS(DA) < (0.01/60*PI/180.0)) EXIT
IF (ANGLE > (45*PI/180.0)) EXIT
END DO
ZEROANGL=ANGLE*180/PI
! ******************************************************************
!
! OUTPUT
!
! ******************************************************************
WRITE(6,"(' RANGE DROP DROP VELOCITY &
& ENERGY WIND DRIFT WINDAGE TIME')")
WRITE(6,"(' (YARD) (INCHES) (MOA) (FT/S) &
& (FT-LB) (INCHES) (MOA) (S)')")
T=0.0
DT=0.0
V=0.0;VX=0.0;VY=0.0
VX1=0.0;VY1=0.0
DV=0.0;DVX=0.0;DVY=0.0
X=0.0;Y=0.0
! HEAD WIND IS POSITIVE AT WIND ANGLE = 0
WINDA=WINDA*(PI/180.0)
HEADWIND = COS(WINDA) * WINDSPEED
! POSITIVE IS FROM SHOOTER'S RIGHT TO LEFT (WIND FROM 90 DEGREE)
CROSWIND = SIN(WINDA) * WINDSPEED
! GRAVITATIONAL ACCELERATION
GY=GRAV*COS((SHOTANGL+ZEROANGL)*PI/180.0)
GX=GRAV*SIN((SHOTANGL+ZEROANGL)*PI/180.0)
VX=VI*COS(ZEROANGL*PI/180.0)
VY=VI*SIN(ZEROANGL*PI/180.0)
! THE HEIGHT OF THE SIGHTING SYSTEM (IN)
Y=-SIGTHEGT/12
!
N=0
I=1
DO
VX1=VX
VY1=VY
V=SQRT(VX**2+VY**2)
DT=0.5/V
DV=RETARD(DRAGFUNC,DRAGCOEF,V+HEADWIND)
DVX=-(VX/V)*DV
DVY=-(VY/V)*DV
VX=VX+DT*DVX+DT*GX
VY=VY+DT*DVY+DT*GY
WIND=CROSWIND*17.6*((T+DT)-X/VI)
DROP=Y*12 ! IN
! SPIN DRIFT AND ADD TO WINDAGE
STAB=(30.0*PROWEIT)/((TWIST/PROCALI)**2.0)*(PROCALI**3.0)*&
& (PROLENG/PROCALI)*(1.0+(PROLENG/PROCALI)**2.0)
IF (MUZLVEL > 2800) THEN
STAB=STAB*(MUZLVEL/2800)**(1.0/3.0)
END IF
STAB=STAB*(((TEMP+460)/519.0)*(29.92/PRES))
IF (ISPIN==1) THEN
SD=1.25*(STAB+1.2)*((T+DT)**1.83)
IF (TWIST==0) THEN
WIND=WIND+SD
ELSE
WIND=WIND-SD
END IF
END IF
! CORIOLIS FORCE
IF (ICORIOLI==1) THEN
WIND=WIND+(RERTH*(X/3)*SIN(LAT*PI/180)*(T+DT)*12)
DROP=DROP*(1-((2*RERTH*MUZLVEL)/GRAV)*COS(LAT*PI/180)*SIN(AZIM*PI/180))
END IF
!
! EXTERIOR BALLISTICS RESULTS
!
IF (X/3 >= N) THEN
RANGVALU(I)=X/3 ! YARD
DROPVALU(I)=DROP ! IN
DROPMOA(I)=-ATAN(Y/X)*60*180/PI
TIME(I)=T+DT
WINDVALU(I)=WIND
IF (X.NE.0) THEN
WINDMOA(I)=ATAN((WIND/12)/X)*60*180/PI
END IF
ENGYVALU(I)=(PROWEIT*V*V)/(2*225218.34)
!
VEL(I)=V
VELX(I)=VX
VELY(I)=VY
WRITE(6,"(8(1X,1F10.3))") RANGVALU(I),DROPVALU(I), &
DROPMOA(I),VEL(I),ENGYVALU(I),WINDVALU(I),WINDMOA(I), &
TIME(I)
IF (RANGVALU(I)>RMAX) THEN
EXIT
END IF
N=N+STEP
I=I+1
END IF
! COMPUTE POSITION BASED ON AVERAGE VELOCITY.
X=X+DT*(VX+VX1)/2
Y=Y+DT*(VY+VY1)/2
T=T+DT
IF (ABS(VY) > ABS(3*VX)) THEN
EXIT
END IF
END DO
CLOSE(UNIT=6)
END PROGRAM BALLISTICS
FUNCTION RETARD(DRAGFUNC,DRAGCOEF,VELOCITY)
! RETARD CORRECTS THE VELOCITY FOR BALLISTIC DRAG.
INTEGER :: DRAGFUNC
REAL :: RETARD,VP,A,M
VP=VELOCITY
A=-1.0 ! ACCELERATION
M=-1.0 ! MASS
SELECT CASE (DRAGFUNC)
CASE (1)
IF (VP > 4230) THEN
A = 0.0001477404177730177;
M = 1.9565
ELSEIF (VP > 3680) THEN
A = 0.00019203392687556139
M = 1.925
ELSEIF (VP > 3450) THEN
A = 0.00028947510268197461
M = 1.875
ELSEIF (VP > 3295) THEN
A = 0.00043499051111156362
M = 1.825
ELSEIF (VP > 3130) THEN
A = 0.00065204218718926618
M = 1.775
ELSEIF (VP > 2960) THEN
A = 0.00097480736940786959
M = 1.725
ELSEIF (VP > 2830) THEN
A = 0.0014537215601872859
M = 1.675
ELSEIF (VP > 2680) THEN
A = 0.0021628872029303761
M = 1.625
ELSEIF (VP > 2460) THEN
A = 0.0032095597831298811
M = 1.575
ELSEIF (VP > 2225) THEN
A = 0.0039043682186912492
M = 1.55
ELSEIF (VP > 2015) THEN
A = 0.0032229422712623359
M = 1.575
ELSEIF (VP > 1890) THEN
A = 0.0022033295422978091
M = 1.625
ELSEIF (VP > 1810) THEN
A = 0.0015110010288919039
M = 1.675
ELSEIF (VP > 1730) THEN
A = 0.00086099575924682592
M = 1.75
ELSEIF (VP > 1595) THEN
A = 0.00040861467973051169
M = 1.85
ELSEIF (VP > 1520) THEN
A = 0.0001954473210037398
M = 1.95
ELSEIF (VP > 1420) THEN
A = 0.00005431896266462351
M = 2.125
ELSEIF (VP > 1360) THEN
A = 0.0000088477425816744163
M = 2.375
ELSEIF (VP > 1315) THEN
A = 0.0000014569223287202981
M = 2.625
ELSEIF (VP > 1280) THEN
A = 0.00000024194851918955649
M = 2.875
ELSEIF (VP > 1220) THEN
A = 0.000000016579563210676119
M = 3.25
ELSEIF (VP > 1185) THEN
A = 0.00000000047454695371573713
M = 3.75
ELSEIF (VP > 1150) THEN
A = 0.000000000013797465900250881
M = 4.25
ELSEIF (VP > 1100) THEN
A = 0.00000000000040701579611478821
M = 4.75
ELSEIF (VP > 1060) THEN
A = 0.000000000000029382369548473309
M = 5.125
ELSEIF (VP > 1025) THEN
A = 0.000000000000012285973707747459
M = 5.25
ELSEIF (VP > 980) THEN
A = 0.000000000000029169382641004953
M = 5.125
ELSEIF (VP > 945) THEN
A = 0.00000000000038550994248074508
M = 4.75
ELSEIF (VP > 905) THEN
A = 0.00000000001185097045689854
M = 4.25
ELSEIF (VP > 860) THEN
A = 0.00000000035661294709749512
M = 3.75
ELSEIF (VP > 810) THEN
A = 0.000000010455132639662721
M = 3.25
ELSEIF (VP > 780) THEN
A = 0.00000012911592008462161
M = 2.875
ELSEIF (VP > 750) THEN
A = 0.0000006824429329105383
M = 2.625
ELSEIF (VP > 700) THEN
A = 0.000003569169672385163
M = 2.375
ELSEIF (VP > 640) THEN
A = 0.00001839015095899579
M = 2.125
ELSEIF (VP > 600) THEN
A = 0.0000571117468873424
M = 1.95
ELSEIF (VP > 550) THEN
A = 0.000092265570919734271
M = 1.875
ELSEIF (VP > 250) THEN
A = 0.000093379919571313886
M = 1.875
ELSEIF (VP > 100) THEN
A = 0.000072252473275904129
M = 1.925
ELSEIF (VP > 65) THEN
A = 0.00005792684957074546
M = 1.975
ELSEIF (VP > 0) THEN
A = 0.000052062141073205883
M = 2.0
END IF
CASE (2)
IF (VP > 1674) THEN
A = 0.0079470052136733
M = 1.36999902851493
ELSEIF (VP > 1172) THEN
A = 0.00100419763721974
M = 1.65392237010294
ELSEIF (VP > 1060) THEN
A = 7.15571228255369E-23
M = 7.91913562392361
ELSEIF (VP > 949) THEN
A = 0.000000000139589807205091
M = 3.81439537623717
ELSEIF (VP > 670) THEN
A = 0.000234364342818625
M = 1.71869536324748
ELSEIF (VP > 335) THEN
A = 0.000177962438921838
M = 1.76877550388679
ELSEIF (VP > 0) THEN
A = 0.0000518033561289704
M = 1.98160270524632
END IF
CASE (5)
IF (VP > 1730) THEN
A = 0.00724854775171929
M = 1.41538574492812
ELSEIF (VP > 1228) THEN
A = 0.0000350563361516117
M = 2.13077307854948
ELSEIF (VP > 1116) THEN
A = 0.000000000000184029481181151
M = 4.81927320350395
ELSEIF (VP > 1004) THEN
A = 1.34713064017409E-22
M = 7.8100555281422
ELSEIF (VP > 837) THEN
A = 0.000000103965974081168
M = 2.84204791809926
ELSEIF (VP > 335) THEN
A = 0.000109301593869823
M = 1.81096361579504
ELSEIF (VP > 0) THEN
A = 0.0000351963178524273
M = 2.00477856801111
END IF
CASE (6)
IF (VP > 3236) THEN
A = 0.0455384883480781
M = 1.15997674041274
ELSEIF (VP > 2065) THEN
A = 0.0716726184965377
M = 1.10704436538885
ELSEIF (VP > 1311) THEN
A = 0.00166676386084348
M = 1.60085100195952
ELSEIF (VP > 1144) THEN
A = 0.000000101482730119215
M = 2.9569674731838
ELSEIF (VP > 1004) THEN
A = 4.31542773103552E-18
M = 6.34106317069757
ELSEIF (VP > 670) THEN
A = 0.0000204835650496866
M = 2.11688446325998
ELSEIF (VP > 0) THEN
A = 0.0000750912466084823
M = 1.92031057847052
END IF
CASE (7)
IF (VP > 4200) THEN
A = 0.00000000129081656775919
M = 3.24121295355962
ELSEIF (VP > 3000) THEN
A = 0.0171422231434847
M = 1.27907168025204
ELSEIF (VP > 1470) THEN
A = 0.00233355948302505
M = 1.52693913274526
ELSEIF (VP > 1260) THEN
A = 0.000797592111627665
M = 1.67688974440324
ELSEIF (VP > 1110) THEN
A = 0.00000000000571086414289273
M = 4.3212826264889
ELSEIF (VP > 960) THEN
A = 3.02865108244904E-17
M = 5.99074203776707
ELSEIF (VP > 670) THEN
A = 0.00000752285155782535
M = 2.1738019851075
ELSEIF (VP > 540) THEN
A = 0.0000131766281225189
M = 2.08774690257991
ELSEIF (VP > 0) THEN
A = 0.0000134504843776525
M = 2.08702306738884
END IF
CASE (8)
IF (VP > 3571) THEN
A = 0.0112263766252305
M = 1.33207346655961
ELSEIF (VP > 1841) THEN
A = 0.0167252613732636
M = 1.28662041261785
ELSEIF (VP > 1120) THEN
A = 0.00220172456619625
M = 1.55636358091189
ELSEIF (VP > 1088) THEN
A = 0.00000000000000020538037167098
M = 5.80410776994789
ELSEIF (VP > 976) THEN
A = 0.00000000000592182174254121
M = 4.29275576134191
ELSEIF (VP > 0) THEN
A = 0.000043917343795117
M = 1.99978116283334
END IF
CASE (9)
A = 0.0
M = 0.0
END SELECT
IF ((A.NE.-1).AND.(M.NE.-1).AND.(VP>0).AND.(VP<10000)) THEN
RETARD=A*(VP**M)/DRAGCOEF
END IF
END FUNCTION| [FORTRAN] 포트란 언어에서 상수와 변수 (0) | 2025.12.23 |
|---|---|
| 몬테카를로 시뮬레이션을 이용한 로또 번호 추출 (0) | 2025.12.22 |
| [FORTRAN] 포트란 작성 스타일과 실행 방법 (0) | 2025.12.14 |
| [FORTRAN] 포트란 프로그램의 구조 (0) | 2025.12.13 |
| [FORTRAN] 포트란의 줄 바꿈과 주석 (0) | 2025.12.13 |