lcdd/include
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
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
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
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.");