/[MITgcm]/MITgcm/pkg/thsice/thsice_albedo.F
ViewVC logotype

Contents of /MITgcm/pkg/thsice/thsice_albedo.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.7 - (show annotations) (download)
Tue Oct 12 15:55:34 2010 UTC (13 years, 6 months ago) by mlosch
Branch: MAIN
CVS Tags: checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint63, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62z, checkpoint62y, checkpoint62x
Changes since 1.6: +55 -42 lines
vectorization: move print and stop statements out of loops

1 C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_albedo.F,v 1.6 2009/07/08 23:35:05 jmc Exp $
2 C $Name: $
3
4 #include "THSICE_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: THSICE_ALBEDO
8 C !INTERFACE:
9 SUBROUTINE THSICE_ALBEDO(
10 I bi, bj, siLo, siHi, sjLo, sjHi,
11 I iMin,iMax, jMin,jMax,
12 I iceMask, hIce, hSnow, tSrf, ageSnw,
13 O sAlb, sAlbNIR,
14 I myTime, myIter, myThid )
15 C !DESCRIPTION: \bv
16 C *==========================================================*
17 C | S/R THSICE_ALBEDO
18 C *==========================================================*
19 C | Compute surface albedo over sea-ice
20 C *==========================================================*
21 C \ev
22
23 C !USES:
24 IMPLICIT NONE
25
26 C == Global data ==
27 #include "EEPARAMS.h"
28 #include "THSICE_PARAMS.h"
29
30 C !INPUT/OUTPUT PARAMETERS:
31 C == Routine Arguments ==
32 C siLo,siHi :: size of input/output array: 1rst dim. lower,higher bounds
33 C sjLo,sjHi :: size of input/output array: 2nd dim. lower,higher bounds
34 C bi,bj :: tile indices
35 C iMin,iMax :: computation domain: 1rst index range
36 C jMin,jMax :: computation domain: 2nd index range
37 C--- Input:
38 C iceMask :: sea-ice fractional mask [0-1]
39 C hIce (hi) :: ice height [m]
40 C hSnow (hs) :: snow height [m]
41 C tSrf (Tsf) :: surface (ice or snow) temperature [oC]
42 C ageSnw (age) :: snow age [s]
43 C--- Output
44 C sAlb (albedo) :: surface albedo [0-1]
45 C sAlbNIR(albedo):: near IR surface albedo [0-1]
46 C--- Input:
47 C myTime :: current Time of simulation [s]
48 C myIter :: current Iteration number in simulation
49 C myThid :: my Thread Id number
50 INTEGER siLo, siHi, sjLo, sjHi
51 INTEGER bi,bj
52 INTEGER iMin, iMax
53 INTEGER jMin, jMax
54 _RL iceMask(siLo:siHi,sjLo:sjHi)
55 _RL hIce (siLo:siHi,sjLo:sjHi)
56 _RL hSnow (siLo:siHi,sjLo:sjHi)
57 _RL tSrf (siLo:siHi,sjLo:sjHi)
58 _RL ageSnw (siLo:siHi,sjLo:sjHi)
59 _RL sAlb (siLo:siHi,sjLo:sjHi)
60 _RL sAlbNIR(siLo:siHi,sjLo:sjHi)
61 _RL myTime
62 INTEGER myIter
63 INTEGER myThid
64 CEOP
65
66 #ifdef ALLOW_THSICE
67 C !LOCAL VARIABLES:
68 C--- local copy of input/output argument list variables (see description above)
69 _RL hi ! ice height
70 _RL hs ! snow height
71 _RL Tsf ! surface temperature
72 _RL age ! snow age
73 _RL albedo ! surface albedo
74 C == Local variables ==
75 C frsnow :: fractional snow cover
76 C albsno :: albedo of snow
77 C albice :: albedo of ice
78 C albNewSnow :: albedo of new (fresh) snow
79 C albNewSnow :: albedo of new (fresh) snow
80 C msgBuf :: Informational/error meesage buffer
81 c _RL frsnow
82 _RL albsno
83 _RL albice
84 _RL albNewSnow
85 _RL albNIR_ocean, albNIR_thick, albNIR_dsnow
86 _RL albNIR_ice, albNIR_fHice, recFac_albNIR
87 INTEGER i,j
88 INTEGER ii,jj,icount
89 CHARACTER*(MAX_LEN_MBUF) msgBuf
90
91 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
92
93 IF ( thSIce_calc_albNIR ) THEN
94 C Near-InfraRed albedo
95 albNIR_ocean = 0.06 _d 0
96 albNIR_thick = 0.33 _d 0
97 albNIR_dsnow = 0.68 _d 0
98 albNIR_fHice = 4. _d 0
99 recFac_albNIR = 1. _d 0 / ATAN(albNIR_fHice*0.5 _d 0)
100 ENDIF
101
102 icount = 0
103 DO j = jMin, jMax
104 DO i = iMin, iMax
105 IF ( iceMask(i,j).GT.0. _d 0 ) THEN
106 hi = hIce(i,j)
107 hs = hSnow(i,j)
108 Tsf = tSrf(i,j)
109 age = ageSnw(i,j)
110
111 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
112 C-- Albedo of Bare Sea-Ice
113 albice = albIceMax + (albIceMin-albIceMax)*EXP(-hi/hAlbIce)
114
115 C-- LANL albedo calculation
116 c frsnow = 0.
117 c if (hs .gt. 0.) frsnow = 1.
118 c if (Tsf .lt. 0.) then
119 c albedo = frsnow*albColdSnow + (1.-frsnow)*albice
120 c else
121 c albedo = frsnow*albWarmSnow + (1.-frsnow)*albice
122 c endif
123 C-end LANL albedo calculation
124
125 C-- GISS model albedo calculation
126 c albice = 0.7 _d 0
127
128 C- New snow: (linear) transition between tempSnowAlb (oC) and 0.oC
129 C from cold/dry snow albedo to warm/wet snow albedo
130 IF ( tempSnowAlb.LT.0. _d 0 ) THEN
131 albNewSnow = albColdSnow
132 & + (albWarmSnow - albColdSnow)
133 & *MAX( 0. _d 0, MIN(1. _d 0 - Tsf/tempSnowAlb, 1. _d 0) )
134 ELSE
135 albNewSnow = albColdSnow
136 ENDIF
137 C- albedo of snow is function of snow-age (make age units into days):
138 albsno = albOldSnow
139 & +(albNewSnow-albOldSnow)*EXP(-0.2 _d 0*age/86400. _d 0)
140 C- layer of snow over the ice:
141 albedo = albsno + (albice-albsno)*EXP(-hs/hAlbSnow)
142
143 IF ( thSIce_calc_albNIR ) THEN
144 C-- Compute near-infrared albedo
145 albNIR_ice = albNIR_ocean + (albNIR_thick - albNIR_ocean)*
146 & MIN( recFac_albNIR*ATAN(albNIR_fHice*hi), 1. _d 0 )
147 & + 0.075 _d 0 * MIN( -Tsf - 1. _d 0, 0. _d 0 )
148
149 sAlbNIR(i,j) = albNIR_ice * ( 1. _d 0 - hs/(hs + 0.02 _d 0) )
150 & + ( albNIR_dsnow
151 & + 0.15 _d 0 *MIN( -Tsf - 1. _d 0, 0. _d 0) )
152 & * hs/(hs + 0.02 _d 0)
153 ELSE
154 sAlbNIR(i,j) = albedo
155 ENDIF
156 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
157 IF (albedo.GT.1. _d 0 .OR. albedo.LT. .2 _d 0) THEN
158 C test for potential errors (move print statements out of i,j-loops
159 C for vectorization
160 ii=i
161 jj=j
162 icount=icount+1
163 ENDIF
164 sAlb(i,j) = albedo
165 ELSE
166 sAlb(i,j) = 0. _d 0
167 sAlbNIR(i,j) = 0. _d 0
168 ENDIF
169 ENDDO
170 ENDDO
171 C catch potential errors
172 IF (icount .gt. 0) THEN
173 c print*,'QQ - albedo problem', albedo, age, hs, albsno
174 WRITE(msgBuf,'(A,I10,4I6)')
175 & 'THSICE_ALBEDO: Problem, e.g., at:', myIter,ii,jj,bi,bj
176 CALL PRINT_ERROR( msgBuf , myThid)
177 WRITE(msgBuf,'(A,1P3E17.9)')
178 & 'THSICE_ALBEDO: albedo=', sAlb(ii,jj),ageSnw(ii,jj),
179 & hsnow(ii,jj)
180 CALL PRINT_ERROR( msgBuf , myThid)
181 STOP 'THSICE_ALBEDO: albedo out of range'
182 ENDIF
183
184 #endif /* ALLOW_THSICE */
185
186 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
187
188 RETURN
189 END

  ViewVC Help
Powered by ViewVC 1.1.22