Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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)