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) } }
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 }
// returns a function that adds to dst the energy density: // prefactor * dot (M_full, field) func makeEdensAdder(field outputField, prefactor float64) func(*data.Slice) { return func(dst *data.Slice) { B, r1 := field.Slice() if r1 { defer cuda.Recycle(B) } m, r2 := M_full.Slice() if r2 { defer cuda.Recycle(m) } factor := float32(prefactor) cuda.AddDotProduct(dst, factor, B, m) } }