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

Elecin.cxx

Go to the documentation of this file.
00001 // -*- C++ -*-  $Id: Elecin.cxx,v 1.1 2000/09/01 20:20:14 burnett Exp $
00002 //
00003 // This file is part of Gismo 2
00004 //
00005 #include "Elecin.h"
00006 
00007 #include <cmath>
00008 #include <stdlib.h>
00009 #include <stdio.h>
00010 
00011 void Elecin::readPEGS(std::istream& fin, int m)
00012 {
00013    meke = m;
00014    fin >> xr0  >> teff0 >> blcc >> xcc;
00015    fin >> eke0 >> eke1;
00016    esig0  = new float[meke];
00017    esig1  = new float[meke];
00018    psig0  = new float[meke];
00019    psig1  = new float[meke];
00020    ededx0 = new float[meke];
00021    ededx1 = new float[meke];
00022    pdedx0 = new float[meke];
00023    pdedx1 = new float[meke];
00024    ebr10  = new float[meke];
00025    ebr11  = new float[meke];
00026    pbr10  = new float[meke];
00027    pbr11  = new float[meke];
00028    pbr20  = new float[meke];
00029    pbr21  = new float[meke];
00030    tmxs0  = new float[meke];
00031    tmxs1  = new float[meke];
00032 
00033    for (int i=0; i< meke; i++)
00034       fin >> esig0[i]  >> esig1[i]
00035           >> psig0[i]  >> psig1[i]
00036           >> ededx0[i] >> ededx1[i]
00037           >> pdedx0[i] >> pdedx1[i]
00038           >> ebr10[i]  >> ebr11[i]
00039           >> pbr10[i]  >> pbr11[i]
00040           >> pbr20[i]  >> pbr21[i]
00041           >> tmxs0[i]  >> tmxs1[i];
00042 }
00043 
00044 void Elecin::rescale(float dfact)
00045 {
00046 
00047    // Modify distance-scale-dependent quantities
00048 
00049 
00050     float dfacti=1.0/dfact;  //convert rl**-1 to dunits**-1//
00051 
00052     for (int i=0; i< meke; i++)
00053     {  //$scale $lgn(esig,psig,ededx,pdedx(i,im)/0,1/) by dfacti;
00054        //$scale $lgn(tmxs(i,im)/0,1/) by dfact;
00055 
00056        esig0[i]  *= dfacti;
00057        esig1[i]  *= dfacti;
00058        psig0[i]  *= dfacti;
00059        psig1[i]  *= dfacti;
00060        ededx0[i] *= dfacti;
00061        ededx1[i] *= dfacti;
00062        pdedx0[i] *= dfacti;
00063        pdedx1[i] *= dfacti;
00064        tmxs0[i]  *= dfact;
00065        tmxs1[i]  *= dfact;
00066     }
00067     teff0 *= dfact;          //$scale teff0(im) by dfact;
00068 
00069     blcc  *= dfacti;         //$scale blcc(im) by dfacti
00070     xcc   *= sqrt(dfacti);   //$scale xcc(im) by sqrt(dfacti)
00071 }
00072 
00073 void Elecin::fixtmx(float estepe){
00074 /**********************************************************************
00075 "  this routine changes the step size algorithm used in egs so that   "
00076 "  the step size arrays for tmxs correspond to an arbitrary,but       "
00077 "  fixed fractional energy loss estepe.                               "
00078 "  it is only necessary for low energy electron problems since        "
00079 "  typically the 200*teff0 restriction on tmxs is more stringent      "
00080 "   for electrons with energies above a few mev                       "
00081 "                                                                     "
00082 "  note that the $tmxs-over-ride macro is still in force in egs.      "
00083 "                                                                     "
00084 "  the routine changes the values only for the medium 'medium'        "
00085 "  and it should probably be used for all media in a problem.         "
00086 "                                                                     "
00087 "  the routine must be called after hatch has been called and before  "
00088 "  the simulation is begun.                                           "
00089 "                                                                     "
00090 "  the routine is independent of what units are being used, as long   "
00091 "  as they are consistent( e.g. cm, rl or g/cm**2 )                   "
00092 "                                                                     "
00093 "  if called with estepe=0, the default algorithm is used             "
00094 "                                                                     "
00095 "  for a detailed discussion of the use of this routine, see          "
00096 "  'low energy electron transport with egs' in nuclear instr. and     "
00097 "  methods a227 (1984)535-548.  d.w.o. rogers                         "
00098 "                                                                     "
00099 "  v01        dec 10,1981 dave rogers nrcc                            "
00100 "  v02        dec 1984  egs4 version                                  "
00101 "  Adapted for Gismo's EGS  jan 1993  T. Burnett
00102 *********************************************************************/
00103 if(estepe == 0) return; //i.e. use the current algorithm
00104 
00105 // set up some variables for first pass through loop"
00106 float ei = exp( (1.-eke0)/eke1);  //energy of first table entry"
00107 updateIndex(ei);
00108 float eil = loge;
00109 // this is equivalent to $setinterval eil,eke; but avoids roundoff"
00110 
00111 
00112 // $evaluate ededx using ededx(eil);"get the electron stoppping at ei"
00113 //"now calculate step required to cause an estepe reduction in energy"
00114 float si=estepe*ei/ededx();
00115 //"tabulated energies are in a fixed ratio - calc log of the ratio"
00116 float eratio=-1./eke1;
00117 
00118 for(int i=1; i<=meke-1; i++)
00119 {
00120    float eip1=exp(((i+1)-eke0)/eke1);  //"energy at i+1"
00121    updateIndex(eip1);
00122    float eip1l=loge; index=i-1; ;//"designed this way=$setinterval"
00123    //$evaluate ededx using ededx(eip1l);
00124    float sip1=estepe*eip1/ededx();
00125 
00126    //"now solve these equations                                     "
00127    //"  si   = tmxs1 * eil   + tmxs0                                "
00128    //"  sip1 = tmxs1 * eip1l + tmxs0                                "
00129 
00130    tmxs1[i-1] = (si-sip1)/eratio;
00131    tmxs0[i-1] = si-tmxs1[i-1]*eil;
00132    // "transfer values for next loop"
00133    eil=eip1l; si=sip1;
00134 }
00135 // "now pick up last table entry which applies only to last energy"
00136 tmxs0[meke-1] = tmxs0[meke-2];
00137 tmxs1[meke-1] = tmxs1[meke-2];
00138 return;
00139 }
00140 
00141 #define inline
00142 
00143 inline void
00144 Elecin::updateIndex(float enew) const
00145 {
00146    if (enew == eold) return;
00147    Elecin * self = (Elecin *)this;
00148    self->loge = log(enew);
00149    self->index= (int)(eke1*loge + eke0 -1); // note -1 for C arrays
00150    if (index>=meke)
00151    {
00152       char strl[70];
00153       sprintf(strl, "Elecin: energy %9.3f too large for table: index %u , max %u", 
00154                      enew, self->index, meke);
00155 
00156      WARNING(strl);
00157      self->index = meke-1;
00158    }
00159    self->eold = enew;
00160 }
00161 inline float Elecin::esig()const{return  esig1[index]*loge + esig0[index];}
00162 inline float Elecin::psig()const{return  psig1[index]*loge + psig0[index];}
00163 inline float Elecin::ededx()const{return ededx1[index]*loge +ededx0[index];}
00164 inline float Elecin::pdedx()const{return pdedx1[index]*loge +pdedx0[index];}
00165 inline float Elecin::ebr1()const{return  ebr11[index]*loge + ebr10[index];}
00166 inline float Elecin::pbr1()const{return  pbr11[index]*loge + pbr10[index];}
00167 inline float Elecin::pbr2()const{return  pbr21[index]*loge + pbr20[index];}
00168 inline float Elecin::tmxs()const{return  tmxs1[index]*loge + tmxs0[index];}
00169 
00170 Elecin::~Elecin()
00171 {
00172     if( meke==0 ) return;
00173     delete [] esig0 ;
00174     delete [] esig1 ;
00175     delete [] psig0 ;
00176     delete [] psig1 ;
00177     delete [] ededx0 ;
00178     delete [] ededx1;
00179     delete [] pdedx0;
00180     delete [] pdedx1;
00181     delete [] ebr10 ;
00182     delete [] ebr11 ;
00183     delete [] pbr10 ;
00184     delete [] pbr11 ;
00185     delete [] pbr20 ;
00186     delete [] pbr21 ;
00187     delete [] tmxs0 ;
00188     delete [] tmxs1 ;
00189 
00190 }

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