39 if (acc > 0.0) { fAcc = acc; }
40 if (f1 > 0.0 && f1 < 1.0) { fFactor1 = f1; }
41 if (f2 > 1.0 && f2 < 5.0) { fFactor2 = f2; }
42 if (de > 0.0) { fDelta = de; }
43 fMinDelta = (dmin <= de && dmin > 0.0) ? dmin : de;
44 fMaxDelta = (dmax > de) ? dmax : de;
46 G4cout <<
"### G4VSIntegration::InitialiseIntegrator: "
47 <<
"fAcc=" << fAcc <<
" fFact1=" << fFactor1
48 <<
" fFact2=" << fFactor2 <<
" dE=" << fDelta
49 <<
" dEmin=" << fMinDelta <<
" dEmax=" << fMaxDelta <<
G4endl;
57 if (emin >= emax) {
return res; }
63 nbin = std::max(nbin, 6);
73 G4cout <<
"### G4VSIntegration::ComputeIntegral: "
74 <<
"Pmax=" << fPmax <<
" Emin=" << emin
75 <<
" Emax=" << emax <<
" dE=" << edelta <<
" nbin=" << nbin
84 for (
G4int i=0; i<=nbin; ++i) {
94 G4cout <<
" " << i <<
". E=" << x <<
" prob=" << y
95 <<
" Edel=" << edelta <<
G4endl;
103 }
else if (!endpoint) {
106 if (y < fFactor1*fPmax) {
112 }
else if (y > fP1) {
118 }
else if (0.0 == fP2 && y < fFactor1*fP1) {
123 }
else if (0.0 < fP2 && y > fP2) {
124 if (y > fP1) { fP1 = y; }
130 G4double del = (y + problast)*edelta*0.5;
134 if ((del < fAcc*res && 0 < fP2) || endpoint) {
break; }
139 if (del > 0.8*res && 0.7*edelta > fMinDelta) {
141 }
else if (del < 0.1*res && 1.5*edelta < fMaxDelta) {
149 G4cout <<
"### G4VSIntegration::ComputeIntegral: "
150 <<
"I=" << res <<
" E1=" << fE1 <<
" E2=" << fE2
151 <<
" Pmax=" << fPmax <<
" P1=" << fP1 <<
" P2=" << fP2
161 if (fEmin >= fEmax) {
return fEmin; }
176 Q0 = std::max(Q0, Q4);
177 if (Q1 > 0.0) { Q1 = std::max(Q1, Q4); }
186 p1 = (fE2 - fEmin)*Q0;
191 if (Q2 > 0.0 && fE2 < fEmax) {
192 E3 = fEmax - 0.5*(fEmax - fE2);
194 Q2 = std::max(Q2, Q3);
195 Q3 = std::max(Q3, Q4);
197 p4 = (fEmax - E3)*Q3;
202 G4double del2 = (p2 > 0.0) ? (fE2 - fE1)/p2 : 0.0;
203 G4double del3 = (p3 > 0.0) ? (E3 - fE2)/p3 : 0.0;
204 G4double del4 = (p4 > 0.0) ? (fEmax - E3)/p4 : 0.0;
207 const G4int nmax = 100000;
209 for (
G4int n=0; n < nmax; ++n) {
216 }
else if (p <= p1 + p2) {
218 e = del2*(p - p1) + fE1;
220 }
else if (p <= p1 + p2 + p3) {
222 e = del3*(p - p1 - p2) + fE2;
226 e = del4*(p - p1 - p2 - p3) + E3;
230 if ((gg > gmax || n >= nmax) && fVerbose > 0) {
232 if (fnWarn < fWarnLimit) {
234 <<
" in area=" << idx <<
" n=" << n <<
" gg/gmax=" << gg/gmax
235 <<
" prob=" << gg <<
" gmax=" << gmax <<
G4endl;
236 G4cout <<
" E=" << e <<
" Emin=" << fEmin <<
" Emax=" << fEmax
237 <<
" E1=" << fE1 <<
" E2=" << fE2 <<
" E3=" << E3
238 <<
" F0=" << Q0 <<
" F1=" << Q1 <<
" F2=" << Q2 <<
" F3=" << Q3
239 <<
" F4=" << Q4 <<
G4endl;
242 if (gmax*rndm->
flat() <= gg) {
246 <<
" E=" << e <<
" Ntry=" << n
247 <<
" Emin=" << fEmin <<
" Emax=" << fEmax <<
G4endl;
254 e = fEmin + rndm->
flat()*(fE1 - fEmin);
258 <<
" E=" << e <<
" Ntry=" << nmax
259 <<
" Emin=" << fEmin <<
" Emax=" << fEmax <<
G4endl;