Resistor (1D) - Scharfetter Gummel Method: Difference between revisions

From Flooxs
Jump to navigation Jump to search
(Created page with " #-------------------- # Create 1D structure #-------------------- #Grid line x loc=0.0 spac=0.1 tag=Top line x loc=0.5 spac=0.01 line x loc=1.0 s...")
 
No edit summary
 
Line 20: Line 20:
     #-----------------------------
     #-----------------------------
     DevicePackage
     DevicePackage
    solution name=Potential nosolve
     solution add name=DevPsi pde solve negative damp
     solution add name=DevPsi solve negative damp
     solution add name=Elec  pde solve !negative
     solution add name=Qfn solve negative  
     solution add name=Hole  pde solve !negative
     solution add name=Qfp solve negative
    solution add name=Elec const solve val= "1.0e10*exp((DevPsi-Qfn)/0.025)"
    solution add name=Hole const solve val= "1.0e10*exp((Qfp-DevPsi)/0.025)"
      
      
     #-----------------------------
     #-----------------------------
Line 52: Line 49:
     #-----------------------------
     #-----------------------------
     set eqnP "$eps * grad(DevPsi) + Doping - Elec + Hole"
     set eqnP "$eps * grad(DevPsi) + Doping - Elec + Hole"
     set eqnQfn "ddt(Elec) - $Emob * Elec * grad(Qfn)"
     set eqnE "ddt(Elec) - ($Emob) * $Vt * sgrad(Elec, DevPsi/$Vt)"
     set eqnQfp "ddt(Hole) - $Hmob * Hole * grad(Qfp)"
     set eqnH "ddt(Hole) - ($Hmob) * $Vt * sgrad(Hole, -DevPsi/$Vt)"
   
     pdbSetString Silicon DevPsi Equation $eqnP
     pdbSetString Silicon DevPsi Equation $eqnP
     pdbSetString Silicon Qfn    Equation $eqnQfn
     pdbSetString Silicon Elec  Equation $eqnE
     pdbSetString Silicon Qfp    Equation $eqnQfp
     pdbSetString Silicon Hole  Equation $eqnH
      
      
     pdbSetDouble Silicon DevPsi DampValue $Vt
     pdbSetDouble Silicon DevPsi DampValue $Vt
Line 67: Line 63:
     # Contact Equations
     # Contact Equations
     #-----------------------------
     #-----------------------------
     proc ohmic.contact {Contact} {
     proc OhmicContact {Contact} {
         set vt 0.02558357
         global Vt ni
        set ni 1.1e10
         pdbSetBoolean $Contact Elec Flux 1
         pdbSetBoolean $Contact Qfn Flux 1
         pdbSetBoolean $Contact Hole Flux 1
         pdbSetBoolean $Contact Qfp Flux 1
         pdbSetBoolean $Contact DevPsi Flux 1
         pdbSetBoolean $Contact DevPsi Flux 1
         pdbSetBoolean $Contact Qfn Fixed 1
         pdbSetBoolean $Contact Elec Fixed 1
         pdbSetBoolean $Contact Qfp Fixed 1
         pdbSetBoolean $Contact Hole Fixed 1
         pdbSetBoolean $Contact DevPsi Fixed 1
         pdbSetBoolean $Contact DevPsi Fixed 1
         pdbSetDouble $Contact Qfn Flux.Scale 1.619e-19
         pdbSetDouble $Contact Elec Flux.Scale 1.619e-19
         pdbSetDouble $Contact Qfp Flux.Scale 1.619e-19
         pdbSetDouble $Contact Hole Flux.Scale 1.619e-19
         pdbSetString $Contact Qfn Equation "Qfn-$Contact"
         pdbSetString $Contact DevPsi Equation "Nd - Na - Elec + Hole"
         pdbSetString $Contact Qfp Equation "Qfp-$Contact"
         pdbSetString $Contact Elec Equation "DevPsi - $Vt*log((Elec)/$ni) -$Contact"
         pdbSetString $Contact DevPsi Equation "Doping - $ni*exp((DevPsi-Qfn)/$vt) + $ni*exp((Qfp-DevPsi)/$vt)"
         pdbSetString $Contact Hole Equation "DevPsi + $Vt*log((Hole)/$ni) -$Contact"
        pdbSetString $Contact Equation "1.619e-19 * (Flux_Hole - Flux_Elec)"
     }
     }
     ohmic.contact VSS
     OhmicContact VSS
     ohmic.contact GND
     OhmicContact GND
      
      
     #-----------------------------
     #-----------------------------
Line 105: Line 99:
     #-----------------------------------
     #-----------------------------------
     device
     device
     puts "Electron Flux [contact name=VSS sol=Qfn flux]"
     puts "Electron Flux [contact name=VSS sol=Elec flux]"
     puts "Hole Flux [contact name=VSS sol=Qfp flux]"
     puts "Hole Flux [contact name=VSS sol=Hole flux]"
      
      
     window row=1 col=3
     window row=1 col=3
Line 130: Line 124:
         device init
         device init
          
          
         set curr($i) [expr ([contact name=VSS sol=Qfn flux] - [contact name=VSS sol=Qfp flux])]
         set curr($i) [expr ([contact name=VSS sol=Elec flux] - [contact name=VSS sol=Hole flux])]
          
          
         sel z=log10(abs(Hole)+1.0)
         sel z=log10(abs(Hole)+1.0)

