Month: October 2016

Another Linux shared library trace facility

October 27, 2016 C/C++ development and debugging. , ,

I previously blogged about a way to force ltrace to show some shared memory trace records that didn’t show up by default.

Where that fails to be useful, is when you don’t have a guess about what shared library the code in question lives in. I just blundered on the latrace command that uses a Linux dynamic loader audit facility to give a complete trace of all the function-name/library-name pairs that are executed!

Here’s an example invocation:

latrace \
clang xx.c -c 2>&1 | c++filt

without output like:

...
 9022     std::operator&(std::memory_order, std::__memory_order_modifier) [/home/pjoot/clang/be.5e0ac1f.lz31/bin/../lib/libLLVMAnalysis.so]
 9022     std::operator&(std::memory_order, std::__memory_order_modifier) [/home/pjoot/clang/be.5e0ac1f.lz31/bin/../lib/libLLVMAnalysis.so]
 9022     strlen [/lib64/libc.so.6]
 9022     strlen [/lib64/libc.so.6]
 9022     strlen [/lib64/libc.so.6]
 9022     llvm::cl::basic_parser::basic_parser(llvm::cl::Option&) [/home/pjoot/clang/be.5e0ac1f.lz31/bin/../lib/libLLVMSupport.so]
 9022     strlen [/lib64/libc.so.6]
 9022     llvm::cl::Option::setArgStr(llvm::StringRef) [/home/pjoot/clang/be.5e0ac1f.lz31/bin/../lib/libLLVMSupport.so]
 9022     strlen [/lib64/libc.so.6]
 9022     std::pair::__type, std::__decay_and_strip::__type> std::make_pair(void const**&&, bool&&) [/home/pjoot/clang/be.5e0ac1f.lz31/bin/../lib/libLLVMX86CodeGen.so]
 9022       void const**&& std::forward(std::remove_reference::type&) [/home/pjoot/clang/be.5e0ac1f.lz31/bin/../lib/libLLVMX86CodeGen.so]
 9022       bool&& std::forward(std::remove_reference::type&) []
 9022       void const**&& std::forward(std::remove_reference::type&) [/home/pjoot/clang/be.5e0ac1f.lz31/bin/../lib/libLLVMX86CodeGen.so]
 9022       bool&& std::forward(std::remove_reference::type&) []
 9022     void const**&& std::forward(std::remove_reference::type&) [/home/pjoot/clang/be.5e0ac1f.lz31/bin/../lib/libLLVMX86CodeGen.so]
...

With this latrace command, we get all the shared library function call names and their corresponding shared library names. Using that info we can dig into a specific shared library with ltrace or the debugger, once a point of interest is determined.

Line charge field and potential.

October 26, 2016 math and physics play , , , , , , , , , ,

[Click here for a PDF of this post with nicer formatting]

When computing the most general solution of the electrostatic potential in a plane, Jackson [1] mentions that \( -2 \lambda_0 \ln \rho \) is the well known potential for an infinite line charge (up to the unit specific factor). Checking that statement, since I didn’t recall what that potential was offhand, I encountered some inconsistencies and non-convergent integrals, and thought it was worthwhile to explore those a bit more carefully. This will be done here.

Using Gauss’s law.

For an infinite length line charge, we can find the radial field contribution using Gauss’s law, imagining a cylinder of length \( \Delta l \) of radius \( \rho \) surrounding this charge with the midpoint at the origin. Ignoring any non-radial field contribution, we have

\begin{equation}\label{eqn:lineCharge:20}
\int_{-\Delta l/2}^{\Delta l/2} \ncap \cdot \BE (2 \pi \rho) dl = \frac{\lambda_0}{\epsilon_0} \Delta l,
\end{equation}

or

\begin{equation}\label{eqn:lineCharge:40}
\BE = \frac{\lambda_0}{2 \pi \epsilon_0} \frac{\rhocap}{\rho}.
\end{equation}

Since

\begin{equation}\label{eqn:lineCharge:60}
\frac{\rhocap}{\rho} = \spacegrad \ln \rho,
\end{equation}

this means that the potential is

