o
    ٷiy                     @   s  d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ  edZ!edZ"G dd	 d	Z#G d
d dZ$G dd dZ%G dd dZ&G dd dZ'G dd dZ(G dd dZ)G dd dZ*dS )z=Tests for the ``sympy.physics.mechanics.actuator.py`` module.    N)	SMatrixSymbolSympifyErrorsqrtAbssymbolsexpsign)ActuatorBaseForceForceActuatorKanesMethodLinearDamperLinearPathwayLinearSpringParticlePinJointPointReferenceFrame	RigidBodyTorqueActuatorVectordynamicsymbolsDuffingSpringCoulombKineticFriction)Exprtargetreactionc                   @   s  e Zd Zejdddd Zdd Zejdde	j
fe	j
e	j
fed	ed	fed	ed	fed	d
 ed	 ed	d
 ed	 fgdd Zejddd	gdd Zejdeededgdd Zdd Zejdddgdd Zdd Zdd  Zd!d" Zd#d$ ZdS )%TestForceActuatorTautousec                 C   s~   t d| _td| _td| _t| j| j| _td| _td| _	td| _
tdd| _tdd| _tdd| _td| _d S )	NFpApBq1q2q3   N)r   forcer   r#   r$   r   pathwayr   r%   r&   r'   q1dq2dq3dr   r)   self r1   _/home/ubuntu/.local/lib/python3.10/site-packages/sympy/physics/mechanics/tests/test_actuator.py_linear_pathway_fixture,   s   





z)TestForceActuator._linear_pathway_fixturec                 C      t ttsJ d S N)
issubclassr   r   r/   r1   r1   r2   test_is_actuator_base_subclass:      z0TestForceActuator.test_is_actuator_base_subclasszforce, expected_forcer(   r"      c                 C   sJ   t || j}t|t sJ t|dsJ t|jtsJ |j|ks#J d S )Nr*   )r   r+   
isinstancehasattrr*   ExprType)r0   r*   expected_forceinstancer1   r1   r2   test_valid_constructor_force=   s
   z.TestForceActuator.test_valid_constructor_forcer*   Nc                 C   <   t t t|| j}W d    d S 1 sw   Y  d S r5   )pytestraisesr   r   r+   )r0   r*   _r1   r1   r2   .test_invalid_constructor_force_not_sympifyableN      "z@TestForceActuator.test_invalid_constructor_force_not_sympifyabler+   r#   r$   c                 C   sJ   t | j|}t|t sJ t|dsJ t|jtsJ |j|ks#J d S )Nr+   )r   r*   r:   r;   r+   r   )r0   r+   r>   r1   r1   r2   test_valid_constructor_pathwayS   s
   z0TestForceActuator.test_valid_constructor_pathwayc                 C   <   t t t| jd }W d    d S 1 sw   Y  d S r5   )rA   rB   	TypeErrorr   r*   r0   rC   r1   r1   r2   1test_invalid_constructor_pathway_not_pathway_base`      "zCTestForceActuator.test_invalid_constructor_pathway_not_pathway_base property_name, fixture_attr_name)r*   r*   r+   r+   c                 C   T   t | j| j}t| |}tt t||| W d    d S 1 s#w   Y  d S r5   )r   r*   r+   getattrrA   rB   AttributeErrorsetattr)r0   property_namefixture_attr_namer>   valuer1   r1   r2   test_properties_are_immutabled   
   
"z/TestForceActuator.test_properties_are_immutablec                 C   s&   t | j| j}d}t||ksJ d S )Nz'ForceActuator(F, LinearPathway(pA, pB)))r   r*   r+   reprr0   actuatorexpectedr1   r1   r2   	test_reprq   s   zTestForceActuator.test_reprc                 C   sd   | j | jd| jj  t| j| j}| j| j | jj f| j | j| jj fg}| |ks0J d S Nr9   )	r$   set_posr#   r)   xr   r*   r+   to_loadsrX   r1   r1   r2   test_to_loads_static_pathwayv   s   z.TestForceActuator.test_to_loads_static_pathwayc                 C   s   | j | jd| j | jj  t| j| j}| j| j | jt	| jd   | jj f| j | j| jt	| jd   | jj fg}|
 |ksGJ d S r\   )r$   r]   r#   r%   r)   r^   r   r*   r+   r   r_   rX   r1   r1   r2   test_to_loads_2D_pathway   s   (&z*TestForceActuator.test_to_loads_2D_pathwayc                 C   s0  | j | j| j| jj | j| jj  d| j | jj	   t
| j| j}t| jd | jd  d| jd   }| j | j | jj | | j| j | jj |  d| j | j | jj	 |  }| j| j | jj | | j| j | jj |  d| j | j | jj	 |  }| j|f| j |fg}| |ksJ d S )Nr9      )r$   r]   r#   r%   r)   r^   r&   yr'   zr   r*   r+   r   r_   )r0   rY   lengthpO_forcepI_forcerZ   r1   r1   r2   test_to_loads_3D_pathway   s,   ,&z*TestForceActuator.test_to_loads_3D_pathway)__name__
__module____qualname__rA   fixturer3   r7   markparametrizer   Oner   r   r?   rD   r   r   rF   rJ   rU   r[   r`   ra   rh   r1   r1   r1   r2   r   *   sD    


