HomerReid / scuff-em

A comprehensive and full-featured computational physics suite for boundary-element analysis of electromagnetic scattering, fluctuation-induced phenomena (Casimir forces and radiative heat transfer), nanophotonics, RF device engineering, electrostatics, and more. Includes a core library with C++ and python APIs as well as many command-line applications.
http://www.homerreid.com/scuff-em
GNU General Public License v2.0
125 stars 50 forks source link

How to compute scattering component of force/torque? #118

Closed odmiller closed 7 years ago

odmiller commented 7 years ago

Hi Homer,

It looks like in the "EMTPFT" approach you compute forces and torques by computing the "extinction" quantity and then subtracting the scattered-field component. What is the easiest way to actually get the scattered-field component (or of equal value the extinction component) by itself?

It looks like on lines 207-209 of GetPFT.cc you get the PFT Matrix and PFT values, with the key call being HMatrix *PFTMatrix = GetEMTPFTMatrix(this, Omega, IF, KN, DRMatrix, 0, Interior, Method);

Am I correct that if I simply nullify the incident field, i.e. make the call HMatrix *PFTMatrix = GetEMTPFTMatrix(this, Omega, 0, KN, DRMatrix, 0, Interior, Method); then I will get the (negative of the) scattered-field component? So that if I then simply follow up with PFTMatrix->GetEntriesD(SurfaceIndex, ":", PFT); the PFT matrix will contain the negative of the scattered-field components?

(By the way, what does this function compute if one chooses Exterior instead of Interior?)

HomerReid commented 7 years ago

Am I correct that if I simply nullify the incident field, i.e. make the call HMatrix *PFTMatrix = GetEMTPFTMatrix(this, Omega, 0, KN, DRMatrix, 0, Interior, Method); then I will get the (negative of the) scattered-field component? So that if I then simply follow up withPFTMatrix->GetEntriesD(SurfaceIndex, ":", PFT); the PFT matrix will contain the negative of the scattered-field components?

Yes, you got it, except here PFT should be a double-valued array with room for 8 or more doubles (not an HMatrix) whose entries will not be scattered field components but rather scattering contributions to absorbed power, scattered power, {x,y,z}-force, and {x,y,z}-torque, in that order. (The "scattering contribution to the absorbed power" is just the negative of the scattered power.) I think you are aware of all of these things, just restating them to be clear.

If you alternatively nullify the KN argument while passing something nonzero for IF you will get just the extinction.

(By the way, what does this function compute if one chooses Exterior instead of Interior?)

The Interior argument to this function is a boolean flag that, if true, uses the interior expansion for the surface fields instead of the exterior expansion. However, by default this flag is set to false for all calculations in SCUFF-SCATTER and SCUFF-NEQ. So you should understand the Interior argument to GetEMTPFTMatrix to be always set to false.

There are two reasons to consider using the interior expansion.

The above advantages are in fact realized for (a) power computations in all cases, and (b) force/torque computations in lossless dielectrics. However, for force/torque computations in lossy dielectrics the interior expansions don't work. For this reason, I use the exterior expansion by default for all calculations in SCUFF-SCATTER and SCUFF-NEQ. Of course, if you are writing API codes you can certainly try running calculations with Interior=true to see if this gives better results for your particular problem.

odmiller commented 7 years ago

Very helpful, and informative! Thanks