////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include using namespace std; ///////////////////////////////////////////////////// typedef double DP; typedef unsigned long int ULI; template class NRVec { private: int nn; T *v; public: NRVec(); explicit NRVec(int n); NRVec(const T &a, int n); NRVec(const T *a, int n); NRVec(const NRVec &rhs); NRVec & operator=(const NRVec &rhs); NRVec & operator=(const T &a); inline T & operator[](const int i); inline const T & operator[](const int i) const; inline int size() const; ~NRVec(); }; template NRVec::NRVec(int n) : nn(n), v(new T[n]) {} template inline T & NRVec::operator[](const int i) //subscripting { return v[i]; } template inline const T & NRVec::operator[](const int i) const //subscripting { return v[i]; } template inline int NRVec::size() const { return nn; } template NRVec::~NRVec() { if (v != 0) delete[] (v); } typedef const NRVec Vec_I_DP; typedef NRVec Vec_DP, Vec_O_DP, Vec_IO_DP; inline void nrerror(const string error_text) { cerr << "Run-time error..." << endl; cerr << error_text << endl; cerr << "...now exiting to system..." << endl; exit(1); } void polint(Vec_I_DP &xa, Vec_I_DP &ya, const DP x, DP &y, DP &dy) { int i,m,ns=0; DP den,dif,dift,ho,hp,w; int n=xa.size(); Vec_DP c(n),d(n); dif=fabs(x-xa[0]); for (i=0;i Nj; vector bu; double decRoutSahaCap; private: }; ///////////////////////////////////////////////////// class Container { public: double Value(int Column, int Row) {return Table[Column-1][Row-1];} double condVal(float tj1, float tj2, bool p1, bool p2, int col, int row) { if(tj1==TwoJ1 && tj2==TwoJ2 && p1==P1 && p2==P2) return Table[col-1][row-1]; else if(tj1==TwoJ2 && tj2==TwoJ1 && p1==P2 && p2==P1) return Table[row-1][col-1]; else return 0; } int numOfColumns; float TwoJ1; bool P1; int numOfRows; float TwoJ2; bool P2; vector < vector > Table; private: }; ///////////////////////////////////////////////////// class Symmetry { public: State *findState(float tj, bool p, int idx) {if(tj==TwoJ && p==P) return States[idx-1]; } float TwoJ; bool P; int numOfStates; vector States; private: }; ///////////////////////////////////////////////////// class AstroData { public: string dataSource; double lam_obs; float F_lam; float I_lam; string Ion; double lam_lab; string Mult; string LowerTerm; string UpperTerm; float g1; float g2; int index; private: }; ///////////////////////////////////////////////////// //physical constants const double Boltzmann = 1.3806504E-23; const double Planck = 6.62606896E-34; const double h_bar = 1.05457266E-34; const double speedOfLight = 299792458; const double electMass = 9.10938215E-31; const double sinSoLimitcm = 196664.7; const double alpha = 0.0072973525376; const double tau_o = 2.418884326505E-17; //conversion factors const double invcmtoinvm = 100; const double mtoAng = 1.00E+10; const double Rydtoinvcm = 109737.31568525; const double invcmtoRyd = 1/Rydtoinvcm; const double RydtoJ = 2.1798741E-18; const double PI = acos(-1.0); double alphaValuesCovFac = 1.0E-6; double NormWLCovFac = 1.0E-9; //keywords string keywords [] = {"Temperature(K)", "Ni(m^-3)", "Ne(m^-3)", "ResidualCharge", "AstronomicalData", "TestsFlag", "RecCoefficient", "NormalisationChoice", "TheoAstroLS", "DecayRoutes"}; bool keywordsFlags [] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; //parameters (mainly associated with keywords) vector TEMP; double Ni = 1.0E10; double Ne = 1.0E10; double residualCharge = 2; double zScale; double gIon = 1.0; int NormalisationChoice = 0; int NormalisationEntry = 1; vector NormalisationValues; vector alphaValues; double NormalisationWL; bool RecCoef = 0; bool astroDataFlag = 0; string astroDataFileName; AstroData *astroNormLine; bool TheoAstroLSFlag = 0; bool DecayRoutesFlag = 0; string TheoAstroLSFileName; string DecayRoutesConfig; string DecayRoutesTerm; int DecayRoutes2J; ULI maxRoutes = 10000; bool TheoAstroLSEntFlag = 0; int polationPointsNum; //containers parameters int resTwoJ = -999; bool resPar = 1; int testFlag = 0; ///////////////////////////////////////////////////// char buffer[1500]; int numOfOddRes(0), numOfEvenRes(0), numOfAllRes(0); int numOfOddFSym(0), numOfEvenFSym(0), numOfAllFSym(0); vector oddResonances, evenResonances, Resonances; vector ResfValues; vector ResPhotonEnergy; vector FGamma_rul; Container *FFfValues; Container *FFGamma_rul = new Container; int numOfOddBStates(0), numOfEvenBStates(0), numOfAllBStates(0); int numOfOddBSym(0), numOfEvenBSym(0), numOfAllBSym(0); int numOfBSym(0); vector < Symmetry* > allBSym; vector BFVALUES; vector BGamma_rul; vector < pair > allFStates; vector < pair > allBStates; int numOfFFTrans = 0; int numOfFBTrans = 0; int numOfBBTrans = 0; vector < pair > > Transitions; vector < vector > Emissivities; vector < pair < double, AstroData*> > astroDataVector; vector dys; vector > theoAstroLSIdxMap; vector < pair > > theoAstroLSValMap; vector theoAstroLSs; vector alphaChiSq; vector ChiSq; bool Chi2ConfFlag = 0; int degreesOfFreedom; double DeltaChi2 = 1.0; vector < pair > > ChiSqComps; vector < vector > ChiSqCompsSome; int decRoutCount = 0; ofstream MapLines; ///////////////////////////////////////////////////// GENERAL-PURPOSE FUNCTIONS double getContVal(bool Par1, bool Par2, int index1, int index2, vector oddstates, vector evenstates, Container* gamma_rul) { int c(-99), r(-99); if(Par1 == 1 && Par2 == 0) { for(int u=0; uIndex == index1) {c = u; break;} for(int v=0; vIndex == index2) {r = v; break;} } else if(Par1 == 0 && Par2 == 1) { for(int u=0; uIndex == index2) {c = u; break;} for(int v=0; vIndex == index1) {r = v; break;} } else { cout <<"Error" << endl; exit(-1); } return gamma_rul->Table[c][r]; } ///////////////////////////////////////////////////// double getArrOfContVal(vector arrOfCont, float tj1, float tj2, bool P1, bool P2, int row, int col) { for(int a=0; aTwoJ1 == tj1 && arrOfCont[a]->P1 == P1 && arrOfCont[a]->TwoJ2 == tj2 && arrOfCont[a]->P2 == P2 ) return arrOfCont[a]->Value(row, col); if(arrOfCont[a]->TwoJ1 == tj2 && arrOfCont[a]->P1 == P2 && arrOfCont[a]->TwoJ2 == tj1 && arrOfCont[a]->P2 == P1 ) return arrOfCont[a]->Value(col, row); } cout << "Unrecognised Value" << endl; exit(-1); } ///////////////////////////////////////////////////// double Gamma_rjl(double f, double nuRyd, double gl, double gu) { return (alpha * alpha * alpha * nuRyd * nuRyd * gl * f) / (2 * gu * tau_o); } //////////////////////////////////////////////////// double Saha(double Ne, double Ni, double gu, double gi, double delE, double T) { return Ne * Ni * (gu/(2*gi)) * exp(-(delE/(Boltzmann*T))) * pow((Planck*Planck)/(2*PI*electMass*Boltzmann*T), 1.5); } ///////////////////////////////////////////////////// bool E1Possible(float tj1, float tj2, bool p1, bool p2) { float d = fabs(tj1 - tj2); if((d == 2 || d == 0) && (p1 + p2) == 1) return true; else return false; } ///////////////////////////////////////////////////// double WnToWlVacAng(double waveNum) //converts from wavenumber (1/cm) in vacuum to wavelength in vacuum in Angstrom { return 1.0E8 / waveNum; } ///////////////////////////////////////////////////// double WnToWlAirAng(double waveNum) //converts from wavenumber (1/cm) in vacuum to wavelength in air in Angstrom { return (1.0E8)/(waveNum*(1.0 + 6432.8E-8 + 2949810.0/(146.0E8 - waveNum*waveNum) + 25540./(41.0E8 - waveNum*waveNum))); } ///////////////////////////////////////////////////// double recCombToEmissivity(double NE, double NI, double ALPHA, double LAMBDA) //converts effective recombination coefficients to emissivities { return (NE * NI * ALPHA * Planck * speedOfLight) / LAMBDA; } ///////////////////////////////////////////////////// double emissivityToRecCoef(double NE, double NI, double EPSILON, double LAMBDA) //converts emissivities to effective recombination coefficients { return (EPSILON * LAMBDA) / (NE * NI * Planck * speedOfLight); } ///////////////////////////////////////////////////// READING INPUT DATA FILES void readInputFile() { ifstream Input; Input.open("Input"); if(Input.fail()) { cout << "No Input file" << endl; exit(-1); } string keyword; TEMP.resize(1); TEMP[0] = 10000; int numOfT; while(!Input.eof()) { Input >> keyword; if(keyword == keywords[0] && keywordsFlags[0]) { bool tempFlag; Input >> tempFlag >> numOfT; TEMP.resize(numOfT); if(!tempFlag) { for(int z=0; z> TEMP[z]; } else { double initTemp, tempInterval; Input >> initTemp >> tempInterval; for(int y=0; y> Ni; keywordsFlags[1] = 0; } else if(keyword == keywords[2] && keywordsFlags[2]) { Input >> Ne; keywordsFlags[2] = 0; } else if(keyword == keywords[3] && keywordsFlags[3]) { Input >> residualCharge; keywordsFlags[3] = 0; } else if(keyword == keywords[4] && keywordsFlags[4]) { Input >> astroDataFlag; if(astroDataFlag) Input >> astroDataFileName; keywordsFlags[4] = 0; } else if(keyword == keywords[5] && keywordsFlags[5]) { Input >> testFlag; keywordsFlags[5] = 0; } else if(keyword == keywords[6] && keywordsFlags[6]) { Input >> RecCoef; if(RecCoef != 1) RecCoef = 0; keywordsFlags[6] = 0; } else if(keyword == keywords[7] && keywordsFlags[7]) { Input >> NormalisationChoice; keywordsFlags[7] = 0; if(NormalisationChoice == 0) Input.getline(buffer, 1500, '\n'); else if(NormalisationChoice == 1) { Input >> NormalisationEntry; Input.getline(buffer, 1500, '\n'); } else if(NormalisationChoice == 2) { Input.getline(buffer, 1500, '\n'); double value; for(int a=0; a> value; NormalisationValues.push_back(value); } Input.getline(buffer, 1500, '\n'); } else if(NormalisationChoice == 3) { Input.getline(buffer, 1500, '\n'); double alphaValue; for(int a=0; a> alphaValue; alphaValue *= alphaValuesCovFac; alphaValues.push_back(alphaValue); } Input >> NormalisationWL; NormalisationWL *= NormWLCovFac; Input.getline(buffer, 1500, '\n'); for(int b=0; b> polationPointsNum; Input.getline(buffer, 1500, '\n'); int numOfPoints; Input >> numOfPoints; if(numOfPoints < polationPointsNum) { cout << "Number of points is not suitable for the required interpolation scheme" << endl; polationPointsNum = numOfPoints < 3 ? numOfPoints : 3; } DP dy, temperature, alphaValue; Vec_DP xa(numOfPoints), xxa(polationPointsNum); Vec_DP ya(numOfPoints), yya(polationPointsNum); for(int a=0; a> xa[a] >> ya[a]; Input >> NormalisationWL; NormalisationWL *= NormWLCovFac; ///////////////////////////////////////// for(int b=0; b xa[xa.size()-1]) index = xa.size() - polationPointsNum; else { for(int c=0; c temperature) { index = (int)(c - ceil(polationPointsNum/2.0)); while(index < 0) index++; while(index > (xa.size() - polationPointsNum)) index--; break; } } } if(index > -1) { for(int d=0; d> TheoAstroLSFlag; if(TheoAstroLSFlag) { Input >> TheoAstroLSFileName >> TheoAstroLSEntFlag >> Chi2ConfFlag; if(Chi2ConfFlag) Input >> degreesOfFreedom >> DeltaChi2; } keywordsFlags[8] = 0; } else if(keyword == keywords[9] && keywordsFlags[9]) { Input >> DecayRoutesFlag; if(DecayRoutesFlag) Input >> DecayRoutesConfig >> DecayRoutesTerm >> DecayRoutes2J >> maxRoutes; keywordsFlags[9] = 0; } else Input.getline(buffer, 1500, '\n'); ///////////////////////////// if(Input.eof()) { for(int z=0; z> numOfAllRes; Resonances.resize(numOfAllRes); double factor = zScale * RydtoJ/h_bar; for(int i=0; i> Resonances[i]->Index >> Resonances[i]->Energy >> Resonances[i]->Gamma_a //This is the width. It will be converted to Gamma_a >> Resonances[i]->Config >> Resonances[i]->Term >> Resonances[i]->TwoJ >> Resonances[i]->Parity >> Resonances[i]->Exp >> Resonances[i]->useFlag; //remove Resonances[i]->Gamma_a = factor * Resonances[i]->Gamma_a; Resonances[i]->Status = 'F'; if(Resonances[i]->Parity == 1) { oddResonances.push_back(Resonances[i]); numOfOddRes++; } else { evenResonances.push_back(Resonances[i]); numOfEvenRes++; } } // Read f-value data string comment = "abcd"; while(comment != "EndOfComment") ResEmis >> comment; float twoJB = 0.0; bool parityB = 0; int numOfB = 0; ResEmis >> numOfBSym; ResEmis.getline(buffer, 1500, '\n'); ResfValues.resize(numOfBSym); for(int k=0; k> twoJB >> parityB >> numOfB; ResEmis.getline(buffer, 1500, '\n'); ResfValues[k] = new Container; ResfValues[k]->numOfColumns = numOfAllRes; ResfValues[k]->numOfRows = numOfB; ResfValues[k]->TwoJ1 = resTwoJ; ResfValues[k]->P1 = resPar; ResfValues[k]->TwoJ2 = twoJB; ResfValues[k]->P2 = parityB; ResfValues[k]->Table.resize(numOfAllRes); for(int z=0; zTable.size(); z++) ResfValues[k]->Table[z].resize(numOfB); for(int f=0; fnumOfRows; f++) for(int g=0; gnumOfColumns; g++) ResEmis >> ResfValues[k]->Table[g][f]; } //end of: for(int k=0; k> comment; twoJB = 0.0; parityB = 0; numOfB = 0; ResPhotonEnergy.resize(numOfBSym); for(int l=0; l> twoJB >> parityB >> numOfB; ResEmis.getline(buffer, 1500, '\n'); ResPhotonEnergy[l] = new Container; ResPhotonEnergy[l]->numOfColumns = numOfAllRes; ResPhotonEnergy[l]->numOfRows = numOfB; ResPhotonEnergy[l]->TwoJ1 = resTwoJ; ResPhotonEnergy[l]->P1 = resPar; ResPhotonEnergy[l]->TwoJ2 = twoJB; ResPhotonEnergy[l]->P2 = parityB; ResPhotonEnergy[l]->Table.resize(numOfAllRes); for(int z=0; zTable.size(); z++) ResPhotonEnergy[l]->Table[z].resize(numOfB); for(int f=0; fnumOfRows; f++) for(int g=0; gnumOfColumns; g++) ResEmis >> ResPhotonEnergy[l]->Table[g][f]; } //end of: for(int l=0; l 0 && numOfEvenRes > 0) { comment = "abcd"; while(comment != "EndOfComment") ResEmis >> comment; FFfValues = new Container; FFfValues->numOfColumns = numOfOddRes; FFfValues->numOfRows = numOfEvenRes; FFfValues->Table.resize(numOfOddRes); for(int h=0; hTable.size(); h++) FFfValues->Table[h].resize(numOfEvenRes); for(int i=0; inumOfRows; i++) for(int j=0; jnumOfColumns; j++) ResEmis >> FFfValues->Table[j][i]; } ResEmis.close(); } ///////////////////////////////////////////////////// void readELEVEmisFile() { ifstream ELEVEmis; ELEVEmis.open("ELEVEmis"); if(ELEVEmis.fail()) { cout << "No ELEVEmis file" << endl; exit(-1); } string comment = "abcd"; while(comment != "EndOfComment") ELEVEmis >> comment; ELEVEmis >> numOfAllBSym; allBSym.resize(numOfAllBSym); for(int j=0; j> allBSym[j]->TwoJ >> allBSym[j]->P >> allBSym[j]->numOfStates; allBSym[j]->States.resize(allBSym[j]->numOfStates); for(int f=0; fnumOfStates; f++) { allBSym[j]->States[f] = new State; ELEVEmis >> allBSym[j]->States[f]->Index >> allBSym[j]->States[f]->Energy >> allBSym[j]->States[f]->Qn >> allBSym[j]->States[f]->Config >> allBSym[j]->States[f]->Term >> allBSym[j]->States[f]->Exp; allBSym[j]->States[f]->TwoJ = allBSym[j]->TwoJ; allBSym[j]->States[f]->Parity = allBSym[j]->P; allBSym[j]->States[f]->Status = 'B'; } } ELEVEmis.close(); } //////////////////////////////////////// void readFVALUEFile() { ifstream FVALUE; FVALUE.open("FVALUE"); if(FVALUE.fail()) { cout << "No FVALUE file" << endl; exit(-1); } FVALUE.getline(buffer, 1500, '\n'); int twoJ1, twoJ2, numOfTrans, temp, numOfCols, numOfRows, Idx1, Idx2; bool P1, P2; double fL, fV; while(!FVALUE.eof()) { FVALUE >> temp >> twoJ1 >> P1 >> temp >> twoJ2 >> P2 >> numOfTrans; if(twoJ1 == 0 && twoJ2 == 0 && numOfTrans == 0) break; for(int m=0; mTwoJ == twoJ1 && allBSym[m]->P == P1) numOfCols = allBSym[m]->numOfStates; if(allBSym[m]->TwoJ == twoJ2 && allBSym[m]->P == P2) numOfRows = allBSym[m]->numOfStates; } Container *container = new Container; container->TwoJ1 = twoJ1; container->TwoJ2 = twoJ2; container->P1 = P1; container->P2 = P2; container->Table.resize(numOfCols); for(int l=0; lTable[l].resize(numOfRows); for(int k=0; k> Idx1 >> Idx2 >> fL >> fV; container->Table[Idx1-1][Idx2-1] = fL; } BFVALUES.push_back(container); } FVALUE.close(); } ///////////////////////////////////////////////////// FREE-FREE SECTION vector < pair > arrangeAllFStates(vector fstates, vector < pair > states) { for(int f=0; f st; st.first = fabs(fstates[f]->Energy); st.second = fstates[f]; states.push_back(st); } for(int s=0; s fstates, Container* ffgamma_rul) { ffgamma_rul->Table.resize(fffValues->Table.size()); for(int l=0; lTable.size(); l++) ffgamma_rul->Table[l].resize(fffValues->Table[l].size()); for(int k=0; kTable.size(); k++) { for(int s=0; sTable[k].size(); s++) { double f = fabs(fffValues->Table[k][s]); State *state1 = new State; State *state2 = new State; state1 = oddResonances[k]; state2 = evenResonances[s]; double nuRyd = zScale * fabs(fabs(state1->Energy) - fabs(state2->Energy)); double gl = 1.0; double gu = state1->Energy > state2->Energy ? state1->TwoJ + 1 : state2->TwoJ + 1; ffgamma_rul->Table[k][s] = Gamma_rjl(f, nuRyd, gl, gu); } } return ffgamma_rul; } ///////////////////////////////////////////////////// void findFFGamma_r(vector < pair > states, Container* ffgamma_rul) { for(int s=0; s<(states.size()-1); s++) { states[s].second->Gamma_r = 0.0; for(int t=(s+1); tTwoJ; float tj2 = states[t].second->TwoJ; bool p1 = states[s].second->Parity; bool p2 = states[t].second->Parity; int idx1 = states[s].second->Index; int idx2 = states[t].second->Index; bool pos = E1Possible(tj1, tj2, p1, p2); if(pos == true) { double gamrul = getContVal(p1, p2, idx1, idx2, oddResonances, evenResonances, ffgamma_rul); states[s].second->Gamma_r += gamrul; } } } } ///////////////////////////////////////////////////// FREE-BOUND SECTION vector findFGamma_rul(int numOfSym, vector states, vector fValues, vector photonEnergy, vector gamma_rul) { gamma_rul.resize(numOfSym); for(int k=0; knumOfColumns = fValues[k]->numOfColumns; gamma_rul[k]->numOfRows = fValues[k]->numOfRows; gamma_rul[k]->TwoJ1 = fValues[k]->TwoJ1; gamma_rul[k]->P1 = fValues[k]->P1; gamma_rul[k]->TwoJ2 = fValues[k]->TwoJ2; gamma_rul[k]->P2 = fValues[k]->P2; gamma_rul[k]->Table.resize(gamma_rul[k]->numOfColumns); for(int z=0; zTable.size(); z++) gamma_rul[k]->Table[z].resize(gamma_rul[k]->numOfRows); for(int f=0; fnumOfRows; f++) for(int g=0; gnumOfColumns; g++) gamma_rul[k]->Table[g][f] = Gamma_rjl(fValues[k]->Table[g][f], photonEnergy[k]->Table[g][f], (fValues[k]->TwoJ2 + 1), (states[g]->TwoJ + 1)); } // end of: for(int k=0; k states, vector gamma_rul) { if((numOfOddRes * numOfEvenRes) == 0) { for(int n=0; nGamma_r = 0.0; } for(int n=0; nGamma_rT2 = 0.0; for(int k=0; knumOfRows; f++) for(int g=0; gnumOfColumns; g++) { states[g]->Gamma_r += gamma_rul[k]->Table[g][f]; states[g]->Gamma_rT2 += gamma_rul[k]->Table[g][f]; } } ///////////////////////////////////////////////////// void findbu(int numOfStates, vector states) { for(int m=0; mbu.resize(TEMP.size()); for(int h=0; hGamma_r == 0.0) states[m]->bu[h] = 0.0; else states[m]->bu[h] = states[m]->Gamma_a / (states[m]->Gamma_a + states[m]->Gamma_r); } } ///////////////////////////////////////////// void findFFNj(vector < pair > ffstates, vector temperature, Container* ffgamma_rul) { for(int s=0; sTwoJ + 1; double gi = gIon; double delE = RydtoJ * zScale * ffstates[s].second->Energy ; ffstates[s].second->Nj.resize(temperature.size()); for(int k=0; kNj[k] = ffstates[s].second->bu[k] * Saha(Ne, Ni, gu, gi, delE, temperature[k]); if(k == 0) ffstates[s].second->decRoutSahaCap = ffstates[s].second->Nj[k]; for(int l=0; lTwoJ; float tj2 = ffstates[s].second->TwoJ; bool p1 = ffstates[l].second->Parity; bool p2 = ffstates[s].second->Parity; int idx1 = ffstates[l].second->Index; int idx2 = ffstates[s].second->Index; bool pos = E1Possible(tj1, tj2, p1, p2); if(pos == true) { double Nk = ffstates[l].second->Nj[k]; double Gamkj = getContVal(p1, p2, idx1, idx2, oddResonances, evenResonances, ffgamma_rul); double Gamjr = ffstates[s].second->Gamma_r; double Gamja = ffstates[s].second->Gamma_a; double radPop = (Nk * Gamkj) / (Gamjr + Gamja); ffstates[s].second->Nj[k] += radPop; } } } } } ///////////////////////////////////////////////////// BOUND-BOUND SECTION vector findBGamma_rul(vector fValues, vector < Symmetry* > symmetries, vector gamma_rul) { for(int m=0; mTwoJ1 = fValues[m]->TwoJ1; container->TwoJ2 = fValues[m]->TwoJ2; container->P1 = fValues[m]->P1; container->P2 = fValues[m]->P2; container->Table.resize(fValues[m]->Table.size()); for(int l=0; lTable.size(); l++) container->Table[l].resize(fValues[m]->Table[l].size()); for(int k=0; kTable.size(); k++) { for(int s=0; sTable[k].size(); s++) { double f = fabs(fValues[m]->Table[k][s]); State *state1 = new State; State *state2 = new State; for(int t=0; tTwoJ == container->TwoJ1 && symmetries[t]->P == container->P1) state1 = symmetries[t]->States[k]; if(symmetries[t]->TwoJ == container->TwoJ2 && symmetries[t]->P == container->P2) state2 = symmetries[t]->States[s]; } double nuRyd = zScale * fabs(fabs(state1->Energy) - fabs(state2->Energy)); double gl = 1.0; double gu = state1->Energy > state2->Energy ? state1->TwoJ + 1 : state2->TwoJ + 1; container->Table[k][s] = Gamma_rjl(f, nuRyd, gl, gu); } } gamma_rul.push_back(container); } //end of: for(int m=0; m > arrangeAllBStates(vector < Symmetry* > symmetries, vector < pair > states) { for(int f=0; fStates.size(); g++) { pair st; st.first = fabs(symmetries[f]->States[g]->Energy); st.second = symmetries[f]->States[g]; states.push_back(st); } } stable_sort(states.begin(), states.end()); for(int s=0; s > states, vector gamma_rul) { for(int s=0; s<(states.size()-1); s++) { states[s].second->Gamma_r = 0.0; for(int t=(s+1); tTwoJ; float tj2 = states[t].second->TwoJ; bool p1 = states[s].second->Parity; bool p2 = states[t].second->Parity; int idx1 = states[s].second->Index; int idx2 = states[t].second->Index; bool pos = E1Possible(tj1, tj2, p1, p2); if(pos == true) states[s].second->Gamma_r += getArrOfContVal(gamma_rul, tj1, tj2, p1, p2, idx1, idx2); } } } ///////////////////////////////////////////// void findBNj(vector Fstates, vector < pair > Bstates, vector temperature, vector gamma_rul) { for(int s=0; sNj.resize(temperature.size()); for(int k=0; kNj[k] = 0.0; for(int n=0; nTwoJ; float tj2 = Bstates[s].second->TwoJ; bool p1 = Fstates[n]->Parity; bool p2 = Bstates[s].second->Parity; int idx1 = Fstates[n]->Index; int idx2 = Bstates[s].second->Index; bool pos = E1Possible(tj1, tj2, p1, p2); if(pos == true) { double Nk = Fstates[n]->Nj[k]; double Gamkj = getArrOfContVal(FGamma_rul, resTwoJ, tj2, resPar, p2, idx1, idx2); double Gamjr = Bstates[s].second->Gamma_r; Bstates[s].second->Nj[k] += (Nk * Gamkj) / Gamjr; } } for(int l=0; lTwoJ; float tj2 = Bstates[s].second->TwoJ; bool p1 = Bstates[l].second->Parity; bool p2 = Bstates[s].second->Parity; int idx1 = Bstates[l].second->Index; int idx2 = Bstates[s].second->Index; bool pos = E1Possible(tj1, tj2, p1, p2); if(pos == true) { double Nk = Bstates[l].second->Nj[k]; double Gamkj = getArrOfContVal(gamma_rul, tj1, tj2, p1, p2, idx1, idx2); double Gamjr = Bstates[s].second->Gamma_r; Bstates[s].second->Nj[k] += (Nk * Gamkj) / Gamjr; } } } } } ///////////////////////////////////////////////////// MIXED SECTION vector < pair > > findTransitions(vector fstates, vector < pair > allbstates, vector < pair > > transits, vector < pair > allfstates) { for(int u=0; u<(allfstates.size()-1); u++) { for(int v=(u+1); vTwoJ; float tj2 = allfstates[v].second->TwoJ; bool p1 = allfstates[u].second->Parity; bool p2 = allfstates[v].second->Parity; bool pos = E1Possible(tj1, tj2, p1, p2); if(pos == true) { pair > trans; trans.first = zScale * fabs(fabs(allfstates[u].second->Energy) - fabs(allfstates[v].second->Energy)); trans.second.first = allfstates[u].second; trans.second.second = allfstates[v].second; transits.push_back(trans); numOfFFTrans++; } } } for(int b=0; bTwoJ; float tj2 = allbstates[c].second->TwoJ; bool p1 = fstates[b]->Parity; bool p2 = allbstates[c].second->Parity; int idx1 = fstates[b]->Index; int idx2 = allbstates[c].second->Index; bool pos = E1Possible(tj1, tj2, p1, p2); if(pos == true) { pair > trans; trans.first = zScale * (fstates[b]->Energy + fabs(allbstates[c].second->Energy)); trans.second.first = fstates[b]; trans.second.second = allbstates[c].second; transits.push_back(trans); numOfFBTrans++; } } } for(int s=0; s<(allbstates.size()-1); s++) { for(int t=(s+1); tTwoJ; float tj2 = allbstates[t].second->TwoJ; bool p1 = allbstates[s].second->Parity; bool p2 = allbstates[t].second->Parity; bool pos = E1Possible(tj1, tj2, p1, p2); if(pos == true) { pair > trans; trans.first = zScale * fabs(fabs(allbstates[s].second->Energy) - fabs(allbstates[t].second->Energy)); trans.second.first = allbstates[s].second; trans.second.second = allbstates[t].second; transits.push_back(trans); numOfBBTrans++; } } } stable_sort(transits.begin(), transits.end()); return transits; } ///////////////////////////////////////////////////// vector < vector > findEmissivities(vector < pair > > transitions, Container* ffgamma_rul, vector fgamma_rul, vector bgamma_rul, vector < vector > emis) { for(int j=0; j EmissivityVec; for(int m=0; mTwoJ; float tj2 = transitions[j].second.second->TwoJ; bool p1 = transitions[j].second.first->Parity; bool p2 = transitions[j].second.second->Parity; int idx1 = transitions[j].second.first->Index; int idx2 = transitions[j].second.second->Index; double Nk = transitions[j].second.first->Nj[m]; double E = RydtoJ * zScale * (transitions[j].second.first->Energy - transitions[j].second.second->Energy); double Gamkj; if(transitions[j].second.first->Status == 'F' && transitions[j].second.second->Status == 'F') Gamkj = getContVal(p1, p2, idx1, idx2, oddResonances, evenResonances, ffgamma_rul); else if(transitions[j].second.first->Status == 'F' && transitions[j].second.second->Status == 'B') Gamkj = getArrOfContVal(fgamma_rul, resTwoJ, tj2, resPar, p2, idx1, idx2); else if(transitions[j].second.first->Status == 'B' && transitions[j].second.second->Status == 'B') Gamkj = getArrOfContVal(bgamma_rul, tj1, tj2, p1, p2, idx1, idx2); else { cout <<"Error!" << endl; exit(-1); } double Emissivity = Nk * Gamkj * E; EmissivityVec.push_back(Emissivity); } emis.push_back(EmissivityVec); } return emis; } ///////////////////////////////////////////////////// void readAstroData() { ifstream astroData(astroDataFileName.c_str());; if(astroData.fail()) { cout << "No " << astroDataFileName << " file" << endl; exit(-1); } string datSource, comment; astroData >> datSource; while(comment != "EndOfComment") astroData >> comment; astroNormLine = new AstroData; astroNormLine->dataSource = datSource; astroData >> astroNormLine->lam_obs >> astroNormLine->F_lam >> astroNormLine->I_lam >> astroNormLine->Ion >> astroNormLine->lam_lab >> astroNormLine->Mult >> astroNormLine->LowerTerm >> astroNormLine->UpperTerm >> astroNormLine->g1 >> astroNormLine->g2; int astroDataCount = 0; while(!astroData.eof()) { AstroData *astd = new AstroData; astroDataCount++; astd->index = astroDataCount; astd->dataSource = datSource; astroData >> astd->lam_obs >> astd->F_lam >> astd->I_lam >> astd->Ion; if(astroData.eof()) { astd = NULL; break; } astroData >> astd->lam_lab >> astd->Mult >> astd->LowerTerm >> astd->UpperTerm >> astd->g1 >> astd->g2; pair astDatP; astDatP.first = astd->lam_obs; //for changing priority astDatP.second = astd; astroDataVector.push_back(astDatP); } stable_sort(astroDataVector.begin(), astroDataVector.end()); astroData.close(); } ///////////////////////////////////////////////////// void TheoAstroLS() { if(NormalisationChoice <= 0 || !astroDataFlag) cout << "Unable to compute least squares as there is no normalisation or observational data." << endl; else { ifstream MapFile(TheoAstroLSFileName.c_str());; if(MapFile.fail()) { cout << "No '" << TheoAstroLSFileName << "' file" << endl; exit(-1); } for(;;) { int Idx1, Idx2; MapFile >> Idx1; if(Idx1 == -999 || MapFile.eof()) break; else MapFile >> Idx2; if(Transitions[Transitions.size()-Idx2].second.first->Status == 'B' || Transitions[Transitions.size()-Idx2].second.first->useFlag ) { pair map; map.first = Idx1; map.second = Idx2; theoAstroLSIdxMap.push_back(map); } } MapFile.close(); theoAstroLSValMap.resize(theoAstroLSIdxMap.size()); ChiSqComps.resize(theoAstroLSIdxMap.size()); for(int z=0; zI_lam / astroNormLine->I_lam; theoAstroLSValMap[a].first = astroNorm; if(NormalisationChoice == 1) { for(int p=0; p (numOfFFTrans + numOfFBTrans + numOfBBTrans))) { cout << "Invalid value for Normalisation Entry " << endl; cout << "First Entry is chosen for normalisation " << endl; NormalisationEntry = 1; } out.width(35); out << "Normalisation Entry " << NormalisationEntry; } else if(NormalisationChoice == 2) { out << " (outside normalisation with emissivity data)" << endl; out.width(35); out << "Normalisation Values(W/m^3)"; for(int q=0; q= Chi2Limit) && (ChiSq[r] <= Chi2Limit) || (ChiSq[r-1] <= Chi2Limit) && (ChiSq[r] >= Chi2Limit) ) { double tempLimit = TEMP[r] + (TEMP[r-1] - TEMP[r]) * ((Chi2Limit - ChiSq[r]) / (ChiSq[r-1] - ChiSq[r])); OU << tempLimit << "\t\t"; } } OU << endl << endl; OU.flags(ios::left); OU.width(10); OU << "Temp(K)"; OU.width(15); OU << "Least squares"; OU.width(15); OU << "(alphaChi)^2"; OU.width(15); OU << "Chi^2"; OU << endl << endl; for(int x=0; xTwoJ; float tj2 = Transitions[Idx].second.second->TwoJ; bool p1 = Transitions[Idx].second.first->Parity; bool p2 = Transitions[Idx].second.second->Parity; int idx1 = Transitions[Idx].second.first->Index; int idx2 = Transitions[Idx].second.second->Index; double Gamkj; if(Transitions[Idx].second.first->Status == 'F' && Transitions[Idx].second.second->Status == 'F') Gamkj = getContVal(p1, p2, idx1, idx2, oddResonances, evenResonances, FFGamma_rul); else if(Transitions[Idx].second.first->Status == 'F' && Transitions[Idx].second.second->Status == 'B') Gamkj = getArrOfContVal(FGamma_rul, resTwoJ, tj2, resPar, p2, idx1, idx2); else if(Transitions[Idx].second.first->Status == 'B' && Transitions[Idx].second.second->Status == 'B') Gamkj = getArrOfContVal(BGamma_rul, tj1, tj2, p1, p2, idx1, idx2); else { cout <<"Error!" << endl; exit(-1); } str << endl; str.flags(ios::left); str.width(5); str << astroIdx; str.width(7); str << theoIdx; str.setf(ios::scientific); str.precision(2); str.width(14); str << Gamkj; str.unsetf(ios::scientific); str << endl; str.width(12); str << ""; str.width(14); str << Transitions[Idx].second.first->Config; str.width(5); str << Transitions[Idx].second.first->Term; str.width(4); str << Transitions[Idx].second.first->TwoJ; str.width(4); str << Transitions[Idx].second.first->Status; str.setf(ios::scientific); str.precision(2); str.width(12); str << Transitions[Idx].second.first->Gamma_r; if(Transitions[Idx].second.first->Status == 'F') {str.width(12); str << Transitions[Idx].second.first->Gamma_a;} str.unsetf(ios::scientific); str << endl; str.width(12); str << ""; str.width(14); str << Transitions[Idx].second.second->Config; str.width(5); str << Transitions[Idx].second.second->Term; str.width(4); str << Transitions[Idx].second.second->TwoJ; str.width(4); str << Transitions[Idx].second.second->Status; str.setf(ios::scientific); str.width(12); str << Transitions[Idx].second.second->Gamma_r; if(Transitions[Idx].second.second->Status == 'F') {str.width(12); str << Transitions[Idx].second.second->Gamma_a;} str.unsetf(ios::scientific); str << endl; str.precision(6); //for(int y=0; y 0) for(int k=0; kTwoJ; float tj2 = Transitions[Idx].second.second->TwoJ; bool p1 = Transitions[Idx].second.first->Parity; bool p2 = Transitions[Idx].second.second->Parity; int idx1 = Transitions[Idx].second.first->Index; int idx2 = Transitions[Idx].second.second->Index; double Gamkj; if(Transitions[Idx].second.first->Status == 'F' && Transitions[Idx].second.second->Status == 'F') Gamkj = getContVal(p1, p2, idx1, idx2, oddResonances, evenResonances, FFGamma_rul); else if(Transitions[Idx].second.first->Status == 'F' && Transitions[Idx].second.second->Status == 'B') Gamkj = getArrOfContVal(FGamma_rul, resTwoJ, tj2, resPar, p2, idx1, idx2); else if(Transitions[Idx].second.first->Status == 'B' && Transitions[Idx].second.second->Status == 'B') Gamkj = getArrOfContVal(BGamma_rul, tj1, tj2, p1, p2, idx1, idx2); else { cout <<"Error!" << endl; exit(-1); } str << endl; str.flags(ios::left); str.width(5); str << astroIdx; str.width(7); str << theoIdx; str.setf(ios::scientific); str.precision(2); str.width(14); str << Gamkj; str.unsetf(ios::scientific); str << endl; str.width(12); str << ""; str.width(14); str << Transitions[Idx].second.first->Config; str.width(5); str << Transitions[Idx].second.first->Term; str.width(4); str << Transitions[Idx].second.first->TwoJ; str.width(4); str << Transitions[Idx].second.first->Status; str.setf(ios::scientific); str.precision(2); str.width(12); str << Transitions[Idx].second.first->Gamma_r; if(Transitions[Idx].second.first->Status == 'F') {str.width(12); str << Transitions[Idx].second.first->Gamma_a;} str.unsetf(ios::scientific); str << endl; str.width(12); str << ""; str.width(14); str << Transitions[Idx].second.second->Config; str.width(5); str << Transitions[Idx].second.second->Term; str.width(4); str << Transitions[Idx].second.second->TwoJ; str.width(4); str << Transitions[Idx].second.second->Status; str.setf(ios::scientific); str.width(12); str << Transitions[Idx].second.second->Gamma_r; if(Transitions[Idx].second.second->Status == 'F') {str.width(12); str << Transitions[Idx].second.second->Gamma_a;} str.unsetf(ios::scientific); str << endl; for(int y=0; y "; out.width(15); out<< "Config"; out.width(6); out<< "Term"; out.width(3); out<< "2J"; out.width(5); out<< "P"; out.width(15); out << "WlVac(Ang)"; out.width(15); out << "WlAir(Ang)"; for(int d=0; d 0) { out << " "; for(int e=0; e0; j--) { bool mapline = 0; for(int P=0; PStatus; MapLines.width(5); MapLines << Transitions[j-1].second.second->Status; MapLines << Transitions[j-1].second.first->Exp; MapLines.width(5); MapLines << Transitions[j-1].second.second->Exp; ////////////////////// MapLines.width(15); MapLines << Transitions[j-1].second.first->Config; MapLines.width(6); MapLines << Transitions[j-1].second.first->Term; MapLines.width(3); MapLines << Transitions[j-1].second.first->TwoJ; MapLines.width(3); MapLines << Transitions[j-1].second.first->Parity; MapLines.width(10); MapLines << " -> "; MapLines.width(15); MapLines << Transitions[j-1].second.second->Config; MapLines.width(6); MapLines << Transitions[j-1].second.second->Term; MapLines.width(3); MapLines << Transitions[j-1].second.second->TwoJ; MapLines.width(5); MapLines << Transitions[j-1].second.second->Parity; MapLines << endl << endl; } out.width(7); out << (Transitions.size() - j + 1) ; out << Transitions[j-1].second.first->Status; out.width(5); out << Transitions[j-1].second.second->Status; out << Transitions[j-1].second.first->Exp; out.width(5); out << Transitions[j-1].second.second->Exp; ////////////////////// out.width(15); out << Transitions[j-1].second.first->Config; out.width(6); out << Transitions[j-1].second.first->Term; out.width(3); out << Transitions[j-1].second.first->TwoJ; out.width(3); out << Transitions[j-1].second.first->Parity; out.width(10); out << " -> "; out.width(15); out << Transitions[j-1].second.second->Config; out.width(6); out << Transitions[j-1].second.second->Term; out.width(3); out << Transitions[j-1].second.second->TwoJ; out.width(5); out << Transitions[j-1].second.second->Parity; double wn = Rydtoinvcm * Transitions[j-1].first; out.width(15); out.setf(ios::fixed); out.precision(2); out << WnToWlVacAng(wn); out.precision(6); out.unsetf(ios::fixed); out.width(15); if(WnToWlAirAng(wn)<2000) out << "----"; else { out.setf(ios::fixed); out.precision(2); out << WnToWlAirAng(wn); out.precision(6); out.unsetf(ios::fixed); } for(int r=0; r 0) { MapLines.width(20); if(NormalisationChoice == 1) MapLines << Emissivities[j-1][r] / (Emissivities[Transitions.size() - NormalisationEntry][r]); else MapLines << Emissivities[j-1][r] / NormalisationValues[r]; } MapLines.unsetf(ios::scientific); MapLines << endl; } } if(NormalisationChoice > 0) { out << " | "; if(NormalisationChoice == 1) { for(int p=0; p= astroDataVector[dataCounter].first)) || ((j==Transitions.size()) && (curr > astroDataVector[dataCounter].first)) || ((j==1) && (next < astroDataVector[dataCounter].first)) ) ) { out << endl; do{ if(dataCounter >= astroDataVector.size()) break; out.width(5); out << astroDataVector[dataCounter].second->index; out.width(4); out << astroDataVector[dataCounter].second->dataSource; out.width(10); out << astroDataVector[dataCounter].second->Ion; out << "(U)"; out.width(12); out << astroDataVector[dataCounter].second->UpperTerm; out.width(4); out << " "; out << "(g2)"; out.width(4); out << astroDataVector[dataCounter].second->g2; out.width(10); out << " -> "; out << "(L)"; out.width(12); out << astroDataVector[dataCounter].second->LowerTerm; out.width(4); out << " "; out << "(g1)"; out.width(6); out << astroDataVector[dataCounter].second->g1; out << "(o)"; out.width(12); out << astroDataVector[dataCounter].second->lam_obs; out << "(l)"; out.width(12); out << astroDataVector[dataCounter].second->lam_lab; out << "(F)"; out.width(12); out << astroDataVector[dataCounter].second->F_lam; out << "(I)"; out.width(12); out << astroDataVector[dataCounter].second->I_lam; out << "(Mult)"; out.width(9); out << astroDataVector[dataCounter].second->Mult; if(NormalisationChoice > 0) { out << " | "; double norm = astroDataVector[dataCounter].second->I_lam / astroNormLine->I_lam; out.width(15); out << norm; out << "(relative to lam_obs = " << astroNormLine->lam_obs << " line)"; } out << endl; dataCounter ++; } while((curr <= astroDataVector[dataCounter].first) && (next >= astroDataVector[dataCounter].first)); out << endl; } } out.close(); } ///////////////////////////////////////////////////// TESTS SECTION void firstTest() { cout << "First Test:" << endl << endl; for(int x=0; xStatus == 'F') { Aji = getArrOfContVal(FGamma_rul, resTwoJ, Transitions[g].second.second->TwoJ, resPar, Transitions[g].second.second->Parity, Transitions[g].second.first->Index, Transitions[g].second.second->Index); } else if(Transitions[g].second.first->Status == 'B') { Aji = getArrOfContVal(BGamma_rul, Transitions[g].second.first->TwoJ, Transitions[g].second.second->TwoJ, Transitions[g].second.first->Parity, Transitions[g].second.second->Parity, Transitions[g].second.first->Index, Transitions[g].second.second->Index); } else Aji = -1.0E-99; NjAji += (Transitions[g].second.first->Nj[x] * Aji); } } double Aik = 0.0; for(int w=0; wTwoJ, Transitions[w].second.second->TwoJ, Transitions[w].second.first->Parity, Transitions[w].second.second->Parity, Transitions[w].second.first->Index, Transitions[w].second.second->Index); NiSAik += cur->Nj[x] * Aik; } } if((NjAji - NiSAik)/NjAji > 1.0E-14) flag = 1; } if(flag) cout << "T = " << TEMP[x] << "\tFail" <Nj[s] * Resonances[f]->Gamma_rT2; for(int h=0; hGamma_r == 0.0) { State *curr = allBStates[h].second; for(int i=0; iNj[s]; double Aki; if(Transitions[i].second.first->Status == 'F') Aki = getArrOfContVal(FGamma_rul, resTwoJ, Transitions[i].second.second->TwoJ, resPar, Transitions[i].second.second->Parity, Transitions[i].second.first->Index, Transitions[i].second.second->Index); else if(Transitions[i].second.first->Status == 'B') Aki = getArrOfContVal(BGamma_rul, Transitions[i].second.first->TwoJ, Transitions[i].second.second->TwoJ, Transitions[i].second.first->Parity, Transitions[i].second.second->Parity, Transitions[i].second.first->Index, Transitions[i].second.second->Index); else Aki = -1.0E99; metaNkAki += Nk * Aki; } } } } if((resNjAj - metaNkAki)/metaNkAki > 1.0E-14) cout << "T = " << TEMP[s] << "\tFail" <> decRouFileName; ofstream decayRoutes; decayRoutes.open(decRouFileName.c_str()); int index; vector < pair > allStates; vector < pair > allUpperStates; for(int a=0; aConfig == DecayRoutesConfig && allStates[c].second->Term == DecayRoutesTerm && allStates[c].second->TwoJ == DecayRoutes2J) { index = c; flag = 0; break; } } if(flag) { decayRoutes << "The state is not recognised!"; return 0; } for(int d=index; d>=0; --d) allUpperStates.push_back(allStates[d]); ////////////////////////////////////////////////// vector < vector < vector > > ppVec; //past-present vector vector < vector > shortRoutes; ppVec.resize(2); ppVec[0].resize(1); ppVec[0][0].push_back(0); ULI count = 0; do { flag = 0; for(ULI e=0; e 1) { shortRoutes.push_back(ppVec[0][e]); count++; continue; } else if(idx < allUpperStates.size()-1) { bool FF =0; for(ULI f=idx+1; fTwoJ; float tj2 = allUpperStates[f].second->TwoJ; bool p1 = allUpperStates[idx].second->Parity; bool p2 = allUpperStates[f].second->Parity; if(E1Possible(tj1, tj2, p1, p2)) { flag = 1; FF = 1; vector route; route = ppVec[0][e]; route.push_back(f); ppVec[1].push_back(route); count++; } if( (f == allUpperStates.size()-1) && (FF == 0 ) && ppVec[0][e].size() > 1) { shortRoutes.push_back(ppVec[0][e]); count++; } } } if(count >= maxRoutes) break; } if(count >= maxRoutes) { decayRoutes << "The number of decay routes > " << maxRoutes << ". This is the first " << maxRoutes << " routes " << endl; ppVec.erase(ppVec.begin(), ppVec.begin()+1); ppVec[0].resize(maxRoutes); break; } else if(flag) { ppVec.erase(ppVec.begin(), ppVec.begin()+1); ppVec.resize(2); count = shortRoutes.size(); } if(count >= maxRoutes) break; }while(flag); if(count == 0) { decayRoutes << "No decay routes are detected to the state: " << allUpperStates[ppVec[0][0][0]].second->Config << " " << allUpperStates[ppVec[0][0][0]].second->Term << " " << allUpperStates[ppVec[0][0][0]].second->TwoJ; } else { ULI completeR = shortRoutes.size() >= maxRoutes ? maxRoutes : shortRoutes.size(); ULI uCompleteR = count >= maxRoutes ? (maxRoutes - completeR) : 0; decayRoutes << "Number of complete decay routes in this file: " << completeR << endl; decayRoutes << "Number of uncomplete decay routes in this file: " << uCompleteR << endl << endl; decayRoutes << "Data for each state: configuration, term, 2J." << endl; decayRoutes << "For resonances, Saha capture and radiative population are added." << endl; decayRoutes << "The temperature dependent data are for T = " << TEMP[0] << "K." << endl; if(completeR > 0) { decayRoutes << endl << "Complete routes:" << endl << endl; for(ULI u=0; u 0) decayRoutes << " <- "; decayRoutes << allUpperStates[shortRoutes[u][v]].second->Config << " " << allUpperStates[shortRoutes[u][v]].second->Term << " " << allUpperStates[shortRoutes[u][v]].second->TwoJ; if(allUpperStates[shortRoutes[u][v]].second->Status == 'F') { decayRoutes << " ("; decayRoutes.setf(ios::scientific); decayRoutes.precision(2); decayRoutes.width(10); decayRoutes << allUpperStates[shortRoutes[u][v]].second->decRoutSahaCap; decayRoutes << ","; decayRoutes.precision(2); decayRoutes.width(10); if(v < shortRoutes[u].size()-1) { float tj1 = allUpperStates[shortRoutes[u][v+1]].second->TwoJ; //upper float tj2 = allUpperStates[shortRoutes[u][v]].second->TwoJ; //lower bool p1 = allUpperStates[shortRoutes[u][v+1]].second->Parity; bool p2 = allUpperStates[shortRoutes[u][v]].second->Parity; int idx1 = allUpperStates[shortRoutes[u][v+1]].second->Index; int idx2 = allUpperStates[shortRoutes[u][v]].second->Index; bool pos = E1Possible(tj1, tj2, p1, p2); double radPop; if(pos == true) { double Nk = allUpperStates[shortRoutes[u][v+1]].second->Nj[0]; double Gamkj = getContVal(p1, p2, idx1, idx2, oddResonances, evenResonances, ffgamma_rul); double Gamjr = allUpperStates[shortRoutes[u][v]].second->Gamma_r; double Gamja = allUpperStates[shortRoutes[u][v]].second->Gamma_a; radPop = (Nk * Gamkj) / (Gamjr + Gamja); decayRoutes << radPop; } else decayRoutes << "NP"; // E1 not possible } else decayRoutes << "NA"; // Not applicable decayRoutes.unsetf(ios::scientific); decayRoutes << ")"; } } decayRoutes << endl; } } if(uCompleteR > 0) { decayRoutes << endl << "Uncomplete routes:" << endl << endl; for(ULI s=0; s 0) decayRoutes << " <- "; decayRoutes << allUpperStates[ppVec[0][s][t]].second->Config << " " << allUpperStates[ppVec[0][s][t]].second->Term << " " << allUpperStates[ppVec[0][s][t]].second->TwoJ; } decayRoutes << endl; } } } ///////////////////////////////////////////////// // Repetition test block /* for(ULI w=0; w 0 && numOfEvenRes > 0) { FFGamma_rul = findFFGamma_rul(FFfValues, Resonances, FFGamma_rul); // Find Gamma_rul for free states findFFGamma_r(allFStates, FFGamma_rul); } ///////////////////////////////////////////////////// FREE-BOUND SECTION FGamma_rul = findFGamma_rul(numOfBSym, Resonances, ResfValues, ResPhotonEnergy, FGamma_rul); // Find Gamma_rul for FB findFGamma_r(numOfAllRes, numOfBSym, Resonances, FGamma_rul); // Find Gamma_r for resonances findbu(numOfAllRes, Resonances); // Find bu for resonances findFFNj(allFStates, TEMP, FFGamma_rul); ///////////////////////////////////////////////////// BOUND-BOUND SECTION BGamma_rul = findBGamma_rul(BFVALUES, allBSym, BGamma_rul); // Find Gamma_rul for bound states allBStates = arrangeAllBStates(allBSym, allBStates); // Arrange all bound states in desending order findBGamma_r(allBStates, BGamma_rul); // Find Gamma_r for bound states findBNj(Resonances, allBStates, TEMP, BGamma_rul); // Find Nj for bound states ///////////////////////////////////////////////////// MIXED SECTION Transitions = findTransitions(Resonances, allBStates, Transitions, allFStates); // Find possible transitions Emissivities = findEmissivities(Transitions, FFGamma_rul, FGamma_rul, BGamma_rul, Emissivities); // Find emissivities if(astroDataFlag == 1) // Read asronomical data from AstroData file readAstroData(); if(TheoAstroLSFlag == 1) // Perform LS TheoAstroLS(); writeDataFile(); // Write data to output file ///////////////////////////////////////////////////// TESTS SECTION if(testFlag == 1 || testFlag == 3) firstTest(); if(testFlag == 2 || testFlag == 3) secondTest(); ///////////////////////////////////////////////////// DECAY ROUTES if(DecayRoutesFlag) decayRoutes(FFGamma_rul); ///////////////////////////////////////////////////// END OF PROGRAM double elapsedProgram = (double)(clock() - startProgram) / CLOCKS_PER_SEC; int min = (int)(elapsedProgram/60.0); int sec = (int)(elapsedProgram - min * 60.0); double dmsec = (elapsedProgram - (min*60.0) - (sec*1.0)) * 1000.0; int msec = (int) dmsec; cout <<"Program Duration (min:sec:msec): " << min << ":" << sec << ":" << msec << endl << endl << endl; cout << "Press any key to exit" << endl; getchar(); return 0; }