本文整理匯總了Golang中github.com/mumax/3/cuda.Buffer函數的典型用法代碼示例。如果您正苦於以下問題:Golang Buffer函數的具體用法?Golang Buffer怎麽用?Golang Buffer使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了Buffer函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: Step
// Euler method, can be used as solver.Step.
func (s *BackwardEuler) Step() {
util.AssertMsg(MaxErr > 0, "Backward euler solver requires MaxErr > 0")
t0 := Time
y := M.Buffer()
y0 := cuda.Buffer(VECTOR, y.Size())
defer cuda.Recycle(y0)
data.Copy(y0, y)
dy0 := cuda.Buffer(VECTOR, y.Size())
defer cuda.Recycle(dy0)
if s.dy1 == nil {
s.dy1 = cuda.Buffer(VECTOR, y.Size())
}
dy1 := s.dy1
Dt_si = FixDt
dt := float32(Dt_si * GammaLL)
util.AssertMsg(dt > 0, "Backward Euler solver requires fixed time step > 0")
// Fist guess
Time = t0 + 0.5*Dt_si // 0.5 dt makes it implicit midpoint method
// with temperature, previous torque cannot be used as predictor
if Temp.isZero() {
cuda.Madd2(y, y0, dy1, 1, dt) // predictor euler step with previous torque
M.normalize()
}
torqueFn(dy0)
cuda.Madd2(y, y0, dy0, 1, dt) // y = y0 + dt * dy
M.normalize()
// One iteration
torqueFn(dy1)
cuda.Madd2(y, y0, dy1, 1, dt) // y = y0 + dt * dy1
M.normalize()
Time = t0 + Dt_si
err := cuda.MaxVecDiff(dy0, dy1) * float64(dt)
// adjust next time step
//if err < MaxErr || Dt_si <= MinDt || FixDt != 0 { // mindt check to avoid infinite loop
// step OK
NSteps++
setLastErr(err)
setMaxTorque(dy1)
//} else {
// undo bad step
// util.Assert(FixDt == 0)
// Time = t0
// data.Copy(y, y0)
// NUndone++
//}
}
示例2: Step
func (mini *Minimizer) Step() {
m := M.Buffer()
size := m.Size()
k := mini.k
h := mini.h
// save original magnetization
m0 := cuda.Buffer(3, size)
defer cuda.Recycle(m0)
data.Copy(m0, m)
// make descent
cuda.Minimize(m, m0, k, h)
// calculate new torque for next step
k0 := cuda.Buffer(3, size)
defer cuda.Recycle(k0)
data.Copy(k0, k)
torqueFn(k)
setMaxTorque(k) // report to user
// just to make the following readable
dm := m0
dk := k0
// calculate step difference of m and k
cuda.Madd2(dm, m, m0, 1., -1.)
cuda.Madd2(dk, k, k0, -1., 1.) // reversed due to LLNoPrecess sign
// get maxdiff and add to list
max_dm := cuda.MaxVecNorm(dm)
mini.lastDm.Add(max_dm)
setLastErr(mini.lastDm.Max()) // report maxDm to user as LastErr
// adjust next time step
var nom, div float32
if NSteps%2 == 0 {
nom = cuda.Dot(dm, dm)
div = cuda.Dot(dm, dk)
} else {
nom = cuda.Dot(dm, dk)
div = cuda.Dot(dk, dk)
}
if div != 0. {
mini.h = nom / div
} else { // in case of division by zero
mini.h = 1e-4
}
M.normalize()
// as a convention, time does not advance during relax
NSteps++
}
示例3: shift
func (g *geom) shift(dx int) {
// empty mask, nothing to do
if g == nil || g.buffer.IsNil() {
return
}
// allocated mask: shift
s := g.buffer
s2 := cuda.Buffer(1, g.Mesh().Size())
defer cuda.Recycle(s2)
newv := float32(1) // initially fill edges with 1's
cuda.ShiftX(s2, s, dx, newv, newv)
data.Copy(s, s2)
n := Mesh().Size()
x1, x2 := shiftDirtyRange(dx)
for iz := 0; iz < n[Z]; iz++ {
for iy := 0; iy < n[Y]; iy++ {
for ix := x1; ix < x2; ix++ {
r := Index2Coord(ix, iy, iz) // includes shift
if !g.shape(r[X], r[Y], r[Z]) {
cuda.SetCell(g.buffer, 0, ix, iy, iz, 0) // a bit slowish, but hardly reached
}
}
}
}
}
示例4: Step
// Euler method, can be used as solver.Step.
func (_ *Euler) Step() {
y := M.Buffer()
dy0 := cuda.Buffer(VECTOR, y.Size())
defer cuda.Recycle(dy0)
torqueFn(dy0)
setMaxTorque(dy0)
// Adaptive time stepping: treat MaxErr as the maximum magnetization delta
// (proportional to the error, but an overestimation for sure)
var dt float32
if FixDt != 0 {
Dt_si = FixDt
dt = float32(Dt_si * GammaLL)
} else {
dt = float32(MaxErr / LastTorque)
Dt_si = float64(dt) / GammaLL
}
util.AssertMsg(dt > 0, "Euler solver requires fixed time step > 0")
setLastErr(float64(dt) * LastTorque)
cuda.Madd2(y, y, dy0, 1, dt) // y = y + dt * dy
M.normalize()
Time += Dt_si
NSteps++
}
示例5: GetAnisotropyEnergy
// Returns anisotropy energy in joules.
func GetAnisotropyEnergy() float64 {
buf := cuda.Buffer(1, Edens_anis.Mesh().Size())
defer cuda.Recycle(buf)
cuda.Zero(buf)
AddAnisotropyEnergyDensity(buf)
return cellVolume() * float64(cuda.Sum(buf))
}
示例6: Slice
// uncompress the table to a full array with parameter values per cell.
func (p *lut) Slice() (*data.Slice, bool) {
gpu := p.gpuLUT()
b := cuda.Buffer(p.NComp(), Mesh().Size())
for c := 0; c < p.NComp(); c++ {
cuda.RegionDecode(b.Comp(c), cuda.LUTPtr(gpu[c]), regions.Gpu())
}
return b, true
}
示例7: Slice
// returns a new slice equal to q in the given region, 0 outside.
func (q *oneReg) Slice() (*data.Slice, bool) {
src, r := q.parent.Slice()
if r {
defer cuda.Recycle(src)
}
out := cuda.Buffer(q.NComp(), q.Mesh().Size())
cuda.RegionSelect(out, src, regions.Gpu(), byte(q.region))
return out, true
}
示例8: shiftMag
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)
cuda.ShiftX(m2, comp, dx, float32(ShiftMagL[c]), float32(ShiftMagR[c]))
data.Copy(comp, m2) // str0 ?
}
}
示例9: Slice
func (q *cropped) Slice() (*data.Slice, bool) {
src, r := q.parent.Slice()
if r {
defer cuda.Recycle(src)
}
dst := cuda.Buffer(q.NComp(), q.Mesh().Size())
cuda.Crop(dst, src, q.x1, q.y1, q.z1)
return dst, true
}
示例10: update
func (b *thermField) update() {
// we need to fix the time step here because solver will not yet have done it before the first step.
// FixDt as an lvalue that sets Dt_si on change might be cleaner.
if FixDt != 0 {
Dt_si = FixDt
}
if b.generator == 0 {
b.generator = curand.CreateGenerator(curand.PSEUDO_DEFAULT)
b.generator.SetSeed(b.seed)
}
if b.noise == nil {
b.noise = cuda.NewSlice(b.NComp(), b.Mesh().Size())
// when noise was (re-)allocated it's invalid for sure.
B_therm.step = -1
B_therm.dt = -1
}
if Temp.isZero() {
cuda.Memset(b.noise, 0, 0, 0)
b.step = NSteps
b.dt = Dt_si
return
}
// keep constant during time step
if NSteps == b.step && Dt_si == b.dt {
return
}
if FixDt == 0 {
util.Fatal("Finite temperature requires fixed time step. Set FixDt != 0.")
}
N := Mesh().NCell()
k2_VgammaDt := 2 * mag.Kb / (GammaLL * cellVolume() * Dt_si)
noise := cuda.Buffer(1, Mesh().Size())
defer cuda.Recycle(noise)
const mean = 0
const stddev = 1
dst := b.noise
ms := Msat.MSlice()
defer ms.Recycle()
temp := Temp.MSlice()
defer temp.Recycle()
alpha := Alpha.MSlice()
defer alpha.Recycle()
for i := 0; i < 3; i++ {
b.generator.GenerateNormal(uintptr(noise.DevPtr(0)), int64(N), mean, stddev)
cuda.SetTemperature(dst.Comp(i), noise, k2_VgammaDt, ms, temp, alpha)
}
b.step = NSteps
b.dt = Dt_si
}
示例11: Slice
func (g *geom) Slice() (*data.Slice, bool) {
s := g.Gpu()
if s.IsNil() {
s := cuda.Buffer(g.NComp(), g.Mesh().Size())
cuda.Memset(s, 1)
return s, true
} else {
return s, false
}
}
示例12: SetMFM
func SetMFM(dst *data.Slice) {
buf := cuda.Buffer(3, Mesh().Size())
defer cuda.Recycle(buf)
if mfmconv_ == nil {
reinitmfmconv()
}
mfmconv_.Exec(buf, M.Buffer(), geometry.Gpu(), Bsat.gpuLUT1(), regions.Gpu())
cuda.Madd3(dst, buf.Comp(0), buf.Comp(1), buf.Comp(2), 1, 1, 1)
}
示例13: Step
// Adaptive Heun method, can be used as solver.Step
func (_ *Heun) Step() {
y := M.Buffer()
dy0 := cuda.Buffer(VECTOR, y.Size())
defer cuda.Recycle(dy0)
if FixDt != 0 {
Dt_si = FixDt
}
dt := float32(Dt_si * GammaLL)
util.Assert(dt > 0)
// stage 1
torqueFn(dy0)
cuda.Madd2(y, y, dy0, 1, dt) // y = y + dt * dy
// stage 2
dy := cuda.Buffer(3, y.Size())
defer cuda.Recycle(dy)
Time += Dt_si
torqueFn(dy)
err := cuda.MaxVecDiff(dy0, dy) * float64(dt)
// adjust next time step
if err < MaxErr || Dt_si <= MinDt || FixDt != 0 { // mindt check to avoid infinite loop
// step OK
cuda.Madd3(y, y, dy, dy0, 1, 0.5*dt, -0.5*dt)
M.normalize()
NSteps++
adaptDt(math.Pow(MaxErr/err, 1./2.))
setLastErr(err)
setMaxTorque(dy)
} else {
// undo bad step
util.Assert(FixDt == 0)
Time -= Dt_si
cuda.Madd2(y, y, dy0, 1, -dt)
NUndone++
adaptDt(math.Pow(MaxErr/err, 1./3.))
}
}
示例14: SetMFM
func SetMFM(dst *data.Slice) {
buf := cuda.Buffer(3, Mesh().Size())
defer cuda.Recycle(buf)
if mfmconv_ == nil {
reinitmfmconv()
}
msat := Msat.MSlice()
defer msat.Recycle()
mfmconv_.Exec(buf, M.Buffer(), geometry.Gpu(), msat)
cuda.Madd3(dst, buf.Comp(0), buf.Comp(1), buf.Comp(2), 1, 1, 1)
}
示例15: Slice
func (d *dotProduct) Slice() (*data.Slice, bool) {
slice := cuda.Buffer(d.NComp(), d.Mesh().Size())
cuda.Zero(slice)
A, r := d.a.Slice()
if r {
defer cuda.Recycle(A)
}
B, r := d.b.Slice()
if r {
defer cuda.Recycle(B)
}
cuda.AddDotProduct(slice, 1, A, B)
return slice, true
}