Changeset 2408 for LMDZ5/branches/testing/libf/phylmd/albedo.F90
- Timestamp:
- Dec 14, 2015, 11:43:09 AM (9 years ago)
- Location:
- LMDZ5/branches/testing
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/branches/testing
- Property svn:mergeinfo changed
/LMDZ5/trunk merged: 2293-2295,2297,2299-2302,2305-2313,2315,2317-2380,2382-2396
- Property svn:mergeinfo changed
-
LMDZ5/branches/testing/libf/phylmd/albedo.F90
r1999 r2408 1 ! $Id$ 2 module albedo 1 3 2 ! $Id$ 4 IMPLICIT NONE 3 5 6 contains 4 7 8 SUBROUTINE alboc(rjour, rlat, albedo) 9 USE dimphy 10 ! ====================================================================== 11 ! Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD) 12 ! Date: le 16 mars 1995 13 ! Objet: Calculer l'albedo sur l'ocean 14 ! Methode: Integrer numeriquement l'albedo pendant une journee 5 15 6 SUBROUTINE alboc(rjour, rlat, albedo) 7 USE dimphy 8 IMPLICIT NONE 9 ! ====================================================================== 10 ! Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD) 11 ! Date: le 16 mars 1995 12 ! Objet: Calculer l'albedo sur l'ocean 13 ! Methode: Integrer numeriquement l'albedo pendant une journee 16 ! Arguments; 17 ! rjour (in,R) : jour dans l'annee (a compter du 1 janvier) 18 ! rlat (in,R) : latitude en degre 19 ! albedo (out,R): albedo obtenu (de 0 a 1) 20 ! ====================================================================== 21 include "YOMCST.h" 22 include "clesphys.h" 14 23 15 ! Arguments;16 ! rjour (in,R) : jour dans l'annee (a compter du 1 janvier)17 ! rlat (in,R) : latitude en degre18 ! albedo (out,R): albedo obtenu (de 0 a 1)19 ! ======================================================================20 ! ym#include "dimensions.h"21 ! ym#include "dimphy.h"22 include "YOMCST.h"23 include "clesphys.h"24 ! fmagic -> clesphys.h/.inc 25 ! REAL fmagic ! un facteur magique pour regler l'albedo 26 ! cc PARAMETER (fmagic=0.7) 27 ! ccIM => a remplacer 28 ! PARAMETER (fmagic=1.32) 29 ! PARAMETER (fmagic=1.0) 30 ! PARAMETER (fmagic=0.7) 31 INTEGER npts ! il controle la precision de l'integration 32 PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes 24 33 25 ! fmagic -> clesphys.h/.inc 26 ! REAL fmagic ! un facteur magique pour regler l'albedo 27 ! cc PARAMETER (fmagic=0.7) 28 ! ccIM => a remplacer 29 ! PARAMETER (fmagic=1.32) 30 ! PARAMETER (fmagic=1.0) 31 ! PARAMETER (fmagic=0.7) 32 INTEGER npts ! il controle la precision de l'integration 33 PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes 34 REAL rlat(klon), rjour, albedo(klon) 35 REAL zdist, zlonsun, zpi, zdeclin 36 REAL rmu, alb, srmu, salb, fauxo, aa, bb 37 INTEGER i, k 38 ! ccIM 39 LOGICAL ancien_albedo 40 PARAMETER (ancien_albedo=.FALSE.) 41 ! SAVE albedo 34 42 35 REAL rlat(klon), rjour, albedo(klon) 36 REAL zdist, zlonsun, zpi, zdeclin 37 REAL rmu, alb, srmu, salb, fauxo, aa, bb 38 INTEGER i, k 39 ! ccIM 40 LOGICAL ancien_albedo 41 PARAMETER (ancien_albedo=.FALSE.) 42 ! SAVE albedo 43 IF (ancien_albedo) THEN 43 44 44 IF (ancien_albedo) THEN45 zpi = 4.*atan(1.) 45 46 46 zpi = 4.*atan(1.) 47 ! Calculer la longitude vraie de l'orbite terrestre: 48 CALL orbite(rjour, zlonsun, zdist) 47 49 48 ! Calculer la longitude vraie de l'orbite terrestre:49 CALL orbite(rjour, zlonsun, zdist)50 ! 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)) 50 52 51 ! Calculer la declinaison du soleil (qui varie entre + et - R_incl): 52 zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0)) 53 DO i = 1, klon 54 aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin) 55 bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin) 53 56 54 DO i = 1, klon 55 aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin) 56 bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin) 57 ! Midi local (angle du temps = 0.0): 58 rmu = aa + bb*cos(0.0) 59 rmu = max(0.0, rmu) 60 fauxo = (1.47-acos(rmu))/.15 61 alb = 0.03 + 0.630/(1.+fauxo*fauxo) 62 srmu = rmu 63 salb = alb*rmu 57 64 58 ! Midi local (angle du temps = 0.0): 59 rmu = aa + bb*cos(0.0) 60 rmu = max(0.0, rmu) 61 fauxo = (1.47-acos(rmu))/.15 62 alb = 0.03 + 0.630/(1.+fauxo*fauxo) 63 srmu = rmu 64 salb = alb*rmu 65 ! Faire l'integration numerique de midi a minuit (le facteur 2 66 ! prend en compte l'autre moitie de la journee): 67 DO k = 1, npts 68 rmu = aa + bb*cos(real(k)/real(npts)*zpi) 69 rmu = max(0.0, rmu) 70 fauxo = (1.47-acos(rmu))/.15 71 alb = 0.03 + 0.630/(1.+fauxo*fauxo) 72 srmu = srmu + rmu*2.0 73 salb = salb + alb*rmu*2.0 74 END DO 75 IF (srmu/=0.0) THEN 76 albedo(i) = salb/srmu*fmagic + pmagic 77 ELSE ! nuit polaire (on peut prendre une valeur quelconque) 78 albedo(i) = fmagic 79 END IF 80 END DO 65 81 66 ! Faire l'integration numerique de midi a minuit (le facteur 2 67 ! prend en compte l'autre moitie de la journee): 68 DO k = 1, npts 69 rmu = aa + bb*cos(real(k)/real(npts)*zpi) 70 rmu = max(0.0, rmu) 71 fauxo = (1.47-acos(rmu))/.15 72 alb = 0.03 + 0.630/(1.+fauxo*fauxo) 73 srmu = srmu + rmu*2.0 74 salb = salb + alb*rmu*2.0 75 END DO 76 IF (srmu/=0.0) THEN 77 albedo(i) = salb/srmu*fmagic + pmagic 78 ELSE ! nuit polaire (on peut prendre une valeur quelconque) 79 albedo(i) = fmagic 80 END IF 81 END DO 82 ! nouvel albedo 82 83 83 ! nouvel albedo84 ELSE 84 85 85 ELSE86 zpi = 4.*atan(1.) 86 87 87 zpi = 4.*atan(1.) 88 ! Calculer la longitude vraie de l'orbite terrestre: 89 CALL orbite(rjour, zlonsun, zdist) 88 90 89 ! Calculer la longitude vraie de l'orbite terrestre:90 CALL orbite(rjour, zlonsun, zdist)91 ! 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)) 91 93 92 ! Calculer la declinaison du soleil (qui varie entre + et - R_incl): 93 zdeclin = asin(sin(zlonsun*zpi/180.0)*sin(r_incl*zpi/180.0)) 94 DO i = 1, klon 95 aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin) 96 bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin) 94 97 95 DO i = 1, klon 96 aa = sin(rlat(i)*zpi/180.0)*sin(zdeclin) 97 bb = cos(rlat(i)*zpi/180.0)*cos(zdeclin) 98 ! Midi local (angle du temps = 0.0): 99 rmu = aa + bb*cos(0.0) 100 rmu = max(0.0, rmu) 101 ! IM cf. PB alb = 0.058/(rmu + 0.30) 102 ! alb = 0.058/(rmu + 0.30) * 1.5 103 alb = 0.058/(rmu+0.30)*1.2 104 ! alb = 0.058/(rmu + 0.30) * 1.3 105 srmu = rmu 106 salb = alb*rmu 98 107 99 ! Midi local (angle du temps = 0.0): 100 rmu = aa + bb*cos(0.0) 101 rmu = max(0.0, rmu) 102 ! IM cf. PB alb = 0.058/(rmu + 0.30) 103 ! alb = 0.058/(rmu + 0.30) * 1.5 104 alb = 0.058/(rmu+0.30)*1.2 105 ! alb = 0.058/(rmu + 0.30) * 1.3 106 srmu = rmu 107 salb = alb*rmu 108 ! Faire l'integration numerique de midi a minuit (le facteur 2 109 ! prend en compte l'autre moitie de la journee): 110 DO k = 1, npts 111 rmu = aa + bb*cos(real(k)/real(npts)*zpi) 112 rmu = max(0.0, rmu) 113 ! IM cf. PB alb = 0.058/(rmu + 0.30) 114 ! alb = 0.058/(rmu + 0.30) * 1.5 115 alb = 0.058/(rmu+0.30)*1.2 116 ! alb = 0.058/(rmu + 0.30) * 1.3 117 srmu = srmu + rmu*2.0 118 salb = salb + alb*rmu*2.0 119 END DO 120 IF (srmu/=0.0) THEN 121 albedo(i) = salb/srmu*fmagic + pmagic 122 ELSE ! nuit polaire (on peut prendre une valeur quelconque) 123 albedo(i) = fmagic 124 END IF 125 END DO 126 END IF 127 RETURN 128 END SUBROUTINE alboc 129 ! ===================================================================== 130 SUBROUTINE alboc_cd(rmu0, albedo) 131 USE dimphy 108 132 109 ! Faire l'integration numerique de midi a minuit (le facteur 2 110 ! prend en compte l'autre moitie de la journee): 111 DO k = 1, npts 112 rmu = aa + bb*cos(real(k)/real(npts)*zpi) 113 rmu = max(0.0, rmu) 114 ! IM cf. PB alb = 0.058/(rmu + 0.30) 115 ! alb = 0.058/(rmu + 0.30) * 1.5 116 alb = 0.058/(rmu+0.30)*1.2 117 ! alb = 0.058/(rmu + 0.30) * 1.3 118 srmu = srmu + rmu*2.0 119 salb = salb + alb*rmu*2.0 120 END DO 121 IF (srmu/=0.0) THEN 122 albedo(i) = salb/srmu*fmagic + pmagic 123 ELSE ! nuit polaire (on peut prendre une valeur quelconque) 124 albedo(i) = fmagic 125 END IF 126 END DO 127 END IF 128 RETURN 129 END SUBROUTINE alboc 130 ! ===================================================================== 131 SUBROUTINE alboc_cd(rmu0, albedo) 132 USE dimphy 133 IMPLICIT NONE 134 ! ====================================================================== 135 ! Auteur(s): Z.X. Li (LMD/CNRS) 136 ! date: 19940624 137 ! Calculer l'albedo sur l'ocean en fonction de l'angle zenithal moyen 138 ! Formule due a Larson and Barkstrom (1977) Proc. of the symposium 139 ! on radiation in the atmosphere, 19-28 August 1976, science Press, 140 ! 1977 pp 451-453, ou These de 3eme cycle de Sylvie Joussaume. 133 ! Auteur(s): Z.X. Li (LMD/CNRS) 134 ! date: 19940624 135 ! Calculer l'albedo sur l'ocean en fonction de l'angle zenithal moyen 136 ! Formule due a Larson and Barkstrom (1977) Proc. of the symposium 137 ! on radiation in the atmosphere, 19-28 August 1976, science Press, 138 ! 1977 pp 451-453, ou These de 3eme cycle de Sylvie Joussaume. 141 139 142 ! Arguments 143 ! rmu0 (in): cosinus de l'angle solaire zenithal 144 ! albedo (out): albedo de surface de l'ocean 145 ! ====================================================================== 146 ! ym#include "dimensions.h" 147 ! ym#include "dimphy.h" 148 include "clesphys.h" 149 REAL rmu0(klon), albedo(klon) 140 ! Arguments 141 ! rmu0 (in): cosinus de l'angle solaire zenithal 142 ! albedo (out): albedo de surface de l'ocean 143 ! ====================================================================== 144 include "clesphys.h" 145 REAL, intent(in):: rmu0(klon) 146 real, intent(out):: albedo(klon) 150 147 151 ! REAL fmagic ! un facteur magique pour regler l'albedo152 ! cc PARAMETER (fmagic=0.7)153 ! ccIM => a remplacer154 ! PARAMETER (fmagic=1.32)155 ! PARAMETER (fmagic=1.0)156 ! PARAMETER (fmagic=0.7)148 ! REAL fmagic ! un facteur magique pour regler l'albedo 149 ! cc PARAMETER (fmagic=0.7) 150 ! ccIM => a remplacer 151 ! PARAMETER (fmagic=1.32) 152 ! PARAMETER (fmagic=1.0) 153 ! PARAMETER (fmagic=0.7) 157 154 158 REAL fauxo 159 INTEGER i 160 ! ccIM 161 LOGICAL ancien_albedo 162 PARAMETER (ancien_albedo=.FALSE.) 163 ! SAVE albedo 155 REAL fauxo 156 INTEGER i 157 LOGICAL ancien_albedo 158 PARAMETER (ancien_albedo=.FALSE.) 164 159 165 IF (ancien_albedo) THEN 160 IF (ancien_albedo) THEN 161 DO i = 1, klon 162 fauxo = (1.47-acos(max(rmu0(i), 0.0)))/0.15 163 albedo(i) = fmagic*(.03+.630/(1.+fauxo*fauxo)) + pmagic 164 albedo(i) = max(min(albedo(i),0.60), 0.04) 165 END DO 166 ELSE 167 DO i = 1, klon 168 albedo(i) = fmagic*0.058/(max(rmu0(i), 0.0)+0.30) + pmagic 169 albedo(i) = max(min(albedo(i),0.60), 0.04) 170 END DO 171 END IF 166 172 167 DO i = 1, klon173 END SUBROUTINE alboc_cd 168 174 169 rmu0(i) = max(rmu0(i), 0.0) 170 171 fauxo = (1.47-acos(rmu0(i)))/0.15 172 albedo(i) = fmagic*(.03+.630/(1.+fauxo*fauxo)) + pmagic 173 albedo(i) = max(min(albedo(i),0.60), 0.04) 174 END DO 175 176 ! nouvel albedo 177 178 ELSE 179 180 DO i = 1, klon 181 rmu0(i) = max(rmu0(i), 0.0) 182 ! IM:orig albedo(i) = 0.058/(rmu0(i) + 0.30) 183 albedo(i) = fmagic*0.058/(rmu0(i)+0.30) + pmagic 184 albedo(i) = max(min(albedo(i),0.60), 0.04) 185 END DO 186 187 END IF 188 189 RETURN 190 END SUBROUTINE alboc_cd 191 ! ======================================================================== 175 end module albedo
Note: See TracChangeset
for help on using the changeset viewer.