Print

Print


Commit in lcdd on MAIN
include/G4RZB.hh+5-51.1 -> 1.2
       /G4RZFieldMap.hh+13-21.1 -> 1.2
src/G4RZFieldMap.cc+56-61.1 -> 1.2
   /rz_field_mapSubscriber.cc+4-11.1 -> 1.2
+78-14
4 modified files
G4RZFieldMap creates a 2D array and clears object array.

lcdd/include
G4RZB.hh 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- G4RZB.hh	29 Aug 2005 23:23:18 -0000	1.1
+++ G4RZB.hh	30 Aug 2005 21:22:07 -0000	1.2
@@ -1,4 +1,4 @@
-// $Header: /cvs/lcd/lcdd/include/G4RZB.hh,v 1.1 2005/08/29 23:23:18 jeremy Exp $
+// $Header: /cvs/lcd/lcdd/include/G4RZB.hh,v 1.2 2005/08/30 21:22:07 jeremy Exp $
 #ifndef G4RZB_hh
 #define G4RZB_hh 1
 
@@ -29,22 +29,22 @@
 
 public:
 
-  double r()
+  double r() const
   {
     return _r;
   }
 
-  double z()
+  double z() const
   {
     return _z;
   }
 
-  double Br()
+  double Br() const
   {
     return _Br;
   }
 
-  double Bz()
+  double Bz() const
   {
     return _Bz;
   }

lcdd/include
G4RZFieldMap.hh 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- G4RZFieldMap.hh	29 Aug 2005 23:23:18 -0000	1.1
+++ G4RZFieldMap.hh	30 Aug 2005 21:22:07 -0000	1.2
@@ -1,4 +1,4 @@
-// $Header: /cvs/lcd/lcdd/include/G4RZFieldMap.hh,v 1.1 2005/08/29 23:23:18 jeremy Exp $
+// $Header: /cvs/lcd/lcdd/include/G4RZFieldMap.hh,v 1.2 2005/08/30 21:22:07 jeremy Exp $
 
 #ifndef G4RZFieldMap_hh
 #define G4RZFieldMap_hh 1
@@ -28,10 +28,21 @@
 
   void GetFieldValue( const double Point[3], double *Bfield ) const;
   void addRZB(double r, double z, double Br, double Bz);
-  const RowsType& getRows() const;
+
+  /*
+   * Call once all RZB rows are added to make an array of r, z, Br, Bz.
+   * This should be much more performant than the vector of G4RZB objects.
+   * @param clearRows Set to true in order to clear the G4RZB object vector. (Default is true.)
+   */
+  void makeArray(bool clearRows = true);
 
 private:
+
   RowsType rows;
+
+  size_t arraySize;
+  double** array;
+  bool madeArray;
 };
 
 #endif

lcdd/src
G4RZFieldMap.cc 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- G4RZFieldMap.cc	29 Aug 2005 23:23:19 -0000	1.1
+++ G4RZFieldMap.cc	30 Aug 2005 21:22:07 -0000	1.2
@@ -1,13 +1,27 @@
-// $Header: /cvs/lcd/lcdd/src/G4RZFieldMap.cc,v 1.1 2005/08/29 23:23:19 jeremy Exp $
+// $Header: /cvs/lcd/lcdd/src/G4RZFieldMap.cc,v 1.2 2005/08/30 21:22:07 jeremy Exp $
 #include "G4RZFieldMap.hh"
 
 G4RZFieldMap::G4RZFieldMap()
+  : arraySize(0),
+    array(0),
+    madeArray(false)
 {}
 
 G4RZFieldMap::~G4RZFieldMap()
-{}
+{
+  /* delete the array */
+  if ( madeArray ) {
+    for (size_t i=0; i<arraySize; i++) {
+      delete[] array[i];
+    }
+    delete[] array;
+  }
+}
 
-/* FIXME: Needs implementation! (see Takashi's FORTRAN code) */
+/*
+ *  FIXME: Needs implementation!
+ *  See Takashi's FORTRAN code at /afs/slac/www/accel/nlc/local/systems/beamdelivery/geant/SDNEW/solenoid.f
+ */
 void G4RZFieldMap::GetFieldValue( const double Point[3], double *Bfield ) const
 {
   /* make compiler happy */
@@ -18,10 +32,46 @@
 void G4RZFieldMap::addRZB(double r, double z, double Br, double Bz)
 {
   //  std::cout << "adding --> r z Br Bz = " << r << " " << z << " " << Br << " " << Bz << std::endl;
-  rows.push_back(G4RZB(r, z, Br, Bz));
+  if ( !madeArray ) {
+    rows.push_back(G4RZB(r, z, Br, Bz));
+  }
+  else {
+    std::cerr << "ERROR: Additional rows not allowed once G4RZFieldMap::makeArray() has been called." << std::endl;
+  }
 }
 
-const G4RZFieldMap::RowsType& G4RZFieldMap::getRows() const
+void G4RZFieldMap::makeArray(bool clearRows)
 {
-  return rows;
+  if ( !madeArray ) {
+
+    /* allocate array of [arraySize][4] */
+    arraySize = rows.size();
+    array = new double*[arraySize];
+
+    for (size_t i=0; i<arraySize; i++) {
+      array[i] = new double[4];
+    }
+
+    /* fill array with values from object vector */
+    int cntr = 0;
+    for ( RowsType::const_iterator iter = rows.begin();
+	  iter != rows.end();
+	  iter++ ) {
+      array[cntr][0] = (*iter).r();
+      array[cntr][1] = (*iter).z();
+      array[cntr][2] = (*iter).Br();
+      array[cntr][3] = (*iter).Bz();
+      ++cntr;
+    }
+
+    /* clear object vector rows */
+    if ( clearRows ) {
+      rows.clear();
+    }
+
+    madeArray = true;
+  }
+  else {
+    std::cerr << "WARNING: Ignoring additional call to G4RZFieldMap::makeArray()." << std::endl;
+  }
 }

lcdd/src
rz_field_mapSubscriber.cc 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- rz_field_mapSubscriber.cc	29 Aug 2005 23:23:20 -0000	1.1
+++ rz_field_mapSubscriber.cc	30 Aug 2005 21:22:07 -0000	1.2
@@ -1,4 +1,4 @@
-// $Header: /cvs/lcd/lcdd/src/rz_field_mapSubscriber.cc,v 1.1 2005/08/29 23:23:20 jeremy Exp $
+// $Header: /cvs/lcd/lcdd/src/rz_field_mapSubscriber.cc,v 1.2 2005/08/30 21:22:07 jeremy Exp $
 
 #include "Saxana/SAXSubscriber.h"
 #include "Saxana/SAXComponentFactory.h"
@@ -98,6 +98,9 @@
 	    G4cerr << "WARNING: Ignoring unknown element " << seq->content(i).tag << "." << std::endl;
 	  }
 	}
+
+	/* Make an array for performance purposes, clearing the object vector. */
+	fmap->makeArray();
       }
       else {
 	G4Exception("Failed cast to rz_field_map.");
CVSspam 0.2.8