\begin{equation}\label{eqn:lineCharge:80}
\phi = -\frac{2 \lambda_0}{4 \pi \epsilon_0} \ln \rho.
\end{equation}

Finite line charge potential.

Let’s try both these calculations for a finite charge distribution. Gauss’s law looses its usefulness, but we can evaluate the integrals directly. For the electric field

\begin{equation}\label{eqn:lineCharge:100}
\BE
= \frac{\lambda_0}{4 \pi \epsilon_0} \int \frac{(\Bx – \Bx’)}{\Abs{\Bx – \Bx’}^3} dl’.
\end{equation}

Using cylindrical coordinates with the field point \( \Bx = \rho \rhocap \) for convience, the charge point \( \Bx’ = z’ \zcap \), and a the charge distributed over \( [a,b] \) this is

\begin{equation}\label{eqn:lineCharge:120}
\BE
= \frac{\lambda_0}{4 \pi \epsilon_0} \int_a^b \frac{(\rho \rhocap – z’ \zcap)}{\lr{\rho^2 + (z’)^2}^{3/2}} dz’.
\end{equation}

When the charge is uniformly distributed around the origin \( [a,b] = b[-1,1] \) the \( \zcap \) component of this field is killed because the integrand is odd. This justifies ignoring such contributions in the Gaussing cylinder analysis above. The general solution to this integral is found to be

\begin{equation}\label{eqn:lineCharge:140}
\BE
=
\frac{\lambda_0}{4 \pi \epsilon_0}
\evalrange{
\lr{
\frac{z’ \rhocap }{\rho \sqrt{ \rho^2 + (z’)^2 } }
+\frac{\zcap}{ \sqrt{ \rho^2 + (z’)^2 } }
}
}{a}{b},
\end{equation}

or
\begin{equation}\label{eqn:lineCharge:240}
\boxed{
\BE
=
\frac{\lambda_0}{4 \pi \epsilon_0}
\lr{
\frac{\rhocap }{\rho}
\lr{
\frac{b}{\sqrt{ \rho^2 + b^2 } }
-\frac{a}{\sqrt{ \rho^2 + a^2 } }
}
+ \zcap
\lr{
\frac{1}{ \sqrt{ \rho^2 + b^2 } }
-\frac{1}{ \sqrt{ \rho^2 + a^2 } }
}
}.
}
\end{equation}

When \( b = -a = \Delta l/2 \), this reduces to

\begin{equation}\label{eqn:lineCharge:160}
\BE
=
\frac{\lambda_0}{4 \pi \epsilon_0}
\frac{\rhocap }{\rho}
\frac{\Delta l}{\sqrt{ \rho^2 + (\Delta l/2)^2 } },
\end{equation}

which further reduces to \ref{eqn:lineCharge:40} when \( \Delta l \gg \rho \).

Finite line charge potential. Wrong but illuminating.

Again, putting the field point at \( z’ = 0 \), we have

\begin{equation}\label{eqn:lineCharge:180}
\phi(\rho)
= \frac{\lambda_0}{4 \pi \epsilon_0} \int_a^b \frac{dz’}{\lr{\rho^2 + (z’)^2}^{1/2}},
\end{equation}

which integrates to
\begin{equation}\label{eqn:lineCharge:260}
\phi(\rho)
= \frac{\lambda_0}{4 \pi \epsilon_0 }
\ln \frac{ b + \sqrt{ \rho^2 + b^2 }}{ a + \sqrt{\rho^2 + a^2}}.
\end{equation}

With \( b = -a = \Delta l/2 \), this approaches

\begin{equation}\label{eqn:lineCharge:200}
\phi
\approx
\frac{\lambda_0}{4 \pi \epsilon_0 }
\ln \frac{ (\Delta l/2) }{ \rho^2/2\Abs{\Delta l/2}}
=
\frac{-2 \lambda_0}{4 \pi \epsilon_0 } \ln \rho
+
\frac{\lambda_0}{4 \pi \epsilon_0 }
\ln \lr{ (\Delta l)^2/2 }.
\end{equation}

Before \( \Delta l \) is allowed to tend to infinity, this is identical (up to a difference in the reference potential) to \ref{eqn:lineCharge:80} found using Gauss’s law. It is, strictly speaking, singular when \( \Delta l \rightarrow \infty \), so it does not seem right to infinity as a reference point for the potential.

