« 2008年9月 | トップページ | 2008年11月 »

2008年10月

2008/10/31

今週気づいたこと

大学のキャンパスでTBSラジオ(954kHz)が受信できる!

入学直後、自宅でTBSラジオを受信できなかったからあきらめてたけど、大学の帰りに偶然AMラジオのスイッチを入れたらチューニングが実家に帰ったときのままになっていてTBSラジオをクリアに聞くことができた。

研究室に住み着いてしまいそうだwww

少なくとも月曜日は27:00まで大学にいるだろうなぁ。

[その後]

駐車場ではクリアに聞けるのに、研究棟に近づくとヂリヂリってどういうこと!?

結局聞けないジャン!

| | コメント (0) | トラックバック (0)

2008/10/30

より良いコードを書きたい

より良いコード書きたいと思いつつも、何が良くて何が悪いのかの判断基準が自分に無いことに気づいたのでこの本を手に取った。

内容はコードの記法や効率的なコードを書くためのTIPSでサンプルの言語はCが中心。

| | コメント (0) | トラックバック (0)

2008/10/29

e2ps

Linux系OSでテキストを印刷するときは、

  1. 文字コードをEUC-JPに変換
  2. 変換したファイルをPostScript(PS)に変換
  3. PSファイルを印刷

こういう流れで印刷している。

テキストをPSファイルに変換するプログラムには「e2ps」を使っている。

Link:e2ps作者のサイト

インストールの仕方は日本語で書かれてるから簡単。

| | コメント (0) | トラックバック (0)

2008/10/28

HDD

最近、HDDの容量が心もとなくなってきたのでネットでHDDを物色してたらHDDの安さにビックリした。

500GBで6000円強、1TBで1万円弱~12000円(送料込)・・・安い。

| | コメント (0) | トラックバック (0)

2008/10/27

線形代数

差分法でポアソン方程式やラプラス方程式を解くときは連立微分方程式を解くことになる。

連立方程式を解くということは行列計算をすることになる。

つまり、線形代数が重要になってくる。

線形代数は行列計算以外にも数値計算(というかプログラミング)に深く関わってくる。

別にやり方を覚えてしまえば線形代数を意識しなくてもコードを書けるには書けるが、なぜそうなるのか他人に説明できないようなコードはできるだけ書きたくない。

そんなことを思ったのでこの本を買った。

| | コメント (0) | トラックバック (0)

2008/10/26

Emacs起動時のフレームのサイズ,位置,フォントを指定

前にも起動時のフレームのサイズと位置をelispで設定しようとしたけど失敗し、今までエイリアスで誤魔化してた。

しかし、Emacsの設定は.emacsで完結させたいので再チャレンジ。

;; 起動時のサイズ,表示位置,フォントを指定
(setq initial-frame-alist
      (append (list
       '(width . 120)
       '(height . 45)
       '(top . 0)
       '(left . 0)
       '(font . "VL Gothic-11")
       )
      initial-frame-alist))
(setq default-frame-alist initial-frame-alist)

今度は成功。ついでにフォントもここで設定した。

| | コメント (0) | トラックバック (0)

2008/10/25

1行ずつスクロールする

Emacsはスクロールするとき(たぶん)半画面ずつスクロールするので微妙な調節ができない。

スクロールを1行ずつにするには以下を.emacsに追記する。

(setq scroll-step 1)

これだけ。

| | コメント (0) | トラックバック (0)

2008/10/24

Fedora on ThinkPad R61で指紋認証できるようにしたい

ThinkPadにインストールしたFedoraで指紋認証できるようにするには「thinkfinger」をインストールすればいいらしい。

Fedoraのリポジトリにも「thinkfinger」はちゃんとあるのでこれをyumでインストールしてみたのだが、肝心の指紋認証デバイスが認識されていないので指紋認証できない。

・・・どうすりゃいいんだ?

[追記]

型の新しいR61は他のThinkPadの指紋認証デバイスとは別のドライバが必要らしい。

| | コメント (0) | トラックバック (0)

2008/10/23

wb-line-numberの行番号とスクロールバーの色を変える

「wb-line-number」を使って左側に行番号が表示できるようになったけど、行番号とスクロールバーの色がピンク

これを別の色に変えるには.emacsに以下を追記する。

;; 左側に行番号を表示
(require 'wb-line-number)
(wb-line-number-toggle)
(custom-set-faces
'(wb-line-number-face ((t (:foreground "LightGrey"))))
'(wb-line-number-scroll-bar-face
   ((t (:foreground "white" :background "LightBlue2")))))

