Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4MaterialPropertiesTable.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29//
30////////////////////////////////////////////////////////////////////////
31// G4MaterialPropertiesTable Implementation
32////////////////////////////////////////////////////////////////////////
33//
34// File: G4MaterialPropertiesTable.cc
35// Version: 1.0
36// Created: 1996-02-08
37// Author: Juliet Armstrong
38// Updated: 2005-05-12 add SetGROUPVEL(), courtesy of
39// Horton-Smith (bug report #741), by P. Gumplinger
40// 2002-11-05 add named material constants by P. Gumplinger
41// 1999-11-05 Migration from G4RWTPtrHashDictionary to STL
42// by John Allison
43// 1997-03-26 by Peter Gumplinger
44// > cosmetics (only)
45// mail: [email protected]
46//
47////////////////////////////////////////////////////////////////////////
48
49#include "globals.hh"
52
53/////////////////
54// Constructors
55/////////////////
56
58{
59}
60
61////////////////
62// Destructor
63////////////////
64
66{
67 MPTiterator i;
68 for (i = MPT.begin(); i != MPT.end(); ++i)
69 {
70 delete (*i).second;
71 }
72 MPT.clear();
73 MPTC.clear();
74}
75
76////////////
77// Methods
78////////////
79
81{
82 MPTiterator i;
83 for (i = MPT.begin(); i != MPT.end(); ++i)
84 {
85 G4cout << (*i).first << G4endl;
86 if ( (*i).second != 0 )
87 {
88 (*i).second->DumpValues();
89 }
90 else
91 {
92 G4Exception("G4MaterialPropertiesTable::DumpTable()", "mat204",
93 JustWarning, "NULL Material Property Vector Pointer.");
94 }
95 }
96 MPTCiterator j;
97 for (j = MPTC.begin(); j != MPTC.end(); ++j)
98 {
99 G4cout << j->first << G4endl;
100 if ( j->second != 0 )
101 {
102 G4cout << j->second << G4endl;
103 }
104 else
105 {
106 G4Exception("G4MaterialPropertiesTable::DumpTable()", "mat202",
107 JustWarning, "No Material Constant Property.");
108 }
109 }
110}
111
112G4MaterialPropertyVector* G4MaterialPropertiesTable::SetGROUPVEL()
113{
114 // fetch RINDEX data, give up if unavailable
115 //
116 G4MaterialPropertyVector *rindex = this->GetProperty("RINDEX");
117 if (rindex==0) { return 0; }
118
119 // RINDEX exists but has no entries, give up
120 //
121 if ( rindex->GetVectorLength() == 0 ) { return 0; }
122
123 // add GROUPVEL vector
124 //
126
127 this->AddProperty( "GROUPVEL", groupvel );
128
129 // fill GROUPVEL vector using RINDEX values
130 // rindex built-in "iterator" was advanced to first entry above
131 //
132 G4double E0 = rindex->Energy(0);
133 G4double n0 = (*rindex)[0];
134
135 if (E0 <= 0.)
136 {
137 G4Exception("G4MaterialPropertiesTable::SetGROUPVEL()", "mat205",
138 FatalException, "Optical Photon Energy <= 0");
139 }
140
141 if ( rindex->GetVectorLength() >= 2 )
142 {
143 // good, we have at least two entries in RINDEX
144 // get next energy/value pair
145
146 G4double E1 = rindex->Energy(1);
147 G4double n1 = (*rindex)[1];
148
149 if (E1 <= 0.)
150 {
151 G4Exception("G4MaterialPropertiesTable::SetGROUPVEL()", "mat205",
152 FatalException, "Optical Photon Energy <= 0");
153 }
154
155 G4double vg;
156
157 // add entry at first photon energy
158 //
159 vg = c_light/(n0+(n1-n0)/std::log(E1/E0));
160
161 // allow only for 'normal dispersion' -> dn/d(logE) > 0
162 //
163 if((vg<0) || (vg>c_light/n0)) { vg = c_light/n0; }
164
165 groupvel->InsertValues( E0, vg );
166
167 // add entries at midpoints between remaining photon energies
168 //
169
170 for (size_t i = 2; i < rindex->GetVectorLength(); i++)
171 {
172 vg = c_light/( 0.5*(n0+n1)+(n1-n0)/std::log(E1/E0));
173
174 // allow only for 'normal dispersion' -> dn/d(logE) > 0
175 //
176 if((vg<0) || (vg>c_light/(0.5*(n0+n1)))) { vg = c_light/(0.5*(n0+n1)); }
177 groupvel->InsertValues( 0.5*(E0+E1), vg );
178
179 // get next energy/value pair, or exit loop
180 //
181 E0 = E1;
182 n0 = n1;
183 E1 = rindex->Energy(i);
184 n1 = (*rindex)[i];
185
186 if (E1 <= 0.)
187 {
188 G4Exception("G4MaterialPropertiesTable::SetGROUPVEL()", "mat205",
189 FatalException, "Optical Photon Energy <= 0");
190 }
191 }
192
193 // add entry at last photon energy
194 //
195 vg = c_light/(n1+(n1-n0)/std::log(E1/E0));
196
197 // allow only for 'normal dispersion' -> dn/d(logE) > 0
198 //
199 if((vg<0) || (vg>c_light/n1)) { vg = c_light/n1; }
200 groupvel->InsertValues( E1, vg );
201 }
202 else // only one entry in RINDEX -- weird!
203 {
204 groupvel->InsertValues( E0, c_light/n0 );
205 }
206
207 return groupvel;
208}
@ JustWarning
@ FatalException
G4PhysicsOrderedFreeVector G4MaterialPropertyVector
double G4double
Definition: G4Types.hh:64
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4MaterialPropertyVector * GetProperty(const char *key)
G4MaterialPropertyVector * AddProperty(const char *key, G4double *PhotonEnergies, G4double *PropertyValues, G4int NumEntries)
void InsertValues(G4double energy, G4double value)
size_t GetVectorLength() const
G4double Energy(size_t index) const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41