There’s another weird thing about this result. Since this has no \( z \) dependence, it is not obvious how we would recover the non-radial portion of the electric field from this potential using \( \BE = -\spacegrad \phi \)? Let’s calculate the elecric field from \ref{eqn:lineCharge:180} explicitly

\begin{equation}\label{eqn:lineCharge:220}
\begin{aligned}
\BE
&=
-\frac{\lambda_0}{4 \pi \epsilon_0}
\spacegrad
\ln \frac{ b + \sqrt{ \rho^2 + b^2 }}{ a + \sqrt{\rho^2 + a^2}} \\
&=
-\frac{\lambda_0 \rhocap}{4 \pi \epsilon_0 }
\PD{\rho}{}
\ln \frac{ b + \sqrt{ \rho^2 + b^2 }}{ a + \sqrt{\rho^2 + a^2}} \\
&=
-\frac{\lambda_0 \rhocap}{4 \pi \epsilon_0}
\lr{
\inv{ b + \sqrt{ \rho^2 + b^2 }} \frac{ \rho }{\sqrt{ \rho^2 + b^2 }}
-\inv{ a + \sqrt{ \rho^2 + a^2 }} \frac{ \rho }{\sqrt{ \rho^2 + a^2 }}
} \\
&=
-\frac{\lambda_0 \rhocap}{4 \pi \epsilon_0 \rho}
\lr{
\frac{ -b + \sqrt{ \rho^2 + b^2 }}{\sqrt{ \rho^2 + b^2 }}
-\frac{ -a + \sqrt{ \rho^2 + a^2 }}{\sqrt{ \rho^2 + a^2 }}
} \\
&=
\frac{\lambda_0 \rhocap}{4 \pi \epsilon_0 \rho}
\lr{
\frac{ b }{\sqrt{ \rho^2 + b^2 }}
-\frac{ a }{\sqrt{ \rho^2 + a^2 }}
}.
\end{aligned}
\end{equation}

This recovers the radial component of the field from \ref{eqn:lineCharge:240}, but where did the \( \zcap \) component go? The required potential appears to be

\begin{equation}\label{eqn:lineCharge:340}
\phi(\rho, z)
=
\frac{\lambda_0}{4 \pi \epsilon_0 }
\ln \frac{ b + \sqrt{ \rho^2 + b^2 }}{ a + \sqrt{\rho^2 + a^2}}

\frac{z \lambda_0}{4 \pi \epsilon_0 }
\lr{ \frac{1}{\sqrt{\rho^2 + b^2}}
-\frac{1}{\sqrt{\rho^2 + a^2}}
}.
\end{equation}

When computing the electric field \( \BE(\rho, \theta, z) \), it was convienent to pick the coordinate system so that \( z = 0 \). Doing this with the potential gives the wrong answers. The reason for this appears to be that this kills the potential term that is linear in \( z \) before taking its gradient, and we need that term to have the \( \zcap \) field component that is expected for a charge distribution that is non-symmetric about the origin on the z-axis!

Finite line charge potential. Take II.

Let the point at which the potential is evaluated be

\begin{equation}\label{eqn:lineCharge:360}
\Bx = \rho \rhocap + z \zcap,
\end{equation}

and the charge point be
\begin{equation}\label{eqn:lineCharge:380}
\Bx’ = z’ \zcap.
\end{equation}

This gives

\begin{equation}\label{eqn:lineCharge:400}
\begin{aligned}
\phi(\rho, z)
&= \frac{\lambda_0}{4\pi \epsilon_0} \int_a^b \frac{dz’}{\Abs{\rho^2 + (z – z’)^2 }} \\
&= \frac{\lambda_0}{4\pi \epsilon_0} \int_{a-z}^{b-z} \frac{du}{ \Abs{\rho^2 + u^2} } \\
&= \frac{\lambda_0}{4\pi \epsilon_0}
\evalrange{\ln \lr{ u + \sqrt{ \rho^2 + u^2 }}}{b-z}{a-z} \\
&=
\frac{\lambda_0}{4\pi \epsilon_0}
\ln \frac
{ b-z + \sqrt{ \rho^2 + (b-z)^2 }}
{ a-z + \sqrt{ \rho^2 + (a-z)^2 }}.
\end{aligned}
\end{equation}

