MODULE calcul_divers_mod_h
  IMPLICIT NONE; PRIVATE
  PUBLIC calcul_divers

CONTAINS

  SUBROUTINE calcul_divers(itap, itapm1, un_jour)
    ! IM, 26.05.2023
    ! Ne pas modifier les IFs ci-dessous impliquant itapm1,
    ! autrement les resultats seront faux !!

    ! On utilise MOD(itap - itapm1,NINT(mth_len*un_jour/phys_tstep)).EQ.1)
    ! pour detecter le debut de chaque mois lorsque l'on tourne par an.

    ! itap : nombre de pas de temps de la physique
    ! itapm1 : somme du nombre de pas de temps du/des mois precedent/s.
    ! (itap - itapm1) : nombre de pas de temps du mois courant
    USE dimphy, ONLY: klon
    USE phys_state_var_mod, ONLY: phys_tstep, ndayrain_mth, nday_rain, total_rain, rain_fall, snow_fall
    USE phys_local_var_mod, ONLY: t2m_min_mon, t2m_max_mon, zt2m_min_mon, zt2m_max_mon, zt2m
    USE phys_cal_mod, ONLY: mth_len

    IMPLICIT NONE

    INTEGER, INTENT(IN) :: itap
    INTEGER, INTENT(INOUT) :: itapm1
    REAL, INTENT(IN) :: un_jour

    INTEGER :: i

    ! Initialisations itapm1 du premier mois
    IF(itap==1) THEN
      itapm1 = 0
      !        PRINT*,'initialisation itap=1 itapm1 ',itapm1
    ENDIF

    ! Initialisation debut de mois
    IF(itap==itapm1 + 1) THEN
      ndayrain_mth(:) = 0.
      !        PRINT*,'Initialisation ndayrain_mth ',itap
    ENDIF

    ! Initialisation debut de chaque jour
    IF(MOD(itap, NINT(un_jour / phys_tstep))==1) THEN
      nday_rain(:) = 0.
      !       PRINT*,'initialisation mois suivants day_rain itap',itap
    ENDIF

    ! Calcul a chaque pas de temps de la physique
    DO i = 1, klon
      total_rain(i) = rain_fall(i) + snow_fall(i)
      IF(total_rain(i)>0.) nday_rain(i) = 1.
    ENDDO

    ! Cumul en fin de journee
    IF(MOD(itap, NINT(un_jour / phys_tstep))==0) THEN
      DO i = 1, klon
        ndayrain_mth(i) = ndayrain_mth(i) + nday_rain(i)
      ENDDO
    ENDIF

    ! Initialisation fin de mois
    ! Ne pas changer le IF ci-dessous, car le compteur itapm1 est augmente
    ! apres, dans la boucle !!!
    ! IM, 260523
    IF(MOD(itap - itapm1, NINT(mth_len * un_jour / phys_tstep))==0) THEN
      itapm1 = itapm1 + NINT(mth_len * un_jour / phys_tstep)
      !       PRINT*,'fmois i i1 mjt',itap,itapm1,mth_len,un_jour,phys_tstep
    ENDIF

    ! calcul temperatures minimale et maximale moyennees sur le mois

    !initialisation debut de mois pour les fichiers mensuels annuels
    IF(itap==itapm1 + 1) THEN
      t2m_min_mon = 0.
      t2m_max_mon = 0.
    ENDIF

    !initialisation debut de journee pour les fichiers mensuels annuels
    IF(MOD(itap, NINT(un_jour / phys_tstep))==1) THEN
      zt2m_min_mon = zt2m
      zt2m_max_mon = zt2m
    ENDIF

    !calcul sur tous les pas de temps pour les fichiers mensuels annuels
    DO i = 1, klon
      zt2m_min_mon(i) = MIN(zt2m(i), zt2m_min_mon(i))
      zt2m_max_mon(i) = MAX(zt2m(i), zt2m_max_mon(i))
    ENDDO

    !fin journee
    IF(MOD(itap, NINT(un_jour / phys_tstep))==0) THEN
      t2m_min_mon = t2m_min_mon + zt2m_min_mon
      t2m_max_mon = t2m_max_mon + zt2m_max_mon
    ENDIF

    !fin mois
    IF(itap==itapm1) THEN
      t2m_min_mon = t2m_min_mon / mth_len
      t2m_max_mon = t2m_max_mon / mth_len
    ENDIF

  END SUBROUTINE calcul_divers

END MODULE calcul_divers_mod_h