106 high_index = low_index;
129 for(
long k = low_index; k <= high_index; k++ )
165 static void runNLTE(
long int ipPun)
170 int nouter[28] = {0,18,23,5,5,5,5,5,5,5,7,5,5,7,5,5,4,5,6,7,3,4,3,3,4,8,7,0};
185 for(
int ion = 1; ion < nelem+2; ion++)
190 for(
int ion = 1; ion < nelem+2; ion++)
199 long count_nrglvls = 0;
200 for(
int ion = 1; ion < nelem+2; ion++)
227 for(
int lvl = 0; lvl <
dBaseSpecies[ipSpec].numLevels_max; lvl++)
240 Eint +=
iso_sp[ipSpiso][nelem].
st[lvl].Pop()*
iso_sp[ipSpiso][nelem].
st[lvl].energy().eV();
241 partfun +=
iso_sp[ipSpiso][nelem].
st[lvl].g()*exp(-1*
iso_sp[ipSpiso][nelem].st[lvl].
energy().eV()/
245 printf(
"\n insert :\t%li\t%li\n",nelem+1,ipSpiso);
273 double autoion[nelem+1];
275 for(
int ion = 0; ion < nelem+2; ion++)
277 double tempRecomb = 0.;
279 double f_aphoto = 0.;
282 double f_Sphoto = 0.;
319 " %11.3e %11.3e %11.3e %11.3e\n"
320 " %11.3e %11.3e %11.3e %11.3e\n\n",
337 double GcollBF = 0.0;
339 double GphotoBF = 0.0;
341 double GautoBF = 0.0;
345 double QcollBF = 0.0;
347 double QphotoBF = 0.0;
349 double QautoBF = 0.0;
353 double totallevelpop = 0.;
354 double levelpopulation = 0.;
356 for(
int ion = 0; ion < nelem+1; ion++)
380 for(
int lvl = 0; lvl <
dBaseSpecies[ipSpec].numLevels_max; lvl++)
390 totallevelpop +=
iso_sp[ipSpiso][nelem].
st[lvl].Pop();
397 for(
int ion = 1; ion < nelem+1; ion++)
423 for(
int i = 0; i < ion; i++ )
427 long nummaxlevels = 0;
435 for(
int lvl = 0; lvl < nummaxlevels; lvl++)
446 if( lvl == 0 && ion != nelem+1)
450 GautoBF = autoion[ion];
461 GcollBF + GphotoBF + GautoBF;
497 if( Gtotal != 0.&&
dBaseStates[ipSpec][lvl].Pop()>0. )
501 f_GcollBB =
dBaseStates[ipSpec][lvl].DestCollBB()/Gtotal;
502 f_GphotoBB =
dBaseStates[ipSpec][lvl].DestPhotoBB()/Gtotal;
503 f_GcollBF = GcollBF/Gtotal;
504 f_GphotoBF = GphotoBF/Gtotal;
505 f_GautoBF = GautoBF/Gtotal;
537 if( lvl == 0 && ion != 0 )
581 0.0 + QcollBF + QphotoBF + QautoBF;
623 f_QcollBB =
dBaseStates[ipSpec][lvl].CreatCollBB()/Qtotal;
624 f_QcollBF = QcollBF/Qtotal;
625 f_QphotoBF = 0.0/Qtotal;
626 f_QautoBF = QautoBF/Qtotal;
655 if ( totallevelpop != 0 )
657 levelpopulation =
dBaseStates[ipSpec][lvl].Pop()/totallevelpop;
659 levelpopulation =
iso_sp[ipSpiso][nelem].
st[lvl].Pop()/totallevelpop;
668 ener =
dBaseStates[ipSpec][lvl].energy().eV()+ELCF;
672 gf =
iso_sp[ipSpiso][nelem].
st[lvl].g();
673 ener =
iso_sp[ipSpiso][nelem].
st[lvl].energy().eV()+ELCF;
676 " %11.3e %11.3e %11.3e %11.3e %11.3e %11.3e\n"
677 " %11.3e %11.3e %11.3e %11.3e %11.3e %11.3e\n"
716 return realnum(
max(0., 1. - (1.-transmission)*corr ));
727 return log10(
SDIV(value) );
737 static const int LINEWIDTH = 6;
738 class SaveLineResults
741 const LinSv *m_lines[LINEWIDTH];
746 SaveLineResults(FILE *ioPUN,
int typ)
761 for(
long i=0; i <
ipLine; i++ )
764 m_lines[i]->prt(m_ioPUN);
765 fprintf( m_ioPUN,
"\t%.3e", m_lines[i]->SumLine(m_typ) );
778 int getEmType(
int ipPun)
782 ASSERT( nEmType==0 || nEmType==1 );
786 fprintf(
ioQQQ,
" Must 'set cumulative' type before using 'save cumulative' output\n");
854 bool lgLastOnly = (strcmp(chTime,
"LAST") == 0);
874 for( ipPun=0; ipPun <
save.
nsave; ipPun++ )
880 bool lgNoHitFirstBranch =
false;
888 const bool lgActive =
918 else if( strcmp(
save.
chSave[ipPun],
"21CM") == 0 )
924 "%.5e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\n",
954 else if( strcmp(
save.
chSave[ipPun],
"AGES") == 0 )
978 else if( strcmp(
save.
chSave[ipPun],
" AGN") == 0 )
994 fprintf(
ioQQQ,
" SaveDo does not recognize flag %4.4s set for AGN save. This is impossible.\n",
1002 else if( strcmp(
save.
chSave[ipPun],
"MONI") == 0 )
1011 else if( strcmp(
save.
chSave[ipPun],
"AVER") == 0 )
1020 else if( strncmp(
save.
chSave[ipPun],
"CHA",3) == 0 )
1029 else if( strcmp(
save.
chSave[ipPun],
"CHIA") == 0)
1031 static bool lgRunOnce =
true;
1038 double fupsilon = 0.;
1039 double initTemp = 3.0;
1040 double finalTemp = 9.1;
1041 double stepTemp = 0.2;
1042 for (
int ipSpecies=0; ipSpecies <
nSpecies; ++ipSpecies)
1048 tr !=
dBaseTrans[ipSpecies].Emis().end(); ++tr)
1050 ipLo = tr->Tran().ipLo();
1051 ipHi = tr->Tran().ipHi();
1059 for(
double logtemp = initTemp;logtemp < finalTemp;logtemp = logtemp + stepTemp )
1065 for( ipHi = 1; ipHi <
dBaseSpecies[ipSpecies].numLevels_max; ++ipHi )
1067 for( ipLo =0; ipLo < ipHi; ++ipLo )
1071 for(
double logtemp = initTemp;logtemp < finalTemp;logtemp = logtemp + stepTemp )
1084 else if( strcmp(
save.
chSave[ipPun],
"COOL") == 0 ||
1092 else if( strcmp(
save.
chSave[ipPun],
"DOMI") == 0 )
1100 fprintf(
ioQQQ,
"Error in SAVE DOMINANT RATES, species %s not found\n",
1107 vector<const molecule*> debug_list;
1108 debug_list.push_back(debug_species);
1115 else if( strcmp(
save.
chSave[ipPun],
"CHRT") == 0 ||
1118 bool lgCoef =
false;
1119 if( strcmp(
save.
chSave[ipPun],
"CHRC") == 0 )
1125 bool lgHeader, lgData;
1139 else if( strncmp(
save.
chSave[ipPun],
"DYN" , 3) == 0 )
1146 else if( strcmp(
save.
chSave[ipPun],
"ENTH") == 0 )
1150 "%.5e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
1161 else if( strcmp(
save.
chSave[ipPun],
"COMP") == 0 )
1176 else if( strcmp(
save.
chSave[ipPun],
"CON ") == 0 )
1182 bool lgPrintThis =
false;
1221 int nEmType = getEmType(ipPun);
1261 double flxtrn = conem + flxatt;
1300 else if( strcmp(
save.
chSave[ipPun],
"CONN") == 0 )
1306 else if( strcmp(
save.
chSave[ipPun],
"CONC") == 0 )
1325 else if( strcmp(
save.
chSave[ipPun],
"CONG") == 0 )
1352 else if( strcmp(
save.
chSave[ipPun],
"CONR") == 0 )
1363 "\n\n>>>>>>>>>>>>>\n Reflected continuum not predicted when SPHERE is set.\n" );
1396 else if( strcmp(
save.
chSave[ipPun],
"CNVE") == 0 )
1402 "%.5e\t%li\t%.4e\t%.4f\t%.4e\t%.4e\t%.3f\t%.4e\t%.4e\t%.4f\n",
1416 else if( strcmp(
save.
chSave[ipPun],
"CONB") == 0 )
1431 else if( strcmp(
save.
chSave[ipPun],
"COND") == 0 )
1448 double EmisLin = resolution*EN1RYD*
1459 else if( ! lgLastOnly &&
1464 if( lgMustPrintHeader )
1466 lgMustPrintHeader =
false;
1479 double EmisLin = resolution*EN1RYD*
1490 double EmisLin = resolution*EN1RYD*
1501 else if( strcmp(
save.
chSave[ipPun],
"CONE") == 0 )
1541 else if( strcmp(
save.
chSave[ipPun],
"CONf") == 0 )
1561 nskip =
MAX2( 1, nskip );
1567 for(
long jj=1; jj<nskip; ++jj )
1577 }
while( j < nu_hi );
1581 else if( strcmp(
save.
chSave[ipPun],
"CONi") == 0 )
1620 fref, fout, fsum, sum, flxin );
1624 else if( strcmp(
save.
chSave[ipPun],
"CONI") == 0 )
1688 "%li\t%.5e\t%.2e\t%.2e\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2e\t%.2e\t%.4s\t%.4s\n",
1708 " SaveDo, the SAVE IONIZING CONTINUUM command "
1709 "did not find a strongly interacting energy, sum and fsum were %.2e %.2e\n",
1712 " SaveDo, the low-frequency energy was %.5e Ryd\n",
1715 " You can reset the threshold for the lowest fractional "
1716 "interaction to print with the second number of the save command\n"
1717 " The fraction was %.3f and this was too large.\n",
1723 else if( strcmp(
save.
chSave[ipPun],
"CONl") == 0 )
1727 int nEmType = getEmType(ipPun);
1754 double flxtrn = conem + flxatt;
1757 double lowlim, highlim, NRGeV;
1762 if( NRGeV >= lowlim && NRGeV <= highlim )
1778 else if( strcmp(
save.
chSave[ipPun],
"CONS") == 0 )
1789 "%.14e\t%.14e\t%.5e\t%.5e\t%.5e\n",
1798 else if( strcmp(
save.
chSave[ipPun],
"CORA") == 0 )
1810 "%.5e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%4.4s\t%4.4s\t",
1829 else if( strcmp(
save.
chSave[ipPun],
"CONo") == 0 )
1850 else if( strcmp(
save.
chSave[ipPun],
"CONO") == 0 )
1877 else if( strcmp(
save.
chSave[ipPun],
"CONT") == 0 )
1950 double flxtrn = conem + flxatt;
1957 trans_coef_total[j] );
1962 else if( strcmp(
save.
chSave[ipPun],
"CON2") == 0 )
1978 else if( strcmp(
save.
chSave[ipPun],
"DUSE") == 0 )
1994 else if( strcmp(
save.
chSave[ipPun],
"DUSO") == 0 )
2003 "%.5e\t%.2e\t%.2e\t%.2e\t",
2015 for(
size_t nd=0; nd <
gv.
bin.size(); nd++ )
2017 scat +=
gv.
bin[nd]->pure_sc1[j]*
gv.
bin[nd]->dstAbund;
2029 else if( strcmp(
save.
chSave[ipPun],
"DUSA") == 0 ||
2032 bool lgDGRatio = ( strcmp(
save.
chSave[ipPun],
"DUSD") == 0 );
2041 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2050 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2053 gv.
bin[nd]->cnv_H_pCM3;
2063 else if( strcmp(
save.
chSave[ipPun],
"DUSP") == 0 )
2073 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2081 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2087 else if( strcmp(
save.
chSave[ipPun],
"DUSR") == 0 )
2096 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2104 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2110 else if( strcmp(
save.
chSave[ipPun],
"DUST") == 0 )
2120 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2127 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2133 else if( strcmp(
save.
chSave[ipPun],
"DUSC") == 0 )
2144 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2157 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2165 else if( strcmp(
save.
chSave[ipPun],
"DUSH") == 0 )
2175 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2183 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2189 else if( strcmp(
save.
chSave[ipPun],
"DUSV") == 0 )
2199 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2207 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2214 else if( strcmp(
save.
chSave[ipPun],
"DUSQ") == 0 )
2223 for(
size_t nd=0; nd <
gv.
bin.size(); ++nd )
2225 gv.
bin[nd]->chDstLab,
gv.
bin[nd]->chDstLab );
2233 for(
size_t nd=0; nd <
gv.
bin.size(); nd++ )
2236 gv.
bin[nd]->dstab1[j]*4./
gv.
bin[nd]->IntArea,
2244 else if( strcmp(
save.
chSave[ipPun],
"ELEM") == 0 )
2252 long nelem = (
long int)
save.
punarg[ipPun][0];
2267 for( j=0; j <= (nelem + 1); ++j)
2280 for (
size_t ic = 0; ic < chList.size(); ++ic )
2282 vector<genericState> v =
matchGeneric(chList[ic].c_str(),
false);
2284 for (
size_t j=0; j<v.size(); ++j)
2294 else if( strcmp(
save.
chSave[ipPun],
"FRED") == 0 )
2302 "\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e"
2303 "\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e"
2304 "\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e"
2305 "\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\n",
2338 else if( strcmp(
save.
chSave[ipPun],
"FITS") == 0 )
2346 else if( strcmp(
save.
chSave[ipPun],
"GAMt") == 0 )
2352 for(
long nelem=0; nelem <
LIMELM; nelem++ )
2354 for(
long ion=0; ion <= nelem; ion++ )
2359 nelem+1, ion+1, ns+1,
2377 else if( strcmp(
save.
chSave[ipPun],
"GAMe") == 0 )
2397 else if( strcmp(
save.
chSave[ipPun],
"GAUN") == 0 )
2404 else if( strcmp(
save.
chSave[ipPun],
"GRID") == 0 )
2412 lgNoHitFirstBranch =
true;
2429 "#PROBLEM Pressure not converged iter %li zone %li density-pressure follows:\n",
2436 "#PROBLEM Temperature not converged iter %li zone %li density-pressure follows:\n",
2452 else if( strcmp(
save.
chSave[ipPun],
"HISt") == 0 )
2461 "#PROBLEM Pressure not converged iter %li zone %li temp heat cool follows:\n",
2468 "#PROBLEM Temperature not converged iter %li zone %li temp heat cool follows:\n",
2484 else if( strncmp(
save.
chSave[ipPun],
"H2",2) == 0 )
2490 else if( strcmp(
save.
chSave[ipPun],
"HEAT") == 0 )
2497 else if( strncmp(
save.
chSave[ipPun],
"HE",2) == 0 )
2501 if( strcmp(
save.
chSave[ipPun] ,
"HELW") == 0 )
2507 "Z\tElem\t2 1P->1 1S\t2 3P1->1 1S\t2 3P2->1 1S"
2508 "\t2 3S->1 1S\t2 3P2->2 3S\t2 3P1->2 3S\t2 3P0->2 3S" );
2546 else if( strcmp(
save.
chSave[ipPun],
"HUMM") == 0 )
2551 " %.5e %10.3e %10.3e %10.3e %10.3e %10.3e %10.3e\n",
2559 else if( strncmp(
save.
chSave[ipPun] ,
"HYD", 3 ) == 0 )
2568 " %.5e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
2579 else if( strcmp(
save.
chSave[ipPun],
"HYDi") == 0 )
2585 double RateInter = 0.;
2620 "\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
2625 fref/
MAX2(1e-37,fout),
2626 stage/
MAX2(1e-37,fout),
2637 else if( strcmp(
save.
chSave[ipPun],
"HYDp") == 0 )
2658 else if( strcmp(
save.
chSave[ipPun],
"HYDl") == 0 )
2667 for(
long ipLo=0; ipLo<ipHi; ++ipLo )
2684 else if( strcmp(
save.
chSave[ipPun],
"HYDL") == 0 )
2693 "%.5e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\n",
2709 else if( strcmp(
save.
chSave[ipPun],
"HYDr") == 0 )
2716 double ThinCoolingCaseB;
2719 ThinCoolingCaseB =
exp10(((-25.859117 +
2731 (r1+ThinCoolingCaseB)/(BOLTZMANN*
phycon.
te) );
2737 ThinCoolingCaseB/(BOLTZMANN*
phycon.
te));
2742 fprintf(
ioQQQ ,
"save agn now exits since solution is disturbed.\n");
2749 else if( strcmp(
save.
chSave[ipPun],
"IONI") == 0 )
2759 else if( strcmp(
save.
chSave[ipPun],
"IONR") == 0 )
2772 for(
long ion=0; ion<nelem+1; ++ion )
2775 "\t%.4e\t%.4e\t%.4e\t%.4e",
2785 else if( strcmp(
save.
chSave[ipPun],
" IP ") == 0 )
2790 for(
long nelem=0; nelem <
LIMELM; nelem++ )
2796 const int NELEM_LINE = 10;
2798 for( ion_big=0; ion_big<=nelem; ion_big += NELEM_LINE )
2800 int ion_limit =
MIN2(ion_big+NELEM_LINE-1,nelem);
2807 for(
long ion=ion_big; ion <= ion_limit; ++ion )
2814 ASSERT( ion_limit < LIMELM );
2816 for(
long ips=0; ips <
Heavy.
nsShells[nelem][ion_big]; ips++ )
2823 for(
long ion=ion_big; ion<=ion_limit; ++ion )
2839 else if( energy < 100. )
2843 else if( energy < 1000. )
2861 else if( strcmp(
save.
chSave[ipPun],
"LINC") == 0 )
2870 else if( strcmp(
save.
chSave[ipPun],
"LINT") == 0 )
2880 else if( strcmp(
save.
chSave[ipPun],
"LIND") == 0 )
2886 else if( strcmp(
save.
chSave[ipPun],
"LINL") == 0 )
2889 static bool lgRunOnce=
false;
2894 bool lgPrintAll=
false;
2901 else if( strcmp(
save.
chSave[ipPun],
"LINO") == 0 )
2910 else if( strcmp(
save.
chSave[ipPun],
"LINP") == 0 )
2914 static bool lgFirst=
true;
2927 else if( strcmp(
save.
chSave[ipPun],
"LINS") == 0 )
2937 else if( strcmp(
save.
chSave[ipPun],
"LINR") == 0 )
2944 else if( strcmp(
save.
chSave[ipPun],
"LINA") == 0 )
2975 else if( strcmp(
save.
chSave[ipPun],
"LINI") == 0 )
2984 else if( ! lgLastOnly )
2997 else if( strcmp(
save.
chSave[ipPun],
"LEIL") == 0)
3003 double absval , rel;
3009 const int NLINE_H2 = 31;
3011 const int NLINE_NOTH_H2 = 5;
3013 char chLabel[NLINE_NOTH_H2][
NCHLAB]=
3014 {
"C 2",
"O 1",
"O 1",
"C 1",
"C 1" };
3015 double Wl[NLINE_NOTH_H2]=
3016 { 157.636 , 63.1679 , 145.495, 609.590 , 370.269 };
3020 double Wl_H2[NLINE_H2]=
3022 28.213 , 17.03 , 12.2752, 9.66228, 8.02362, 6.90725, 6.10718, 5.50996, 5.05148, 4.69342,
3023 4.40836, 4.17983, 3.99573, 3.84534, 3.72257, 3.62531, 3.54606, 3.48530, 3.43697, 3.40299,
3024 3.37995, 3.36794, 3.36534, 3.37087, 3.38671, 3.40989, 3.44080, 3.48530, 3.54226, 3.60346};
3026 for( n=0; n<NLINE_NOTH_H2; ++n )
3031 if(
cdLine( chLabel[n] , (
realnum)(Wl[n]*1e4) , &rel, &absval ) <= 0 )
3046 "Here are some of the H2 Intensities, The first one is the\n"
3047 "1-0 S(0) line and the following ones are the 0-0 S(X)\n"
3048 "lines where X goes from 0 to 29\n\n");
3049 for( n=0; n<NLINE_H2; ++n )
3053 if(
cdLine(
"H2 " , (
realnum)(Wl_H2[n]*1e4) , &rel, &absval ) <= 0 )
3066 else if( strcmp(
save.
chSave[ipPun],
"LEIS") == 0)
3071 double col_ci , col_oi , col_cii, col_heii;
3072 if(
cdColm(
"carb" , 1 , &col_ci ) )
3074 if(
cdColm(
"carb" , 2 , &col_cii ) )
3076 if(
cdColm(
"oxyg" , 1 , &col_oi ) )
3078 if(
cdColm(
"heli" , 2 , &col_heii ) )
3082 "%.5e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t"
3083 "%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t"
3084 "%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t"
3085 "%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t"
3086 "%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\n",
3167 else if( strcmp(
save.
chSave[ipPun],
"NLTE") == 0)
3177 else if( strcmp(
save.
chSave[ipPun],
"LLST") == 0)
3196 bool lgBadLine =
false;
3200 double relative , absolute, PrtQuantity;
3203 &relative , &absolute , LineType ) ) <=0 )
3207 static bool lgMustPrintFirstTime =
true;
3208 if( lgMustPrintFirstTime )
3211 fprintf(
ioQQQ,
"Did not find an H2 line, the large model is not "
3212 "included, so I will ignore it. Log intensity set to -30.\n" );
3213 fprintf(
ioQQQ,
"I will totally ignore any future missed H2 lines\n");
3214 lgMustPrintFirstTime =
false;
3236 PrtQuantity = absolute;
3238 PrtQuantity = relative;
3258 static double SaveQuantity = 0;
3261 SaveQuantity /
SDIV( PrtQuantity ) );
3263 SaveQuantity = PrtQuantity;
3280 fprintf(
ioQQQ,
"DISASTER - did not find line(s) in the Line List table\n");
3286 else if( strcmp(
save.
chSave[ipPun],
"MAP ") == 0 )
3302 else if( strcmp(
save.
chSave[ipPun],
"MOLE") == 0 )
3307 "#depth\tAV(point)\tAV(extend)\tCO diss rate\tC recom rate");
3347 else if( strcmp(
save.
chSave[ipPun],
"OPAC") == 0 )
3355 else if( strcmp(
save.
chSave[ipPun],
"OPTc") == 0 )
3362 "%13.5e\t%.3e\t%12.4e\t%.3e\n",
3372 else if( strcmp(
save.
chSave[ipPun],
"OPTf") == 0 )
3392 nskip =
MAX2( 1, nskip );
3400 for(
long jj=1; jj<nskip; ++jj )
3409 "%12.6e\t%.3e\t%.3e\n",
3414 }
while( j < nu_hi );
3418 else if( strcmp(
save.
chSave[ipPun],
" OTS") == 0 )
3421 double xLinMax = 0.;
3422 double opConSum = 0.;
3423 double opLinSum = 0.;
3443 "tot con lin=%.2e%.2e lin=%.4s%.4e%.2e con=%.4s%.4e%.2e\n",
3449 else if( strcmp(
save.
chSave[ipPun],
"OVER") == 0 )
3494 for( j=1; j <= 3; j++ )
3505 hold =
MAX2(toosmall, hold );
3509 for( j=1; j <= 4; j++ )
3518 for( j=1; j <= 6; j++ )
3529 hold =
MAX2(toosmall, hold );
3540 else if( strcmp(
save.
chSave[ipPun],
" PDR") == 0 )
3553 "%.5e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t",
3582 else if( strcmp(
save.
chSave[ipPun],
"PERF") == 0 )
3587 "#zone\tdTime\tElapsed t\tnPres2Ioniz" );
3598 static double ElapsedTime , ZoneTime;
3607 ZoneTime = t - ElapsedTime;
3621 else if( strcmp(
save.
chSave[ipPun],
"PHYS") == 0 )
3632 else if( strcmp(
save.
chSave[ipPun],
"PRES") == 0 )
3638 "%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%.5e\t%c\n",
3680 else if( strcmp(
save.
chSave[ipPun],
"PREL") == 0 )
3684 "%.5e\t%.3e\t%.3e\t",
3707 else if( strcmp(
save.
chSave[ipPun],
"RADO") == 0 )
3718 else if( strcmp(
save.
chSave[ipPun],
"RESU") == 0 )
3725 else if( strcmp(
save.
chSave[ipPun],
"RECA") == 0 )
3733 else if( strcmp(
save.
chSave[ipPun],
"RECE") == 0 )
3742 "%12.4e %12.4e %12.4e %12.4e\n",
3756 else if( strcmp(
save.
chSave[ipPun],
"SECO") == 0 )
3761 "%.5e\t%.3e\t%.3e\t%.3e\n",
3768 else if( strcmp(
save.
chSave[ipPun],
"SOUS") == 0 )
3775 for( j=0; j < limit; j++ )
3778 "%.5e\t%.4e\t%.4e\t%.4e\t%.4e\t%.4e\n",
3789 else if( strcmp(
save.
chSave[ipPun],
"SOUD") == 0 )
3795 "%.4e\t%.4e\t%.4e\t%.4e\n",
3803 else if( strcmp(
save.
chSave[ipPun],
"SPEC") == 0 )
3809 else if( strcmp(
save.
chSave[ipPun],
"SPCS") == 0 )
3829 else if( ( ! lgLastOnly && strcmp(
save.
chSaveArgs[ipPun],
"COLU") != 0 ) ||
3834 else if( strcmp(
save.
chSave[ipPun],
"TEMP") == 0 )
3836 static double deriv_old=-1;
3837 double deriv=-1. , deriv_sec;
3861 else if( strcmp(
save.
chSave[ipPun],
"TIMD") == 0 )
3868 else if( strcmp(
save.
chSave[ipPun],
"XTIM") == 0 )
3870 static double ElapsedTime , ZoneTime;
3879 ZoneTime = t - ElapsedTime;
3885 nzone, ZoneTime , ElapsedTime );
3888 else if( strcmp(
save.
chSave[ipPun],
"TPRE") == 0 )
3896 else if( strcmp(
save.
chSave[ipPun],
"WIND") == 0 )
3901 if( (
save.
punarg[ipPun][0] == 0 && lgLastOnly)
3904 (
save.
punarg[ipPun][0] == 1 && ! lgLastOnly ) )
3907 "%.5e\t%.5e\t%.4e\t%.4e\t%.4e\t%.4e\t%.4e\t%.4e\n",
3919 else if( strcmp(
save.
chSave[ipPun],
"XATT") == 0 )
3930 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
3935 else if( strcmp(
save.
chSave[ipPun],
"XRFI") == 0 )
3946 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
3951 else if( strcmp(
save.
chSave[ipPun],
"XINC") == 0 )
3962 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
3967 else if( strcmp(
save.
chSave[ipPun],
"XDFR") == 0 )
3978 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
3983 else if( strcmp(
save.
chSave[ipPun],
"XDFO") == 0 )
3994 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
3999 else if( strcmp(
save.
chSave[ipPun],
"XLNR") == 0 )
4010 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
4015 else if( strcmp(
save.
chSave[ipPun],
"XLNO") == 0 )
4026 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
4031 else if( strcmp(
save.
chSave[ipPun],
"XREF") == 0 )
4042 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
4047 else if( strcmp(
save.
chSave[ipPun],
"XTOT") == 0 )
4058 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
4063 else if( strcmp(
save.
chSave[ipPun],
"XTRN") == 0 )
4074 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
4079 else if( strcmp(
save.
chSave[ipPun],
"XSPM") == 0 )
4090 fprintf(
ioQQQ,
" Cannot save xspec files unless doing a grid.\n" );
4103 fprintf(
ioQQQ,
" PROBLEM DISASTER SaveDo does not recognize flag %4.4s set by ParseSave. This is impossible.\n",
4159 fprintf( ioPUN,
"**********************************************************************************************************************************\n" );
4166 fprintf( ioPUN,
"**********************************************************************************************************************************\n" );
4167 fprintf( ioPUN,
"begin emission lines\n" );
4171 bool lgEmergent =
false;
4176 fixit(
"value of lgEmergent isn't consistent with lgEmergent");
4192 fprintf( ioPUN,
"**********************************************************************************************************************************\n" );
4209 if( strcmp( &*chJob ,
"optical" ) == 0 )
4212 lgSaveOpticalDepths =
true;
4213 lgPopsFirstCall =
false;
4215 else if( strcmp( &*chJob ,
"populat" ) == 0 )
4217 static bool lgFirst=
true;
4218 lgSaveOpticalDepths =
false;
4222 lgPopsFirstCall =
true;
4223 fprintf(ioPUN,
"index\tAn.ion\tgLo\tgUp\tE(wn)\tgf\n");
4228 lgPopsFirstCall =
false;
4244 for(
long nelem=ipISO; nelem <
LIMELM; nelem++ )
4251 for(
long ipLo=0; ipLo <ipHi; ipLo++ )
4263 if( lgSaveOpticalDepths )
4270 for(
long ipHi=
iso_sp[ipISO][nelem].st[
iso_sp[ipISO][nelem].numLevels_local-1].n()+1; ipHi <
iso_ctrl.
nLyman[ipISO]; ipHi++ )
4299 for (
int ipSpecies=0; ipSpecies <
nSpecies; ++ipSpecies)
4303 em !=
dBaseTrans[ipSpecies].Emis().end(); ++em)
4306 Save1Line( (*em).Tran(), ioPUN, xLimit, index, DopplerWidth );
4319 if( lgSaveOpticalDepths )
4346 else if( lgPopsFirstCall )
4351 fprintf(ioPUN,
"\t%.0f\t%.0f",
4352 (*t.
Lo()).g() ,(*t.
Hi()).g());
4354 fprintf(ioPUN,
"\t%.2f\t%.3e",
4361 if( (*t.
Hi()).Pop() > xLimit )
4368 fprintf(ioPUN,
"%li\t%.2e\t%.2e\n", index, (*t.
Lo()).Pop(), (*t.
Hi()).Pop() );
4377 long int ipLo, ipHi,
4397 ncells = ipHi - ipLo + 1;
4400 cont_incid = (
double *)
MALLOC( (
size_t)(ncells+1)*
sizeof(
double) );
4401 cont_atten = (
double *)
MALLOC( (
size_t)(ncells+1)*
sizeof(
double) );
4402 diffuse_in = (
double *)
MALLOC( (
size_t)(ncells+1)*
sizeof(
double) );
4403 diffuse_out = (
double *)
MALLOC( (
size_t)(ncells+1)*
sizeof(
double) );
4404 emis_lines_out = (
double *)
MALLOC( (
size_t)(ncells+1)*
sizeof(
double) );
4405 emis_lines_in = (
double *)
MALLOC( (
size_t)(ncells+1)*
sizeof(
double) );
4409 fixit(
"all of these should be rerouted to cdSPEC2, but units not right");
4417 cdSPEC( 1 , ncells , cont_incid );
4419 cdSPEC( 2 , ncells , cont_atten );
4421 cdSPEC( 5 , ncells , diffuse_in );
4423 cdSPEC( 4 , ncells , diffuse_out );
4426 cdSPEC( 6 , ncells , emis_lines_out );
4428 cdSPEC( 7 , ncells , emis_lines_in );
4444 for( j=0; j<ncells-1; ++j )
4448 fprintf( ioPUN,
"%.3e\t", cont_incid[j] );
4449 fprintf( ioPUN,
"%.3e\t", cont_atten[j] );
4450 fprintf( ioPUN,
"%.3e\t", diffuse_in[j]+diffuse_out[j] );
4452 emis_lines_out[j]+emis_lines_in[j] );
4460 free(emis_lines_out);
4461 free(emis_lines_in);
4470 realnum te[NTE] = {5000., 10000., 15000., 20000.};
4479 for( i=0;i<NTE; ++i)
4500 for( i=0;i<NTE; ++i)
4502 fprintf(ioPUN,
"\tT=%.0f",te[i]);
4512 for( i=0;i<NTE; ++i)
4521 for( i=0;i<NTE; ++i)
4523 free( agn_continuum[i] );
4530 fprintf(
ioQQQ,
"AGN_Hemis - result of save AGN3 hemis - I have left the code in a disturbed state, and will now exit.\n");
4538 long int i , nelem , ion;
4545 fprintf( ioPUN,
"**********************************************************************************************************************************\n" );
4551 fprintf( ioPUN,
"**********************************************************************************************************************************\n" );
4555 fprintf( ioPUN,
"BEGIN EMISSION LINES\n" );
4556 SaveLineResults slr(ioPUN,0);
4570 fprintf( ioPUN,
"BEGIN COLUMN DENSITIES\n" );
4578 for( nelem=0; nelem<
LIMELM; nelem++ )
4580 for(ion=0; ion < nelem+1; ion++)
4584 if( nelem==9|| nelem==19 || nelem==29 )
4591 fprintf( ioPUN,
"END OF RESULTS\n" );
4592 fprintf( ioPUN,
"**********************************************************************************************************************************\n" );
4630 static const int NENR_GAUNT = 33;
4631 static const int NTE_GAUNT = 20;
4633 double ener[NENR_GAUNT], ste[NTE_GAUNT], g[NENR_GAUNT][NTE_GAUNT];
4638 for(
int i=0; i < NTE_GAUNT; i++ )
4639 ste[i] = 0.5f*(i+1);
4641 for(
int i=0; i < NENR_GAUNT; i++ )
4642 ener[i] = 0.5f*i - 9.f;
4644 for(
int charge=1; charge <=
LIMELM; charge++ )
4647 for(
int ite=0; ite < NTE_GAUNT; ite++ )
4649 for(
int j=0; j < NENR_GAUNT; j++ )
4656 fprintf( ioPUN,
"\tlg(nu)\\lg(Te)" );
4657 for(
int i=1; i <= NTE_GAUNT; i++ )
4658 fprintf( ioPUN,
"\t%.3e", ste[i-1] );
4661 for(
int j=0; j < NENR_GAUNT; j++ )
4663 fprintf( ioPUN,
"\t%10.3e", ener[j] );
4664 for(
int ite=0; ite < NTE_GAUNT; ite++ )
4665 fprintf( ioPUN,
"\t%.3e", g[j][ite] );
4669 fprintf( ioPUN,
"\tlg(nu)/lg(Te)" );
4670 for(
int i=0; i < NTE_GAUNT; i++ )
4671 fprintf( ioPUN,
"\t%.3e", ste[i] );
4674 fprintf( ioPUN,
"Below is log(gamma^2), log(u), gff\n" );
4677 double z = log10((
double)charge);
4679 for(
int i=0; i < NTE_GAUNT; i++ )
4681 for(
int j=0; j < NENR_GAUNT; j++ )
4683 fprintf( ioPUN,
"\t%10.3e\t%10.3e\t%10.3e\n",
4684 2.*z + log10(TE1RYD) - ste[i],
4685 log10(TE1RYD) + ener[j] - ste[i],
4689 fprintf( ioPUN,
"end of charge = %i\n", charge );
4690 fprintf( ioPUN,
"****************************\n" );
4698 if( pnunit == NULL )
4704 fprintf( pnunit,
"#Index\tFailure?\tWarnings?\tExit code\t#rank\t#seq" );
4712 fprintf( pnunit,
"\t%s", chStr );
4714 fprintf( pnunit,
"\tgrid parameter string\n" );
4718 fprintf( pnunit,
"%9.9ld\t%c\t%c\t%20s\t%ld\t%ld",
4727 char chStringHold[100];
4729 strcpy( chGridParam, chStringHold );
4735 strcat( chGridParam, chStringHold );
4739 fprintf( pnunit,
"\t%s\n", chGridParam );
STATIC void SaveLineStuff(FILE *ioPUN, const char *chJob, realnum xLimit)
void AGN_He1_CS(FILE *ioPun)
bool lgPunLstIter[LIMPUN]
long getCounterZone(const long type) const
realnum ** ConSourceFcnLocal
double ** DR_Badnell_rate_coef
double HydroRecCool(long int n, long int ipZ)
t_mole_global mole_global
vector< double > hist_pres_density
double TexcLine(const TransitionProxy &t)
double H2_Solomon_dissoc_rate_used_H2g
realnum punarg[LIMPUN][3]
void prt_wl(FILE *ioOUT, realnum wl)
long int ipElement[LIMELM][LIMELM][7][3]
void prt_LineLabels(FILE *ioOUT, bool lgPrintAll)
void SaveSpecial(FILE *io, const char *chTime)
string chIonLbl(const TransitionProxy &t)
void CoolSave(FILE *io, const char chJob[])
TransitionList UTALines("UTALines",&AnonStates)
vector< double > hist_pres_error
string chLineLbl(const TransitionProxy &t)
NORETURN void TotalInsanity(void)
double widflx(size_t i) const
realnum * DiffuseLineEmission
realnum ph1(int i, int j, int k, int l) const
vector< string > chContLabel
string mesh_md5sum() const
void save_line(FILE *ip, const char *chDo, bool lgEmergent, long ipPun)
realnum PresIntegElecThin
static const long VERSION_TRNCON
void cdCautions(FILE *ioOUT)
realnum ** flux_total_incident
void DynaSave(FILE *ipPnunit, char chJob)
bool lgTimeDependentStatic
void cdWarnings(FILE *ioPNT)
double CHIANTI_Upsilon(long, long, long, long, double)
STATIC void SaveGaunts(FILE *ioPUN)
TransitionList HFLines("HFLines",&AnonStates)
double findrk(const char buf[]) const
void SaveSpeciesBands(const long ipPun, const string &speciesLabel, const string &fileBands)
char chHashString[INPUT_LINE_LENGTH]
NORETURN void SaveLineData(FILE *io)
vector< genericState > matchGeneric(const char *chLabel, bool lgValidate)
sys_float sexp(sys_float x)
void ion_recombAGN(FILE *io)
long ipFineCont(double energy_ryd)
char chVarFmt[LIMPAR][FILENAME_PATH_LENGTH_2]
molezone * findspecieslocal(const char buf[])
void PrtMeanIon(char chType, bool lgDensity, FILE *)
TransitionList TauLine2("TauLine2",&AnonStates)
void PrtLinePres(FILE *ioPRESSURE)
void cdSPEC2(int Option, long int nEnergy, long int ipLoEnergy, long int ipHiEnergy, realnum ReturnedSpectrum[])
double anu(size_t i) const
void TempChange(double TempNew, bool lgForceUpdate)
void mole_save(FILE *punit, const char speciesname[], const char args[], bool lgHeader, bool lgData, bool lgCoef, double depth)
double pres_radiation_lines_curr
vector< realnum > GraphiteEmission
void SaveDo(const char *chTime)
t_elementnames elementnames
t_iso_sp iso_sp[NISO][LIMELM]
long int nflux_with_check
static bool lgSaveOpticalDepths
bool lgCumulative[LIMPUN]
const realnum * getCoarseTransCoef()
realnum ** interpParameters
double xIonDense[LIMELM][LIMELM+1]
vector< double > hist_temp_cool
string SpeciesBandFile[LIMPUN]
bool fp_equal(sys_float x, sys_float y, int n=3)
void SaveSpeciesOptDep(const long int ipPun, const string &speciesLabel)
void save_opacity(FILE *io, long int np)
bool lg_separate_iterations[LIMPUN]
const char * getCounterName(const long type) const
ColliderList colliders(dense)
long ipoint(double energy_ryd)
long nelec_eject(long n, long i, long ns) const
realnum & EnergyWN() const
void SaveGrid(FILE *pnunit, exit_type status)
long int nsShells[LIMELM][LIMELM]
vector< realnum > GrainEmission
realnum elec_eject_frac(long n, long i, long ns, long ne) const
double energy(const genericState &gs)
char chSaveArgs[LIMPUN][5]
realnum & dampXvel() const
EmissionList::reference Emis() const
multi_arr< int, 3 > ipExtraLymanLines
void Save_Line_RT(FILE *ip)
STATIC void FindStrongestLineLabels(void)
vector< double > hist_pres_current
molecule * findspecies(const char buf[])
double ** UTA_ionize_rate
void GridGatherInCloudy(void)
vector< double > hist_temp_temp
valarray< class molezone > species
const int NUM_OUTPUT_TYPES
realnum AccelTotalOutward
void cdSPEC(int Option, long int nEnergy, double ReturnedSpectrum[])
const int INPUT_LINE_LENGTH
long int nSaveEveryZone[LIMPUN]
qList::iterator Hi() const
bool lgLineListRatio[LIMPUN]
vector< string > chLineListLabel[LIMPUN]
double anu2(size_t i) const
diatomics h2("h2", 4100.,&hmi.H2_total, Yan_H2_CS)
realnum GetDopplerWidth(realnum massAMU)
sys_float safe_div(sys_float x, sys_float y, sys_float res_0by0)
realnum * OccNumbIncidCont
double column(const genericState &gs)
void map_do(FILE *io, const char *chType)
double PrtLogLin(double value)
static bool lgMustPrintHeader
vector< string > chLineLabel
double heating(long nelem, long ion)
double H2_photodissoc_used_H2g
double AnuUnit(realnum energy)
double anumin(size_t i) const
SaveParams params[LIMPUN]
double **** PhotoRate_Shell
double gauntff(long Z, double Te, double anu)
TransitionProxy trans(const long ipHi, const long ipLo)
realnum PrettyTransmission(long j, realnum transmission)
char chElementSym[LIMELM][CHARS_ELEMENT_SYM]
realnum gas_phase[LIMELM]
realnum UV_Cont_rel2_Draine_DB96_depth
double *** CollIonRate_Ground
bool lgSaveEveryZone[LIMPUN]
realnum AtomicWeight[LIMELM]
void SaveHeaderDone(int ipPun)
void sprt_wl(char *chString, realnum wl)
bool lgPrtIsotropicCont[LIMPUN]
double sound_speed_adiabatic
qList::iterator Lo() const
double OccupationNumberLine(const TransitionProxy &t)
void mole_dominant_rates(const vector< const molecule * > &debug_list, FILE *ioOut, bool lgPrintReagents, size_t NPRINT, double fprint)
long int cdLine(const char *chLabel, realnum wavelength, double *relint, double *absint)
vector< realnum > wlLineList[LIMPUN]
void ChargTranPun(FILE *ipPnunit, char *chSave)
double density(const genericState &gs)
double extin_mag_V_extended
bool lgHashEndIter[LIMPUN]
vector< vector< TransitionList > > ExtraLymanLines
int cdColm(const char *chLabel, long int ion, double *theocl)
double Valence_IP_Ryd[LIMELM][LIMELM]
bool lgPrtOldStyleLogs[LIMPUN]
CollisionProxy Coll() const
void H2_PunchLineStuff(FILE *io, realnum xLimit, long index)
#define DEBUG_ENTRY(funcname)
void H2_PunchDo(FILE *io, char chJOB[], const char chTime[], long int ipPun)
vector< qList > dBaseStates
double elementcool[LIMELM+1]
diatomics * whichDiatomToPrint[LIMPUN]
int ConvPresTempEdenIoniz(void)
vector< double > hist_temp_heat
bool lgOutputTypeOn[NUM_OUTPUT_TYPES]
vector< species > dBaseSpecies
void SaveSpecies(FILE *ioPUN, long int ipPun)
double RateIonizTot(long nelem, long ion) const
realnum UV_Cont_rel2_Habing_TH85_depth
bool lgCheckMonitors(FILE *ioMONITOR)
int fprintf(const Output &stream, const char *format,...)
multi_arr< double, 4 > xIonMean
string chSpeciesDominantRates[LIMPUN]
const char * chConSavEnr[LIMPUN]
void saveFITSfile(FILE *io, int option)
void prt_line_inlist(FILE *ioOUT, const char *label, realnum wvlng)
STATIC void AGN_Hemis(FILE *ioPUN)
void SaveSpeciesPseudoCont(const long ipPun, const string &speciesLabel)
sys_float SDIV(sys_float x)
vector< string > chSaveSpecies[LIMPUN]
size_t ntypes(void) const
void DynaPunchTimeDep(FILE *ipPnunit, const char *chJob)
void save_average(long int ipPun)
void GammaPrt(long int ipLoEnr, long int ipHiEnr, long int ipOpac, FILE *ioFILE, double total, double threshold)
STATIC void SaveLineIntensity(FILE *ioPUN, long int ipPun, realnum Threshold)
realnum pinzon_PresIntegElecThin
vector< realnum > SilicateEmission
double anumax(size_t i) const
t_secondaries secondaries
vector< TransitionList > dBaseTrans
double plankf(long int ip)
STATIC void SaveResults(FILE *ioPUN)
STATIC void SaveNewContinuum(FILE *ioPUN)
double flux_correct_isotropic(const bool lgSaveIsotr, const int nEmType, const int iflux)
bool lgSaveHeader(int ipPun) const
long int nCollapsed_local
double getResolutionScaleFactor() const
double ColUL(const ColliderList &colls) const
double rate_h2_form_grains_used_total
const string & chExitStatus(exit_type s) const
double ** RR_rate_coef_used
static bool lgPopsFirstCall
void Save1Line(const TransitionProxy &t, FILE *io, realnum xLimit, long index, realnum DopplerWidth)