00001
00002
00003
00004 #include "cddefines.h"
00005 #include "elementnames.h"
00006 #include "optimize.h"
00007 #include "hydrogenic.h"
00008 #include "input.h"
00009 #include "iso.h"
00010 #include "parser.h"
00011 #include "phycon.h"
00012 #include "rfield.h"
00013 #include "taulines.h"
00014 #include "thirdparty.h"
00015
00016
00017 void ParseAtomISO(long ipISO, Parser &p )
00018 {
00019 long int
00020 numLevels,
00021 nelem;
00022
00023 DEBUG_ENTRY( "ParseAtomISO()" );
00024
00025
00026
00027 nelem = p.GetElem( );
00028
00029
00030 if( ipISO==ipHE_LIKE && nelem==ipHYDROGEN )
00031 {
00032 fprintf(ioQQQ," Sorry, H-like He does not exist.\n");
00033 cdEXIT(EXIT_FAILURE);
00034 }
00035
00036
00037 if( p.nMatch("COLL") && !p.nMatch("LEVE" ) )
00038 {
00039
00040
00041 if( p.nMatch("EXCI") )
00042 {
00043
00044 iso.lgColl_excite[ipISO] = false;
00045 phycon.lgPhysOK = false;
00046 }
00047 else if( p.nMatch("IONI") )
00048 {
00049
00050 iso.lgColl_ionize[ipISO] = false;
00051 phycon.lgPhysOK = false;
00052 }
00053
00054 else if( p.nMatch("2S2P") || ( p.nMatch("2P2S") && ipISO == ipH_LIKE ) )
00055 {
00056
00057
00058 fprintf(ioQQQ,"This command changed to ATOM H-LIKE COLLISIONS L-MIXING\n");
00059 fprintf(ioQQQ,"I will parse it for now, but may not in the future.\n");
00060
00061 iso.lgColl_l_mixing[ipISO] = false;
00062 phycon.lgPhysOK = false;
00063 }
00064
00065 else if( p.nMatch("L-MI") )
00066 {
00067 if( ipISO == ipH_LIKE )
00068 {
00069
00070
00071 iso.lgColl_l_mixing[ipISO] = false;
00072 phycon.lgPhysOK = false;
00073 }
00074 else if( p.nMatch("THER") )
00075 {
00076
00077
00078 if( p.nMatch("NO T") )
00079 {
00080
00081
00082
00083 iso.lgCS_therm_ave[ipISO] = false;
00084 }
00085 else
00086 {
00087 iso.lgCS_therm_ave[ipISO] = true;
00088 }
00089 }
00090 else if( p.nMatch("PENG") )
00091 {
00092 iso.lgCS_Vrinceanu[ipISO] = false;
00093 }
00094 else if( p.nMatch(" OFF" ) )
00095 {
00096
00097
00098 iso.lgColl_l_mixing[ipISO] = false;
00099 phycon.lgPhysOK = false;
00100 iso.lgCS_Vrinceanu[ipISO] = false;
00101 iso.lgCS_therm_ave[ipISO] = false;
00102 }
00103 else
00104 {
00105 fprintf( ioQQQ, " needs parameter\n" );
00106 cdEXIT(EXIT_FAILURE);
00107 }
00108 }
00109 else if( p.nMatch(" OFF" ) )
00110 {
00111
00112 iso.lgColl_excite[ipISO] = false;
00113 iso.lgColl_ionize[ipISO] = false;
00114 iso.lgColl_l_mixing[ipISO] = false;
00115 phycon.lgPhysOK = false;
00116 }
00117 else
00118 {
00119 fprintf( ioQQQ, " needs parameter\n" );
00120 cdEXIT(EXIT_FAILURE);
00121 }
00122 }
00123
00124 else if( p.nMatch("CONT") && p.nMatch("LOWE") )
00125 {
00126
00127 if( p.nMatch("OFF") )
00128 iso.lgContinuumLoweringEnabled[ipISO] = false;
00129 else
00130 iso.lgContinuumLoweringEnabled[ipISO] = true;
00131 }
00132
00133 else if( p.nMatch("DAMP") )
00134 {
00135 if( ipISO == ipHE_LIKE )
00136 {
00137 fprintf(ioQQQ," Sorry, the DAMPING option is not implemented for the he-like sequence.\n");
00138 cdEXIT(EXIT_FAILURE);
00139 }
00140
00141
00142 hydro.DampOnFac = 0.;
00143 }
00144
00145 else if( p.nMatch("DIEL") )
00146 {
00147 if( ipISO == ipH_LIKE )
00148 {
00149 fprintf(ioQQQ," Sorry, but dielectronic recombination onto the h-like sequence is not possible.\n");
00150 cdEXIT(EXIT_FAILURE);
00151 }
00152
00153
00154 if( p.nMatch(" OFF") )
00155 {
00156 iso.lgDielRecom[ipISO] = false;
00157 }
00158 else
00159 iso.lgDielRecom[ipISO] = true;
00160 }
00161
00162 else if( p.nMatch("LEVE") )
00163 {
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 if( p.nMatch("PRIN") )
00177 {
00178
00179 iso.lgPrintNumberOfLevels = true;
00180 }
00181 else if( !lgHydroMalloc )
00182 {
00183 numLevels = (long int)p.FFmtRead();
00184
00185 if( p.lgEOL() )
00186 {
00187
00188
00189 if( p.nMatch("LARG") )
00190 {
00191
00192 numLevels = RREC_MAXN;
00193 }
00194
00195
00196 else if( p.nMatch("SMAL") || p.nMatch("COMP") )
00197 {
00198 if( ipISO == ipH_LIKE )
00199 numLevels = 5;
00200 else if( ipISO == ipHE_LIKE )
00201 numLevels = 3;
00202 }
00203
00204 else
00205
00206 p.NoNumb("levels");
00207 }
00208 else if( ( numLevels < 3 ) && !p.nMatch("COLL") )
00209 {
00210
00211 fprintf( ioQQQ, " cannot have fewer than 3 levels, the requested number was %li\n" ,
00212 numLevels );
00213 fprintf( ioQQQ, " Sorry.\n" );
00214 cdEXIT(EXIT_FAILURE);
00215 }
00216
00217 if( ipISO == ipH_LIKE && numLevels > NHYDRO_MAX_LEVEL-2 )
00218 {
00219 fprintf( ioQQQ, " Not possible to set nhlvl to >NHYDRO_MAX_LEVEL-2= %i\n",
00220 NHYDRO_MAX_LEVEL-2 );
00221 fprintf( ioQQQ, " change NHYDRO_MAX_LEVEL\n");
00222 cdEXIT(EXIT_FAILURE);
00223 }
00224
00225
00226
00227 if( ipISO == ipH_LIKE &&
00228 ( 2. / POW3((double)numLevels) < rfield.emm ) )
00229 {
00230 fprintf( ioQQQ, " Not possible to set iso.numLevels_max[ipH_LIKE][ipHYDROGEN] to such a high value, since "
00231 "alpha transition not within energy bounds of code\n");
00232
00233 fprintf( ioQQQ, " lowest energy is %e and corresponding highest level is %li\n" ,
00234 rfield.emm, (long)pow(2./rfield.emm, 0.3333) );
00235 cdEXIT(EXIT_FAILURE);
00236 }
00237
00238 if( p.nMatch("COLL") )
00239 {
00240 if( numLevels < 1 )
00241 {
00242 fprintf( ioQQQ, "There must be at least one collapsed level.\n");
00243 cdEXIT(EXIT_FAILURE);
00244 }
00245
00246
00247 if( p.nMatch("ELEM") )
00248 {
00249
00250 nelem = p.GetElem();
00251 iso.nCollapsed_max[ipISO][nelem] = numLevels;
00252 iso_update_num_levels( ipISO, nelem );
00253 }
00254 else
00255 {
00256
00257 for( nelem=ipISO; nelem<LIMELM; ++nelem )
00258 {
00259 iso.nCollapsed_max[ipISO][nelem] = numLevels;
00260 iso_update_num_levels( ipISO, nelem );
00261 }
00262 }
00263 }
00264
00265
00266
00267
00268 else if( p.nMatch("ELEM") )
00269 {
00270
00271 nelem = p.GetElem();
00272 iso.n_HighestResolved_max[ipISO][nelem] = numLevels;
00273 iso_update_num_levels( ipISO, nelem );
00274 }
00275 else
00276 {
00277
00278 for( nelem=ipISO; nelem<LIMELM; ++nelem )
00279 {
00280 iso.n_HighestResolved_max[ipISO][nelem] = numLevels;
00281 iso_update_num_levels( ipISO, nelem );
00282 }
00283 }
00284 }
00285 }
00286
00287 else if( p.nMatch("ERRO") && p.nMatch("GENE" ) )
00288 {
00289
00290
00291 iso.lgRandErrGen[ipISO] = true;
00292 iso.modelRank[ipISO] = (int)p.FFmtRead();
00293
00294 iso.modelRank[ipISO] = MAX2( 0, iso.modelRank[ipISO] );
00295 if( p.lgEOL() )
00296
00297
00298 iso.modelRank[ipISO] = abs((int)time(NULL));
00299
00300
00301
00302
00303 init_genrand( (unsigned)iso.modelRank[ipISO] + 2);
00304
00305 if( p.nMatch("PESS") )
00306 iso.lgPessimisticErrors = true;
00307 else
00308 iso.lgPessimisticErrors = false;
00309 }
00310
00311 else if( p.nMatch(" FSM") )
00312 {
00313 if( ipISO == ipH_LIKE )
00314 {
00315 fprintf(ioQQQ," Sorry, but fine-structure mixing can only be implemented for the He-like sequence.\n");
00316 cdEXIT(EXIT_FAILURE);
00317 }
00318
00319
00320
00321 if( p.nMatch(" OFF") )
00322 iso.lgFSM[ipISO] = false;
00323 else
00324 iso.lgFSM[ipISO] = true;
00325 }
00326
00327 else if( p.nMatch("GBAR") )
00328 {
00329 if( ipISO == ipH_LIKE )
00330 {
00331 fprintf(ioQQQ," Sorry, the GBAR option is only implemented for the He-like sequence.\n");
00332 cdEXIT(EXIT_FAILURE);
00333 }
00334
00335
00336
00337 iso.lgCS_Vriens[ipISO] = false;
00338 iso.lgCS_None[ipISO] = false;
00339 iso.nCS_new[ipISO] = false;
00340
00341
00342 if( p.nMatch("VRIE") )
00343 {
00344
00345 iso.lgCS_Vriens[ipISO] = true;
00346 }
00347 else if( p.nMatch(" NEW") )
00348 {
00349
00350 iso.nCS_new[ipISO] = (int)p.FFmtRead();
00351
00352
00353
00354 if( p.lgEOL() )
00355 iso.nCS_new[ipISO] = 1;
00356
00357 ASSERT( iso.nCS_new[ipISO] );
00358 }
00359 else if( p.nMatch(" OFF") )
00360 {
00361
00362 iso.lgCS_None[ipISO] = true;
00363 }
00364 else
00365 {
00366 fprintf( ioQQQ, " needs parameter\n" );
00367 cdEXIT(EXIT_FAILURE);
00368 }
00369 }
00370
00371
00372 else if( p.nMatch("LYMA") )
00373 {
00374 if( ipISO == ipH_LIKE && p.nMatch("PUMP") )
00375 {
00376
00377 if( p.nMatch(" OFF") )
00378 {
00379
00380 hydro.lgLymanPumping = false;
00381 }
00382 else if( p.nMatch("SCALE") )
00383 {
00384
00385
00386
00387 hydro.xLymanPumpingScaleFactor =
00388 (realnum)p.FFmtRead();
00389
00390
00391
00392 if( hydro.xLymanPumpingScaleFactor <= 0. ||
00393 p.nMatch(" LOG") )
00394 {
00395 hydro.xLymanPumpingScaleFactor =
00396 (realnum)pow((realnum)10.f , hydro.xLymanPumpingScaleFactor );
00397 }
00398
00399
00400 if( optimize.lgVarOn )
00401 {
00402 optimize.nvarxt[optimize.nparm] = 1;
00403 strcpy( optimize.chVarFmt[optimize.nparm], "ATOM H-LIKE LYMAN PUMPING SCALE %f LOG" );
00404
00405
00406 optimize.nvfpnt[optimize.nparm] = input.nRead;
00407
00408
00409 optimize.vincr[optimize.nparm] = 0.1f;
00410 optimize.vparm[0][optimize.nparm] = (realnum)log10(hydro.xLymanPumpingScaleFactor);
00411 ++optimize.nparm;
00412 }
00413 }
00414 else
00415 {
00416 fprintf(ioQQQ," Sorry, I didn\'t recognize an option on this ATOM H-LIKE LYMAN PUMP command.\n");
00417 fprintf(ioQQQ," The options are \" OFF\", and \"SCALE\".\n");
00418 cdEXIT(EXIT_FAILURE);
00419 }
00420 }
00421 else
00422 {
00423
00424 iso.nLyman[ipISO] = (long int)p.FFmtRead();
00425 if( p.lgEOL() )
00426 p.NoNumb("'extra' Lyman lines");
00427 }
00428 }
00429
00430
00431 else if( p.nMatch("RECO") &&
00432 p.nMatch(" NO ") && p.nMatch("INTE") )
00433 {
00434
00435
00436
00437 iso.lgNoRecombInterp[ipISO] = true;
00438 }
00439
00440 else if( p.nMatch("REDI") )
00441 {
00442 int ipRedis=0;
00443
00444
00445
00446
00447
00448 if( p.nMatch(" PRD") )
00449 {
00450 ipRedis = ipPRD;
00451 }
00452
00453 else if( p.nMatch(" CRD") )
00454 {
00455 ipRedis = ipCRD;
00456 }
00457
00458 else if( p.nMatch("CRDW") )
00459 {
00460 ipRedis = ipCRDW;
00461 }
00462
00463
00464 else if( !p.nMatch("SHOW") )
00465 {
00466 fprintf(ioQQQ," There should have been a second keyword on this command.\n");
00467 fprintf(ioQQQ," Options are _PRD, _CRD, CRDW (_ is space). Sorry.\n");
00468 cdEXIT(EXIT_FAILURE);
00469 }
00470
00471
00472 if( p.nMatch("ALPH") )
00473 {
00474 iso.ipLyaRedist[ipISO] = ipRedis;
00475 }
00476
00477 else if( p.nMatch("RESO") )
00478 {
00479 iso.ipResoRedist[ipISO] = ipRedis;
00480 }
00481
00482 else if( p.nMatch("SUBO") )
00483 {
00484 iso.ipSubRedist[ipISO] = ipRedis;
00485 }
00486
00487 else if( p.nMatch("SHOW") )
00488 {
00489 fprintf(ioQQQ," Ly a is ");
00490 if( iso.ipLyaRedist[ipISO] ==ipCRDW )
00491 {
00492 fprintf(ioQQQ,"complete redistribution with wings\n");
00493 }
00494 else if( iso.ipLyaRedist[ipISO] ==ipCRD )
00495 {
00496 fprintf(ioQQQ,"complete redistribution with core only.\n");
00497 }
00498 else if( iso.ipLyaRedist[ipISO] ==ipPRD )
00499 {
00500 fprintf(ioQQQ,"partial redistribution.\n");
00501 }
00502 else if( iso.ipLyaRedist[ipISO] ==ipLY_A )
00503 {
00504 fprintf(ioQQQ,"special Lya.\n");
00505 }
00506 else
00507 {
00508 fprintf(ioQQQ," PROBLEM Impossible value for iso.ipLyaRedist.\n");
00509 TotalInsanity();
00510 }
00511
00512 fprintf(ioQQQ," Other %s resonance lines are ",
00513 elementnames.chElementSym[ipISO] );
00514
00515 if( iso.ipResoRedist[ipISO] ==ipCRDW )
00516 {
00517 fprintf(ioQQQ,"complete redistribution with wings\n");
00518 }
00519 else if( iso.ipResoRedist[ipISO] ==ipCRD )
00520 {
00521 fprintf(ioQQQ,"complete redistribution with core only.\n");
00522 }
00523 else if( iso.ipResoRedist[ipISO] ==ipPRD )
00524 {
00525 fprintf(ioQQQ,"partial redistribution.\n");
00526 }
00527 else
00528 {
00529 fprintf(ioQQQ," PROBLEM Impossible value for iso.ipResoRedist.\n");
00530 TotalInsanity();
00531 }
00532
00533 fprintf(ioQQQ," %s subordinate lines are ",
00534 elementnames.chElementSym[ipISO] );
00535
00536 if( iso.ipSubRedist[ipISO] ==ipCRDW )
00537 {
00538 fprintf(ioQQQ,"complete redistribution with wings\n");
00539 }
00540 else if( iso.ipSubRedist[ipISO] ==ipCRD )
00541 {
00542 fprintf(ioQQQ,"complete redistribution with core only.\n");
00543 }
00544 else if( iso.ipSubRedist[ipISO] ==ipPRD )
00545 {
00546 fprintf(ioQQQ,"partial redistribution.\n");
00547 }
00548 else
00549 {
00550 fprintf(ioQQQ," PROBLEM Impossible value for iso.ipSubRedist.\n");
00551 TotalInsanity();
00552 }
00553 }
00554 else
00555 {
00556 fprintf(ioQQQ," here should have been another keyword on this command.\n");
00557 fprintf(ioQQQ," Options are ALPHA, RESONANCE, SUBORDINATE. Sorry.\n");
00558 cdEXIT(EXIT_FAILURE);
00559 }
00560 }
00561
00562
00563 else if( p.nMatch("MATR") )
00564 {
00565 fprintf( ioQQQ, " This command is no longer supported. It has no effect.\n" );
00566 }
00567
00568 else if( p.nMatch("TOPO") )
00569 {
00570 if( ipISO == ipH_LIKE )
00571 {
00572 fprintf( ioQQQ, " The behavior of the TOPOFF option for the H-like sequence has changed since version 07.02.\n");
00573 fprintf( ioQQQ, " Originally, it accepted a number and distributed \"topoff\" equally into that many levels at the top of the model.\n");
00574 fprintf( ioQQQ, " Now, the option works the same as in the He-like sequence, which is to turn topoff on or (with keyword _OFF) off.\n" );
00575 }
00576
00577 if( p.nMatch(" OFF") )
00578 {
00579 iso.lgTopoff[ipISO] = false;
00580 fprintf( ioQQQ, "ISO %li TOPOFF is OFF\n", ipISO );
00581 }
00582 else
00583 iso.lgTopoff[ipISO] = true;
00584 }
00585
00586
00587 else
00588 {
00589 fprintf( ioQQQ, " There should have been a keyword - STOP\n" );
00590 cdEXIT(EXIT_FAILURE);
00591 }
00592 return;
00593 }