00001
00002
00003
00004 #include "cddefines.h"
00005 #include "taulines.h"
00006 #include "hydrogenic.h"
00007 #include "phycon.h"
00008 #include "iso.h"
00009 #include "rfield.h"
00010 #include "parse.h"
00011
00012 void ParseAtomHLike(char *chCard )
00013 {
00014 bool lgEOL;
00015 long int i ,
00016 nh ,
00017 nelem;
00018
00019 DEBUG_ENTRY( "ParseAtomHLike()" );
00020
00021 if( nMatch("COLL",chCard) )
00022 {
00023
00024
00025 if( nMatch("EXCI",chCard) )
00026 {
00027
00028 iso.lgColl_excite[ipH_LIKE] = false;
00029 phycon.lgPhysOK = false;
00030 }
00031 else if( nMatch("IONI",chCard) )
00032 {
00033
00034 iso.lgColl_ionize[ipH_LIKE] = false;
00035 phycon.lgPhysOK = false;
00036 }
00037
00038 else if( nMatch("2S2P",chCard) || nMatch("2P2S",chCard) )
00039 {
00040
00041
00042 fprintf(ioQQQ,"This command changed to ATOM H-LIKE COLLISIONS L-MIXING\n");
00043 fprintf(ioQQQ,"I will parse it for now, but may not in the future.\n");
00044
00045 iso.lgColl_l_mixing[ipH_LIKE] = false;
00046 phycon.lgPhysOK = false;
00047 }
00048
00049 else if( nMatch("L-MI",chCard) )
00050 {
00051
00052
00053 iso.lgColl_l_mixing[ipH_LIKE] = false;
00054 phycon.lgPhysOK = false;
00055 }
00056 else
00057 {
00058
00059 iso.lgColl_excite[ipH_LIKE] = false;
00060 iso.lgColl_ionize[ipH_LIKE] = false;
00061 iso.lgColl_l_mixing[ipH_LIKE] = false;
00062 phycon.lgPhysOK = false;
00063 }
00064 }
00065
00066 else if( nMatch("DAMP",chCard) )
00067 {
00068
00069 hydro.DampOnFac = 0.;
00070 }
00071
00072 else if( nMatch("EMIS",chCard) )
00073 {
00074
00075 hydro.lgHydEmiss = true;
00076 }
00077
00078 else if( nMatch("LEVE",chCard) )
00079 {
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 if( !lgHydroMalloc )
00090 {
00091 i = 5;
00092 nh = (long int)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00093
00094 if( lgEOL )
00095 {
00096
00097
00098 if( nMatch("LARG",chCard) )
00099 {
00100
00101 nh = 50;
00102 }
00103
00104
00105 else if( nMatch("SMAL",chCard) || nMatch("COMP",chCard) )
00106 {
00107 if( nMatch("VERY" , chCard ) )
00108 {
00109
00110 nh = 5;
00111 }
00112 else
00113 {
00114
00115 nh = 10;
00116 }
00117 }
00118
00119
00120 else if( nMatch("LIMI",chCard) )
00121 {
00122 nh = NHYDRO_MAX_LEVEL-2;
00123 }
00124
00125 else
00126 {
00127
00128 NoNumb(chCard);
00129 }
00130 }
00131
00132 if( nh < 5 )
00133 {
00134 fprintf( ioQQQ, " ParseAtomHLike %li would be too few levels.\n" , nh );
00135 puts( "[Stop in ParseAtomHLike]" );
00136 cdEXIT(EXIT_FAILURE);
00137 }
00138
00139 if( nh > NHYDRO_MAX_LEVEL-2 )
00140 {
00141 fprintf( ioQQQ, " Not possible to set nhlvl to >NHYDRO_MAX_LEVEL-2= %i\n",
00142 NHYDRO_MAX_LEVEL-2 );
00143 fprintf( ioQQQ, " change NHYDRO_MAX_LEVEL\n");
00144 puts( "[Stop in ParseAtomHLike]" );
00145 cdEXIT(EXIT_FAILURE);
00146 }
00147
00148
00149
00150 if( 2. / POW3((double)nh) < rfield.emm )
00151 {
00152 fprintf( ioQQQ, " Not possible to set iso.numLevels_max[ipH_LIKE][ipHYDROGEN] to such a high value, since "
00153 "alpha transition not within energy bounds of code\n");
00154
00155 fprintf( ioQQQ, " lowest energy is %e and corresponding highest level is %li\n" ,
00156 rfield.emm, (long)pow(2./rfield.emm, 0.3333) );
00157 puts( "[Stop in ParseAtomHLike]" );
00158 cdEXIT(EXIT_FAILURE);
00159 }
00160
00161
00162
00163
00164 if( nMatch("ELEM",chCard) )
00165 {
00166
00167 nelem = GetElem(chCard);
00168
00169 iso.n_HighestResolved_max[ipH_LIKE][nelem] = nh;
00170
00171
00172 iso.numLevels_max[ipH_LIKE][nelem] = nh+1;
00173 iso.numPrintLevels[ipH_LIKE][nelem] = nh;
00174
00175 iso.nTopOff[ipH_LIKE][nelem] = MIN2(nh-1,iso.nTopOff[ipH_LIKE][nelem]);
00176 }
00177 else
00178 {
00179
00180 for( nelem=ipHYDROGEN; nelem<LIMELM; ++nelem )
00181 {
00182 iso.n_HighestResolved_max[ipH_LIKE][nelem] = nh;
00183 iso.numLevels_max[ipH_LIKE][nelem] = nh+1;
00184 iso.numPrintLevels[ipH_LIKE][nelem] = nh;
00185
00186 iso.nTopOff[ipH_LIKE][nelem] = MIN2(nh-1,iso.nTopOff[ipH_LIKE][nelem]);
00187 }
00188 }
00189 }
00190 }
00191
00192 else if( nMatch("LYMA",chCard) )
00193 {
00194 if( nMatch("PUMP",chCard) )
00195 {
00196
00197 if( nMatch(" OFF",chCard) )
00198 {
00199
00200 hydro.lgLymanPumping = false;
00201 }
00202 else if( nMatch("SCALE",chCard) )
00203 {
00204
00205
00206 i = 5;
00207 hydro.xLymanPumpingScaleFactor =
00208 (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00209
00210 if( hydro.xLymanPumpingScaleFactor < 0. )
00211 hydro.xLymanPumpingScaleFactor =
00212 (float)pow( 10.f , hydro.xLymanPumpingScaleFactor );
00213 }
00214 else
00215 {
00216 fprintf(ioQQQ," Sorry, I didn\'t recognize an option on this ATOM H-LIKE LYMAN PUMP command.\n");
00217 fprintf(ioQQQ," The options are \" OFF\", and \"SCALE\".\n");
00218 puts( "[Stop in ParseAtomHLike]" );
00219 cdEXIT(EXIT_FAILURE);
00220 }
00221 }
00222 else if( nMatch("EXTR",chCard) )
00223 {
00224
00225 i = 5;
00226 iso.nLyman[ipH_LIKE] = (long int)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00227 if( lgEOL )
00228 NoNumb(chCard);
00229 }
00230 else
00231 {
00232 fprintf(ioQQQ," Sorry, I didn\'t recognize an option on this ATOM H-LIKE LYMAN command.\n");
00233 fprintf(ioQQQ," The options are \"PUMPING\", and \"EXTRA\".\n");
00234 puts( "[Stop in ParseAtomHLike]" );
00235 cdEXIT(EXIT_FAILURE);
00236 }
00237 }
00238
00239 else if( nMatch("REDI",chCard) )
00240 {
00241 int ipRedis=0;
00242
00243
00244
00245
00246
00247 if( nMatch(" PRD",chCard) )
00248 {
00249 ipRedis = ipPRD;
00250 }
00251
00252 else if( nMatch(" CRD",chCard) )
00253 {
00254 ipRedis = ipCRD;
00255 }
00256
00257 else if( nMatch("CRDW",chCard) )
00258 {
00259 ipRedis = ipCRDW;
00260 }
00261
00262
00263 else if( !nMatch("SHOW",chCard) )
00264 {
00265 fprintf(ioQQQ," There should have been a second keyword on this command.\n");
00266 fprintf(ioQQQ," Options are _PRD, _CRD, CRDW (_ is space). Sorry.\n");
00267 puts( "[Stop in ParseAtomHLike]" );
00268 cdEXIT(EXIT_FAILURE);
00269 }
00270
00271
00272 if( nMatch("ALPH",chCard) )
00273 {
00274 iso.ipLyaRedist[ipH_LIKE] = ipRedis;
00275 }
00276
00277 if( nMatch("RESO",chCard) )
00278 {
00279 iso.ipResoRedist[ipH_LIKE] = ipRedis;
00280 }
00281
00282 else if( nMatch("SUBO",chCard) )
00283 {
00284 iso.ipSubRedist[ipH_LIKE] = ipRedis;
00285 }
00286
00287 else if( nMatch("SHOW",chCard) )
00288 {
00289 fprintf(ioQQQ," Ly a is ");
00290 if( iso.ipLyaRedist[ipH_LIKE] ==ipCRDW )
00291 {
00292 fprintf(ioQQQ,"complete redistribution with wings\n");
00293 }
00294 else if( iso.ipLyaRedist[ipH_LIKE] ==ipCRD )
00295 {
00296 fprintf(ioQQQ,"complete redistribution with core only.\n");
00297 }
00298 else if( iso.ipLyaRedist[ipH_LIKE] ==ipPRD )
00299 {
00300 fprintf(ioQQQ,"partial redistribution.\n");
00301 }
00302 else if( iso.ipLyaRedist[ipH_LIKE] ==ipLY_A )
00303 {
00304 fprintf(ioQQQ,"special Lya.\n");
00305 }
00306 else
00307 {
00308 fprintf(ioQQQ," PROBLEM Impossible value for iso.ipLyaRedist.\n");
00309 TotalInsanity();
00310 }
00311
00312 fprintf(ioQQQ," Other H resonance lines are ");
00313 if( iso.ipResoRedist[ipH_LIKE] ==ipCRDW )
00314 {
00315 fprintf(ioQQQ,"complete redistribution with wings\n");
00316 }
00317 else if( iso.ipResoRedist[ipH_LIKE] ==ipCRD )
00318 {
00319 fprintf(ioQQQ,"complete redistribution with core only.\n");
00320 }
00321 else if( iso.ipResoRedist[ipH_LIKE] ==ipPRD )
00322 {
00323 fprintf(ioQQQ,"partial redistribution.\n");
00324 }
00325 else
00326 {
00327 fprintf(ioQQQ," PROBLEM Impossible value for iso.ipResoRedist.\n");
00328 TotalInsanity();
00329 }
00330
00331 fprintf(ioQQQ," H subordinate lines are ");
00332 if( iso.ipSubRedist[ipH_LIKE] ==ipCRDW )
00333 {
00334 fprintf(ioQQQ,"complete redistribution with wings\n");
00335 }
00336 else if( iso.ipSubRedist[ipH_LIKE] ==ipCRD )
00337 {
00338 fprintf(ioQQQ,"complete redistribution with core only.\n");
00339 }
00340 else if( iso.ipSubRedist[ipH_LIKE] ==ipPRD )
00341 {
00342 fprintf(ioQQQ,"partial redistribution.\n");
00343 }
00344 else
00345 {
00346 fprintf(ioQQQ," PROBLEM Impossible value for iso.ipSubRedist.\n");
00347 TotalInsanity();
00348 }
00349 }
00350 else
00351 {
00352 fprintf(ioQQQ," here should have been another keyword on this command.\n");
00353 fprintf(ioQQQ," Options are ALPHA, RESONANCE, SUBORDINATE. Sorry.\n");
00354 puts( "[Stop in ParseAtomHLike]" );
00355 cdEXIT(EXIT_FAILURE);
00356 }
00357 }
00358
00359 else if( nMatch("TOPO",chCard) )
00360 {
00361
00362 i = 5;
00363 iso.nTopOff[ipH_LIKE][ipHYDROGEN] = (long int)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00364
00365 if( iso.nTopOff[ipH_LIKE][ipHYDROGEN] > iso.numLevels_max[ipH_LIKE][ipHYDROGEN] )
00366 {
00367 fprintf( ioQQQ, " Not possible to set nHTopOff to more than nhlvl=%4ld\n",
00368 iso.numLevels_max[ipH_LIKE][ipHYDROGEN] );
00369 fprintf( ioQQQ, " change nhlvl first with ATOM H-LIKE LEVELS command\n");
00370 puts( "[Stop in ParseAtomHLike]" );
00371 cdEXIT(EXIT_FAILURE);
00372 }
00373
00374 if( lgEOL )
00375 {
00376 NoNumb(chCard);
00377 }
00378
00379 if( nMatch(" ADD",chCard) )
00380 {
00381
00382 strcpy( hydro.chHTopType, " add" );
00383 }
00384 else if( nMatch("SCAL",chCard) )
00385 {
00386
00387 strcpy( hydro.chHTopType, "scal" );
00388 }
00389 else
00390 {
00391
00392 strcpy( hydro.chHTopType, " add" );
00393 }
00394 }
00395
00396
00397 else if( nMatch("MATR",chCard) )
00398 {
00399 if( nMatch(" POP",chCard) )
00400 {
00401 strcpy( iso.chTypeAtomSet[ipH_LIKE] , "POPU" );
00402 }
00403 else if( nMatch(" LOW",chCard) )
00404 {
00405 strcpy( iso.chTypeAtomSet[ipH_LIKE] , "LOWT" );
00406 }
00407 else
00408 {
00409 fprintf( ioQQQ, " There should have been a keyword on the MATRIX option.\n");
00410 fprintf( ioQQQ, " The keywords are POPulations, and LOWte.\n");
00411 fprintf( ioQQQ, " Stop in ParseAtomHLike\n" );
00412 puts( "[Stop in ParseAtomHLike]" );
00413 cdEXIT(EXIT_FAILURE);
00414 }
00415 }
00416
00417 else
00418 {
00419 fprintf( ioQQQ, " There should have been a keyword - Stop in ParseAtomHLike\n" );
00420 puts( "[Stop in ParseAtomHLike]" );
00421 cdEXIT(EXIT_FAILURE);
00422 }
00423
00424 DEBUG_EXIT( "ParseAtomHLike()" );
00425 return;
00426 }
00427