
! $Header: /home/cvsroot/LMDZ4/libf/phylmd/geo2atm.F90,v 1.1 2008-12-05 17:56:40 lsce Exp $

SUBROUTINE geo2atm(im, jm, px, py, pz, plon, plat, pu, pv, pr)
  USE dimphy
  USE mod_phys_lmdz_para
  USE mod_grid_phy_lmdz, only: grid_type, unstructured, regular_lonlat
  IMPLICIT NONE
  INCLUDE 'YOMCST.h'
  CHARACTER (len = 6)                :: clmodnam
  CHARACTER (len = 20)               :: modname = 'geo2atm'
  CHARACTER (len = 80)               :: abort_message

! Change wind coordinates from cartesian geocentric to local spherical
! NB! Fonctionne probablement uniquement en MPI seul (sans OpenMP)

! Geocentric :
  ! axe x is eastward : crosses (0N,90E) point.
  ! axe y  crosses (0N,180E) point.
  ! axe z is 'up' : crosses north pole.

! NB! Aux poles, fonctionne probablement uniquement en MPI seul (sans OpenMP)

  INTEGER, INTENT (IN)                 :: im, jm
  REAL, DIMENSION (im,jm), INTENT(IN)  :: px, py, pz
  REAL, DIMENSION (im,jm), INTENT(IN)  :: plon, plat
  REAL, DIMENSION (im,jm), INTENT(OUT) :: pu, pv, pr

  REAL :: rad,reps


  rad = rpi / 180.0E0
  reps = 1.0e-5

  pu(:,:) = &
       - px(:,:) * SIN(rad * plon(:,:)) &
       + py(:,:) * COS(rad * plon(:,:))

  pv(:,:) = &
       - px(:,:) * SIN(rad * plat(:,:)) * COS(rad * plon(:,:)) &
       - py(:,:) * SIN(rad * plat(:,:)) * SIN(rad * plon(:,:)) &
       + pz(:,:) * COS(rad * plat(:,:))  

  pr(:,:) = &
       + px(:,:) * COS(rad * plat(:,:)) * COS(rad * plon(:,:)) &
       + py(:,:) * COS(rad * plat(:,:)) * SIN(rad * plon(:,:)) &
       + pz(:,:) * SIN(rad * plat(:,:))

  IF (grid_type==regular_lonlat) THEN
    ! Value at North Pole
    IF (is_north_pole_dyn) THEN
       pu(:, 1) = -px (1,1)
       pv(:, 1) = -py (1,1)
       pr(:, 1) = 0.0
    ENDIF
  
    ! Value at South Pole     
    IF (is_south_pole_dyn) THEN
       pu(:,jm) = -px (1,jm)
       pv(:,jm) = -py (1,jm)
       pr(:,jm) = 0.0
    ENDIF

  ELSE IF (grid_type==unstructured) THEN
     ! Pole nord pour Dynamico
     WHERE ( plat(:,:) >= 90.0-reps )
        pu(:,:) =  py(:,:)
        pv(:,:) = -px(:,:)
        pr(:,:) = 0.0e0
     END WHERE

  ELSE
     abort_message='Problem: unknown grid type'
     CALL abort_physic(modname,abort_message,1)
  END IF

  
  
  
END SUBROUTINE geo2atm
