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