Scattering and absorption by plasmonic nanoparticles
In this tutorial we will compute frequency-dependent scattering and absorption profiles for the following varieties of plasmonic nanoparticle configuration:
- Single triangular gold nanoparticle:
- Two facing triangular gold nanoparticles:
- Gold-coated SiO2 nanoparticle:
The input files for this example are in the
Nanoparticles
subdirectory of the
SCUFFTutorial
archive.
To avoid having to enter lengthy subdirectory prefixes when
specifying scuff-em input files,
it's convenient to set the following environment variables
to tell scuff-em
where to look for .msh
and .scuffgeo
files:
% export SCUFF_MESH_PATH=${HOME}/SCUFFTutorial/Nanoparticles/mshFiles
% export SCUFF_GEO_PATH=${HOME}/SCUFFTutorial/Nanoparticles/scuffgeoFiles
GMSH geometry file
The file
Triangle.geo
lives in the subdirectory
Nanoparticles/geoFiles.
This file contains
the following user-tweakable parameters:
-
L:
Triangle edge length (default 300 nm) -
R:
Corner rounding radius (default 25 nm) -
T:
Thickness (default 150 nm)
Here's the sequence of geometrical primitives I use to build up the geometry shown above.
Step 1
// define first point of triangle to lie at the origin
Point(1) = {0, 0, -T/2, LS};
Step 2
// extrude through circular arcs to define a rounded corner
Extrude { {0,0,1}, {0, 2*R, 0}, +Pi/3 } { Point{1}; }
Extrude { {0,0,1}, {0, 2*R, 0}, -Pi/3 } { Point{1}; }
Step 3
// replicate the lines (really "arcs") just created
// to define the other two triangle corners
Rotate { {0,0,1}, {0,R+L*Sqrt[3]/4, 0}, +2*Pi/3 } { Duplicata{Line{1,2}; }}
Rotate { {0,0,1}, {0,R+L*Sqrt[3]/4, 0}, -2*Pi/3 } { Duplicata{Line{1,2}; }}
Step 4
// connect endpoints to define a closed loop bounding a surface
Line(10) = {2,12};
Line(11) = {7,20};
Line(12) = {15,4};
Line Loop(1) = {1, 10, -4, 3, 11, -6, 5, 12, -2};
Plane Surface(1) = {1};
Step 5
// for the finite-thickness case, extrude in the z direction
If (T!=0)
Extrude {0,0,T} { Surface{1}; }
EndIf
GMSH mesh files
We convert the .geo
file into a .msh
file by running
gmsh like this:
mylaptop % gmsh -clscale 1.0 -2 Triangle.geo -o Triangle_Medium.msh
mylaptop % gmsh -clscale 0.75 -2 Triangle.geo -o Triangle_Fine.msh
Note that we have used the
scuff-em command-line option
-clscale
(which stands for "characteristic length scale")
to create medium-resolution and finer-resolution meshes:
Triangle_Medium.msh
Triangle_Fine.msh
I will also make smaller versions of this geometry in which all linear dimensions are reduced by 20% from their default values:
mylaptop % gmsh -clscale 1.0 -setnumber L 0.240 -setnumber R 0.20 -setnumber T 0.120 -2 Triangle.geo -o SmallTriangle_Medium.msh
mylaptop % gmsh -clscale 1.0 -setnumber L 0.240 -setnumber R 0.20 -setnumber T 0.120 -2 Triangle.geo -o SmallTriangle_Fine.msh
SmallTriangle_Fine.msh
SCUFF-EM geometry files
Single gold triangle, medium resolution
GoldTriangle_Medium.scuffgeo
MATERIAL GOLD
wp = 1.37e16;
gamma = 5.32e13;
Eps(w) = 1 - wp^2 / (w * (w + i*gamma));
ENDMATERIAL
OBJECT Triangle
MESHFILE Triangle_Medium.msh
MATERIAL Gold
ENDOBJECT
Two gold triangles, medium resolution, tip-tip separation 50 nm
TwoGoldTriangles_Medium.scuffgeo
MATERIAL GOLD
wp = 1.37e16;
gamma = 5.32e13;
Eps(w) = 1 - wp^2 / (w * (w + i*gamma));
ENDMATERIAL
OBJECT NorthTriangle
MESHFILE Triangle_Medium.msh
MATERIAL Gold
DISPLACED 0 0.025 0
ENDOBJECT
OBJECT SouthTriangle
MESHFILE Triangle_Medium.msh
MATERIAL Gold
ROTATED 180 ABOUT 0 0 1
DISPLACED 0 -0.025 0
ENDOBJECT
With more complicated .scuffgeo
files like this,
before launching any calculations
it's generally a good idea to visualize the configuration
as interpreted by scuff-em
just to make sure you are getting the geometry you
want. This can be done by using the
scuff-analyze
utility with the --WriteGMSHFiles
option:
mylaptop % scuff-analyze --WriteGMSHFiles --geometry TwoGoldTriangles_Medium.scuffgeo
mylaptop % gmsh TwoGoldTriangles_Medium.pp
Gold-coated SiO2 triangle
The following .scuffgeo
file describes the smaller of
the two triangle meshes created above lying fully inside
the larger of the two triangles; the inner triangle is
composed of SiO~2~, while the region between the inner and outer
triangles is composed of gold.
GoldCoatedSiO2Triangle_Medium.scuffgeo
MATERIAL GOLD
wp = 1.37e16;
gamma = 5.32e13;
Eps(w) = 1 - wp^2 / (w * (w + i*gamma));
ENDMATERIAL
MATERIAL SIO2
A1 = 8.2736e+13;
w01 = 8.54484e+13;
G1 = 8.46448e+12;
A2 = 1.58004e+14;
w02 = 2.029e+14;
G2 = 1.06449e+13;
A3 = 3.39786e+13;
w03 = 1.51198e+14;
G3 = 8.33205e+12;
EpsInf = 2.03843;
Eps(w) = EpsInf + A1*A1/(w01*w01 - w*w - i*w*G1) + A2*A2/(w02*w02 - w*w - i*w*G2) + A3*A3/(w03*w03 - w*w - i*w*G3);
ENDMATERIAL
OBJECT Coating
MESHFILE Triangle_Medium.msh
MATERIAL Gold
ENDOBJECT
OBJECT Triangle
MESHFILE SmallTriangle_Medium.msh
MATERIAL SiO2
DISPLACED 0 0.025 0
ENDOBJECT
Run scuff-analyze to visualize:
mylaptop % scuff-analyze --WriteGMSHFiles --geometry GoldCoatedSiO2Triangle.scuffgeo
mylaptop % gmsh GoldCoatedSiO2Triangle.scuffgeo
Calculating absorbed/scattered power, force, and torque (PFT) vs. frequency
The following script loops over all geometries (single triangle,
two triangles, nested triangles) at both meshing
resolutions (medium and fine), computing PFT vs. frequency
at all frequencies in OmegaFile
assuming
a -directed -polarized incident plane wave:
RunScript
#!/bin/bash
BASEDIR=${HOME}/SCUFFTutorial/Nanoparticles
export SCUFF_MESH_PATH=${BASEDIR}/mshFiles
export SCUFF_GEO_PATH=${BASEDIR}/scuffgeoFiles
for RES in Medium Fine
do
for GEOM in GoldTriangle TwoGoldTriangles GoldCoatedSiO2Triangle
do
ARGS=""
ARGS="${ARGS} --geometry ${GEOM}_${RES}.scuffgeo"
ARGS="${ARGS} --OmegaFile ${BASEDIR}/OmegaFile"
ARGS="${ARGS} --PWDirection 0 0 1"
ARGS="${ARGS} --PWPolarization 1 0 0"
ARGS="${ARGS} --PFTFile ${GEOM}_${RES}.PFT"
scuff-scatter ${ARGS}
done
done
Run the script:
% chmod 755 RunScript
% RunScript
Plot power absorption vs. frequency:
Advanced: Running the calculation for multiple incident-field polarizations and tip-tip separations at the same time
% scuff-analyze --TransFile TransFile --geometry scuffgeoFiles/TwoGoldTriangles_Medium.scuffgeo
% gmsh TwoGoldTriangles_Medium.transformed.pp
![TransformedTriangles][TransformedTriangles.png]