54 if(
GetQuote( chString_quotes_lowercase , chCard ,
false ) )
55 lgQuotesFound =
false;
73 else if(
nMatch(
"ATOM",chCard) &&
nMatch(
"DATA", chCard ) )
77 bool lgAs=false , lgCS=false , lgDR=
false;
81 if(
nMatch(
" AS " , chCard ) )
84 else if(
nMatch(
" DR " , chCard ) )
87 else if(
nMatch(
" CS " , chCard ) )
92 fprintf(
ioQQQ,
" One of the keywords AS DR or CS must appear to change"
93 " the transition probabilities, dielectronic recombination rate,"
94 " or collision strength.\n Sorry.\n" );
99 if(
nMatch(
" ION",chCard) )
103 if( (nelem =
GetElem(chCard))<0 )
105 fprintf(
ioQQQ,
" An element name must appear on this line\n Sorry.\n" );
112 if( !lgEOL && (ion< 1 || ion>nelem+1) )
114 fprintf(
ioQQQ,
" The ionization stage is not valid\n Sorry.\n" );
119 if( nelem==
ipOXYGEN && ion == 2 && lgAs )
121 if(
nMatch(
" NEW" , chCard ) )
125 else if(
nMatch(
" OLD" , chCard ) )
132 fprintf(
ioQQQ,
" The keyword old or new must appear\n Sorry.\n" );
143 if(
nMatch(
" MIX" , chCard ) )
146 else if(
nMatch(
"PURE" , chCard ) )
149 else if(
nMatch(
"SCAL" , chCard ) )
157 for( ion=1; ion<5; ++ion )
170 ioQQQ,
" One of the keywords MIX, PURE, or SCALe must"
171 "appear on the set atomic physics sulphur dr command.\n"
178 fprintf(
ioQQQ,
" None of the valid set atomic data atoms/ions were found\n Sorry.\n" );
185 if(
nMatch(
" H2 ",chCard) )
193 fprintf(
ioQQQ,
" No molecule was on this SET ATOMIC DATA command.\n Sorry.\n" );
194 fprintf(
ioQQQ,
" Use SET ATOMIC DATA ION to change an ion.\n Sorry.\n" );
198 if( strcmp( chMole ,
"H2" )==0 )
200 if(
nMatch(
" H " , chCard ) && lgCS )
215 else if( nYear == 2007 )
223 fprintf(
ioQQQ,
" the SET ATOMIC DATA MOLECULE H2"
224 " H CS command must have year 1999 or 2007.\n" );
228 else if(
nMatch(
" He" , chCard ) && lgCS )
231 if(
nMatch(
"ORNL" , chCard ) )
237 else if(
nMatch(
"BOUR",chCard ) )
247 fprintf(
ioQQQ,
" the SET ATOMIC DATA MOLECULE H2"
248 "He CS command must have ORNL or Le BOURlot.\n" );
258 else if(
nMatch(
" CHA",chCard) && !
nMatch(
"HO ", chCard ) )
274 else if(
nMatch(
"CHEM",chCard ) && !
nMatch(
"HO ", chCard ) )
277 if(
nMatch(
"FEDE",chCard ) )
279 if(
nMatch(
" ON " , chCard ) )
285 else if(
nMatch(
" OFF" , chCard ) )
296 else if(
nMatch(
" NON",chCard ) &&
nMatch(
"EQUI", chCard ))
313 if(
nMatch(
"NEUT",chCard ) )
315 if(
nMatch(
" ON " , chCard ) )
321 else if(
nMatch(
" OFF" , chCard ) )
347 else if(
nMatch(
"PROT",chCard ) &&
nMatch(
"ELIM", chCard ) )
349 if(
nMatch(
" ON " , chCard ) )
355 else if(
nMatch(
" OFF" , chCard ) )
369 fprintf(
ioQQQ,
" There should have been an option on this SET CHEMISTRY command.\n" );
370 fprintf(
ioQQQ,
" consult Hazy to find valid options.\n Sorry.\n" );
378 if(
nMatch(
" OFF",chCard) )
389 else if(
nMatch(
"COVE",chCard) )
393 if(
nMatch(
"FAST",chCard) )
405 else if(
nMatch(
"CSUP",chCard) )
418 else if(
nMatch(
" D/H",chCard) )
433 else if(
nMatch(
" HO " , chCard) &&
nMatch(
"CHAR" , chCard) )
437 if(
nMatch(
"CHEM" , chCard ) )
442 else if(
nMatch(
"IONI" , chCard ) )
449 fprintf(
ioQQQ,
" I did not recognize a subkey on this SET OH CHARge transfer line.\n" );
450 fprintf(
ioQQQ,
" Valid keys are CHEMistry and IONIzation.\n" );
455 else if(
nMatch(
"12C1",chCard) )
473 else if(
nMatch(
"DYNA",chCard) )
485 if(
nMatch(
"FRAC",chCard) )
501 else if(
nMatch(
"PRES",chCard) &&
nMatch(
"MODE",chCard) )
504 if(
nMatch(
"SUBS",chCard) )
509 else if(
nMatch(
"SUPE",chCard) )
514 else if(
nMatch(
"STRO",chCard) )
519 else if(
nMatch(
"ORIG",chCard) )
525 else if(
nMatch(
"ANTI",chCard) &&
nMatch(
"DEPT",chCard) )
537 else if(
nMatch(
"ANTI",chCard) &&
nMatch(
"MACH",chCard) )
548 else if(
nMatch(
"RELA",chCard) )
558 fprintf(
ioQQQ,
" First iteration to relax dynamics must be > 1."
559 "It was %li. Sorry.\n",
564 else if(
nMatch(
"SHOC",chCard) &&
nMatch(
"DEPT",chCard) )
579 fprintf(
ioQQQ,
" There should have been an option on this SET DYNAMICS command.\n" );
580 fprintf(
ioQQQ,
" consult Hazy to find valid options.\n Sorry.\n" );
585 else if(
nMatch(
"DIDZ",chCard) )
603 else if(
nMatch(
"EDEN",chCard) )
624 else if(
nMatch(
"SOLV",chCard) )
627 if(
nMatch(
"NEW",chCard) )
649 else if(
nMatch(
"FINE",chCard ) &&
nMatch(
"CONT",chCard ) )
658 fprintf(
ioQQQ,
" An element name must appear on this line\n Sorry.\n" );
667 fprintf(
ioQQQ,
" The number of resolution elements within FWHM of line must appear\n Sorry.\n" );
673 else if(
nMatch(
"GRAI",chCard ) && !
nMatch(
" H2 ",chCard) )
675 if(
nMatch(
"HEAT",chCard ) )
689 fprintf(
ioQQQ,
" A keyword must appear on the SET GRAIN line - options are HEAT \n Sorry.\n" );
696 else if(
nMatch(
"LEID",chCard ) &&
nMatch(
"HACK",chCard ) )
698 if(
nMatch(
"H2* " , chCard ) &&
nMatch(
" OFF" , chCard ) )
705 else if(
nMatch(
"CR " , chCard ) &&
nMatch(
" OFF" , chCard ) )
711 else if(
nMatch(
"RATE",chCard ) &&
nMatch(
"UMIS",chCard ))
721 else if(
nMatch(
" H2 ",chCard) )
727 fprintf(
ioQQQ,
" The first number on this line must be the 2 in H2\n Sorry.\n" );
734 if(
nMatch(
"SOLO",chCard) )
737 fprintf(
ioQQQ,
"PROBLEM - *set H2 Solomon* has been changed to *set H2 small model*."\
738 " This is OK for now but it may not work in a future version.\n");
740 if(
nMatch(
"TH85", chCard ) )
745 else if(
nMatch(
" BHT" , chCard ) )
752 else if(
nMatch(
"BD96" , chCard ) )
759 else if(
nMatch(
"ELWE" , chCard ) )
768 fprintf(
ioQQQ,
" One of the keywords TH85, _BHT, BD96 or ELWErt must appear.\n Sorry.\n" );
777 if(
nMatch(
"DB96" , chCard ) )
782 else if(
nMatch(
"TAKA" , chCard ) )
787 else if(
nMatch(
"THER" , chCard ) )
795 fprintf(
ioQQQ,
" The grain form pump option is wrong.\n Sorry.\n" );
801 else if(
nMatch(
"JURA",chCard) )
803 if(
nMatch(
"TH85", chCard ) )
808 else if(
nMatch(
"CT02" , chCard ) )
813 else if(
nMatch(
"SN99" , chCard ) )
818 else if(
nMatch(
"RATE" , chCard ) )
833 else if(
nMatch(
"SCAL" , chCard ) )
865 fprintf(
ioQQQ,
" The Jura rate option is wrong.\n Sorry.\n" );
871 else if(
nMatch(
" TAD",chCard) )
881 else if(
nMatch(
"FRAC",chCard ) )
903 else if(
nMatch(
"HCOR",chCard) )
911 else if(
nMatch(
" PAH",chCard) )
914 if(
nMatch(
" H0 " , chCard ) )
919 else if(
nMatch(
"CONS" , chCard ) )
925 else if(
nMatch(
"BAKE",chCard ) )
935 fprintf(
ioQQQ,
" one of the keywords H0, BAKES, or CONStant must appear.\n Sorry." );
940 else if(
nMatch(
"PRES",chCard) &&
nMatch(
"IONI",chCard) )
952 fprintf(
ioQQQ,
" The limit must be greater than zero.\n Sorry." );
957 else if(
nMatch(
"PRES",chCard) )
960 if(
nMatch(
"CONV",chCard) )
977 fprintf(
ioQQQ,
" I didn\'t recognize a key on this SET PRESSURE line.\n" );
978 fprintf(
ioQQQ,
" The ones I know about are: CONVergence.\n" );
982 else if(
nMatch(
"RECO",chCard) &&
nMatch(
"MBIN",chCard) )
988 if(
nMatch(
"KLUD",chCard) )
990 if(
nMatch(
"BADN",chCard) )
1006 for( j=1; j<4; ++j )
1015 if(
nMatch(
"NOISE" , chCard ) )
1031 else if(
nMatch(
"BURG" , chCard) )
1034 if(
nMatch(
" ON ",chCard) )
1040 else if(
nMatch(
" OFF",chCard) )
1048 fprintf(
ioQQQ,
" flag ON or OFF must appear.\n" );
1053 else if(
nMatch(
"NUSS" , chCard) )
1056 if(
nMatch(
" ON ",chCard) )
1061 else if(
nMatch(
" OFF",chCard) )
1068 fprintf(
ioQQQ,
" flag ON or OFF must appear.\n" );
1073 else if(
nMatch(
"BADN" , chCard ) )
1076 if(
nMatch(
" OFF" , chCard ) )
1086 if(
nMatch(
"PRIN" , chCard ) )
1091 fprintf(
ioQQQ,
" key KLUDge, BURGess, NUSSbaumer, or BADNell must appear.\n" );
1096 else if(
nMatch(
"RADI",chCard) &&
nMatch(
"ATIV",chCard) )
1098 if(
nMatch(
"BADN" , chCard ) )
1101 if(
nMatch(
" OFF" , chCard ) )
1111 if(
nMatch(
"PRIN" , chCard ) )
1116 fprintf(
ioQQQ,
" key BADNell must appear.\n" );
1122 fprintf(
ioQQQ,
" key RADIATIve or DIELECTRonic must appear on set recombination command.\n" );
1127 else if(
nMatch(
"SPEC",chCard) )
1130 if(
nMatch(
"RANG" , chCard ) )
1144 fprintf(
ioQQQ,
" The limits must be in increasing order.\n" );
1149 else if(
nMatch(
"RESO" , chCard ) )
1163 else if(
nMatch(
" DR ",chCard) )
1169 if( !
nMatch(
"LINE",chCard) )
1183 fprintf(
ioQQQ,
"\n Thicknesses less than about %.0e will NOT give accurate results. If tricking the code\n",
1185 fprintf(
ioQQQ,
" into computing emissivities instead of intensities, try to instead use a thickness of unity,\n" );
1186 fprintf(
ioQQQ,
" and then multiply (divide) the results by the necessary thickness (product of densities).\n\n" );
1191 else if(
nMatch(
"DRMA",chCard) )
1204 else if(
nMatch(
"DRMI",chCard) )
1219 else if(
nMatch(
"FLXF",chCard) )
1234 else if(
nMatch(
"LINE",chCard) &&
nMatch(
"PREC",chCard) )
1246 fprintf(
ioQQQ,
" set line precision currently only works for up to 6 significant figures.\n" );
1254 else if(
nMatch(
"NFNU",chCard) )
1272 fprintf(
ioQQQ,
" set nFnu expects one or more of the following keywords:\n" );
1273 fprintf(
ioQQQ,
" INCIDENT_REFLECTED, INCIDENT_TRANSMITTED, DIFFUSE_INWARD, DIFFUSE_OUTWARD\n" );
1281 else if(
nMatch(
"IND2",chCard) )
1283 if(
nMatch(
" ON ",chCard) )
1288 else if(
nMatch(
" OFF",chCard) )
1294 fprintf(
ioQQQ,
" set ind2 needs either ON or OFF.\n" );
1299 else if(
nMatch(
"TEMP",chCard) )
1302 if(
nMatch(
"SOLV",chCard) )
1306 if(
nMatch(
"NEW",chCard) )
1318 else if(
nMatch(
"FLOO",chCard) )
1336 fprintf(
ioQQQ,
" TE < 3K, reset to 2.8K.\n" );
1341 else if(
nMatch(
"CONV",chCard) ||
nMatch(
"TOLE",chCard) )
1358 fprintf(
ioQQQ,
"\nI did not recognize a keyword on this SET TEPERATURE command.\n%s\n" , chCard);
1359 fprintf(
ioQQQ,
"The keywords are SOLVer, FLOOr, and CONVergence.\n" );
1364 else if(
nMatch(
"TEST",chCard) )
1370 else if(
nMatch(
"TRIM",chCard) )
1376 if(
nMatch(
"UPPE",chCard) )
1381 if( lgEOL &&
nMatch(
" OFF",chCard) )
1391 else if(
nMatch(
"LOWE",chCard) )
1398 else if(
nMatch(
"SMAL",chCard) ||
nMatch(
" OFF",chCard) )
1422 fprintf(
ioQQQ,
" number must be negative since log\n" );
1427 else if(
nMatch(
"SKIP",chCard) )
1438 else if(
nMatch(
" UTA",chCard) )
1442 if(
nMatch(
"GU06" , chCard ) )
1444 if(
nMatch(
" OFF" , chCard ) )
1457 else if(
nMatch(
"KISI" , chCard ) )
1459 if(
nMatch(
" OFF" , chCard ) )
1472 else if(
nMatch(
"EAKH",chCard) )
1489 else if(
nMatch(
"KSHE",chCard) )
1507 fprintf(
ioQQQ,
" k-shell energy must be greater than 194 Ryd\n" );
1512 else if(
nMatch(
"NCHR",chCard) )
1524 long nChrg =
nint(val);
1525 if( nChrg < 2 || nChrg >
NCHS )
1527 fprintf(
ioQQQ,
" illegal value for number of charge states: %ld\n", nChrg );
1528 fprintf(
ioQQQ,
" choose a value between 2 and %d\n", NCHS );
1529 fprintf(
ioQQQ,
" or increase NCHS in grainvar.h and recompile\n" );
1539 else if(
nMatch(
"NEGO",chCard) )
1545 else if(
nMatch(
"NEND",chCard) )
1570 else if(
nMatch(
"TSQD",chCard) )
1584 else if(
nMatch(
"NMAP",chCard) )
1595 else if(
nMatch(
"NUME",chCard) &&
nMatch(
"DERI",chCard) )
1601 else if(
nMatch(
"PATH",chCard) )
1603 fprintf(
ioQQQ,
" The SET PATH command is no longer supported.\n" );
1604 fprintf(
ioQQQ,
" Please set the correct path in the file path.h.\n" );
1605 fprintf(
ioQQQ,
" Or set the environment variable CLOUDY_DATA_PATH.\n Sorry.\n" );
1609 else if(
nMatch(
"PHFI",chCard) )
1624 else if( ip == 1996 )
1631 fprintf(
ioQQQ,
" Two possible values are 1995 and 1996.\n" );
1637 else if(
nMatch(
"PUNC",chCard) )
1639 if(
nMatch(
"HASH",chCard) )
1642 if( !lgQuotesFound )
1644 fprintf(
ioQQQ,
" I didn\'t recognize a key on this SET PUNCH HASH line.\n" );
1653 if( strcmp( chString_quotes_lowercase ,
"return" ) == 0 )
1658 else if( strcmp( chString_quotes_lowercase ,
"time" ) == 0 )
1670 else if(
nMatch(
"WIDT",chCard) )
1680 if(
nMatch(
" C " , chCard ) )
1693 fprintf(
ioQQQ,
" line width must be greater than zero.\n" );
1701 fprintf(
ioQQQ,
" line width must be entered in km/s and be less than c.\n" );
1710 else if(
nMatch(
"PREF",chCard) )
1722 else if(
nMatch(
"FLUS",chCard) )
1730 fprintf(
ioQQQ,
" There should have been an option on this command.\n" );
1731 fprintf(
ioQQQ,
" Valid options are HASH and PREFIX.\n" );
1737 else if(
nMatch(
"CONT" , chCard ) )
1739 if(
nMatch(
"RESO" , chCard ) )
1754 else if(
nMatch(
"SHIE" , chCard ) )
1762 if(
nMatch(
"PESC" , chCard ) )
1767 else if(
nMatch(
"FEDE" , chCard ) )
1775 else if(
nMatch(
"FERL" , chCard ) )
1779 else if(
nMatch(
"NONE" , chCard ) )
1786 fprintf(
ioQQQ,
" I didn\'t recognize a key on this SET CONTINUUM SHIELDing line.\n" );
1787 fprintf(
ioQQQ,
" The ones I know about are: PESC, FEDErman, & FERLand.\n" );
1794 fprintf(
ioQQQ,
" I didn\'t recognize a key on this SET CONTINUUM line.\n" );
1795 fprintf(
ioQQQ,
" The ones I know about are: RESOlution and SHIEld.\n" );
1802 fprintf(
ioQQQ,
" I didn\'t recognize a key on this SET command.\n" );