Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

GheishaData.cxx

Go to the documentation of this file.
00001 // $Id: GheishaData.cxx,v 1.1 2000/09/01 20:20:23 burnett Exp $
00002 // Author: T. Burnett
00003 // Contents ----------------------------------------------------------------
00004 //
00005 //
00006 // Description
00007 //
00008 //      GheishaData implementations
00009 //
00010 // End --------------------------------------------------------------------
00011 
00012 
00013 #include "GheishaData.h"
00014 
00015 #include "gismo/Material.h"
00016 
00017 #include <cmath>
00018 #include <cstring> // for gcc
00019 #include <cstdlib> // for gcc
00020 
00021 #define gsmate gsmate_
00022 #define gsmixt gsmixt_
00023 
00024 extern "C" {
00025    void gsmate(const int* imat, /* const char * namate ,*/ 
00026                 const float* A,
00027               const float* Z, const float* dens, const float* radl, const float * absl);
00028 //THB: following change required by unexplained change in GHEISHA fortran code
00029    
00030    void gsmixt(const int* imat,/* const char * namate, */
00031           const int* nlmat, const float * wmat,
00032               const int * what, const float* dens);          
00033 }
00034 
00035 
00036 void
00037 GheishaData::read(std::istream&, Material& mat)
00038 {
00039 
00040    float  wtNorm = 0.,
00041           numNorm = 0.;
00042    int numElem=0;
00043 
00044     Material::Element_list::iterator it=mat.elementList.begin();
00045     for(; it != mat.elementList.end(); ++ it) {
00046         Material::AtomicElement* el = *it;
00047         wtNorm += el->rhoz;
00048         numNorm += el->pz;
00049         numElem++;
00050     }
00051    float* weights = new float[numElem];
00052    int*   indices = new int[numElem];
00053    char hadMatName[20];
00054 
00055    int i=0;
00056    for(it = mat.elementList.begin(); it != mat.elementList.end(); ++it) {
00057         Material::AtomicElement* el = *it;
00058        strncpy(hadMatName, el->name, 18);
00059       strncat(hadMatName,"$",1);
00060       weights[i] = el->rhoz/wtNorm;
00061       float density;
00062       if(numElem == 1) density = mat.density();
00063       else             density = mat.density()* weights[i] * numNorm/el->pz;
00064 
00065       float lamda;
00066       switch( (int)el->z)
00067       {
00068        case 1:
00069            if(el->a < 1.5)     lamda = 790.;      // Hydrogen
00070             else                lamda = 342.;      // Deuterium
00071           break;
00072        case 2:  lamda = 478.f; break;     // Helium
00073        case 3:  lamda = 120.6f; break;    // Lithium
00074        case 4:  lamda = 36.7f;  break;    // Berillium
00075        case 6:  lamda = 49.9f;  break;    // Carbon
00076        case 7:  lamda = 99.4f;  break;    // Nitrogen
00077        case 10: lamda = 74.9f;  break;    // Neon
00078        case 13: lamda = 37.2f;  break;    // Aluminium
00079        case 26: lamda = 17.1f;  break;    // Iron
00080        case 29: lamda = 14.8f;  break;    // Copper
00081        case 74: lamda = 10.3f;  break;    // Tungsten
00082        case 82: lamda = 18.5f;  break;    // Lead
00083        case 92: lamda = 12.0f;  break;    // Uranium
00084        default:                                     // Everything else....
00085          lamda = 31.62 * pow(el->a, .335f) * density;
00086       }
00087       hadMatCounter++;
00088       indices[i] = hadMatCounter;
00089       float rlc =mat.radiationLength();
00090 
00091       gsmate(&hadMatCounter,/* hadMatName,*/ &el->a, &el->z, &density, &rlc,
00092              &lamda);
00093 
00094       i++;
00095    }
00096 
00097 // Take care of mixtures here....
00098    if(numElem > 1) {
00099       strncpy(hadMatName, mat.name(), 18);
00100       strncat(hadMatName,"$",1);
00101       hadMatCounter++;
00102       float density = mat.density();
00103 // cout << "Number of elements: " << numElem << '\n';
00104       gsmixt(&hadMatCounter, /* mat.name(),  */
00105                &numElem, weights, indices, &density);
00106 
00107    }
00108 
00109    hadMatIndex = hadMatCounter;
00110    delete [] weights;
00111    delete [] indices;
00112 
00113 }
00114 
00115 int GheishaData::hadMatCounter=0;
00116 
00117 
00118 

Generated at Mon Nov 26 18:18:32 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000