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:

  1. Single triangular gold nanoparticle:

TwoTrianglesMesh

  1. Two facing triangular gold nanoparticles:

TwoTrianglesMesh

  1. Gold-coated SiO2 nanoparticle:

TwoTrianglesMesh

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
TriangleMediumMesh

Triangle_Fine.msh
TriangleFineMesh

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
SmallTriangleFineMesh


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

TwoTrianglesMesh

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

NestedTrianglesMesh

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]