781 const size_t np = 150;
793 size_t nReducedPoints = np/4;
798 G4Exception(
"G4PenelopeRayleighModel::InitializeSamplingAlgorithm()",
800 "Too few points to initialize the sampling algorithm");
802 if (q2min > (q2max-1
e-10))
804 G4cout <<
"q2min= " << q2min <<
" q2max= " << q2max <<
G4endl;
805 G4Exception(
"G4PenelopeRayleighModel::InitializeSamplingAlgorithm()",
807 "Too narrow grid to initialize the sampling algorithm");
820 const G4int nip = 51;
824 for (
size_t i=1;i<NUNIF-1;i++)
832 G4cout <<
"Vector x has " << x->size() <<
" points, while NUNIF = " << NUNIF <<
G4endl;
841 for (
size_t i=0;i<NUNIF-1;i++)
850 for (
G4int k=0;k<nip;k++)
854 pdfi->push_back(pdfk);
860 pdfih->push_back(pdfIK);
868 for (
G4int k=1;k<nip;k++)
871 G4double next = previous + cons*((*pdfi)[k-1]+4.0*(*pdfih)[k-1]+(*pdfi)[k]);
872 sumi->push_back(next);
875 G4double lastIntegral = (*sumi)[sumi->size()-1];
876 area->push_back(lastIntegral);
879 for (
size_t k=0;k<sumi->size();k++)
883 if ((*pdfi)[0] < 1
e-35)
884 (*pdfi)[0] = 1
e-5*pdfmax;
885 if ((*pdfi)[pdfi->size()-1] < 1
e-35)
886 (*pdfi)[pdfi->size()-1] = 1
e-5*pdfmax;
890 G4double B_temp = 1.0-1.0/(pli*pui*dx*dx);
891 G4double A_temp = (1.0/(pli*dx))-1.0-B_temp;
892 G4double C_temp = 1.0+A_temp+B_temp;
901 a->push_back(A_temp);
902 b->push_back(B_temp);
903 c->push_back(C_temp);
915 for (
G4int k=0;k<nip;k++)
918 G4double pap = (*area)[i]*(1.0+((*a)[i]+(*b)[i]*rr)*rr)*(1.0+((*a)[i]+(*b)[i]*rr)*rr)/
919 ((1.0-(*b)[i]*rr*rr)*(*c)[i]*((*x)[i+1]-(*x)[i]));
920 if (k == 0 || k == nip-1)
921 (*err)[i] += 0.5*std::fabs(pap-(*pdfi)[k]);
923 (*err)[i] += std::fabs(pap-(*pdfi)[k]);
928 if ((*err)[i] > 0.1*(*area)[i] && icase == 1)
944 (*x)[x->size()-1] = q2max;
951 if (x->size() != NUNIF || a->size() != NUNIF ||
952 err->size() != NUNIF || area->size() != NUNIF)
955 ed <<
"Problem in building the Table for Sampling: array dimensions do not match" <<
G4endl;
956 G4Exception(
"G4PenelopeRayleighModel::InitializeSamplingAlgorithm()",
968 for (
size_t i=0;i<err->size()-2;i++)
971 if ((*err)[i] > maxError)
973 maxError = (*err)[i];
979 G4double newx = 0.5*((*x)[iErrMax]+(*x)[iErrMax+1]);
981 x->insert(x->begin()+iErrMax+1,newx);
983 area->insert(area->begin()+iErrMax+1,0.);
984 a->insert(a->begin()+iErrMax+1,0.);
985 b->insert(b->begin()+iErrMax+1,0.);
986 c->insert(c->begin()+iErrMax+1,0.);
987 err->insert(err->begin()+iErrMax+1,0.);
990 for (
size_t i=iErrMax;i<=iErrMax+1;i++)
997 G4double dxLocal = (*x)[i+1]-(*x)[i];
1000 for (
G4int k=0;k<nip;k++)
1004 pdfi->push_back(pdfk);
1010 pdfih->push_back(pdfIK);
1017 sumi->push_back(0.);
1018 for (
G4int k=1;k<nip;k++)
1021 G4double next = previous + cons*((*pdfi)[k-1]+4.0*(*pdfih)[k-1]+(*pdfi)[k]);
1022 sumi->push_back(next);
1024 G4double lastIntegral = (*sumi)[sumi->size()-1];
1025 (*area)[i] = lastIntegral;
1028 G4double factor = 1.0/lastIntegral;
1029 for (
size_t k=0;k<sumi->size();k++)
1033 if ((*pdfi)[0] < 1
e-35)
1034 (*pdfi)[0] = 1
e-5*pdfmax;
1035 if ((*pdfi)[pdfi->size()-1] < 1
e-35)
1036 (*pdfi)[pdfi->size()-1] = 1
e-5*pdfmax;
1040 G4double B_temp = 1.0-1.0/(pli*pui*dxLocal*dxLocal);
1041 G4double A_temp = (1.0/(pli*dxLocal))-1.0-B_temp;
1042 G4double C_temp = 1.0+A_temp+B_temp;
1063 for (
G4int k=0;k<nip;k++)
1066 G4double pap = (*area)[i]*(1.0+((*a)[i]+(*b)[i]*rr)*rr)*(1.0+((*a)[i]+(*b)[i]*rr)*rr)/
1067 ((1.0-(*b)[i]*rr*rr)*(*c)[i]*((*x)[i+1]-(*x)[i]));
1068 if (k == 0 || k == nip-1)
1069 (*err)[i] += 0.5*std::fabs(pap-(*pdfi)[k]);
1071 (*err)[i] += std::fabs(pap-(*pdfi)[k]);
1076 if ((*err)[i] > 0.1*(*area)[i] && icase == 1)
1089 }
while(x->size() < np);
1091 if (x->size() != np || a->size() != np ||
1092 err->size() != np || area->size() != np)
1094 G4Exception(
"G4PenelopeRayleighModel::InitializeSamplingAlgorithm()",
1096 "Problem in building the extended Table for Sampling: array dimensions do not match ");
1103 for (
size_t i=0;i<np-1;i++)
1107 for (
size_t i=0;i<np-1;i++)
1111 errMax =
std::max(errMax,(*err)[i]);
1117 for (
size_t i=0;i<np-1;i++)
1120 PAC->push_back(previous+(*area)[i]);
1122 (*PAC)[PAC->size()-1] = 1.;
1129 std::vector<size_t> *ITTL =
new std::vector<size_t>;
1130 std::vector<size_t> *ITTU =
new std::vector<size_t>;
1133 for (
size_t i=0;i<np;i++)
1141 for (
size_t i=1;i<(np-1);i++)
1145 for (
size_t j=(*ITTL)[i-1];j<np && !found;j++)
1147 if ((*PAC)[j] > ptst)
1155 (*ITTU)[ITTU->size()-2] = ITTU->size()-1;
1156 (*ITTU)[ITTU->size()-1] = ITTU->size()-1;
1157 (*ITTL)[ITTL->size()-1] = ITTU->size()-2;
1159 if (ITTU->size() != np || ITTU->size() != np)
1161 G4Exception(
"G4PenelopeRayleighModel::InitializeSamplingAlgorithm()",
1163 "Problem in building the Limit Tables for Sampling: array dimensions do not match");
1171 for (
size_t i=0;i<np;i++)
1173 theTable->
AddPoint((*x)[i],(*PAC)[i],(*a)[i],(*b)[i],(*ITTL)[i],(*ITTU)[i]);
1178 G4cout <<
"*************************************************************************" <<
1180 G4cout <<
"Sampling table for Penelope Rayleigh scattering in " << mat->
GetName() <<
G4endl;
std::ostringstream G4ExceptionDescription
G4double GetFSquared(const G4Material *, const G4double)
G4GLOB_DLL std::ostream G4cout
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
static const G4double factor
void AddPoint(G4double x0, G4double pac0, G4double a0, G4double b0, size_t ITTL0, size_t ITTU0)
const G4String & GetName() const
G4DataVector logQSquareGrid
std::map< const G4Material *, G4PenelopeSamplingData * > * samplingTable