/[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/phylmd/Interface_surf/alboc.f revision 125 by guez, Fri Feb 6 15:00:28 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(rjour, 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;      ! rjour (in, R) : 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      REAL rlat(klon), rjour, albedo(klon)
35        REAL zdist, zlonsun, zpi, zdeclin
36    REAL rlat(klon), rjour, albedo(klon)      REAL rmu, alb, srmu, salb, fauxo, aa, bb
37    REAL zdist, zlonsun, zpi, zdeclin      INTEGER i, k
38    REAL rmu, alb, srmu, salb, fauxo, aa, bb      ! ccIM
39    INTEGER i, k      LOGICAL ancien_albedo
40    ! ccIM      PARAMETER (ancien_albedo=.FALSE.)
41    LOGICAL ancien_albedo      ! SAVE albedo
42    PARAMETER (ancien_albedo=.FALSE.)  
43    ! SAVE albedo      IF (ancien_albedo) THEN
44    
45    IF (ancien_albedo) THEN         zpi = 4.*atan(1.)
46    
47      zpi = 4.*atan(1.)         ! Calculer la longitude vraie de l'orbite terrestre:
48           CALL orbite(rjour, zlonsun, zdist)
49      ! Calculer la longitude vraie de l'orbite terrestre:  
50      CALL orbite(rjour, zlonsun, zdist)         ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
51           zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
52      ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):  
53      zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))         DO i = 1, klon
54              aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
55      DO i = 1, klon            bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
56        aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)  
57        bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)            ! Midi local (angle du temps = 0.0):
58              rmu = aa + bb*cos(0.0)
59        ! Midi local (angle du temps = 0.0):            rmu = max(0.0, rmu)
60        rmu = aa + bb*cos(0.0)            fauxo = (1.47-acos(rmu))/.15
61        rmu = max(0.0, rmu)            alb = 0.03 + 0.630/(1.+fauxo*fauxo)
62        fauxo = (1.47-acos(rmu))/.15            srmu = rmu
63        alb = 0.03 + 0.630/(1.+fauxo*fauxo)            salb = alb*rmu
64        srmu = rmu  
65        salb = alb*rmu            ! Faire l'integration numerique de midi a minuit (le facteur 2
66              ! prend en compte l'autre moitie de la journee):
67        ! Faire l'integration numerique de midi a minuit (le facteur 2            DO k = 1, npts
68        ! prend en compte l'autre moitie de la journee):               rmu = aa + bb*cos(float(k)/float(npts)*zpi)
69        DO k = 1, npts               rmu = max(0.0, rmu)
70          rmu = aa + bb*cos(float(k)/float(npts)*zpi)               fauxo = (1.47-acos(rmu))/.15
71          rmu = max(0.0, rmu)               alb = 0.03 + 0.630/(1.+fauxo*fauxo)
72          fauxo = (1.47-acos(rmu))/.15               srmu = srmu + rmu*2.0
73          alb = 0.03 + 0.630/(1.+fauxo*fauxo)               salb = salb + alb*rmu*2.0
74          srmu = srmu + rmu*2.0            END DO
75          salb = salb + alb*rmu*2.0            IF (srmu/=0.0) THEN
76        END DO               albedo(i) = salb/srmu*fmagic
77        IF (srmu/=0.0) THEN            ELSE ! nuit polaire (on peut prendre une valeur quelconque)
78          albedo(i) = salb/srmu*fmagic               albedo(i) = fmagic
79        ELSE ! nuit polaire (on peut prendre une valeur quelconque)            END IF
80          albedo(i) = fmagic         END DO
81        END IF  
82      END DO         ! nouvel albedo
83    
84      ! nouvel albedo      ELSE
85    
86    ELSE         zpi = 4.*atan(1.)
87    
88      zpi = 4.*atan(1.)         ! Calculer la longitude vraie de l'orbite terrestre:
89           CALL orbite(rjour, zlonsun, zdist)
90      ! Calculer la longitude vraie de l'orbite terrestre:  
91      CALL orbite(rjour, zlonsun, zdist)         ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):
92           zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))
93      ! Calculer la declinaison du soleil (qui varie entre + et - R_incl):  
94      zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0))         DO i = 1, klon
95              aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)
96      DO i = 1, klon            bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)
97        aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin)  
98        bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin)            ! Midi local (angle du temps = 0.0):
99              rmu = aa + bb*cos(0.0)
100        ! Midi local (angle du temps = 0.0):            rmu = max(0.0, rmu)
101        rmu = aa + bb*cos(0.0)            ! IM cf. PB alb = 0.058/(rmu + 0.30)
102        rmu = max(0.0, rmu)            ! alb = 0.058/(rmu + 0.30) * 1.5
103        ! IM cf. PB  alb = 0.058/(rmu + 0.30)            alb = 0.058/(rmu+0.30)*1.2
104        ! alb = 0.058/(rmu + 0.30) * 1.5            ! alb = 0.058/(rmu + 0.30) * 1.3
105        alb = 0.058/(rmu+0.30)*1.2            srmu = rmu
106        ! alb = 0.058/(rmu + 0.30) * 1.3            salb = alb*rmu
107        srmu = rmu  
108        salb = alb*rmu            ! Faire l'integration numerique de midi a minuit (le facteur 2
109              ! prend en compte l'autre moitie de la journee):
110        ! Faire l'integration numerique de midi a minuit (le facteur 2            DO k = 1, npts
111        ! prend en compte l'autre moitie de la journee):               rmu = aa + bb*cos(float(k)/float(npts)*zpi)
112        DO k = 1, npts               rmu = max(0.0, rmu)
113          rmu = aa + bb*cos(float(k)/float(npts)*zpi)               ! IM cf. PB alb = 0.058/(rmu + 0.30)
114          rmu = max(0.0, rmu)               ! alb = 0.058/(rmu + 0.30) * 1.5
115          ! IM cf. PB      alb = 0.058/(rmu + 0.30)               alb = 0.058/(rmu+0.30)*1.2
116          ! alb = 0.058/(rmu + 0.30) * 1.5               ! alb = 0.058/(rmu + 0.30) * 1.3
117          alb = 0.058/(rmu+0.30)*1.2               srmu = srmu + rmu*2.0
118          ! alb = 0.058/(rmu + 0.30) * 1.3               salb = salb + alb*rmu*2.0
119          srmu = srmu + rmu*2.0            END DO
120          salb = salb + alb*rmu*2.0            IF (srmu/=0.0) THEN
121        END DO               albedo(i) = salb/srmu*fmagic
122        IF (srmu/=0.0) THEN            ELSE ! nuit polaire (on peut prendre une valeur quelconque)
123          albedo(i) = salb/srmu*fmagic               albedo(i) = fmagic
124        ELSE ! nuit polaire (on peut prendre une valeur quelconque)            END IF
125          albedo(i) = fmagic         END DO
126        END IF      END IF
127      END DO  
128    END IF    END SUBROUTINE alboc
129    RETURN  
130  END SUBROUTINE alboc  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.125

  ViewVC Help
Powered by ViewVC 1.1.21