{"id":20146583,"url":"https://github.com/brosnanyuen/raybnn_diffeq","last_synced_at":"2025-04-09T19:34:34.438Z","repository":{"id":187761350,"uuid":"677517072","full_name":"BrosnanYuen/RayBNN_DiffEq","owner":"BrosnanYuen","description":"Differential Equation Solver using GPUs, CPUs, and FPGAs via CUDA, OpenCL, and oneAPI","archived":false,"fork":false,"pushed_at":"2024-06-18T05:51:05.000Z","size":949,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-23T21:24:25.527Z","etag":null,"topics":["arrayfire","cuda","differential","differential-equations","gpu","gpu-computing","opencl","parallel","parallel-computing","parallel-programming","raybnn","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BrosnanYuen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-11T19:25:55.000Z","updated_at":"2024-06-18T05:51:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"5978bc02-5c50-4c6d-9cf6-53a30be24279","html_url":"https://github.com/BrosnanYuen/RayBNN_DiffEq","commit_stats":{"total_commits":94,"total_committers":3,"mean_commits":"31.333333333333332","dds":"0.43617021276595747","last_synced_commit":"c98ed209209a5ace2879c2d6c7cc92a67eeca306"},"previous_names":["brosnanyuen/raybnn_diffeq"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrosnanYuen%2FRayBNN_DiffEq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrosnanYuen%2FRayBNN_DiffEq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrosnanYuen%2FRayBNN_DiffEq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BrosnanYuen%2FRayBNN_DiffEq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BrosnanYuen","download_url":"https://codeload.github.com/BrosnanYuen/RayBNN_DiffEq/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248098174,"owners_count":21047391,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arrayfire","cuda","differential","differential-equations","gpu","gpu-computing","opencl","parallel","parallel-computing","parallel-programming","raybnn","rust"],"created_at":"2024-11-13T22:24:23.006Z","updated_at":"2025-04-09T19:34:34.415Z","avatar_url":"https://github.com/BrosnanYuen.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RayBNN_DiffEq\nDifferential Equation Solver using GPUs, CPUs, and FPGAs via CUDA, OpenCL, and oneAPI\n\nRequires Arrayfire and Arrayfire Rust\n\nSupports f16, f32, f64, Complexf16, Complexf32, Complexf64\n\nAlso supports Matrix Differential Equations and Sparse Matrix Differential Equations\n\nMatrix Sizes upto 100000x100000\n\n# Install Arrayfire\n\nInstall the Arrayfire 3.9.0 binaries at [https://arrayfire.com/binaries/](https://arrayfire.com/binaries/)\n\nor build from source\n[https://github.com/arrayfire/arrayfire/wiki/Getting-ArrayFire](https://github.com/arrayfire/arrayfire/wiki/Getting-ArrayFire)\n\nFirst time running Arrayfire will be slow because it has to compile CUDA and OpenCL kernels. Subsequent runs will be faster.\n\n\n# Add to your Cargo.toml\n```\narrayfire = { version = \"3.8.1\", package = \"arrayfire_fork\" }\nnum = \"0.4.1\"\nnum-traits = \"0.2.16\"\nhalf = { version = \"2.3.1\" , features = [\"num-traits\"] }\nRayBNN_DataLoader = \"2.0.3\"\nRayBNN_DiffEq = \"2.0.2\"\n```\n\n\n\n# List of Examples\n - [Linear ODE with CUDA f64](#solving-a-simple-linear-ode-on-cuda-with-float-64-bit-precision) \n - [3x3 Linear Matrix ODE with CUDA f64](#solving-a-3x3-matrix-linear-ode-on-cuda-with-float-64-bit-precision) \n - [1000x1000 Linear Matrix ODE with CUDA f64](#solving-a-1000x1000-matrix-linear-ode-on-cuda-with-float-64-bit-precision) \n - [Linear ODE with CUDA f32](#solving-a-simple-linear-ode-on-cuda-with-float-32-bit-precision) \n - [Interpolating Solved Results](#interpolating-solved-results) \n - [Selecting between CPU, OpenCL, and CUDA](#selecting-between-cpu-opencl-and-cuda) \n\n\n\n\n# Solving a Simple Linear ODE on CUDA with Float 64 bit precision\n![Equation 1](eq1.png)\n\n```\n//cargo run --example  Linear_ODE --release\n\nuse arrayfire;\nuse RayBNN_DiffEq;\n\n//Select CUDA and GPU Device 0\nconst BACK_END: arrayfire::Backend = arrayfire::Backend::CUDA;\nconst DEVICE: i32 = 0;\n\nfn main() {\n\n\tarrayfire::set_backend(BACK_END);\n\tarrayfire::set_device(DEVICE);\n\n\t// Set the Linear Differentail Equation\n\t// dy/dt = sin(t)\n\tlet diffeq = |t: \u0026arrayfire::Array\u003cf64\u003e, y: \u0026arrayfire::Array\u003cf64\u003e| -\u003e arrayfire::Array\u003cf64\u003e {\n\t\tarrayfire::sin(\u0026t) \n\t};\n\n\t//Start at t=0 and end at t=1000\n\t//Step size of 0.001\n\t//Relative error of 1E-9\n\t//Absolute error of 1E-9\n\t//Error Type compute the total error of every element in y\n\tlet options: RayBNN_DiffEq::ODE::ODE45::ODE45_Options\u003cf64\u003e = RayBNN_DiffEq::ODE::ODE45::ODE45_Options {\n\t\ttstart: 0.0f64,\n\t\ttend: 1000.0f64,\n\t\ttstep: 0.001f64,\n\t\trtol: 1.0E-9f64,\n\t\tatol: 1.0E-9f64,\n\t\terror_select: RayBNN_DiffEq::ODE::ODE45::error_type::TOTAL_ERROR\n\t};\n\n\tlet t_dims = arrayfire::Dim4::new(\u0026[1,1,1,1]);\n\tlet mut t = arrayfire::constant::\u003cf64\u003e(0.0,t_dims);\n\n\tlet y0_dims = arrayfire::Dim4::new(\u0026[1,1,1,1]);\n\tlet mut y = arrayfire::constant::\u003cf64\u003e(0.0,y0_dims);\n\tlet mut dydt = arrayfire::constant::\u003cf64\u003e(0.0,y0_dims);\n\n\t//Initial Point of Differential Equation\n\t//Set y(t=0) = 1.0\n\tlet y0 = arrayfire::constant::\u003cf64\u003e(1.0,y0_dims);\n\n\tprintln!(\"Running\");\n\n\tarrayfire::sync(DEVICE);\n\tlet starttime = std::time::Instant::now();\n\n\t//Run Solver\n\tRayBNN_DiffEq::ODE::ODE45::solve(\n\t\t\u0026y0\n\t\t,diffeq\n\t\t,\u0026options\n\t\t,\u0026mut t\n\t\t,\u0026mut y\n\t\t,\u0026mut dydt\n\t);\n\n\tarrayfire::sync(DEVICE);\n\n\tlet elapsedtime = starttime.elapsed();\n\t\n\tarrayfire::sync(DEVICE);\n\n\tarrayfire::print_gen(\"y\".to_string(), \u0026y,Some(6));\n\tarrayfire::print_gen(\"t\".to_string(), \u0026t,Some(6));\n\n\tprintln!(\"Computed {} Steps In: {:.6?}\", y.dims()[1],elapsedtime);\n\n\n\t//Error Analysis\n\tlet actualy = 2.0f64 - arrayfire::cos(\u0026t);\n\tlet error = y - actualy;\n\t//arrayfire::print_gen(\"error\".to_string(), \u0026error,Some(6));\n}\n```\n\n```\nComputed 11704 Steps In: 4.623646s\n```\n\n\n# Solving a 3x3 Matrix Linear ODE on CUDA with Float 64 bit precision\n![Equation 2](eq2.png)\n\n```\n//cargo run --example  Linear_Matrix_ODE --release\n\nuse arrayfire;\nuse RayBNN_DiffEq;\n\n//Select CUDA and GPU Device 0\nconst BACK_END: arrayfire::Backend = arrayfire::Backend::CUDA;\nconst DEVICE: i32 = 0;\n\nfn main() {\n\n\tarrayfire::set_backend(BACK_END);\n\tarrayfire::set_device(DEVICE);\n\n\n\t//Create A matrix\n\tlet A_vec:Vec\u003cf64\u003e = vec![1.0, 1.2, 1.1,    0.8, -1.0, 0.0,    0.0, 0.0, -1.2];\n\tlet mut A = arrayfire::Array::new(\u0026A_vec, arrayfire::Dim4::new(\u0026[3, 3, 1, 1]));\n\tarrayfire::print_gen(\"A\".to_string(), \u0026A,Some(6));\n\n\t//A\n\t//1.000000     0.800000     0.000000 \n\t//1.200000    -1.000000     0.000000 \n\t//1.100000     0.000000    -1.200000 \n\n\t// Set the Linear Matrix Differentail Equation\n\t// dy1/dt = 1.0y1 + 0.8y2  + 0.0y3\n\t// dy2/dt = 1.2y1 + -1.0y2 + 0.0y3\n\t// dy3/dt = 1.1y1 + 0.0y2  + -1.2y3 \n\tlet diffeq = |t: \u0026arrayfire::Array\u003cf64\u003e, y: \u0026arrayfire::Array\u003cf64\u003e| -\u003e arrayfire::Array\u003cf64\u003e {\n\t\tarrayfire::matmul(\u0026A, y, arrayfire::MatProp::NONE, arrayfire::MatProp::NONE)\n\t};\n\n\t//Start at t=0 and end at t=10\n\t//Step size of 0.001\n\t//Relative error of 1E-9\n\t//Absolute error of 1E-9\n\t//Error Type compute the total error of every element in y\n\tlet options: RayBNN_DiffEq::ODE::ODE45::ODE45_Options\u003cf64\u003e = RayBNN_DiffEq::ODE::ODE45::ODE45_Options {\n\t\ttstart: 0.0f64,\n\t\ttend: 10.0f64,\n\t\ttstep: 0.001f64,\n\t\trtol: 1.0E-9f64,\n\t\tatol: 1.0E-9f64,\n\t\terror_select: RayBNN_DiffEq::ODE::ODE45::error_type::TOTAL_ERROR\n\t};\n\n\tlet t_dims = arrayfire::Dim4::new(\u0026[1,1,1,1]);\n\tlet mut t = arrayfire::constant::\u003cf64\u003e(0.0,t_dims);\n\n\tlet y0_dims = arrayfire::Dim4::new(\u0026[3,1,1,1]);\n\tlet mut y = arrayfire::constant::\u003cf64\u003e(0.0,y0_dims);\n\tlet mut dydt = arrayfire::constant::\u003cf64\u003e(0.0,y0_dims);\n\n\t//Initial Point of Differential Equation\n\t//Set y1(0) = 0.1\n\t//Set y2(0) = 0.2\n\t//Set y3(0) = -0.3\n\tlet y0_vec:Vec\u003cf64\u003e = vec![0.1, 0.2, -0.3];\n\tlet y0 = arrayfire::Array::new(\u0026y0_vec, y0_dims);\n\t\n\n\tprintln!(\"Running\");\n\n\tarrayfire::sync(DEVICE);\n\tlet starttime = std::time::Instant::now();\n\n\t//Run Solver\n\tRayBNN_DiffEq::ODE::ODE45::solve(\n\t\t\u0026y0\n\t\t,diffeq\n\t\t,\u0026options\n\t\t,\u0026mut t\n\t\t,\u0026mut y\n\t\t,\u0026mut dydt\n\t);\n\n\tarrayfire::sync(DEVICE);\n\n\tlet elapsedtime = starttime.elapsed();\n\t\n\tarrayfire::sync(DEVICE);\n\n\tarrayfire::print_gen(\"y\".to_string(), \u0026y,Some(6));\n\tarrayfire::print_gen(\"t\".to_string(), \u0026t,Some(6));\n\n\tprintln!(\"Computed {} Steps In: {:.6?}\", y.dims()[1],elapsedtime);\n\n\n}\n```\n```\nComputed 983 Steps In: 391.827121ms\n```\n\n\n# Solving a 1000x1000 Matrix Linear ODE on CUDA with Float 64 bit precision\n\n```\n//cargo run --example  Linear_Matrix_ODE --release\n\nuse arrayfire;\nuse RayBNN_DiffEq;\n\n//Select CUDA and GPU Device 0\nconst BACK_END: arrayfire::Backend = arrayfire::Backend::CUDA;\nconst DEVICE: i32 = 0;\n\nfn main() {\n\n\tarrayfire::set_backend(BACK_END);\n\tarrayfire::set_device(DEVICE);\n\n\n\t//Create A matrix from random normal numbers\n\tlet A_dims = arrayfire::Dim4::new(\u0026[1000,1000,1,1]);\n\tlet A = arrayfire::randn::\u003cf64\u003e(A_dims)/100.0f64;\n\n\t// Set the Linear Matrix Differentail Equation\n\t// dy/dt = A*y\n\tlet diffeq = |t: \u0026arrayfire::Array\u003cf64\u003e, y: \u0026arrayfire::Array\u003cf64\u003e| -\u003e arrayfire::Array\u003cf64\u003e {\n\t\tarrayfire::matmul(\u0026A, y, arrayfire::MatProp::NONE, arrayfire::MatProp::NONE)\n\t};\n\n\t//Start at t=0 and end at t=50\n\t//Step size of 0.001\n\t//Relative error of 1E-9\n\t//Absolute error of 1E-9\n\t//Error Type compute the individual error of every element in y\n\tlet options: RayBNN_DiffEq::ODE::ODE45::ODE45_Options\u003cf64\u003e = RayBNN_DiffEq::ODE::ODE45::ODE45_Options {\n\t\ttstart: 0.0f64,\n\t\ttend: 50.0f64,\n\t\ttstep: 0.001f64,\n\t\trtol: 1.0E-9f64,\n\t\tatol: 1.0E-9f64,\n\t\terror_select: RayBNN_DiffEq::ODE::ODE45::error_type::INDIVIDUAL_ERROR\n\t};\n\n\tlet t_dims = arrayfire::Dim4::new(\u0026[1,1,1,1]);\n\tlet mut t = arrayfire::constant::\u003cf64\u003e(0.0,t_dims);\n\n\tlet y0_dims = arrayfire::Dim4::new(\u0026[1000,1,1,1]);\n\tlet mut y = arrayfire::constant::\u003cf64\u003e(0.0,y0_dims);\n\tlet mut dydt = arrayfire::constant::\u003cf64\u003e(0.0,y0_dims);\n\n\t//Initial Point of Differential Equation\n\tlet y0 = arrayfire::randn::\u003cf64\u003e(y0_dims)/100.0f64;\n\t\n\n\tprintln!(\"Running\");\n\n\tarrayfire::sync(DEVICE);\n\tlet starttime = std::time::Instant::now();\n\n\t//Run Solver\n\tRayBNN_DiffEq::ODE::ODE45::solve(\n\t\t\u0026y0\n\t\t,diffeq\n\t\t,\u0026options\n\t\t,\u0026mut t\n\t\t,\u0026mut y\n\t\t,\u0026mut dydt\n\t);\n\n\tarrayfire::sync(DEVICE);\n\n\tlet elapsedtime = starttime.elapsed();\n\t\n\tarrayfire::sync(DEVICE);\n\n\t//let lasty = arrayfire::col(\u0026y, y.dims()[1] as i64);\n\t//arrayfire::print_gen(\"lasty\".to_string(), \u0026lasty,Some(6));\n\t//arrayfire::print_gen(\"t\".to_string(), \u0026t,Some(6));\n\n\tprintln!(\"Computed {} Steps In: {:.6?}\", y.dims()[1],elapsedtime);\n\n\n}\n```\n\n```\nComputed 3366 Steps In: 4.635253s\n```\n\n\n# Solving a Simple Linear ODE on CUDA with Float 32 bit precision\n![Equation 1](eq1.png)\n\n```\n//cargo run --example  Linear_ODE_f32 --release\n\nuse arrayfire;\nuse RayBNN_DiffEq;\n\n//Select CUDA and GPU Device 0\nconst BACK_END: arrayfire::Backend = arrayfire::Backend::CUDA;\nconst DEVICE: i32 = 0;\n\nfn main() {\n\n\tarrayfire::set_backend(BACK_END);\n\tarrayfire::set_device(DEVICE);\n\n\t// Set the Linear Differentail Equation\n\t// dy/dt = sin(t)\n\tlet diffeq = |t: \u0026arrayfire::Array\u003cf32\u003e, y: \u0026arrayfire::Array\u003cf32\u003e| -\u003e arrayfire::Array\u003cf32\u003e {\n\t\tarrayfire::sin(\u0026t) \n\t};\n\n\t//Start at t=0 and end at t=1000\n\t//Step size of 0.0001\n\t//Relative error of 1E-4\n\t//Absolute error of 1E-4\n\t//Error Type compute the total error of every element in y\n\tlet options: RayBNN_DiffEq::ODE::ODE45::ODE45_Options\u003cf32\u003e = RayBNN_DiffEq::ODE::ODE45::ODE45_Options {\n\t\ttstart: 0.0f32,\n\t\ttend: 1000.0f32,\n\t\ttstep: 0.0001f32,\n\t\trtol: 1.0E-4f32,\n\t\tatol: 1.0E-4f32,\n\t\terror_select: RayBNN_DiffEq::ODE::ODE45::error_type::TOTAL_ERROR\n\t};\n\n\tlet t_dims = arrayfire::Dim4::new(\u0026[1,1,1,1]);\n\tlet mut t = arrayfire::constant::\u003cf32\u003e(0.0,t_dims);\n\n\tlet y0_dims = arrayfire::Dim4::new(\u0026[1,1,1,1]);\n\tlet mut y = arrayfire::constant::\u003cf32\u003e(0.0,y0_dims);\n\tlet mut dydt = arrayfire::constant::\u003cf32\u003e(0.0,y0_dims);\n\n\t//Initial Point of Differential Equation\n\t//Set y(t=0) = 1.0\n\tlet y0 = arrayfire::constant::\u003cf32\u003e(1.0,y0_dims);\n\n\tprintln!(\"Running\");\n\n\tarrayfire::sync(DEVICE);\n\tlet starttime = std::time::Instant::now();\n\n\t//Run Solver\n\tRayBNN_DiffEq::ODE::ODE45::solve(\n\t\t\u0026y0\n\t\t,diffeq\n\t\t,\u0026options\n\t\t,\u0026mut t\n\t\t,\u0026mut y\n\t\t,\u0026mut dydt\n\t);\n\n\tarrayfire::sync(DEVICE);\n\n\tlet elapsedtime = starttime.elapsed();\n\t\n\tarrayfire::sync(DEVICE);\n\n\tarrayfire::print_gen(\"y\".to_string(), \u0026y,Some(6));\n\tarrayfire::print_gen(\"t\".to_string(), \u0026t,Some(6));\n\n\tprintln!(\"Computed {} Steps In: {:.6?}\", y.dims()[1],elapsedtime);\n\n\n\t//Error Analysis\n\tlet actualy = 2.0f32 - arrayfire::cos(\u0026t);\n\tlet error = y - actualy;\n\t//arrayfire::print_gen(\"error\".to_string(), \u0026error,Some(6));\n}\n```\n\n```\nComputed 712 Steps In: 450.653767ms\n```\n\n\n\n\n\n# Interpolating Solved Results\n\n```\nuse arrayfire;\nuse RayBNN_DataLoader;\nuse RayBNN_DiffEq;\n\nconst BACK_END: arrayfire::Backend = arrayfire::Backend::CUDA;\nconst DEVICE: i32 = 0;\n\n\n\n\n#[test]\nfn test_ODE() {\n    arrayfire::set_backend(BACK_END);\n    arrayfire::set_device(DEVICE);\n\n\n\tlet n:u64 = 10;\n\tlet steps:u64 = 10001;\n\n\n\n    let A_dims = arrayfire::Dim4::new(\u0026[10,10,1,1]);\n    let mut A = RayBNN_DataLoader::Dataset::CSV::file_to_arrayfire::\u003cf64\u003e(\n    \t\"./test_data/ODE_A.csv\",\n    \t\n    );\n\tA = arrayfire::transpose(\u0026A, false);\n\n    let D_dims = arrayfire::Dim4::new(\u0026[1,10,1,1]);\n    let mut D = RayBNN_DataLoader::Dataset::CSV::file_to_arrayfire::\u003cf64\u003e(\n    \t\"./test_data/ODE_D.csv\",\n    \t\n    );\n\tD = arrayfire::transpose(\u0026D, false);\n\n    let tspan_dims = arrayfire::Dim4::new(\u0026[1,10001,1,1]);\n    let mut tspan = RayBNN_DataLoader::Dataset::CSV::file_to_arrayfire::\u003cf64\u003e(\n    \t\"./test_data/ODE_tspan.csv\",\n    \t\n    );\n\n    //tspan = arrayfire::transpose(\u0026tspan, false);\n\n\n    let x0_dims = arrayfire::Dim4::new(\u0026[1,10,1,1]);\n    let mut x0 = RayBNN_DataLoader::Dataset::CSV::file_to_arrayfire::\u003cf64\u003e(\n    \t\"./test_data/ODE_x0.csv\",\n    \t\n    );\n\tx0 = arrayfire::transpose(\u0026x0, false);\n\n\n    let xeval_dims = arrayfire::Dim4::new(\u0026[10001,10,1,1]);\n    let mut xeval = RayBNN_DataLoader::Dataset::CSV::file_to_arrayfire::\u003cf64\u003e(\n    \t\"./test_data/ODE_xeval.csv\",\n    \t\n    );\n\txeval = arrayfire::transpose(\u0026xeval, false);\n\n\n\n\tlet diffeq = |t: \u0026arrayfire::Array\u003cf64\u003e, x: \u0026arrayfire::Array\u003cf64\u003e|  -\u003e arrayfire::Array\u003cf64\u003e {\n\t\tD.clone() + arrayfire::matmul(\u0026A, x, arrayfire::MatProp::NONE, arrayfire::MatProp::NONE)\n\t};\n\n\n\tlet options: RayBNN_DiffEq::ODE::ODE45::ODE45_Options\u003cf64\u003e = RayBNN_DiffEq::ODE::ODE45::ODE45_Options {\n\t\ttstart: 0.0,\n\t\ttend: 100.0,\n\t\ttstep: 1E-5,\n\t\trtol: 1E-15,\n\t    atol: 1.0,\n\t\terror_select: RayBNN_DiffEq::ODE::ODE45::error_type::TOTAL_ERROR\n\t};\n\n\n\n\tlet starttime = std::time::Instant::now();\n\n\n\n\tlet mut t = arrayfire::constant::\u003cf64\u003e(0.0,A_dims);\n\tlet mut f = arrayfire::constant::\u003cf64\u003e(0.0,A_dims);\n\tlet mut dfdt = arrayfire::constant::\u003cf64\u003e(0.0,A_dims);\n\n\tRayBNN_DiffEq::ODE::ODE45::solve(\n\t\t\u0026x0\n\t\t,diffeq\n\t\t,\u0026options\n\t\t,\u0026mut t\n\t\t,\u0026mut f\n\t\t,\u0026mut dfdt\n\t);\n\n\n\n\tlet xpred = RayBNN_DiffEq::Interpolate::Linear::run(\n\t\t\u0026t\n\t\t,\u0026f\n\t\t,\u0026dfdt\n\t\t,\u0026tspan\n\t);\n\n\tlet elapsedtime = starttime.elapsed();\n\n\tprintln!(\"Computed {} Steps In: {:.6?}\", xpred.dims()[1], elapsedtime);\n\n\n\tlet mut relerror = xpred - xeval.clone();\n    relerror = relerror/xeval;\n    relerror = arrayfire::abs(\u0026relerror);\n    let (maxerr,_) =  arrayfire::max_all(\u0026relerror);\n\n\n    assert!(maxerr  \u003c= 2E-3);\n\n}\n```\n\n\n\n\n\n\n# Selecting between CPU, OpenCL, and CUDA\n\n```\n//Select CPU Device 0\nconst BACK_END: arrayfire::Backend = arrayfire::Backend::CPU;\nconst DEVICE: i32 = 0;\n\n\n//Select OpenCL Device 0\nconst BACK_END: arrayfire::Backend = arrayfire::Backend::OpenCL;\nconst DEVICE: i32 = 0;\n\n\n//Select CUDA Device 0\nconst BACK_END: arrayfire::Backend = arrayfire::Backend::CUDA;\nconst DEVICE: i32 = 0;\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrosnanyuen%2Fraybnn_diffeq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrosnanyuen%2Fraybnn_diffeq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrosnanyuen%2Fraybnn_diffeq/lists"}