Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. //---------------------------
  2. // UCL-CEREM-MBS
  3. //
  4. // @version MBsysLab_s 1.7.a
  5. //
  6. // Creation : 2006
  7. // Last update : 01/10/2008
  8. //
  9. //
  10. //---------------------------
  11.  
  12. #include "math.h"
  13. #include "mbs_tyre.h"
  14. #include "mbs_data.h"
  15. #include "user_model.h"
  16. #include "user_all_id.h"
  17. #include "mbs_data.h"
  18. #include "mbs_project_interface.h"
  19.  
  20. double* user_ExtForces(double PxF[4], double RxF[4][4],
  21. double VxF[4], double OMxF[4],
  22. double AxF[4], double OMPxF[4],
  23. MbsData *mbs_data, double tsim,int ixF)
  24. {
  25. double Fx=0.0, Fy=0.0, Fz=0.0;
  26. double Mx=0.0, My=0.0, Mz=0.0;
  27. double dxF[4] ={0.0, 0.0, 0.0, 0.0};
  28.  
  29.  
  30. double *SWr = mbs_data->SWr[ixF];
  31.  
  32. // default application point of the force: anchor point to which it is attached
  33. int idpt = 0;
  34. idpt = mbs_data->xfidpt[ixF];
  35. dxF[1] = mbs_data->dpt[1][idpt];
  36. dxF[2] = mbs_data->dpt[2][idpt];
  37. dxF[3] = mbs_data->dpt[3][idpt];
  38.  
  39. /* Begin of user declaration */
  40.  
  41. UserModel *um = mbs_data->user_model;
  42. double K = um->Pneu.K;
  43. double D = um->Pneu.D;
  44. //double sinus = RxF[2][3];
  45. double R0 = um->Pneu.R0;
  46. double rzp, anglisp, angcamb, glissp, Vct[4], Vws[4], Rtsol[4][4];
  47. double M[4];
  48. rzp = 0;
  49. anglisp = 0;
  50. angcamb = 0;
  51. glissp = 0;
  52. double PressionIntPneu = 9e5; // Fiche technique pneu il doit etre gonflé à 9 bar
  53. int is_left_tire = 1; // 1 si c'est un pneu gauche et 0 si c'est un pneu droite
  54.  
  55. /* End of user declaration */
  56.  
  57. switch(ixF){
  58.  
  59. /* Begin of user code */
  60.  
  61.  
  62. double F[4] = { 3.0,Fx,Fy,Fz };
  63.  
  64. case Force_contactD1_id:
  65. is_left_tire = 0;
  66. mbs_kine_wheel(PxF, RxF, VxF, OMxF, tsim, Force_contactD1_id, &rzp, &anglisp, &angcamb, &glissp, Vct, Vws, Rtsol, dxF);
  67. if (PxF[3] < R0) {
  68. Fz = K * (R0 - PxF[3]) - D * VxF[3];
  69. }
  70. F[3] = Fz;
  71. mbs_pacejka_6_1_contact(F, M, anglisp, angcamb, glissp, VxF[1], PressionIntPneu, is_left_tire);
  72. Fx = F[1];
  73. Fy = F[2];
  74. Fz = F[3];
  75.  
  76. break;
  77.  
  78. case Force_contactD2_id:
  79. is_left_tire = 0;
  80. mbs_kine_wheel(PxF, RxF, VxF, OMxF, tsim, Force_contactD2_id, &rzp, &anglisp, &angcamb, &glissp, Vct, Vws, Rtsol, dxF);
  81. if (PxF[3] < R0) {
  82. Fz = K * (R0 - PxF[3]) - D * VxF[3];
  83. }
  84. F[3] = Fz;
  85. mbs_pacejka_6_1_contact(F, M, anglisp, angcamb, glissp, VxF[1], PressionIntPneu, is_left_tire);
  86. Fx = F[1];
  87. Fy = F[2];
  88. Fz = F[3];
  89. break;
  90.  
  91. case Force_contactD3_id:
  92. is_left_tire = 0;
  93. mbs_kine_wheel(PxF, RxF, VxF, OMxF, tsim, Force_contactD3_id, &rzp, &anglisp, &angcamb, &glissp, Vct, Vws, Rtsol, dxF);
  94. if (PxF[3] < R0) {
  95. Fz = K * (R0 - PxF[3]) - D * VxF[3];
  96. }
  97. F[3] = Fz;
  98. mbs_pacejka_6_1_contact(F, M, anglisp, angcamb, glissp, VxF[1], PressionIntPneu, is_left_tire);
  99. Fx = F[1];
  100. Fy = F[2];
  101. Fz = F[3];
  102.  
  103. break;
  104.  
  105. case Force_contactG1_id:
  106. is_left_tire = 1;
  107. mbs_kine_wheel(PxF, RxF, VxF, OMxF, tsim, Force_contactG1_id, &rzp, &anglisp, &angcamb, &glissp, Vct, Vws, Rtsol, dxF);
  108. if (PxF[3] < R0) {
  109. Fz = K * (R0 - PxF[3]) - D * VxF[3];
  110. }
  111. F[3] = Fz;
  112. mbs_pacejka_6_1_contact(F, M, anglisp, angcamb, glissp, VxF[1], PressionIntPneu, is_left_tire);
  113. Fx = F[1];
  114. Fy = F[2];
  115. Fz = F[3];
  116.  
  117. break;
  118.  
  119. case Force_contactG2_id:
  120. is_left_tire = 1;
  121. mbs_kine_wheel(PxF, RxF, VxF, OMxF, tsim, Force_contactG2_id, &rzp, &anglisp, &angcamb, &glissp, Vct, Vws, Rtsol, dxF);
  122. if (PxF[3] < R0) {
  123. Fz = K * (R0 - PxF[3]) - D * VxF[3];
  124. }
  125. F[3] = Fz;
  126. mbs_pacejka_6_1_contact(F, M, anglisp, angcamb, glissp, VxF[1], PressionIntPneu, is_left_tire);
  127. Fx = F[1];
  128. Fy = F[2];
  129. Fz = F[3];
  130.  
  131. break;
  132.  
  133. case Force_contactG3_id:
  134. is_left_tire = 1;
  135. mbs_kine_wheel(PxF, RxF, VxF, OMxF, tsim, Force_contactG3_id, &rzp, &anglisp, &angcamb, &glissp, Vct, Vws, Rtsol, dxF);
  136. if (PxF[3] < R0) {
  137. Fz = K * (R0 - PxF[3]) - D * VxF[3];
  138. }
  139. F[3] = Fz;
  140. mbs_pacejka_6_1_contact(F, M, anglisp, angcamb, glissp, VxF[1], PressionIntPneu, is_left_tire);
  141. Fx = F[1];
  142. Fy = F[2];
  143. Fz = F[3];
  144.  
  145. break;
  146.  
  147.  
  148.  
  149. /* case 2:
  150.  
  151.  
  152. break;
  153. */
  154.  
  155. /* End of user code */
  156.  
  157. }
  158.  
  159. SWr[1]=Fx;
  160. SWr[2]=Fy;
  161. SWr[3]=Fz;
  162. SWr[4]=Mx;
  163. SWr[5]=My;
  164. SWr[6]=Mz;
  165. SWr[7]=dxF[1];
  166. SWr[8]=dxF[2];
  167. SWr[9]=dxF[3];
  168.  
  169. return SWr;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement