導入方法

1.最新バージョンのVCPライブラリをダウンロード、及び解凍する。

2.vcpフォルダ内にヘッダーファイル群が入っており、必要なものを#includeすることで導入可能。

3.testフォルダ内にテストファイル群が入っている。

4.C++11以降を前提とする。(例g++4.8のコンパイルオプション-std=C++11が必要。)

5.名前空間をVCPとしているので忘れないように。

6.精度保証付き数値計算を行う場合は柏木雅英先生が作成されたkvライブラリもダウンロードする。

7.doubleの高速な行列計算をするためにBLASやLapackを導入する必要がある。

8.BLASを用いて精度保証もする場合、丸めモードが全てのスレッドで変更されるかチェックが必要。

VCPの構成(vcpフォルダ内)

行列クラス

matrix.hpp :: 行列クラス。型と指定した型にあう行列ポリシーをテンプレートで与える。matrix<T,P>。
matrix_conv.hpp :: matrixクラス同士の型の変換用ヘッダーファイル。
matrix_assist.hpp :: imats_assist.hpp、matrix_conv.hpp、vcp_fio.hppをまとめたヘッダーファイル。
mats.hpp :: 行列ポリシー。型を与えることで指定した型の行列ポリシーが生成される。
minimatrix.hpp :: 行列ポリシー。型を与えることで指定した型の行列ポリシーが生成される。
imats.hpp :: 行列ポリシーminimats<T>とmatrixクラスのminimatsポリシーによる特殊化。符号判定を持たない型向け。
imats_assist.hpp :: 精度保証用行列ポリシーを導入したmatrixクラス用のmidradなどの補助関数用ヘッダー。
pdblas.hpp :: mats doubleを継承し、BLASで高速化した近似用行列ポリシー。BLAS、Lapackが必要。
pidblas.hpp :: imats<double,pdblas>を継承した精度保証用行列ポリシー。kv、BLAS、Lapackが必要。
vcp_fio.hpp :: matrixクラスのバイナリファイルへの保存、呼び出し用ヘッダーファイル。

ルジャンドル基底クラス

ldbase.hpp :: ルジャンドル基底を用いた楕円型偏微分方程式の近似空間を作成。
ldase_assist.hpp :: 型を限定した場合のhppファイルをまとめるファイル。
irk_legendre_parameter.hpp: ガウス-ルジャンドル法に基づくブッチャー表を作成。
implicit_rk.hpp: 与えられたブッチャー表に基づき,ルンゲクッタの陰解法を行う。デフォルトはガウス-ルジャンドル法。 make_Matrix_ldbase_on_interval.hpp :: ルジャンドル基底に区間を入れた。(Version Alpha 0.0.4まで)

数値解析用のヘッダーファイル

newton.hpp: Newton法のクラス.クラスを継承してメソッドfとdfをオーバーライドで使用。
legendre_integral.hpp: Legendre積分の分点と重みのクラスinterval_ld_weightpoint。

その他のヘッダーファイル

vcp_converter.hpp :: kvライブラリに含まれるinterval-conv.hppの改造。
vcp_psa_assist.hpp :: kv::psa型の値域を求める際の関数psa_valueとpsa_value_Hornerをまとめたヘッダーファイル。
vcp_metafunc.hpp :: is_intervalなどのメタ関数をまとめたヘッダーファイル。
vcp_timer.hpp :: 実行時間計測用のクラスのヘッダーファイル。

テストファイルの構成

行列クラスのテスト(test_matrixフォルダ内)

test_matrixbool.cpp :: matrix<bool>の使い方をまとめたファイル。
test_submatrix.cpp :: matrixクラスの機能として部分行列の使い方をまとめたファイル。
test_matrix.cpp :: matrixクラスの機能を簡単にまとめたメインファイル。中身を改造して色々と実行可能。
test_metafunction.cpp :: metafunctionの使い方を簡単にまとめたメインファイル。
test_minimatrix.cpp :: ポリシーminimatsの使い方を簡単にまとめたファイル。
test_convert.cpp :: convertの使い方を簡単にまとめたメインファイル。
test_interval_matrix.cpp :: magやintervalmagの使い方をまとめたファイル。
Check_pdblas_rounding.cpp :: matrixクラスの行列積を事前に丸めモード変更しても良いかチェックする。BLASも可能。
Check_pidblas_rounding.cpp :: 精度保証行列ポリシーpidblasの丸めモード確認用メインファイル。
Check_Compile_Option1.cpp :: コンパイルオプションによる結果を確認するファイルその1。--2.cppと対。
Check_Compile_Option2.cpp :: コンパイルオプションによる結果を確認するファイルその2。--1.cppと対。
Check_OpenMP.cpp :: OpenMPを使用しても使用前と結果が変わらないことを確認するファイル。
benchmark.cpp :: ベンチマークを計測するためのファイル。

ルジャンドル基底クラスのテスト(test_PDEフォルダ内)

test_Allen_Cahn.cpp :: ldbase.hppを用いてAllen_Cahn方程式の線形化作用素の逆作用素ノルムを求める。
test_Emden.cpp :: ldbase.hppを用いてEmden方程式を解く。
test_Emden_New_Method.cpp :: 2019年考案の新しい精度保証理論に基づく方法でEmden方程式を解く。
test_Lotka_Volterra2.cpp :: Lotka_Volterra方程式の線形化作用素の逆作用素ノルムをGoerischの方法を用いて求める。
test_Gray-Scott.cpp :: ldbase.hppを用いてGray-Scott方程式を解く。(未完)
test_Laplace_eigenvalue.cpp :: ldbase.hppを用いてLaplace作用素の固有値を解く。
test_newton1.cpp: newton.hppの使用例。単純な1変数の非線形方程式の近似解を求める。
test_newton2_Emden.cpp: newton.hppの使用例2。定常Emden方程式の近似解をnewton.hppで求める。
test_IRK_Legendre_approximate.cpp :: implicit_rk.hppを用いてODEの初期値問題の近似解を求める。
test_parabolic_Emden_approximate.cpp :: implicit_rk.hppとldbase.hppを組み合わせて,放物型偏微分方程式を離散化して得られるODEの近似解を求める方法。
test_make_Matrix_ldbase_on_interval.cpp :: テストファイル(Version Alpha 0.0.4まで)

コンパイラについて

C++11に準拠している必要があります。 C++11として
・右辺値参照(move、&&など)
・可変長テンプレート
・std::enable_if
・std::is_constructible
・defalt
・override
・randomのメルセンヌ・ツイスター
などを使っています。

gcc 5.4.0 with Ubuntu 16.04 on windows 10 (bash on windows with Creators Update)(2017年5月24日記載)

・(確認済)gcc 7.4.0 with Ubuntu 18.04 on windows 10 (bash on windows 1903)(2019年10月2日追記)

普段はこの環境で開発しています。 OpenBlasについてはgcc 4.8.4 with Ubuntu 14.04 on windows 10 (bash on windows)同様にapt-get installで入るOpenBLASは各スレッドの丸めモードが変更されません。 そのため精度保証では利用できません。 Creators Update後はIntel MKLがインストール可能です。
(追記)Fall Creators Update後のWindows Subsystem for Linux, Intel MKL 2018 Update 1でも検証済み

1) MKLをダウンロード(著者は商用版とAcademic Researchers用のフリー版を使用。)
2) MKLの圧縮フォルダを解凍する。
3) 解凍したフォルダのsilent.cfgをテキストエディタで開く。
4) ACCEPT_EULA=decline を ACCEPT_EULA=accept に変更し,エディタを閉じる。
5) sudo ./install.sh -s silent.cfgを実行。(何も文字は出ません)
6) source /opt/intel/bin/compilervars.sh intel64 を実行(intel64以外はリファレンスを参照)。
7) source /opt/intel/mkl/bin/mklvars.sh intel64 lp64 を実行(intel64,lp64以外はリファレンスを参照)。

6)と7)は.bashrcにでも書いておくと便利です.

・コンパイル例 : testフォルダ内で...
g++ -I.. -std=c++11 -DNDEBUG -DKV_FASTROUND -O3 -m64 「メイン.cpp」 -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl -lmpfr -fopenmp

コンパイルオプション -DNDEBUG と -DKV_FASTROUND についてはkvのリファレンスを参照して下さい。
また,MKLの丸めモードの対応については下にある gcc 4.8.5 with CentOS 7.2 を見てください。
Intel MKLのオプションはここを参照して下さい.

gcc 4.8.4 with Ubuntu 14.04 on windows 10 (bash on windows) (2017年1月7日記載)

普段はこの環境で開発しています。 注意点はapt-get installで入るOpenBLASは各スレッドの丸めモードが変更されません。 そのため精度保証では利用できません。 精度保証で利用したい場合はOpenBLASのMakefile.ruleのオプションを
# If you need to synchronize FP CSR between threads (for x86/x86_64 only).
CONSISTENT_FPCSR = 1
としMakeする必要があります(現在ver 0.2.19では)。 また、OpenBLAS+Lapackで解く固有値問題がシングルコアしか使われていないように見え、さらに遅いです...

・コンパイル例 : testフォルダ内で...
g++ -I.. -std=c++11 -O3 -DNDEBUG -DKV_FASTROUND 「メイン.cpp」 -llapack 「OpemBLASの.a」 -lmpfr -fopenmp

コンパイルオプション -DNDEBUG と -DKV_FASTROUND についてはkvのリファレンスを参照して下さい。

gcc 4.8.5 with CentOS 7.2(2017年1月7日記載)

この環境は大規模な計算を想定して普段利用しているものです。 OpenBLASについては上記と同じです。 また、この環境ではmklも試しています。 mklでも無事に動作します。 mklを使用する際は、mkl.hをインクルードしないで下さい。 あるいは、インクルードしたい場合はpdblas.hppのextern"C"の部分を削る必要があります。

・コンパイル例 : testフォルダ内で...
g++ -I.. -std=c++11 -DNDEBUG -DKV_FASTROUND -O3 -m64 「メイン.cpp」 -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl -lmpfr

Intel MKLはスレッド化をintelかgnu選べます。 -lmkl_intel_thread 及び -liomp5 とするとintelが選ばれます。 一方で

・コンパイル例 : testフォルダ内で...
g++ -I.. -std=c++11 -DNDEBUG -DKV_FASTROUND -O3 -m64 「メイン.cpp」 -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl -lmpfr

のように -lmkl_gnu_thread 及び -lgomp とするとgnuが選ばれます。 現在、確かめたところintelのスレッド化は各スレッドの丸めモードが変更され精度保証が可能ですが、gnuのスレッド化は各スレッドの丸めモードが変更されませんので注意して下さい。

Intel Composer 16.03 (on gcc 4.8.5) with CentOS 7.2(2017年1月7日記載)

Intel Composerがあるので試している程度です。 kvライブラリの動作環境にも記述されていないので精度保証をする際は確認が必要となります。 Intel Composerを使い上での注意はコンパイルオプション -fp-model=strict を付けるようにしましょう。

・コンパイル例 : testフォルダ内で...
icpc -I.. -std=c++11 -fp-model=strict -DNDEBUG -DKV_FASTROUND -O3 -mkl 「メイン.cpp」

コンパイルオプション -mkl を用いてmklを使う場合、各スレッドの丸めモードが変更されるため精度保証が可能でした(Intelのスレッド化を利用?)。

VCPのコンパイルオプション

全体のコンパイルオプション

-DVCP_DEBUG : 色々と表示されるようになります。
-DVCP_NOMP : VCPライブラリ内でOpenMPが使われなくなります。

行列クラスのコンパイルオプション

-DVCP_MATS_NOMP : mats.hpp内のOpenMPが使われなくなります。-DVCP_NOMPで自動でONになります。

ルジャンドル基底クラスのコンパイルオプション

-DVCP_LEGENDRE_DEBUG : ldbase.hppについて表示されるようになります。-DVCP_DEBUGで自動でONになります。
-DVCP_LEGENDRE_NOMP : ldbase.hpp内のOpenMPが使われなくなります。-DVCP_NOMPで自動でONになります。