cloudy trunk
Loading...
Searching...
No Matches
atmdat_lines_setup.cpp
Go to the documentation of this file.
1/* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and
2 * others. For conditions of distribution and use see copyright notice in license.txt */
3/*lines_setup convert level 1 and level 2 line parameters and pointers into internal form
4 * used by code, line data were read in by atmdat_readin */
5#include "cddefines.h"
6#include "physconst.h"
7#include "lines_service.h"
8#include "prt.h"
9#include "taulines.h"
10#include "opacity.h"
11#include "lines.h"
12
13/* following used for generating array indices to level1 lines,
14 * start process, use it, then end */
15STATIC void initFindLevLine( void );
16STATIC long ipFindLevLine( realnum , long , long );
17STATIC void endFindLevLine( void );
18
19void lines_setup(void)
20{
21 long int i;
22
23 static bool lgFirst = true;
24 bool lgSane;
25
26 DEBUG_ENTRY( "lines_setup()" );
27
28 /* this routine takes the line parameters in the wind block data and sorts
29 * them into what is needed for the actual line optical depth arrays */
30
32
33 /* this is the dummy line */
34 TauLines[0].WLAng() = 0.;
35 (*TauLines[0].Lo()).g() = 0.;
36 (*TauLines[0].Hi()).g() = 0.;
37 TauLines[0].Emis().gf() = 0.;
38 TauLines[0].EnergyWN() = 0.;
39 (*TauLines[0].Hi()).IonStg() = 0;
40 (*TauLines[0].Hi()).nelem() = 0;
41 /* this is an impossible value of iRedisFun() */
42 TauLines[0].Emis().iRedisFun() = 0;
43 TauLines[0].Emis().Aul() = 0.;
44
45 /* the first valid line is [0] since zero is the dummy */
46 if( TauLines[1].EnergyWN() <= 0. )
47 {
48 fprintf( ioQQQ, " PROBLEM Insane value for TauLines array.\n" );
49 fprintf( ioQQQ, " Was block data LineData linked in??\n" );
50 fprintf( ioQQQ, " Check that it compiled OK (it probably did not).\n" );
52 }
53
54 /* check that all lines have valid data */
55 lgSane = true;
56 for( i=1; i <= nLevel1; i++ )
57 {
58
59 if( (*TauLines[i].Lo()).g() <= 0. )
60 {
61 fprintf( ioQQQ, " routine lines_setup, insane lower stat wght\n" );
62 fprintf( ioQQQ, " line index is %5ld\n", i );
63 lgSane = false;
64 }
65
66 if( (*TauLines[i].Hi()).g() <= 0. )
67 {
68 fprintf( ioQQQ, " routine lines_setup, insane upper stat wght\n" );
69 fprintf( ioQQQ, " line index is %5ld\n", i );
70 lgSane = false;
71 }
72
73 if( TauLines[i].EnergyWN() <= 0. )
74 {
75 fprintf( ioQQQ, " routine lines_setup, insane energy WN\n" );
76 fprintf( ioQQQ, " line index is %5ld\n", i );
77 lgSane = false;
78 }
79
80 if( (*TauLines[i].Hi()).IonStg() <= 0 )
81 {
82 fprintf( ioQQQ, " routine lines_setup, insane ioniz stage\n" );
83 fprintf( ioQQQ, " line index is %5ld\n", i );
84 lgSane = false;
85 }
86
87 if( (*TauLines[i].Hi()).nelem() <= 0 || (*TauLines[i].Hi()).nelem() > (int)LIMELM )
88 {
89 fprintf( ioQQQ, " routine lines_setup, insane Nelem\n" );
90 fprintf( ioQQQ, " line index is %5ld\n", i );
91 lgSane = false;
92 }
93
94 if( (*TauLines[i].Hi()).IonStg() > (*TauLines[i].Hi()).nelem() )
95 {
96 fprintf( ioQQQ, " routine lines_setup, insane IonStg>Nelem\n" );
97 fprintf( ioQQQ, " line index is %5ld\n", i );
98 lgSane = false;
99 }
100
101 if( TauLines[i].Emis().iRedisFun() == 0 )
102 {
103 fprintf( ioQQQ, " routine lines_setup, insane line redis fcn\n" );
104 fprintf( ioQQQ, " line index is %5ld\n", i );
105 lgSane = false;
106 }
107
108 /* use energies for wavelengths in air if wl not forced with wl number on line */
109 /* >>chng 03 oct 07, only make correction for index ref if
110 * if wl was not already set - this is an option to allow
111 * the printed wl to be specified in the level1.dat file */
112 if( TauLines[i].WLAng() <= 0. )
113 {
114 /* make following an air wavelength */
115 TauLines[i].WLAng() =
116 (realnum)(1.0e8/
117 TauLines[i].EnergyWN()/
118 RefIndex( TauLines[i].EnergyWN()));
119 }
120 {
121 /*@-redef@*/
122 enum{DEBUG_LOC=false};
123 /*@+redef@*/
124 if( DEBUG_LOC )
125 {
126 char chString[10];
127 chIonLbl(chString,TauLines[i]);
128 fprintf( ioQQQ,"%s ", chString );
129 prt_wl( ioQQQ , TauLines[i].WLAng() );
130 fprintf(ioQQQ,"\n");
131 }
132 }
133 }
134
135 if( !lgSane )
136 {
137 fprintf( ioQQQ, " Insane value for line arrays encountered.\n" );
138 fprintf( ioQQQ, " Was block data lines linked in??\n" );
139 fprintf( ioQQQ, " Were errors intreoducted into the line array?\n" );
140 ShowMe();
142 }
143
144 /* set up array to store hits for each line */
146
147 /* in following calls to ipFindLevLine the numbers are the integer wavelength
148 * used in the printout, the ion stage, and the atomic number */
149
150 /* carbon line optical depth data */
151 ipT1656 = ipFindLevLine( 1656 , 1 , 6 );
152
153 ipT9830 = ipFindLevLine( 9830 , 1 , 6 );
154
155 ipT8727 = ipFindLevLine( 8727 , 1 , 6 );
156
157 ipC2_2325 = ipFindLevLine( 2325 , 2 , 6 );
158 ipC2_2324 = ipFindLevLine( 2324 , 2 , 6 );
159 ipC2_2329 = ipFindLevLine( 2329 , 2 , 6 );
160 ipC2_2328 = ipFindLevLine( 2328 , 2 , 6 );
161 ipC2_2327 = ipFindLevLine( 2327 , 2 , 6 );
162
163 ipT1335 = ipFindLevLine( 1335 , 2 , 6 );
164
165 ipT1909 = ipFindLevLine( 1910 , 3 , 6 );
166
167 ipT977 = ipFindLevLine( 977 , 3 , 6 );
168
169 ipT1550 = ipFindLevLine( 1551 , 4 , 6 );
170
171 ipT1548 = ipFindLevLine( 1548 , 4 , 6 );
172
173 ipT386 = ipFindLevLine( 386 , 3 , 6 );
174
175 ipT310 = ipFindLevLine( 310 , 3 , 6 );
176
177 /*CIII* 1175, lower level = upper level of 1909*/
178 ipc31175 = ipFindLevLine( 1176 , 3 , 6 );
179
180 ipT291 = ipFindLevLine( 291 , 3 , 6 );
181
182 ipT280 = ipFindLevLine( 280 , 3 , 6 );
183
184 ipT274 = ipFindLevLine( 274 , 3 , 6 );
185
186 ipT270 = ipFindLevLine( 270 , 3 , 6 );
187
188 ipT312 = ipFindLevLine( 312 , 4 , 6 );
189
190 /*carbon fine structure lines added by Jim Kingdon*/
191 ipT610 = ipFindLevLine( 6092000 , 1 , 6 );
192
193 ipT370 = ipFindLevLine( 3697000 , 1 , 6 );
194
195 ipT157 = ipFindLevLine( 1576000 , 2 , 6 );
196
197 /*nitrogen line optical depth data*/
198 ipNI_pumpIndirect = ipFindLevLine( 953.9f , 1 , 7 );
199 ipNI_pumpDirect[0] = ipFindLevLine( 954.1f , 1 , 7 );
200 ipNI_pumpDirect[1] = ipFindLevLine( 951.0f , 1 , 7 );
201 ipNI_pumpDirect[2] = ipFindLevLine( 955.8f , 1 , 7 );
202 ipNI_pumpDirect[3] = ipFindLevLine( 959.4f , 1 , 7 );
203 ipNI_pumpDirect[4] = ipFindLevLine( 955.5f , 1 , 7 );
204 ipNI_pumpDirect[5] = ipFindLevLine( 951.2f , 1 , 7 );
205 ipNI_pumpDirect[6] = ipFindLevLine( 960.2f , 1 , 7 );
206 ipNI_pumpDirect[7] = ipFindLevLine(1159.8f , 1 , 7 );
207 ipNI_pumpDirect[8] = ipFindLevLine(1160.9f , 1 , 7 );
208
209 ipT1200 = ipFindLevLine( 1200 , 1 , 7 );
210
211 ipT1085 = ipFindLevLine( 1085 , 2 , 7 );
212
213 ipN3_1749 = ipFindLevLine( 1749 , 3 , 7 );
214 ipN3_1747 = ipFindLevLine( 1747 , 3 , 7 );
215 ipN3_1754 = ipFindLevLine( 1754 , 3 , 7 );
216 ipN3_1752 = ipFindLevLine( 1752 , 3 , 7 );
217 ipN3_1751 = ipFindLevLine( 1751 , 3 , 7 );
218
219 ipT990 = ipFindLevLine( 991 , 3 , 7 );
220
221 ipT1486 = ipFindLevLine( 1486 , 4 , 7 );
222
223 ipT765 = ipFindLevLine( 765 , 4 , 7 );
224
225 ipT1243 = ipFindLevLine( 1243 , 5 , 7 );
226
227 ipT1239 = ipFindLevLine( 1239 , 5 , 7 );
228
229 ipT374g = ipFindLevLine( 373 , 3 , 7 );
230
231 /*this is the stronger of the two lines*/
232 ipT374x = ipFindLevLine( 374 , 3 , 7 );
233
234 ipT2140 = ipFindLevLine( 2141 , 2 , 7 );
235
236 ipT671 = ipFindLevLine( 671 , 2 , 7 );
237
238 ipT315 = ipFindLevLine( 315 , 3 , 7 );
239
240 ipT324 = ipFindLevLine( 324 , 3 , 7 );
241
242 ipT333 = ipFindLevLine( 333 , 3 , 7 );
243
244 ipT209 = ipFindLevLine( 209 , 5 , 7 );
245
246 /*fine structure lines */
247 /*[N II] 121.7*/
248 ipT122 = ipFindLevLine( 1217000 , 2 , 7 );
249
250 /*[N II] 205.4*/
251 ipT205 = ipFindLevLine( 2054000 , 2 , 7 );
252
253 /*big disagreement in A for this line, other val is 2x larger*/
254 /*see review in DEO Seaton 70th birthday*/
255 ipT57 = ipFindLevLine( 572100 , 3 , 7 );
256
257 /*oxygen line optical depth data*/
258 ipT6300 = ipFindLevLine( 6300 , 1 , 8 );
259
260 ipT6363 = ipFindLevLine( 6363 , 1 , 8 );
261
262 /*A from NISt 96*/
263 ipT5577 = ipFindLevLine( 5577 , 1 , 8 );
264
265 ipT834 = ipFindLevLine( 833.8f , 2 , 8 );
266
267 ipT1661 = ipFindLevLine( 1661 , 3 , 8 );
268
269 ipT1666 = ipFindLevLine( 1666 , 3 , 8 );
270
271 ipT835 = ipFindLevLine( 835 , 3 , 8 );
272
273 ipO4_1400 = ipFindLevLine( 1400 , 4 , 8 );
274 ipO4_1397 = ipFindLevLine( 1397 , 4 , 8 );
275 ipO4_1407 = ipFindLevLine( 1407 , 4 , 8 );
276 ipO4_1405 = ipFindLevLine( 1405 , 4 , 8 );
277 ipO4_1401 = ipFindLevLine( 1401 , 4 , 8 );
278
279 ipT789 = ipFindLevLine( 789 , 4 , 8 );
280
281 ipT630 = ipFindLevLine( 630 , 5 , 8 );
282
283 /*start OI 6 level atom*/
284 ipT1304 = ipFindLevLine( 1304 , 1 , 8 );
285
286 ipT1039 = ipFindLevLine( 1039 , 1 , 8 );
287
288 ipT8446 = ipFindLevLine( 8446 , 1 , 8 );
289
290 ipT4368 = ipFindLevLine( 4368 , 1 , 8 );
291
292 ipTOI13 = ipFindLevLine( 13200 , 1 , 8 );
293
294 ipTOI11 = ipFindLevLine( 11300 , 1 , 8 );
295
296 ipTOI29 = ipFindLevLine( 29000 , 1 , 8 );
297
298 ipTOI46 = ipFindLevLine( 46000 , 1 , 8 );
299
300 ipTO1025 = ipFindLevLine( 1025 , 1 , 8 );
301
302 /*end of OI 6 level atom*/
303
304 ipT304 = ipFindLevLine( 304 , 3 , 8 );
305
306 ipT1214 = ipFindLevLine( 1218 , 5 , 8 );
307
308 ipT150 = ipFindLevLine( 150 , 6 , 8 );
309
310 /*fine structure lines*/
311 /*[O I] 146 microns*/
312 ipT146 = ipFindLevLine( 1455300 , 1 , 8 );
313
314 /*[O I] 63 microns*/
315 ipT63 = ipFindLevLine( 631700 , 1 , 8 );
316
317 /*[O III] 88.3564 m*/
318 ipTO88 = ipFindLevLine( 883300 , 3 , 8 );
319
320 /*[O III] 51.8145*/
321 ipT52 = ipFindLevLine( 518000 , 3 , 8 );
322
323 /*[O IV] 25.89mic, A from*/
324 ipT26 = ipFindLevLine( 258800 , 4 , 8 );
325
326 ipT1032 = ipFindLevLine( 1031.9f , 6 , 8 );
327
328 ipT1037 = ipFindLevLine( 1037.6f , 6 , 8 );
329
330 /*neon*/
331 ipT770 = ipFindLevLine( 770.4f , 8 , 10 );
332
333 ipT780 = ipFindLevLine( 780.3f , 8 , 10 );
334
335 /*[Ne VI] 7.652 micron*/
336 ipxNe0676 = ipFindLevLine( 76520 , 6 , 10 );
337
338 ipT895 = ipFindLevLine( 895 , 7 , 10 );
339
340 ipT88 = ipFindLevLine( 88 , 8 , 10 );
341
342 /*fine structure lines */
343 /*[Ne II] 12.8*/
344 ipTNe13 = ipFindLevLine( 128100 , 2 , 10 );
345
346 /*[Ne III] 36.013 m*/
347 ipTNe36 = ipFindLevLine( 360140 , 3 , 10 );
348
349 /*[Ne III] 15.56 m*/
350 ipTNe16 = ipFindLevLine( 155500 , 3 , 10 );
351
352 /*[Ne V] 14.32 m*/
353 ipTNe14 = ipFindLevLine( 143200 , 5 , 10 );
354
355 /*[Ne V] 24.318 m*/
356 ipTNe24 = ipFindLevLine( 243100 , 5 , 10 );
357
358 /*sodium line optical depth data*/
359 ipT5895 = ipFindLevLine( 5891.9f , 1 , 11 );
360
361 /*[Na III] 7.3177mic*/
362 ipfsNa373 = ipFindLevLine( 73200 , 3 , 11 );
363
364 /*[Na IV] 9.039 mic*/
365 ipfsNa490 = ipFindLevLine( 90390 , 4 , 11 );
366
367 /*[Na IV] 21.29 mic*/
368 ipfsNa421 = ipFindLevLine( 212900 , 4 , 11 );
369
370 /*[Na VI] 14.40 mic*/
371 ipxNa6143 = ipFindLevLine( 144000 , 6 , 11 );
372
373 /*[Na VI] 8.611 mic*/
374 ipxNa6862 = ipFindLevLine( 86110 , 6 , 11 );
375
376 /*[Na VII] 4.68 micron*/
377 ipxNa0746 = ipFindLevLine( 46800 , 7 , 11 );
378
379 /*magnesium line optical depth data*/
380 ipMgI2853 = ipFindLevLine( 2853 , 1 , 12 );
381
382 ipMgI2026 = ipFindLevLine( 2026 , 1 , 12 );
383
384 ipT2796 = ipFindLevLine( 2795.5f , 2 , 12 );
385
386 ipT2804 = ipFindLevLine( 2802.7f , 2 , 12 );
387
388 ipT705 = ipFindLevLine( 705 , 9 , 12 );
389
390 ipT4561 = ipFindLevLine( 4561 , 1 , 12 );
391
392 /*[Mg V] 1325, 3-1 in three level atom*/
393 ipxMg51325 = ipFindLevLine( 1325 , 5 , 12 );
394
395 /*[Mg V] 2417, 3-2 in three level atom*/
396 ipxMg52417 = ipFindLevLine( 2417 , 5 , 12 );
397
398 /*[Mg V] 2855, 2-1 in three level atom, really 2928, 2782*/
399 ipxMg52855 = ipFindLevLine( 2855 , 5 , 12 );
400
401 /*[Mg VII] 1325, 3-1 in three level atom*/
402 ipxMg71190 = ipFindLevLine( 1190 , 7 , 12 );
403
404 /*[Mg VII] 2261, 3-2 in three level atom*/
405 ipxMg72261 = ipFindLevLine( 2261 , 7 , 12 );
406
407 /*[Mg VII] 2569, 2-1 in three level atom, really 2509, 2629*/
408 ipxMg72569 = ipFindLevLine( 2569 , 7 , 12 );
409
410 /*[Mg VIII] 3.03 micron*/
411 ipxMg08303 = ipFindLevLine( 30300 , 8 , 12 );
412
413 /*the Mg X 615 li seq doublet*/
414 ipTMg610 = ipFindLevLine( 609.8f , 10 , 12 );
415
416 ipTMg625 = ipFindLevLine( 624.9f , 10 , 12 );
417
418 ipT58 = ipFindLevLine( 57.9f , 10 , 12 );
419
420 /*Mg IV 4.487m*/
421 ipTMg4 = ipFindLevLine( 44850 , 4 , 12 );
422
423 /*[Mg V] 13.52*/
424 ipTMg14 = ipFindLevLine( 135200 , 5 , 12 );
425
426 /*[Mg V] 5.610*/
427 ipTMg6 = ipFindLevLine( 56100 , 5 , 12 );
428
429 /*[Mg VII] 9.033 mic*/
430 ipfsMg790 = ipFindLevLine( 90330 , 7 , 12 );
431
432 /*[Mg VII] 5.503 mic7 , 12 );*/
433 ipfsMg755 = ipFindLevLine( 55030 , 7 , 12 );
434
435 /* aluminum line optical depth data */
436 ipAlI3957 = ipFindLevLine( 3957 , 1 , 13 );
437
438 ipAlI3090 = ipFindLevLine( 3090 , 1 , 13 );
439
440 ipT1855 = ipFindLevLine( 1855 , 3 , 13 );
441
442 ipT1863 = ipFindLevLine( 1863 , 3 , 13 );
443
444 ipT2670 = ipFindLevLine( 2670 , 2 , 13 );
445
446 /*[Al V] 2.905 mic*/
447 ipAl529 = ipFindLevLine( 29052 , 5 , 13 );
448
449 /*[Al VI] 3.66 mic*/
450 ipAl6366 = ipFindLevLine( 36600 , 6 , 13 );
451
452 /*[Al VI] 9.116 mic*/
453 ipAl6912 = ipFindLevLine( 91160 , 6 , 13 );
454
455 /*[Al VIII] 5.848 mic*/
456 ipAl8575 = ipFindLevLine( 58480 , 8 , 13 );
457
458 /*[Al VIII] 3.69 mic*/
459 ipAl8370 = ipFindLevLine( 36900 , 8 , 13 );
460
461 /*[Al IX] 2.04 micron*/
462 ipAl09204 = ipFindLevLine( 20400 , 9 , 13 );
463
464 ipT639 = ipFindLevLine( 639 , 10 , 13 );
465
466 /*Al XI 550, 568 Li seq doublet */
467 ipTAl550 = ipFindLevLine( 550 , 11 , 13 );
468
469 ipTAl568 = ipFindLevLine( 568 , 11 , 13 );
470
471 ipTAl48 = ipFindLevLine( 48 , 11 , 13 );
472
473 /*silicon line optical depth data*/
474 ipSi1_130m = ipFindLevLine( 1295823.0f , 1 , 14 );
475 ipSi1_68m = ipFindLevLine( 683995.25f , 1 , 14 );
476
477 ipSii2518 = ipFindLevLine( 2518 , 1 , 14 );
478
479 ipSii2215 = ipFindLevLine( 2215 , 1 , 14 );
480
481 ipSi2_2334 = ipFindLevLine( 2334 , 2 , 14 );
482 ipSi2_2329 = ipFindLevLine( 2329 , 2 , 14 );
483 ipSi2_2350 = ipFindLevLine( 2350 , 2 , 14 );
484 ipSi2_2344 = ipFindLevLine( 2344 , 2 , 14 );
485 ipSi2_2336 = ipFindLevLine( 2336 , 2 , 14 );
486
487 ipT1808 = ipFindLevLine( 1813.99f , 2 , 14 );
488
489 ipT1527 = ipFindLevLine( 1531 , 2 , 14 );
490
491 ipT1305 = ipFindLevLine( 1307.7f , 2 , 14 );
492
493 ipT1260 = ipFindLevLine( 1263.3f , 2 , 14 );
494
495 ipT1207 = ipFindLevLine( 1207 , 3 , 14 );
496
497 ipT1895 = ipFindLevLine( 1892 , 3 , 14 );
498
499 ipT1394 = ipFindLevLine( 1394 , 4 , 14 );
500
501 ipT1403 = ipFindLevLine( 1403 , 4 , 14 );
502
503 /*[Si VI] 1.9641mic*/
504 ipSi619 = ipFindLevLine( 19631 , 6 , 14 );
505
506 /*[Si X] 1.43 micron*/
507 ipSi10143 = ipFindLevLine( 14300 , 10 , 14 );
508
509 /* Si X] ll 621.1, 611.7, 598.6 */
510 ipSi10_606 = ipFindLevLine( 606 , 10 , 14 );
511
512 ipTSi499 = ipFindLevLine( 499 , 12 , 14 );
513
514 ipTSi521 = ipFindLevLine( 521 , 12 , 14 );
515
516 ipTSi41 = ipFindLevLine( 41 , 12 , 14 );
517
518 /*[Si II] 34.8 mic*/
519 ipTSi35 = ipFindLevLine( 348140 , 2 , 14 );
520
521 /*[Si VII] 2.481*/
522 ipTSi25 = ipFindLevLine( 24810 , 7 , 14 );
523
524 /*[Si VII] 6.4922*/
525 ipTSi65 = ipFindLevLine( 64920 , 7 ,14 );
526
527 /*[Si IX] 2.585 mic*/
528 ipTSi3 = ipFindLevLine( 25840 , 9 , 14 );
529
530 /*[Si IX] 3.929 mic*/
531 ipTSi4 = ipFindLevLine( 39290 , 9 , 14 );
532
533 /*phosphorus line data*/
534 /*P II 60.64 mic*/
535 ipP0260 = ipFindLevLine( 606400 , 2 , 15 );
536
537 /*P II 32.87 mic*/
538 ipP0233 = ipFindLevLine( 328700 , 2 , 15 );
539
540 /*P III 17.885 mic*/
541 ipP0318 = ipFindLevLine( 178850 , 3 , 15 );
542
543 /*P VII 1.3745 mic*/
544 ipP713 = ipFindLevLine( 13745 , 7 , 15 );
545
546 /*sulphur line optical depth data*/
547 ipS1_25m = ipFindLevLine( 251947.453f , 1 , 16 );
548 ipS1_56m = ipFindLevLine( 562909.625f , 1 , 16 );
549
550 ipT1256 = ipFindLevLine( 1256 , 2 , 16 );
551
552 ipT1194 = ipFindLevLine( 1197.55f , 3 , 16 );
553
554 ipTS1720 = ipFindLevLine( 1720 , 3 , 16 );
555
556 ipS4_1405 = ipFindLevLine( 1405 , 4 , 16 );
557 ipS4_1398 = ipFindLevLine( 1398 , 4 , 16 );
558 ipS4_1424 = ipFindLevLine( 1424 , 4 , 16 );
559 ipS4_1417 = ipFindLevLine( 1417 , 4 , 16 );
560 ipS4_1407 = ipFindLevLine( 1406 , 4 , 16 );
561
562 ipT1198 = ipFindLevLine( 1198 , 5 , 16 );
563
564 ipT786 = ipFindLevLine( 786.47f , 5 , 16 );
565
566 /*fine structure lines added in by Jim Kingdon*/
567 ipTS19 = ipFindLevLine( 186700 , 3 , 16 );
568
569 /*[S III] 33.48*/
570 ipTS34 = ipFindLevLine( 334700 , 3 , 16 );
571
572 ipTS11 = ipFindLevLine( 105100 , 4 , 16 );
573
574 /*chlorine line optical depth data*/
575
576 /* Cl 1 mic */
577 ipCl1_11m = ipFindLevLine( 113296.3984f , 1 , 17 );
578
579 /*Cl II 14.3678 mic*/
580 ipfsCl214 = ipFindLevLine( 144000 , 2 , 17 );
581
582 /*Cl II 33.281 mic*/
583 ipfsCl233 = ipFindLevLine( 333000 , 2 , 17 );
584
585 /*[Cl 4] 20.354 mic*/
586 ipCl04203 = ipFindLevLine( 204000 , 4 , 17 );
587
588 /*[Cl 4] 11.741 mic*/
589 ipCl04117 = ipFindLevLine( 117000 ,4 , 17 );
590
591 /*Cl IX 7334A*/
592 ipCl973 = ipFindLevLine( 7334 , 9 , 17 );
593
594 /*argon fine structure lines*/
595 /*[Ar II]*/
596 ipTAr7 = ipFindLevLine( 69800 , 2 , 18 );
597
598 /*[Ar III] 9.0 mic*/
599 ipTAr9 = ipFindLevLine( 90000 , 3 , 18 );
600
601 /*[Ar III] 21.83 mic*/
602 ipTAr22 = ipFindLevLine( 218300 , 3 , 18 );
603
604 /*[Ar V] 13.1 mic*/
605 ipTAr13 = ipFindLevLine( 131000 , 5 , 18 );
606
607 /*[Ar V] 8.0 mic*/
608 ipTAr8 = ipFindLevLine( 80000 , 5 , 18 );
609
610 /*[Ar VI] 4.53 micron*/
611 ipAr06453 = ipFindLevLine( 45300 , 6 , 18 );
612
613 /*potasium - really should split into two*/
614 ipKI7745 = ipFindLevLine( 7676.2f , 1 , 19 );
615
616 /*[K III] 4.62 micron*/
617 ipxK03462 = ipFindLevLine( 46200 , 3 , 19 );
618
619 /*[K IV] 5.982 micron*/
620 ipxK04598 = ipFindLevLine( 59800 , 4 , 19 );
621
622 /*[K IV] 15.39 micron4 , 19 );*/
623 ipxK04154 = ipFindLevLine( 153900 , 4 , 19 );
624
625 /*[K VII] 3.19 micron7 , 19 );*/
626 ipxK07319 = ipFindLevLine( 31905 , 7 , 19 );
627
628 /*calcium line optical depth data*/
629 ipCaI4228 = ipFindLevLine( 4228 , 1 , 20 );
630
631 ipT3934 = ipFindLevLine( 3934 , 2 , 20 );
632
633 ipT3969 = ipFindLevLine( 3969 , 2 , 20 );
634
635 ipT8498 = ipFindLevLine( 8498 , 2 , 20 );
636
637 ipT8542 = ipFindLevLine( 8542 , 2 , 20 );
638
639 ipT8662 = ipFindLevLine( 8662 , 2 , 20 );
640
641 ipT7291 = ipFindLevLine( 7291 , 2 , 20 );
642
643 ipT7324 = ipFindLevLine( 7324 , 2 , 20 );
644
645 /*[Ca IV] 3.21 min*/
646 ipTCa3 = ipFindLevLine( 32100 , 4 , 20 );
647
648 /*scandium data*/
649 /*[Sc V] 2.31 micron*/
650 ipSc05231 = ipFindLevLine( 23100 , 5 , 21 );
651
652 /*[Sc 13] 2637.97 A */
653 ipSc13264 = ipFindLevLine( 2638 , 13 , 21 );
654 /*iron Fe line optical depth data*/
655
656 /* [Fe I] ground term */
657 ipFe1_24m = ipFindLevLine( 240359.546f , 1 , 26 );
658 ipFe1_35m = ipFindLevLine( 347043.25f , 1 , 26 );
659 ipFe1_54m = ipFindLevLine( 542946.5625f , 1 , 26 );
660 ipFe1_111m = ipFindLevLine( 1111549.25f , 1 , 26 );
661
662 ipFeI3884 = ipFindLevLine( 3884 , 1 , 26 );
663
664 ipFeI3729 = ipFindLevLine( 3729 , 1 , 26 );
665
666 ipFeI3457 = ipFindLevLine( 3457 , 1 , 26 );
667
668 ipFeI3021 = ipFindLevLine( 3021 , 1 , 26 );
669
670 ipFeI2966 = ipFindLevLine( 2966 , 1 , 26 );
671
672 /*>>chng 03 oct 07, chng wl from 2360 to 2400, the value
673 * before cnhg of feii lines to stuc */
674 ipTuv3 = ipFindLevLine( 2400 , 2 , 26 );
675
676 ipTr48 = ipFindLevLine( 6200 , 2 , 26 );
677
678 ipTFe16 = ipFindLevLine( 1080 , 2 , 26 );
679
680 ipTFe26 = ipFindLevLine( 1500 , 2 , 26 );
681
682 ipTFe34 = ipFindLevLine( 11500 , 2 , 26 );
683
684 ipTFe35 = ipFindLevLine( 2500 , 2 , 26 );
685
686 ipTFe46 = ipFindLevLine( 2300 , 2 , 26 );
687
688 ipTFe56 = ipFindLevLine( 8900 , 2 , 26 );
689
690 ipT1122 = ipFindLevLine( 1125.8f , 3 , 26 );
691
692 ipT191 = ipFindLevLine( 1786 , 2 , 26 );
693
694 /* Cobalt data */
695 /* [Co XI] 5168.A */
696 ipCo11527 = ipFindLevLine( 5168 , 11 , 27 );
697
698 /* Nickel data */
699 ipNi1_7m = ipFindLevLine( 75046.164f , 1 , 28 );
700 ipNi1_11m = ipFindLevLine( 113044.031f , 1 , 28 );
701
702 /* flush the line list, freeing the extra storage and checking that all
703 * lines have been claimed */
705
708
709 /* only do this one time, and only if number of atom_level2 lines is positive */
710 if( lgFirst && nWindLine>0)
711 {
712
713 lgFirst = false;
714 /* these are the massive set of op lines, with g-bar approx cs
715 * confirm that input data are valid */
716
717 for( i=0; i < nWindLine; i++ )
718 {
719 /* this information was read in in createdata */
720 ASSERT( (*TauLine2[i].Hi()).nelem() > 0 );
721 ASSERT( (*TauLine2[i].Hi()).nelem() <= (int)LIMELM );
722
723 ASSERT( (*TauLine2[i].Hi()).IonStg() > 0 );
724 ASSERT( (*TauLine2[i].Hi()).IonStg() <= (int)LIMELM );
725
726 ASSERT( (*TauLine2[i].Lo()).g() >0. );
727
728 ASSERT( (*TauLine2[i].Hi()).g() > 0. );
729
730 /* check that energy is positive*/
731 ASSERT( TauLine2[i].EnergyWN() > 0 );
732
733 /* TauLine2[i].Emis().gf() this is gf if positive, A if negative */
734 /* test whether a or gf entered, convert A to gf */
735 if( TauLine2[i].Emis().gf() < 0. )
736 {
737 /* convert A (=-gf) into real gf */
738 TauLine2[i].Emis().gf() *= (realnum)((-(*TauLine2[i].Hi()).g())/TRANS_PROB_CONST/POW2(TauLine2[i].EnergyWN()));
739 }
740
741 /*now put into standard format */
742 TauLine2[i].WLAng() = 1.e8f/TauLine2[i].EnergyWN();
743 (*TauLine2[i].Lo()).Pop() = 0.;
744 (*TauLine2[i].Hi()).Pop() = 0.;
745 TauLine2[i].Emis().iRedisFun() = ipPRD;
746
747 /* these are line optical depth arrays
748 * inward optical depth */
749 TauLine2[i].Emis().TauIn() = opac.taumin;
750 TauLine2[i].Emis().TauCon() = opac.taumin;
751 TauLine2[i].Emis().ColOvTot() = 0.;
752 /* outward optical depth */
753 TauLine2[i].Emis().TauTot() = 1e20f;
754 /* escape probability */
755 TauLine2[i].Emis().Pesc() = 1.;
756 /* inward part of line */
757 TauLine2[i].Emis().FracInwd() = 1.;
758 /* destruction probability */
759 TauLine2[i].Emis().Pdest() = 0.;
760 TauLine2[i].Emis().Pelec_esc() = 0.;
761 /* line pumping rate */
762 TauLine2[i].Emis().pump() = 0.;
763 /* population of lower level */
764 (*TauLine2[i].Lo()).Pop() = 0.;
765 /* population of upper level */
766 (*TauLine2[i].Hi()).Pop() = 0.;
767 /* population of lower level with correction for stim emission */
768 TauLine2[i].Emis().PopOpc() = 0.;
769 /* following two heat exchange excitation, deexcitation */
770 TauLine2[i].Coll().cool() = 0.;
771 TauLine2[i].Coll().heat() = 0.;
772 /* intensity of line */
773 TauLine2[i].Emis().xIntensity() = 0.;
774 /* number of photons emitted in line */
775 TauLine2[i].Emis().phots() = 0.;
776 /* ots rate */
777 TauLine2[i].Emis().ots() = 0.;
778 }
779 }
780
781 for( i=0; i < nUTA; i++ )
782 {
783 /* this information was read in in createdata */
784 ASSERT( (*UTALines[i].Hi()).nelem() > 0 );
785 ASSERT( (*UTALines[i].Hi()).nelem() <= (int)LIMELM );
786
787 ASSERT( (*UTALines[i].Hi()).IonStg() > 0 );
788 ASSERT( (*UTALines[i].Hi()).IonStg() <= (int)LIMELM );
789
790 ASSERT( (*UTALines[i].Lo()).g() > 0. );
791
792 ASSERT( (*UTALines[i].Hi()).g() > 0. );
793
794 /* check that energy is positive*/
795 ASSERT( UTALines[i].EnergyWN() > 0 );
796
797 (*UTALines[i].Lo()).Pop() = 0.;
798 (*UTALines[i].Hi()).Pop() = 0.;
799 UTALines[i].Emis().iRedisFun() = ipPRD;
800
801 /* these are line optical depth arrays
802 * inward optical depth */
803 UTALines[i].Emis().TauIn() = opac.taumin;
804 UTALines[i].Emis().TauCon() = opac.taumin;
805 UTALines[i].Emis().ColOvTot() = 0.;
806 /* outward optical depth */
807 UTALines[i].Emis().TauTot() = 1e20f;
808 /* escape probability */
809 UTALines[i].Emis().Pesc() = 1.;
810 /* inward part of line */
811 UTALines[i].Emis().FracInwd() = 1.;
812 /* destruction probability */
813 UTALines[i].Emis().Pdest() = 0.;
814 UTALines[i].Emis().Pelec_esc() = 0.;
815 /* line pumping rate */
816 UTALines[i].Emis().pump() = 0.;
817 /* population of lower level */
818 (*UTALines[i].Lo()).Pop() = 0.;
819 /* population of upper level */
820 (*UTALines[i].Hi()).Pop() = 0.;
821 /* population of lower level with correction for stim emission */
822 UTALines[i].Emis().PopOpc() = 0.;
823 /* following two heat exchange excitation, deexcitation */
824 UTALines[i].Coll().cool() = 0.;
825 /* heat is the net heat per pump and was set when data read in
826 * this is different from other lines with this structure
827 UTALines[i].Coll().heat() = 0.;*/
828 /* intensity of line */
829 UTALines[i].Emis().xIntensity() = 0.;
830 /* number of photons emitted in line */
831 UTALines[i].Emis().phots() = 0.;
832 UTALines[i].Emis().ots() = 0.;
833 }
834
835 for( i=0; i < nHFLines; i++ )
836 {
837 /* this information was read in in createdata */
838 ASSERT( (*HFLines[i].Hi()).nelem() > 0 );
839 ASSERT( (*HFLines[i].Hi()).nelem() <= (int)LIMELM );
840
841 ASSERT( (*HFLines[i].Hi()).IonStg() > 0 );
842 ASSERT( (*HFLines[i].Hi()).IonStg() <= (int)LIMELM );
843
844 ASSERT( (*HFLines[i].Lo()).g() > 0. );
845
846 ASSERT( (*HFLines[i].Hi()).g() > 0. );
847
848 /* check that energy is positive*/
849 ASSERT( HFLines[i].EnergyWN() > 0 );
850 ASSERT( HFLines[i].Emis().Aul()>0 );
851 ASSERT( HFLines[i].Emis().damp()>0 );
852
853 /* HFLines[i].Emis->gf() this is gf if positive, A if negative */
854 /* test whether a or gf entered, convert A to gf */
855 if( HFLines[i].Emis().gf() < 0. )
856 {
857 /* convert A (=-gf) into real gf */
858 HFLines[i].Emis().gf() *= (realnum)(-(*HFLines[i].Hi()).g()/TRANS_PROB_CONST/POW2(HFLines[i].EnergyWN()));
859 }
860
861 /*now put into standard format */
862 HFLines[i].WLAng() = 1.e8f/HFLines[i].EnergyWN();
863 (*HFLines[i].Lo()).Pop() = 0.;
864 (*HFLines[i].Hi()).Pop() = 0.;
865 /* change from partial to complete redistribution */
866 HFLines[i].Emis().iRedisFun() = ipCRD;
867
868 /* these are line optical depth arrays
869 * inward optical depth */
870 HFLines[i].Emis().TauIn() = opac.taumin;
871 HFLines[i].Emis().TauCon() = opac.taumin;
872 HFLines[i].Emis().ColOvTot()=0;
873 /* outward optical depth */
874 HFLines[i].Emis().TauTot() = 1e20f;
875 /* escape probability */
876 HFLines[i].Emis().Pesc() = 1.;
877 /* inward part of line */
878 HFLines[i].Emis().FracInwd() = 1.;
879 /* destruction probability */
880 HFLines[i].Emis().Pdest() = 0.;
881 HFLines[i].Emis().Pelec_esc() = 0.;
882 /* line pumping rate */
883 HFLines[i].Emis().pump() = 0.;
884 /* population of lower level */
885 (*HFLines[i].Lo()).Pop() = 0.;
886 /* population of upper level */
887 (*HFLines[i].Hi()).Pop() = 0.;
888 /* population of lower level with correction for stim emission */
889 HFLines[i].Emis().PopOpc() = 0.;
890 /* following two heat exchange excitation, deexcitation */
891 HFLines[i].Coll().cool() = 0.;
892 HFLines[i].Coll().heat() = 0.;
893 /* intensity of line */
894 HFLines[i].Emis().xIntensity() = 0.;
895 /* number of photons emitted in line */
896 HFLines[i].Emis().phots() = 0.;
897 HFLines[i].Emis().ots() = 0.;
898 }
899 return;
900}
901
902/* following used to save whether lines have been claimed by a pointer */
903static int *lev2set;
904
905/*generate pointer to level 1 line using wavelengtgh, ion, element */
907 /* realnum ID wavelength, in angstroms */
908 realnum wl ,
909 /* state of ionization, 1 for neutral atom */
910 long ion ,
911 /* element number, 1 for H, 26 for Fe */
912 long nelem)
913{
914 long i;/* use for counter in for loop */
915
916 DEBUG_ENTRY( "ipFindLevLine()" );
917
918 ASSERT( wl > 0. );
919 ASSERT( ion > 0 );
920 ASSERT( ion <= LIMELM );
921 ASSERT( nelem > 0 );
922 ASSERT( nelem <= LIMELM );
923
924 /* look for the line */
925 for( i=1; i<= nLevel1; ++i )
926 {
927 if( (*TauLines[i].Hi()).nelem() == (int)nelem &&
928 (*TauLines[i].Hi()).IonStg() == (int)ion &&
929 // wl hit within relative accuracy of 0.05A in 1000A
930 fabs(TauLines[i].WLAng() - wl)/max(1000.,wl) < 0.05/1000. )
931 {
932 /* remember that we have hit this line */
933 lev2set[i] = true;
934 /* and return pointer to the label*/
935 return i;
936 }
937 }
938 fprintf(ioQQQ,
939 " ipFindLevLine could not find a line with following properties:\n"
940 " wavelength=%f\n"
941 " ion stage =%li\n"
942 " atomic num=%li\n",
943 wl , ion, nelem );
944 return -1;
945}
946
948{
949 long i;
950
951 DEBUG_ENTRY( "initFindLevLine()" );
952
953 /* generate the array of ints to store true and false */
954 lev2set = (int*)MALLOC( (size_t)(nLevel1+1)*sizeof(int) );
955
956 /* set them all false, saying that they have not been claimed by
957 * one of the line pointers */
958 for( i=1; i<=nLevel1; ++i )
959 lev2set[i] = false;
960 return;
961}
962
964{
965 long i;
966 bool lgAbort_loc=false;
967
968 DEBUG_ENTRY( "endFindLevLine()" );
969
970 /* set them all false, saying that they have not been claimed by
971 * one of the line pointers */
972 for( i=1; i<=nLevel1; ++i )
973 {
974 if( !lev2set[i] )
975 {
976 fprintf(ioQQQ,"PROBLEM endFindLevLine warning; line %li not claimed\n",i);
977 fprintf(ioQQQ,
978 " line had the following properties:\n"
979 " wavelength=%f\n"
980 " ion stage =%i\n"
981 " atomic num=%i\n",
982 TauLines[i].WLAng() ,
983 (*TauLines[i].Hi()).IonStg() ,
984 (*TauLines[i].Hi()).nelem() );
985 lgAbort_loc = true;
986 }
987 }
988
989 /* generate the array of ints to store true and false */
990 free(lev2set);
991
992 if( lgAbort_loc )
993 {
994 fprintf(ioQQQ," problems found entering the data. I live in lines_setup.c\n");
996 }
997 return;
998}
STATIC void endFindLevLine(void)
static int * lev2set
void lines_setup(void)
STATIC void initFindLevLine(void)
STATIC long ipFindLevLine(realnum, long, long)
long ipT157
long ipxMg51325
long ipTAr13
long ipP0233
long ipTMg610
long ipT8727
long ipCl1_11m
long ipCo11527
long ipTSi25
long ipT770
long ipTAl48
long ipT1085
long ipT8498
long ipTNe14
long ipC2_2329
long ipT386
long ipAl6912
long ipTS34
long ipT8662
long ipTNe13
long ipTAr22
long ipT977
long ipSi2_2334
long ipTNe24
long ipTFe34
long ipMgI2026
long ipfsMg790
long ipxNa0746
long ipT6363
long ipxK03462
long ipT1661
long ipO4_1401
long ipSi10143
long ipAl8370
long ipAr06453
long ipT324
long ipT2140
long ipAl8575
long ipTAl568
long ipT205
long ipO4_1405
long ipAl09204
long ipT1666
long ipSi2_2336
long ipC2_2327
long ipCl973
long ipNi1_7m
long ipTSi65
long ipO4_1397
long ipTFe26
long ipTCa3
long ipSi2_2329
long ipT146
long ipT8542
long ipT26
long ipFe1_24m
long ipT280
long ipTNe36
long ipT7324
long ipT1550
long ipT1194
long ipFe1_35m
long ipAlI3957
long ipxMg52855
long ipO4_1407
long ipT1394
long ipT1207
long ipT780
long ipSi1_68m
long ipTSi41
long ipCl04203
long ipTO88
long ipT786
long ipT1305
long ipC2_2328
long ipTS19
long ipC2_2324
long ipT990
long ipC2_2325
long ipNi1_11m
long ipT1656
long ipTOI46
long ipc31175
long ipP713
long ipT1037
long ipT88
long ipN3_1752
long ipT5577
long ipAl6366
long ipT1243
long ipT1863
long ipS1_25m
long ipCaI4228
long ipT304
long ipTMg625
long ipTMg14
long ipT209
long ipTAl550
long ipT5895
long ipxNa6143
long ipT7291
long ipSi2_2350
long ipT1122
long ipT765
long ipN3_1754
long ipT1909
long ipT9830
long ipAl529
long ipP0318
long ipT374x
long ipTO1025
long ipN3_1751
long ipT1486
long ipfsNa373
long ipfsMg755
long ipT639
long ipTOI11
long ipxMg52417
long ipP0260
long ipTAr8
long ipxMg71190
long ipSii2215
long ipT370
long ipT191
long ipxK04598
long ipT270
long ipN3_1747
long ipT122
long ipTOI13
long ipKI7745
long ipT1256
long ipT58
long ipT52
long ipT2804
long ipfsCl214
long ipT3969
long ipxMg08303
long ipT4561
long ipxNe0676
long ipT1527
long ipO4_1400
long ipT8446
long ipSc05231
long ipT1198
long ipT4368
long ipMgI2853
long ipT835
long ipFe1_111m
long ipfsNa421
long ipxMg72261
long ipTAr7
long ipTS11
long ipT310
long ipN3_1749
long ipfsCl233
long ipT333
long ipT895
long ipT150
long ipT705
long ipTMg4
long ipTuv3
long ipT834
long ipT1304
long ipT1855
long ipTOI29
long ipT1214
long ipFe1_54m
long ipSc13264
long ipT274
long ipTFe46
long ipS4_1407
long ipTFe56
long ipT1403
long ipTNe16
long ipT3934
long ipCl04117
long ipTS1720
long ipTSi521
long ipT57
long ipTSi4
long ipTAr9
long ipT2796
long ipT315
long ipFeI2966
long ipT630
long ipT1039
long ipS1_56m
long ipT1260
long ipT1335
long ipxK07319
long ipFeI3021
long ipSii2518
long ipSi619
long ipT1239
long ipSi2_2344
long ipAlI3090
long ipT671
long ipS4_1398
long ipFeI3729
long ipxK04154
long ipNI_pumpIndirect
long ipT1895
long ipSi10_606
long ipT2670
long ipTFe35
long ipFeI3884
long ipS4_1405
long ipTSi35
long ipT1548
long ipTSi3
long ipxMg72569
long ipfsNa490
long ipT6300
long ipFeI3457
long ipT312
long ipS4_1424
long ipT1200
long ipT291
long ipTMg6
long ipSi1_130m
long ipxNa6862
long ipTSi499
long ipTr48
long ipNI_pumpDirect[NI_NDP]
long ipT63
long ipS4_1417
long ipT789
long ipTFe16
long ipT610
long ipT1808
long ipT1032
long ipT374g
FILE * ioQQQ
Definition cddefines.cpp:7
#define ASSERT(exp)
Definition cddefines.h:578
#define STATIC
Definition cddefines.h:97
#define MALLOC(exp)
Definition cddefines.h:501
const int LIMELM
Definition cddefines.h:258
#define POW2
Definition cddefines.h:929
#define EXIT_FAILURE
Definition cddefines.h:140
#define cdEXIT(FAIL)
Definition cddefines.h:434
float realnum
Definition cddefines.h:103
long max(int a, long b)
Definition cddefines.h:775
NORETURN void TotalInsanity(void)
Definition service.cpp:886
#define DEBUG_ENTRY(funcname)
Definition cddefines.h:684
const int ipCRD
Definition cddefines.h:292
void ShowMe(void)
Definition service.cpp:181
const int ipPRD
Definition cddefines.h:290
long nWindLine
Definition cdinit.cpp:19
double RefIndex(double EnergyWN)
t_opac opac
Definition opacity.cpp:5
UNUSED const double TRANS_PROB_CONST
Definition physconst.h:237
void prt_wl(FILE *ioOUT, realnum wl)
Definition prt.cpp:13
static bool lgFirst
static double * g
Definition species2.cpp:28
TransitionList UTALines("UTALines", &AnonStates)
TransitionList TauLine2("TauLine2", &AnonStates)
TransitionList HFLines("HFLines", &AnonStates)
long int nUTA
Definition taulines.cpp:26
long int nLevel1
Definition taulines.cpp:28
long int nHFLines
Definition taulines.cpp:31
TransitionList TauLines("TauLines", &AnonStates)
void chIonLbl(char *chIonLbl_v, const TransitionProxy &t)