|Message: Re: CLHEP unit definitions||Not Logged In (login)|
Click on the Forum title, e.g. on the "Forums by Category" page, to read a sequence of postings to the Forum and its threads all in one page. If you are only interested in one thread or the thread following a specific posting, click the thread or the posting, which takes you to a smaller page, which contains only the part you are interested in and may be easier to navigate.
Messages are "chained" if there are only replies at the first level, i.e. 1/1.html, 1/1/1.html etc. In case of "chained" messages the message number is replaced by the icon and there is no indentation.
Inline: Display the subject line only or also the text of the posting(s); for the choice "All" the "Outline" choices are switched off.
|1||0||1||no text / full text of posting|
|2||1||All||text for level 1 only / text for All postings|
Outline: Choose the depth of the posting thread, successive toggle controls provide increasing detail.
|1||2||1||2 levels / 1 level (original posting)|
|2||3||2||3 levels / 2 levels|
|3||3||All||3 levels / all levels (all postings)|
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