&




		r   c                   @   s~  e Zd Zejdddd Zdd Zdd Zej	d	d
e
jde
jeedd  fededde
jed eedd  fedede
je
jed eedd  fededededed eedd ed  fgdd Zej	dddgdd Zdd Zej	dddgdd Zej	dg ddd Zej	de
jd fedd!fgd"d# Zd$d% ZdS )&TestLinearSpringTr    c                 C   sP   t d| _t d| _td| _td| _t| j| j| _td| _	t
d| _d S )Nklr#   r$   qr)   )r   	stiffnessrr   r   r#   r$   r   r+   r   rs   r   r)   r/   r1   r1   r2   _linear_spring_fixture   s   




z'TestLinearSpring._linear_spring_fixturec                 C   r4   r5   )r6   r   r   r/   r1   r1   r2   test_is_force_actuator_subclass   r8   z0TestLinearSpring.test_is_force_actuator_subclassc                 C   r4   r5   )r6   r   r   r/   r1   r1   r2   r7      r8   z/TestLinearSpring.test_is_actuator_base_subclasszUstiffness, expected_stiffness, equilibrium_length, expected_equilibrium_length, forcer(   r   rs   r9   rq   rr   c                 C   s   | j | j| j| jj  t|| j|}t|tsJ t	|ds"J t|j
ts*J |j
|ks1J t	|ds8J t|jts@J |j| jksHJ t	|dsOJ t|jtsWJ |j|ks^J t	|dseJ t|jtsmJ |j|kstJ d S )Nrt   r+   equilibrium_lengthr*   )r$   r]   r#   rs   r)   r^   r   r+   r:   r;   rt   r<   r   rw   r*   )r0   rt   expected_stiffnessrw   expected_equilibrium_lengthr*   springr1   r1   r2   test_valid_constructor   s   /z'TestLinearSpring.test_valid_constructorrt   Nc                 C   @   t t t|| j| j}W d    d S 1 sw   Y  d S r5   )rA   rB   r   r   r+   rr   )r0   rt   rC   r1   r1   r2   2test_invalid_constructor_stiffness_not_sympifyable      "zCTestLinearSpring.test_invalid_constructor_stiffness_not_sympifyablec                 C   s@   t t t| jd | j}W d    d S 1 sw   Y  d S r5   )rA   rB   rH   r   rt   rr   rI   r1   r1   r2   rJ      s   "zBTestLinearSpring.test_invalid_constructor_pathway_not_pathway_baserw   c                 C   s@   t t t| j| j|}W d    d S 1 sw   Y  d S r5   )rA   rB   r   r   rt   r+   r0   rw   rC   r1   r1   r2   ;test_invalid_constructor_equilibrium_length_not_sympifyable   s   "zLTestLinearSpring.test_invalid_constructor_equilibrium_length_not_sympifyablerL   ))rt   rt   rM   )rw   rr   c                 C   sX   t | j| j| j}t| |}tt t||| W d    d S 1 s%w   Y  d S r5   )	r   rt   r+   rr   rO   rA   rB   rP   rQ   )r0   rR   rS   rz   rT   r1   r1   r2   rU     s
   	
