/* ***********************************************************************
//
//   Copyright (C) 2025 -- The 4D-STAR Collaboration
//   File Author: Emily Boudreaux
//   Last Modified: March 19, 2025
//
//   4DSSE is free software; you can use it and/or modify
//   it under the terms and restrictions the GNU General Library Public
//   License version 3 (GPLv3) as published by the Free Software Foundation.
//
//   4DSSE 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 Library General Public License for more details.
//
//   You should have received a copy of the GNU Library General Public License
//   along with this software; if not, write to the Free Software
//   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// *********************************************************************** */
#include "mfem.hpp"

#include "polyCoeff.h"

namespace serif {
namespace polytrope {
namespace polycoeff{
  double nonlinearSourceCoeff(const mfem::Vector &x)
  {
    return 1;
    // double r = x(0)*x(0) + x(1)*x(1) + x(2)*x(2);
    // return std::pow(r, 2);
  }

  void diffusionCoeff(const mfem::Vector &x, mfem::Vector &v)
  {
    v.SetSize(3);
    v = -1;
    // double r = x(0)*x(0) + x(1)*x(1) + x(2)*x(2);
    // v = -std::pow(r, 2);
  }

  //PERF: One area of future optimization might be turning these into matrix operations since they are
  //PERF:  fundamentally just the dot product of [a b c ...] * [n^0 n^1 n^2 ...]
  double x1(const double n)
  {
    double r = 0;
    for (int i = 0; i < x1InterpCoeff::numTerms; i++) {
      r += x1InterpCoeff::coeff[i] * std::pow(n, x1InterpCoeff::power[i]);
    }
    return r;
  }

  double thetaSurfaceFlux(const double n) {
    double surfaceFlux = 0;
    for (int i = 0; i < dThetaInterpCoeff::numTerms; i++) {
      surfaceFlux += dThetaInterpCoeff::coeff[i] * std::pow(n, dThetaInterpCoeff::power[i]);
    }
    return surfaceFlux;
  }

} // namespace polycoeff
} // namespace polytrope
} // namespace serif