Cloudy
Spectral Synthesis Code for Astrophysics
Loading...
Searching...
No Matches
lines.h
Go to the documentation of this file.
1/* This file is part of Cloudy and is copyright (C)1978-2025 by Gary J. Ferland and
2 * others. For conditions of distribution and use see copyright notice in license.txt */
3
4#ifndef LINES_H_
5#define LINES_H_
6
7#include <cstdio>
8#include "module.h"
9#include "transition.h"
10#include "atmdat_adfa.h" // For NRECCOEFCNO
11
12class cdstream;
13
14class LineID
15{
16 string p_chLabel;
17 // the constructors will make sure that this is always a wavelength in vacuum
19 // the remaining parameters are optional, used for line disambiguation
23public:
25 p_indLo(-1), p_indHi(-1), p_ELo(-1_r) {}
26 LineID(string lbl, t_wavl wv) :
27 p_chLabel(lbl), p_wave(wv), p_indLo(-1), p_indHi(-1), p_ELo(-1_r) {}
28 LineID(string lbl, t_wavl wv, realnum e) :
29 p_chLabel(lbl), p_wave(wv), p_indLo(-1), p_indHi(-1), p_ELo(e) {}
30 LineID(string lbl, t_wavl wv, int ilo, int ihi) :
31 p_chLabel(lbl), p_wave(wv), p_indLo(ilo), p_indHi(ihi), p_ELo(-1_r) {}
32 LineID(string lbl, t_wavl wv, int ilo, int ihi, realnum e) :
33 p_chLabel(lbl), p_wave(wv), p_indLo(ilo), p_indHi(ihi), p_ELo(e) {}
34 string chLabel() const { return p_chLabel; }
35 realnum wavlVac() const { return p_wave.wavlVac(); }
36 t_wavl twav() const { return p_wave; }
37 string str() const { return "\"" + p_chLabel + "\" " + p_wave.sprt_wl(); }
38 int indLo() const { return p_indLo; }
39 int indHi() const { return p_indHi; }
40 realnum ELo() const { return p_ELo; }
41};
42
44void lines(void);
45
47void lines_general(void);
48
50void lines_hydro(void);
51
53void LineStackCreate(void);
54
56void lines_grains(void);
57
60void lines_setup(void);
61
63void lines_continuum(void);
64
66void lines_molecules(void);
67
69void lines_helium(void);
70
72void lines_lv1_li_ne(void);
73
75void lines_lv1_k_zn(void);
76
79long int StuffComment( const char * chComment );
80
83int lines_table();
84
87
88class LinSv;
89
90void cdEmis(
91 const LinSv* line,
92 /* the vol emissivity of this line in last computed zone */
93 double *emiss ,
94 // intrinsic or emergent
95 bool lgEmergent );
96
97static const int NHOLDCOMMENTS = 100;
98
99extern const t_wavl Hbeta_WavLen;
100
103struct t_LineSave : public module {
104 const char *chName() const
105 {
106 return "LineSave";
107 }
108 void zero();
111
114 long int nsum;
115
117 long int nComment;
118
123 long int ipass;
124
127
130
132 long int ipNormLine;
133
136
139 long int sig_figs;
140 static const long sig_figs_max = 6;
141
145
148
149 long findline(const LineID& line);
150
153 vector<LinSv> lines;
154 vector<realnum> m_wavelength;
155 vector<size_t> SortWL;
156 void clear()
157 {
158 lines.clear();
159 m_wavelength.clear();
160 }
161 void resize(long nlines);
162
163 void setSortWL();
164 void init(long index, char chSumTyp, const char *chComment, const char *label,
165 bool lgAdd, t_wavl wavelength, const TransitionProxy& tr);
166 realnum wavlVac(long index) const
167 {
168 return m_wavelength[index];
169 }
170 t_wavl twav(long index) const
171 {
172 return t_vac(wavlVac(index));
173 }
174
175 void resetWavlVac( long index, realnum wl )
176 {
177 m_wavelength[index] = wl;
178 }
179
181};
182extern t_LineSave LineSave;
183
187class LinSv {
192 double m_SumLine[4];
194 double m_emslin[2];
196 vector<long> m_component;
201 // private accessors
202 void chALabSet(const char *that);
203public:
204
207 {
208 return m_tr;
209 }
210
212 char chSumTyp() const
213 {
214 return m_chSumTyp;
215 }
216
218 const char *chALab() const
219 {
220 return m_chALab;
221 }
222
223 const char *chCLab() const
224 {
225 return m_chCLab;
226 }
227
233 bool isBlend() const
234 {
235 return !m_component.empty();
236 }
237 char LineType() const
238 {
239 return m_chSumTyp;
240 }
241 void addComponent(const LineID& line);
242 void addComponentID(long id);
243 void makeBlend(const char* species, const t_wavl& wavelength, const realnum width);
244 void setBlendWavl();
245
247 {
248 long id = m_component[ind];
249 return LineSave.lines[id].getTransition();
250 }
251 double SumLine(int i) const
252 {
253 if (!isBlend())
254 {
255 return m_SumLine[i];
256 }
257 else
258 {
259 double sum = 0.;
260 for (size_t j=0; j<m_component.size(); ++j)
261 {
262 long id = m_component[j];
263 sum += LineSave.lines[id].SumLine(i);
264 }
265 return sum;
266 }
267 }
268 void SumLineAdd(int i, double val)
269 {
270 if (!isBlend())
271 m_SumLine[i] += val;
272 }
273 void SumLineAccum(double cumulative_factor)
274 {
275 if (!isBlend())
276 {
277 for( long nEmType=0; nEmType<2; ++nEmType )
278 {
279 m_SumLine[nEmType+2] += cumulative_factor*m_SumLine[nEmType];
280 }
281 }
282 }
284 {
285 if (!isBlend())
286 m_SumLine[0] = m_SumLine[1] = 0.0;
287 }
289 {
290 if (!isBlend())
291 m_SumLine[2] = m_SumLine[3] = 0.0;
292 }
294 {
295 if (!isBlend() && m_chSumTyp == 't')
296 m_SumLine[1] = m_SumLine[0];
297 }
298
300 double emslin(int i) const
301 {
302 if (!isBlend())
303 {
304 return m_emslin[i];
305 }
306 else
307 {
308 double sum = 0.;
309 for (size_t j=0; j<m_component.size(); ++j)
310 {
311 long id = m_component[j];
312 sum += LineSave.lines[id].emslin(i);
313 }
314 return sum;
315 }
316 }
318 {
319 if (!isBlend())
320 {
321 m_emslin[0] = 0.0;
322 m_emslin[1] = 0.0;
323 }
324 }
325 void emslinSet(int i, double v)
326 {
327 if (!isBlend())
328 m_emslin[i] = v;
329 }
331 {
332 if (!isBlend() && m_chSumTyp == 't')
333 m_emslin[1] = m_emslin[0];
334 }
335
337 void prt_blend() const;
338
341 {
342 return LineSave.wavlVac(m_index);
343 }
344 t_wavl twav() const
345 {
346 return LineSave.twav(m_index);
347 }
348
350 string chComment() const;
351 void init(long index, char chSumTyp, const char *chComment, const char *label,
352 const TransitionProxy& tr);
353
354 void prt(FILE *fp) const;
355 string label() const;
356 string biglabel() const;
357 bool isCat(const char *s) const;
358 bool isSeparator() const
359 {
360 return m_type == SEPARATOR;
361 }
362 bool isUnit() const
363 {
364 return m_type == UNIT;
365 }
366 bool isUnitD() const
367 {
368 return m_type == UNITD;
369 }
370 bool isInward() const
371 {
372 return m_type == INWARD;
373 }
374 bool isInwardTotal() const
375 {
376 return m_type == INWARDTOTAL;
377 }
378 bool isInwardContinuum() const
379 {
380 return m_type == INWARDCONTINUUM;
381 }
382 bool isCollisional() const
383 {
384 return m_type == COLLISIONAL;
385 }
386 bool isPump() const
387 {
388 return m_type == PUMP;
389 }
390 bool isHeat() const
391 {
392 return m_type == HEAT;
393 }
394 bool isCaseA() const
395 {
396 return m_type == CASEA;
397 }
398 bool isCaseB() const
399 {
400 return m_type == CASEB;
401 }
402 bool isNInu() const
403 {
404 return m_type == NINU;
405 }
406 bool isNFnu() const
407 {
408 return m_type == NFNU;
409 }
410 bool isPhoPlus() const
411 {
412 return m_type == PHOPLUS;
413 }
414 bool isPcon() const
415 {
416 return m_type == PCON;
417 }
418 bool isQH() const
419 {
420 return m_type == QH;
421 }
422
423#ifndef NDEBUG
424 void checkEmergent( const long ipEmType ) const
425 {
426 /* Pick instantaneous or cumulative */
427 int ipIntr, ipEmer;
428 if( ipEmType == 1 )
429 {
430 ipIntr = 0;
431 ipEmer = 1;
432 }
433 else if( ipEmType == 3 )
434 {
435 ipIntr = 2;
436 ipEmer = 3;
437 }
438 else
439 return;
440
441 if( !isBlend() )
442 {
443 if( m_chSumTyp != 't' || LineSave.wavlVac(m_index) <= 0_r )
444 ASSERT( m_SumLine[ipEmer] == 0. );
445 else
446 ASSERT( m_SumLine[ipIntr] > m_SumLine[ipEmer] ||
447 fp_equal( m_SumLine[ipIntr], m_SumLine[ipEmer], 10 ) );
448 }
449 }
450#else
451 void checkEmergent( const long ) const
452 {
453 (void)0;
454 }
455#endif
456};
457
458inline void t_LineSave::resize(long nlines)
459{
460 lines.resize(nlines);
461 m_wavelength.resize(nlines);
462}
463
464#endif /* LINES_H_ */
const int NRECCOEFCNO
Definition atmdat_adfa.h:10
#define ASSERT(exp)
Definition cddefines.h:637
const int NCHLAB
Definition cddefines.h:314
t_wavl t_vac(realnum w)
Definition cddefines.h:1333
float realnum
Definition cddefines.h:127
bool fp_equal(sys_float x, sys_float y, int n=3)
Definition cddefines.h:864
Definition lines.h:187
bool isPump() const
Definition lines.h:386
void makeBlend(const char *species, const t_wavl &wavelength, const realnum width)
Definition lines.cpp:240
bool isHeat() const
Definition lines.h:390
bool isNFnu() const
Definition lines.h:406
bool isCaseB() const
Definition lines.h:398
double SumLine(int i) const
Definition lines.h:251
void emslinSet(int i, double v)
Definition lines.h:325
void init(long index, char chSumTyp, const char *chComment, const char *label, const TransitionProxy &tr)
Definition lines.cpp:105
const char * chALab() const
Definition lines.h:218
t_wavl twav() const
Definition lines.h:344
void emslinThin()
Definition lines.h:330
bool isCollisional() const
Definition lines.h:382
@ NINU
Definition lines.h:199
@ INWARDTOTAL
Definition lines.h:198
@ INWARD
Definition lines.h:198
@ QH
Definition lines.h:199
@ CASEA
Definition lines.h:199
@ COLLISIONAL
Definition lines.h:199
@ PUMP
Definition lines.h:199
@ UNITD
Definition lines.h:198
@ PCON
Definition lines.h:199
@ UNIT
Definition lines.h:198
@ DEFAULT
Definition lines.h:198
@ PHOPLUS
Definition lines.h:199
@ INWARDCONTINUUM
Definition lines.h:198
@ CASEB
Definition lines.h:199
@ SEPARATOR
Definition lines.h:198
@ HEAT
Definition lines.h:199
@ NFNU
Definition lines.h:199
const TransitionProxy getComponent(long ind)
Definition lines.h:246
void SumLineZero()
Definition lines.h:283
void chALabSet(const char *that)
Definition lines.cpp:90
string biglabel() const
Definition lines.cpp:63
void SumLineThin()
Definition lines.h:293
char m_chSumTyp
Definition lines.h:189
bool isCat(const char *s) const
Definition lines.cpp:79
double m_emslin[2]
Definition lines.h:194
TransitionProxy getTransition()
Definition lines.h:206
const char * chCLab() const
Definition lines.h:223
double m_SumLine[4]
Definition lines.h:192
vector< long > m_component
Definition lines.h:196
void SumLineAccum(double cumulative_factor)
Definition lines.h:273
long m_index
Definition lines.h:188
bool isNInu() const
Definition lines.h:402
string chComment() const
Definition lines.cpp:326
string m_chComment
Definition lines.h:195
void emslinZero()
Definition lines.h:317
void checkEmergent(const long ipEmType) const
Definition lines.h:424
char m_chCLab[NCHLAB]
Definition lines.h:191
char m_chALab[NCHLAB]
Definition lines.h:190
void addComponent(const LineID &line)
Definition lines.cpp:211
bool isCaseA() const
Definition lines.h:394
bool isUnit() const
Definition lines.h:362
bool isPhoPlus() const
Definition lines.h:410
enum LinSv::@012044272163122211231125305132323165251166134035 m_type
bool isQH() const
Definition lines.h:418
char chSumTyp() const
Definition lines.h:212
realnum wavlVac() const
Definition lines.h:340
void SumLineAdd(int i, double val)
Definition lines.h:268
bool isInward() const
Definition lines.h:370
TransitionProxy m_tr
Definition lines.h:197
bool isBlend() const
Definition lines.h:233
bool isUnitD() const
Definition lines.h:366
string label() const
Definition lines.cpp:54
bool isPcon() const
Definition lines.h:414
void setBlendWavl()
Definition lines.cpp:302
double emslin(int i) const
Definition lines.h:300
bool isSeparator() const
Definition lines.h:358
void addComponentID(long id)
Definition lines.cpp:193
void prt_blend() const
Definition lines.cpp:288
bool isInwardTotal() const
Definition lines.h:374
void SumLineZeroAccum()
Definition lines.h:288
bool isInwardContinuum() const
Definition lines.h:378
char LineType() const
Definition lines.h:237
Definition lines.h:15
LineID(string lbl, t_wavl wv)
Definition lines.h:26
int p_indHi
Definition lines.h:21
realnum wavlVac() const
Definition lines.h:35
t_wavl p_wave
Definition lines.h:18
t_wavl twav() const
Definition lines.h:36
string str() const
Definition lines.h:37
realnum p_ELo
Definition lines.h:22
int p_indLo
Definition lines.h:20
int indHi() const
Definition lines.h:39
string chLabel() const
Definition lines.h:34
realnum ELo() const
Definition lines.h:40
LineID(string lbl, t_wavl wv, int ilo, int ihi, realnum e)
Definition lines.h:32
LineID(string lbl, t_wavl wv, int ilo, int ihi)
Definition lines.h:30
LineID(string lbl, t_wavl wv, realnum e)
Definition lines.h:28
int indLo() const
Definition lines.h:38
string p_chLabel
Definition lines.h:16
LineID()
Definition lines.h:24
Definition transition.h:24
module()
Definition module.h:29
Definition species.h:12
Definition warnings.h:11
Definition cddefines.h:1299
const t_wavl Hbeta_WavLen
Definition lines.cpp:12
t_LineSave LineSave
Definition lines.cpp:14
void lines(void)
Definition prt_lines.cpp:56
void LineStackCreate(void)
Definition lines_service.cpp:28
long int StuffComment(const char *chComment)
Definition prt_final.cpp:1943
void clear_lines_table()
Definition parse_table.cpp:1716
void lines_setup(void)
Definition atmdat_lines_setup.cpp:11
static const int NHOLDCOMMENTS
Definition lines.h:97
void lines_molecules(void)
Definition prt_lines_molecules.cpp:17
void lines_helium(void)
Definition prt_lines_helium.cpp:53
void lines_lv1_li_ne(void)
int lines_table()
Definition parse_table.cpp:1676
void cdEmis(const LinSv *line, double *emiss, bool lgEmergent)
Definition lines.cpp:668
void lines_lv1_k_zn(void)
void lines_general(void)
Definition prt_lines_general.cpp:20
void lines_continuum(void)
Definition prt_lines_continuum.cpp:22
t_LineSave LineSave
Definition lines.cpp:14
void lines_hydro(void)
Definition prt_lines_hydro.cpp:53
void lines_grains(void)
Definition prt_lines_grains.cpp:12
static vector< realnum > wavelength
Definition monitor_results.cpp:79
t_prt prt
Definition prt.cpp:14
Definition lines.h:103
string chHoldComments[NHOLDCOMMENTS]
Definition lines.h:126
void setSortWL()
Definition lines.cpp:351
long int sig_figs
Definition lines.h:139
vector< LinSv > lines
Definition lines.h:153
long int ipNormLine
Definition lines.h:132
long int nComment
Definition lines.h:117
void comment(t_warnings &)
Definition lines.h:109
const char * chName() const
Definition lines.h:104
bool lgIsoContSubSignif
Definition lines.h:180
void zero()
Definition lines.cpp:17
realnum RecCoefCNO[4][NRECCOEFCNO]
Definition lines.h:147
void clear()
Definition lines.h:156
t_wavl twav(long index) const
Definition lines.h:170
int wl_length
Definition lines.h:144
long findline(const LineID &line)
Definition lines.cpp:362
long int nsum
Definition lines.h:114
vector< size_t > SortWL
Definition lines.h:155
static const long sig_figs_max
Definition lines.h:140
vector< realnum > m_wavelength
Definition lines.h:154
void init(long index, char chSumTyp, const char *chComment, const char *label, bool lgAdd, t_wavl wavelength, const TransitionProxy &tr)
Definition lines.cpp:33
void resize(long nlines)
Definition lines.h:458
LineID NormLine
Definition lines.h:129
double ScaleNormLine
Definition lines.h:135
realnum wavlVac(long index) const
Definition lines.h:166
long int ipass
Definition lines.h:123
void resetWavlVac(long index, realnum wl)
Definition lines.h:175