macports : Mac 用 apt or yum
fink よりもイイらしい
うまくいかないときのチェック項目
始めるとき
IPS = 1
IRS = 0
主自由パラメータを par[J] とする.
stpnt 内で par[J] に値を与えているか.
また,c.xxx 内で,主パラメータを正しく設定できているか.
1 J NICP ICP(I)
さらに,その stpnt で与えた par[J] の値は, [RL0, RL1] 内に入っているか.
実行後,一行表示しておわるだけの時は,おそらくこれが満たされていない.
IPS = 2
IRS に Hopf 分岐点のラベルがセットされているか?
2 J 10 NICP ICP(I)
と,NICP = 2,でパラメータ 10(AUTO は,par[10] に周期を保持している.)を追加してあるか.
NTHL = 1
(default : 0.0 全ての変数を用いて pseudo-arclength stepsize を決める)
周期解計算の時は,長周期(無限近く)になったときに,
周期を表す par[10] は外して評価しないと,不安定な計算になるので,
par[10] の重みは 0.0 にしておく.
そのような,重みを設定し直す変数の数が NTHL
その下に,NTHL 個,par[k] の index k とそれにかける重みを書いていく.
1 NTHL
10 0.0
ijac = 1 を設定した時は,func 内で dfdp も与えてあるか.
AUTO の流れ その2: 自作プログラムを埋めるなら,wrline or, wrtbv8
簡単な方法,2通り.
1) auto_f2c.h で,関数を宣言し,他のユーザー定義関数 func, stpnt, bcnd,... 等と同様,
自作プログラム内で実装.
autlib1.c 内,wrline or wrtbv8 やらの中で呼び出す.
2) $AUTO_DIR/include 内に,hoge.h 等の自作ヘッダーを置き,内部で実装もすませる.
(全て inline 関数じゃないと,文句言われることがある.)
これを,autlib1.c から include する.
なお,このデータは c.ab.1 を実行した時にえられたもの.
0 PT TY LAB PAR(1) L2-NORM U(1) U(2)
1 1 9 1 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
1 -2 0 0 4.04281E-03 1.95871E-02 4.10407E-03 1.91523E-02
1 -3 0 0 6.99872E-03 3.42930E-02 7.18538E-03 3.35318E-02
1 -4 0 0 1.13124E-02 5.63756E-02 1.18123E-02 5.51242E-02
1 -5 0 0 1.75190E-02 8.95500E-02 1.87633E-02 8.75622E-02
wrtbv8 に埋め込めば,画面に次のようなデータが1行出力される度に実行.
なお,このデータは c.ab.2 を編集し,実行したときに得られたもの.
BR PT TY LAB PAR(1) L2-NORM MAX(1) MAX(2) PERIOD
4 18 UZ 6 1.250000E-01 4.185429E+00 9.628463E-01 5.409282E+00 1.864186E+00
4 30 7 1.190639E-01 3.878593E+00 9.958913E-01 7.695505E+00 3.196121E+00
4 54 UZ 8 1.099999E-01 2.811169E+00 9.995226E-01 9.897750E+00 7.481753E+00
4 60 9 1.061332E-01 2.381096E+00 9.996230E-01 9.474918E+00 1.109164E+01
c.ab.2 は,その末尾を,次のように編集してある.
NUZR で指定した値点での出力前後で呼ばれる関数を調べたが,NPR で指定したのと同じだった.
...
2 NUZR,(/,I,PAR(I)),I=1,NUZR)
1 0.11
1 0.125
AUTO> run(c="ab.1")
Starting ab ...
# uniker : call autoae
# uniker : call sthd
# uniker : call wrline
BR PT TY LAB PAR(1) L2-NORM U(1) U(2)
1 1 EP 1 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00
# uniker : call wrline
# uniker : call wrline
# uniker : call wrline
# uniker : call wrline
...
Total Time 8.128E-02
ab ... done
AUTO> save("ab1")
rSaving fort.7 as b.ab1 ... done
Saving fort.8 as s.ab1 ... done
Saving fort.9 as d.ab1 ... done
AUTO> run(c="ab.2",s="ab1")
Starting ab ...
# uniker : call autobv
# uniker : call cnrlbv
# uniker : call rsptbv
# uniker : call STPNT_TYPE_BVP(*stpnt) in rsptbv
# uniker : call stpnps
# uniker : call funi in stpnps
# uniker : call setrtn
# uniker : call sthd
# uniker : call stplbv
# uniker : call wrline
BR PT TY LAB PAR(1) L2-NORM MAX(1) MAX(2) PERIOD
# uniker : call extrbv
# uniker : call stplbv
# uniker : call wrline
# uniker : call extrbv
# uniker : call stupbv
# uniker : call stplbv
# uniker : call wrline
# uniker : call adapt
...
# uniker : call stupbv
# uniker : call extrbv
# uniker : call stupbv
# uniker : call stplbv
# uniker : call wrline
4 18 UZ 6 1.250000E-01 4.185429E+00 9.628463E-01 5.409282E+00 1.864186E+00
# uniker : call wrtbv8
# uniker : call adapt
# uniker : call extrbv
# uniker : call stupbv
# uniker : call stplbv
# uniker : call wrline
stplbv
- > wrline 画面出力,fort.7 fort.9 出力
- > wrtbv8 fort.8 出力
AUTO を 自作プログラム(c++)で使う(やめた.)
中途:とりあえず,AUTO の関数を使った c++ プログラムをコンパイルできるようになるまで.
$(AUTO_DIR)/include/auto_f2c.h を編集.
/* user function pointers */ int func(); int stpnt(); int bcnd(); int icnd(); int fopt(); int pvls();
を,
int func(integer, const doublereal*, const integer*, const doublereal*, integer, doublereal*, doublereal*, doublereal*); int stpnt(integer, doublereal, doublereal*, doublereal*); int bcnd(integer, const doublereal*, const integer*, integer, const doublereal*, const doublereal*, integer, doublereal*, doublereal*); int icnd(integer, const doublereal*, const integer*, integer, const doublereal*, const doublereal*, const doublereal*, const doublereal*, integer, doublereal*, doublereal*); int fopt(integer, const doublereal*, const integer*, const doublereal*, integer, doublereal*, doublereal*, doublereal*); int pvls(integer, const void*, doublereal*);
$(AUTO_DIR)/include/auto_c.h を編集.
先頭に
#ifdef __cplusplus extern "C" { #endif
最後尾に
#ifdef __cplusplus } #endif
をそれぞれ加える.
自作プログラム中に,main 関数を作りたいので,
$(AUTO_DIR)/lib/main.o を読み込まないようにする.$(AUTO_DIR)/lib 以下の他の .o は読み込む.
Makefile.am
bin_PROGRAMS = xevious
myPROG = $(HOME)/prog
INCLUDES = -I$(myPROG) -I$(myPROG)/xevious/src -I$(AUTO_DIR)/include
xevious_SOURCES = Xevious.cpp
ALD = $(AUTO_DIR)/lib
AOBJ = $(ALD)/autlib*.o $(ALD)/conpar.o $(ALD)/dmatrix.o $(ALD)/eispack.o $(ALD)/reduce.o $(ALD)/setubv.o $(ALD)/worker.o
xevious_LDFLAGS = -framework vecLib $(AOBJ) -L$(AUTO_DIR)/lib
LIBS= -lauto_f2c -lm
main 文を含む自作ファイルは,以下を満たすように作成.
#include <auto_f2c.h> #include <auto_c.h> FILE *fp3; FILE *fp7; FILE *fp9; FILE *fp12; int global_conpar_type=CONPAR_DEFAULT; int global_setubv_type=SETUBV_DEFAULT; int global_reduce_type=REDUCE_DEFAULT; int global_num_procs=1; int global_verbose_flag=0;
を付け加える.
関数 func, stpnt, bcnd, icnd, を定義.(ダミーでよい.)
注! 引数に注意!
int pvls(integer ndim, const double *u, doublereal *par){
return 0;
}
では,コンパイルできず.次のように, void* にする.
int pvls(integer ndim, const void *u, doublereal *par) {
return 0;
}
/
#include "auto_f2c.h"
#include "math.h"
#include "auto_c.h"
...