Changeset 921 for trunk/source/global/management/src/G4PhysicsVector.cc
- Timestamp:
- Feb 16, 2009, 10:14:30 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/global/management/src/G4PhysicsVector.cc
r850 r921 25 25 // 26 26 // 27 // $Id: G4PhysicsVector.cc,v 1.2 2 2008/09/05 18:04:45 vnivanchExp $28 // GEANT4 tag $Name: HEAD$27 // $Id: G4PhysicsVector.cc,v 1.27 2008/10/16 12:14:36 gcosmo Exp $ 28 // GEANT4 tag $Name: geant4-09-02-cand-01 $ 29 29 // 30 30 // … … 52 52 G4PhysicsVector::G4PhysicsVector(G4bool spline) 53 53 : type(T_G4PhysicsVector), 54 edgeMin( DBL_MAX), edgeMax(0.), numberOfBin(0),54 edgeMin(0.), edgeMax(0.), numberOfBin(0), 55 55 lastEnergy(0.), lastValue(0.), lastBin(0), 56 56 secDerivative(0), useSpline(spline) 57 { 58 binVector.push_back(edgeMin); 59 dataVector.push_back(0.0); 60 } 57 {} 61 58 62 59 // -------------------------------------------------------------- … … 64 61 G4PhysicsVector::~G4PhysicsVector() 65 62 { 66 delete [] secDerivative;63 DeleteData(); 67 64 } 68 65 … … 71 68 G4PhysicsVector::G4PhysicsVector(const G4PhysicsVector& right) 72 69 { 73 *this=right;70 CopyData(right); 74 71 } 75 72 … … 81 78 if (type != right.type) { return *this; } 82 79 83 type = right.type; 84 edgeMin = right.edgeMin; 85 edgeMax = right.edgeMax; 86 numberOfBin = right.numberOfBin; 87 lastEnergy = right.lastEnergy; 88 lastValue = right.lastValue; 89 lastBin = right.lastBin; 90 dataVector = right.dataVector; 91 binVector = right.binVector; 92 secDerivative = right.secDerivative; 93 useSpline = right.useSpline; 94 comment = right.comment; 80 DeleteData(); 81 CopyData(right); 82 95 83 return *this; 96 84 } … … 108 96 { 109 97 return (this != &right); 98 } 99 100 // -------------------------------------------------------------- 101 102 void G4PhysicsVector::DeleteData() 103 { 104 delete [] secDerivative; 105 secDerivative = 0; 106 } 107 108 // -------------------------------------------------------------- 109 110 void G4PhysicsVector::CopyData(const G4PhysicsVector& vec) 111 { 112 type = vec.type; 113 edgeMin = vec.edgeMin; 114 edgeMax = vec.edgeMax; 115 numberOfBin = vec.numberOfBin; 116 lastEnergy = vec.lastEnergy; 117 lastValue = vec.lastValue; 118 lastBin = vec.lastBin; 119 dataVector = vec.dataVector; 120 binVector = vec.binVector; 121 useSpline = vec.useSpline; 122 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 } 110 135 } 111 136 … … 224 249 secDerivative = new G4double [numberOfBin]; 225 250 226 s ecDerivative[0] = 0.0;251 size_t n = numberOfBin-1; 227 252 228 253 // cannot compute derivatives for less than 3 points 229 if(3 > numberOfBin) { 230 secDerivative[numberOfBin-1] = 0.0 ; 254 if(3 > numberOfBin) 255 { 256 secDerivative[0] = 0.0; 257 secDerivative[n] = 0.0; 231 258 return; 232 259 } 233 260 234 G4double* u = new G4double [numberOfBin]; 235 u[0] = 0.0 ; 236 237 // Decomposition loop for tridiagonal algorithm. secDerivative[i] 238 // and u[i] are used for temporary storage of the decomposed factors. 239 240 for(size_t i=1; i<numberOfBin-1; i++) 241 { 242 G4double sig = (binVector[i]-binVector[i-1]) 243 / (binVector[i+1]-binVector[i-1]) ; 244 G4double p = sig*secDerivative[i-1] + 2.0 ; 245 secDerivative[i] = (sig - 1.0)/p ; 246 u[i] = (dataVector[i+1]-dataVector[i])/(binVector[i+1]-binVector[i]) 247 - (dataVector[i]-dataVector[i-1])/(binVector[i]-binVector[i-1]) ; 248 u[i] =(6.0*u[i]/(binVector[i+1]-binVector[i-1]) - sig*u[i-1])/p ; 249 } 250 251 G4double qn = 0.0 ; 252 G4double un = 0.0 ; 253 254 secDerivative[numberOfBin-1] = (un - qn*u[numberOfBin-2]) 255 / (qn*secDerivative[numberOfBin-2] + 1.0) ; 256 257 // The back-substitution loop for the triagonal algorithm of solving 258 // a linear system of equations. 259 260 for(G4int k=numberOfBin-2; k>=0; k--) 261 { 262 secDerivative[k] = secDerivative[k]*secDerivative[k+1] + u[k]; 263 } 264 delete [] u; 261 for(size_t i=1; i<n; i++) 262 { 263 secDerivative[i] = 264 3.0*((dataVector[i+1]-dataVector[i])/(binVector[i+1]-binVector[i]) - 265 (dataVector[i]-dataVector[i-1])/(binVector[i]-binVector[i-1])) 266 /(binVector[i+1]-binVector[i-1]); 267 } 268 secDerivative[n] = secDerivative[n-1]; 269 secDerivative[0] = secDerivative[1]; 265 270 } 266 271
Note: See TracChangeset
for help on using the changeset viewer.