/[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.8 - (show annotations) (download)
Sat Apr 13 20:51:32 2013 UTC (11 years, 1 month ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64g, checkpoint65, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, HEAD
Changes since 1.7: +4 -1 lines
Prelim. step for adjoint code:
* change few variable names
* change iceFlag from logical to _RL
* exclude some code in case of ALLOW_AUTODIFF (for now)
* fix (re-instate) various store dirs (but needs double-checking)

1 C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_albedo.F,v 1.7 2010/10/12 15:55:34 mlosch 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
172 #ifndef ALLOW_AUTODIFF
173 C catch potential errors
174 IF (icount .gt. 0) THEN
175 c print*,'QQ - albedo problem', albedo, age, hs, albsno
176 WRITE(msgBuf,'(A,I10,4I6)')
177 & 'THSICE_ALBEDO: Problem, e.g., at:', myIter,ii,jj,bi,bj
178 CALL PRINT_ERROR( msgBuf , myThid)
179 WRITE(msgBuf,'(A,1P3E17.9)')
180 & 'THSICE_ALBEDO: albedo=', sAlb(ii,jj),ageSnw(ii,jj),
181 & hsnow(ii,jj)
182 CALL PRINT_ERROR( msgBuf , myThid)
183 STOP 'THSICE_ALBEDO: albedo out of range'
184 ENDIF
185 #endif
186
187 #endif /* ALLOW_THSICE */
188
189 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
190
191 RETURN
192 END

  ViewVC Help
Powered by ViewVC 1.1.22