Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4AdjointInterpolator.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$
27//
28#include "G4AdjointCSMatrix.hh"
30
31G4AdjointInterpolator* G4AdjointInterpolator::theInstance = 0;
32///////////////////////////////////////////////////////
33//
35{ if(theInstance == 0) {
36 static G4AdjointInterpolator interpolator;
37 theInstance = &interpolator;
38 }
39 return theInstance;
40}
41///////////////////////////////////////////////////////
42//
44{ if(theInstance == 0) {
45 static G4AdjointInterpolator interpolator;
46 theInstance = &interpolator;
47 }
48 return theInstance;
49}
50
51///////////////////////////////////////////////////////
52//
53G4AdjointInterpolator::G4AdjointInterpolator()
54{;
55}
56///////////////////////////////////////////////////////
57//
59{;
60}
61///////////////////////////////////////////////////////
62//
64{ G4double res = y1+ (x-x1)*(y2-y1)/(x2-x1);
65 //G4cout<<"Linear "<<res<<G4endl;
66 return res;
67}
68///////////////////////////////////////////////////////
69//
71{ if (y1<=0 || y2<=0 || x1<=0) return LinearInterpolation(x,x1,x2,y1,y2);
72 G4double B=std::log(y2/y1)/std::log(x2/x1);
73 //G4cout<<"x1,x2,y1,y2 "<<x1<<'\t'<<x2<<'\t'<<y1<<'\t'<<y2<<'\t'<<G4endl;
74 G4double A=y1/std::pow(x1,B);
75 G4double res=A*std::pow(x,B);
76 // G4cout<<"Log "<<res<<G4endl;
77 return res;
78}
79///////////////////////////////////////////////////////
80//
82{ G4double B=(std::log(y2)-std::log(y1));
83 B=B/(x2-x1);
84 G4double A=y1*std::exp(-B*x1);
85 G4double res=A*std::exp(B*x);
86 return res;
87}
88///////////////////////////////////////////////////////
89//
91{
92 if (InterPolMethod == "Log" ){
93 return LogarithmicInterpolation(x,x1,x2,y1,y2);
94 }
95 else if (InterPolMethod == "Lin" ){
96 return LinearInterpolation(x,x1,x2,y1,y2);
97 }
98 else if (InterPolMethod == "Exp" ){
99 return ExponentialInterpolation(x,x1,x2,y1,y2);
100 }
101 else {
102 //G4cout<<"The interpolation method that you invoked does not exist!"<<G4endl;
103 return -1111111111.;
104 }
105}
106///////////////////////////////////////////////////////
107//
108size_t G4AdjointInterpolator::FindPosition(G4double& x,std::vector<G4double>& x_vec,size_t , size_t ) //only valid if x_vec is monotically increasing
109{ //most rapid nethod could be used probably
110 //It is important to put std::vector<G4double>& such that the vector itself is used and not a copy
111
112
113 size_t ndim = x_vec.size();
114 size_t ind1 = 0;
115 size_t ind2 = ndim - 1;
116 /* if (ind_max >= ind_min){
117 ind1=ind_min;
118 ind2=ind_max;
119
120
121 }
122 */
123
124
125 if (ndim >1) {
126
127 if (x_vec[0] < x_vec[1] ) { //increasing
128 do {
129 size_t midBin = (ind1 + ind2)/2;
130 if (x < x_vec[midBin])
131 ind2 = midBin;
132 else
133 ind1 = midBin;
134 } while (ind2 - ind1 > 1);
135 }
136 else {
137 do {
138 size_t midBin = (ind1 + ind2)/2;
139 if (x < x_vec[midBin])
140 ind1 = midBin;
141 else
142 ind2 = midBin;
143 } while (ind2 - ind1 > 1);
144 }
145
146 }
147
148 return ind1;
149}
150
151///////////////////////////////////////////////////////
152//
153size_t G4AdjointInterpolator::FindPositionForLogVector(G4double& log_x,std::vector<G4double>& log_x_vec) //only valid if x_vec is monotically increasing
154{ //most rapid nethod could be used probably
155 //It is important to put std::vector<G4double>& such that the vector itself is used and not a copy
156 return FindPosition(log_x, log_x_vec);
157 /*
158 if (log_x_vec.size()>3){
159 size_t ind=0;
160 G4double log_x1=log_x_vec[1];
161 G4double d_log =log_x_vec[2]-log_x1;
162 G4double dind=(log_x-log_x1)/d_log +1.;
163 if (dind <1.) ind=0;
164 else if (dind >= double(log_x_vec.size())-2.) ind =log_x_vec.size()-2;
165 else ind =size_t(dind);
166 return ind;
167
168 }
169 else return FindPosition(log_x, log_x_vec);
170 */
171
172
173}
174///////////////////////////////////////////////////////
175//
176G4double G4AdjointInterpolator::Interpolate(G4double& x,std::vector<G4double>& x_vec,std::vector<G4double>& y_vec,G4String InterPolMethod)
177{ size_t i=FindPosition(x,x_vec);
178 //G4cout<<i<<G4endl;
179 //G4cout<<x<<G4endl;
180 //G4cout<<x_vec[i]<<G4endl;
181 return Interpolation( x,x_vec[i],x_vec[i+1],y_vec[i],y_vec[i+1],InterPolMethod);
182}
183
184///////////////////////////////////////////////////////
185//
186G4double G4AdjointInterpolator::InterpolateWithIndexVector(G4double& x,std::vector<G4double>& x_vec,std::vector<G4double>& y_vec,
187 std::vector<size_t>& index_vec,G4double x0, G4double dx) //only linear interpolation possible
188{ size_t ind=0;
189 if (x>x0) ind=int((x-x0)/dx);
190 if (ind >= index_vec.size()-1) ind= index_vec.size()-2;
191 size_t ind1 = index_vec[ind];
192 size_t ind2 = index_vec[ind+1];
193 if (ind1 >ind2) {
194 size_t ind11=ind1;
195 ind1=ind2;
196 ind2=ind11;
197
198 }
199
200 ind=FindPosition(x,x_vec,ind1,ind2);
201 return Interpolation( x,x_vec[ind],x_vec[ind+1],y_vec[ind],y_vec[ind+1],"Lin");
202
203}
204
205
206///////////////////////////////////////////////////////
207//
208G4double G4AdjointInterpolator::InterpolateForLogVector(G4double& log_x,std::vector<G4double>& log_x_vec,std::vector<G4double>& log_y_vec)
209{ //size_t i=0;
210 size_t i=FindPositionForLogVector(log_x,log_x_vec);
211 /*G4cout<<"In interpolate "<<G4endl;
212 G4cout<<i<<G4endl;
213 G4cout<<log_x<<G4endl;
214 G4cout<<log_x_vec[i]<<G4endl;
215 G4cout<<log_x_vec[i+1]<<G4endl;
216 G4cout<<log_y_vec[i]<<G4endl;
217 G4cout<<log_y_vec[i+1]<<G4endl;*/
218
219 G4double log_y=LinearInterpolation(log_x,log_x_vec[i],log_x_vec[i+1],log_y_vec[i],log_y_vec[i+1]);
220 return log_y;
221
222}
double G4double
Definition: G4Types.hh:64
G4double Interpolation(G4double &x, G4double &x1, G4double &x2, G4double &y1, G4double &y2, G4String InterPolMethod="Log")
G4double LinearInterpolation(G4double &x, G4double &x1, G4double &x2, G4double &y1, G4double &y2)
G4double ExponentialInterpolation(G4double &x, G4double &x1, G4double &x2, G4double &y1, G4double &y2)
G4double Interpolate(G4double &x, std::vector< G4double > &x_vec, std::vector< G4double > &y_vec, G4String InterPolMethod="Log")
static G4AdjointInterpolator * GetInstance()
size_t FindPosition(G4double &x, std::vector< G4double > &x_vec, size_t ind_min=0, size_t ind_max=0)
size_t FindPositionForLogVector(G4double &x, std::vector< G4double > &x_vec)
static G4AdjointInterpolator * GetAdjointInterpolator()
G4double InterpolateWithIndexVector(G4double &x, std::vector< G4double > &x_vec, std::vector< G4double > &y_vec, std::vector< size_t > &index_vec, G4double x0, G4double dx)
G4double LogarithmicInterpolation(G4double &x, G4double &x1, G4double &x2, G4double &y1, G4double &y2)
G4double InterpolateForLogVector(G4double &x, std::vector< G4double > &x_vec, std::vector< G4double > &y_vec)