##// END OF EJS Templates
Fix bug in upload data
Fix bug in upload data

File last commit:

r0:b84e1135c2c4
r11:4a6fe1f2abe6
Show More
igrf.f
186 lines | 5.5 KiB | text/x-fortran | FortranFixedLexer
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