cloudy  trunk
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
cont_createmesh.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 /*ContCreateMesh calls fill to set up continuum energy mesh if first call,
4  * otherwise reset to original mesh */
5 /*fill define the continuum energy grid over a specified range */
6 /*ChckFill perform sanity check confirming that the energy array has been properly filled */
7 /*rfield_opac_malloc MALLOC space for opacity arrays */
8 /*read_continuum_mesh read the continuum definition from the file continuum_mesh.ini */
9 #include "cddefines.h"
10 #include "rfield.h"
11 #include "iterations.h"
12 #include "physconst.h"
13 #include "dense.h"
14 #include "trace.h"
15 #include "opacity.h"
16 #include "ipoint.h"
17 #include "geometry.h"
18 #include "continuum.h"
19 
20 /* read the continuum definition from the file continuum_mesh.ini */
21 STATIC void read_continuum_mesh( void );
22 
23 /*fill define the continuum energy grid over a specified range */
24 STATIC void fill(double fenlo,
25  double fenhi,
26  double resolv,
27  long int *n0,
28  long int *ipnt,
29  /* this says only count, do not fill */
30  bool lgCount );
31 
32 /*rfield_opac_malloc MALLOC space for opacity arrays */
33 STATIC void rfield_opac_malloc(void);
34 
35 /*ChckFill perform sanity check confirming that the energy array has been properly filled */
36 STATIC void ChckFill(void);
37 
38 void ContCreateMesh(void)
39 {
40  long int
41  i,
42  ipnt,
43  n0;
44 
45  /* flag to say whether pointers have ever been evaluated */
46  static bool lgPntEval = false;
47 
48  DEBUG_ENTRY( "ContCreateMesh()" );
49 
50  /* lgPntEval is local static variable defined false when defined.
51  * it is set true below, so that pointers only created one time in the
52  * history of this coreload. */
53  if( lgPntEval )
54  {
55  if( trace.lgTrace )
56  {
57  fprintf( ioQQQ, " ContCreateMesh called, not evaluating.\n" );
58  }
59  /* now save current form of energy array */
60  for( i=0; i < rfield.nupper; i++ )
61  {
62  rfield.anu[i] = rfield.AnuOrg[i];
63  rfield.anu2[i] = rfield.anu[i]*rfield.anu[i];
64  }
65  return;
66  }
67  else
68  {
69  if( trace.lgTrace )
70  {
71  fprintf( ioQQQ, " ContCreateMesh called first time.\n" );
72  }
73  lgPntEval = true;
74  }
75 
76  /* set size of arrays that continuum iteration information */
77 
78  /* read in the continuum mesh resolution definition */
79  /* >>chng 01 sep 29, add external file "continuum_mesh.ini" with fill parameters */
81 
82  /* fill in continuum with freq points
83  * arg are range pointer, 2 energy limits, resolution
84  * first argument is lower energy of the continuum range to be defined
85  * second argument is upper range; both are in Rydbergs
86  * third number is the relative energy resolution, dnu/nu,
87  * for that range of the continuum
88  * last two numbers are internal book keeping
89  * N0 is number of energy cells used so far
90  * IPNT is a counter for the number of fills used
91  *
92  * if this is changed, then also change warning in GetTable about using
93  * transmitted continuum - it says version number where continuum changed
94  * */
95  n0 = 1;
96  ipnt = 0;
97  /* this is number of ranges that will be introduced below*/
98  continuum.nrange = 0;
99 
100  /* ================================================================ */
101  /* NB - this block must agree exactly with the one that follows */
102  n0 = 1;
103  ipnt = 0;
104  /* this is number of ranges that will be introduced below*/
105  continuum.nrange = 0;
107 
108  fill(rfield.emm, continuum.StoredEnergy[0] , continuum.StoredResolution[0],&n0,&ipnt,true );
109  for(i=1; i<continuum.nStoredBands; ++i )
110  {
111  fill(continuum.StoredEnergy[i-1] ,
114  &n0,&ipnt,true);
115  }
116  /* ================================================================ */
117 
118  /* at this point debugger shows that anu and widflx are defined
119  * up through n0-2 - due to c offset -1 from Fortran! */
120  rfield.nupper = n0 - 1;
121  /* there must be a cell above nflux for us to pass unity through the vol integrator */
122  if( rfield.nupper >= NCELL )
123  {
124  fprintf(ioQQQ," Currently the arrays that hold interpolated tables can only hold %i points.\n",NCELL);
125  fprintf(ioQQQ," This continuum mesh really needs to have %li points.\n",rfield.nupper);
126  fprintf(ioQQQ," Please increase the value of NCELL in rfield.h and recompile.\n Sorry.");
128  }
129 
130  /*>>chng 04 oct 10, from nflux = nupper to nupper-1 since vectors must malloc to nupper, but
131  * will address [nflux] for unit continuum test */
133 
134  /* allocate space for continuum arrays within rfield.h and opacity arrays in opacity.h
135  * sets lgRfieldMalloced true */
137 
138  /* geometry.nend_max is largest number of zones needed on any iteration,
139  * will use it to malloc arrays that save source function as function of zone */
140  /* now change all limits, for all iterations, to this value */
142  for( i=1; i < iterations.iter_malloc; i++ )
143  {
145  }
146  /* nend_max+1 because search phase is zone 0, first zone at illumin face is 1 */
147  rfield.ConEmitLocal = (realnum**)MALLOC( (size_t)(geometry.nend_max+1)*sizeof(realnum *) );
148  rfield.ConSourceFcnLocal = (realnum**)MALLOC( (size_t)(geometry.nend_max+1)*sizeof(realnum *) );
149  for( i=0;i<(geometry.nend_max+1); ++i )
150  {
151  rfield.ConEmitLocal[i] = (realnum*)MALLOC( (size_t)rfield.nupper*sizeof(realnum) );
152  rfield.ConSourceFcnLocal[i] = (realnum*)MALLOC( (size_t)rfield.nupper*sizeof(realnum) );
153  }
154  for( i=0;i<(geometry.nend_max+1); ++i )
155  {
156  for( long j=0; j<rfield.nupper; ++j)
157  {
158  rfield.ConSourceFcnLocal[i][j] = 1.;
159  }
160  }
161 
162  /* ================================================================ */
163  n0 = 1;
164  ipnt = 0;
165 
166  /* this is number of ranges that will be introduced below*/
167  continuum.nrange = 0;
168 
169  /* the default array values are set in continuum_mesh.ini */
171  &n0,&ipnt,false);
172  for(i=1; i<continuum.nStoredBands; ++i )
173  {
174  fill(continuum.StoredEnergy[i-1] ,
177  &n0,&ipnt,false);
178  }
179 
180  /* ================================================================ */
181 
182  /* fill in the false highest cell used for unit verification */
186 
187  /* there must be a cell above nflux for us to pass unity through the vol integrator
188  * as a sanity check. assert that this is true so we will crash if ever changed
189  ASSERT( rfield.nupper +1 <= rfield.nupper );*/
190 
191  /* this is done here when the space is first allocated,
192  * then done on every subsequent initialization in zero.c */
194 
195  /* this is a sanity check for results produced above by fill */
196  ChckFill();
197 
198  /* now fix widflx array so that it is correct */
199  for( i=1; i<rfield.nupper-1; ++i )
200  {
201  rfield.widflx[i] = ((rfield.anu[i+1] - rfield.anu[i]) + (rfield.anu[i] -
202  rfield.anu[i-1]))/2.f;
203  }
204 
205  ipnt = 0;
206  /* now save current form of array, and define some quantities related to it */
207  for( i=0; i < rfield.nupper; i++ )
208  {
209  double alf , bet;
210 
211  rfield.AnuOrg[i] = rfield.anu[i];
212  rfield.anusqr[i] = (realnum)sqrt(rfield.AnuOrg[i]);
213  /* following are Compton exchange factors from Tarter */
214  /* this code also appears in highen, but coef needed before that routine called. */
215  alf = 1./(1. + rfield.anu[i]*(1.1792e-4 + 7.084e-10*rfield.anu[i]));
216  bet = 1. - alf*rfield.anu[i]*(1.1792e-4 + 2.*7.084e-10*rfield.anu[i])/4.;
217  rfield.csigh[i] = (realnum)(alf*rfield.anu[i]*rfield.anu[i]*3.858e-25);
218  rfield.csigc[i] = (realnum)(alf*bet*rfield.anu[i]*3.858e-25);
219  rfield.anu2[i] = rfield.anu[i]*rfield.anu[i];
220 
221  /* >>chng 05 feb 28, add transmission and mapping coef */
222  /* map these coarse continua into fine continuum grid */
224  {
225  /* 0 (false) says not defined */
226  rfield.ipnt_coarse_2_fine[i] = 0;
227  }
228  else
229  {
230  if( ipnt==0 )
231  {
232  /* this is the first one that maps onto the fine array */
233  rfield.ipnt_coarse_2_fine[i] = 0;
234  ipnt = 1;
235  }
236  else
237  {
238  /* find first fine frequency that is greater than this coarse value */
239  while (ipnt < rfield.nfine_malloc && rfield.fine_anu[ipnt]<rfield.anu[i] )
240  {
241  ++ipnt;
242  }
243  rfield.ipnt_coarse_2_fine[i] = ipnt;
244  }
245  }
246  /*fprintf(ioQQQ," coarse %li nu= %.3e points to fine %li nu=%.3e\n",
247  i, rfield.anu[i] , rfield.ipnt_coarse_2_fine[i] , rfield.fine_anu[rfield.ipnt_coarse_2_fine[i]] );*/
248  }
250  return;
251 }
252 
253 /*fill define the continuum energy grid over a specified range, called by ContCreateMesh */
255  /* lower bounds to this energy range */
256  double fenlo,
257  /* upper bounds to this continuum range */
258  double fenhi,
259  /* relative energy resolution */
260  double resolv,
261  /* starting index within frequency grid */
262  long int *n0,
263  /* which energy band this is */
264  long int *ipnt,
265  /* this says only count, do not fill */
266  bool lgCount )
267 {
268  long int i,
269  nbin;
270  realnum widtot;
271  double aaa , bbb;
272 
273  DEBUG_ENTRY( "fill()" );
274 
275  ASSERT( fenlo>0. && fenhi>0. && resolv>0. );
276 
277  /* this is the number of cells needed to fill the array with numbers at the requested resolution */
278  nbin = (long int)(log(10.)*log10(fenhi/fenlo)/resolv + 1);
279 
280  if( lgCount )
281  {
282  /* true means only count number of cells, don't do anything */
283  *n0 += nbin;
284  return;
285  }
286 
287  if( *ipnt > 0 && fabs(1.-fenlo/continuum.filbnd[*ipnt]) > 1e-4 )
288  {
289  fprintf( ioQQQ, " FILL improper bounds.\n" );
290  fprintf( ioQQQ, " ipnt=%3ld fenlo=%11.4e filbnd(ipnt)=%11.4e\n",
291  *ipnt, fenlo, continuum.filbnd[*ipnt] );
293  }
294 
295  ASSERT( *ipnt < continuum.nStoredBands );
296 
297  continuum.ifill0[*ipnt] = *n0 - 1;
298  continuum.filbnd[*ipnt] = (realnum)fenlo;
299  continuum.filbnd[*ipnt+1] = (realnum)fenhi;
300 
301  /* this is the number of cells needed to fill the array with numbers
302  nbin = (long int)(log(10.)*log10(fenhi/fenlo)/resolv + 1);*/
303  continuum.fildel[*ipnt] = (realnum)(log10(fenhi/fenlo)/nbin);
304 
305  if( continuum.fildel[*ipnt] < 0.01 )
306  {
307  continuum.filres[*ipnt] = (realnum)(log(10.)*continuum.fildel[*ipnt]);
308  }
309  else
310  {
311  continuum.filres[*ipnt] = (realnum)((pow(10.,2.*continuum.fildel[*ipnt]) - 1.)/2./
312  pow((realnum)10.f,continuum.fildel[*ipnt]));
313  }
314 
315  if( (*n0 + nbin-2) > rfield.nupper )
316  {
317  fprintf( ioQQQ, " Fill would need %ld cells to get to an energy of %.3e\n",
318  *n0 + nbin, fenhi );
319  fprintf( ioQQQ, " This is a major logical error in fill.\n");
320  ShowMe();
322  }
323 
324  widtot = 0.;
325  for( i=0; i < nbin; i++ )
326  {
327  bbb = continuum.fildel[*ipnt]*((realnum)(i) + 0.5);
328  aaa = pow( 10. , bbb );
329 
330  rfield.anu[i+continuum.ifill0[*ipnt]] = (realnum)(fenlo*aaa);
331 
332  rfield.widflx[i+continuum.ifill0[*ipnt]] = rfield.anu[i+continuum.ifill0[*ipnt]]*
333  continuum.filres[*ipnt];
334 
335  widtot += rfield.widflx[i+continuum.ifill0[*ipnt]];
336  }
337 
338  *n0 += nbin;
339  if( trace.lgTrace && (trace.lgConBug || trace.lgPtrace) )
340  {
341  fprintf( ioQQQ,
342  " FILL range%2ld from%10.3e to%10.3eR in%4ld cell; ener res=%10.3e WIDTOT=%10.3e\n",
343  *ipnt,
344  rfield.anu[continuum.ifill0[*ipnt]] - rfield.widflx[continuum.ifill0[*ipnt]]/2.,
345  rfield.anu[continuum.ifill0[*ipnt]+nbin-1] + rfield.widflx[continuum.ifill0[*ipnt]+nbin-1]/2.,
346  nbin,
347  continuum.filres[*ipnt],
348  widtot );
349 
350  fprintf( ioQQQ, " The requested range was%10.3e%10.3e The requested resolution was%10.3e\n",
351  fenlo, fenhi, resolv );
352  }
353 
354  /* nrange is number of ranges */
355  *ipnt += 1;
357  return;
358 }
359 
360 /*ChckFill perform sanity check confirming that the energy array has been properly filled */
361 STATIC void ChckFill(void)
362 {
363  bool lgFail;
364  long int i,
365  ipnt;
366  double energy;
367 
368  DEBUG_ENTRY( "ChckFill()" );
369 
370  ASSERT( rfield.anu[0] >= rfield.emm*0.99 );
371  ASSERT( rfield.anu[rfield.nupper-1] <= rfield.egamry*1.01 );
372 
373  lgFail = false;
374  for( i=0; i < continuum.nrange; i++ )
375  {
376  /* test middle of energy bound */
377  energy = (continuum.filbnd[i] + continuum.filbnd[i+1])/2.;
378  ipnt = ipoint(energy);
379  if( energy < rfield.anu[ipnt-1] - rfield.widflx[ipnt-1]*0.5 )
380  {
381  fprintf( ioQQQ, " ChckFill middle test low fail\n" );
382  lgFail = true;
383  }
384 
385  /* >>chng 02 jul 16, add second test - when "set resol 10" used,
386  * very large values of cell width, combined with fact that cells
387  * are log increasing, causes problem. */
388  else if( (energy > rfield.anu[ipnt-1] + rfield.widflx[ipnt-1]*0.5) &&
389  ( energy > rfield.anu[ipnt] - rfield.widflx[ipnt]*0.5 ) )
390  {
391  fprintf( ioQQQ, " ChckFill middle test high fail\n" );
392  lgFail = true;
393  }
394 
395  /* test near low bound */
396  energy = continuum.filbnd[i]*0.99 + continuum.filbnd[i+1]*0.01;
397  ipnt = ipoint(energy);
398  if( energy < rfield.anu[ipnt-1] - rfield.widflx[ipnt-1]*0.5 )
399  {
400  fprintf( ioQQQ, " ChckFill low test low fail\n" );
401  lgFail = true;
402  }
403 
404  else if( energy > rfield.anu[ipnt-1] + rfield.widflx[ipnt-1]* 0.5 )
405  {
406  fprintf( ioQQQ, " ChckFill low test high fail\n" );
407  lgFail = true;
408  }
409 
410  /* test near high bound */
411  energy = continuum.filbnd[i]*0.01 + continuum.filbnd[i+1]*0.99;
412  ipnt = ipoint(energy);
413 
414  if( energy < rfield.anu[ipnt-1] - rfield.widflx[ipnt-1]*0.5 )
415  {
416  fprintf( ioQQQ, " ChckFill high test low fail\n" );
417  lgFail = true;
418  }
419  /* >>chng 02 jul 16, add second test - when "set resol 10" used,
420  * very large values of cell width, combined with fact that cells
421  * are log increasing, causes problem. */
422  else if( (energy > rfield.anu[ipnt-1] + rfield.widflx[ipnt-1]*0.5) &&
423  ( energy > rfield.anu[ipnt] - rfield.widflx[ipnt]*0.5 ) )
424  {
425  fprintf( ioQQQ, " ChckFill high test high fail\n" );
426  lgFail = true;
427  }
428  }
429 
430  if( lgFail )
431  {
433  }
434  return;
435 }
436 
437 /* MALLOC arrays within rfield */
439 {
440  long i;
441 
442  DEBUG_ENTRY( "rfield_opac_malloc()" );
443 
444  /* allocate one more than we use for the unit integration,
445  * will back up at end of routine */
446  ++rfield.nupper;
447 
448  /* >>chng 03 feb 12, add fine mesh fine grid fine opacity array to keep track of line overlap */
453  /* frequency range in Rydberg needed for all resonance lines */
455  rfield.fine_ener_hi = 1500.f;
456 
457  /* set resolution of fine continuum mesh.
458  * rfield.fine_opac_velocity_width is width per cell, cm/s
459  * choose width so that most massive species (usually Fe) is well resolved
460  *
461  * rfield.fine_opac_nelem is the most massive (hence sharpest line)
462  * we will worry about. By default this is iron but can be changed
463  * with SET FINE CONTINUUM command
464  *
465  * TeLowestFineOpacity of 1e4 K is temperature were line width is
466  * evaluated. Tests were done using the stop temperature in its place
467  * Te below 1e4 K made fine opacity grid huge
468  * do not let temp get higher than 1e4 either - code run with stop temp 10 set
469  * stop temp of 1e10K and assert thrown at line 204 of cont_createpointers.c
470  * simply use 1e4 K as a characteristic temperature */
473  double TeLowestFineOpacity = 1e4;
475  (realnum)sqrt(2.*BOLTZMANN/ATOMIC_MASS_UNIT*TeLowestFineOpacity/
477  /* we want fine_opac_nresolv continuum elements across this line
478  * default is 1, changed with SET FINE CONTINUUM command */
480 
481  /* we are at first zone so velocity shift is zero */
483 
484  /* dimensionless resolution, dE/E, this is used in ipoint to get offset in find mesh */
486 
487  /* the number of cells needed */
488  rfield.nfine_malloc = (long)(log10( rfield.fine_ener_hi / rfield.fine_ener_lo ) / log10( 1. + rfield.fine_resol ) );
489  if( rfield.nfine_malloc <= 0 )
490  TotalInsanity();
492 
493  /* this is the fine opacity array to ghost the main low-resolution array */
494  rfield.fine_opac_zone = (realnum *)MALLOC(sizeof(realnum)*(unsigned)rfield.nfine_malloc );
495  memset(rfield.fine_opac_zone , 0 , (unsigned long)rfield.nfine_malloc*sizeof(realnum) );
496 
497  /* this is the fine total optical array to ghost the main low-resolution array */
498  rfield.fine_opt_depth = (realnum *)MALLOC(sizeof(realnum)*(unsigned)rfield.nfine_malloc );
499  memset(rfield.fine_opt_depth , 0 , (unsigned long)rfield.nfine_malloc*sizeof(realnum) );
500 
501  rfield.fine_anu = (realnum *)MALLOC(sizeof(realnum)*(unsigned)rfield.nfine_malloc );
502 
503  /* now fill in energy array */
504  ASSERT( rfield.fine_ener_lo > 0. && rfield.fine_resol > 0 );
505  for( i=0;i<rfield.nfine_malloc; ++i )
506  {
507  rfield.fine_anu[i] = rfield.fine_ener_lo * (realnum)pow( (1.+rfield.fine_resol), (i+1.) );
508  }
509  /* done with fine array */
510 
511  /* used to count number of lines per cell */
512  rfield.line_count = (long *)MALLOC(sizeof(long)*(unsigned)NCELL );
513  for( i=0; i<rfield.nupper; ++i)
514  {
515  rfield.line_count[i] = 0;
516  }
517  rfield.anu = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
518  rfield.AnuOrg = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
519  rfield.widflx = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
520  rfield.anulog = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
521  rfield.anusqr = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
522  rfield.anu2 = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
523  rfield.anu3 = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
524  rfield.flux_beam_time = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
525  rfield.flux_isotropic = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
526  rfield.flux_beam_const = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
527  rfield.flux_accum = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
528  rfield.ExtinguishFactor = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
529  rfield.convoc = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
530  rfield.OccNumbBremsCont = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
531  rfield.OccNumbIncidCont = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
532  rfield.OccNumbDiffCont = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
533  rfield.OccNumbContEmitOut = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
534  rfield.ConInterOut = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
535  rfield.SummedCon = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
536  rfield.SummedDif = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
537  rfield.SummedDifSave = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
538  rfield.SummedOcc = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
540  rfield.DiffuseEscape = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
541  rfield.TotDiff2Pht = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
543  rfield.otslin = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
544  rfield.otscon = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
545  rfield.outlin_noplot = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
547  rfield.flux_time_beam_save = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
548  rfield.flux_isotropic_save = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
550  rfield.DiffuseLineEmission = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
551  rfield.ipnt_coarse_2_fine = (long int*)MALLOC((size_t)(rfield.nupper*sizeof(long int)) );
552 
553  /* possibly save cumulative flux */
554  rfield.flux = (realnum**)MALLOC((size_t)(2*sizeof(realnum*)) );
555  rfield.ConEmitReflec = (realnum**)MALLOC((size_t)(2*sizeof(realnum*)) );
556  rfield.ConEmitOut = (realnum**)MALLOC((size_t)(2*sizeof(realnum*)) );
557  rfield.ConRefIncid = (realnum**)MALLOC((size_t)(2*sizeof(realnum*)) );
558  rfield.flux_total_incident = (realnum**)MALLOC((size_t)(2*sizeof(realnum*)) );
559  rfield.reflin = (realnum**)MALLOC((size_t)(2*sizeof(realnum*)) );
560  rfield.outlin = (realnum**)MALLOC((size_t)(2*sizeof(realnum*)) );
561 
562  for( i=0; i<2; ++i )
563  {
564  rfield.flux[i] = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
565  rfield.ConEmitReflec[i] = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
566  rfield.ConEmitOut[i] = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
567  rfield.ConRefIncid[i] = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
568  rfield.flux_total_incident[i] = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
569  rfield.reflin[i] = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
570  rfield.outlin[i] = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
571  }
572  // the cumulative (time integral) emission
573  memset(rfield.flux[1] , 0 , (unsigned long)rfield.nupper*sizeof(realnum) );
574  memset(rfield.ConEmitReflec[1] , 0 , (unsigned long)rfield.nupper*sizeof(realnum) );
575  memset(rfield.ConEmitOut[1] , 0 , (unsigned long)rfield.nupper*sizeof(realnum) );
576  memset(rfield.ConRefIncid[1] , 0 , (unsigned long)rfield.nupper*sizeof(realnum) );
577  memset(rfield.flux_total_incident[1] , 0 , (unsigned long)rfield.nupper*sizeof(realnum) );
578  memset(rfield.reflin[1] , 0 , (unsigned long)rfield.nupper*sizeof(realnum) );
579  memset(rfield.outlin[1] , 0 , (unsigned long)rfield.nupper*sizeof(realnum) );
580 
581  /* chng 02 may 16, by Ryan...added array for gaunt factors for ALL charges, malloc here. */
582  /* First index is EFFECTIVE CHARGE MINUS ONE! */
583  rfield.gff = (realnum**)MALLOC((size_t)((LIMELM+1)*sizeof(realnum*)) );
584  for( i = 1; i <= LIMELM; i++ )
585  {
586  rfield.gff[i] = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
587  }
588 
589  rfield.csigh = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
590  rfield.csigc = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
591 
592  rfield.comdn = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
593  rfield.comup = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
594  rfield.ContBoltz = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
595 
596  /*realnum rfield.otssav[NC_ELL][2];*/
597  rfield.otssav = (realnum**)MALLOC((size_t)(rfield.nupper*sizeof(realnum*)));
598  for( i=0; i<rfield.nupper; ++i)
599  {
600  rfield.otssav[i] = (realnum*)MALLOC(2*sizeof(realnum));
601  }
602 
603 
604  /* char rfield.chLineLabel[NLINES][5];*/
605  rfield.chLineLabel = (char**)MALLOC((size_t)(rfield.nupper*sizeof(char*)));
606  rfield.chContLabel = (char**)MALLOC((size_t)(rfield.nupper*sizeof(char*)));
607 
608  /* now allocate all the labels for each of the above lines */
609  for( i=0; i<rfield.nupper; ++i)
610  {
611  rfield.chLineLabel[i] = (char*)MALLOC(5*sizeof(char));
612  rfield.chContLabel[i] = (char*)MALLOC(5*sizeof(char));
613  }
614 
615  opac.TauAbsFace = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
616  memset( opac.TauAbsFace , 0 , rfield.nupper*sizeof(realnum) );
617 
618  opac.TauScatFace = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
619  opac.E2TauAbsFace = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
620  opac.E2TauAbsTotal = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
621  opac.TauAbsTotal = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
622  opac.E2TauAbsOut = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
623  opac.ExpmTau = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
624  opac.tmn = (realnum*)MALLOC((size_t)(rfield.nupper*sizeof(realnum)) );
625 
626  opac.opacity_abs = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
627  opac.opacity_abs_savzon1 = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
628  opac.OldOpacSave = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
629  opac.opacity_sct = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
630  opac.albedo = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
631  opac.opacity_sct_savzon1 = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
632  opac.OpacStatic = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
633  opac.FreeFreeOpacity = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
634  opac.ExpZone = (double*)MALLOC((size_t)(rfield.nupper*sizeof(double)) );
635 
636  opac.TauAbsGeo = (realnum**)MALLOC((size_t)(2*sizeof(realnum *)) );
637  opac.TauScatGeo = (realnum**)MALLOC((size_t)(2*sizeof(realnum *)) );
638  opac.TauTotalGeo = (realnum**)MALLOC((size_t)(2*sizeof(realnum *)) );
639 
640  for( i=0; i<2; ++i)
641  {
642  opac.TauAbsGeo[i] = (realnum*)MALLOC(rfield.nupper*sizeof(realnum));
645  }
646 
647  /* fix allocate trick for one more than we use for the unit integration */
648  --rfield.nupper;
649 
650  /* say that space exists */
651  lgRfieldMalloced = true;
652  return;
653 }
654 
655 
656 /* read the continuum definition from the file continuum_mesh.ini */
658 {
659  FILE *ioDATA;
660  char chLine[INPUT_LINE_LENGTH];
661  long i;
662  bool lgEOL;
663  long i1 , i2 , i3;
664 
665  DEBUG_ENTRY( "read_continuum_mesh()" );
666 
667  if( trace.lgTrace )
668  fprintf( ioQQQ," read_continuum_mesh opening continuum_mesh.ini:");
669 
670  ioDATA = open_data( "continuum_mesh.ini", "r" );
671 
672  /* first line is a version number and does not count */
673  if( read_whole_line( chLine , (int)sizeof(chLine) , ioDATA ) == NULL )
674  {
675  fprintf( ioQQQ, " read_continuum_mesh could not read first line of continuum_mesh.ini.\n");
677  }
678  /* count how many lines are in the file, ignoring all lines
679  * starting with '#' */
681  while( read_whole_line( chLine , (int)sizeof(chLine) , ioDATA ) != NULL )
682  {
683  /* we want to count the lines that do not start with #
684  * since these contain data */
685  if( chLine[0] != '#')
687  }
688 
689  /* we now have number of lines containing pairs of bounds,
690  * allocate space for the arrays we will need */
691  continuum.filbnd =
692  ((realnum *)MALLOC( (size_t)(continuum.nStoredBands+1)*sizeof(realnum )));
693  continuum.fildel =
694  ((realnum *)MALLOC( (size_t)(continuum.nStoredBands+1)*sizeof(realnum )));
695  continuum.filres =
696  ((realnum *)MALLOC( (size_t)(continuum.nStoredBands+1)*sizeof(realnum )));
697  continuum.ifill0 =
698  ((long *)MALLOC( (size_t)(continuum.nStoredBands+1)*sizeof(long )));
700  ((double *)MALLOC( (size_t)(continuum.nStoredBands+1)*sizeof(double )));
702  ((double *)MALLOC( (size_t)(continuum.nStoredBands+1)*sizeof(double )));
703 
704  /* now rewind the file so we can read it a second time*/
705  if( fseek( ioDATA , 0 , SEEK_SET ) != 0 )
706  {
707  fprintf( ioQQQ, " read_continuum_mesh could not rewind continuum_mesh.ini.\n");
709  }
710 
711  /* check that magic number is ok */
712  if( read_whole_line( chLine , (int)sizeof(chLine) , ioDATA ) == NULL )
713  {
714  fprintf( ioQQQ, " read_continuum_mesh could not read first line of continuum_mesh.ini.\n");
716  }
717 
718  i = 1;
719  /* continuum mesh magic number */
720  i1 = (long)FFmtRead(chLine,&i,sizeof(chLine),&lgEOL);
721  i2 = (long)FFmtRead(chLine,&i,sizeof(chLine),&lgEOL);
722  i3 = (long)FFmtRead(chLine,&i,sizeof(chLine),&lgEOL);
723 
724  bool lgResPower;
725 
726  /* the following is the set of numbers that appear at the start of continuum_mesh.ini */
727  if( i1 == 1 && i2 == 9 && i3 == 29 )
728  // old version of the file (c08 and older), this has pairs: upper limit freq range, resolution
729  // this format is still supported to accomodate users with existing continuum_mesh.ini files.
730  lgResPower = false;
731  else if( i1 == 10 && i2 == 8 && i3 == 8 )
732  // new version of the file (c10 and newer), this has pairs: upper limit freq range, resolving power
733  // resolving power = 1./resolution
734  lgResPower = true;
735  else
736  {
737  fprintf( ioQQQ,
738  " read_continuum_mesh: the version of continuum_mesh.ini is not supported.\n" );
739  fprintf( ioQQQ,
740  " I found version number %li %li %li.\n" ,
741  i1 , i2 , i3 );
742  fprintf( ioQQQ, "Here is the line image:\n==%s==\n", chLine );
744  }
745 
746  /* this starts at 1 not 0 since zero is reserved for the
747  * dummy line */
749  while( read_whole_line( chLine , (int)sizeof(chLine) , ioDATA ) != NULL )
750  {
751  /* only look at lines without '#' in first col */
752  if( chLine[0] != '#')
753  {
754  i = 1;
755  continuum.StoredEnergy[continuum.nStoredBands] = FFmtRead(chLine,&i,sizeof(chLine),&lgEOL);
756  continuum.StoredResolution[continuum.nStoredBands] = FFmtRead(chLine,&i,sizeof(chLine),&lgEOL);
757 
758  // continuum energy could be 0 to indicate low or high energy bounds of code
759  // but none can be negative
762  {
763  fprintf(ioQQQ, "DISASTER PROBLEM continuum_mesh.ini has a non-positive number.\n");
765  }
766 
767  // convert resolving power (entered quantity) into resolution
768  if( lgResPower )
771 
772  /* this is option to rescale resolution with set resolution command */
774 
776  }
777  }
778 
779  fclose( ioDATA );
780 
781  /* now verify continuum grid is ok - first are all values but the last positive? */
782  for( i=1; i<continuum.nStoredBands-1; ++i )
783  {
785  {
786  fprintf( ioQQQ,
787  " read_continuum_mesh: The continuum definition array energies must be in increasing order.\n" );
789  }
790  }
792  {
793  fprintf( ioQQQ,
794  " read_continuum_mesh: The last continuum array energies must be zero.\n" );
796  }
797  return;
798 }
799 
800 /*rfield_opac_zero zero out rfield arrays between certain limits */
802  /* index for first element in arrays to be set to zero */
803  long lo ,
804  /* array index for highest element to be set */
805  long ihi )
806 {
807  long int i;
808 
809  /* >>chng 01 aug 19, space not allocated yet,
810  * following code must also be present in contcreatemesh where
811  * space allocated for the first time */
812  if( lgRfieldMalloced )
813  {
814  unsigned long n=(unsigned long)(ihi-lo+1);
815  memset(&rfield.OccNumbDiffCont[lo] , 0 , n*sizeof(realnum) );
816  memset(&rfield.OccNumbContEmitOut[lo] , 0 , n*sizeof(realnum) );
817  memset(&rfield.ContBoltz[lo] , 0 , n*sizeof(double) );
818  /*>>chng 06 aug 15, this is now 2D array, saving diffuse continuum
819  * over all zones for use in exact RT */
820  /*memset(&rfield.ConEmitLocal[lo] , 0 , n*sizeof(realnum) );*/
821  memset(&rfield.ConEmitReflec[0][lo] , 0 , n*sizeof(realnum) );
822  memset(&rfield.ConEmitOut[0][lo] , 0 , n*sizeof(realnum) );
823  memset(&rfield.reflin[0][lo] , 0 , n*sizeof(realnum) );
824  memset(&rfield.ConRefIncid[0][lo] , 0 , n*sizeof(realnum) );
825  memset(&rfield.SummedCon[lo] , 0 , n*sizeof(double) );
826  memset(&rfield.OccNumbBremsCont[lo] , 0 , n*sizeof(realnum) );
827  memset(&rfield.convoc[lo] , 0 , n*sizeof(realnum) );
828  memset(&rfield.flux[0][lo] , 0 , n*sizeof(realnum) );
829  memset(&rfield.flux_total_incident[0][lo] , 0 , n*sizeof(realnum) );
830  memset(&rfield.flux_beam_const_save[lo] , 0 , n*sizeof(realnum) );
831  memset(&rfield.flux_time_beam_save[lo] , 0 , n*sizeof(realnum) );
832  memset(&rfield.flux_isotropic_save[lo] , 0 , n*sizeof(realnum) );
833  memset(&rfield.SummedOcc[lo] , 0 , n*sizeof(realnum) );
834  memset(&rfield.SummedDif[lo] , 0 , n*sizeof(realnum) );
835  memset(&rfield.flux_accum[lo] , 0 , n*sizeof(realnum) );
836  memset(&rfield.otslin[lo] , 0 , n*sizeof(realnum) );
837  memset(&rfield.otscon[lo] , 0 , n*sizeof(realnum) );
838  memset(&rfield.ConInterOut[lo] , 0 , n*sizeof(realnum) );
839  memset(&rfield.outlin[0][lo] , 0 , n*sizeof(realnum) );
840  memset(&rfield.outlin_noplot[lo] , 0 , n*sizeof(realnum) );
841  memset(&rfield.ConOTS_local_OTS_rate[lo], 0 , n*sizeof(realnum) );
842  memset(&rfield.ConOTS_local_photons[lo] , 0 , n*sizeof(realnum) );
843  memset(&opac.OldOpacSave[lo] , 0 , n*sizeof(double) );
844  memset(&opac.opacity_abs[lo] , 0 , n*sizeof(double) );
845  memset(&opac.opacity_sct[lo] , 0 , n*sizeof(double) );
846  memset(&opac.albedo[lo] , 0 , n*sizeof(double) );
847  memset(&opac.FreeFreeOpacity[lo] , 0 , n*sizeof(double) );
848 
849  /* these are not defined on first iteration */
850  memset( &opac.E2TauAbsTotal[lo] , 0 , n*sizeof(realnum) );
851  memset( &opac.E2TauAbsOut[lo] , 0 , n*sizeof(realnum) );
852  memset( &opac.TauAbsTotal[lo] , 0 , n*sizeof(realnum) );
853 
854  for( i=lo; i <= ihi; i++ )
855  {
856  opac.TauTotalGeo[0][i] = opac.taumin;
857  opac.TauAbsGeo[0][i] = opac.taumin;
858  opac.TauScatGeo[0][i] = opac.taumin;
859  opac.tmn[i] = 1.;
860  opac.ExpZone[i] = 1.;
861  opac.E2TauAbsFace[i] = 1.;
862  opac.ExpmTau[i] = 1.;
863  opac.OpacStatic[i] = 1.;
864  }
865  /* also zero out fine opacity fine grid fine mesh array */
866  memset(rfield.fine_opac_zone , 0 , (unsigned long)rfield.nfine_malloc*sizeof(realnum) );
867  /* also zero out fine opacity array */
868  memset(rfield.fine_opt_depth , 0 , (unsigned long)rfield.nfine_malloc*sizeof(realnum) );
869  }
870  return;
871 }
STATIC void ChckFill(void)
realnum ** gff
Definition: rfield.h:227
double * opacity_abs_savzon1
Definition: opacity.h:108
realnum ** ConSourceFcnLocal
Definition: rfield.h:152
realnum * fine_opt_depth
Definition: rfield.h:410
realnum * fine_anu
Definition: rfield.h:412
long int iter_malloc
Definition: iterations.h:29
realnum * csigh
Definition: rfield.h:288
long int * line_count
Definition: rfield.h:68
realnum * widflx
Definition: rfield.h:65
FILE * open_data(const char *fname, const char *mode, access_scheme scheme)
Definition: cpu.cpp:616
realnum * ConOTS_local_OTS_rate
Definition: rfield.h:178
realnum * flux_isotropic
Definition: rfield.h:89
double * opacity_abs
Definition: opacity.h:95
long int fine_opac_nresolv
Definition: rfield.h:383
double * albedo
Definition: opacity.h:104
NORETURN void TotalInsanity(void)
Definition: service.cpp:886
realnum * flux_beam_const_save
Definition: rfield.h:210
t_opac opac
Definition: opacity.cpp:5
bool lgPtrace
Definition: trace.h:118
realnum ** flux
Definition: rfield.h:86
realnum * DiffuseLineEmission
Definition: rfield.h:203
double * OpacStatic
Definition: opacity.h:114
realnum * DiffuseEscape
Definition: rfield.h:184
realnum * outlin_noplot
Definition: rfield.h:199
long int * nend
Definition: geometry.h:80
void rfield_opac_zero(long lo, long ihi)
realnum ** flux_total_incident
Definition: rfield.h:209
realnum * anu3
Definition: rfield.h:77
#define MAX2
Definition: cddefines.h:786
realnum fine_opac_velocity_width
Definition: rfield.h:386
long int * ifill0
Definition: continuum.h:75
realnum * OccNumbContEmitOut
Definition: rfield.h:74
realnum emm
Definition: rfield.h:49
double * SummedCon
Definition: rfield.h:171
t_dense dense
Definition: dense.cpp:24
realnum * SummedOcc
Definition: rfield.h:173
realnum ** outlin
Definition: rfield.h:199
FILE * ioQQQ
Definition: cddefines.cpp:7
double * opacity_sct
Definition: opacity.h:98
STATIC void read_continuum_mesh(void)
realnum * E2TauAbsTotal
Definition: opacity.h:126
realnum * TauScatFace
Definition: opacity.h:91
realnum * ConOTS_local_photons
Definition: rfield.h:178
realnum * flux_accum
Definition: rfield.h:95
double * ExpZone
Definition: opacity.h:120
const double SPEEDLIGHT
Definition: physconst.h:100
long int nend_max
Definition: geometry.h:84
void resetCoarseTransCoef()
Definition: rfield.h:512
double * comup
Definition: rfield.h:255
realnum egamry
Definition: rfield.h:52
long int nupper
Definition: rfield.h:46
long int fine_opac_nelem
Definition: rfield.h:380
realnum * otslin
Definition: rfield.h:193
t_trace trace
Definition: trace.cpp:5
#define MALLOC(exp)
Definition: cddefines.h:505
long int nrange
Definition: continuum.h:75
realnum ** ConEmitLocal
Definition: rfield.h:149
t_geometry geometry
Definition: geometry.cpp:5
double fine_resol
Definition: rfield.h:406
long ipoint(double energy_ryd)
Definition: cont_ipoint.cpp:16
bool lgConBug
Definition: trace.h:100
char ** chLineLabel
Definition: rfield.h:220
double * OldOpacSave
Definition: opacity.h:101
realnum * anulog
Definition: rfield.h:77
#define STATIC
Definition: cddefines.h:101
bool lgTrace
Definition: trace.h:12
realnum ** TauScatGeo
Definition: opacity.h:83
t_continuum continuum
Definition: continuum.cpp:5
realnum * E2TauAbsOut
Definition: opacity.h:127
t_rfield rfield
Definition: rfield.cpp:8
STATIC void fill(double fenlo, double fenhi, double resolv, long int *n0, long int *ipnt, bool lgCount)
realnum * anu2
Definition: rfield.h:77
realnum * flux_time_beam_save
Definition: rfield.h:210
double ResolutionScaleFactor
Definition: continuum.h:90
double * StoredResolution
Definition: continuum.h:81
realnum * convoc
Definition: rfield.h:134
realnum * ConInterOut
Definition: rfield.h:164
float realnum
Definition: cddefines.h:107
realnum * filbnd
Definition: continuum.h:69
#define EXIT_FAILURE
Definition: cddefines.h:144
void ContCreateMesh(void)
const int INPUT_LINE_LENGTH
Definition: cddefines.h:258
long int ipFineConVelShift
Definition: rfield.h:418
realnum AtomicWeight[LIMELM]
Definition: dense.h:75
realnum * otscon
Definition: rfield.h:193
#define cdEXIT(FAIL)
Definition: cddefines.h:438
double * ContBoltz
Definition: rfield.h:145
realnum * TauAbsFace
Definition: opacity.h:91
STATIC void rfield_opac_malloc(void)
realnum * OccNumbIncidCont
Definition: rfield.h:138
t_iterations iterations
Definition: iterations.cpp:5
realnum * fildel
Definition: continuum.h:69
realnum * TauAbsTotal
Definition: opacity.h:129
realnum ** reflin
Definition: rfield.h:206
realnum ** ConEmitOut
Definition: rfield.h:161
realnum * fine_opac_zone
Definition: rfield.h:408
realnum fine_ener_lo
Definition: rfield.h:400
realnum ** otssav
Definition: rfield.h:193
realnum ** TauTotalGeo
Definition: opacity.h:87
double * StoredEnergy
Definition: continuum.h:81
double * opacity_sct_savzon1
Definition: opacity.h:110
#define ASSERT(exp)
Definition: cddefines.h:582
realnum * anusqr
Definition: rfield.h:77
double * anu
Definition: rfield.h:58
realnum fine_ener_hi
Definition: rfield.h:400
realnum * SummedDifSave
Definition: rfield.h:174
bool lgRfieldMalloced
Definition: cdinit.cpp:98
const int LIMELM
Definition: cddefines.h:262
long nfine
Definition: rfield.h:402
realnum * flux_isotropic_save
Definition: rfield.h:210
#define DEBUG_ENTRY(funcname)
Definition: cddefines.h:688
realnum * E2TauAbsFace
Definition: opacity.h:124
double * FreeFreeOpacity
Definition: opacity.h:117
realnum * OccNumbDiffCont
Definition: rfield.h:141
double * comdn
Definition: rfield.h:255
realnum * csigc
Definition: rfield.h:288
long int * ipnt_coarse_2_fine
Definition: rfield.h:397
double * AnuOrg
Definition: rfield.h:62
realnum ** TauAbsGeo
Definition: opacity.h:82
void setCoarseTransCoefPtr(realnum *ptr)
Definition: rfield.h:508
realnum * ExtinguishFactor
Definition: rfield.h:98
realnum * ExpmTau
Definition: opacity.h:132
realnum * filres
Definition: continuum.h:69
const int NCELL
Definition: rfield.h:21
realnum * SummedDif
Definition: rfield.h:172
long int nStoredBands
Definition: continuum.h:86
const double BOLTZMANN
Definition: physconst.h:97
realnum * OccNumbBremsCont
Definition: rfield.h:71
long nfine_malloc
Definition: rfield.h:404
realnum * TotDiff2Pht
Definition: rfield.h:187
char * read_whole_line(char *chLine, int nChar, FILE *ioIN)
Definition: service.cpp:70
realnum * tmn
Definition: opacity.h:136
realnum ** ConEmitReflec
Definition: rfield.h:155
realnum * flux_beam_time
Definition: rfield.h:92
void ShowMe(void)
Definition: service.cpp:181
realnum * flux_beam_const
Definition: rfield.h:92
long int nflux
Definition: rfield.h:43
realnum ** ConRefIncid
Definition: rfield.h:167
const double ATOMIC_MASS_UNIT
Definition: physconst.h:88
realnum taumin
Definition: opacity.h:154
char ** chContLabel
Definition: rfield.h:223
double FFmtRead(const char *chCard, long int *ipnt, long int last, bool *lgEOL)
Definition: service.cpp:381