cloudy  trunk
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
cont_gammas.cpp
Go to the documentation of this file.
1 /* This file is part of Cloudy and is copyright (C)1978-2022 by Gary J. Ferland and
2  * others. For conditions of distribution and use see copyright notice in license.txt */
3 /* GammaBn evaluate photoionization rate for single shell with induced recomb */
4 /* GammaPrt special version of gamma function to print strong contributors */
5 /* GammaK evaluate photoionization rate for single shell */
6 /* GammaPrtRate print photo rates for all shells of a ion and element */
7 /*GammaPrtShells for the element nelem and ion, print total photo rate, subshells,
8  * and call GamaPrt for important subshells */
9 #include "cddefines.h"
10 #include "gammas.h"
11 #include "thermal.h"
12 #include "secondaries.h"
13 #include "opacity.h"
14 #include "rfield.h"
15 #include "ionbal.h"
16 #include "heavy.h"
17 #include "phycon.h"
18 #include "vectorize.h"
19 
20 /*
21  * these are the routines that evaluate the photoionization rates, gammas,
22  * throughout cloudy. a considerable amount of time is spent in these routines,
23  * so they should be compiled at the highest possible efficientcy.
24  */
25 
26 /* removed these two unused routines around r3500 (late October, 2009). */
27 /* GammaBnPL evaluate photoionization rate for single shell with induced recomb */
28 /* GammaPL evaluate photoionization rate for power law photo cross section */
29 
30 
31 /*>>chng 99 apr 16, ConInterOut had not been included in the threshold point for any
32  * of these routines. added it. also moved thresholds above loop for a few */
33 
34 double GammaBn(
35  /* index for low energy */
36  long int ipLoEnr,
37  /* index for high energy */
38  long int ipHiEnr,
39  /* offset within the opacity stack */
40  long int ipOpac,
41  /* threshold (Ryd) for arbitrary photoionization */
42  double thresh,
43  /* induced rec rate */
44  double *ainduc,
45  /* rec cooling */
46  double *rcool,
47  t_phoHeat *photoHeat)
48 {
49  DEBUG_ENTRY( "GammaBn()" );
50 
51 /**********************************************************************
52  *
53  * special version of GAMFUN for arbitrary threshold, and induc rec
54  * compute ainduc, rate of induced recombinations, rcool, induc rec cool
55  *
56  **********************************************************************/
57 
58  /* special version of GAMFUN for arbitrary threshold, and induc rec
59  * compute ainduc, rate of inducted recombinations, rcool, induc rec cool */
60 
61  double bnfun_v = 0.;
62  photoHeat->HeatNet = 0.;
63  photoHeat->HeatHiEnr = 0.;
64  photoHeat->HeatLowEnr = 0.;
65  *ainduc = 0.;
66  *rcool = 0.;
67 
68  if( ipLoEnr >= rfield.nflux || ipLoEnr >= ipHiEnr )
69  {
70  return( bnfun_v );
71  }
72 
73  ASSERT( ipLoEnr >= 0 && ipHiEnr >= 0 );
74 
75  double GamHi = 0.;
76  double g = 0.;
77  double RateInducRec = 0.;
78  double RateInducRecCool = 0.;
79 
80  /* do first point without otscon, which may have diffuse cont,
81  * extra minus one after ipOpac is correct since not present in i = */
82  /* ipLoEnr is on fortran scale. test that the pointer is correct */
83  long i = ipLoEnr-1;
84  ASSERT( rfield.anumin(i) <= thresh && thresh < rfield.anumax(i) );
85  /* this is the width of the cell from the threshold upwards */
86  double widflx = rfield.anumax(i) - thresh;
87  /* fac corrects for the fact that only part of the first frequency cell can photoionize */
88  double fac = widflx/rfield.widflx(i);
89  /* >>chng 99 apr 16, add ConInterOut */
90  /* >>chng 01 jul 04, add *rfield.lgOutOnly logic */
91  double phisig = fac*(rfield.flux[0][i] + rfield.otslin[i] +
93  opac.OpacStack[i-ipLoEnr+ipOpac];
94  double anubar = (thresh+rfield.anumax(i))/2.;
95 
96  if (i < secondaries.ipSecIon-1)
97  {
98  g += phisig;
99  /* use average photon energy above threshold in this frequency cell */
100  photoHeat->HeatNet += phisig*anubar;
101  }
102  else
103  {
104  GamHi += phisig;
105  photoHeat->HeatHiEnr += phisig*anubar;
106  }
107 
108  /* integral part of induced rec rate */
109  /* multiply physig with the Boltzmann factor averaged over the ionizing part of the cell */
110  double prod = -phisig*phycon.te_ryd*exp(-thresh/phycon.te_ryd)*expm1(-widflx/phycon.te_ryd)/widflx;
111  RateInducRec += prod;
112  /* induced rec cooling */
113  RateInducRecCool += prod*(anubar - thresh);
114 
115  long iup = MIN2(ipHiEnr,rfield.nflux);
116  iup = MIN2(iup,rfield.nPositive );
117  long limit = MIN2(iup,secondaries.ipSecIon-1);
118 
119  /* these is no -1 after the ipLoEnr in the following, due to c off by one counting */
120  for( i=ipLoEnr; i < limit; i++ )
121  {
122  /* SummedCon defined in RT_OTS_Update,
123  * includes flux, otscon, otslin, ConInterOut, outlin */
124  phisig = rfield.SummedCon[i]*opac.OpacStack[i-ipLoEnr+ipOpac];
125 
126  g += phisig;
127  photoHeat->HeatNet += phisig*rfield.anu(i);
128 
129  /* phi-sigma times exp(-hnu/kT) */
130  prod = phisig*rfield.ContBoltzAvg[i];
131  /* induced recombination rate */
132  RateInducRec += prod;
133  /* induced rec cooling */
134  RateInducRecCool += prod*(rfield.anu(i) - thresh);
135  }
136 
137  /* now do part where secondary ionization is possible */
138  /* make sure we don't count twice when ipSecIon = ipLoEnr */
139  long ilo = i; // First zone not counted above
140  for( i=ilo; i < iup; i++ )
141  {
142  phisig = rfield.SummedCon[i]*opac.OpacStack[i-ipLoEnr+ipOpac];
143 
144  GamHi += phisig;
145  photoHeat->HeatHiEnr += phisig*rfield.anu(i);
146 
147  /* integral part of induced rec rate */
148  prod = phisig*rfield.ContBoltzAvg[i];
149  RateInducRec += prod;
150  /* induced rec cooling */
151  RateInducRecCool += prod*(rfield.anu(i) - thresh);
152  }
153 
154  /* heating in Rydbergs, no secondary ionization */
155  /* >>chng 02 mar 31, added MAX2 due to roundoff error
156  * creating slightly negative number, caught downstream as insanity */
157  /* >>chng 16 feb 03, add ASSERT to prevent covering up sins... */
158  ASSERT( photoHeat->HeatNet > g*thresh || fp_equal(photoHeat->HeatNet,g*thresh) );
159  photoHeat->HeatNet = MAX2(0.,photoHeat->HeatNet - g*thresh);
160 
161  /* we will save this heat - the part that does not secondary ionize */
162  photoHeat->HeatLowEnr = photoHeat->HeatNet;
163 
164  /* this is total photo rate, low and high energy parts */
165  bnfun_v = g + GamHi;
166 
167  /* heating in Rydbergs, uncorrected for secondary ionization */
168  photoHeat->HeatHiEnr -= GamHi*thresh;
169 
170  /* add corrected high energy heat to total */
171  photoHeat->HeatNet += photoHeat->HeatHiEnr*secondaries.HeatEfficPrimary;
172 
173  /* final product is heating in erg */
174  photoHeat->HeatNet *= EN1RYD;
175  photoHeat->HeatHiEnr *= EN1RYD;
176  photoHeat->HeatLowEnr *= EN1RYD;
177 
178  /* there is an option to turn off induced processes, values are zeroed above */
179  if( rfield.lgInducProcess )
180  {
181  *rcool = RateInducRecCool*EN1RYD;
182  *ainduc = RateInducRec;
183  }
184 
185  ASSERT( bnfun_v >= 0. );
186  ASSERT( photoHeat->HeatNet>= 0. );
187  return bnfun_v;
188 }
189 
190 /*GammaPrtShells for the element nelem and ion, print total photo rate, subshells,
191  * and call GamaPrt for important subshells */
192 void GammaPrtShells( long nelem , long ion )
193 {
194  double sum;
195  long int ns;
196 
197  DEBUG_ENTRY( "GammaPrtShells()" );
198 
199  fprintf(ioQQQ," GammaPrtShells nz\t%.2f \t%.2li %.2li ",
200  fnzone ,
201  nelem,
202  ion
203  );
204  sum = 0;
205  for( ns=0; ns < Heavy.nsShells[nelem][ion]; ++ns )
206  {
207  sum += ionbal.PhotoRate_Shell[nelem][ion][ns][0];
208  }
209  fprintf(ioQQQ,"\ttot\t%.2e", sum);
210  /* loop over all shells for this ion */
211  for( ns=0; ns < Heavy.nsShells[nelem][ion]; ++ns )
212  {
213  fprintf(ioQQQ,"\t%.2e", ionbal.PhotoRate_Shell[nelem][ion][ns][0] );
214 # if 0
215  /* always reevaluate the outer shell, and all shells if lgRedoStatic is set */
216  if( (ns==(Heavy.nsShells[nelem][ion]-1) || opac.lgRedoStatic) )
217  {
218  /* option to redo the rates only on occasion */
219  iplow = opac.ipElement[nelem][ion][ns][0];
220  iphi = opac.ipElement[nelem][ion][ns][1];
221  ipop = opac.ipElement[nelem][ion][ns][2];
222 
223  /* compute the photoionization rate, ionbal.lgPhotoIoniz_On is 1, set 0
224  * with "no photoionization" command */
225  ionbal.PhotoRate_Shell[nelem][ion][ns][0] =
226  GammaK(iplow,iphi,
227  ipop,t_yield::Inst().elec_eject_frac(nelem,ion,ns,0),
228  &phoHeat)*ionbal.lgPhotoIoniz_On;
229  }
230 # endif
231  }
232  fprintf(ioQQQ,"\n");
233  return;
234 }
235 
236 /**********************************************************************
237  *
238  * GammaPrt special version of gamma function to print strong contributors
239  * this only prints info - does not update heating rates properly since
240  * this is only a diagnostic
241  *
242  **********************************************************************/
243 
244 void GammaPrt(
245  /* first three par are identical to GammaK */
246  long int ipLoEnr,
247  long int ipHiEnr,
248  long int ipOpac,
249  /* io unit we will write to */
250  FILE * ioFILE,
251  /* total photo rate from previous call to GammaK */
252  double total,
253  /* we will print contributors that are more than this rate */
254  double threshold)
255 {
256  long int i,
257  j,
258  k;
259  double flxcor,
260  phisig;
261 
262  DEBUG_ENTRY( "GammaPrt()" );
263 
264  /* special special version of GAMFUN to save step-by-step results */
265  /* >>chng 99 apr 02, test for lower greater than higher (when shell
266  * does not exist) added. This caused incorrect photo rates for
267  * non-existant shells */
268  if( ipLoEnr >= rfield.nflux || ipLoEnr >= ipHiEnr )
269  {
270  return;
271  }
272 
273  fprintf( ioFILE, " GammaPrt %.2f from ",fnzone);
274  fprintf( ioFILE,PrintEfmt("%9.2e",rfield.anu(ipLoEnr-1)));
275  fprintf( ioFILE, " to ");
276  fprintf( ioFILE,PrintEfmt("%9.2e",rfield.anu(ipHiEnr-1)));
277  fprintf( ioFILE, "R rates >");
278  fprintf( ioFILE,PrintEfmt("%9.2e",threshold));
279  fprintf( ioFILE, " of total=");
280  fprintf( ioFILE,PrintEfmt("%9.2e",total));
281  fprintf( ioFILE, " (frac inc, otslin, otscon, ConInterOut, outlin ConOTS_local_OTS_rate ) chL, C\n");
282 
283  if( threshold <= 0. || total <= 0. )
284  {
285  return;
286  }
287 
288  k = ipLoEnr;
289  j = MIN2(ipHiEnr,rfield.nflux);
290 
291  /* do theshold special, do not pick up otscon */
292  i = k-1;
293 
294  /* >>chng 01 jul 04, add *rfield.lgOutOnly logic */
295  phisig = (rfield.flux[0][i] + rfield.otslin[i]+ rfield.ConInterOut[i]*rfield.lgOutOnly)*
296  opac.OpacStack[i-k+ipOpac];
297  if( phisig > threshold || phisig < 0.)
298  {
299  flxcor = rfield.flux[0][i] + rfield.otslin[i] + rfield.ConInterOut[i]*rfield.lgOutOnly;
300 
301  /* this really is array index on C scale */
302  fprintf( ioFILE, "[%5ld]" , i );
303  fprintf( ioFILE, PrintEfmt("%9.2e",rfield.anu(i)));
304  fprintf( ioFILE, PrintEfmt("%9.2e",phisig/total));
305  fprintf( ioFILE, "%5.2f%5.2f%5.2f%5.2f%5.2f%5.2f %4.4s %4.4s %.2e \n",
306  rfield.flux[0][i]/SDIV(flxcor),
307  rfield.otslin[i]/SDIV(flxcor),
308  /* otscon will appear below, but is not counted here, so do not print it (deceiving) */
309  0./SDIV(flxcor),
310  rfield.ConInterOut[i]*rfield.lgOutOnly/SDIV(flxcor),
311  (rfield.outlin[0][i]+rfield.outlin_noplot[i])/SDIV(flxcor),
312  rfield.ConOTS_local_OTS_rate[i]/SDIV(flxcor),
313  rfield.chLineLabel[i].c_str(),
314  rfield.chContLabel[i].c_str(),
315  opac.OpacStack[i-k+ipOpac]);
316  }
317 
318  for( i=k; i < j; i++ )
319  {
320  phisig = rfield.SummedCon[i]*opac.OpacStack[i-k+ipOpac];
321  if( phisig > threshold || phisig < 0.)
322  {
323  /* >>chng 01 jul 04, add *rfield.lgOutOnly logic */
324  flxcor = rfield.flux[0][i] + rfield.otslin[i] + rfield.otscon[i] +
326 
327  fprintf( ioFILE, "%5ld", i );
328  fprintf(ioFILE,PrintEfmt("%9.2e",rfield.anu(i)));
329  fprintf(ioFILE,PrintEfmt("%9.2e",phisig/total));
330  fprintf( ioFILE, "%5.2f%5.2f%5.2f%5.2f%5.2f%5.2f %4.4s %4.4s %.2e \n",
331  rfield.flux[0][i]/SDIV(flxcor),
332  rfield.otslin[i]/SDIV(flxcor),
333  rfield.otscon[i]/SDIV(flxcor),
334  rfield.ConInterOut[i]*rfield.lgOutOnly/SDIV(flxcor),
335  (rfield.outlin[0][i] + rfield.outlin_noplot[i])/SDIV(flxcor),
336  rfield.ConOTS_local_OTS_rate[i]/SDIV(flxcor),
337  rfield.chLineLabel[i].c_str(),
338  rfield.chContLabel[i].c_str(),
339  opac.OpacStack[i-k+ipOpac]);
340  }
341  }
342  return;
343 }
344 
345 /*GammaK evaluate photoionization rate for single shell */
346 
347 /* this routine is a major pace setter for the code
348  * carefully check anything put into the following do loop */
349 
350 double GammaK(
351  /* ipLoEnr and ipHiEnr are pointers within frequency array to upper and
352  * lower bounds of evaluation */
353  long int ipLoEnr,
354  long int ipHiEnr,
355  /* ipOpac is offset to map onto OPSV*/
356  long int ipOpac,
357  /* yield1 is fraction of ionizations that emit 1 electron only,
358  * only used for energy balance */
359  double yield1,
360  t_phoHeat *photoHeat)
361 {
362  DEBUG_ENTRY( "GammaK()" );
363 
364  /* evaluate photoioinzation rate and photoelectric heating
365  * returns photoionization rate as GAMK, heating is H */
366 
367  /* >>chng 99 apr 02, test for lower greater than higher (when shell
368  * does not exist) added. This caused incorrect photo rates for
369  * non-existant shells */
370  if( ipLoEnr >= rfield.nflux || ipLoEnr >= ipHiEnr )
371  {
372  double gamk_v = 0.;
373  photoHeat->HeatNet = 0.;
374  photoHeat->HeatHiEnr = 0.;
375  photoHeat->HeatLowEnr = 0.;
376  return gamk_v;
377  }
378 
379  long iup = MIN2(ipHiEnr,rfield.nPositive);
380 
381  /* anu(i) is threshold, assume each auger electron has this energy
382  * less threshold energy, IP lost in initial photoionizaiton
383  * yield1 is the fraction of photos that emit 1 electron */
384  double eauger = rfield.anu(ipLoEnr-1)*yield1;
385 
386  /* low energies where secondary ionization cannot occur
387  * will do threshold point, ipLoEnr, later */
388  double gamk_v = 0.;
389  photoHeat->HeatNet = 0.;
390 
391  /* set up total offset for pointer addition not in loop */
392  long ipOffset = ipOpac - ipLoEnr;
393 
394  /* >>>chng 99 apr 16, this had followed the loop below, moved here to
395  * be like rest of gamma functions */
396  /* first do the threshold point
397  * do not include otscon, which may contain diffuse continuum */
398  /* >>chng 01 jul 04, add *rfield.lgOutOnly logic */
399  double phisig = (rfield.flux[0][ipLoEnr-1] + rfield.otslin[ipLoEnr-1]+
400  rfield.ConInterOut[ipLoEnr-1]*rfield.lgOutOnly) * opac.OpacStack[ipOpac-1];
401  gamk_v += phisig;
402  photoHeat->HeatNet += phisig*rfield.anu(ipLoEnr-1);
403 
404  /* this loop only executed for energies than cannot sec ioniz */
405  long limit = MIN2(iup,secondaries.ipSecIon-1);
406  double help;
407  photoHeat->HeatNet +=
408  reduce_abc_ab( rfield.SummedCon, &opac.OpacStack[ipOffset], rfield.anuptr(), ipLoEnr, limit, &help );
409  gamk_v += help;
410 
411  /* correct heating for work function */
412  /* >>chng 02 apr 10, from first to sec, due to neg heat in blister.in */
413  /* *photoHeat->HeatNet += -gamk_v*eauger;*/
414  ASSERT( photoHeat->HeatNet >= 0. );
415  photoHeat->HeatNet = MAX2(0.,photoHeat->HeatNet - gamk_v*eauger);
416 
417  /* this is the total low-energy heating, in ryd, that cannot secondary ionize */
418  photoHeat->HeatLowEnr = photoHeat->HeatNet;
419 
420  /* now do part where secondary ionization possible */
421  /* make sure we don't count twice when ipSecIon = ipLoEnr */
422  long ilo = MAX2(ipLoEnr,secondaries.ipSecIon-1);
423  double GamHi;
424  photoHeat->HeatHiEnr =
425  reduce_abc_ab( rfield.SummedCon, &opac.OpacStack[ipOffset], rfield.anuptr(), ilo, iup, &GamHi );
426 
427  /* add on the high energy part */
428  gamk_v += GamHi;
429  /* correct for work function */
430  photoHeat->HeatHiEnr -= GamHi*eauger;
431 
432  /* net heating include high energy heat, with correction for
433  * secondary ionization */
434  photoHeat->HeatNet += photoHeat->HeatHiEnr*secondaries.HeatEfficPrimary;
435 
436  /* final product is heating in erg */
437  photoHeat->HeatNet *= EN1RYD;
438  photoHeat->HeatLowEnr *= EN1RYD;
439  photoHeat->HeatHiEnr *= EN1RYD;
440 
441  ASSERT( gamk_v >= 0. );
442  ASSERT( photoHeat->HeatNet>= 0. );
443  return gamk_v;
444 }
445 
446 /* GammaPrtRate will print resulting rates for ion and element */
448  /* io unit we will write to */
449  FILE * ioFILE,
450  /* stage of ionization on C scale, 0 for atom */
451  long int ion ,
452  /* 0 for H, etc */
453  long int nelem,
454  /* true - then print photo sources for each shell */
455  bool lgPRT )
456 {
457  long int nshell , ns;
458 
459  DEBUG_ENTRY( "GammaPrtRate()" );
460 
461  /* number of shells for this species */
462  nshell = Heavy.nsShells[nelem][ion];
463 
464  /* now print subshell photo rate */
465  fprintf(ioFILE , "GammaPrtRate: %li %li",ion , nelem );
466  for( ns=nshell-1; ns>=0; --ns )
467  {
468  fprintf(ioFILE , " %.2e" , ionbal.PhotoRate_Shell[nelem][ion][ns][0]);
469 
470  /* option to print individual contributors to each shell */
471  if( lgPRT )
472  {
473  fprintf(ioFILE , "\n");
474  GammaPrt(
475  /* first three par are identical to GammaK */
476  opac.ipElement[nelem][ion][ns][0],
477  opac.ipElement[nelem][ion][ns][1],
478  opac.ipElement[nelem][ion][ns][2],
479  /* io unit we will write to */
480  ioFILE,
481  /* total photo rate from previous call to GammaK */
482  ionbal.PhotoRate_Shell[nelem][ion][ns][0],
483  /* we will print contributors that are more than this rate */
484  ionbal.PhotoRate_Shell[nelem][ion][ns][0]*0.05);
485  }
486  }
487  fprintf(ioFILE , "\n");
488  return;
489 }
double HeatHiEnr
Definition: thermal.h:208
long int ipElement[LIMELM][LIMELM][7][3]
Definition: opacity.h:223
realnum * ConOTS_local_OTS_rate
Definition: rfield.h:168
double * OpacStack
Definition: opacity.h:164
double GammaK(long int ipLoEnr, long int ipHiEnr, long int ipOpac, double yield1, t_phoHeat *photoHeat)
double widflx(size_t i) const
Definition: mesh.h:156
t_opac opac
Definition: opacity.cpp:5
realnum ** flux
Definition: rfield.h:68
t_Heavy Heavy
Definition: heavy.cpp:5
vector< string > chContLabel
Definition: rfield.h:213
realnum * outlin_noplot
Definition: rfield.h:189
realnum HeatEfficPrimary
Definition: secondaries.h:24
#define PrintEfmt(F, V)
Definition: cddefines.h:1349
bool lgPhotoIoniz_On
Definition: ionbal.h:117
t_phycon phycon
Definition: phycon.cpp:6
double * SummedCon
Definition: rfield.h:161
void GammaPrtShells(long nelem, long ion)
vector< double, allocator_avx< double > > ContBoltzAvg
Definition: rfield.h:135
realnum ** outlin
Definition: rfield.h:189
FILE * ioQQQ
Definition: cddefines.cpp:7
#define MIN2(a, b)
Definition: cddefines.h:803
double anu(size_t i) const
Definition: mesh.h:120
static t_yield & Inst()
Definition: cddefines.h:209
long int ipSecIon
Definition: secondaries.h:55
const double * anuptr() const
Definition: mesh.h:116
realnum * otslin
Definition: rfield.h:183
bool fp_equal(sys_float x, sys_float y, int n=3)
Definition: cddefines.h:854
t_ionbal ionbal
Definition: ionbal.cpp:8
bool lgOutOnly
Definition: rfield.h:222
long int nsShells[LIMELM][LIMELM]
Definition: heavy.h:28
t_rfield rfield
Definition: rfield.cpp:9
realnum * ConInterOut
Definition: rfield.h:154
realnum * otscon
Definition: rfield.h:183
double HeatLowEnr
Definition: thermal.h:206
vector< string > chLineLabel
Definition: rfield.h:210
double reduce_abc_ab(const double *a, const double *b, const double *c, long ilo, long ihi, double *sum_ab)
double anumin(size_t i) const
Definition: mesh.h:148
double **** PhotoRate_Shell
Definition: ionbal.h:112
#define ASSERT(exp)
Definition: cddefines.h:613
#define DEBUG_ENTRY(funcname)
Definition: cddefines.h:723
double te_ryd
Definition: phycon.h:27
double GammaBn(long int ipLoEnr, long int ipHiEnr, long int ipOpac, double thresh, double *ainduc, double *rcool, t_phoHeat *photoHeat)
Definition: cont_gammas.cpp:34
bool lgRedoStatic
Definition: opacity.h:160
#define MAX2(a, b)
Definition: cddefines.h:824
bool lgInducProcess
Definition: rfield.h:233
int fprintf(const Output &stream, const char *format,...)
Definition: service.cpp:1121
sys_float SDIV(sys_float x)
Definition: cddefines.h:1002
double HeatNet
Definition: thermal.h:204
void GammaPrt(long int ipLoEnr, long int ipHiEnr, long int ipOpac, FILE *ioFILE, double total, double threshold)
double anumax(size_t i) const
Definition: mesh.h:152
t_secondaries secondaries
Definition: secondaries.cpp:5
double fnzone
Definition: cddefines.cpp:15
void GammaPrtRate(FILE *ioFILE, long int ion, long int nelem, bool lgPRT)
long int nflux
Definition: rfield.h:46
long int nPositive
Definition: rfield.h:53