#!/usr/bin/env python3  
# -*- coding: utf-8 -*- 
# ----------------------------------------------------------------------------
# Author : Basile Poujol
# Date : September 2025
# Last updated : September 2026
# ---------------------------------------------------------------------------
"""
Ce code sert à modéliser le mouvement de collé-glissé (slip-stick) d'une valise sur un tapis roulant.
Il permet de résoudre les équations du mouvement à partir de la méthode d'Euler et des lois de 
Coulomb du frottement, en exploitant notamment les conditions de passage de l'adhérence au glissement,
et du glissement à l'adhérence.
 """

import numpy as np
import matplotlib.pyplot as plt

#INITIALISATION DES VARIABLES

#Constantes du problème
g = 9.81 #m/s2
k = 10 #N/m
v0 = 1 #m/s
m = 20 #kg
fs = 0.6
fd = 0.4
#Ces variables sont des variables globales qui peuvent être utilisées à l'intérieur des fonctions Python.

#Variables de temps
#Durée de la simulation
t_max = 60 #s
#Pas de temps
dt = COMPLETER #s
#Tableau contenant le temps
T = np.arange(0,t_max,dt)
#Nombre de pas de temps
N = len(T)


#Variable x
x0 = 0 #position initiale du mobile
#On crée une liste vide destinée à contenir la position x(t)
Xt = np.zeros((N))
#On crée une liste vide destinée à contenir la vitesse v(t)
Vt = np.zeros((N))

#DEFINITION DE FONCTIONS

def mouvement_adherence(x1,v1,dt):
  '''Fonction qui calcule x(t+dt) et v(t+dt) (notés x2 et v2)
     à partir de x(t) et v(t) (notés x1 et v1) lors de la phase d'adhérence'''


  return x2,v2

def force_de_rappel(x):
  return -k*x

def condition_adherence_verifiee(x,v):
  if COMPLETER :
    return True
  else :
    return False

def mouvement_glissement(x1,v1,dt):
  '''Fonction qui calcule x(t+dt) et v(t+dt) (notés x2 et v2)
     à partir de x(t) et v(t) (notés x1 et v1) lors de la phase de glissement'''


  return x2,v2

def condition_glissement_verifiee(x,v):
  if COMPLETER :
    return True
  else :
    return False

def mouvement(x1,v1,adherence1):
  '''Fonction qui calcule x(t+dt) et v(t+dt) (notés x2 et v2)
     à partir de x(t) et v(t) (notés x1 et v1)
     et de la phase (adhérence ou glissement) à t donnée par adherence1.
     La fonction retourne également adherence2 qui indique la phase (adhérence ou glissement) à t+dt.'''

  if adherence1 :
    x2,v2 = mouvement_adherence(x1,v1)
    if condition_adherence_verifiee(x2,v2) :
      adherence2 = True
    else :
      adherence2 = False
  else :
    x2,v2 = mouvement_glissement(x1,v1)
    if condition_glissement_verifiee(x2,v2) :
      adherence2 = False
    else :
      adherence2 = True



  return x2,v2,adherence2

#RESOLUTION DES EQUATIONS DIFFERENTIELLES

#Initialisation
t = 0
x = 0
v = 0
adherence = COMPLETER

for t in range(N):
  Xt[t] = x
  Vt[t] = v
  x,v,adherence = mouvement(x,v,adherence)

#Les deux codes suivants permettent de visualiser votre résultat (série temporelle et espace des phases) :

plt.plot(T,Xt,color='blue',label='x(t)')
plt.plot(T,Vt,color='green',label='v(t)')
plt.legend()

plt.figure(figsize=(8,5))

plt.plot(T,Xt,color='blue',label='x(t)')
plt.plot(T,Vt,color='green',label='v(t)')
plt.legend(fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.xlabel('Temps [s]',fontsize=15)
plt.ylabel('Position [m] et vitesse [m/s]',fontsize=15)
plt.show()

plt.figure(figsize=(8,5))

plt.plot(Xt,Vt,color='k')
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.xlabel('Position [m]',fontsize=15)
plt.ylabel('Vitesse [m/s]',fontsize=15)
plt.title('Portrait de phase',fontsize=15)
plt.show()

