diff --git a/.clang-format b/.clang-format index 0ffa701..d54a9fb 100644 --- a/.clang-format +++ b/.clang-format @@ -80,21 +80,17 @@ IfMacros: - KJ_IF_MAYBE IncludeBlocks: Regroup IncludeCategories: - - Regex: '^' - Priority: 2 + - Regex: '^[<"].*\.h[>"]' + Priority: 0 SortPriority: 0 CaseSensitive: false - - Regex: '^<.*\.h>' + - Regex: '^[<"].*\.hh[>"]' Priority: 1 - SortPriority: 0 - CaseSensitive: false - - Regex: '^<.*' - Priority: 2 - SortPriority: 0 + SortPriority: 1 CaseSensitive: false - Regex: '.*' - Priority: 3 - SortPriority: 0 + Priority: 2 + SortPriority: 2 CaseSensitive: false IncludeIsMainRegex: '([-_](test|unittest))?$' IncludeIsMainSourceRegex: '' diff --git a/CMakeLists.txt b/CMakeLists.txt index 2533415..dc14bbb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,6 @@ add_executable(DESCSS main.cpp ${sources} ${headers}) target_link_libraries(DESCSS ${Geant4_LIBRARIES}) set(DESCSS_SCRIPTS - auto.mac vis.mac ) diff --git a/G4.code-workspace b/G4.code-workspace index 7493bdd..bf12ff8 100644 --- a/G4.code-workspace +++ b/G4.code-workspace @@ -6,7 +6,89 @@ ], "settings": { "files.associations": { - "*.icc": "cpp" + "*.icc": "cpp", + "algorithm": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "cfenv": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "complex": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "csetjmp": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "deque": "cpp", + "exception": "cpp", + "format": "cpp", + "forward_list": "cpp", + "fstream": "cpp", + "functional": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "list": "cpp", + "locale": "cpp", + "map": "cpp", + "memory": "cpp", + "mutex": "cpp", + "new": "cpp", + "numeric": "cpp", + "optional": "cpp", + "ostream": "cpp", + "queue": "cpp", + "ratio": "cpp", + "regex": "cpp", + "set": "cpp", + "sstream": "cpp", + "stack": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "string": "cpp", + "system_error": "cpp", + "thread": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "unordered_map": "cpp", + "utility": "cpp", + "vector": "cpp", + "xfacet": "cpp", + "xhash": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocbuf": "cpp", + "xlocinfo": "cpp", + "xlocmes": "cpp", + "xlocmon": "cpp", + "xlocnum": "cpp", + "xloctime": "cpp", + "xmemory": "cpp", + "xstddef": "cpp", + "xstring": "cpp", + "xtr1common": "cpp", + "xtree": "cpp", + "xutility": "cpp" } } } \ No newline at end of file diff --git a/README.md b/README.md index a368e32..51a15d8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,32 @@ # DESCSS Dose Estimation by Simulation of China Space Station -中国空间站模拟剂量评估 \ No newline at end of file +中国空间站模拟剂量评估 + +## 空间辐射环境 + +## 空间站结构 +1. 尺寸与分区[^1] +![](docs/size.webp) + +* 全长:16.6 m +* 分区: + * 大柱段 + * 外径:4.2 m + * 长度:4.32 + 2.40 m (生活控制舱 + 资源舱)(直线过渡) + * 过渡段:0.815 m + * 小柱端 + * 外径:2.8 m + * 长度:5.18 m + * 过渡段:0.33 m + * 节点舱 + * 长度:0.4 + 1.41 + 0.60 m + * 外径:2.13 + 2.8 + 1.22 m (球形过渡) + +2. 材料 +* 大柱段 + * 外壳:5系铝合金[^2],选用`0.4 Si`+`0.35 Fe`+`0.1 Cu`+`0.7 Mn`+`4.5 Mg`+`0.15 Cr`+`0.25 Zn`+`0.15 Ti`+`93.4 Al` + + +[^1]: [【知识点·航天】“天和”核心舱、“天宫”空间站和新一代载人飞船的最新知识点(干货版)](https://zhuanlan.zhihu.com/p/103709953) +[^2]: [中铝造为“天和”号核心舱披“铠甲”壮“筋骨”](https://m.thepaper.cn/baijiahao_12484370) \ No newline at end of file diff --git a/docs/size.webp b/docs/size.webp new file mode 100644 index 0000000..87f9efe Binary files /dev/null and b/docs/size.webp differ diff --git a/include/.gitkeep b/include/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/include/ActionInitialization.h b/include/ActionInitialization.h new file mode 100644 index 0000000..e7d1c31 --- /dev/null +++ b/include/ActionInitialization.h @@ -0,0 +1,14 @@ +#ifndef DESCSS_ActionInitialization_h +#define DESCSS_ActionInitialization_h + +#include "G4VUserActionInitialization.hh" + +class ActionInitialization : public G4VUserActionInitialization { +public: + ActionInitialization(); + ~ActionInitialization() override; + + void Build() const override; +}; + +#endif \ No newline at end of file diff --git a/include/DetectorConstruction.h b/include/DetectorConstruction.h new file mode 100644 index 0000000..0523303 --- /dev/null +++ b/include/DetectorConstruction.h @@ -0,0 +1,19 @@ +#ifndef DESCSS_DetectorConstruction_h +#define DESCSS_DetectorConstruction_h + +#include "G4VUserDetectorConstruction.hh" +#include "globals.hh" + + +class G4VPhysicalVolume; +class G4LogicalVolume; + +class DetectorConstruction : public G4VUserDetectorConstruction { +public: + DetectorConstruction(); + ~DetectorConstruction() override; + + G4VPhysicalVolume* Construct() override; +}; + +#endif diff --git a/include/Material.h b/include/Material.h new file mode 100644 index 0000000..dcdc66a --- /dev/null +++ b/include/Material.h @@ -0,0 +1,8 @@ +#ifndef DESCSS_Material_h +#define DESCSS_Material_h + +#include "G4Material.hh" + +void DefineMaterials(); + +#endif \ No newline at end of file diff --git a/include/PrimaryGeneratorAction.h b/include/PrimaryGeneratorAction.h new file mode 100644 index 0000000..41b8664 --- /dev/null +++ b/include/PrimaryGeneratorAction.h @@ -0,0 +1,23 @@ +#ifndef DESCSS_PrimaryGeneratorAction_h +#define DESCSS_PrimaryGeneratorAction_h + +#include "G4ParticleGun.hh" +#include "G4VUserPrimaryGeneratorAction.hh" +#include "globals.hh" + +class G4ParticleGun; +class G4Event; +class G4Box; + +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { +public: + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction(); + virtual void GeneratePrimaries(G4Event*); + const G4ParticleGun* GetParticleGun() const { return fParticleGun; } + +private: + G4ParticleGun* fParticleGun; +}; + +#endif diff --git a/main.cpp b/main.cpp index e69de29..f430ace 100644 --- a/main.cpp +++ b/main.cpp @@ -0,0 +1,40 @@ +#include "ActionInitialization.h" +#include "DetectorConstruction.h" +#include "PrimaryGeneratorAction.h" + +#include "G4MTRunManager.hh" +#include "G4ScoringManager.hh" +#include "G4UIExecutive.hh" +#include "G4UImanager.hh" +#include "G4VisExecutive.hh" +#include "QBBC.hh" + + +int main(int argc, char** argv) { + G4UIExecutive* ui = nullptr; + if (argc == 1) ui = new G4UIExecutive(argc, argv); + + G4MTRunManager* runManager = new G4MTRunManager; + G4VisExecutive* visManager = new G4VisExecutive; + G4UImanager* UIManager = G4UImanager::GetUIpointer(); + G4ScoringManager::GetScoringManager(); + + runManager->SetUserInitialization(new DetectorConstruction()); + runManager->SetUserInitialization(new QBBC); + runManager->SetUserInitialization(new ActionInitialization()); + + visManager->Initialize(); + if (!ui) { + G4String command = "/control/execute "; + G4String fileName = argv[1]; + UIManager->ApplyCommand(command + fileName); + } else { + UIManager->ApplyCommand("/control/execute vis.mac"); + ui->SessionStart(); + delete ui; + } + + delete runManager; + delete visManager; + return 0; +} \ No newline at end of file diff --git a/src/.gitkeep b/src/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/ActionInitialization.cpp b/src/ActionInitialization.cpp new file mode 100644 index 0000000..189dc72 --- /dev/null +++ b/src/ActionInitialization.cpp @@ -0,0 +1,8 @@ +#include "ActionInitialization.h" +#include "PrimaryGeneratorAction.h" + +ActionInitialization::ActionInitialization() {} + +ActionInitialization::~ActionInitialization() {} + +void ActionInitialization::Build() const { SetUserAction(new PrimaryGeneratorAction); } \ No newline at end of file diff --git a/src/DetectorConstruction.cpp b/src/DetectorConstruction.cpp new file mode 100644 index 0000000..07bd1be --- /dev/null +++ b/src/DetectorConstruction.cpp @@ -0,0 +1,35 @@ +#include "DetectorConstruction.h" +#include "Material.h" + +#include "G4Box.hh" +#include "G4LogicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4SystemOfUnits.hh" +#include "G4Tubs.hh" + +DetectorConstruction::DetectorConstruction() {} + +DetectorConstruction::~DetectorConstruction() {} + +G4VPhysicalVolume* DetectorConstruction::Construct() { + // Define materials + DefineMaterials(); + + // World + G4Box* solid_world = new G4Box("World", 3. * m, 3. * m, 10. * m); + G4LogicalVolume* logic_world = new G4LogicalVolume(solid_world, G4Material::GetMaterial("Vacuum"), "World"); + G4VPhysicalVolume* physics_world = new G4PVPlacement(0, G4ThreeVector(), logic_world, "World", 0, false, 0, true); + + // 大柱段 + // 生活控制舱 + G4double pRmin_big = 2.2 / 2 * m; + G4double pRmax_big = 4.2 / 2 * m; + G4double zLength = 4.32 * m; + G4ThreeVector pos1 = G4ThreeVector(0, 0, -(0.815 * m + zLength / 2)); + G4Tubs* solid_section_big_life = new G4Tubs("section_big_life", pRmin_big, pRmax_big, zLength / 2, 0, 360); + G4LogicalVolume* logic_section_big_life = new G4LogicalVolume( + solid_section_big_life, G4Material::GetMaterial("Aluminum alloy Series 5"), "section_big_life"); + new G4PVPlacement(0, pos1, logic_section_big_life, "section_big_life", logic_world, false, 0, true); + + return physics_world; +} diff --git a/src/Material.cpp b/src/Material.cpp new file mode 100644 index 0000000..acc1e01 --- /dev/null +++ b/src/Material.cpp @@ -0,0 +1,35 @@ +#include "Material.h" + +#include "G4Element.hh" +#include "G4NistManager.hh" +#include "G4PhysicalConstants.hh" +#include "G4SystemOfUnits.hh" + +void DefineMaterials() { + G4double a, z; // 摩尔质量, 原子序数 + G4int ncomponents, fractionmass; // 组分数, 质量分数 + G4double density, pressure, temperature; + + G4NistManager* nist = G4NistManager::Instance(); + + // 真空 + density = universe_mean_density; + pressure = 3.e-18 * pascal; + temperature = 2.73 * kelvin; + new G4Material("Vacuum", z = 1., a = 1.01 * g / mole, density, kStateGas, temperature, pressure); + + // 5系铝合金 0.4 Si + 0.35 Fe + 0.1 Cu + 0.7 Mn + 4.5 Mg + 0.15 Cr + 0.25 Zn + 0.15 Ti + 93.4 Al + density = 2.68 * g / cm3; + G4Material* Al_alloy_5 = new G4Material("Aluminum alloy Series 5", density, ncomponents = 9); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Si"), fractionmass = .4 * perCent); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Fe"), fractionmass = .35 * perCent); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Cu"), fractionmass = .1 * perCent); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Mn"), fractionmass = .7 * perCent); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Mg"), fractionmass = 4.5 * perCent); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Cr"), fractionmass = .15 * perCent); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Zn"), fractionmass = .25 * perCent); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Ti"), fractionmass = .15 * perCent); + Al_alloy_5->AddElement(nist->FindOrBuildElement("Al"), fractionmass = 93.4 * perCent); + + std::cout << *(G4Material::GetMaterialTable()) << std::endl; +} \ No newline at end of file diff --git a/src/PrimaryGeneratorAction.cpp b/src/PrimaryGeneratorAction.cpp new file mode 100644 index 0000000..35d4bf5 --- /dev/null +++ b/src/PrimaryGeneratorAction.cpp @@ -0,0 +1,18 @@ +#include "PrimaryGeneratorAction.h" + +#include "G4ParticleTable.hh" +#include "G4SystemOfUnits.hh" + +PrimaryGeneratorAction::PrimaryGeneratorAction() { + auto table = G4ParticleTable::GetParticleTable(); + + fParticleGun = new G4ParticleGun(1); + fParticleGun->SetParticleDefinition(table->FindParticle("gamma")); + fParticleGun->SetParticlePosition(G4ThreeVector(0, 0, 555. / 2 * mm)); + fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0, 0, -1)); + fParticleGun->SetParticleEnergy(1 * MeV); +} + +PrimaryGeneratorAction::~PrimaryGeneratorAction() { delete fParticleGun; } + +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* e) { fParticleGun->GeneratePrimaryVertex(e); } diff --git a/vis.mac b/vis.mac new file mode 100644 index 0000000..70cc493 --- /dev/null +++ b/vis.mac @@ -0,0 +1,41 @@ +# 多线程设置 +/run/numberOfThreads 1 + +# verbose +/control/saveHistory +/control/verbose 2 +/run/verbose 1 +/event/verbose 0 +/tracking/verbose 0 + +# 初始化 +/run/initialize + +# 设置视图,使用OpenGL +/vis/open OGL 800x800-0+0 + +# 禁止自动刷新,消息静音(除错误外) +/vis/viewer/set/autoRefresh false +/vis/verbose errors + +# 绘制几何体 +/vis/drawVolume + +# 绘制轨迹 类型为平滑 +/vis/scene/add/trajectories smooth +# 根据粒子ID进行绘制 +/vis/modeling/trajectories/create/drawByParticleID +# 以2px的宽度绘制节点 +/vis/modeling/trajectories/drawByParticleID-0/default/setDrawStepPts true +/vis/modeling/trajectories/drawByParticleID-0/default/setStepPtsSize 2 +# 保留、叠加所有事例 +/vis/scene/endOfEventAction accumulate + +# 设置颜色 +/vis/geometry/set/visibility World 0 false +/vis/geometry/set/colour section_big_life 0 0 0 1 .3 +/vis/viewer/set/style surface + +# 坐标轴 +/vis/scene/add/scale # Simple scale line +/vis/scene/add/axes # Simple axes: x=red, y=green, z=blue. \ No newline at end of file