!
! $Id: sortvarc.f90 5285 2024-10-28 13:33:29Z abarral $
!
SUBROUTINE sortvarc &
        (itau,ucov,teta,ps,masse,pk,phis,vorpot,phi,bern,dp,time , &
        vcov )

  USE iniprint_mod_h
  USE comgeom_mod_h
  USE control_mod, ONLY: resetvarc
  USE comconst_mod, ONLY: dtvr, daysec, g, rad, omeg
  USE logic_mod, ONLY: read_start
  USE ener_mod, ONLY: etot,ptot,ztot,stot,ang, &
        etot0,ptot0,ztot0,stot0,ang0, &
        rmsdpdt,rmsv
  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
USE paramet_mod_h
IMPLICIT NONE


  !=======================================================================
  !
  !   Auteur:    P. Le Van
  !   -------
  !
  !   Objet:
  !   ------
  !
  !   sortie des variables de controle
  !
  !=======================================================================
  !-----------------------------------------------------------------------
  !   Declarations:
  !   -------------




  !   Arguments:
  !   ----------

  INTEGER,INTENT(IN) :: itau
  REAL,INTENT(IN) :: ucov(ip1jmp1,llm)
  REAL,INTENT(IN) :: teta(ip1jmp1,llm)
  REAL,INTENT(IN) :: masse(ip1jmp1,llm)
  REAL,INTENT(IN) :: vcov(ip1jm,llm)
  REAL,INTENT(IN) :: ps(ip1jmp1)
  REAL,INTENT(IN) :: phis(ip1jmp1)
  REAL,INTENT(IN) :: vorpot(ip1jm,llm)
  REAL,INTENT(IN) :: phi(ip1jmp1,llm)
  REAL,INTENT(IN) :: bern(ip1jmp1,llm)
  REAL,INTENT(IN) :: dp(ip1jmp1)
  REAL,INTENT(IN) :: time
  REAL,INTENT(IN) :: pk(ip1jmp1,llm)

  !   Local:
  !   ------

  REAL :: vor(ip1jm),bernf(ip1jmp1,llm),ztotl(llm)
  REAL :: etotl(llm),stotl(llm),rmsvl(llm),angl(llm),ge(ip1jmp1)
  REAL :: cosphi(ip1jm),omegcosp(ip1jm)
  REAL :: dtvrs1j,rjour,heure,radsg,radomeg
  REAL :: massebxy(ip1jm,llm)
  INTEGER :: l, ij, imjmp1

  REAL :: SSUM
  LOGICAL,SAVE :: firstcal=.true.
  CHARACTER(LEN=*),PARAMETER :: modname="sortvarc"

  !-----------------------------------------------------------------------
  ! Ehouarn: when no initialization fields from file, resetvarc should be
       ! set to false
   if (firstcal) then
     if (.not.read_start) then
       resetvarc=.true.
     endif
   endif

   dtvrs1j   = dtvr/daysec
   rjour     = REAL( INT( itau * dtvrs1j ))
   heure     = ( itau*dtvrs1j-rjour ) * 24.
   imjmp1    = iim * jjp1
   IF(ABS(heure - 24.).LE.0.0001 ) heure = 0.
  !
   CALL massbarxy ( masse, massebxy )

  !   .....  Calcul  de  rmsdpdt  .....

   ge(:)=dp(:)*dp(:)

   rmsdpdt = SSUM(ip1jmp1,ge,1) - SSUM(jjp1,ge,iip1)
  !
   rmsdpdt = daysec* 1.e-2 * SQRT(rmsdpdt/imjmp1)

   CALL SCOPY( ijp1llm,bern,1,bernf,1 )
   CALL filtreg(bernf,jjp1,llm,-2,2,.TRUE.,1)

  !   .....  Calcul du moment  angulaire   .....

   radsg    = rad /g
   radomeg  = rad * omeg
  !
   DO ij=iip2,ip1jm
      cosphi( ij ) = COS(rlatu((ij-1)/iip1+1))
      omegcosp(ij) = radomeg   * cosphi(ij)
   ENDDO

  !  ...  Calcul  de l'energie,de l'enstrophie,de l'entropie et de rmsv  .

   DO l=1,llm
      DO ij = 1,ip1jm
         vor(ij)=vorpot(ij,l)*vorpot(ij,l)*massebxy(ij,l)
      ENDDO
      ztotl(l)=(SSUM(ip1jm,vor,1)-SSUM(jjm,vor,iip1))

      DO ij = 1,ip1jmp1
         ge(ij)= masse(ij,l)*(phis(ij)+teta(ij,l)*pk(ij,l)  + &
               bernf(ij,l)-phi(ij,l))
      ENDDO
      etotl(l) = SSUM(ip1jmp1,ge,1) - SSUM(jjp1,ge,iip1)

      DO   ij   = 1, ip1jmp1
         ge(ij) = masse(ij,l)*teta(ij,l)
      ENDDO
      stotl(l)= SSUM(ip1jmp1,ge,1) - SSUM(jjp1,ge,iip1)

      DO ij=1,ip1jmp1
         ge(ij)=masse(ij,l)*AMAX1(bernf(ij,l)-phi(ij,l),0.)
      ENDDO
      rmsvl(l)=2.*(SSUM(ip1jmp1,ge,1)-SSUM(jjp1,ge,iip1))

      DO ij =iip2,ip1jm
         ge(ij)=(ucov(ij,l)/cu(ij)+omegcosp(ij))*masse(ij,l) * &
               cosphi(ij)
      ENDDO
      angl(l) = rad * &
            (SSUM(ip1jm-iip1,ge(iip2),1)-SSUM(jjm-1,ge(iip2),iip1))
  ENDDO

      DO ij=1,ip1jmp1
        ge(ij)= ps(ij)*aire(ij)
      ENDDO
  ptot  = SSUM(ip1jmp1,ge,1)-SSUM(jjp1,ge,iip1)
  etot  = SSUM(     llm, etotl, 1 )
  ztot  = SSUM(     llm, ztotl, 1 )
  stot  = SSUM(     llm, stotl, 1 )
  rmsv  = SSUM(     llm, rmsvl, 1 )
  ang   = SSUM(     llm,  angl, 1 )

  IF (firstcal.and.resetvarc) then
     WRITE(lunout,3500) itau, rjour, heure, time
     WRITE(lunout,*) trim(modname), &
           ' WARNING!!! Recomputing initial values of : '
     WRITE(lunout,*) 'ptot,rmsdpdt,etot,ztot,stot,rmsv,ang'
     WRITE(lunout,*) ptot,rmsdpdt,etot,ztot,stot,rmsv,ang
     etot0 = etot
     ptot0 = ptot
     ztot0 = ztot
     stot0 = stot
     ang0  = ang
  END IF

  ! ! compute relative changes in etot,... (except if 'reference' values
  ! ! are zero, which can happen when using iniacademic)
  if (etot0.ne.0) then
    etot= etot/etot0
  else
    etot=1.
  endif
  rmsv= SQRT(rmsv/ptot)
  if (ptot0.ne.0) then
    ptot= ptot/ptot0
  else
    ptot=1.
  endif
  if (ztot0.ne.0) then
    ztot= ztot/ztot0
  else
    ztot=1.
  endif
  if (stot0.ne.0) then
    stot= stot/stot0
  else
    stot=1.
  endif
  if (ang0.ne.0) then
    ang = ang /ang0
  else
    ang=1.
  endif

  firstcal = .false.

  WRITE(lunout,3500) itau, rjour, heure, time
  WRITE(lunout,4000) ptot,rmsdpdt,etot,ztot,stot,rmsv,ang

3500   FORMAT(10("*"),4x,'pas',i7,5x,'jour',f9.0,'heure',f5.1,4x &
             ,'date',f14.4,4x,10("*"))
4000   FORMAT(10x,'masse',4x,'rmsdpdt',7x,'energie',2x,'enstrophie' &
             ,2x,'entropie',3x,'rmsv',4x,'mt.ang',/,'GLOB  ' &
             ,f10.6,e13.6,5f10.3/ &
             )
END SUBROUTINE sortvarc

