Message: Re: CLHEP unit definitions Not Logged In (login)
 Next-in-Thread Next-in-Thread
 Next-in-Forum Next-in-Forum

None Re: CLHEP unit definitions 

Forum: Documentation and Examples
Re: Question CLHEP unit definitions (Adam Glaser)
Re: None Re: CLHEP unit definitions (michel maire)
Date: 06 Nov, 2012
From: Michael H. Kelsey <Michael H. Kelsey>

On Mon, 05 Nov 2012 18:04:44 GMT, michel maire wrote:
> On Mon, 05 Nov 2012 13:39:28 GMT, Adam Glaser wrote:
> > Does anyone have experience adding unit definitions to CLHEP? I am
> > simply trying to add inverse length units which would be very simply
> > converted to length units after being inverted. I have added my unit
> > definitions, but for some reason the inversion calculation is not being
> > performed correctly.
> > 
> > i.e., For my inverse cm unit (icm), I am saying that icm=1./cm where
> > cm=10*mm. But what is happening is my unit is being converted to mm by
> > just multiplying what is entered by 1/10, instead of actually being
> > inverted. So GEANT4 is computing 5 icm as 0.5 cm, instead of 0.2 cm.
> 
>   Somewhere in your application, you must define something like:
>   new G4UnitDefinition("inverse_cm","1/cm" ,"inverseLength",1./cm);
> 
>   The category "inverseLength" will be automatically created
> 
> > 
> > Essentially what I am trying to do is analogous to converting hertz to
> > seconds. I checked the functionality and it seems that the same problem
> > occurs for converted hertz, i.e. it is not properly inverting the value
> > entered for hertz to seconds.
> 
>  The categories "Time" and "Frequency" are already defined and work well (as far as know ...)
>  See G4UnitsDefinition.cc in source/global/management or tape /units/list

The file of interest is actually G4UnitsTable.cc, with the class G4UnitDefinition implemented there.

So long as the whole family of inverse units are defined, this should treat everything properly.

    const G4double inv_cm = 1./cm;        // Define some attenuation units
    const G4double inv_m  = 1./m;
    const G4double inv_mm = 1./mm;

    G4double attenCoeff = 50.*inv_cm;     // And a particular attenuation

    assert(attenCoeff == 5000.*inv_m);
    assert(1./attenCoeff == 0.02*cm);

Notice in the last case, it is still up to the _user_ to do the correct inversion; the numbers are different, so the conversion doesn't just happen magically:

    assert(attenCoeff/cm == 0.02);        // This FAILS and aborts the job

"cm" is just a double, and so is "attenCoeff". The division operator doesn't know that it is supposed to also take the reciprocal of attenCoeff; that's up to the user.

      -- Michael Kelsey

 Add Message Add Message
to: "Re: CLHEP unit definitions"

 Subscribe Subscribe

This site runs SLAC HyperNews version 1.11-slac-98, derived from the original HyperNews


[ Geant 4 Home | Geant 4 HyperNews | Search | Request New Forum | Feedback ]