Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // >> 27 // $Id: G4gsmixt.cc 67982 2013-03-13 10:36:03Z gcosmo $ 27 // 28 // 28 // by I.Hrivnacova, 27 Sep 99 29 // by I.Hrivnacova, 27 Sep 99 29 30 30 #include <iomanip> 31 #include <iomanip> 31 #include <iomanip> 32 #include <iomanip> 32 33 33 #include "globals.hh" 34 #include "globals.hh" 34 #include "G4SystemOfUnits.hh" 35 #include "G4SystemOfUnits.hh" 35 36 36 #include "G3toG4.hh" 37 #include "G3toG4.hh" 37 #include "G3EleTable.hh" 38 #include "G3EleTable.hh" 38 #include "G3MatTable.hh" 39 #include "G3MatTable.hh" 39 #include "G4Material.hh" 40 #include "G4Material.hh" 40 #include "G4Isotope.hh" 41 #include "G4Isotope.hh" 41 42 42 void PG4gsmixt(G4String *tokens) 43 void PG4gsmixt(G4String *tokens) 43 { 44 { 44 // fill the parameter containers 45 // fill the parameter containers 45 G3fillParams(tokens,PTgsmixt); 46 G3fillParams(tokens,PTgsmixt); 46 47 47 // interpret the parameters 48 // interpret the parameters 48 G4String name = Spar[0].data(); 49 G4String name = Spar[0].data(); 49 G4int imate = Ipar[0]; 50 G4int imate = Ipar[0]; 50 G4int nlmat = Ipar[1]; 51 G4int nlmat = Ipar[1]; 51 //G4double dens = Rpar[0]*g/cm3; 52 //G4double dens = Rpar[0]*g/cm3; 52 G4double dens = Rpar[0]; 53 G4double dens = Rpar[0]; 53 G4double *a = Rpar + 1; 54 G4double *a = Rpar + 1; 54 G4double *z = Rpar + 1+std::abs(nlmat); 55 G4double *z = Rpar + 1+std::abs(nlmat); 55 G4double *wmat = Rpar + 1 + 2*std::abs(nlm 56 G4double *wmat = Rpar + 1 + 2*std::abs(nlmat); 56 /* 57 /* 57 for (int i=0; i<std::abs(nlmat); i++){ 58 for (int i=0; i<std::abs(nlmat); i++){ 58 //Rpar[i]=Rpar[i]*g/mole; 59 //Rpar[i]=Rpar[i]*g/mole; 59 Rpar[i]=Rpar[i]; 60 Rpar[i]=Rpar[i]; 60 }; 61 }; 61 */ 62 */ 62 G4gsmixt(imate,name,a,z,dens,nlmat,wmat); 63 G4gsmixt(imate,name,a,z,dens,nlmat,wmat); 63 } 64 } 64 65 65 // replaced with G3EleTable 66 // replaced with G3EleTable 66 // only used G4Elements are created; 67 // only used G4Elements are created; 67 // !! no checking of given A of the element; 68 // !! no checking of given A of the element; 68 // 69 // 69 // extern G4Element* CreateElement(G4double ze 70 // extern G4Element* CreateElement(G4double zeff, G4double aeff, G4String matName); 70 71 71 72 72 void G4gsmixt(G4int imate, G4String name, G4do 73 void G4gsmixt(G4int imate, G4String name, G4double* a, G4double* z, 73 G4double dens, G4int nlmat, G4do 74 G4double dens, G4int nlmat, G4double* wmat) 74 { 75 { 75 // in Geant3: 76 // in Geant3: 76 // After a call with ratios by number (negat 77 // After a call with ratios by number (negative number of elements), 77 // the ratio array is changed to the ratio b 78 // the ratio array is changed to the ratio by weight, so all successive 78 // calls with the same array must specify th 79 // calls with the same array must specify the number of elements as 79 // positive 80 // positive 80 G4int i=0; 81 G4int i=0; 81 if (nlmat<0) { 82 if (nlmat<0) { 82 // in case of proportions given in atom co 83 // in case of proportions given in atom counts (nlmat<0), 83 // the wmat[i] are converted to weight fra 84 // the wmat[i] are converted to weight fractions 84 G4double aMol = 0.; 85 G4double aMol = 0.; 85 for (i=0; i<std::abs(nlmat); i++) { 86 for (i=0; i<std::abs(nlmat); i++) { 86 // total molecular weight 87 // total molecular weight 87 aMol += wmat[i]*a[i]; 88 aMol += wmat[i]*a[i]; 88 } 89 } 89 if (aMol == 0.) { 90 if (aMol == 0.) { 90 G4String text = "G4mixt: Total molecular 91 G4String text = "G4mixt: Total molecular weight in " + name + " = 0."; 91 G4Exception("G4gsmixt()", "G3toG40016", 92 G4Exception("G4gsmixt()", "G3toG40016", FatalException, text); 92 return; 93 return; 93 } 94 } 94 for (i=0; i<std::abs(nlmat); i++) { 95 for (i=0; i<std::abs(nlmat); i++) { 95 // weight fractions 96 // weight fractions 96 wmat[i] = wmat[i]*a[i]/aMol; 97 wmat[i] = wmat[i]*a[i]/aMol; 97 } 98 } 98 } 99 } 99 100 100 // create material with given number of comp 101 // create material with given number of components 101 // (elements) 102 // (elements) 102 103 103 G4Material* material 104 G4Material* material 104 = new G4Material(name, dens*g/cm3, std::ab 105 = new G4Material(name, dens*g/cm3, std::abs(nlmat)); 105 for (i=0; i<std::abs(nlmat); i++) { 106 for (i=0; i<std::abs(nlmat); i++) { 106 // add units 107 // add units 107 // G4Element* element = G4Element(z[i], a[ 108 // G4Element* element = G4Element(z[i], a[i]*g/mole, name); 108 G4Element* element = G3Ele.GetEle(z[i]); 109 G4Element* element = G3Ele.GetEle(z[i]); 109 material->AddElement(element, wmat[i]); 110 material->AddElement(element, wmat[i]); 110 } 111 } 111 112 112 // add the material to the List 113 // add the material to the List 113 G3Mat.put(imate, material); 114 G3Mat.put(imate, material); 114 } 115 } 115 116 116 /* 117 /* 117 void G4gsmixt(G4int imate, G4String name, G4do 118 void G4gsmixt(G4int imate, G4String name, G4double a[], G4double z[], 118 G4double dens, G4int nlmat, G4do 119 G4double dens, G4int nlmat, G4double wmat[]){ 119 G4int nmate = std::abs(nlmat); 120 G4int nmate = std::abs(nlmat); 120 G4String sname = name.strip(G4String::both); 121 G4String sname = name.strip(G4String::both); 121 G4double theDensity = dens*g/cm3; 122 G4double theDensity = dens*g/cm3; 122 123 123 G4Material* theMixture = new G4Material(name 124 G4Material* theMixture = new G4Material(name, dens, nmate); 124 G4bool ok=true; 125 G4bool ok=true; 125 for (int i=0; i< nmate; i++){ 126 for (int i=0; i< nmate; i++){ 126 G4Element* theElement = G3Ele.GetEle(z[i]) 127 G4Element* theElement = G3Ele.GetEle(z[i]); 127 if (nlmat>0) { 128 if (nlmat>0) { 128 G4double fractionmass = wmat[i]; 129 G4double fractionmass = wmat[i]; 129 ok = ok && std::abs(fractionmass)<=1.; 130 ok = ok && std::abs(fractionmass)<=1.; 130 theMixture->AddElement(theElement, fract 131 theMixture->AddElement(theElement, fractionmass); 131 } else if (nlmat<0) { 132 } else if (nlmat<0) { 132 G4int natoms = wmat[i]; 133 G4int natoms = wmat[i]; 133 ok = ok && wmat[i] == natoms; 134 ok = ok && wmat[i] == natoms; 134 theMixture->AddElement(theElement, natom 135 theMixture->AddElement(theElement, natoms); 135 } else { 136 } else { 136 ok=false; 137 ok=false; 137 } 138 } 138 } 139 } 139 if (ok) { 140 if (ok) { 140 G3Mat.put(imate, theMixture); 141 G3Mat.put(imate, theMixture); 141 } else { 142 } else { 142 if (nlmat>0) { 143 if (nlmat>0) { 143 G4cerr << "G4gsmixt: for mixture '" << n 144 G4cerr << "G4gsmixt: for mixture '" << name 144 << "' some |weights|>1 : " << G4endl; 145 << "' some |weights|>1 : " << G4endl; 145 for (G4int i=0;i<nlmat; i++) { 146 for (G4int i=0;i<nlmat; i++) { 146 G4cerr << "Component " << std::setw(3) << i+ 147 G4cerr << "Component " << std::setw(3) << i+1 << " fraction: " 147 << std::setw(10) << wmat[i] << G4endl 148 << std::setw(10) << wmat[i] << G4endl; 148 } 149 } 149 } else if (nlmat<0) { 150 } else if (nlmat<0) { 150 G4cerr << "G4gsmixt: for mixture '" << n 151 G4cerr << "G4gsmixt: for mixture '" << name 151 << "' some #natoms are non-integer: " < 152 << "' some #natoms are non-integer: " << G4endl; 152 for (G4int i=0;i<nlmat; i++) { 153 for (G4int i=0;i<nlmat; i++) { 153 G4cerr << "Component " << std::setw(3) << i+ 154 G4cerr << "Component " << std::setw(3) << i+1 << " #atoms " 154 << std::setw(10) << wmat[i] << G4endl 155 << std::setw(10) << wmat[i] << G4endl; 155 } 156 } 156 } else { 157 } else { 157 G4cerr << "G4gsmixt: Number of component 158 G4cerr << "G4gsmixt: Number of components for mixture '" 158 << name << "' (" << nlmat << ") not all 159 << name << "' (" << nlmat << ") not allowed." << G4endl; 159 } 160 } 160 } 161 } 161 } 162 } 162 */ 163 */ 163 164 164 165 165 166 166 167