Latest revision as of 13:20, 15 April 2019

   #--------------------
   # Create 1D structure
   #--------------------
   #Grid
   line x loc=0.0 spac=0.1 tag=Top
   line x loc=0.5 spac=0.01
   line x loc=1.0 spac=0.1 tag=Bottom
   
   mater add name=Silicon
   region Silicon xlo=Top xhi=Bottom
   init
   
   #Contacts
   contact name=GND Silicon xlo=-0.1 xhi=0.1 add
   contact name=VSS Silicon xlo=0.9  xhi=1.1 add
   
   #-----------------------------
   # Declare solution variables
   #-----------------------------
   DevicePackage
   solution add name=DevPsi pde solve negative damp
   solution add name=Elec   pde solve !negative
   solution add name=Hole   pde solve !negative
   
   #-----------------------------
   # Define constants
   #-----------------------------
   set T 300.0
   set k 1.38066e-23
   set q 1.619e-19
   set Vt [expr {$k*$T/$q}]
   set ni 1.1e10
   set esi [expr 11.8 * 8.85418e-14]
   set eps [expr $esi / $q]
   set Emob 350.0
   set Hmob 150.0
   set small 1.0e-10
   
   #-----------------------------
   # Ionized dopant profile
   #-----------------------------
   sel z=1.0e20 name=Nd
   sel z=1.0e17 name=Na
   sel z=(Nd-Na) name=Doping
   
   #-----------------------------
   # Bulk Equations
   #-----------------------------
   set eqnP "$eps * grad(DevPsi) + Doping - Elec + Hole"
   set eqnE "ddt(Elec) - ($Emob) * $Vt * sgrad(Elec, DevPsi/$Vt)"
   set eqnH "ddt(Hole) - ($Hmob) * $Vt * sgrad(Hole, -DevPsi/$Vt)"
   pdbSetString Silicon DevPsi Equation $eqnP
   pdbSetString Silicon Elec   Equation $eqnE
   pdbSetString Silicon Hole   Equation $eqnH
   
   pdbSetDouble Silicon DevPsi DampValue $Vt
   pdbSetDouble Silicon DevPsi Abs.Error 1.0e-9
   pdbSetDouble Silicon Elec   Abs.Error 1.0e-5
   pdbSetDouble Silicon Hole   Abs.Error 1.0e-5
   
   #-----------------------------
   # Contact Equations
   #-----------------------------
   proc OhmicContact {Contact} {
       global Vt ni
       pdbSetBoolean $Contact Elec Flux 1
       pdbSetBoolean $Contact Hole Flux 1
       pdbSetBoolean $Contact DevPsi Flux 1
       pdbSetBoolean $Contact Elec Fixed 1
       pdbSetBoolean $Contact Hole Fixed 1
       pdbSetBoolean $Contact DevPsi Fixed 1
       pdbSetDouble $Contact Elec Flux.Scale 1.619e-19
       pdbSetDouble $Contact Hole Flux.Scale 1.619e-19
       pdbSetString $Contact DevPsi Equation "Nd - Na - Elec + Hole"
       pdbSetString $Contact Elec Equation "DevPsi - $Vt*log((Elec)/$ni) -$Contact"
       pdbSetString $Contact Hole Equation "DevPsi + $Vt*log((Hole)/$ni) -$Contact"
   }
   OhmicContact VSS
   OhmicContact GND
   
   #-----------------------------
   # Initial Conditions
   #-----------------------------
   #Bias contacts
   contact name=VSS voltage supply=0.0
   contact name=GND voltage supply=0.0
   
   #Initial Guess
   sel z= {
       (Doping>0.0)
       ?  (0.025*log( (Doping + 1e-10) / 1.1e10))
       :  (-0.025*log(-(Doping + 1e-10) / 1.1e10))} name = DevPsi
   sel z=$ni*exp(DevPsi/$Vt)  name=Elec
   sel z=$ni*exp(-DevPsi/$Vt) name=Hole
   
   #-----------------------------------
   # 1st DC Solve at Equilibrium (0V)
   #-----------------------------------
   device
   puts "Electron Flux [contact name=VSS sol=Elec flux]"
   puts "Hole Flux [contact name=VSS sol=Hole flux]"
   
   window row=1 col=3
   #Plot the equilibrium concentration profiles
   foreach var {Doping Elec Hole} {
       sel z=log10(abs($var+1.0))
       plot1d graph=Doping
   }
   
   #--------------------------------------
   # Ramp the DC Bias to make I-V plot
   #--------------------------------------
   #initialize an array, bias (Vb) and counter (i), and create and new graph window
   array set curr {}
   set i 1
   
   #Ramp from 0.0-1.2V and Plot
   for {set bias 0.0} {$bias < 1.2} {set bias [expr $bias+0.05]} {
       set Vbias($i) $bias
       incr i
       
       contact name=VSS supply=$bias
       device init
       
       set curr($i) [expr ([contact name=VSS sol=Elec flux] - [contact name=VSS sol=Hole flux])]
       
       sel z=log10(abs(Hole)+1.0)
       plot1d graph=HoleConc
       
       chart graph=IV curve=IV xval=$bias yval=$curr($i)
   }
   
   set winRefresh 1
   if {$winRefresh} {
       plot1d graph=Doping clear
       plot1d graph=HoleConc clear
       chart graph=IV curve=IV clear
   }