書籍批評:「Fortran90/95による有限要素法プログラミング」(1)

　食卓塩です。
　今回はFEMの書籍の中で1・2を争う糞本「Fortran90/95による有限要素法プログラミング」(2014年刊・丸善)の批評を行います。

##著書概要
まずAmazonでの紹介と著者略歴から。
>内容紹介
>>有限要素法の物理体系や方程式の知識はもっていても,いざFortranでプログラミングをするとなると,つまずいてしまうことはないだろうか.本書はFortran90/95のプログラミング知識と有限要素法の理論を橋渡しするために,実務における有限要素法のプログラム開発のコツやヒント,裏技を伝授することを目的としている. 具体的にはよくあるコーディングミスの対策やファイル操作とそのプリ・ポスト処理,要素定式化の例、非線形有限要素法の基礎的なプログラムなどについて解説している.また,4 節点20 自由度シェル要素を使った非線形解析プログラムをウェブ上よりダウンロードして,目的に応じて自由に活用することができる. 

>内容（「BOOK」データベースより）
>>本書はFortran90/95のプログラミング知識と有限要素法の理論を橋渡しするために、実務における有限要素法のプログラム開発のコツやヒント、裏技を伝授することを目的としている。具体的にはよくあるコーディングミスの対策やファイル操作とそのプリ・ポスト処理、要素定式化の例、非線形有限要素法の基礎的なプログラムなどについて解説している 

>著者略歴 (「BOOK著者紹介情報」より)
>>藤井/文夫
>>>岐阜大学工学部知能機械コース教授。1978年Stuttgart大学(ドイツ)修了。Dr.‐Ing.(工博)。専門分野は計算力学、非線形有限要素法、分岐座屈理論、接触玩具の力学、スポーツ力学 

>>田中/真人
>>>株式会社豊田中央研究所研究員。2007年慶應義塾大学大学院理工学研究科博士(後期)課程修了。博士(工学)。2012~2014年はDuisburg‐Essen大学(ドイツ)訪問研究員。専門分野は計算力学、非線形有限要素法、有限変形理論に基づく材料構成則 

>>佐藤/維美
>>>株式会社メカニカルデザイン研究員。2008年岐阜大学大学院工学研究科数理デザイン工学専攻修士課程修了。専門分野は構造系汎用有限要素法の応用技術に関する研究開発(本データはこの書籍が刊行された当時に掲載されていたものです) 

##総評
　のっけから糞本と書いているが、理由は次の通りである。
>ぶっちゃけ言うと怪しい説明。この手の糞本に共通しているのは専門用語をきちんと使わない点があるらしい。
>この期に及んで糞なプログラム。自分で書いた内容を守れないという支離滅裂ぶり。
>しかも題名に反して内容はFortran77という羊頭狗肉。
>レビューにもあるが、プログラムはなぜか全部大文字で書かれている。Owen一派もだが、こいつらは小文字で書くと死ぬ病気にでもかかっているのか。それとも今どきメインフレームでプログラムを書いているのかと言いたくなる。80年代じゃあるまいし。

　この本のAmazonでの評価が約一名を除いて辛辣なものだというのも頷ける内容である。

　序文に故野口教授の意思を引き継いだと書いてあるが、こんなものをわざわざ購入して読むよりできる限り野口・久田の「非線形有限要素法の基礎と応用」(1995年・丸善)を入手して学習することを薦める。もっとも今、購入するとお値段が倍以上(購入時6800円だった)に跳ね上がっているから大変だろうが。この本は間違いなく価値に見合うものである。体を売っても買うべきものである。
　因みにネットを探すとこの丸コピーが出ていたりする。著作権はどこ行ったと言いたいのだが、学生にこんな高価な(しかも絶版しているらしい)書籍を買わせるわけにはいかないという事情もあるだろうが、この道に進むというなら是が非でも入手しておくことを薦める。
　ということですので、丸善出版社に置かれましては「非線形有限要素法の基礎と応用」の再販を強く希望するものです。
　で、故人の共著者の久田教授の名前が出てくるんだが、彼はこの本を実際に読まれたのだろうか。なんか、いろんな人が原稿を丁寧に読んだとあるのだが、どうしたらこんなものができるのか理解しかねる。そのいろんな人たちというのが、只野裕一佐賀大学准教授・生出佳(メカニカルデザイン)・藤川正毅琉球大学助教・中川稔章(豊田中研)・表竜二(豊田中研)・本間俊雄鹿児島大学教授・松原成志朗東北大学大学院助教である。なお肩書は現在のものだが、メカニカルデザインと豊田中研の3名については肩書は不明である。

　この書籍の目的はどうやら初心者を脱して本格的にこの道に進む人たち向けということらしいが、非線形と言いながら扱っているのはどう考えても需要が多そうな弾塑性問題ではなく、有限変形問題の方である。これはこれで意味があるんだが、何しろ連中のプログラミングスキルの低さと相まって解読に難渋する内容である。現に途中で解読を放り投げかけた。この書籍ではこれも貴重極まりないMITC4要素のプログラム例があるのだが、こちらは解読を放り投げた。それ位解り辛い。なんというか、本書全般を通して悪いプログラム例の集大成を見ている観がある。この本の出版年っていつだっけ？
　著者の教授についてほかの本を漁ってみると、あまり評価がよくないようで、この内容というのも分からんでもないという気になる。手元にあるのが第2刷とあるから、根拠があるわけではないが、学生にでも売りつけたんじゃあるまいなと思える。そうしなきゃ売れるとは思えず、増刷がかかるとも思えない。
　共著者がどういう人達か分からない。少なくともこれ以外書籍を出した形跡はなさそうである。目下売り出し中なのかもしれないがその最初の一冊目がこれでは先が思いやられる。というか、メカニカルデザインと豊田中研はこんなのに社員の名前を貸してんじゃねぇよと言いたくなる。

##序文から
　序文から批評を始める。最初の行を要約すると、「理論と実践の溝を埋めて実際のFEMプログラムでの職人気質的スキルや裏技を伝授することを目的とする。想定する読者は機械建設関連のCAE技術者・大学院生・学部生で解析対象というか分野は問わない」とある。この書籍は機械構造物(建築を含む)の書籍なのだが、この「分野」の中には流体・電気と磁気が入っているのだが、本書では説明がない。そちらをしたい人はどうすればいいのだろうか？
　二行目は「何故有限要素法にはFortran90/95が使われているのか？」とあるんだが、現実はどう考えても旧FORTRANが主流な気がするのは私の偏見だろうか？ここでいう旧FORTRANはあの懐かしい固定フォーマットで記述する77などである。で続けて、「それは有限要素法の知的資産がFORTRAN66/70/77によって書かれてきた歴史に加えて、Fortran90/95が提供する動的配列やポインタ、それに便利な配列計算といった機能を有効活用することにより、簡潔で軽快な有限要素法のプログラミンが可能になるからである」。本当にそうなっていたらいいんですが、これも気のせいな気がしている今日この頃である。実際の商用プロダクトでどれくらいがFortran90以降で書き直されたかは知る由もないが、恐らく古くからある部分はそのままということは十分あり得る。一例をあげると、悪名高いCOMMON文がある。驚くべきことにFORTRANには大域変数なんてものはない。であれば実用的なアプリを書く場合、どうしてもこのCOMMON文を使うしかない状況に陥るのである。メモリの動的割り当てもない。よってメインルーチンでバカでかい配列を割り当ててそれを管理するという気の遠くなる方法を取ることになる。実際、矢川・宮崎共著の書籍にその例がある。そしてこの部分の現在の規格に直すとしたら気の遠くなる時間が必要になることは疑いない。何しろプログラムの中核部分だから、目に見える地雷と同義である。方法としてはなるべくCOMMON文フリーなものに差し替えるしか思いつかないが、そのCOMMON文がシステムの中核に居座るレベルのものだった場合、修正は相当難しくなるだろう。まぁ、もしかしたら、そういうものを含めて一気に直してくれるソフトがあるかもしれないが。あと細かいことだが、FORTRAN70って聞いたことないんだが、私の気のせいだろうか。
　Fortran90以降の機能を使用すれば、この行で書いてる通りのことが出来るかもしれないが現実はそのようには出来ていないのは目に見えている。現に欧州ではFortranからCに移行する話が出ていたし、一部の商業プロダクトではCやC++で書かれたものまで出ている。言うなれば旧FORTRANのまま10年以上も規格を改訂しなかったツケが出ているのである。
　3行目。「ところが、Fortran90/95の学習歴がある学部学生や大学院生をはじめ若手技術者であっても、その断片的な知識を有機的に結び付けて実際の工学問題を解析するにあたり、戸惑う場面を著者らは煩雑に目撃する」。そりゃそうだろう。ひずみ変位行列の導出からして前動続行の手抜きをしてる時点で何をか況やであり、プログラミング言語教育にしても、本当にきちんとやってるのかと疑いたくなる状況を目の当たりにすると、お前らこそ今まで学生に何吹き込んできたんだと言いたくなる。この本を見ると本当に何を教えてきたんだと言いたくなるのである。先に名前の挙がった連中のところも同じなんだろう。
　そして「特に大学では有限要素法プログラム開発担当者が、定期的に煩雑に入れ替わる不可避の現実がある」んだったらそこにいるメンツの能力の平準化を図った方がいいんじゃないかと言いたくなる。最もプログラミングについては、これも結局才能というかセンスが必須であり、それは一朝一夕でできるものではない。ならどうするかなのだが、言語機能だけ教えてもどうしようもないので、構造化プログラミングの概要位は教えたほうがいいだろう。それと特に副プログラムについては一つのことだけをやれ、あれもこれもやるな、長いプログラム単位はそれだけで理解を阻害する、と教えることである。藤原博文の著書の「Cプログラミング診断室」で「関数の長さを制限すれば世のプログラマの質の向上を図れるでしょう」あったがその通りで、長いサブルーチンなど、今時害悪でしかないことを徹底するべきである。言語機能についても必要最小限という考え方は捨てるべきである。
　もう一つはデーター構造に関する教育である。本当にこの分野に関しては一番無視されているので、関連するデーターをひとまとめに扱うことくらいは教えたほうがいいだろう。
　絶望したくなるのはそういうこともできん輩がこんな糞本を出しているということなのだが。
　続いて「有限要素法の知的資産の継承と拡張のためには、プログラムそのものの解説書の他にも、有限要素法のプログラミングのコツとヒントを実践的に解いた副読本が所望されていた」のは間違いないが、残念ですがこの書籍ではその効果は見込めません。
　コツとヒントとあるが、要は元の数式をプログラムで処理しやすい形に変える必要があるのだが、それを等閑に付していたら個人的技量の発揮で終わるに決まっている。というか、態々解り辛いようにしているのかと疑いたくなる。

　4行目はこの本の売り口上が続けられている。口上通りなら良かったのだが。曰く、「本書は、有限要素法への応用を意識したFortran90/95を学ぶテキストとしても活用できる」とあるが、きょうびネットを漁るとこれより優れた解説書はいくらでも出てくるし、それ用の書籍を購入したほうがいい。「広範なFortran90/95の知識の中で、有限要素法では需要の低い構造体」なわけないだろうが。線形弾性解析でも使った経験から言わせてもらうと、入力データーを記録するなら構造体を使うのが一番という結論になる。配列に値を直接ぶち込むだけならそれでもいいだろうが、実際のプロダクトの殆どが、名前や番号が付いていることを考えると構造体を使わない選択肢など思いつかない。
　この後にこんな言葉が出てくる。「オブジェクト指向などの項目は割愛し」ているそうだが、Fortran2003以降の話ですよね？少なくともFortran95までにはクラスなどのオブジェクト指向そのものの機能はない。演算子の多重定義や総称型の定義とかはそれっぽいとはいえるが。一番言語機能を熟知してなきゃならん人種が何を言っているのだ。
　そして続けてこう書いてある。「使用頻度の高い演算の記述を優先した」。四則演算とべき乗の他、配列演算の他に何かあったかな？文字列操作のことだろうか。そういやこの本には凄く回りくどい文字列操作の話が出てくる。そういや藤原前掲書には「下手糞は文字列操作が苦手」というのがあったな。そんなものを自慢されても読む方が困るのだが。
　この行は更に続く。「したがって、実際の有限要素法演算を想定したプログラム例を厳選して収録した」結果、こっちはブチ切れたんですが、それは。特に後で紹介する6面体有限ひずみの要素剛性マトリックスを作成するSLD_TTLを見た感想は、分かればわかるほど腹立たしいものだった。
　行の最期は「また、知的資産の継承の観点からは、計算処理速度ばかりでなく、第三者にとっての可読性も念頭に入れて編集を試みた」結果は後で紹介するが、とても可読性が高いとは言えないものである。
　この後は非線形有限要素法の基礎的なプログラミングを記述とあるが、需要が高いはずの弾塑性解析ではなく有限変形の方である。そして、野口教授の開発したMITC4要素を使ったプログラムをDLできるとあるのだが、これを一から解読したらどれくらい時間がかかるのかもわからないので、一から自分でプログラムを開発したほうがよさげである。その前にMITC要素の元になったMindlinのシェルをやって欲しかったが。
　このあと2行は謝辞なので割愛する。内容は上の方に書いている。

　著者は兎に角、共著者の肩書を見ると暗澹たる気分になる。彼らの会社って何してたっけ？因みに裏表紙のカバーの見返しには日本計算工学会の書籍が載っているが、この本を見た後ではシュールな気分になる。

　この本の感想を一言でいうとこうなる。

　**もしかしたら、ひょっとしてギャグでやってるんですか？これ。**

##参考文献
Brian W.Kernighan, P.J.Plauger, 木村 泉 (翻訳)「プログラム書法」1982年 共立出版(訳本)　プログラムの書き方について解説した古典的存在であり、扱う言語は古いが、**内容は今でも通用する**。プログラムを書くものは全てこの本を読むべきと言っても過言ではない。
藤原博文「Cプログラミング診断室」1993年 技術評論社 「うつくしく健康なプログラムのために」という表題の通り、まずいプログラムを如何に改良するかを解説した本。因みにここに出てくる長い関数は2400行にも及ぶ「最長不倒関数」であるが、他にも500行に渡るswitch文なんてのもある。掲載プログラムは著者が業務で扱ったものが殆どである。実は雑誌のコーナーだったので、一般から下手なプログラムを募集したそうだが下手どころか下手糞にも掠らなかったらしい。そして現実には「職業プログラマ」の方が「素人」より下手という事実を突きつけられる。93年から20年以上が経過しているがどれくらい改善されたのだろうか。