// 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>.


#ifndef _ELASTODYNAMICSOLVER_H
#define	_ELASTODYNAMICSOLVER_H

#include "dofManager.h"
#include "genTerm.h"
#include "genSolver.h"
#include "elastodynamicDomain.h"
#include "genFSpace.h"

class ElastodynamicSolver  : public genSolver{
protected :
  // structure storing the degrees of freedom
  dofManager<std::complex<double> > *pAssembler;
  // function spaces
  genFSpace<genTensor1<std::complex<double> > >::Handle FSpaceDisp; // functional space
  genTerm<genTensor2<std::complex<double> >,1>::Handle EpsilonDisp;
  // supports
  std::vector<ElastodynamicDomain*> ElastodynamicDomains;
  
public :
  ElastodynamicSolver() : genSolver(), pAssembler(0) { }
  virtual ~ElastodynamicSolver();
  //read data file
  virtual void readInputFile(const std::string &fileName);
  // builds local supports
  virtual void CheckProperties();
  // build the problem function spaces

  virtual void BuildFunctionSpaces();
  // assemble the problem
  virtual void AssembleRHS();
  virtual void AssembleLHS();
  virtual void BuildLinearSystem();
  virtual void CreateFunctionSpaces();
  // export matrix K.txt in file
  virtual void exportKb();
  virtual void exportKbCompressed();
  // export rhs b.txt in file
  virtual void exportb(); 
  // export soln in x.txt in file
  virtual void exportx();
  virtual void solve();
  
  void error_norm_L2();
  void exportSolNum();
  
  virtual PView *buildViewDispDiff_x(const std::string &postFileName);
  virtual PView *buildViewDispInc_x(const std::string &postFileName);
  virtual PView *buildViewDispAna_x(const std::string &postFileName);
  virtual PView *buildViewDispNum_x(const std::string &postFileName);
  virtual PView *buildDisplacementView(const std::string &postFileName);
  virtual PView *buildStressView(const std::string &postFileName);
  virtual PView *buildStrainView(const std::string &postFileName);

};

#endif //_ELASTODYNAMICSOLVER_H

