/[PAMELA software]/DarthVader/OrbitalInfo/src/igrf_sub.for
ViewVC logotype

Contents of /DarthVader/OrbitalInfo/src/igrf_sub.for

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (show annotations) (download)
Fri Jan 17 09:54:31 2014 UTC (10 years, 10 months ago) by mocchiut
Branch: MAIN
Changes since 1.8: +13 -49 lines
IGRF fortran code runtime inf-loop fixed

1 c subroutine igrf_sub(xlat,xlong,year,height,
2 c & xl,icode,dip,dec)
3 c----------------------------------------------------------------
4 c INPUT:
5 c xlat geodatic latitude in degrees
6 c xlong geodatic longitude in degrees
7 c year decimal year (year+month/12.0-0.5 or year+day-of-year/365
8 c or 366 if leap year)
9 c height height in km
10 c OUTPUT:
11 c xl L value
12 c icode =1 L is correct; =2 L is not correct;
13 c =3 an approximation is used
14 c dip geomagnetic inclination in degrees
15 c dec geomagnetic declination in degress
16 c----------------------------------------------------------------
17 c
18 c REAL LATI,LONGI
19 c COMMON/GENER/ UMR,ERA,AQUAD,BQUAD
20 c SAVE /GENER/
21 C
22 c CALL INITIZE
23 c ibbb=0
24 c ALOG2=ALOG(2.)
25 c ISTART=1
26 c lati=xlat
27 c longi=xlong
28 c
29 C----------------CALCULATE PROFILES-----------------------------------
30 c
31 c CALL FELDCOF(YEAR,DIMO)
32 c CALL FELDG(LATI,LONGI,HEIGHT,BNORTH,BEAST,BDOWN,BABS)
33 c CALL SHELLG(LATI,LONGI,HEIGHT,DIMO,XL,ICODE,BAB1)
34 c DIP=ASIN(BDOWN/BABS)/UMR
35 c DEC=ASIN(BEAST/SQRT(BEAST*BEAST+BNORTH*BNORTH))/UMR
36 c RETURN
37 c END
38 c
39 c
40 C SHELLIG.FOR, Version 2.0, January 1992
41 C
42 C 11/01/91-DKB- SHELLG: lowest starting point for B0 search is 2
43 C 1/27/92-DKB- Adopted to IGRF-91 coeffcients model
44 C 2/05/92-DKB- Reduce variable-names: INTER(P)SHC,EXTRA(P)SHC,INITI(ALI)ZE
45 C 8/08/95-DKB- Updated to IGRF-45-95; new coeff. DGRF90, IGRF95, IGRF95S
46 C 5/31/00-DKB- Updated to IGRF-45-00; new coeff.: IGRF00, IGRF00s
47 C 3/24/05-DKB- Updated to IGRF-45-10; new coeff.: IGRF05, IGRF05s
48 C 4/25/05-DKB- CALL FELDI and DO 1111 I=1,7 [Alexey Petrov]
49 C
50 C*********************************************************************
51 C SUBROUTINES FINDB0, SHELLG, STOER, FELDG, FELDCOF, GETSHC, *
52 C INTERSHC, EXTRASHC, INITIZE *
53 C*********************************************************************
54 C*********************************************************************
55 C
56 C
57 SUBROUTINE FINDB0(STPS,BDEL,VALUE,BEQU,RR0)
58 C--------------------------------------------------------------------
59 C FINDS SMALLEST MAGNETIC FIELD STRENGTH ON FIELD LINE
60 C
61 C INPUT: STPS STEP SIZE FOR FIELD LINE TRACING
62 C COMMON/FIDB0/
63 C SP DIPOLE ORIENTED COORDINATES FORM SHELLG; P(1,*),
64 C P(2,*), P(3,*) CLOSEST TO MAGNETIC EQUATOR
65 C BDEL REQUIRED ACCURACY = [ B(LAST) - BEQU ] / BEQU
66 C B(LAST) IS FIELD STRENGTH BEFORE BEQU
67 C
68 C OUTPUT: VALUE =.FALSE., IF BEQU IS NOT MINIMAL VALUE ON FIELD LINE
69 C BEQU MAGNETIC FIELD STRENGTH AT MAGNETIC EQUATOR
70 C RR0 EQUATORIAL RADIUS NORMALIZED TO EARTH RADIUS
71 C BDEL FINAL ACHIEVED ACCURACY
72 C--------------------------------------------------------------------
73 DIMENSION P(8,4),SP(3)
74 LOGICAL VALUE
75 COMMON/FIDB0/ SP
76 SAVE /FIDB0/
77 C
78 STEP=STPS
79 IRUN=0
80 7777 IRUN=IRUN+1
81 IF(IRUN.GT.5) THEN
82 VALUE=.FALSE.
83 GOTO 8888
84 ENDIF
85 C*********************FIRST THREE POINTS
86 P(1,2)=SP(1)
87 P(2,2)=SP(2)
88 P(3,2)=SP(3)
89 STEP=-SIGN(STEP,P(3,2))
90 CALL STOER(P(1,2),BQ2,R2)
91 P(1,3)=P(1,2)+0.5*STEP*P(4,2)
92 P(2,3)=P(2,2)+0.5*STEP*P(5,2)
93 P(3,3)=P(3,2)+0.5*STEP
94 CALL STOER(P(1,3),BQ3,R3)
95 P(1,1)=P(1,2)-STEP*(2.*P(4,2)-P(4,3))
96 P(2,1)=P(2,2)-STEP*(2.*P(5,2)-P(5,3))
97 P(3,1)=P(3,2)-STEP
98 CALL STOER(P(1,1),BQ1,R1)
99 P(1,3)=P(1,2)+STEP*(20.*P(4,3)-3.*P(4,2)+P(4,1))/18.
100 P(2,3)=P(2,2)+STEP*(20.*P(5,3)-3.*P(5,2)+P(5,1))/18.
101 P(3,3)=P(3,2)+STEP
102 CALL STOER(P(1,3),BQ3,R3)
103 C******************INVERT SENSE IF REQUIRED
104 IF(BQ3.LE.BQ1) GOTO 2
105 STEP=-STEP
106 R3=R1
107 BQ3=BQ1
108 DO 1 I=1,5
109 ZZ=P(I,1)
110 P(I,1)=P(I,3)
111 1 P(I,3)=ZZ
112 C******************INITIALIZATION
113 2 STEP12=STEP/12.
114 VALUE=.TRUE.
115 BMIN=1.E4
116 BOLD=1.E4
117 C******************CORRECTOR (FIELD LINE TRACING)
118 N=0
119 5555 P(1,3)=P(1,2)+STEP12*(5.*P(4,3)+8.*P(4,2)-P(4,1))
120 N=N+1
121 P(2,3)=P(2,2)+STEP12*(5.*P(5,3)+8.*P(5,2)-P(5,1))
122 C******************PREDICTOR (FIELD LINE TRACING)
123 P(1,4)=P(1,3)+STEP12*(23.*P(4,3)-16.*P(4,2)+5.*P(4,1))
124 P(2,4)=P(2,3)+STEP12*(23.*P(5,3)-16.*P(5,2)+5.*P(5,1))
125 P(3,4)=P(3,3)+STEP
126 CALL STOER(P(1,4),BQ3,R3)
127 DO 1111 J=1,3
128 C DO 1111 I=1,8
129 DO 1111 I=1,7
130 1111 P(I,J)=P(I,J+1)
131 B=SQRT(BQ3)
132 IF(B.LT.BMIN) BMIN=B
133 IF(B.LE.BOLD) THEN
134 BOLD=B
135 ROLD=1./R3
136 SP(1)=P(1,4)
137 SP(2)=P(2,4)
138 SP(3)=P(3,4)
139 GOTO 5555
140 ENDIF
141 IF(BOLD.NE.BMIN) THEN
142 VALUE=.FALSE.
143 ENDIF
144 BDELTA=(B-BOLD)/BOLD
145 IF(BDELTA.GT.BDEL) THEN
146 STEP=STEP/10.
147 GOTO 7777
148 ENDIF
149 8888 RR0=ROLD
150 BEQU=BOLD
151 BDEL=BDELTA
152 RETURN
153 END
154 C
155 C
156 SUBROUTINE SHELLG(GLAT,GLON,ALT,DIMO,FL,ICODE,B0)
157 C--------------------------------------------------------------------
158 C CALCULATES L-VALUE FOR SPECIFIED GEODAETIC COORDINATES, ALTITUDE
159 C AND GEMAGNETIC FIELD MODEL.
160 C REF: G. KLUGE, EUROPEAN SPACE OPERATIONS CENTER, INTERNAL NOTE
161 C NO. 67, 1970.
162 C G. KLUGE, COMPUTER PHYSICS COMMUNICATIONS 3, 31-35, 1972
163 C--------------------------------------------------------------------
164 C CHANGES (D. BILITZA, NOV 87):
165 C - USING CORRECT DIPOL MOMENT I.E.,DIFFERENT COMMON/MODEL/
166 C - USING IGRF EARTH MAGNETIC FIELD MODELS FROM 1945 TO 1990
167 C--------------------------------------------------------------------
168 C INPUT: ENTRY POINT SHELLG
169 C GLAT GEODETIC LATITUDE IN DEGREES (NORTH)
170 C GLON GEODETIC LONGITUDE IN DEGREES (EAST)
171 C ALT ALTITUDE IN KM ABOVE SEA LEVEL
172 C
173 C ENTRY POINT SHELLC
174 C V(3) CARTESIAN COORDINATES IN EARTH RADII (6371.2 KM)
175 C X-AXIS POINTING TO EQUATOR AT 0 LONGITUDE
176 C Y-AXIS POINTING TO EQUATOR AT 90 LONG.
177 C Z-AXIS POINTING TO NORTH POLE
178 C
179 C DIMO DIPOL MOMENT IN GAUSS (NORMALIZED TO EARTH RADIUS)
180 C
181 C COMMON
182 C X(3) NOT USED
183 C H(144) FIELD MODEL COEFFICIENTS ADJUSTED FOR SHELLG
184 C-----------------------------------------------------------------------
185 C OUTPUT: FL L-VALUE
186 C ICODE =1 NORMAL COMPLETION
187 C =2 UNPHYSICAL CONJUGATE POINT (FL MEANINGLESS)
188 C =3 SHELL PARAMETER GREATER THAN LIMIT UP TO
189 C WHICH ACCURATE CALCULATION IS REQUIRED;
190 C APPROXIMATION IS USED.
191 C B0 MAGNETIC FIELD STRENGTH IN GAUSS
192 C-----------------------------------------------------------------------
193 DIMENSION V(3),U(3,3),P(8,100),SP(3)
194 COMMON X(3),H(196)
195 COMMON/FIDB0/ SP
196 SAVE /FIDB0/
197 COMMON/GENER/ UMR,ERA,AQUAD,BQUAD
198 SAVE /GENER/
199 C
200 C-- RMIN, RMAX ARE BOUNDARIES FOR IDENTIFICATION OF ICODE=2 AND 3
201 C-- STEP IS STEP SIZE FOR FIELD LINE TRACING
202 C-- STEQ IS STEP SIZE FOR INTEGRATION
203 C
204 DATA RMIN,RMAX /0.05,1.01/
205 DATA STEP,STEQ /0.20,0.03/
206 BEQU=1.E10
207 C*****ENTRY POINT SHELLG TO BE USED WITH GEODETIC CO-ORDINATES
208 RLAT=GLAT*UMR
209 CT=SIN(RLAT)
210 ST=COS(RLAT)
211 D=SQRT(AQUAD-(AQUAD-BQUAD)*CT*CT)
212 X(1)=(ALT+AQUAD/D)*ST/ERA
213 X(3)=(ALT+BQUAD/D)*CT/ERA
214 RLON=GLON*UMR
215 X(2)=X(1)*SIN(RLON)
216 X(1)=X(1)*COS(RLON)
217 GOTO9
218 ENTRY SHELLC(V,FL,B0)
219 C*****ENTRY POINT SHELLC TO BE USED WITH CARTESIAN CO-ORDINATES
220 X(1)=V(1)
221 X(2)=V(2)
222 X(3)=V(3)
223 C*****CONVERT TO DIPOL-ORIENTED CO-ORDINATES
224 DATA U/ +0.3511737,-0.9148385,-0.1993679,
225 A +0.9335804,+0.3583680,+0.0000000,
226 B +0.0714471,-0.1861260,+0.9799247/
227 9 RQ=1./(X(1)*X(1)+X(2)*X(2)+X(3)*X(3))
228 R3H=SQRT(RQ*SQRT(RQ))
229 P(1,2)=(X(1)*U(1,1)+X(2)*U(2,1)+X(3)*U(3,1))*R3H
230 P(2,2)=(X(1)*U(1,2)+X(2)*U(2,2) )*R3H
231 P(3,2)=(X(1)*U(1,3)+X(2)*U(2,3)+X(3)*U(3,3))*RQ
232 C*****FIRST THREE POINTS OF FIELD LINE
233 STEP=-SIGN(STEP,P(3,2))
234 CALL STOER(P(1,2),BQ2,R2)
235 B0=SQRT(BQ2)
236 P(1,3)=P(1,2)+0.5*STEP*P(4,2)
237 P(2,3)=P(2,2)+0.5*STEP*P(5,2)
238 P(3,3)=P(3,2)+0.5*STEP
239 CALL STOER(P(1,3),BQ3,R3)
240 P(1,1)=P(1,2)-STEP*(2.*P(4,2)-P(4,3))
241 P(2,1)=P(2,2)-STEP*(2.*P(5,2)-P(5,3))
242 P(3,1)=P(3,2)-STEP
243 CALL STOER(P(1,1),BQ1,R1)
244 P(1,3)=P(1,2)+STEP*(20.*P(4,3)-3.*P(4,2)+P(4,1))/18.
245 P(2,3)=P(2,2)+STEP*(20.*P(5,3)-3.*P(5,2)+P(5,1))/18.
246 P(3,3)=P(3,2)+STEP
247 CALL STOER(P(1,3),BQ3,R3)
248 C*****INVERT SENSE IF REQUIRED
249 IF(BQ3.LE.BQ1)GOTO2
250 STEP=-STEP
251 R3=R1
252 BQ3=BQ1
253 DO 1 I=1,7
254 ZZ=P(I,1)
255 P(I,1)=P(I,3)
256 1 P(I,3)=ZZ
257 C*****SEARCH FOR LOWEST MAGNETIC FIELD STRENGTH
258 2 IF(BQ1.LT.BEQU) THEN
259 BEQU=BQ1
260 IEQU=1
261 ENDIF
262 IF(BQ2.LT.BEQU) THEN
263 BEQU=BQ2
264 IEQU=2
265 ENDIF
266 IF(BQ3.LT.BEQU) THEN
267 BEQU=BQ3
268 IEQU=3
269 ENDIF
270 C*****INITIALIZATION OF INTEGRATION LOOPS
271 STEP12=STEP/12.
272 STEP2=STEP+STEP
273 STEQ=SIGN(STEQ,STEP)
274 FI=0.
275 ICODE=1
276 ORADIK=0.
277 OTERM=0.
278 STP=R2*STEQ
279 Z=P(3,2)+STP
280 STP=STP/0.75
281 P(8,1)=STEP2*(P(1,1)*P(4,1)+P(2,1)*P(5,1))
282 P(8,2)=STEP2*(P(1,2)*P(4,2)+P(2,2)*P(5,2))
283 C*****MAIN LOOP (FIELD LINE TRACING)
284 DO 3 N=3,3333
285 C*****CORRECTOR (FIELD LINE TRACING)
286 P(1,N)=P(1,N-1)+STEP12*(5.*P(4,N)+8.*P(4,N-1)-P(4,N-2))
287 P(2,N)=P(2,N-1)+STEP12*(5.*P(5,N)+8.*P(5,N-1)-P(5,N-2))
288 C*****PREPARE EXPANSION COEFFICIENTS FOR INTERPOLATION
289 C*****OF SLOWLY VARYING QUANTITIES
290 P(8,N)=STEP2*(P(1,N)*P(4,N)+P(2,N)*P(5,N))
291 C0=P(1,N-1)**2+P(2,N-1)**2
292 C1=P(8,N-1)
293 C2=(P(8,N)-P(8,N-2))*0.25
294 C3=(P(8,N)+P(8,N-2)-C1-C1)/6.0
295 D0=P(6,N-1)
296 D1=(P(6,N)-P(6,N-2))*0.5
297 D2=(P(6,N)+P(6,N-2)-D0-D0)*0.5
298 E0=P(7,N-1)
299 E1=(P(7,N)-P(7,N-2))*0.5
300 E2=(P(7,N)+P(7,N-2)-E0-E0)*0.5
301 C*****INNER LOOP (FOR QUADRATURE)
302 4 T=(Z-P(3,N-1))/STEP
303 IF(T.GT.1.)GOTO5
304 HLI=0.5*(((C3*T+C2)*T+C1)*T+C0)
305 ZQ=Z*Z
306 R=HLI+SQRT(HLI*HLI+ZQ)
307 IF(R.LE.RMIN)GOTO30
308 RQ=R*R
309 FF=SQRT(1.+3.*ZQ/RQ)
310 RADIK=B0-((D2*T+D1)*T+D0)*R*RQ*FF
311 IF((R-RMAX).le.0.) goto 44
312 IF((R-RMAX).gt.0.) goto 45
313 45 ICODE=2
314 RADIK=RADIK-12.*(R-RMAX)**2
315 44 IF(RADIK+RADIK.LE.ORADIK) GOTO 10
316 TERM=SQRT(RADIK)*FF*((E2*T+E1)*T+E0)/(RQ+ZQ)
317 FI=FI+STP*(OTERM+TERM)
318 ORADIK=RADIK
319 OTERM=TERM
320 STP=R*STEQ
321 Z=Z+STP
322 GOTO4
323 C*****PREDICTOR (FIELD LINE TRACING)
324 5 P(1,N+1)=P(1,N)+STEP12*(23.*P(4,N)-16.*P(4,N-1)+5.*P(4,N-2))
325 P(2,N+1)=P(2,N)+STEP12*(23.*P(5,N)-16.*P(5,N-1)+5.*P(5,N-2))
326 P(3,N+1)=P(3,N)+STEP
327 CALL STOER(P(1,N+1),BQ3,R3)
328 C*****SEARCH FOR LOWEST MAGNETIC FIELD STRENGTH
329 IF(BQ3.LT.BEQU) THEN
330 IEQU=N+1
331 BEQU=BQ3
332 ENDIF
333 3 CONTINUE
334 10 IF(IEQU.lt.2) IEQU=2
335 SP(1)=P(1,IEQU-1)
336 SP(2)=P(2,IEQU-1)
337 SP(3)=P(3,IEQU-1)
338 IF(ORADIK.LT.1E-15)GOTO11
339 FI=FI+STP/0.75*OTERM*ORADIK/(ORADIK-RADIK)
340 C
341 C-- The minimal allowable value of FI was changed from 1E-15 to 1E-12,
342 C-- because 1E-38 is the minimal allowable arg. for ALOG in our envir.
343 C-- D. Bilitza, Nov 87.
344 C
345 11 FI=0.5*ABS(FI)/SQRT(B0)+1E-12
346 C
347 C*****COMPUTE L FROM B AND I. SAME AS CARMEL IN INVAR.
348 C
349 C-- Correct dipole moment is used here. D. Bilitza, Nov 87.
350 C
351 DIMOB0=DIMO/B0
352 arg1=alog(FI)
353 arg2=alog(DIMOB0)
354 c arg = FI*FI*FI/DIMOB0
355 c if(abs(arg).gt.88.0) arg=88.0
356 XX=3*arg1-arg2
357 IF(XX.GT.23.0) GOTO 776
358 IF(XX.GT.11.7) GOTO 775
359 IF(XX.GT.+3.0) GOTO 774
360 IF(XX.GT.-3.0) GOTO 773
361 IF(XX.GT.-22.) GOTO 772
362 c 771 GG=3.33338E-1*XX+3.0062102E-1
363 GG=3.33338E-1*XX+3.0062102E-1
364 GOTO777
365 772 GG=((((((((-8.1537735E-14*XX+8.3232531E-13)*XX+1.0066362E-9)*XX+
366 18.1048663E-8)*XX+3.2916354E-6)*XX+8.2711096E-5)*XX+1.3714667E-3)*
367 2XX+1.5017245E-2)*XX+4.3432642E-1)*XX+6.2337691E-1
368 GOTO777
369 773 GG=((((((((2.6047023E-10*XX+2.3028767E-9)*XX-2.1997983E-8)*XX-
370 15.3977642E-7)*XX-3.3408822E-6)*XX+3.8379917E-5)*XX+1.1784234E-3)*
371 2XX+1.4492441E-2)*XX+4.3352788E-1)*XX+6.228644E-1
372 GOTO777
373 774 GG=((((((((6.3271665E-10*XX-3.958306E-8)*XX+9.9766148E-07)*XX-
374 11.2531932E-5)*XX+7.9451313E-5)*XX-3.2077032E-4)*XX+2.1680398E-3)*
375 2XX+1.2817956E-2)*XX+4.3510529E-1)*XX+6.222355E-1
376 GOTO777
377 775 GG=(((((2.8212095E-8*XX-3.8049276E-6)*XX+2.170224E-4)*XX-6.7310339
378 1E-3)*XX+1.2038224E-1)*XX-1.8461796E-1)*XX+2.0007187E0
379 GOTO777
380 776 GG=XX-3.0460681E0
381 777 FL=EXP(ALOG((1.+EXP(GG))*DIMOB0)/3.0)
382 RETURN
383 C*****APPROXIMATION FOR HIGH VALUES OF L.
384 30 ICODE=3
385 T=-P(3,N-1)/STEP
386 FL=1./(ABS(((C3*T+C2)*T+C1)*T+C0)+1E-15)
387 RETURN
388 END
389 C
390 C
391 SUBROUTINE STOER(P,BQ,R)
392 C*******************************************************************
393 C* SUBROUTINE USED FOR FIELD LINE TRACING IN SHELLG *
394 C* CALLS ENTRY POINT FELDI IN GEOMAGNETIC FIELD SUBROUTINE FELDG *
395 C*******************************************************************
396 DIMENSION P(7),U(3,3)
397 COMMON XI(3),H(196)
398 C*****XM,YM,ZM ARE GEOMAGNETIC CARTESIAN INVERSE CO-ORDINATES
399 ZM=P(3)
400 FLI=P(1)*P(1)+P(2)*P(2)+1E-15
401 R=0.5*(FLI+SQRT(FLI*FLI+(ZM+ZM)**2))
402 RQ=R*R
403 WR=SQRT(R)
404 XM=P(1)*WR
405 YM=P(2)*WR
406 C*****TRANSFORM TO GEOGRAPHIC CO-ORDINATE SYSTEM
407 DATA U/ +0.3511737,-0.9148385,-0.1993679,
408 A +0.9335804,+0.3583680,+0.0000000,
409 B +0.0714471,-0.1861260,+0.9799247/
410 XI(1)=XM*U(1,1)+YM*U(1,2)+ZM*U(1,3)
411 XI(2)=XM*U(2,1)+YM*U(2,2)+ZM*U(2,3)
412 XI(3)=XM*U(3,1) +ZM*U(3,3)
413 C*****COMPUTE DERIVATIVES
414 C CALL FELDI(XI,H)
415 CALL FELDI
416 Q=H(1)/RQ
417 DX=H(3)+H(3)+Q*XI(1)
418 DY=H(4)+H(4)+Q*XI(2)
419 DZ=H(2)+H(2)+Q*XI(3)
420 C*****TRANSFORM BACK TO GEOMAGNETIC CO-ORDINATE SYSTEM
421 DXM=U(1,1)*DX+U(2,1)*DY+U(3,1)*DZ
422 DYM=U(1,2)*DX+U(2,2)*DY
423 DZM=U(1,3)*DX+U(2,3)*DY+U(3,3)*DZ
424 DR=(XM*DXM+YM*DYM+ZM*DZM)/R
425 C*****FORM SLOWLY VARYING EXPRESSIONS
426 P(4)=(WR*DXM-0.5*P(1)*DR)/(R*DZM)
427 P(5)=(WR*DYM-0.5*P(2)*DR)/(R*DZM)
428 DSQ=RQ*(DXM*DXM+DYM*DYM+DZM*DZM)
429 BQ=DSQ*RQ*RQ
430 P(6)=SQRT(DSQ/(RQ+3.*ZM*ZM))
431 P(7)=P(6)*(RQ+ZM*ZM)/(RQ*DZM)
432 RETURN
433 END
434 C
435 C
436 SUBROUTINE FELDG(GLAT,GLON,ALT,BNORTH,BEAST,BDOWN,BABS)
437 C-------------------------------------------------------------------
438 C CALCULATES EARTH MAGNETIC FIELD FROM SPHERICAL HARMONICS MODEL
439 C REF: G. KLUGE, EUROPEAN SPACE OPERATIONS CENTRE, INTERNAL NOTE 61,
440 C 1970.
441 C--------------------------------------------------------------------
442 C CHANGES (D. BILITZA, NOV 87):
443 C - FIELD COEFFICIENTS IN BINARY DATA FILES INSTEAD OF BLOCK DATA
444 C - CALCULATES DIPOL MOMENT
445 C--------------------------------------------------------------------
446 C INPUT: ENTRY POINT FELDG
447 C GLAT GEODETIC LATITUDE IN DEGREES (NORTH)
448 C GLON GEODETIC LONGITUDE IN DEGREES (EAST)
449 C ALT ALTITUDE IN KM ABOVE SEA LEVEL
450 C
451 C ENTRY POINT FELDC
452 C V(3) CARTESIAN COORDINATES IN EARTH RADII (6371.2 KM)
453 C X-AXIS POINTING TO EQUATOR AT 0 LONGITUDE
454 C Y-AXIS POINTING TO EQUATOR AT 90 LONG.
455 C Z-AXIS POINTING TO NORTH POLE
456 C
457 C COMMON BLANK AND ENTRY POINT FELDI ARE NEEDED WHEN USED
458 C IN CONNECTION WITH L-CALCULATION PROGRAM SHELLG.
459 C
460 C COMMON /MODEL/ AND /GENER/
461 C UMR = ATAN(1.0)*4./180. <DEGREE>*UMR=<RADIANT>
462 C ERA EARTH RADIUS FOR NORMALIZATION OF CARTESIAN
463 C COORDINATES (6371.2 KM)
464 C AQUAD, BQUAD SQUARE OF MAJOR AND MINOR HALF AXIS FOR
465 C EARTH ELLIPSOID AS RECOMMENDED BY INTERNATIONAL
466 C ASTRONOMICAL UNION (6378.160, 6356.775 KM).
467 C NMAX MAXIMUM ORDER OF SPHERICAL HARMONICS
468 C TIME YEAR (DECIMAL: 1973.5) FOR WHICH MAGNETIC
469 C FIELD IS TO BE CALCULATED
470 C G(M) NORMALIZED FIELD COEFFICIENTS (SEE FELDCOF)
471 C M=NMAX*(NMAX+2)
472 C------------------------------------------------------------------------
473 C OUTPUT: BABS MAGNETIC FIELD STRENGTH IN GAUSS
474 C BNORTH, BEAST, BDOWN COMPONENTS OF THE FIELD WITH RESPECT
475 C TO THE LOCAL GEODETIC COORDINATE SYSTEM, WITH AXIS
476 C POINTING IN THE TANGENTIAL PLANE TO THE NORTH, EAST
477 C AND DOWNWARD.
478 C-----------------------------------------------------------------------
479 DIMENSION V(3),B(3),G(196)
480 CHARACTER*258 NAME
481 INTEGER NMAX
482 REAL TIME
483 COMMON XI(3),H(196)
484 COMMON/MODEL/ G,NMAX,TIME,NAME
485 SAVE/MODEL/
486 COMMON/GENER/ UMR,ERA,AQUAD,BQUAD
487 SAVE/GENER/
488 C
489 C-- IS RECORDS ENTRY POINT
490 C
491 C*****ENTRY POINT FELDG TO BE USED WITH GEODETIC CO-ORDINATES
492 IS=1
493 RLAT=GLAT*UMR
494 CT=SIN(RLAT)
495 ST=COS(RLAT)
496 D=SQRT(AQUAD-(AQUAD-BQUAD)*CT*CT)
497 RLON=GLON*UMR
498 CP=COS(RLON)
499 SP=SIN(RLON)
500 ZZZ=(ALT+BQUAD/D)*CT/ERA
501 RHO=(ALT+AQUAD/D)*ST/ERA
502 XXX=RHO*CP
503 YYY=RHO*SP
504 GOTO10
505 ENTRY FELDC(V,B)
506 C*****ENTRY POINT FELDC TO BE USED WITH CARTESIAN CO-ORDINATES
507 IS=2
508 XXX=V(1)
509 YYY=V(2)
510 ZZZ=V(3)
511 10 RQ=1./(XXX*XXX+YYY*YYY+ZZZ*ZZZ)
512 XI(1)=XXX*RQ
513 XI(2)=YYY*RQ
514 XI(3)=ZZZ*RQ
515 GOTO20
516 ENTRY FELDI
517 C*****ENTRY POINT FELDI USED FOR L COMPUTATION
518 IS=3
519 20 IHMAX=NMAX*NMAX+1
520 LAST=IHMAX+NMAX+NMAX
521 IMAX=NMAX+NMAX-1
522 DO 8 I=IHMAX,LAST
523 8 H(I)=G(I)
524 DO 6 K=1,3,2
525 I=IMAX
526 IH=IHMAX
527 1 IL=IH-I
528 F=2./FLOAT(I-K+2)
529 X=XI(1)*F
530 Y=XI(2)*F
531 Z=XI(3)*(F+F)
532 I=I-2
533 c print *,' I ',I
534 IF((I-1).lt.0) goto 5
535 IF((I-1).eq.0) goto 4
536 IF((I-1).gt.0) goto 2
537 2 DO 3 M=3,I,2
538 H(IL+M+1)=G(IL+M+1)+Z*H(IH+M+1)+X*(H(IH+M+3)-H(IH+M-1))
539 A -Y*(H(IH+M+2)+H(IH+M-2))
540 3 H(IL+M)=G(IL+M)+Z*H(IH+M)+X*(H(IH+M+2)-H(IH+M-2))
541 A +Y*(H(IH+M+3)+H(IH+M-1))
542 4 H(IL+2)=G(IL+2)+Z*H(IH+2)+X*H(IH+4)-Y*(H(IH+3)+H(IH))
543 H(IL+1)=G(IL+1)+Z*H(IH+1)+Y*H(IH+4)+X*(H(IH+3)-H(IH))
544 5 H(IL)=G(IL)+Z*H(IH)+2.*(X*H(IH+1)+Y*H(IH+2))
545 IH=IL
546 IF(I.GE.K)GOTO1
547 6 CONTINUE
548 IF(IS.EQ.3)RETURN
549 S=.5*H(1)+2.*(H(2)*XI(3)+H(3)*XI(1)+H(4)*XI(2))
550 T=(RQ+RQ)*SQRT(RQ)
551 BXXX=T*(H(3)-S*XXX)
552 BYYY=T*(H(4)-S*YYY)
553 BZZZ=T*(H(2)-S*ZZZ)
554 IF(IS.EQ.2)GOTO7
555 BABS=SQRT(BXXX*BXXX+BYYY*BYYY+BZZZ*BZZZ)
556 BEAST=BYYY*CP-BXXX*SP
557 BRHO=BYYY*SP+BXXX*CP
558 BNORTH=BZZZ*ST-BRHO*CT
559 BDOWN=-BZZZ*CT-BRHO*ST
560 RETURN
561 7 B(1)=BXXX
562 B(2)=BYYY
563 B(3)=BZZZ
564 RETURN
565 END
566 C
567 C
568 SUBROUTINE FELDCOF(YEAR,DIMO)
569 C------------------------------------------------------------------------
570 C DETERMINES COEFFICIENTS AND DIPOL MOMENT FROM IGRF MODELS
571 C
572 C INPUT: YEAR DECIMAL YEAR FOR WHICH GEOMAGNETIC FIELD IS TO
573 C BE CALCULATED
574 C OUTPUT: DIMO GEOMAGNETIC DIPOL MOMENT IN GAUSS (NORMALIZED
575 C TO EARTH'S RADIUS) AT THE TIME (YEAR)
576 C D. BILITZA, NSSDC, GSFC, CODE 633, GREENBELT, MD 20771,
577 C (301)286-9536 NOV 1987.
578 C ### updated to IGRF-2000 version -dkb- 5/31/2000
579 C ### updated to IGRF-2005 version -dkb- 3/24/2000
580 C-----------------------------------------------------------------------
581 CHARACTER*258 FIL1, FIL2
582 CHARACTER*258 FILMOD
583 C ### FILMOD, DTEMOD arrays +1
584 c DIMENSION GH1(144),GH2(120),GHA(144),FILMOD(14),DTEMOD(14)
585 DIMENSION GH1(196),GH2(196),GHA(196),FILMOD(3),DTEMOD(3)
586 DOUBLE PRECISION X,F0,F
587 INTEGER L1,L2,L3
588 INTEGER NMAX
589 REAL TIME
590 CHARACTER *258 P1,P2,P3
591 COMMON/PPATH/ L1,L2,L3,P1, P2, P3
592 SAVE/PPATH/
593 COMMON/MODEL/ GH1,NMAX,TIME,FIL1
594 SAVE/MODEL/
595 COMMON/GENER/ UMR,ERAD,AQUAD,BQUAD
596 SAVE/GENER/
597 C ### updated to 2005
598 C CHARACTER COEFPATH*80, COEF1*80, COEF2*80, COEF3*80
599
600 c COEFPATH = 'OrbitalInfo/src/'
601 c COEF1 = 'dgrf00.dat'
602 c COEF2 = 'igrf05.dat'
603 c COEF3 = 'igrf05s.dat'
604 c COEF1 = COEFPATH(1:16)//COEF1
605 c COEF2 = COEFPATH(1:16)//COEF2
606 c COEF3 = COEFPATH(1:16)//COEF3
607 c FILMOD(1) = COEF1
608 c FILMOD(2) = COEF2
609 c FILMOD(3) = COEF3
610 c print *, "qui"
611 FILMOD(1) = P1(1:L1)
612 FILMOD(2) = P2(1:L2)
613 FILMOD(3) = P3(1:L3)
614 c print *, "qua"
615 c FILMOD(1) = 'OrbitalInfo/src/dgrf00.dat'
616 c FILMOD(2) = 'OrbitalInfo/src/igrf05.dat'
617 c FILMOD(3) = 'OrbitalInfo/src/igrf05s.dat'
618 c WRITE(*,*) FILMOD(1)
619 c WRITE(*,*) FILMOD(2)
620 c WRITE(*,*) FILMOD(3)
621 c DATA FILMOD / 'dgrf00.dat', 'igrf05.dat', 'igrf05s.dat'/
622 DATA DTEMOD / 2005., 2010., 2015./
623 c
624 c DATA FILMOD /'dgrf45.dat', 'dgrf50.dat',
625 c 1 'dgrf55.dat', 'dgrf60.dat', 'dgrf65.dat',
626 c 2 'dgrf70.dat', 'dgrf75.dat', 'dgrf80.dat',
627 c 3 'dgrf85.dat', 'dgrf90.dat', 'dgrf95.dat',
628 c 4 'dgrf00.dat','igrf05.dat','igrf05s.dat'/
629 c DATA DTEMOD / 1945., 1950., 1955., 1960., 1965., 1970.,
630 c 1 1975., 1980., 1985., 1990., 1995., 2000.,2005.,2010./
631 C
632 C ### numye = numye + 1 ; is number of years represented by IGRF
633 C
634 c NUMYE=13
635 NUMYE=2
636 c print *, "quo"
637
638 C
639 C IS=0 FOR SCHMIDT NORMALIZATION IS=1 GAUSS NORMALIZATION
640 C IU IS INPUT UNIT NUMBER FOR IGRF COEFFICIENT SETS
641 C
642 IU = 10
643 IS = 0
644 C-- DETERMINE IGRF-YEARS FOR INPUT-YEAR
645 TIME = YEAR
646 IYEA = INT(YEAR/5.)*5
647 c L = (IYEA - 1945)/5 + 1
648 L = (IYEA - 2000)/5 + 1
649 IF(L.LT.1) L=1
650 IF(L.GT.NUMYE) L=NUMYE
651 DTE1 = DTEMOD(L)
652 FIL1 = FILMOD(L)
653 DTE2 = DTEMOD(L+1)
654 FIL2 = FILMOD(L+1)
655 c WRITE(*,*) FIL1
656 c WRITE(*,*) FIL2
657 c print *, "que"
658 C-- GET IGRF COEFFICIENTS FOR THE BOUNDARY YEARS
659 CALL GETSHC (IU, FIL1, NMAX1, ERAD, GH1, IER)
660 IF (IER .NE. 0) STOP
661 c print *, "quessss"
662 CALL GETSHC (IU, FIL2, NMAX2, ERAD, GH2, IER)
663 IF (IER .NE. 0) STOP
664 c print *, "quj"
665 C-- DETERMINE IGRF COEFFICIENTS FOR YEAR
666 IF (L .LE. NUMYE-1) THEN
667 CALL INTERSHC (YEAR, DTE1, NMAX1, GH1, DTE2,
668 1 NMAX2, GH2, NMAX, GHA)
669 ELSE
670 CALL EXTRASHC (YEAR, DTE1, NMAX1, GH1, NMAX2,
671 1 GH2, NMAX, GHA)
672 ENDIF
673 c print *, "quw"
674 C-- DETERMINE MAGNETIC DIPOL MOMENT AND COEFFIECIENTS G
675 F0=0.D0
676 DO 1234 J=1,3
677 F = GHA(J) * 1.D-5
678 F0 = F0 + F * F
679 1234 CONTINUE
680 DIMO = REAL(DSQRT(F0))
681
682 GH1(1) = 0.0
683 I=2
684 F0=1.D-5
685 IF(IS.EQ.0) F0=-F0
686 SQRT2=SQRT(2.)
687
688 c print *, "quq"
689
690 DO 9 N=1,NMAX
691 X = N
692 F0 = F0 * X * X / (4.D0 * X - 2.D0)
693 IF(IS.EQ.0) F0 = F0 * (2.D0 * X - 1.D0) / X
694 F = F0 * 0.5D0
695 IF(IS.EQ.0) F = F * SQRT2
696 GH1(I) = GHA(I-1) * REAL(F0)
697 I = I+1
698 DO 9 M=1,N
699 F = F * (X + M) / (X - M + 1.D0)
700 IF(IS.EQ.0) F = F * DSQRT((X - M + 1.D0) / (X + M))
701 GH1(I) = GHA(I-1) * REAL(F)
702 GH1(I+1) = GHA(I) * REAL(F)
703 I=I+2
704 9 CONTINUE
705 RETURN
706 END
707 C
708 C
709 SUBROUTINE GETSHC (IU, FSPEC, NMAX, ERAD, GH, IER)
710
711 C ===============================================================
712 C
713 C Version 1.01
714 C
715 C Reads spherical harmonic coefficients from the specified
716 C file into an array.
717 C
718 C Input:
719 C IU - Logical unit number
720 C FSPEC - File specification
721 C
722 C Output:
723 C NMAX - Maximum degree and order of model
724 C ERAD - Earth's radius associated with the spherical
725 C harmonic coefficients, in the same units as
726 C elevation
727 C GH - Schmidt quasi-normal internal spherical
728 C harmonic coefficients
729 C IER - Error number: = 0, no error
730 C = -2, records out of order
731 C = FORTRAN run-time error number
732 C
733 C A. Zunde
734 C USGS, MS 964, Box 25046 Federal Center, Denver, CO 80225
735 C
736 C ===============================================================
737
738 CHARACTER FSPEC*(*), FOUT*258
739 DIMENSION GH(*)
740 C ---------------------------------------------------------------
741 C Open coefficient file. Read past first header record.
742 C Read degree and order of model and Earth's radius.
743 C ---------------------------------------------------------------
744 WRITE(FOUT,667) FSPEC
745 c 667 FORMAT('/usr/local/etc/httpd/cgi-bin/natasha/IRI/',A12)
746 667 FORMAT(A258)
747 c print *," gui"
748 OPEN (IU, FILE=FOUT, STATUS='OLD', IOSTAT=IER, ERR=999)
749 c print *," gua"
750 READ (IU, *, IOSTAT=IER, ERR=999)
751 c print *," gue"
752 READ (IU, *, IOSTAT=IER, ERR=999) NMAX, ERAD
753 c print *," guo"
754 C ---------------------------------------------------------------
755 C Read the coefficient file, arranged as follows:
756 C
757 C N M G H
758 C ----------------------
759 C / 1 0 GH(1) -
760 C / 1 1 GH(2) GH(3)
761 C / 2 0 GH(4) -
762 C / 2 1 GH(5) GH(6)
763 C NMAX*(NMAX+3)/2 / 2 2 GH(7) GH(8)
764 C records \ 3 0 GH(9) -
765 C \ . . . .
766 C \ . . . .
767 C NMAX*(NMAX+2) \ . . . .
768 C elements in GH \ NMAX NMAX . .
769 C
770 C N and M are, respectively, the degree and order of the
771 C coefficient.
772 C ---------------------------------------------------------------
773
774 I = 0
775 DO 2211 NN = 1, NMAX
776 DO 2233 MM = 0, NN
777 READ (IU, *, IOSTAT=IER, ERR=999) N, M, G, H
778 IF (NN .NE. N .OR. MM .NE. M) THEN
779 IER = -2
780 GOTO 999
781 ENDIF
782 I = I + 1
783 GH(I) = G
784 IF (M .NE. 0) THEN
785 I = I + 1
786 GH(I) = H
787 ENDIF
788 2233 CONTINUE
789 2211 CONTINUE
790 c print *," guj"
791
792 999 CLOSE (IU)
793 c print *," guw IER",IER
794 if ( IER .eq. -1 ) IER = 0 ! gfortran 4.1.2 bug workaround... hoping not to create problems with other versions
795
796 RETURN
797 END
798 C
799 C
800 SUBROUTINE INTERSHC (DATE, DTE1, NMAX1, GH1, DTE2,
801 1 NMAX2, GH2, NMAX, GH)
802
803 C ===============================================================
804 C
805 C Version 1.01
806 C
807 C Interpolates linearly, in time, between two spherical
808 C harmonic models.
809 C
810 C Input:
811 C DATE - Date of resulting model (in decimal year)
812 C DTE1 - Date of earlier model
813 C NMAX1 - Maximum degree and order of earlier model
814 C GH1 - Schmidt quasi-normal internal spherical
815 C harmonic coefficients of earlier model
816 C DTE2 - Date of later model
817 C NMAX2 - Maximum degree and order of later model
818 C GH2 - Schmidt quasi-normal internal spherical
819 C harmonic coefficients of later model
820 C
821 C Output:
822 C GH - Coefficients of resulting model
823 C NMAX - Maximum degree and order of resulting model
824 C
825 C A. Zunde
826 C USGS, MS 964, Box 25046 Federal Center, Denver, CO 80225
827 C
828 C ===============================================================
829
830 DIMENSION GH1(*), GH2(*), GH(*)
831
832 C ---------------------------------------------------------------
833 C The coefficients (GH) of the resulting model, at date
834 C DATE, are computed by linearly interpolating between the
835 C coefficients of the earlier model (GH1), at date DTE1,
836 C and those of the later model (GH2), at date DTE2. If one
837 C model is smaller than the other, the interpolation is
838 C performed with the missing coefficients assumed to be 0.
839 C ---------------------------------------------------------------
840
841 FACTOR = (DATE - DTE1) / (DTE2 - DTE1)
842
843 IF (NMAX1 .EQ. NMAX2) THEN
844 K = NMAX1 * (NMAX1 + 2)
845 NMAX = NMAX1
846 ELSE IF (NMAX1 .GT. NMAX2) THEN
847 K = NMAX2 * (NMAX2 + 2)
848 L = NMAX1 * (NMAX1 + 2)
849 DO 1122 I = K + 1, L
850 1122 GH(I) = GH1(I) + FACTOR * (-GH1(I))
851 NMAX = NMAX1
852 ELSE
853 K = NMAX1 * (NMAX1 + 2)
854 L = NMAX2 * (NMAX2 + 2)
855 DO 1133 I = K + 1, L
856 1133 GH(I) = FACTOR * GH2(I)
857 NMAX = NMAX2
858 ENDIF
859
860 DO 1144 I = 1, K
861 1144 GH(I) = GH1(I) + FACTOR * (GH2(I) - GH1(I))
862
863 RETURN
864 END
865 C
866 C
867 SUBROUTINE EXTRASHC (DATE, DTE1, NMAX1, GH1, NMAX2,
868 1 GH2, NMAX, GH)
869
870 C ===============================================================
871 C
872 C Version 1.01
873 C
874 C Extrapolates linearly a spherical harmonic model with a
875 C rate-of-change model.
876 C
877 C Input:
878 C DATE - Date of resulting model (in decimal year)
879 C DTE1 - Date of base model
880 C NMAX1 - Maximum degree and order of base model
881 C GH1 - Schmidt quasi-normal internal spherical
882 C harmonic coefficients of base model
883 C NMAX2 - Maximum degree and order of rate-of-change
884 C model
885 C GH2 - Schmidt quasi-normal internal spherical
886 C harmonic coefficients of rate-of-change model
887 C
888 C Output:
889 C GH - Coefficients of resulting model
890 C NMAX - Maximum degree and order of resulting model
891 C
892 C A. Zunde
893 C USGS, MS 964, Box 25046 Federal Center, Denver, CO 80225
894 C
895 C ===============================================================
896
897 DIMENSION GH1(*), GH2(*), GH(*)
898
899 C ---------------------------------------------------------------
900 C The coefficients (GH) of the resulting model, at date
901 C DATE, are computed by linearly extrapolating the coef-
902 C ficients of the base model (GH1), at date DTE1, using
903 C those of the rate-of-change model (GH2), at date DTE2. If
904 C one model is smaller than the other, the extrapolation is
905 C performed with the missing coefficients assumed to be 0.
906 C ---------------------------------------------------------------
907
908 FACTOR = (DATE - DTE1)
909
910 IF (NMAX1 .EQ. NMAX2) THEN
911 K = NMAX1 * (NMAX1 + 2)
912 NMAX = NMAX1
913 ELSE IF (NMAX1 .GT. NMAX2) THEN
914 K = NMAX2 * (NMAX2 + 2)
915 L = NMAX1 * (NMAX1 + 2)
916 DO 1155 I = K + 1, L
917 1155 GH(I) = GH1(I)
918 NMAX = NMAX1
919 ELSE
920 K = NMAX1 * (NMAX1 + 2)
921 L = NMAX2 * (NMAX2 + 2)
922 DO 1166 I = K + 1, L
923 1166 GH(I) = FACTOR * GH2(I)
924 NMAX = NMAX2
925 ENDIF
926
927 DO 1177 I = 1, K
928 1177 GH(I) = GH1(I) + FACTOR * GH2(I)
929
930 RETURN
931 END
932 C
933 C
934 SUBROUTINE INITIZE(TP1,TL1,TP2,TL2,TP3,TL3)
935 C----------------------------------------------------------------
936 C Initializes the parameters in COMMON/GENER/
937 C
938 C UMR = ATAN(1.0)*4./180. <DEGREE>*UMR=<RADIANT>
939 C ERA EARTH RADIUS FOR NORMALIZATION OF CARTESIAN
940 C COORDINATES (6371.2 KM)
941 C EREQU MAJOR HALF AXIS FOR EARTH ELLIPSOID (6378.160 KM)
942 C ERPOL MINOR HALF AXIS FOR EARTH ELLIPSOID (6356.775 KM)
943 C AQUAD SQUARE OF MAJOR HALF AXIS FOR EARTH ELLIPSOID
944 C BQUAD SQUARE OF MINOR HALF AXIS FOR EARTH ELLIPSOID
945 C
946 C ERA, EREQU and ERPOL as recommended by the INTERNATIONAL
947 C ASTRONOMICAL UNION .
948 C-----------------------------------------------------------------
949 INTEGER TL1,TL2,TL3
950 CHARACTER (len=258) TP1,TP2,TP3
951 INTEGER L1,L2,L3
952 CHARACTER *258 P1,P2,P3
953 COMMON/PPATH/ L1,L2,L3,P1, P2, P3
954 SAVE/PPATH/
955
956 COMMON/GENER/UMR,ERA,AQUAD,BQUAD
957 SAVE/GENER/
958
959 L1 = TL1
960 L2 = TL2
961 L3 = TL3
962 P1 = TP1(1:L1)
963 P2 = TP2(1:L2)
964 P3 = TP3(1:L3)
965
966 ERA=6371.2
967 EREQU=6378.16
968 ERPOL=6356.775
969 AQUAD=EREQU*EREQU
970 BQUAD=ERPOL*ERPOL
971 UMR=ATAN(1.0)*4./180.
972 RETURN
973 END

  ViewVC Help
Powered by ViewVC 1.1.23