1 - 九州大学 工学部 地球環境工学科 建設都市工学コース

Download Report

Transcript 1 - 九州大学 工学部 地球環境工学科 建設都市工学コース

情報処理概論
覚書一覧( 月 日)
建設都市工学コースの就職先(進路)
国家公務員
コンサルタント
国家公務員 1%
4%
建設会社 6%
その他
10%
その他
13%
地方公務員 11%
8%
地方公務員
13%
公団/電力/J R /N T T 1%
コンサルタント
進学 9%
19%
進学 67%
学部卒業生進路状況
[平成1 5 -1 9 年度]
建設会社
22%
16%
公団/電力/J R /N T T
大学院・修士課程修了生進路状況
[平成1 5 -1 9 年度]
H15-H19年卒業生実績
分野
国家公務員
地方公務員
公団/電力/JR/NTT
建設会社
コンサルタント
その他
企業名等
国土交通省
福岡県,大分県,佐賀県ほか各県
福岡市,北九州市ほか各市
西日本高速道路,東日本高速道路など
九州電力,東京電力,中国電力など
JR九州,JR西日本,JR東日本など
NTT西日本など
大林組,鹿島建設,戸田建設,清水建
設,大成建設など
日本工営,八千代エンジニアリング,
建設技術研究所,オリエンタルコンサルタンツなど
三菱重工業,新日本製鐵など
サーバと端末,接続の仕方
TeraTerm
ah% ■
at 箱崎
Asai 自宅
教育用計算機サーバ
ah.s. kyushu-u.ac.jp
TeraTerm
TeraTerm
ah% ■
ah% ■
各端末からSSHによりリモートログイン
六本松キャンパス
SSH(Secure SHell)とは
セキュリティが強化されたtelnet
TeraTerm
TeraTerm
TeraTerm
ah% ■
ah% ■
ah% ■
伊都キャンパス情報講義室1,2(ウエスト4号館305,306室)
(遠隔地にあるサーバを端末から
操作できるようにする仮想端末ソフトウェア)
ディレクトリ(フォルダ)の階層
共有フォルダ
階層のトップ
/
ホームディレクトリの総括
各ユーザのホーム
asai
ホームの1つ下の階層
ホームの2つ下の階層
student1
report
test
student2
student3
work
rpt1
home
tmp
miyoshi
kimura
rpt2
rpt3
omagari
fuchigami
ユーザは他人の領域を侵せない
rpt1
rpt2
rpt3
自分の管理する場所はディレクトリを使い,効率よく整頓すること.
コマンド一覧
UNIXの基本コマンド
コマンド
動作
ssh –X ah.s.kyushu-u.ac.jp
ホストサーバにログイン
pwd
現在位置(カレントディレクトリ)の表示
ls
ファイル一覧の表示
less ファイル名
ファイルの内容表示
cd 移動先
カレントディレクトリの変更(移動)
mkdir ディレクトリ名
新規ディレクトリの作成
mv 移動元 移動先
ファイルの移動, ファイル名の変更
cp コピー元 コピー先
ファイルのコピー
rm ファイル名
ファイルの削除
exit
ホストサーバからログアウト
実習
自分の管理フォルダを確認
①SSHでサーバ(ah.s.kyushu-u.ac.jp)にログイン
②pwd<改行(リターン)> ←コマンドは小文字
print working directoryのコマンドにより
現在のディレクトリ構造を知る.
③mkdir□JHS<改行>
make directoryコマンドにより
情報処理概論用フォルダ(JHS)を作成.
④cd□JHS<改行>
change directoryコマンドにより
フォルダJHSの中に移動
⑤mkdir□ April14<改行>
⑥再度pwdにより,
/home/****/JHS/April14
と表示される確認.
Fortranプログラム実行までの手順
1. Emacs(テキストエディタ)により,プログラム
のソースコードを書く.
コンソール画面入力待ちの状態で
例. emacs□test.f90<改行>
によりtest.f90を記述できる状態に
2. 高級言語(Fortran)で記述されたコードを実
行コードに翻訳(コンパイル)
例. f90□-o□test.exe□test.f90<改行>
小文字
実行ファイル名(***.exe)
3.実行ファイルのコマンドを実行
コマンド一覧
emacs(テキストエディタの使い方<基礎>)
カーソルの移動
文字の削除
キー操作
Ctrl+a
意味
Ctrl+e
行の末尾へ
Ctrl+v
一画面先へ進む
Ecs-v
一画面前に戻る
Ecs-<
ファイルの先頭へ移動
Ecs->
ファイルの末尾へ移動
Ctrl+d
カーソル位置の文字消去
Ctrl+h
カーソル位置直前の文字消去
Ctrl+g
フリーズ時のおまじない
Ctrl+x u
操作のやり直し
Ctrl+x Ctrl+s
ファイルのセーブ
Ctrl+x Ctrl+c
Emacs の終了
Ctrl+ は 「Ctrlキーを押しながら」の意味
Ecs- は 「Escキーを押したあと」の意味
行の先頭へ
コマンド一覧
emacs(テキストエディタの使い方<応用編>)
キー操作
Ctrl+(スペース)
意味
Ctrl+w
マークした箇所からカーソルまで切り取り
Ecs-w
マークした箇所からカーソルまでコピー
Ctrl+y
コピーした内容を貼り付け
Ctrl+k
行の削除
行の先頭へ
Ctrl+ は 「Ctrlキーを押しながら」の意味
Ecs- は 「Escキーを押したあと」の意味
実習
講義資料(プログラム書式)の約束
program□wa !変数名と同じプログラム名は禁止
!-------------------------implicit□none
real(8) :: a,b,c
!-------------------------write(*,*) ‘<input: a, b>’
read(*,*)
a,b
write(*,*) ‘<a+b=?>’
read(*,*)
atb
c = a + b
a = a + b
write(*,*) ‘check answer’, c, a
!-------------------------□stop
end□program□wa(プログラム名)
情報処理概論
第 回
月 日
 UNIXの基礎
 emacs(テキストエディタ)の使用法
 Fortranの基礎(画面入出力まで)
