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
00213 else if( p.nMatch(" AV ") )
00214 {
00215 double a = p.FFmtRead();
00216
00217 if( p.lgEOL() && !p.nMatch(" OFF") )
00218 {
00219 p.NoNumb("optical depth in V");
00220 }
00221
00222 if( a<=0. )
00223 {
00224 a = pow(10.,a);
00225 }
00226
00227
00228 if( p.nMatch("EXTE" ) )
00229 {
00230 StopCalc.AV_extended = (realnum)a;
00231 }
00232 else
00233 {
00234
00235 StopCalc.AV_point = (realnum)a;
00236 }
00237 }
00238
00239
00240 else if( p.nMatch("MOLE") && p.nMatch("DEPL") )
00241 {
00242 double a = p.FFmtRead();
00243
00244 if( p.lgEOL() && !p.nMatch(" OFF") )
00245 {
00246 p.NoNumb("molecular depletion");
00247 }
00248 if( a <= 0. )
00249 {
00250 StopCalc.StopDepleteFrac = (realnum)pow(10.,a);
00251 }
00252 else
00253 {
00254 StopCalc.StopDepleteFrac = (realnum)a;
00255 }
00256 }
00257
00258
00259 else if( p.nMatch("VELO") )
00260 {
00261 double a = p.FFmtRead();
00262
00263 if( p.lgEOL() && !p.nMatch(" OFF") )
00264 {
00265 p.NoNumb("flow velocity");
00266 }
00267
00268 StopCalc.StopVelocity = (realnum)(a*1e5);
00269 }
00270
00271
00272 else if( p.nMatch("MASS") )
00273 {
00274 double a = p.FFmtRead();
00275
00276 if( p.lgEOL() && !p.nMatch(" OFF") )
00277 {
00278 p.NoNumb("mass");
00279 }
00280
00281
00282
00283 StopCalc.xMass = (realnum)a;
00284
00285 if( StopCalc.xMass == 0 )
00286 StopCalc.xMass = SMALLFLOAT;
00287
00288
00289 if( optimize.lgVarOn )
00290 {
00291 strcpy( optimize.chVarFmt[optimize.nparm], "STOP MASS = %f LOG" );
00292
00293 optimize.nvfpnt[optimize.nparm] = input.nRead;
00294 optimize.vparm[0][optimize.nparm] = (realnum)StopCalc.xMass;
00295 optimize.vincr[optimize.nparm] = 0.5;
00296 optimize.nvarxt[optimize.nparm] = 1;
00297 ++optimize.nparm;
00298 }
00299 }
00300
00301
00302
00303 else if( p.nMatch("THIC") || p.nMatch("DEPT") || p.nMatch("RADI") )
00304 {
00305 double a = p.FFmtRead();
00306
00307 if( p.lgEOL() && !p.nMatch(" OFF") )
00308 {
00309 p.NoNumb("distance");
00310 }
00311 const double convl = p.nMatch("PARS") ? log10( PARSEC ) : 0.;
00312 bool lgStopRadius = p.nMatch("RADI") ? true : false ;
00313 const char* what = lgStopRadius ? "radius" : "thickness";
00314
00315 if( p.nMatch("LINE") )
00316 {
00317 if( a > 0. )
00318 {
00319 a = log10(a) + convl;
00320 }
00321 else
00322 {
00323 fprintf(ioQQQ,"The %s is negative and linear is set - this is impossible.\n", what);
00324 cdEXIT(EXIT_FAILURE);
00325 }
00326 }
00327 else
00328 {
00329 a += convl;
00330 }
00331 if( a > 37. )
00332 {
00333 fprintf( ioQQQ, "DISASTER %s too large\n", what );
00334 cdEXIT(EXIT_FAILURE);
00335 }
00336 if( lgStopRadius )
00337 radius.StopRadius[0] = pow(10.,a);
00338 else
00339 radius.StopThickness[0] = pow(10.,a);
00340
00341
00342 for( j=1; j < iterations.iter_malloc; j++ )
00343 {
00344 a = p.FFmtRead();
00345 if( p.lgEOL() )
00346 {
00347 if( lgStopRadius )
00348 radius.StopRadius[j] = radius.StopRadius[j-1];
00349 else
00350 radius.StopThickness[j] = radius.StopThickness[j-1];
00351 }
00352 else
00353 {
00354 if( p.nMatch("LINE") )
00355 {
00356 if( a > 0. )
00357 {
00358 a = log10(a) + convl;
00359 }
00360 else
00361 {
00362 fprintf(ioQQQ,"The %s is negative and linear is set -"
00363 " this is impossible.\n", what);
00364 cdEXIT(EXIT_FAILURE);
00365 }
00366 }
00367 else
00368 {
00369 a += convl;
00370 }
00371 if( a > 37. )
00372 {
00373 fprintf( ioQQQ, "DISASTER %s too large\n", what );
00374 cdEXIT(EXIT_FAILURE);
00375 }
00376 if( lgStopRadius )
00377 radius.StopRadius[j] = pow(10.,a);
00378 else
00379 radius.StopThickness[j] = pow(10.,a);
00380 }
00381 }
00382
00383
00384 if( optimize.lgVarOn )
00385 {
00386 optimize.nvarxt[optimize.nparm] = 1;
00387
00388 optimize.nvfpnt[optimize.nparm] = input.nRead;
00389 if( lgStopRadius )
00390 {
00391 strcpy( optimize.chVarFmt[optimize.nparm], "STOP RADIUS %f LOG" );
00392 optimize.vparm[0][optimize.nparm] = (realnum)log10(radius.StopRadius[0]);
00393 }
00394 else
00395 {
00396 strcpy( optimize.chVarFmt[optimize.nparm], "STOP THICKNESS %f LOG" );
00397 optimize.vparm[0][optimize.nparm] = (realnum)log10(radius.StopThickness[0]);
00398 }
00399 optimize.vincr[optimize.nparm] = 0.5f;
00400 ++optimize.nparm;
00401 }
00402 }
00403
00404
00405 else if( p.nMatch("ZONE") )
00406 {
00407 double a = p.FFmtRead();
00408
00409 if( p.lgEOL() && !p.nMatch(" OFF") )
00410 {
00411 p.NoNumb("zone number");
00412 }
00413
00414
00415
00416 geometry.nend[0] = (long)MAX2(1.,a);
00417 geometry.lgZoneSet = true;
00418
00419
00420 geometry.lgEndDflt = false;
00421
00422 long int nZoneMax = geometry.nend[0];
00423 for( j=1; j < iterations.iter_malloc; j++ )
00424 {
00425 geometry.nend[j] = (long)p.FFmtRead();
00426
00427
00428 if( p.lgEOL() )
00429 {
00430 geometry.nend[j] = geometry.nend[j-1];
00431 }
00432 else
00433 {
00434
00435
00436 geometry.nend[j] = MAX2( 1 , geometry.nend[j] );
00437 }
00438 nZoneMax = max( nZoneMax , geometry.nend[j] );
00439 }
00440
00441 if( nZoneMax>2000 )
00442 fprintf(ioQQQ,"CAUTION - it will take a lot of memory to save"
00443 " results for %li zones. Is this many zones really necessary?\n",
00444 nZoneMax );
00445 }
00446
00447
00448 else if( p.nMatch("CONT") && p.nMatch("FLUX") )
00449 {
00450
00451 double energy = p.FFmtRead();
00452 if( p.lgEOL() )
00453 p.NoNumb("energy");
00454 const char* unit = p.StandardEnergyUnit();
00455 long ind = t_PredCont::Inst().add( energy, unit );
00456 Energy E( energy, unit );
00457
00458 double flux = p.FFmtRead();
00459 if( p.lgEOL() )
00460 p.NoNumb("flux");
00461 if( flux <= 0. || p.nMatch( " LOG") )
00462 flux = pow(10.,flux);
00463 Flux F( E, flux, p.StandardFluxUnit() );
00464
00465 StopCalc.ContIndex.push_back( ind );
00466 StopCalc.ContNFnu.push_back( F );
00467 }
00468
00469
00470 else if( p.nMatch("EFRA") )
00471 {
00472 double a = p.FFmtRead();
00473
00474 if( p.lgEOL() && !p.nMatch(" OFF") )
00475 {
00476 p.NoNumb("electron fraction");
00477 }
00478 if( a <= 0. )
00479 {
00480 StopCalc.StopElecFrac = (realnum)pow(10.,a);
00481 }
00482 else
00483 {
00484 StopCalc.StopElecFrac = (realnum)a;
00485 }
00486 }
00487
00488
00489
00490 else if( p.nMatch("MFRA") )
00491 {
00492 double a = p.FFmtRead();
00493
00494 if( p.lgEOL() && !p.nMatch(" OFF") )
00495 {
00496 p.NoNumb("hydrogen molecular fraction");
00497 }
00498 if( a <= 0. )
00499 {
00500 StopCalc.StopH2MoleFrac = (realnum)pow(10.,a);
00501 }
00502 else
00503 {
00504 StopCalc.StopH2MoleFrac = (realnum)a;
00505 }
00506 }
00507
00508
00509
00510 else if( p.nMatch("PFRA") )
00511 {
00512 double a = p.FFmtRead();
00513
00514 if( p.lgEOL() && !p.nMatch(" OFF") )
00515 {
00516 p.NoNumb("ionized hydrogen fraction");
00517 }
00518 if( a <= 0. )
00519 {
00520 StopCalc.StopHPlusFrac = (realnum)pow(10.,a);
00521 }
00522 else
00523 {
00524 StopCalc.StopHPlusFrac = (realnum)a;
00525 }
00526 }
00527
00528
00529 else if( p.nMatch("COLU") )
00530 {
00531 double a = p.FFmtRead();
00532
00533 if( p.lgEOL() && !p.nMatch(" OFF") )
00534 {
00535 p.NoNumb("column density");
00536 }
00537 fixit();
00538 char chLabel[7];
00539
00540
00541
00542 if( p.nMatch( "LINE" ) )
00543 a = log10(a);
00544
00545 if( !p.GetQuote( chLabel , false ) )
00546 {
00547
00548 StopCalc.col_species = (realnum)pow(10.,a);
00549 StopCalc.lgStopSpeciesColumn = true;
00550 strncpy( StopCalc.chSpeciesColumn, chLabel, 7 );
00551 }
00552
00553 else if( p.nMatch("EFFE") )
00554 {
00555
00556 effcol = pow(10.,a);
00557 StopCalc.tauend = (realnum)(effcol*2.14e-22);
00558 StopCalc.taunu = (realnum)(1000./EVRYD);
00559
00560 if( optimize.lgVarOn )
00561 {
00562 optimize.nvarxt[optimize.nparm] = 1;
00563 strcpy( optimize.chVarFmt[optimize.nparm], "STOP EFFECTIVE COLUMN DENSITY %f LOG" );
00564
00565 optimize.nvfpnt[optimize.nparm] = input.nRead;
00566
00567 optimize.vparm[0][optimize.nparm] = (realnum)log10(effcol);
00568 optimize.vincr[optimize.nparm] = 0.5f;
00569 ++optimize.nparm;
00570 }
00571 }
00572
00573 else if( p.nMatch("IONI") )
00574 {
00575
00576 if( a > 37. )
00577 {
00578 fprintf( ioQQQ, " column too big\n" );
00579 cdEXIT(EXIT_FAILURE);
00580 }
00581
00582 StopCalc.colpls = (realnum)pow(10.,a);
00583
00584
00585 if( optimize.lgVarOn )
00586 {
00587 optimize.nvarxt[optimize.nparm] = 1;
00588 strcpy( optimize.chVarFmt[optimize.nparm], "STOP IONIZED COLUMN DENSITY %f LOG" );
00589
00590 optimize.nvfpnt[optimize.nparm] = input.nRead;
00591
00592 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.colpls);
00593 optimize.vincr[optimize.nparm] = 0.5f;
00594 ++optimize.nparm;
00595 }
00596 }
00597
00598
00599 else if( p.nMatch("NEUT") )
00600 {
00601 StopCalc.colnut = (realnum)pow(10.,a);
00602
00603
00604 if( optimize.lgVarOn )
00605 {
00606 optimize.nvarxt[optimize.nparm] = 1;
00607 strcpy( optimize.chVarFmt[optimize.nparm], "STOP NEUTRAL COLUMN DENSITY %f LOG");
00608
00609 optimize.nvfpnt[optimize.nparm] = input.nRead;
00610
00611 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.colnut);
00612 optimize.vincr[optimize.nparm] = 0.5f;
00613 ++optimize.nparm;
00614 }
00615 }
00616
00617
00618
00619
00620 else if( p.nMatch(" H2 ") )
00621 {
00622
00623
00624
00625 j = (long int)a;
00626 if( j != 2 )
00627 {
00628 fprintf( ioQQQ, " Something is wrong with the order of the numbers on this line.\n" );
00629 fprintf( ioQQQ, " The first number I encounter should be the 2 in H2.\n Sorry.\n" );
00630 cdEXIT(EXIT_FAILURE);
00631 }
00632 a = p.FFmtRead();
00633 StopCalc.col_h2 = (realnum)pow(10.,a);
00634
00635
00636 if( optimize.lgVarOn )
00637 {
00638 optimize.nvarxt[optimize.nparm] = 1;
00639 strcpy( optimize.chVarFmt[optimize.nparm], "STOP H2 COLUMN DENSITY %f LOG");
00640
00641 optimize.nvfpnt[optimize.nparm] = input.nRead;
00642
00643 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.col_h2);
00644 optimize.vincr[optimize.nparm] = 0.5f;
00645 ++optimize.nparm;
00646 }
00647 }
00648
00649 else if( p.nMatch("ATOM") )
00650 {
00651 StopCalc.col_h2_nut = (realnum)pow(10.,a);
00652
00653 if( optimize.lgVarOn )
00654 {
00655 optimize.nvarxt[optimize.nparm] = 1;
00656 strcpy( optimize.chVarFmt[optimize.nparm], "STOP ATOMIC COLUMN DENSITY %f LOG");
00657
00658 optimize.nvfpnt[optimize.nparm] = input.nRead;
00659
00660 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.col_h2_nut);
00661 optimize.vincr[optimize.nparm] = 0.5f;
00662 ++optimize.nparm;
00663 }
00664 }
00665
00666 else if( p.nMatch("H/TS") )
00667 {
00668
00669 StopCalc.col_H0_ov_Tspin = (realnum)pow(10.,a);
00670
00671 if( optimize.lgVarOn )
00672 {
00673 optimize.nvarxt[optimize.nparm] = 1;
00674 strcpy( optimize.chVarFmt[optimize.nparm], "STOP H/TSPIN COLUMN DENSITY %f LOG");
00675
00676 optimize.nvfpnt[optimize.nparm] = input.nRead;
00677
00678 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.col_H0_ov_Tspin);
00679 optimize.vincr[optimize.nparm] = 0.5f;
00680 ++optimize.nparm;
00681 }
00682 }
00683
00684 else if( p.nMatch(" CO ") )
00685 {
00686
00687
00688 StopCalc.col_monoxco = (realnum)pow(10.,a);
00689
00690 if( optimize.lgVarOn )
00691 {
00692 optimize.nvarxt[optimize.nparm] = 1;
00693 strcpy( optimize.chVarFmt[optimize.nparm], "STOP CO COLUMN DENSITY %f LOG");
00694
00695 optimize.nvfpnt[optimize.nparm] = input.nRead;
00696
00697 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.col_monoxco);
00698 optimize.vincr[optimize.nparm] = 0.5f;
00699 ++optimize.nparm;
00700 }
00701 }
00702
00703
00704 else
00705 {
00706
00707 if( a > 37. )
00708 {
00709 fprintf( ioQQQ, " column too big\n" );
00710 cdEXIT(EXIT_FAILURE);
00711 }
00712
00713 StopCalc.HColStop = (realnum)pow(10.,a);
00714
00715
00716 if( optimize.lgVarOn )
00717 {
00718 optimize.nvarxt[optimize.nparm] = 1;
00719 strcpy( optimize.chVarFmt[optimize.nparm], "STOP COLUMN DENSITY %f LOG" );
00720
00721 optimize.nvfpnt[optimize.nparm] = input.nRead;
00722
00723 optimize.vparm[0][optimize.nparm] = (realnum)log10(StopCalc.HColStop);
00724 optimize.vincr[optimize.nparm] = 0.5f;
00725 ++optimize.nparm;
00726 }
00727 }
00728 }
00729
00730
00731 else if( p.nMatch("EDEN") )
00732 {
00733 double a = p.FFmtRead();
00734
00735 if( p.lgEOL() && !p.nMatch(" OFF") )
00736 {
00737 p.NoNumb("electron density");
00738 }
00739
00740
00741 if( p.nMatch("LINE") )
00742 {
00743 StopCalc.StopElecDensity = (realnum)a;
00744 }
00745 else
00746 {
00747 StopCalc.StopElecDensity = (realnum)pow(10.,a);
00748 }
00749 }
00750
00751
00752
00753 else if( p.nMatch("LINE") )
00754 {
00755 char chLabel[5];
00756
00757
00758
00759
00760
00761 p.GetQuote( chLabel , true );
00762
00763
00764 strncpy( StopCalc.chStopLabel1[StopCalc.nstpl], chLabel , 4 );
00765 StopCalc.chStopLabel1[StopCalc.nstpl][4] = 0;
00766
00767
00768 StopCalc.nEmergent[StopCalc.nstpl] = 0;
00769 if( p.nMatch("EMER") )
00770 StopCalc.nEmergent[StopCalc.nstpl] = 1;
00771
00772
00773 StopCalc.StopLineWl1[StopCalc.nstpl] = (realnum)p.getWaveOpt();
00774
00775
00776 StopCalc.stpint[StopCalc.nstpl] = (realnum)p.FFmtRead();
00777 if( p.lgEOL() )
00778 {
00779 fprintf( ioQQQ, " There MUST be a relative intensity entered "
00780 "for first line in STOP LINE command. Sorry.\n" );
00781 cdEXIT(EXIT_FAILURE);
00782 }
00783
00784
00785
00786
00787
00788
00789 j = p.GetQuote( chLabel , false );
00790
00791 if( j != 0 )
00792 {
00793
00794 strncpy( StopCalc.chStopLabel2[StopCalc.nstpl], "TOTL" , 4 );
00795 StopCalc.chStopLabel2[StopCalc.nstpl][4] = 0;
00796 StopCalc.StopLineWl2[StopCalc.nstpl] = 4861.f;
00797 }
00798 else
00799 {
00800
00801 strncpy( StopCalc.chStopLabel2[StopCalc.nstpl], chLabel , 4 );
00802 StopCalc.chStopLabel2[StopCalc.nstpl][4] = 0;
00803
00804
00805
00806 StopCalc.StopLineWl2[StopCalc.nstpl] = (realnum)p.getWaveOpt();
00807
00808 }
00809
00810 StopCalc.nstpl = MIN2(StopCalc.nstpl+1,MXSTPL-1);
00811 }
00812
00813 else if( p.nMatch("NTOTALIO" ) )
00814 {
00815 double a = p.FFmtRead();
00816
00817 if( p.lgEOL() && !p.nMatch(" OFF") )
00818 {
00819 p.NoNumb("number of calls to conv_base");
00820 }
00821
00822
00823
00824 StopCalc.nTotalIonizStop = (long)a;
00825 }
00826
00827
00828 else
00829 {
00830 fprintf( ioQQQ, " I did not recognize a keyword on this STOP line, line image follows;\n" );
00831 p.PrintLine(ioQQQ);
00832 fprintf( ioQQQ, "Sorry.\n");
00833 cdEXIT(EXIT_FAILURE);
00834 }
00835 return;
00836 }