Пример #1
0
    def nxc_from_PC(self, filt=slice(None)):
        corr_index = int(self.raw.shape[0] * 0.02)

        V_PC_ill = self.data()['Voc'][filt]
        V_PC_dark = np.mean(self.raw['Voc'][:corr_index])
        #print(V_PC_dark)
        del_sigma = self.A * (V_PC_ill - self.C)**2 + self.B * (
            V_PC_ill - self.C) - (self.A * (V_PC_dark - self.C)**2 + self.B *
                                  (V_PC_dark - self.C))

        # Create an instance of a mobility object
        MOB = Mobility()
        """
        TEMPERATURE DEPENDENCE - OK
        Here the mobility_sum is calculated using the temperature data input directly from the data file name.
        """
        def nxc_PC(x):
            return del_sigma / (C.e * self.W * MOB.mobility_sum(
                Na=self.Na, Nd=self.Nd, temp=self.T, nxc=x))

        nxc_guess = del_sigma / (C.e * self.W * MOB.mobility_sum(
            Na=self.Na,
            Nd=self.Nd,
            temp=self.T,
            nxc=np.ones_like(del_sigma) * 1e15))

        nxc = self.find_iteratively(nxc_guess, nxc_PC)
        return nxc
Пример #2
0
def _conductance2deltan_model(conductance, Na, Nd, thickness,
                              mobility_sum_author, temp):
    '''
    returns the excess conductance for a sample
    '''
    assert type(mobility_sum_author) == str or mobility_sum_author is None

    nxc = 1e10 * np.ones(conductance.shape[0])
    i = 1

    while (i > 0.0001):
        mobility_sum = Mobility().mobility_sum(nxc=nxc,
                                               Na=Na,
                                               Nd=Nd,
                                               temp=temp,
                                               author=mobility_sum_author)
        _temp = _conductance2deltan_array(conductance, thickness, mobility_sum)

        # make sure we are not loosing carriers
        _temp[_temp < 0.] = 0.
        # ignore points where there are no carriers
        index = np.nonzero(nxc)
        i = np.average(abs(_temp[index] - nxc[index]) / nxc[index])

        nxc = _temp
    # return the value
    return nxc
Пример #3
0
    def _get_available_models(self):
        ni = NI().available_models()
        mobility = Mobility().available_models()
        ionisation = Ion().available_models()
        B = Radiative().available_models()

        values = locals()
        del values['self']
        self.available_models = values
        return self.available_models
    def nxc_from_PC(self, filt=slice(None)):
        corr_index = int(self.raw.shape[0]*0.02)

        V_PC_ill = self.data()['Voc'][filt]
        V_PC_dark = np.mean(self.raw['Voc'][:corr_index])
        #print(V_PC_dark)
        del_sigma = self.A*(V_PC_ill-self.C)**2 + self.B*(V_PC_ill-self.C) - (self.A*(V_PC_dark-self.C)**2 + self.B*(V_PC_dark-self.C))

        MOB = Mobility()

        def nxc_PC(x):
            return del_sigma / (C.e * self.W * MOB.mobility_sum(Na=self.Na, Nd=self.Nd, temp=self.T, nxc=x))

        nxc_guess = del_sigma / (C.e * self.W * MOB.mobility_sum(Na=self.Na, Nd=self.Nd, temp=self.T, nxc=np.ones_like(del_sigma)*1e15))

        nxc = self.find_iteratively(nxc_guess, nxc_PC)
        return nxc
Пример #5
0
    def _update_update(self):
        '''
        creates a dictionary that holds
        the required semiconudctor models for easy
        calling
        '''

        self.update = {
            'ni':
            NI(material=self.material,
               author=self.selected_model['ni']).update,
            'mobility':
            Mobility(material=self.material,
                     author=self.selected_model['mobility']).mobility_sum,
            'ionisation':
            Ion(material=self.material,
                author=self.selected_model['ionisation']).
            update_dopant_ionisation,
            'B':
            Radiative(
                material=self.material,
                author=self.selected_model['B'],
            )._get_B
        }