うまくいかないときのチェック項目

始めるとき

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 する.

wrline に埋め込めば,次のようなデータ(in fort.7, b.xxx)を1行出力する毎に実行.
なお,このデータは 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 は,その末尾を,次のように編集してある.


...
2 NUZR,(/,I,PAR(I)),I=1,NUZR)
1 0.11
1 0.125
NUZR で指定した値点での出力前後で呼ばれる関数を調べたが,NPR で指定したのと同じだった.




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;
}