double Geo_Constraint_Angle(unsigned n, const double *x, double *grad, void *data) { int ia, ib, ic, iPos; double theta, theta0, g[3][3]; CMol* pMol; GEO_FIX_ANGLE *Geo_Fix_theta; Geo_Fix_theta = (GEO_FIX_ANGLE*)data; pMol = (CMol*)(Geo_Fix_theta->pMol); ia = Geo_Fix_theta->ia; ib = Geo_Fix_theta->ib; ic = Geo_Fix_theta->ic; theta0 = Geo_Fix_theta->theta0; if(grad) { theta = pMol->Query_Angle(ia, ib, ic, 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]; iPos = 3 * ic; grad[iPos ] = g[2][0]; grad[iPos+1] = g[2][1]; grad[iPos+2] = g[2][2]; } else { theta = pMol->Query_Angle(ia, ib, ic, 0, g); } return (theta - theta0); }