G+SMOでＩＧＡ（アイソジオメトリック解析）に触れてみる（コンパイル＋α編）

すいません、書き途中のものを投稿してしまったので
あとで完成させます

ほぼ自分用の忘備録。
学び始めたばかりなので、読まれる方は大嘘ぶっこいてる可能性も考慮して眉唾でお願いしたい。

#前書き
日本語の文献はほとんど見かけないが海外ではIGA（Isogeometric Analysis）が流行っているようだ。
（論文、書籍も活発に発表されており、某陽解法メインの構造解析ソフトにも採用されている）

計算精度、計算時間の点で興味はあったが、理論を習得して一から実装するのも面倒だと思っていたところ、
よさげなC++ライブラリ[G+SMO](https://gs.jku.at/trac/gismo/wiki/WikiStart)
を見つけたのでいじりながら学んでみることにした。

選んだ理由は以下の通り。
・C＋＋で記述されている
・Windows（Visual Studio）で開発できる
・依存ライブラリが少ない（Eigenのみ）

今回はコンパイルと一部サンプルを実行してみる。

##そもそもIGAって？
現段階の私の理解は形状や場の補間にCADなどCG分野でよく使われるNURBS（B-スプライン）を用いているFEM（有限要素法）。
ただNURBSの特徴によりFEMと大きく異なっている部分もある。

・一般的には自由度を持っている制御点（の変数）が形状（補間場）上にない
　ラグランジ補間に慣れている身としては違和感はあるが重み付き残差法上は問題ない、たぶん。
　しかしディレクレ境界条件の処理は節点値を固定するだけで済むFEMと異なる。
・要素がない、もしくは概念が異なる（だから名称にElementが入ってないんでしょうね）
　FEMでは補間場は要素ごとに定義されており（要素内で閉じており）、
　１要素内の節点（値）はすべて補間に関係している。
　そのため要素剛性マトリックスは密になる。
　一方IGAでは後述のノットの間隔（セグメント）を要素と呼んでいるようだが
　２次以上セグメントの補間場を構成する制御点は
　隣接するセグメントと境界以外のものも重複しているためFEMの要素のような独立性はなくなる。
　また一つのNURBS曲線、曲面、領域を要素と考えた場合、全く影響を及ぼさない制御点が１要素内に含まれるため、
　これまたFEMの要素とは大きく異なる（要素剛性行列は疎になる）。
　（個人的にはIGAでの要素は別の呼称を考えたほうが混同がなくてよいと思う）
・（まだまだありそう）
###斜め読みしいる参考文献
・[J. Austin Cottrell,Thomas J. R Hughe,Yuri Bazilevs,;Isogeometric Analysis: Toward Integration of CAD and FEA](http://as.wiley.com/WileyCDA/WileyTitle/productCd-0470748737.html)

##IGAメリット
以下のものがあるようだ。
###CAD形状からのメッシュ作成時間の削減
　IGAの主目的だと思われる項目。
　CAEでは計算時間よりもメッシュ作成などのモデル作成にかかる工数のほうが多いといわれている。
　IGAではCADで使用されているNURBS曲面を使用するため形状簡略化が不要であり、
　またメッシュサイズについても形状を変更せずに要素を分割できるNURBSの性質により
　計算中に変更しやすいことからメッシュ作成時間の削減が可能といわれている。
　ただ私は現段階では以下の点で実際どこまで効果があるのかは疑問がある。
　・CADの形状表面はNURBS曲面であっても３次元解析の際にはNURBS曲線のテンソル積で作成された
　　NURBSボリュームが必要であり、よほどの単純形状以外は結局メッシュ切りに類する作業が必要
　
　そしてぶっちゃけ今の私はあまり興味がないので触れません。
　
###計算精度向上
####接触計算
　接触計算では物体境界の滑らかさが重要になることが多い。
　続きは後で書く。

##IGAのデメリット
###計算時間
FEMと同じ自由度数、積分点数だった場合は一つの積分点が影響する自由度数が増加するため計算時間が増加する。
ただ同等の精度という観点の場合は要調査。

##NURBSとは
すいません、まだ解説できるほど理解していません、。
・制御点と補間関数で計算されるパラメトリック曲線
・NURBS⊃Bスプライン（⊃ベジェ）　のように包含されており、NURBSはBスプラインの補間関数に重みの概念を加えることで円弧などの円錐曲線を正確に表現できる
・各補間関数の決定にはノット（knot）ベクトルというNURBS、Bスプラインに特有の概念がでてきてとっつきにくい

日本語だと少し古いですが以下の本がわかりやすそうです。
[三浦曜監修 ; 中嶋孝行, 大野敏則著,;CAD・CG技術者のためのNURBS早わかり : Non-uniform rational B-spline](https://www.amazon.co.jp/CAD-CG%E6%8A%80%E8%A1%93%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AENURBS%E6%97%A9%E3%82%8F%E3%81%8B%E3%82%8A%E2%80%95Non%E2%80%90Uniform-Rational-B%E2%80%90Spline-%E4%B8%AD%E5%B6%8B/dp/4769350821)
↑出版社が倒産されているみたいなのでアマゾンへのリンク
　（CGのベースになっている技術だと思うのですがなんでこんなに文献少ないのでしょうか）

##G+SMOについて
後で書く

#実際の作業
##今回の環境
・PC: Lenovo ThinkPad Helix 2nd Gen 20CG000QUS ( Intel Core M 5Y70 1.10GHz, 8GB RAM, 256GB SSD)
・OS:　Windows10　64ビット
・開発環境:　Visual Studio 2015 Community Update3 

・G+SMO 0.8.1 Alpha
・Eigen 3.3.3 C++の線形代数ライブラリ、G+SMOコンパイルに必要
・CMAKE 3.5.2 Visual Studioプロジェクト作成に必要（2.8.8以降が必須）
・Paraview 5.1.2 データの可視化に必要
##下準備（ダウンロードなど）
・G+SMO　ダウンロード、展開
・Eigen　ダウンロード、展開、環境変数のPathに展開したフォルダを追加
・CMAKE　ダウンロード、インストール
・Paraview　ダウンロード、インストール、環境変数のPathにexeのあるフォルダを追加

##Visual Studio ソリューションの作成
・VS2015 x64 Native Tools コマンド プロンプトを起動して以下を実行する。
>mkdir "ソリューションを配置するフォルダのパス"
>cd "ソリューションを配置するフォルダのパス"
>cmake "G+SMOを展開したフォルダのパス" -G "Visual Studio 14 2015 Win64"

##コンパイル
"ソリューションを配置するフォルダ"内にgismoというソリューションファイルがあるので
開いてビルドすると
・ライブラリがlibフォルダ
・チュートリアルやサンプルの実行ファイルがbinフォルダ
に作成される。

##サンプルの実行
チュートリアル、サンプルの実行ファイルが２７個生成されるが、今回はとりあえず以下の二つを実行してみる。
###gsView
G+SMOデータ形式のxmlファイルを引数にしてParaviewで表示させる。
xmlファイルのサンプルはG+SMOを展開したフォルダ（ビルドのほうではない）内のfiledataフォルダにある。
形状のサンプリング点数の変更も行える（詳細は-hオプションの使用方法参照）。
後で絵を載せる
###poisson
矩形領域のポアソン方程式を解く。
--plotオプションで結果をParaview表示できる（こちらも詳細は-hオプションの使用方法参照）。

#今後
・計算原理の理解を進める
　ー境界条件処理
　ー数値積分方法
・G+SMOの理解を進める
・ソリッド、薄肉シェルを試しに実装