// Scalar_Helmholtz_xfem - A linear solver for the scalar helmholtz equation using X-FEM
// Copyright (C) 2012-2026 Eric Bechet
//
// See the LICENSE file for license information.
// Please report all bugs and problems to <bechet@cadxfem.org>.

#include <complex>
#include <iostream>

#include "helmholtz_xfem_domain.h"
#include "genSimpleFunctionExtended.h"

void genDataHLS::readToken(std::istream &is, std::string &token)
{
  if (token=="Solution")
  {
    HelmholtzLevelsetSolution* HLS = new HelmholtzLevelsetSolution;
    is >> *HLS;
    HLSsolutions.push_back(HLS);
  }
  else if(token=="Xfem")
  {
    int value;
    readScalar(is, value);
    Using_xfem = value;
  }
  else
  {
    genDataLS::readToken(is, token);
  }
}

std::istream & operator>>(std::istream &is, HelmholtzLevelsetSolution &obj)
{
  int dim;
  int physical;
  readScalar(is,physical);
  readScalar(is,dim);
  obj.tag = physical;
  obj.dim = dim;
  NextTokenWithoutComments(is,obj.kind);
  if (obj.kind=="Complex")
  {
    std::vector<std::string> expr, dexpr_real, dexpr_im, var;
    readVector(is,expr);
    readVector(is,dexpr_real);
    readVector(is,dexpr_im);
    readVector(is,var);
    std::vector<std::string> real_part, im_part;
    real_part.push_back(expr[0]);
    im_part.push_back(expr[1]);
    std::vector<std::vector<std::string> > diff_real_part(3), diff_im_part(3);
    for (int i=0; i<3; i++)
    {
      diff_real_part[i].push_back(dexpr_real[i]);
      diff_im_part[i].push_back(dexpr_im[i]);
    }
    obj.fscalar_real = new genSimpleFunctionAnalytical<genTensor0<double> >(real_part, diff_real_part[0], diff_real_part[1], diff_real_part[2] , var);
    obj.fscalar_im = new genSimpleFunctionAnalytical<genTensor0<double> >(im_part, diff_im_part[0], diff_im_part[1], diff_im_part[2] , var);
  }
  return is;
}

std::ostream & operator<<(std::ostream &os, HelmholtzLevelsetSolution &obj)
{
  os << "Solution ";
  if (obj.kind=="Complex") os << obj.kind;
  return os;
}

void genDataHLS::dumpContent(std::ostream &os)
{
  genDataLS::dumpContent(os);
  for (int i=0; i<HLSsolutions.size(); ++i) os << *HLSsolutions[i] << std::endl;
}
