Source code for pyrolite.mineral.sites

from ..util.log import Handle

logger = Handle(__name__)


[docs]class Site(object): def __init__(self, name=None, coordination=0, affinities={}, mode="cation"): """ Class for specifying mineral sites, including coordination information. Will be used for partitioning and affinity calculations for estimating mineral site chemistry. """ if name is None: name = self.__class__.__name__ assert mode in ["cation", "anion", "oxygen"] self.name = name self.coordination = coordination self.affinities = affinities self.occupancy = None self.anionic = mode == "anion" self.cationic = mode == "cation" self.oxygen = mode == "oxygen" def __str__(self): """Get a string representation of the site.""" if self.coordination: return """[{}]{}""".format(self.name, self.coordination) else: return """{}""".format(self.name) def __repr__(self): """Get a signature of the site.""" if self.coordination: return """{}("{}", {})""".format( self.__class__.__name__, self.name, self.coordination ) else: return """{}("{}")""".format(self.__class__.__name__, self.name) def __eq__(self, other): """Check for equality between two sites.""" # check that the duck quacks/is a Site pretest = ( hasattr(other, "name") & hasattr(other, "coordination") & hasattr(other, "affinities") ) if pretest: # Check for attribute equalilty conds = ( (self.__class__.__name__ == other.__class__.__name__) & (self.name == other.name) & (self.coordination == other.coordination) & (self.affinities == other.affinities) ) return conds else: return False def __hash__(self): return hash(self.__repr__().encode("UTF-8"))
[docs]class MX(Site): """ Octahedrally coordinated M site. """ def __init__(self, name="M", coordination=8, *args, **kwargs): super().__init__(name, coordination, *args, mode="cation", **kwargs)
[docs]class TX(Site): """ Tetrahedrally coordinated T site. """ def __init__( self, name="T", coordination=4, affinities={"Si{4+}": 0, "Al{3+}": 1, "Fe{3+}": 2}, *args, mode="cation", **kwargs ): super().__init__(name, coordination, *args, affinities=affinities, **kwargs)
[docs]class IX(Site): """ Dodecahedrally coordinated I site. """ def __init__(self, name="I", coordination=12, *args, **kwargs): super().__init__(name, coordination, *args, mode="cation", **kwargs)
[docs]class VX(Site): """ Vacancy site. """ def __init__(self, name="V", coordination=0, *args, **kwargs): super().__init__(name, coordination, *args, mode="cation", **kwargs)
[docs]class OX(Site): """ Oxygen site. """ def __init__( self, name="O", coordination=0, affinities={"O{2-}": 0}, *args, **kwargs ): super().__init__( name, coordination, *args, affinities=affinities, mode="oxygen", **kwargs )
[docs]class AX(Site): """ Anion site. """ def __init__(self, name="A", coordination=0, *args, **kwargs): super().__init__(name, coordination, *args, mode="anion", **kwargs)