Geant4 Cross Reference |
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 // 28 // GEANT4 Class file 29 // 30 // Description: Data structure for cross sections, shell cross sections 31 // isotope cross sections 32 // 33 // Author: V.Ivanchenko 10.03.2011 34 // 35 // Modifications: 36 // 37 //---------------------------------------------------------------------------- 38 39 #include "G4ElementData.hh" 40 #include "G4ElementDataRegistry.hh" 41 42 G4ElementData::G4ElementData(G4int length) 43 : maxNumElm(length) 44 { 45 elmData.resize(maxNumElm, nullptr); 46 G4ElementDataRegistry::Instance()->RegisterMe(this); 47 } 48 49 G4ElementData::~G4ElementData() 50 { 51 for (auto const & p : elmData) { delete p; } 52 for (auto const & p : elm2Data) { delete p; } 53 for (auto const & p : compData) { 54 if (nullptr != p ) { 55 for (auto const & q : *p) { delete q.second; } 56 delete p; 57 } 58 } 59 for (auto const & p : comp2D) { 60 if (nullptr != p ) { 61 for (auto const & q : *p) { delete q.second; } 62 delete p; 63 } 64 } 65 G4ElementDataRegistry::Instance()->RemoveMe(this); 66 } 67 68 void G4ElementData::InitialiseForElement(G4int Z, G4PhysicsVector* v) 69 { 70 if (Z < 0 || Z >= maxNumElm) { 71 DataError(Z, "InitialiseForElement"); 72 return; 73 } 74 delete elmData[Z]; 75 elmData[Z] = v; 76 } 77 78 void G4ElementData::InitialiseForElement(G4int Z, G4Physics2DVector* v) 79 { 80 if (Z < 0 || Z >= maxNumElm) { 81 DataError(Z, "InitialiseForElement"); 82 return; 83 } 84 if (0 == elm2Data.size()) { 85 elm2Data.resize(maxNumElm, nullptr); 86 } 87 delete elm2Data[Z]; 88 elm2Data[Z] = v; 89 } 90 91 void G4ElementData::InitialiseForComponent(G4int Z, G4int nComponents) 92 { 93 if (Z < 0 || Z >= maxNumElm) { 94 DataError(Z, "InitialiseForComponent"); 95 return; 96 } 97 if (0 == compData.size()) { 98 compData.resize(maxNumElm, nullptr); 99 } 100 delete compData[Z]; 101 compData[Z] = new std::vector<std::pair<G4int, G4PhysicsVector*> >; 102 if (0 < nComponents) { compData[Z]->reserve(nComponents); } 103 } 104 105 void G4ElementData::InitialiseFor2DComponent(G4int Z, G4int nComponents) 106 { 107 if (Z < 0 || Z >= maxNumElm) { 108 DataError(Z, "InitialiseFor2DComponent"); 109 return; 110 } 111 if (0 == comp2D.size()) { 112 comp2D.resize(maxNumElm, nullptr); 113 } 114 delete comp2D[Z]; 115 comp2D[Z] = new std::vector<std::pair<G4int, G4Physics2DVector*> >; 116 if (0 < nComponents) { comp2D[Z]->reserve(nComponents); } 117 } 118 119 void G4ElementData::AddComponent(G4int Z, G4int id, G4PhysicsVector* v) 120 { 121 if (Z < 0 || Z >= maxNumElm) { 122 DataError(Z, "AddComponent"); 123 return; 124 } 125 if (0 == compData.size()) { 126 compData.resize(maxNumElm, nullptr); 127 } 128 if (nullptr == compData[Z]) { 129 compData[Z] = new std::vector<std::pair<G4int, G4PhysicsVector*> >; 130 } 131 compData[Z]->emplace_back(id, v); 132 } 133 134 void G4ElementData::Add2DComponent(G4int Z, G4int id, G4Physics2DVector* v) 135 { 136 if (Z < 0 || Z >= maxNumElm) { 137 DataError(Z, "Add2DComponent"); 138 return; 139 } 140 if (0 == comp2D.size()) { 141 compData.resize(maxNumElm, nullptr); 142 } 143 if (nullptr == comp2D[Z]) { 144 comp2D[Z] = new std::vector<std::pair<G4int, G4Physics2DVector*> >; 145 } 146 comp2D[Z]->emplace_back(id, v); 147 } 148 149 void G4ElementData::DataError(G4int Z, const G4String& type) 150 { 151 G4cout << "G4ElementData::" << type << " ERROR for G4ElementData <" 152 << name << "> Z = " << Z << " is out of range!" << G4endl; 153 G4Exception("G4ElementData", "mat603", FatalException, "Wrong data handling"); 154 } 155