cloudy trunk
Loading...
Searching...
No Matches
parse_drive.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/*ParseDrive parse the drive command - drive calls to various subs */
4/*DrvCaseBHS allow user to query hydrogen A's, asks for up, low level, gives A, drive hyas */
5/*DrvHyas allow user to query hydrogen A's, asks for up, low level, gives A, drive hyas */
6/*dgaunt drive gaunt factor routines by letting user query values */
7#include "cddefines.h"
8#include "trace.h"
9#include "hydro_bauman.h"
10#include "hydroeinsta.h"
11#include "thirdparty.h"
12#include "phycon.h"
13#include "atmdat.h"
14#include "taulines.h"
15#include "thermal.h"
16#include "thirdparty.h"
17#include "abund.h"
18#include "rt.h"
19#include "continuum.h"
20#include "parser.h"
21#include "physconst.h"
22
23/*dgaunt drive gaunt factor routines by letting user query values */
24STATIC void dgaunt(void);
25
26/*DrvHyas allow user to query hydrogen A's, asks for up, low level, gives A, drive hyas */
27STATIC void DrvHyas(void);
28
29/* drive escape probability routines */
30STATIC void DrvEscP( void );
31
32/*DrvCaseBHS allow user to query hydrogen A's, asks for up, low level, gives A, drive hyas */
33STATIC void DrvCaseBHS(void);
34
36{
37 bool lgEOL;
38 long int n,
39 i;
40 double fac,
41 zed;
42
43 DEBUG_ENTRY( "ParseDrive()" );
44
45 /* NB evolve all following names to style DrvSomething */
46
47 /* option to drive cloudy, which one? */
48 if( p.nMatch("FFMT") )
49 {
50 /* free format parser */
51 char chInput[INPUT_LINE_LENGTH];
52 fprintf( ioQQQ, " FFmtRead ParseDrive entered. Enter number.\n" );
53 lgEOL = false;
54 while( !lgEOL )
55 {
56 if( read_whole_line( chInput , (int)sizeof(chInput) , ioStdin ) == NULL )
57 {
58 fprintf( ioQQQ, " ParseDrive.dat error getting magic number\n" );
60 }
61 i = 1;
62 fac = FFmtRead(chInput,&i,sizeof(chInput),&lgEOL);
63 if( lgEOL )
64 {
65 fprintf( ioQQQ, " FFmtRead hit the EOL with no value, return=%10.2e\n",
66 fac );
67 break;
68 }
69 else if( fac == 0. )
70 {
71 break;
72 }
73 else
74 {
75 fprintf( ioQQQ, " FFmtRead returned with value%11.4e\n",
76 fac );
77 }
78 fprintf( ioQQQ, " Enter 0 to stop, or another value.\n" );
79 }
80 fprintf( ioQQQ, " FFmtRead ParseDrive exits.\n" );
81 }
82
83 else if( p.nMatch("CASE") )
84 {
85 /* option to interpolate on Hummer and Storey case b hydrogenic emission routines */
86 DrvCaseBHS( );
87 }
88
89 else if( p.nMatch("CDLI") )
90 {
91 /* drive cdLine to check that it finds all the right lines, routine is in lines.c */
92 trace.lgDrv_cdLine = true;
93 }
94
95 else if( p.nMatch(" E1 ") )
96 {
97 // option to drive exponential integral routines
98 // first, special case given in Abramovitc & Stegan
99 double tau = 1.275;
100 for( i=0; i<50; ++i )
101 {
102 fprintf(ioQQQ,"tau\t%.3e\t exp-tau\t%.5e\t e1 tau\t%.5e \t e2 "
103 "\t%.5e \te2n %.5e \t e3\t%.5e \t e4\t%.5e \n",
104 tau , sexp(tau) , ee1(tau) , e2(tau ), expn(2, tau) ,
105 expn(3 , tau ), expn(4 , tau ) );
106 tau = pow( 10. , ((double)i/4. - 9.) );
107 }
109 }
110
111 else if( p.nMatch("ESCA") )
112 {
113 /* option to drive escape probability routines */
114 DrvEscP( );
115 }
116
117 else if( p.nMatch("HYAS") )
118 {
119 /* option to drive Jason's hydrogen transition probabilities */
120 DrvHyas();
121 }
122
123 else if( p.nMatch("GAUN") )
124 {
125 /* drive gaunt factor routine */
126 dgaunt();
127 }
128
129 else if( p.nMatch("POIN") )
130 {
131 /* later on, check cell pointers, centers, widths */
132 fprintf( ioQQQ, " Define entire model first, later I will ask for energies.\n" );
133 trace.lgPtrace = true;
134 }
135
136 else if( p.nMatch("PUMP") )
137 {
138 char chInput[INPUT_LINE_LENGTH];
139 lgEOL = false;
140 fprintf( ioQQQ, " Continuum pump ParseDrive entered - Enter log tau\n" );
141 while( !lgEOL )
142 {
143 if( read_whole_line( chInput , (int)sizeof(chInput) , ioStdin ) == NULL )
144 {
145 fprintf( ioQQQ, " ParseDrive.dat error getting magic number\n" );
147 }
148 /* get tau */
149 i = 1;
150 fac = FFmtRead(chInput,&i,sizeof(chInput),&lgEOL);
151 if( lgEOL )
152 break;
153 fac = pow(10.,fac);
154 fprintf( ioQQQ, " Tau =%11.4e\n", fac );
155 (*TauDummy).Emis().TauIn() = (realnum)fac;
156 // not sure what this is supposed to do, but TauDummy.Hi->nelem() and therefore the doppler width are ill-defined here!
157 // just put 1 for hydrogen
158 fac = DrvContPump(*TauDummy,1.f);
159 fprintf( ioQQQ, " ContPump =%11.4e\n", fac );
160 fprintf( ioQQQ, " Enter null to stop, or another value.\n" );
161 }
162 fprintf( ioQQQ, " ContPump ParseDrive exits.\n" );
163 }
164
165 else if( p.nMatch("STAR") )
166 {
167 char chInput[INPUT_LINE_LENGTH];
168 /* get starburst abundances */
169 for( i=0; i < 40; i++ )
170 {
171 zed = ((double)i+1.)/4. + 0.01;
172 sprintf( chInput, "starburst, zed=%10.4f", zed );
173 p.setline(chInput);
175 fprintf( ioQQQ, "%8.1e", zed );
176 for(n=0; n < LIMELM; n++)
177 fprintf( ioQQQ, "%8.1e", abund.solar[n] );
178 fprintf( ioQQQ, "\n" );
179 }
180 }
181
182 else if( p.nMatch("VOIGT") )
183 {
184 /* create tab-delimited table giving Voigt function */
185 FILE *ioVOIGT = fopen("voigt.dat" , "w");
186 fprintf(ioVOIGT,"x \\ a");
187 const realnum DampLogMin = -4., DampLogMax = 4.01;
188 for( realnum damplog=DampLogMin; damplog<DampLogMax; ++damplog)
189 fprintf(ioVOIGT,"\tlog a=%.3e",pow(10.,damplog));
190 fprintf(ioVOIGT , "\n");
191
192 for( realnum x=-2.; x<5.;x+=0.05)
193 {
194 realnum xlin = (realnum)pow(10.,x);
195 fprintf(ioVOIGT,"%.3e",xlin);
196 for( realnum damplog=DampLogMin; damplog<DampLogMax; ++damplog)
197 {
198 realnum xval[1];
199 xval[0] = xlin;
200 realnum damp = (realnum)pow(10. , damplog);
201 realnum yval[1];
202 VoigtH(damp,xval,yval,1);
203 fprintf(ioVOIGT , "\t%.3e",yval[0]);
204 }
205 fprintf(ioVOIGT , "\n");
206 }
207 fclose(ioVOIGT);
209 }
210
211 else
212 {
213 fprintf( ioQQQ,
214 " Unrecognized key; keys are CASE, CDLIne, E1 , ESCApe, FFMTread, GAUNt, "
215 "HYAS, POINt, PUMP, STAR, and VOIGt. Sorry.\n" );
217 }
218 return;
219}
220
221/*DrvEscP user queries escape probability routines, which return values */
222STATIC void DrvEscP( void )
223{
224 char chCard[INPUT_LINE_LENGTH];
225 bool lgEOL;
226 long i;
227 double tau;
228
229 DEBUG_ENTRY( "DrvEscP()" );
230
231 /* this routine is enterd with the command escape probability, and
232 * drives the escape probability routine to compare answers */
233 fprintf( ioQQQ, " Enter the log of the one-sided optical depth; line with no number to stop.\n" );
234
235 lgEOL = false;
236 while( !lgEOL )
237 {
238 if( read_whole_line( chCard , (int)sizeof(chCard) , ioStdin ) == NULL )
239 {
240 break;
241 }
242
243 i = 1;
244 tau = FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
245 if( lgEOL )
246 {
247 break;
248 }
249
250 tau = pow(10.,tau);
251 fprintf( ioQQQ, "tau was %e\n", tau );
252 fprintf( ioQQQ, " ESCINC=%11.3e\n", esc_PRD_1side(tau,1e-4) );
253 fprintf( ioQQQ, " ESCCOM=%11.3e\n", esc_CRDwing_1side(tau,1e-4 ) );
254 fprintf( ioQQQ, " ESCA0K2=%11.3e\n", esca0k2(tau) );
255
256 }
257 return;
258}
259
260/*DrvCaseBHS allow user to query hydrogen A's, asks for up, low level, gives A, drive hyas */
262{
263 char chCard[INPUT_LINE_LENGTH];
264 bool lgEOL,
265 lgHit;
266 long int i,
267 n1,
268 nelem ,
269 n2;
270 double Temperature,
271 Density;
272
273 DEBUG_ENTRY( "DrvCaseBHS()" );
274
275 /* this routine is entered with the command DRIVE CASEB, and
276 * interpolates on the Hummer & Storey case b data set */
277
278 /* read in some external data files, but only if this is first call */
279 fprintf(ioQQQ," I will get needed H data files. This will take a second.\n");
281
282 {
283 /* following should be set true to print input lines */
284 /*@-redef@*/
285 enum {DEBUG_LOC=false};
286 /*@+redef@*/
287 if( DEBUG_LOC )
288 {
289 double xLyman , alpha;
290 long int ipHi;
291 nelem = 2;
292 Temperature = 2e4;
293 Density = 1e2;
294 for( ipHi=3; ipHi<25; ++ipHi )
295 {
296 double photons = (1./POW2(ipHi-1.)-1./POW2((double)ipHi) ) /(1.-1./ipHi/ipHi );
297 xLyman = atmdat_HS_caseB(1,ipHi, nelem,Temperature , Density , 'A' );
298 alpha = atmdat_HS_caseB(ipHi-1,ipHi, nelem,Temperature , Density , 'A' );
299 fprintf(ioQQQ,"%li\t%.3e\t%.3e\n", ipHi, xLyman/alpha*photons, photons );
300 }
302 }
303 }
304
305 /* first get the charge, only H and He at present */
306 lgHit = false;
307 nelem = 0;
308 while( !lgHit )
309 {
310 fprintf( ioQQQ, " Enter atomic number of species, either 1(H) or 2(He).\n" );
311 if( read_whole_line( chCard , (int)sizeof(chCard) , ioStdin ) == NULL )
312 {
313 fprintf( ioQQQ, " error getting species \n" );
315 }
316
317 i = 1;
318 nelem = (long int)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
319 if( lgEOL || nelem< 1 || nelem > 2 )
320 {
321 fprintf( ioQQQ, " must be either 1 or 2!\n" );
322 }
323 else
324 {
325 lgHit = true;
326 }
327 }
328
329 fprintf(ioQQQ," In the following temperatures <10 are log, >=10 linear.\n");
330 fprintf(ioQQQ," The density is always a log.\n");
331 fprintf(ioQQQ," The order of the quantum numbers do not matter.\n");
332 fprintf(ioQQQ," The smallest must not be smaller than 2,\n");
333 fprintf(ioQQQ," and the largest must not be larger than 25.\n");
334 fprintf(ioQQQ," Units of emissivity are erg cm^3 s^-1\n\n");
335 fprintf(ioQQQ," The limits of the HS tables are 2 <= n <= 25.\n");
336
337 lgHit = true;
338 /* this is always true */
339 while( lgHit )
340 {
341 fprintf( ioQQQ, " Enter 4 numbers, temperature, density, 2 quantum numbers, null line stop.\n" );
342 if( read_whole_line( chCard , (int)sizeof(chCard) , ioStdin ) == NULL )
343 {
344 fprintf( ioQQQ, " Thanks for interpolating on the Hummer & Storey data set!\n" );
346 }
347
348 i = 1;
349 Temperature = FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
350 if( lgEOL )
351 {
352 fprintf( ioQQQ, " error getting temperature!\n" );
353 break;
354 }
355
356 /* log if less than 10 */
357 if( Temperature < 10. )
358 {
359 Temperature = pow(10., Temperature );
360 }
361 fprintf(ioQQQ," Temperature is %g\n", Temperature );
362
363 Density = FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
364 if( lgEOL )
365 {
366 fprintf( ioQQQ, " error getting density!\n" );
367 break;
368 }
369 Density = pow(10., Density );
370 fprintf(ioQQQ," Density is %g\n", Density );
371
372 /* these quantum numbers can be in any order */
373 n1 = (long)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
374 if( lgEOL )
375 {
376 fprintf( ioQQQ, " error getting quantum number!\n" );
377 break;
378 }
379
380 n2 = (long)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
381 if( lgEOL )
382 {
383 fprintf( ioQQQ, " error getting quantum number!\n" );
384 break;
385 }
386
387 if( MAX2( n1 , n2 ) > 25 )
388 {
389 fprintf( ioQQQ," The limits of the HS tables are 2 <= n <= 25. Sorry.\n");
390 break;
391 }
392
393 fprintf( ioQQQ,
394 " 4pJ(%ld,%ld)/n_e n_p=%11.3e\n",
395 n1, n2,
396 atmdat_HS_caseB(n1,n2, nelem,Temperature , Density , 'B' ) );
397
398 /* this is check that we were in bounds */
399#if 0
400 {
401 long j;
402 double tempTable[33] = {
403 11870.,12490.,12820.,
404 11060.,17740.,12560.,
405 16390.,16700.,11360.,
406 10240.,20740.,12030.,
407 14450.,19510.,12550.,
408 16470.,16560.,12220.,
409 15820.,12960.,10190.,
410 12960.,14060.,12560.,
411 11030.,10770.,13360.,
412 10780.,11410.,11690.,
413 12500.,13190.,21120. };
414 double edenTable[33] = {
415 10.,270.,80.,10.,70.,
416 110.,200.,10.,40.,90.,
417 340.,80.,60.,340.,30.,
418 120.,10.,50.,450.,30.,
419 180.,20.,170.,60.,20.,
420 40.,30.,20.,100.,130.,
421 10.,10.,110. };
422
423
424 for( j=0; j<33; j++ )
425 {
426 double halpha, hbeta, hgamma;
427
428 halpha = atmdat_HS_caseB(2,3, 1,tempTable[j] , edenTable[j] , 'B' );
429 hbeta = atmdat_HS_caseB(2,4, 1,tempTable[j] , edenTable[j] , 'B' );
430 hgamma = atmdat_HS_caseB(2,5, 1,tempTable[j] , edenTable[j] , 'B' );
431
432 fprintf( ioQQQ, "%e\t%e\t%e\t%e\n",
433 tempTable[j],
434 edenTable[j],
435 halpha/hbeta,
436 hgamma/hbeta );
437 }
438 }
439#endif
440 }
441
442 fprintf( ioQQQ, " Thanks for interpolating on the Hummer & Storey data set!\n" );
444
445}
446
447/*DrvHyas allow user to query hydrogen A's, asks for up, low level, gives A, drive hyas */
448STATIC void DrvHyas(void)
449{
450 char chCard[INPUT_LINE_LENGTH];
451 bool lgEOL;
452 long int i, nHi, lHi, nLo, lLo;
453
454 DEBUG_ENTRY( "DrvHyas()" );
455
456 /* this routine is entered with the command DRIVE HYAS, and
457 * drives Jason's hydrogen einstein A routines */
458
459 nHi = 1;
460 /* nHi never lt 1 */
461 while( nHi != 0 )
462 {
463 fprintf( ioQQQ, " Enter four quantum numbers (n, l, n', l'), null line to stop.\n" );
464 if( read_whole_line( chCard , (int)sizeof(chCard) , ioStdin ) == NULL )
465 {
466 fprintf( ioQQQ, " error getting drvhyas \n" );
468 }
469
470 i = 1;
471 nHi = (long int)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
472 if( lgEOL )
473 break;
474
475 lHi = (long int)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
476 if( lgEOL )
477 {
478 fprintf( ioQQQ, " must be four numbers!\n" );
479 break;
480 }
481
482 if( lHi >= nHi )
483 {
484 fprintf( ioQQQ, " l must be less than n!\n" );
485 break;
486 }
487
488 nLo = (long int)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
489 if( lgEOL )
490 {
491 fprintf( ioQQQ, " must be four numbers!\n" );
492 break;
493 }
494
495 lLo = (long int)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
496 if( lgEOL )
497 {
498 fprintf( ioQQQ, " must be four numbers!\n" );
499 break;
500 }
501
502 if( lLo >= nLo )
503 {
504 fprintf( ioQQQ, " l must be less than n!\n" );
505 break;
506 }
507
508 if( nLo > nHi )
509 {
510 long nTemp, lTemp;
511
512 /* swap hi and lo */
513 nTemp = nLo;
514 lTemp = lLo;
515 nLo = nHi;
516 lLo = lHi;
517 nHi = nTemp;
518 lHi = lTemp;
519 }
520
521 fprintf( ioQQQ, " A(%3ld,%3ld->%3ld,%3ld)=%11.3e\n",
522 nHi, lHi, nLo, lLo,
523 H_Einstein_A( nHi, lHi, nLo, lLo, 1 ) );
524
525 }
526 fprintf( ioQQQ, " Driver exits, enter next line.\n" );
527
528 return;
529}
530
531/*dgaunt drive gaunt factor routines by letting user query values */
532STATIC void dgaunt(void)
533{
534 char chCard[INPUT_LINE_LENGTH];
535 bool lgEOL;
536 int inputflag;
537 long int i,
538 ierror;
539 realnum enerlin[1];
540 double SaveTemp;
541 double z,mygaunt=0.;
542 double loggamma2, logu;
543
544 DEBUG_ENTRY( "dgaunt()" );
545
546 SaveTemp = phycon.te;
547
548 /* this routine is entered with the command DRIVE GAUNT, and
549 * drives the gaunt factor routine to check range
550 * */
551 fprintf( ioQQQ, " Enter 0 to input temp, energy, and net charge, or 1 for u and gamma**2.\n" );
552 if( read_whole_line( chCard , (int)sizeof(chCard) , ioStdin ) == NULL )
553 {
554 fprintf( ioQQQ, " dgaunt error getting magic number\n" );
556 }
557 i = 1;
558 inputflag = (int)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
559
560 if( inputflag == 0 )
561 {
562 fprintf( ioQQQ, " Enter the temperature (log if <=10), energy (Ryd), and net charge. Null line to stop.\n" );
563 /* >>chng 96 july 07, got rid of statement labels replacing with do while
564 * */
565 ierror = 0;
566 while( ierror == 0 )
567 {
568 if( read_whole_line( chCard , (int)sizeof(chCard) , ioStdin ) == NULL )
569 {
570 fprintf( ioQQQ, " dgaunt error getting magic number\n" );
572 }
573 i = 1;
574 phycon.alogte = FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
575 /* the line may be trash but ierror will pick it up */
576 if( lgEOL )
577 {
578 fprintf( ioQQQ, " Gaunt driver exits, enter next line.\n" );
579 break;
580 }
581 /* numbers less than or equal to 10 are the log of the temperature */
582 double TeNew;
583 if( phycon.alogte > 10. )
584 {
585 TeNew = phycon.alogte;
586 }
587 else
588 {
589 TeNew = pow(10.,phycon.alogte);
590 }
591 TempChange(TeNew , false);
592
593 enerlin[0] = (realnum)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
594 if( lgEOL || enerlin[0] == 0. )
595 {
596 fprintf( ioQQQ, " Sorry, but there should be two more numbers, energy and charge.\n" );
597 }
598
599 z = (double)FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
600 if( lgEOL || z == 0. )
601 {
602 fprintf( ioQQQ, " Sorry, but there should be a third number, charge.\n" );
603 }
604
605 /* This is non-thermally averaged gaunt factors. */
606 mygaunt = cont_gaunt_calc( (double)phycon.te, z, enerlin[0] );
607
608 fprintf( ioQQQ, " Using my routine, Gff= \t" );
609 fprintf( ioQQQ, "%11.3e\n", mygaunt );
610
611 }
612 }
613 else
614 {
615 /* this routine is entered with the command DRIVE GAUNT, and
616 * drives the gaunt factor routine to check range
617 * */
618 fprintf( ioQQQ, " Enter log u and log gamma2. Null line to stop.\n" );
619 ierror = 0;
620 while( ierror == 0 )
621 {
622 if( read_whole_line( chCard , (int)sizeof(chCard) , ioStdin ) == NULL )
623 {
624 fprintf( ioQQQ, " dgaunt error getting magic number\n" );
626 }
627 i = 1;
628 logu = FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
629 /* the line may be trash but ierror will pick it up */
630 if( lgEOL )
631 {
632 fprintf( ioQQQ, " Gaunt driver exits, enter next line.\n" );
633 break;
634 }
635
636 loggamma2 = FFmtRead(chCard,&i,sizeof(chCard),&lgEOL);
637 if( lgEOL )
638 {
639 fprintf( ioQQQ, " Sorry, but there should be another numbers, log gamma2.\n" );
640 }
641
642 /* This is my attempt to calculate non-thermally averaged gaunt factors. */
643 mygaunt = cont_gaunt_calc( TE1RYD/pow(10.,loggamma2), 1., pow(10.,logu-loggamma2) );
644
645 TempChange(TE1RYD/pow(10.,loggamma2) , false);
646
647 fprintf( ioQQQ, " Using my routine, Gaunt factor is" );
648 fprintf( ioQQQ, "%11.3e\n", mygaunt );
649 }
650 }
651
652 TempChange(SaveTemp , false);
653 return;
654}
t_abund abund
Definition abund.cpp:5
void abund_starburst(Parser &p)
void atmdat_readin(void)
double atmdat_HS_caseB(long int iHi, long int iLo, long int iZ, double TempIn, double DenIn, char chCase)
FILE * ioQQQ
Definition cddefines.cpp:7
FILE * ioStdin
Definition cddefines.cpp:8
sys_float sexp(sys_float x)
Definition service.cpp:914
#define STATIC
Definition cddefines.h:97
double ee1(double x)
Definition service.cpp:312
const int LIMELM
Definition cddefines.h:258
#define POW2
Definition cddefines.h:929
const int INPUT_LINE_LENGTH
Definition cddefines.h:254
#define EXIT_SUCCESS
Definition cddefines.h:138
#define EXIT_FAILURE
Definition cddefines.h:140
double FFmtRead(const char *chCard, long int *ipnt, long int last, bool *lgEOL)
Definition service.cpp:381
#define cdEXIT(FAIL)
Definition cddefines.h:434
float realnum
Definition cddefines.h:103
#define MAX2
Definition cddefines.h:782
double e2(double t)
Definition service.cpp:299
char * read_whole_line(char *chLine, int nChar, FILE *ioIN)
Definition service.cpp:70
#define DEBUG_ENTRY(funcname)
Definition cddefines.h:684
bool nMatch(const char *chKey) const
Definition parser.h:135
void setline(const char *const card)
Definition parser.h:69
double cont_gaunt_calc(double temp, double z, double photon)
double DrvContPump(const TransitionProxy &t, realnum DopplerWidth)
Definition cont_pump.cpp:40
double H_Einstein_A(long int n, long int l, long int np, long int lp, long int iz)
STATIC void dgaunt(void)
STATIC void DrvCaseBHS(void)
STATIC void DrvEscP(void)
STATIC void DrvHyas(void)
void ParseDrive(Parser &p)
t_phycon phycon
Definition phycon.cpp:6
UNUSED const double TE1RYD
Definition physconst.h:183
double esc_PRD_1side(double tau, double a)
double esca0k2(double taume)
double esc_CRDwing_1side(double tau, double a)
TransitionProxy::iterator TauDummy
Definition taulines.cpp:60
void TempChange(double TempNew, bool lgForceUpdate)
double expn(int n, double x)
void VoigtH(realnum a, const realnum v[], realnum y[], int n)
Definition thirdparty.h:350
t_trace trace
Definition trace.cpp:5