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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (hide annotations) (download)
Thu Jan 16 15:29:26 2014 UTC (10 years, 10 months ago) by mocchiut
Branch: MAIN
Changes since 1.7: +65 -29 lines
Compilation warnings using GCC4.7 fixed

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

  ViewVC Help
Powered by ViewVC 1.1.23