File indexing completed on 2025-02-23 09:22:11
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include "PeriodicBoundaryBuilder.hh"
0028
0029 #include "LogicalVolumePeriodic.hh"
0030
0031 #include "G4Box.hh"
0032 #include "G4PVPlacement.hh"
0033 #include "G4SystemOfUnits.hh"
0034 #include "G4ThreeVector.hh"
0035 #include "G4VisAttributes.hh"
0036
0037
0038 G4LogicalVolume* PeriodicBoundaryBuilder::Construct(G4LogicalVolume* logical_world)
0039 {
0040 auto world = dynamic_cast<G4Box*>(logical_world->GetSolid());
0041
0042 if (world == nullptr) {
0043 G4ExceptionDescription ed;
0044 ed << " PeriodicBoundaryBuilder::Construct: "
0045 << " Unsupported period boundary for this solid : " << logical_world->GetName() << G4endl;
0046 G4Exception("G4PeriodicBoundaryProcess::G4PeriodicBoundaryProcess", "Builder01", FatalException,
0047 ed, "Unsupported period boundary for this solid");
0048 }
0049 G4double buffer = 0.01 * nanometer;
0050
0051 G4double periodic_world_hx = world->GetXHalfLength();
0052 G4double periodic_world_hy = world->GetYHalfLength();
0053 G4double periodic_world_hz = world->GetZHalfLength();
0054
0055 world->SetXHalfLength(world->GetXHalfLength() + buffer / 2);
0056 world->SetYHalfLength(world->GetYHalfLength() + buffer / 2);
0057 world->SetZHalfLength(world->GetZHalfLength() + buffer / 2);
0058
0059 auto* periodic_world = new G4Box("PBC", periodic_world_hx, periodic_world_hy, periodic_world_hz);
0060
0061 fLogicalPeriodic = new LogicalVolumePeriodic(periodic_world, logical_world->GetMaterial(), "PBC");
0062
0063 fLogicalPeriodic->SetVisAttributes(G4Color::Magenta());
0064
0065 new G4PVPlacement(nullptr, G4ThreeVector(), fLogicalPeriodic, "PBC", logical_world, false, 0,
0066 true);
0067
0068 return fLogicalPeriodic;
0069 }
0070