UNIX(Linux)?
マルチタスク(複数のジョブを同時に実行)+マルチユーザ機能
を有するオペレーティングシステム (OS) の一種
• 1969年、ベル研究所にて,ケネス・トンプソン (Kenneth
Thompson)とデニス・リッチー(Dennis MacAlistair Ritchie)は、
オペレーティングシステムUNIXを作成。ケネスはC言語の前
身であるB言語を開発したことで知られ、デニスはB言語を元
にC言語を開発した。(Wikipediaより)
Kenneth
Dennis
当初はオープンソースとして自由に公開していたため、大学、企業、政府機関で急激に広ま
る.その後,ベル研究所の親会社AT&Tがライセンスビジネスを展開したため、ソースコード
が非公開となり、閉じた世界のものとなってしまった。
Unix? Linux? Cygwin?
•
•
•
•
UNIXの商標を管理する団体The Open Groupより、同団体が定義したSingle UNIX
Specificationを満たすことの認証を受けたOS。
ベル研究所で開発されたオリジナルのUNIX及び、オリジナルのUNIXの派生OSとしてベルの
認可を得た過去のOS。
オリジナルのUNIXを起源にもつOS。
POSIXなどのUNIXに関連する規格をみたす、UNIX互換なOS。
MacOSXも該当
GNU/Linux(グニュ・リナックス)
Freeソフトウェア
(違法ではない)
1983年にGNU(Gnu's Not Unix)プロジェクトを開始。
このプロジェクトの目的は、再配布自由・改変自由なUNIXクローンのOSを
作成すること。このプロジェクトにより、多くのUNIXシステム上で動作する
ソフトウェア、例えばemacsやgcc等が作成され、これらソフトウェア
は多くのUNIXシステムで使用されるようになった。
Cygwin (シグウィン)
Microsoft Windows上で動作するUNIXライクな環境の一つである。無料で入手・使
用できる。
UNIX(Linux)の標準的なテキストエディタ
Vi(Vim)
:マウスが使えない。逆に言えば、すべての走査を
キーボードだけで簡単に処理できる。使用方法に癖あり。マ
ニアックな人向け
Emacs
:多機能。Windowsに移植されたものもある。環境に
よってはマウスを使える?(Xemacs)
多国語対応版としてMULE (MULtilingual Enhancement to GNU Emacs)
現在は本家のEmacsの機能の一部される。
実習
それでは,Emacsを使ってみよう.
コンソール画面入力待ちの状態で
例. emacs□wa.f90<改行>
によりtest.f90を記述できる状態に
program□wa !変数名と同じプログラム名は禁止
!-------------------------implicit□none
real(8) :: a,b,c
!-------------------------write(*,*) ‘<input: a, b>’
read(*,*)
a,b
write(*,*) ‘<a+b=?>’
read(*,*)
atb
c = a + b
a = a + b
write(*,*) ‘check answer’, c, a
!-------------------------□stop
end□program□wa(プログラム名)
Fortranプログラム実行までの流れ
1. Emacs(テキストエディタ)により,プログラム
のソースコードを書く.
コンソール画面入力待ちの状態で
例. emacs□test.f90<改行>
によりtest.f90を記述できる状態に
2. 高級言語(Fortran)で記述されたコードを実
行コードに翻訳(コンパイル)
例. f90□-o□test.exe□test.f90<改行>
小文字
実行ファイル名(***.exe)
3.実行ファイルのコマンドを実行
実習
プログラム実行までの体験
①pwd<リターン> ←コマンドは小文字
現在
/home/****/JHS/April22
にいることを確認.
②cp□/tmp/check.f90□./<リターン>
/tmpにあるcheck.f90 を現在のフォルダ(./)に
コピーする.
③f90□-o□check.exe□check.f90<リターン>
check.f90をコンパイルし,
実行ファイル(check.exe)を作成
④./check.exe<リターン>
実行ファイル(check.exe)を実行
言語の種類とコンパイル
• 高級言語と実行コード(機械語)
– Fortranは「高級言語」(=人間に分かり易い言葉)の一種
• 他に C言語, Pascal, Java, Basic 等
• 基本的に英語をベースにした命令群と簡単な文法
– 実行コード:
• コンピュータがそのまま実行できるコード
- 2進数で表記
• 人間が直接編集するには適さない.
• 両者の翻訳作業(コンパイル)
– Fortranの命令、文法を使って記述された処理の内容を
コンピュータが理解できる実行コードに変換する
Fortran(文法の基礎)
基本的には、上から下にしか処理しない。
人間とは違い。応用は利きません。
大文字・小文字の区別はない。
文字は半角(日本語はできるだけ排除)
不要な箇所(コメント文)、画面出力にはつかってもよい。
スペース(空白)も全角、半角は違うので注意。
Fortran(数学の基礎)
四則演算: 基本的には電卓と同じ
ただし,記号の違いに注意
乗算 ⇒ *
除算 ⇒ /
べき乗 ⇒ * *
計算順序も数学の基礎に準じる
( ) → ** → * , / → +, 順番が不安なときは ( ) を使う
括弧は ( ) だけを利用する
{ } や [ ] は使わない.
何重に使っても良い
例) (((x+y) * (z-(x-y)**2)) + (z-y) * 2)/2
A=B(イコール)はA

Bと考える
イコールは数学的な等式を表すのではなく,AにBを
代入すると考える.つまりA=10はOK 10=AはNG
画面からの入出力
カンマ(,)区切りで3つの値を入力後,<リターン>
または 入力<リターン>
を3回繰り返す
READ(*,*) ia, ib, ic
画面出力を意味する.
自動フォーマットを意味する.
画面出力を意味する.
自動フォーマットを意味する.
WRITE(*,*) ia, ib, ic
一行にia,ib,icを出力
ファイルからの入出力は第9週目に講義予定
実習
講義資料(プログラム書式)の約束
開始宣言
変数定義
program□Wa !変数名と同じプログラム名は禁止
・ Implicitな定義に従うと(a-h,o-zは実数,i-nは整数)
!-------------------------混乱を与えないように,Implicitな定義に従った
implicit□none
変数名をつけるクセをつけよう
real(8) :: a,b,c
・ Implicit noneを使うことで変数名のタイプミスを
!-------------------------検知してくれる
□
実行内容
終了宣言
write(*,*) ‘<input: a, b>’
read(*,*)
a,b
write(*,*) ‘<a+b=?>’
read(*,*)
atb
c = a + b
a = a + b
write(*,*) ‘check answer’, c, a
!-------------------------□stop
end□program□Wa(プログラム名)
Fortranでは!から行末までを「コメント(注釈)」として扱う
大文字,小文字はどちらでもOK(小文字に揃えよう.)
Fortran90では自由形式
ただし,見やすくインデントするように心がける.
講義資料は
http://www.doc.kyushu-u.ac.jp/kouriki
情報処理概論
第3回
月 日
 Fortranの基礎(画面入出力まで)
 条件式の使い方
 繰り返し処理の扱い方
Fortran(文法の基礎)
基本的には、上から下にしか処理しない。
人間とは違い。応用は利きません。
大文字・小文字の区別はない。
文字は半角(日本語はできるだけ排除)
不要な箇所(コメント文)、画面出力にはつかってもよい。
スペース(空白)も全角、半角は違うので注意。
プログラムの主な流れ
開始
処理1
条件1
Yes
データ入出力
終了
No
program name
変数の型宣言
implicit none
Integer :: ia, ib, ic
real(8) :: a, b, c
・
Implicitな定義に従うと(a-h,o-zは実数,i-nは整数)
混乱を与えないように,Implicitな定義に従った
変数名をつけるクセをつけよう
・ Implicit noneを使うことで変数名のタイプミスを
検知してくれる
stop
end program name
Fortran(数学の基礎)
四則演算: 基本的には電卓と同じ
ただし,記号の違いに注意
乗算 ⇒ *
除算 ⇒ /
べき乗 ⇒ * *
計算順序も数学の基礎に準じる
( ) → ** → * , / → +, 順番が不安なときは ( ) を使う
括弧は ( ) だけを利用する
{ } や [ ] は使わない.
何重に使っても良い
例) (((x+y) * (z-(x-y)**2)) + (z-y) * 2)/2
A=B(イコール)はA

Bと考える
イコールは数学的な等式を表すのではなく,AにBを
代入すると考える.つまりA=10はOK 10=AはNG
数学演算の注意事項(変数の型)
real(8) :: a, b, c, d
integer:: ia, ib, ic, id
real(8) :: xa, xb, xc, xd
a=1.d0 !倍精度実数に値を代入するには最後にd0とする
b=2.d0; c=3.d0; d=4.d0
ia=1; ib=2; ic=3; id=4 !整数に小数点を付けない
xa=b/ic !× :変数の型の混同は避ける.
xb=b/c
!○
条件付き処理の基本
「もし 条件1 が成立したら → 処理1
成立しなかったら → 処理2」
条件1
Yes: 1
処理1;
No: 0
処理2;
if (条件1) then
処理1
else
処理2
endif
条件付き処理・応用(多分岐)
条件1
Yes: 1
処理1;
No: 0
条件2
Yes: 1
処理2;
処理2
処理1
処理3
No: 0
処理3;
if (条件1) then
処理1
else
if(条件2)then
処理2;
else
処理3
endif
endif
条件付き処理・応用(多分岐)
条件1
No: 0
Yes: 1
条件2
No: 0
処理1;
Yes: 1
処理2;
処理3;
処理2
処理1
処理3
if (条件1) then
if(条件2)then
処理2;
else
処理3
endif
else
処理1
endif
書き方例
Ⅱ
Ⅰ
Ⅲ
Ⅳ
X=cosΘ,Y=sinΘとして グラフの第Ⅰ,Ⅳ象限にのみ値をプロットする.
(右半円をプロットする.)
if (c.gt.0 .and. c.lt.pi/2.d0) then
write(lw1,’(3d13.5)’) c, cos(c), sin(c)
elseif(c.gt.3.d0*pi/2.d0)then
write(lw1,’(3d13.5)’) c, cos(c), sin(c)
endif
if (条件1) then
if(条件2)then
処理2;
else
処理3
endif
else
処理1
endif
処理2
処理1
処理3
if (c.gt.0 .and. c.lt.pi/2.d0) then
write(lw1,’(3d13.5)’) c, cos(c), sin(c)
if(c.gt.3.d0*pi/2.d0)then
write(lw1,’(3d13.5)’) c, cos(c), sin(c)
endif
endif
条件分の書き方(関係式)
演算子
.LT.
.LE.
.EQ.
.NE.
.GT.
.GE.
例)
意味
小さい
小さいか等しい
等しい
等しくない
大きい
大きいか等しい
<
<=
==
/=
>
>=
2x  bc
(2*x .le. b*c)
or
(2*x <= b*c)
論理演算(ちょっと複雑な条件式)
論理和(.or.)∪、論理積(.and.)∩、否定(.not.)¬
条件Pあるいは条件Q
のいずれかを満足する
条件P,条件Qの両者を
同時に満足する
if((x.lt.a) .or. (y.lt.b) )
if((x.gt.a) .and. (x.lt.b) )
条件P
条件Q
条件P
条件Q
優先順位: .not. > .and. > .or.
if((x.lt.a) .or. (y.gt.b) .and. (y.lt.c) )
こちらが優先
if(.not. (y.eq.0.d0) )
実習
条件付き処理を含む例
開始宣言
変数定義
実行内容
終了宣言
program□test! ←(プログラム名)変数名と同じ名前は禁止
!-------------------------implicit□none
real(8) :: a,b
integer :: i,j
!-------------------------□read(*,*) a,b
□ □ if(-1<a-b .and. a-b<1) then
□ □ □ write(*,*) 'それらの差は1.0未満です'
□ □ else
□ □ □ write(*,*) 'それらの差は1.0以上です'
□ □ endif
!-------------------------□stop
end□program□test
Fortranでは!から行末までを「コメント(注釈)」として扱う
大文字,小文字はどちらでもOK(小文字に揃えよう.)
Fortran90では自由形式
ただし,見やすくインデントするように心がける.
繰り返し処理
開始
繰り返し処理
処理1
条件1
Yes
データ入出力
終了
No
処理2
繰り返し演算の基礎
dowhile(条件1)
処理1
enddo
条件1を満たす間は繰り返す.
i=1
dowhile (i<=10)
処理1
i=i+1
enddo
条件1の間は処理を繰り返す
do i=1, nend, (ステップ幅)
処理1 注意1)
enddo 注意2)
ステップ幅を省略したときには
1つづつカウンター(i)が大きくなる.
マイナスのステップ幅で逆戻りも可
反復カウンターiがnend以下の間は繰り返す.
do i=1,10 do i=1,10,2 do i=10,1,-2
処理1
処理1
処理1
enddo
enddo
enddo
i=1,2,3,・・・,10
i=1,3,5,7,9
i=10,8,6,4,2
iが終了条件を満たすまで,
同じ処理を繰り返す
繰り返し演算からの抜けだし法
Do i=1,nend
if( a==b ) cycle
処理1
if( c==d ) exit
処理2
enddo
!aとbが等しいときはdo文に戻る(カウンタのみ増加)
!cとdが等しいときは繰り返し処理の終了
実習
講義資料(プログラム書式)の約束
開始宣言
変数定義
実行内容
終了宣言
program□test(プログラム名) !変数名と同じプログラム名は禁止
!-------------------------・ Implicitな定義に従うと(a-h,o-zは実数,i-nは整数)
implicit□none
混乱を与えないように,Implicitな定義に従った
real(8) :: a,b
変数名をつけるクセをつけよう
integer :: i,j
・ Implicit noneを使うことで変数名のタイプミスを
検知してくれる
!-------------------------□read(*,*) a,b
□ □ if(-1<a-b .and. a-b<1) then
□ □ □ write(*,*) 'それらの差は1.0未満です'
□ □ else
□ □ □ write(*,*) 'それらの差は1.0以上です'
□ □ endif
!-------------------------□stop
end□program□test(プログラム名)
Fortranでは!から行末までを「コメント(注釈)」として扱う
大文字,小文字はどちらでもOK(小文字に揃えよう.)
Fortran90では自由形式
ただし,見やすくインデントするように心がける.
実習
講義資料(プログラム書式)の約束
開始宣言
変数定義
実行内容
終了宣言
program□test(プログラム名) !変数名と同じプログラム名は禁止
!-------------------------・ Implicitな定義に従うと(a-h,o-zは実数,i-nは整数)
implicit□none
混乱を与えないように,Implicitな定義に従った
real(8) :: a,b
変数名をつけるクセをつけよう
integer :: i,j
・ Implicit noneを使うことで変数名のタイプミスを
検知してくれる
!-------------------------□read(*,*) a,b
□ □ if(-1<a-b .and. a-b<1) then
□ □ □ write(*,*) 'それらの差は1.0未満です'
□ □ else
□ □ □ write(*,*) 'それらの差は1.0以上です'
□ □ endif
!-------------------------□stop
end□program□test(プログラム名)
Fortranでは!から行末までを「コメント(注釈)」として扱う
大文字,小文字はどちらでもOK(小文字に揃えよう.)
Fortran90では自由形式
ただし,見やすくインデントするように心がける.
情報処理概論
月 日
 組み込み関数
 副プログラム(Function,Subroutine)
 ユーザ定義関数
お勧めテキスト
入門書
専門書(スキルアップにお勧め!)
関数一覧
主な組み込み関数一覧
キー操作
引数の型
戻り値の型
機能
abs(a)
i, r, z
i, r, r
dble(a)
i, r, z
倍精度実数
int(a)
i, r, z
i
整数型変数へ変換
acos(x)
r(|x|<1)
r
逆余弦
asin(x)
r(|x|<1)
r
逆正弦
atan(x)
r
r
逆正接
cos(x)
r,z
引数と同じ
余弦
sin(x)
r,z
引数と同じ
正弦
tan(x)
r
引数と同じ
正接
mod(a,p)
i,r(aとpは同じ型)
aと同じ
sqrt(x)
r(0.0以上)
引数と同じ
log(x)
正のr
引数と同じ
平方根
自然対数(底はe)
log10(x)
正のr
引数と同じ
常用対数(底は10)
絶対値を求める
倍精度実数型へ変換
余りを求める
実習
組み込み関数を使った例
program wsincos
!-------------------------implicit none
real(8) :: pi, x !(8)は倍精度実数であることを示す.
integer :: i
intrinsic sin, cos, dble !組み込み関数を使用することを明示(省略可)
!-------------------------pi = 4.d0*datan(1.d0)
do i=1,36
x = 2.d0 * pi * dble(i)/36.d0
WRITE(*,*) ‘x, sinx, cosx=’, x, dsin(x), dcos(x)
enddo
stop
end program wsincos
Function と Subroutineの違い
多数の変数を入力
1変数を出力
多数の変数を入力
多数の変数を出力
出力4
変数2
変数1
変数3
解
出力1
入力
1,2,3,4
出力3
出力2
例① 連立一次方程式を解く
例① 公式にあてはめて解を出す.
Input → 複数可(ベクトルもOK)
Output→ (基本は)スカラー変数
Input → 係数行列,右辺項ベクトル
Output→ 解ベクトル
例② 固有値問題を解く
Input→ 行列
Output→ 固有値(複数),固有ベクトル(複数)
入力,出力ともにベクトル,行列もOK
固体力学の復習
(課題説明のため)
応力成分の行列表示
2階のテンソルをマトリックスで書いてみる
 xx  xy  xz 


 yx  yy  yz 




zy
zz 
 zx
z
x
y
結局,どんな応力(内部の力)状態なの??
座標回転と主応力
 xx  xy  xz 


 yx  yy  yz 




zy
zz 
 zx
行列の対角化=固有値解析
3
2
1
座標回転
1 0 0 


 0 2 0 
 0 0  3 
A.主応力により表現してみる!
2次元応力状態の座標回転
 
 y (syy)
 xy



x
 xy
 xy
y
 
 xy
x  y
2
 x  y
2

 x  y
2
cos 2   xy sin 2
sin 2   xy cos 2
(txy)
 x (sxx)
結果としてモール円を描く
x  y 

  x  y 
2
2
 
    
   xy
2 

 2 
2
2
2次元応力状態の
座標変換と主応力
 min
最小主応力
 min
 max
最大主応力
 max
  x  y 
,0
中心 
 2

半径   x   y    2


xy
2


2
 max ,  min 
 x  y
2
  x  y 
 

2
2
2



xy

課題①
• 次に示すサンプルプログラムを参考に以下の
4つの関数を完成せよ
① 最大主応力  max
を求める関数smax
② 最小主応力  min
を求める関数smin
③ 指定した角度cita(rad)だけ傾いた斜面上で
の垂直応力 を求める関数scita

④ 指定した角度cita(rad)だけ傾いた斜面上で
のせん断応力 を求める関数tcita

サンプルプログラム
実習

program sigmaxmin
implicit none
max
real(8) :: sxx, syy, txy, x, y, xs, xt
real(8) :: pi, pip4, cita
real(8), external :: smax, smin, scita, tcita
!-----------------------------------write(*,*) 'Input sxx='
read(*,*) sxx
write(*,*) 'Input syy='
read(*,*) syy
write(*,*) 'Input txy='
read(*,*) txy
!------------------------------------x = smax(sxx,syy,txy)
y = smin(sxx,syy,txy)
WRITE(*,*) 'principle stress=',x,y
pi = 4.d0 * datan(1.d0)
cita = pi/6.d0
! xs = scita(sxx,syy,txy,cita)
!xt = tcita(sxx,syy,txy,cita)
実引数
WRITE(*,*) 'cita, sc, tc=',cita, xs, xt
stop
end program sigmaxmin
,  min 
 x  y
2
  x  y 
 

2
2
2



xy

関数の中身は全くのデタラメ
使い方のみマネルこと
① smax(最大主応力)  max 仮引数
real(8) function smax(xx,yy,xy)
implicit none
real(8) :: xx, yy, xy
smax = xx+yy+xy
end function smax
② smin(最小主応力)  min
real(8) function smin(xx,yy,xy)
implicit none
real(8) :: xx, yy, xy
smin = xx-yy-xy
end function smin
smax = (XX+YY)/2.d0 + dsqrt( ( (xx-yy)/2.d0 )**2 + xy**2 )
smin = (XX+YY)/2.d0 - dsqrt( ( (xx-yy)/2.d0 )**2 + xy**2 )
サンプルプログラム
実習
program sig_rotate
implicit none
real(8) :: sxx, syy, txy, x, y, xs, xt
real(8) :: pi, pipt, cita
real(8), external : smax, smin, scita, tcita
integer :: i
!-----------------------------------write(*,*) 'Input sxx='
read(*,*) sxx
write(*,*) 'Input syy='
read(*,*) syy
write(*,*) 'Input txy='
read(*,*) txy
!------------------------------------x = smax(sxx,syy,txy)
y = smin(sxx,syy,txy)
WRITE(*,*) 'principle stress=',x,y
pi = 4.d0 * datan(1.d0)
実引数
!
pipt= pi/20.d0
!
!
do i=0,10
!
cita=dble(i)*pipt
!
xs = scita(sxx,syy,txy,cita)
!
xt = tcita(sxx,syy,txy,cita)
!
WRITE(*,*) x,xs,xt,y
!
if( xs.gt.x ) then
!
WRITE(*,*) 'error with a cita=', cita
!
endif
!
!
enddo
stop
end program sig_rotate
/JHS/June2/srotate.f90
① smax(最大主応力)  max 仮引数
real(8) function smax(xx,yy,xy)
implicit none
real(8) :: xx, yy, xy
smax = xx+yy+xy
end function smax
② smin(最小主応力)  min
real(8) function smin(xx,yy,xy)
implicit none
real(8) :: xx, yy, xy
smin = xx-yy-xy
end function smin
③ scita(cita回転時の垂直応力)  
real(8) function scita(xx,yy,xy,cita)
implicit none
real(8) :: xx, yy, xy, cita
scita = xx+yy+cita
end function scita
④ tcita(cita回転時のせん断応力)

