第6.5.1節と同様スクリプト設定画面上では``commands.bsh''を利用する設定となっています.
実際の計算を行うのは, ``uniform_exp.bsh''です.
このスクリプトのソースは,
.chase/scripts/jobcontrol/phase/uniform_exp.bshです.
まず入力から説明します. 入力部は, 下記のようになっています.
control{
from = 0.95
to = 1.05
incre = 0.01
}
``from''で最初の体積を, ``to''で最後の体積を指定します. また, ``incre''で体積をどれくらい増やすかを指定します.
スクリプトの残りの部分を見てみましょう.
1: nfinp = getFileName("F_INP","__TARGETDIR____FS__");
2: nfinpfp = "__TARGETDIR____FS__"+nfinp;
3: nfinporg = "__TARGETDIR____FS__"+nfinp+"_orig";
4: nfene = "__TARGETDIR____FS__"+getFileName("F_ENF","__TARGETDIR____FS__");
5: to = 0.95;
6: from = 1.05;
7: incre = 0.01;
8: logger = getLogger("uniform_exp");
9: init() {
10: cp(nfinpfp,nfinporg);
11:
12: inputInterface = getInputInterfaceFromBSH("__TARGETDIR____FS____uniform_exp.bsh");
13: inputInterface.selectBlock("control");
14: nfinp = inputInterface.getPrimitiveEntry("inpfile").getValue();
15: to = Double.parseDouble(inputInterface.getPrimitiveEntry("to").getValue());
16: from = Double.parseDouble(inputInterface.getPrimitiveEntry("from").getValue());
17: incre = Double.parseDouble(inputInterface.getPrimitiveEntry("incre").getValue());
18:
19: /*
20: 'condition' must be 'initial'
21: */
22: input = getInputInterface(nfinporg);
23: input.selectBlock("control");
24: input.replaceEntry(new InputInterfacePrimitiveEntry("condition","initial",""));
25: input.selectRoot();
26: input.saveTo(new File(nfinporg));
27: }
28:
29: boolean boolvec = true;
30: loop() {
31: total = to - from;
32: nsteps = (int) (total/incre);
33: logger.info("nsteps: "+nsteps);
34: if ( nsteps == 0 ) {
35: return;
36: }
37:
38: try{
39: PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(nfene+"_all")));
40: writer.println("#V/V0 L/L0 energy");
41: for ( int i=0 ; i<nsteps ; i++ ) {
42: inputInterface = getInputInterface(nfinporg);
43: cellvec = getCellVec(inputInterface);
44: if ( cellvec == null ) {
45: logger.error("invalid cellvec!");
46: return;
47: }
48: boolvec = true;
49: if ( cellvec.length == 2 ) {
50: boolvec = false;
51: }
52:
53: scale = Math.pow(from + i*incre,1.0/3.0);
54: if ( boolvec ) {
55: for ( int i=0 ; i<3 ; i++ ) {
56: for ( int j=0 ; j<3 ; j++ ) {
57: cellvec[i][j] = scale * cellvec[i][j];
58: }
59: logger.info("cellvec: "+cellvec[i][0]+" "+cellvec[i][1]+" "+cellvec[i][2]);
60: }
61: } else {
62: for ( int i=0 ; i<3 ; i++ ) {
63: cellvec[0][i] = cellvec[0][i] * scale;
64: }
65: logger.info("lattice const.: "+cellvec[0][i]+" "+cellvec[0][i]+" "+cellvec[0][i]);
66: }
67: setCellVec(cellvec,inputInterface);
68: inputInterface.saveTo(new File(nfinpfp));
69: execute("__PHASE__");
70:
71: BufferedReader reader = new BufferedReader(new FileReader(nfene));
72: String foo = "";
73: String bar = "";
74: while( (foo = reader.readLine()) != null ) {
75: bar = foo;
76: }
77: String [] line = bar.split("\s+");
78: String energy = "";
79: if ( line != null && line.length >= 4 ) {
80: energy = line[3];
81: }
82: reader.close();
83: cp(nfene,nfene+"-"+String.valueOf(from+i*incre));
84:
85: logger.info("energy for step "+i+": "+energy);
86: logger.info(System.getProperty("line.separator"));
87: writer.println(String.valueOf(from+i*incre)+" "
+String.valueOf(scale)+" "+energy);
88: }
89: writer.close();
90: } catch(e){
91: logger.error("error",e);
92: }
93:
94: cp(nfinporg,nfinpfp);
95: rm(nfinporg);
96:
97: }
98:
99: init();
100: loop();
少し長いスクリプトなので, ポイントのみ解説します.
注意点として, ¥の扱いがあります. 通常Javaでは¥は特別な記号なので¥を記述する場合エスケープして¥¥と書く必要があります. ところが, PHASE-Viewerはスクリプトを投げる前に¥を¥¥で置き換えるのでこのような書き方ではなく, 単に¥としてください. たとえば, 77行目でそのような書き方がされています.