00001
00002
00003
00004 #include "cddefines.h"
00005 #include "physconst.h"
00006 #include "geometry.h"
00007 #include "input.h"
00008 #include "prt.h"
00009 #include "mole.h"
00010 #include "rt.h"
00011 #include "phycon.h"
00012 #include "optimize.h"
00013 #include "map.h"
00014 #include "hmi.h"
00015 #include "dense.h"
00016 #include "iterations.h"
00017 #include "conv.h"
00018 #include "secondaries.h"
00019 #include "rfield.h"
00020 #include "ionbal.h"
00021 #include "numderiv.h"
00022 #include "dynamics.h"
00023 #include "iso.h"
00024 #include "punch.h"
00025 #include "stopcalc.h"
00026 #include "opacity.h"
00027 #include "hydrogenic.h"
00028 #include "peimbt.h"
00029 #include "radius.h"
00030 #include "atmdat.h"
00031 #include "continuum.h"
00032 #include "grains.h"
00033 #include "grainvar.h"
00034 #include "parse.h"
00035 #include "lines.h"
00036 #include "assertresults.h"
00037
00038 void ParseSet(char *chCard )
00039 {
00040 bool lgEOL;
00041 long int i,
00042 ip;
00043 char chString_quotes_lowercase[INPUT_LINE_LENGTH];
00044 bool lgQuotesFound;
00045
00046 DEBUG_ENTRY( "ParseSet()" );
00047
00048
00049
00050
00051 lgQuotesFound = true;
00052 if( GetQuote( chString_quotes_lowercase , chCard , false ) )
00053 lgQuotesFound = false;
00054
00055
00056 if( nMatch("ASSE",chCard) &&nMatch(" FPE",chCard) )
00057 {
00058
00059
00060 lgAssertFPE = true;
00061 }
00062
00063 else if( nMatch("ASSE",chCard) &&nMatch("SCIE",chCard) )
00064 {
00065
00066
00067 lgPrtSciNot = true;
00068 }
00069
00070 else if( nMatch("ATOM",chCard) && nMatch( "DATA", chCard ) )
00071 {
00072
00073 long int nelem , ion;
00074 bool lgAs=false , lgCS=false , lgDR=false;
00075
00076
00077 if( (nelem = GetElem(chCard))<0 )
00078 {
00079 fprintf( ioQQQ, " An element name must appear on this line\n Sorry.\n" );
00080 puts( "[Stop in ParseSet]" );
00081 cdEXIT(EXIT_FAILURE);
00082 }
00083 i = 5;
00084
00085 ion = (long int)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00086 if( !lgEOL && (ion< 1 || ion>nelem+1) )
00087 {
00088 fprintf( ioQQQ, " The ionization stage is not valid\n Sorry.\n" );
00089 puts( "[Stop in ParseSet]" );
00090 cdEXIT(EXIT_FAILURE);
00091 }
00092
00093
00094 if( nMatch( " AS " , chCard ) )
00095 lgAs = true;
00096
00097
00098 if( nMatch( " DR " , chCard ) )
00099 lgDR = true;
00100
00101
00102 if( nMatch( " CS " , chCard ) )
00103 lgCS = true;
00104 if( lgCS )
00105 fprintf(ioQQQ , "parse_set CS not currently functional.\n");
00106
00107
00108 if( nelem==ipOXYGEN && ion == 2 && lgAs )
00109 {
00110 if( nMatch( " NEW" , chCard ) )
00111 {
00112 dense.lgAsChoose[nelem][ion-1] = true;
00113 }
00114 else if( nMatch( " OLD" , chCard ) )
00115 {
00116
00117 dense.lgAsChoose[nelem][ion-1] = false;
00118 }
00119 else
00120 {
00121 fprintf( ioQQQ, " The keyword old or new must appear\n Sorry.\n" );
00122 puts( "[Stop in ParseSet]" );
00123 cdEXIT(EXIT_FAILURE);
00124 }
00125 }
00126 else if( nelem==ipSULPHUR && lgDR )
00127 {
00128
00129
00130
00131
00132
00133 if( nMatch( " MIX" , chCard ) )
00134
00135 ionbal.nDR_S_guess = 0;
00136 else if( nMatch( "PURE" , chCard ) )
00137
00138 ionbal.nDR_S_guess = 1;
00139 else if( nMatch( "SCAL" , chCard ) )
00140 {
00141
00142 ionbal.nDR_S_guess = 2;
00143 i = 5;
00144 ionbal.DR_S_scale[0] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00145 if( lgEOL )
00146 NoNumb(chCard);
00147 for( ion=1; ion<5; ++ion )
00148 {
00149
00150
00151 ionbal.DR_S_scale[ion] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00152 if( lgEOL )
00153 ionbal.DR_S_scale[ion] = ionbal.DR_S_scale[ion-1];
00154 }
00155 }
00156 else
00157 {
00158
00159 fprintf(
00160 ioQQQ, " One of the keywords MIX, PURE, or SCALe must"
00161 "appear on the set atomic physics sulphur dr command.\n"
00162 "Sorry.\n" );
00163 puts( "[Stop in ParseSet]" );
00164 cdEXIT(EXIT_FAILURE);
00165 }
00166 }
00167 else
00168 {
00169 fprintf( ioQQQ, " None of the valid set atomic data atoms/ions were found\n Sorry.\n" );
00170 puts( "[Stop in ParseSet]" );
00171 cdEXIT(EXIT_FAILURE);
00172 }
00173 }
00174 else if( nMatch(" CHA",chCard) && !nMatch( "HO ", chCard ) )
00175 {
00176
00177
00178 i = 5;
00179 atmdat.HCTAlex = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00180 if( lgEOL )
00181 {
00182 NoNumb(chCard);
00183 }
00184 if( atmdat.HCTAlex < 0. )
00185 {
00186 atmdat.HCTAlex = pow(10.,atmdat.HCTAlex);
00187 }
00188 }
00189
00190 else if( nMatch("CHEM",chCard ) && !nMatch( "HO ", chCard ) )
00191 {
00192
00193 if( nMatch("FEDE",chCard ) )
00194 {
00195 if( nMatch( " ON " , chCard ) )
00196 {
00197
00198
00199 co.lgFederman = true;
00200 }
00201 else if( nMatch( " OFF" , chCard ) )
00202 {
00203 co.lgFederman = false;
00204 }
00205 else
00206 {
00207
00208 co.lgFederman = true;
00209 }
00210 }
00211
00212 else if( nMatch(" NON",chCard ) && nMatch( "EQUI", chCard ))
00213 {
00214
00215
00216
00217
00218
00219 co.lgNonEquilChem = true;
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 if( nMatch("NEUT",chCard ) )
00230 {
00231 if( nMatch( " ON " , chCard ) )
00232 {
00233
00234
00235 co.lgNeutrals = true;
00236 }
00237 else if( nMatch( " OFF" , chCard ) )
00238 {
00239 co.lgNeutrals = false;
00240 }
00241 else
00242 {
00243
00244 co.lgNeutrals = true;
00245 }
00246 }
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 else if( nMatch("PROT",chCard ) && nMatch( "ELIM", chCard ) )
00264 {
00265 if( nMatch( " ON " , chCard ) )
00266 {
00267
00268
00269 co.lgProtElim = true;
00270 }
00271 else if( nMatch( " OFF" , chCard ) )
00272 {
00273 co.lgProtElim = false;
00274 }
00275 else
00276 {
00277
00278 co.lgProtElim = true;
00279 }
00280 }
00281
00282 else
00283 {
00284
00285 fprintf( ioQQQ, " There should have been an option on this SET CHEMISTRY command.\n" );
00286 fprintf( ioQQQ, " consult Hazy to find valid options.\n Sorry.\n" );
00287 puts( "[Stop in ParseSet]" );
00288 cdEXIT(EXIT_FAILURE);
00289 }
00290 }
00291
00292
00293 else if( nMatch("COLL",chCard) && nMatch("STRE",chCard) && nMatch("AVER",chCard) )
00294 {
00295 if( nMatch(" OFF",chCard) )
00296 {
00297 iso.lgCollStrenThermAver = false;
00298 }
00299 else
00300 {
00301
00302 iso.lgCollStrenThermAver = true;
00303 }
00304 }
00305
00306 else if( nMatch("COVE",chCard) )
00307 {
00308 iterations.lgConverge_set = true;
00309
00310 if( nMatch("FAST",chCard) )
00311 {
00312 iterations.lim_zone = 1;
00313 iterations.lim_iter = 0;
00314 }
00315 else
00316 {
00317 iterations.lim_zone = 10;
00318 iterations.lim_iter = 1;
00319 }
00320 }
00321
00322 else if( nMatch("CSUP",chCard) )
00323 {
00324
00325 i = 5;
00326 secondaries.SetCsupra = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00327 secondaries.lgCSetOn = true;
00328 if( lgEOL )
00329 {
00330 NoNumb(chCard);
00331 }
00332 secondaries.SetCsupra = (float)pow(10.f,secondaries.SetCsupra);
00333 }
00334
00335 else if( nMatch(" D/H",chCard) )
00336 {
00337
00338 i = 5;
00339 hydro.D2H_ratio = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00340 if( hydro.D2H_ratio <= 0. || nMatch( " LOG", chCard ) )
00341 {
00342 hydro.D2H_ratio = pow(10.,hydro.D2H_ratio);
00343 }
00344 if( lgEOL )
00345 {
00346 NoNumb(chCard);
00347 }
00348 }
00349
00350 else if( nMatch( " HO " , chCard) && nMatch( "CHAR" , chCard) )
00351 {
00352
00353
00354 if( nMatch( "CHEM" , chCard ) )
00355 {
00356
00357 ionbal.lgHO_ct_chem = true;
00358 }
00359 else if( nMatch( "IONI" , chCard ) )
00360 {
00361
00362 ionbal.lgHO_ct_chem = false;
00363 }
00364 else
00365 {
00366 fprintf( ioQQQ, " I did not recognize a subkey on this SET OH CHARge transfer line.\n" );
00367 fprintf( ioQQQ, " Valid keys are CHEMistry and IONIzation.\n" );
00368 puts( "[Stop in ParseSet]" );
00369 cdEXIT(EXIT_FAILURE);
00370 }
00371 }
00372
00373 else if( nMatch("12C1",chCard) )
00374 {
00375
00376 i = 5;
00377
00378 co.RatioC12O16_2_C13O16 = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00379 co.RatioC12O16_2_C13O16 = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00380
00381
00382 co.RatioC12O16_2_C13O16 = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00383 if( lgEOL )
00384 NoNumb(chCard);
00385
00386 if( co.RatioC12O16_2_C13O16 <= 0. || nMatch( " LOG", chCard ) )
00387 co.RatioC12O16_2_C13O16 = (float)pow(10.f,co.RatioC12O16_2_C13O16);
00388 }
00389
00390
00391 else if( nMatch("DYNA",chCard) )
00392 {
00393
00394 if( nMatch("ADVE",chCard) && nMatch("LENG",chCard) )
00395 {
00396
00397 i = 5;
00398 dynamics.AdvecLengthInit = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00399
00400
00401 if( nMatch("FRAC",chCard) )
00402 {
00403
00404 if( dynamics.AdvecLengthInit <= 0. )
00405 dynamics.AdvecLengthInit = pow(10.,dynamics.AdvecLengthInit);
00406
00407
00408 dynamics.AdvecLengthInit *= -1.;
00409 }
00410 else
00411 {
00412
00413
00414 dynamics.AdvecLengthInit = pow(10.,dynamics.AdvecLengthInit);
00415 }
00416 }
00417 else if( nMatch("PRES",chCard) && nMatch("MODE",chCard) )
00418 {
00419 dynamics.lgSetPresMode = true;
00420 if( nMatch("SUBS",chCard) )
00421 {
00422
00423 strcpy( dynamics.chPresMode , "subsonic" );
00424 }
00425 else if( nMatch("SUPE",chCard) )
00426 {
00427
00428 strcpy( dynamics.chPresMode , "supersonic" );
00429 }
00430 else if( nMatch("STRO",chCard) )
00431 {
00432
00433 strcpy( dynamics.chPresMode , "strongd" );
00434 }
00435 else if( nMatch("ORIG",chCard) )
00436 {
00437
00438 strcpy( dynamics.chPresMode , "original" );
00439 }
00440 }
00441 else if( nMatch("ANTI",chCard) && nMatch("DEPT",chCard) )
00442 {
00443 dynamics.lgSetPresMode = true;
00444 strcpy( dynamics.chPresMode , "antishock" );
00445
00446 i = 5;
00447
00448 dynamics.ShockDepth = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00449 dynamics.ShockDepth = pow( 10., dynamics.ShockDepth );
00450 }
00451 else if( nMatch("ANTI",chCard) && nMatch("MACH",chCard) )
00452 {
00453 dynamics.lgSetPresMode = true;
00454 strcpy( dynamics.chPresMode , "antishock-by-mach" );
00455
00456 i = 5;
00457
00458 dynamics.ShockMach = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00459 }
00460 else if( nMatch("SHOC",chCard) && nMatch("DEPT",chCard) )
00461 {
00462 dynamics.lgSetPresMode = true;
00463 strcpy( dynamics.chPresMode , "shock" );
00464
00465 i = 5;
00466
00467 dynamics.ShockDepth = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00468 dynamics.ShockDepth = pow( 10., dynamics.ShockDepth );
00469 }
00470 else if( nMatch("STAR",chCard) )
00471 {
00472
00473
00474 i = 5;
00475
00476 dynamics.iteration_first_dynamics = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00477 if( lgEOL )
00478 {
00479 NoNumb(chCard);
00480 }
00481 else if( dynamics.iteration_first_dynamics < 2 )
00482 {
00483 fprintf(ioQQQ," First iteration with dynamics must be > 1. It was %li. Sorry.\n",
00484 dynamics.iteration_first_dynamics );
00485 puts( "[Stop in ParseSet]" );
00486 cdEXIT(EXIT_FAILURE);
00487 }
00488 }
00489 else
00490 {
00491
00492 fprintf( ioQQQ, " There should have been an option on this SET DYNAMICS command.\n" );
00493 fprintf( ioQQQ, " consult Hazy to find valid options.\n Sorry.\n" );
00494 puts( "[Stop in ParseSet]" );
00495 cdEXIT(EXIT_FAILURE);
00496 }
00497 }
00498
00499 else if( nMatch("DIDZ",chCard) )
00500 {
00501
00502
00503
00504 i = 5;
00505 radius.drChange = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00506 if( radius.drChange <= 0. )
00507 {
00508 radius.drChange = (float)pow(10.f,radius.drChange);
00509 }
00510 if( lgEOL )
00511 {
00512 NoNumb(chCard);
00513 }
00514 }
00515
00516
00517 else if( nMatch("EDEN",chCard) )
00518 {
00519
00520
00521 if( nMatch("CONV",chCard) || nMatch("ERRO",chCard))
00522 {
00523
00524
00525 i = 5;
00526 conv.EdenErrorAllowed = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00527 if( lgEOL )
00528 {
00529 NoNumb(chCard);
00530 }
00531
00532 if( conv.EdenErrorAllowed < 0. )
00533 {
00534 conv.EdenErrorAllowed = pow(10.,conv.EdenErrorAllowed);
00535 }
00536 }
00537
00538 else if( nMatch("SOLV",chCard) )
00539 {
00540
00541 if( nMatch("NEW",chCard) )
00542 {
00543
00544 strcpy( conv.chSolverEden , "new" );
00545 }
00546 else
00547 {
00548
00549 strcpy( conv.chSolverEden , "simple" );
00550 }
00551 }
00552 else
00553 {
00554
00555 i = 5;
00556
00557 dense.EdenSet = (float)pow(10.,FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL));
00558
00559 phycon.lgPhysOK = false;
00560 }
00561 }
00562
00563 else if( nMatch("FINE",chCard ) && nMatch("CONT",chCard ) )
00564 {
00565
00566
00567
00568
00569 if( (rfield.fine_opac_nelem = GetElem(chCard))<0 )
00570 {
00571 fprintf( ioQQQ, " An element name must appear on this line\n Sorry.\n" );
00572 puts( "[Stop in ParseSet]" );
00573 cdEXIT(EXIT_FAILURE);
00574 }
00575 i = 5;
00576
00577
00578 rfield.fine_opac_nresolv = (long int)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00579 if( rfield.fine_opac_nresolv< 1 )
00580 {
00581 fprintf( ioQQQ, " The number of resolution elements within FWHM of line must appear\n Sorry.\n" );
00582 puts( "[Stop in ParseSet]" );
00583 cdEXIT(EXIT_FAILURE);
00584 }
00585 }
00586
00587
00588 else if( nMatch("GRAI",chCard ) && !nMatch(" H2 ",chCard) )
00589 {
00590 if( nMatch("HEAT",chCard ) )
00591 {
00592
00593 i = 5;
00594 gv.GrainHeatScaleFactor = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00595
00596 phycon.lgPhysOK = false;
00597 if( lgEOL )
00598 {
00599 NoNumb(chCard);
00600 }
00601 }
00602 else
00603 {
00604 fprintf( ioQQQ, " A keyword must appear on the SET GRAIN line - options are HEAT \n Sorry.\n" );
00605 puts( "[Stop in ParseSet]" );
00606 cdEXIT(EXIT_FAILURE);
00607 }
00608 }
00609
00610
00611
00612 else if( nMatch("LEID",chCard ) && nMatch("HACK",chCard ) )
00613 {
00614 if( nMatch( "H2* " , chCard ) && nMatch( " OFF" , chCard ) )
00615 {
00616
00617 hmi.lgLeiden_Keep_ipMH2s = false;
00618
00619 phycon.lgPhysOK = false;
00620 }
00621 else if( nMatch( "CR " , chCard ) && nMatch( " OFF" , chCard ) )
00622 {
00623
00624 hmi.lgLeidenCRHack = false;
00625
00626 }
00627 else if( nMatch("RATE",chCard ) && nMatch("UMIS",chCard ))
00628 {
00629
00630
00631
00632 co.lgUMISTrates = false;
00633 }
00634 }
00635
00636
00637 else if( nMatch(" H2 ",chCard) )
00638 {
00639 i = 5;
00640 ip = (long int)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00641 if( ip != 2 )
00642 {
00643 fprintf( ioQQQ, " The first number on this line must be the 2 in H2\n Sorry.\n" );
00644 puts( "[Stop in ParseSet]" );
00645 cdEXIT(EXIT_FAILURE);
00646 }
00647
00648
00649 if( nMatch("SOLO",chCard) || ( nMatch("SMAL",chCard)&&nMatch("MODE",chCard) ) )
00650 {
00651 if( nMatch("SOLO",chCard) )
00652 {
00653
00654 fprintf(ioQQQ,"PROBLEM - *set H2 Solomon* has been changed to *set H2 small model*."\
00655 " This is OK for now but it may not work in a future version.\n");
00656 }
00657 if( nMatch("TH85", chCard ) )
00658 {
00659
00660 hmi.chH2_small_model_type = 'T';
00661 }
00662 else if( nMatch( " BHT" , chCard ) )
00663 {
00664
00665
00666
00667 hmi.chH2_small_model_type = 'H';
00668 }
00669 else if( nMatch( "BD96" , chCard ) )
00670 {
00671
00672
00673
00674 hmi.chH2_small_model_type = 'B';
00675 }
00676 else if( nMatch( "ELWE" , chCard ) )
00677 {
00678
00679
00680
00681 hmi.chH2_small_model_type = 'E';
00682 }
00683 else
00684 {
00685 fprintf( ioQQQ, " One of the keywords TH85, _BHT, BD96 or ELWErt must appear.\n Sorry.\n" );
00686 puts( "[Stop in ParseSet]" );
00687 cdEXIT(EXIT_FAILURE);
00688 }
00689 }
00690
00691
00692
00693 if( nMatch("GRAI",chCard ) && nMatch("FORM",chCard ) && nMatch("PUMP",chCard ) )
00694 {
00695 if( nMatch( "DB96" , chCard ) )
00696 {
00697
00698 hmi.chGrainFormPump = 'D';
00699 }
00700 else if( nMatch( "TAKA" , chCard ) )
00701 {
00702
00703 hmi.chGrainFormPump = 'T';
00704 }
00705 else if( nMatch( "THER" , chCard ) )
00706 {
00707
00708
00709 hmi.chGrainFormPump = 't';
00710 }
00711 else
00712 {
00713 fprintf( ioQQQ, " The grain form pump option is wrong.\n Sorry.\n" );
00714 puts( "[Stop in ParseSet]" );
00715 cdEXIT(EXIT_FAILURE);
00716 }
00717 }
00718
00719
00720 else if( nMatch("JURA",chCard) )
00721 {
00722 if( nMatch("TH85", chCard ) )
00723 {
00724
00725 hmi.chJura = 'T';
00726 }
00727 else if( nMatch( "CT02" , chCard ) )
00728 {
00729
00730 hmi.chJura = 'C';
00731 }
00732 else if( nMatch( "SN99" , chCard ) )
00733 {
00734
00735 hmi.chJura = 'S';
00736 }
00737 else if( nMatch( "RATE" , chCard ) )
00738 {
00739
00740
00741
00742
00743 hmi.chJura = 'F';
00744 hmi.rate_h2_form_grains_set = pow(10.,FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL) );
00745 if( lgEOL )
00746 {
00747
00748
00749 hmi.rate_h2_form_grains_set = 3e-17;
00750 }
00751 }
00752 else if( nMatch( "SCAL" , chCard ) )
00753 {
00754
00755 hmi.ScaleJura = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00756
00757 if( nMatch( " LOG" , chCard ) || hmi.ScaleJura<0. )
00758 {
00759 hmi.ScaleJura = (float)pow( 10., (double)hmi.ScaleJura );
00760 }
00761 if( lgEOL )
00762 {
00763 NoNumb( chCard );
00764 }
00765
00766
00767 if( optimize.lgVarOn )
00768 {
00769 optimize.nvarxt[optimize.nparm] = 1;
00770 strcpy( optimize.chVarFmt[optimize.nparm], "SET H2 JURA SCALE %f" );
00771
00772
00773 optimize.nvfpnt[optimize.nparm] = input.nRead;
00774
00775
00776 optimize.vparm[0][optimize.nparm] = (float)log10(hmi.ScaleJura);
00777 optimize.vincr[optimize.nparm] = 0.3f;
00778
00779 ++optimize.nparm;
00780 }
00781 }
00782 else
00783 {
00784 fprintf( ioQQQ, " The Jura rate option is wrong.\n Sorry.\n" );
00785 puts( "[Stop in ParseSet]" );
00786 cdEXIT(EXIT_FAILURE);
00787 }
00788 }
00789
00790
00791 else if( nMatch(" TAD",chCard) )
00792 {
00793 hmi.Tad = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00794 if( lgEOL )
00795 NoNumb(chCard);
00796
00797 if( hmi.Tad <=10. && !nMatch("LINE",chCard) )
00798 hmi.Tad = (float)pow(10.f,hmi.Tad);
00799 }
00800
00801 else if( nMatch("FRAC",chCard ) )
00802 {
00803
00804
00805
00806
00807 hmi.H2_frac_abund_set = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00808 if( lgEOL )
00809 NoNumb( chCard );
00810
00811
00812 if( hmi.H2_frac_abund_set <= 0. )
00813 hmi.H2_frac_abund_set = pow(10., hmi.H2_frac_abund_set);
00814
00815
00816 hmi.H2_frac_abund_set = MIN2(0.49999 , hmi.H2_frac_abund_set );
00817 }
00818 }
00819
00820
00821
00822
00823 else if( nMatch("HCOR",chCard) )
00824 {
00825 i = 5;
00826 dense.HCorrFac = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00827 if( lgEOL )
00828 NoNumb( chCard );
00829 }
00830
00831 else if( nMatch(" PAH",chCard) )
00832 {
00833
00834 if( nMatch(" H0 " , chCard ) )
00835 {
00836
00837 strcpy( gv.chPAH_abundance_fcn , "H0" );
00838 }
00839 else if( nMatch("CONS" , chCard ) )
00840 {
00841
00842 strcpy( gv.chPAH_abundance_fcn , "CON" );
00843 }
00844
00845 else if(nMatch("BAKE",chCard ) )
00846 {
00847
00848
00849 gv.lgBakesPAH_heat = true;
00850
00851 phycon.lgPhysOK = false;
00852 }
00853 else
00854 {
00855 fprintf( ioQQQ, " one of the keywords H0, BAKES, or CONStant must appear.\n Sorry." );
00856 puts( "[Stop in ParseSet]" );
00857 cdEXIT(EXIT_FAILURE);
00858 }
00859 }
00860
00861 else if( nMatch("PRES",chCard) && nMatch("IONI",chCard) )
00862 {
00863
00864
00865 i = 5;
00866 conv.limPres2Ioniz = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00867 if( lgEOL )
00868 {
00869 NoNumb(chCard);
00870 }
00871 else if( conv.limPres2Ioniz <= 0 )
00872 {
00873 fprintf( ioQQQ, " The limit must be greater than zero.\n Sorry." );
00874 puts( "[Stop in ParseSet]" );
00875 cdEXIT(EXIT_FAILURE);
00876 }
00877 }
00878
00879 else if( nMatch("PRES",chCard) )
00880 {
00881
00882 if( nMatch("CONV",chCard) )
00883 {
00884
00885
00886 i = 5;
00887 conv.PressureErrorAllowed = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00888 if( lgEOL )
00889 {
00890 NoNumb(chCard);
00891 }
00892
00893 if( conv.PressureErrorAllowed < 0. )
00894 {
00895 conv.PressureErrorAllowed = (float)pow(10.f,conv.PressureErrorAllowed);
00896 }
00897 }
00898
00899 else
00900 {
00901
00902
00903 fprintf( ioQQQ, " I didn\'t recognize a key on this SET PRESSURE line.\n" );
00904 fprintf( ioQQQ, " The ones I know about are: CONVergence.\n" );
00905 puts( "[Stop in ParseSet]" );
00906 cdEXIT(EXIT_FAILURE);
00907 }
00908 }
00909 else if( nMatch("RECO",chCard) && nMatch("MBIN",chCard) )
00910 {
00911
00912 if( nMatch("DIEL",chCard) && nMatch("ECTR",chCard) )
00913 {
00914
00915 if( nMatch("KLUD",chCard) )
00916 {
00917 if( nMatch("BADN",chCard) )
00918 {
00919
00920 ionbal.lg_use_DR_Badnell_rate_coef_mean_ion = true;
00921 }
00922 else
00923 {
00924 int j;
00925
00926 i = 3;
00927
00928 ionbal.GuessDiel[0] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00929
00930 if( ionbal.GuessDiel[0]<=0. || nMatch(" OFF",chCard) )
00931 ionbal.lg_guess_coef = false;
00932
00933 for( j=1; j<4; ++j )
00934 {
00935 ionbal.GuessDiel[j] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00936
00937 if( lgEOL )
00938 ionbal.GuessDiel[j] = ionbal.GuessDiel[j-1];
00939 }
00940 }
00941
00942 if( nMatch("NOISE" , chCard ) )
00943 {
00944 i = 3;
00945 ionbal.guess_noise = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00946 if( lgEOL )
00947 ionbal.guess_noise = 2.;
00948
00949
00950 srand( (unsigned)time( NULL ) );
00951 }
00952 else
00953 {
00954 ionbal.guess_noise = 0.;
00955 }
00956 }
00957
00958 else if( nMatch("BURG" , chCard) )
00959 {
00960
00961 if( nMatch(" ON ",chCard) )
00962 {
00963
00964 ionbal.lgSupDie[0] = true;
00965 }
00966
00967 else if( nMatch(" OFF",chCard) )
00968 {
00969
00970 ionbal.lgSupDie[0] = false;
00971 }
00972
00973 else
00974 {
00975 fprintf( ioQQQ, " flag ON or OFF must appear.\n" );
00976 puts( "[Stop in ParseCommands]" );
00977 cdEXIT(EXIT_FAILURE);
00978 }
00979 }
00980
00981 else if( nMatch("NUSS" , chCard) )
00982 {
00983
00984 if( nMatch(" ON ",chCard) )
00985 {
00986
00987 ionbal.lgSupDie[1] = true;
00988 }
00989 else if( nMatch(" OFF",chCard) )
00990 {
00991
00992 ionbal.lgSupDie[1] = false;
00993 }
00994 else
00995 {
00996 fprintf( ioQQQ, " flag ON or OFF must appear.\n" );
00997 puts( "[Stop in ParseCommands]" );
00998 cdEXIT(EXIT_FAILURE);
00999 }
01000 }
01001
01002 else if( nMatch("BADN" , chCard ) )
01003 {
01004
01005 if( nMatch( " OFF" , chCard ) )
01006 {
01007 ionbal.lgDR_recom_Badnell_use = false;
01008 }
01009 else
01010 {
01011 ionbal.lgDR_recom_Badnell_use = true;
01012 }
01013
01014
01015 if( nMatch("PRIN" , chCard ) )
01016 ionbal.lgRecom_Badnell_print = true;
01017 }
01018 else
01019 {
01020 fprintf( ioQQQ, " key KLUDge, BURGess, NUSSbaumer, or BADNell must appear.\n" );
01021 puts( "[Stop in ParseCommands]" );
01022 cdEXIT(EXIT_FAILURE);
01023 }
01024 }
01025
01026 else if( nMatch("RADI",chCard) && nMatch("ATIV",chCard) )
01027 {
01028 if( nMatch("BADN" , chCard ) )
01029 {
01030
01031 if( nMatch( " OFF" , chCard ) )
01032 {
01033 ionbal.lgRR_recom_Badnell_use = false;
01034 }
01035 else
01036 {
01037 ionbal.lgRR_recom_Badnell_use = true;
01038 }
01039
01040
01041 if( nMatch("PRIN" , chCard ) )
01042 ionbal.lgRecom_Badnell_print = true;
01043 }
01044 else
01045 {
01046 fprintf( ioQQQ, " key BADNell must appear.\n" );
01047 puts( "[Stop in ParseCommands]" );
01048 cdEXIT(EXIT_FAILURE);
01049 }
01050 }
01051 else
01052 {
01053 fprintf( ioQQQ, " key RADIATIve or DIELECTRonic must appear on set recombination command.\n" );
01054 puts( "[Stop in ParseCommands]" );
01055 cdEXIT(EXIT_FAILURE);
01056 }
01057 }
01058
01059 else if( nMatch("SPEC",chCard) )
01060 {
01061
01062 if( nMatch("RANG" , chCard ) )
01063 {
01064
01065 i = 5;
01066
01067 punch.cp_range_min[punch.cp_npun] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01068 punch.cp_range_max[punch.cp_npun] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01069 if( lgEOL )
01070 {
01071 NoNumb(chCard);
01072 }
01073
01074 if( punch.cp_range_min[punch.cp_npun] >= punch.cp_range_max[punch.cp_npun] )
01075 {
01076 fprintf( ioQQQ, " The limits must be in increasing order.\n" );
01077 puts( "[Stop in ParseSet]" );
01078 cdEXIT(EXIT_FAILURE);
01079 }
01080 }
01081
01082 else if( nMatch("RESO" , chCard ) )
01083 {
01084
01085
01086
01087 i = 5;
01088 punch.cp_resolving_power[punch.cp_npun] = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01089 if( lgEOL )
01090 {
01091 NoNumb(chCard);
01092 }
01093 }
01094 }
01095
01096 else if( nMatch(" DR ",chCard) )
01097 {
01098
01099 i = 5;
01100
01101 radius.sdrmax = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01102 if( !nMatch("LINE",chCard) )
01103 {
01104
01105 radius.sdrmax = pow( 10. , radius.sdrmax );
01106 }
01107 if( lgEOL )
01108 {
01109 NoNumb(chCard);
01110 }
01111
01112
01113 radius.sdrmin = radius.sdrmax;
01114 if( radius.sdrmax < DEPTH_OFFSET*1e4 )
01115 {
01116 fprintf( ioQQQ, "\n Thicknesses less than about %.0e will NOT give accurate results. If tricking the code\n",
01117 DEPTH_OFFSET*1e4 );
01118 fprintf( ioQQQ, " into computing emissivities instead of intensities, try to instead use a thickness of unity,\n" );
01119 fprintf( ioQQQ, " and then multiply (divide) the results by the necessary thickness (product of densities).\n\n" );
01120 puts( "[Stop in ParseSet]" );
01121 cdEXIT(EXIT_FAILURE);
01122 }
01123 }
01124
01125 else if( nMatch("DRMA",chCard) )
01126 {
01127
01128 i = 5;
01129 radius.sdrmax = pow(10.,FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL));
01130 if( lgEOL )
01131 {
01132 NoNumb(chCard);
01133 }
01134 }
01135
01136 else if( nMatch("DRMI",chCard) )
01137 {
01138
01139 i = 5;
01140 radius.sdrmin = pow(10.,FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL));
01141 if( lgEOL )
01142 {
01143 NoNumb(chCard);
01144 }
01145 radius.lgSMinON = true;
01146 }
01147
01148 else if( nMatch("FLXF",chCard) )
01149 {
01150
01151 i = 5;
01152 rfield.FluxFaint = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01153 if( lgEOL )
01154 {
01155 NoNumb(chCard);
01156 }
01157 if( rfield.FluxFaint < 0. )
01158 {
01159 rfield.FluxFaint = (float)pow(10.f,rfield.FluxFaint);
01160 }
01161 }
01162
01163 else if( nMatch("LINE",chCard) && nMatch("PREC",chCard) )
01164 {
01165
01166
01167 i = 5;
01168 LineSave.sig_figs = (int)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01169 if( lgEOL )
01170 {
01171 NoNumb(chCard);
01172 }
01173 else if( LineSave.sig_figs > 6 )
01174 {
01175 fprintf( ioQQQ, " set line precision currently only works for up to 6 significant figures.\n" );
01176 puts( "[Stop in ParseSet]" );
01177 cdEXIT(EXIT_FAILURE);
01178 }
01179
01180
01181 }
01182
01183
01184 else if( nMatch("NFNU",chCard) )
01185 {
01186
01187
01188
01189
01190 prt.lgSourceReflected = nMatch("NT R",chCard) || nMatch("NT_R",chCard);
01191
01192 prt.lgSourceTransmitted = nMatch("NT_T",chCard) || nMatch("NT T",chCard);
01193
01194 prt.lgDiffuseInward = nMatch("SE_I",chCard) || nMatch("SE I",chCard);
01195
01196 prt.lgDiffuseOutward = nMatch("SE_O",chCard) || nMatch("SE O",chCard);
01197
01198
01199 if( ! ( prt.lgSourceReflected || prt.lgSourceTransmitted ||
01200 prt.lgDiffuseInward || prt.lgDiffuseOutward ) )
01201 {
01202 fprintf( ioQQQ, " set nFnu expects one or more of the following keywords:\n" );
01203 fprintf( ioQQQ, " INCIDENT_REFLECTED, INCIDENT_TRANSMITTED, DIFFUSE_INWARD, DIFFUSE_OUTWARD\n" );
01204 puts( "[Stop in ParseSet]" );
01205 cdEXIT(EXIT_FAILURE);
01206 }
01207
01208
01209 prt.lgPrnDiff = true;
01210 }
01211
01212 else if( nMatch("IND2",chCard) )
01213 {
01214 if( nMatch(" ON ",chCard) )
01215 {
01216
01217 iso.lgInd2nu_On = true;
01218 }
01219 else if( nMatch(" OFF",chCard) )
01220 {
01221 iso.lgInd2nu_On = false;
01222 }
01223 else
01224 {
01225 fprintf( ioQQQ, " set ind2 needs either ON or OFF.\n" );
01226 puts( "[Stop in ParseSet]" );
01227 cdEXIT(EXIT_FAILURE);
01228 }
01229 }
01230
01231 else if( nMatch("TEMP",chCard) )
01232 {
01233
01234 if( nMatch("SOLV",chCard) )
01235 {
01236
01237
01238 if( nMatch("NEW",chCard) )
01239 {
01240
01241 strcpy( conv.chSolverTemp , "new" );
01242 }
01243 else
01244 {
01245
01246 strcpy( conv.chSolverTemp , "simple" );
01247 }
01248 }
01249
01250 else if( nMatch("FLOO",chCard) )
01251 {
01252 i = 5;
01253 StopCalc.TeFloor = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01254
01255
01256 if( StopCalc.TeFloor <= 10. && !nMatch("LINE",chCard) )
01257 {
01258 StopCalc.TeFloor = (float)pow(10.f,StopCalc.TeFloor);
01259 }
01260
01261 if( lgEOL )
01262 {
01263 NoNumb(chCard);
01264 }
01265
01266 if( StopCalc.TeFloor < 2.8 )
01267 {
01268 fprintf( ioQQQ, " TE < 3K, reset to 2.8K.\n" );
01269 StopCalc.TeFloor = 2.8f;
01270 }
01271 }
01272
01273 else if( nMatch("CONV",chCard) || nMatch("TOLE",chCard) )
01274 {
01275
01276 i = 5;
01277 conv.HeatCoolRelErrorAllowed = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01278 if( lgEOL )
01279 {
01280 NoNumb(chCard);
01281 }
01282 if( conv.HeatCoolRelErrorAllowed <= 0. )
01283 {
01284 conv.HeatCoolRelErrorAllowed = (float)pow(10.f,conv.HeatCoolRelErrorAllowed);
01285 }
01286 }
01287
01288 else
01289 {
01290 fprintf( ioQQQ, "\nI did not recognize a keyword on this SET TEPERATURE command.\n%s\n" , chCard);
01291 fprintf( ioQQQ, "The keywords are SOLVer, FLOOr, and CONVergence.\n" );
01292 puts( "[Stop in ParseSet]" );
01293 cdEXIT(EXIT_FAILURE);
01294 }
01295 }
01296
01297 else if( nMatch("TEST",chCard) )
01298 {
01299
01300 lgTestCodeEnabled = true;
01301 }
01302
01303 else if( nMatch("TRIM",chCard) )
01304 {
01305
01306
01307
01308 i = 5;
01309 if( nMatch("UPPE",chCard) )
01310 {
01311
01312 double save = ionbal.trimhi;
01313 ionbal.trimhi = pow(10.,FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL));
01314 if( lgEOL && nMatch(" OFF",chCard) )
01315 {
01316
01317 lgEOL = false;
01318 ionbal.lgTrimhiOn = false;
01319
01320 ionbal.trimhi = save;
01321 }
01322 }
01323
01324 else if( nMatch("LOWE",chCard) )
01325 {
01326
01327 ionbal.trimlo = pow(10.,FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL));
01328 }
01329
01330
01331 else if( nMatch("SMAL",chCard) || nMatch(" OFF",chCard) )
01332 {
01333
01334 ionbal.trimlo = SMALLFLOAT;
01335 ionbal.trimhi = SMALLFLOAT;
01336 lgEOL = false;
01337 }
01338
01339 else
01340 {
01341
01342 ionbal.trimhi = pow(10.,FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL));
01343
01344
01345 ionbal.trimlo = ionbal.trimhi;
01346 }
01347
01348 if( lgEOL )
01349 {
01350 NoNumb(chCard);
01351 }
01352
01353 if( ionbal.trimlo >= 1. || ionbal.trimhi >= 1. )
01354 {
01355 fprintf( ioQQQ, " number must be negative since log\n" );
01356 puts( "[Stop in ParseSet]" );
01357 cdEXIT(EXIT_FAILURE);
01358 }
01359 }
01360
01361 else if( nMatch("SKIP",chCard) )
01362 {
01363
01364 i = 5;
01365 punch.ncPunchSkip = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01366 if( lgEOL )
01367 {
01368 NoNumb(chCard);
01369 }
01370 }
01371
01372 else if( nMatch(" UTA",chCard) )
01373 {
01374
01375
01376 if( nMatch("GU06" , chCard ) )
01377 {
01378 if( nMatch(" OFF" , chCard ) )
01379 {
01380
01381 ionbal.lgInnerShell_Gu06 = false;
01382 }
01383 else
01384 {
01385
01386
01387
01388 ionbal.lgInnerShell_Gu06 = true;
01389 }
01390 }
01391 else if( nMatch("KISI" , chCard ) )
01392 {
01393 if( nMatch(" OFF" , chCard ) )
01394 {
01395
01396 ionbal.lgInnerShell_Kisielius = false;
01397 }
01398 else
01399 {
01400
01401 ionbal.lgInnerShell_Kisielius = true;
01402 }
01403 }
01404 }
01405
01406 else if( nMatch("EAKH",chCard) )
01407 {
01408
01409 i = 5;
01410 punch.WeakHeatCool = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01411
01412 if( lgEOL )
01413 {
01414 NoNumb(chCard);
01415 }
01416
01417 if( punch.WeakHeatCool < 0. )
01418 {
01419 punch.WeakHeatCool = (float)pow(10.f,punch.WeakHeatCool);
01420 }
01421 }
01422
01423 else if( nMatch("KSHE",chCard) )
01424 {
01425
01426 i = 5;
01427 continuum.EnergyKshell = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01428 if( lgEOL )
01429 {
01430 NoNumb(chCard);
01431 }
01432
01433 if( continuum.EnergyKshell == 0. )
01434 {
01435
01436 continuum.EnergyKshell = rfield.egamry;
01437 }
01438
01439 else if( continuum.EnergyKshell < 194. )
01440 {
01441 fprintf( ioQQQ, " k-shell energy must be greater than 194 Ryd\n" );
01442 puts( "[Stop in ParseSet]" );
01443 cdEXIT(EXIT_FAILURE);
01444 }
01445 }
01446
01447 else if( nMatch("NCHR",chCard) )
01448 {
01449
01450 long ii = 5;
01451 double val = FFmtRead(chCard,&ii,INPUT_LINE_LENGTH,&lgEOL);
01452
01453 if( lgEOL )
01454 {
01455 NoNumb(chCard);
01456 }
01457 else
01458 {
01459 long nChrg = nint(val);
01460 if( nChrg < 2 || nChrg > NCHS )
01461 {
01462 fprintf( ioQQQ, " illegal value for number of charge states: %ld\n", nChrg );
01463 fprintf( ioQQQ, " choose a value between 2 and %ld\n", NCHS );
01464 fprintf( ioQQQ, " or increase NCHS in grainvar.h and recompile\n" );
01465 puts( "[Stop in ParseSet]" );
01466 cdEXIT(EXIT_FAILURE);
01467 }
01468 else
01469 {
01470 SetNChrgStates(nChrg);
01471 }
01472 }
01473 }
01474
01475 else if( nMatch("NEGO",chCard) )
01476 {
01477
01478 opac.lgNegOpacIO = true;
01479 }
01480
01481 else if( nMatch("NEND",chCard) )
01482 {
01483
01484
01485
01486
01487 if( geometry.lgEndDflt )
01488 {
01489 i = 5;
01490
01491 geometry.nEndDflt = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01492 geometry.lgEndDflt = false;
01493 if( lgEOL )
01494 {
01495 NoNumb(chCard);
01496 }
01497
01498
01499 for( i=0; i < iterations.iter_malloc; i++ )
01500 {
01501 geometry.nend[i] = geometry.nEndDflt;
01502 }
01503 }
01504 }
01505
01506 else if( nMatch("TSQD",chCard) )
01507 {
01508
01509
01510 i = 5;
01511 peimbt.tsqden = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01512
01513 if( lgEOL )
01514 {
01515 NoNumb(chCard);
01516 }
01517 peimbt.tsqden = (float)pow(10.f,peimbt.tsqden);
01518 }
01519
01520 else if( nMatch("NMAP",chCard) )
01521 {
01522
01523 i = 5;
01524 map.nMapStep = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01525 if( lgEOL )
01526 {
01527 NoNumb(chCard);
01528 }
01529 }
01530
01531 else if( nMatch("NUME",chCard) && nMatch("DERI",chCard) )
01532 {
01533
01534 NumDeriv.lgNumDeriv = true;
01535 }
01536
01537 else if( nMatch("PATH",chCard) )
01538 {
01539 fprintf( ioQQQ, " The SET PATH command is no longer supported.\n" );
01540 fprintf( ioQQQ, " Please set the correct path in the file path.cpp.\n" );
01541 fprintf( ioQQQ, " Or set the environment variable CLOUDY_DATA_PATH.\n" );
01542 puts( "[Stop in ParseSet]" );
01543 cdEXIT(EXIT_FAILURE);
01544 }
01545
01546 else if( nMatch("PHFI",chCard) )
01547 {
01548
01549 i = 5;
01550 ip = (long)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01551 if( lgEOL )
01552 {
01553 NoNumb(chCard);
01554 }
01555
01556 if( ip == 1995 )
01557 {
01558
01559 t_ADfA::Inst().set_version( PHFIT95 );
01560 }
01561 else if( ip == 1996 )
01562 {
01563
01564 t_ADfA::Inst().set_version( PHFIT96 );
01565 }
01566 else
01567 {
01568 fprintf( ioQQQ, " Two possible values are 1995 and 1996.\n" );
01569 puts( "[Stop in ParseSet]" );
01570 cdEXIT(EXIT_FAILURE);
01571 }
01572 }
01573
01574
01575 else if( nMatch("PUNC",chCard) )
01576 {
01577 if( nMatch("HASH",chCard) )
01578 {
01579
01580 if( !lgQuotesFound )
01581 {
01582 fprintf( ioQQQ, " I didn\'t recognize a key on this SET PUNCH HASH line.\n" );
01583 puts( "[Stop in ParseSet]" );
01584 cdEXIT(EXIT_FAILURE);
01585 }
01586
01587
01588
01589
01590
01591
01592
01593 if( strcmp( chString_quotes_lowercase , "return" ) == 0 )
01594 {
01595
01596 sprintf(punch.chHashString , "\n" );
01597 }
01598 else if( strcmp( chString_quotes_lowercase , "time" ) == 0 )
01599 {
01600
01601 sprintf(punch.chHashString , "TIME_DEP" );
01602 }
01603 else
01604 {
01605
01606 sprintf(punch.chHashString , chString_quotes_lowercase );
01607 }
01608 }
01609
01610 else if( nMatch("WIDT",chCard) )
01611 {
01612
01613 i = 5;
01614
01615 punch.PunchLWidth = (float)FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01616
01617
01618 if( lgEOL )
01619 {
01620 if( nMatch(" C " , chCard ) )
01621 {
01622
01623 punch.PunchLWidth = (float)(SPEEDLIGHT/1e5);
01624 }
01625 else
01626 {
01627 NoNumb(chCard);
01628 }
01629 }
01630
01631 if( punch.PunchLWidth <= 0. )
01632 {
01633 fprintf( ioQQQ, " line width must be greater than zero.\n" );
01634 puts( "[Stop in ParseSet]" );
01635 cdEXIT(EXIT_FAILURE);
01636 }
01637
01638
01639
01640 else if( punch.PunchLWidth*0.9999e5 > SPEEDLIGHT )
01641 {
01642 fprintf( ioQQQ, " line width must be entered in km/s and be less than c.\n" );
01643 puts( "[Stop in ParseSet]" );
01644 cdEXIT(EXIT_FAILURE);
01645 }
01646
01647
01648 punch.PunchLWidth = (float)(SPEEDLIGHT/(punch.PunchLWidth*1e5));
01649
01650 }
01651
01652 else if( nMatch("PREF",chCard) )
01653 {
01654
01655
01656
01657
01658
01659
01660
01661
01662 strcpy( punch.chFilenamePrefix , chString_quotes_lowercase );
01663 }
01664
01665 else if( nMatch("FLUS",chCard) )
01666 {
01667
01668 punch.lgFLUSH = true;
01669 }
01670
01671 else
01672 {
01673 fprintf( ioQQQ, " There should have been an option on this command.\n" );
01674 fprintf( ioQQQ, " Valid options are HASH and PREFIX.\n" );
01675 puts( "[Stop in ParseSet]" );
01676 cdEXIT(EXIT_FAILURE);
01677 }
01678 }
01679
01680
01681 else if( nMatch("CONT" , chCard ) )
01682 {
01683 if( nMatch("RESO" , chCard ) )
01684 {
01685
01686
01687 i = 5;
01688 continuum.ResolutionScaleFactor = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
01689 if( lgEOL )
01690 {
01691 NoNumb(chCard);
01692 }
01693
01694 if( continuum.ResolutionScaleFactor <= 0. )
01695 continuum.ResolutionScaleFactor = pow(10.,continuum.ResolutionScaleFactor);
01696 }
01697
01698 else if( nMatch("SHIE" , chCard ) )
01699 {
01700
01701
01702
01703
01704
01705
01706 if( nMatch("PESC" , chCard ) )
01707 {
01708
01709 rt.nLineContShield = LINE_CONT_SHIELD_PESC;
01710 }
01711 else if( nMatch("FEDE" , chCard ) )
01712 {
01713
01714
01715
01716
01717 rt.nLineContShield = LINE_CONT_SHIELD_FEDERMAN;
01718 }
01719 else if( nMatch("FERL" , chCard ) )
01720 {
01721 rt.nLineContShield = LINE_CONT_SHIELD_FERLAND;
01722 }
01723 else if( nMatch("NONE" , chCard ) )
01724 {
01725
01726 rt.nLineContShield = 0;
01727 }
01728 else
01729 {
01730 fprintf( ioQQQ, " I didn\'t recognize a key on this SET CONTINUUM SHIELDing line.\n" );
01731 fprintf( ioQQQ, " The ones I know about are: PESC, FEDErman, & FERLand.\n" );
01732 puts( "[Stop in ParseSet]" );
01733 cdEXIT(EXIT_FAILURE);
01734 }
01735 }
01736
01737 else
01738 {
01739 fprintf( ioQQQ, " I didn\'t recognize a key on this SET CONTINUUM line.\n" );
01740 fprintf( ioQQQ, " The ones I know about are: RESOlution and SHIEld.\n" );
01741 puts( "[Stop in ParseSet]" );
01742 cdEXIT(EXIT_FAILURE);
01743 }
01744 }
01745
01746 else
01747 {
01748 fprintf( ioQQQ, " I didn\'t recognize a key on this SET command.\n" );
01749 puts( "[Stop in ParseSet]" );
01750 cdEXIT(EXIT_FAILURE);
01751 }
01752
01753
01754 DEBUG_EXIT( "ParseSet()" );
01755 return;
01756 }
01757