real(8) function tcita(xx,yy,xy,cita)
implicit none
real(8) :: xx, yy, xy, cita
tcita = xy - (xx+yy)*cita
end function tcita
サブルーチンを使ったサンプル
program output_stress
implicit none
real(8) :: sxx, syy, txy, x, y, xs, xt
Subroutine cal_stress(smax,smin,xx,yy,xy,cita, scita, tcit
real(8) :: pi, pip4, cita
real(8), external :: smax, smin, scita, tcita
implicit none
!-----------------------------------real(8),intent(in) :: xx,yy,xy,cita
write(*,*) 'Input sxx='
real(8),intent(out) :: smax,smin,scita,tcita
read(*,*) sxx
write(*,*) 'Input syy='
smax = xx+yy+xy
read(*,*) syy
smin
= xx+yy-xy
write(*,*) 'Input txy='
scita = xx*yy*xy
read(*,*) txy
tcita = xx**2+yy**2+sin(cita)
!------------------------------------pi = 4.d0 * datan(1.d0)
pip4 = pi /4.d0
end subroutine cal_stress
cits=pip4
call cal_stress(smax, smin, sxx, syy,txy, cita, scita, tcita)
WRITE(*,*) 'principle stress=',smax,smin, scita, tcita
stop
end program output_stress
情報処理概論
第 回
月 日
 配列
 静的メモリ確保
 動的メモリ確保
配列(array)
• 配列とは同じ型の変数をまとめたもの
real(8) :: s
スカラ
s
real(8), dimension(3) :: a
3次元ベクトル
a(1)
a(2)
a(1)
a(2)
real(8), dimension(5,2) :: b
b(1,2)
b(2,2)
a(3)
a(3)
b(3,2)
5行2列の行列
b(4,2)
b(5,2)
b(1,1) b(2,1) b(3,1) b(4,1) b(5,1)
b(1,1)
b(1,2)
b(2,1)
b(2,2)
b(3,1)
b(3,2)
b(4,1)
b(4,2)
b(5,1)
b(5,2)
配列の使い方
real(8), dimension(5,2) :: b
b(1:5,1:2) = 0.d0
! すべてに同じ値を代入
b(1,1) = 1.d0 !成分ごとに値を代入
b(2,1) = 2.d0
b(3,1) = 3.d0
b(2:5,2) = 4.d0 !部分配列に値を代入
始点 終点
1.d0
0.d0
2.d0
4.d0
3.d0
4.d0
0.d0
4.d0
0.d0
4.d0
配列の確保(静的メモリ確保例)
基本(一つずつdimensionによりサイズを指定)
real(8), dimension(3) :: a
real(8), dimension(5,2) :: b
応用(parameter属性を宣言した整数により一括指定)
Integer, parameter
:: n = 10
real(8), dimension(n) :: a
real(8), dimension(n,n) :: b
問題によりnの数に変更があれば、再度プログラムを書く+コンパイルが必要
配列の確保(動的メモリ確保)
Integer, parameter
:: n = 10
real(8), dimension(n) :: a プログラム実行時に配列の数を指定
real(8), dimension(n,n) :: b
おススメ
real(8), allocatable :: a(:)
real(8), allocatable :: b(:,:)
integer
:: n
!--------------------------------read(*,*) n
プログラム実行時に入力した値で配列を確保
問題によって自由にサイズを変更できる
allocate( a(n) )
allocate( b(n,n) )
副プログラムへの配列の受け渡し
program sample
integer, parameter
:: n = 10
real(8), dimension(n) :: a
real(8), dimension(n) :: b
real(8), external :: myfunc
Real(8) :: x
!-------------------------------a=10.d0
b=1.d0
x=myfunc(a,b,n)
stop
end program sample
real(8) function myfunc(vec1,vec2,nsize)
real(8), dimension(nsize) :: vec1, vec2
integer :: nsize
myfunc = vec1(1)+vec2(1)
end function
基本: 配列名と配列の次元数を引数をつかって受け渡す
test_vec.f90
課題① (ベクトル)
• 次に示すサンプルプログラムを参考に、以下の手順により10
次元のベクトル(xvec)を正規化するプログラムを完成せよ。
① n次元のベクトルのノルムを定義する関数を作成
calc_norm(xvec,n)
x  x1, x2 , xn T のとき,
注)サンプルプログラムでは
n次元のベクトルxx,yyの内積を求める
関数dotprdctを示しています。
②
x  x1  x2    xn
2
2
2
ベクトルのノルムを使い、ベクトルを正規化したベクトル
(yvec)を求めよ。
x  x1 , x2 ,, xn  の正規化ベクトル y
T
 x1 x2
x
y   , ,, n
 x x
x

T




test_mat.f90
課題② (行列)
• 課題①で作成したプログラムをtest_mat.f90としてコピーせよ。
(cp test_vec.f90 test_mat.f90)
n×nの行列(amat)とn次元のベクトル(xvec)の積の結果を(yvec)とし、
ベクトル(yvec)のノルムを計算するプログラムに変更せよ。(サブルー
チン化<subroutine matvec> する!)
・このとき、n×nの行列(amat)の成分、およびn次元ベクトル(xvec)の成
分は(0~1)までの乱数により与えよ。
注)行列、ベクトルとも入力値nによる動的配列によりメモリを確保するように変更せよ。
資料:動的メモリ確保を参照せよ(allocatable,allocateを使用)
サンプルプログラム
実習
program test_vec
!-------------------------------------implicit none
! real(8), dimension(10,10) :: amat
real(8), dimension(10) :: xvec, yvec
real(8)
:: xs
real(8), external
:: dotprdct
integer
:: i
!------------------------------------call random_number(xvec)
! call random_number(amat)
do i=1,10
yvec(i) = 1.d0
enddo
xs = dotprdct(xvec,yvec,10)
WRITE(*,*) xs
stop
end program test_vec
xvec(10)の成分に
(0~1)までの乱数を設定
real(8) function dotprdct(xx,yy,nsize)
implicit none
real(8), dimension(nsize) :: xx,yy
integer :: nsize,i
dotprdct=0.d0
do i=1,nsize
dotprdct=dotprdct + xx(i)*yy(i)
enddo
end function dotprdct
情報処理概論
月 日
 ファイルへの入出力
 入力、出力のフォーマット(書き方)
 最終課題について
画面からの入出力(復習)
カンマ(,)区切りで3つの値を入力後,<リターン>
または 入力<リターン>
を3回繰り返す
READ(*,*) ia, ib, ic
画面出力を意味する.
自動フォーマットを意味する.
画面出力を意味する.
自動フォーマットを意味する.
WRITE(*,*) ia, ib, ic
一行にia,ib,icを出力
ファイルから入出力
ir1=10
open(ir1,file=’ファイル名’)
READ(ir1,*) ia, ib, ic
close(ir1)
ファイルを閉じる
ファイルの装置番号
ファイルを開く
5,6は使わない。
(5はキーボード入力用、6は画面出力用に予約済み)
安全のため10以上の整数
iw1=20
open(iw1,file=’ファイル名’)
WRITE(iw1,*) ia, ib, ic
close(iw1)
行列の成分をファイルから入力
1 2 3


