書籍批評 「Fortram90/95による有限要素法プログラミング」(2) 全体の構成

前回に引き続いて同書批評に入る。
全体の構成は次のようになっている。

> 第I部 概要
>> 1 はじめに
>> 1.1 何故Fortran90/95なのか
>> 1.2 Fortran90/95コンパイラについて
>> 1.3 有限要素法ソフトウエアの入手方法
>> 1.4 本書の構成について
>> 1.5 本書のプログラムの変数名

> 第II部Fortran90/95
>> 2 Fortran90/95 プログラミングでの全般的なヒント
>> 2.1 Fortran90/95の概要
>> 2.1.1 基礎知識
>> 2.1.2 READ文とWRITE文で見やすい書式を心掛ける
>> 2.1.3 文字列演算を有限要素法で活用する
>> 2.1.4 繰り返し計算をするDo-END DO
>> 2.1.5 EXIT文とCYCLE文を使い分ける
>> 2.1.6 条件による分岐処理をするIF-ELSE IF/ELSE-END IF
>> 2.1.7 選択処理をするSELECT CASE-CASE-END SELECT
>> 2.1.8 外部副プログラムでの注意点
>> 2.1.9 入出力操作 OPEN/CLOSE
>> 2.2 配列演算の基本
>> 2.2.1 配列に関する基本用語
>> 2.2.2 配列を宣言する
>> 2.2.3 定数行列を代入するDATA文
>> 2.2.4 配列処理関数について
>> 2.3 行列演算を具体例の中でマスターする
>> 2.4 DOT_PRODUCT/MAT_MUL/TRANSPOSEとその他の注意点
>> 2.5 動的配列を活用する
>> 2.6 モジュールを活用する
>> 2.7 ポインタ文を使う
>> 2.8 その他の注意点
>> 3 便利なアクセサリや裏技
>> 3.1 処理時間を測るDATE_END_TIMEとCPU_TIME
>> 3.2 画面を一時停止させるWAIT
>> 3.3 画面から対話形式で解析メニューを選ぶ
>> 3.4 文字列としての数値を整数値や時数地に変換する
>> 3.5 数値微分での桁落ちを複素数演算で回避する
>> 3.5.1 Fortram90/95における複素数演算機能
>> 3.5.2 数値微分での桁落ちについて
>> 3.5.3 複素数演算による微分近似
>> 3.5.4 計算例
>> 3.6 コンパイル時のオプション指定について
>> 4 よくあるコーディングミスの対策
>> 4.1 変数名のタイプミスや型宣言の誤りなど
>> 4.2 演算式に関するミス
>> 4.3 ファイルの読み込みエラー
>> 4.4 配列や領域に関するミス
>> 4.5 副プログラムの引数に関するミス
>> 4.6 変数の初期化漏れとコンパイルオプションのミス
>> 4.7 計算結果がNaNとなる
>> 4.8 プログラムの動きが不安定
>> 4.9 その他のミス
>> 5 ファイル操作とプリ・ポスト処理について
>> 5.1 入力データーを準備する$―$文字表示で分かりやすく
>> 5.2 データーファイル名を入力指定する
>> 5.3 出力ファイル名に計算ステップ数を自動的に割り当てる
>> 5.4 ハードディスクからデーターを読み込む/ハードディスクに計算結果を書き込む
>> 5.5 Excelをプロプロセッサとして活用する
>> 5.6 可視化技術・ポストプロセッサーについて
>> 5.7 ポストプロセッサーの活用1$―$Microsoft Excel
>> 5.8 ポストプロセッサーの活用2$―$gnuplot
>> 5.8.1 gnuplotのインストール
>> 5.8.2 gnuplotによるグラフ
>> 5.9 その他の無償で使えるプリ・ポストプロセッサー

