|
|
c $Id: igrf.f 3304 2011-01-17 15:25:59Z brideout $
|
|
|
C
|
|
|
C Subroutine IGRF_SUB to compute IGRF parameters for IRI.
|
|
|
C Rewritten by Bill Rideout to simply call other geolib methods.
|
|
|
C
|
|
|
subroutine igrf_sub(xlat,xlong,year,height,
|
|
|
& xl,icode,dipl,babs)
|
|
|
c-----------------------------------------------------------------------
|
|
|
c INPUT:
|
|
|
c xlat geodatic latitude in degrees
|
|
|
c xlong geodatic longitude in degrees
|
|
|
c year decimal year (year+month/12.0-0.5 or
|
|
|
c year+day-of-year/365 or ../366 if leap year)
|
|
|
c height height in km
|
|
|
c OUTPUT:
|
|
|
c xl L value
|
|
|
c icode =1 L is correct; =2 L is not correct;
|
|
|
c =3 an approximation is used
|
|
|
c dipl dip latitude in degrees
|
|
|
c babs magnetic field strength in gauss
|
|
|
c-----------------------------------------------------------------------
|
|
|
|
|
|
REAL xlat,xlong,xl,dipl,babs,year,height
|
|
|
INTEGER icode
|
|
|
|
|
|
DOUBLE PRECISION TM,GDLAT,GLON,GDALT,GCLAT,RKM,T,CT,ST,P,CP,SP,
|
|
|
* BR,BT,BP,B,XB,YB,ZB,GCALT,BB,RL,
|
|
|
* BDOWN,BNORTH,BEAST
|
|
|
C .. External Subroutines ..
|
|
|
EXTERNAL CONVRT,MILMAG,INVAR
|
|
|
|
|
|
C .. Data statements ..
|
|
|
DATA DTR/0.0174532925199D0/
|
|
|
|
|
|
|
|
|
C convert to doubles
|
|
|
TM = DBLE(year)
|
|
|
GDLAT = DBLE(xlat)
|
|
|
GLON = DBLE(xlong)
|
|
|
GDALT = DBLE(height)
|
|
|
CALL CONVRT(1,GDLAT,GDALT,GCLAT,RKM)
|
|
|
|
|
|
C .....calculate magnetic field at observation point.....
|
|
|
T = DTR*(90.D0-GCLAT)
|
|
|
CT = DCOS(T)
|
|
|
ST = DSIN(T)
|
|
|
P = DTR*GLON
|
|
|
CP = DCOS(P)
|
|
|
SP = DSIN(P)
|
|
|
CALL MILMAG(TM,RKM,ST,CT,SP,CP,BR,BT,BP,B)
|
|
|
CALL GDV(GDLAT,GCLAT,BR,BT,BP,XB,YB,ZB)
|
|
|
BNORTH = XB
|
|
|
BEAST = YB
|
|
|
BDOWN = ZB
|
|
|
C
|
|
|
C .....calculate dip latitude.....
|
|
|
DIPL=REAL(ATAN(BDOWN/2.0/sqrt(BNORTH*BNORTH+BEAST*BEAST))/DTR)
|
|
|
|
|
|
C .....calculate l-shell parameter.....
|
|
|
GCALT = RKM - 6378.16D0/DSQRT(1.D0+.0067397D0*ST*ST)
|
|
|
CALL INVAR(TM,GCLAT,GLON,GCALT,0.01D0,BB,RL)
|
|
|
RL = MAX(RL,1.0D0)
|
|
|
|
|
|
C convert results
|
|
|
xl=REAL(RL)
|
|
|
icode = 1
|
|
|
babs=REAL(B)
|
|
|
RETURN
|
|
|
END
|
|
|
C
|
|
|
C
|
|
|
|
|
|
C
|
|
|
SUBROUTINE GEODIP(IYR,SLA,SLO,DLA,DLO,J)
|
|
|
|
|
|
C Calculates dipole geomagnetic coordinates from geocentric coordinates
|
|
|
C or vice versa.
|
|
|
|
|
|
C J=0 J=1
|
|
|
C INPUT: J,SLA,SLO J,DLA,DLO
|
|
|
C OUTPUT: DLA,DLO SLA,SLO
|
|
|
|
|
|
C Last revision: November 2005 (Vladimir Papitashvili)
|
|
|
C The code is modifed from GEOCOR written by V.Popov and V.Papitashvili
|
|
|
C in mid-1980s.
|
|
|
REAL SLA,SLO,DLA,DLO
|
|
|
INTEGER IYR,J
|
|
|
DOUBLE PRECISION R,COL,RLO,X,Y,Z,RM,TH,PF,XM,YM,ZM
|
|
|
DOUBLE PRECISION SZM,DCO
|
|
|
|
|
|
C .. Data statements ..
|
|
|
DATA UMR /0.0174532925199D0/
|
|
|
|
|
|
C Earth's radius (km) RE = 6371.2
|
|
|
|
|
|
C The radius of the sphere to compute the coordinates (in Re)
|
|
|
C RH = (RE + HI)/RE
|
|
|
R = 1.
|
|
|
|
|
|
if(j.gt.0) goto 1234
|
|
|
|
|
|
COL = DBLE((90.- SLA)*UMR)
|
|
|
RLO = DBLE(SLO*UMR)
|
|
|
CALL SPHCAR(R,COL,RLO,X,Y,Z,1)
|
|
|
CALL GEOMAG(X,Y,Z,XM,YM,ZM,1,IYR)
|
|
|
CALL SPHCAR(RM,TH,PF,XM,YM,ZM,-1)
|
|
|
SZM = ZM
|
|
|
DLO = REAL(PF/UMR)
|
|
|
DCO = TH/UMR
|
|
|
DLA = REAL(90.- DCO)
|
|
|
RETURN
|
|
|
|
|
|
1234 continue
|
|
|
COL = DBLE((90.- DLA)*UMR)
|
|
|
RLO = DBLE(DLO*UMR)
|
|
|
CALL SPHCAR(R,COL,RLO,XM,YM,ZM,1)
|
|
|
CALL GEOMAG(X,Y,Z,XM,YM,ZM,-1,IYR)
|
|
|
CALL SPHCAR(RM,TH,PF,X,Y,Z,-1)
|
|
|
SZM = ZM
|
|
|
SLO = REAL(PF/UMR)
|
|
|
SCO = TH/UMR
|
|
|
SLA = REAL(90.- SCO)
|
|
|
|
|
|
RETURN
|
|
|
END
|
|
|
c
|
|
|
c
|
|
|
C
|
|
|
subroutine igrf_dip(xlat,xlong,year,height,dip,dipl,ymodip)
|
|
|
c-----------------------------------------------------------------------
|
|
|
c INPUT:
|
|
|
c xlat geodatic latitude in degrees
|
|
|
c xlong geodatic longitude in degrees
|
|
|
c year decimal year (year+month/12.0-0.5 or
|
|
|
c year+day-of-year/365 or ../366 if leap year)
|
|
|
c height height in km
|
|
|
c OUTPUT:
|
|
|
c dip magnetic inclination (dip) in degrees
|
|
|
c dipl dip latitude in degrees
|
|
|
c ymodip modified dip latitude = asin{dip/sqrt[dip^2+cos(LATI)]}
|
|
|
c-----------------------------------------------------------------------
|
|
|
REAL xlat,xlong,dipl,year,height
|
|
|
|
|
|
DOUBLE PRECISION TM,GDLAT,GLON,GDALT,GCLAT,RKM,T,CT,ST,P,CP,SP,
|
|
|
* BR,BT,BP,B,XB,YB,ZB,HB,AINC,
|
|
|
* dipdiv,SMODIP,BDOWN,BNORTH,BEAST
|
|
|
C .. External Subroutines ..
|
|
|
EXTERNAL CONVRT,MILMAG,INVAR
|
|
|
|
|
|
C .. Data statements ..
|
|
|
DATA DTR/0.0174532925199D0/
|
|
|
|
|
|
|
|
|
C convert to doubles to use coord
|
|
|
TM = DBLE(year)
|
|
|
GDLAT = DBLE(xlat)
|
|
|
GLON = DBLE(xlong)
|
|
|
GDALT = DBLE(height)
|
|
|
CALL CONVRT(1,GDLAT,GDALT,GCLAT,RKM)
|
|
|
|
|
|
C .....calculate magnetic field at observation point.....
|
|
|
T = DTR*(90.D0-GCLAT)
|
|
|
CT = DCOS(T)
|
|
|
ST = DSIN(T)
|
|
|
P = DTR*GLON
|
|
|
CP = DCOS(P)
|
|
|
SP = DSIN(P)
|
|
|
CALL MILMAG(TM,RKM,ST,CT,SP,CP,BR,BT,BP,B)
|
|
|
CALL GDV(GDLAT,GCLAT,BR,BT,BP,XB,YB,ZB)
|
|
|
BNORTH = XB
|
|
|
BEAST = YB
|
|
|
BDOWN = ZB
|
|
|
C
|
|
|
C .....calculate inclination.....
|
|
|
HB = DSQRT(XB*XB+YB*YB)
|
|
|
AINC = DATAN2(ZB,HB)
|
|
|
|
|
|
dipdiv=AINC/SQRT(AINC*AINC+cos(XLAT*DTR))
|
|
|
IF(ABS(dipdiv).GT.1.D0) dipdiv=SIGN(1.D0,dipdiv)
|
|
|
SMODIP=ASIN(dipdiv)
|
|
|
|
|
|
DIPL=REAL(ATAN(BDOWN/2.0/sqrt(BNORTH*BNORTH+BEAST*BEAST))/DTR)
|
|
|
YMODIP=REAL(SMODIP/DTR)
|
|
|
DIP=REAL(AINC/DTR)
|
|
|
RETURN
|
|
|
END
|
|
|
|