The limit of this potential \( a = -\Delta/2 \rightarrow -\infty, b = \Delta/2 \rightarrow \infty \) doesn’t exist in any strict sense. If we are cavilier about the limits, as in \ref{eqn:lineCharge:200}, this can be evaluated as

\begin{equation}\label{eqn:lineCharge:n}
\phi \approx
\frac{\lambda_0}{4\pi \epsilon_0} \lr{ -2 \ln \rho + \textrm{constant} }.
\end{equation}

however, the constant (\( \ln \Delta^2/2 \)) is infinite, so there isn’t really a good justification for using that constant as the potential reference point directly.

It seems that the “right” way to calculate the potential for the infinite distribution, is to

  • Calculate the field from the potential.
  • Take the PV limit of that field with the charge distribution extending to infinity.
  • Compute the corresponding potential from this limiting value of the field.

Doing that doesn’t blow up. That field calculation, for the finite case, should include a \( \zcap \) component. To verify, let’s take the respective derivatives

\begin{equation}\label{eqn:lineCharge:420}
\begin{aligned}
-\PD{z}{} \phi
&=
-\frac{\lambda_0}{4\pi \epsilon_0}
\lr{
\frac{ -1 + \frac{z – b}{\sqrt{ \rho^2 + (b-z)^2 }} }{
b-z + \sqrt{ \rho^2 + (b-z)^2 }
}

\frac{ -1 + \frac{z – a}{\sqrt{ \rho^2 + (a-z)^2 }} }{
a-z + \sqrt{ \rho^2 + (a-z)^2 }
}
} \\
&=
\frac{\lambda_0}{4\pi \epsilon_0}
\lr{
\frac{ 1 + \frac{b – z}{\sqrt{ \rho^2 + (b-z)^2 }} }{
b-z + \sqrt{ \rho^2 + (b-z)^2 }
}

\frac{ 1 + \frac{a – z}{\sqrt{ \rho^2 + (a-z)^2 }} }{
a-z + \sqrt{ \rho^2 + (a-z)^2 }
}
} \\
&=
\frac{\lambda_0}{4\pi \epsilon_0}
\lr{
\inv{\sqrt{ \rho^2 + (b-z)^2 }}
-\inv{\sqrt{ \rho^2 + (a-z)^2 }}
},
\end{aligned}
\end{equation}

and

\begin{equation}\label{eqn:lineCharge:440}
\begin{aligned}
-\PD{\rho}{} \phi
&=
-\frac{\lambda_0}{4\pi \epsilon_0}
\lr{
\frac{ \frac{\rho}{\sqrt{ \rho^2 + (b-z)^2 }} }{
b-z + \sqrt{ \rho^2 + (b-z)^2 }
}

\frac{ \frac{\rho}{\sqrt{ \rho^2 + (a-z)^2 }} }{
a-z + \sqrt{ \rho^2 + (a-z)^2 }
}
} \\
&=
-\frac{\lambda_0}{4\pi \epsilon_0}
\lr{
\frac{\rho \lr{
-(b-z) + \sqrt{ \rho^2 + (b-z)^2 }
}}{ \rho^2 \sqrt{ \rho^2 + (b-z)^2 } }

\frac{\rho \lr{
-(a-z) + \sqrt{ \rho^2 + (a-z)^2 }
}}{ \rho^2 \sqrt{ \rho^2 + (a-z)^2 } }
} \\
&=
\frac{\lambda_0}{4\pi \epsilon_0 \rho}
\lr{
\frac{b-z}{\sqrt{ \rho^2 + (b-z)^2 }}
-\frac{a-z}{\sqrt{ \rho^2 + (a-z)^2 }}
}
.
\end{aligned}
\end{equation}

