Tutorial 06: transfer characteristics

In this tutorial, we will write a python script to compute the transfer characteristic of a double gate CNT-FET transistors, with doped reservoirs (molar fraction = 5e-3), 1.5 nm oxide thickness, 5 nm channel length. The applied Vds=0.1V and the Vgs is swept in the interval 0<=Vgs<=0.5 V.

Let’s import the module as usual
from NanoTCAD_ViDES import *
and define the nanotube. The channel is 5 nm, the doped source
and drain reservoirs are 5 nm each, so the total length of the nanotube
is 15 nm.
CNT=nanotube(13,15);
I take care of the grid, using the same grid along the x and y axis,
while for the z-axis, I use the same discretization as the C atoms
along the z-axis
x=nonuniformgrid(array([-2,0.3,0,0.2,2,0.3]))
y=x;
grid=grid3D(x,y,CNT.z,CNT.x,CNT.y,CNT.z);
I take care of the gates, which are aligned with the channel (i.e.
no underlap, no overlap).
top_gate=gate(“hex”,2,2,-2,2,5,10)
bottom_gate=gate(“hex”,-2,-2,-2,2,5,10)
I then define the dielectric which embeds the CNT, which
is SiO2: so I have to define the correct relative dielectric constant
of the SiO2
SiO2=region(“hex”,-2,2,-2,2,grid.gridz[0],grid.gridz[grid.nz-1]);
SiO2.eps=3.9;
I then create the interface to pass all the parameters within the
self-consistent Poisson/NEGF iterative scheme,
p=interface3D(grid,top_gate,bottom_gate,SiO2);
and I then dope the source and drain reservoirs, with a molar fraction equal to 5e-3
dope_reservoir(grid,p,CNT,5e-3,
               array([grid.xmin,grid.xmax,grid.ymin,grid.ymax,0,5]));
dope_reservoir(grid,p,CNT,5e-3,
               array([grid.xmin,grid.xmax,grid.ymin,grid.ymax,10,15]));
I want to work within the mode space approach, using two modes, so I do the following:
p.modespace=”yes”
CNT.Nmodes=2;
I now take care of the applied gate voltage: Vds=0.1, so CNT.mu1=0 (by default)
and CNT.mu2=-0.1.
CNT.mu2=-0.1;
The sweep start from Vgmin=0V and ends at Vgmax=0.5V.
The step is equal to Vgstep=0.05V
Vgmin=0.0;
Vgmax=0.5;
Vgstep=0.05;
I need to store the computed current for each Vgs in somewhere
vg=zeros(20);
current=zeros(20);
Then I go on with the while cycle.
At each step I have to modify the Fermi level of each gate, and then I have
to make these changes effective, by applying the command set_gate.
In addition, in the case of the first computed voltage, I first compute the initial
solution through the solve_init command. In the following step, I start from 
the solution computed at the previous step.

counter=0;
Vgs=Vgmin;
while (Vgs<=Vgmax):
    # I set the Fermi level of the top and bottom gate
    top_gate.Ef=-Vgs;
    set_gate(p,top_gate);
    bottom_gate.Ef=-Vgs;
    set_gate(p,bottom_gate);
    #If the first voltage, then I compute the initial solution
    if (Vgs==Vgmin):
        # I compute the initial solution
        p.normpoisson=1e-3;
        print “Computing the initial solution”
        solve_init(grid,p,CNT);


    p.normpoisson=1e-1;
    p.normd=5e-2;
    solve_self_consistent(grid,p,CNT);
    vg[counter]=Vgs;
    current[counter]=CNT.current();
    counter=counter+1;
    Vgs=Vgs+Vgstep;
I then save the computed transfer characteristic in a file
tempo=[vg,current]
savetxt(“transfer.out”,transpose(tempo));

Comments are closed.