Geant4  10.02.p02
G4AdjointCSMatrix.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // $Id: G4AdjointCSMatrix.cc 91870 2015-08-07 15:21:40Z gcosmo $
27 //
28 
29 #include <iomanip>
30 #include <fstream>
31 
32 #include "G4AdjointCSMatrix.hh"
33 #include "G4SystemOfUnits.hh"
34 #include "G4AdjointInterpolator.hh"
35 
37 //
39  theLogPrimEnergyVector.clear();
42  theLogProbMatrix.clear();
43  theLogProbMatrixIndex.clear();
44  log0Vector.clear();
47  dlog =0;
48 }
50 //
52  theLogPrimEnergyVector.clear();
55  theLogProbMatrix.clear();
56 }
58 //
60 {
61  theLogPrimEnergyVector.clear();
64  theLogProbMatrix.clear();
65  theLogProbMatrixIndex.clear();
66  log0Vector.clear();
68 }
70 //
71  void G4AdjointCSMatrix::AddData(G4double aLogPrimEnergy,G4double aLogCS, std::vector< double>* aLogSecondEnergyVector,
72  std::vector< double>* aLogProbVector,size_t n_pro_decade){
73 
75 
76  //At this time we consider that the energy is increasing monotically
77  theLogPrimEnergyVector.push_back(aLogPrimEnergy);
78  theLogCrossSectionVector.push_back(aLogCS);
79  theLogSecondEnergyMatrix.push_back(aLogSecondEnergyVector);
80  theLogProbMatrix.push_back(aLogProbVector);
81 
82  std::vector< size_t>* aLogProbVectorIndex = 0;
83  dlog =0;
84 
85  if (n_pro_decade > 0 && aLogProbVector->size()>0) {
86  aLogProbVectorIndex = new std::vector< size_t>();
87  dlog=std::log(10.)/n_pro_decade;
88  G4double log_val = int(std::min((*aLogProbVector)[0],aLogProbVector->back())/dlog)*dlog;
89  log0Vector.push_back(log_val);
90 
91  // Loop checking, 07-Aug-2015, Vladimir Ivanchenko
92  while(log_val<0.) {
93  aLogProbVectorIndex->push_back(theInterpolator->FindPosition(log_val,(*aLogProbVector)));
94  log_val+=dlog;
95  }
96  }
97  else {
98  log0Vector.push_back(0.);
99  }
100  theLogProbMatrixIndex.push_back(aLogProbVectorIndex);
101 
102 
104 
105 
106 }
108 //
109 G4bool G4AdjointCSMatrix::GetData(unsigned int i, G4double& aLogPrimEnergy,G4double& aLogCS,G4double& log0, std::vector< double>*& aLogSecondEnergyVector,
110  std::vector< double>*& aLogProbVector, std::vector< size_t>*& aLogProbVectorIndex)
111 { if (i>= nb_of_PrimEnergy) return false;
112  //G4cout<<"Test Get Data "<<G4endl;
113  aLogPrimEnergy = theLogPrimEnergyVector[i];
114  aLogCS = theLogCrossSectionVector[i];
115  aLogSecondEnergyVector = theLogSecondEnergyMatrix[i];
116  aLogProbVector = theLogProbMatrix[i];
117  aLogProbVectorIndex = theLogProbMatrixIndex[i];
118  log0=log0Vector[i];
119  return true;
120 
121 }
123 //
125 { std::fstream FileOutput(file_name, std::ios::out);
126  FileOutput<<std::setiosflags(std::ios::scientific);
127  FileOutput<<std::setprecision(6);
128  FileOutput<<theLogPrimEnergyVector.size()<<G4endl;
129  for (size_t i=0;i<theLogPrimEnergyVector.size();i++){
130  FileOutput<<std::exp(theLogPrimEnergyVector[i])/MeV<<'\t'<<std::exp(theLogCrossSectionVector[i])<<G4endl;
131  size_t j1=0;
132  FileOutput<<theLogSecondEnergyMatrix[i]->size()<<G4endl;
133  for (size_t j=0;j<theLogSecondEnergyMatrix[i]->size();j++){
134  FileOutput<<std::exp((*theLogSecondEnergyMatrix[i])[j]);
135  j1++;
136  if (j1<10) FileOutput<<'\t';
137  else {
138  FileOutput<<G4endl;
139  j1=0;
140  }
141  }
142  if (j1>0) FileOutput<<G4endl;
143  j1=0;
144  FileOutput<<theLogProbMatrix[i]->size()<<G4endl;
145  for (size_t j=0;j<theLogProbMatrix[i]->size();j++){
146  FileOutput<<std::exp((*theLogProbMatrix[i])[j]);
147  j1++;
148  if (j1<10) FileOutput<<'\t';
149  else {
150  FileOutput<<G4endl;
151  j1=0;
152  }
153  }
154  if (j1>0) FileOutput<<G4endl;
155 
156 
157  }
158 
159 }
161 //
163 { std::fstream FileOutput(file_name, std::ios::in);
164  size_t n1,n2;
165 
166 
167  theLogPrimEnergyVector.clear();
168  theLogCrossSectionVector.clear();
169  theLogSecondEnergyMatrix.clear();
170  theLogProbMatrix.clear();
171  FileOutput>>n1;
172  for (size_t i=0; i<n1;i++){
173  G4double E,CS;
174  FileOutput>>E>>CS;
175  theLogPrimEnergyVector.push_back(E);
176  theLogCrossSectionVector.push_back(CS);
177  FileOutput>>n2;
178  theLogSecondEnergyMatrix.push_back(new std::vector<G4double>());
179  theLogProbMatrix.push_back(new std::vector<G4double>());
180 
181  for (size_t j=0; j<n2;j++){
182  G4double E1;
183  FileOutput>>E1;
184  theLogSecondEnergyMatrix[i]->push_back(E1);
185  }
186  FileOutput>>n2;
187  for (size_t j=0; j<n2;j++){
188  G4double prob;
189  FileOutput>>prob;
190  theLogProbMatrix[i]->push_back(prob);
191  }
192 
193 
194 
195  }
196 
197 
198 
199 
200 }
static const double MeV
Definition: G4SIunits.hh:211
std::vector< double > theLogCrossSectionVector
G4bool GetData(unsigned int i, G4double &aPrimEnergy, G4double &aCS, G4double &log0, std::vector< double > *&aLogSecondEnergyVector, std::vector< double > *&aLogProbVector, std::vector< size_t > *&aLogProbVectorIndex)
void Read(G4String file_name)
void AddData(G4double aPrimEnergy, G4double aCS, std::vector< double > *aLogSecondEnergyVector, std::vector< double > *aLogProbVector, size_t n_pro_decade=0)
std::vector< double > theLogPrimEnergyVector
unsigned int nb_of_PrimEnergy
std::vector< double > log0Vector
std::vector< std::vector< double > * > theLogProbMatrix
bool G4bool
Definition: G4Types.hh:79
std::vector< std::vector< double > * > theLogSecondEnergyMatrix
size_t FindPosition(G4double &x, std::vector< G4double > &x_vec, size_t ind_min=0, size_t ind_max=0)
G4AdjointCSMatrix(G4bool aBool)
std::vector< std::vector< size_t > * > theLogProbMatrixIndex
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static G4AdjointInterpolator * GetInstance()
#define G4endl
Definition: G4ios.hh:61
void Write(G4String file_name)
double G4double
Definition: G4Types.hh:76