/[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/albedo.f revision 82 by guez, Wed Mar 5 14:57:53 2014 UTC trunk/Sources/phylmd/Interface_surf/alboc.f revision 134 by guez, Wed Apr 29 15:47:56 2015 UTC
# Line 1  Line 1 
1    module alboc_m
2    
3  ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/albedo.F,v 1.2 2005/02/07 15:00:52    IMPLICIT NONE
 ! fairhead Exp $  
4    
5    contains
6    
7      SUBROUTINE alboc(jour, rlat, albedo)
8    
9  SUBROUTINE alboc(rjour, rlat, albedo)      ! From LMDZ4/libf/phylmd/albedo.F, version 1.2 2005/02/07 15:00:52
10    USE dimens_m  
11    USE dimphy      ! Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD)
12    USE yomcst      ! Date: le 16 mars 1995
13    USE orbite_m, ONLY: orbite      ! Objet: Calculer l'albedo sur l'ocean
14    IMPLICIT NONE      ! Methode: Integrer numeriquement l'albedo pendant une journee
15    ! ======================================================================  
16    ! Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD)      USE dimphy, only: klon
17    ! Date: le 16 mars 1995      USE yomcst, only: r_incl
18    ! Objet: Calculer l'albedo sur l'ocean      USE orbite_m, ONLY: orbite
19    ! Methode: Integrer numeriquement l'albedo pendant une journee  
20        ! Arguments;
21    ! Arguments;      ! jour (in) : jour dans l'annee (a compter du 1 janvier)
22    ! rjour (in,R)  : jour dans l'annee (a compter du 1 janvier)      ! rlat (in, R) : latitude en degre
23    ! rlat (in,R)   : latitude en degre      ! albedo (out, R): albedo obtenu (de 0 a 1)
24    ! albedo (out,R): albedo obtenu (de 0 a 1)  
25    ! ======================================================================      REAL fmagic ! un facteur magique pour regler l'albedo
26        ! cc PARAMETER (fmagic=0.7)
27    REAL fmagic ! un facteur magique pour regler l'albedo      ! ccIM => a remplacer
28    ! cc      PARAMETER (fmagic=0.7)      ! PARAMETER (fmagic=1.32)
29    ! ccIM => a remplacer      PARAMETER (fmagic=1.0)
30    ! PARAMETER (fmagic=1.32)      ! PARAMETER (fmagic=0.7)
31    PARAMETER (fmagic=1.0)      INTEGER npts ! il controle la precision de l'integration
32    ! PARAMETER (fmagic=0.7)      PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes
33    INTEGER npts ! il controle la precision de l'integration  
34    PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes      integer jour
35        REAL rlat(klon), albedo(klon)
36    REAL rlat(klon), rjour, albedo(klon)      REAL zdist, zlonsun, zpi, zdeclin
37    REAL zdist, zlonsun, zpi, zdeclin      REAL rmu, alb, srmu, salb, fauxo, aa, bb
38    REAL rmu, alb, srmu, salb, fauxo, aa, bb      INTEGER i, k
39    INTEGER i, k      ! ccIM
40    ! ccIM      LOGICAL ancien_albedo
41    LOGICAL ancien_albedo      PARAMETER (ancien_albedo=.FALSE.)
42    PARAMETER (ancien_albedo=.FALSE.)      ! SAVE albedo
43    ! SAVE albedo  
44        IF (ancien_albedo) THEN
45    IF (ancien_albedo) THEN  
46           zpi = 4.*atan(1.)
47      zpi = 4.*atan(1.)  
48           ! Calculer la longitude vraie de l'orbite terrestre:
49      ! Calculer la longitude vraie de l'orbite terrestre:         CALL orbite(real(jour), zlonsun, zdist)
50      CALL orbite(rjour, zlonsun, zdist)  
51           ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
52      ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):         zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
53      zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))  
54           DO i = 1, klon
55      DO i = 1, klon            aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
56        aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)            bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
57        bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)  
58              ! Midi local (angle du temps = 0.0):
59        ! Midi local (angle du temps = 0.0):            rmu = aa + bb*cos(0.0)
60        rmu = aa + bb*cos(0.0)            rmu = max(0.0, rmu)
61        rmu = max(0.0, rmu)            fauxo = (1.47-acos(rmu))/.15
62        fauxo = (1.47-acos(rmu))/.15            alb = 0.03 + 0.630/(1.+fauxo*fauxo)
63        alb = 0.03 + 0.630/(1.+fauxo*fauxo)            srmu = rmu
64        srmu = rmu            salb = alb*rmu
65        salb = alb*rmu  
66              ! Faire l'integration numerique de midi a minuit (le facteur 2
67        ! Faire l'integration numerique de midi a minuit (le facteur 2            ! prend en compte l'autre moitie de la journee):
68        ! prend en compte l'autre moitie de la journee):            DO k = 1, npts
69        DO k = 1, npts               rmu = aa + bb*cos(float(k)/float(npts)*zpi)
70          rmu = aa + bb*cos(float(k)/float(npts)*zpi)               rmu = max(0.0, rmu)
71          rmu = max(0.0, rmu)               fauxo = (1.47-acos(rmu))/.15
72          fauxo = (1.47-acos(rmu))/.15               alb = 0.03 + 0.630/(1.+fauxo*fauxo)
73          alb = 0.03 + 0.630/(1.+fauxo*fauxo)               srmu = srmu + rmu*2.0
74          srmu = srmu + rmu*2.0               salb = salb + alb*rmu*2.0
75          salb = salb + alb*rmu*2.0            END DO
76        END DO            IF (srmu/=0.0) THEN
77        IF (srmu/=0.0) THEN               albedo(i) = salb/srmu*fmagic
78          albedo(i) = salb/srmu*fmagic            ELSE ! nuit polaire (on peut prendre une valeur quelconque)
79        ELSE ! nuit polaire (on peut prendre une valeur quelconque)               albedo(i) = fmagic
80          albedo(i) = fmagic            END IF
81        END IF         END DO
82      END DO  
83           ! nouvel albedo
84      ! nouvel albedo  
85        ELSE
86    ELSE  
87           zpi = 4.*atan(1.)
88      zpi = 4.*atan(1.)  
89           ! Calculer la longitude vraie de l'orbite terrestre:
90      ! Calculer la longitude vraie de l'orbite terrestre:         CALL orbite(real(jour), zlonsun, zdist)
91      CALL orbite(rjour, zlonsun, zdist)  
92           ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
93      ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):         zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
94      zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))  
95           DO i = 1, klon
96      DO i = 1, klon            aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
97        aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)            bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
98        bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)  
99              ! Midi local (angle du temps = 0.0):
100        ! Midi local (angle du temps = 0.0):            rmu = aa + bb*cos(0.0)
101        rmu = aa + bb*cos(0.0)            rmu = max(0.0, rmu)
102        rmu = max(0.0, rmu)            ! IM cf. PB alb = 0.058/(rmu + 0.30)
103        ! IM cf. PB  alb = 0.058/(rmu + 0.30)            ! alb = 0.058/(rmu + 0.30) * 1.5
104        ! alb = 0.058/(rmu + 0.30) * 1.5            alb = 0.058/(rmu+0.30)*1.2
105        alb = 0.058/(rmu+0.30)*1.2            ! alb = 0.058/(rmu + 0.30) * 1.3
106        ! alb = 0.058/(rmu + 0.30) * 1.3            srmu = rmu
107        srmu = rmu            salb = alb*rmu
108        salb = alb*rmu  
109              ! Faire l'integration numerique de midi a minuit (le facteur 2
110        ! Faire l'integration numerique de midi a minuit (le facteur 2            ! prend en compte l'autre moitie de la journee):
111        ! prend en compte l'autre moitie de la journee):            DO k = 1, npts
112        DO k = 1, npts               rmu = aa + bb*cos(float(k)/float(npts)*zpi)
113          rmu = aa + bb*cos(float(k)/float(npts)*zpi)               rmu = max(0.0, rmu)
114          rmu = max(0.0, rmu)               ! IM cf. PB alb = 0.058/(rmu + 0.30)
115          ! IM cf. PB      alb = 0.058/(rmu + 0.30)               ! alb = 0.058/(rmu + 0.30) * 1.5
116          ! alb = 0.058/(rmu + 0.30) * 1.5               alb = 0.058/(rmu+0.30)*1.2
117          alb = 0.058/(rmu+0.30)*1.2               ! alb = 0.058/(rmu + 0.30) * 1.3
118          ! alb = 0.058/(rmu + 0.30) * 1.3               srmu = srmu + rmu*2.0
119          srmu = srmu + rmu*2.0               salb = salb + alb*rmu*2.0
120          salb = salb + alb*rmu*2.0            END DO
121        END DO            IF (srmu/=0.0) THEN
122        IF (srmu/=0.0) THEN               albedo(i) = salb/srmu*fmagic
123          albedo(i) = salb/srmu*fmagic            ELSE ! nuit polaire (on peut prendre une valeur quelconque)
124        ELSE ! nuit polaire (on peut prendre une valeur quelconque)               albedo(i) = fmagic
125          albedo(i) = fmagic            END IF
126        END IF         END DO
127      END DO      END IF
128    END IF  
129    RETURN    END SUBROUTINE alboc
130  END SUBROUTINE alboc  
131  ! =====================================================================  end module alboc_m
 SUBROUTINE alboc_cd(rmu0, albedo)  
   USE dimens_m  
   USE dimphy  
   IMPLICIT NONE  
   ! ======================================================================  
   ! Auteur(s): Z.X. Li (LMD/CNRS)  
   ! date: 19940624  
   ! Calculer l'albedo sur l'ocean en fonction de l'angle zenithal moyen  
   ! Formule due a Larson and Barkstrom (1977) Proc. of the symposium  
   ! on radiation in the atmosphere, 19-28 August 1976, science Press,  
   ! 1977 pp 451-453, ou These de 3eme cycle de Sylvie Joussaume.  
   
   ! Arguments  
   ! rmu0    (in): cosinus de l'angle solaire zenithal  
   ! albedo (out): albedo de surface de l'ocean  
   ! ======================================================================  
   REAL rmu0(klon), albedo(klon)  
   
   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)  
   
   REAL fauxo  
   INTEGER i  
   ! ccIM  
   LOGICAL ancien_albedo  
   PARAMETER (ancien_albedo=.FALSE.)  
   ! SAVE albedo  
   
   IF (ancien_albedo) THEN  
   
     DO i = 1, klon  
   
       rmu0(i) = max(rmu0(i), 0.0)  
   
       fauxo = (1.47-acos(rmu0(i)))/0.15  
       albedo(i) = fmagic*(.03+.630/(1.+fauxo*fauxo))  
       albedo(i) = max(min(albedo(i),0.60), 0.04)  
     END DO  
   
     ! nouvel albedo  
   
   ELSE  
   
     DO i = 1, klon  
       rmu0(i) = max(rmu0(i), 0.0)  
       ! IM:orig albedo(i) = 0.058/(rmu0(i) + 0.30)  
       albedo(i) = fmagic*0.058/(rmu0(i)+0.30)  
       albedo(i) = max(min(albedo(i),0.60), 0.04)  
     END DO  
   
   END IF  
   
   RETURN  
 END SUBROUTINE alboc_cd  
 ! ========================================================================  

Legend:
Removed from v.82  
changed lines
  Added in v.134

  ViewVC Help
Powered by ViewVC 1.1.21