Source code for mstm_studio.alloy_AuAg
# -*- coding: utf-8 -*-
#
# ----------------------------------------------------- #
# #
# This code is a part of T-matrix fitting project #
# Contributors: #
# A. Skidanenko <ann.skidanenko@ya.ru> #
# L. Avakyan <laavakyan@sfedu.ru> #
# V. Pryadchenko <vvpryadchenko@sfedu.ru> #
# #
# ----------------------------------------------------- #
"""
Dielectric function model for silver-gold alloy
according to Fortran code published in:
D. Rioux, S. Vallières, S. Besner, P. Muñoz, E. Mazur, and M. Meunier,
"An Analytic Model for the Dielectric Function of Au, Ag, and
their Alloys" Adv. Opt. Mater. (2014) *2* 176-182
<http://dx.doi.org/10.1002/adom.201300457>
"""
from __future__ import print_function
import numpy as np
from mstm_studio.mstm_spectrum import Material
try:
import matplotlib.pyplot as plt
except:
pass
# use input in both python2 and python3
try:
input = raw_input
except NameError:
pass
c = 2.99792458e17
h = 4.135667516e-15
wp11 = 8.9234
wp12 = 8.5546
wp13 = 9.0218
gammap21 = 0.042389
gammap22 = 0.022427
gammap23 = 0.16713
einf31 = 2.2715
einf32 = 1.7381
einf33 = 2.2838
wg141 = 2.6652
wg142 = 4.0575
wg143 = 3.0209
w0151 = 2.3957
w0152 = 3.9260
w0153 = 2.7976
gamma161 = 0.17880
gamma162 = 0.017723
gamma163 = 0.18833
A171 = 73.251
A172 = 51.217
A173 = 22.996
w0281 = 3.5362
w0282 = 4.1655
w0283 = 3.3400
gamma291 = 0.35467
gamma292 = 0.18819
gamma293 = 0.68309
A2101 = 40.007
A2102 = 30.770
A2103 = 57.540
[docs]class AlloyAuAg(Material):
"""
Material class for AuAg alloys.
Use `get_n()` and `get_k()` to obtain values of refraction indexes (real
and imaginary) at arbitraty wavelength (in nm) by model and code
from Rioux et al doi:10.1002/adom.201300457
"""
def __init__(self, x_Au):
'''
Parameters:
x_Au: float
fraction of gold
'''
self.x_Au = float(x_Au)
self.__name__ = 'Mat_alloyAu%.2fAg%.2f' % (self.x_Au, 1-self.x_Au)
def _drude(self, omega, GMF):
wp = (GMF**2)*(2*wp11-4*wp13+2*wp12)+GMF*(-wp11+4*wp13-3*wp12)+wp12
gammap = (GMF**2)*(2*gammap21-4*gammap23+2*gammap22)+GMF*(-gammap21+4*gammap23-3*gammap22)+gammap22
einf = (GMF**2)*(2*einf31-4*einf33+2*einf32)+GMF*(-einf31+4*einf33-3*einf32)+einf32
wg1 = (GMF**2)*(2*wg141-4*wg143+2*wg142)+GMF*(-wg141+4*wg143-3*wg142)+wg142
w01 = (GMF**2)*(2*w0151-4*w0153+2*w0152)+GMF*(-w0151+4*w0153-3*w0152)+w0152
gamma1 = (GMF**2)*(2*gamma161-4*gamma163+2*gamma162)+GMF*(-gamma161+4*gamma163-3*gamma162)+gamma162
A1 = (GMF**2)*(2*A171-4*A173+2*A172)+GMF*(-A171+4*A173-3*A172)+A172
w02 = (GMF**2)*(2*w0281-4*w0283+2*w0282)+GMF*(-w0281+4*w0283-3*w0282)+w0282
gamma2 = (GMF**2)*(2*gamma291-4*gamma293+2*gamma292)+GMF*(-gamma291+4*gamma293-3*gamma292)+gamma292
A2 = (GMF**2)*(2*A2101-4*A2103+2*A2102)+GMF*(-A2101+4*A2103-3*A2102)+A2102
temp1 = omega**2 + 1j * omega*gammap
drude = einf - ((wp**2)/temp1)
compl2 = omega + 1j * gamma2
compl1 = omega + 1j * gamma1
cp1 = A1*((1/(compl1**2))*(-np.sqrt(compl1-wg1)*np.arctan(np.sqrt((wg1-w01)/(compl1-wg1)))) + (1/(compl1**2))*(-np.sqrt(compl1+wg1)*np.arctanh(np.sqrt((wg1-w01)/(compl1+wg1))))+(1/(compl1**2))*(2*np.sqrt(wg1)*np.arctanh(np.sqrt((wg1-w01)/wg1))) - np.sqrt(wg1-w01)*np.log(1-((compl1)/w01)**2)/(2*(compl1)**2))
cp2 = -A2 * np.log(1-(compl2/w02)**2)/(2*(compl2)**2)
return drude, cp1, cp2
def _eps(self, omega, x_au):
drude, cp1, cp2 = self._drude(omega, x_au)
kk = drude + cp1 + cp2
eps1 = kk.real
eps2 = kk.imag
return eps1, eps2
def get_n(self, wls):
omega = h*c/wls
eps1, eps2 = self._eps(omega, self.x_Au)
n = (eps1 + 1j * eps2)**0.5
return n.real
def get_k(self, wls):
omega = h*c/wls
eps1, eps2 = self._eps(omega, self.x_Au)
n = (eps1 + 1j * eps2)**0.5
return n.imag
if __name__== '__main__':
print('Alloy material test')
from mstm_studio.alloy_AuAg import AlloyAuAg
mat = AlloyAuAg(0.5)
print(mat)
# mat.plot()
print('n, k = ', mat.get_n(800), mat.get_k(800))
input('Press enter')
mat.plot()