水タンクを作りたい(SetupTankVolume
)
スーパーカミオカンデ(直径39.3m、高さ41.4m)サイズの水タンクを配置します。
1G4LogicalVolume *SetupWaterTank()
2{
3 // パラメーター設定
4 G4String logical_name{"Tank"};
5 G4String material_name{"G4_WATER"};
6 G4double diameter{39.3 * m};
7 G4double height{41.4 * m};
8
9 // 形状を定義
10 G4double r_min{0. * cm}; // 底面の内径
11 G4double r_max{0.5 * diameter}; // 底面の外径
12 G4double half_z{0.5 * height}; // 円柱の高さ(の半分)
13 G4double s_phi{0. * deg}; // 円の角度(始点)
14 G4double d_phi{360. * deg}; // 円の角度(終点)
15 auto solid = new G4Tubs(
16 "TankSolid", // ソリッド名
17 r_min,
18 r_max,
19 half_z,
20 s_phi,
21 d_phi
22 );
23
24 // 材料を定義
25 auto nm = G4NistManager::Instance();
26 auto material = nm->FindOrBuild(material_name);
27
28 // 論理ボリュームを定義
29 auto logical = new G4LogicalVolume(
30 solid, // G4VSolid
31 material, // G4Material
32 logical_name, // 名前
33 )
34
35 // (オプション)ワイヤーフレームを着色
36 auto color = new G4VisAttributes(true, G4Colour(0., 0.5, 1.)); // 青系
37 logical->SetVisAttributes(color);
38
39 return logical;
40}
G4Tubs
で円柱を作成しました。
円柱の材料をG4_WATER
にしました。
水タンクの論理ボリュームができました。
水タンクを配置したい
1G4VPhysicalVolume* SetupVolumes()
2{
3 // Worldを準備する
4 auto world = SetupWorldVolume();
5 // Worldを配置する
6 auto theWorld = new G4PVPlacement{...};
7
8 // WaterTankを準備する
9 auto tank = SetupWaterTankVolume();
10
11 // タンクは縦置きにしたい
12 G4RotationMatrix rotation = G4RotationMatrix(0., 90.*deg, 0.);
13 G4ThreeVector direction = G4ThreeVector(0., 0., 0.);
14 G4Transform3D origin = G4Transform3D(rotation, direction);
15
16 new G4PVPlacement(
17 origin, // 子ボリュームの位置
18 tank, // 子ボリューム
19 "TankPhysical", // 名前
20 theWorld, // 親ボリューム
21 false, // no boolean operation
22 0, // G4int : copy number
23 true,
24 );
25
26 return theWorld;
27}
スーパーカミオカンデをイメージしているため、 水タンクを縦置きにしています。
G4RotationMatrix
でY軸方向に90度回転させました。
縦置きにするために、どの引数を変更すればよいか、
よくわからなかったので、コンパイル&実行して確認しながら調整しました。
ワールドの中心に配置したかったので、
G4ThreeVector
は原点のままにしています。