Skip to content

NUMSEMIC/StrainDistributionNanowires.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DOI

Reproducibility repository for numerical simulations on core/shell zincblende and wurtzite nanowires

StrainDistributionNanowires.jl contains all scripts and data needed to reproduce the numerical results and figures from the manuscript:

Strain distribution in zincblende and wurtzite GaAs nanowires bent by a one-sided (In,Al)As stressor shell: consequences for torsion, chirality, and piezoelectricity

by Yiannis Hadjimichael, Oliver Brandt, Christian Merdon, Costanza Lucia Manganelli, and Patricio Farrel.

The manuscript is published in Physical Review B and can be found here.

Overview

The simulations in this repository rely on the Julia package ElectroMechanicsFEM.jl, which solves the electromechanical equations (elasticity and piezoelectricity) using the finite volume method. The model incorporates a nonlinear strain formulation based on the first Piola–Kirchhoff stress tensor, coupled with an energy functional that effectively captures the lattice-mismatch-induced strain field. Applications of this system include zincblende and wurtzite nanowires, as well as bimetal beams with a lattice-mismatched core and a one-sided stressor shell.

Directory Structure

The repository is organized into the following main folders:

  • data/ Contains all files with simulated and analytical data for the nanowire's curvature and $\varepsilon_{zz}$ elastic axial strain. The numerical data are generated with ElectroMechanicsFEM.jl and the analytical expressions are created using Mathematica (version ≥ 14.3.0). These files are used to calculate the curvature and axial strain plots. This folder also includes additional strain data needed to reproduce the strain and polarization figures in the manuscript. These files can also be regenerated using the scripts provided in the scripts/ folder.

  • output/ Contains figures generated by the files in the postprocess/ folder.

  • postprocess/ Contains all scripts for postprocessing simulation results and generating the manuscript figures. Plotting requires MATLAB (version ≥ R2023a). Currently, plotting calls directly MATLAB or indirectly via bash files, as the postprocess functionality was designed to use SPHiNX to calculate the band structure and other optical properties. Later on, these routines will be replaced by Julia scripts.

  • scripts/ Contains the main simulation scripts to solve the electromechanical equations, including material and geometry parameters.

Usage

To reproduce the results from the paper, you will need a Julia installation (version ≥ 1.10.0).

  1. Clone this repository
> git clone https://github.com/NUMSEMIC/StrainDistributionNanowires.jl
> cd StrainDistributionNanowires.jl
  1. Start Julia and instantiate the project dependencies (first time only; it takes a while and it will download all necessary dependencies and the pyplot backend)
> julia --project=.
julia> using Pkg; Pkg.instantiate()
  1. Reproduce the manuscript's figures from the saved simulation files

Each figure can be generated by running the corresponding script from the postprocess/ folder. The final figures within the manuscript were edited using Inkscape.

To generate Figure 1 and Figure S4 run in a terminal

> sh plot_strain.sh cs1_rotate=90_ZincBlende111_C15_Al0.5
> sh plot_strain.sh cs1_rotate=90_Wurtzite0001_Al0.5
> sh plot_strain.sh cs2_rotate=0_ZincBlende111_C15_Al0.5
> sh plot_strain.sh cs2_rotate=0_Wurtzite0001_Al0.5

The above commands will produce three figures for each case (strain1.pdf, strain2.pdf, piezo.pdf) that correspond to the strain and piezoelectric polarization components. All figures are saved in the output/ folder.

Similarly, to generate Figure S2 in the supplementary material run in a terminal

> sh plot_strain.sh cs1_rotate=0_ZincBlende111_C15_Al0.5
> sh plot_strain.sh cs1_rotate=0_Wurtzite0001_Al0.5
> sh plot_strain.sh cs2_rotate=90_ZincBlende111_C15_Al0.5
> sh plot_strain.sh cs2_rotate=90_Wurtzite0001_Al0.5

To generate Figure 4a run in Matlab

>> curvature('cs1')

and to generate Figures 4b and 5, then run in Matlab

>> curvature('cs2')
  1. Run simulations

The following command generates a basic nanowire simulation:

> julia --project=.
julia> using TestEnv; TestEnv.activate()
julia> include("scripts/nanowire.jl"); Nanowire.main()

All existing data in the data/ folder can be reproduced by the main function in Nanowire.jl. For instance, to generate the data for Figure 1a, run

julia> using TestEnv; TestEnv.activate()
julia> include("scripts/nanowire.jl");
julia> using PyPlot
julia> Nanowire.main(geometry=[30,20,10,2000],cross_section=1,rotate=90,mstruct=ZincBlende111_C15,stressor_x=0.5,Plotter=PyPlot,postprocess=true,force=true)

About

Repository to reproduce data and figures from manuscript

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors