⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcc.cpp

📁 pic 模拟程序!面向对象
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 * * The calculations underlying this method are contained in the *   Tech-X notes, "Scattered Velocity Calculation for XOOPIC," *   by David Bruhwiler (August 31, 2000). */Vector3 MCCPackage::newMomentum(const Vector3 U_initial,                                const Scalar& newEnergy,             										const Scalar& theta,                                const Scalar& phi) {  Scalar u10 = U_initial.e1();  Scalar u20 = U_initial.e2();  Scalar u30 = U_initial.e3();  Scalar u0  = sqrt( u10*u10 + u20*u20 + u30*u30 );  Scalar cosT0 = u30 / u0;  Scalar sinT0 = sqrt( 1. - cosT0*cosT0 );  Scalar cosPhi0;  Scalar root = sqrt(u0*u0-u30*u30);  if ( root <= fabs(u10) ) cosPhi0 = 1;  else cosPhi0 = u10 / root;  Scalar sinPhi0 = sin( acos( cosPhi0 ) );  Scalar cosT = cos(theta);  Scalar sinT = sin(theta);  Scalar cosPhi = cos(phi);  Scalar sinPhi = sin(phi);  Scalar gMin1 = newEnergy / ELECTRON_MASS_EV;  Scalar u0new = SPEED_OF_LIGHT * sqrt( (gMin1+2) * gMin1 );  // =beta*gamma*c  Scalar u10new = u0new * ( cosPhi*sinT*cosPhi0*cosT0                          - sinPhi*sinT*sinPhi0													+        cosT*cosPhi0*sinT0 );  Scalar u20new = u0new * ( cosPhi*sinT*sinPhi0*cosT0                          + sinPhi*sinT*cosPhi0													+        cosT*sinPhi0*sinT0 );  Scalar u30new = u0new * (-cosPhi*sinT*sinT0 + cosT*cosT0);  Vector3 uNew(u10new,u20new,u30new);  return uNew;}void MCCPackage::newVelocity(Scalar energy, Scalar v, Vector3& u, int eFlag){	Scalar	up1, up2, up3;	Scalar	coschi;	Scalar	sinchi;	if (energy < 1e-30) coschi = 1.0;	else coschi = 1 + 2.0*(1.0 - pow(energy + 1.0, frand()))/energy;	sinchi = sqrt(1 - coschi*coschi);	Scalar	phi = TWOPI*frand();	Scalar	cosphi = cos(phi);	Scalar	sinphi = sin(phi);	// transfer momentum://	if (eFlag) v *= sqrt(1 - 2*eSpecies->get_m()/iSpecies->get_m()*(1 - coschi));	// doesn't work when m/M>.5	Scalar me = eSpecies->get_m();	Scalar mi = iSpecies->get_m();	v*= sqrt(1 - 2*me*mi/(me+mi)/(me+mi)*(1-coschi));	Scalar	r13 = u.e1();	Scalar	r23 = u.e2();	Scalar	r33 = u.e3();	if (r33 == 1)	{up1 = 0; up2 = 1; up3 = 0;}	else				{up1 = 0; up2 = 0; up3 = 1;}	Scalar	r12 = r23*up3 - r33*up2;	Scalar	r22 = r33*up1 - r13*up3;	Scalar	r32 = r13*up2 -r23*up1;	Scalar	mag = sqrt(r12*r12 + r22*r22 + r32*r32);  	r12 /= mag;	r22 /= mag;	r32 /= mag;  	Scalar	r11 = r22*r33 - r32*r23;	Scalar	r21 = r32*r13 - r12*r33;	Scalar	r31 = r12*r23 - r22*r13;	u.set_e1(v*(r11*sinchi*cosphi + r12*sinchi*sinphi + r13*coschi));	u.set_e2(v*(r21*sinchi*cosphi + r22*sinchi*sinphi + r23*coschi)); 	u.set_e3(v*(r31*sinchi*cosphi + r32*sinchi*sinphi + r33*coschi));}//-------------------------------------------------------------// ArMCC: argon MCC packageArMCC::ArMCC(Scalar p, Scalar temp, Species* eSpecies, Species* iSpecies,      SpeciesList& sList, Scalar dt, int ionzFraction, Scalar ecxFactor,      Scalar icxFactor, SpatialRegion* _SR,      Scalar _Min1MKS, Scalar _Max1MKS, Scalar _Min2MKS, Scalar _Max2MKS,      Scalar _delayTime, Scalar _stopTime, const ostring &analyticF,       const int& discardDumpFileNGDDataFlag) : MCCPackage(Ar, (ostring) "Ar", p, temp, eSpecies, iSpecies, sList, dt, ionzFraction,      ecxFactor, icxFactor, _SR, _Min1MKS, _Max1MKS, _Min2MKS, _Max2MKS,      _delayTime, _stopTime, analyticF, discardDumpFileNGDDataFlag){  addCrossSections();  init(sList, dt);}void ArMCC::addCrossSections(){  neCX = 3; // electron model  eCX = new CrossSection*[neCX];  eCX[0] = new FuncCrossSection(sigmaElastic, 18, 0.0, CrossSection::ELASTIC);  eCX[1] = new FuncCrossSection(sigmaExc, 18, 12.0, CrossSection::EXCITATION);  eCX[2] = new FuncCrossSection(sigmaIz, 18, 15.76, CrossSection::IONIZATION);  // eCX[0] = new eCrossSection(0.3, 15, 20, 1.2e-19, CrossSection::ELASTIC);  //  eCX[1] = new eCrossSection(11.55, 30, 100, 7e-21, CrossSection::EXCITATION);  //	ionizationCX = new eCrossSection(15.76, 30, 100, 3e-20, IONIZATION);  niCX = 2; // ion model  iCX = new CrossSection*[niCX];    // The original cross-sections.  Cause problems at lower energies.   // Commented out by: Jeff Hammel, 11/4/02  //  iCX[0] = new iCrossSection(1.8e-19, 4e-19, CrossSection::ION_ELASTIC);  //  iCX[1] = new iCrossSection(2e-19, 5.5e-19, CrossSection::CHARGE_EXCHANGE);    iCX[0] = new FuncCrossSection(sigmaIelastic, 18, 0.0, CrossSection::ION_ELASTIC);  iCX[1] = new FuncCrossSection(sigmaCX, 18, 0.0, CrossSection::CHARGE_EXCHANGE);}Scalar ArMCC::sigmaElastic(Scalar energy){      if(energy < 1.0)     {      if(energy < 0.2) { return 1./pow(10.0, 19.0 +energy/.11); }      else 	{ 	  return 9.07e-19*pow(energy, 1.55)*pow(energy+70.0, 1.10)/pow(14.+energy, 3.25); 	}    }  else     {      return 9.07e-19*pow(energy, 1.55)*pow(energy+70.0, 1.10)/pow(14.+energy, 3.25);    }}Scalar ArMCC::sigmaExc(Scalar energy){   if(energy < 12.0) { return 0.; }    return (3.85116e-19*log(energy/3.4015) -4.85227e-19)/energy;}Scalar ArMCC::sigmaCX(Scalar energy){  if(energy > 4.0) return(2.0e-19 +5.5e-19/sqrt(energy));  return(-2.95e-19*sqrt(energy) +10.65e-19);}Scalar ArMCC::sigmaIelastic(Scalar energy){  if(energy > 4.0) return(1.8e-19 +4.0e-19/sqrt(energy));  return(-2.0e-19*sqrt(energy) +7.8e-19);}//-------------------------------------------------------------------// Argon ionization cross section (Rapp & Golden) - energies in eVScalar ArMCC::sigmaIz(Scalar energy){   if (energy < 15.76) return 0;	else if (energy < 79) 	  return 1.7155e-18*(energy-15.76)/(energy*energy)*log(0.0634*energy);	else return 2.648e-18*(energy-15.76)/(energy*energy)*log(0.0344*energy);}//-------------------------------------------------------------// NeMCC: neon MCC packageNeMCC::NeMCC(Scalar p, Scalar temp, Species* eSpecies, Species* iSpecies,      SpeciesList& sList, Scalar dt, int ionzFraction, Scalar ecxFactor,     Scalar icxFactor, SpatialRegion* _SR,     Scalar _Min1MKS, Scalar _Max1MKS, Scalar _Min2MKS, Scalar _Max2MKS,     Scalar _delayTime, Scalar _stopTime, const ostring &analyticF,      const int& discardDumpFileNGDDataFlag) : MCCPackage(Ne, (ostring)"Ne", p, temp, eSpecies, iSpecies, sList, dt, ionzFraction,     ecxFactor, icxFactor, _SR, _Min1MKS, _Max1MKS, _Min2MKS, _Max2MKS,     _delayTime, _stopTime, analyticF, discardDumpFileNGDDataFlag){  addCrossSections();  init(sList, dt);}void NeMCC::addCrossSections(){  neCX = 3; // electron model  eCX = new CrossSection*[neCX];  eCX[0] = new FuncCrossSection(sigmaElastic, 10, 0.,  CrossSection::ELASTIC);  eCX[1] = new FuncCrossSection(sigmaExc, 10, 15.8489, CrossSection::EXCITATION);  eCX[2] = new FuncCrossSection(sigmaIz, 10,  20.893,  CrossSection::IONIZATION);  niCX = 1; // ion model  iCX = new CrossSection*[niCX];  iCX[0] = new iCrossSection(0, 5.98e-20, CrossSection::CHARGE_EXCHANGE);}Scalar NeMCC::sigmaElastic(Scalar energy){  if (energy < 2.63027) return 1.27808e-20 + energy*(4.22329e-21 - 7.31854e-22*energy);  else if (energy < 19.4984) return 1.66333e-20 + energy*(8.66972e-22 - 1.14153e-23*energy);  else if (energy < 33.8844) return 2.2297e-20 + energy*(5.8066e-22 - 1.18023e-23*energy);  else if (energy < 190.546) return 3.862e-20 + energy*(-3.19062e-22 + 8.00046e-25*energy);  else if (energy < 501.187) return 1.37254e-20 + energy*(-4.66403e-23 + 4.6479e-26*energy);  else if (energy < 1000) return 4.38798e-21 + energy*(-6.19168e-24 + 2.5747e-27*energy);  else return 0;}Scalar NeMCC::sigmaExc(Scalar energy) // summed excitations{  if (energy <= 15.8489) return 0;  else if (energy < 23.9883) return -2.37959e-22 + energy*(-5.87101e-23 + 4.6417e-24*energy);  else if (energy < 36.3078) return -3.49005e-21 + energy*(2.76934e-22 - 3.69893e-24*energy);  else if (energy < 54.9541) return 2.75471e-22 + energy*(6.0912e-23 - 5.99808e-25*energy);  else if (energy < 251.189) return 2.271e-21 + energy*(-8.78552e-24 + 1.41951e-26*energy);  else if (energy < 616.595) return 1.53078e-21 + energy*(-2.7892e-24 + 1.90737e-27*energy);  else if (energy < 1000) return 1.05134e-21 + energy*(-1.07925e-24 + 3.83108e-28*energy);  else return 0;}Scalar NeMCC::sigmaIz(Scalar energy){  if (energy <= 20.893) return 0;  else if (energy < 54.9541) return -2.34018e-21 + energy*1.10755e-22;  else if (energy < 125.893) return -2.4556e-21 + energy*(1.42218e-22 - 5.37266e-25*energy);  else if (energy < 190.546) return 2.62391e-21 + energy*(5.39463e-23 - 1.54319e-25*energy);  else if (energy < 436.516) return 8.04001e-21 + energy*(-2.68853e-24 - 6.11372e-27*energy);  else if (energy < 1000) return 9.16045e-21 + energy*(-9.59021e-24 + 3.85096e-27*energy);  else return 0;}//-------------------------------------------------------------// XeMCC: xenon MCC packageXeMCC::XeMCC(Scalar p, Scalar temp, Species* eSpecies, Species* iSpecies,      SpeciesList& sList, Scalar dt, int ionzFraction, Scalar ecxFactor,     Scalar icxFactor, SpatialRegion* _SR,     Scalar _Min1MKS, Scalar _Max1MKS, Scalar _Min2MKS, Scalar _Max2MKS,     Scalar _delayTime, Scalar _stopTime, const ostring &analyticF,     const int& discardDumpFileNGDDataFlag) : MCCPackage(Xe, (ostring)"Xe", p, temp, eSpecies, iSpecies, sList, dt, ionzFraction,     ecxFactor, icxFactor, _SR, _Min1MKS, _Max1MKS, _Min2MKS, _Max2MKS,     _delayTime, _stopTime, analyticF, discardDumpFileNGDDataFlag){  addCrossSections();  init(sList, dt);}void XeMCC::addCrossSections(){  neCX = 3; // electron model  eCX = new CrossSection*[neCX];  eCX[0] = new FuncCrossSection(sigmaElastic, 54, 0.,  CrossSection::ELASTIC);  eCX[1] = new FuncCrossSection(sigmaExc, 54, 7.94328, CrossSection::EXCITATION);  eCX[2] = new FuncCrossSection(sigmaIz,  54, 11.2202, CrossSection::IONIZATION);  niCX = 1; // ion model  iCX = new CrossSection*[niCX];  iCX[0] = new iCrossSection(0, 4.541e-20, CrossSection::CHARGE_EXCHANGE);}Scalar XeMCC::sigmaElastic(Scalar energy){  if (energy <= 1) return 0;  else if (energy < 3.46737) return -2.56426e-20 + energy*(3.05131e-20 + 1.01401e-20*energy);  else if (energy < 4.2658) return -7.02412e-19 + energy*(4.15012e-19 - 4.46826e-20*energy);  else if (energy < 5.62341) return -3.14744e-19 + energy*(2.19764e-19 - 2.027176e-20*energy);  else if (energy < 12.0226) return 2.23972e-19 + energy*(2.61272e-20 - 2.81077e-21*energy);  else if (energy < 25.704) return 3.39014e-19 + energy*(-2.28038e-20 + 4.64864e-22*energy);  else if (energy < 72.4436) return 9.50404e-20 + energy*(-1.80585e-21 + 1.24365e-23*energy);  else if (energy < 190.546) return 4.51567e-20 + energy*(-2.78976e-22 + 6.93189e-25*energy);  else if (energy < 537.032) return 2.59891e-20 + energy*(-5.72321e-23 + 4.79915e-26*energy);  else if (energy < 1000) return 1.46698e-20 + energy*(-1.28135e-23 + 3.98769e-27*energy);  else return 0;}Scalar XeMCC::sigmaExc(Scalar energy) // summed excitations{  if (energy <= 7.94328) return 0;  else if (energy < 11.2202) return 7.71935e-20 + energy*(-1.8566e-20 + 1.117e-21*energy);  else if (energy < 20.893) return -5.72625e-20 + energy*(8.29355e-21 - 2.02235e-22*energy);  else if (energy < 33.8844) return 9.4784e-21 + energy*(1.36322e-21 - 2.20758e-23*energy);  else if (energy < 190.546) return 3.66375e-20 + energy*(-1.87228e-22 + 3.94988e-25*energy);  else if (energy < 467.735) return 2.51242e-20 + energy*(-6.45713e-23 + 6.14246e-26*energy);  else if (energy < 1000) return 1.4849e-20 + energy*(-1.78916e-23 + 7.74732e-27*energy);  else return 0;}Scalar XeMCC::sigmaIz(Scalar energy){  if (energy <= 11.2202) return 0;  else if (energy < 44.6684) return -4.78153e-20 + energy*(4.75275e-21 - 5.83101e-23*energy);  else if (energy < 67.6083) return 4.90931e-20 + energy*(-6.99912e-23 + 1.11671e-24*energy);  else if (energy < 102.329) return 3.73779e-20 + energy*(3.25673e-22 - 2.15897e-24*energy);  else if (energy < 204.174) return 6.20189e-20 + energy*(-1.62295e-22 + 2.70937e-25*energy);  else if (energy < 575.44) return 4.1e-20 - 3.49995e-24*energy;  else if (energy < 812.831) return 2.19858e-20 + energy*(9.27581e-23 - 1.09139e-25*energy);  else if (energy < 1000) return 8.37604e-20 + energy*(-1.01201e-22 + 3.62937e-26*energy);  else return 0;}//-------------------------------------------------------------// HMCC:  Hydrogen MCC packageHMCC::HMCC(Scalar p, Scalar temp, Species* eSpecies, Species* iSpecies,      SpeciesList& sList, Scalar dt, int ionzFraction, Scalar ecxFactor,     Scalar icxFactor, SpatialRegion* _SR,     Scalar _Min1MKS, Scalar _Max1MKS, Scalar _Min2MKS, Scalar _Max2MKS,     Scalar _delayTime, Scalar _stopTime, const ostring &analyticF,      const int& discardDumpFileNGDDataFlag) : MCCPackage(H, (ostring)"H", p, temp, eSpecies, iSpecies, sList, dt, ionzFraction,     ecxFactor, icxFactor, _SR, _Min1MKS, _Max1MKS, _Min2MKS, _Max2MKS,     _delayTime, _stopTime, analyticF, discardDumpFileNGDDataFlag){  addCrossSections();  init(sList, dt);}void HMCC::addCrossSections(){  neCX = 1; // electron model  eCX = new CrossSection*[neCX];  eCX[0] =  new FuncCrossSection(sigmaIz, 1, 13.6, CrossSection::IONIZATION);}Scalar HMCC::sigmaIz(Scalar energy){  if (energy <= 13.6) return 0;  else if (energy <= 17.789) return 8.208063e-21*log(energy)-2.071614e-20;  else if (energy <= 53.6999) return 3.751578e-21*log(energy)-7.887766e-21;  else return (2.996231e-19*log(energy)-8.145988e-19)/energy;}//-------------------------------------------------------------------//-------------------------------------------------------------// HeMCC: Helium MCC package    -- added 10/24/02 by Hammel;// electron cross-sections from pdp1, // ion cross sections from McDaniel et al, 1993  (curve fit)HeMCC::HeMCC(Scalar p, Scalar temp, Species* eSpecies, Species* iSpecies,      SpeciesList& sList, Scalar dt, int ionzFraction, Scalar ecxFactor,     Scalar icxFactor, SpatialRegion* _SR,     Scalar _Min1MKS, Scalar _Max1MKS, Scalar _Min2MKS, Scalar _Max2MKS,     Scalar _delayTime, Scalar _stopTime, const ostring &analyticF,      const int& discardDumpFileNGDDataFlag) : MCCPackage(H, (ostring)"He", p, temp, eSpecies, iSpecies, sList, dt, ionzFraction,     ecxFactor, icxFactor, _SR, _Min1MKS, _Max1MKS, _Min2MKS, _Max2MKS,     _delayTime, _stopTime, analyticF, discardDumpFileNGDDataFlag){  addCrossSections();  init(sList, dt);}void HeMCC::addCrossSections(){  neCX = 3; // electron model  eCX = new CrossSection*[neCX];  eCX[0] =  new FuncCrossSection(sigmaElastic, 2, 0.0, CrossSection::ELASTIC);  eCX[1] =  new FuncCrossSection(sigmaExc, 2, 19.8, CrossSection::EXCITATION);  eCX[2] =  new FuncCrossSection(sigmaIz, 2, 24.5, CrossSection::IONIZATION);  niCX = 2; // ion model  iCX = new CrossSection*[niCX];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -