Реализация на языке конечных элементов c

#c #finite-element-analysis

#c #анализ конечных элементов

Вопрос:

Я имею дело с кодом, который действительно плохо прокомментирован, поскольку мне нужно расширить несколько функциональных возможностей, мне нужно понять, что делает каждый фрагмент кода, чтобы знать, повлияют ли на него мои изменения.

Код имеет дело с генерацией 2D-сетки (используя для этого библиотечный треугольник) и решением PDE на нем.

Вот код, который я не понимаю:

 void FiniteElement<Integrator, ORDER>::setPhiMaster()
{
    Eigen::Matrix<Real,3*ORDER,1> coefficients;
    for (auto i=0; i < 3*ORDER; i  )
    {
        coefficients = MatrixXr::Zero(3*ORDER,1);
        coefficients(i) = 1;
        for (auto iq=0; iq < Integrator::NNODES; iq  )
        {
            Real phi = evaluate_point<ORDER>(reference_,Integrator::NODES[iq],coefficients);
            phiMapMaster_(i,iq) = phi;
        }
    }
}
  

В конце я хотел бы знать, что именно такое phiMapMaster_ и каково его возможное использование!

Это метод внутри шаблонного класса FiniteElement, предположим, ORDER=1, и интегратор:

 class IntegratorTriangleP2{
    public:
    static const UInt ORDER = 1;
//Number of nodes
    static const UInt NNODES = 3;
//Point locations
    static const std::vector<Point> NODES;
    static const std::vector<Real> WEIGHTS;
};


const std::vector<Real> IntegratorTriangleP2::WEIGHTS = std::vector<Real>{ {1./3, 1./3, 1./3} };
const std::vector<Point> IntegratorTriangleP2::NODES = std::vector<Point> { {Point(1./6,1./6),Point(2./3,1./6),Point(1./6,2./3)} };
  

(Точка такая же, как std::complex), и вот метод evaluate_point, который принимает в качестве условного обозначения треугольник (просто 3 точки, расположенные против часовой стрелки), точку (которая является внутренней по отношению к треугольнику) и коэффициенты базиса Фурье, определенные на треугольнике

 template <>
inline Real evaluate_point<1>(const Triangle<3>amp; t, const Pointamp; point,      const Eigen::Matrix<Real,3,1>amp; coefficients)
{
    Eigen::Matrix<Real,3,1> bary_coeff = t.getBaryCoordinates(point);
      //getBaryCoordinates retunrs the barycentric coordinates of the point wrt the triangle t
    return(coefficients.dot(bary_coeff));
}
  

Комментарии:

1. В контексте FEM переменная phi обычно используется для обозначения функций формы . Здесь это имело бы смысл, потому что это зависит от ORDER , поскольку функции формы во много раз превышают некоторый порядок специальных многочленов (лагранжиан и т. Д.). Похоже, что эта функция пытается определить коэффициенты для этого конкретного полинома функции формы.

2. Код недостаточно полон, чтобы заполнить пробелы, но я предполагаю, что Integrator — это числовой пространственный интегратор (результат = сумма ( weight_i * evaluatedPoint_i). Похоже, что phiMapMaster_ содержит эти оцененные точки. Хотя это просто предположение… Вы не опубликовали код, в котором фактически используется phiMapMaster_ .