StrainDistributionNanowires.jl: Reproducibility repository for numerical simulations on core/shell zincblende and wurtzite nanowires

Read full text
Authors: Y. Hadjimichael, O. Brandt, Christian Merdon, Costanza Lucia Manganelli, Patricio Farrell
Cited by: 1

Abstract

Data repository that 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. 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 witha 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 2. 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() 3. 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.5The 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') 4. 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, runjulia> using TestEnv; TestEnv.activate()julia> include("scripts/nanowire.jl");julia> using PyPlotjulia> 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)

Publication details

Journal / source
Zenodo (CERN European Organization for Nuclear Research)
Publication date
26 January 2026
Language
EN