a   4 5 6
7 8 9
ir1=10
open(ir1,file=’input1.dat’)
nsize=3
do i=1,nsize
do j=1,nsize
read(ir1,*) a(i,j)
enddo
enddo
close(ir1)
input1.dat
1
2
3
4
5
6
7
8
9
open(ir1,file=’input2.dat’)
nsize=3
do i=1,nsize
read(ir1,*) ( a(i,j),j=1,nsize )
! read(ir1,*) a(i,1:nsize)でも可
enddo
input2.dat
1 , 2, 3
4, 5, 6
7, 8, 9
演習①
先の例の入力データ(input1.dat)のまま,次の順序で行列を代入
するにはどのようにプログラムを書き換えたら良いか.
input1.dat
1 4 7 


a  2 5 8
 3 6 9 
1
2
3
4
5
6
7
8
9
フォーマット(書式)を使用した出力例
<番号付き(好きな整数値)format文を使用する例>
100 format(書式1)
!書式の中身は次ページを参照
write(iw1,100) ia, ib, ic
<write文の中に直接書式を記述する例>
write(iw1,’(書式1)’)ia, ib, ic
少なくても6文字は自動的に使用
a=1234.567を出力
フォーマット(実数)
1 2 3
4
5
6 7
8
9 10 11 12
WRITE(*,’(E10.5)’) a
. 1 2 3 4 6 + E 0 4
WRITE(*,’(E11.5)’) a
0 . 1 2 3 4 6 + E 0 4
WRITE(*,’(E12.5)’) a
Ew.d
0 . 1 2 3 4 6 + E 0 4
w(トータルの文字数)>d(少数点以下の桁数)+6
WRITE(*,’(1PE10.5)’) a
* * * * * * * * * *
WRITE(*,’(1PE11.5)’) a
1 . 2 3 4 5 7 + E 0 3
WRITE(*,’(1PE12.5)’) a
1 . 2 3 4 5 7 + E 0 3
WRITE(*,’(2PE12.5)’) a
1 2 . 3 4 5 7 + E 0 3
WRITE(*,’(3PE12.5)’) a
1 2 3 . 4 5 7 + E 0 3
kPEw.d w(トータルの文字数)>d+6
1 2 3
4
5
6 7
(dは小数点以下の桁数+(k-1))
8
9 10 11 12
フォーマット(その他)
整数
i=1, j=2, k=3 を出力
WRITE(*,’(3i1)’) i,j,k
1 2 3
WRITE(*,’(3i2)’) i,j,k
1
2
3
+スペース
i=1, j=2, k=3 を出力
WRITE(*,’(3(i1,x))’) i,j,k
1
実数・整数+文字
i=1, j=2を出力
WRITE(*,’(i2,’行’,i2,’列’)’ ) i,j
2
3
i2
1 行
i2
2 列
フォーマットを指定した出力例
1.0 2.0 3.0


a  4.0 5.0 6.0
7.0 8.0 9.0
iw1=20
open(iw1,file=’stress1.out’)
nsize=3
do i=1,nsize
write(iw1,’(3(1PE9.2))’) ( a(i,j),j=1,nsize )
enddo
Close(iw1)
iw2=21
課題②
open(iw1,file=’stress2.out’)
行列aには同じ値が入力されたまま,
右のように出力するにはどのように
nsize=3
書き換えたらよいか
do i=1,nsize
write(iw2,’(3(1PE9.2))’) ( a(j,i),j=1,nsize )
enddo
Close(iw2)
stress1.out
1.00E+00 2.00E+00 3.00E+00
4.00E+00 5.00E+00 6.00E+00
7.00E+00 8.00E+00 9.00E+00
stress2.out
1.00E+00 4.00E+00 7.00E+00
2.00E+00 5.00E+00 8.00E+00
3.00E+00 6.00E+00 9.00E+00
クイズ①
real(8), dimension(5,2) :: b
integer
:: ni, nj, i, j
b= 0.d0
b(1:5,1) = 1.d0; b(2:5,2) = 2.d0
b(3:5,3) = 3.d0; b(4:5,4) = 4.d0
b(5,5) = 5.d0
ni=5; nj=2
do i=1,ni
write(*,’(2(1PE9.2))’) (b(i,j),j=1,nj)
enddo
クイズ②
real(8), dimension(5,5) :: b
integer
:: ni, nj, i, j
ni=5; nj=5; b= 0.d0
do i=1,ni
do j=1,nj
if(i.eq.j) then
b(i,j)=1.d0
else
b(i,j)=dble( abs(i-j) )
endif
enddo
enddo
do i=1,ni
write(*,’(5(1PE9.2))’) (b(i,j),j=1,nj)
enddo