// Precision test for the kernel: thin film. func main() { nimble.Init() defer nimble.Cleanup() nimble.SetOD("kernel-film.out") gpu.LockCudaThread() Y, X := core.IntArg(0), core.IntArg(1) y, x := float64(Y), float64(X) N0, N1, N2 := 1, 1024/Y, 1024/X cx, cy, cz := 1e-9, 1e-9*y, 1e-9*x mesh := nimble.NewMesh(N0, N1, N2, cx, cy, cz) fmt.Println("mesh:", mesh) mbox := gpu.NewConst("m", "", mesh, nimble.UnifiedMemory, []float64{1, 0, 0}) m := mbox.Output() acc := 4. kernel := mag.BruteKernel(mesh, acc) conv := gpu.NewConvolution("B", "T", mesh, nimble.UnifiedMemory, kernel, m) B := conv.Output() outputc := B.NewReader() nimble.RunStack() output := host(outputc.ReadNext(mesh.NCell())) Bz := core.Reshape(output[0], [3]int{N0, N1, N2}) probe := float64(Bz[N0/2][N1/2][N2/2]) fmt.Println(probe) want := -1. if math.Abs(probe-want) > 0.01 { fmt.Println("FAIL") os.Exit(2) } else { fmt.Println("OK") } }
func main() { nimble.Init() defer nimble.Cleanup() nimble.SetOD("demag1.out") gpu.LockCudaThread() N0, N1, N2 := 1, 3*64, 5*64 cx, cy, cz := 3e-9, 3.125e-9, 3.125e-9 mesh := nimble.NewMesh(N0, N1, N2, cx, cy, cz) fmt.Println("mesh:", mesh) mbox := gpu.NewConst("m", "", mesh, nimble.UnifiedMemory, []float64{1, 0, 0}) m := mbox.Output() const acc = 4 kernel := mag.BruteKernel(mesh, acc) conv := gpu.NewConvolution("B", "T", mesh, nimble.UnifiedMemory, kernel, m) B := conv.Output() const probe = 24 * 121 outputc := B.NewReader() nimble.RunStack() output := host(outputc.ReadNext(mesh.NCell())) if output[0][probe] > -0.97 || output[0][probe] < -0.99 || output[1][probe] != 0 || output[2][probe] != 0 { fmt.Println("failed, got:", output[0][probe]) os.Exit(2) } else { fmt.Println("OK") } }
func main() { nimble.Init() defer nimble.Cleanup() nimble.SetOD("demag2.out") gpu.LockCudaThread() N0, N1, N2 := 4, 32, 1024 cx, cy, cz := 3e-9, 3.125e-9, 3.125e-9 mesh := nimble.NewMesh(N0, N1, N2, cx, cy, cz) fmt.Println("mesh:", mesh) mbox := gpu.NewConst("m", "", mesh, nimble.UnifiedMemory, []float64{1, 0, 0}) m := mbox.Output() const acc = 4 kernel := mag.BruteKernel(mesh, acc) conv := gpu.NewConvolution("B", "T", mesh, nimble.UnifiedMemory, kernel, m) B := conv.Output() outputc := B.NewReader() nimble.RunStack() output := host(outputc.ReadNext(mesh.NCell())) out0 := core.Reshape(output[0], mesh.Size()) out1 := core.Reshape(output[1], mesh.Size()) out2 := core.Reshape(output[2], mesh.Size()) X, Y, Z := N0/2, N1/2, N2/2 if out0[X][Y][Z] < -0.95 || out0[X][Y][Z] > -0.90 || out1[X][Y][Z] > 0.001 || out2[X][Y][Z] > 0.001 { fmt.Println("failed, got:", out0[X][Y][Z], out1[X][Y][Z], out2[X][Y][Z]) os.Exit(2) } else { fmt.Println("OK") } }
func Live(in_ nimble.ChanN) { go func() { in := in_.NewReader() Frame = new(dump.Frame) Frame.Components = in.NComp() Frame.MeshSize = in.Mesh().Size() Frame.MeshStep = in.Mesh().CellSize() Crop2 = Frame.MeshSize ncell := in.Mesh().NCell() n := ncell * in.NComp() Frame.Data = make([]float32, n) Init(800, 600, true, 2, true) InitInputHandlers() defer glfw.CloseWindow() defer glfw.Terminate() Viewpos[2] = -20 wantframe := new(atomicbool) wantframe.set(true) go func() { gpu.LockCudaThread() for { data := in.ReadNext(ncell) if wantframe.get() { for i, d := range data { d.Device().CopyDtoH(Frame.Data[i*ncell : (i+1)*ncell]) } wantframe.set(false) } in.ReadDone() } }() for glfw.WindowParam(glfw.Opened) == 1 { // window open Render() if Wantscrot { Screenshot() Wantscrot = false } if wantframe.get() == false { PreRender(Frame) wantframe.set(true) } } }() }
// Standard problem 4 on GPU func main() { nimble.Init() defer nimble.Cleanup() nimble.SetOD("gpu4-3d.out") gpu.LockCudaThread() mem := nimble.GPUMemory const ( N0, N1, N2 = 1 * 2, 32, 128 Sx, Sy, Sz = 3e-9, 125e-9, 500e-9 cx, cy, cz = Sx / N0, Sy / N1, Sz / N2 Bsat = 800e3 * mag.Mu0 Aex_red = 13e-12 / (Bsat / mag.Mu0) α = 1 ) mesh := nimble.NewMesh(N0, N1, N2, cx, cy, cz) fmt.Println("mesh:", mesh) // TODO: MakeChanN -> NewQuant() m := nimble.MakeChanN(3, "m", "", mesh, mem, 0) M := gpu.Device3(m.ChanN().UnsafeData()) M[0].Memset(float32(1 / math.Sqrt(3))) M[1].Memset(float32(1 / math.Sqrt(3))) M[2].Memset(float32(1 / math.Sqrt(3))) acc := 5. kernel := mag.BruteKernel(mesh, acc) B := gpu.NewConvolution("B", "T", mesh, mem, kernel, m).Output() exch := gpu.NewExchange6("Bex", m, Aex_red) Bex := exch.Output() BeffBox := gpu.NewSum("Beff", B, Bex, Bsat, 1, mem) Beff := BeffBox.Output() tBox := gpu.NewLLGTorque("torque", m, Beff, α) torque := tBox.Output() solver := gpu.NewHeun(m, torque, 10e-15, mag.Gamma0) solver.Maxerr = 5e-4 solver.Maxdt = 1e-12 solver.Mindt = 1e-15 solver.Headroom = 0.5 every := 100 uni.Autosave(m, every, gpu.GPUDevice) uni.Autotable(m, every/10, gpu.GPUDevice) solver.Advance(2e-9) var avg [3]float32 for i := range avg { avg[i] = gpu.Sum(m.UnsafeData()[i].Device()) / float32(mesh.NCell()) } want := [3]float32{0, 0.12521397, 0.9669811} err := math.Sqrt(float64(sqr(avg[0]-want[0]) + sqr(avg[1]-want[1]) + sqr(avg[2]-want[2]))) fmt.Println("avg:", avg, "err:", err) if err > 1e-2 { fmt.Println("FAILED") os.Exit(2) } fmt.Println("OK") const ( Bx = -24.6E-3 By = 4.3E-3 Bz = 0 ) Bext := gpu.NewConst("Bext", "T", mesh, mem, []float64{Bz, By, Bx}).Output() BeffBox.MAdd(Bext, 1) tBox.Alpha = 0.02 solver.Advance(1e-9) for i := range avg { avg[i] = gpu.Sum(m.UnsafeData()[i].Device()) / float32(mesh.NCell()) } want = [3]float32{0.04303933, 0.13000599, -0.9842051} err = math.Sqrt(float64(sqr(avg[0]-want[0]) + sqr(avg[1]-want[1]) + sqr(avg[2]-want[2]))) fmt.Println("avg:", avg, "err:", err) if err > 1e-2 { fmt.Println("FAILED") os.Exit(2) } fmt.Println("OK") }