00001
00002
00003
00004
00005 #include "cddefines.h"
00006 #include "taulines.h"
00007 #include "hmi.h"
00008 #include "iso.h"
00009 #include "phycon.h"
00010 #include "physconst.h"
00011 #include "elementnames.h"
00012 #include "hydrogenic.h"
00013 #include "lines_service.h"
00014 #include "dense.h"
00015 #include "atomfeii.h"
00016 #include "lines.h"
00017 #include "atmdat.h"
00018 #include "prt.h"
00019 #include "h2.h"
00020 #include "thermal.h"
00021 #include "cooling.h"
00022 #include "save.h"
00023
00024 NORETURN void SaveLineData(FILE * ioPUN)
00025 {
00026
00027 long int i,
00028 j,
00029 limit ,
00030 nelem ,
00031 ipHi ,
00032 ipLo;
00033
00034 const long nskip=2;
00035 double tot;
00036 bool lgElemOff=false;
00037
00038 DEBUG_ENTRY( "SaveLineData()" );
00039
00040
00041
00042
00043
00044 fprintf( ioQQQ, " punching line data, then stopping\n" );
00045
00046
00047 for( nelem=ipHYDROGEN; nelem<LIMELM; ++nelem )
00048 {
00049 if( !dense.lgElmtOn[nelem] )
00050 {
00051 fprintf(ioQQQ," WARNING - I am punching line data but element %s is turned off.\n",
00052 elementnames.chElementName[nelem]);
00053 lgElemOff = true;
00054 }
00055 }
00056 if( lgElemOff )
00057 {
00058 fprintf(ioQQQ,"Some elements are turned off and save line data requested.\n");
00059 fprintf(ioQQQ,"Code is now designed to do save line data only with all elements on.\n");
00060 fprintf(ioQQQ,"Please try again with all elements on.\n");
00061 fprintf(ioQQQ,"Please try again with all elements on.\n");
00062 cdEXIT(EXIT_FAILURE);
00063 }
00064
00065
00066
00067 double TeNew;
00068 if( thermal.lgTemperatureConstant )
00069 {
00070 TeNew = thermal.ConstTemp;
00071 }
00072 else
00073 {
00074 TeNew = 1e4;
00075 }
00076 TempChange(TeNew , false);
00077
00078
00079 t_ADfA::Inst().rec_lines(phycon.te,LineSave.RecCoefCNO);
00080 fprintf( ioPUN, "\n Recombination lines of C, N, O\n" );
00081 fprintf( ioPUN, " Ion WL(A) Coef Ion WL(A) Coef\n" );
00082 for( i=0; i<471; i+=nskip)
00083 {
00084
00085 limit = MIN2(471,i+nskip);
00086 fprintf( ioPUN, " " );
00087 for( j=i; j < limit; j++ )
00088 {
00089 fprintf( ioPUN, "%2.2s%2ld%6ld%8.3f ",
00090 elementnames.chElementSym[(long)(LineSave.RecCoefCNO[0][j])-1],
00091 (long)(LineSave.RecCoefCNO[0][j]-LineSave.RecCoefCNO[1][j]+1.01),
00092 (long)(LineSave.RecCoefCNO[2][j]+0.5),
00093 log10(SDIV(LineSave.RecCoefCNO[3][j]) ) );
00094 }
00095 fprintf( ioPUN, " \n" );
00096 }
00097 fprintf( ioPUN, "\n\n" );
00098
00099 dense.eden = 1.;
00100 dense.gas_phase[ipHYDROGEN] = 1.;
00101 dense.EdenHCorr = 1.;
00102
00103
00104 dense.xIonDense[ipHYDROGEN][1] = 1.e-5f;
00105 hmi.Hmolec[ipMH2g] = 0.;
00106 dense.xIonDense[ipHYDROGEN][1] = 1.;
00107 for( i=1; i <= nLevel1; i++ )
00108 {
00109 TauLines[i].Lo->Pop = 1.;
00110 }
00111
00112 for( i=0; i < nWindLine; i++ )
00113 {
00114 TauLine2[i].Lo->Pop = 1.;
00115 }
00116
00117 for( i=0; i < nUTA; i++ )
00118 {
00119 UTALines[i].Lo->Pop = 1.;
00120 }
00121
00122 for( i=0; i < LIMELM; i++ )
00123 {
00124 for( j=0; j < LIMELM+1; j++ )
00125 {
00126 dense.xIonDense[i][j] = 1.;
00127 }
00128 }
00129
00130
00131 CoolEvaluate(&tot);
00132
00133 fprintf( ioPUN, " Level 1 transferred lines\n" );
00134
00135 fprintf( ioPUN, "Ion WL gl gu gf A CS n(crt)\n" );
00136
00137 for( i=1; i <= nLevel1; i++ )
00138 {
00139
00140
00141
00142
00143 Save1LineData( &TauLines[i] , ioPUN , true);
00144 }
00145
00146 fprintf( ioPUN, "\n\n\n" );
00147 fprintf( ioPUN, " end level 1, start level 2\n" );
00148 fprintf( ioPUN, "Ion WL gl gu gf A CS n(crt)\n" );
00149 for( i=0; i < nWindLine; i++ )
00150 {
00151 if( TauLine2[i].Hi->IonStg < TauLine2[i].Hi->nelem+1-NISO )
00152 {
00153 Save1LineData( &TauLine2[i] , ioPUN , true);
00154 }
00155 }
00156
00157 fprintf( ioPUN, "\n\n\n" );
00158 fprintf( ioPUN, " end level 2, start inner shell\n" );
00159 fprintf( ioPUN, "Ion WL gl gu gf A CS n(crt)\n" );
00160
00161 for( i=0; i < nUTA; i++ )
00162 {
00163 Save1LineData( &UTALines[i] , ioPUN , true);
00164 }
00165
00166 fprintf( ioPUN, "\n\n\n" );
00167 fprintf( ioPUN, " end inner shell, start H-like iso seq\n" );
00168 fprintf( ioPUN, "Ion WL gl gu gf A CS n(crt)\n" );
00169
00170
00171
00172 for( nelem=0; nelem < LIMELM; nelem++ )
00173 {
00174 iso_collide( ipH_LIKE, nelem );
00175 if( nelem < 2 || dense.lgElmtOn[nelem] )
00176 {
00177
00178
00179 for( ipLo=ipH1s; ipLo < iso.numLevels_max[ipH_LIKE][nelem]-1; ipLo++ )
00180 {
00181 for( ipHi=ipLo+1; ipHi < iso.numLevels_max[ipH_LIKE][nelem]; ipHi++ )
00182 {
00183 Save1LineData( &Transitions[ipH_LIKE][nelem][ipHi][ipLo] , ioPUN , false );
00184 }
00185 }
00186 }
00187 }
00188
00189 fprintf( ioPUN, "\n\n\n" );
00190 fprintf( ioPUN, " end H-like iso seq, start He-like iso seq\n" );
00191 fprintf( ioPUN, "Ion WL gl gu gf A CS n(crt)\n" );
00192 for( nelem=1; nelem < LIMELM; nelem++ )
00193 {
00194 if( nelem < 2 || dense.lgElmtOn[nelem] )
00195 {
00196
00197 for( ipLo=ipHe1s1S; ipLo < iso.numLevels_max[ipHE_LIKE][nelem]-1; ipLo++ )
00198 {
00199 for( ipHi=ipLo+1; ipHi < iso.numLevels_max[ipHE_LIKE][nelem]; ipHi++ )
00200 {
00201 Save1LineData( &Transitions[ipHE_LIKE][nelem][ipHi][ipLo] , ioPUN , false );
00202 }
00203 }
00204 }
00205 }
00206
00207 fprintf( ioPUN, "\n\n\n" );
00208 fprintf( ioPUN, " end he-like iso seq, start hyperfine structure lines\n" );
00209 fprintf( ioPUN, "Ion WL gl gu gf A CS n(crt)\n" );
00210
00211 for( i=0; i < nHFLines; i++ )
00212 {
00213 Save1LineData( &HFLines[i] , ioPUN , true);
00214 }
00215
00216 fprintf( ioPUN, "\n\n\n" );
00217 fprintf( ioPUN, " end hyperfine, start database lines\n" );
00218 fprintf( ioPUN, "Ion WL gl gu gf A CS n(crt)\n" );
00219
00220 for( i=0; i < linesAdded2; i++ )
00221 {
00222 Save1LineData( dBaseLines[i].tran , ioPUN , true);
00223 }
00224
00225 fprintf( ioPUN, "\n\n\n" );
00226 fprintf( ioPUN, " end database, start satellite lines\n" );
00227 fprintf( ioPUN, "Ion WL gl gu gf A CS n(crt)\n" );
00228 for( long ipISO = ipHE_LIKE; ipISO < NISO; ipISO++ )
00229 {
00230 for( long nelem = ipISO; nelem < LIMELM; nelem++ )
00231 {
00232
00233 if( nelem == ipISO || dense.lgElmtOn[nelem] )
00234 {
00235 for( i=0; i<iso.numLevels_max[ipISO][nelem]; i++ )
00236 {
00237 Save1LineData( &SatelliteLines[ipISO][nelem][i], ioPUN , true );
00238 }
00239 }
00240 }
00241 }
00242
00243
00244 dense.eden = 1e-6;
00245 dense.gas_phase[ipHYDROGEN] = 1e-6f;
00246 dense.EdenHCorr = 1e-6f;
00247 dense.xIonDense[ipHYDROGEN][1] = 1.;
00248 hmi.Hmolec[ipMH2g] = 1.;
00249 hmi.Hmolec[ipMH2s] = 1.;
00250 dense.xIonDense[ipHYDROGEN][1] = 1e-6f;
00251
00252
00253 fprintf( ioPUN, "\n\n\n" );
00254 fprintf( ioPUN, " end satellite, start H2 lines\n" );
00255 fprintf( ioPUN, "Eu Vu Ju El Vl Jl WL gl gu gf A CS n(crt)\n" );
00256
00257
00258
00259 H2_LevelPops();
00260 H2_Punch_line_data( ioPUN , false );
00261
00262
00263 fprintf( ioPUN, "\n\n\n" );
00264 fprintf( ioPUN, " end H2, start FeII lines\n" );
00265 fprintf( ioPUN, " Lo Hi Ion label WL gl gu gf A CS n(crt)\n" );
00266
00267
00268
00269 FeIIPunData( ioPUN , false );
00270
00271
00272
00273 fprintf( ioQQQ , "\n The code is left in a disturbed state after creating the SAVE LINE DATA file.\n"
00274 " No calculation is actually performed, only the SAVE LINE DATA file is produced.\n"
00275 " Remove the SAVE LINE DATA command to do the calculation.\n\n ChkMonitorend is ok.\n" );
00276
00277
00278 cdEXIT(EXIT_SUCCESS);
00279 }
00280
00281
00282 void Save1LineData( transition * t , FILE * ioPUN ,
00283
00284
00285 bool lgCS_2 )
00286 {
00287
00288 double CritDen;
00289
00290 char chLbl[11];
00291
00292 DEBUG_ENTRY( "Save1LineData()" );
00293
00294 if( t->ipCont <= 0 )
00295 {
00296 return;
00297 }
00298
00304
00305
00306 chIonLbl(chLbl , t );
00307 fprintf(ioPUN,"%s\t", chLbl );
00308
00309
00310
00311
00312 prt_wl(ioPUN, t->WLAng );
00313
00314 fprintf( ioPUN, " %3ld%3ld",
00315
00316 (long)(t->Lo->g),
00317 (long)(t->Hi->g) );
00318
00319
00320 fprintf( ioPUN,PrintEfmt("%9.2e", t->Emis->gf));
00321
00322
00323 fprintf( ioPUN,PrintEfmt("%9.2e", t->Emis->Aul));
00324
00325
00326
00327 if( t->Coll.col_str > 100. )
00328 {
00329 fprintf( ioPUN, "%7.1f", t->Coll.col_str );
00330 }
00331 else if( t->Coll.col_str > 10. )
00332 {
00333 fprintf( ioPUN, "%7.2f", t->Coll.col_str );
00334 }
00335 else if( t->Coll.col_str > 1. )
00336 {
00337 fprintf( ioPUN, "%7.3f", t->Coll.col_str );
00338 }
00339 else if( t->Coll.col_str > .01 )
00340 {
00341 fprintf( ioPUN, "%7.4f", t->Coll.col_str );
00342 }
00343 else if( t->Coll.col_str > 0.0 )
00344 {
00345 fprintf( ioPUN, " %.3e", t->Coll.col_str );
00346 }
00347 else
00348 {
00349 fprintf( ioPUN, "%7.4f", 0. );
00350 }
00351
00352
00353
00354
00355 if( lgCS_2 && t->Coll.col_str> 0. )
00356 {
00357 CritDen = t->Emis->Aul * t->Hi->g*phycon.sqrte / (t->Coll.col_str*COLL_CONST);
00358 CritDen = log10(CritDen);
00359 }
00360 else
00361 {
00362 CritDen = 0.;
00363 }
00364 fprintf( ioPUN, "%7.3f\n",CritDen );
00365 return;
00366 }