Skip to content

Commit

Permalink
Update to IGRF 14th, with DGRF/IGRF to 2025
Browse files Browse the repository at this point in the history
Ref:
https://www.ncei.noaa.gov/products/international-geomagnetic-reference-field
and https://www.ngdc.noaa.gov/IAGA/vmod/coeffs/igrf14coeffs.txt
(cropped to keep the same number of coefficients as was previously
used).

Closes #51
  • Loading branch information
thomas-nilsson-irfu committed Nov 25, 2024
1 parent 921b949 commit 15c8ae9
Showing 1 changed file with 127 additions and 73 deletions.
200 changes: 127 additions & 73 deletions source/igrf_coef.f
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
! along with IRBEM-LIB. If not, see <http://www.gnu.org/licenses/>.
!
!
! VERSION: IGRF13
! VERSION: IGRF14
!

subroutine get_igrf_version(version)
IMPLICIT NONE
INTEGER*4 version
version = 13
version = 14
end


Expand All @@ -33,7 +33,7 @@ subroutine get_igrf_version(version)
! GEOMAGN. AND AERONOMY (1986), V.26, P.523-525).
!
!------INPUT PARAMETERS:
! iyr - YEAR NUMBER (FROM 1900 UP TO 2025)
! iyr - YEAR NUMBER (FROM 1900 UP TO 2030)
!----- OUTPUT PARAMETERS:
! g,h - coefficients for the igrf model interpolated (or extrapolated)
! to the epoch of iyr
Expand Down Expand Up @@ -69,7 +69,8 @@ subroutine get_igrf_coeffs(year,g,h,ierr)
REAL*8 G2010(66), H2010(66)
REAL*8 G2015(66), H2015(66)
REAL*8 G2020(66), H2020(66)
REAL*8 DG2020(45), DH2020(45)
REAL*8 G2025(66), H2025(66)
REAL*8 DG2025(45), DH2025(45)
C
INTEGER*4 N,ierr
REAL*8 year
Expand Down Expand Up @@ -1063,77 +1064,118 @@ subroutine get_igrf_coeffs(year,g,h,ierr)
* /
DATA G2020/
* 0.00d0,
* -29404.80d0, -1450.90d0,
* -2499.60d0, 2982.00d0, 1677.00d0,
* 1363.20d0, -2381.20d0, 1236.20d0, 525.70d0,
* 903.00d0, 809.50d0, 86.30d0, -309.40d0, 48.00d0,
* -234.30d0, 363.20d0, 187.80d0, -140.70d0, -151.20d0,
* 13.50d0,
* 66.00d0, 65.50d0, 72.90d0, -121.50d0, -36.20d0,
* 13.50d0, -64.70d0,
* 80.60d0, -76.70d0, -8.20d0, 56.50d0, 15.80d0,
* 6.40d0, -7.20d0, 9.80d0,
* 23.70d0, 9.70d0, -17.60d0, -0.50d0, -21.10d0,
* 15.30d0, 13.70d0, -16.50d0, -0.30d0,
* 5.00d0, 8.40d0, 2.90d0, -1.50d0, -1.10d0,
* -13.20d0, 1.10d0, 8.80d0, -9.30d0, -11.90d0,
* -1.90d0, -6.20d0, -0.10d0, 1.70d0, -0.90d0,
* 0.70d0, -0.90d0, 1.90d0, 1.40d0, -2.40d0,
* -3.80d0
* -29403.41d0, -1451.37d0,
* -2499.78d0, 2981.96d0, 1676.85d0,
* 1363.00d0, -2380.80d0, 1236.06d0, 525.60d0,
* 902.82d0, 809.47d0, 86.18d0, -309.47d0, 47.44d0,
* -234.42d0, 363.26d0, 187.86d0, -140.73d0, -151.16d0,
* 13.98d0,
* 65.97d0, 65.56d0, 72.96d0, -121.57d0, -36.06d0,
* 13.60d0, -64.80d0,
* 80.54d0, -76.63d0, -8.23d0, 56.45d0, 15.80d0,
* 6.30d0, -7.21d0, 9.77d0,
* 23.66d0, 9.74d0, -17.49d0, -0.49d0, -21.07d0,
* 15.28d0, 13.65d0, -16.59d0, -0.34d0,
* 5.03d0, 8.36d0, 2.84d0, -1.48d0, -1.14d0,
* -13.22d0, 1.08d0, 8.82d0, -9.23d0, -11.86d0,
* -1.84d0, -6.25d0, -0.11d0, 1.66d0, -0.86d0,
* 0.65d0, -0.88d0, 1.88d0, 1.44d0, -2.38d0,
* -3.84d0
* /

