1 |
C BILCAL, VERSION 3.0, AUGUST 1995 |
2 |
C |
3 |
Cmm/dd/yy |
4 |
C 1/25/92-DKB-Modified for use with the IGRF-91 coefficients, which |
5 |
C were provided by R. Langel, GSFC. |
6 |
C 2/ 5/92-DKB-Reduce variable-name: INITI(ALI)ZE |
7 |
C 3/25/96-DKB-Modified for use with the IGRF-95 coefficients, which |
8 |
C were provided by R. Langel, GSFC. |
9 |
C 6/ 6/00-DKB-Modified for use with IGRF-2000 coefficients. |
10 |
C11/14/01-DKB-Add IMIN=0 above 4927 READ(...) [Rui Pereira] |
11 |
C04/25/05-DKB-IBBB instead of IBB in data statem. [Alexey Petrov] |
12 |
C |
13 |
C***************************************************************** |
14 |
C**************** IGRF MAGNETIC FIELD MODEL ********************* |
15 |
C**************** SHELLG L-VALUE CALCULATION ********************* |
16 |
C***************************************************************** |
17 |
C***************************************************************** |
18 |
C*** THIS PROGRAM PRODUCES PROFILES OF: *** |
19 |
C*** GEOMAGNETIC FIELD STRENGTH (GAUSS) *** |
20 |
C*** L-VALUE *** |
21 |
C***************************************************************** |
22 |
C*** FOR SPECIFIED: *** |
23 |
C*** YEAR (DECIMAL YEAR, E.G., 1995.5 FOR MID 1995) *** |
24 |
C*** GEODATIC LATITUDE AND LONGITUDE (DEGREE) *** |
25 |
C*** ALTITUDE (KM) *** |
26 |
C***************************************************************** |
27 |
C***************************************************************** |
28 |
C* --------------------ADDRESS-------------------------- * |
29 |
C* I DR. DIETER BILITZA (301)513-1664 I * |
30 |
C* I GSFC, NSSDC, CODE 933, GREENBELT, MD 20771, USA I * |
31 |
C* I SPAN: NSSDCA::BILITZA, NSSDC::BILITZA I * |
32 |
C* I BITNET: BILITZA%NSSDCA.SPAN@DFTNIC.BITNET I * |
33 |
C* ----------------------------------------------------- * |
34 |
C***************************************************************** |
35 |
C***************************************************************** |
36 |
C***************************************************************** |
37 |
INTEGER EGNR,AGNR,OGNR |
38 |
REAL LATI,LONGI,MLAT,MLONG |
39 |
CHARACTER*4 ITEXT(4),LTEX |
40 |
CHARACTER*7 ITB |
41 |
CHARACTER*11 NAME |
42 |
LOGICAL NOTBEG,VAL |
43 |
DIMENSION DEN(8),TEMP(2),XVAR(4),VARE(4),VARB(4) |
44 |
COMMON/GENER/ UMR,ERA,AQUAD,BQUAD |
45 |
C |
46 |
DATA ITEXT /'LATI','LONG','H/km','YEAR'/ |
47 |
DATA LATI,LONGI,HEIGHT,YEAR,IVAR,BVAR,EVAR,SVAR,IBBB,JAGNR |
48 |
& /45.1,293.1,100,1985.5,3,100,1000,100,0,2/ |
49 |
c### year limit modified |
50 |
DATA VARB /-90.0,-360.0,0.00000,1940.0/ |
51 |
DATA VARE /+90.0,+360.0,30000.0,2010.0/ |
52 |
C |
53 |
CALL INITIZE |
54 |
ALOG2=ALOG(2.) |
55 |
ISTART=1 |
56 |
C |
57 |
C FIRST SPECIFY YOUR COMPUTERS CHANNEL NUMBERS .................... |
58 |
C EGNR=INPUT, MONITO=MONITOR, KONSOL=MESSAGES...................... |
59 |
C AGNR=DISPLAY, OGNR=FILE OUTPUT................................... |
60 |
C |
61 |
EGNR=5 |
62 |
MONITO=6 |
63 |
AGNR=6 |
64 |
OGNR=16 |
65 |
WRITE(MONITO,5100) |
66 |
5100 FORMAT(1X/////4X,54('*')/4X, |
67 |
& '****** IGRF GEOMAGNETIC FIELD MODEL 1945 - 2005 ******'/4X, |
68 |
& '*********** SHELLG L-VALUE CALCULATION *************'/1X, |
69 |
& 60('*')/' This program allows you to produce B and L ', |
70 |
& 'profiles in '/' latitude, longitude, year or altitude.'/ |
71 |
& ' In each of the following windows you will be ', |
72 |
& 'asked to enter'/' one or more values, defining the conditions', |
73 |
& ' for your tables.'/' In each window the current value(s) is', |
74 |
& ' (are) shown in the right'/' upper corner (#...#). You can ', |
75 |
& 'choose the current values by'/' entering / at the prompt.'/ |
76 |
& ' If you enter a wrong character or a value outside the ', |
77 |
& 'allowed'/' parameter range, the program will ask you for a', |
78 |
& ' new entry.'/' After your tables are displayed, you can ', |
79 |
& 'change any parameter'/' you wish to change and create a ', |
80 |
& 'new profile.'/' You can leave the program at any point ', |
81 |
& 'by entering Ctrl Z.'/1X,25('*'),' GOOD LUCK ',25('*')) |
82 |
NOTBEG=.FALSE. |
83 |
GOTO 5508 |
84 |
C---------------START ENTERING PARAMETERS---------------------------- |
85 |
3293 CONTINUE |
86 |
ISTART=ISTART+1 |
87 |
C---------------WINDOW 1: WHICH PARAMETER CHANGE ?------------------- |
88 |
WRITE(MONITO,5602) LATI,LONGI,ITEXT(IVAR),HEIGHT,YEAR,BVAR, |
89 |
& EVAR,SVAR |
90 |
5602 FORMAT(1X//' **** WHICH PARAMETER DO YOU WANT TO CHANGE?'/ |
91 |
& 1X,60('-')/' 0 NO FURTHER CHANGES, CALCULATE PROFILE'/ |
92 |
& ' 1 LATITUDE #',F6.1,'#',7X,'5 DISPLAY OR STORE'/ |
93 |
& ' 2 LONGITUDE #',F6.1,'#',7X,'6 SELECTION OF VARIABLE #', |
94 |
& A4,'#'/' 3 ALTITUDE #',F8.1,'#',5X,'7 VARIABLE RANGE'/ |
95 |
& ' 4 YEAR #',F6.1,'#',11X,'#',F8.1,',',F8.1,',', |
96 |
& F8.1,'#'/29X,'8 B OR B/B0'/1X,60('-')/' ENTER NUMBER') |
97 |
IMIN=0 |
98 |
IMAX=8 |
99 |
4925 READ(EGNR,*,ERR=8600,END=6666) ISWIT |
100 |
IF((ISWIT.GE.IMIN).AND.(ISWIT.LE.IMAX)) GOTO 8601 |
101 |
8600 WRITE(MONITO,4924) IMIN,IMAX |
102 |
4924 FORMAT(' Your input is outside the value range:', |
103 |
& I2,' to',I2/' try again') |
104 |
GOTO 4925 |
105 |
8601 GOTO (5505,3329,3339,5502,6780,5508,5503,5504,9138) ISWIT+1 |
106 |
C--------------WINDOW 2: DISPLAY OPTIONS-------------------------- |
107 |
5508 WRITE(MONITO,5123) JAGNR |
108 |
5123 FORMAT(/' DO YOU WANT YOUR PROFILES',32X,'#',I1,'#'/5X, |
109 |
& 'DISPLAYED ON YOUR MONITOR: ENTER 0 AT PROMPT'/5X, |
110 |
& 'STORED IN FILE OUTPUT.IGR: ENTER 1 AT PROMPT'/5X, |
111 |
& 'DISPLAYED AND STORED: ENTER 2 AT PROMPT') |
112 |
WRITE(MONITO,8630) |
113 |
IMAX=2 |
114 |
IMIN=0 |
115 |
4927 READ(EGNR,*,ERR=8603,END=6666) JAGNR |
116 |
IF((JAGNR.GE.IMIN).AND.(JAGNR.LE.IMAX)) GOTO 8602 |
117 |
8603 WRITE(MONITO,4924) IMIN,IMAX |
118 |
GOTO 4927 |
119 |
8602 IVARNR=0 |
120 |
IF(JAGNR.GT.0) |
121 |
& OPEN(UNIT=OGNR,FILE='OUTPUT.IGR',STATUS='NEW',FORM='FORMATTED') |
122 |
IF(JAGNR.EQ.1) AGNR=OGNR |
123 |
IF(NOTBEG) GOTO 3293 |
124 |
C---------------WINDOW 3: SELECT VARIABLE------------------------ |
125 |
5503 WRITE(MONITO,5040) IVAR |
126 |
5040 FORMAT(1X//' SELECT YOUR VARIABLE:',31X,'#LAST:',I1,'#'// |
127 |
& ' 1 LATITUDE 3 ALTITUDE'/ |
128 |
& ' 2 LONGITUDE 4 YEAR') |
129 |
WRITE(MONITO,8630) |
130 |
8630 FORMAT(1X,60('-')/' Enter / to use previous value(s) ', |
131 |
& '(see # .. #); Ctrl Z to exit') |
132 |
IMIN=1 |
133 |
IMAX=4 |
134 |
4929 READ(EGNR,*,ERR=8605,END=6666) IVAR |
135 |
IF((IVAR.GE.IMIN).AND.(IVAR.LE.IMAX)) GOTO 5504 |
136 |
8605 WRITE(MONITO,4924) IMIN,IMAX |
137 |
GOTO 4929 |
138 |
C--------------WINDOW 4: SELECT VARIABLE RANGE--------------------- |
139 |
5504 WRITE(MONITO,5044) BVAR,EVAR,SVAR |
140 |
5044 FORMAT(1X//' CHOOSE YOUR VARIABLE RANGE:',5X,' BEGIN, END, ', |
141 |
& 'STEPWIDTH ?'/32X,'#',F8.1,',',F8.1,',',F8.1,'#') |
142 |
WRITE(MONITO,8630) |
143 |
VAMIN=VARB(IVAR) |
144 |
VAMAX=VARE(IVAR) |
145 |
4931 READ(EGNR,*,ERR=8606,END=6666) BVAR,EVAR,SVAR |
146 |
IF((BVAR.GE.VAMIN).AND.(EVAR.LE.VAMAX)) GOTO 8607 |
147 |
8606 WRITE(MONITO,4930) VAMIN,VAMAX |
148 |
4930 FORMAT(' Your input is outside the value range:', |
149 |
& F8.1,' to',F8.1/' try again') |
150 |
GOTO 4931 |
151 |
8607 LANZ=INT((EVAR-BVAR)/SVAR)+1 |
152 |
IF(NOTBEG) GOTO 3293 |
153 |
IVARNR=IVARNR+1 |
154 |
IF(IVARNR.EQ.IVAR) GOTO 7339 |
155 |
C--------------WINDOW 5: LATITUDE----------------------------------- |
156 |
3329 WRITE(MONITO,5000) LATI |
157 |
5000 FORMAT(1X//1X,'GEOD LATITUDE ? !NORTH! [DEGREE,DECIMAL]', |
158 |
& 8X,'#',F5.1,'#') |
159 |
WRITE(MONITO,8630) |
160 |
XMAX=VARE(1) |
161 |
XMIN=VARB(1) |
162 |
4933 READ(EGNR,*,ERR=8608,END=6666) LATI |
163 |
IF((LATI.GE.XMIN).AND.(LATI.LE.XMAX)) GOTO 8609 |
164 |
8608 WRITE(MONITO,4930) XMIN,XMAX |
165 |
GOTO 4933 |
166 |
8609 IF(NOTBEG) GOTO 3293 |
167 |
7339 IVARNR=IVARNR+1 |
168 |
IF(IVARNR.EQ.IVAR) GOTO 7500 |
169 |
C---------------WINDOW 6: LONGITUDE--------------------------------- |
170 |
3339 WRITE(MONITO,6001) LONGI |
171 |
6001 FORMAT(1X//1X,'GEOD LONGITUDE ? !EAST! [DEGREE,DECIMAL]', |
172 |
& 7X,'#',F6.1,'#') |
173 |
WRITE(MONITO,8630) |
174 |
XMAX=VARE(2) |
175 |
XMIN=VARB(2) |
176 |
4934 READ(EGNR,*,ERR=8610,END=6666) LONGI |
177 |
IF((LONGI.GE.XMIN).AND.(LONGI.LE.XMAX)) GOTO 8611 |
178 |
8610 WRITE(MONITO,4930) XMIN,XMAX |
179 |
GOTO 4934 |
180 |
8611 IF(NOTBEG) GOTO 3293 |
181 |
7500 IVARNR=IVARNR+1 |
182 |
IF(IVARNR.EQ.IVAR) GOTO 5551 |
183 |
C---------------WINDOW 7: ALTITUDE--------------------------------- |
184 |
5502 WRITE(MONITO,6002) HEIGHT |
185 |
6002 FORMAT(1X//1X,'ALTITUDE ? [KM]',33X,'#',F7.1,'#') |
186 |
WRITE(MONITO,8630) |
187 |
XMAX=VARE(3) |
188 |
XMIN=VARB(3) |
189 |
4936 READ(EGNR,*,ERR=8615,END=6666) HEIGHT |
190 |
IF((HEIGHT.GE.XMIN).AND.(HEIGHT.LE.XMAX)) GOTO 8616 |
191 |
8615 WRITE(MONITO,4930) XMIN,XMAX |
192 |
GOTO 4936 |
193 |
8616 IF(NOTBEG) GOTO 3293 |
194 |
5551 IVARNR=IVARNR+1 |
195 |
IF(IVARNR.EQ.IVAR) GOTO 9138 |
196 |
C----------------WINDOW 8: YEAR------------------------------------ |
197 |
6780 WRITE(MONITO,6004) YEAR |
198 |
6004 FORMAT(1X//' YEAR(EPOCH) ?',9X,'*decimal*',9X,'#',F6.1,'#') |
199 |
WRITE(MONITO,8630) |
200 |
XMAX=VARE(4) |
201 |
XMIN=VARB(4) |
202 |
4938 READ(EGNR,*,ERR=8617,END=6666) YEAR |
203 |
IF((YEAR.GE.XMIN).AND.(YEAR.LE.XMAX)) GOTO 8618 |
204 |
8617 WRITE(MONITO,4930) XMIN,XMAX |
205 |
GOTO 4938 |
206 |
8618 IF(NOTBEG) GOTO 3293 |
207 |
C----------------WINDOW 9: ABSOLUTE OR NORMALIZED B-------------- |
208 |
9138 WRITE(MONITO,6204) IBBB |
209 |
6204 FORMAT(1X//' OUTPUT OPTION: B OR B/B0 ?',19X,'#',I1,'#'// |
210 |
& 4X,'if you enter 0, the absolute magnetic field strength'/ |
211 |
& 4X,'will be listed, otherwise the field strength normalized'/ |
212 |
& 4X,'to the field strength at the magnetic equator is listed') |
213 |
WRITE(MONITO,8630) |
214 |
4738 READ(EGNR,*,ERR=8717,END=6666) IBBB |
215 |
IF(IBBB.NE.0) THEN |
216 |
ITB=' B/B0 ' |
217 |
ELSE |
218 |
ITB='B/Gauss' |
219 |
ENDIF |
220 |
GOTO 8718 |
221 |
8717 WRITE(MONITO,4630) |
222 |
4630 FORMAT(' Your input should be a integer value'/' try again') |
223 |
GOTO 4738 |
224 |
8718 IF(NOTBEG) GOTO 3293 |
225 |
C----------------CALCULATE PROFILES----------------------------------- |
226 |
5505 WRITE(AGNR,3910) ITEXT(IVAR),ITB |
227 |
IF(JAGNR.EQ.2) WRITE(OGNR,3910) ITEXT(IVAR),ITB |
228 |
3910 FORMAT(1X//////////// |
229 |
& 5X,A4,' DIMO ',A7,' B-NORTH B-EAST B-DOWN ', |
230 |
& ' DIP DEC L-VALUE C') |
231 |
XVAR(1)=LATI |
232 |
XVAR(2)=LONGI |
233 |
XVAR(3)=HEIGHT |
234 |
XVAR(4)=YEAR |
235 |
LFD=0 |
236 |
XVAR(IVAR)=BVAR-SVAR |
237 |
2123 XVAR(IVAR)=XVAR(IVAR)+SVAR |
238 |
LFD=LFD+1 |
239 |
LATI=XVAR(1) |
240 |
LONGI=XVAR(2) |
241 |
HEIGHT=XVAR(3) |
242 |
YEAR=XVAR(4) |
243 |
IF((IVAR.LT.4).AND.(LFD.GT.1)) GOTO 2910 |
244 |
CALL FELDCOF(YEAR,DIMO) |
245 |
2910 CALL FELDG(LATI,LONGI,HEIGHT,BNORTH,BEAST,BDOWN,BABS) |
246 |
CALL SHELLG(LATI,LONGI,HEIGHT,DIMO,XL,ICODE,BAB1) |
247 |
IF(IABS(ICODE).GT.9) THEN |
248 |
WRITE(MONITO,7227) ICODE |
249 |
7227 FORMAT(' ICODE=',I10,' is set to 2') |
250 |
ICODE=2 |
251 |
ENDIF |
252 |
IF(IBBB.EQ.0) GOTO 2299 |
253 |
BEQU=DIMO/(XL*XL*XL) |
254 |
IF(ICODE.EQ.1) THEN |
255 |
BDEL=1.E-3 |
256 |
CALL FINDB0(0.05,BDEL,VAL,BEQ,RR0) |
257 |
IF(VAL) BEQU=BEQ |
258 |
ENDIF |
259 |
2299 DIP=ASIN(BDOWN/BABS)/UMR |
260 |
DEC=ASIN(BEAST/SQRT(BEAST*BEAST+BNORTH*BNORTH))/UMR |
261 |
XCOR=XVAR(IVAR) |
262 |
IF(IBBB.EQ.0) THEN |
263 |
WRITE(AGNR,7117) XCOR,DIMO,BABS,BNORTH,BEAST,BDOWN, |
264 |
& DIP,DEC,XL,ICODE |
265 |
IF(JAGNR.EQ.2) WRITE(OGNR,7117) XCOR,DIMO,BABS,BNORTH, |
266 |
& BEAST,BDOWN,DIP,DEC,XL,ICODE |
267 |
7117 FORMAT(1X,F8.2,F8.4,4(1X,F7.5),2F7.1,F8.3,I3) |
268 |
ELSE |
269 |
BBX=BABS/BEQU |
270 |
IF(BBX.GT.9999.999) BBX=9999.999 |
271 |
WRITE(AGNR,7177) XCOR,DIMO,BBX,BNORTH,BEAST,BDOWN, |
272 |
& DIP,DEC,XL,ICODE |
273 |
IF(JAGNR.EQ.2) WRITE(OGNR,7177) XCOR,DIMO,BBX,BNORTH, |
274 |
& BEAST,BDOWN,DIP,DEC,XL,ICODE |
275 |
7177 FORMAT(1X,F8.2,F8.4,F8.3,3(1X,F7.5),2F7.1,F8.3,I3) |
276 |
ENDIF |
277 |
IF(XCOR.LT.EVAR) GOTO 2123 |
278 |
WRITE(AGNR,2193) LATI,LONGI,HEIGHT,YEAR |
279 |
IF(JAGNR.EQ.2) WRITE(OGNR,2193) LATI,LONGI,HEIGHT,YEAR |
280 |
C ### edition date corrected |
281 |
2193 FORMAT(1X,'------- International Geomagnetic Reference Field', |
282 |
& ' --- Edition 2000 -------'/' LATI=',F7.1,' LONGI=',F6.1, |
283 |
& ' I DIMO is Dipol I C=1 L and B0 correct'/ |
284 |
& ' ALT=',F7.1,' YEAR=',F6.1,' I Moment in Gauss', |
285 |
& ' I =2 wrong, =3 approx.'/1X,74('-')) |
286 |
IF(HEIGHT.GT.5000.0) THEN |
287 |
WRITE(AGNR,5611) |
288 |
IF(JAGNR.EQ.2) WRITE(OGNR,5611) |
289 |
ENDIF |
290 |
5611 FORMAT(' !! REMINDER: this field model does not', |
291 |
& ' include external sources !!') |
292 |
C ### year limits corrected |
293 |
IF((YEAR.LT.1945.0).OR.(YEAR.GT.2005.0)) THEN |
294 |
WRITE(AGNR,5612) |
295 |
IF(JAGNR.EQ.2) WRITE(OGNR,5612) |
296 |
ENDIF |
297 |
C ### timeperiod corrected |
298 |
5612 FORMAT(' !! REMINDER: Recommended time period is 1945', |
299 |
& ' to 2005 !!') |
300 |
C-----------------LAST WINDOW: CONTINUE ?----------------------- |
301 |
918 WRITE(MONITO,5600) |
302 |
5600 FORMAT(1X/' **** DO YOU WANT TO CONTINUE?'/1X,60('-')/ |
303 |
& ' "0" QUIT AND EXIT "1" NEW PARAMETERS'/ |
304 |
& 1X,60('-')) |
305 |
IMIN=0 |
306 |
IMAX=1 |
307 |
8651 READ(EGNR,*,ERR=8652,END=6666) IALL |
308 |
IF((IALL.GE.IMIN).AND.(IALL.LE.IMAX)) GOTO 8653 |
309 |
8652 WRITE(MONITO,4924) IMIN,IMAX |
310 |
GOTO 8651 |
311 |
8653 NOTBEG=.TRUE. |
312 |
IF(IALL.EQ.1) GOTO 3293 |
313 |
6666 CONTINUE |
314 |
STOP |
315 |
END |