void operator()(R&& rvar, T&& tvar) const { // Derive the symmetric complement of r and quantify over it. I // wouldn't need to do this if I had a symmetric_complement function. using U = Result_of<T()>; auto r = rvar(); auto sc = [r](const U& a, const U& b) { return !r(a, b) && !r(b, a); }; auto svar = single(sc); quick_check(ord, rvar, tvar); quick_check(eq, svar, tvar); }
int main(int argc, char **argv) { Kokkos::initialize(); try { // Create random field int M = 10; Teuchos::ParameterList solverParams; solverParams.set("Number of KL Terms", M); solverParams.set("Mean", 1.0); solverParams.set("Standard Deviation", 0.1); int ndim = 3; Teuchos::Array<double> domain_upper(ndim), domain_lower(ndim), correlation_length(ndim); for (int i=0; i<ndim; i++) { domain_upper[i] = 1.0; domain_lower[i] = 0.0; correlation_length[i] = 10.0; } solverParams.set("Domain Upper Bounds", domain_upper); solverParams.set("Domain Lower Bounds", domain_lower); solverParams.set("Correlation Lengths", correlation_length); Stokhos::KL::ExponentialRandomField<double> rf(solverParams); rf.print(std::cout); // Evaluate random field at a point Teuchos::Array<double> x(ndim); for (int i=0; i<ndim; i++) x[i] = (domain_upper[i] + domain_lower[i])/2.0 + 0.1*(domain_upper[i] - domain_lower[i])/2.0; Teuchos::Array<double> rvar(M); for (int i=0; i<M; i++) rvar[i] = 1.5; double result = rf.evaluate(x, rvar); std::cout << "result (host) = " << result << std::endl; // Evaluate random field in a functor on device typedef Kokkos::View<double*> view_type; typedef view_type::HostMirror host_view_type; view_type x_view("x", ndim); host_view_type host_x = Kokkos::create_mirror_view(x_view); for (int i=0; i<ndim; i++) host_x(i) = x[i]; Kokkos::deep_copy(x_view, host_x); view_type rvar_view("rvar", M); host_view_type host_rvar = Kokkos::create_mirror_view(rvar_view); for (int i=0; i<M; i++) host_rvar(i) = rvar[i]; Kokkos::deep_copy(rvar_view, host_rvar); RF<double> rf_func(rf, x_view, rvar_view); host_view_type host_y = Kokkos::create_mirror_view(rf_func.y); Kokkos::deep_copy(host_y, rf_func.y); double result2 = host_y(0); std::cout << "result (device)= " << result2 << std::endl; } catch (std::exception& e) { std::cout << e.what() << std::endl; } Kokkos::finalize(); }