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