New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
albedo.F90 in trunk/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: trunk/NEMOGCM/NEMO/OPA_SRC/SBC/albedo.F90 @ 2528

Last change on this file since 2528 was 2528, checked in by rblod, 13 years ago

Update NEMOGCM from branch nemo_v3_3_beta

  • Property svn:keywords set to Id
File size: 10.8 KB
Line 
1MODULE albedo
2   !!======================================================================
3   !!                       ***  MODULE  albedo  ***
4   !! Ocean forcing:  bulk thermohaline forcing of the ocean (or ice)
5   !!=====================================================================
6   !! History :  8.0  ! 2001-04  (LIM 1.0)
7   !!   NEMO     1.0  ! 2003-07  (C. Ethe, G. Madec)  Optimization (old name:shine)
8   !!             -   ! 2004-11  (C. Talandier)  add albedo_init
9   !!             -   ! 2001-06  (M. Vancoppenolle) LIM 3.0
10   !!             -   ! 2006-08  (G. Madec)  cleaning for surface module
11   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   albedo_ice  : albedo for   ice (clear and overcast skies)
15   !!   albedo_oce  : albedo for ocean (clear and overcast skies)
16   !!   albedo_init : initialisation of albedo computation
17   !!----------------------------------------------------------------------
18   USE phycst          ! physical constants
19   USE in_out_manager  ! I/O manager
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   albedo_ice   ! routine called sbcice_lim.F90
25   PUBLIC   albedo_oce   ! routine called by ???
26
27   INTEGER  ::   albd_init = 0      !: control flag for initialization
28   REAL(wp) ::   zzero     = 0.e0   ! constant values
29   REAL(wp) ::   zone      = 1.e0   !    "       "
30
31   REAL(wp) ::   c1     = 0.05    ! constants values
32   REAL(wp) ::   c2     = 0.10    !    "        "
33   REAL(wp) ::   rmue   = 0.40    !  cosine of local solar altitude
34
35   !                               !!* namelist namsbc_alb
36   REAL(wp) ::   rn_cloud  = 0.06   !  cloudiness effect on snow or ice albedo (Grenfell & Perovich, 1984)
37#if defined key_lim3
38   REAL(wp) ::   rn_albice = 0.53   !  albedo of melting ice in the arctic and antarctic (Shine & Hendersson-Sellers)
39#else
40   REAL(wp) ::   rn_albice = 0.50   !  albedo of melting ice in the arctic and antarctic (Shine & Hendersson-Sellers)
41#endif
42   REAL(wp) ::   rn_alphd  = 0.80   !  coefficients for linear interpolation used to compute
43   REAL(wp) ::   rn_alphdi = 0.72   !  albedo between two extremes values (Pyane, 1972)
44   REAL(wp) ::   rn_alphc  = 0.65   !
45
46   !!----------------------------------------------------------------------
47   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
48   !! $Id$
49   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
50   !!----------------------------------------------------------------------
51
52CONTAINS
53
54   SUBROUTINE albedo_ice( pt_ice, ph_ice, ph_snw, pa_ice_cs, pa_ice_os )
55      !!----------------------------------------------------------------------
56      !!               ***  ROUTINE albedo_ice  ***
57      !!         
58      !! ** Purpose :   Computation of the albedo of the snow/ice system
59      !!                as well as the ocean one
60      !!       
61      !! ** Method  : - Computation of the albedo of snow or ice (choose the
62      !!                rignt one by a large number of tests
63      !!              - Computation of the albedo of the ocean
64      !!
65      !! References :   Shine and Hendersson-Sellers 1985, JGR, 90(D1), 2243-2250.
66      !!----------------------------------------------------------------------
67      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pt_ice      !  ice surface temperature (Kelvin)
68      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_ice      !  sea-ice thickness
69      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_snw      !  snow thickness
70      REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   pa_ice_cs   !  albedo of ice under clear    sky
71      REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   pa_ice_os   !  albedo of ice under overcast sky
72      !!
73      INTEGER  ::   ji, jj, jl    ! dummy loop indices
74      INTEGER  ::   ijpl          ! number of ice categories (3rd dim of ice input arrays)
75      REAL(wp) ::   zalbpsnm      ! albedo of ice under clear sky when snow is melting
76      REAL(wp) ::   zalbpsnf      ! albedo of ice under clear sky when snow is freezing
77      REAL(wp) ::   zalbpsn       ! albedo of snow/ice system when ice is coverd by snow
78      REAL(wp) ::   zalbpic       ! albedo of snow/ice system when ice is free of snow
79      REAL(wp) ::   zithsn        ! = 1 for hsn >= 0 ( ice is cov. by snow ) ; = 0 otherwise (ice is free of snow)
80      REAL(wp) ::   zitmlsn       ! = 1 freezinz snow (pt_ice >=rt0_snow) ; = 0 melting snow (pt_ice<rt0_snow)
81      REAL(wp) ::   zihsc1        ! = 1 hsn <= c1 ; = 0 hsn > c1
82      REAL(wp) ::   zihsc2        ! = 1 hsn >= c2 ; = 0 hsn < c2
83      !!
84      LOGICAL , DIMENSION(jpi,jpj,SIZE(pt_ice,3)) ::   llmask
85      REAL(wp), DIMENSION(jpi,jpj,SIZE(pt_ice,3)) ::   zalbfz    ! = rn_alphdi for freezing ice ; = rn_albice for melting ice
86      REAL(wp), DIMENSION(jpi,jpj,SIZE(pt_ice,3)) ::   zficeth   !  function of ice thickness
87      !!---------------------------------------------------------------------
88     
89      ijpl = SIZE( pt_ice, 3 )                     ! number of ice categories
90
91      IF( albd_init == 0 )   CALL albedo_init      ! initialization
92
93      !---------------------------
94      !  Computation of  zficeth
95      !---------------------------
96      llmask = ( ph_snw == 0.e0 ) .AND. ( pt_ice >= rt0_ice )
97      ! ice free of snow and melts
98      WHERE( llmask )   ;   zalbfz = rn_albice
99      ELSEWHERE         ;   zalbfz = rn_alphdi
100      END WHERE
101
102      DO jl = 1, ijpl
103         DO jj = 1, jpj
104            DO ji = 1, jpi
105               IF( ph_ice(ji,jj,jl) > 1.5 ) THEN
106                  zficeth(ji,jj,jl) = zalbfz(ji,jj,jl)
107               ELSEIF( ph_ice(ji,jj,jl) > 1.0  .AND. ph_ice(ji,jj,jl) <= 1.5 ) THEN
108                  zficeth(ji,jj,jl) = 0.472 + 2.0 * ( zalbfz(ji,jj,jl) - 0.472 ) * ( ph_ice(ji,jj,jl) - 1.0 )
109               ELSEIF( ph_ice(ji,jj,jl) > 0.05 .AND. ph_ice(ji,jj,jl) <= 1.0 ) THEN
110                  zficeth(ji,jj,jl) = 0.2467 + 0.7049 * ph_ice(ji,jj,jl)                               &
111                     &                    - 0.8608 * ph_ice(ji,jj,jl) * ph_ice(ji,jj,jl)                 &
112                     &                    + 0.3812 * ph_ice(ji,jj,jl) * ph_ice(ji,jj,jl) * ph_ice (ji,jj,jl)
113               ELSE
114                  zficeth(ji,jj,jl) = 0.1 + 3.6 * ph_ice(ji,jj,jl) 
115               ENDIF
116            END DO
117         END DO
118      END DO
119     
120      !-----------------------------------------------
121      !    Computation of the snow/ice albedo system
122      !-------------------------- ---------------------
123     
124      !    Albedo of snow-ice for clear sky.
125      !-----------------------------------------------   
126      DO jl = 1, ijpl
127         DO jj = 1, jpj
128            DO ji = 1, jpi
129               !  Case of ice covered by snow.             
130               !                                        !  freezing snow       
131               zihsc1   = 1.0 - MAX( zzero , SIGN( zone , - ( ph_snw(ji,jj,jl) - c1 ) ) )
132               zalbpsnf = ( 1.0 - zihsc1 ) * (  zficeth(ji,jj,jl)                                             &
133                  &                           + ph_snw(ji,jj,jl) * ( rn_alphd - zficeth(ji,jj,jl) ) / c1  )   &
134                  &     +         zihsc1   * rn_alphd 
135               !                                        !  melting snow               
136               zihsc2   = MAX( zzero , SIGN( zone , ph_snw(ji,jj,jl) - c2 ) )
137               zalbpsnm = ( 1.0 - zihsc2 ) * ( rn_albice + ph_snw(ji,jj,jl) * ( rn_alphc - rn_albice ) / c2 )   &
138                  &     +         zihsc2   *   rn_alphc 
139               !
140               zitmlsn  =  MAX( zzero , SIGN( zone , pt_ice(ji,jj,jl) - rt0_snow ) )   
141               zalbpsn  =  zitmlsn * zalbpsnm + ( 1.0 - zitmlsn ) * zalbpsnf
142           
143               !  Case of ice free of snow.
144               zalbpic  = zficeth(ji,jj,jl) 
145           
146               ! albedo of the system   
147               zithsn   = 1.0 - MAX( zzero , SIGN( zone , - ph_snw(ji,jj,jl) ) )
148               pa_ice_cs(ji,jj,jl) =  zithsn * zalbpsn + ( 1.0 - zithsn ) *  zalbpic
149            END DO
150         END DO
151      END DO
152     
153      !    Albedo of snow-ice for overcast sky.
154      !---------------------------------------------- 
155      pa_ice_os(:,:,:) = pa_ice_cs(:,:,:) + rn_cloud       ! Oberhuber correction
156      !
157   END SUBROUTINE albedo_ice
158
159
160   SUBROUTINE albedo_oce( pa_oce_os , pa_oce_cs )
161      !!----------------------------------------------------------------------
162      !!               ***  ROUTINE albedo_oce  ***
163      !!
164      !! ** Purpose :   Computation of the albedo of the ocean
165      !!
166      !! ** Method  :   ....
167      !!----------------------------------------------------------------------
168      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) ::   pa_oce_os   !  albedo of ocean under overcast sky
169      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) ::   pa_oce_cs   !  albedo of ocean under clear sky
170      !!
171      REAL(wp) ::   zcoef   ! temporary scalar
172      !!----------------------------------------------------------------------
173      !
174      zcoef = 0.05 / ( 1.1 * rmue**1.4 + 0.15 )      ! Parameterization of Briegled and Ramanathan, 1982
175      pa_oce_cs(:,:) = zcoef               
176      pa_oce_os(:,:)  = 0.06                         ! Parameterization of Kondratyev, 1969 and Payne, 1972
177      !
178   END SUBROUTINE albedo_oce
179
180
181   SUBROUTINE albedo_init
182      !!----------------------------------------------------------------------
183      !!                 ***  ROUTINE albedo_init  ***
184      !!
185      !! ** Purpose :   initializations for the albedo parameters
186      !!
187      !! ** Method  :   Read the namelist namsbc_alb
188      !!----------------------------------------------------------------------
189      NAMELIST/namsbc_alb/ rn_cloud, rn_albice, rn_alphd, rn_alphdi, rn_alphc
190      !!----------------------------------------------------------------------
191      !
192      albd_init = 1                     ! indicate that the initialization has been done
193      !
194      REWIND( numnam )                  ! Read Namelist namsbc_alb : albedo parameters
195      READ  ( numnam, namsbc_alb )
196      !
197      IF(lwp) THEN                      ! Control print
198         WRITE(numout,*)
199         WRITE(numout,*) 'albedo : set albedo parameters'
200         WRITE(numout,*) '~~~~~~~'
201         WRITE(numout,*) '   Namelist namsbc_alb : albedo '
202         WRITE(numout,*) '      correction for snow and ice albedo                  rn_cloud  = ', rn_cloud
203         WRITE(numout,*) '      albedo of melting ice in the arctic and antarctic   rn_albice = ', rn_albice
204         WRITE(numout,*) '      coefficients for linear                             rn_alphd  = ', rn_alphd
205         WRITE(numout,*) '      interpolation used to compute albedo                rn_alphdi = ', rn_alphdi
206         WRITE(numout,*) '      between two extremes values (Pyane, 1972)           rn_alphc  = ', rn_alphc
207      ENDIF
208      !
209   END SUBROUTINE albedo_init
210
211   !!======================================================================
212END MODULE albedo
Note: See TracBrowser for help on using the repository browser.