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 |
YNEG(I,J,bi,bj)=(theta(I,J,1,bi,bj)-TBC)*dRf(1)/72.0764 _d 0 |
63 |
IF(YNEG(I,J,bi,bj).LE.ZERO) THEN |
64 |
C SUPERCOOLING, CONVERT TO ICE |
65 |
HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj) |
66 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj)-YNEG(I,J,bi,bj) |
67 |
C HERE YNEG IS THE OCEAN TEMP. DIFFERENCE WITH SUPER-COOLING |
68 |
YNEG(I,J,bi,bj)=TBC-theta(I,J,1,bi,bj) |
69 |
theta(I,J,1,bi,bj)=TBC |
70 |
ELSE |
71 |
C NOW CORRECT ICE THICKNESS |
72 |
GHEFF(I,J)=HEFF(I,J,1,bi,bj) |
73 |
HEFF(I,J,3,bi,bj)=HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj) |
74 |
HEFF(I,J,1,bi,bj)=MAX(ZERO,HEFF(I,J,3,bi,bj)) |
75 |
C NOW CORRECT YNEG |
76 |
YNEG(I,J,bi,bj)=HEFF(I,J,1,bi,bj)-HEFF(I,J,3,bi,bj) |
77 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
78 |
& +(HEFF(I,J,1,bi,bj)-GHEFF(I,J)) |
79 |
theta_old=theta(I,J,1,bi,bj) |
80 |
theta(I,J,1,bi,bj)= |
81 |
& (YNEG(I,J,bi,bj)*72.0764 _d 0/dRf(1)+TBC) |
82 |
C HERE YNEG IS THE OCEAN TEMP. DIFFERENCE WITH NO SUPER-COOLING |
83 |
YNEG(I,J,bi,bj)=theta(I,J,1,bi,bj)-theta_old |
84 |
ENDIF |
85 |
C surfaceTendencyTice is the equivalent amount of surface heating |
86 |
C implied by above change in surface level temperature (YNEG). |
87 |
C Units are degrees/s (>0 for ocean warming). |
88 |
surfaceTendencyTice(I,J,bi,bj)=YNEG(I,J,bi,bj)/deltaTtracer |
89 |
ENDDO |
90 |
ENDDO |
91 |
ENDDO |
92 |
ENDDO |
93 |
|
94 |
C GROWTH SUBROUTINE CALCULATES TOTAL GROWTH TENDENCIES, |
95 |
C INCLUDING SNOWFALL |
96 |
CALL GROATB(A22,myThid) |
97 |
|
98 |
DO bj=myByLo(myThid),myByHi(myThid) |
99 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
100 |
C NOW CALCULATE CORRECTED GROWTH |
101 |
DO J=1,sNy |
102 |
DO I=1,sNx |
103 |
cdm ===> why is following line here? |
104 |
cdm FICE(I,J,bi,bj)=FICE(I,J,bi,bj) |
105 |
GHEFF(I,J)=-DELTAT*FICE(I,J,bi,bj) |
106 |
GAREA(I,J)=HSNOW(I,J,bi,bj)*QS |
107 |
IF(GHEFF(I,J).GT.ZERO.AND.GHEFF(I,J).LE.GAREA(I,J)) THEN |
108 |
HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS |
109 |
C SNOW CONVERTED INTO WATER AND THEN INTO ICE |
110 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
111 |
& -(GHEFF(I,J)/QS)/SDF/0.920 _d 0*AR(I,J,bi,bj) |
112 |
WATR(I,J,bi,bj)=WATR(I,J,bi,bj) |
113 |
& -(GHEFF(I,J)/QS)/SDF/0.920 _d 0*AR(I,J,bi,bj) |
114 |
FICE(I,J,bi,bj)=ZERO |
115 |
ELSE IF(GHEFF(I,J).GT.GAREA(I,J)) THEN |
116 |
FICE(I,J,bi,bj)=-(GHEFF(I,J)-GAREA(I,J))/DELTAT |
117 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
118 |
& -HSNOW(I,J,bi,bj)/SDF/0.920 _d 0*AR(I,J,bi,bj) |
119 |
WATR(I,J,bi,bj)=WATR(I,J,bi,bj) |
120 |
& -HSNOW(I,J,bi,bj)/SDF/0.920*AR(I,J,bi,bj) |
121 |
HSNOW(I,J,bi,bj)=0.0 |
122 |
END IF |
123 |
|
124 |
ENDDO |
125 |
ENDDO |
126 |
|
127 |
C NOW GET TOTAL GROWTH RATE |
128 |
DO J=1,sNy |
129 |
DO I=1,sNx |
130 |
FHEFF(I,J,bi,bj)=FICE(I,J,bi,bj)*AR(I,J,bi,bj) |
131 |
& +(ONE-AR(I,J,bi,bj))*FO(I,J,bi,bj) |
132 |
ENDDO |
133 |
ENDDO |
134 |
|
135 |
|
136 |
C NOW UPDATE AREA |
137 |
DO J=1,sNy |
138 |
DO I=1,sNx |
139 |
GHEFF(I,J)=-DELTAT*FHEFF(I,J,bi,bj)*Q0 |
140 |
GAREA(I,J)=DELTAT*FO(I,J,bi,bj)*Q0 |
141 |
GHEFF(I,J)=-ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J)) |
142 |
GAREA(I,J)=MAX(ZERO,GAREA(I,J)) |
143 |
HCORR(I,J,bi,bj)=MIN(ZERO,GHEFF(I,J)) |
144 |
ENDDO |
145 |
ENDDO |
146 |
DO J=1,sNy |
147 |
DO I=1,sNx |
148 |
GAREA(I,J)=TWO*(ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO |
149 |
& +HALF*HCORR(I,J,bi,bj)*AREA(I,J,2,bi,bj) |
150 |
& /(HEFF(I,J,1,bi,bj)+.00001 _d 0) |
151 |
AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+GAREA(I,J) |
152 |
ENDDO |
153 |
ENDDO |
154 |
|
155 |
C NOW UPDATE HEFF |
156 |
DO J=1,sNy |
157 |
DO I=1,sNx |
158 |
GHEFF(I,J)=-DELTAT*FICE(I,J,bi,bj)*Q0*AR(I,J,bi,bj) |
159 |
GHEFF(I,J)=-ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J)) |
160 |
HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)+GHEFF(I,J) |
161 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj)+GHEFF(I,J) |
162 |
C NOW CALCULATE QNETI UNDER ICE IF ANY |
163 |
QNETI(I,J,bi,bj)=(GHEFF(I,J)-DELTAT*FICE(I,J,bi,bj) |
164 |
& *Q0*AR(I,J,bi,bj))/Q0/DELTAT |
165 |
ENDDO |
166 |
ENDDO |
167 |
|
168 |
C NOW GET TOTAL QNET AND QSW |
169 |
DO J=1,sNy |
170 |
DO I=1,sNx |
171 |
QNET(I,J,bi,bj)=QNETI(I,J,bi,bj)*AR(I,J,bi,bj) |
172 |
& +(ONE-AR(I,J,bi,bj))*QNETO(I,J,bi,bj) |
173 |
QSW(I,J,bi,bj)=QSWI(I,J,bi,bj)*AR(I,J,bi,bj) |
174 |
& +(ONE-AR(I,J,bi,bj))*QSWO(I,J,bi,bj) |
175 |
ENDDO |
176 |
ENDDO |
177 |
|
178 |
C NOW UPDATE OTHER THINGS |
179 |
DO J=1,sNy |
180 |
DO I=1,sNx |
181 |
IF(FICE(I,J,bi,bj).GT.ZERO) THEN |
182 |
C FREEZING, PRECIP ADDED AS SNOW |
183 |
HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj) |
184 |
& +DELTAT*PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF |
185 |
ELSE |
186 |
C ADD PRECIP AS RAIN, WATER CONVERTED INTO ICE BY /0.920 _d 0 |
187 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
188 |
& -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*DELTAT/0.920 _d 0 |
189 |
WATR(I,J,bi,bj)=WATR(I,J,bi,bj) |
190 |
& -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*DELTAT/0.920 _d 0 |
191 |
ENDIF |
192 |
c Now add in precip over open water directly into ocean as negative salt |
193 |
SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) |
194 |
& -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj)) |
195 |
& *DELTAT/0.920 _d 0 |
196 |
WATR(I,J,bi,bj)=WATR(I,J,bi,bj) |
197 |
& -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj)) |
198 |
& *DELTAT/0.920 _d 0 |
199 |
C NOW GET FRESH WATER FLUX |
200 |
EmPmR(I,J,bi,bj)=EVAP(I,J,bi,bj)-RUNOFF(I,J,bi,bj) |
201 |
& +SEAICE_SALT(I,J,bi,bj)*0.92 _d 0/DELTAT |
202 |
ENDDO |
203 |
ENDDO |
204 |
|
205 |
#ifdef SEAICE_DEBUG |
206 |
c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid ) |
207 |
c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid ) |
208 |
CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid ) |
209 |
CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid ) |
210 |
CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid ) |
211 |
CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid ) |
212 |
CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid ) |
213 |
CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid ) |
214 |
CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid ) |
215 |
DO j=1-OLy,sNy+OLy |
216 |
DO i=1-OLx,sNx+OLx |
217 |
GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2) |
218 |
GAREA(I,J)=HEFF(I,J,1,bi,bj) |
219 |
print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj) |
220 |
ENDDO |
221 |
ENDDO |
222 |
CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid ) |
223 |
CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid ) |
224 |
DO j=1-OLy,sNy+OLy |
225 |
DO i=1-OLx,sNx+OLx |
226 |
if(HEFF(i,j,1,bi,bj).gt.1.) then |
227 |
print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j, |
228 |
& HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj) |
229 |
print '(A,3f10.2)','QSW, QNET before/after correction', |
230 |
& QSW(I,J,bi,bj),QNETI(I,J,bi,bj)*AR(I,J,bi,bj) |
231 |
& +(ONE-AR(I,J,bi,bj))*QNETO(I,J,bi,bj), QNET(I,J,bi,bj) |
232 |
endif |
233 |
ENDDO |
234 |
ENDDO |
235 |
#endif SEAICE_DEBUG |
236 |
|
237 |
crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ? |
238 |
#define DO_WE_NEED_THIS |
239 |
C NOW ZERO OUTSIDE POINTS |
240 |
DO J=1,sNy |
241 |
DO I=1,sNx |
242 |
C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS |
243 |
AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj) |
244 |
& ,HEFF(I,J,1,bi,bj)/.0001 _d 0) |
245 |
C NOW TRUNCATE AREA |
246 |
#ifdef DO_WE_NEED_THIS |
247 |
AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj)) |
248 |
AREA(I,J,1,bi,bj)=MAX(ZERO,AREA(I,J,1,bi,bj)) |
249 |
HSNOW(I,J,bi,bj)=MAX(ZERO,HSNOW(I,J,bi,bj)) |
250 |
#endif DO_WE_NEED_THIS |
251 |
AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj) |
252 |
HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj) |
253 |
#ifdef DO_WE_NEED_THIS |
254 |
HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj)) |
255 |
#endif DO_WE_NEED_THIS |
256 |
HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
257 |
ENDDO |
258 |
ENDDO |
259 |
|
260 |
ENDDO |
261 |
ENDDO |
262 |
|
263 |
#endif ALLOW_SEAICE |
264 |
|
265 |
RETURN |
266 |
END |