/[lmdze]/trunk/Sources/phylmd/Interface_surf/alboc.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/Interface_surf/alboc.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/phylmd/alboc.f revision 117 by guez, Thu Dec 4 16:48:53 2014 UTC trunk/Sources/phylmd/Interface_surf/alboc.f revision 154 by guez, Tue Jul 7 17:49:23 2015 UTC
# Line 1  Line 1 
1  SUBROUTINE alboc(rjour, rlat, albedo)  module alboc_m
2    ! From LMDZ4/libf/phylmd/albedo.F,v 1.2 2005/02/07 15:00:52  
   USE dimens_m  
   USE dimphy  
   USE yomcst  
   USE orbite_m, ONLY: orbite  
3    IMPLICIT NONE    IMPLICIT NONE
   ! ======================================================================  
   ! Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD)  
   ! Date: le 16 mars 1995  
   ! Objet: Calculer l'albedo sur l'ocean  
   ! Methode: Integrer numeriquement l'albedo pendant une journee  
   
   ! Arguments;  
   ! rjour (in,R)  : jour dans l'annee (a compter du 1 janvier)  
   ! rlat (in,R)   : latitude en degre  
   ! albedo (out,R): albedo obtenu (de 0 a 1)  
   ! ======================================================================  
   
   REAL fmagic ! un facteur magique pour regler l'albedo  
   ! cc      PARAMETER (fmagic=0.7)  
   ! ccIM => a remplacer  
   ! PARAMETER (fmagic=1.32)  
   PARAMETER (fmagic=1.0)  
   ! PARAMETER (fmagic=0.7)  
   INTEGER npts ! il controle la precision de l'integration  
   PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes  
   
   REAL rlat(klon), rjour, albedo(klon)  
   REAL zdist, zlonsun, zpi, zdeclin  
   REAL rmu, alb, srmu, salb, fauxo, aa, bb  
   INTEGER i, k  
   ! ccIM  
   LOGICAL ancien_albedo  
   PARAMETER (ancien_albedo=.FALSE.)  
   ! SAVE albedo  
4    
5    IF (ancien_albedo) THEN  contains
6    
7      zpi = 4.*atan(1.)    SUBROUTINE alboc(jour, rlat, albedo)
8    
9      ! Calculer la longitude vraie de l'orbite terrestre:      ! From LMDZ4/libf/phylmd/albedo.F, version 1.2 2005/02/07 15:00:52
     CALL orbite(rjour, zlonsun, zdist)  
10    
11      ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):      ! Author: Z. X. Li (LMD/CNRS) (adaptation du GCM du LMD)
12      zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))      ! Date : 16 mars 1995
13        ! Objet : Calculer l'alb\'edo sur l'oc\'ean
14        ! M\'ethode: int\'egrer num\'eriquement l'alb\'edo pendant une journ\'ee
15    
16      DO i = 1, klon      use nr_util, only: pi
17        aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)      USE orbite_m, ONLY: orbite
18        bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)      USE yomcst, only: r_incl
19    
20        ! Midi local (angle du temps = 0.0):      integer, intent(in):: jour ! jour dans l'annee (a compter du 1 janvier)
21        rmu = aa + bb*cos(0.0)      REAL, intent(in):: rlat(:) ! latitude en degre
22        rmu = max(0.0, rmu)      real, intent(out):: albedo(:) ! albedo obtenu (de 0 a 1)
       fauxo = (1.47-acos(rmu))/.15  
       alb = 0.03 + 0.630/(1.+fauxo*fauxo)  
       srmu = rmu  
       salb = alb*rmu  
   
       ! Faire l'integration numerique de midi a minuit (le facteur 2  
       ! prend en compte l'autre moitie de la journee):  
       DO k = 1, npts  
         rmu = aa + bb*cos(float(k)/float(npts)*zpi)  
         rmu = max(0.0, rmu)  
         fauxo = (1.47-acos(rmu))/.15  
         alb = 0.03 + 0.630/(1.+fauxo*fauxo)  
         srmu = srmu + rmu*2.0  
         salb = salb + alb*rmu*2.0  
       END DO  
       IF (srmu/=0.0) THEN  
         albedo(i) = salb/srmu*fmagic  
       ELSE ! nuit polaire (on peut prendre une valeur quelconque)  
         albedo(i) = fmagic  
       END IF  
     END DO  
