# Tutorial 10: graphene-FET output characteristic

 In this tutorial, we will compute the output characteristics for a given gate-to-source voltage of the graphene FET depicted in the picture below. The flake is 50 nm long, the reservoirs are 15 nm long and the channel length is 20 nm. The molar fraction of the reservoirs is equal to 5e-3. The top and the bottom oxide is SiO2, 10 nm thick. Top and bottom gates are self-alligned with the channel. The python script reads as follows: from NanoTCAD_ViDES import * Since we will parallelize by means of the MPIze_kt command, it is important to define the rank, which will be useful in order to print the output files only when rank=0. rank = MPI.COMM_WORLD.Get_rank() Let’s create the grid along the x direction xg=nonuniformgrid(array([-10,1,0,0.05,10,1])) and define the flake 50 nm long FLAKE=graphene(50); In order to save computational time, let’s define a limited region of the Brillouin zone, where the charge and the current is computed. This is justified by the fact, that only the states in the neighbourood of the Dirac point are occupied. To this purpose, let’s define the interval of the wave-vector k, paying attention to get the Dirac point. In particular, the center of the interval is the Dirac point plus/minus 2e9 m^-1. acc=0.144; kF=2*pi/(3*sqrt(3)*acc); kymax=kF+2; Nky=64; dk=(kymax-kF)/(Nky*0.5); FLAKE.kmax=kF+dk*Nky*0.5; FLAKE.kmin=kF-dk*Nky*0.5; FLAKE.dk=dk; Now let’s define the 2D grid grid=grid2D(xg,FLAKE.y,FLAKE.x,FLAKE.y); I take care of the embedding dielectric (SiO2) and the top and the bottom gates. SiO2=region(“hex”,grid.xmin,grid.xmax,grid.ymin,grid.ymax) SiO2.eps=3.9;        top_gate=gate(“hex”,grid.xmax,grid.xmax,15,35); bottom_gate=gate(“hex”,grid.xmin,grid.xmin,15,35); Vgs is set to 0.1 V                                       top_gate.Ef=-0.1; bottom_gate.Ef=-0.1; and then we define the interface p and all the important variables p=interface2D(grid,SiO2,top_gate,bottom_gate); p.MPI_kt=”yes” Now we dope the source and drain reservoirs fraction=5e-3 dope_reservoir(grid,p,FLAKE,fraction,array([-1,1,grid.ymin,15])); dope_reservoir(grid,p,FLAKE,fraction,array([-1,1,35,grid.ymax])); The structure is now defined. So we move straight to the numerics. We compute the initial solution solve_init(grid,p,FLAKE); Then we start the iteration over the drain-to-source voltage Vdsmin=0.05; Vdsmax=2.0; Vdstep=0.05; Np=int(abs(Vdsmin-Vdsmax)/Vdstep)+1; vg=zeros(Np); current=zeros(Np); p.underel=0.1; counter=0; Vds=Vdsmin; while (Vds<=Vdsmax): FLAKE.mu2=-Vds; p.normpoisson=1e-1; p.normd=5e-3; solve_self_consistent(grid,p,FLAKE); vg[counter]=Vds; current[counter]=FLAKE.current(); # if (rank==0): plot2D(p.free_charge,grid,’o’); # I save the output files if (rank==0): string=”./datiout/Phi%s.out” %Vds; savetxt(string,p.Phi); string=”./datiout/ncar%s.out” %Vds; savetxt(string,p.free_charge); a=[FLAKE.E,FLAKE.T]; string=”./datiout/T%s.out” %Vds; savetxt(string,transpose(a)); string=”./datiout/jayn%s.out” %Vds; fp=open(string,”w”); string2=”%s” %current[counter]; fp.write(string2); fp.close(); counter=counter+1; Vds=Vds+Vdstep; tempo=[vg,current] savetxt(“./datiout/idvds.out”,transpose(tempo)); MPI.Finalize() As can be seen all the files have been stored in a directory ./datiout, which previously has to be created. The script can then be run as described in the “Run MPI” section. download script