-
Notifications
You must be signed in to change notification settings - Fork 0
/
demag.go
63 lines (53 loc) · 1.58 KB
/
demag.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package engine
import (
"github.com/mumax/3/cuda"
"github.com/mumax/3/data"
"github.com/mumax/3/mag"
)
// demag variables
var (
Msat ScalarParam
Bsat derivedParam
M_full, B_demag setter
E_demag = NewGetScalar("E_demag", "J", "Magnetostatic energy", getDemagEnergy)
EnableDemag = true // enable/disable demag field
demagconv_ *cuda.DemagConvolution // does the heavy lifting and provides FFTM
)
func init() {
Msat.init("Msat", "A/m", "Saturation magnetization", []derived{&Bsat, &lex2, &ku1_red, &kc1_red})
M_full.init(3, &globalmesh, "m_full", "A/m", "Unnormalized magnetization", func(dst *data.Slice) {
msat, r := Msat.Get()
if r {
defer cuda.Recycle(msat)
}
for c := 0; c < 3; c++ {
cuda.Mul(dst.Comp(c), M.buffer.Comp(c), msat)
}
})
DeclVar("EnableDemag", &EnableDemag, "Enables/disables demag (default=true)")
Bsat.init(1, []updater{&Msat}, func(p *derivedParam) {
Ms := Msat.CpuLUT()
for i, ms := range Ms[0] {
p.cpu_buf[0][i] = mag.Mu0 * ms
}
})
B_demag.init(3, &globalmesh, "B_demag", "T", "Magnetostatic field", func(b *data.Slice) {
if EnableDemag {
demagConv().Exec(b, M.buffer, vol, Bsat.LUT1(), regions.Gpu())
} else {
cuda.Zero(b)
}
})
registerEnergy(getDemagEnergy)
}
// returns demag convolution, making sure it's initialized
func demagConv() *cuda.DemagConvolution {
if demagconv_ == nil {
demagconv_ = cuda.NewDemag(Mesh())
}
return demagconv_
}
// Returns the current demag energy in Joules.
func getDemagEnergy() float64 {
return -0.5 * cellVolume() * dot(&M_full, &B_demag)
}