23    
24      ! nouvel albedo      ! Local:
25    
26    ELSE      REAL, PARAMETER:: fmagic=1. ! un facteur magique pour regler l'albedo
27    
28      zpi = 4.*atan(1.)      INTEGER, PARAMETER:: npts =120
29        ! Contr\^ole la pr\'ecision de l'int\'egration. 120 correspond \`a
30        ! l'intervalle 6 minutes.
31    
32        REAL zdist, zlonsun, zdeclin
33        REAL rmu, alb, srmu, salb, aa, bb
34        INTEGER i, k
35    
36        !----------------------------------------------------------------------
37    
38      ! Calculer la longitude vraie de l'orbite terrestre:      ! Calculer la longitude vraie de l'orbite terrestre:
39      CALL orbite(rjour, zlonsun, zdist)      CALL orbite(real(jour), zlonsun, zdist)
40    
41      ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):      ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
42      zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))      zdeclin = asin(sin(zlonsun*pi/180.0)*sin(r_incl*pi/180.0))
43    
44      DO i = 1, klon      DO i = 1, size(rlat)
45        aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)         aa = sin(rlat(i)*pi/180.0)*sin(zdeclin)
46        bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)         bb = cos(rlat(i)*pi/180.0)*cos(zdeclin)
47    
48        ! Midi local (angle du temps = 0.0):         ! Midi local (angle du temps = 0.0):
49        rmu = aa + bb*cos(0.0)         rmu = aa + bb*cos(0.0)
50        rmu = max(0.0, rmu)         rmu = max(0.0, rmu)
51        ! IM cf. PB  alb = 0.058/(rmu + 0.30)         alb = 0.058/(rmu+0.30)*1.2
52        ! alb = 0.058/(rmu + 0.30) * 1.5         srmu = rmu
53        alb = 0.058/(rmu+0.30)*1.2         salb = alb*rmu
54        ! alb = 0.058/(rmu + 0.30) * 1.3  
55        srmu = rmu         ! Faire l'integration numerique de midi a minuit (le facteur 2
56        salb = alb*rmu         ! prend en compte l'autre moitie de la journee):
57           DO k = 1, npts
58        ! Faire l'integration numerique de midi a minuit (le facteur 2            rmu = aa + bb*cos(float(k)/float(npts)*pi)
59        ! prend en compte l'autre moitie de la journee):            rmu = max(0.0, rmu)
60        DO k = 1, npts            alb = 0.058/(rmu+0.30)*1.2
61          rmu = aa + bb*cos(float(k)/float(npts)*zpi)            srmu = srmu + rmu*2.0
62          rmu = max(0.0, rmu)            salb = salb + alb*rmu*2.0
63          ! IM cf. PB      alb = 0.058/(rmu + 0.30)         END DO
64          ! alb = 0.058/(rmu + 0.30) * 1.5         IF (srmu/=0.0) THEN
65          alb = 0.058/(rmu+0.30)*1.2            albedo(i) = salb/srmu*fmagic
66          ! alb = 0.058/(rmu + 0.30) * 1.3         ELSE ! nuit polaire (on peut prendre une valeur quelconque)
67          srmu = srmu + rmu*2.0            albedo(i) = fmagic
68          salb = salb + alb*rmu*2.0         END IF
       END DO  
       IF (srmu/=0.0) THEN  
         albedo(i) = salb/srmu*fmagic  
       ELSE ! nuit polaire (on peut prendre une valeur quelconque)  
         albedo(i) = fmagic  
       END IF  
69      END DO      END DO
70    END IF  
71    RETURN    END SUBROUTINE alboc
72  END SUBROUTINE alboc  
73    end module alboc_m

Legend:
Removed from v.117  
changed lines
  Added in v.154

  ViewVC Help
Powered by ViewVC 1.1.21