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 addUniaxialAnisotropyField(dst *data.Slice) { if ku1_red.nonZero() || ku2_red.nonZero() { cuda.AddUniaxialAnisotropy(dst, M.Buffer(), ku1_red.gpuLUT1(), ku2_red.gpuLUT1(), AnisU.gpuLUT(), regions.Gpu()) } }