Source code for simudo.physics.material
from cached_property import cached_property
from ..util import SetattrInitMixin
__all__ = [
    'Material',
    'SimpleSiliconMaterial',
    'BadSimpleSiliconMaterial']
[docs]class Material(SetattrInitMixin):
    '''Base material class.
Parameters
----------
problem_data: :py:class:`.problem_data.ProblemData`, optional
    ProblemData instance (used to pull, for example, the temperature
    variable).
unit_registry: :py:class:`pint.UnitRegistry`, optional
    Unit registry.
Attributes
----------
name: str, optional
    Material name.
'''
    name = None
[docs]    def get_dict(self):
        '''Construct dictionary of material parameters.
Returns
-------
dict:
    Dictionary where keys are :py:meth:`~.spatial.Spatial.add_rule`
    keys, and values are the values (expressions).
'''
        return {} 
    @cached_property
    def dict(self):
        return self.get_dict()
    @property
    def temperature(self):
        return self.pdd.temperature
    @property
    def pdd(self):
        return self.problem_data.pdd
    @property
    def unit_registry(self):
        return self.problem_data.unit_registry
[docs]    def register(self, name=None):
        if name is None:
            name = self.name
        for k, v in self.dict.items():
            self.pdd.spatial.add_material_data(
                key=k, material_name=name, value=v)  
[docs]class SimpleSiliconMaterial(Material):
    '''Very simple silicon material. No temperature dependences.'''
    name = 'Si'
[docs]    def get_dict(self):
        d = super().get_dict()
        U = self.unit_registry
        d.update({
            # band parameters
            # source: http://www.ioffe.ru/SVA/NSM/Semicond/Si/bandstr.html
            'CB/energy_level': U('1.12 eV'),
            'VB/energy_level': U('0 eV'),
            'CB/effective_density_of_states': U('3.2e19 1/cm^3'),
            'VB/effective_density_of_states': U('1.8e19 1/cm^3'),
            # electrical properties
            # source: http://www.ioffe.ru/SVA/NSM/Semicond/Si/electric.html
            'CB/mobility': U('1400 cm^2/V/s'),
            'VB/mobility': U(' 450 cm^2/V/s'),
            # poisson
            # http://www.ioffe.ru/SVA/NSM/Semicond/Si/optic.html
            'poisson/permittivity': U('11.7 vacuum_permittivity'),
        })
        return d  
[docs]class BadSimpleSiliconMaterial(SimpleSiliconMaterial):
    '''Just an example of how to use inheritance to selectively modify
    properties of the superclass'''
    name = 'badSi'
[docs]    def get_dict(self):
        d = super().get_dict()
        U = self.unit_registry
        d['CB/mobility'] = d['CB/mobility'] / 3
        d['VB/mobility'] = U('233 cm^2/V/s')
        return d