Page 1 of 1

Defining Current Density for Magnetic Analysis

Posted: 01 Jan 2019, 21:24
by dvarx
Hello everyone,

I would like to do a simulation of a static Magnetic Field which is generated by a static current density J. So I create a Magnetodynamic Equation (MgHarm) with the following body force:

Code: Select all

Body Force 1
  Name = "Current Density"
  Current Density 2 = 0
  Current Density Im 1 = 0
  Current Density 1 = 0
  Current Density Im 3 = 0
  Current Density Im 2 = 0
  Current Density 3 = 0
End
My question is how can I define the current density components as functions of the spatial coordinates (x,y,z)? For example, assume I want to define the current density in the following way (assuming a cylindrical coordinate system):
CodeCogsEqn (2).gif
CodeCogsEqn (2).gif (2.13 KiB) Viewed 954 times
Could I use an expression similar to this one (C-Syntax) in order to define the x-Component of the Current Density?

Code: Select all

		Current Density 1 = (abs(z)<h0&&sqrt(x*x+y*y)<rho_outer&&sqrt(x*x+y*y)>rho_inner)?(1/sqrt(x*x+y*y)*(-y)*J0):0
		Current Density Im 1 = 0

Re: Defining Current Density for Magnetic Analysis

Posted: 02 Jan 2019, 00:58
by raback
Hi

I would rather redommend making writing this as a small Fortran routine as it will be a lot faster and easier to debug. MATC makes string conversions back and forth making it painfully slow. I personally only use it for BCs and for testing.

-Peter

Re: Defining Current Density for Magnetic Analysis

Posted: 02 Jan 2019, 02:07
by dvarx
raback wrote:
02 Jan 2019, 00:58
Hi

I would rather redommend making writing this as a small Fortran routine as it will be a lot faster and easier to debug. MATC makes string conversions back and forth making it painfully slow. I personally only use it for BCs and for testing.

-Peter
Thanks for your response.

Is there a template for such Fortran routines (or the source code of a working example)? I have been looking in the non-gui tutorial but I couldn't find the Fortran source code for the examples which use Fortran routines.

Re: Defining Current Density for Magnetic Analysis

Posted: 02 Jan 2019, 22:03
by raback
Hi

Well there are plenty of UDFs among the tests. Any Real valued keyword can usually be MATC expression, UDF etc. This would be one of the simplest examples (untested):

Code: Select all

FUNCTION CurrDensX( model, n, args) RESULT( f )
  USE DefUtils

  IMPLICIT NONE
  TYPE(Model_t) :: model
  INTEGER :: n
  REAL(KIND=dp) :: args(3), f

  REAL(KIND=dp) :: x,y,z,r
  REAL(KIND=dp), PARAMETER :: H0 = 1.23, Rin = 1.0, Rout = 1.2, J0 = 4.56

  x = args(1)
  y = args(2)
  z = args(3) 
  r = SQRT( x**2 + y**2 )
  
  IF( ABS( z ) < H0 .AND. ( Rout - r ) * ( r - Rin ) > 0.0_dp ) THEN
    f = -y * J0 / r
  ELSE
    f = 0.0_dp
  END IF    
END FUNCTION CurrDensX
And you would compile it as

Code: Select all

elmerf90 -o CurrDens.so CurrDens.F90 
and call it in code as

Code: Select all

Current Density 1 = Variable "coordinate"
  Real Procedure "CurrDens" "CurrDensX"
Also place a similar CurrDensY in the same module.

Note that this is a step function so it does not integrate accurately. Rather define a body that defines the coil cross-section to have a clean step.

No need to define zeros as that's the default.

-Peter

Re: Defining Current Density for Magnetic Analysis

Posted: 03 Jan 2019, 22:04
by dvarx
Hello

Thanks for your answer. I am trying a simple test problem with a spherical charge density:
CodeCogsEqn.gif
CodeCogsEqn.gif (892 Bytes) Viewed 925 times
I have the following file ChargeDensity.f90:

Code: Select all

FUNCTION ChargeDensity( model, n, args) RESULT( f )
  USE DefUtils

  IMPLICIT NONE
  TYPE(Model_t) :: model
  INTEGER :: n
  REAL(KIND=dp) :: args(3), f

  REAL(KIND=dp) :: x,y,z,r
  REAL(KIND=dp), PARAMETER :: R0=0.01

  x = args(1)
  y = args(2)
  z = args(3) 
  r = SQRT( x**2 + y**2 + z**2)
  
  IF(r<R0) THEN
    f = 1
  ELSE
    f = 0
  END IF    
END FUNCTION ChargeDensity
and I compile it using:

Code: Select all

elmerf90 -o ChargeDensityLib.so ChargeDensity.f90
This results in the following compilation error (ElmerIceSolvers.so and ElmerIceUDF.so not found):

Code: Select all

dvarx@dvarx-ThinkPad-T550:~/Desktop/fem_simulations/electrostatic_example$ elmerf90 -o ChargeDensityLib.so ChargeDensity.f90
with elmerice
/usr/bin/f95 -o ChargeDensityLib.so ChargeDensity.f90 -DCONTIG=,CONTIGUOUS -DHAVE_EXECUTECOMMANDLINE -DUSE_ISO_C_BINDINGS -DUSE_ARPACK -O2 -g -DNDEBUG -fPIC -shared -I/home/dvarx/elmer/install//share/elmersolver/include -L/home/dvarx/elmer/install//lib/elmersolver /home/dvarx/elmer/install//lib/elmersolver/../../share/elmersolver/lib/ElmerIceSolvers.so /home/dvarx/elmer/install//lib/elmersolver/../../share/elmersolver/lib/ElmerIceUSF.so -shared -lelmersolver 
f95: error: /home/dvarx/elmer/install//lib/elmersolver/../../share/elmersolver/lib/ElmerIceSolvers.so: No such file or directory
f95: error: /home/dvarx/elmer/install//lib/elmersolver/../../share/elmersolver/lib/ElmerIceUSF.so: No such file or directory
Do I need to change anything else (I built elmer using https://www.github.com/ElmerCSC/elmerfem)?

Re: Defining Current Density for Magnetic Analysis

Posted: 04 Jan 2019, 11:08
by mzenker
Hi,

I cannot help with the compilation error, but I would like to add for the records that there is a chapter "basic programming" in the Solver manual, and there is also a Programmer's tutorial.

Matthias

Re: Defining Current Density for Magnetic Analysis

Posted: 04 Jan 2019, 12:54
by dvarx
mzenker wrote:
04 Jan 2019, 11:08
Hi,

I cannot help with the compilation error, but I would like to add for the records that there is a chapter "basic programming" in the Solver manual, and there is also a Programmer's tutorial.

Matthias
Ok, I got it to work no by removing the ElmerICE libraries from the compile command.

Thanks!