Geant4简介
Geant4是蒙卡工具包,模拟很多粒子,记录一些统计量,用这些统计量去估计真实的物理实验的结果。蒙卡模拟程序,从最老的MCNP,到PENELOPE,FLUKA等。
MCNP是用输入卡片(输入文件)实现的,在一张输入卡上填好几何、源等设置信息,直接运行一个已编译好的程序,就能读输入文件,实现模拟。
Geant4的不同之处在于提供的不是一个编译好的程序而是工具包,工具包可理解为第三方库如OPENCV,通过自己编程调用这个工具包来实现自己需要的模拟。为了便于大家使用,Geant4用C++编写,因为C++有继承等特性,可以让使用过程相对简单。虽说Geant4是一个相当复杂的系统,源代码有上百万、上千万行,但是对于大多数应用来说,只需了解可能不到1%的部分,那些复杂的东西大家日后用到的时候自学就行。
Geant4培训
预期受众:未来安全兴趣团队同学,大二大三本科生,之前未接触过G4工具包
培训出发点:系内无Geant4的课程,科研、毕设中却很可能用到
培训目标:简单的入门,让大家上手会用,不怕遇到问题。
完成一个例子的编译运行
下面给大家演示一下,运行、编译一个例子的过程。使用的例子是B2a不是B1,B1大家基本上都用过。此例程为Geant4安装自带。
B2a的文件夹位置定义为\path-to-B2a\
1. 使用cmake生成编译所需要的文件和配置,第1行:源代码所在目录\path-to-B2a\,第2行:编译的位置,\path-to-B2a\build(新建)。点击Configure,done后点Generate,done后就完成了。
2. 打开\path-to-B2a\build,其中sln文件是visual studio用的工程,使用visual studio打开。
3. 在windows上无法使用visual studio自带的【Debug】功能进行调试,所以我们直接选【Release】,【生成解决方案】,来编译出我们需要的程序。
4. 编译结果在\path-to-B2a\build\Release,只有一个.exe文件。由于例子的运行需要一些.mac文件支持,我们回到\path-to-B2a\build,把.mac文件拷贝进去,结果如图。注意,运行程序有输入文件是常识,如果大家发现报错,一个常见原因就是没有把输入文件放进去。
5. 在\path-to-B2a\build\Release打开Power Shell,输入命令:
回车,就有了运行结果:
Geant4的最简例子
我们来看一个最简单的可运行的Geant4例程需要哪些代码。由于Geant4改版后,其例程还是稍显复杂,我们做了修改,在B1(Geant4自带)前又加了B0例子,源码在【资料库】里。编译好后,打开sln文件,在“exampleB0”处阅读代码。
首先我们看有主函数的代码文件:Source Files\exampleB0.cc 程序的入口点是main()函数,运行顺序是从上到下。
随机数生成器和种子:蒙特卡洛模拟本质上是随机实验,因此需要选择一个随机数发生器来决定粒子的径迹、行为等。Geant4提供了多种随机数生成器,一般选个默认的,如此处。如果对随机数和性能有特别高的要求,也可以选择其他随机数生成器。选择随机数生成器后,我们在调试时,需要2次模拟结果一模一样,控制方法就是把随机数发生器的种子人为确定下来,2次模拟的种子也一模一样。
RunManager:管理程序各种运行的基本的“管家”,把它new出来就行
设置模拟场景、几何:蒙卡模拟是对真实世界建模,放出一些粒子进行输运、反应等的过程,所以我们需要对想模拟的场景建一个几何模型。我们通过继承Geant4的一个类G4VUserDetectorConstruction建立自己的类B0DetectorConstruction, 在这个类中完成虚拟函数等,建立几何模型。
然后让runManager知道这个几何模型。
设置物理过程
Geant4涵盖的能量范围很广,从几eV,如DNA模拟、可见光光子模拟,到GeV,TeV这样的高能物理模拟,都有对应的物理模型,还可添加用户自定义的物理模型。因此,对于特定用途,我们只需要关注范围的一段,就可以选择合适的物理模型进行模拟。这里我们选择了内置的QBBC。下一行是设置它的可视化。
像模拟X射线、光子的作用时,当其能量特别低时,物理过程与几百keV时的过程截然不同。这样的低能物理模拟需要耗费特别长的时间而且可能带来各种各样问题,因此我们需要设置一个截断。在别的蒙卡程序里,一般是通过截断能量实现的,如低于1keV的光子/电子认为其能量就地沉积掉。Geant4使用截断长度(与截断能量有一个换算关系),这样能保证在不同材料中,模拟的几何精度是一致的。对于不同粒子,截断长度可设置成不同数值。
物理过程这样就设置好了,同样需要让run Manager知道。
设置用户自定义行为,如统计:接下来这三块RunAction, EventAction, StepAction涉及到的主要是粒子模拟过程中的统计,比如在某块区域沉积了多少能量/注量,等物理量的统计,以及高级技巧,如让粒子偏向于往某些方向走。三块都是通过继承一些类进行的用户自定义行为,每次定义完以后也要让runManager知道。
设置源:辐射模拟需要知道是什么样的源,发射什么样的粒子,通过这样一个Primary设置。设置完后也要让runManager知道。
初始化:我们把所有用户自定义行为设置完成后,需要告诉runManager所有初始化已经完成,可以开始模拟了。
(非必须)UI交互:G4不只提供编程功能,还可以通过一些文本输入命令的方式,控制它的一些粒子行为。下面这段通过UI交互方式进行,在编程里非必须,我们先跳过。
模拟的开始到结束:2代表我们在1次run里模拟2个初始粒子,以后大家肯定不止模拟2个,会多至1e7,1e8个之类,就在这里改。
完成了所有模拟后,我们就把runManager销毁掉。main函数也结束了。
C/C++编译过程简介
本部分是易错基础。
像C/C++这种编译型的语言,需要完成从源代码(.c)到可执行文件(.exe),这个流程分成两大步骤:【编译】,从.c这一人能读懂的高级语言翻译到.obj这一机器能读的语言。由于我们会把代码放在不同的.cpp里,也由于需要一些外部的库来帮助我们进行编程,因此会有一个【链接】的过程,把中间产物.obj整合调整,变成可执行的.exe。
3个常见错误
使用第三方库时的常见问题,在三个阶段都可能出现:
编译错误:如使用第三方库时,找不到"xxx.h"。原因是这些文件未放在你当前目录下,程序不知道去哪找。需要做一些设置来找到它。
链接错误,无法解析的外部符号,"xxx"未定义。原因是你引用了一些外部第三方库的函数,但是这些库的实现你没有告诉程序在哪。
运行错误:如双击exe程序运行时,弹出报错 缺少"xxx.dll"。原因是一些第三方库可能已经把程序编成了一个二进制形式放到某处,形成了一个动态链接库,但是你并没有告诉程序这些动态链接库在哪。
接下来在visual studio里讲这三个问题分别在哪里解决。在VS左侧找到exampleB0,右键,【属性】,打开exampleB0的属性页,【VC++目录】
对应的解决方法
问题解决(与上节序号对应):
设置【包含目录】(include),成功后能在上部框中找到。
"xxx"未定义——把.lib等静态链接库放进【库目录】;
另一方面,设置【附加依赖项】,静态链接库.lib也需要放全,这样【链接】时才知道去哪找。
设置【环境变量】,这对于windows和linux都差不多。把动态链接库.dll的位置都放进【环境变量】
报错怎么办?
报错是一个非常非常常见的情况!
自己先看提示,报的是什么错,自己尝试解决问题,可借助搜索引擎
自己解决不出去问别人,注意尽量提供全面的信息,如截图截完整(而不是只两行红字),以提高沟通效率和解决几率。尽量描述清自己在什么过程、什么步骤、遇到了什么样的错误
Q&A
Q: 种子里面的数代表什么意思?
A:随机数发生器是通过迭代的方式生成一个随机数序列,把这个数放进去就相当于告诉它从哪个数开始迭代,至于迭代算法大家不需要了解。数字无实际意义,但是保证两个随机数序列一样的充分不必要条件是保证两个随机数发生器的种子一样。
Q: 把vis.mac删掉后,它说找不到vis.mac;把vis.mac复制过去之后,它又说Qt library版本不相容,这个该怎么办呢?
A:首先,运行一个例子得看它readme文件里怎么说,如果它要求放vis.mac,就必须放进去。至于Qt版本不相容是安装出现了问题,再去看一下安装的问题吧~
Q:建一个新例子,应该手动把B0改成自己的工程名,还是有可以批量处理的规范方法呢?
A:工程名在cmakelist.txt中多处出现,cmakeList.txt的功能是告诉cmake如何生成【解决方案】,所以选择性地把这些地方改过来就相当于改工程名了,自己尝试一下,改完后重新cmake一般。
Q:在windows下编译效率如何?可以并行吗?
A:首先,windows VS的性能是取决于你的版本的,比如是企业版还是专业版、Community版。其次,windows也是可以多线程编译的,不过大家写的程序一般很小,不需要用到多线程。多线程可以通过修改VS的设置实现,类似问题大家可以去VS文件里找答案。
未来安全兴趣团队旨在为对“安全”这一主题感兴趣的同学提供一个宽泛的科研与交流平台。包括辐射成像、医学物理、辐射防护、核能安全、公共安全等众多学科方向。
文案 | 贾以涵
排版 | 胡家奇
-------------------------------------------
天工物华
欢迎关注天工物华
记录校园生活,与你一同走向未来