00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "GheishaData.h"
00014
00015 #include "gismo/Material.h"
00016
00017 #include <cmath>
00018 #include <cstring>
00019 #include <cstdlib>
00020
00021 #define gsmate gsmate_
00022 #define gsmixt gsmixt_
00023
00024 extern "C" {
00025 void gsmate(const int* imat,
00026 const float* A,
00027 const float* Z, const float* dens, const float* radl, const float * absl);
00028
00029
00030 void gsmixt(const int* imat,
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.;
00070 else lamda = 342.;
00071 break;
00072 case 2: lamda = 478.f; break;
00073 case 3: lamda = 120.6f; break;
00074 case 4: lamda = 36.7f; break;
00075 case 6: lamda = 49.9f; break;
00076 case 7: lamda = 99.4f; break;
00077 case 10: lamda = 74.9f; break;
00078 case 13: lamda = 37.2f; break;
00079 case 26: lamda = 17.1f; break;
00080 case 29: lamda = 14.8f; break;
00081 case 74: lamda = 10.3f; break;
00082 case 82: lamda = 18.5f; break;
00083 case 92: lamda = 12.0f; break;
00084 default:
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, &el->a, &el->z, &density, &rlc,
00092 &lamda);
00093
00094 i++;
00095 }
00096
00097
00098 if(numElem > 1) {
00099 strncpy(hadMatName, mat.name(), 18);
00100 strncat(hadMatName,"$",1);
00101 hadMatCounter++;
00102 float density = mat.density();
00103
00104 gsmixt(&hadMatCounter,
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