>第III部 有限要素法
>> 6 有限要素法の基礎とプログラミングの対象
>> 6.1 有限要素法の手続きを概観する
>> 6.2 有限要素法で解くべき支配方程式について
>> 6.3 節点が複数の回転自由度を持つ場合の注意点
>> 6.4 全体レベルでのプログラミング対象
>> 6.5 要素レベルでのプログラミング対象
>> 6.6 数値積分の基礎数理
>> 6.7 要素節点断面力と要素剛性行列を評価する
>> 6.8 分布荷重を等価な節点荷重に置換する
>> 6.9 要素の体積や面積を数値積分する
>> 7 有限要素法に共通するプログラミング
>> 7.1 節点自由度の拘束を特定する入力データーの準備
>> 7.2 全体剛性行列での非ゼロ係数の分布について
>> 7.3 全体剛性行列のスカイライン構造を特定する
>> 7.4 全体節点内力と全体剛性行列の組み立て方
>> 7.5 全体剛性方程式を解く$\mathbf L\mathbf D\mathbf L^T$分解法のプログラミング
>> 7.6 非対称な剛性行列の場合の$\mathbf L\mathbf D\mathbf L^T$分解法のプログラミング
>> 8 非線形平衡方程式を解く
>> 8.1 局所的非線形解法と大域的非線形解法
>> 8.2 ホモトピー法
>> 8.3 平衡路を追跡する際の手続き
>> 8.4 荷重を制御する$―$荷重制御法
>> 8.5 変位を制御する$―$変位制御法
>> 8.6 弧長を制御する$―$弧長制御法
>> 8.7 その他の制御オプション
>> 8.8 連立非線形方程式の解法例
　
>第IV部 要素定式化の例
>> 9 線形要素の定式化の例(平面要素とソリッド要素)
>> 9.1 平面要素の節点断面力と剛性行列の評価
>> 9.2 平面要素のプログラミング例
>> 9.3 平面要素の計算例
>> 9.4 ソリッド要素の節点断面力と剛性行列の評価
>> 9.5 ソリッド要素のプログラミング例
>> 10 非線形要素の定式化の例(ソリッド要素とMITC シェル要素)
>> 10.1 非線形ソリッド要素の節点断面力の評価
>> 10.2 非線形ソリッド要素の要素剛性行列の評価
>> 10.3 非線形ソリッド要素のプログラミング例
>> 10.4 非線形ソリッド要素の計算例
>> 10.5 MITCシェル要素の概要
>> 10.6 MITCシェル要素の節点断面力と剛性行列の評価
>> 10.7 回転自由度の更新方法について
>> 10.8 MITCシェル要素のプログラミング例
>> 10.9 MITCシェル要素の計算例

> 付録A Fortran90/95 に関する補足
>> A.1 組み込み関数など
>> A.2 複素数を用いた演算

> 付録B 有限要素法に関する補足文献索引
>> B.1 変数名の命名例など
>> B.2 仮想変位の原理の使い方
>> B.3 ガウス積分の基礎
>> B.4 ガウス積分の例題
>> B.5 非線形ソリッド要素SLD_TTLのプログラム解説
>> B.6 MITCシェル要素の開発経緯

> 文献
> 索引 　

