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
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
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
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 }