Geant4单位系统
Geant 4 程序中,输⼊数据时必须指定其单位,这是所有Geant 4 代码都要遵循的规范,这使得代码与⽤户选择的单位系统⽆关。如果没有指定,这些数据将被认为使⽤G4系统内部的隐含单位,这将导致代码的移植性变差。
声明:除部分代码外,本⽂基本翻译⾃G4官⽅⽂件 Book for Application Developers. pdf
⼀、基本单位
Geant 4内核在内部使⽤⼀个统⼀的单位集合,其基于HepSystemOfUnits:
millimeter                  (mm)
nanosecond                  (ns)
Mega electron Volt          (MeV)
positron charge            (eplus)
degree Kelvin              (kelvin)
system的头文件
the amount of substance    (mole)
luminous intensity          (candela)
radian                      (radian)
steradian                  (steradian)
所有其他的单位都是有这些基本单位导出的。例如:
millimeter = mm = 1;
meter = m = 1000*mm;
...
m3 = m*m*m;
...
基本单位定义:source/global/management/include/SystemOfUnits.h,这个⽂件是CLHEP的⼀部分。此外,⽤户可以⾃由的改变内核所使⽤的单位系统。
⼆、输⼊数据
1. 如果数据来⾃于⼀个数组或外部⽂件,强烈推荐在读取数据的时候设置他们的单位。例如:
for (int j=0, j<jmax, j++) CrossSection[j] *= millibarn;
...
my calculations
...
2. 交互式命令:⼀些⽤户接⼝的内建命令也要求指定单位。例如:
/gun/energy 15.2 keV
/gun/position 3 2 -7 meter
三、输出数据
1. 以G4内部隐含单位输出数据:
G4out << stepSize << "mm";
2. 以⽤户规定的单位输出数据:
G4out << stepSize/cm << "cm";
3. 以最合适的单位输出数据:需要调⽤单位列表所在的头⽂件
#include "G4UnitsTable.hh"
G4out << G4BestUnit(stepSize, "Length");// Length is the category.
四、引⼊新的单位
1. 调⽤头⽂件,定义新的单位:
#include "SystemOfUnits.h"
static const G4double inch = 2.54*cm;
注:因为为将其加⼊到单位列表,所以需要定义静态全局常量。
2. ⽤户可以实例化⼀个 G4UnitDefinition 类的对象,这些对象在构造时由全局 G4UnitsTable 拥有,并且不能由⽤户删除。
#include "G4UnitsTable.hh"
#include "SystemOfUnits.h"
new G4UnitDefinition ( name, symbol, category, value );
例如:
#include "G4UnitsTable.hh"
#include "SystemOfUnits.h"
// add new units for dose
//
const G4double milligray = 1.e-3*gray;
new G4UnitDefinition("milligray", "milliGy" , "Dose", milligray);
// let G4 choose the most appropriate units
//
G4cout << G4BestUnit(dose,"Dose");
也可以定义复合单位,如速度:
new G4UnitDefinition ( "km/hour" , "km/h", "Speed", km/(3600*s) );
new G4UnitDefinition ( "meter/ns", "m/ns", "Speed", m/ns );
在 G4UnitsTable 中,"Speed" 类的单位缺省不存在,但是它将⾃动被建⽴。
G4UnitDefinition 类所在⽬录:source/global/management。
五、输出单位列表
⽤户可以使⽤静态函数 G4UnitDefinition::PrintUnitsTable() 输出单位列表,或者使⽤交互式命令, /units/list 。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。