00001
00002
00003
00004 #include "cddefines.h"
00005 #include "phycon.h"
00006 #include "dense.h"
00007 #include "iso.h"
00008
00009 #include "hydrogenic.h"
00010
00011 void iso_continuum_lower( long ipISO, long nelem )
00012 {
00013 double a;
00014 long int np, nd, ns, nc;
00015 long eff_charge;
00016
00017
00018
00019 ASSERT( nelem < LIMELM );
00020
00021 ASSERT( ipISO <= 1 );
00022
00023 if( ipISO == ipH_LIKE )
00024 eff_charge = nelem + 1;
00025 else
00026 eff_charge = nelem;
00027
00028
00029
00030 a = sqrt( 1.8887E8 * (nelem+1.) / pow((double)dense.xNucleiTotal, 0.333) );
00031 ASSERT( a > 0. );
00032 ASSERT( a < 1.e15 );
00033 if( a > (double)iso.n_HighestResolved_max[ipISO][nelem]+(double)iso.nCollapsed_max[ipISO][nelem] )
00034 {
00035 np = iso.n_HighestResolved_max[ipISO][nelem]+iso.nCollapsed_max[ipISO][nelem] + 1;
00036 }
00037 else
00038 np = (long)a;
00039
00040
00041
00042 a = 2.6E7 * eff_charge * eff_charge * pow( phycon.te/dense.eden, 0.25);
00043 ASSERT( a > 0. );
00044 ASSERT( a < 1.e15 );
00045 if( a > (double)iso.n_HighestResolved_max[ipISO][nelem]+(double)iso.nCollapsed_max[ipISO][nelem] )
00046 {
00047 nd = iso.n_HighestResolved_max[ipISO][nelem]+iso.nCollapsed_max[ipISO][nelem] + 1;
00048 }
00049 else
00050 nd = (long)a;
00051
00052
00053
00054
00055
00056 a = 3171. * pow( (double)eff_charge, 0.8 ) * pow( dense.eden + (double)dense.xIonDense[ipHYDROGEN][1]
00057 + (double)dense.xIonDense[ipHELIUM][1], -0.1333);
00058 ASSERT( a > 0. );
00059 ASSERT( a < 1.e15 );
00060 if( a > (double)iso.n_HighestResolved_max[ipISO][nelem]+(double)iso.nCollapsed_max[ipISO][nelem] )
00061 {
00062 ns = iso.n_HighestResolved_max[ipISO][nelem]+iso.nCollapsed_max[ipISO][nelem] + 1;
00063 }
00064 else
00065 ns = (long)a;
00066
00067 ASSERT( np > 3 );
00068 ASSERT( nd > 3 );
00069 ASSERT( ns > 3 );
00070
00071 nc = MIN3(np, nd, ns);
00072
00073
00074
00075
00076 ASSERT( nc > 3 );
00077
00078
00079
00080 if( ipISO == ipHE_LIKE )
00081 {
00082 if( nc < iso.n_HighestResolved_max[ipHE_LIKE][nelem])
00083 {
00084 iso.n_HighestResolved_local[ipHE_LIKE][nelem] = nc;
00085 iso.nCollapsed_local[ipHE_LIKE][nelem] = 0;
00086 iso.numLevels_local[ipHE_LIKE][nelem] = nc*nc + nc + 1;
00087 iso.lgLevelsLowered[ipHE_LIKE][nelem] = true;
00088 }
00089
00090
00091 else if( nc <= iso.n_HighestResolved_max[ipHE_LIKE][nelem] + iso.nCollapsed_max[ipHE_LIKE][nelem] )
00092 {
00093 iso.n_HighestResolved_local[ipHE_LIKE][nelem] = iso.n_HighestResolved_max[ipHE_LIKE][nelem];
00094 iso.nCollapsed_local[ipHE_LIKE][nelem] = nc - iso.n_HighestResolved_local[ipHE_LIKE][nelem];
00095 iso.numLevels_local[ipHE_LIKE][nelem] = iso.n_HighestResolved_local[ipHE_LIKE][nelem]*iso.n_HighestResolved_local[ipHE_LIKE][nelem] +
00096 iso.n_HighestResolved_local[ipHE_LIKE][nelem] + 1 + iso.nCollapsed_local[ipHE_LIKE][nelem];
00097 iso.lgLevelsLowered[ipHE_LIKE][nelem] = true;
00098 }
00099
00100
00101 else
00102 {
00103 iso.numLevels_local[ipHE_LIKE][nelem] = iso.numLevels_max[ipHE_LIKE][nelem];
00104 iso.nCollapsed_local[ipHE_LIKE][nelem] = iso.nCollapsed_max[ipHE_LIKE][nelem];
00105 iso.n_HighestResolved_local[ipHE_LIKE][nelem] = iso.n_HighestResolved_max[ipHE_LIKE][nelem];
00106 iso.lgLevelsLowered[ipHE_LIKE][nelem] = false;
00107 }
00108
00109 }
00110 else
00111 {
00112
00113
00114
00115 if( nc != (iso.numLevels_local[ipISO][nelem] - 1) && nc <= iso.numLevels_max[ipISO][nelem] - 1 )
00116 {
00117
00118 hydro.lgReevalRecom = true;
00119 }
00120 else if( iso.lgLevelsLowered[ipISO][nelem] && nc <= iso.numLevels_max[ipISO][nelem] - 1 )
00121 {
00122
00123 hydro.lgReevalRecom = true;
00124 }
00125 else if( (nc > iso.numLevels_max[ipISO][nelem] - 1 ) && iso.lgLevelsEverLowered[ipISO][nelem] )
00126 {
00127
00128 hydro.lgReevalRecom = true;
00129 }
00130 else
00131 {
00132
00133 hydro.lgReevalRecom = false;
00134 }
00135
00136
00137 if( nc <= iso.numLevels_max[ipISO][nelem] - 1 )
00138 {
00139 iso.lgLevelsLowered[ipISO][nelem] = true;
00140 iso.lgLevelsEverLowered[ipISO][nelem] = true;
00141 }
00142 else
00143 {
00144 iso.lgLevelsLowered[ipISO][nelem] = false;
00145 }
00146
00147 iso.numLevels_local[ipISO][nelem] = MIN2( nc+1, iso.numLevels_max[ipISO][nelem] );
00148 iso.n_HighestResolved_local[ipISO][nelem] = MIN2( nc, iso.n_HighestResolved_max[ipISO][nelem]);
00149
00150 iso.nCollapsed_local[ipISO][nelem] = 0;
00151 }
00152
00153
00154 ASSERT( iso.numLevels_local[ipISO][nelem] <= iso.numLevels_max[ipISO][nelem] );
00155 ASSERT( iso.nCollapsed_local[ipISO][nelem] <= iso.nCollapsed_max[ipISO][nelem] );
00156 ASSERT( iso.n_HighestResolved_local[ipISO][nelem] <= iso.n_HighestResolved_max[ipISO][nelem] );
00157
00158
00159 iso.numPrintLevels[ipISO][nelem] = MIN2( iso.numPrintLevels[ipISO][nelem], iso.numLevels_local[ipISO][nelem] );
00160
00161
00162 iso.nLyman[ipISO] = MIN2( nc, iso.nLyman[ipISO]);
00163
00164 return;
00165 }