// 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 _HELMHOLTZ_MULTLAG_DOMAIN_H_
#define _HELMHOLTZ_MULTLAG_DOMAIN_H_

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

class HelmholtzMultLagDomain : public ScalarHelmholtzDomain
{
public:
  std::set<long int>* domainEntities;
  std::vector<genGroupOfElements*> RHSgroups;
  genFilterDof* filter;
public :
  HelmholtzMultLagDomain(const ScalarHelmholtzDomain &s) : ScalarHelmholtzDomain(s), domainEntities(NULL), filter(NULL) {}
  
  void push(genGroupOfElements* g_){
    RHSgroups.push_back(g_);
  }
  
  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(){
    if(!filter){
      filter = new genFilterDofMultiEntities(DomainEntities());
    }
    return filter;
  }
  
 
  HelmholtzMultLagDomain() : ScalarHelmholtzDomain() {}
  virtual ~HelmholtzMultLagDomain() {
    delete domainEntities;
    for (int i=0; i< RHSgroups.size(); i++) delete RHSgroups[i];
    delete filter;
  }
};



#endif// _HELMHOLTZ_MULTLAG_DOMAIN_H_
