-
Notifications
You must be signed in to change notification settings - Fork 7
Open
Description
Geant4.jl currently has it's own implementation of physical units in Geant4.SystemOfUnits. It would be nice to integrate Geant4 with Unitful.jl since it's pretty much the standard for units in the Julia ecosystem.
We could define
using Unitfil
const g4length = u"mm"
const g4area = g4length^2
const g4volume = g4length^3
const g4time = u"ns"
const g4angle = u"rad"
const g4solidangle = u"sr"
const g4frequency = inv(g4time)
const g4charge = u"q"
const g4energy = u"MeV"
const g4mass = g4energy*g4time*g4time/(g4length*g4length) # Simplify?
const g4density = g4mass/g4volume
# Same for: power, force, pressure, current, epot, resistance, capacitance, flux, magnetic_field,
# inductance, temperature, amount, activity, dose, intensity, luminous_flux, illuminanceand maybe also convenience functions
asg4length(x::Unitful.Quantity{<:Real}) = ustrip(g4_length, x)
asg4area(x::Unitful.Quantity{<:Real}) = ustrip(g4area, x)
asg4volume(x::Unitful.Quantity{<:Real}) = ustrip(g4volume, x)
asg4time(x::Unitful.Quantity{<:Real}) = ustrip(g4time, x)
asg4angle(x::Unitful.Quantity{<:Real}) = ustrip(g4angle, x)
asg4solidangle(x::Unitful.Quantity{<:Real}) = ustrip(g4solidangle, x)
asg4frequency(x::Unitful.Quantity{<:Real}) = ustrip(g4frequency, x)
asg4charge(x::Unitful.Quantity{<:Real}) = ustrip(g4charge, x)
asg4energy(x::Unitful.Quantity{<:Real}) = ustrip(g4energy, x)
asg4mass(x::Unitful.Quantity{<:Real}) = ustrip(g4mass, x)
asg4density(x::Unitful.Quantity{<:Real}) = ustrip(g4density, x)
# ...
asg4length(x::Real) = x
asg4area(x::Real) = x
asg4volume(x::Real) = x
asg4time(x::Real) = x
asg4angle(x::Real) = x
asg4solidangle(x::Real) = x
asg4frequency(x::Real) = x
asg4charge(x::Real) = x
asg4energy(x::Real) = x
asg4mass(x::Real) = x
asg4mass(x::Real) = x
# ...That way, we could use generic code like
const G4RealQuantity{T<:Real} = Union{T,Unitful.Quantity{<:T}}
G4Material(name::String; #=...=#, density::G4RealQuantity, #=...=#) = #=...=# asg4density(density) #=...=#in "G4JLInterface.jl". Users could then write either
using Unitful
G4Material("quartz", density=2.200*u"g/cm^3", ncomponents=2)or
using Geant4.SystemOfUnits: g, cm
G4Material("quartz", density=2.200g/cm3, ncomponents=2)or use unitless numbers directly
using Geant4.SystemOfUnits: g, cm
G4Material("quartz", density=1.3731319963813677e19, ncomponents=2)Or should we try to replace Geant4.SystemOfUnits by Unitful (aliases) completely?
@giordano, you have a lot of experience with Unitful.jl and derived packages, do you think the design above goes in the right direction?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels