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

📄 ufc.cpp

📁 利用C
💻 CPP
字号:
// Copyright (C) 2007-2008 Anders Logg.// Licensed under the GNU LGPL Version 2.1.//// First added:  2007-01-17// Last changed: 2008-06-10#include <dolfin/common/types.h>#include "DofMapSet.h"#include "DofMap.h"#include "UFC.h"using namespace dolfin;//-----------------------------------------------------------------------------UFC::UFC(const ufc::form& form, Mesh& mesh, const DofMapSet& dof_map_set) : form(form){  // Create finite elements  finite_elements = new ufc::finite_element*[form.rank()];  for (uint i = 0; i < form.rank(); i++)    finite_elements[i] = form.create_finite_element(i);  // Create finite elements for coefficients  coefficient_elements = new ufc::finite_element*[form.num_coefficients()];  for (uint i = 0; i < form.num_coefficients(); i++)    coefficient_elements[i] = form.create_finite_element(form.rank() + i);  // Create cell integrals  cell_integrals = new ufc::cell_integral*[form.num_cell_integrals()];  for (uint i = 0; i < form.num_cell_integrals(); i++)    cell_integrals[i] = form.create_cell_integral(i);  // Create exterior facet integrals  exterior_facet_integrals = new ufc::exterior_facet_integral*[form.num_exterior_facet_integrals()];  for (uint i = 0; i < form.num_exterior_facet_integrals(); i++)    exterior_facet_integrals[i] = form.create_exterior_facet_integral(i);  // Create interior facet integrals  interior_facet_integrals = new ufc::interior_facet_integral*[form.num_interior_facet_integrals()];  for (uint i = 0; i < form.num_interior_facet_integrals(); i++)    interior_facet_integrals[i] = form.create_interior_facet_integral(i);  // Initialize mesh  this->mesh.init(mesh);  // Initialize cells with first cell in mesh  CellIterator cell(mesh);  this->cell.init(*cell);  this->cell0.init(*cell);  this->cell1.init(*cell);  // Initialize local tensor  uint num_entries = 1;  for (uint i = 0; i < form.rank(); i++)    num_entries *= dof_map_set[i].local_dimension();  A = new real[num_entries];  for (uint i = 0; i < num_entries; i++)    A[i] = 0.0;  // Initialize local tensor for macro element  num_entries = 1;  for (uint i = 0; i < form.rank(); i++)    num_entries *= 2*dof_map_set[i].local_dimension();  macro_A = new real[num_entries];  for (uint i = 0; i < num_entries; i++)    macro_A[i] = 0.0;    // Initialize local dimensions  local_dimensions = new uint[form.rank()];  for (uint i = 0; i < form.rank(); i++)    local_dimensions[i] = dof_map_set[i].local_dimension();  // Initialize local dimensions for macro element  macro_local_dimensions = new uint[form.rank()];  for (uint i = 0; i < form.rank(); i++)    macro_local_dimensions[i] = 2*dof_map_set[i].local_dimension();  // Initialize global dimensions  global_dimensions = new uint[form.rank()];  for (uint i = 0; i < form.rank(); i++)    global_dimensions[i] = dof_map_set[i].global_dimension();  // Initialize dofs  dofs = new uint*[form.rank()];  for (uint i = 0; i < form.rank(); i++)  {    dofs[i] = new uint[local_dimensions[i]];    for (uint j = 0; j < local_dimensions[i]; j++)      dofs[i][j] = 0;  }  // Initialize dofs on macro element  macro_dofs = new uint*[form.rank()];  for (uint i = 0; i < form.rank(); i++)  {    macro_dofs[i] = new uint[macro_local_dimensions[i]];    for (uint j = 0; j < macro_local_dimensions[i]; j++)      macro_dofs[i][j] = 0;  }  // Initialize coefficients  w = new real*[form.num_coefficients()];  for (uint i = 0; i < form.num_coefficients(); i++)  {    const uint n = coefficient_elements[i]->space_dimension();    w[i] = new real[n];    for (uint j = 0; j < n; j++)      w[i][j] = 0.0;  }  // Initialize coefficients on macro element  macro_w = new real*[form.num_coefficients()];  for (uint i = 0; i < form.num_coefficients(); i++)  {    const uint n = 2*coefficient_elements[i]->space_dimension();    macro_w[i] = new real[n];    for (uint j = 0; j < n; j++)      macro_w[i][j] = 0.0;  }}//-----------------------------------------------------------------------------UFC::~UFC(){  // Delete finite elements  for (uint i = 0; i < form.rank(); i++)    delete finite_elements[i];  delete [] finite_elements;  // Delete coefficient finite elements  for (uint i = 0; i < form.num_coefficients(); i++)    delete coefficient_elements[i];  delete [] coefficient_elements;  // Delete cell integrals  for (uint i = 0; i < form.num_cell_integrals(); i++)    delete cell_integrals[i];  delete [] cell_integrals;  // Delete exterior facet integrals  for (uint i = 0; i < form.num_exterior_facet_integrals(); i++)    delete exterior_facet_integrals[i];  delete [] exterior_facet_integrals;  // Delete interior facet integrals  for (uint i = 0; i < form.num_interior_facet_integrals(); i++)    delete interior_facet_integrals[i];  delete [] interior_facet_integrals;  // Delete local tensor  delete [] A;  // Delete local tensor for macro element  delete [] macro_A;  // Delete local dimensions  delete [] local_dimensions;  // Delete global dimensions  delete [] global_dimensions;  // Delete local dimensions for macro element  delete [] macro_local_dimensions;  // Delete dofs  for (uint i = 0; i < form.rank(); i++)    delete [] dofs[i];  delete [] dofs;  // Delete macro dofs  for (uint i = 0; i < form.rank(); i++)    delete [] macro_dofs[i];  delete [] macro_dofs;  // Delete coefficients  for (uint i = 0; i < form.num_coefficients(); i++)    delete [] w[i];  delete [] w;  // Delete macro coefficients  for (uint i = 0; i < form.num_coefficients(); i++)    delete [] macro_w[i];  delete [] macro_w;}//-----------------------------------------------------------------------------void UFC::update(Cell& cell){  // Update UFC cell  this->cell.update(cell);  // FIXME: Update coefficients}//-----------------------------------------------------------------------------void UFC::update(Cell& cell0, Cell& cell1){  // Update UFC cells  this->cell0.update(cell0);  this->cell1.update(cell1);  // FIXME: Update coefficients}//-----------------------------------------------------------------------------

⌨️ 快捷键说明

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