📄 fem_system.c
字号:
#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 + -