// elastic_genTerm - A linear solver for elastic problems using FEM
// Copyright (C) 2010-2026 Eric Bechet
//
// See the LICENSE file for license information and contributions.
// Please report all bugs and problems to <bechet@cadxfem.org>.

#include "elastodynamicXfemSolver.h"
#include "ConvertEnrichedFSpace.h"

#if defined(HAVE_POST)
#include "PView.h"
#include "PViewData.h"
#endif

ElastodynamicXfemSolver::~ElastodynamicXfemSolver()
{
  for(int i=0; i< LSDomains.size(); i++)
    delete LSDomains[i];
  
  for(int i=0; i< BiDomains.size(); i++)
    delete BiDomains[i];
  
}



void ElastodynamicXfemSolver::readInputFile(const std::string &fileName){
    ElastodynamicSolver::readInputFile(fileName);
    fichier = new lectureData("coef_An_disk.txt");
}



void ElastodynamicXfemSolver::CheckProperties()
{
  ElastodynamicSolver::CheckProperties();
  
  for (int i=0; i<DataLS->LSs.size(); ++i){
    LevelSetDomain *field = new LevelSetDomain(*(DataLS->LSs[i]));
    LSDomains.push_back(field);
  }
  
  for (unsigned int i = 0; i < DataLS->Domains.size(); ++i){
    if (DataLS->Domains[i]->type=="Bimaterial"){
      int dim = DataLS->Domains[i]->dim;
      int tag = DataLS->Domains[i]->tag;
      LevelSetDomain* LS=NULL;

      for (int j=0; j<LSDomains.size(); ++j){
	if ((LSDomains[j]->dim==dim)&&(LSDomains[j]->tag==tag))
	  LS=LSDomains[j];
      }

      if (LS){
	BimaterialDomain *field = new BimaterialDomain(*(DataLS->Domains[i]), LS->Distance());
	BiDomains.push_back(field);
      }
      else
	printf("LevelSetDomain with dim=%d and tag=%d is not already existing.\n", dim, tag);
    }
  }
    
}

void ElastodynamicXfemSolver::CreateFunctionSpaces()
{
  ElastodynamicSolver::CreateFunctionSpaces();
  for (int i=0; i<BiDomains.size(); ++i){
    BimaterialDomain* B = BiDomains[i];
    

    std::cout << "Domain of bi-material interface " << i << " : dim=" << B->dim << ", tag=" << B->tag << ", " << B->group()->psize() << " parent elements" << std::endl;

    std::cout << B->group()->vsize() << " parent vertices" << std::endl;
    std::cout << B->group()->vsize() - B->EnrichedEntities()->size() << " parent vertices along the interface" << std::endl;
    std::cout << B->EnrichedEntities()->size() << " enriched vertices" << std::endl;
    
    diffTerm<genTensor0<std::complex<double> >,0>::ConstHandle iEF(new ConvertEnrichedFSpace<genTensor0<std::complex<double> > , genTensor0<double> >(B->EnrichmentFunction()));
    
    genFilterDofMultiEntities* filterDof = new genFilterDofMultiEntities(B->EnrichedEntities());
    genFSpace<genTensor1<std::complex<double> > >::ConstHandle LagrangeFiltered (new FilteredFSpace<genTensor1<std::complex<double> > >(FSpaceDisp,filterDof));
    genFSpace<genTensor1<std::complex<double> > >::ConstHandle xFemLagrange (new EnrichedFSpace<genTensor1<std::complex<double> > >(LagrangeFiltered, iEF));

    FSpaceDisp = genFSpace<genTensor1<std::complex<double> > >::Handle(new CompositeFSpace<genTensor1<std::complex<double> > >(FSpaceDisp, xFemLagrange));
  }
}
