Ignore:
Timestamp:
Feb 16, 2009, 10:14:30 AM (15 years ago)
Author:
garnier
Message:

en test de gl2ps. Problemes de libraries

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/global/management/src/G4PhysicsVector.cc

    r850 r921  
    2525//
    2626//
    27 // $Id: G4PhysicsVector.cc,v 1.22 2008/09/05 18:04:45 vnivanch Exp $
    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 $
    2929//
    3030//
     
    5252G4PhysicsVector::G4PhysicsVector(G4bool spline)
    5353 : type(T_G4PhysicsVector),
    54    edgeMin(DBL_MAX), edgeMax(0.), numberOfBin(0),
     54   edgeMin(0.), edgeMax(0.), numberOfBin(0),
    5555   lastEnergy(0.), lastValue(0.), lastBin(0),
    5656   secDerivative(0), useSpline(spline)
    57 {
    58   binVector.push_back(edgeMin);
    59   dataVector.push_back(0.0);
    60 }
     57{}
    6158
    6259// --------------------------------------------------------------
     
    6461G4PhysicsVector::~G4PhysicsVector()
    6562{
    66   delete [] secDerivative;
     63  DeleteData();
    6764}
    6865
     
    7168G4PhysicsVector::G4PhysicsVector(const G4PhysicsVector& right)
    7269{
    73   *this=right;
     70  CopyData(right);
    7471}
    7572
     
    8178  if (type != right.type)  { return *this; }
    8279
    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
    9583  return *this;
    9684}
     
    10896{
    10997  return (this != &right);
     98}
     99
     100// --------------------------------------------------------------
     101
     102void G4PhysicsVector::DeleteData()
     103{
     104  delete [] secDerivative;
     105  secDerivative = 0;
     106}
     107
     108// --------------------------------------------------------------
     109
     110void 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  }
    110135}
    111136
     
    224249  secDerivative = new G4double [numberOfBin];
    225250
    226   secDerivative[0] = 0.0 ;
     251  size_t n = numberOfBin-1;
    227252
    228253  // 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;
    231258    return;
    232259  }
    233260
    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];
    265270}
    266271   
Note: See TracChangeset for help on using the changeset viewer.