1 |
C $Header: |
2 |
|
3 |
#include "SEAICE_OPTIONS.h" |
4 |
|
5 |
CStartOfInterface |
6 |
SUBROUTINE growth( myTime, myIter, myThid ) |
7 |
C /==========================================================\ |
8 |
C | SUBROUTINE growth | |
9 |
C | o Updata ice thickness and snow depth | |
10 |
C |==========================================================| |
11 |
C \==========================================================/ |
12 |
IMPLICIT NONE |
13 |
|
14 |
C === Global variables === |
15 |
#include "SIZE.h" |
16 |
#include "EEPARAMS.h" |
17 |
#include "PARAMS.h" |
18 |
#include "DYNVARS.h" |
19 |
#include "GRID.h" |
20 |
#include "FFIELDS.h" |
21 |
#include "SEAICE_PARAMS.h" |
22 |
#include "SEAICE.h" |
23 |
#include "SEAICE_FFIELDS.h" |
24 |
#include "SEAICE_EXTERNAL.h" |
25 |
|
26 |
C === Routine arguments === |
27 |
C myTime - Simulation time |
28 |
C myIter - Simulation timestep number |
29 |
C myThid - Thread no. that called this routine. |
30 |
_RL myTime |
31 |
INTEGER myIter, myThid |
32 |
CEndOfInterface |
33 |
|
34 |
#ifdef ALLOW_SEAICE |
35 |
|
36 |
C === Local variables === |
37 |
C i,j,bi,bj - Loop counters |
38 |
|
39 |
INTEGER i, j, bi, bj |
40 |
_RL TBC, salinity_ice, SDF, Q0, QS |
41 |
_RL theta_old |
42 |
|
43 |
_RL GAREA( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ) |
44 |
_RL GHEFF( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ) |
45 |
_RL AR ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, nSx, nSy ) |
46 |
|
47 |
salinity_ice=4.0 _d 0 ! ICE SALINITY |
48 |
TBC=271.2 _d 0-273.16 _d 0 ! FREEZING TEMP. OF SEA WATER |
49 |
SDF=1000.0 _d 0/330.0 _d 0 ! RATIO OF WATER DESITY AND SNOW DENSITY |
50 |
Q0=1.0D-06/302.0 _d +00 ! INVERSE HEAT OF FUSION OF ICE |
51 |
QS=1.1 _d +08 ! HEAT OF FUSION OF SNOW |
52 |
|
53 |
DO bj=myByLo(myThid),myByHi(myThid) |
54 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
55 |
DO J=1,sNy |
56 |
DO I=1,sNx |
57 |
SEAICE_SALT(I,J,bi,bj)=ZERO |
58 |
WATR(I,J,bi,bj)=ZERO |
59 |
AR(I,J,bi,bj)=MIN(AREA(I,J,2,bi,bj), |
60 |
& HEFF(I,J,2,bi,bj)*1.0 _d +04) |
61 |
C NOW BALANCE THE HEAT IN OCEAN FIRT LEVEL |
62 |
C Here the units of YNEG are m of sea-ice. |
63 |
C The factor dRf(1)/72.0764, used to convert temperature |
64 |
C change in deg K to m of sea-ice, is approximately: |
65 |
C dRf(1) * (sea water heat capacity = 3996 J/kg/K) |
66 |
C * (density of sea-water = 1026 kg/m^3) |
67 |
C / (latent heat of fusion of sea-ice = 334000 J/kg) |
68 |
C / (density of sea-ice = 910 kg/m^3) |
69 |
YNEG(I,J,bi,bj)=(theta(I,J,1,bi,bj)-TBC)*dRf(1)/72.0764 _d 0 |
70 |
IF(YNEG(I,J,bi,bj).LE.ZERO) THEN |
71 |
C SUPERCOOLING, CONVERT TO ICE |
72 |
HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj) |
73 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj)-YNEG(I,J,bi,bj) |
74 |
C HERE YNEG IS THE OCEAN TEMP. DIFFERENCE WITH SUPER-COOLING |
75 |
YNEG(I,J,bi,bj)=TBC-theta(I,J,1,bi,bj) |
76 |
theta(I,J,1,bi,bj)=TBC |
77 |
ELSE |
78 |
C NOW CORRECT ICE THICKNESS |
79 |
GHEFF(I,J)=HEFF(I,J,1,bi,bj) |
80 |
HEFF(I,J,3,bi,bj)=HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj) |
81 |
HEFF(I,J,1,bi,bj)=MAX(ZERO,HEFF(I,J,3,bi,bj)) |
82 |
C NOW CORRECT YNEG |
83 |
YNEG(I,J,bi,bj)=HEFF(I,J,1,bi,bj)-HEFF(I,J,3,bi,bj) |
84 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
85 |
& +(HEFF(I,J,1,bi,bj)-GHEFF(I,J)) |
86 |
theta_old=theta(I,J,1,bi,bj) |
87 |
theta(I,J,1,bi,bj)= |
88 |
& (YNEG(I,J,bi,bj)*72.0764 _d 0/dRf(1)+TBC) |
89 |
C HERE YNEG IS THE OCEAN TEMP. DIFFERENCE WITH NO SUPER-COOLING |
90 |
YNEG(I,J,bi,bj)=theta(I,J,1,bi,bj)-theta_old |
91 |
ENDIF |
92 |
C surfaceTendencyTice is the equivalent amount of surface heating |
93 |
C implied by above change in surface level temperature (YNEG). |
94 |
C Units are degrees/s (>0 for ocean warming). |
95 |
surfaceTendencyTice(I,J,bi,bj)=YNEG(I,J,bi,bj)/deltaTtracer |
96 |
ENDDO |
97 |
ENDDO |
98 |
ENDDO |
99 |
ENDDO |
100 |
|
101 |
C GROWTH SUBROUTINE CALCULATES TOTAL GROWTH TENDENCIES, |
102 |
C INCLUDING SNOWFALL |
103 |
CALL GROATB(A22,myThid) |
104 |
|
105 |
DO bj=myByLo(myThid),myByHi(myThid) |
106 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
107 |
C NOW CALCULATE CORRECTED GROWTH |
108 |
DO J=1,sNy |
109 |
DO I=1,sNx |
110 |
GHEFF(I,J)=-DELTAT*FICE(I,J,bi,bj) |
111 |
GAREA(I,J)=HSNOW(I,J,bi,bj)*QS |
112 |
IF(GHEFF(I,J).GT.ZERO.AND.GHEFF(I,J).LE.GAREA(I,J)) THEN |
113 |
HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS |
114 |
C SNOW CONVERTED INTO WATER AND THEN INTO ICE |
115 |
C The factor 0.920 is used to convert m of sea-ice to m of freshwater |
116 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
117 |
& -(GHEFF(I,J)/QS)/SDF/0.920 _d 0*AR(I,J,bi,bj) |
118 |
WATR(I,J,bi,bj)=WATR(I,J,bi,bj) |
119 |
& -(GHEFF(I,J)/QS)/SDF/0.920 _d 0*AR(I,J,bi,bj) |
120 |
FICE(I,J,bi,bj)=ZERO |
121 |
ELSE IF(GHEFF(I,J).GT.GAREA(I,J)) THEN |
122 |
FICE(I,J,bi,bj)=-(GHEFF(I,J)-GAREA(I,J))/DELTAT |
123 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
124 |
& -HSNOW(I,J,bi,bj)/SDF/0.920 _d 0*AR(I,J,bi,bj) |
125 |
WATR(I,J,bi,bj)=WATR(I,J,bi,bj) |
126 |
& -HSNOW(I,J,bi,bj)/SDF/0.920*AR(I,J,bi,bj) |
127 |
HSNOW(I,J,bi,bj)=0.0 |
128 |
END IF |
129 |
|
130 |
ENDDO |
131 |
ENDDO |
132 |
|
133 |
C NOW GET TOTAL GROWTH RATE |
134 |
DO J=1,sNy |
135 |
DO I=1,sNx |
136 |
FHEFF(I,J,bi,bj)=FICE(I,J,bi,bj)*AR(I,J,bi,bj) |
137 |
& +(ONE-AR(I,J,bi,bj))*FO(I,J,bi,bj) |
138 |
ENDDO |
139 |
ENDDO |
140 |
|
141 |
|
142 |
C NOW UPDATE AREA |
143 |
DO J=1,sNy |
144 |
DO I=1,sNx |
145 |
GHEFF(I,J)=-DELTAT*FHEFF(I,J,bi,bj)*Q0 |
146 |
GAREA(I,J)=DELTAT*FO(I,J,bi,bj)*Q0 |
147 |
GHEFF(I,J)=-ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J)) |
148 |
GAREA(I,J)=MAX(ZERO,GAREA(I,J)) |
149 |
HCORR(I,J,bi,bj)=MIN(ZERO,GHEFF(I,J)) |
150 |
ENDDO |
151 |
ENDDO |
152 |
DO J=1,sNy |
153 |
DO I=1,sNx |
154 |
GAREA(I,J)=TWO*(ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO |
155 |
& +HALF*HCORR(I,J,bi,bj)*AREA(I,J,2,bi,bj) |
156 |
& /(HEFF(I,J,1,bi,bj)+.00001 _d 0) |
157 |
AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+GAREA(I,J) |
158 |
ENDDO |
159 |
ENDDO |
160 |
|
161 |
C NOW UPDATE HEFF |
162 |
DO J=1,sNy |
163 |
DO I=1,sNx |
164 |
GHEFF(I,J)=-DELTAT*FICE(I,J,bi,bj)*Q0*AR(I,J,bi,bj) |
165 |
GHEFF(I,J)=-ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J)) |
166 |
HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)+GHEFF(I,J) |
167 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj)+GHEFF(I,J) |
168 |
C NOW CALCULATE QNETI UNDER ICE IF ANY |
169 |
QNETI(I,J,bi,bj)=(GHEFF(I,J)-DELTAT*FICE(I,J,bi,bj) |
170 |
& *Q0*AR(I,J,bi,bj))/Q0/DELTAT |
171 |
ENDDO |
172 |
ENDDO |
173 |
|
174 |
C NOW GET TOTAL QNET AND QSW |
175 |
DO J=1,sNy |
176 |
DO I=1,sNx |
177 |
QNET(I,J,bi,bj)=QNETI(I,J,bi,bj)*AR(I,J,bi,bj) |
178 |
& +(ONE-AR(I,J,bi,bj))*QNETO(I,J,bi,bj) |
179 |
QSW(I,J,bi,bj)=QSWI(I,J,bi,bj)*AR(I,J,bi,bj) |
180 |
& +(ONE-AR(I,J,bi,bj))*QSWO(I,J,bi,bj) |
181 |
#ifndef SHORTWAVE_HEATING |
182 |
QNET(I,J,bi,bj)=QNET(I,J,bi,bj)+QSW(I,J,bi,bj) |
183 |
#endif |
184 |
ENDDO |
185 |
ENDDO |
186 |
|
187 |
C NOW UPDATE OTHER THINGS |
188 |
DO J=1,sNy |
189 |
DO I=1,sNx |
190 |
IF(FICE(I,J,bi,bj).GT.ZERO) THEN |
191 |
C FREEZING, PRECIP ADDED AS SNOW |
192 |
HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj) |
193 |
& +DELTAT*PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF |
194 |
ELSE |
195 |
C ADD PRECIP AS RAIN, WATER CONVERTED INTO ICE BY /0.920 _d 0 |
196 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
197 |
& -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*DELTAT/0.920 _d 0 |
198 |
WATR(I,J,bi,bj)=WATR(I,J,bi,bj) |
199 |
& -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*DELTAT/0.920 _d 0 |
200 |
ENDIF |
201 |
c Now add in precip over open water directly into ocean as negative salt |
202 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
203 |
& -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj)) |
204 |
& *DELTAT/0.920 _d 0 |
205 |
WATR(I,J,bi,bj)=WATR(I,J,bi,bj) |
206 |
& -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj)) |
207 |
& *DELTAT/0.920 _d 0 |
208 |
C NOW GET FRESH WATER FLUX |
209 |
EmPmR(I,J,bi,bj)=EVAP(I,J,bi,bj)-RUNOFF(I,J,bi,bj) |
210 |
& +SEAICE_SALT(I,J,bi,bj)*0.92 _d 0/DELTAT |
211 |
ENDDO |
212 |
ENDDO |
213 |
|
214 |
#ifdef SEAICE_DEBUG |
215 |
c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid ) |
216 |
c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid ) |
217 |
CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid ) |
218 |
CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid ) |
219 |
CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid ) |
220 |
CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid ) |
221 |
CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid ) |
222 |
CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid ) |
223 |
CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid ) |
224 |
DO j=1-OLy,sNy+OLy |
225 |
DO i=1-OLx,sNx+OLx |
226 |
GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2) |
227 |
GAREA(I,J)=HEFF(I,J,1,bi,bj) |
228 |
print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj) |
229 |
ENDDO |
230 |
ENDDO |
231 |
CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid ) |
232 |
CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid ) |
233 |
DO j=1-OLy,sNy+OLy |
234 |
DO i=1-OLx,sNx+OLx |
235 |
if(HEFF(i,j,1,bi,bj).gt.1.) then |
236 |
print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j, |
237 |
& HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj) |
238 |
print '(A,3f10.2)','QSW, QNET before/after correction', |
239 |
& QSW(I,J,bi,bj),QNETI(I,J,bi,bj)*AR(I,J,bi,bj) |
240 |
& +(ONE-AR(I,J,bi,bj))*QNETO(I,J,bi,bj), QNET(I,J,bi,bj) |
241 |
endif |
242 |
ENDDO |
243 |
ENDDO |
244 |
#endif /* SEAICE_DEBUG */ |
245 |
|
246 |
crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ? |
247 |
#define DO_WE_NEED_THIS |
248 |
C NOW ZERO OUTSIDE POINTS |
249 |
DO J=1,sNy |
250 |
DO I=1,sNx |
251 |
C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS |
252 |
AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj) |
253 |
& ,HEFF(I,J,1,bi,bj)/.0001 _d 0) |
254 |
C NOW TRUNCATE AREA |
255 |
#ifdef DO_WE_NEED_THIS |
256 |
AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj)) |
257 |
AREA(I,J,1,bi,bj)=MAX(ZERO,AREA(I,J,1,bi,bj)) |
258 |
HSNOW(I,J,bi,bj)=MAX(ZERO,HSNOW(I,J,bi,bj)) |
259 |
#endif |
260 |
AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj) |
261 |
HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj) |
262 |
#ifdef DO_WE_NEED_THIS |
263 |
HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj)) |
264 |
#endif |
265 |
HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
266 |
ENDDO |
267 |
ENDDO |
268 |
|
269 |
ENDDO |
270 |
ENDDO |
271 |
|
272 |
#endif /* ALLOW_SEAICE */ |
273 |
|
274 |
RETURN |
275 |
END |