Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4QMDGroundStateNucleus.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// 081024 G4NucleiPropertiesTable:: to G4NucleiProperties::
27//
29
30#include "G4NucleiProperties.hh"
31
32#include "G4Proton.hh"
33#include "G4Neutron.hh"
34
36#include "Randomize.hh"
37
39: r00 ( 1.124 ) // radius parameter for Woods-Saxon [fm]
40, r01 ( 0.5 ) // radius parameter for Woods-Saxon
41, saa ( 0.2 ) // diffuse parameter for initial Woods-Saxon shape
42, rada ( 0.9 ) // cutoff parameter
43, radb ( 0.3 ) // cutoff parameter
44, dsam ( 1.5 ) // minimum distance for same particle [fm]
45, ddif ( 1.0 ) // minimum distance for different particle
46, epse ( 0.000001 ) // torelance for energy in [GeV]
47{
48
49 //std::cout << " G4QMDGroundStateNucleus( G4int z , G4int a ) Begin " << z << " " << a << std::endl;
50
51 if ( z == 1 && a == 1 ) // Hydrogen Case or proton primary
52 {
54 return;
55 }
56 else if ( z == 0 && a == 1 ) // Neutron primary
57 {
59 return;
60 }
61
62 dsam2 = dsam*dsam;
63 ddif2 = ddif*ddif;
64
66
67 hbc = parameters->Get_hbc();
68 gamm = parameters->Get_gamm();
69 cpw = parameters->Get_cpw();
70 cph = parameters->Get_cph();
71 epsx = parameters->Get_epsx();
72 cpc = parameters->Get_cpc();
73
74 cdp = parameters->Get_cdp();
75 c0p = parameters->Get_c0p();
76 c3p = parameters->Get_c3p();
77 csp = parameters->Get_csp();
78 clp = parameters->Get_clp();
79
80 edepth = 0.0;
81
82 for ( int i = 0 ; i < a ; i++ )
83 {
84
86
87 if ( i < z )
88 {
89 pd = G4Proton::Proton();
90 }
91 else
92 {
93 pd = G4Neutron::Neutron();
94 }
95
96 G4ThreeVector p( 0.0 );
97 G4ThreeVector r( 0.0 );
98 G4QMDParticipant* aParticipant = new G4QMDParticipant( pd , p , r );
99 SetParticipant( aParticipant );
100
101 }
102
103 G4double radious = r00 * std::pow ( double ( GetMassNumber() ) , 1.0/3.0 );
104
105 rt00 = radious - r01;
106 radm = radious - rada * ( gamm - 1.0 ) + radb;
107 rmax = 1.0 / ( 1.0 + std::exp ( -rt00/saa ) );
108
109 maxTrial = 1000;
110 meanfield = new G4QMDMeanField();
111 meanfield->SetSystem( this );
112
113 //std::cout << "G4QMDGroundStateNucleus( G4int z , G4int a ) packNucleons Begin ( z , a ) ( " << z << ", " << a << " )" << std::endl;
114 packNucleons();
115 //std::cout << "G4QMDGroundStateNucleus( G4int z , G4int a ) packNucleons End" << std::endl;
116
117 delete meanfield;
118
119}
120
121
122
123void G4QMDGroundStateNucleus::packNucleons()
124{
125
126 //std::cout << "G4QMDGroundStateNucleus::packNucleons" << std::endl;
127
129
130 G4double ebin00 = ebini * 0.001;
131
132 G4double ebin0 = 0.0;
133 G4double ebin1 = 0.0;
134
135 if ( GetMassNumber() != 4 )
136 {
137 ebin0 = ( ebini - 0.5 ) * 0.001;
138 ebin1 = ( ebini + 0.5 ) * 0.001;
139 }
140 else
141 {
142 ebin0 = ( ebini - 1.5 ) * 0.001;
143 ebin1 = ( ebini + 1.5 ) * 0.001;
144 }
145
146{
147 G4int n0Try = 0;
148 G4bool isThisOK = false;
149 while ( n0Try < maxTrial )
150 {
151 n0Try++;
152 //std::cout << "TKDB packNucleons n0Try " << n0Try << std::endl;
153
154// Sampling Position
155
156 //std::cout << "TKDB Sampling Position " << std::endl;
157
158 G4bool areThesePsOK = false;
159 G4int npTry = 0;
160 while ( npTry < maxTrial )
161 {
162 //std::cout << "TKDB Sampling Position npTry " << npTry << std::endl;
163 npTry++;
164 G4int i = 0;
165 if ( samplingPosition( i ) )
166 {
167 //std::cout << "packNucleons samplingPosition 0 succeed " << std::endl;
168 for ( i = 1 ; i < GetMassNumber() ; i++ )
169 {
170 //std::cout << "packNucleons samplingPosition " << i << " trying " << std::endl;
171 if ( !( samplingPosition( i ) ) )
172 {
173 //std::cout << "packNucleons samplingPosition " << i << " failed" << std::endl;
174 break;
175 }
176 }
177 if ( i == GetMassNumber() )
178 {
179 //std::cout << "packNucleons samplingPosition all scucceed " << std::endl;
180 areThesePsOK = true;
181 break;
182 }
183 }
184 }
185 if ( areThesePsOK == false ) continue;
186
187 //std::cout << "TKDB Sampling Position End" << std::endl;
188
189// Calculate Two-body quantities
190
191 meanfield->Cal2BodyQuantities();
192 std::vector< G4double > rho_a ( GetMassNumber() , 0.0 );
193 std::vector< G4double > rho_s ( GetMassNumber() , 0.0 );
194 std::vector< G4double > rho_c ( GetMassNumber() , 0.0 );
195
196 rho_l.resize ( GetMassNumber() , 0.0 );
197 d_pot.resize ( GetMassNumber() , 0.0 );
198
199 for ( G4int i = 0 ; i < GetMassNumber() ; i++ )
200 {
201 for ( G4int j = 0 ; j < GetMassNumber() ; j++ )
202 {
203
204 rho_a[ i ] += meanfield->GetRHA( j , i );
205 G4int k = 0;
206 if ( participants[j]->GetDefinition() != participants[i]->GetDefinition() )
207 {
208 k = 1;
209 }
210
211 rho_s[ i ] += meanfield->GetRHA( j , i )*( 1.0 - 2.0 * k ); // OK?
212
213 rho_c[ i ] += meanfield->GetRHE( j , i );
214 }
215
216 }
217
218 for ( G4int i = 0 ; i < GetMassNumber() ; i++ )
219 {
220 rho_l[i] = cdp * ( rho_a[i] + 1.0 );
221 d_pot[i] = c0p * rho_a[i]
222 + c3p * std::pow ( rho_a[i] , gamm )
223 + csp * rho_s[i]
224 + clp * rho_c[i];
225
226 //std::cout << "d_pot[i] " << i << " " << d_pot[i] << std::endl;
227 }
228
229
230// Sampling Momentum
231
232 //std::cout << "TKDB Sampling Momentum " << std::endl;
233
234 phase_g.clear();
235 phase_g.resize( GetMassNumber() , 0.0 );
236
237 //std::cout << "TKDB Sampling Momentum 1st " << std::endl;
238 G4bool isThis1stMOK = false;
239 G4int nmTry = 0;
240 while ( nmTry < maxTrial )
241 {
242 nmTry++;
243 G4int i = 0;
244 if ( samplingMomentum( i ) )
245 {
246 isThis1stMOK = true;
247 break;
248 }
249 }
250 if ( isThis1stMOK == false ) continue;
251
252 //std::cout << "TKDB Sampling Momentum 2nd so on" << std::endl;
253
254 G4bool areTheseMsOK = true;
255 nmTry = 0;
256 while ( nmTry < maxTrial )
257 {
258 nmTry++;
259 G4int i = 0;
260 for ( i = 1 ; i < GetMassNumber() ; i++ )
261 {
262 //std::cout << "TKDB packNucleons samplingMomentum try " << i << std::endl;
263 if ( !( samplingMomentum( i ) ) )
264 {
265 //std::cout << "TKDB packNucleons samplingMomentum " << i << " failed" << std::endl;
266 areTheseMsOK = false;
267 break;
268 }
269 }
270 if ( i == GetMassNumber() )
271 {
272 areTheseMsOK = true;
273 }
274
275 break;
276 }
277 if ( areTheseMsOK == false ) continue;
278
279// Kill Angluar Momentum
280
281 //std::cout << "TKDB Sampling Kill Angluar Momentum " << std::endl;
282
283 killCMMotionAndAngularM();
284
285
286// Check Binding Energy
287
288 //std::cout << "packNucleons Check Binding Energy Begin " << std::endl;
289
290 G4double ekinal = 0.0;
291 for ( int i = 0 ; i < GetMassNumber() ; i++ )
292 {
293 ekinal += participants[i]->GetKineticEnergy();
294 }
295
296 meanfield->Cal2BodyQuantities();
297
298 G4double totalPotentialE = meanfield->GetTotalPotential();
299 G4double ebinal = ( totalPotentialE + ekinal ) / double ( GetMassNumber() );
300
301 //std::cout << "packNucleons totalPotentialE " << totalPotentialE << std::endl;
302 //std::cout << "packNucleons ebinal " << ebinal << std::endl;
303 //std::cout << "packNucleons ekinal " << ekinal << std::endl;
304
305 if ( ebinal < ebin0 || ebinal > ebin1 )
306 {
307 //std::cout << "packNucleons ebin0 " << ebin0 << std::endl;
308 //std::cout << "packNucleons ebin1 " << ebin1 << std::endl;
309 //std::cout << "packNucleons ebinal " << ebinal << std::endl;
310 //std::cout << "packNucleons Check Binding Energy Failed " << std::endl;
311 continue;
312 }
313
314 //std::cout << "packNucleons Check Binding Energy End = OK " << std::endl;
315
316
317// Energy Adujstment
318
319 G4double dtc = 1.0;
320 G4double frg = -0.1;
321 G4double rdf0 = 0.5;
322
323 G4double edif0 = ebinal - ebin00;
324
325 G4double cfrc = 0.0;
326 if ( 0 < edif0 )
327 {
328 cfrc = frg;
329 }
330 else
331 {
332 cfrc = -frg;
333 }
334
335 G4int ifrc = 1;
336
337 G4int neaTry = 0;
338
339 G4bool isThisEAOK = false;
340 while ( neaTry < maxTrial )
341 {
342 neaTry++;
343
344 G4double edif = ebinal - ebin00;
345
346 //std::cout << "TKDB edif " << edif << std::endl;
347 if ( std::abs ( edif ) < epse )
348 {
349
350 isThisEAOK = true;
351 //std::cout << "isThisEAOK " << isThisEAOK << std::endl;
352 break;
353 }
354
355 G4int jfrc = 0;
356 if ( edif < 0.0 )
357 {
358 jfrc = 1;
359 }
360 else
361 {
362 jfrc = -1;
363 }
364
365 if ( jfrc != ifrc )
366 {
367 cfrc = -rdf0 * cfrc;
368 dtc = rdf0 * dtc;
369 }
370
371 if ( jfrc == ifrc && std::abs( edif0 ) < std::abs( edif ) )
372 {
373 cfrc = -rdf0 * cfrc;
374 dtc = rdf0 * dtc;
375 }
376
377 ifrc = jfrc;
378 edif0 = edif;
379
380 meanfield->CalGraduate();
381
382 for ( int i = 0 ; i < GetMassNumber() ; i++ )
383 {
384 G4ThreeVector ri = participants[i]->GetPosition();
385 G4ThreeVector p_i = participants[i]->GetMomentum();
386
387 ri += dtc * ( meanfield->GetFFr(i) - cfrc * ( meanfield->GetFFp(i) ) );
388 p_i += dtc * ( meanfield->GetFFp(i) + cfrc * ( meanfield->GetFFr(i) ) );
389
390 participants[i]->SetPosition( ri );
391 participants[i]->SetMomentum( p_i );
392 }
393
394 ekinal = 0.0;
395
396 for ( int i = 0 ; i < GetMassNumber() ; i++ )
397 {
398 ekinal += participants[i]->GetKineticEnergy();
399 }
400
401 meanfield->Cal2BodyQuantities();
402 totalPotentialE = meanfield->GetTotalPotential();
403
404 ebinal = ( totalPotentialE + ekinal ) / double ( GetMassNumber() );
405
406 }
407 //std::cout << "isThisEAOK " << isThisEAOK << std::endl;
408 if ( isThisEAOK == false ) continue;
409
410 isThisOK = true;
411 //std::cout << "isThisOK " << isThisOK << std::endl;
412 break;
413
414 }
415
416 if ( isThisOK == false )
417 {
418 std::cout << "GroundStateNucleus state cannot be created. Try again with another parameters." << std::endl;
419 }
420
421 //std::cout << "packNucleons End" << std::endl;
422 return;
423
424}
425
426
427
428
429
430// Start packing
431// position
432
433 G4int n0Try = 0;
434
435 while ( n0Try < maxTrial )
436 {
437 if ( samplingPosition( 0 ) )
438 {
439 G4int i = 0;
440 for ( i = 1 ; i < GetMassNumber() ; i++ )
441 {
442 if ( !( samplingPosition( i ) ) )
443 {
444 break;
445 }
446 }
447 if ( i == GetMassNumber() ) break;
448 }
449 n0Try++;
450 }
451
452 if ( n0Try > maxTrial )
453 {
454 std::cout << "GroundStateNucleus state cannot be created. Try again with another parameters." << std::endl;
455 return;
456 }
457
458 meanfield->Cal2BodyQuantities();
459 std::vector< G4double > rho_a ( GetMassNumber() , 0.0 );
460 std::vector< G4double > rho_s ( GetMassNumber() , 0.0 );
461 std::vector< G4double > rho_c ( GetMassNumber() , 0.0 );
462
463 rho_l.resize ( GetMassNumber() , 0.0 );
464 d_pot.resize ( GetMassNumber() , 0.0 );
465
466 for ( int i = 0 ; i < GetMassNumber() ; i++ )
467 {
468 for ( int j = 0 ; j < GetMassNumber() ; j++ )
469 {
470
471 rho_a[ i ] += meanfield->GetRHA( j , i );
472 G4int k = 0;
473 if ( participants[i]->GetDefinition() != participants[i]->GetDefinition() )
474 {
475 k = 1;
476 }
477
478 rho_s[ i ] += meanfield->GetRHA( j , i )*( 1.0 - 2.0 * k ); // OK?
479
480 rho_c[ i ] += meanfield->GetRHE( j , i );
481 }
482 }
483
484 for ( int i = 0 ; i < GetMassNumber() ; i++ )
485 {
486 rho_l[i] = cdp * ( rho_a[i] + 1.0 );
487 d_pot[i] = c0p * rho_a[i]
488 + c3p * std::pow ( rho_a[i] , gamm )
489 + csp * rho_s[i]
490 + clp * rho_c[i];
491 }
492
493
494
495
496
497
498// momentum
499
500 phase_g.resize( GetMassNumber() , 0.0 );
501
502 //G4int i = 0;
503 samplingMomentum( 0 );
504
505 G4int n1Try = 0;
506 //G4int maxTry = 1000;
507
508 while ( n1Try < maxTrial )
509 {
510 if ( samplingPosition( 0 ) )
511 {
512 G4int i = 0;
513 G4bool isThisOK = true;
514 for ( i = 1 ; i < GetMassNumber() ; i++ )
515 {
516 if ( !( samplingMomentum( i ) ) )
517 {
518 isThisOK = false;
519 break;
520 }
521 }
522 if ( isThisOK == true ) break;
523 //if ( i == GetMassNumber() ) break;
524 }
525 n1Try++;
526 }
527
528 if ( n1Try > maxTrial )
529 {
530 std::cout << "GroundStateNucleus state cannot be created. Try again with another parameters." << std::endl;
531 return;
532 }
533
534//
535
536// Shift nucleus to thier CM frame and kill angular momentum
537 killCMMotionAndAngularM();
538
539// Check binding energy
540
541 G4double ekinal = 0.0;
542 for ( int i = 0 ; i < GetMassNumber() ; i++ )
543 {
544 ekinal += participants[i]->GetKineticEnergy();
545 }
546
547 meanfield->Cal2BodyQuantities();
548 G4double totalPotentialE = meanfield->GetTotalPotential();
549 G4double ebinal = ( totalPotentialE + ekinal ) / double ( GetMassNumber() );
550
551 if ( ebinal < ebin0 || ebinal > ebin1 )
552 {
553 // Retry From Position
554 }
555
556
557// Adjust by frictional cooling or heating
558
559 G4double dtc = 1.0;
560 G4double frg = -0.1;
561 G4double rdf0 = 0.5;
562
563 G4double edif0 = ebinal - ebin00;
564
565 G4double cfrc = 0.0;
566 if ( 0 < edif0 )
567 {
568 cfrc = frg;
569 }
570 else
571 {
572 cfrc = -frg;
573 }
574
575 G4int ifrc = 1;
576
577 G4int ntryACH = 0;
578
579 G4bool isThisOK = false;
580 while ( ntryACH < maxTrial )
581 {
582
583 G4double edif = ebinal - ebin00;
584 if ( std::abs ( edif ) < epse )
585 {
586 isThisOK = true;
587 break;
588 }
589
590 G4int jfrc = 0;
591 if ( edif < 0.0 )
592 {
593 jfrc = 1;
594 }
595 else
596 {
597 jfrc = -1;
598 }
599
600 if ( jfrc != ifrc )
601 {
602 cfrc = -rdf0 * cfrc;
603 dtc = rdf0 * dtc;
604 }
605
606 if ( jfrc == ifrc && std::abs( edif0 ) < std::abs( edif ) )
607 {
608 cfrc = -rdf0 * cfrc;
609 dtc = rdf0 * dtc;
610 }
611
612 ifrc = jfrc;
613 edif0 = edif;
614
615 meanfield->CalGraduate();
616
617 for ( int i = 0 ; i < GetMassNumber() ; i++ )
618 {
619 G4ThreeVector ri = participants[i]->GetPosition();
620 G4ThreeVector p_i = participants[i]->GetMomentum();
621
622 ri += dtc * ( meanfield->GetFFr(i) - cfrc * ( meanfield->GetFFp(i) ) );
623 p_i += dtc * ( meanfield->GetFFp(i) + cfrc * ( meanfield->GetFFr(i) ) );
624
625 participants[i]->SetPosition( ri );
626 participants[i]->SetMomentum( p_i );
627 }
628
629 ekinal = 0.0;
630
631 for ( int i = 0 ; i < GetMassNumber() ; i++ )
632 {
633 ekinal += participants[i]->GetKineticEnergy();
634 }
635
636 meanfield->Cal2BodyQuantities();
637 totalPotentialE = meanfield->GetTotalPotential();
638
639 ebinal = ( totalPotentialE + ekinal ) / double ( GetMassNumber() );
640
641
642 ntryACH++;
643 }
644
645 if ( isThisOK )
646 {
647 return;
648 }
649
650}
651
652
653G4bool G4QMDGroundStateNucleus::samplingPosition( G4int i )
654{
655
656 G4bool result = false;
657
658 G4int nTry = 0;
659
660 while ( nTry < maxTrial )
661 {
662
663 //std::cout << "samplingPosition i th particle, nTtry " << i << " " << nTry << std::endl;
664
665 G4double rwod = -1.0;
666 G4double rrr = 0.0;
667
668 G4double rx = 0.0;
669 G4double ry = 0.0;
670 G4double rz = 0.0;
671
672 while ( G4UniformRand() * rmax > rwod )
673 {
674
675 G4double rsqr = 10.0;
676 while ( rsqr > 1.0 )
677 {
678 rx = 1.0 - 2.0 * G4UniformRand();
679 ry = 1.0 - 2.0 * G4UniformRand();
680 rz = 1.0 - 2.0 * G4UniformRand();
681 rsqr = rx*rx + ry*ry + rz*rz;
682 }
683 rrr = radm * std::sqrt ( rsqr );
684 rwod = 1.0 / ( 1.0 + std::exp ( ( rrr - rt00 ) / saa ) );
685
686 }
687
688 participants[i]->SetPosition( G4ThreeVector( rx , ry , rz )*radm );
689
690 if ( i == 0 )
691 {
692 result = true;
693 return result;
694 }
695
696// i > 1 ( Second Particle or later )
697// Check Distance to others
698
699 G4bool isThisOK = true;
700 for ( G4int j = 0 ; j < i ; j++ )
701 {
702
703 G4double r2 = participants[j]->GetPosition().diff2( participants[i]->GetPosition() );
704 G4double dmin2 = 0.0;
705
706 if ( participants[j]->GetDefinition() == participants[i]->GetDefinition() )
707 {
708 dmin2 = dsam2;
709 }
710 else
711 {
712 dmin2 = ddif2;
713 }
714
715 //std::cout << "distance between j and i " << j << " " << i << " " << r2 << " " << dmin2 << std::endl;
716 if ( r2 < dmin2 )
717 {
718 isThisOK = false;
719 break;
720 }
721
722 }
723
724 if ( isThisOK == true )
725 {
726 result = true;
727 return result;
728 }
729
730 nTry++;
731
732 }
733
734// Here return "false"
735 return result;
736}
737
738
739
740G4bool G4QMDGroundStateNucleus::samplingMomentum( G4int i )
741{
742
743 //std::cout << "TKDB samplingMomentum for " << i << std::endl;
744
745 G4bool result = false;
746
747 G4double pfm = hbc * std::pow ( ( 3.0 / 2.0 * pi*pi * rho_l[i] ) , 1./3. );
748
749 if ( 10 < GetMassNumber() && -5.5 < ebini )
750 {
751 pfm = pfm * ( 1.0 + 0.2 * std::sqrt( std::abs( 8.0 + ebini ) / 8.0 ) );
752 }
753
754 //std::cout << "TKDB samplingMomentum pfm " << pfm << std::endl;
755
756 std::vector< G4double > phase;
757 phase.resize( i+1 ); // i start from 0
758
759 G4int ntry = 0;
760// 710
761 while ( ntry < maxTrial )
762 {
763
764 //std::cout << " TKDB ntry " << ntry << std::endl;
765 ntry++;
766
767 G4double ke = DBL_MAX;
768
769 G4int tkdb_i =0;
770// 700
771 while ( ke + d_pot [i] > edepth )
772 {
773
774 G4double psqr = 10.0;
775 G4double px = 0.0;
776 G4double py = 0.0;
777 G4double pz = 0.0;
778
779 while ( psqr > 1.0 )
780 {
781 px = 1.0 - 2.0*G4UniformRand();
782 py = 1.0 - 2.0*G4UniformRand();
783 pz = 1.0 - 2.0*G4UniformRand();
784
785 psqr = px*px + py*py + pz*pz;
786 }
787
788 G4ThreeVector p ( px , py , pz );
789 p = pfm * p;
790 participants[i]->SetMomentum( p );
791 G4LorentzVector p4 = participants[i]->Get4Momentum();
792 //ke = p4.e() - p4.restMass();
793 ke = participants[i]->GetKineticEnergy();
794
795
796 tkdb_i++;
797 if ( tkdb_i > maxTrial ) return result; // return false
798
799 }
800
801 //std::cout << "TKDB ke d_pot[i] " << ke << " " << d_pot[i] << std::endl;
802
803
804 if ( i == 0 )
805 {
806 result = true;
807 return result;
808 }
809
810 G4bool isThisOK = true;
811
812 // Check Pauli principle
813
814 phase[ i ] = 0.0;
815
816 //std::cout << "TKDB Check Pauli Principle " << i << std::endl;
817
818 for ( G4int j = 0 ; j < i ; j++ )
819 {
820 phase[ j ] = 0.0;
821 //std::cout << "TKDB Check Pauli Principle i , j " << i << " , " << j << std::endl;
822 G4double expa = 0.0;
823 if ( participants[j]->GetDefinition() == participants[i]->GetDefinition() )
824 {
825
826 expa = - meanfield->GetRR2(i,j) * cpw;
827
828 if ( expa > epsx )
829 {
830 G4ThreeVector p_i = participants[i]->GetMomentum();
831 G4ThreeVector pj = participants[j]->GetMomentum();
832 G4double dist2_p = p_i.diff2( pj );
833
834 dist2_p = dist2_p*cph;
835 expa = expa - dist2_p;
836
837 if ( expa > epsx )
838 {
839
840 phase[j] = std::exp ( expa );
841
842 if ( phase[j] * cpc > 0.2 )
843 {
844/*
845 std::cout << "TKDB Check Pauli Principle A i , j " << i << " , " << j << std::endl;
846 std::cout << "TKDB Check Pauli Principle phase[j] " << phase[j] << std::endl;
847 std::cout << "TKDB Check Pauli Principle phase[j]*cpc > 0.2 " << phase[j]*cpc << std::endl;
848*/
849 isThisOK = false;
850 break;
851 }
852 if ( ( phase_g[j] + phase[j] ) * cpc > 0.5 )
853 {
854/*
855 std::cout << "TKDB Check Pauli Principle B i , j " << i << " , " << j << std::endl;
856 std::cout << "TKDB Check Pauli Principle B phase_g[j] " << phase_g[j] << std::endl;
857 std::cout << "TKDB Check Pauli Principle B phase[j] " << phase[j] << std::endl;
858 std::cout << "TKDB Check Pauli Principle B phase_g[j] + phase[j] ) * cpc > 0.5 " << ( phase_g[j] + phase[j] ) * cpc << std::endl;
859*/
860 isThisOK = false;
861 break;
862 }
863
864 phase[i] += phase[j];
865 if ( phase[i] * cpc > 0.3 )
866 {
867/*
868 std::cout << "TKDB Check Pauli Principle C i , j " << i << " , " << j << std::endl;
869 std::cout << "TKDB Check Pauli Principle C phase[i] " << phase[i] << std::endl;
870 std::cout << "TKDB Check Pauli Principle C phase[i] * cpc > 0.3 " << phase[i] * cpc << std::endl;
871*/
872 isThisOK = false;
873 break;
874 }
875
876 //std::cout << "TKDB Check Pauli Principle OK i , j " << i << " , " << j << std::endl;
877
878 }
879 else
880 {
881 //std::cout << "TKDB Check Pauli Principle OK i , j " << i << " , " << j << std::endl;
882 }
883
884 }
885 else
886 {
887 //std::cout << "TKDB Check Pauli Principle OK i , j " << i << " , " << j << std::endl;
888 }
889
890 }
891 else
892 {
893 //std::cout << "TKDB Check Pauli Principle OK i , j " << i << " , " << j << std::endl;
894 }
895
896 }
897
898 if ( isThisOK == true )
899 {
900
901 phase_g[i] = phase[i];
902
903 for ( int j = 0 ; j < i ; j++ )
904 {
905 phase_g[j] += phase[j];
906 }
907
908 result = true;
909 return result;
910 }
911
912 }
913
914 return result;
915
916}
917
918
919
920void G4QMDGroundStateNucleus::killCMMotionAndAngularM()
921{
922
923// CalEnergyAndAngularMomentumInCM();
924
925 //std::vector< G4ThreeVector > p ( GetMassNumber() , 0.0 );
926 //std::vector< G4ThreeVector > r ( GetMassNumber() , 0.0 );
927
928// Move to cm system
929
930 G4ThreeVector pcm_tmp ( 0.0 );
931 G4ThreeVector rcm_tmp ( 0.0 );
932 G4double sumMass = 0.0;
933
934 for ( G4int i = 0 ; i < GetMassNumber() ; i++ )
935 {
936 pcm_tmp += participants[i]->GetMomentum();
937 rcm_tmp += participants[i]->GetPosition() * participants[i]->GetMass();
938 sumMass += participants[i]->GetMass();
939 }
940
941 pcm_tmp = pcm_tmp/GetMassNumber();
942 rcm_tmp = rcm_tmp/sumMass;
943
944 for ( G4int i = 0 ; i < GetMassNumber() ; i++ )
945 {
946 participants[i]->SetMomentum( participants[i]->GetMomentum() - pcm_tmp );
947 participants[i]->SetPosition( participants[i]->GetPosition() - rcm_tmp );
948 }
949
950// kill the angular momentum
951
952 G4ThreeVector ll ( 0.0 );
953 for ( G4int i = 0 ; i < GetMassNumber() ; i++ )
954 {
955 ll += participants[i]->GetPosition().cross ( participants[i]->GetMomentum() );
956 }
957
958 G4double rr[3][3];
959 G4double ss[3][3];
960 for ( G4int i = 0 ; i < 3 ; i++ )
961 {
962 for ( G4int j = 0 ; j < 3 ; j++ )
963 {
964 rr [i][j] = 0.0;
965
966 if ( i == j )
967 {
968 ss [i][j] = 1.0;
969 }
970 else
971 {
972 ss [i][j] = 0.0;
973 }
974 }
975 }
976
977 for ( G4int i = 0 ; i < GetMassNumber() ; i++ )
978 {
979 G4ThreeVector r = participants[i]->GetPosition();
980 rr[0][0] += r.y() * r.y() + r.z() * r.z();
981 rr[1][0] += - r.y() * r.x();
982 rr[2][0] += - r.z() * r.x();
983 rr[0][1] += - r.x() * r.y();
984 rr[1][1] += r.z() * r.z() + r.x() * r.x();
985 rr[2][1] += - r.z() * r.y();
986 rr[2][0] += - r.x() * r.z();
987 rr[2][1] += - r.y() * r.z();
988 rr[2][2] += r.x() * r.x() + r.y() * r.y();
989 }
990
991 for ( G4int i = 0 ; i < 3 ; i++ )
992 {
993 G4double x = rr [i][i];
994 for ( G4int j = 0 ; j < 3 ; j++ )
995 {
996 rr[i][j] = rr[i][j] / x;
997 ss[i][j] = ss[i][j] / x;
998 }
999 for ( G4int j = 0 ; j < 3 ; j++ )
1000 {
1001 if ( j != i )
1002 {
1003 G4double y = rr [j][i];
1004 for ( G4int k = 0 ; k < 3 ; k++ )
1005 {
1006 rr[j][k] += -y * rr[i][k];
1007 ss[j][k] += -y * ss[i][k];
1008 }
1009 }
1010 }
1011 }
1012
1013 G4double opl[3];
1014 G4double rll[3];
1015
1016 rll[0] = ll.x();
1017 rll[1] = ll.y();
1018 rll[2] = ll.z();
1019
1020 for ( G4int i = 0 ; i < 3 ; i++ )
1021 {
1022 opl[i] = 0.0;
1023
1024 for ( G4int j = 0 ; j < 3 ; j++ )
1025 {
1026 opl[i] += ss[i][j]*rll[j];
1027 }
1028 }
1029
1030 for ( G4int i = 0 ; i < GetMassNumber() ; i++ )
1031 {
1032 G4ThreeVector p_i = participants[i]->GetMomentum() ;
1033 G4ThreeVector ri = participants[i]->GetPosition() ;
1034 G4ThreeVector opl_v ( opl[0] , opl[1] , opl[2] );
1035
1036 p_i += ri.cross(opl_v);
1037
1038 participants[i]->SetMomentum( p_i );
1039 }
1040
1041}
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4UniformRand()
Definition: Randomize.hh:53
double z() const
double x() const
double diff2(const Hep3Vector &v) const
double y() const
Hep3Vector cross(const Hep3Vector &) const
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
static G4double GetBindingEnergy(const G4int A, const G4int Z)
static G4Proton * Proton()
Definition: G4Proton.cc:93
G4double GetTotalPotential()
G4double GetRHE(G4int i, G4int j)
void Cal2BodyQuantities()
G4ThreeVector GetFFr(G4int i)
G4double GetRHA(G4int i, G4int j)
void SetSystem(G4QMDSystem *aSystem)
G4double GetRR2(G4int i, G4int j)
G4ThreeVector GetFFp(G4int i)
G4int GetAtomicNumber()
Definition: G4QMDNucleus.cc:79
G4int GetMassNumber()
Definition: G4QMDNucleus.cc:62
G4double Get_clp()
G4double Get_cpc()
G4double Get_cdp()
G4double Get_epsx()
static G4QMDParameters * GetInstance()
G4double Get_hbc()
G4double Get_c0p()
G4double Get_gamm()
G4double Get_cpw()
G4double Get_c3p()
G4double Get_cph()
G4double Get_csp()
std::vector< G4QMDParticipant * > participants
Definition: G4QMDSystem.hh:72
void SetParticipant(G4QMDParticipant *particle)
Definition: G4QMDSystem.hh:51
#define DBL_MAX
Definition: templates.hh:83