// 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)) }
func (d *dotProduct) EvalTo(dst *data.Slice) { A := ValueOf(d.a) defer cuda.Recycle(A) B := ValueOf(d.b) defer cuda.Recycle(B) cuda.Zero(dst) cuda.AddDotProduct(dst, 1, A, B) }
func AddAnisotropyEnergyDensity(dst *data.Slice) { haveUnixial := Ku1.nonZero() || Ku2.nonZero() haveCubic := Kc1.nonZero() || Kc2.nonZero() || Kc3.nonZero() if !haveUnixial && !haveCubic { return } buf := cuda.Buffer(B_anis.NComp(), B_anis.Mesh().Size()) defer cuda.Recycle(buf) // unnormalized magnetization: Mf, r := M_full.Slice() if r { defer cuda.Recycle(Mf) } if haveUnixial { // 1st cuda.Zero(buf) addUniaxialAnisotropyFrom(buf, M, Msat, Ku1, sZero, AnisU) cuda.AddDotProduct(dst, -1./2., buf, Mf) // 2nd cuda.Zero(buf) addUniaxialAnisotropyFrom(buf, M, Msat, sZero, Ku2, AnisU) cuda.AddDotProduct(dst, -1./4., buf, Mf) } if haveCubic { // 1st cuda.Zero(buf) addCubicAnisotropyFrom(buf, M, Msat, Kc1, sZero, sZero, AnisC1, AnisC2) cuda.AddDotProduct(dst, -1./4., buf, Mf) // 2nd cuda.Zero(buf) addCubicAnisotropyFrom(buf, M, Msat, sZero, Kc2, sZero, AnisC1, AnisC2) cuda.AddDotProduct(dst, -1./6., buf, Mf) // 3nd cuda.Zero(buf) addCubicAnisotropyFrom(buf, M, Msat, sZero, sZero, Kc3, AnisC1, AnisC2) cuda.AddDotProduct(dst, -1./8., buf, Mf) } }
func AddAnisotropyEnergyDensity(dst *data.Slice) { haveUnixial := ku1_red.nonZero() || ku2_red.nonZero() haveCubic := kc1_red.nonZero() || kc2_red.nonZero() || kc3_red.nonZero() if !haveUnixial && !haveCubic { return } buf := cuda.Buffer(B_anis.NComp(), B_anis.Mesh().Size()) defer cuda.Recycle(buf) // unnormalized magnetization: Mf, r := M_full.Slice() if r { defer cuda.Recycle(Mf) } if haveUnixial { // 1st cuda.Zero(buf) cuda.AddUniaxialAnisotropy(buf, M.Buffer(), ku1_red.gpuLUT1(), zero.gpuLUT1(), AnisU.gpuLUT(), regions.Gpu()) cuda.AddDotProduct(dst, -1./2., buf, Mf) // 2nd cuda.Zero(buf) cuda.AddUniaxialAnisotropy(buf, M.Buffer(), zero.gpuLUT1(), ku2_red.gpuLUT1(), AnisU.gpuLUT(), regions.Gpu()) cuda.AddDotProduct(dst, -1./4., buf, Mf) } if haveCubic { // 1st cuda.Zero(buf) cuda.AddCubicAnisotropy(buf, M.Buffer(), kc1_red.gpuLUT1(), zero.gpuLUT1(), zero.gpuLUT1(), AnisC1.gpuLUT(), AnisC2.gpuLUT(), regions.Gpu()) cuda.AddDotProduct(dst, -1./4., buf, Mf) // 2nd cuda.Zero(buf) cuda.AddCubicAnisotropy(buf, M.Buffer(), zero.gpuLUT1(), kc2_red.gpuLUT1(), zero.gpuLUT1(), AnisC1.gpuLUT(), AnisC2.gpuLUT(), regions.Gpu()) cuda.AddDotProduct(dst, -1./6., buf, Mf) // 3nd cuda.Zero(buf) cuda.AddCubicAnisotropy(buf, M.Buffer(), zero.gpuLUT1(), zero.gpuLUT1(), kc3_red.gpuLUT1(), AnisC1.gpuLUT(), AnisC2.gpuLUT(), regions.Gpu()) cuda.AddDotProduct(dst, -1./8., buf, Mf) } }
// Sets dst to the current demag field func SetDemagField(dst *data.Slice) { if EnableDemag { if NoDemagSpins.isZero() { // Normal demag, everywhere demagConv().Exec(dst, M.Buffer(), geometry.Gpu(), Bsat.gpuLUT1(), regions.Gpu()) } else { setMaskedDemagField(dst) } } else { cuda.Zero(dst) // will ADD other terms to it } }
// Sets dst to the current demag field func SetDemagField(dst *data.Slice) { if EnableDemag { msat := Msat.MSlice() defer msat.Recycle() if NoDemagSpins.isZero() { // Normal demag, everywhere demagConv().Exec(dst, M.Buffer(), geometry.Gpu(), msat) } else { setMaskedDemagField(dst, msat) } } else { cuda.Zero(dst) // will ADD other terms to it } }
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 }
func (d *pointwiseMul) EvalTo(dst *data.Slice) { cuda.Zero(dst) a := ValueOf(d.a) defer cuda.Recycle(a) b := ValueOf(d.b) defer cuda.Recycle(b) switch { case a.NComp() == b.NComp(): mulNN(dst, a, b) // vector*vector, scalar*scalar case a.NComp() == 1: mul1N(dst, a, b) case b.NComp() == 1: mul1N(dst, b, a) default: panic(fmt.Sprintf("Cannot point-wise multiply %v components by %v components", a.NComp(), b.NComp())) } }
func (e *excitation) Slice() (*data.Slice, bool) { buf := cuda.Buffer(e.NComp(), e.Mesh().Size()) cuda.Zero(buf) e.AddTo(buf) return buf, true }
func (q *_adder) Set(dst *data.Slice) { cuda.Zero(dst) q.AddTo(dst) }
// Calculates and returns the quantity. // recycle is true: slice needs to be recycled. func (q *fieldFunc) Slice() (s *data.Slice, recycle bool) { buf := cuda.Buffer(q.NComp(), q.Mesh().Size()) cuda.Zero(buf) q.f(buf) return buf, true }
// Calculates and returns the quantity. // recycle is true: slice needs to be recycled. func (q *callbackQuant) Slice() (s *data.Slice, recycle bool) { buf := cuda.Buffer(q.NComp(), q.Mesh().Size()) cuda.Zero(buf) q.call(buf) return buf, true }
// Set dst to total energy density in J/m3 func SetTotalEdens(dst *data.Slice) { cuda.Zero(dst) for _, addTerm := range edensTerms { addTerm(dst) } }