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 }