1 |
! |
module alboc_m |
2 |
! $Header: /home/cvsroot/LMDZ4/libf/phylmd/albedo.F,v 1.2 2005/02/07 15:00:52 fairhead Exp $ |
|
3 |
! |
IMPLICIT NONE |
4 |
c |
|
5 |
c |
contains |
6 |
SUBROUTINE alboc(rjour,rlat,albedo) |
|
7 |
use dimens_m |
pure function alboc(jour, rlat) |
8 |
use dimphy |
|
9 |
use YOMCST |
! From LMDZ4/libf/phylmd/albedo.F, version 1.2, 2005/02/07 15:00:52 |
10 |
use orbite_m, only: orbite |
|
11 |
IMPLICIT none |
! Author: Z. X. Li (LMD/CNRS) |
12 |
c====================================================================== |
! Date : 16 mars 1995 |
13 |
c Auteur(s): Z.X. Li (LMD/CNRS) (adaptation du GCM du LMD) |
! Objet : Calculer l'alb\'edo sur l'oc\'ean |
14 |
c Date: le 16 mars 1995 |
! M\'ethode: int\'egrer num\'eriquement l'alb\'edo pendant une journ\'ee |
15 |
c Objet: Calculer l'albedo sur l'ocean |
|
16 |
c Methode: Integrer numeriquement l'albedo pendant une journee |
use nr_util, only: pi |
17 |
c |
USE orbite_m, ONLY: orbite |
18 |
c Arguments; |
USE yomcst, only: r_incl |
19 |
c rjour (in,R) : jour dans l'annee (a compter du 1 janvier) |
|
20 |
c rlat (in,R) : latitude en degre |
integer, intent(in):: jour ! jour dans l'annee (a compter du 1 janvier) |
21 |
c albedo (out,R): albedo obtenu (de 0 a 1) |
REAL, intent(in):: rlat(:) ! latitude en degre |
22 |
c====================================================================== |
real alboc(size(rlat)) ! albedo obtenu (de 0 a 1) |
23 |
c |
|
24 |
REAL fmagic ! un facteur magique pour regler l'albedo |
! Local: |
25 |
ccc PARAMETER (fmagic=0.7) |
|
26 |
cccIM => a remplacer |
INTEGER, PARAMETER:: npts =120 |
27 |
c PARAMETER (fmagic=1.32) |
! Contr\^ole la pr\'ecision de l'int\'egration. 120 correspond \`a |
28 |
PARAMETER (fmagic=1.0) |
! l'intervalle 6 minutes. |
29 |
c PARAMETER (fmagic=0.7) |
|
30 |
INTEGER npts ! il controle la precision de l'integration |
REAL lonsun, declin |
31 |
PARAMETER (npts=120) ! 120 correspond a l'interval 6 minutes |
REAL rmu, srmu, salb, aa, bb |
32 |
c |
INTEGER i, k |
33 |
REAL rlat(klon), rjour, albedo(klon) |
|
34 |
REAL zdist, zlonsun, zpi, zdeclin |
!---------------------------------------------------------------------- |
35 |
REAL rmu,alb, srmu, salb, fauxo, aa, bb |
|
36 |
INTEGER i, k |
! Calculer la longitude vraie de l'orbite terrestre: |
37 |
cccIM |
CALL orbite(real(jour), lonsun) |
38 |
LOGICAL ancien_albedo |
|
39 |
PARAMETER(ancien_albedo=.FALSE.) |
! Calculer la declinaison du soleil (qui varie entre + R_incl et - R_incl) : |
40 |
c SAVE albedo |
declin = asin(sin(lonsun * pi / 180.) * sin(r_incl * pi / 180.)) |
41 |
c |
|
42 |
IF ( ancien_albedo ) THEN |
DO i = 1, size(rlat) |
43 |
c |
aa = sin(rlat(i) * pi / 180.) * sin(declin) |
44 |
zpi = 4. * ATAN(1.) |
bb = cos(rlat(i) * pi / 180.) * cos(declin) |
45 |
c |
|
46 |
c Calculer la longitude vraie de l'orbite terrestre: |
! Midi local (angle du temps = 0.): |
47 |
CALL orbite(rjour,zlonsun,zdist) |
rmu = max(0., aa + bb) |
48 |
c |
srmu = rmu |
49 |
c Calculer la declinaison du soleil (qui varie entre + et - R_incl): |
salb = 0.058 / (rmu + 0.30) * 1.2 * rmu |
50 |
zdeclin = ASIN(SIN(zlonsun*zpi/180.0)*SIN(R_incl*zpi/180.0)) |
|
51 |
c |
! Faire l'integration numerique de midi a minuit (le facteur 2 |
52 |
DO 999 i=1,klon |
! prend en compte l'autre moitie de la journee): |
53 |
aa = SIN(rlat(i)*zpi/180.0) * SIN(zdeclin) |
DO k = 1, npts |
54 |
bb = COS(rlat(i)*zpi/180.0) * COS(zdeclin) |
rmu = max(0., aa + bb * cos(real(k) / real(npts) * pi)) |
55 |
c |
srmu = srmu + rmu * 2. |
56 |
c Midi local (angle du temps = 0.0): |
salb = salb + 0.058 / (rmu + 0.30) * 1.2 * rmu * 2. |
57 |
rmu = aa + bb * COS(0.0) |
END DO |
58 |
rmu = MAX(0.0, rmu) |
IF (srmu /= 0.) THEN |
59 |
fauxo = (1.47-ACOS(rmu))/.15 |
alboc(i) = salb / srmu |
60 |
alb = 0.03+0.630/(1.+fauxo*fauxo) |
ELSE |
61 |
srmu = rmu |
! nuit polaire (on peut prendre une valeur quelconque) |
62 |
salb = alb * rmu |
alboc(i) = 1. |
63 |
c |
END IF |
64 |
c Faire l'integration numerique de midi a minuit (le facteur 2 |
END DO |
65 |
c prend en compte l'autre moitie de la journee): |
|
66 |
DO k = 1, npts |
END function alboc |
67 |
rmu = aa + bb * COS(FLOAT(k)/FLOAT(npts)*zpi) |
|
68 |
rmu = MAX(0.0, rmu) |
end module alboc_m |
|
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 |
|
|
ENDDO |
|
|
IF (srmu .NE. 0.0) THEN |
|
|
albedo(i) = salb / srmu * fmagic |
|
|
ELSE ! nuit polaire (on peut prendre une valeur quelconque) |
|
|
albedo(i) = fmagic |
|
|
ENDIF |
|
|
999 CONTINUE |
|
|
c |
|
|
c nouvel albedo |
|
|
c |
|
|
ELSE |
|
|
c |
|
|
zpi = 4. * ATAN(1.) |
|
|
c |
|
|
c Calculer la longitude vraie de l'orbite terrestre: |
|
|
CALL orbite(rjour,zlonsun,zdist) |
|
|
c |
|
|
c Calculer la declinaison du soleil (qui varie entre + et - R_incl): |
|
|
zdeclin = ASIN(SIN(zlonsun*zpi/180.0)*SIN(R_incl*zpi/180.0)) |
|
|
c |
|
|
DO 1999 i=1,klon |
|
|
aa = SIN(rlat(i)*zpi/180.0) * SIN(zdeclin) |
|
|
bb = COS(rlat(i)*zpi/180.0) * COS(zdeclin) |
|
|
c |
|
|
c Midi local (angle du temps = 0.0): |
|
|
rmu = aa + bb * COS(0.0) |
|
|
rmu = MAX(0.0, rmu) |
|
|
cIM cf. PB alb = 0.058/(rmu + 0.30) |
|
|
c alb = 0.058/(rmu + 0.30) * 1.5 |
|
|
alb = 0.058/(rmu + 0.30) * 1.2 |
|
|
c alb = 0.058/(rmu + 0.30) * 1.3 |
|
|
srmu = rmu |
|
|
salb = alb * rmu |
|
|
c |
|
|
c Faire l'integration numerique de midi a minuit (le facteur 2 |
|
|
c 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) |
|
|
cIM cf. PB alb = 0.058/(rmu + 0.30) |
|
|
c alb = 0.058/(rmu + 0.30) * 1.5 |
|
|
alb = 0.058/(rmu + 0.30) * 1.2 |
|
|
c alb = 0.058/(rmu + 0.30) * 1.3 |
|
|
srmu = srmu + rmu * 2.0 |
|
|
salb = salb + alb*rmu * 2.0 |
|
|
ENDDO |
|
|
IF (srmu .NE. 0.0) THEN |
|
|
albedo(i) = salb / srmu * fmagic |
|
|
ELSE ! nuit polaire (on peut prendre une valeur quelconque) |
|
|
albedo(i) = fmagic |
|
|
ENDIF |
|
|
1999 CONTINUE |
|
|
ENDIF |
|
|
RETURN |
|
|
END |
|
|
c===================================================================== |
|
|
SUBROUTINE alboc_cd(rmu0,albedo) |
|
|
use dimens_m |
|
|
use dimphy |
|
|
IMPLICIT none |
|
|
c====================================================================== |
|
|
c Auteur(s): Z.X. Li (LMD/CNRS) |
|
|
c date: 19940624 |
|
|
c Calculer l'albedo sur l'ocean en fonction de l'angle zenithal moyen |
|
|
c Formule due a Larson and Barkstrom (1977) Proc. of the symposium |
|
|
C on radiation in the atmosphere, 19-28 August 1976, science Press, |
|
|
C 1977 pp 451-453, ou These de 3eme cycle de Sylvie Joussaume. |
|
|
c |
|
|
c Arguments |
|
|
c rmu0 (in): cosinus de l'angle solaire zenithal |
|
|
c albedo (out): albedo de surface de l'ocean |
|
|
c====================================================================== |
|
|
REAL rmu0(klon), albedo(klon) |
|
|
c |
|
|
REAL fmagic ! un facteur magique pour regler l'albedo |
|
|
ccc PARAMETER (fmagic=0.7) |
|
|
cccIM => a remplacer |
|
|
c PARAMETER (fmagic=1.32) |
|
|
PARAMETER (fmagic=1.0) |
|
|
c PARAMETER (fmagic=0.7) |
|
|
c |
|
|
REAL fauxo |
|
|
INTEGER i |
|
|
cccIM |
|
|
LOGICAL ancien_albedo |
|
|
PARAMETER(ancien_albedo=.FALSE.) |
|
|
c SAVE albedo |
|
|
c |
|
|
IF ( ancien_albedo ) THEN |
|
|
c |
|
|
DO i = 1, klon |
|
|
c |
|
|
rmu0(i) = MAX(rmu0(i),0.0) |
|
|
c |
|
|
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) |
|
|
ENDDO |
|
|
c |
|
|
c nouvel albedo |
|
|
c |
|
|
ELSE |
|
|
c |
|
|
DO i = 1, klon |
|
|
rmu0(i) = MAX(rmu0(i),0.0) |
|
|
cIM: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) |
|
|
ENDDO |
|
|
c |
|
|
ENDIF |
|
|
c |
|
|
RETURN |
|
|
END |
|
|
c======================================================================== |
|