223 size_t length = pol.size();
225 size_t newlength =
fTwoJ2+1;
227 newPol.resize(newlength);
229 for(
size_t k2=0; k2<newlength; ++k2) {
230 (newPol[k2]).assign(k2+1, 0);
231 for(
size_t k1=0; k1<length; ++k1) {
232 for(
size_t k=0; k<=k1+k2; k+=2) {
238 for(
size_t kappa2=0; kappa2<=k2; ++kappa2) {
239 G4int ll = (pol[k1]).size();
240 for(
G4int kappa1 = 1 - ll; kappa1<ll; ++kappa1) {
241 if(k+k2<k1 || k+k1<k2)
continue;
243 conj((pol[k1])[-kappa1])*(kappa1 % 2 ? -1.: 1.) : (pol[k1])[kappa1];
244 if(std::abs(tmpAmp) <
kEps)
continue;
247 if(std::abs(tmpAmp) <
kEps)
continue;
252 if(std::abs(tF3) <
kEps)
break;
254 if(std::abs(tmpAmp) <
kEps)
continue;
255 tmpAmp *= ((kappa1+(
G4int)k1)%2 ? -1. : 1.)
256 * sqrt((2.*k+1.)*(2.*k1+1.)/(2.*k2+1.));
261 tmpAmp *= polar(1., phi*kappa);
263 (newPol[k2])[kappa2] += tmpAmp;
265 if(!recalcTF3 && std::abs(tF3) <
kEps)
break;
272 if(0.0 == newPol[0][0]) {
276 if(std::abs((newPol[0])[0].imag()) >
kEps) {
277 G4cout <<
"G4PolarizationTransition::UpdatePolarizationToFinalState WWARNING:" 278 <<
" P[0][0] has a non-zero imaginary part! Unpolarizing..." <<
G4endl;
284 size_t lastNonEmptyK2 = 0;
285 for(
size_t k2=0; k2<newlength; ++k2) {
286 G4int lastNonZero = -1;
287 for(
size_t kappa2=0; kappa2<(newPol[k2]).size(); ++kappa2) {
288 if(k2 == 0 && kappa2 == 0) {
292 if(std::abs((newPol[k2])[kappa2]) > 0.0) {
293 lastNonZero = kappa2;
294 (newPol[k2])[kappa2] /= (newPol[0])[0];
297 while((newPol[k2]).size() != size_t (lastNonZero+1)) (newPol[k2]).pop_back();
298 if((newPol[k2]).size() > 0) lastNonEmptyK2 = k2;
300 while(newPol.size() != lastNonEmptyK2+1) { newPol.pop_back(); }
301 (newPol[0])[0] = 1.0;
G4double GammaTransF3Coefficient(G4int K, G4int K2, G4int K1) const
std::vector< std::vector< G4complex > > POLAR
G4LegendrePolynomial fgLegendrePolys
std::complex< G4double > G4complex
G4GLOB_DLL std::ostream G4cout
void SetNuclearPolarization(G4NuclearPolarization *)
std::vector< std::vector< G4complex > > & GetPolarization()
G4double LnFactorial(int k) const
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
static G4double Wigner3J(G4double j1, G4double j2, G4double j3, G4double m1, G4double m2, G4double m3)
G4double EvalAssocLegendrePoly(G4int l, G4int m, G4double x)
G4NuclearPolarization * GetNuclearPolarization() const
static const G4double kEps
void SetPolarization(std::vector< std::vector< G4complex > > &p)