Putting the pieces together, the electric field is
\begin{equation}\label{eqn:lineCharge:460}
\BE =
\frac{\lambda_0}{4\pi \epsilon_0}
\lr{
\frac{\rhocap}{\rho} \lr{
\frac{b-z}{\sqrt{ \rho^2 + (b-z)^2 }}
-\frac{a-z}{\sqrt{ \rho^2 + (a-z)^2 }}
}
+
\zcap \lr{
\inv{\sqrt{ \rho^2 + (b-z)^2 }}
-\inv{\sqrt{ \rho^2 + (a-z)^2 }}
}
}.
\end{equation}

For has a PV limit of \ref{eqn:lineCharge:40} at \( z = 0 \), and also for the finite case, has the \( \zcap \) field component that was obtained when the field was obtained by direct integration.

Conclusions

  • We have to evaluate the potential at all points in space, not just on the axis that we evaluate the field on (should we choose to do so).
  • In this case, we found that it was not directly meaningful to take the limit of a potential distribution. We can, however, compute the field from a potential for a finite charge distribution,
    take the limit of that field, and then calculate the corresponding potential for the infinite distribution.

Is there a more robust mechanism that can be used to directly calculate the potential for an infinite charge distribution, instead of calculating the potential from the field of such an infinite distribution?

I think that were things go wrong is that the integral of \ref{eqn:lineCharge:180} does not apply to charge distributions that are not finite on the infinite range \( z \in [-\infty, \infty] \). That solution was obtained by utilizing an all-space Green’s function, and the boundary term in that Green’s analysis was assumed to tend to zero. That isn’t the case when the charge distribution is \( \lambda_0 \delta( z ) \).

References

[1] JD Jackson. Classical Electrodynamics. John Wiley and Sons, 2nd edition, 1975.

using ltrace to dig into shared libraries

October 19, 2016 C/C++ development and debugging., clang/llvm , ,

I was trying to find where the clang compiler is writing out constant global data values, and didn’t manage to find it by code inspection. If I run ltrace (also tracing system calls), I see the point where the ELF object is written out:

std::string::compare(std::string const&) const(0x7ffc8983a190, 0x1e32e60, 7, 254) = 5
std::string::compare(std::string const&) const(0x1e32e60, 0x7ffc8983a190, 7, 254) = 0xfffffffb
std::string::compare(std::string const&) const(0x7ffc8983a190, 0x1e32e60, 7, 254) = 5
write@SYS(4, "\177ELF\002\001\001", 848)         = 848
lseek@SYS(4, 40, 0)                              = 40
write@SYS(4, "\220\001", 8)                      = 8
lseek@SYS(4, 848, 0)                             = 848
lseek@SYS(4, 60, 0)                              = 60
write@SYS(4, "\a", 2)                            = 2
lseek@SYS(4, 848, 0)                             = 848
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()(0x1e2a2e0, 0x1e2a2e8, 0x1e27978, 0x1e27978) = 0
rt_sigprocmask@SYS(2, 0x7ffc8983bb58, 0x7ffc8983bad8, 8) = 0
close@SYS(4)                                     = 0
rt_sigprocmask@SYS(2, 0x7ffc8983bad8, 0, 8)      = 0

This is from running:

ltrace -S --demangle \
   ...

The -S is to display syscalls as well as library calls. To my suprise, this seems to show calls to libstdc++ library calls, but I’m not seeing much from clang itself, just:

clang::DiagnosticsEngine::DiagnosticsEngine
clang::driver::ToolChain::getTargetAndModeFromProgramName
llvm::cl::ExpandResponseFiles
llvm::EnablePrettyStackTrace
llvm::errs
llvm::install_fatal_error_handler
llvm::llvm_shutdown
llvm::PrettyStackTraceEntry::PrettyStackTraceEntry
llvm::PrettyStackTraceEntry::~PrettyStackTraceEntry
llvm::raw_ostream::preferred_buffer_size
llvm::raw_svector_ostream::write_impl
llvm::remove_fatal_error_handler
llvm::StringMapImpl::LookupBucketFor
llvm::StringMapImpl::RehashTable
llvm::sys::PrintStackTraceOnErrorSignal
llvm::sys::Process::FixupStandardFileDescriptors
llvm::sys::Process::GetArgumentVector
llvm::TimerGroup::printAll

