Changeset 1193 for trunk/source/global/management/src
- Timestamp:
- Nov 19, 2009, 3:40:00 PM (15 years ago)
- Location:
- trunk/source/global/management/src
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/global/management/src/G4ErrorPropagatorData.cc
r1058 r1193 25 25 // 26 26 // 27 // $Id: G4ErrorPropagatorData.cc,v 1. 3 2007/06/05 13:04:30gcosmo Exp $28 // GEANT4 tag $Name: g eant4-09-02-ref-02$27 // $Id: G4ErrorPropagatorData.cc,v 1.5 2009/05/19 13:31:47 gcosmo Exp $ 28 // GEANT4 tag $Name: global-V09-02-10 $ 29 29 // 30 30 // … … 43 43 //------------------------------------------------------------------- 44 44 45 G4ErrorPropagatorData::G4ErrorPropagatorData(){} 46 G4ErrorPropagatorData::~G4ErrorPropagatorData(){} 45 G4ErrorPropagatorData::~G4ErrorPropagatorData() 46 { 47 } 48 49 G4ErrorPropagatorData::G4ErrorPropagatorData() 50 { 51 theStage = G4ErrorStage_Inflation; 52 } 47 53 48 54 G4ErrorPropagatorData* G4ErrorPropagatorData::GetErrorPropagatorData() -
trunk/source/global/management/src/G4LPhysicsFreeVector.cc
r1058 r1193 25 25 // 26 26 // 27 // $Id: G4LPhysicsFreeVector.cc,v 1.2 2 2008/09/22 08:26:33 gcosmoExp $28 // GEANT4 tag $Name: g eant4-09-02-ref-02$27 // $Id: G4LPhysicsFreeVector.cc,v 1.23 2009/06/25 10:05:26 vnivanch Exp $ 28 // GEANT4 tag $Name: global-V09-02-10 $ 29 29 // 30 30 // … … 35 35 // 36 36 // F.W. Jones, TRIUMF, 04-JUN-96 37 // 38 // Modified: 39 // 19 Jun. 2009, V.Ivanchenko : removed hidden bin 37 40 // 38 41 // -------------------------------------------------------------------- 39 42 40 43 #include "G4LPhysicsFreeVector.hh" 41 42 44 #include "G4ios.hh" 43 45 … … 61 63 edgeMin = binmin; 62 64 edgeMax = binmax; 63 numberOf Bin= nbin;64 binVector.reserve(n bin+1);65 dataVector.reserve(n bin+1);66 for (size_t i=0; i< =numberOfBin; i++)65 numberOfNodes = nbin; 66 binVector.reserve(numberOfNodes); 67 dataVector.reserve(numberOfNodes); 68 for (size_t i=0; i<numberOfNodes; i++) 67 69 { 68 70 binVector.push_back(0.0); … … 105 107 void G4LPhysicsFreeVector::DumpValues() 106 108 { 107 for (size_t i = 0; i < numberOf Bin; i++)109 for (size_t i = 0; i < numberOfNodes; i++) 108 110 { 109 111 G4cout << binVector[i] << " " << dataVector[i]/millibarn << G4endl; -
trunk/source/global/management/src/G4PhysicsFreeVector.cc
r1058 r1193 25 25 // 26 26 // 27 // $Id: G4PhysicsFreeVector.cc,v 1.1 2 2008/09/22 14:49:57 gcosmoExp $28 // GEANT4 tag $Name: g eant4-09-02-ref-02$27 // $Id: G4PhysicsFreeVector.cc,v 1.13 2009/06/25 10:05:26 vnivanch Exp $ 28 // GEANT4 tag $Name: global-V09-02-10 $ 29 29 // 30 30 // … … 41 41 // 26 Sep. 1996, K.Amako : Constructor with only 'bin size' added 42 42 // 11 Nov. 2000, H.Kurashige : use STL vector for dataVector and binVector 43 // 19 Jun. 2009, V.Ivanchenko : removed hidden bin 43 44 // 44 45 //-------------------------------------------------------------------- … … 57 58 { 58 59 type = T_G4PhysicsFreeVector; 59 numberOf Bin= theNbin;60 numberOfNodes = theNbin; 60 61 61 // Add extra one bin (hidden to user) to handle correctly when 62 // Energy=theEmax in getValue. 63 dataVector.reserve(numberOfBin+1); 64 binVector.reserve(numberOfBin+1); 62 dataVector.reserve(numberOfNodes); 63 binVector.reserve(numberOfNodes); 65 64 66 for (size_t i=0; i< =numberOfBin; i++)65 for (size_t i=0; i<numberOfNodes; i++) 67 66 { 68 67 binVector.push_back(0.0); … … 75 74 { 76 75 type = T_G4PhysicsFreeVector; 77 numberOf Bin= theBinVector.size();76 numberOfNodes = theBinVector.size(); 78 77 79 // Add extra one bin (hidden to user) to handle correctly when 80 // Energy=theEmax in getValue. 81 dataVector.reserve(numberOfBin+1); 82 binVector.reserve(numberOfBin+1); 78 dataVector.reserve(numberOfNodes); 79 binVector.reserve(numberOfNodes); 83 80 84 for (size_t i=0; i<numberOf Bin; i++)81 for (size_t i=0; i<numberOfNodes; i++) 85 82 { 86 83 binVector.push_back(theBinVector[i]); … … 88 85 } 89 86 90 // Put values to extra hidden bin. For 'binVector', the 'edgeMin' of the91 // extra hidden bin is assumed to have the following value. For binary92 // search, this value is completely arbitrary if it is greater than93 // the 'edgeMin' at 'numberOfBin-1'.94 binVector.push_back ( theBinVector[numberOfBin-1] + 1.0 );95 96 97 // Put values to extra hidden bin. For 'dataVector', the 'value' of the98 // extra hidden bin is assumed to have the same as the one at 'numberBin-1'.99 dataVector.push_back( theDataVector[numberOfBin-1] );100 101 87 edgeMin = binVector[0]; 102 edgeMax = binVector[numberOf Bin-1];88 edgeMax = binVector[numberOfNodes-1]; 103 89 } 104 90 … … 113 99 dataVector[theBinNumber] = theDataValue; 114 100 115 if( theBinNumber == numberOf Bin-1 )101 if( theBinNumber == numberOfNodes-1 ) 116 102 { 117 edgeMax = binVector[numberOfBin-1]; 118 119 // Put values to extra hidden bin. For 'binVector', the 'edgeMin' 120 // of the extra hidden bin is assumed to have the following value. 121 // For binary search, this value is completely arbitrary if it is 122 // greater than the 'edgeMin' at 'numberOfBin-1'. 123 binVector[numberOfBin] = theBinValue + 1.0; 124 125 // Put values to extra hidden bin. For 'dataVector', the 'value' 126 // of the extra hidden bin is assumed to have the same as the one 127 // at 'numberBin-1'. 128 dataVector[numberOfBin] = theDataValue; 103 edgeMax = binVector[numberOfNodes-1]; 129 104 } 130 105 -
trunk/source/global/management/src/G4PhysicsLinearVector.cc
r1058 r1193 25 25 // 26 26 // 27 // $Id: G4PhysicsLinearVector.cc,v 1.1 4 2008/09/22 14:49:57 gcosmoExp $28 // GEANT4 tag $Name: g eant4-09-02-ref-02$27 // $Id: G4PhysicsLinearVector.cc,v 1.15 2009/06/25 10:05:26 vnivanch Exp $ 28 // GEANT4 tag $Name: global-V09-02-10 $ 29 29 // 30 30 // … … 35 35 // 36 36 // 15 Feb 1996 - K.Amako : 1st version 37 // 19 Jun 2009 - V.Ivanchenko : removed hidden bin 37 38 // 38 39 //-------------------------------------------------------------------- … … 51 52 type = T_G4PhysicsLinearVector; 52 53 53 // Add extra one bin (hidden to user) to handle correctly when 54 // Energy=theEmax in getValue. 55 dataVector.reserve(theNbin+1); 56 binVector.reserve(theNbin+1); 54 numberOfNodes = theNbin + 1; 55 dataVector.reserve(numberOfNodes); 56 binVector.reserve(numberOfNodes); 57 57 58 numberOfBin = theNbin; 59 60 for (size_t i=0; i<=numberOfBin; i++) 58 for (size_t i=0; i<numberOfNodes; i++) 61 59 { 62 60 binVector.push_back(0.0); … … 73 71 type = T_G4PhysicsLinearVector; 74 72 75 // Add extra one bin (hidden to user) to handle correctly when 76 // Energy=theEmax in getValue. 77 dataVector.reserve(theNbin+1); 78 binVector.reserve(theNbin+1); 73 numberOfNodes = theNbin + 1; 74 dataVector.reserve(numberOfNodes); 75 binVector.reserve(numberOfNodes); 79 76 80 numberOfBin = theNbin; 81 82 for (size_t i=0; i<numberOfBin+1; i++) 77 for (size_t i=0; i<numberOfNodes; i++) 83 78 { 84 79 binVector.push_back( theEmin + i*dBin ); … … 87 82 88 83 edgeMin = binVector[0]; 89 edgeMax = binVector[numberOf Bin-1];84 edgeMax = binVector[numberOfNodes-1]; 90 85 91 86 } -
trunk/source/global/management/src/G4PhysicsLnVector.cc
r1058 r1193 25 25 // 26 26 // 27 // $Id: G4PhysicsLnVector.cc,v 1.1 7 2008/09/22 14:49:57 gcosmoExp $28 // GEANT4 tag $Name: g eant4-09-02-ref-02$27 // $Id: G4PhysicsLnVector.cc,v 1.18 2009/06/25 10:05:26 vnivanch Exp $ 28 // GEANT4 tag $Name: global-V09-02-10 $ 29 29 // 30 30 // … … 35 35 // 36 36 // 27 Apr 1999 - M.G.Pia: Created from G4PhysicsLogVector 37 // 19 Jun 2009 - V.Ivanchenko : removed hidden bin 37 38 // 38 39 // -------------------------------------------------------------- … … 51 52 type = T_G4PhysicsLnVector; 52 53 53 // Add extra one bin (hidden to user) to handle correctly when 54 // Energy=theEmax in getValue. 55 dataVector.reserve(theNbin+1); 56 binVector.reserve(theNbin+1); 54 numberOfNodes = theNbin + 1; 55 dataVector.reserve(numberOfNodes); 56 binVector.reserve(numberOfNodes); 57 57 58 numberOfBin = theNbin; 59 60 for (size_t i=0; i<=numberOfBin; i++) 58 for (size_t i=0; i<numberOfNodes; i++) 61 59 { 62 60 binVector.push_back(0.0); … … 73 71 type = T_G4PhysicsLnVector; 74 72 75 // Add extra one bin (hidden to user) to handle correctly when 76 // Energy=theEmax in getValue. 77 dataVector.reserve(theNbin+1); 78 binVector.reserve(theNbin+1); 73 numberOfNodes = theNbin + 1; 74 dataVector.reserve(numberOfNodes); 75 binVector.reserve(numberOfNodes); 79 76 80 numberOfBin = theNbin; 81 82 for (size_t i=0; i<numberOfBin+1; i++) 77 for (size_t i=0; i<numberOfNodes; i++) 83 78 { 84 binVector.push_back(std::exp( std::log(theEmin)+i*dBin));79 binVector.push_back(std::exp((baseBin+i)*dBin)); 85 80 dataVector.push_back(0.0); 86 81 } 87 82 88 83 edgeMin = binVector[0]; 89 edgeMax = binVector[numberOf Bin-1];84 edgeMax = binVector[numberOfNodes-1]; 90 85 } 91 86 -
trunk/source/global/management/src/G4PhysicsLogVector.cc
r1058 r1193 25 25 // 26 26 // 27 // $Id: G4PhysicsLogVector.cc,v 1.2 1 2008/09/22 08:26:33 gcosmoExp $28 // GEANT4 tag $Name: g eant4-09-02-ref-02$27 // $Id: G4PhysicsLogVector.cc,v 1.22 2009/06/25 10:05:26 vnivanch Exp $ 28 // GEANT4 tag $Name: global-V09-02-10 $ 29 29 // 30 30 // … … 42 42 // 9 Mar. 2001, H.Kurashige : added PhysicsVector type and Retrieve 43 43 // 05 Sep. 2008, V.Ivanchenko : added protections for zero-length vector 44 // 19 Jun. 2009, V.Ivanchenko : removed hidden bin 44 45 // 45 46 // -------------------------------------------------------------- … … 58 59 type = T_G4PhysicsLogVector; 59 60 60 // Add extra one bin (hidden to user) to handle correctly when 61 // Energy=theEmax in getValue. 62 dataVector.reserve(theNbin+1); 63 binVector.reserve(theNbin+1); 61 numberOfNodes = theNbin + 1; 62 dataVector.reserve(numberOfNodes); 63 binVector.reserve(numberOfNodes); 64 64 65 numberOfBin = theNbin; 66 67 for (size_t i=0; i<=numberOfBin; i++) 65 for (size_t i=0; i<numberOfNodes; i++) 68 66 { 69 67 binVector.push_back(0.0); … … 79 77 type = T_G4PhysicsLogVector; 80 78 81 // Add extra one bin (hidden to user) to handle correctly when82 // Energy=theEmax in getValue.83 dataVector.reserve(theNbin+1);84 binVector.reserve(theNbin+1);79 numberOfNodes = theNbin + 1; 80 dataVector.reserve(numberOfNodes); 81 binVector.reserve(numberOfNodes); 82 static const G4double g4log10 = std::log(10.); 85 83 86 numberOfBin = theNbin; 87 88 for (size_t i=0; i<numberOfBin+1; i++) 84 for (size_t i=0; i<numberOfNodes; i++) 89 85 { 90 binVector.push_back(std:: pow(10., std::log10(theEmin)+i*dBin));86 binVector.push_back(std::exp(g4log10*(baseBin+i)*dBin)); 91 87 dataVector.push_back(0.0); 92 88 } 89 93 90 edgeMin = binVector[0]; 94 edgeMax = binVector[numberOf Bin-1];91 edgeMax = binVector[numberOfNodes-1]; 95 92 } 96 93 -
trunk/source/global/management/src/G4PhysicsOrderedFreeVector.cc
r1058 r1193 25 25 // 26 26 // 27 // $Id: G4PhysicsOrderedFreeVector.cc,v 1.1 2 2008/09/22 14:49:57 gcosmoExp $28 // GEANT4 tag $Name: g eant4-09-02-ref-02$27 // $Id: G4PhysicsOrderedFreeVector.cc,v 1.13 2009/06/25 10:05:26 vnivanch Exp $ 28 // GEANT4 tag $Name: global-V09-02-10 $ 29 29 // 30 30 //////////////////////////////////////////////////////////////////////// … … 43 43 // 2000-11-11 by H.Kurashige 44 44 // > use STL vector for dataVector and binVector 45 // 19 Jun. 2009-06-19 by V.Ivanchenko 46 // > removed hidden bin 47 // 45 48 // mail: gum@triumf.ca 46 //47 49 // 48 50 //////////////////////////////////////////////////////////////////////// … … 65 67 type = T_G4PhysicsOrderedFreeVector; 66 68 67 dataVector.reserve(VectorLength +1);68 binVector.reserve(VectorLength +1);69 numberOf Bin= VectorLength;69 dataVector.reserve(VectorLength); 70 binVector.reserve(VectorLength); 71 numberOfNodes = VectorLength; 70 72 71 73 for (size_t i = 0 ; i < VectorLength ; i++) … … 74 76 dataVector.push_back(Values[i]); 75 77 } 76 edgeMin = binVector.front(); 77 edgeMax = binVector.back(); 78 binVector.push_back ( binVector[numberOfBin-1] + 1.0 ); 79 dataVector.push_back( dataVector[numberOfBin-1] ); 78 edgeMin = binVector[0]; 79 edgeMax = binVector[numberOfNodes-1]; 80 80 } 81 81 … … 101 101 binVector.push_back(energy); 102 102 dataVector.push_back(value); 103 numberOf Bin++;103 numberOfNodes++; 104 104 edgeMin = binVector.front(); 105 105 edgeMax = binVector.back(); … … 133 133 { 134 134 G4int n1 = 0; 135 G4int n2 = numberOf Bin/2;136 G4int n3 = numberOf Bin- 1;135 G4int n2 = numberOfNodes/2; 136 G4int n3 = numberOfNodes - 1; 137 137 while (n1 != n3 - 1) { 138 138 if (aValue > dataVector[n2]) -
trunk/source/global/management/src/G4PhysicsVector.cc
r1058 r1193 25 25 // 26 26 // 27 // $Id: G4PhysicsVector.cc,v 1. 27 2008/10/16 12:14:36 gcosmoExp $28 // GEANT4 tag $Name: g eant4-09-02-ref-02$27 // $Id: G4PhysicsVector.cc,v 1.40 2009/11/04 11:45:54 vnivanch Exp $ 28 // GEANT4 tag $Name: global-V09-02-10 $ 29 29 // 30 30 // … … 43 43 // 09 Mar. 2001, H.Kurashige : added G4PhysicsVector type 44 44 // 05 Sep. 2008, V.Ivanchenko : added protections for zero-length vector 45 // 11 May 2009, A.Bagulya : added new implementation of methods 46 // ComputeSecondDerivatives - first derivatives at edge points 47 // should be provided by a user 48 // FillSecondDerivatives - default computation base on "not-a-knot" 49 // algorithm 50 // 19 Jun. 2009, V.Ivanchenko : removed hidden bin 45 51 // -------------------------------------------------------------- 46 52 … … 52 58 G4PhysicsVector::G4PhysicsVector(G4bool spline) 53 59 : type(T_G4PhysicsVector), 54 edgeMin(0.), edgeMax(0.), numberOfBin(0), 55 lastEnergy(0.), lastValue(0.), lastBin(0), 56 secDerivative(0), useSpline(spline) 60 edgeMin(0.), edgeMax(0.), numberOfNodes(0), 61 lastEnergy(-1.0), lastValue(0.), lastBin(0), useSpline(spline) 57 62 {} 58 63 … … 60 65 61 66 G4PhysicsVector::~G4PhysicsVector() 62 { 63 DeleteData(); 64 } 67 {} 65 68 66 69 // -------------------------------------------------------------- … … 78 81 if (type != right.type) { return *this; } 79 82 80 DeleteData();83 //DeleteData(); 81 84 CopyData(right); 82 85 … … 102 105 void G4PhysicsVector::DeleteData() 103 106 { 104 delete [] secDerivative; 105 secDerivative = 0; 107 secDerivative.clear(); 106 108 } 107 109 … … 113 115 edgeMin = vec.edgeMin; 114 116 edgeMax = vec.edgeMax; 115 numberOf Bin = vec.numberOfBin;117 numberOfNodes = vec.numberOfNodes; 116 118 lastEnergy = vec.lastEnergy; 117 119 lastValue = vec.lastValue; … … 121 123 useSpline = vec.useSpline; 122 124 comment = vec.comment; 123 if (vec.secDerivative) 124 { 125 secDerivative = new G4double [numberOfBin]; 126 for (size_t i=0; i<numberOfBin; i++) 127 { 128 secDerivative[i] = vec.secDerivative[i]; 129 } 130 } 131 else 132 { 133 secDerivative = 0; 134 } 125 secDerivative = vec.secDerivative; 135 126 } 136 127 … … 157 148 fOut.write((char*)(&edgeMin), sizeof edgeMin); 158 149 fOut.write((char*)(&edgeMax), sizeof edgeMax); 159 fOut.write((char*)(&numberOf Bin), sizeof numberOfBin);150 fOut.write((char*)(&numberOfNodes), sizeof numberOfNodes); 160 151 161 152 // contents … … 164 155 165 156 G4double* value = new G4double[2*size]; 166 for(size_t i = 0; i < size; i++)157 for(size_t i = 0; i < size; ++i) 167 158 { 168 159 value[2*i] = binVector[i]; … … 180 171 { 181 172 // clear properties; 182 lastEnergy= 0.;173 lastEnergy=-1.0; 183 174 lastValue =0.; 184 175 lastBin =0; 185 176 dataVector.clear(); 186 177 binVector.clear(); 178 secDerivative.clear(); 187 179 comment = ""; 188 180 … … 191 183 { 192 184 // binning 193 fIn >> edgeMin >> edgeMax >> numberOf Bin;185 fIn >> edgeMin >> edgeMax >> numberOfNodes; 194 186 if (fIn.fail()) { return false; } 195 187 // contents … … 218 210 fIn.read((char*)(&edgeMin), sizeof edgeMin); 219 211 fIn.read((char*)(&edgeMax), sizeof edgeMax); 220 fIn.read((char*)(&numberOf Bin), sizeof numberOfBin);212 fIn.read((char*)(&numberOfNodes), sizeof numberOfNodes ); 221 213 222 214 // contents … … 234 226 binVector.reserve(size); 235 227 dataVector.reserve(size); 236 for(size_t i = 0; i < size; i++)228 for(size_t i = 0; i < size; ++i) 237 229 { 238 230 binVector.push_back(value[2*i]); … … 245 237 // -------------------------------------------------------------- 246 238 239 void 240 G4PhysicsVector::ScaleVector(G4double factorE, G4double factorV) 241 { 242 size_t n = dataVector.size(); 243 size_t i; 244 if(n > 0) { 245 for(i=0; i<n; ++i) { 246 binVector[i] *= factorE; 247 dataVector[i] *= factorV; 248 } 249 } 250 n = secDerivative.size(); 251 if(n > 0) { for(i=0; i<n; ++i) { secDerivative[i] *= factorV; } } 252 253 edgeMin *= factorE; 254 edgeMax *= factorE; 255 lastEnergy *= factorE; 256 lastValue *= factorV; 257 } 258 259 // -------------------------------------------------------------- 260 261 void 262 G4PhysicsVector::ComputeSecondDerivatives(G4double firstPointDerivative, 263 G4double endPointDerivative) 264 // A standard method of computation of second derivatives 265 // First derivatives at the first and the last point should be provided 266 // See for example W.H. Press et al. "Numerical reciptes and C" 267 // Cambridge University Press, 1997. 268 { 269 if(4 > numberOfNodes) // cannot compute derivatives for less than 4 bins 270 { 271 ComputeSecDerivatives(); 272 return; 273 } 274 275 if(!SplinePossible()) { return; } 276 277 G4int n = numberOfNodes-1; 278 279 G4double* u = new G4double [n]; 280 281 G4double p, sig, un; 282 283 u[0] = (6.0/(binVector[1]-binVector[0])) 284 * ((dataVector[1]-dataVector[0])/(binVector[1]-binVector[0]) 285 - firstPointDerivative); 286 287 secDerivative[0] = - 0.5; 288 289 // Decomposition loop for tridiagonal algorithm. secDerivative[i] 290 // and u[i] are used for temporary storage of the decomposed factors. 291 292 for(G4int i=1; i<n; ++i) 293 { 294 sig = (binVector[i]-binVector[i-1]) / (binVector[i+1]-binVector[i-1]); 295 p = sig*secDerivative[i-1] + 2.0; 296 secDerivative[i] = (sig - 1.0)/p; 297 u[i] = (dataVector[i+1]-dataVector[i])/(binVector[i+1]-binVector[i]) 298 - (dataVector[i]-dataVector[i-1])/(binVector[i]-binVector[i-1]); 299 u[i] = 6.0*u[i]/(binVector[i+1]-binVector[i-1]) - sig*u[i-1]/p; 300 } 301 302 sig = (binVector[n-1]-binVector[n-2]) / (binVector[n]-binVector[n-2]); 303 p = sig*secDerivative[n-2] + 2.0; 304 un = (6.0/(binVector[n]-binVector[n-1])) 305 *(endPointDerivative - 306 (dataVector[n]-dataVector[n-1])/(binVector[n]-binVector[n-1])) - u[n-1]/p; 307 secDerivative[n] = un/(secDerivative[n-1] + 2.0); 308 309 // The back-substitution loop for the triagonal algorithm of solving 310 // a linear system of equations. 311 312 for(G4int k=n-1; k>0; --k) 313 { 314 secDerivative[k] *= 315 (secDerivative[k+1] - 316 u[k]*(binVector[k+1]-binVector[k-1])/(binVector[k+1]-binVector[k])); 317 } 318 secDerivative[0] = 0.5*(u[0] - secDerivative[1]); 319 320 delete [] u; 321 } 322 323 // -------------------------------------------------------------- 324 247 325 void G4PhysicsVector::FillSecondDerivatives() 326 // Computation of second derivatives using "Not-a-knot" endpoint conditions 327 // B.I. Kvasov "Methods of shape-preserving spline approximation" 328 // World Scientific, 2000 248 329 { 249 secDerivative = new G4double [numberOfBin]; 250 251 size_t n = numberOfBin-1; 252 253 // cannot compute derivatives for less than 3 points 254 if(3 > numberOfBin) 255 { 256 secDerivative[0] = 0.0; 257 secDerivative[n] = 0.0; 330 if(5 > numberOfNodes) // cannot compute derivatives for less than 4 points 331 { 332 ComputeSecDerivatives(); 258 333 return; 259 334 } 260 335 261 for(size_t i=1; i<n; i++) 262 { 263 secDerivative[i] = 336 if(!SplinePossible()) { return; } 337 338 G4int n = numberOfNodes-1; 339 340 //G4cout << "G4PhysicsVector::FillSecondDerivatives() n= " << n << G4endl; 341 // G4cout << *this << G4endl; 342 343 G4double* u = new G4double [n]; 344 345 G4double p, sig; 346 347 u[1] = ((dataVector[2]-dataVector[1])/(binVector[2]-binVector[1]) - 348 (dataVector[1]-dataVector[0])/(binVector[1]-binVector[0])); 349 u[1] = 6.0*u[1]*(binVector[2]-binVector[1]) 350 / ((binVector[2]-binVector[0])*(binVector[2]-binVector[0])); 351 352 // Decomposition loop for tridiagonal algorithm. secDerivative[i] 353 // and u[i] are used for temporary storage of the decomposed factors. 354 355 secDerivative[1] = (2.0*binVector[1]-binVector[0]-binVector[2]) 356 / (2.0*binVector[2]-binVector[0]-binVector[1]); 357 358 for(G4int i=2; i<n-1; ++i) 359 { 360 sig = (binVector[i]-binVector[i-1]) / (binVector[i+1]-binVector[i-1]); 361 p = sig*secDerivative[i-1] + 2.0; 362 secDerivative[i] = (sig - 1.0)/p; 363 u[i] = (dataVector[i+1]-dataVector[i])/(binVector[i+1]-binVector[i]) 364 - (dataVector[i]-dataVector[i-1])/(binVector[i]-binVector[i-1]); 365 u[i] = (6.0*u[i]/(binVector[i+1]-binVector[i-1])) - sig*u[i-1]/p; 366 } 367 368 sig = (binVector[n-1]-binVector[n-2]) / (binVector[n]-binVector[n-2]); 369 p = sig*secDerivative[n-3] + 2.0; 370 u[n-1] = (dataVector[n]-dataVector[n-1])/(binVector[n]-binVector[n-1]) 371 - (dataVector[n-1]-dataVector[n-2])/(binVector[n-1]-binVector[n-2]); 372 u[n-1] = 6.0*sig*u[n-1]/(binVector[n]-binVector[n-2]) 373 - (2.0*sig - 1.0)*u[n-2]/p; 374 375 p = (1.0+sig) + (2.0*sig-1.0)*secDerivative[n-2]; 376 secDerivative[n-1] = u[n-1]/p; 377 378 // The back-substitution loop for the triagonal algorithm of solving 379 // a linear system of equations. 380 381 for(G4int k=n-2; k>1; --k) 382 { 383 secDerivative[k] *= 384 (secDerivative[k+1] - 385 u[k]*(binVector[k+1]-binVector[k-1])/(binVector[k+1]-binVector[k])); 386 } 387 secDerivative[n] = (secDerivative[n-1] - (1.0-sig)*secDerivative[n-2])/sig; 388 sig = 1.0 - ((binVector[2]-binVector[1])/(binVector[2]-binVector[0])); 389 secDerivative[1] *= (secDerivative[2] - u[1]/(1.0-sig)); 390 secDerivative[0] = (secDerivative[1] - sig*secDerivative[2])/(1.0-sig); 391 392 delete [] u; 393 } 394 395 // -------------------------------------------------------------- 396 397 void 398 G4PhysicsVector::ComputeSecDerivatives() 399 // A simplified method of computation of second derivatives 400 { 401 if(!SplinePossible()) { return; } 402 403 if(3 > numberOfNodes) // cannot compute derivatives for less than 4 bins 404 { 405 useSpline = false; 406 return; 407 } 408 409 size_t n = numberOfNodes-1; 410 411 for(size_t i=1; i<n; ++i) 412 { 413 secDerivative[i] = 264 414 3.0*((dataVector[i+1]-dataVector[i])/(binVector[i+1]-binVector[i]) - 265 415 (dataVector[i]-dataVector[i-1])/(binVector[i]-binVector[i-1])) … … 269 419 secDerivative[0] = secDerivative[1]; 270 420 } 421 422 // -------------------------------------------------------------- 423 424 G4bool G4PhysicsVector::SplinePossible() 425 // Initialise second derivative array. If neighbor energy coincide 426 // or not ordered than spline cannot be applied 427 { 428 if(!useSpline) return useSpline; 429 secDerivative.clear(); 430 secDerivative.reserve(numberOfNodes); 431 for(size_t j=0; j<numberOfNodes; ++j) 432 { 433 secDerivative.push_back(0.0); 434 if(j > 0) 435 { 436 if(binVector[j]-binVector[j-1] <= 0.) { useSpline = false; } 437 } 438 } 439 return useSpline; 440 } 271 441 272 442 // -------------------------------------------------------------- … … 276 446 // binning 277 447 out << std::setprecision(12) << pv.edgeMin; 278 out <<" " << pv.edgeMax <<" " << pv.numberOf Bin<< G4endl;448 out <<" " << pv.edgeMax <<" " << pv.numberOfNodes << G4endl; 279 449 280 450 // contents
Note: See TracChangeset
for help on using the changeset viewer.