4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
27 * Great Red Oystrich Makes All Chemists Sane
29 static char *SRCID_mcprop_c
= "$Id$";
39 void normalise_vec(int nx
,real x
[])
44 /* Normalise vector */
53 static real
do_step(int nx
,real x
[],int i
,int *ig
,real step
,bool bPlus
)
57 /* Modify a coordinate */
69 real
find_min(real x0
,real x1
,real x2
,real y0
,real y1
,real y2
)
74 real a2_1
,wortel
,xx0
,yy0
,XXX
;
76 X
[0][0]=x0
*x0
, X
[0][1]=x0
, X
[0][2]=1;
77 X
[1][0]=x1
*x1
, X
[1][1]=x1
, X
[1][2]=1;
78 X
[2][2]=x2
*x2
, X
[2][1]=x2
, X
[2][2]=1;
79 y
[0]=y0
, y
[1]=y1
, y
[2]=y2
;
85 /* There IS a minimum */
86 xx0
= -abc
[1]/(2.0*abc
[0]);
87 if ((x0
< xx0
) && (xx0
< x1
))
90 /* The minimum is not on our interval */
97 else if (abc
[0] < 0) {
109 void do_mc(FILE *fp
,int nx
,real x
[],real step
,real v0
,real tol
,
110 int maxsteps
,t_propfunc
*func
)
114 int i
,j
,k
,m
,f
,n
,ig
,cur
=0;
116 real vtol
,r
,bmf
,*rx
[2],valmin
,vplusmin
[2],stepsize
;
125 ftrj
=ffopen("ftrj.out","w");
127 for(j
=0; (j
<nx
); j
++)
134 val
[cur
] = func(nx
,x
);
137 for(f
=0; (f
<2); f
++) {
138 fprintf(ffp
[f
],"Starting MC in property space, YES!\n\n");
139 fprintf(ffp
[f
],"Initial value: %10.3e\n",val
[cur
]);
140 fprintf(ffp
[f
],"Going to do %d steps in %dD space\n",maxsteps
,nx
);
144 for(n
=0; (n
<maxsteps
) && !bConv
; ) {
145 for(i
=0; (i
<nx
) && !bConv
; i
++,n
++) {
147 for(m
=0; (m
<2); m
++) {
148 for(j
=0; (j
<nx
); j
++)
149 rx
[next
][j
]=rx
[cur
][j
];
150 stepsize
=do_step(nx
,rx
[next
],i
,&ig
,step
,1-m
);
151 vplusmin
[m
]=func(nx
,rx
[next
]);
153 for(j
=0; (j
<nx
); j
++)
154 rx
[next
][j
]=rx
[cur
][j
];
155 rx
[next
][i
]=find_min(rx
[cur
][i
]+stepsize
,rx
[cur
][i
],rx
[cur
][i
]-stepsize
,
156 vplusmin
[0],val
[cur
],vplusmin
[1]);
157 normalise_vec(nx
,rx
[next
]);
158 val
[next
]=func(nx
,rx
[next
]);
162 dv
=val
[next
]-val
[cur
];
165 if (val
[cur
] < valmin
)
167 for(k
=0; (k
<nx
); k
++) {
169 fprintf(ftrj
,"%6.3f ",x
[k
]);
173 if ((fabs(dv
) < vtol
) && (val
[cur
]<=valmin
))
175 else if ((dv
>= 0) && (v0
> 0)) {
184 fprintf(ffp
[f
],"Step %5d, Min: %10.3e, Cur: %10.3e, BMF %6.3f %s\n",
185 n
,valmin
,val
[cur
],bmf
,bUp
? "+" : "");
189 fprintf(fp
,"Converged !\n");
190 fprintf(stderr
,"Converged !\n");