Portable, Extensible Toolkit for Scientific Computation

提供: testwiki
ナビゲーションに移動 検索に移動

はじめに

PETSc(Portable, Extensible Toolkit for Scientific Computation)は、科学技術計算のための高性能な数値計算ライブラリです。並列計算をサポートし、線形代数、非線形方程式、微分方程式の解法など、幅広い数値計算問題に対応しています。このハンドブックでは、PETScの基本的な使い方から応用例までを解説します。

PETScの概要

PETScとは

PETScは、C言語で書かれたライブラリで、以下の特徴を持っています。

  • 並列計算: MPIを利用した分散メモリ並列計算をサポート。
  • 拡張性: 新しいソルバーやデータ構造を簡単に追加可能。
  • 柔軟性: 線形代数、非線形方程式、微分方程式など、多様な問題に対応。

主な機能

  • 線形代数: 疎行列や密行列の操作、線形ソルバー。
  • 非線形方程式: 非線形ソルバーと最適化ツール。
  • 微分方程式: 時間依存および時間非依存の微分方程式ソルバー。

PETScのインストール

必要なソフトウェア

  • MPI: 並列計算用のライブラリ(例: OpenMPI, MPICH)。
  • BLAS/LAPACK: 線形代数計算用のライブラリ。
  • コンパイラ: C/C++コンパイラ(例: GCC, Clang)。

インストール手順

  1. PETScのソースコードをダウンロード:
    git clone https://gitlab.com/petsc/petsc.git
    cd petsc
    
  2. 設定とビルド:
    ./configure --with-mpi-dir=/path/to/mpi --with-blas-lapack-dir=/path/to/blas-lapack
    make all
    make install
    

PETScの基本操作

初期化と終了

PETScを使用する前に、PetscInitializeで初期化し、終了時にPetscFinalizeを呼び出します。

#include "petsc.h"

int main(int argc, char **argv) {
 PetscInitialize(&argc, &argv, NULL, NULL);
 // PETScのコード
 PetscFinalize();
 return 0;
}

ベクトルの操作

PETScでは、Vec型を使ってベクトルを操作します。

例: ベクトルの作成と設定

Vec x;
PetscInt n = 10;
VecCreate(PETSC_COMM_WORLD, &x);
VecSetSizes(x, PETSC_DECIDE, n);
VecSetFromOptions(x);

PetscScalar value = 1.0;
VecSet(x, value);
VecAssemblyBegin(x);
VecAssemblyEnd(x);

行列の操作

PETScでは、Mat型を使って行列を操作します。

例: 疎行列の作成と設定

Mat A;
PetscInt m = 10, n = 10;
MatCreate(PETSC_COMM_WORLD, &A);
MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, m, n);
MatSetFromOptions(A);
MatSetUp(A);

PetscInt row = 0, col = 0;
PetscScalar val = 1.0;
MatSetValue(A, row, col, val, INSERT_VALUES);
MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);
MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);

線形ソルバー

線形方程式の解法

PETScは、線形方程式 Ax=bを解くためのさまざまなソルバーを提供しています。

例: 線形ソルバーの使用

KSP ksp;
KSPCreate(PETSC_COMM_WORLD, &ksp);
KSPSetOperators(ksp, A, A);
KSPSetFromOptions(ksp);
KSPSolve(ksp, b, x);

前処理

PETScは、前処理(Preconditioner)をサポートしており、収束性を向上させます。

例: 前処理の設定

PC pc;
KSPGetPC(ksp, &pc);
PCSetType(pc, PCJACOBI);

非線形ソルバー

非線形方程式の解法

PETScは、非線形方程式 F(x)=0 を解くためのソルバーを提供しています。

例: 非線形ソルバーの使用

SNES snes;
SNESCreate(PETSC_COMM_WORLD, &snes);
SNESSetFunction(snes, r, FormFunction, NULL);
SNESSetJacobian(snes, J, J, FormJacobian, NULL);
SNESSetFromOptions(snes);
SNESSolve(snes, NULL, x);

時間依存問題

時間ステッピング

PETScは、時間依存問題を解くための時間ステッピングソルバーを提供しています。

例: 時間ステッピングの使用

TS ts;
TSCreate(PETSC_COMM_WORLD, &ts);
TSSetProblemType(ts, TS_NONLINEAR);
TSSetRHSFunction(ts, NULL, FormRHSFunction, NULL);
TSSetFromOptions(ts);
TSSolve(ts, x);

応用例

熱方程式の解法

熱方程式を解くためのPETScのコード例を示します。

例: 熱方程式

// 初期化と設定
PetscInitialize(&argc, &argv, NULL, NULL);

// ベクトルと行列の作成
Vec u;
Mat A;
// ... (省略)

// 線形ソルバーの設定
KSP ksp;
KSPCreate(PETSC_COMM_WORLD, &ksp);
KSPSetOperators(ksp, A, A);
KSPSetFromOptions(ksp);

// 時間ステッピングの設定
TS ts;
TSCreate(PETSC_COMM_WORLD, &ts);
TSSetProblemType(ts, TS_NONLINEAR);
TSSetRHSFunction(ts, NULL, FormRHSFunction, NULL);
TSSetFromOptions(ts);

// ソルバーの実行
TSSolve(ts, u);

// 終了処理
PetscFinalize();

練習問題

  1. ベクトル操作: サイズ100のベクトルを作成し、すべての要素を2.0に設定するプログラムを作成してください。
  2. 行列操作: 10x10の疎行列を作成し、対角要素を1.0、非対角要素を0.0に設定するプログラムを作成してください。
  3. 線形ソルバー: 線形方程式 Ax=b を解くプログラムを作成し、解を表示してください。
  4. 非線形ソルバー: 非線形方程式 F(x)=x22=0 を解くプログラムを作成してください。

まとめ

PETScは、科学技術計算のための強力なツールキットです。並列計算をサポートし、線形代数、非線形方程式、微分方程式の解法など、幅広い問題に対応しています。このハンドブックを通じて、PETScの基本的な使い方から応用例までを学び、実際の問題に適用できるようになりましょう。

下位階層のページ