Skip to content
Snippets Groups Projects
Commit 5164b029 authored by BaM's avatar BaM
Browse files

Small modification.

IsotopicVector renaming MeanMolar method to GetMeanMolarMass

git-svn-id: svn+ssh://svn.in2p3.fr/class@655 0e7d625b-0364-4367-a6be-d5be4a48d228
parent 2342f253
No related branches found
No related tags found
No related merge requests found
...@@ -78,7 +78,7 @@ public : ...@@ -78,7 +78,7 @@ public :
double GetTotalMass() const; //!< Return the mass (in tons) of the isotopic vector double GetTotalMass() const; //!< Return the mass (in tons) of the isotopic vector
double MeanMolar() const; //<! Return the mean molar mass of the isotopic vector double GetMeanMolarMass() const; //<! Return the mean molar mass of the isotopic vector
vector<int> GetChemicalSpecies() const; //!< Return the list of chemichal species contained vector<int> GetChemicalSpecies() const; //!< Return the list of chemichal species contained
int GetZAIQuantity() const int GetZAIQuantity() const
......
...@@ -3,62 +3,63 @@ ...@@ -3,62 +3,63 @@
EquivalenceModel::EquivalenceModel():CLASSObject() EquivalenceModel::EquivalenceModel():CLASSObject()
{ {
fRelativMassPrecision = 1/10000.; //Mass precision fRelativMassPrecision = 1/10000.; // Mass precision
fMaxInterration = 100; // Max iterration in build fueld algorythum fMaxInterration = 100; // Max iterration in build fueld algorythum
fFirstGuessFissilContent = 0.02; fFirstGuessFissilContent = 0.02;
} }
EquivalenceModel::EquivalenceModel(CLASSLogger* log):CLASSObject(log) EquivalenceModel::EquivalenceModel(CLASSLogger* log):CLASSObject(log)
{ {
fRelativMassPrecision = 1/10000.; //Mass precision fRelativMassPrecision = 1/10000.; // Mass precision
fMaxInterration = 100; // Max iterration in build fueld algorythm fMaxInterration = 100; // Max iterration in build fueld algorythm
fFirstGuessFissilContent = 0.02; fFirstGuessFissilContent = 0.02;
} }
EquivalenceModel::~EquivalenceModel() EquivalenceModel::~EquivalenceModel()
{ {
} }
//________________________________________________________________________ //________________________________________________________________________
double EquivalenceModel::LAMBDA_TOT_FOR(double MassNeeded, vector<IsotopicVector> Stocks,string FisOrFer) double EquivalenceModel::LAMBDA_TOT_FOR(double MassNeeded, vector<IsotopicVector> Stocks, string FisOrFer)
{ {
double Lambda_tot = 0; double Lambda_tot = 0;
//Calculating total mass of stock once and for all // Calculating total mass of stock once and for all
if( fTotalFissileMassInStocks==0 || fTotalFertileMassInStocks==0 ) if( fTotalFissileMassInStocks==0 || fTotalFertileMassInStocks==0 )
{ {
double TotalMassInStocks = 0; double TotalMassInStocks = 0;
for( int i = 0 ; i<(int)Stocks.size() ; i++ ) for( int i = 0 ; i<(int)Stocks.size() ; i++ )
TotalMassInStocks += Stocks[i].GetTotalMass() ; TotalMassInStocks += Stocks[i].GetTotalMass() ;
if(FisOrFer == "Fis") if(FisOrFer == "Fis")
fTotalFissileMassInStocks = TotalMassInStocks*1e6; //in g fTotalFissileMassInStocks = TotalMassInStocks * 1e6; // in grams
else else
fTotalFertileMassInStocks = TotalMassInStocks*1e6; //in g fTotalFertileMassInStocks = TotalMassInStocks * 1e6; // in grams
} }
double TotalMassInStocks = 0; double TotalMassInStocks = 0;
if(FisOrFer == "Fis") if(FisOrFer == "Fis")
TotalMassInStocks = fTotalFissileMassInStocks; TotalMassInStocks = fTotalFissileMassInStocks;
else else
TotalMassInStocks = fTotalFertileMassInStocks; TotalMassInStocks = fTotalFertileMassInStocks;
//If there is not enought matter in stocks construction fails // If there is not enought matter in stocks construction fails
if( MassNeeded > TotalMassInStocks ) if( MassNeeded > TotalMassInStocks )
{ {
WARNING<<"Not enought "<< FisOrFer <<" material to build fuel"<<endl; WARNING<<"Not enought "<< FisOrFer <<" material to build fuel"<<endl;
WARNING<<TotalMassInStocks<<endl; WARNING<<TotalMassInStocks<<endl;
return -1; return -1;
} }
for( int i = 0 ; i<(int)Stocks.size() ; i++ ) for( int i = 0 ; i<(int)Stocks.size() ; i++ )
{ {
if( MassNeeded >= (Stocks[i].GetTotalMass()*1e6) ) if( MassNeeded >= (Stocks[i].GetTotalMass()*1e6) )
{ Lambda_tot+=1; {
Lambda_tot+=1;
MassNeeded -= (Stocks[i].GetTotalMass()*1e6); MassNeeded -= (Stocks[i].GetTotalMass()*1e6);
} }
else else
...@@ -67,140 +68,155 @@ double EquivalenceModel::LAMBDA_TOT_FOR(double MassNeeded, vector<IsotopicVector ...@@ -67,140 +68,155 @@ double EquivalenceModel::LAMBDA_TOT_FOR(double MassNeeded, vector<IsotopicVector
break; break;
} }
} }
return Lambda_tot; return Lambda_tot;
} }
//________________________________________________________________________ //________________________________________________________________________
bool EquivalenceModel::Build_Fuel_According_Lambda(vector<double> &lambda,vector<IsotopicVector> FissilArray, vector<IsotopicVector> FertilArray, double HMMass,IsotopicVector &Fissile, IsotopicVector &Fertile) bool EquivalenceModel::Build_Fuel_According_Lambda(vector<double> &lambda,vector<IsotopicVector> FissilArray, vector<IsotopicVector> FertilArray, double HMMass, IsotopicVector &Fissile, IsotopicVector &Fertile)
{ {
//Build the Plutonium vector from stocks //Build the Plutonium vector from stocks
Fissile.Clear(); Fissile.Clear();
for( int i = 0; i < (int)FissilArray.size(); i++ )
for( int i = 0 ; i < (int)FissilArray.size() ; i++ ) Fissile += lambda[i] * FissilArray[i];
Fissile +=lambda[i] * FissilArray[i];
double AvailablePuMass = Fissile.GetTotalMass() * 1e6; //in grams
//Building complementary Fertile from stocks
double FertilMassNeeded = HMMass - AvailablePuMass;
double LAMBDA_FERTILE = LAMBDA_TOT_FOR( FertilMassNeeded , FertilArray , "Fer" );
SetLambda(lambda, (int)FissilArray.size(), (int)lambda.size()-1,LAMBDA_FERTILE);
int j=-1;
Fertile.Clear();
for(int i = (int)FissilArray.size() ; i < (int)FissilArray.size()+(int)FertilArray.size() ; i++)
{ j++;
Fertile += lambda[i] * FertilArray[j];
}
if( fabs(Fertile.GetTotalMass()*1e6 - FertilMassNeeded) > FertilMassNeeded * 1e-6)//Not enought fertile in stocks
{ double AvailablePuMass = Fissile.GetTotalMass() * 1e6; // in grams
WARNING<<"Not enought fertile material to build fuel"<<endl;
return false; // Building complementary Fertile from stocks
} double FertilMassNeeded = HMMass - AvailablePuMass;
double LAMBDA_FERTILE = LAMBDA_TOT_FOR( FertilMassNeeded , FertilArray , "Fer" );
return true;
SetLambda(lambda, (int)FissilArray.size(), (int)lambda.size()-1, LAMBDA_FERTILE);
int j=-1;
Fertile.Clear();
for(int i = (int)FissilArray.size() ; i < (int)FissilArray.size()+(int)FertilArray.size() ; i++)
{
j++;
Fertile += lambda[i] * FertilArray[j];
}
if( fabs(Fertile.GetTotalMass()*1e6 - FertilMassNeeded) > FertilMassNeeded * 1e-6) // Not enought fertile in stocks
{
WARNING << "Not enought fertile material to build fuel" << endl;
return false;
}
return true;
} }
//________________________________________________________________________ //________________________________________________________________________
vector<double> EquivalenceModel::BuildFuel(double BurnUp, double HMMass,vector<IsotopicVector> FissilArray, vector<IsotopicVector> FertilArray) vector<double> EquivalenceModel::BuildFuel(double BurnUp, double HMMass,vector<IsotopicVector> FissilArray, vector<IsotopicVector> FertilArray)
{ {
DBGL DBGL
vector<double> lambda ; //vector of portion of stocks taken (fissile & fertil) vector<double> lambda ; // vector of portion of stocks taken (fissile & fertil)
/***Test if there is a stock**/
/*** Test if there is a stock **/
if( (int)FissilArray.size()==0 ) if( (int)FissilArray.size()==0 )
{ WARNING<<" No fissile stocks available ! Fuel not build"<<endl; { WARNING << " No fissile stocks available ! Fuel not build" << endl;
lambda[0] = -1; lambda[0] = -1;
return lambda; return lambda;
} }
HMMass*=1e6;//tons to gram HMMass *= 1e6; // Unit onversion : tons to gram
/****Some initializations**/ /**** Some initializations **/
fTotalFissileMassInStocks = 0; fTotalFissileMassInStocks = 0;
fTotalFertileMassInStocks = 0; fTotalFertileMassInStocks = 0;
fActualFissileContent = GetBuildFuelFirstGuess();
fActualFissileContent = GetBuildFuelFirstGuess();
for(int i = 0 ; i < (int)FissilArray.size() + (int)FertilArray.size() ; i++ ) for(int i = 0 ; i < (int)FissilArray.size() + (int)FertilArray.size() ; i++ )
lambda.push_back(0); lambda.push_back(0);
IsotopicVector Fertile; IsotopicVector Fertile;
IsotopicVector Fissile; IsotopicVector Fissile;
double AvailablePuMass = 0; double AvailablePuMass = 0;
double PuMassNeeded = HMMass * fActualFissileContent; double PuMassNeeded = HMMass * fActualFissileContent;
double WeightPuContent = 0; double WeightPuContent = 0;
int loopCount = 0; int loopCount = 0;
do do
{ {
double LAMBDA_NEEDED = LAMBDA_TOT_FOR(PuMassNeeded,FissilArray,"Fis"); double LAMBDA_NEEDED = LAMBDA_TOT_FOR(PuMassNeeded,FissilArray,"Fis");
if(LAMBDA_NEEDED == -1) // Check if previous lambda was well calculated if( LAMBDA_NEEDED == -1 ) // Check if previous lambda was well calculated
{ {
for(int i=0 ; i < (int)FissilArray.size() + (int)FertilArray.size();i++ ) for(int i=0 ; i < (int)FissilArray.size() + (int)FertilArray.size();i++ )
lambda[i]= -1; lambda[i]= -1;
WARNING<<"Not enought fissile material to build fuel"<<endl; WARNING << "Not enought fissile material to build fuel" << endl;
return lambda; return lambda;
} }
SetLambda(lambda,0,FissilArray.size()-1,LAMBDA_NEEDED );
bool succeed = Build_Fuel_According_Lambda(lambda,FissilArray,FertilArray,HMMass,Fissile,Fertile); SetLambda(lambda, 0, FissilArray.size()-1, LAMBDA_NEEDED );
bool succeed = Build_Fuel_According_Lambda(lambda, FissilArray, FertilArray, HMMass, Fissile, Fertile);
if(!succeed) if(!succeed)
{ for( int i = 0 ; i < (int)FissilArray.size() + (int)FertilArray.size() ; i++ ) {
lambda[i] = -1; //error code (read by FabricationPlant) for( int i = 0; i < (int)FissilArray.size() + (int)FertilArray.size(); i++ )
lambda[i] = -1; // Error code (readed by FabricationPlant)
return lambda; return lambda;
} }
AvailablePuMass = Fissile.GetTotalMass() * 1e6; //in grams AvailablePuMass = Fissile.GetTotalMass() * 1e6; //in grams
if (loopCount > fMaxInterration) if (loopCount > fMaxInterration)
{ {
ERROR << "Too much iterration in BuildFuel Method ! Need improvement in fuel fabrication ! Ask for it or D.I.Y. !!" << endl; ERROR << "Too much iterration in BuildFuel Method !";
ERROR << "Need improvement in fuel fabrication ! Ask for it or D.I.Y. !!" << endl;
exit(1); exit(1);
} }
/*Calcul the quantity of this composition needed to reach the burnup*/ /* Calcul the quantity of this composition needed to reach the burnup */
double MolarPuContent = GetFissileMolarFraction(Fissile, Fertile, BurnUp); double MolarPuContent = GetFissileMolarFraction(Fissile, Fertile, BurnUp);
double MeanMolarPu = Fissile.MeanMolar();
double MeanMolarDepletedU = Fertile.MeanMolar(); double MeanMolarPu = Fissile.GetMeanMolarMass();
double MeanMolar = MeanMolarPu * MolarPuContent + (1-MolarPuContent)*MeanMolarDepletedU; double MeanMolarDepletedU = Fertile.GetMeanMolarMass();
WeightPuContent = MolarPuContent * MeanMolarPu / MeanMolar ;
double MeanMolar = MeanMolarPu * MolarPuContent + (1-MolarPuContent) *MeanMolarDepletedU;
WeightPuContent = MolarPuContent * MeanMolarPu / MeanMolar;
fActualFissileContent = MolarPuContent; //fActualFissileContent can be accessed by a derivated EquivalenModel to accelerate GetFissileMolarFraction function (exemple in EQM_MLP_Kinf) fActualFissileContent = MolarPuContent; //fActualFissileContent can be accessed by a derivated EquivalenModel to accelerate GetFissileMolarFraction function (exemple in EQM_MLP_Kinf)
PuMassNeeded = WeightPuContent * HMMass ; PuMassNeeded = WeightPuContent * HMMass ;
DBGV("MolarPuContent "<<MolarPuContent<<" DeltaM "<<PuMassNeeded-AvailablePuMass << " g");
DBGV( "MolarPuContent " << MolarPuContent << " DeltaM " << PuMassNeeded - AvailablePuMass << " g" );
loopCount++; loopCount++;
}while( fabs(PuMassNeeded - AvailablePuMass)/HMMass > fRelativMassPrecision ); }while( fabs( PuMassNeeded - AvailablePuMass )/HMMass > fRelativMassPrecision );
DBGV("Weight percent fissil : "<<PuMassNeeded/HMMass ); DBGV( "Weight percent fissil : " << PuMassNeeded/HMMass );
DBGV("Lambda vector: "); DBGV( "Lambda vector: " );
for(int i = 0 ; i < (int)FissilArray.size() + (int)FertilArray.size() ; i++ ) for(int i = 0; i < (int)FissilArray.size() + (int)FertilArray.size(); i++ )
DBGV(lambda[i]); DBGV(lambda[i]);
return lambda; return lambda;
} }
//________________________________________________________________________ //________________________________________________________________________
void EquivalenceModel::SetLambda(vector<double>& lambda ,int FirstStockID, int LastStockID, double LAMBDA_TOT) void EquivalenceModel::SetLambda(vector<double>& lambda ,int FirstStockID, int LastStockID, double LAMBDA_TOT)
{ {
if(LAMBDA_TOT > LastStockID - FirstStockID + 1 ) if( LAMBDA_TOT > LastStockID - FirstStockID + 1 )
{ {
ERROR << " FATAL ERROR " <<endl; ERROR << " FATAL ERROR " << endl;
exit(0); exit(0);
} }
for(int i = FirstStockID ; i <= LastStockID ; i++) //set to 0 all non touched value (to be sure) for( int i = FirstStockID; i <= LastStockID; i++ ) //set to 0 all non touched value (to be sure)
lambda[i] = 0 ; lambda[i] = 0 ;
int IntegerPart = floor( LAMBDA_TOT ); int IntegerPart = floor( LAMBDA_TOT );
double DecimalPart = LAMBDA_TOT - IntegerPart; double DecimalPart = LAMBDA_TOT - IntegerPart;
for(int i=FirstStockID ; i < FirstStockID +IntegerPart ;i++ ) for( int i=FirstStockID; i < FirstStockID +IntegerPart; i++ )
lambda[i]=1; lambda[i] = 1;
lambda[FirstStockID + IntegerPart] = DecimalPart ; lambda[FirstStockID + IntegerPart] = DecimalPart;
} }
//________________________________________________________________________ //________________________________________________________________________
...@@ -554,7 +554,7 @@ double IsotopicVector::GetTotalMass() const ...@@ -554,7 +554,7 @@ double IsotopicVector::GetTotalMass() const
} }
//________________________________________________________________________ //________________________________________________________________________
double IsotopicVector::MeanMolar() const double IsotopicVector::GetMeanMolarMass() const
{ {
return GetTotalMass() * 1e6 * AVOGADRO / GetActinidesComposition().GetSumOfAll(); return GetTotalMass() * 1e6 * AVOGADRO / GetActinidesComposition().GetSumOfAll();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment