コンピュータ科学特別講義 「科学技術計算プログラミングI（有限要素法）」
中島研吾
東京大学情報基盤センター

1．はじめに本稿では，2008 年度冬学期に実施した，コンピュータ科学特別講義 I「科学技術計算プログラミング（有限要素法）」について紹介する。
計算科学・工学，ハードウェアの急速な進歩，発達を背景に，「第 3 の科学」としての大規模並列シミュレーションへの期待は，産学において一層高まっている。最新ハードウェアを駆使して，大規模並列シミュレーションプログラムを開発するための体系的な教育プログラムの事
例は，世界的に見ても少ない。
本学では 2008 年初頭から，「T2K オープンスパコン，次世代スーパーコンピュータ等を駆使した大規模シミュレーションを実施し，新しい科学を開拓する人材」を育成するための全学的な教育プログラムとして「学際計算科学・工学 人材育成プログラム1」構想が検討されている。
情報基盤センターが中心となって，関連部局（理学系・工学系・情報理工学系・新領域創成科学各研究科）の緊密な協力のもとにカリキュラム策定などの作業が進められている。2008 年度から既に試験的な講義が開講されており，ここで紹介するコンピュータ科学特別講義 I「科学技術計算プログラミング（有限要素法）」もその一環として実施されたものである。

2．学際計算科学・工学 人材育成プログラム「学際計算科学・工学 人材育成プログラム」の教育カリキュラムについては，筆者が東京大学地球惑星科学専攻で 2003 年度～2007 年度に実施した「地球物理数値解析」，「並列計算プログラミング」，「先端計算機演習」の他，地球惑星物理学科，地球惑星科学専攻で実施されている講義，演習をベースに策定している〔1〕。
基本方針は以下に示す，「4S 型人材育成戦略：System，Stage，Status，Style」である。

ScienceModeling

System
科学技術計算プログラミングを習得するためには「SMASH」すな
わち，「Science－Modeling－Algorithm－Software－Hardware」の幅広い分野をカバーすることが必要である。カリキュラム全体としてはもちろん個々の講義，演習においてもできるだけ「SMASH」をバランス良く習得できるよう配慮することが体系的教育の最も重要なポイントである。

Algorithm
SoftwareHardware
図1

1

SMASH：科学技術計算の真髄
http://nkl.cc.u-tokyo.ac.jp/CSEedu/- 1 -Stage
並列プログラミングを習得するためには：① 計算機リテラシ，プログラミング言語② 基本的な数値解析③ 実アプリケーション（例えば有限要素法，分子動力学）のプログラミング④ その並列化という 4 つの段階（stage）が必要である。本人材育成プログラムでは①～④を修士課程までに一通り習得し，博士課程では大規模並列シミュレーションを使った研究に専心することを念頭に置いている。また，修士課程修了時に就職する場合でも，並列計算に関する基礎的な知識と経験は有用であると考えられる。
上記①～④の中で，最も重要かつ，最も体系的教育が欠如しているのが③の段階である。これまでの経験では，個々のアプリケーションのアルゴリズム，処理内容の特性を良く理解していればその並列化（④）はそれほど困難なことでは無い〔1〕。従って③の部分の教育が最も重要である。
本人材育成プログラムでは，①，②のレベルは各学部・研究科の既存の講義に任せるものとするが，③，④に役立つような内容を含めたガイドラインを作成する。③，④については，手法（有限要素法，差分法，有限体積法，境界要素法，分子動力学など）ごとに基礎的なプログラミングとその並列化を教える講義・演習を新たに開講する。有限要素法は情報理工学系，有限体積法は理学系というように担当する研究科を決め，定常熱伝導，弾性静解析などの線形問題を題材とする。原則として，「1 手法につき 1 講義」であり，全学のあらゆる研究科から受講する可能性があるため，多くの受講者が容易に理解できる題材の選択も重要である。

Status
一言で「人材育成」と言っても様々なレベルがある。アプリケーションを使える人材，開発できる人材の育成が主であるが，ミドルウェア，ライブラリなどの「開発基盤」の研究開発に携わる学際的な人材（すなわち将来，並列プログラミング教育に携わることのできる人材），また新しい先端的並列計算機システムを設計できる人材の育成も視野に入れていく必要がある。

Style「Stage」であげた，①，②については学部レベルでほとんどの学生が学んでいるが，③，④については新たな履修科目となる。集中講義，講習会，e-Learning など様々な形態（style）の教育を提供することで，学生の負担増を極力抑え，効果的な学習を促進する。

3．プログラミング教育「プログラミングは経験が重要」と言われている。この言葉は正しいが，最低限の知識は必要である。最良では無いかもしれないが，効果的で着実な方法は，実際のアプリケーションプログラムを「読む」ことである。教員には非常に負担がかかるが，高等学校の古文，漢文の授業のようなスタイルが実は効果的なのである〔1〕。実用的なプログラミングの教育は本当に難- 2 -しい。本学のある工学系の教員によると：
 限られた講義時間の中では，理論，アルゴリズムを教えるので手一杯
 専門書の巻末のプログラム例をもとに自作のアプリケーションプログラムを作るような学生もいるが，ごく稀であるということであった。
筆者はこれまで，アプリケーションプログラムを「読む」というスタイルでの教育を行って来ており，短期間でアルゴリズムとプログラミングを教育する場合には効果があると感じている〔1〕。

4．講義内容2008 年度冬学期に情報理工学系研究科コンピュータ科学専攻で新たに開講されたコンピュータ科学特別講義 I「科学技術計算プログラミング（有限要素法）」は，有限要素法について，「Stage」のうち③と④の一部に相当するものである。
本講義では，偏微分方程式の数値解法として，様々な科学技術分野のシミュレーションに使用されている有限要素法について，背景となる基礎的な理論から，実用的なプログラムの作成法まで，連立一次方程式解法などの周辺技術も含めて講義を実施し，プログラミングの実習を行なった。題材としては一次元及び三次元弾性静力学を扱った。
講義の最後には初歩的な並列計算プログラミングの講義，実習を T2K オープンスパコン（東大）を使用して実施した。本講義は，科学技術計算プログラミングに必須の項目であるところの「SMASH（Science-Modeling-Algorithm-Software-Hardware）」を，できるだけ幅広くカバーし，広い視野を持った人材を育成することを目標とするものである。
有限要素法は計算機と深い関係にあり，計算機の発展とともに進歩してきた分野であるが，本学の各学部，研究科において実施されている有限要素法関連の講義は，理論，アルゴリズムに関する教育が中心で，プログラミングまでカバーしているものはほとんど無い。また，有限要素法は最終的には疎行列（行列成分のうち 0 が非常に多い行列のこと）を係数行列とする大規模な連立一次方程式を解くことに帰着されるため，疎行列を係数とする行列解法と密接な関係を持っている。有限要素法を学ぶためには，背景となる物理，変分法などの基礎的な理論の他に，疎行列解法，特にプログラミングのためには疎行列の係数格納法に習熟することが不可欠である。しかしながら，疎行列解法まで含んだ教育を実施している講義は皆無である。
筆者は，計算力学が専門であるが，数値線形代数，特に実用問題向けの前処理付並列反復法の研究に長年従事しており，疎行列解法と関連したプログラミング技術の教育の経験がある。
本講義は有限要素法そのものだけでなく，連立一次方程式解法についても学習できる非常にユニークな試みであると言える。
大規模並列シミュレーションにおいては，科学・工学と計算機科学の専門家の密接な協力が必要である。本講義は，単に並列アプリケーション開発技術を習得するだけでなく，特にコンピュータ科学専攻の学生がアプリーケーション側のニーズを把握し，両分野の融合領域を開拓する問題意識を育てることも目的としている。
表 1 に講義日程，内容を示す。講義は情報基盤センター（本郷）1 階の大演習室を使用し，- 3 -教育用計算機システム（ECCS2008）を使用したプログラミングの実習を実施した。講義の後半
では，T2K オープンスパコンを使って並列有限要素法に関する実習を行なった。背景となるアプリケーションに関する知識を持たない受講者が居ることも考慮して，弾性力学についても 1コマを割いて解説を実施した。
CW-01～10 までの講義では，変分法，重み付残差法から始まって，一次元・三次元コードについて，例題プログラムを一行一行解説した。疎行列解法，前処理手法に関する解説も実施した。計算結果の可視化にあたっては MicroAVS2を使用した。
CW-12 以降では三次元コードの並列版（MPI 使用）についての解説を実施した。時間が限られていたので，MPI に関する詳しい解説は省略し，主として並列データ構造，並列前処理アルゴリズムについて紹介し，あとは実際に T2K オープンスパコンを使った計算を実施した。
プログラミングの課題は 2 題であるが，いずれも講義の中で解説したプログラムを修正することで実施可能なものである。
詳細は本講義のホームページ3を参照されたい。講義資料等を入手することができる。
表 1：講義日程，内容日付時間番号内容

10 月 08 日（水） 0830－1000

CW-01

はじめに，有限要素法入門（I）

10 月 15 日（水） 0830－1000

CW-02

有限要素法入門（II），弾性力学入門

10 月 22 日（水） 0830－1000

CW-03

一次元コード（I），線形ソルバー入門

10 月 29 日（水） 0830－1000

CW-04

一次元コード（II）プログラム内部の解説

11 月 05 日（水） 0830－1000

CW-05

一次元コード（III）高次要素

11 月 12 日（水） 0830－1000

CW-06

11 月 26 日（水） 0830－1000

CW-07

三次元コード（I）

12 月 03 日（水） 0830－1000

CW-08

三次元コード（II），可視化

12 月 10 日（水） 0830－1000

CW-09

三次元コード（III），線形ソルバー

12 月 17 日（水） 0830－1000

CW-10

三次元コード（IV），課題 2 出題12 月 24 日（水） 0915－1000

CW-11

T2K オープンスパコン（東大）

01 月 14 日（水） 0830－1000

CW-12

並列有限要素法入門（I）

01 月 21 日（水） 0830－1000

CW-13

並列有限要素法入門（II）

01 月 28 日（水） 0830－1000

CW-14

並列有限要素法入門（III）

23

一次元コード（IV）アイソパラメトリック要素，課題
1 出題

http://www.kgt.co.jp/feature/microavs/
http://nkl.cc.u-tokyo.ac.jp/08w/- 4 -5．まとめ
登録者は 20 名であったが，実際に出席していたのは 10 名程度であった。表 1 に示すように，水曜の 1 限にも関わらず最後までコンスタントな出席者があった。内訳は，情報・数理系と理学・工学系（化学，機械，航空，建築等）の受講者が半々で，前者が若干多い程度である。理学・工学系からの受講者が半数近くを占めたことは，本講義の有用性を実証するものでもある。
受講者の感想によると最後の 3 回に実施した「並列有限要素法」の部分は余りに駆け足であまり評判は良くなかったようであるが，全体的には「これまで個別に学んで来たことが実際にどのように役に立つかよくわかった」という意見が多かった。
2009 年度も本講義は継続するが，夏学期：コンピュータ科学特別講義 I，冬学期：コンピュータ科学特別講義 II とし，夏学期は表 1 の CW-01～10 の部分をより詳細に解説し，冬学期は並列有限要素法について講義・実習を行なう予定である。

参考文

献[1] 中島研吾（2008）究極の「並列プログラミング教育」を目指して：地球惑星科学専攻での4 年間と「学際計算科学・工学人材育成プログラム」，スーパーコンピューティングニュース（東京大学情報基盤センター）10-3
http://www.cc.u-tokyo.ac.jp/publication/news/VOL10/No3/200805nakajima.pdf- 5 -