00001
00002
00003
00004 #include "cddefines.h"
00005 #include "physconst.h"
00006 #include "optimize.h"
00007 #include "phycon.h"
00008 #include "predcont.h"
00009 #include "rfield.h"
00010 #include "radius.h"
00011 #include "geometry.h"
00012 #include "iterations.h"
00013 #include "stopcalc.h"
00014 #include "input.h"
00015 #include "parser.h"
00016
00017 void ParseStop(Parser &p)
00018 {
00019 long int j;
00020
00021 double effcol,
00022 tread;
00023
00024 DEBUG_ENTRY( "ParseStop()" );
00025
00026
00027
00028 bool lgStopZone = true;
00029 if( p.nMatch("TIME") )
00030 lgStopZone = false;
00031
00032 if( p.nMatch("TEMP") )
00033 {
00034 double a = p.FFmtRead();
00035
00036 if( p.lgEOL() && !p.nMatch(" OFF") )
00037 {
00038 p.NoNumb("temperature");
00039 }
00040
00041
00042 if( p.lgEOL() && p.nMatch(" OFF") )
00043 {
00044
00045
00046
00047 if( lgStopZone )
00048 StopCalc.TempLoStopZone = -1.f;
00049 else
00050 StopCalc.TempLoStopIteration = -1.f;
00051 }
00052 else
00053 {
00054
00055
00056
00057 if( a <= 10. && !p.nMatch("LINE") )
00058 {
00059 tread = pow(10.,a);
00060 }
00061 else
00062 {
00063 tread = a;
00064 }
00065
00066
00067 if( tread < phycon.TEMP_LIMIT_LOW )
00068 {
00069 fprintf( ioQQQ,
00070 " Temperatures below %.2e K not allowed. Reset to lowest value."
00071 " I am doing this myself.\n" ,
00072 phycon.TEMP_LIMIT_LOW );
00073
00074 tread = phycon.TEMP_LIMIT_LOW*1.01;
00075 }
00076 else if( tread > phycon.TEMP_LIMIT_HIGH )
00077 {
00078 fprintf( ioQQQ,
00079 " Temperatures is above %.2e K not allowed. Reset to highest value."
00080 " I am doing this myself.\n" ,
00081 phycon.TEMP_LIMIT_HIGH);
00082
00083 tread = phycon.TEMP_LIMIT_HIGH*0.99;
00084 }
00085
00086 if( p.nMatch("EXCE") )
00087 {
00088
00089
00090 if( lgStopZone )
00091 StopCalc.TempHiStopZone = (realnum)tread;
00092 else
00093 StopCalc.TempHiStopIteration = (realnum)tread;
00094 }
00095 else
00096 {
00097
00098
00099 if( lgStopZone )
00100 StopCalc.TempLoStopZone = (realnum)tread;
00101 else
00102 StopCalc.TempLoStopIteration = (realnum)tread;
00103 }
00104 }
00105 }
00106
00107
00108 else if( p.nMatch("OPTI") && p.nMatch("21CM") )
00109 {
00110
00111 bool lgLOG = true;
00112 if( p.nMatch("LINE") )
00113 {
00114
00115 lgLOG = false;
00116 }
00117 j = (long int)p.FFmtRead();
00118 if( j!=21 )
00119 {
00120 fprintf( ioQQQ, " First number on STOP 21CM OPTICAL DEPTH command must be 21\n" );
00121 cdEXIT(EXIT_FAILURE);
00122 }
00123
00124 double a = (long int)p.FFmtRead();
00125
00126
00127 if( lgLOG )
00128 {
00129 StopCalc.tauend = (realnum)pow(10.,a);
00130 }
00131 else
00132 {
00133 StopCalc.tauend = (realnum)a;
00134 }
00135
00136 StopCalc.lgStop21cm = true;
00137 }
00138
00139 else if( p.nMatch("OPTI") )
00140 {
00141 double a = p.FFmtRead();
00142
00143 if( p.lgEOL() && !p.nMatch(" OFF") )
00144 {
00145 p.NoNumb("optical depth");
00146 }
00147
00148
00149 bool lgLOG = true;
00150 if( p.nMatch("LINE") )
00151 {
00152
00153 lgLOG = false;
00154 }
00155
00156 if( a > 37. )
00157 {
00158 fprintf( ioQQQ, " optical depth too big\n" );
00159 cdEXIT(EXIT_FAILURE);
00160 }
00161
00162
00163 if( lgLOG )
00164 {
00165 StopCalc.tauend = (realnum)pow(10.,a);
00166 }
00167 else
00168 {
00169 StopCalc.tauend = (realnum)a;
00170 }
00171
00172
00173 StopCalc.taunu = (realnum)p.FFmtRead();
00174
00175 if( p.lgEOL() )
00176 {
00177 if( p.nMatch("LYMA") )
00178 {
00179
00180 StopCalc.taunu = 1.;
00181 }
00182 else if( p.nMatch("BALM") )
00183 {
00184
00185 StopCalc.taunu = 0.25;
00186 }
00187 else
00188 {
00189 fprintf( ioQQQ, " There must be a second number, the energy in Ryd. Sorry.\n" );
00190 cdEXIT(EXIT_FAILURE);
00191 }
00192 }
00193
00194 else
00195 {
00196
00197 if( StopCalc.taunu < 0. )
00198 {
00199 StopCalc.taunu = (realnum)pow((realnum)10.f,StopCalc.taunu);
00200 }
00201
00202
00203 if( StopCalc.taunu < rfield.emm || StopCalc.taunu > rfield.egamry )
00204 {
00205 fprintf( ioQQQ, " The energy must be in the range %10.2e to %10.2e. It was %10.2e. Sorry.\n",
00206 rfield.emm, rfield.egamry, StopCalc.taunu );
00207 cdEXIT(EXIT_FAILURE);
00208 }
00209 }
00210
00211
00212 if( optimize.lgVarOn )
00213 {
00214 strcpy( optimize.chVarFmt[optimize.nparm], "STOP OPTICAL DEPTH = %f LOG AT %f RYD" );
00215
00216 optimize.nvfpnt[optimize.nparm] = input.nRead;
00217 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.tauend);
00218 optimize.vparm[1][optimize.nparm] = (realnum)StopCalc.taunu;
00219 optimize.vincr[optimize.nparm] = 0.5;
00220 optimize.nvarxt[optimize.nparm] = 2;
00221 ++optimize.nparm;
00222 }
00223 }
00224
00225
00226 else if( p.nMatch(" AV ") )
00227 {
00228 double a = p.FFmtRead();
00229
00230 if( p.lgEOL() && !p.nMatch(" OFF") )
00231 {
00232 p.NoNumb("optical depth in V");
00233 }
00234
00235 if( a<=0. )
00236 {
00237 a = pow(10.,a);
00238 }
00239
00240
00241 if( p.nMatch("EXTE" ) )
00242 {
00243 StopCalc.AV_extended = (realnum)a;
00244 }
00245 else
00246 {
00247
00248 StopCalc.AV_point = (realnum)a;
00249 }
00250 }
00251
00252
00253 else if( p.nMatch("MOLE") && p.nMatch("DEPL") )
00254 {
00255 double a = p.FFmtRead();
00256
00257 if( p.lgEOL() && !p.nMatch(" OFF") )
00258 {
00259 p.NoNumb("molecular depletion");
00260 }
00261 if( a <= 0. )
00262 {
00263 StopCalc.StopDepleteFrac = (realnum)pow(10.,a);
00264 }
00265 else
00266 {
00267 StopCalc.StopDepleteFrac = (realnum)a;
00268 }
00269 }
00270
00271
00272 else if( p.nMatch("VELO") )
00273 {
00274 double a = p.FFmtRead();
00275
00276 if( p.lgEOL() && !p.nMatch(" OFF") )
00277 {
00278 p.NoNumb("flow velocity");
00279 }
00280
00281 StopCalc.StopVelocity = (realnum)(a*1e5);
00282 }
00283
00284
00285 else if( p.nMatch("MASS") )
00286 {
00287 double a = p.FFmtRead();
00288
00289 if( p.lgEOL() && !p.nMatch(" OFF") )
00290 {
00291 p.NoNumb("mass");
00292 }
00293
00294
00295
00296 StopCalc.xMass = (realnum)a;
00297
00298 if( StopCalc.xMass == 0 )
00299 StopCalc.xMass = SMALLFLOAT;
00300
00301
00302 if( optimize.lgVarOn )
00303 {
00304 strcpy( optimize.chVarFmt[optimize.nparm], "STOP MASS = %f LOG" );
00305
00306 optimize.nvfpnt[optimize.nparm] = input.nRead;
00307 optimize.vparm[0][optimize.nparm] = (realnum)StopCalc.xMass;
00308 optimize.vincr[optimize.nparm] = 0.5;
00309 optimize.nvarxt[optimize.nparm] = 1;
00310 ++optimize.nparm;
00311 }
00312 }
00313
00314
00315
00316 else if( p.nMatch("THIC") || p.nMatch("DEPT") || p.nMatch("RADI") )
00317 {
00318 double a = p.FFmtRead();
00319
00320 if( p.lgEOL() && !p.nMatch(" OFF") )
00321 {
00322 p.NoNumb("distance");
00323 }
00324 const double convl = p.nMatch("PARS") ? log10( PARSEC ) : 0.;
00325 bool lgStopRadius = p.nMatch("RADI") ? true : false ;
00326 const char* what = lgStopRadius ? "radius" : "thickness";
00327
00328 if( p.nMatch("LINE") )
00329 {
00330 if( a > 0. )
00331 {
00332 a = log10(a) + convl;
00333 }
00334 else
00335 {
00336 fprintf(ioQQQ,"The %s is negative and linear is set - this is impossible.\n", what);
00337 cdEXIT(EXIT_FAILURE);
00338 }
00339 }
00340 else
00341 {
00342 a += convl;
00343 }
00344 if( a > 37. )
00345 {
00346 fprintf( ioQQQ, "DISASTER %s too large\n", what );
00347 cdEXIT(EXIT_FAILURE);
00348 }
00349 if( lgStopRadius )
00350 radius.StopRadius[0] = pow(10.,a);
00351 else
00352 radius.StopThickness[0] = pow(10.,a);
00353
00354
00355 for( j=1; j < iterations.iter_malloc; j++ )
00356 {
00357 a = p.FFmtRead();
00358 if( p.lgEOL() )
00359 {
00360 if( lgStopRadius )
00361 radius.StopRadius[j] = radius.StopRadius[j-1];
00362 else
00363 radius.StopThickness[j] = radius.StopThickness[j-1];
00364 }
00365 else
00366 {
00367 if( p.nMatch("LINE") )
00368 {
00369 if( a > 0. )
00370 {
00371 a = log10(a) + convl;
00372 }
00373 else
00374 {
00375 fprintf(ioQQQ,"The %s is negative and linear is set -"
00376 " this is impossible.\n", what);
00377 cdEXIT(EXIT_FAILURE);
00378 }
00379 }
00380 else
00381 {
00382 a += convl;
00383 }
00384 if( a > 37. )
00385 {
00386 fprintf( ioQQQ, "DISASTER %s too large\n", what );
00387 cdEXIT(EXIT_FAILURE);
00388 }
00389 if( lgStopRadius )
00390 radius.StopRadius[j] = pow(10.,a);
00391 else
00392 radius.StopThickness[j] = pow(10.,a);
00393 }
00394 }
00395
00396
00397 if( optimize.lgVarOn )
00398 {
00399 optimize.nvarxt[optimize.nparm] = 1;
00400
00401 optimize.nvfpnt[optimize.nparm] = input.nRead;
00402 if( lgStopRadius )
00403 {
00404 strcpy( optimize.chVarFmt[optimize.nparm], "STOP RADIUS %f LOG" );
00405 optimize.vparm[0][optimize.nparm] = (realnum)log10(radius.StopRadius[0]);
00406 }
00407 else
00408 {
00409 strcpy( optimize.chVarFmt[optimize.nparm], "STOP THICKNESS %f LOG" );
00410 optimize.vparm[0][optimize.nparm] = (realnum)log10(radius.StopThickness[0]);
00411 }
00412 optimize.vincr[optimize.nparm] = 0.5f;
00413 ++optimize.nparm;
00414 }
00415 }
00416
00417
00418 else if( p.nMatch("ZONE") )
00419 {
00420 double a = p.FFmtRead();
00421
00422 if( p.lgEOL() && !p.nMatch(" OFF") )
00423 {
00424 p.NoNumb("zone number");
00425 }
00426
00427
00428
00429 geometry.nend[0] = (long)MAX2(1.,a);
00430 geometry.lgZoneSet = true;
00431
00432
00433 geometry.lgEndDflt = false;
00434
00435 long int nZoneMax = geometry.nend[0];
00436 for( j=1; j < iterations.iter_malloc; j++ )
00437 {
00438 geometry.nend[j] = (long)p.FFmtRead();
00439
00440
00441 if( p.lgEOL() )
00442 {
00443 geometry.nend[j] = geometry.nend[j-1];
00444 }
00445 else
00446 {
00447
00448
00449 geometry.nend[j] = MAX2( 1 , geometry.nend[j] );
00450 }
00451 nZoneMax = max( nZoneMax , geometry.nend[j] );
00452 }
00453
00454 if( nZoneMax>2000 )
00455 fprintf(ioQQQ,"CAUTION - it will take a lot of memory to save"
00456 " results for %li zones. Is this many zones really necessary?\n",
00457 nZoneMax );
00458 }
00459
00460
00461 else if( p.nMatch("CONT") && p.nMatch("FLUX") )
00462 {
00463
00464 double energy = p.FFmtRead();
00465 if( p.lgEOL() )
00466 p.NoNumb("energy");
00467 const char* unit = p.StandardEnergyUnit();
00468 long ind = t_PredCont::Inst().add( energy, unit );
00469 Energy E( energy, unit );
00470
00471 double flux = p.FFmtRead();
00472 if( p.lgEOL() )
00473 p.NoNumb("flux");
00474 if( flux <= 0. || p.nMatch( " LOG") )
00475 flux = pow(10.,flux);
00476 Flux F( E, flux, p.StandardFluxUnit() );
00477
00478 StopCalc.ContIndex.push_back( ind );
00479 StopCalc.ContNFnu.push_back( F );
00480 }
00481
00482
00483 else if( p.nMatch("EFRA") )
00484 {
00485 double a = p.FFmtRead();
00486
00487 if( p.lgEOL() && !p.nMatch(" OFF") )
00488 {
00489 p.NoNumb("electron fraction");
00490 }
00491 if( a <= 0. )
00492 {
00493 StopCalc.StopElecFrac = (realnum)pow(10.,a);
00494 }
00495 else
00496 {
00497 StopCalc.StopElecFrac = (realnum)a;
00498 }
00499 }
00500
00501
00502
00503 else if( p.nMatch("MFRA") )
00504 {
00505 double a = p.FFmtRead();
00506
00507 if( p.lgEOL() && !p.nMatch(" OFF") )
00508 {
00509 p.NoNumb("hydrogen molecular fraction");
00510 }
00511 if( a <= 0. )
00512 {
00513 StopCalc.StopH2MoleFrac = (realnum)pow(10.,a);
00514 }
00515 else
00516 {
00517 StopCalc.StopH2MoleFrac = (realnum)a;
00518 }
00519 }
00520
00521
00522
00523 else if( p.nMatch("PFRA") )
00524 {
00525 double a = p.FFmtRead();
00526
00527 if( p.lgEOL() && !p.nMatch(" OFF") )
00528 {
00529 p.NoNumb("ionized hydrogen fraction");
00530 }
00531 if( a <= 0. )
00532 {
00533 StopCalc.StopHPlusFrac = (realnum)pow(10.,a);
00534 }
00535 else
00536 {
00537 StopCalc.StopHPlusFrac = (realnum)a;
00538 }
00539 }
00540
00541
00542 else if( p.nMatch("COLU") )
00543 {
00544 double a = p.FFmtRead();
00545
00546 if( p.lgEOL() && !p.nMatch(" OFF") )
00547 {
00548 p.NoNumb("column density");
00549 }
00550 char chLabel[CHARS_SPECIES];
00551
00552
00553
00554 if( p.nMatch( "LINE" ) )
00555 a = log10(a);
00556
00557 if( !p.GetQuote( chLabel , false ) )
00558 {
00559
00560 StopCalc.col_species = (realnum)pow(10.,a);
00561 StopCalc.lgStopSpeciesColumn = true;
00562 strncpy( StopCalc.chSpeciesColumn, chLabel, CHARS_SPECIES );
00563 }
00564
00565 else if( p.nMatch("EFFE") )
00566 {
00567
00568 effcol = pow(10.,a);
00569 StopCalc.tauend = (realnum)(effcol*2.14e-22);
00570 StopCalc.taunu = (realnum)(1000./EVRYD);
00571
00572 if( optimize.lgVarOn )
00573 {
00574 optimize.nvarxt[optimize.nparm] = 1;
00575 strcpy( optimize.chVarFmt[optimize.nparm], "STOP EFFECTIVE COLUMN DENSITY %f LOG" );
00576
00577 optimize.nvfpnt[optimize.nparm] = input.nRead;
00578
00579 optimize.vparm[0][optimize.nparm] = (realnum)log10(effcol);
00580 optimize.vincr[optimize.nparm] = 0.5f;
00581 ++optimize.nparm;
00582 }
00583 }
00584
00585 else if( p.nMatch("IONI") )
00586 {
00587
00588 if( a > 37. )
00589 {
00590 fprintf( ioQQQ, " column too big\n" );
00591 cdEXIT(EXIT_FAILURE);
00592 }
00593
00594 StopCalc.colpls = (realnum)pow(10.,a);
00595
00596
00597 if( optimize.lgVarOn )
00598 {
00599 optimize.nvarxt[optimize.nparm] = 1;
00600 strcpy( optimize.chVarFmt[optimize.nparm], "STOP IONIZED COLUMN DENSITY %f LOG" );
00601
00602 optimize.nvfpnt[optimize.nparm] = input.nRead;
00603
00604 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.colpls);
00605 optimize.vincr[optimize.nparm] = 0.5f;
00606 ++optimize.nparm;
00607 }
00608 }
00609
00610
00611 else if( p.nMatch("NEUT") )
00612 {
00613 StopCalc.colnut = (realnum)pow(10.,a);
00614
00615
00616 if( optimize.lgVarOn )
00617 {
00618 optimize.nvarxt[optimize.nparm] = 1;
00619 strcpy( optimize.chVarFmt[optimize.nparm], "STOP NEUTRAL COLUMN DENSITY %f LOG");
00620
00621 optimize.nvfpnt[optimize.nparm] = input.nRead;
00622
00623 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.colnut);
00624 optimize.vincr[optimize.nparm] = 0.5f;
00625 ++optimize.nparm;
00626 }
00627 }
00628
00629
00630
00631
00632 else if( p.nMatch(" H2 ") )
00633 {
00634
00635
00636
00637 j = (long int)a;
00638 if( j != 2 )
00639 {
00640 fprintf( ioQQQ, " Something is wrong with the order of the numbers on this line.\n" );
00641 fprintf( ioQQQ, " The first number I encounter should be the 2 in H2.\n Sorry.\n" );
00642 cdEXIT(EXIT_FAILURE);
00643 }
00644 a = p.FFmtRead();
00645 StopCalc.col_h2 = (realnum)pow(10.,a);
00646
00647
00648 if( optimize.lgVarOn )
00649 {
00650 optimize.nvarxt[optimize.nparm] = 1;
00651 strcpy( optimize.chVarFmt[optimize.nparm], "STOP H2 COLUMN DENSITY %f LOG");
00652
00653 optimize.nvfpnt[optimize.nparm] = input.nRead;
00654
00655 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.col_h2);
00656 optimize.vincr[optimize.nparm] = 0.5f;
00657 ++optimize.nparm;
00658 }
00659 }
00660
00661 else if( p.nMatch("ATOM") )
00662 {
00663 StopCalc.col_h2_nut = (realnum)pow(10.,a);
00664
00665 if( optimize.lgVarOn )
00666 {
00667 optimize.nvarxt[optimize.nparm] = 1;
00668 strcpy( optimize.chVarFmt[optimize.nparm], "STOP ATOMIC COLUMN DENSITY %f LOG");
00669
00670 optimize.nvfpnt[optimize.nparm] = input.nRead;
00671
00672 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.col_h2_nut);
00673 optimize.vincr[optimize.nparm] = 0.5f;
00674 ++optimize.nparm;
00675 }
00676 }
00677
00678 else if( p.nMatch("H/TS") )
00679 {
00680
00681 StopCalc.col_H0_ov_Tspin = (realnum)pow(10.,a);
00682
00683 if( optimize.lgVarOn )
00684 {
00685 optimize.nvarxt[optimize.nparm] = 1;
00686 strcpy( optimize.chVarFmt[optimize.nparm], "STOP H/TSPIN COLUMN DENSITY %f LOG");
00687
00688 optimize.nvfpnt[optimize.nparm] = input.nRead;
00689
00690 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.col_H0_ov_Tspin);
00691 optimize.vincr[optimize.nparm] = 0.5f;
00692 ++optimize.nparm;
00693 }
00694 }
00695
00696 else if( p.nMatch(" CO ") )
00697 {
00698
00699
00700 StopCalc.col_monoxco = (realnum)pow(10.,a);
00701
00702 if( optimize.lgVarOn )
00703 {
00704 optimize.nvarxt[optimize.nparm] = 1;
00705 strcpy( optimize.chVarFmt[optimize.nparm], "STOP CO COLUMN DENSITY %f LOG");
00706
00707 optimize.nvfpnt[optimize.nparm] = input.nRead;
00708
00709 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.col_monoxco);
00710 optimize.vincr[optimize.nparm] = 0.5f;
00711 ++optimize.nparm;
00712 }
00713 }
00714
00715
00716 else
00717 {
00718
00719 if( a > 37. )
00720 {
00721 fprintf( ioQQQ, " column too big\n" );
00722 cdEXIT(EXIT_FAILURE);
00723 }
00724
00725 StopCalc.HColStop = (realnum)pow(10.,a);
00726
00727
00728 if( optimize.lgVarOn )
00729 {
00730 optimize.nvarxt[optimize.nparm] = 1;
00731 strcpy( optimize.chVarFmt[optimize.nparm], "STOP COLUMN DENSITY %f LOG" );
00732
00733 optimize.nvfpnt[optimize.nparm] = input.nRead;
00734
00735 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.HColStop);
00736 optimize.vincr[optimize.nparm] = 0.5f;
00737 ++optimize.nparm;
00738 }
00739 }
00740 }
00741
00742
00743 else if( p.nMatch("EDEN") )
00744 {
00745 double a = p.FFmtRead();
00746
00747 if( p.lgEOL() && !p.nMatch(" OFF") )
00748 {
00749 p.NoNumb("electron density");
00750 }
00751
00752
00753 if( p.nMatch("LINE") )
00754 {
00755 StopCalc.StopElecDensity = (realnum)a;
00756 }
00757 else
00758 {
00759 StopCalc.StopElecDensity = (realnum)pow(10.,a);
00760 }
00761 }
00762
00763
00764
00765 else if( p.nMatch("LINE") )
00766 {
00767 char chLabel[5];
00768
00769
00770
00771
00772
00773 p.GetQuote( chLabel , true );
00774
00775
00776 strncpy( StopCalc.chStopLabel1[StopCalc.nstpl], chLabel , 4 );
00777 StopCalc.chStopLabel1[StopCalc.nstpl][4] = 0;
00778
00779
00780 StopCalc.nEmergent[StopCalc.nstpl] = 0;
00781 if( p.nMatch("EMER") )
00782 StopCalc.nEmergent[StopCalc.nstpl] = 1;
00783
00784
00785 StopCalc.StopLineWl1[StopCalc.nstpl] = (realnum)p.getWaveOpt();
00786
00787
00788 StopCalc.stpint[StopCalc.nstpl] = (realnum)p.FFmtRead();
00789 if( p.lgEOL() )
00790 {
00791 fprintf( ioQQQ, " There MUST be a relative intensity entered "
00792 "for first line in STOP LINE command. Sorry.\n" );
00793 cdEXIT(EXIT_FAILURE);
00794 }
00795
00796
00797
00798
00799
00800
00801 j = p.GetQuote( chLabel , false );
00802
00803 if( j != 0 )
00804 {
00805
00806 strncpy( StopCalc.chStopLabel2[StopCalc.nstpl], "TOTL" , 4 );
00807 StopCalc.chStopLabel2[StopCalc.nstpl][4] = 0;
00808 StopCalc.StopLineWl2[StopCalc.nstpl] = 4861.f;
00809 }
00810 else
00811 {
00812
00813 strncpy( StopCalc.chStopLabel2[StopCalc.nstpl], chLabel , 4 );
00814 StopCalc.chStopLabel2[StopCalc.nstpl][4] = 0;
00815
00816
00817
00818 StopCalc.StopLineWl2[StopCalc.nstpl] = (realnum)p.getWaveOpt();
00819
00820 }
00821
00822 StopCalc.nstpl = MIN2(StopCalc.nstpl+1,MXSTPL-1);
00823 }
00824
00825 else if( p.nMatch("NTOTALIO" ) )
00826 {
00827 double a = p.FFmtRead();
00828
00829 if( p.lgEOL() && !p.nMatch(" OFF") )
00830 {
00831 p.NoNumb("number of calls to conv_base");
00832 }
00833
00834
00835
00836 StopCalc.nTotalIonizStop = (long)a;
00837 }
00838
00839
00840 else
00841 {
00842 fprintf( ioQQQ, " I did not recognize a keyword on this STOP line, line image follows;\n" );
00843 p.PrintLine(ioQQQ);
00844 fprintf( ioQQQ, "Sorry.\n");
00845 cdEXIT(EXIT_FAILURE);
00846 }
00847 return;
00848 }