/[MITgcm]/MITgcm/pkg/seaice/seaice_prepare_ridging.F
ViewVC logotype

Contents of /MITgcm/pkg/seaice/seaice_prepare_ridging.F

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


Revision 1.5 - (show annotations) (download)
Mon Oct 20 03:20:58 2014 UTC (9 years, 7 months ago) by gforget
Branch: MAIN
CVS Tags: 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, checkpoint65g, HEAD
Changes since 1.4: +4 -1 lines
- ECCO_OPTIONS.h is needed when including ecco_cost.h, ecco.h
- AUTODIFF_OPTIONS.h is needed when including tamc.h, tamc_keys.h
- CTRL_OPTIONS.h is needed when including ctrl.h, etc

- pkg/seaice/seaice_cost*.F : clean up CPP brackets
- SEAICE_SIZE.h : replace ALLOW_AUTODIFF_TAMC with ALLOW_AUTODIFF to
  avoid needing AUTODIFF_OPTIONS.h anytime SEAICE_SIZE.h is included
  (it seems that THSICE_SIZE.h, PTRACERS_SIZE.h have the same issue...)

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_prepare_ridging.F,v 1.4 2014/05/08 11:29:26 mlosch Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5 #ifdef ALLOW_AUTODIFF
6 # include "AUTODIFF_OPTIONS.h"
7 #endif
8
9 CBOP
10 C !ROUTINE: SEAICE_PREPARE_RIDGING
11 C !INTERFACE: ==========================================================
12 SUBROUTINE SEAICE_PREPARE_RIDGING(
13 #ifdef SEAICE_ITD
14 O hActual,
15 O hrMin, hrMax, hrExp, ridgeRatio, ridgingModeNorm, partFunc,
16 #endif /* SEAICE_ITD */
17 I iMin, iMax, jMin, jMax, bi, bj, myTime, myIter, myThid )
18
19 C !DESCRIPTION: \bv
20 C *===========================================================*
21 C | SUBROUTINE SEAICE_PREPARE_RIDGING
22 C | o compute ridging parameters according to Thorndyke et al
23 C | (1975), Hibler (1980), Bitz et al (2001) or
24 C | Lipscomb et al (2007)
25 C | o this routine is called from s/r seaice_do_ridging and
26 C | from s/r seaice_calc_ice_strength
27 C |
28 C | Martin Losch, Apr. 2014, Martin.Losch@awi.de
29 C *===========================================================*
30 C \ev
31
32 C !USES: ===============================================================
33 IMPLICIT NONE
34
35 #include "SIZE.h"
36 #include "EEPARAMS.h"
37 #include "PARAMS.h"
38 #include "GRID.h"
39 #include "SEAICE_SIZE.h"
40 #include "SEAICE_PARAMS.h"
41 #include "SEAICE.h"
42
43 #ifdef ALLOW_AUTODIFF_TAMC
44 # include "tamc.h"
45 #endif
46
47 C !INPUT PARAMETERS: ===================================================
48 C === Routine arguments ===
49 C bi, bj :: outer loop counters
50 C myTime :: current time
51 C myIter :: iteration number
52 C myThid :: Thread no. that called this routine.
53 C i/jMin/Max:: loop boundaries
54 _RL myTime
55 INTEGER bi,bj
56 INTEGER myIter
57 INTEGER myThid
58 INTEGER iMin, iMax, jMin, jMax
59 #ifdef SEAICE_ITD
60 C ridgingModeNorm :: norm to ensure convervation (N in Lipscomb et al 2007)
61 C partFunc :: participation function (a_n in Lipscomb et al 2007)
62 C ridgeRatio :: mean ridge thickness/ thickness of ridging ice
63 C hrMin :: min ridge thickness
64 C hrMax :: max ridge thickness (SEAICEredistFunc = 0)
65 C hrExp :: ridge e-folding scale (SEAICEredistFunc = 1)
66 C hActual :: HEFFITD/AREAITD, regularized
67 _RL ridgingModeNorm (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
68 _RL partFunc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,0:nITD)
69 _RL hrMin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
70 _RL hrMax (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
71 _RL hrExp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
72 _RL ridgeRatio (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
73 _RL hActual (1-OLx:sNx+OLx,1-OLy:sNy+OLy,1:nITD)
74 CEndOfInterface
75
76 C !LOCAL VARIABLES: ====================================================
77 C === Local variables ===
78 C i,j,k :: inner loop counters
79 C
80 INTEGER i, j
81 INTEGER k
82 C variables related to ridging schemes
83 C gSum :: cumulative distribution function G
84 _RL gSum (1-OLx:sNx+OLx,1-OLy:sNy+OLy,-1:nITD)
85 _RL recip_gStar, recip_aStar, tmp
86 C Regularization values squared
87 _RL area_reg_sq, hice_reg_sq
88 CEOP
89
90 C---+-|--1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
91
92 C regularization constants
93 area_reg_sq = SEAICE_area_reg * SEAICE_area_reg
94 hice_reg_sq = SEAICE_hice_reg * SEAICE_hice_reg
95 DO k=1,nITD
96 DO j=jMin,jMax
97 DO i=iMin,iMax
98 hActual(i,j,k) = 0. _d 0
99 CML IF ( AREAITD(i,j,k,bi,bj) .GT. SEAICE_area_reg ) THEN
100 CML hActual(i,j,k) = HEFFITD(i,j,k,bi,bj)/AREAITD(i,j,k,bi,bj)
101 CML ENDIF
102 IF ( HEFFITD(i,j,k,bi,bj) .GT. 0. _d 0 ) THEN
103 C regularize as in seaice_growth: compute hActual with regularized
104 C AREA and regularize from below with a minimum thickness
105 tmp = HEFFITD(i,j,k,bi,bj)
106 & /SQRT( AREAITD(i,j,k,bi,bj)**2 + area_reg_sq )
107 hActual(i,j,k) = SQRT(tmp * tmp + hice_reg_sq)
108 ENDIF
109 ENDDO
110 ENDDO
111 ENDDO
112
113 C---+-|--1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
114
115 C compute the cumulative thickness distribution function gSum
116 DO j=jMin,jMax
117 DO i=iMin,iMax
118 gSum(i,j,-1) = 0. _d 0
119 gSum(i,j,0) = 0. _d 0
120 IF ( opnWtrFrac(i,j,bi,bj) .GT. SEAICE_area_floor )
121 & gSum(i,j,0) = opnWtrFrac(i,j,bi,bj)
122 ENDDO
123 ENDDO
124 DO k = 1, nITD
125 DO j=jMin,jMax
126 DO i=iMin,iMax
127 gSum(i,j,k) = gSum(i,j,k-1)
128 IF ( AREAITD(i,j,k,bi,bj) .GT. SEAICE_area_floor )
129 & gSum(i,j,k) = gSum(i,j,k) + AREAITD(i,j,k,bi,bj)
130 ENDDO
131 ENDDO
132 ENDDO
133 C normalize
134 DO k = 0, nITD
135 DO j=jMin,jMax
136 DO i=iMin,iMax
137 IF ( gSum(i,j,nITD).NE.0. _d 0 )
138 & gSum(i,j,k) = gSum(i,j,k) / gSum(i,j,nITD)
139 ENDDO
140 ENDDO
141 ENDDO
142
143 C Compute the participation function
144 C area lost from category n due to ridging/closing
145 C partFunc(n) = --------------------------------------------------
146 C total area lost due to ridging/closing
147
148 IF ( SEAICEpartFunc .EQ. 0 ) THEN
149 C Thorndike et al. (1975) discretize b(h) = (2/Gstar) * (1 - G(h)/Gstar)
150 C The expressions for the partition function partFunc are found by
151 C integrating b(h)g(h) between the category boundaries.
152 recip_gStar = 1. _d 0 / SEAICEgStar
153 DO k = 0, nITD
154 DO j=jMin,jMax
155 DO i=iMin,iMax
156 partFunc(i,j,k) = 0. _d 0
157 IF ( gSum(i,j,k) .LT. SEAICEgStar ) THEN
158 partFunc(i,j,k) =
159 & (gSum(i,j,k)-gSum(i,j,k-1)) * recip_gStar
160 & *( 2. _d 0 - (gSum(i,j,k-1)+gSum(i,j,k))*recip_gStar)
161 ELSEIF ( gSum(i,j,k-1) .LT. SEAICEgStar
162 & .AND. gSum(i,j,k) .GE. SEAICEgStar ) THEN
163 partFunc(i,j,k) =
164 & (SEAICEgStar-gSum(i,j,k-1)) * recip_gStar
165 & *( 2. _d 0 - (gSum(i,j,k-1)+SEAICEgStar)*recip_gStar)
166 ENDIF
167 ENDDO
168 ENDDO
169 ENDDO
170 ELSEIF ( SEAICEpartFunc .EQ. 1 ) THEN
171 C Lipscomb et al. (2007) discretize b(h) = exp(-G(h)/astar) into
172 C partFunc(n) = [exp(-G(n-1)/astar - exp(-G(n)/astar] / [1-exp(-1/astar)].
173 C The expression is found by integrating b(h)g(h) between the category
174 C boundaries.
175 recip_astar = 1. _d 0 / SEAICEaStar
176 tmp = 1. _d 0 / ( 1. _d 0 - EXP( -recip_astar ) )
177 C abuse gSum as a work array
178 k = -1
179 DO j=jMin,jMax
180 DO i=iMin,iMax
181 gSum(i,j,k) = EXP(-gSum(i,j,k)*recip_astar) * tmp
182 ENDDO
183 ENDDO
184 DO k = 0, nITD
185 DO j=jMin,jMax
186 DO i=iMin,iMax
187 gSum(i,j,k) = EXP(-gSum(i,j,k)*recip_astar) * tmp
188 partFunc(i,j,k) = gSum(i,j,k-1) - gSum(i,j,k)
189 ENDDO
190 ENDDO
191 ENDDO
192 ELSE
193 STOP 'Ooops: SEAICEpartFunc > 1 not implemented'
194 ENDIF
195
196 C Compute variables of ITD of ridged ice
197 C ridgeRatio :: mean ridge thickness/ thickness of ridging ice
198 C hrMin :: min ridge thickness
199 C hrMax :: max ridge thickness (SEAICEredistFunc = 0)
200 C hrExp :: ridge e-folding scale (SEAICEredistFunc = 1)
201 DO k = 1, nITD
202 DO j=jMin,jMax
203 DO i=iMin,iMax
204 hrMin(i,j,k) = 0. _d 0
205 hrMax(i,j,k) = 0. _d 0
206 hrExp(i,j,k) = 0. _d 0
207 C avoid divisions by zero
208 ridgeRatio(i,j,k) = 1. _d 0
209 ENDDO
210 ENDDO
211 ENDDO
212 IF ( SEAICEredistFunc .EQ. 0 ) THEN
213 C Assume ridged ice is uniformly distributed between hrmin and hrmax.
214 C (Hibler, 1980)
215 DO k = 1, nITD
216 DO j=jMin,jMax
217 DO i=iMin,iMax
218 IF ( hActual(i,j,k) .GT. 0. _d 0 ) THEN
219 C This is the original Hibler (1980) scheme:
220 hrMin(i,j,k) = 2. _d 0 * hActual(i,j,k)
221 hrMax(i,j,k) = 2. _d 0 * SQRT(hActual(i,j,k)*SEAICEhStar)
222 C CICE does this in addition, so that thick ridging ice is not required
223 C to raft:
224 hrMin(i,j,k) = MIN(hrMin(i,j,k),hActual(i,j,k)+SEAICEmaxRaft)
225 hrMax(i,j,k) = MAX(hrMax(i,j,k),hrMin(i,j,k)+SEAICE_hice_reg)
226 C
227 ridgeRatio(i,j,k) =
228 & 0.5 _d 0 * (hrMax(i,j,k)+hrMin(i,j,k))/hActual(i,j,k)
229 ENDIF
230 ENDDO
231 ENDDO
232 ENDDO
233 ELSEIF ( SEAICEredistFunc .EQ. 1 ) THEN
234 C Follow Lipscomb et al. (2007) and model ridge ITD as an exponentially
235 C decaying function
236 DO k = 1, nITD
237 DO j=jMin,jMax
238 DO i=iMin,iMax
239 IF ( hActual(i,j,k) .GT. 0. _d 0 ) THEN
240 C regularization is only required in this case but already done above
241 CML tmp = MAX(hActual(i,j,k), SEAICE_hice_reg)
242 tmp = hActual(i,j,k)
243 hrMin(i,j,k) = MIN(2.D0 * tmp, tmp+SEAICEmaxRaft)
244 hrExp(i,j,k) = SEAICEmuRidging*SQRT(tmp)
245 C arent we missing a factor 0.5 here?
246 ridgeRatio(i,j,k)=(hrMin(i,j,k)+hrExp(i,j,k))/tmp
247 ENDIF
248 ENDDO
249 ENDDO
250 ENDDO
251 ELSE
252 STOP 'Ooops: SEAICEredistFunc > 1 not implemented'
253 ENDIF
254
255 C Compute the norm of the ridging mode N (in Lipscomp et al 2007)
256 C or omega (in Bitz et al 2001):
257 C rigdingModeNorm = net ice area removed / total area participating.
258 C For instance, if a unit area of ice with thickness = 1 participates in
259 C ridging to form a ridge with a = 1/3 and thickness = 3, then
260 C rigdingModeNorm = 1 - 1/3 = 2/3.
261 DO j=jMin,jMax
262 DO i=iMin,iMax
263 ridgingModeNorm(i,j) = partFunc(i,j,0)
264 ENDDO
265 ENDDO
266 DO k = 1, nITD
267 DO j=jMin,jMax
268 DO i=iMin,iMax
269 partFunc(i,j,k) = partFunc(i,j,k) * heffM(i,j,bi,bj)
270 ridgingModeNorm(i,j) = ridgingModeNorm(i,j)
271 & + partFunc(i,j,k)*( 1. _d 0 - 1. _d 0/ridgeRatio(i,j,k) )
272 ENDDO
273 ENDDO
274 ENDDO
275 C avoid division by zero
276 DO j=jMin,jMax
277 DO i=iMin,iMax
278 IF ( ridgingModeNorm(i,j) .LE. 0. _d 0 )
279 & ridgingModeNorm(i,j) = 1. _d 0
280 ENDDO
281 ENDDO
282
283 #endif /* SEAICE_ITD */
284
285 RETURN
286 END

  ViewVC Help
Powered by ViewVC 1.1.22