59 lines
1.4 KiB
Python
59 lines
1.4 KiB
Python
from dataclasses import dataclass
|
|
from typing import List, Union, Optional
|
|
import periodictable
|
|
|
|
@dataclass
|
|
class Composition:
|
|
element: int
|
|
isotope: int
|
|
abundance: float
|
|
library: Optional[str] = None
|
|
|
|
def __repr__(self):
|
|
ele = periodictable.elements[self.element]
|
|
return f'{self.isotope}{ele} ({self.abundance})'
|
|
|
|
@dataclass
|
|
class Material:
|
|
ID: int
|
|
elements: List[Composition]
|
|
|
|
def get_elements(istring):
|
|
ilines = istring.splitlines()
|
|
alines = []
|
|
for li in ilines:
|
|
alines.append(li.split('$', 1)[0])
|
|
tstring = ' '.join(alines)
|
|
items = tstring.split()
|
|
elements = []
|
|
for i in range(len(items)//2):
|
|
eil = items[i*2]
|
|
if '.' in eil:
|
|
ei, l = eil.split('.', 1)
|
|
else:
|
|
ei = eil
|
|
l = None
|
|
ei = int(ei)
|
|
a = float(items[i*2+1])
|
|
comp = Composition(ei//1000, ei%1000, a, l)
|
|
elements.append(comp)
|
|
return elements
|
|
|
|
|
|
txt=open('geometry/materials.i', 'r').read()
|
|
lns=[]
|
|
|
|
while txt.find('\n')>0:
|
|
nn = txt.find('\n')
|
|
while len(txt)>(nn+1) and txt[nn+1] in [' ', '\t'] and txt[nn+1:].find('\n')>0:
|
|
nn = nn+1+txt[nn+1:].find('\n')
|
|
lns.append(txt[:nn+1])
|
|
txt = txt[nn+1:]
|
|
|
|
flns = [li for li in lns if not li.startswith('c')]
|
|
mat={}
|
|
for fi in flns:
|
|
if fi[0]=='m' and fi[1].isdigit():
|
|
mat[int(fi.split()[0][1:])] = fi.split(None, 1)[1]
|
|
|