There’s got to be a heck of a lot more that the compiler is doing!? It turns out that ltrace doesn’t seem to trace out all the library function calls that lie in shared libraries (I’m using a shared library + split dwarf build of clang). The default output was a bit deceptive since I saw some shared lib calls, in particular the there were std::… calls (from libstc++.so) in the ltrace output. My conclusion seems to be that the tool is lying by default.

This can be confirmed by explicitly asking to see the functions from a specific shared lib. For example, if I call ltrace as:

$ ltrace -S --demangle -e @libLLVMX86CodeGen.so \
/clang/be.b226a0a/bin/clang-3.9 \
-cc1 \
-triple \
x86_64-unknown-linux-gnu \
...

Now I get ~68K calls to libLLVMX86CodeGen.so functions that didn’t show up in the default ltrace output! The ltrace tool won’t show me these by default (although the man page seems to suggest that it should), but if I narrow down what I’m looking through to a single shared lib, at least I can now examine the function calls in that shared lib.

On the SONAME

Note that the @lib….so name has to match the SONAME.  For example if the shared libraries on disk were:

libLLVMX86CodeGen.so -> libLLVMX86CodeGen.so.3
libLLVMX86CodeGen.so.3 -> libLLVMX86CodeGen.so.3.9
libLLVMX86CodeGen.so.3.9 -> libLLVMX86CodeGen.so.3.9.0

$ objdump -x libLLVMX86CodeGen.so | grep SONAME

would give you the name to use.  This becomes relevant in clang 4.0 where the SONAME ends up with .so.4 instead of just .so (when building clang with shared libs instead of archive libs).

Magnetostatic force and torque

October 18, 2016 math and physics play , , , , , , ,

[Click here for a PDF of this post with nicer formatting]

In Jackson [1], the following equations for the vector potential, magnetostatic force and torque are derived

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:20}
\Bm = \inv{2} \int \Bx’ \cross \BJ(\Bx’) d^3 x’
\end{equation}
\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:40}
\BF = \spacegrad( \Bm \cdot \BB ),
\end{equation}
\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:60}
\BN = \Bm \cross \BB,
\end{equation}

where \( \BB \) is an applied external magnetic field and \( \Bm \) is the magnetic dipole for the current in question. These results (and a similar one derived earlier for the vector potential \( \BA \)) all follow from
an analysis of localized current densities \( \BJ \), evaluated far enough away from the current sources.

For the force and torque, the starting point for the force is one that had me puzzled a bit. Namely

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:80}
\BF = \int \BJ(\Bx) \cross \BB(\Bx) d^3 x
\end{equation}

This is clearly the continuum generalization of the point particle Lorentz force equation, which for \( \BE = 0 \) is:

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:100}
\BF = q \Bv \cross \BB
\end{equation}

For the point particle, this is the force on the particle when it is in the external field \( BB \). i.e. this is the force at the position of the particle. My question is what does it mean to sum all the forces on the charge distribution over all space.
How can a force be applied over all, as opposed to a force applied at a single point, or against a surface?

In the special case of a localized current density, this makes some sense. Considering the other half of the force equation \( \BF = \ddt{}\int \rho_m \Bv dV \), where \( \rho_m \) here is mass density of the charged particles making up the continuous current distribution. The other half of this \( \BF = m\Ba \) equation is also an average phenomena, so we have an average of sorts on both the field contribution to the force equation and the mass contribution to the force equation. There is probably a centre-of-mass and centre-of-current density interpretation that would make a bit more sense of this continuum force description.

It’s kind of funny how you can work through all the detailed mathematical steps in a book like Jackson, but then go right back to the beginning and say “Hey, what does that even mean”?

Force

Moving on from the pondering of the meaning of the equation being manipulated, let’s do the easy part, the derivation of the results that Jackson comes up with.

Writing out \ref{eqn:magnetostaticsJacksonNotesForceAndTorque:80} in coordinates

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:320}
\BF = \epsilon_{ijk} \Be_i \int J_j B_k d^3 x.
\end{equation}

To first order, a slowly varying (external) magnetic field can be expanded around a point of interest

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:120}
\BB(\Bx) = \BB(\Bx_0) + \lr{ \Bx – \Bx_0 } \cdot \spacegrad \BB,
\end{equation}