DATA H2020/
* 0.00d0,
* 0.00d0, 4652.50d0,
* 0.00d0, -2991.60d0, -734.60d0,
* 0.00d0, -82.10d0, 241.90d0, -543.40d0,
* 0.00d0, 281.90d0, -158.40d0, 199.70d0, -349.70d0,
* 0.00d0, 47.70d0, 208.30d0, -121.20d0, 32.30d0,
* 98.90d0,
* 0.00d0, -19.10d0, 25.10d0, 52.80d0, -64.50d0,
* 8.90d0, 68.10d0,
* 0.00d0, -51.50d0, -16.90d0, 2.20d0, 23.50d0,
* -2.20d0, -27.20d0, -1.80d0,
* 0.00d0, 8.40d0, -15.30d0, 12.80d0, -11.70d0,
* 14.90d0, 3.60d0, -6.90d0, 2.80d0,
* 0.00d0, -23.40d0, 11.00d0, 9.80d0, -5.10d0,
* -6.30d0, 7.80d0, 0.40d0, -1.40d0, 9.60d0,
* 0.00d0, 3.40d0, -0.20d0, 3.60d0, 4.80d0,
* -8.60d0, -0.10d0, -4.30d0, -3.40d0, -0.10d0,
* -8.80d0
* 0.00d0, 4653.35d0,
* 0.00d0, -2991.72d0, -734.62d0,
* 0.00d0, -81.96d0, 241.80d0, -542.52d0,
* 0.00d0, 282.10d0, -158.50d0, 199.75d0, -350.30d0,
* 0.00d0, 47.52d0, 208.36d0, -121.43d0, 32.09d0,
* 99.14d0,
* 0.00d0, -19.22d0, 25.02d0, 52.76d0, -64.40d0,
* 8.96d0, 68.04d0,
* 0.00d0, -51.50d0, -16.85d0, 2.36d0, 23.56d0,
* -2.19d0, -27.19d0, -1.90d0,
* 0.00d0, 8.43d0, -15.23d0, 12.83d0, -11.76d0,
* 14.94d0, 3.62d0, -6.90d0, 2.90d0,
* 0.00d0, -23.44d0, 11.04d0, 9.86d0, -5.13d0,
* -6.20d0, 7.79d0, 0.40d0, -1.44d0, 9.60d0,
* 0.00d0, 3.38d0, -0.18d0, 3.50d0, 4.86d0,
* -8.62d0, -0.11d0, -4.26d0, -3.43d0, -0.10d0,
* -8.84d0
* /
DATA DG2020/
DATA G2025/
* 0.00d0,
* 5.70d0, 7.40d0,
* -11.00d0, -7.00d0, -2.10d0,
* 2.20d0, -5.90d0, 3.10d0, -12.00d0,
* -1.20d0, -1.60d0, -5.90d0, 5.20d0, -5.10d0,
* -0.30d0, 0.50d0, -0.60d0, 0.20d0, 1.30d0,
* 0.90d0,
* -0.50d0, -0.30d0, 0.40d0, 1.30d0, -1.40d0,
* 0.00d0, 0.90d0,
* -0.10d0, -0.20d0, 0.00d0, 0.70d0, 0.10d0,
* -0.50d0, -0.80d0, 0.80d0,
* 0.00d0, 0.10d0, -0.10d0, 0.40d0, -0.10d0,
* 0.40d0, 0.30d0, -0.10d0, 0.40d0
* -29350.00d0, -1410.30d0,
* -2556.20d0, 2950.90d0, 1648.70d0,
* 1360.90d0, -2404.20d0, 1243.80d0, 453.40d0,
* 894.70d0, 799.60d0, 55.80d0, -281.10d0, 12.00d0,
* -232.90d0, 369.00d0, 187.20d0, -138.70d0, -141.90d0,
* 20.90d0,
* 64.30d0, 63.80d0, 76.70d0, -115.70d0, -40.90d0,
* 14.90d0, -60.80d0,
* 79.60d0, -76.90d0, -8.80d0, 59.30d0, 15.80d0,
* 2.50d0, -11.20d0, 14.30d0,
* 23.10d0, 10.90d0, -17.50d0, 2.00d0, -21.80d0,
* 16.90d0, 14.90d0, -16.80d0, 1.00d0,
* 4.70d0, 8.00d0, 3.00d0, -0.20d0, -2.50d0,
* -13.10d0, 2.40d0, 8.60d0, -8.70d0, -12.80d0,
* -1.30d0, -6.40d0, 0.20d0, 2.00d0, -1.00d0,
* -0.50d0, -0.90d0, 1.50d0, 0.90d0, -2.60d0,
* -3.90d0
* /

