⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fem_system.c

📁 一个用来实现偏微分方程中网格的计算库
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "dof_map.h"#include "elem.h"#include "fe_base.h"#include "fe_interface.h"#include "equation_systems.h"#include "fem_system.h"#include "libmesh_logging.h"#include "mesh.h"#include "numeric_vector.h"#include "quadrature.h"#include "sparse_matrix.h"#include "time_solver.h"FEMSystem::FEMSystem (EquationSystems& es,                      const std::string& name,                      const unsigned int number)  : Parent(es, name, number),    fe_reinit_during_postprocess(true),    extra_quadrature_order(0),    numerical_jacobian_h(1.e-6),    verify_analytic_jacobians(0.0),    element_qrule(NULL), side_qrule(NULL), elem(NULL){}FEMSystem::~FEMSystem (){  this->clear();}Number FEMSystem::interior_value(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_subsolutions.size() > var);  libmesh_assert (elem_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<Real> > &phi =    element_fe_var[var]->get_phi();  // Accumulate solution value  Number u = 0.;  for (unsigned int l=0; l != n_dofs; l++)    u += phi[l][qp] * coef(l);  return u;}Gradient FEMSystem::interior_gradient(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_subsolutions.size() > var);  libmesh_assert (elem_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<RealGradient> > &dphi =    element_fe_var[var]->get_dphi();  // Accumulate solution derivatives  Gradient du;  for (unsigned int l=0; l != n_dofs; l++)    du.add_scaled(dphi[l][qp], coef(l));  return du;}#ifdef ENABLE_SECOND_DERIVATIVESTensor FEMSystem::interior_hessian(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_subsolutions.size() > var);  libmesh_assert (elem_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<RealTensor> > &d2phi =    element_fe_var[var]->get_d2phi();  // Accumulate solution second derivatives  Tensor d2u;  for (unsigned int l=0; l != n_dofs; l++)    d2u.add_scaled(d2phi[l][qp], coef(l));  return d2u;}#endif // ifdef ENABLE_SECOND_DERIVATIVESNumber FEMSystem::side_value(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_subsolutions.size() > var);  libmesh_assert (elem_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<Real> > &phi =    side_fe_var[var]->get_phi();  // Accumulate solution value  Number u = 0.;  for (unsigned int l=0; l != n_dofs; l++)    u += phi[l][qp] * coef(l);  return u;}Gradient FEMSystem::side_gradient(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_subsolutions.size() > var);  libmesh_assert (elem_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<RealGradient> > &dphi =    side_fe_var[var]->get_dphi();  // Accumulate solution derivatives  Gradient du;  for (unsigned int l=0; l != n_dofs; l++)    du.add_scaled(dphi[l][qp], coef(l));  return du;}#ifdef ENABLE_SECOND_DERIVATIVESTensor FEMSystem::side_hessian(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_subsolutions.size() > var);  libmesh_assert (elem_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<RealTensor> > &d2phi =    side_fe_var[var]->get_d2phi();  // Accumulate solution second derivatives  Tensor d2u;  for (unsigned int l=0; l != n_dofs; l++)    d2u.add_scaled(d2phi[l][qp], coef(l));  return d2u;}#endif // ifdef ENABLE_SECOND_DERIVATIVESNumber FEMSystem::point_value(unsigned int var, Point &p){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();    // Get current local coefficients  libmesh_assert (elem_subsolutions.size() > var);  libmesh_assert (elem_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_subsolutions[var];  Number u = 0.;  unsigned int dim = get_mesh().mesh_dimension();  FEType fe_type = element_fe_var[var]->get_fe_type();  Point p_master = FEInterface::inverse_map(dim, fe_type, elem, p);  for (unsigned int l=0; l != n_dofs; l++)    u += FEInterface::shape(dim, fe_type, elem, l, p_master)         * coef(l);  return u;}Number FEMSystem::fixed_interior_value(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_fixed_subsolutions.size() > var);  libmesh_assert (elem_fixed_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_fixed_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<Real> > &phi =    element_fe_var[var]->get_phi();  // Accumulate solution value  Number u = 0.;  for (unsigned int l=0; l != n_dofs; l++)    u += phi[l][qp] * coef(l);  return u;}Gradient FEMSystem::fixed_interior_gradient(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_fixed_subsolutions.size() > var);  libmesh_assert (elem_fixed_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_fixed_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<RealGradient> > &dphi =    element_fe_var[var]->get_dphi();  // Accumulate solution derivatives  Gradient du;  for (unsigned int l=0; l != n_dofs; l++)    du.add_scaled(dphi[l][qp], coef(l));  return du;}#ifdef ENABLE_SECOND_DERIVATIVESTensor FEMSystem::fixed_interior_hessian(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_fixed_subsolutions.size() > var);  libmesh_assert (elem_fixed_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_fixed_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<RealTensor> > &d2phi =    element_fe_var[var]->get_d2phi();  // Accumulate solution second derivatives  Tensor d2u;  for (unsigned int l=0; l != n_dofs; l++)    d2u.add_scaled(d2phi[l][qp], coef(l));  return d2u;}#endif // ifdef ENABLE_SECOND_DERIVATIVESNumber FEMSystem::fixed_side_value(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_fixed_subsolutions.size() > var);  libmesh_assert (elem_fixed_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_fixed_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<Real> > &phi =    side_fe_var[var]->get_phi();  // Accumulate solution value  Number u = 0.;  for (unsigned int l=0; l != n_dofs; l++)    u += phi[l][qp] * coef(l);  return u;}Gradient FEMSystem::fixed_side_gradient(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_fixed_subsolutions.size() > var);  libmesh_assert (elem_fixed_subsolutions[var] != NULL);  DenseSubVector<Number> &coef = *elem_fixed_subsolutions[var];  // Get shape function values at quadrature point  const std::vector<std::vector<RealGradient> > &dphi =    side_fe_var[var]->get_dphi();  // Accumulate solution derivatives  Gradient du;  for (unsigned int l=0; l != n_dofs; l++)    du.add_scaled(dphi[l][qp], coef(l));  return du;}#ifdef ENABLE_SECOND_DERIVATIVESTensor FEMSystem::fixed_side_hessian(unsigned int var, unsigned int qp){  // Get local-to-global dof index lookup  libmesh_assert (dof_indices.size() > var);  const unsigned int n_dofs = dof_indices_var[var].size();  // Get current local coefficients  libmesh_assert (elem_fixed_subsolutions.size() > var);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -