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

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

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


Revision 1.4 - (show annotations) (download)
Sat Dec 28 10:11:11 2002 UTC (21 years, 5 months ago) by dimitri
Branch: MAIN
CVS Tags: checkpoint47j_post, checkpoint48d_pre, checkpoint47f_post, checkpoint48d_post, checkpoint48a_post, checkpoint48e_post, checkpoint47i_post, checkpoint47h_post, checkpoint48c_post, checkpoint48, checkpoint47g_post, checkpoint48b_post, checkpoint48c_pre
Branch point for: c24_e25_ice, ecco-branch
Changes since 1.3: +9 -9 lines
checkpoint47f_post
Merging from release1_p10:
o modifications for using pkg/exf with pkg/seaice
  - pkg/seaice CPP options SEAICE_EXTERNAL_FORCING
    and SEAICE_EXTERNAL_FLUXES
  - pkg/exf CPP options EXF_READ_EVAP and
    EXF_NO_BULK_COMPUTATIONS
  - usage examples are Experiments 8 and 9 in
    verification/lab_sea/README
  - verification/lab_sea default experiment now uses
    pkg/gmredi, pkg/kpp, pkg/seaice, and pkg/exf

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

  ViewVC Help
Powered by ViewVC 1.1.22