where the directional derivative is evaluated at the point \( \Bx_0 \) after the gradient operation. Setting the origin at this point \( \Bx_0 \) gives

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:340}
\begin{aligned}
\BF
&= \epsilon_{ijk} \Be_i
\lr{
\int J_j(\Bx’) B_k(0) d^3 x’
+
\int J_j(\Bx’) (\Bx’ \cdot \spacegrad) B_k(0) d^3 x’
} \\
&=
\epsilon_{ijk} \Be_i
\Bk_0 \int J_j(\Bx’) d^3 x’
+
\epsilon_{ijk} \Be_i
\int J_j(\Bx’) (\Bx’ \cdot \spacegrad) B_k(0) d^3 x’.
\end{aligned}
\end{equation}

We found

earlier
that the first integral can be written as a divergence

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:140}
\int J_j(\Bx’) d^3 x’
=
\int \spacegrad’ \cdot \lr{ \BJ(\Bx’) x_j’ } dV’,
\end{equation}

which is zero when the integration surface is outside of the current localization region. We also found

that

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:160}
\int (\Bx \cdot \Bx’) \BJ
= -\inv{2} \Bx \cross \int \Bx’ \cross \BJ = \Bm \cross \Bx.
\end{equation}

so
\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:180}
\begin{aligned}
\int (\spacegrad B_k(0) \cdot \Bx’) J_j
&= -\inv{2} \lr{ \spacegrad B_k(0) \cross \int \Bx’ \cross \BJ}_j \\
&= \lr{ \Bm \cross (\spacegrad B_k(0)) }_j.
\end{aligned}
\end{equation}

This gives

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:200}
\begin{aligned}
\BF
&= \epsilon_{ijk} \Be_i \lr{ \Bm \cross (\spacegrad B_k(0)) }_j \\
&= \epsilon_{ijk} \Be_i \lr{ \Bm \cross \spacegrad }_j B_k(0) \\
&= (\Bm \cross \spacegrad) \cross \BB(0) \\
&= -\BB(0) \cross (\Bm \cross \lspacegrad) \\
&= (\BB(0) \cdot \Bm) \lspacegrad – (\BB \cdot \lspacegrad) \Bm \\
&= \spacegrad (\BB(0) \cdot \Bm) – \Bm (\spacegrad \cdot \BB(0)).
\end{aligned}
\end{equation}

The second term is killed by the magnetic Gauss’s law, leaving to first order

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:220}
\BF = \spacegrad \lr{\Bm \cdot \BB}.
\end{equation}

Torque

For the torque we have a similar quandary at the starting point. About what point is a continuum torque integral of the following form

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:240}
\BN = \int \Bx’ \cross (\BJ(\Bx’) \cross \BB(\Bx’)) d^3 x’?
\end{equation}

Ignoring that detail again, assuming the answer has something to do with the centre of mass and parallel axis theorem, we can proceed with a constant approximation of the magnetic field

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:260}
\begin{aligned}
\BN
&= \int \Bx’ \cross (\BJ(\Bx’) \cross \BB(0)) d^3 x’ \\
&=
-\int (\Bx’ \cdot \BJ(\Bx’)) \BB(0) d^3 x’
+\int (\Bx’ \cdot \BB(0)) \BJ(\Bx’) d^3 x’ \\
&=
-\BB(0) \int (\Bx’ \cdot \BJ(\Bx’)) d^3 x’
+\int (\Bx’ \cdot \BB(0)) \BJ(\Bx’) d^3 x’.
\end{aligned}
\end{equation}

Jackson’s trick for killing the first integral is to transform it into a divergence by evaluating

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:280}
\begin{aligned}
\spacegrad \cdot \lr{ \BJ \Abs{\Bx}^2 }
&=
(\spacegrad \cdot \BJ) \Abs{\Bx}^2
+
\BJ \cdot \spacegrad \Abs{\Bx}^2 \\
&=
\BJ \cdot \Be_i \partial_i x_m x_m \\
&=
2 \BJ \cdot \Be_i \delta_{im} x_m \\
&=
2 \BJ \cdot \Bx,
\end{aligned}
\end{equation}

