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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
package engine
import (
"github.com/mumax/3/cuda"
"github.com/mumax/3/data"
)
var (
TotalShift, TotalYShift float64 // accumulated window shift (X and Y) in meter
ShiftMagL, ShiftMagR, ShiftMagU, ShiftMagD data.Vector // when shifting m, put these value at the left/right edge.
ShiftM, ShiftGeom, ShiftRegions bool = true, true, true // should shift act on magnetization, geometry, regions?
EdgeCarryShift bool = false // Use the values of M at the border for the new cells
)
func init() {
DeclFunc("Shift", Shift, "Shifts the simulation by +1/-1 cells along X")
DeclVar("EdgeCarryShift", &EdgeCarryShift, "Whether to use the current magnetization at the border for the cells inserted by Shift (default=false)")
DeclVar("ShiftMagL", &ShiftMagL, "Upon shift, insert this magnetization from the left")
DeclVar("ShiftMagR", &ShiftMagR, "Upon shift, insert this magnetization from the right")
DeclVar("ShiftMagU", &ShiftMagU, "Upon shift, insert this magnetization from the top")
DeclVar("ShiftMagD", &ShiftMagD, "Upon shift, insert this magnetization from the bottom")
DeclVar("ShiftM", &ShiftM, "Whether Shift() acts on magnetization")
DeclVar("ShiftGeom", &ShiftGeom, "Whether Shift() acts on geometry")
DeclVar("ShiftRegions", &ShiftRegions, "Whether Shift() acts on regions")
DeclVar("TotalShift", &TotalShift, "Amount by which the simulation has been shifted along the x-axis (m).")
}
// position of the window lab frame
func GetShiftPos() float64 { return -TotalShift }
func GetShiftYPos() float64 { return -TotalYShift }
// shift the simulation window over dx cells in X direction
func Shift(dx int) {
TotalShift += float64(dx) * Mesh().CellSize()[X] // needed to re-init geom, regions
if ShiftM {
shiftMag(M.Buffer(), dx) // TODO: M.shift?
}
if ShiftRegions {
regions.shift(dx)
}
if ShiftGeom {
geometry.shift(dx)
}
M.normalize()
}
func shiftMag(m *data.Slice, dx int) {
m2 := cuda.Buffer(1, m.Size())
defer cuda.Recycle(m2)
for c := 0; c < m.NComp(); c++ {
comp := m.Comp(c)
if EdgeCarryShift {
cuda.ShiftEdgeCarryX(m2, comp, m.Comp((c+1)%3), m.Comp((c+2)%3), dx, float32(ShiftMagL[c]), float32(ShiftMagR[c]))
} else {
cuda.ShiftX(m2, comp, dx, float32(ShiftMagL[c]), float32(ShiftMagR[c]))
}
data.Copy(comp, m2) // str0 ?
}
}
// shift the simulation window over dy cells in Y direction
func YShift(dy int) {
TotalYShift += float64(dy) * Mesh().CellSize()[Y] // needed to re-init geom, regions
if ShiftM {
shiftMagY(M.Buffer(), dy)
}
if ShiftRegions {
regions.shiftY(dy)
}
if ShiftGeom {
geometry.shiftY(dy)
}
M.normalize()
}
func shiftMagY(m *data.Slice, dy int) {
m2 := cuda.Buffer(1, m.Size())
defer cuda.Recycle(m2)
for c := 0; c < m.NComp(); c++ {
comp := m.Comp(c)
if EdgeCarryShift {
cuda.ShiftEdgeCarryY(m2, comp, m.Comp((c+1)%3), m.Comp((c+2)%3), dy, float32(ShiftMagU[c]), float32(ShiftMagD[c]))
} else {
cuda.ShiftY(m2, comp, dy, float32(ShiftMagU[c]), float32(ShiftMagD[c]))
}
data.Copy(comp, m2) // str0 ?
}
}
|