#ifndef ELASTICITY_DIAMOND_ALGORITHM_HPP
#define ELASTICITY_DIAMOND_ALGORITHM_HPP

#include <algebra/TinyVector.hpp>
#include <language/utils/FunctionSymbolId.hpp>
#include <memory>
#include <mesh/IMesh.hpp>
#include <mesh/Mesh.hpp>
#include <mesh/MeshData.hpp>
#include <mesh/MeshDataManager.hpp>
#include <scheme/IBoundaryConditionDescriptor.hpp>
#include <variant>
#include <vector>

template <size_t Dimension>
class ElasticityDiamondScheme
{
 private:
  class DirichletBoundaryCondition;
  class NormalStrainBoundaryCondition;
  class SymmetryBoundaryCondition;

 public:
  ElasticityDiamondScheme(std::shared_ptr<const IMesh> i_mesh,
                          const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list,
                          const FunctionSymbolId& lambda_id,
                          const FunctionSymbolId& mu_id,
                          const FunctionSymbolId& f_id,
                          const FunctionSymbolId& U_id);
};

#endif   // ELASTICITY_DIAMOND_ALGORITHM2_HPP