!OPTIONS XOPT(NOEVAL)
subroutine frasolu(kidia,kfdia,klon,pgelam,pgemu,&
 & P_ZLON_SO,P_ZLAT_SO,&
 & P_ZLON_LU,P_ZLAT_LU,&
 & P_ZLON_CT,P_ZLAT_CT,&
 & P_ZFSO)  

USE PARKIND1  ,ONLY : JPIM     ,JPRB
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK

IMPLICIT NONE

INTEGER(KIND=JPIM),INTENT(IN)    :: KLON 
INTEGER(KIND=JPIM),INTENT(IN)    :: KIDIA 
INTEGER(KIND=JPIM),INTENT(IN)    :: KFDIA 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGELAM(KLON) 
REAL(KIND=JPRB)   ,INTENT(IN)    :: PGEMU(KLON) 
REAL(KIND=JPRB)                  :: P_ZLON_SO ! Argument NOT used
REAL(KIND=JPRB)                  :: P_ZLAT_SO ! Argument NOT used
REAL(KIND=JPRB)   ,INTENT(IN)    :: P_ZLON_LU 
REAL(KIND=JPRB)   ,INTENT(IN)    :: P_ZLAT_LU 
REAL(KIND=JPRB)   ,INTENT(IN)    :: P_ZLON_CT 
REAL(KIND=JPRB)   ,INTENT(IN)    :: P_ZLAT_CT 
REAL(KIND=JPRB)   ,INTENT(OUT)   :: P_ZFSO(KLON) 
INTEGER(KIND=JPIM) :: jlon

REAL(KIND=JPRB) :: zcondr, zdco, zdist_lu, zdist_so, zlat_co,&
 & zlon_co, znorme, zprod_scal, zrayon_lunaire, &
 & zrayon_solaire, zrayon_terrestre, ztangente, &
 & zthetaco, zxvec_lu_co, zxvec_lu_ct, zxvec_unitaire_lu_co, &
 & zxvec_unitaire_lu_ct, zx_co, zx_ct, zx_lu, &
 & zyvec_lu_co, zyvec_lu_ct, zyvec_unitaire_lu_co, &
 & zyvec_unitaire_lu_ct, zy_co, zy_ct, zy_lu, &
 & zy_pc, zzvec_lu_co, zzvec_lu_ct, zzvec_unitaire_lu_co, &
 & zzvec_unitaire_lu_ct, zz_co, zz_ct, zz_lu  

! --------------------------------------------------------------
! --------------------------------------------------------------
! **** *frasolu* Fraction of solar area seen from a given Earth location.
! **** *frasolu* Fraction of solar area seen from a given Earth location.
! --------------------------------------------------------------
! --------------------------------------------------------------
! Sujet:
! Sujet:
! Arguments explicites:
! Arguments explicites:
! Arguments implicites:
! Arguments implicites:
! Methode:
! Methode:
! Externes:
! Externes:
! Auteur:   1999-07, J.M. Piriou.
! Auteur:   1999-07, J.M. Piriou.
! Modifications:
! Modifications:
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
! --------------------------------------------------------------
! --------------------------------------------------------------
! Input:
! Input:
! pgelam: longitude.
! pgelam: longitude.
! pgemu: sin(latitude).
! pgemu: sin(latitude).
! zlon_ct: longitude of Earth point.
! zlon_ct: longitude of Earth point.
! zlat_ct: latitude of Earth point.
! zlat_ct: latitude of Earth point.
! klon: dimensioning of pgelam, pgemu, zfso.
! klon: dimensioning of pgelam, pgemu, zfso.
! Output:
! Output:
! zfso: fraction of solar area seen from the given Earth location.
! zfso: fraction of solar area seen from the given Earth location.
! --------------------------------------------------------------
! --------------------------------------------------------------

