Пример #1
0
void vec::random_round_vec(void) {
#ifdef USE_SRANLUX
  vfloat phi = M_PI * 2.0 * SRANLUX();
#else
  vfloat phi = M_PI * 2.0 * random_engine.flat();
#endif
  x = sin(phi);
  y = cos(phi);
  z = 0;
}
Пример #2
0
void vec::random_sfer_vec() {
#ifdef USE_SRANLUX
  vfloat cteta = 2.0 * SRANLUX()-1.0;
#else
  vfloat cteta = 2.0 * random_engine.flat()-1.0;
#endif
  random_round_vec();
  vfloat steta = sqrt(1.0 - cteta * cteta);
  *this=(*this)*steta;
  z = cteta;
}
Пример #3
0
void vec::random_conic_vec(double theta) {
#ifdef USE_SRANLUX
  vfloat phi = M_PI * 2.0 * SRANLUX();
#else
  vfloat phi = M_PI * 2.0 * random_engine.flat();
#endif
  double stheta = sin(theta);
  x = sin(phi) * stheta;
  y = cos(phi) * stheta;
  z = cos(theta);
}
Пример #4
0
double PairProd::get_eloss(const double e_cur) const {
  mfunname("double PairProd::get_eloss(double ecur) const");
  double e_loss = k * pran.ran(SRANLUX()) + s;
  double c;
  if (e_cur <= V_ratio * wa) {
    c = DBL_MAX;
  } else {
    //c = 1.0 / (1.0 - V_ratio * wa / e_cur);
    c = 1.0 / (1.0 - pow(V_ratio * wa / e_cur, 2.0));
  }
  return e_loss * c;
}
Пример #5
0
void HeedParticle::physics(void)
{
  mfunname("void HeedParticle::physics(void)");
  if(s_print_listing == 1)
  {
    mcout<<"HeedParticle::physics is started\n";
    Iprintn(mcout, currpos.prange);
  }
  transferred_energy_in_step = 0.0;
  //tnpi_in_step = 0;
  qtransfer = 0;
  transferred_energy.allocate_block(100);
  natom.allocate_block(100);
  nshell.allocate_block(100);
  if(currpos.prange <= 0.0) return;
  const absvol* av = currpos.G_lavol(); // get least address of volume
  const EnTransfCSType* etcst = dynamic_cast< const EnTransfCSType*  >(av);
  if(etcst == NULL) 
  {
    //mcout<<"HeedParticle::physics: "
    //<<"dynamic_cast is not successful, return 0\n";
    //av->chname(name);
    //mcout<<"name="<<name<<'\n';
    return;
  }
  else
  {
    //mcout<<"HeedParticle::physics: proceeding well\n";
    // All these objects are expected to exist till the end of this function,
    // if they exist now:
    EnTransfCS* aetcs = etcst->etcs.getver();
    HeedMatterDef* ahmd = aetcs->hmd.getver();
    MatterDef* amatter = ahmd->matter.getver();
    EnergyMesh* a_energy_mesh = ahmd->energy_mesh.getver();
    const double* aetemp = ahmd->energy_mesh->get_ae();
    PointCoorMesh< double, const double* > pcm_e
      ( a_energy_mesh->get_q() + 1 , &(aetemp) );
    //double emin = hmd->energy_mesh->get_emin();
    //double emax = hmd->energy_mesh->get_emax();

    //transferred_energy.put_qel(10, 0.0);
    //natom.put_qel(100, 0);
    //nshell.put_qel(100, 0);
    long qa = amatter->qatom();
    //long qa = etcst->etcs->hmd->matter->qatom();
    if(s_print_listing == 1)
    {
      Iprintn(mcout, qa);
    }
    long na;
    //long qe = a_energy_mesh->get_q();
    //long qe = ahmd->energy_mesh->get_q();
    //long qe = etcst->etcs->hmd->energy_mesh->get_q();
    basis tempbas(currpos.dir, "tempbas");
    for(na=0; na<qa; na++)
    {
      if(s_print_listing == 1)
      {
        Iprintn(mcout, na);
      }
      long qs = ahmd->apacs[na]->get_qshell();
      //long qs = etcst->etcs->hmd->apacs[na]->get_qshell();
      long ns;
      for(ns=0; ns<qs; ns++)
      {
        if(s_print_listing == 1)
        {
          Iprintn(mcout, ns);
        }
        long qt=0;
 
#ifdef SINGLE_TRANSFER 
        if(aetcs == aetcs_single_transf &&
           na == na_single_transf &&
           ns == ns_single_transf)
        {
          qt = 1;
        }
#else
        if(aetcs->quan[na][ns] > 0.0)
          //if(etcst->etcs->quan[na][ns] > 0.0)
        {
          int ierror;
          //Iprintn(mcout, etcst->etcs->quan[na][ns]);
          qt = pois( aetcs->quan[na][ns] * currpos.prange/cm, ierror);
          //qt = pois( etcst->etcs->quan[na][ns] * currpos.prange/cm, ierror);
          //Iprintn(mcout, qt);
          check_econd11a(ierror , == 1 ,
                         " aetcs->quan[na][ns]="<<aetcs->quan[na][ns]
                         <<" currpos.prange/cm="<<currpos.prange/cm<<'\n' ,
                         mcerr);
        }
#endif
        if(s_print_listing == 1)
        {
          Iprintn(mcout, qt);
        }

        if(qt > 0)
        {
          point curpt = prevpos.pt;
          //Iprint(mcout, curpt);
          vec dir = unit_vec(currpos.pt - prevpos.pt);   
          //Iprint(mcout, dir);
          // this approximation ignores curvature
          double range = length(currpos.pt - prevpos.pt);
          //Iprintn(mcout, range);
          if(s_print_listing == 1)
          {
            Iprint(mcout, curpt);
            Iprint(mcout, dir);
            Iprintn(mcout, range);
          }
          long nt;
          for(nt=0; nt<qt; nt++)
          {
            //if(s_print_listing == 1)
            //{
            //  Iprintn(mcout, nt);
            //}
            //if(qtransfer == transferred_energy.get_qel())
            //{
            //  transferred_energy.put_qel(2 * qtransfer);
            //  natom.put_qel(2 * qtransfer);
            //  nshell.put_qel(2 * qtransfer);
            //}
#ifdef SINGLE_TRANSFER 
            transferred_energy.append( ener_single_transf );
#else
            double rn = SRANLUX();
            if(s_print_listing == 1)
            {
              Iprintn(mcout, rn);
              Iprintn(mcout, aetcs);
              Iprintn(mcout, aetcs->fadda[na][ns][1]);
            }
            /*
            double r = chisran(rn, aetcs->fadda[na][ns]);
            //double r = chisran(rn, etcst->etcs->fadda[na][ns]);
            long nr = left_round(r);
            check_econd21( nr , < 0 || , > qe , mcout);
            double e1 = a_energy_mesh->get_e(nr);
            double e2 = a_energy_mesh->get_e(nr+1);
            //double e1 = etcst->etcs->hmd->energy_mesh->get_e(nr);
            //double e2 = etcst->etcs->hmd->energy_mesh->get_e(nr+1);
            double dr = r - nr;
            transferred_energy.append( (e1 + (e2 - e1) * dr) * MeV );
            //transferred_energy[qtransfer] = (e1 + (e2 - e1) * dr) * MeV;
            if(s_print_listing == 1)
            {
              Iprint2n(mcout, r, nr);
              Iprint2n(mcout, e1, e2);
              Iprintn(mcout, dr);
            }
            */
            double r = t_hisran_step_ar< double, DynLinArr < double >,
              PointCoorMesh< double, const double* > >
              (pcm_e, aetcs->fadda[na][ns], rn);
            transferred_energy.append( r * MeV );  // and passing to 
                                                   // internal units
#endif
            if(s_print_listing == 1)
            {
              Iprint2n(mcout, nt, transferred_energy[qtransfer]);
            }
            transferred_energy_in_step += transferred_energy[qtransfer];
            natom.append( na ); 
            nshell.append( ns );
            //natom[qtransfer] = na; 
            //nshell[qtransfer] = ns;
#ifdef SINGLE_TRANSFER 
            double arange = 0.5 * range;
#else
            double arange = SRANLUX() * range;
#endif
            point pt = curpt + dir * arange;
            //Iprint(mcout, pt);
            point ptloc = pt;
            prevpos.tid.up_absref(&ptloc);
            qtransfer++;
            if(s_loss_only == 0)
            {
              if(s_print_listing == 1)
              {
                mcout<<"generating new cluster\n";
              }
              cluster_bank.append
                ( HeedCluster( transferred_energy[qtransfer-1],
                               0,
                               pt,
                               ptloc,
                               prevpos.tid,        
                               na,
                               ns));
              /*
                cluster_bank.insert_after
                ( cluster_bank.get_last_node(),
                HeedCluster( transferred_energy[qtransfer-1],
                0,
                pt,
                ptloc,
                prevpos.tid,        
                na,
                ns) );
              */
              vec vel;
              double Ep0 = mass * 
                mparticle::speed_of_light * mparticle::speed_of_light
                + curr_kin_energy;
              double Ep1 = Ep0 - transferred_energy[qtransfer-1];
              double Mp = mass;
              double Mt = electron_def.mass;
              double theta_p, theta_t;
              //mcout<<"Ep0/MeV="<<Ep0/MeV<<" Ep1/MeV="<<Ep1/MeV
              //     <<" (Ep0 - Ep1)/MeV="<<(Ep0 - Ep1)/MeV
              //     <<" Mp*c_squared/MeV="<<Mp*c_squared/MeV
              //     <<" Mt*c_squared/MeV="<<Mt*c_squared/MeV<<std::endl;
              theta_two_part(Ep0, Ep1, Mp, Mt, 
                             mparticle::speed_of_light,
                             theta_p, theta_t);
              //mcout<<"theta_p/M_PI * 180.0="<<theta_p/M_PI * 180.0
              //     <<" theta_t/M_PI * 180.0="<<theta_t/M_PI * 180.0<<std::endl;
              vel.random_conic_vec(fabs(theta_t));  
              vel.down(&tempbas);   // direction is OK
              vel *= mparticle::speed_of_light;
              // HS
              double speed = length(vel);
              double time = arange / speed;
              if(s_print_listing == 1)
              {
                mcout<<"generating new virtual photon\n";
              }
              HeedPhoton hp(
                            currpos.tid.eid[0].amvol.getver(), 
                            //currpos.tid.eid[0].amvol.get(), 
                            pt,
                            vel,
                            time,
                            particle_number,
                            //PassivePtr< gparticle > (this),
                            transferred_energy[qtransfer-1],
                            0);
              hp.s_photon_absorbed = 1;
              hp.s_delta_generated = 0;
              hp.na_absorbing = na;
              hp.ns_absorbing = ns;
              ActivePtr< gparticle > ac;
              ac.put(&hp);
              
              particle_bank.insert_after( particle_bank.get_last_node(), ac);
            }
          }
        }
      }
    }
  } 
Пример #6
0
double PairProd::get_eloss(const double e_cur) const {
  mfunname("double PairProd::get_eloss(double ecur) const");
  double e_loss = k * pran.ran(SRANLUX()) + s;
  if (e_cur - e_loss < w_cut_ratio * wa) e_loss = 1.0e20;  // to stop tracing
  return e_loss;
}
Пример #7
0
long pois(double AMU, int &IERROR)
    //C
    //C    POISSON GENERATOR
    //C    CODED FROM LOS ALAMOS REPORT      LA-5061-MS
    //C    PROB(N)=EXP(-AMU)*AMU**N/FACT(N)
    //C        WHERE FACT(N) STANDS FOR FACTORIAL OF N
    //C    ON RETURN IERROR.EQ.0 NORMALLY
    //C              IERROR.EQ.1 IF AMU.LE.0.
    //C
    {
  double AMUOL = -1.;
  double AMAX = 100.;
  double EXPMA = 0.;
  double PIR = 0;
  double RAN;
  //static double SECOND_RAN;
  //static int s_inited_SECOND_RAN = 0;
  long N = 0;
  IERROR = 0;
  if (AMU > AMAX) goto m500;
  if (AMU == AMUOL) goto m200;
  if (AMU > 0.0) goto m100;
  //C    MEAN SHOULD BE POSITIVE
  IERROR = 1;
  return 0;
//C    SAVE EXPONENTIAL FOR FURTHER IDENTICAL REQUESTS
m100:
  IERROR = 0;
  AMUOL = AMU;
  EXPMA = exp(-AMU);
m200:
  PIR = 1.;
  N = -1;
m300:
  N = N + 1;
  //{  // for debug
  //  double x = SRANLUX();
  //  mcout<<"pois: x = "<<x<<'\n';
  //  PIR=PIR * x;
  //}
  PIR = PIR * SRANLUX();  // working variant
  if (PIR > EXPMA) goto m300;
  return N;
//C   NORMAL APPROXIMATION FOR AMU.GT.AMAX
m500:
  /*
  //Iprint2n(mcout,
  //	   pois_state.s_inited_SECOND_RAN,
  //	   pois_state.SECOND_RAN);
  if(pois_state.s_inited_SECOND_RAN == 1)
  {
    pois_state.s_inited_SECOND_RAN = 0;
    N = long(pois_state.SECOND_RAN*sqrt(AMU) + AMU + .5);
    return N;
  }
  else
  {
    rnorm_double(SRANLUX(), SRANLUX(), RAN, pois_state.SECOND_RAN);
    N = long(RAN*sqrt(AMU) + AMU + .5);
    pois_state.s_inited_SECOND_RAN = 1;
    return N;
  }
  */
  RAN = rnorm_improved();
  N = long(RAN * sqrt(AMU) + AMU + .5);
  return N;

}