so

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:300}
\begin{aligned}
\BN
&=
-\inv{2} \BB(0) \int \spacegrad’ \cdot \lr{ \BJ(\Bx’) \Abs{\Bx’}^2 } d^3 x’
+\int (\Bx’ \cdot \BB(0)) \BJ(\Bx’) d^3 x’ \\
&=
-\inv{2} \BB(0) \oint \Bn \cdot \lr{ \BJ(\Bx’) \Abs{\Bx’}^2 } d^3 x’
+\int (\Bx’ \cdot \BB(0)) \BJ(\Bx’) d^3 x’.
\end{aligned}
\end{equation}

Again, the localized current density assumption kills the surface integral. The second integral can be evaluated with \ref{eqn:magnetostaticsJacksonNotesForceAndTorque:160}, so to first order we have

\begin{equation}\label{eqn:magnetostaticsJacksonNotesForceAndTorque:360}
\BN
=
\Bm \cross \BB.
\end{equation}

References

[1] JD Jackson. Classical Electrodynamics. John Wiley and Sons, 2nd edition, 1975.

Interesting tidbits in a Hillary Goldman Sacks wikileaks transcript.

October 16, 2016 Incoherent ramblings , , , , , , , , , , ,

Here’s some notes on a read of the first of the wikileaks transcripts of the Hillary Goldman Sacks talks.  There are three transcripts in total:

 

The main takeaway is that the State deptartment role is certainly not about diplomacy.  There’s lots of mentions of stirring up crap as part of the routine game.  Chaos is a desired end goal, so long as it’s controlled or directed.

page 7: North Korea:

We don’t want the North Koreans to
cause more trouble than the system can absorb. So
we’ve got a pretty good thing going with the
previous North Korean leaders

What an interesting statement.  The corollary seems to be that they do want North Korea to be stirring up trouble.  It serves to distract and limit China for example, a point made in other parts of the speech.

page 13: Syria:

So the problem for the US and the
Europeans has been from the very beginning: What
is it you — who is it you are going to try to arm?
And you probably read in the papers my view was we
should try to find some of the groups that were
there that we thought we could build relationships
with and develop some covert connections that might
then at least give us some insight into what is
going on inside Syria.

It is well known now that the US has been arming the “Free Syrian Army”, funnelling weapons in through Turkey via the Saudis.  Here Hillary is discussing exactly this process.  She actually expresses regret that the US isn’t as good at this discrete covert warmongering as they used to be.

page 14: Libya:

In Libya we didn’t have that problem.
It’s a huge place. The air defenses were not that
sophisticated and there wasn’t very — in fact,
there were very few civilian casualties.

A psychopath in action.  I hear of Hillary’s carpet bombing of Libya discussed as one of the most brutal and destructive campaigns in near history, and she describes it as “very few casualties”.  I don’t actually know the numbers, but it’s certainly interesting to see how casual she is with respect to the death of civilians.

page 15: on Iran? (or perhaps Syria):

Well, you up the pain
that they have to endure by not in any way
occupying or invading them but by bombing their
facilities. I mean, that is the option. It is not
as, we like to say these days, boots on the ground.

Causal talk of bombing other countries is so disgusting.  Notice how the word facilities is very vague.  Decoding this a bit, if you are simultaneously talking about “upping the pain” and bombing facilities, this is probably theorizing about bombing targets that have the most terror inducing and hardship effects on the civilians (water processing, energy production, schools, hospitals, …).  But that’s okay so long as it isn’t perceived as “boots on the ground”.

page 36: Russia:

And finally on Afghanistan and Russia.
Look, I would love it if we could continue to build
a more positive relationship with Russia. I worked
very hard on that when I was Secretary, and we made
some progress with Medvedev, who was president in
name but was obviously beholden to Putin, but Putin
kind of let him go and we helped them get into the
WTO for several years, and they were helpful to us
in shipping equipment, even lethal equipment, in
and out of out of Afghanistan.

Russia was a useful ally when they helped with covert wars.  Now that those covert wars are knocking on Russia’s door, the relationship has soured.  It’s hard to imagine why that relationship has deteriorated.