File indexing completed on 2026-09-12 08:30:28
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
0028
0029 #include "PeriodicBoundaryBuilder.hh"
0030
0031 #include "LogicalVolumePeriodic.hh"
0032
0033 #include "G4Box.hh"
0034 #include "G4PVPlacement.hh"
0035 #include "G4SystemOfUnits.hh"
0036 #include "G4ThreeVector.hh"
0037 #include "G4VisAttributes.hh"
0038
0039
0040 G4LogicalVolume* PeriodicBoundaryBuilder::Construct(G4LogicalVolume* logical_world)
0041 {
0042 auto world = dynamic_cast<G4Box*>(logical_world->GetSolid());
0043
0044 if (world == nullptr) {
0045 G4ExceptionDescription ed;
0046 ed << " PeriodicBoundaryBuilder::Construct: "
0047 << " Unsupported period boundary for this solid : " << logical_world->GetName() << G4endl;
0048 G4Exception("G4PeriodicBoundaryProcess::G4PeriodicBoundaryProcess", "Builder01", FatalException,
0049 ed, "Unsupported period boundary for this solid");
0050 }
0051 G4double buffer = 0.01 * nanometer;
0052
0053 G4double periodic_world_hx = world->GetXHalfLength();
0054 G4double periodic_world_hy = world->GetYHalfLength();
0055 G4double periodic_world_hz = world->GetZHalfLength();
0056
0057 world->SetXHalfLength(world->GetXHalfLength() + buffer / 2);
0058 world->SetYHalfLength(world->GetYHalfLength() + buffer / 2);
0059 world->SetZHalfLength(world->GetZHalfLength() + buffer / 2);
0060
0061 auto* periodic_world = new G4Box("PBC", periodic_world_hx, periodic_world_hy, periodic_world_hz);
0062
0063 fLogicalPeriodic = new LogicalVolumePeriodic(periodic_world, logical_world->GetMaterial(), "PBC");
0064
0065 fLogicalPeriodic->SetVisAttributes(G4Color::Magenta());
0066
0067 new G4PVPlacement(nullptr, G4ThreeVector(), fLogicalPeriodic, "PBC", logical_world, false, 0,
0068 true);
0069
0070 return fLogicalPeriodic;
0071 }
0072