　章立てを見ると内容を知るだけに何か微妙感が漂う構成になっている。
　第1章の1.3節と1.5節は後ろに移すといいだろう。この章はFortran賛歌というべき内容になっているが、プログラミングが何かを理解できてないと、むしろ本書のような惨禍になるといういい例である。
　第2章はFortran90/95の説明なのだが、この部分は旧FORTRANとの対比程度でよかっただろう。基礎的内容を復習するという意味で書くというなら分かるが、この内容だと誰向けに書かれたのか分からない。これでFortranの勉強しようとするのなら、この本の参考文献にある本を購入したほうが効率がいいだろうし、NAGのサイトに行けばFortran90の説明がある。今ならネット上でもFortranの説明をしたPDFが手に入る。一例をあげると2.1.5節の例題プログラムはexitとcycleを使うために無理をしているが、その点は置くとしても説明とプログラムがあっていないので誤解を招く内容になっている。この時点でこの書の内容を疑うべきだった。
　第3章の2・3節は通常のソルバーでは行わないから別段必要とは思えない。通常のソルバーは外部からの割り込み処理の形でプログラムの制御を行うから、そちらをやって欲しかった。そんなことよりコマンドラインの処理を行う方法を書いたほうが余程利益が多きっかっただろう。3.4はてっきり内部ファイルの説明でもすると思ったら態々文字列からご丁寧に一文字ずつスキャンして数値に変換するというまどろっこしいことを説明しているが、言語処理系を作るのでもない限り不要である。3.5は役に立つかもしれないが、実際のDL可能なプログラムでは使っていないようである。3.6もどうでもいい事と、一般的でないことが書いてあるので正直修正の必要がある。
　第4章は当たり前の内容が書いてあるだけで目新しさはない。なんというか、そうなんだけど、そうじゃない感に溢れている内容である。
　第5章はこの本で紹介しているご自慢のプログラムの入力フォーマットについての説明だが、解かりやすいが、冗長という以外の感想が出てこない。これならベンダーが出しているデーターフォーマットを参考にした方がいいだろう。5.3はFortran勉強会で話したもので、要するにファイルに連番を入れる場合の処理である。$1,2,3,\cdots$と入れると桁数が変わったときにフォルダー上の位置がおかしくなるので、桁を揃える意味で$001,002,003,\cdots$の形にしたいわけである。Fortranであれば書式指定に単に$i3.3$を指定すれば終わるものを20行ほどのプログラムをいちいち書いているわけである。これも探してみたらオーム社のFORTRAN77にもあったので、恐らくFORTRAN 66にあってもおかしくない機能であったことは想像できる。この人たちは要った今まで何してきたの？という疑問が沸いたのがこのあたりである。この後の5.5節以降は1.3節を挿入した後にしたほうがよかっただろう。
　6~8章は可もなく不可もなくといったところだが、もう少し詳しい説明があればよかったようには思う。特に分岐を伴う全体剛性の計算は前著からもう少し持ってきてもよかっただろうにと思う。
　第9・10章が要素剛性行列の評価とプログラムだが、残念なことにMITC要素のプログラムはこの本には載せておらず丸善のサイトからDLしないと手に入らない。それでも4角形一次平面応力要素の定式化はぐちゃぐちゃと書き、6面体一次要素は線形版だけで4ページ半(約200行)にも及び、有限変形判は倍の8ページ(314行)もあるぶ代物である。どうしてこんなに長いのか理解しかねるが、いったい何時の時代の書籍ですかねぇ。MITC4要素はDLしたプログラムを見ると1997年作成とある。これも関連サブルーチンを含むと600行にも及ぶ大作だが、検討し直したら相当短くなることは想像に難くない。この後の付録Bにもこれらの要素の説明があるが、本文にいれろよと思う。
 9.10勝は要素ごとに章立てをし、現在の節になっている部分を各章の下に置くようにした方がいいだろう。例えば次のようになる。


>第IV部 要素定式化の例
>> 9 微小変形解析要素
>> 9.1 平面応力要素の定式化
>> 9.1.1 等価節点力と剛性行列
>> 9.1.2 プログラミング例
>> 9.1.3 計算例
>> 9.2 ソリッド要素の定式化
>> 9.2.1 節点断面力と剛性行列の評価
>> 9.2.2 プログラミング例
>> 10 有限変形要素(トータルラグランジェ法)の定式化
>> 10.1 ソリッド要素
>> 10.1.1 要素剛性行列の評価
>> 10.1.2 プログラミング
>> 10.1.3 計算例
>> 10.2 MITCシェル要素
>> 10.2.1 MITCシェル要素の開発経緯
>> 10.2.2 等価節点力と剛性行列の評価
>> 10.2.3 回転自由度の更新方法について
>> 10.2.4 プログラミング例
>> 10.2.5 計算例

　節点断面力の意味が不明だが、連続体要素を使うのだったら等価節点力の方がいいだろう。トラスや梁要素ならば節点は通常要素断面の重心にある元と解され、全荷重成分が節点上にあるから、断面力の呼称も間違いであるとは言えないが、平面・固体要素では断面がどこか不明である。
　この本ではその他に仮想変位の原理という用語を使っているが、正しくは仮想仕事の原理である。この分野が専門である以上、このような呼称は許されない。岐阜大などは世の流れに取り残された孤絶した環境にあるのだろうか？本当に良くこのようなものが通ったと感心する。

　FEMの理論的説明についてはまだしもそれ以外は全部について修正したほうがいいんじゃないかと思われるんだが、特に用語おかしな用語とプログラムが無意味に長いのを修正したほうがいいだろうことは断言できる内容である。

2019.10.23 加筆修正