Tutorial 14 – Multi-scale simulations

This tutorial shows how to simulate from the atomistic level a transistor based on GNR with Fluorine terminations, exploiting Quantum Espresso and Wannier90 open source codes. In particular, the GNR Hamiltonian is extracted from QE and Wannier90 and passed to NanoTCADViDES in order to calculate the transport and the electrostatics of F:12AGNR. In fig.1, the rectangular dashed-line represents the unit cell of the ab-initio calculation.

 Here the procedure is explained step-by-step.

Needed script files (zipped file, which can be downloaded here)

–      run_QE: script running PWSCF.

–      run_wannier: script running wannier90, pw2wannier90 and Wannier2ViDES subsequently.

–      Download the Wannier2ViDES code, compile with:

  • f90 –o Wannier2ViDES Wannier2ViDES.f90
  • copy the executable in the directory (generally bin), where the other executables (PW.x, wannier90.x) are stored.

–      GNR_fluorine_FET.py: NanoTCAD ViDES script for the simulation of the GNR-FET

Other needed files, which has to be included in the same directory you launch the scripts:

environment_variables: sets the needed PATH environment variables

Pay attention to change the line where PREFIX is specified, writing the exact path where the PW.x and wannier90.x and Wannier2ViDES executable are stored (generally the bin directory).

check_failure.sh: function to test the exit status of a job

 

Run the following scripts as below. Pay attention that all the results are stored in the results_12AGNR+F directory, automatically generated.

1) ./run_QE

It runs pwscf to obtain

a) the ground state of NR (SCF calculation)

b) the Bloch states on a uniform k-point grid (NSCF calculation)

2) ./run_Wannier

It runs consecutively

a) wannier90  generates a list of the required overlaps (output file: seedname.nnkp)

b) pw2wannier90 computes the overlap between Bloch states and the projections for the starting guess (seedname.amn and seedname.mmn).

c) wannier90, computing the MLWF. The principal results are saved in seedname_band.dat, seedname_hr.dat, seedname_centres.xyz, which contain, respectively, the electronic band structure, the Hamiltonian matrix and the coordinates of final WFs center.

d) Wannier2ViDES reorders the Hamiltonian matrix generated by Wannier90 in the format accepted by the program NanoTCAD ViDES.

In the script, Wannier2ViDES requires three inputs with this order:

–      seedname (the same used for pw2wannier): identifies the input files seedname_hr.dat and seedname_centres.xyz.

–      length: the length of the channel of the GNR-based FET, which will be simulated by NanoTCAD ViDES expressed in Angstrom.

–      the cutoff distance: the largest distance between two WFs for which the Hamiltonian matrix element is retained and used. Units are Angstrom.

The output files are Wannier2ViDES.H, containing the Hamiltonian matrix, and Wannier2ViDES.xyz, with the coordinates  of all atoms in the whole structure. It also gives as an output the file n_Nc.dat, which contains the order (n) of the block matrix of the tridiagonal Hamiltonian to be given to ViDES and the number of diagonal block matrices (Nc).

We are now ready to simulate the entire device. The device structure is the following:

The device structure is a double-gate device, with top and bottom oxides (SiO2) 1nm thick. The channel length is equal to 10 nm, and ohmic contacts are defined at both GNR ends.

The python script is almost the same as the one shown in previous tutorials. The only main difference regards the reading of the Hamiltonian as well as the atoms coordinates as follows:

# I create the Hamiltonian for the GNR                                                                                                                      
a=loadtxt(“Wannier2ViDES.H”)
h2=array(a,dtype=”complex”)
n=28;
Nc=32;
GNR=Hamiltonian(n,Nc)
GNR.H=h2
# I translate the bands by the value 3.42809                                                                                GNR.H[1:n*Nc+1,2]=GNR.H[1:n*Nc+1,2]+3.42809
GNR.dE=1e-3;
GNR.Phi=zeros(n*Nc);
GNR.Ei=zeros(n*Nc);
# I read the atoms coordinates                                                                                                        b=loadtxt(“Wannier2ViDES.xyz”)
GNR.x=around(b[:,0]/10.0,2)
GNR.y=around(b[:,1]/10.0,2)
GNR.z=around(b[:,2]/10.0,2)
del b 

In the following, data are stored in the datiout directory, so pay attention in creating such a directory before launching the script (GNR_fluorine_FET.py, included in the zip file), which compute the transfer characteristic of the GNR-FET.

Comments are closed.