"z.TestLinearSpring.test_properties_are_immutableequilibrium_length, expectedz&LinearSpring(k, LinearPathway(pA, pB))z<LinearSpring(k, LinearPathway(pA, pB), equilibrium_length=l)c                 C   s>   | j | j| j| jj  t| j| j|}t	||ksJ d S r5   )
r$   r]   r#   rs   r)   r^   r   rt   r+   rW   r0   rw   rZ   rz   r1   r1   r2   r[     s   zTestLinearSpring.test_reprc           
      C   s   | j | j| j| jj  t| j| j| j	}| jt
| jd  | jj }| jt
| jd | j	  | }| j t
| jd | j	  | }t| j|t| j |g}| }t||D ]\}\}}	t|tseJ |j|kslJ |j|	  dkswJ qXd S )Nr9   r   )r$   r]   r#   rs   r)   r^   r   rt   r+   rr   r   r   r_   zipr:   pointvectorsimplify)
r0   rz   normalpA_forcepB_forcerZ   loadsloadr   r   r1   r1   r2   test_to_loads$  s    zTestLinearSpring.test_to_loads)ri   rj   rk   rA   rl   ru   rv   r7   rm   rn   r   ro   Zeror   r   r   r{   r}   rJ   r   rU   r[   r   r1   r1   r1   r2   rp      sl    

	 
'




rp   c                   @   s   e Zd Zejdddd Zdd Zdd Zd	d
 Zdd Z	ej
dddgdd Zdd Zej
dddgdd Zdd Zdd ZdS )TestLinearDamperTr    c                 C   sf   t d| _t d| _td| _td| _t| j| j| _td| _	tdd| _
td| _td| _d S )	Ncrr   r#   r$   rs   r(   ur)   )r   dampingrr   r   r#   r$   r   r+   r   rs   dqr   r   r)   r/   r1   r1   r2   _linear_damper_fixture5  s   





z'TestLinearDamper._linear_damper_fixturec                 C   r4   r5   )r6   r   r   r/   r1   r1   r2   rv   A  r8   z0TestLinearDamper.test_is_force_actuator_subclassc                 C   r4   r5   )r6   r   r   r/   r1   r1   r2   r7   D  r8   z/TestLinearDamper.test_is_actuator_base_subclassc                 C   s   | j | j| j| jj  t| j| j}t	|tsJ t
|ds"J t	|jts*J |j| jks2J t
|ds9J t	|jtsAJ |j| jksIJ d S )Nr   r+   )r$   r]   r#   rs   r)   r^   r   r   r+   r:   r;   r<   r   )r0   damperr1   r1   r2   r{   G  s   z'TestLinearDamper.test_valid_constructorc                 C   sz   | j | j| j| jj  t| j| j}| j t	| jd  | j
 | j }t|ds,J t|jts4J |j|ks;J d S )Nr9   r*   )r$   r]   r#   rs   r)   r^   r   r   r+   r   r   r;   r:   r*   r<   )r0   r   r=   r1   r1   r2   r?   U  s   "z-TestLinearDamper.test_valid_constructor_forcer   Nr   c                 C   r@   r5   )rA   rB   r   r   r+   )r0   r   rC   r1   r1   r2   0test_invalid_constructor_damping_not_sympifyable^  rE   zATestLinearDamper.test_invalid_constructor_damping_not_sympifyablec                 C   rG   r5   )rA   rB   rH   r   r   rI   r1   r1   r2   rJ   c  rK   zBTestLinearDamper.test_invalid_constructor_pathway_not_pathway_baserL   )r   r   rM   c                 C   rN   r5   )r   r   r+   rO   rA   rB   rP   rQ   )r0   rR   rS   r   rT   r1   r1   r2   rU   g  rV   z.TestLinearDamper.test_properties_are_immutablec                 C   s@   | j | j| j| jj  t| j| j}d}t	||ksJ d S )Nz&LinearDamper(c, LinearPathway(pA, pB)))
