Hello Irwin,
On 08/27/2018 07:17 PM, Irwin Zaid wrote:
Hello,
I'm been aware of SfePy for a very long time, but only recently have
actually been trying it. I've been surprised at how *simple* it is to get
things going, it's a great package. Thanks a lot for making it.
Thanks for the kind words!
What I'm trying to do is solve a scattering
problem from electromagnetism.
I'm working with a 3D vector electric field (of complex numbers). So far as
I can tell, I've been able to get the weak form of the problem, and it's
boundary conditions, implemented correctly.
Before answering your question, let me point out this. When doing
electromagnetic simulations, AFAIK, vector finite elements from the H(curl)
space are needed (e.g. Nedelec elements). I have no experience with such
elements, and those are not implemented in SfePy. So unless you are sure that
H1 elements are OK for your problem, SfePy might not be the right tool to use.
There are two things I'd like that are not working
at the moment. I'd could
really use some guidance, so would appreciate any help. These are:
1) I'd like to evaluate a surface integral of the electric field intensity I
= |E|^2 = E dot conj(E), where E is a vector, dot is the dot product, and
conj is the complex conjugate. I'm implementing my own term for this, which
I think should be nearly the same as the existing IntegrateSurfaceTerm.
However, it appears that the complex numbers are complicating things. The
function method of my new term is apparently called twice in 'eval' mode,
once for the real part and once for the imag part. Looking at the source
code of Term, this seems to be the implemented behavior. Is it possible to
get the function method called with the complex numbers themselves? If not,
what is the recommended technique for doing operations in which the real
parts and the imag parts do not separate cleanly (like for the magnitude of
a complex vector)? If it helps, I only need things like these in eval mode,
not as part of the solved equations.
It is not currently possible, but it could be rather easily implemented,
assuming your term evaluation function would be pure Python (or Cython). The
reason of the current implementation is more or less historical - a number of
term evaluation functions are implemented in C, so they expect just simple
float64 arrays.
2) I'd like to evaluate the magnetic field H from
the electric field E. This
is simply H = -1j * c * curl(E), where c is a constant (material parameter)
and curl is the vector curl operation. The vector field E is solved for as
part of my problem. What is the best way to add the equation for H into the
problem? I don't see a curl operation anywhere. Do I need a custom term or
can I do this with existing terms? It is fully determined by E, as above.
If this is meant just for post-processing, then the curl operator could be
added. However, for solving the full coupled Maxwell equations, H(curl)
elements would be required, as mentioned above. This is currently out of scope
for me to add.
Best regards,
r.