00001
00002
00003
00004 #ifndef _CDDEFINES_H_
00005 #define _CDDEFINES_H_
00006
00007 #ifdef _MSC_VER
00008
00009 # pragma warning( disable : 4127 )
00010
00011 # ifndef WIN32_LEAN_AND_MEAN
00012 # define WIN32_LEAN_AND_MEAN
00013 # endif
00014 #endif
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <math.h>
00027 #include <assert.h>
00028 #include <string.h>
00029 #include <float.h>
00030 #include <limits.h>
00031 #include <time.h>
00032 #include <signal.h>
00033 #include <string>
00034 #include <sstream>
00035 #include <vector>
00036 #include <valarray>
00037 #include <complex>
00038 #include <map>
00039 #include <memory>
00040 #include <stdexcept>
00041 #ifdef DMALLOC
00042 #include <dmalloc.h>
00043 #endif
00044
00045
00046
00047
00048
00049
00050
00051
00052 using namespace std;
00053
00055 #ifndef EXTERN
00056 #define EXTERN extern
00057 #endif
00058
00059 #undef STATIC
00060 #ifdef USE_GPROF
00061 #define STATIC
00062 #else
00063 #define STATIC static
00064 #endif
00065
00066 #ifdef FLT_IS_DBL
00067 typedef double realnum;
00068 #else
00069 typedef float realnum;
00070 #endif
00071
00072 typedef float sys_float;
00073
00074 #define float PLEASE_USE_REALNUM_NOT_FLOAT
00075
00076
00077 #include "cpu.h"
00078
00079
00080
00098
00099
00100
00101
00102
00103 template<typename T> class Singleton
00104 {
00105 public:
00106 static T& Inst()
00107 {
00108 static T instance;
00109 return instance;
00110 }
00111 };
00112
00113
00114
00115
00116
00117
00118
00119
00123 EXTERN FILE *ioQQQ;
00124
00125 EXTERN FILE *ioStdin;
00126
00127 extern FILE *ioMAP;
00128
00131 EXTERN FILE* ioPrnErr;
00132
00134 EXTERN bool lgAbort;
00135
00138 EXTERN bool lgTestCodeCalled;
00139
00142 EXTERN bool lgTestCodeEnabled;
00143
00146 EXTERN bool lgPrnErr;
00147
00150 EXTERN long int nzone;
00151
00153 EXTERN double fnzone;
00154
00157 EXTERN long int iteration;
00158
00160 EXTERN long int nSimThisCoreload;
00161
00168 extern const double ZeroNum;
00169
00170
00171
00172
00173
00174
00175
00180 const int FILENAME_PATH_LENGTH = 200;
00181
00183 const int FILENAME_PATH_LENGTH_2 = FILENAME_PATH_LENGTH*2;
00184
00188 const int INPUT_LINE_LENGTH = 200;
00189
00192 const int LIMELM = 30;
00193
00195 const int NISO = 2;
00196
00200 const int NHYDRO_MAX_LEVEL = 401;
00201
00203 const int N_H_MOLEC = 8;
00204
00205 #if 0
00206
00207 const double TEMP_STOP_DEFAULT = 4000.;
00209 const double TEMP_LIMIT_HIGH = 1e10;
00211 const double TEMP_LIMIT_LOW = 2.8;
00212 #endif
00213
00215 const double DEPTH_OFFSET = 1.e-30;
00216
00217
00218 enum collider {
00219 ipELECTRON,
00220 ipPROTON,
00221 ipHE_PLUS,
00222 ipALPHA,
00223
00224
00225
00226
00227 ipNCOLLIDER
00228 };
00229
00230
00231
00232 const int ipRecEsc = 2;
00233
00234 const int ipRecNetEsc = 1;
00235
00236 const int ipRecRad = 0;
00241
00242
00243 const int ipPRD = 1;
00244
00245 const int ipCRD = -1;
00246
00247 const int ipCRDW = 2;
00248
00249 const int ipLY_A = -2;
00250
00251 const int ipDEST_K2 = 1;
00252
00253 const int ipDEST_INCOM = 2;
00254
00255 const int ipDEST_SIMPL = 3;
00256
00259 const int ipH1s = 0;
00260 const int ipH2s = 1;
00261 const int ipH2p = 2;
00262 const int ipH3s = 3;
00263 const int ipH3p = 4;
00264 const int ipH3d = 5;
00265 const int ipH4s = 6;
00266 const int ipH4p = 7;
00267 const int ipH4d = 8;
00268 const int ipH4f = 9;
00269 const int ipH5s = 10;
00270 const int ipH5p = 11;
00271 const int ipH5d = 12;
00272 const int ipH5f = 13;
00273 const int ipH5g = 14;
00274 const int ipH6s = 15;
00275
00278
00279 const int ipHe1s1S = 0;
00280
00281
00282 const int ipHe2s3S = 1;
00283 const int ipHe2s1S = 2;
00284 const int ipHe2p3P0 = 3;
00285 const int ipHe2p3P1 = 4;
00286 const int ipHe2p3P2 = 5;
00287 const int ipHe2p1P = 6;
00288
00289
00290 const int ipHe3s3S = 7;
00291 const int ipHe3s1S = 8;
00292 const int ipHe3p3P = 9;
00293 const int ipHe3d3D = 10;
00294 const int ipHe3d1D = 11;
00295 const int ipHe3p1P = 12;
00296
00297
00298 const int ipHe4s3S = 13;
00299 const int ipHe4s1S = 14;
00300 const int ipHe4p3P = 15;
00301 const int ipHe4d3D = 16;
00302 const int ipHe4d1D = 17;
00303 const int ipHe4f3F = 18;
00304 const int ipHe4f1F = 19;
00305 const int ipHe4p1P = 20;
00306
00310 const int ipH_LIKE = 0;
00311 const int ipHE_LIKE = 1;
00312 const int ipLI_LIKE = 2;
00313 const int ipBE_LIKE = 3;
00314 const int ipB_LIKE = 4;
00315 const int ipC_LIKE = 5;
00316 const int ipN_LIKE = 6;
00317 const int ipO_LIKE = 7;
00318 const int ipF_LIKE = 8;
00319
00321 const int ipHYDROGEN = 0;
00322 const int ipHELIUM = 1;
00323 const int ipLITHIUM = 2;
00324 const int ipBERYLLIUM = 3;
00325 const int ipBORON = 4;
00326 const int ipCARBON = 5;
00327 const int ipNITROGEN = 6;
00328 const int ipOXYGEN = 7;
00329 const int ipFLUORINE = 8;
00330 const int ipNEON = 9;
00331 const int ipSODIUM = 10;
00332 const int ipMAGNESIUM = 11;
00333 const int ipALUMINIUM = 12;
00334 const int ipSILICON = 13;
00335 const int ipPHOSPHORUS = 14;
00336 const int ipSULPHUR = 15;
00337 const int ipCHLORINE = 16;
00338 const int ipARGON = 17;
00339 const int ipPOTASSIUM = 18;
00340 const int ipCALCIUM = 19;
00341 const int ipSCANDIUM = 20;
00342 const int ipTITANIUM = 21;
00343 const int ipVANADIUM = 22;
00344 const int ipCHROMIUM = 23;
00345 const int ipMANGANESE = 24;
00346 const int ipIRON = 25;
00347 const int ipCOBALT = 26;
00348 const int ipNICKEL = 27;
00349 const int ipCOPPER = 28;
00350 const int ipZINC = 29;
00351
00352
00353
00354
00355
00356
00357
00366 double fudge(long int ipnt);
00367
00371 void broken(void);
00372
00375 void fixit(void);
00376
00378 void CodeReview(void);
00379
00381 void TestCode(void);
00382
00388 void *MyMalloc(size_t size, const char *file, int line);
00389
00394 void *MyCalloc(size_t num, size_t size);
00395
00400 void *MyRealloc(void *p, size_t size);
00401
00406 void MyAssert(const char *file, int line);
00407
00411 NORETURN void cdExit(int iexit);
00412
00413 class cloudy_exit
00414 {
00415 const char* p_routine;
00416 const char* p_file;
00417 long p_line;
00418 int p_exit;
00419 public:
00420 cloudy_exit(const char* routine, const char* file, long line, int exit_code)
00421 {
00422 p_routine = routine;
00423 p_file = file;
00424 p_line = line;
00425 p_exit = exit_code;
00426 }
00427 virtual ~cloudy_exit() throw()
00428 {
00429 p_routine = NULL;
00430 p_file = NULL;
00431 }
00432 const char* routine() const throw()
00433 {
00434 return p_routine;
00435 }
00436 const char* file() const throw()
00437 {
00438 return p_file;
00439 }
00440 long line() const
00441 {
00442 return p_line;
00443 }
00444 int exit_status() const
00445 {
00446 return p_exit;
00447 }
00448 };
00449
00450
00451 #define cdEXIT( FAIL ) throw cloudy_exit( __func__, __FILE__, __LINE__, FAIL )
00452
00453
00454 #define puts( STR ) Using_puts_before_cdEXIT_is_no_longer_needed
00455
00457 void ShowMe(void);
00458
00460 NORETURN void TotalInsanity(void);
00461
00463 NORETURN void BadRead(void);
00464
00466 NORETURN void BadOpen(void);
00467
00472 NORETURN void NoNumb(char *chCard);
00473
00477 int dbg_printf(int debug, const char *fmt, ...);
00478
00480 int dprintf(FILE *fp, const char *format, ...);
00481
00490 char *read_whole_line( char *chLine , int nChar , FILE *ioIN );
00491
00492
00493
00494
00495
00496
00497
00501 #ifndef NDEBUG
00502 # define DEBUG
00503 #else
00504 # undef DEBUG
00505 #endif
00506
00514 #ifndef PARALLEL_MODE
00515 #define PARALLEL_MODE false
00516 #endif
00517
00519 #if defined(malloc)
00520
00521
00522 # define MALLOC(exp) (malloc(exp))
00523 #else
00524
00525 # define MALLOC(exp) (MyMalloc(exp,__FILE__, __LINE__))
00526 #endif
00527
00529 #if defined(calloc)
00530
00531 # define CALLOC calloc
00532 #else
00533
00534 # define CALLOC MyCalloc
00535 #endif
00536
00538 #if defined(realloc)
00539
00540 # define REALLOC realloc
00541 #else
00542
00543 # define REALLOC MyRealloc
00544 #endif
00545
00546 class bad_signal
00547 {
00548 int p_sig;
00549 public:
00550 explicit bad_signal(int sig)
00551 {
00552 p_sig = sig;
00553 }
00554 virtual ~bad_signal() throw() {}
00555 int sig() const throw()
00556 {
00557 return p_sig;
00558 }
00559 };
00560
00561 class bad_assert
00562 {
00563 const char* p_file;
00564 long p_line;
00565 public:
00566 bad_assert(const char* file, long line)
00567 {
00568 p_file = file;
00569 p_line = line;
00570 }
00571 virtual ~bad_assert() throw()
00572 {
00573 p_file = NULL;
00574 }
00575 const char* file() const throw()
00576 {
00577 return p_file;
00578 }
00579 long line() const throw()
00580 {
00581 return p_line;
00582 }
00583 };
00584
00585 class bad_mpi {
00586 long p_failMode;
00587 public:
00588 bad_mpi(long failMode) : p_failMode(failMode) {}
00589 long failMode() const { return p_failMode; }
00590 };
00591
00593 #undef ASSERT
00594 #ifndef STD_ASSERT
00595 # ifdef NDEBUG
00596 # define ASSERT(exp) ((void)0)
00597 # elif defined ASSERTDEBUG
00598 # define ASSERT(exp) if (!(exp)) MyAssert(__FILE__, __LINE__)
00599 # else
00600
00601
00602
00603
00604
00605
00606 # define ASSERT(exp) \
00607 do { \
00608 if (!(exp)) \
00609 { \
00610 if( cpu.lgAssertAbort() ) \
00611 abort(); \
00612 else \
00613 throw bad_assert(__FILE__,__LINE__); \
00614 } \
00615 } while( 0 )
00616 # endif
00617 #else
00618 # define ASSERT(exp) (assert(exp))
00619 #endif
00620
00621 NORETURN inline void OUT_OF_RANGE(const char* str)
00622 {
00623 if( cpu.lgAssertAbort() )
00624 abort();
00625 else
00626 throw out_of_range( str );
00627 }
00628
00629
00630
00631
00632 #undef isnan
00633 #define isnan MyIsnan
00634
00637 class t_debug : public Singleton<t_debug>
00638 {
00639 friend class Singleton<t_debug>;
00640 FILE *p_fp;
00641 int p_callLevel;
00642 protected:
00643 t_debug()
00644 {
00645 p_fp = stderr;
00646 p_callLevel = 0;
00647 }
00648 public:
00649 void enter(const char *name)
00650 {
00651 ++p_callLevel;
00652 fprintf(p_fp,"%*c%s\n",p_callLevel,'>',name);
00653 }
00654 void leave(const char *name)
00655 {
00656 fprintf(p_fp,"%*c%s\n",p_callLevel,'<',name);
00657 --p_callLevel;
00658 }
00659 };
00660
00661 template<bool lgTrace>
00662 class debugtrace
00663 {
00664 const char *p_name;
00665 public:
00666 explicit debugtrace(const char *funcname)
00667 {
00668 p_name = funcname;
00669 # ifdef _MSC_VER
00670
00671 # pragma warning( disable : 4127 )
00672 # endif
00673 if( lgTrace )
00674 t_debug::Inst().enter(p_name);
00675 }
00676 ~debugtrace()
00677 {
00678 # ifdef _MSC_VER
00679
00680 # pragma warning( disable : 4127 )
00681 # endif
00682 if( lgTrace )
00683 t_debug::Inst().leave(p_name);
00684 p_name = NULL;
00685 }
00686 const char* name() const
00687 {
00688 return p_name;
00689 }
00690 };
00691
00692 #ifdef DEBUG_FUN
00693 #define DEBUG_ENTRY( funcname ) debugtrace<true> DEBUG_ENTRY( funcname )
00694 #else
00695 #ifdef __GNUC__
00696 #define DEBUG_ENTRY( funcname ) ((void)0)
00697 #else
00698 #define DEBUG_ENTRY( funcname ) debugtrace<false> DEBUG_ENTRY( funcname )
00699 #endif
00700 #endif
00701
00702
00703 inline char TorF( bool l ) { return l ? 'T' : 'F'; }
00704
00705
00707 inline bool is_odd( int j ) { return (j&1) == 1; }
00708 inline bool is_odd( long j ) { return (j&1L) == 1L; }
00709
00710
00712 inline long nint( double x ) { return static_cast<long>( (x < 0.) ? x-0.5 : x+0.5 ); }
00713
00714
00715
00716 inline long min( int a, long b ) { long c = a; return ( (c < b) ? c : b ); }
00717 inline long min( long a, int b ) { long c = b; return ( (a < c) ? a : c ); }
00718 inline double min( sys_float a, double b ) { double c = a; return ( (c < b) ? c : b ); }
00719 inline double min( double a, sys_float b ) { double c = b; return ( (a < c) ? a : c ); }
00720
00721 #undef MIN2
00722
00723 #define MIN2 min
00724
00725
00726 #undef MIN3
00727
00728 #define MIN3(a,b,c) (min(min(a,b),c))
00729
00730
00731 #undef MIN4
00732
00733 #define MIN4(a,b,c,d) (min(min(a,b),min(c,d)))
00734
00735
00736
00737 inline long max( int a, long b ) { long c = a; return ( (c > b) ? c : b ); }
00738 inline long max( long a, int b ) { long c = b; return ( (a > c) ? a : c ); }
00739 inline double max( sys_float a, double b ) { double c = a; return ( (c > b) ? c : b ); }
00740 inline double max( double a, sys_float b ) { double c = b; return ( (a > c) ? a : c ); }
00741
00742 #undef MAX2
00743
00744 #define MAX2 max
00745
00746
00747 #undef MAX3
00748
00749 #define MAX3(a,b,c) (max(max(a,b),c))
00750
00751
00752 #undef MAX4
00753
00754 #define MAX4(a,b,c,d) (max(max(a,b),max(c,d)))
00755
00756
00761 template<class T>
00762 inline T sign( T x, T y )
00763 {
00764 return ( y < T() ) ? -abs(x) : abs(x);
00765 }
00766
00767
00769 template<class T>
00770 inline int sign3( T x ) { return ( x < T() ) ? -1 : ( ( x > T() ) ? 1 : 0 ); }
00771
00772
00774 inline bool fp_equal( sys_float x, sys_float y, int n=3 )
00775 {
00776 # ifdef _MSC_VER
00777
00778 # pragma warning( disable : 4127 )
00779 # endif
00780 ASSERT( n >= 1 );
00781
00782 if( isnan(x) || isnan(y) )
00783 return false;
00784 int sx = sign3(x);
00785 int sy = sign3(y);
00786
00787 if( sx == 0 && sy == 0 )
00788 return true;
00789
00790 if( sx*sy != 1 )
00791 return false;
00792 x = abs(x);
00793 y = abs(y);
00794 return ( 1.f - min(x,y)/max(x,y) < ((sys_float)n+0.1f)*FLT_EPSILON );
00795 }
00796
00797 inline bool fp_equal( double x, double y, int n=3 )
00798 {
00799 ASSERT( n >= 1 );
00800
00801 if( isnan(x) || isnan(y) )
00802 return false;
00803 int sx = sign3(x);
00804 int sy = sign3(y);
00805
00806 if( sx == 0 && sy == 0 )
00807 return true;
00808
00809 if( sx*sy != 1 )
00810 return false;
00811 x = abs(x);
00812 y = abs(y);
00813 return ( 1. - min(x,y)/max(x,y) < ((double)n+0.1)*DBL_EPSILON );
00814 }
00815
00816 inline bool fp_equal_tol( sys_float x, sys_float y, sys_float tol )
00817 {
00818 ASSERT( tol > 0.f );
00819
00820 if( isnan(x) || isnan(y) )
00821 return false;
00822
00823 ASSERT( tol >= FLT_EPSILON*max(abs(x),abs(y)) );
00824 return ( abs( x-y ) <= tol );
00825 }
00826
00827 inline bool fp_equal_tol( double x, double y, double tol )
00828 {
00829 ASSERT( tol > 0. );
00830
00831 if( isnan(x) || isnan(y) )
00832 return false;
00833
00834 ASSERT( tol >= DBL_EPSILON*max(abs(x),abs(y)) );
00835 return ( abs( x-y ) <= tol );
00836 }
00837
00838 #undef POW2
00839
00840 #define POW2 pow2
00841 template<class T>
00842 inline T pow2(T a) { return a*a; }
00843
00844
00845 #undef POW3
00846
00847 #define POW3 pow3
00848 template<class T>
00849 inline T pow3(T a) { return a*a*a; }
00850
00851
00852 #undef POW4
00853
00854 #define POW4(X) (pow2(X)*pow2(X))
00855
00856
00857 #undef SDIV
00858
00861 inline sys_float SDIV( sys_float x ) { return ( fabs((double)x) < (double)SMALLFLOAT ) ? (sys_float)SMALLFLOAT : x; }
00862
00863 inline double SDIV( double x ) { return ( fabs(x) < (double)SMALLFLOAT ) ? (double)SMALLFLOAT : x; }
00864
00865
00866
00870 inline sys_float safe_div(sys_float x, sys_float y)
00871 {
00872
00873 if( isnan(x) || isnan(y) )
00874 return x/y;
00875 int sx = sign3(x);
00876 int sy = sign3(y);
00877
00878 if( sx == 0 && sy == 0 )
00879 return x/y;
00880 if( sx == 0 )
00881 return 0.;
00882 if( sy == 0 )
00883 return ( sx < 0 ) ? -FLT_MAX : FLT_MAX;
00884
00885 sys_float ay = abs(y);
00886 if( ay >= 1.f )
00887 return x/y;
00888 else
00889 {
00890
00891 if( abs(x) < ay*FLT_MAX )
00892 return x/y;
00893 else
00894 return ( sx*sy < 0 ) ? -FLT_MAX : FLT_MAX;
00895 }
00896 }
00897
00901 inline double safe_div(double x, double y)
00902 {
00903
00904 if( isnan(x) || isnan(y) )
00905 return x/y;
00906 int sx = sign3(x);
00907 int sy = sign3(y);
00908
00909 if( sx == 0 && sy == 0 )
00910 return x/y;
00911 if( sx == 0 )
00912 return 0.;
00913 if( sy == 0 )
00914 return ( sx < 0 ) ? -DBL_MAX : DBL_MAX;
00915
00916 double ay = abs(y);
00917 if( ay >= 1. )
00918 return x/y;
00919 else
00920 {
00921
00922 if( abs(x) < ay*DBL_MAX )
00923 return x/y;
00924 else
00925 return ( sx*sy < 0 ) ? -DBL_MAX : DBL_MAX;
00926 }
00927 }
00928
00929 #undef HMRATE
00930
00931
00932
00933
00934
00935 #define HMRATE(a,b,c) hmrate4(a,b,c,phycon.te)
00936
00937 inline double hmrate4( double a, double b, double c, double te )
00938 {
00939 if( b == 0. && c == 0. )
00940 return a;
00941 else if( c == 0. )
00942 return a*pow(te/300.,b);
00943 else if( b == 0. )
00944 return ( c/te <= 50. ) ? a*exp(-c/te) : 0.;
00945 else
00946 return ( c/te <= 50. ) ? a*pow(te/300.,b)*exp(-c/te) : 0.;
00947 }
00948
00949 template<class T>
00950 inline void invalidate_array(T* p, size_t size)
00951 {
00952 memset( p, -1, size );
00953 }
00954
00955 inline void invalidate_array(double* p, size_t size)
00956 {
00957 set_NaN( p, (long)(size/sizeof(double)) );
00958 }
00959
00960 inline void invalidate_array(sys_float* p, size_t size)
00961 {
00962 set_NaN( p, (long)(size/sizeof(sys_float)) );
00963 }
00964
00990 template<class T>
00991 class auto_vec
00992 {
00993 T* ptr;
00994
00995 template<class U>
00996 struct auto_vec_ref
00997 {
00998 U* ptr;
00999
01000 explicit auto_vec_ref( U* p )
01001 {
01002 ptr = p;
01003 }
01004 };
01005
01006 public:
01007 typedef T element_type;
01008
01009
01010
01011 explicit auto_vec( element_type* p = NULL ) throw()
01012 {
01013 ptr = p;
01014 }
01015 auto_vec( auto_vec& p ) throw()
01016 {
01017 ptr = p.release();
01018 }
01019 auto_vec& operator= ( auto_vec& p ) throw()
01020 {
01021 reset( p.release() );
01022 return *this;
01023 }
01024 ~auto_vec() throw()
01025 {
01026 delete[] ptr;
01027 }
01028
01029
01030
01031 element_type& operator[] ( ptrdiff_t n ) const throw()
01032 {
01033 return *(ptr+n);
01034 }
01035 element_type* get() const throw()
01036 {
01037 return ptr;
01038 }
01039
01040 element_type* data() const throw()
01041 {
01042 return ptr;
01043 }
01044 element_type* release() throw()
01045 {
01046 element_type* p = ptr;
01047 ptr = NULL;
01048 return p;
01049 }
01050 void reset( element_type* p = NULL ) throw()
01051 {
01052 if( p != ptr )
01053 {
01054 delete[] ptr;
01055 ptr = p;
01056 }
01057 }
01058
01059
01060
01061 auto_vec( auto_vec_ref<element_type> r ) throw()
01062 {
01063 ptr = r.ptr;
01064 }
01065 auto_vec& operator= ( auto_vec_ref<element_type> r ) throw()
01066 {
01067 if( r.ptr != ptr )
01068 {
01069 delete[] ptr;
01070 ptr = r.ptr;
01071 }
01072 return *this;
01073 }
01074 operator auto_vec_ref<element_type>() throw()
01075 {
01076 return auto_vec_ref<element_type>( this->release() );
01077 }
01078 };
01079
01080 #include "container_classes.h"
01081
01082
01083
01084
01085
01086
01087
01088 typedef struct t_transition transition;
01089 typedef struct t_quantumState quantumState;
01090 typedef struct t_emission emission;
01091 typedef struct t_collision collision;
01092 typedef struct t_species species;
01093
01094 struct t_emission
01095 {
01104 int iRedisFun;
01105
01107 long int ipFine;
01108
01122 realnum TauIn;
01123
01134 realnum TauTot;
01135
01141 realnum TauCon;
01142
01144 realnum FracInwd;
01145
01148 double pump;
01149
01151 double xIntensity;
01152
01154 double phots;
01155
01157 realnum gf;
01158
01160 realnum Pesc;
01161
01163 realnum Pelec_esc;
01164
01166 realnum Pdest;
01167
01171 realnum dampXvel;
01172
01174 realnum damp;
01175
01177 double ColOvTot;
01178
01184 realnum opacity;
01185
01187 double PopOpc;
01188
01190 realnum Aul;
01191
01193 double ots;
01194
01195
01196 transition *tran;
01197
01198
01199 emission *next;
01200
01201 };
01202
01203
01204
01205
01206
01207 struct t_species
01208 {
01209
01210 char *chptrSpName;
01211
01212 int intAtNo;
01213
01214 int intIonStage;
01215
01216 long numLevels_max;
01217
01218 long numLevels_local;
01219
01220 realnum fmolweight;
01221
01222
01223 };
01224
01225
01226
01227 typedef struct t_CollRatesArray
01228 {
01229
01230 long ntemps;
01231
01232 double *temps;
01233
01234 double ***collrates;
01235
01236 } CollRateCoeffArray ;
01237
01238
01239
01240 typedef struct t_CollSplinesArray
01241 {
01242
01243
01244
01245
01246
01247 double *collspline;
01248 double *SplineSecDer;
01249
01250 long nSplinePts;
01251 long intTranType;
01252 double gf;
01253 double EnergyDiff;
01254 double ScalingParam;
01255
01256 } CollSplinesArray ;
01257
01258 struct t_collision
01259 {
01260
01261
01262
01263
01265 realnum ColUL;
01266
01268 realnum cs;
01269
01271 realnum csi[ipNCOLLIDER];
01272
01274 double cool , heat;
01275
01276 };
01277
01278
01279 struct t_quantumState
01280 {
01281 char chLabel[5];
01282 char chConfig[11];
01283
01284 species *sp;
01285
01287 realnum energy;
01288
01290 realnum g;
01291
01293 double Pop;
01294
01296 int IonStg;
01298 int nelem;
01299
01301 double ConBoltz;
01302
01303
01304 long n, l, S, j;
01305
01307 double lifetime;
01308
01309
01310 quantumState *next;
01311 };
01312
01313
01314 struct t_transition
01315 {
01316 quantumState *Lo, *Hi;
01317 emission *Emis;
01318 collision Coll;
01319
01320
01321
01322
01324 realnum WLAng;
01325
01327 realnum EnergyK;
01328
01330 realnum EnergyErg;
01331
01333 realnum EnergyWN;
01334
01339 long ipCont;
01340 };
01341
01342
01343 INSTANTIATE_MULTI_ARR( quantumState, MEM_LAYOUT_VAL, lgBOUNDSCHECKVAL );
01344 INSTANTIATE_MULTI_ARR( transition, MEM_LAYOUT_VAL, lgBOUNDSCHECKVAL );
01345
01346
01347
01348
01349
01350
01351
01352
01359 typedef enum { SPM_RELAX, SPM_KEEP_EMPTY, SPM_STRICT } split_mode;
01360
01362 void Split(const string& str,
01363 const string& sep,
01364 vector<string>& lst,
01365 split_mode mode);
01366
01369 inline bool FindAndReplace(string& str,
01370 const string& substr,
01371 const string& newstr)
01372 {
01373 string::size_type ptr = str.find( substr );
01374 if( ptr != string::npos )
01375 str.replace( ptr, substr.length(), newstr );
01376 return ptr != string::npos;
01377 }
01378
01381 inline bool FindAndErase(string& str,
01382 const string& substr)
01383 {
01384 return FindAndReplace( str, substr, "" );
01385 }
01386
01392 double csphot(long int inu, long int ithr, long int iofset);
01393
01398 double RandGauss(double xMean, double s );
01399
01403 double MyGaussRand( double PctUncertainty );
01404
01406 double AnuUnit(realnum energy);
01407
01412 void cap4(char *chCAP , char *chLab);
01413
01416 void uncaps(char *chCard );
01417
01420 void caps(char *chCard );
01421
01424 double e2(
01425 double t );
01426
01429 double ee1(double x);
01430
01434 double ee1_safe(double x);
01435
01442 double FFmtRead(const char *chCard,
01443 long int *ipnt,
01444 long int last,
01445 bool *lgEOL);
01446
01452 long nMatch(const char *chKey,
01453 const char *chCard);
01454
01460 long int GetElem( char *chCARD_CAPS );
01461
01470 int GetQuote(char *chLabel, char *chCard, bool lgABORT );
01471
01472
01473 #if !HAVE_POWI
01474
01475 double powi( double , long int );
01476 #endif
01477
01480 long int ipow( long, long );
01481
01484 void PrintE82( FILE*, double );
01485
01487 void PrintE71( FILE*, double );
01488
01490 void PrintE93( FILE*, double );
01491
01497 char *PrintEfmt(const char *fmt, double val );
01498
01500 const double SEXP_LIMIT = 84.;
01502 sys_float sexp(sys_float x);
01503 double sexp(double x);
01504
01509 double dsexp(double x);
01510
01515 double plankf(long int ip);
01516
01523 double qg32( double, double, double(*)(double) );
01524
01525
01526
01527
01537 void spsort( realnum x[], long int n, long int iperm[], int kflag, int *ier);
01538
01539
01540 inline double vfun(double damp, double x)
01541 {
01542
01543 return sexp(x*x) + damp/1.772453850905516027298167/(1. + x*x);
01544 }
01545
01546
01547
01548
01549
01550
01551
01552
01553 #ifdef _MSC_VER
01554
01555 # pragma warning( disable : 4127 )
01556
01557 # pragma warning( disable : 4996 )
01558
01559 # pragma warning( disable : 4056 )
01560
01561 # pragma warning( disable : 4514 )
01562
01563
01564 # pragma warning( disable : 4512 )
01565 #endif
01566 #ifdef __INTEL_COMPILER
01567 # pragma warning( disable : 1572 )
01568 #endif
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580 #endif
01581