// GenFem - A high-level finite element library
// 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 _ELASTODYNAMIC_MULTLAG_DOMAIN_H_
#define _ELASTODYNAMIC_MULTLAG_DOMAIN_H_

#include <string>
#include <vector>
#include "elastodynamicDomain.h"
#include "genSupports.h"
#include "genTerm.h"
#include "genTensors.h"
#include "genDataIO.h"
#include "genMatrix.h"
#include "genFilters.h"

class ElastodynamicMultLagDomain : public genSupport
{
public:
  std::string loc;
  std::set<long int>* domainEntities;
  genFilterDof *filter, *filter1, *filter2;
public :
  ElastodynamicMultLagDomain(const ElastodynamicDomain &s) : genSupport(s), domainEntities(NULL), filter(NULL) {}
  
  
  inline std::set<long int>* DomainEntities(){
    if (!domainEntities){
      
      std::set<MVertex*> DomainVertices;
      std::set<MElement*>::iterator it;
      for (it=begin(); it!=end(); ++it){
	MElement* e = *it;
	std::vector<MVertex*> v;
	e->getVertices(v);
	for (int j=0; j<v.size(); ++j)
	  DomainVertices.insert(v[j]);
      }

      domainEntities = new std::set<long int>();
      std::set<MVertex*>::iterator itv;
      for (itv=DomainVertices.begin(); itv!=DomainVertices.end(); ++itv){
	MVertex* v = *itv;
	long int Num = v->getNum();
	std::set<long int>::iterator it2;
	it2 = domainEntities->find(Num);
	if (it2==domainEntities->end())
	  domainEntities->insert(Num);
      }
    }
    return domainEntities;
  }
  
  inline const genFilterDof* FilterDof(int comp){
    if(!filter){
      filter1 = new genFilterDofMultiEntities(DomainEntities());
      filter2 = new genFilterDofComponent(comp );
      filter =  new genFilterDofOperatorAnd( filter1, filter2);
    }
    return filter;
  }
  
 
  ElastodynamicMultLagDomain() : genSupport() {}
  virtual ~ElastodynamicMultLagDomain() {
    delete domainEntities;
    delete filter;
    delete filter1;
    delete filter2;
  }
};



#endif// _ELASTODYNAMIC_MULTLAG_DOMAIN_H_
