Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4PhysicsVector class implementation << 27 // 26 // 28 // Authors: << 27 // $Id: G4PhysicsVector.cc,v 1.27 2008/10/16 12:14:36 gcosmo Exp $ 29 // - 02 Dec. 1995, G.Cosmo: Structure created << 28 // GEANT4 tag $Name: geant4-09-02 $ 30 // - 03 Mar. 1996, K.Amako: Implemented the 1s << 29 // 31 // Revisions: << 30 // 32 // - 11 Nov. 2000, H.Kurashige: Use STL vector << 31 // -------------------------------------------------------------- 33 // ------------------------------------------- << 32 // GEANT 4 class implementation file >> 33 // >> 34 // G4PhysicsVector.cc >> 35 // >> 36 // History: >> 37 // 02 Dec. 1995, G.Cosmo : Structure created based on object model >> 38 // 03 Mar. 1996, K.Amako : Implemented the 1st version >> 39 // 01 Jul. 1996, K.Amako : Hidden bin from the user introduced >> 40 // 12 Nov. 1998, K.Amako : A bug in GetVectorLength() fixed >> 41 // 11 Nov. 2000, H.Kurashige : use STL vector for dataVector and binVector >> 42 // 18 Jan. 2001, H.Kurashige : removed ptrNextTable >> 43 // 09 Mar. 2001, H.Kurashige : added G4PhysicsVector type >> 44 // 05 Sep. 2008, V.Ivanchenko : added protections for zero-length vector >> 45 // -------------------------------------------------------------- 34 46 35 #include "G4PhysicsVector.hh" 47 #include "G4PhysicsVector.hh" 36 #include <iomanip> 48 #include <iomanip> 37 49 38 // ------------------------------------------- 50 // -------------------------------------------------------------- 39 G4PhysicsVector::G4PhysicsVector(G4bool val) << 51 40 : useSpline(val) << 52 G4PhysicsVector::G4PhysicsVector(G4bool spline) >> 53 : type(T_G4PhysicsVector), >> 54 edgeMin(0.), edgeMax(0.), numberOfBin(0), >> 55 lastEnergy(0.), lastValue(0.), lastBin(0), >> 56 secDerivative(0), useSpline(spline) 41 {} 57 {} 42 58 43 // ------------------------------------------- << 59 // -------------------------------------------------------------- 44 void G4PhysicsVector::Initialise() << 60 >> 61 G4PhysicsVector::~G4PhysicsVector() >> 62 { >> 63 DeleteData(); >> 64 } >> 65 >> 66 // -------------------------------------------------------------- >> 67 >> 68 G4PhysicsVector::G4PhysicsVector(const G4PhysicsVector& right) >> 69 { >> 70 CopyData(right); >> 71 } >> 72 >> 73 // -------------------------------------------------------------- >> 74 >> 75 G4PhysicsVector& G4PhysicsVector::operator=(const G4PhysicsVector& right) 45 { 76 { 46 if (1 < numberOfNodes) << 77 if (&right==this) { return *this; } >> 78 if (type != right.type) { return *this; } >> 79 >> 80 DeleteData(); >> 81 CopyData(right); >> 82 >> 83 return *this; >> 84 } >> 85 >> 86 // -------------------------------------------------------------- >> 87 >> 88 G4int G4PhysicsVector::operator==(const G4PhysicsVector &right) const >> 89 { >> 90 return (this == &right); >> 91 } >> 92 >> 93 // -------------------------------------------------------------- >> 94 >> 95 G4int G4PhysicsVector::operator!=(const G4PhysicsVector &right) const >> 96 { >> 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) 47 { 124 { 48 idxmax = numberOfNodes - 2; << 125 secDerivative = new G4double [numberOfBin]; 49 edgeMin = binVector[0]; << 126 for (size_t i=0; i<numberOfBin; i++) 50 edgeMax = binVector[idxmax + 1]; << 127 { >> 128 secDerivative[i] = vec.secDerivative[i]; >> 129 } >> 130 } >> 131 else >> 132 { >> 133 secDerivative = 0; 51 } 134 } 52 } 135 } 53 136 54 // ------------------------------------------- 137 // -------------------------------------------------------------- 55 G4bool G4PhysicsVector::Store(std::ofstream& f << 138 >> 139 G4double G4PhysicsVector::GetLowEdgeEnergy(size_t binNumber) const >> 140 { >> 141 return binVector[binNumber]; >> 142 } >> 143 >> 144 // -------------------------------------------------------------- >> 145 >> 146 G4bool G4PhysicsVector::Store(std::ofstream& fOut, G4bool ascii) 56 { 147 { 57 // Ascii mode 148 // Ascii mode 58 if (ascii) 149 if (ascii) 59 { 150 { 60 fOut << *this; 151 fOut << *this; 61 return true; 152 return true; 62 } << 153 } 63 // Binary Mode 154 // Binary Mode 64 155 65 // binning 156 // binning 66 fOut.write((char*) (&edgeMin), sizeof edgeMi << 157 fOut.write((char*)(&edgeMin), sizeof edgeMin); 67 fOut.write((char*) (&edgeMax), sizeof edgeMa << 158 fOut.write((char*)(&edgeMax), sizeof edgeMax); 68 fOut.write((char*) (&numberOfNodes), sizeof << 159 fOut.write((char*)(&numberOfBin), sizeof numberOfBin); 69 160 70 // contents 161 // contents 71 std::size_t size = dataVector.size(); << 162 size_t size = dataVector.size(); 72 fOut.write((char*) (&size), sizeof size); << 163 fOut.write((char*)(&size), sizeof size); 73 164 74 auto value = new G4double[2 * size]; << 165 G4double* value = new G4double[2*size]; 75 for (std::size_t i = 0; i < size; ++i) << 166 for(size_t i = 0; i < size; i++) 76 { 167 { 77 value[2 * i] = binVector[i]; << 168 value[2*i] = binVector[i]; 78 value[2 * i + 1] = dataVector[i]; << 169 value[2*i+1]= dataVector[i]; 79 } 170 } 80 fOut.write((char*) (value), 2 * size * (size << 171 fOut.write((char*)(value), 2*size*(sizeof (G4double))); 81 delete[] value; << 172 delete [] value; 82 173 83 return true; 174 return true; 84 } 175 } 85 176 86 // ------------------------------------------- 177 // -------------------------------------------------------------- >> 178 87 G4bool G4PhysicsVector::Retrieve(std::ifstream 179 G4bool G4PhysicsVector::Retrieve(std::ifstream& fIn, G4bool ascii) 88 { 180 { 89 // clear properties; 181 // clear properties; >> 182 lastEnergy=0.; >> 183 lastValue =0.; >> 184 lastBin =0; 90 dataVector.clear(); 185 dataVector.clear(); 91 binVector.clear(); 186 binVector.clear(); 92 secDerivative.clear(); << 187 comment = ""; 93 188 94 // retrieve in ascii mode 189 // retrieve in ascii mode 95 if (ascii) 190 if (ascii) 96 { 191 { 97 // binning 192 // binning 98 fIn >> edgeMin >> edgeMax >> numberOfNodes << 193 fIn >> edgeMin >> edgeMax >> numberOfBin; 99 if (fIn.fail() || numberOfNodes < 2) << 194 if (fIn.fail()) { return false; } 100 { << 101 return false; << 102 } << 103 // contents 195 // contents 104 G4int siz0 = 0; << 196 size_t size=0; 105 fIn >> siz0; << 197 fIn >> size; 106 if (siz0 < 2) { return false; } << 198 if (fIn.fail()) { return false; } 107 auto siz = static_cast<std::size_t>(siz0); << 108 if (fIn.fail() || siz != numberOfNodes) << 109 { << 110 return false; << 111 } << 112 199 113 binVector.reserve(siz); << 200 binVector.reserve(size); 114 dataVector.reserve(siz); << 201 dataVector.reserve(size); 115 G4double vBin, vData; 202 G4double vBin, vData; 116 203 117 for (std::size_t i = 0; i < siz; ++i) << 204 for(size_t i = 0; i < size ; i++) 118 { 205 { 119 vBin = 0.; << 206 vBin = 0.; 120 vData = 0.; << 207 vData= 0.; 121 fIn >> vBin >> vData; 208 fIn >> vBin >> vData; 122 if (fIn.fail()) << 209 if (fIn.fail()) { return false; } 123 { << 124 return false; << 125 } << 126 binVector.push_back(vBin); 210 binVector.push_back(vBin); 127 dataVector.push_back(vData); 211 dataVector.push_back(vData); 128 } 212 } 129 Initialise(); << 213 return true ; 130 return true; << 131 } 214 } 132 215 133 // retrieve in binary mode 216 // retrieve in binary mode 134 // binning 217 // binning 135 fIn.read((char*) (&edgeMin), sizeof edgeMin) << 218 fIn.read((char*)(&edgeMin), sizeof edgeMin); 136 fIn.read((char*) (&edgeMax), sizeof edgeMax) << 219 fIn.read((char*)(&edgeMax), sizeof edgeMax); 137 fIn.read((char*) (&numberOfNodes), sizeof nu << 220 fIn.read((char*)(&numberOfBin), sizeof numberOfBin ); 138 << 221 139 // contents 222 // contents 140 std::size_t size; << 223 size_t size; 141 fIn.read((char*) (&size), sizeof size); << 224 fIn.read((char*)(&size), sizeof size); 142 << 225 143 auto value = new G4double[2 * size]; << 226 G4double* value = new G4double[2*size]; 144 fIn.read((char*) (value), 2 * size * (sizeof << 227 fIn.read((char*)(value), 2*size*(sizeof(G4double)) ); 145 if (static_cast<G4int>(fIn.gcount()) != stat << 228 if (G4int(fIn.gcount()) != G4int(2*size*(sizeof(G4double))) ) 146 { 229 { 147 delete[] value; << 230 delete [] value; 148 return false; 231 return false; 149 } 232 } 150 233 151 binVector.reserve(size); 234 binVector.reserve(size); 152 dataVector.reserve(size); 235 dataVector.reserve(size); 153 for (std::size_t i = 0; i < size; ++i) << 236 for(size_t i = 0; i < size; i++) 154 { 237 { 155 binVector.push_back(value[2 * i]); << 238 binVector.push_back(value[2*i]); 156 dataVector.push_back(value[2 * i + 1]); << 239 dataVector.push_back(value[2*i+1]); 157 } 240 } 158 delete[] value; << 241 delete [] value; 159 << 160 Initialise(); << 161 return true; 242 return true; 162 } 243 } 163 244 164 // ------------------------------------------- 245 // -------------------------------------------------------------- 165 void G4PhysicsVector::DumpValues(G4double unit << 166 { << 167 for (std::size_t i = 0; i < numberOfNodes; + << 168 { << 169 G4cout << binVector[i] / unitE << " " << << 170 << G4endl; << 171 } << 172 } << 173 246 174 // ------------------------------------------- << 247 void G4PhysicsVector::FillSecondDerivatives() 175 std::size_t G4PhysicsVector::FindBin(const G4d << 248 { 176 std::size << 249 secDerivative = new G4double [numberOfBin]; 177 { << 178 if (idx + 1 < numberOfNodes && << 179 energy >= binVector[idx] && energy <= bi << 180 { << 181 return idx; << 182 } << 183 if (energy <= binVector[1]) << 184 { << 185 return 0; << 186 } << 187 if (energy >= binVector[idxmax]) << 188 { << 189 return idxmax; << 190 } << 191 return GetBin(energy); << 192 } << 193 250 194 // ------------------------------------------- << 251 size_t n = numberOfBin-1; 195 void G4PhysicsVector::ScaleVector(const G4doub << 196 const G4doub << 197 { << 198 for (std::size_t i = 0; i < numberOfNodes; + << 199 { << 200 binVector[i] *= factorE; << 201 dataVector[i] *= factorV; << 202 } << 203 Initialise(); << 204 } << 205 252 206 // ------------------------------------------- << 253 // cannot compute derivatives for less than 3 points 207 void G4PhysicsVector::FillSecondDerivatives(co << 254 if(3 > numberOfBin) 208 const G4double dir1, << 209 const G4double dir2) << 210 { << 211 if (!useSpline) { return; } << 212 // cannot compute derivatives for less than << 213 const std::size_t nmin = (stype == G4SplineT << 214 if (nmin > numberOfNodes) << 215 { 255 { 216 if (0 < verboseLevel) << 256 secDerivative[0] = 0.0; 217 { << 257 secDerivative[n] = 0.0; 218 G4cout << "### G4PhysicsVector: spline c << 219 << numberOfNodes << " points - spline d << 220 << G4endl; << 221 DumpValues(); << 222 } << 223 useSpline = false; << 224 return; 258 return; 225 } 259 } 226 // check energies of free vector << 227 if (type == T_G4PhysicsFreeVector) << 228 { << 229 for (std::size_t i=0; i<=idxmax; ++i) << 230 { << 231 if (binVector[i + 1] <= binVector[i]) << 232 { << 233 if (0 < verboseLevel) << 234 { << 235 G4cout << "### G4PhysicsVector: spline can << 236 << " E[" << i << "]=" << binVector[i] << 237 << " >= E[" << i+1 << "]=" << binVector[i << 238 << G4endl; << 239 DumpValues(); << 240 } << 241 useSpline = false; << 242 return; << 243 } << 244 } << 245 } << 246 << 247 // spline is possible << 248 Initialise(); << 249 secDerivative.resize(numberOfNodes); << 250 260 251 if (1 < verboseLevel) << 261 for(size_t i=1; i<n; i++) 252 { 262 { 253 G4cout << "### G4PhysicsVector:: FillSecon << 263 secDerivative[i] = 254 << numberOfNodes << G4endl; << 264 3.0*((dataVector[i+1]-dataVector[i])/(binVector[i+1]-binVector[i]) - 255 DumpValues(); << 265 (dataVector[i]-dataVector[i-1])/(binVector[i]-binVector[i-1])) >> 266 /(binVector[i+1]-binVector[i-1]); 256 } 267 } 257 << 268 secDerivative[n] = secDerivative[n-1]; 258 switch(stype) << 259 { << 260 case G4SplineType::Base: << 261 ComputeSecDerivative1(); << 262 break; << 263 << 264 case G4SplineType::FixedEdges: << 265 ComputeSecDerivative2(dir1, dir2); << 266 break; << 267 << 268 default: << 269 ComputeSecDerivative0(); << 270 } << 271 } << 272 << 273 // ------------------------------------------- << 274 void G4PhysicsVector::ComputeSecDerivative0() << 275 // A simplified method of computation of seco << 276 { << 277 std::size_t n = numberOfNodes - 1; << 278 << 279 for (std::size_t i = 1; i < n; ++i) << 280 { << 281 secDerivative[i] = 3.0 * << 282 ((dataVector[i + 1] - dataVector[i]) / ( << 283 (dataVector[i] - dataVector[i - 1]) / << 284 (binVector[i] - binVector[i - 1])) / << 285 (binVector[i + 1] - binVector[i - 1]); << 286 } << 287 secDerivative[n] = secDerivative[n - 1]; << 288 secDerivative[0] = secDerivative[1]; 269 secDerivative[0] = secDerivative[1]; 289 } 270 } 290 << 271 291 // ------------------------------------------- << 292 void G4PhysicsVector::ComputeSecDerivative1() << 293 // Computation of second derivatives using "No << 294 // B.I. Kvasov "Methods of shape-preserving sp << 295 // World Scientific, 2000 << 296 { << 297 std::size_t n = numberOfNodes - 1; << 298 auto u = new G4double[n]; << 299 G4double p, sig; << 300 << 301 u[1] = ((dataVector[2] - dataVector[1]) / (b << 302 (dataVector[1] - dataVector[0]) / (b << 303 u[1] = 6.0 * u[1] * (binVector[2] - binVecto << 304 ((binVector[2] - binVector[0]) * (bin << 305 << 306 // Decomposition loop for tridiagonal algori << 307 // and u[i] are used for temporary storage o << 308 << 309 secDerivative[1] = (2.0 * binVector[1] - bin << 310 (2.0 * binVector[2] - bin << 311 << 312 for(std::size_t i = 2; i < n - 1; ++i) << 313 { << 314 sig = << 315 (binVector[i] - binVector[i - 1]) / (bin << 316 p = sig * secDerivative[i - << 317 secDerivative[i] = (sig - 1.0) / p; << 318 u[i] = << 319 (dataVector[i + 1] - dataVector[i]) / (b << 320 (dataVector[i] - dataVector[i - 1]) / (b << 321 u[i] = << 322 (6.0 * u[i] / (binVector[i + 1] - binVec << 323 } << 324 << 325 sig = << 326 (binVector[n - 1] - binVector[n - 2]) / (b << 327 p = sig * secDerivative[n - 3] + 2.0; << 328 u[n - 1] = << 329 (dataVector[n] - dataVector[n - 1]) / (bin << 330 (dataVector[n - 1] - dataVector[n - 2]) / << 331 (binVector[n - 1] - binVector[n - 2]); << 332 u[n - 1] = 6.0 * sig * u[n - 1] / (binVector << 333 (2.0 * sig - 1.0) * u[n - 2] / p; << 334 << 335 p = (1.0 + sig) + (2.0 * sig - 1.0) * secDer << 336 secDerivative[n - 1] = u[n - 1] / p; << 337 << 338 // The back-substitution loop for the triago << 339 // a linear system of equations. << 340 << 341 for (std::size_t k = n - 2; k > 1; --k) << 342 { << 343 secDerivative[k] *= << 344 (secDerivative[k + 1] - u[k] * (binVecto << 345 (binVector[k + << 346 } << 347 secDerivative[n] = << 348 (secDerivative[n - 1] - (1.0 - sig) * secD << 349 sig = 1.0 - ((binVector[2] - binVector[1]) / << 350 secDerivative[1] *= (secDerivative[2] - u[1] << 351 secDerivative[0] = (secDerivative[1] - sig * << 352 << 353 delete[] u; << 354 } << 355 << 356 // ------------------------------------------- 272 // -------------------------------------------------------------- 357 void G4PhysicsVector::ComputeSecDerivative2(G4 << 358 G4 << 359 // A standard method of computation of second << 360 // First derivatives at the first and the last << 361 // See for example W.H. Press et al. "Numerica << 362 // Cambridge University Press, 1997. << 363 { << 364 std::size_t n = numberOfNodes - 1; << 365 auto u = new G4double[n]; << 366 G4double p, sig, un; << 367 << 368 u[0] = (6.0 / (binVector[1] - binVector[0])) << 369 ((dataVector[1] - dataVector[0]) / (b << 370 firstPointDerivative); << 371 << 372 secDerivative[0] = -0.5; << 373 << 374 // Decomposition loop for tridiagonal algori << 375 // and u[i] are used for temporary storage o << 376 << 377 for (std::size_t i = 1; i < n; ++i) << 378 { << 379 sig = << 380 (binVector[i] - binVector[i - 1]) / (bin << 381 p = sig * (secDerivative[i << 382 secDerivative[i] = (sig - 1.0) / p; << 383 u[i] = << 384 (dataVector[i + 1] - dataVector[i]) / (b << 385 (dataVector[i] - dataVector[i - 1]) / (b << 386 u[i] = << 387 6.0 * u[i] / (binVector[i + 1] - binVect << 388 } << 389 << 390 sig = << 391 (binVector[n - 1] - binVector[n - 2]) / (b << 392 p = sig * secDerivative[n - 2] + 2.0; << 393 un = (6.0 / (binVector[n] - binVector[n - 1] << 394 (endPointDerivative - (dataVector[n] << 395 (binVector[n] << 396 u[n - 1] / p; << 397 secDerivative[n] = un / (secDerivative[n - 1 << 398 << 399 // The back-substitution loop for the triago << 400 // a linear system of equations. << 401 << 402 for (std::size_t k = n - 1; k > 0; --k) << 403 { << 404 secDerivative[k] *= << 405 (secDerivative[k + 1] - u[k] * (binVecto << 406 (binVector[k + << 407 } << 408 secDerivative[0] = 0.5 * (u[0] - secDerivati << 409 << 410 delete[] u; << 411 } << 412 273 413 // ------------------------------------------- << 414 std::ostream& operator<<(std::ostream& out, co 274 std::ostream& operator<<(std::ostream& out, const G4PhysicsVector& pv) 415 { 275 { 416 // binning 276 // binning 417 G4long prec = out.precision(); << 277 out << std::setprecision(12) << pv.edgeMin; 418 out << std::setprecision(12) << pv.edgeMin < << 278 out <<" " << pv.edgeMax <<" " << pv.numberOfBin << G4endl; 419 << pv.numberOfNodes << G4endl; << 420 279 421 // contents 280 // contents 422 out << pv.dataVector.size() << G4endl; << 281 out << pv.dataVector.size() << G4endl; 423 for (std::size_t i = 0; i < pv.dataVector.si << 282 for(size_t i = 0; i < pv.dataVector.size(); i++) 424 { 283 { 425 out << pv.binVector[i] << " " << pv.dataV << 284 out << std::setprecision(12) << pv.binVector[i] << " " >> 285 << pv.dataVector[i] << G4endl; 426 } 286 } 427 out.precision(prec); << 428 << 429 return out; 287 return out; 430 } 288 } 431 << 432 //-------------------------------------------- << 433 G4double G4PhysicsVector::GetEnergy(const G4do << 434 { << 435 if (0 == numberOfNodes) << 436 { << 437 return 0.0; << 438 } << 439 if (1 == numberOfNodes || val <= dataVector[ << 440 { << 441 return edgeMin; << 442 } << 443 if (val >= dataVector[numberOfNodes - 1]) << 444 { << 445 return edgeMax; << 446 } << 447 std::size_t bin = std::lower_bound(dataVecto << 448 - dataVector.cbegin() - 1; << 449 if (bin > idxmax) { bin = idxmax; } << 450 G4double res = binVector[bin]; << 451 G4double del = dataVector[bin + 1] - dataVec << 452 if (del > 0.0) << 453 { << 454 res += (val - dataVector[bin]) * (binVecto << 455 } << 456 return res; << 457 } << 458 << 459 //-------------------------------------------- << 460 void G4PhysicsVector::PrintPutValueError(std:: << 461 G4dou << 462 const << 463 { << 464 G4ExceptionDescription ed; << 465 ed << "Vector type: " << type << " length= " << 466 << "; an attempt to put data at index= " << 467 << " value= " << val << " in " << text; << 468 G4Exception("G4PhysicsVector:", "gl0005", << 469 FatalException, ed, "Wrong opera << 470 } << 471 << 472 //-------------------------------------------- << 473 289