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

📄 poisson.h

📁 利用C
💻 H
📖 第 1 页 / 共 5 页
字号:
  {    // Do nothing  }  /// Return the dimension of the global finite element function space  virtual unsigned int global_dimension() const  {    return __global_dimension;  }  /// Return the dimension of the local finite element function space  virtual unsigned int local_dimension() const  {    return 2;  }  // Return the geometric dimension of the coordinates this dof map provides  virtual unsigned int geometric_dimension() const  {    return 1;  }  /// Return the number of dofs on each cell facet  virtual unsigned int num_facet_dofs() const  {    return 1;  }  /// Return the number of dofs associated with each cell entity of dimension d  virtual unsigned int num_entity_dofs(unsigned int d) const  {    throw std::runtime_error("Not implemented (introduced in UFC v1.1).");  }  /// Tabulate the local-to-global mapping of dofs on a cell  virtual void tabulate_dofs(unsigned int* dofs,                             const ufc::mesh& m,                             const ufc::cell& c) const  {    dofs[0] = c.entity_indices[0][0];    dofs[1] = c.entity_indices[0][1];  }  /// Tabulate the local-to-local mapping from facet dofs to cell dofs  virtual void tabulate_facet_dofs(unsigned int* dofs,                                   unsigned int facet) const  {    switch ( facet )    {    case 0:      dofs[0] = 0;      break;    case 1:      dofs[0] = 1;      break;    }  }  /// Tabulate the local-to-local mapping of dofs on entity (d, i)  virtual void tabulate_entity_dofs(unsigned int* dofs,                                    unsigned int d, unsigned int i) const  {    throw std::runtime_error("Not implemented (introduced in UFC v1.1).");  }  /// Tabulate the coordinates of all dofs on a cell  virtual void tabulate_coordinates(double** coordinates,                                    const ufc::cell& c) const  {    const double * const * x = c.coordinates;    coordinates[0][0] = x[0][0];    coordinates[1][0] = x[1][0];  }  /// Return the number of sub dof maps (for a mixed element)  virtual unsigned int num_sub_dof_maps() const  {    return 1;  }  /// Create a new dof_map for sub dof map i (for a mixed element)  virtual ufc::dof_map* create_sub_dof_map(unsigned int i) const  {    return new UFC_PoissonBilinearForm_dof_map_1();  }};/// This class defines the interface for the tabulation of the cell/// tensor corresponding to the local contribution to a form from/// the integral over a cell.class UFC_PoissonBilinearForm_cell_integral_0: public ufc::cell_integral{public:  /// Constructor  UFC_PoissonBilinearForm_cell_integral_0() : ufc::cell_integral()  {    // Do nothing  }  /// Destructor  virtual ~UFC_PoissonBilinearForm_cell_integral_0()  {    // Do nothing  }  /// Tabulate the tensor for the contribution from a local cell  virtual void tabulate_tensor(double* A,                               const double * const * w,                               const ufc::cell& c) const  {    // Extract vertex coordinates    const double * const * x = c.coordinates;        // Compute Jacobian of affine map from reference cell    const double J_00 = x[1][0] - x[0][0];          // Compute determinant of Jacobian    double detJ = J_00;          // Compute inverse of Jacobian    const double Jinv_00 =  1.0 / detJ;        // Set scale factor    const double det = std::abs(detJ);        // Compute geometry tensors    const double G0_0_0 = det*Jinv_00*Jinv_00;        // Compute element tensor    A[0] = 0.999999999999999*G0_0_0;    A[1] = -0.999999999999999*G0_0_0;    A[2] = -0.999999999999999*G0_0_0;    A[3] = 0.999999999999999*G0_0_0;  }};/// This class defines the interface for the assembly of the global/// tensor corresponding to a form with r + n arguments, that is, a/// mapping//////     a : V1 x V2 x ... Vr x W1 x W2 x ... x Wn -> R////// with arguments v1, v2, ..., vr, w1, w2, ..., wn. The rank r/// global tensor A is defined by//////     A = a(V1, V2, ..., Vr, w1, w2, ..., wn),////// where each argument Vj represents the application to the/// sequence of basis functions of Vj and w1, w2, ..., wn are given/// fixed functions (coefficients).class UFC_PoissonBilinearForm: public ufc::form{public:  /// Constructor  UFC_PoissonBilinearForm() : ufc::form()  {    // Do nothing  }  /// Destructor  virtual ~UFC_PoissonBilinearForm()  {    // Do nothing  }  /// Return a string identifying the form  virtual const char* signature() const  {    return "(dXa0[0]/dx0)(dXa1[0]/dx0) | ((d/dXa0[0])vi0[0, 1])*((d/dXa1[0])vi1[0, 1])*dX(0)";  }  /// Return the rank of the global tensor (r)  virtual unsigned int rank() const  {    return 2;  }  /// Return the number of coefficients (n)  virtual unsigned int num_coefficients() const  {    return 0;  }  /// Return the number of cell integrals  virtual unsigned int num_cell_integrals() const  {    return 1;  }    /// Return the number of exterior facet integrals  virtual unsigned int num_exterior_facet_integrals() const  {    return 0;  }    /// Return the number of interior facet integrals  virtual unsigned int num_interior_facet_integrals() const  {    return 0;  }      /// Create a new finite element for argument function i  virtual ufc::finite_element* create_finite_element(unsigned int i) const  {    switch ( i )    {    case 0:      return new UFC_PoissonBilinearForm_finite_element_0();      break;    case 1:      return new UFC_PoissonBilinearForm_finite_element_1();      break;    }    return 0;  }    /// Create a new dof map for argument function i  virtual ufc::dof_map* create_dof_map(unsigned int i) const  {    switch ( i )    {    case 0:      return new UFC_PoissonBilinearForm_dof_map_0();      break;    case 1:      return new UFC_PoissonBilinearForm_dof_map_1();      break;    }    return 0;  }  /// Create a new cell integral on sub domain i  virtual ufc::cell_integral* create_cell_integral(unsigned int i) const  {    return new UFC_PoissonBilinearForm_cell_integral_0();  }  /// Create a new exterior facet integral on sub domain i  virtual ufc::exterior_facet_integral* create_exterior_facet_integral(unsigned int i) const  {    return 0;  }  /// Create a new interior facet integral on sub domain i  virtual ufc::interior_facet_integral* create_interior_facet_integral(unsigned int i) const  {    return 0;  }};/// This class defines the interface for a finite element.class UFC_PoissonLinearForm_finite_element_0: public ufc::finite_element{public:  /// Constructor  UFC_PoissonLinearForm_finite_element_0() : ufc::finite_element()  {    // Do nothing  }  /// Destructor  virtual ~UFC_PoissonLinearForm_finite_element_0()  {    // Do nothing  }  /// Return a string identifying the finite element  virtual const char* signature() const  {    return "Lagrange finite element of degree 1 on a interval";  }  /// Return the cell shape  virtual ufc::shape cell_shape() const  {    return ufc::interval;  }  /// Return the dimension of the finite element function space  virtual unsigned int space_dimension() const  {    return 2;  }  /// Return the rank of the value space  virtual unsigned int value_rank() const  {    return 0;  }  /// Return the dimension of the value space for axis i  virtual unsigned int value_dimension(unsigned int i) const  {    return 1;  }  /// Evaluate basis function i at given point in cell  virtual void evaluate_basis(unsigned int i,                              double* values,                              const double* coordinates,                              const ufc::cell& c) const  {    // Extract vertex coordinates    const double * const * element_coordinates = c.coordinates;        // Compute Jacobian of affine map from reference cell    const double J_00 = element_coordinates[1][0] - element_coordinates[0][0];        // Get coordinates and map to the reference (UFC) element    double x = (coordinates[0] - element_coordinates[0][0]) / J_00;        // No mapping needed for 1D.        // Reset values    *values = 0;        // Map degree of freedom to element degree of freedom    const unsigned int dof = i;        // Generate scalings not needed for 1D        // Compute psitilde_a    const double psitilde_a_0 = 1;    const double psitilde_a_1 = x;        // Compute basisvalues    const double basisvalue0 = 0.707106781186548*psitilde_a_0;    const double basisvalue1 = 1.22474487139159*psitilde_a_1;        // Table(s) of coefficients    const static double coefficients0[2][2] = \    {{0.707106781186547, -0.408248290463863},    {0.707106781186547, 0.408248290463863}};        // Extract relevant coefficients    const double coeff0_0 = coefficients0[dof][0];    const double coeff0_1 = coefficients0[dof][1];        // Compute value(s)    *values = coeff0_0*basisvalue0 + coeff0_1*basisvalue1;  }  /// Evaluate all basis functions at given point in cell  virtual void evaluate_basis_all(double* values,                                  const double* coordinates,                                  const ufc::cell& c) const  {    throw std::runtime_error("The vectorised version of evaluate_basis() is not yet implemented.");  }  /// Evaluate order n derivatives of basis function i at given point in cell  virtual void evaluate_basis_derivatives(unsigned int i,                                          unsigned int n,                                          double* values,                                          const double* coordinates,                                          const ufc::cell& c) const  {    // Extract vertex coordinates    const double * const * element_coordinates = c.coordinates;        // Compute Jacobian of affine map from reference cell    const double J_00 = element_coordinates[1][0] - element_coordinates[0][0];        // Get coordinates and map to the reference (UFC) element    double x = (coordinates[0] - element_coordinates[0][0]) / J_00;        // No mapping needed for 1D.        // Compute number of derivatives    unsigned int num_derivatives = 1;        for (unsigned int j = 0; j < n; j++)      num_derivatives *= 1;            // Declare pointer to two dimensional array that holds combinations of derivatives and initialise    unsigned int **combinations = new unsigned int *[num_derivatives];            for (unsigned int j = 0; j < num_derivatives; j++)    {      combinations[j] = new unsigned int [n];      for (unsigned int k = 0; k < n; k++)        combinations[j][k] = 0;    }            // Generate combinations of derivatives    for (unsigned int row = 1; row < num_derivatives; row++)    {      for (unsigned int num = 0; num < row; num++)      {        for (unsigned int col = n-1; col+1 > 0; col--)        {          if (combinations[row][col] + 1 > 0)            combinations[row][col] = 0;          else          {            combinations[row][col] += 1;            break;          }        }      }    }        // Compute inverse of Jacobian    const double Jinv[1][1] =  {{1.0 / J_00}};        // Declare transformation matrix    // Declare pointer to two dimensional array and initialise    double **transform = new double *[num_derivatives];            for (unsigned int j = 0; j < num_derivatives; j++)    {      transform[j] = new double [num_derivatives];      for (unsigned int k = 0; k < num_derivatives; k++)        transform[j][k] = 1;    }        // Construct transformation matrix    for (unsigned int row = 0; row < num_derivatives; row++)    {      for (unsigned int col = 0; col < num_derivatives; col++)      {        for (unsigned int k = 0; k < n; k++)          transform[row][col] *= Jinv[combinations[col][k]][combinations[row][k]];      }    }        // Reset values    for (unsigned int j = 0; j < 1*num_derivatives; j++)      values[j] = 0;        // Map degree of freedom to element degree of freedom    const unsigned int dof = i;        // Generate scalings not needed for 1D        // Compute psitilde_a    const double psitilde_a_0 = 1;    const double psitilde_a_1 = x;        // Compute basisvalues    const double basisvalue0 = 0.707106781186548*psitilde_a_0;    const double basisvalue1 = 1.22474487139159*psitilde_a_1;        // Table(s) of coefficients    const static double coefficients0[2][2] = \    {{0.707106781186547, -0.408248290463863},    {0.707106781186547, 0.408248290463863}};

⌨️ 快捷键说明

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