r$   r]   r#   rs   r)   r^   r   r   r+   rW   )r0   r   rZ   r1   r1   r2   r[   t  s   zTestLinearDamper.test_reprc                 C   s   | j | j| j| jj  t| j| j}| jd | jd  | jj }| j| j	 | }| j | j	 | }t
| j|t
| j |g}| |ksGJ d S r\   )r$   r]   r#   rs   r)   r^   r   r   r+   r   r   r_   )r0   r   	directionr   r   rZ   r1   r1   r2   r   z  s   zTestLinearDamper.test_to_loads)ri   rj   rk   rA   rl   r   rv   r7   r{   r?   rm   rn   r   rJ   rU   r[   r   r1   r1   r1   r2   r   3  s&    

	

r   c                   @   s4   e Zd ZdZejdddd Zdd Zdd	 Zd
S )TestForcedMassSpringDamperModela  A single degree of freedom translational forced mass-spring-damper.

    Notes
    =====

    This system is well known to have the governing equation:

    .. math::
        m \ddot{x} = F - k x - c \dot{x}

    where $F$ is an externally applied force, $m$ is the mass of the particle
    to which the spring and damper are attached, $k$ is the spring's stiffness,
    $c$ is the dampers damping coefficient, and $x$ is the generalized
    coordinate representing the system's single (translational) degree of
    freedom.

    Tr    c                 C   s  t d| _t d| _t d| _t d| _td| _tdd| _td| _t	d| _
td	| _| j| j
d
 td| _| j| j| j| j
j  td| j| j| _t| j| j| _t| j
| jg| jg| j| j gd| _| jg| _t| jgg| _t| j| j| j  | j| j  gg| _d S )Nmrq   r   r"   rs   r(   r   r)   pOr   r#   mass)q_indu_indkd_eqs)r   r   rq   r   r"   r   rs   r   r   r   framer   originset_vel
attachmentr]   r^   r   r   r   r+   r   kanes_methodbodiesr   mass_matrixforcingr/   r1   r1   r2   '_force_mass_spring_damper_model_fixture  s.   









,zGTestForcedMassSpringDamperModel._force_mass_spring_damper_model_fixturec                 C   s   | j  | jj }t|| j}| j | jj }t|| j}| j| j| jj	 fg|
 |
 }| j| j| | jj| jks@J | jj| jksIJ d S r5   )rq   r+   re   r   r   extension_velocityr   r"   r   r^   r_   r   kanes_equationsr   r   r   )r0   rt   rz   r   r   r   r1   r1   r2   test_force_acuator  s   z2TestForcedMassSpringDamperModel.test_force_acuatorc                 C   sz   t | j| j}t| j| j}| j| j| jj fg|	 |	 }| j
| j| | j
j| jks2J | j
j| jks;J d S r5   )r   rq   r+   r   r   r   r"   r   r^   r_   r   r   r   r   r   )r0   rz   r   r   r1   r1   r2    test_linear_spring_linear_damper  s   z@TestForcedMassSpringDamperModel.test_linear_spring_linear_damperN)	ri   rj   rk   __doc__rA   rl   r   r   r   r1   r1   r1   r2   r     s    

r   c                	   @   s  e Zd Zejdddd Zdd Zejde	de
de	dd	 e	d gejd
ejejfeejfejefeefgdd Zejde	de
de	dd	 e	d gejdejegdd Zejdddgdd Zejde	de
dgdd Zejddedfeddfdedfeddfgdd Zejdg ddd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ ZdS ),TestTorqueActuatorTr    c                 C   sL   t d| _td| _td| _| jj| _td| jd| _td| jd| _	d S )NTr)   Ar   )r   r   )
r   torquer   r)   r   rd   axisr   r   r   r/   r1   r1   r2   _torque_actuator_fixture  s   



