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

📄 subsystem.cpp

📁 Dolfin provide a high-performance linear algebra library
💻 CPP
字号:
// Copyright (C) 2007 Anders Logg.// Licensed under the GNU LGPL Version 2.1.//// First added:  2007-04-24// Last changed: 2007-05-14#include <dolfin/log.h>#include <dolfin/DofMap.h>#include <dolfin/SubSystem.h>using namespace dolfin;//-----------------------------------------------------------------------------SubSystem::SubSystem(){  // Do nothing}//-----------------------------------------------------------------------------SubSystem::SubSystem(uint sub_system){  this->sub_system.push_back(sub_system);}//-----------------------------------------------------------------------------SubSystem::SubSystem(uint sub_system, uint sub_sub_system){  this->sub_system.push_back(sub_system);  this->sub_system.push_back(sub_sub_system);}//-----------------------------------------------------------------------------SubSystem::SubSystem(const Array<uint>& sub_system) : sub_system(sub_system){  // Do nothing}//-----------------------------------------------------------------------------SubSystem::SubSystem(const SubSystem& sub_system){  for (uint i = 0; i < sub_system.sub_system.size(); i++)    this->sub_system.push_back(sub_system.sub_system[i]);}//-----------------------------------------------------------------------------dolfin::uint SubSystem::depth() const{  return sub_system.size();}//-----------------------------------------------------------------------------ufc::finite_element* SubSystem::extractFiniteElement(const ufc::finite_element& finite_element) const{  // Recursively extract sub element  ufc::finite_element* sub_finite_element = extractFiniteElement(finite_element, sub_system);  message(2, "Extracted finite element for sub system: %s", sub_finite_element->signature());    return sub_finite_element;}//-----------------------------------------------------------------------------ufc::dof_map* SubSystem::extractDofMap(const ufc::dof_map& dof_map, Mesh& mesh, uint& offset) const{  // Reset offset  offset = 0;  // Recursively extract sub dof map  ufc::dof_map* sub_dof_map = extractDofMap(dof_map, mesh, offset, sub_system);  message(2, "Extracted dof map for sub system: %s", sub_dof_map->signature());  message(2, "Offset for sub system: %d", offset);  return sub_dof_map;}//-----------------------------------------------------------------------------ufc::finite_element* SubSystem::extractFiniteElement(const ufc::finite_element& finite_element, const Array<uint>& sub_system){  // Check if there are any sub systems  if (finite_element.num_sub_elements() == 0)  {    error("Unable to extract sub system (there are no sub systems).");  }  // Check that a sub system has been specified  if (sub_system.size() == 0)  {    error("Unable to extract sub system (no sub system specified).");  }    // Check the number of available sub systems  if (sub_system[0] >= finite_element.num_sub_elements())  {    error("Unable to extract sub system %d (only %d sub systems defined).",                  sub_system[0], finite_element.num_sub_elements());  }    // Create sub system  ufc::finite_element* sub_element = finite_element.create_sub_element(sub_system[0]);    // Return sub system if sub sub system should not be extracted  if (sub_system.size() == 1)    return sub_element;  // Otherwise, recursively extract the sub sub system  Array<uint> sub_sub_system;  for (uint i = 1; i < sub_system.size(); i++)    sub_sub_system.push_back(sub_system[i]);  ufc::finite_element* sub_sub_element = extractFiniteElement(*sub_element, sub_sub_system);  delete sub_element;  return sub_sub_element;}//-----------------------------------------------------------------------------ufc::dof_map* SubSystem::extractDofMap(const ufc::dof_map& dof_map, Mesh& mesh, uint& offset, const Array<uint>& sub_system){  // Check if there are any sub systems  if (dof_map.num_sub_dof_maps() == 0)  {    error("Unable to extract sub system (there are no sub systems).");  }  // Check that a sub system has been specified  if (sub_system.size() == 0)  {    error("Unable to extract sub system (no sub system specified).");  }    // Check the number of available sub systems  if (sub_system[0] >= dof_map.num_sub_dof_maps())  {    error("Unable to extract sub system %d (only %d sub systems defined).",                  sub_system[0], dof_map.num_sub_dof_maps());  }  // Add to offset if necessary  for (uint i = 0; i < sub_system[0]; i++)  {    ufc::dof_map* ufc_dof_map = dof_map.create_sub_dof_map(i);    DofMap dolfin_dof_map(*ufc_dof_map, mesh);    offset += dolfin_dof_map.global_dimension();    delete ufc_dof_map;  }    // Create sub system  ufc::dof_map* sub_dof_map = dof_map.create_sub_dof_map(sub_system[0]);    // Return sub system if sub sub system should not be extracted  if (sub_system.size() == 1)    return sub_dof_map;  // Otherwise, recursively extract the sub sub system  Array<uint> sub_sub_system;  for (uint i = 1; i < sub_system.size(); i++)    sub_sub_system.push_back(sub_system[i]);  ufc::dof_map* sub_sub_dof_map = extractDofMap(*sub_dof_map, mesh, offset, sub_sub_system);  delete sub_dof_map;  return sub_sub_dof_map;}//-----------------------------------------------------------------------------

⌨️ 快捷键说明

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