DATA DH2020/
DATA H2025/
* 0.00d0,
* 0.00d0, -25.90d0,
* 0.00d0, -30.20d0, -22.40d0,
* 0.00d0, 6.00d0, -1.10d0, 0.50d0,
* 0.00d0, -0.10d0, 6.50d0, 3.60d0, -5.00d0,
* 0.00d0, 0.00d0, 2.50d0, -0.60d0, 3.00d0,
* 0.30d0,
* 0.00d0, 0.00d0, -1.60d0, -1.30d0, 0.80d0,
* 0.00d0, 1.00d0,
* 0.00d0, 0.60d0, 0.60d0, -0.80d0, -0.20d0,
* -1.10d0, 0.10d0, 0.30d0,
* 0.00d0, -0.20d0, 0.60d0, -0.20d0, 0.50d0,
* -0.30d0, -0.40d0, 0.50d0, 0.00d0
* 0.00d0, 4545.50d0,
* 0.00d0, -3133.60d0, -814.20d0,
* 0.00d0, -56.90d0, 237.60d0, -549.60d0,
* 0.00d0, 278.60d0, -134.00d0, 212.00d0, -375.40d0,
* 0.00d0, 45.30d0, 220.00d0, -122.90d0, 42.90d0,
* 106.20d0,
* 0.00d0, -18.40d0, 16.80d0, 48.90d0, -59.80d0,
* 10.90d0, 72.80d0,
* 0.00d0, -48.90d0, -14.40d0, -1.00d0, 23.50d0,
* -7.40d0, -25.10d0, -2.20d0,
* 0.00d0, 7.20d0, -12.60d0, 11.50d0, -9.70d0,
* 12.70d0, 0.70d0, -5.20d0, 3.90d0,
* 0.00d0, -24.80d0, 12.10d0, 8.30d0, -3.40d0,
* -5.30d0, 7.20d0, -0.60d0, 0.80d0, 9.80d0,
* 0.00d0, 3.30d0, 0.10d0, 2.50d0, 5.40d0,
* -9.00d0, 0.40d0, -4.20d0, -3.80d0, 0.90d0,
* -9.00d0
* /
if ((year.lt.1900.d0).or.(year.gt.2025.d0)) then
DATA DG2025/
* 0.00d0,
* 12.60d0, 10.00d0,
* -11.20d0, -5.30d0, -8.30d0,
* -1.50d0, -4.40d0, 0.40d0, -15.60d0,
* -1.70d0, -2.30d0, -5.80d0, 5.40d0, -6.80d0,
* 0.60d0, 1.30d0, 0.00d0, 0.70d0, 2.30d0,
* 1.00d0,
* -0.20d0, -0.30d0, 0.80d0, 1.20d0, -0.80d0,
* 0.40d0, 0.90d0,
* -0.10d0, -0.10d0, -0.10d0, 0.50d0, -0.10d0,
* -0.80d0, -0.80d0, 0.90d0,
* -0.10d0, 0.20d0, 0.00d0, 0.40d0, -0.10d0,
* 0.30d0, 0.10d0, 0.00d0, 0.30d0
* /

