blob: 47a4a5034e9e6ad08071e080ada2b84b41a64c00 [file] [log] [blame] [edit]
// 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;
}