double Geo_Constraint_Bond(unsigned n, const double *x, double *grad, void *data) { int ia, ib, iPos; double r, r0, g[2][3]; CMol* pMol; GEO_FIX_BOND *Geo_Fix_r; Geo_Fix_r = (GEO_FIX_BOND*)data; pMol = (CMol*)(Geo_Fix_r->pMol); ia = Geo_Fix_r->ia; ib = Geo_Fix_r->ib; r0 = Geo_Fix_r->r0; if(grad) { r = pMol->Query_Distance(ia, ib, 1, g); memset(grad, 0, sizeof(double)*n); iPos = 3 * ia; grad[iPos ] = g[0][0]; grad[iPos+1] = g[0][1]; grad[iPos+2] = g[0][2]; iPos = 3 * ib; grad[iPos ] = g[1][0]; grad[iPos+1] = g[1][1]; grad[iPos+2] = g[1][2]; } else { r = pMol->Query_Distance(ia, ib, 0, g); } return (r - r0); }