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 t_iso_sp* sp = &iso_sp[ipISO][nelem];
00019
00020
00021
00022 ASSERT( dense.xNucleiTotal < MAX_DENSITY );
00023 ASSERT( nelem < LIMELM );
00024
00025 ASSERT( ipISO <= 1 );
00026
00027 eff_charge = nelem + 1 - ipISO;
00028
00029
00030
00031 a = sqrt( 1.8887E8 * (nelem+1.) / pow((double)dense.xNucleiTotal, 0.333) );
00032 ASSERT( a > 0. );
00033 np = (long)( MIN2((double)INT16_MAX,floor(a)) );
00034
00035
00036
00037 a = 2.6E7 * eff_charge * eff_charge * pow( phycon.te/dense.eden, 0.25);
00038 ASSERT( a > 0. );
00039 nd = (long)( MIN2((double)INT16_MAX,floor(a)) );
00040
00041
00042
00043
00044
00045 a = 3171. * pow( (double)eff_charge, 0.8 ) * pow( dense.eden + (double)dense.xIonDense[ipHYDROGEN][1]
00046 + (double)dense.xIonDense[ipHELIUM][1], -0.1333);
00047 ASSERT( a > 0. );
00048 ns = (long)( MIN2((double)INT16_MAX,floor(a)) );
00049
00050 nc = MIN3(np, nd, ns);
00051
00052 nc = MAX2( nc, 3 );
00053
00054 if( nc <= sp->n_HighestResolved_max)
00055 {
00056 sp->lgLevelsLowered = true;
00057 sp->lgLevelsEverLowered = true;
00058 sp->lgMustReeval = true;
00059 sp->n_HighestResolved_local = nc;
00060 sp->nCollapsed_local = 0;
00061 sp->numLevels_local = iso_get_total_num_levels( ipISO, nc, 0 );
00062 }
00063
00064
00065 else if( nc <= sp->n_HighestResolved_max + sp->nCollapsed_max )
00066 {
00067 sp->lgLevelsLowered = true;
00068 sp->lgLevelsEverLowered = true;
00069 sp->lgMustReeval = true;
00070 sp->n_HighestResolved_local = sp->n_HighestResolved_max;
00071 sp->nCollapsed_local = nc - sp->n_HighestResolved_local;
00072 sp->numLevels_local =
00073 iso_get_total_num_levels( ipISO, sp->n_HighestResolved_max, sp->nCollapsed_local );
00074 }
00075
00076
00077 else
00078 {
00079 sp->numLevels_local = sp->numLevels_max;
00080 sp->nCollapsed_local = sp->nCollapsed_max;
00081 sp->n_HighestResolved_local = sp->n_HighestResolved_max;
00082
00083
00084 if( sp->lgLevelsLowered )
00085 {
00086 sp->lgMustReeval = true;
00087 }
00088 else
00089 {
00090 sp->lgMustReeval = false;
00091 }
00092
00093 sp->lgLevelsLowered = false;
00094 }
00095
00096 if( !conv.nTotalIoniz )
00097 sp->lgMustReeval = true;
00098
00099
00100 ASSERT( sp->numLevels_local <= sp->numLevels_max );
00101 ASSERT( sp->nCollapsed_local <= sp->nCollapsed_max );
00102 ASSERT( sp->n_HighestResolved_local <= sp->n_HighestResolved_max );
00103
00104
00105 iso_ctrl.nLyman[ipISO] = MIN2( nc, iso_ctrl.nLyman_malloc[ipISO]);
00106
00107
00108 for( long ipHi=sp->numLevels_local; ipHi < sp->numLevels_max; ++ipHi )
00109 {
00110 for( long ipLo=0; ipLo < ipHi; ++ipLo )
00111 CollisionZero( sp->trans(ipHi,ipLo).Coll() );
00112 }
00113
00114 if( trace.lgTrace && (trace.lgHBug||trace.lgHeBug) )
00115 {
00116 fprintf( ioQQQ," iso_continuum_lower: ipISO %li nelem %li nc %li (np:%li,nd:%li,ns:%li) numLevels %li nCollapsed %li n_HighestResolved %li \n",
00117 ipISO,
00118 nelem,
00119 nc,
00120 np, nd, ns,
00121 sp->numLevels_local,
00122 sp->nCollapsed_local,
00123 sp->n_HighestResolved_local
00124 );
00125 }
00126
00127 return;
00128 }