z+TestTorqueActuator._torque_actuator_fixturec                 C   r4   r5   )r6   r   r   r/   r1   r1   r2   r7     r8   z1TestTorqueActuator.test_is_actuator_base_subclassr   r   r9   ztarget_frame, reaction_framec                 C   s   t || j||}t|t sJ t|dsJ t|jtsJ |j|ks%J t|ds,J t|jts4J |j| jks<J t|dsCJ t|jtsKJ |jt	j
ksSJ t|dsZJ t|jtsbJ |jtj
ksjJ d S Nr   r   target_framereaction_frame)r   r   r:   r;   r   r<   r   r   r   r   r   r   r   )r0   r   r   r   r>   r1   r1   r2   $test_valid_constructor_with_reaction  s&   z7TestTorqueActuator.test_valid_constructor_with_reactionr   c                 C   s   t || j|}t|t sJ t|dsJ t|jtsJ |j|ks$J t|ds+J t|jts3J |j| jks;J t|dsBJ t|jtsJJ |jt	j
ksRJ t|dsYJ |jd u s`J d S r   )r   r   r:   r;   r   r<   r   r   r   r   r   r   )r0   r   r   r>   r1   r1   r2   'test_valid_constructor_without_reaction  s   
z:TestTorqueActuator.test_valid_constructor_without_reactionNc                 C   r|   r5   )rA   rB   r   r   r   r   )r0   r   rC   r1   r1   r2   /test_invalid_constructor_torque_not_sympifyable/  r~   zBTestTorqueActuator.test_invalid_constructor_torque_not_sympifyabler   ac                 C   D   t t t| j|| j| j}W d    d S 1 sw   Y  d S r5   )rA   rB   rH   r   r   r   r   )r0   r   rC   r1   r1   r2   (test_invalid_constructor_axis_not_vector4     "z;TestTorqueActuator.test_invalid_constructor_axis_not_vectorframeschildparentc                 C   sF   t t t| j| jg|R  }W d    d S 1 sw   Y  d S r5   )rA   rB   rH   r   r   r   )r0   r   rC   r1   r1   r2   )test_invalid_constructor_frames_not_frame9  s   
"z<TestTorqueActuator.test_invalid_constructor_frames_not_framerL   ))r   r   )r   r   )r   r   )r   r   c                 C   s\   t | j| j| j| j}t| |}tt t	||| W d    d S 1 s'w   Y  d S r5   )
r   r   r   r   r   rO   rA   rB   rP   rQ   )r0   rR   rS   rY   rT   r1   r1   r2   rU   F  s   

"z0TestTorqueActuator.test_properties_are_immutablec                 C   s*   t | j| j| j}d}t||ksJ d S )Nz+TorqueActuator(T, axis=N.z, target_frame=N))r   r   r   r   rW   rX   r1   r1   r2   test_repr_without_reactionZ  s   z-TestTorqueActuator.test_repr_without_reactionc                 C   s.   t | j| j| j| j}d}t||ksJ d S )Nz=TorqueActuator(T, axis=N.z, target_frame=N, reaction_frame=A))r   r   r   r   r   rW   rX   r1   r1   r2   test_repr_with_reaction_  s   z*TestTorqueActuator.test_repr_with_reactionc              	   C   s   t d| j| jtdtd| j| jd}t| j|}t	|ts!J t
|ds(J t	|jts0J |j| jks8J t
|ds?J t	|jtsGJ |j| jksOJ t
|dsVJ t	|jts^J |j| jksfJ t
|dsmJ t	|jtsuJ |j| jks}J d S )	Npinrs   r   )coordinatesspeedsparent_interframe
joint_axisr   r   r   r   )r   r   r   r   r)   r   r   at_pin_jointr   r:   r;   r<   r   r   r   r   r   )r0   	pin_jointr>   r1   r1   r2   test_at_pin_joint_constructori  s.   	z0TestTorqueActuator.test_at_pin_joint_constructorc                 C   sB   t t t| jtd}W d    d S 1 sw   Y  d S )Nr   )rA   rB   rH   r   r   r   r   rI   r1   r1   r2   1test_at_pin_joint_pin_joint_not_pin_joint_invalid  s   "zDTestTorqueActuator.test_at_pin_joint_pin_joint_not_pin_joint_invalidc                 C   s:   t | j| j| j}| j| j| j fg}| |ksJ d S r5   )r   r   r   r   r)   r_   rX   r1   r1   r2   test_to_loads_without_reaction  s   z1TestTorqueActuator.test_to_loads_without_reactionc                 C   sP   t | j| j| j| j}| j| j| j f| j| j | j fg}| |ks&J d S r5   )r   r   r   r   r   r)   r   r_   rX   r1   r1   r2   test_to_loads_with_reaction  s   z.TestTorqueActuator.test_to_loads_with_reaction)ri   rj   rk   rA   rl   r   r7   rm   rn   r   r   r   r   r   r   r   r   r   r   r   r   rU   r   r   r   r   r   r   r1   r1   r1   r2   r     sj    


	






	
	
r   c                   @   s   e Zd ZdS )NonSympifyableN)ri   rj   rk   r1   r1   r1   r2   r     s    r   c                   @   s2  e Zd Zejdddd Zdd Zdd Zej	d	d
e
jd
e
jde
jeedd  eedd d  fededededde
jed eedd  edeedd d   fedededede
je
jed eedd  edeedd d   fededededededed eedd ed  edeedd ed d   fgdd Zej	dde gdd Zej	dde gdd Zdd Zej	dde gdd Zej	d g d!d"d# Zej	d$d%edd&fgd'd( Zd)d* ZdS )+TestDuffingSpringTr    c                 C   sZ   t d| _t d| _t d| _td| _td| _t| j| j| _t	d| _
td| _d S )Nbetaalpharr   r#   r$   rs   r)   )r   linear_stiffnessnonlinear_stiffnessrw   r   r#   r$   r   r+   r   rs   r   r)   r/   r1   r1   r2   _duffing_spring_fixture  s   





z)TestDuffingSpring._duffing_spring_fixturec                 C   r4   r5   )r6   r   r   r/   r1   r1   r2   rv     r8   z1TestDuffingSpring.test_is_force_actuator_subclassc                 C   r4   r5   )r6   r   r   r/   r1   r1   r2   r7     r8   z0TestDuffingSpring.test_is_actuator_base_subclasszlinear_stiffness,  expected_linear_stiffness,  nonlinear_stiffness,   expected_nonlinear_stiffness,  equilibrium_length,    expected_equilibrium_length,   forcer(   r   rs   r9      r   r   rr   c           	      C   s  | j | j| j| jj  t||| j|}t|tsJ t	|ds#J t|j
ts+J |j
|ks2J t	|ds9J t|jtsAJ |j|ksHJ t	|dsOJ t|jtsWJ |j| jks_J t	|dsfJ t|jtsnJ |j|ksuJ t	|ds|J t|jtsJ |j|ksJ d S )Nr   r   r+   rw   r*   )r$   r]   r#   rs   r)   r^   r   r+   r:   r;   r   r<   r   r   rw   r*   )	r0   r   expected_linear_stiffnessr   expected_nonlinear_stiffnessrw   ry   r*   rz   r1   r1   r2   r{     s$   ?z(TestDuffingSpring.test_valid_constructorr   Nc                 C   sD   t t t|| j| j| j}W d    d S 1 sw   Y  d S r5   )rA   rB   r   r   r   r+   rw   )r0   r   rC   r1   r1   r2   9test_invalid_constructor_linear_stiffness_not_sympifyable  r   zKTestDuffingSpring.test_invalid_constructor_linear_stiffness_not_sympifyabler   c                 C   r   r5   )rA   rB   r   r   r   r+   rw   )r0   r   rC   r1   r1   r2   <test_invalid_constructor_nonlinear_stiffness_not_sympifyable  r   zNTestDuffingSpring.test_invalid_constructor_nonlinear_stiffness_not_sympifyablec                 C   sF   t t t| j| jt | j}W d    d S 1 sw   Y  d S r5   )rA   rB   rH   r   r   r   r   rw   rI   r1   r1   r2   rJ     s   "zCTestDuffingSpring.test_invalid_constructor_pathway_not_pathway_baserw   c                 C   sD   t t t| j| j| j|}W d    d S 1 sw   Y  d S r5   )rA   rB   r   r   r   r   r+   r   r1   r1   r2   r     r   zMTestDuffingSpring.test_invalid_constructor_equilibrium_length_not_sympifyablerL   ))r   r   )r   r   rM   )rw   rw   c                 C   sX   t | j| j| j| j}tt t||t	| | W d    d S 1 s%w   Y  d S r5   )
r   r   r   r+   rw   rA   rB   rP   rQ   rO   )r0   rR   rS   rz   r1   r1   r2   rU   "  s   "z/TestDuffingSpring.test_properties_are_immutabler   )r   zGDuffingSpring(beta, alpha, LinearPathway(pA, pB), equilibrium_length=0)zGDuffingSpring(beta, alpha, LinearPathway(pA, pB), equilibrium_length=l)c                 C   s(   t | j| j| j|}t||ksJ d S r5   )r   r   r   r+   rW   r   r1   r1   r2   r[   2  s   
zTestDuffingSpring.test_reprc              
   C   s"  | j | j| j| jj  t| j| j| j	| j
}| j| j
 }| j | | j|d   }t| j|| jj t| j | | jj g}| }t||D ]E\}}|j|jksUJ | jD ]5}|j|}	|j|}
| jdtddtddtddi}|	|
 | }t|dk sJ d| qXqId S )Nr   r(   rr   r   r   g&.>z%The forces do not match. Difference: )r$   r]   r#   rs   r)   r^   r   r   r   r+   rw   r   r_   r   r   r   dotr   subsevalfr   )r0   rz   displacementr*   expected_loadscalculated_loads
calculatedrZ   dimcalculated_componentexpected_componentsubstitutionsdiffr1   r1   r2   r   ?  s    *
"zTestDuffingSpring.test_to_loads)ri   rj   rk   rA   rl   r   rv   r7   rm   rn   r   ro   r   r   r   r   r{   r   r   r   rJ   r   rU   r[   r   r1   r1   r1   r2   r     s|    


$
4
4
D
5#





	r   c                   @   sH   e Zd Zejdddd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )TestCoulombKineticFrictionTr    c                 C   s,   t ddd\| _| _| _| _| _| _| _dS )a8  A block sliding on a surface.

        Notes
        =====
        This test validates the correctness of the CoulombKineticFriction by simulating
        a block sliding on a surface with the Coulomb kinetic friction force.
        The test covers scenarios with both positive and negative velocities.

        zm g mu_k mu_s v_s sigma FT)realN)r   r   gmu_kmu_sv_ssigmar"   r/   r1   r1   r2   _block_on_surfaceZ  s   ,z,TestCoulombKineticFriction._block_on_surfacec           
      C   s  t d}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j |}t|| j| j
 | j	 | tt|d |  |  t|d  |j dt|| j | j
 | j	 | tt|d |  |  t|d  |j dg}| |ksJ t ddd	}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j |}t|| j| j
 | j	 t|  |j dt|| j | j
 | j	 t|  |j dg}| |ksJ t dd
d	}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j |}t|| j| j
 | j	 | tt|d |  |  t|d  |j dt|| j | j
 | j	 | tt|d |  |  t|d  |j dg}	| |	ksJ d S )Nrs   r)   OPr   r9   r   r*   TpositiveF)r   r   r   	locatenewr^   r   r   r   r   r   r   r   r   r
   r   r_   
r0   rs   r)   r   r   r+   frictionexpected_generalexpected_positiveexpected_negativer1   r1   r2   test_block_on_surface_defaulti  sH   
JL
*,
JLz8TestCoulombKineticFriction.test_block_on_surface_defaultc           
      C   s  t d}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || jd}t|| j| j
 | j	 tt|d |  |  | jt|d  |  |  | t|d  |j dt|| j | j
 | j	 tt|d |  |  | jt|d  |  |  | t|d  |j dg}| |ksJ t dd	d
}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || jd}t|| j| j
 | j	 t|  | j|   |j dt|| j | j
 | j	 t|  | j|   |j dg}| |ks+J t ddd
}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || jd}t|| j| j
 | j	 tt|d |  |  | jt|d  |  |  | t|d  |j dt|| j | j
 | j	 tt|d |  |  | jt|d  |  |  | t|d  |j dg}	| |	ksJ d S )Nrs   r)   r   r   r   )r   r9   r   Tr   F)r   r   r   r   r^   r   r   r   r   r   r   r   r   r   r
   r   r_   r   r1   r1   r2   test_block_on_surface_viscous  sH   
hj
8:
hjz8TestCoulombKineticFriction.test_block_on_surface_viscousc           
   	   C   s  t d}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || j| jd}t|| j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    | tt|d |  |  t|d  |j dt|| j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd     | tt|d |  |  t|d  |j dg}| |ksJ t dd	d
}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || j| jd}t|| j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    t|  |j dt|| j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd     t|  |j dg}| |ksJ t ddd
}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || j| jd}t|| j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    | tt|d |  |  t|d  |j dt|| j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd     | tt|d |  |  t|d  |j dg}	| |	ks\J d S )Nrs   r)   r   r   r   )r   r   r9   r   Tr   F)r   r   r   r   r^   r   r   r   r   r   r   r   r   r   r   r	   r
   r   r_   r   r1   r1   r2   test_block_on_surface_stribeck  sH   
 
 ln
 z9TestCoulombKineticFriction.test_block_on_surface_stribeckc           
   
   C   s\  t d}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || j| j| jd}t|| jt|d  |  | | j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    tt|d |  |   | t|d  |j dt|| j t|d  |  | | j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    tt|d |  |   | t|d  |j dg}| |ksJ t dd	d
}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || j| j| jd}t|| j|  | j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    t|   |j dt|| j |  | j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    t|   |j dg}| |ksJ t ddd
}td}td}|d||j }||d ||| |j  t||}t| j	| j
| j || j| j| jd}t|| jt|d  |  | | j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    tt|d |  |   | t|d  |j dt|| j t|d  |  | | j| j
 | j	 | j | j
 | j	 | j| j
 | j  t| d  | jd    tt|d |  |   | t|d  |j dg}	| |	ksJ d S )Nrs   r)   r   r   r   )r   r   r   r9   r   Tr   F)r   r   r   r   r^   r   r   r   r   r   r   r   r   r   r   r   r   r	   r
   r_   r   r1   r1   r2   test_block_on_surface_all  sH   
$
$z|
$z4TestCoulombKineticFriction.test_block_on_surface_allc                 C   sv   t d}td}td}|d||j }||d ||| |j  t||}t| j	d|}|j
dks9J d S )Nrs   r)   r   r   r   )r   r   r   r   r^   r   r   r   r   r   r*   )r0   rs   r)   r   r   r+   r   r1   r1   r2   test_normal_force_zero-  s   
z1TestCoulombKineticFriction.test_normal_force_zeroN)ri   rj   rk   rA   rl   r   r   r   r   r   r   r1   r1   r1   r2   r   Y  s    

1111r   )+r   rA   sympyr   r   r   r   r   r   r   r	   r
   sympy.physics.mechanicsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   sympy.core.exprr   r<   r   r   r   rp   r   r   r   r   r   r   r1   r1   r1   r2   <module>   s$    ,Lv QR J 7