DATA DH2025/
* 0.00d0,
* 0.00d0, -21.50d0,
* 0.00d0, -27.30d0, -11.10d0,
* 0.00d0, 3.80d0, -0.20d0, -3.90d0,
* 0.00d0, -1.30d0, 4.10d0, 1.60d0, -4.10d0,
* 0.00d0, -0.50d0, 2.10d0, 0.50d0, 1.70d0,
* 1.90d0,
* 0.00d0, 0.30d0, -1.60d0, -0.40d0, 0.80d0,
* 0.70d0, 0.90d0,
* 0.00d0, 0.60d0, 0.50d0, -0.70d0, 0.00d0,
* -0.90d0, 0.50d0, -0.30d0,
* 0.00d0, -0.30d0, 0.40d0, -0.30d0, 0.40d0,
* -0.50d0, -0.60d0, 0.30d0, 0.20d0
* /
if ((year.lt.1900.d0).or.(year.gt.2030.d0)) then
ierr=1
if (year_error_reported .eq. 0) then
write(*,999) year
Expand Down Expand Up @@ -1164,19 +1206,20 @@ subroutine get_igrf_coeffs(year,g,h,ierr)
if (year.lt.2010.d0) goto 2010 ! interpolate between 2005 - 2010
if (year.lt.2015.d0) goto 2015 ! interpolate between 2010 - 2015
if (year.lt.2020.d0) goto 2020 ! interpolate between 2015 - 2020
if (year.lt.2025.d0) goto 2025 ! interpolate between 2020 - 2025
C
C EXTRAPOLATE BETWEEN 2020 - 2030
C EXTRAPOLATE BETWEEN 2025 - 2035
C
DT=year-2020.D0
DT=year-2025.D0
if (DT.gt.10.D0) then
DT = 10.D0 ! effectively 2030
DT = 10.D0 ! effectively 2035
endif
DO 40 N=1,66
G(N)=G2020(N)
H(N)=H2020(N)
G(N)=G2025(N)
H(N)=H2025(N)
IF (N.GT.45) GOTO 40
G(N)=G(N)+DG2020(N)*DT
H(N)=H(N)+DH2020(N)*DT
G(N)=G(N)+DG2025(N)*DT
H(N)=H(N)+DH2025(N)*DT
40 CONTINUE
GOTO 300
C
Expand Down Expand Up @@ -1449,12 +1492,23 @@ subroutine get_igrf_coeffs(year,g,h,ierr)
GOTO 300
C
C
C INTERPOLATE BETWEEN 2020 - 2025
C
2025 F2=(year-2020.D0)/5.D0
F1=1.D0-F2
DO N=1,66
G(N)=G2020(N)*F1+G2025(N)*F2
H(N)=H2020(N)*F1+H2025(N)*F2
enddo
GOTO 300
C
C
300 continue
c
C
999 format(//1x,
* '*** WARNING -- Input year = ',F7.2,/
* ' is out of valid range 1900-2025 Using nearest ***'//)
* ' is out of valid range 1900-2030 Using nearest ***'//)
c
return
end

0 comments on commit 15c8ae9

Please sign in to comment.