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 (2.13 KiB) Viewed 5375 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 (892 Bytes) Viewed 5346 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!