34 |
|
nAtoms = info->n_atoms; |
35 |
|
integrableObjects = info->integrableObjects; |
36 |
|
|
37 |
< |
consFramework = new RattleFramework(info); |
37 |
> |
consFramework = new RollFramework(info); |
38 |
|
|
39 |
|
if(consFramework == NULL){ |
40 |
|
sprintf(painCave.errMsg, |
199 |
|
// remove center of mass drift velocity (in case we passed in a configuration |
200 |
|
// that was drifting |
201 |
|
tStats->removeCOMdrift(); |
202 |
< |
|
202 |
> |
//tStats->removeAngularMomentum(); |
203 |
> |
|
204 |
|
// initialize the retraints if necessary |
205 |
|
if (info->useSolidThermInt && !info->useLiquidThermInt) { |
206 |
|
myFF->initRestraints(); |
347 |
|
startProfile( pro6 ); |
348 |
|
#endif //profile |
349 |
|
|
350 |
+ |
consFramework->doPreConstraint(); |
351 |
+ |
|
352 |
|
// finish the velocity half step |
353 |
|
|
354 |
|
moveB(); |
406 |
|
this->rotationPropagation( integrableObjects[i], ji ); |
407 |
|
|
408 |
|
integrableObjects[i]->setJ(ji); |
409 |
+ |
|
410 |
|
} |
411 |
|
} |
412 |
|
|
449 |
|
|
450 |
|
integrableObjects[i]->setJ(ji); |
451 |
|
} |
452 |
+ |
|
453 |
|
} |
454 |
|
|
455 |
|
consFramework->doConstrainB(); |
867 |
|
//The reason we use string instead of char* is that if we use char*, we will |
868 |
|
//return a pointer point to local variable which might cause problem |
869 |
|
return string(); |
870 |
+ |
} |
871 |
+ |
|
872 |
+ |
|
873 |
+ |
template<typename T> void Integrator<T>::printQuaternion(StuntDouble* sd){ |
874 |
+ |
Mat4x4d S; |
875 |
+ |
double I[3][3]; |
876 |
+ |
Vector4d j4; |
877 |
+ |
Vector3d j; |
878 |
+ |
Vector3d tempJ; |
879 |
+ |
Vector4d qdot; |
880 |
+ |
Vector4d omega4; |
881 |
+ |
Mat4x4d I4; |
882 |
+ |
Quaternion q; |
883 |
+ |
double I0; |
884 |
+ |
Vector4d p_qua; |
885 |
+ |
|
886 |
+ |
if (sd->isDirectional()){ |
887 |
+ |
sd->getQ(q.vec); |
888 |
+ |
sd->getI(I); |
889 |
+ |
sd->getJ(j.vec); |
890 |
+ |
|
891 |
+ |
//omega4[0] = 0.0; |
892 |
+ |
//omega4[1] = j[0]/I[0][0]; |
893 |
+ |
//omega4[2] = j[1]/I[1][1]; |
894 |
+ |
//omega4[3] = j[2]/I[2][2]; |
895 |
+ |
|
896 |
+ |
//S = getS(q); |
897 |
+ |
//qdot = 0.5 * S * omega4; |
898 |
+ |
|
899 |
+ |
//I0 = (qdot[1] * q[1] * I[0][0] + qdot[2] * q[2] * I[1][1] + qdot[3] * q[3] * I[2][2])/(qdot[1] * q[1]+ qdot[2] * q[2] + qdot[3] * q[3]); |
900 |
+ |
|
901 |
+ |
//I4.element[0][0] = I0; |
902 |
+ |
//I4.element[1][1] = I[0][0]; |
903 |
+ |
//I4.element[2][2] = I[1][1]; |
904 |
+ |
//I4.element[3][3] = I[2][2]; |
905 |
+ |
|
906 |
+ |
S = getS(q); |
907 |
+ |
j4[0] = 0.0; |
908 |
+ |
j4[1] = j[0]; |
909 |
+ |
j4[2] = j[1]; |
910 |
+ |
j4[3] = j[2]; |
911 |
+ |
|
912 |
+ |
p_qua = 2 * S * j4; |
913 |
+ |
|
914 |
+ |
j4 = 0.5 * S.transpose() * p_qua; |
915 |
+ |
//cout << "q0^2 + q1^2 + q2^2 + q3^2 = " << q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3] << endl; |
916 |
+ |
//cout << "q0*q0dot + q1*q1dot + q2 *q2dot + q3*q3dot = " <<q[0]*qdot[0] + q[1]*qdot[1] + q[2]*qdot[2] + q[3]*qdot[3] << endl; |
917 |
+ |
//cout << "q1*q1dot* Ixx + q2*q2dot* Iyy + q3 *q3dot* Izz = " << qdot[1] * q[1] * I[0][0] + qdot[2] * q[2] * I[1][1] + qdot[3] * q[3] * I[2][2] << endl; |
918 |
+ |
//cout << "q1*q1dot + q2 *q2dot + q3*q3dot = " << qdot[1] * q[1]+ qdot[2] * q[2] + qdot[3] * q[3] << endl; |
919 |
+ |
//cout << "I0 = " << I0 << endl; |
920 |
+ |
cout << "p_qua[0] = " << p_qua[0] << endl; |
921 |
+ |
} |
922 |
|
} |
923 |
+ |
|
924 |
+ |
template<typename T> Mat4x4d Integrator<T>::getS(const Quaternion& q){ |
925 |
+ |
Mat4x4d result; |
926 |
+ |
|
927 |
+ |
result.element[0][0] = q.x; |
928 |
+ |
result.element[0][1] = -q.y; |
929 |
+ |
result.element[0][2] = -q.z; |
930 |
+ |
result.element[0][3] = -q.w; |
931 |
+ |
|
932 |
+ |
result.element[1][0] = q.y; |
933 |
+ |
result.element[1][1] = q.x; |
934 |
+ |
result.element[1][2] = -q.w; |
935 |
+ |
result.element[1][3] = q.z; |
936 |
+ |
|
937 |
+ |
result.element[2][0] = q.z; |
938 |
+ |
result.element[2][1] = q.w; |
939 |
+ |
result.element[2][2] = q.x; |
940 |
+ |
result.element[2][3] = -q.y; |
941 |
+ |
|
942 |
+ |
result.element[3][0] = q.w; |
943 |
+ |
result.element[3][1] = -q.z; |
944 |
+ |
result.element[3][2] = q.y; |
945 |
+ |
result.element[3][3] = q.x; |
946 |
+ |
|
947 |
+ |
return result; |
948 |
+ |
} |
949 |
+ |
|