| // RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O0 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O1 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O2 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O3 %s -S -emit-llvm -o - %loadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O0 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O1 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O2 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi | |
| // RUN: if [ %llvmver -ge 12 ]; then %clang++ -std=c++17 -O3 %s -S -emit-llvm -o - %newLoadClangEnzyme | %lli - ; fi | |
| #include "../test_utils.h" | |
| #include <vector> | |
| #include <enzyme/enzyme> | |
| std::vector<double> basic_elasticity_kernel(const std::vector<double> &dudxi) { | |
| std::vector<double> res(2); | |
| res[0] = dudxi[0]; | |
| res[1] = dudxi[1]; | |
| return res; | |
| } | |
| std::vector<double> elasticity_kernel(const std::vector<double> &dudxi) { | |
| return dudxi; | |
| } | |
| int main() { | |
| std::vector<double> dudxi { 3.4, 5.7 }; | |
| std::vector<double> s_dudxi{ 9.2, 11.3 }; | |
| { | |
| auto dres = enzyme::get<0> | |
| (enzyme::autodiff<enzyme::Forward, | |
| enzyme::DuplicatedNoNeed<std::vector<double>>> | |
| (basic_elasticity_kernel, | |
| enzyme::Duplicated<const std::vector<double> &>(dudxi, s_dudxi))); | |
| APPROX_EQ(dres[0], 9.2, 1e-10); | |
| APPROX_EQ(dres[1], 11.3, 1e-10); | |
| } | |
| { | |
| auto tup = | |
| (enzyme::autodiff<enzyme::Forward, | |
| enzyme::Duplicated<std::vector<double>>> | |
| (basic_elasticity_kernel, | |
| enzyme::Duplicated<const std::vector<double> &>(dudxi, s_dudxi))); | |
| APPROX_EQ(enzyme::get<0>(tup)[0], 3.4, 1e-10); | |
| APPROX_EQ(enzyme::get<0>(tup)[1], 5.7, 1e-10); | |
| APPROX_EQ(enzyme::get<1>(tup)[0], 9.2, 1e-10); | |
| APPROX_EQ(enzyme::get<1>(tup)[1], 11.3, 1e-10); | |
| } | |
| { | |
| auto dres = enzyme::get<0> | |
| (enzyme::autodiff<enzyme::Forward, | |
| enzyme::DuplicatedNoNeed<std::vector<double>>> | |
| (elasticity_kernel, | |
| enzyme::Duplicated<const std::vector<double> &>(dudxi, s_dudxi))); | |
| APPROX_EQ(dres[0], 9.2, 1e-10); | |
| APPROX_EQ(dres[1], 11.3, 1e-10); | |
| } | |
| { | |
| auto tup = | |
| (enzyme::autodiff<enzyme::Forward, | |
| enzyme::Duplicated<std::vector<double>>> | |
| (elasticity_kernel, | |
| enzyme::Duplicated<const std::vector<double> &>(dudxi, s_dudxi))); | |
| APPROX_EQ(enzyme::get<0>(tup)[0], 3.4, 1e-10); | |
| APPROX_EQ(enzyme::get<0>(tup)[1], 5.7, 1e-10); | |
| APPROX_EQ(enzyme::get<1>(tup)[0], 9.2, 1e-10); | |
| APPROX_EQ(enzyme::get<1>(tup)[1], 11.3, 1e-10); | |
| } | |
| return 0; | |
| } |