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

📄 petscpreconditioner.cpp

📁 利用C
💻 CPP
字号:
// Copyright (C) 2005 Johan Jansson.// Licensed under the GNU LGPL Version 2.1.//// Modified by Garth N. Wells 2005.// Modified by Anders Logg 2006.//// First added:  2005// Last changed: 2006-08-15#ifdef HAS_PETSC#include <private/pcimpl.h>#include "PETScPreconditioner.h"#include "PETScVector.h"using namespace dolfin;//-----------------------------------------------------------------------------PETScPreconditioner::PETScPreconditioner(){  // Do nothing}//-----------------------------------------------------------------------------PETScPreconditioner::~PETScPreconditioner(){  // Do nothing}//-----------------------------------------------------------------------------void PETScPreconditioner::setup(const KSP ksp, PETScPreconditioner &pc){  PC petscpc;  KSPGetPC(ksp, &petscpc);  PETScPreconditioner::PCCreate(petscpc);  petscpc->data = &pc;  petscpc->ops->apply = PETScPreconditioner::PCApply;  petscpc->ops->applytranspose = PETScPreconditioner::PCApply;  petscpc->ops->applysymmetricleft = PETScPreconditioner::PCApply;  petscpc->ops->applysymmetricright = PETScPreconditioner::PCApply;}//-----------------------------------------------------------------------------int PETScPreconditioner::PCApply(PC pc, Vec x, Vec y){  // Convert vectors to DOLFIN wrapper format and pass to DOLFIN preconditioner  PETScPreconditioner* newpc = (PETScPreconditioner*)pc->data;  PETScVector dolfinx(x), dolfiny(y);  newpc->solve(dolfiny, dolfinx);  return 0;}//-----------------------------------------------------------------------------int PETScPreconditioner::PCCreate(PC pc){  // Initialize function pointers to 0  pc->ops->setup               = 0;  pc->ops->apply               = 0;  pc->ops->applyrichardson     = 0;  pc->ops->applytranspose      = 0;  pc->ops->applysymmetricleft  = 0;  pc->ops->applysymmetricright = 0;  pc->ops->setfromoptions      = 0;  pc->ops->view                = 0;  pc->ops->destroy             = 0;  // Set PETSc name of preconditioner  PetscObjectChangeTypeName((PetscObject)pc, "DOLFIN");  return 0;}//-----------------------------------------------------------------------------PCType PETScPreconditioner::getType(PreconditionerType pc){  switch (pc)  {  case default_pc:    return "default";  case amg:    return PCHYPRE;  case icc:    return PCICC;  case ilu:    return PCILU;  case jacobi:    return PCJACOBI;  case sor:    return PCSOR;  case none:    return PCNONE;  default:    warning("Requested preconditioner unkown. Using incomplete LU.");    return PCILU;  }}//-----------------------------------------------------------------------------#endif

⌨️ 快捷键说明

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