// Copyright (C) 2021-2023 Koen Derks

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericVector cpp_chladni(const Rcpp::NumericVector& x,
                                const Rcpp::NumericVector& y,
                                const Rcpp::NumericVector& waves) {
  // Constants
  const int n = x.length(), k = waves.length();
  // Variables
  double sx, sy;
  Rcpp::NumericVector z(n);
  // Main loop
  for (int i = 0; i < k; ++i) {
    // Check for interrupt
    Rcpp::checkUserInterrupt();
    // Inner loop
    for (int j = 0; j < n; ++j) {
      // Calculate the sines
      sx = sin(waves[i] * x[j]);
      sy = sin(waves[i] * y[j]);
      // Add the absolute value of the product
      z[j] += fabs(sx * sy);
    }
  }
  return z;
}