REAL(KIND=JPRB) :: ZHOOK_HANDLE
IF (LHOOK) CALL DR_HOOK('FRASOLU',0,ZHOOK_HANDLE)
zcondr=atan(1.0_JPRB)/45._JPRB
do jlon=kidia,kfdia
  zlon_co=pgelam(jlon)
  zlat_co=asin(pgemu(jlon))
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Calcul de l'angle au centre de la Lune LU
  ! Calcul de l'angle au centre de la Lune LU
  ! entre le point courant CO et le centre de totalité CT,
  ! entre le point courant CO et le centre de totalité CT,
  ! et calcul de la distance d(LU,CO).
  ! et calcul de la distance d(LU,CO).
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Calcul du vecteur unitaire allant de LU à CT.
  ! Calcul du vecteur unitaire allant de LU à CT.
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  !
  !
  ! Coordonnées rectangulaires de LU.
  ! Coordonnées rectangulaires de LU.
  !
  !
  zdist_lu=3.84e8_JPRB ! distance Terre-Lune.
  zx_lu=zdist_lu*cos(P_ZLAT_LU)*cos(P_ZLON_LU)
  zy_lu=zdist_lu*cos(P_ZLAT_LU)*sin(P_ZLON_LU)
  zz_lu=zdist_lu*sin(P_ZLAT_LU)
  !
  !
  ! Coordonnées rectangulaires de CT.
  ! Coordonnées rectangulaires de CT.
  !
  !
  zrayon_terrestre=6371229._JPRB
  zx_ct=zrayon_terrestre*cos(P_ZLAT_CT)*cos(P_ZLON_CT)
  zy_ct=zrayon_terrestre*cos(P_ZLAT_CT)*sin(P_ZLON_CT)
  zz_ct=zrayon_terrestre*sin(P_ZLAT_CT)
  !
  !
  ! Vecteur allant de LU à CT.
  ! Vecteur allant de LU à CT.
  !
  !
  zxvec_lu_ct=zx_ct-zx_lu
  zyvec_lu_ct=zy_ct-zy_lu
  zzvec_lu_ct=zz_ct-zz_lu
  !
  !
  ! Vecteur unitaire allant de LU à CT.
  ! Vecteur unitaire allant de LU à CT.
  !
  !
  znorme=sqrt(zxvec_lu_ct*zxvec_lu_ct+zyvec_lu_ct*zyvec_lu_ct+zzvec_lu_ct* &
   & zzvec_lu_ct)  
  zxvec_unitaire_lu_ct=zxvec_lu_ct/znorme
  zyvec_unitaire_lu_ct=zyvec_lu_ct/znorme
  zzvec_unitaire_lu_ct=zzvec_lu_ct/znorme
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Calcul du vecteur unitaire allant de LU à CO.
  ! Calcul du vecteur unitaire allant de LU à CO.
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  ! Coordonnées rectangulaires de CO.
  ! Coordonnées rectangulaires de CO.
  !
  !
  zx_co=zrayon_terrestre*cos(zlat_co)*cos(zlon_co)
  zy_co=zrayon_terrestre*cos(zlat_co)*sin(zlon_co)
  zz_co=zrayon_terrestre*sin(zlat_co)
  !
  !
  ! Vecteur allant de LU à CO.
  ! Vecteur allant de LU à CO.
  !
  !
  zxvec_lu_co=zx_co-zx_lu
  zyvec_lu_co=zy_co-zy_lu
  zzvec_lu_co=zz_co-zz_lu
  !
  !
  ! Vecteur unitaire allant de LU à CO.
  ! Vecteur unitaire allant de LU à CO.
  !
  !
  znorme=sqrt(zxvec_lu_co*zxvec_lu_co+zyvec_lu_co*zyvec_lu_co+zzvec_lu_co* &
   & zzvec_lu_co)  
  zdco=znorme
  zxvec_unitaire_lu_co=zxvec_lu_co/znorme
  zyvec_unitaire_lu_co=zyvec_lu_co/znorme
  zzvec_unitaire_lu_co=zzvec_lu_co/znorme
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Calcul de l'angle au centre, arccos du produit scalaire des deux
  ! Calcul de l'angle au centre, arccos du produit scalaire des deux
  ! vecteurs unitaires.
  ! vecteurs unitaires.
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  zprod_scal=&
   & zxvec_unitaire_lu_ct*zxvec_unitaire_lu_co &
   & +zyvec_unitaire_lu_ct*zyvec_unitaire_lu_co &
   & +zzvec_unitaire_lu_ct*zzvec_unitaire_lu_co  
  !
  !
  ! Sécurité.
  ! Sécurité.
  !
  !
  !if(abs(zprod_scal) > 1.) then
  !if(abs(zprod_scal) > 1.) then
  !print*,'coluct/ERREUR: zprod_scal=',zprod_scal
  !print*,'coluct/ERREUR: zprod_scal=',zprod_scal
  !stop 'call abort'
  !stop 'call abort'
  !endif
  !endif
  zprod_scal=min(1.0_JPRB,max(-1.0_JPRB,zprod_scal))
  zthetaco=acos(zprod_scal)
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Connaissant l'angle au centre zthetaco
  ! Connaissant l'angle au centre zthetaco
  ! et la distance d(LU,CO) zdco, calcul
  ! et la distance d(LU,CO) zdco, calcul
  ! de la fraction de Soleil vue au lieu CO.
  ! de la fraction de Soleil vue au lieu CO.
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  !
  !
  ! Sécurité.
  ! Sécurité.
  !
  !
  !if(zthetaco > 1.57) then
  !if(zthetaco > 1.57) then
  !print*,'frasovue/ERREUR: zthetaco=',zthetaco
  !print*,'frasovue/ERREUR: zthetaco=',zthetaco
  !stop 'call abort'
  !stop 'call abort'
  !endif
  !endif
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Coordonnées rectangulaires de CO dans le repère
  ! Coordonnées rectangulaires de CO dans le repère
  ! ayant pour centre le centre de la Lune,
  ! ayant pour centre le centre de la Lune,
  ! et pour axe x la droite Soleil -> Lune.
  ! et pour axe x la droite Soleil -> Lune.
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  zx_co=zdco*cos(zthetaco)
  zy_co=zdco*sin(zthetaco)
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Tangente de l'angle theta'co, angle entre CO et
  ! Tangente de l'angle theta'co, angle entre CO et
  ! le bord d'attaque BA de la Lune.
  ! le bord d'attaque BA de la Lune.
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  zrayon_lunaire=1.7374e6_JPRB
  ztangente=(zy_co-zrayon_lunaire)/zx_co
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Ordonnée d'intersection de la droite (CO,BA) avec le disque solaire.
  ! Ordonnée d'intersection de la droite (CO,BA) avec le disque solaire.
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  zdist_so=1.495e11_JPRB ! distance moyenne Soleil-Terre.
  zy_pc=-zdist_so*ztangente
  !
  !
  ! -------------------------------------------------
  ! -------------------------------------------------
  ! Fraction de Soleil vue.
  ! Fraction de Soleil vue.
  ! -------------------------------------------------
  ! -------------------------------------------------
  !
  !
  zrayon_solaire=6.943e8_JPRB
  P_ZFSO(jlon)=max(0.0_JPRB,min(1.0_JPRB,(zrayon_solaire-zy_pc)/(2.0_JPRB* &
   & zrayon_solaire)))  
enddo
IF (LHOOK) CALL DR_HOOK('FRASOLU',1,ZHOOK_HANDLE)
end subroutine frasolu