"色の名前"が指定されているけど、これを調べるには

M-x list-colors-display

とすればEmacsで使える色の一覧が表示される。

Colordisplay

| | コメント (0) | トラックバック (0)

2008/10/22

Emacsの左側に行番号を表示する

Emacsの左側に行番号を表示するには「wb-line-number.el」を使います。

Link:wb-line-number.el - 開発者のサイト

リンク先のサイトからwb-line-number.elをダウンロードして/usr/share/emacs/site-lisp/ (Fedoraの場合)などのパスの通ったところに置き、.emacsに以下を追加します。

(require 'wb-line-number)

Emacs起動時に行番号を表示するには

(wb-line-number-toggle)

も書いておきます。また、起動後に行番号を表示したい場合は

M-x wb-line-number-toggle

とすると表示されます。

| | コメント (0) | トラックバック (0)

2008/10/21

燃料電池

PanasonicがノートPC用の燃料電池を作ったらしい。

Link:PC Watchの記事

普及に時間がかかるだろうからしばらくお目にかかることはないだろうけど。

Link:燃料電池 - Wikipedia

| | コメント (0) | トラックバック (1)

2008/10/20

GNOMEのメニューバー

GNOMEのメニューバーからアプリを起動できるけど、アプリのアイコンが消えていることがたまにある。CPUなどの温度を表示するGNOMEアプレットもアイコンが表示されないことがある。

これってなぜだろう?

メニューの編集からアプリごとにアイコンを設定できるけど、アイコンがどこにあるかなんて知らないし。

[追記]

アイコンが表示されなくなるのはSELinuxが有効になっているからだった。

| | コメント (0) | トラックバック (0)

2008/10/19

gnome-terminalとgconf-editor

GNOME Terminalをキーボード・ショートカットで設定したキーで起動したときのサイズと位置がデフォルトのままで、どうしたらいいものか悩んでいたけど、gconf-editorで設定すればいいようだ。

gconf-editor(設定エディタ)を起動して

/
- desktop
   - gnome
      - applications
         - terminal

このterminalのところでgnome-terminalにオプションを与えておけば反映される。

| | コメント (0) | トラックバック (0)

2008/10/18

IEお気に入り保存・復元

IEのお気に入りを並び順ごとバックアップしてくれるソフトが欲しいなぁと思ってたら、あった。

窓の杜で紹介されてる。

Link:並び順も復元できる「IEお気に入り保存・復元」v1.00 - 窓の杜

| | コメント (0) | トラックバック (0)

2008/10/17

IME2007修正

マイクロソフトがやっとMS Office IME 2007の修正プログラムを公開してくれました。

Link:IME 2007 変換精度、学習機能を改善した修正プログラムのご案内

上記リンクから修正プログラムをインストールしてみたところ、変換時の動作も軽くなり(もたつきは感じられない)、おバカも改善はされているように思えます。

Ime2007

| | コメント (0) | トラックバック (0)

2008/10/16

Compizよくわからない

Compizを使ってウィンドウ半透明機能をONにするとウィンドウタイトルの部分が表示されなくなったり、ちょっと変な設定をすると固まってしまう。

そもそも使い方や設定方法もよくわからない。

| | コメント (0) | トラックバック (0)

2008/10/15

次期Windows

次期Windowsの名前は開発コードのまま「Windows 7」に決定したそうな。

・・・もうちょっと考えてほしかったなぁ。

日本向けのコマーシャルにはウルトラセブンを使うんだろうなぁ。

ゲイツ「Windows 7!」

(ゲイツ、セブンのほうを向く)

(セブン、ゲイツと目を合わせ、頷いたあとカメラのほうを向き)

セブン「ジュワッ!!」

とかなるんだろうか。セブンの体色がWindows色になってたりして。

| | コメント (0) | トラックバック (0)

2008/10/14

Fedora 8にpacoをインストール

Fedora 8にpacoをインストールしてみた。

[pacoを手に入れる]

pacoのサイトからダウンロードするかもしくは

$ wget http://downloads.sourceforge.net/paco/paco-2.0.6.tar.gz

でダウンロードする。

[pacoをインストール]

まずは解凍する。

$ tar zxvf paco-2.0.6.tar.gz

作成されたディレクトリ内に移動して

$ ./configure

configureの途中で、

No package 'gtkmm-2.4' found

というエラーメッセージが出たので、とりあえずyumでgtkmmに関するパッケージを調べてみると以下のパッケージがあった。

# yum list | grep gtkmm
bitgtkmm.i386      
bitgtkmm-debuginfo.i386      
bitgtkmm-devel.i386      
gtkmm24.i386      
gtkmm24-devel.i386      
gtkmm24-debuginfo.i386
gtkmm24-docs.i386

まとめてインストールした。

# yum -y install bitgtkmm*

これで下2つ以外はすべてインストールされる。インストール後にもう一度 configureをしてみるとエラーメッセージが表示されなくなった。

configureが成功したら後はお決まりの

$ make

# make install

これでpacoはインストールされるけど、このままではpaco自身の管理ができないので、

# make logme

を実効してpaco自身も管理できるようにする。

[確認]

pacoがちゃんと管理できているか確認。

$ paco -a
paco-2.0.6

さっき追加したpaco自身が表示されている。

| | コメント (0) | トラックバック (0)

2008/10/13

paco

”make install”したソフトウェアを管理する「paco」というソフトがあるらしい。

pacoで管理したソフトはアンインストールも一発だとか。

Fedora用のバイナリはないようなので、tarボールを持ってくることになる。

| | コメント (0) | トラックバック (0)

2008/10/12

WindowsにコンソールモードのGnuplotをインストールする

数値計算のデータをプロットするとき大変お世話になるGnuplotをWindowsにインストールする。

GnuplotにはWindows用のwgnuplotが用意されているが、このwgnuplotはLinuxで使うgnuplotとは使い方が異なる。そこで今回は、次のような方針でGnuplotをインストールする。

  • wgnuplotのように起動後に別のウィンドウを起動することなくコマンドプロンプト上で操作する。
  • Linux上で作ったGnuplotを呼び出すコードをWindowsでも書き換えることなしに使えるようにする。(terminal x11は除く)

まずはSourceForgeからgp424win32.zipをダウンロードして解凍する。解凍したら、後で使うのでとりあえず放置。このwgnuplotはbinフォルダ内のwgnuplot.exeを起動するだけで使えるけど、コンソールモードがないし、プログラムから呼び出すパイプ処理もLinuxのそれとは違う。

ではコンソールモードはどうするのかと言うと、「gnuplotメモ」にこんな文言がある。

Octave3.0.2+Forge20080831 Mingw版 にコンソールモードのgnuplot 4.3 (CVS)が添付されています

というわけでSourceForgeからOctave3.0.2のインストーラをダウンロードしてくる。次にインストーラを起動してCドライブ直下にでもインストールする。

インストールしたら「gnuplotメモ」にもあるとおりOctaveのbinフォルダ内にある次のファイルをコピーする。

pgnuplot.exe
wgnuplot.mnu
wgnuplot.hlp
gd.dll
fontconfig.dll
expat.dll
freetype-6.dll
zlib1.dll
libgcc_tdm_dw2_1.dll
jpeg.dll
png12.dll

コピー先はCドライブ直下に「gnuplot」というフォルダを作り、その中に「bin」フォルダを作ってその中。つまり、「C:\gnuplot\bin」内にコピーする。

これで環境変数PATHに「C:\gnuplot\bin」を追加すればコンソールモードのgunplotが使えるようになる。ただしコマンドはgnuplotではなくてpgnuplot。

コマンドはエイリアスでgnuplotにできるけど、プログラムから呼び出すときはエイリアスを使うことはできない。そこでpgnuplot.exeの名前ををgnuplot.exeに変更してしまう。

また、このままではpostscriptファイルの出力ができないので以下のような手順でファイルをコピーする。

  1. wgnuplotのbinフォルダ内にあるshareフォルダをC:\gnuplot\bin内にコピー
  2. wgnuplotのcontribフォルダをC:\gnuplot内にコピー
  3. C:\gnuplot内にshareフォルダを作り、その中にOctaveのshareフォルダ(C:\Octave\3.0.2_gcc-4.3.0\share)内にあるgnuplotフォルダをコピーする

これでかなりそれっぽく動くようになる。試しに次のようなプログラムを動かしてみる。

/*==================================================*/
// 単振動シミュレーション
// using Euler Method
// 2008/12/20
// Hiroshi Nishimura
/*==================================================*/

#include <stdio.h>
#include <math.h>

#define TIME 50     // 終了時刻
#define DT   0.01   // 時間刻み

// Gnuplotによるアニメーション
void plotter(FILE* gp, double t, double x);

/*==================================================*/
//  微分方程式 (d/dt)^2{x} = -x
//  ↓
//  d/dt{x} = +v
//  d/dt{v} = -x
/*==================================================*/
double dxdt(double v) { return +v; }
double dvdt(double x) { return -x; }

int main(void)
{
  int    it;
  double x    = 0.0;                  // 初期位置
  double v    = 1.0;                  // 初期速度
  double t    = 0.0;                  // 現在時刻
  int    tmax = (int)ceil(TIME/DT);   // ループ回数
  FILE*  gp   = popen("gnuplot", "w");

  for(it = 1; it <= tmax; it++) {
    double x_old = x;
    double v_old = v;

    t = it*DT;
    x = x + DT*dxdt(v_old);
    v = v + DT*dvdt(x_old);

    plotter(gp, t, x);
  }

  fprintf(stderr, "End. Hit Return Key\n");
  getchar();
  pclose(gp);
  
  return 0;
}

void plotter(FILE* gp, double t, double x)
{
  fprintf(gp, "set title 'Euler T = %4g'\n", t);
  fprintf(gp, "set xrange[-5:5]\n");
  fprintf(gp, "set yrange[-1:1]\n");
  fprintf(gp, "plot '-' with points title 'Point'\n");
  fprintf(gp, "%g, %g\n", x, 0.0);
  fprintf(gp, "end\n");
  fflush(gp);
}

簡単な単振動のアニメーションを出力するプログラムなのだが、アニメーションもちゃんと動く。(-persistは使えないようだ)

今のところは特に不具合もないようだけど、あくまで自己責任で。

[追記]

postscriptファイルの表示するにはghostscriptとgsviewが必要なのでインストールしておく。(gsviewのパスを通しておくとどこからでも開けるので便利)

Link:Ghostscript 8.63 + GSview 4.9 の日本語版

gsviewを起動すると毎度「Registration」が出てきて鬱陶しいので、ビューワにXnViewを使う手もある。

| | コメント (0) | トラックバック (1)

2008/10/11

CPUやHDDの温度をモニターする

ThinkPad X60をスリープ状態にして持ち運んで、目的地でバッグから取り出そうとしたらバッグの中に熱気が充満していた。

スリープしているはずのX60が何故かスリープから復帰して熱風をガンガン吐き出していた。スリープが勝手に解除されるだけならまだしも、熱風を吐き出すほどのビジー状態に勝手になるのは恐ろしい!

実際このときのX60は茹でたように熱くて、臨終を覚悟した。

ハードウェアの故障とかを疑ったけど、結局何も壊れてなくて一安心。(でも原因は分からず終いだから手放しで喜べない)

というわけでCPUとかの温度をモニターするソフトが欲しかったので探してみた。

[HWMonitor Pro]

Pcthm

CPU温度がMAX80℃って大丈夫か?

| | コメント (0) | トラックバック (0)

2008/10/10

NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その5

前回までの作業でC言語開発環境は整いましたが、実は問題があります。

その問題は次のようなコードを実行してみるとわかります。

#include <stdio.h>

int main(void)
{
  int num;
  
  printf("Please Input Num:");
  scanf("%d", &num);
  printf("Num:%d\n", num);
  
  return 0;
}

これをMSYSから実行しても次のようになってしまいます。

$ ./a.exe
100
Please Input Num:Num:100

scanf()の直前のprintf()で表示するはずの文字列が表示されません。これはMSYSで使っているrxvtの実装に問題があるためです。

この問題の対処法はrxvtを使用せず、Windows標準のコマンドプロンプトを使用するのが簡単です。具体的に「はC:\msys\1.0」内にある「msys.bat」の41行目の

if EXIST rxvt.exe goto startrxvt

をコメントアウトして

rem if EXIST rxvt.exe goto startrxvt

とすればMSYS起動時にrxvtが呼び出されなくなります。

| | コメント (0) | トラックバック (0)

2008/10/09

NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その4

1.動作確認

まずはデスクトップ上に作成されたMSYSのショートカットをダブルクリックしてMSYSを起動して次のようにコマンドを入力してください。

user@host ~
$ pwd
/c/Home

user@host ~
$ gcc
gcc.exe: no input files

user@host ~
$ make
make: *** No targets specified and no makefile found.  Stop.

user@host ~
$ gdb
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-mingw32".
(gdb) quit

user@host ~
$ 

gcc、make、gdbはこのようなメッセージが表示されればOKです。また、pwdコマンドの実行結果のとおりホームディレクトリは「C:\Home」になっています。MSYSのデフォルトのホームディレクトリはC:\msys\1.0\homeなのですが、環境変数HOMEが設定されているとHOMEで指定されているパスをホームディレクトリを認識します。

2.設定(お好みで)

MSYSを起動してみてわかると思いますが、MSYSのシェルは白地にグリーンとブルーのプロンプトで目がチカチカします。そこで色を変更してみます。

シェルの色を変更するには「C\msys\1.0」内にある「msys.bat」を編集します。

55行目にある
if "x%MINGW32BGCOLOR%" == "x" set MINGW32BGCOLOR=LightYellow
if "x%MINGW32FGCOLOR%" == "x" set MINGW32FGCOLOR=Navy
を次のようにコメントアウトしてこのような2行を追加
rem if "x%MINGW32BGCOLOR%" == "x" set MINGW32BGCOLOR=LightYellow
rem if "x%MINGW32FGCOLOR%" == "x" set MINGW32FGCOLOR=Navy
if "x%MINGW32BGCOLOR%" == "x" set MINGW32BGCOLOR=Black
if "x%MINGW32FGCOLOR%" == "x" set MINGW32FGCOLOR=White

また、Emacsの背景も黒にしたい場合はemacsコマンドに-rvオプションをつけて起動すればEmacsが黒基調になりますが、いつもオプションをつけるのは面倒なので'emacs -rv'を'emacs'と認識するようにエイリアスを登録しておきます。

エイリアスを登録するには「C:\msys\1.0\etc」内にある「profile」に

alias emacs='emacs -rv'

と追記しておく。(MSYSを再起動すると変更が反映される)

| | コメント (0) | トラックバック (0)

2008/10/08

NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その3

今度はMinGWとMSYSをインストール。

1.MinGWのインストール

まずはSourceForgeからMinGW-5.1.4.exeをダウンロードします。ダウンロードしたらインストーラを起動します。(このとき新しくフォルダを作って、その中でインストーラを起動したほうがいい)

インストール途中にインストールするコンパイラの選択画面が表示されるので欲しいインストーラを選択します。その後インストール先の指定画面が表示されますが、もしパスに空白が含まれているとトラブルの元なのでインストール先は「C:\MinGW」とします。

2.MSYSのインストール

SourceForgeからMSYS-1.0.10.exeをダウンロードしてきて、インストーラを起動します。(MinGWのインストーラと同じフォルダ内で起動する)

インストール先を聞かれたら「C:\msys\1.0」とします。

インストールが開始されてプログレスバーが100%になるとコマンドプロンプトが立ち上がり、いくつかの質問に答えることになります。

Q.1 Do you wish to continue with the post install? [yn ] ・・・ y

Q.2 Do you have MinGW installed? [yn ] ・・・ y

Q.3 Please answer the following in the from of c:/foo/bar.
       Where is your MinGW installation?
MinGWをインストールしたパスを入力します。このとき「\」ではなく「/」を使います。

このあと、もし「Makeがありません」といった内容のメッセージが表示されても問題ないので先に進んでください。

3.GDBのインストール

一応、デバッガをインストールしておきます。

SourceForgeからgdb-6.3-2.exeをダウンロードしてきてインストーラを起動します。インストール先はMinGWをインストールしたパスと同じに。「C:\MinGW」

4.環境変数の設定

PATHに、「C:\MinGW\bin;C:\msys\1.0\bin」を追加

また以下を新規作成

C_INCLUDE_PATH=C:\MinGW\include

CPLUS_INCLUDE_PATH=C:\MinGW\include

LIBRARY_PATH=C:\MinGW\lib

| | コメント (0) | トラックバック (0)

2008/10/07

NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その2

まずはNTEmacsのインストール。

1.NTEmacsのバイナリをダウンロードする。

NTEmacsはIMEを利用した日本語入力に難があるようなので、「NTEmacs JP Project」からIME patchが当てられたNTEmacsのバイナリをダウンロードします。(現在の最新版は22.2)

Link:NTEmacs JP Project - SourceForge.JP

2.インストール

ダウンロードしたバイナリを起動すると解凍する場所を聞いてくるので、「C:\」を指定します。(ハードディスクのルートならC:\でなくてもよい)

解凍が終わるとC:\emacsが作成されます。NTEmacsの実行ファイルは C:\emacs\22.2\bin内のrunemacs.exeです。

3.起動する前に

NTEmacsを起動する前にいくつか設定を済ませておきます。

まずはC:\に「Home」というフォルダを作成しておく。(今後、このフォルダがホームディレクトリになる)

次は環境変数PATHに、NTEmacsの実行ファイルが置かれているパス「C:\emacs\22.2\bin」を追加する(パスとパスはセミコロン「;」で区切る)。これでNTEmacsをどこからでも呼び出すことができるようになる。

さらに環境変数HOMEを作って、値には「C:\Home」を設定する。

4.NTEmacsを起動

とりあえずrunemacs.exeのショートカットをデスクトップに作成してNTEmacsを起動してみます。

Ntemacs_2 

設定ファイル「.emacs」はC:\Home内に作成します。.emacsを新規作成して

(setq inhibit-startup-message t)

と書いて保存し、NTEmacsを再起動すると先ほどの起動画面が表示されなくなることが確認できるはずです。

| | コメント (0) | トラックバック (0)

2008/10/06

NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その1

Windows上にC言語開発環境を構築する方法はいろいろあるが、比較的よく見かけるのは以下のようなものだろう。

  • Borland C++ CompilerもしくはVisual C++ Express Editionをインストールしてメモ帳等のエディタでコーディング
  • CygwinをインストールしてWindows上にUNIXライクな環境を構築する
  • Eclipse CDT + MinGW
  • coLinuxもしくはandLinuxを使う
  • VMware等の仮想PCソフトを使ってLinuxをエミュレート(Windows上ではないけど)

私はcoLinux/andLinux以外は全て試してみて現在はVMwareに落ち着いている。

しかし、この方法はLinuxディストリビューションをまるごと使いたいという目的のほうが強いので、単純にC言語開発環境を構築するという観点で見ると無駄が大きい。(しかもある程度のパフォーマンスを得るにはCPUやメモリ容量などの面で制約があるので一昔前のPCだと厳しい)

これはLinuxカーネルをWindows上で動作させるcoLinux/andLinuxにも言えることだと思う。

そこで今回は次のような方針で開発環境を構築する。

  • できるだけシンプルに
  • C言語入門レベルに統合開発環境はいらない
  • あまりマウスはつかいたくない
  • なるべくUNIXライク
  • Emacs使いたい

「Cygwinで全て解決」な感じもするが、CygwinもC言語開発環境としては十分大げさであることと、いつもCygwinではつまらないので、NTEmacs + MinGW + MSYSで構築してみる。(VistaでCygwin/Xが不安定であることも理由の一つ)

| | コメント (0) | トラックバック (0)

2008/10/05

2次元キャビティ流れ

2次元の正方形キャビティ内の流れを「流れ関数-渦度法」で変形した支配方程式を差分を使って解く数値計算プログラムを作っている。まだ未完成でいろいろ修正点もあるけど一応それらしい解が得られている。

Psi2_2 

この図は流れ関数の等高線をプロットしたもの。

大雑把に言えば、このプログラムは移流拡散方程式(Navieor-Stoks方程式のrotをとったもの)とポアソン方程式(渦度と流れ関数の関係式)を解いているだけだけど、(キャビティ流れの)理論的な部分を完全に理解していないので他人に説明できるようなレベルじゃない。(この状態だと、"このようにすると何故か動いてくれる"といった説明しかできない)

あと未完成だけどソースコード:「cavity.c」

/*
  [2008]
   2次元 Cavity Flow Simulation
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Cavity Parameters */
#define L  1.0    // 1辺の長さ
#define N  100    // メッシュの数
#define DX (L/N)  // メッシュ間隔(x)
#define DY (L/N)  // メッシュ間隔(y)

/* Fluid Parameters */
#define U  1.0       // 流速
#define RE 100       // レイノルズ数
#define NU (U*L/RE)  // 動粘性率

/* CFL Condition */
#define CFL     0.3                                    // 安全係数alpha
#define DT_ADV  (1.0/(U/DX))                           // 移流時間
#define DT_DIFF (1.0/(2*NU*(1.0/DX/DX + 1.0/DY/DY)))   // 拡散時間
#define DT      (CFL*(1.0/(1.0/DT_ADV + 1.0/DT_DIFF))) // 時間刻み

/* Calc Step */
#define TMAX 10000   // 計算回数

/* Poisson : Gauss-Sidel Parameters */
#define LOOP_MAX (N*N/4)   // ガウスザイデルの計算回数上限
#define EPS      (1.0e-4)  // 精度


/* Define New Data Type */
typedef double Array[N+1][N+1];


/* Initialize Array Type */
void initArray(Array var)
{
  int i, j;
  for(i = 0; i <= N; i++){
    for(j = 0; j <= N; j++)
      var[i][j] = 0.0;
  }
}


/* Omega's Boundary Conditions */
void setBoundary_omega(Array omega, Array psi)
{
  int ix, iy;
  for(ix = 0; ix <= N; ix++){
    omega[ix][0] = -2.0*(psi[ix][0+1]     )/DY/DY;   // bottom
    omega[ix][N] = -2.0*(psi[ix][N-1]+U*DY)/DY/DY;   // top
  }
  for(iy = 0; iy <= N; iy++){
    omega[0][iy] = -2.0*psi[0+1][iy]/DX/DX;          // left
    omega[N][iy] = -2.0*psi[N-1][iy]/DX/DX;          // right
  }
}

/* Psi's Boundary Conditions */
void setBoundary_psi(Array psi)
{
  int ix, iy;
  for(ix = 0; ix <= N; ix++){
    psi[ix][0] = 0.0;   // bottom
    psi[ix][N] = 0.0;   // top
  }
  for(iy = 0; iy <= N; iy++){
    psi[0][iy] = 0.0;   // left
    psi[N][iy] = 0.0;   // right
  }
}
 

/* Operator */
double advection(Array omega, Array psi, int x, int y)
{
  return ( (psi[x+1][y]-psi[x-1][y])*(omega[x][y+1]-omega[x][y-1])
	   -(psi[x][y+1]-psi[x][y-1])*(omega[x+1][y]-omega[x-1][y])
	   )/4.0/DX/DY;
}

double laplacian(Array omega, int x, int y)
{
  return ( (omega[x+1][y]-2.0*omega[x][y]+omega[x-1][y])/DX/DX
	   +(omega[x][y+1]-2.0*omega[x][y]+omega[x][y-1])/DY/DY );
}

/* Solve Omega */
void solveOmega(Array omega, Array psi)
{
  int ix, iy;
  static Array omega_new;

  for(ix = 1; ix < N; ix++){
    for(iy = 1; iy < N; iy++){
      omega_new[ix][iy] = omega[ix][iy]
	+DT*(advection(omega, psi, ix, iy) + NU*laplacian(omega, ix, iy));
    }
  }

  for(ix = 1; ix < N; ix++){
    for(iy = 1; iy < N; iy++){
      omega[ix][iy] = omega_new[ix][iy];
    }
  }
  
}


/* Solve Psi using Gauss-Sidel Method */
void solvePsi(Array psi, Array omega)
{
  int    ix, iy, iter;
  double psiMax = 1.0e-7;
  
  for(iter = 1; iter <= LOOP_MAX; iter++){
    double errMax = 0.0;
    for(ix = 1; ix < N; ix++){
      for(iy = 1; iy < N; iy++){
	double err     = 0.0;
	double psi_old = psi[ix][iy];
	double psi_new = (DX*DX*DY*DY*omega[ix][iy]
			  +DY*DY*psi[ix+1][iy  ]
			  +DY*DY*psi[ix-1][iy  ]
			  +DX*DX*psi[ix  ][iy+1]
			  +DX*DX*psi[ix  ][iy-1])/(2.0*(DX*DX+DY*DY));
	psi[ix][iy] = psi_new;
	if(psiMax < fabs(psi_new))
	  psiMax = psi_new;
	err = (fabs(psi_new - psi_old))/psiMax;
	if(errMax < err)
	  errMax = err;
      }
    }
    if(errMax < EPS) break;
  }
}


/* Output Data */
void output(FILE *fp, Array psi)
{
  int ix, iy;
  for(ix = 0; ix <= N; ix++){
    for(iy = 0; iy <= N; iy++){
      fprintf(fp, "%g %g %g\n", ix*DX, iy*DY, psi[ix][iy]);
    }
    fprintf(fp, "\n");
  }
}

/* Plot Data */
void plot_psi(FILE *gp, Array psi)
{
  int ix, iy;
  fprintf(gp, "set contour\n");
  fprintf(gp, "unset surface\n");
  fprintf(gp, "splot '-' w l\n");
  for(ix = 0; ix <= N; ix++){
    for(iy = 0; iy <= N; iy++){
      fprintf(gp, "%g %g %g\n", ix*DX, iy*DY, psi[ix][iy]);
    }
    fprintf(gp, "\n");
  }
  fprintf(gp, "end\n");
  fflush(gp);
}

/* MAIN */
int main(void)
{
  static Array psi;     // Stream Function
  static Array omega;   // Vorticity
  int  it;
  FILE *fp = fopen("output.dat", "w");
  FILE *gp = popen("gnuplot -persist", "w");

  /* ===Initialize=== */
  initArray(psi);
  initArray(omega);

  /* ===Set Boundary Condition=== */
  setBoundary_psi(psi);
  setBoundary_omega(omega, psi);

  /* ===Solve Omega & Psi=== */
  for(it = 1; it <= TMAX; it++){
    solveOmega(omega, psi);
    solvePsi(psi, omega);
    setBoundary_psi(psi);
    setBoundary_omega(omega, psi);
    printf("Iterator:%d\r", it);
  }
  printf("\n");

  /* ===Output Data=== */
  output(fp, psi);
  fclose(fp);

  /* ===Plot Data=== */
  plot_psi(gp, psi);
  pclose(gp);
  
  return 0;
}

| | コメント (0) | トラックバック (0)

2008/10/04

ThinkVantage 指紋認証ユーティリティー

System Updateの通知があったのでアップデートしたら指紋認証ユーティリティーがアップデートされた。(更新の検索を1週間おきにしておいたほうが更新が滞らなくていい)

Tvu1_4 

Tvu2_3

次は何がアップデートされるのだろうか?

| | コメント (0) | トラックバック (0)

2008/10/03

Project Euler Problem2

第2問

Link:Problem2 - PukiWiki

/*
  Probrem2

  フィボナッチ数列の項は前の2つの項の和である。
  最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。
   1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
  数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。
*/

#include <stdio.h>

#define X1  1
#define X2  2
#define MAX 4000000

int judge_even(int num, int sum)
{
  if(num%2 == 0)
    sum += num;
  return sum;
}

int solve_probrem2(int x_prev1, int x_prev2)
{
  int sum = 0;
  sum = judge_even(x_prev2, sum);
  sum = judge_even(x_prev1, sum);

  while(1){
    int x   = x_prev1 + x_prev2;
    sum     = judge_even(x, sum);
    x_prev2 = x_prev1;
    x_prev1 = x;
    if(x > MAX) break;
  }

  return sum;
}

int main(void)
{
  int x_prev2 = X1;
  int x_prev1 = X2;
  int ans     = solve_probrem2(x_prev1, x_prev2);

  printf("===Problem2===\n");
  printf("Answer : %d\n", ans);
  
  return 0;
}

[実行結果]

$ ./problem2
===Problem2===
Answer : 4613732

| | コメント (0) | トラックバック (0)

2008/10/02

MultiMonitor TaskBar

窓の杜みてたら「MultiMonitor TaskBar」というソフトが紹介されていた。

このソフトはマルチモニター環境でメインモニター以外のモニターにもタスクバーを表示できるらしい。

Vistaでもちゃんと使える。

Link:Oscar's Multi-Monitor taskBar

| | コメント (0) | トラックバック (0)

2008/10/01

Project Euler Problem1

第1問

Link:Problem1 - PukiWiki

言語はCで。(将来的には色んな言語で書いてみるつもり)

/*
  Problem1

  10未満の自然数のうち、3もしくは5の倍数になっているものは
  3、5、6、9の4つがあり、これらの合計は23になる。
  同じようにして、1000未満の3か5の倍数になっている数字の合計を求めよ。
*/

#include <stdio.h>

int solve_problem1()
{
  int num;
  int sum = 0;
  
  for(num = 1; num < 1000; num++){
    if(num % 3 ==0 || num % 5 == 0)
      sum += num;
  }
  
  return sum;
}

int main(void)
{
  printf("===Problem1===\n");
  printf("Answer : %d\n", solve_problem1());
  
  return 0;
}

[実行結果]

$ ./problem1
===Problem1===
Answer : 233168

| | コメント (0) | トラックバック (0)

Project Eulerに挑戦

プログラムと数学の練習をかねてProject Eulerに挑戦してみる。

Link:Project Euler.net

また、下のサイトには問題文の日本語訳がwikiにまとめられているので便利。

Link:Project Euler - PukiWiki

| | コメント (0) | トラックバック (0)

« 2008年9月 | トップページ | 2008年11月 »