*IF DEF,SEAICE ICEUPDT.2 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.15082 C GTS2F400.15083 C Use, duplication or disclosure of this code is subject to the GTS2F400.15084 C restrictions as set forth in the contract. GTS2F400.15085 C GTS2F400.15086 C Meteorological Office GTS2F400.15087 C London Road GTS2F400.15088 C BRACKNELL GTS2F400.15089 C Berkshire UK GTS2F400.15090 C RG12 2SZ GTS2F400.15091 C GTS2F400.15092 C If no contract has been raised with this copy of the code, the use, GTS2F400.15093 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.15094 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.15095 C Modelling at the above address. GTS2F400.15096 C ******************************COPYRIGHT****************************** GTS2F400.15097 C GTS2F400.15098 !+ Update ice prognostics: aice and hice and dependant logical: icy ICEUPDT.3 ! ICEUPDT.4 ! Subroutine Interface: ICEUPDT.5SUBROUTINE ice_update_ice( 1ICEUPDT.6 *CALL ARGOINDX
ORH7F402.255 & imt,jmt ICEUPDT.7 &,delh,dela,newice ICEUPDT.8 &,hice,aice,icy ICEUPDT.9 & ) ICEUPDT.10 ICEUPDT.11 IMPLICIT NONE ICEUPDT.12 ! ICEUPDT.13 ! Description: ICEUPDT.14 ! Updates ice depth and concentration by the corresponding ICEUPDT.15 ! increments. Updates 'icy' - now also true if new ice is forming ICEUPDT.16 ! this time step. ICEUPDT.17 ! ICEUPDT.18 ! Method: ICEUPDT.19 ! Straight forward nested do loops. ICEUPDT.20 ! ICEUPDT.21 ! Current Code Owner: Steve Foreman ICEUPDT.22 ! ICEUPDT.23 ! History: ICEUPDT.24 ! Version Date Comment ICEUPDT.25 ! ------- ---- ------- ICEUPDT.26 ! pre 4.0 Part of subroutine ICEFLOE ICEUPDT.27 ! 4.0 15.6.95 Code separated by Chris Sherlock ICEUPDT.28 ! ICEUPDT.29 ! Code Description: ICEUPDT.30 ! Language: FORTRAN 77 + common extensions. ICEUPDT.31 ! This code is written to UMDP3 v6 programming standards. ICEUPDT.32 ! ICEUPDT.33 ! System component covered: P4 ICEUPDT.34 ! System Task: ICEUPDT.35 ! ICEUPDT.36 ! Declarations: ICEUPDT.37 ! These are of the form:- ICEUPDT.38 ! INTEGER ExampleVariable !Description of variable ICEUPDT.39 ! ICEUPDT.40 ! Global variables (*CALLed COMDECKs etc...): ICEUPDT.41 ! NONE ICEUPDT.42 ! ORH3F402.226 ! Subroutine arguments ICEUPDT.43 *CALL TYPOINDX
ORH7F402.256 ! Scalar arguments with intent(in): ICEUPDT.44 INTEGER imt ! IN row size ICEUPDT.45 INTEGER jmt ! IN column size ICEUPDT.46 ICEUPDT.47 ! Array arguments with intent(in): ICEUPDT.48 REAL delh(imt,jmt) ! IN ice depth increment ICEUPDT.49 REAL dela(imt,jmt) ! IN ice conc. increment ICEUPDT.50 LOGICAL newice(imt,jmt) ! IN t if fresh ice is forming ICEUPDT.51 ICEUPDT.52 ! Scalar arguments with intent(InOut): ICEUPDT.53 ICEUPDT.54 ! Array arguments with intent(InOut): ICEUPDT.55 REAL hice(imt,jmt) ! INOUT effective ice depth ICEUPDT.56 REAL aice(imt,jmt) ! INOUT ice concentration ICEUPDT.57 LOGICAL icy(imt,jmt) ! INOUT true if ice in grid box ICEUPDT.58 ICEUPDT.59 ! Scalar arguments with intent(out): ICEUPDT.60 ICEUPDT.61 ! Array arguments with intent(out): ICEUPDT.62 ICEUPDT.63 ! Local parameters: ICEUPDT.64 ICEUPDT.65 ! Local scalars: ICEUPDT.66 INTEGER i,j ! loop counters ICEUPDT.67 ICEUPDT.68 ! Local dynamic arrays: ICEUPDT.69 ICEUPDT.70 ! Function & Subroutine calls: ICEUPDT.71 ICEUPDT.72 !- End of header ICEUPDT.73 ICEUPDT.74 DO j = J_1,J_jmt ORH3F402.227 DO i=1,imt ICEUPDT.76 ICY(I,J) = ICY(I,J) .OR. NEWICE(I,J) ICEUPDT.77 IF ( ICY(I,J) ) THEN ICEUPDT.78 HICE(I,J) = HICE(I,J) + DELH(I,J) ICEUPDT.79 AICE(I,J) = AICE(I,J) + DELA(I,J) ICEUPDT.80 ENDIF ICEUPDT.81 ENDDO ICEUPDT.82 ENDDO ICEUPDT.83 c ICEUPDT.84 RETURN ICEUPDT.85 END ICEUPDT.86 ICEUPDT.87 !+ Update ocean variables: caryheat and carysalt ICEUPDT.88 ! ICEUPDT.89 ! Subroutine Interface: ICEUPDT.90
SUBROUTINE ice_update_ocean( 1ICEUPDT.91 *CALL ARGOINDX
ORH7F402.257 & imt,jmt ICEUPDT.92 &,qsbydt,salice,const1,const2,const4 ICEUPDT.93 &,surfsal,sublim,newice ICEUPDT.94 &,hsnow,delh,dela ICEUPDT.95 &,caryheat,carysalt,snowmelt ICEUPDT.96 &,icy ICEUPDT.97 &, salref) OJL1F405.56 ICEUPDT.99 IMPLICIT NONE ICEUPDT.100 ! ICEUPDT.101 ! Description: ICEUPDT.102 ! ICEUPDT.103 ! ICEUPDT.104 ! Method: ICEUPDT.105 ! Straight forward 'if test' within nested do loops. ICEUPDT.106 ! ICEUPDT.107 ! Current Code Owner: Steve Foreman ICEUPDT.108 ! ICEUPDT.109 ! History: ICEUPDT.110 ! Version Date Comment ICEUPDT.111 ! ------- ---- ------- ICEUPDT.112 ! pre 4.0 Part of subroutine ICEFLOE ICEUPDT.113 ! 4.0 15.6.95 Code separated by Chris Sherlock ICEUPDT.114 ! ICEUPDT.115 ! Code Description: ICEUPDT.116 ! Language: FORTRAN 77 + common extensions. ICEUPDT.117 ! This code is written to UMDP3 v6 programming standards. ICEUPDT.118 ! ICEUPDT.119 ! System component covered: P4 ICEUPDT.120 ! System Task: ICEUPDT.121 ! ICEUPDT.122 ! Declarations: ICEUPDT.123 ! These are of the form:- ICEUPDT.124 ! INTEGER ExampleVariable !Description of variable ICEUPDT.125 ! ICEUPDT.126 ! Global variables (*CALLed COMDECKs etc...): ICEUPDT.127 ! NONE ICEUPDT.128 ! Subroutine arguments ICEUPDT.129 *CALL CNTLOCN
OJL1F405.58 *CALL TYPOINDX
ORH7F402.258 ! Scalar arguments with intent(in): ICEUPDT.130 ! ORH3F402.228 INTEGER imt ! IN row size ICEUPDT.131 INTEGER jmt ! IN column size ICEUPDT.132 REAL qsbydt ! IN volumetric heat of fusion (ocn) / time step ICEUPDT.133 REAL salice ! IN reference salinity for ice ICEUPDT.134 REAL const1 ! IN rhoice/rhowater / depth of ocean level 1 ICEUPDT.135 REAL const2 ! IN rhosno/rhowater / depth of ocean level 1 ICEUPDT.136 REAL const4 ! IN timestep / (rhowater * " " " " " " " " ") ICEUPDT.137 real salref OJL1F405.57 ICEUPDT.138 ! Array arguments with intent(in): ICEUPDT.139 REAL surfsal(imt,jmt) ! IN salinity of top ocean level ICEUPDT.140 REAL sublim(imt,jmt) ! IN rate of sublimation kg m-2 s-1 ICEUPDT.141 LOGICAL newice(imt,jmt) ! IN t if ice is just starting to form ICEUPDT.142 ICEUPDT.143 ! Scalar arguments with intent(InOut): ICEUPDT.144 ICEUPDT.145 ! Array arguments with intent(InOut): ICEUPDT.146 REAL hsnow(imt,jmt) ! INOUT snow depth over ice ICEUPDT.147 REAL delh(imt,jmt) ! INOUT ice depth increment ICEUPDT.148 REAL dela(imt,jmt) ! INOUT ice conc. increment ICEUPDT.149 REAL caryheat(imt,jmt) ! INOUT misc. heat ice <==> ocean ICEUPDT.150 REAL carysalt(imt,jmt) ! INOUT salinity flux ice => ocean ICEUPDT.151 REAL snowmelt(imt,jmt) ! INOUT keeps track of snow that melts ICEUPDT.152 ! during a time step for contrib. to ICEUPDT.153 ! carysalt. ICEUPDT.154 LOGICAL icy(imt,jmt) ! INOUT true if ice in grid box ICEUPDT.155 ICEUPDT.156 ! Scalar arguments with intent(out): ICEUPDT.157 ICEUPDT.158 ! Array arguments with intent(out): ICEUPDT.159 ICEUPDT.160 ! Local parameters: ICEUPDT.161 ICEUPDT.162 ! Local scalars: ICEUPDT.163 INTEGER i,j ! loop counters ICEUPDT.164 ICEUPDT.165 ! Local dynamic arrays: ICEUPDT.166 ICEUPDT.167 ! Function & Subroutine calls: ICEUPDT.168 ICEUPDT.169 !- End of header ICEUPDT.170 !--------------------------------------------------------- ICEUPDT.171 DO j = J_1,J_jmt ORH3F402.229 DO i=1,imt ICEUPDT.173 ICEUPDT.174 ! COMPUTE THE ICE CONTRIBUTION TO CARYSALT FOR ALL POINTS EXCEPT ICEUPDT.175 ! NEWLY-MELTED ONES. SUBLIMATION INCREASES SALINITY,AS THE SALT ICEUPDT.176 ! LEFT BEHIND IS ASSUMED TO BLOW INTO THE LEADS. ICEUPDT.177 ICEUPDT.178 IF ( ICY(I,J) ) THEN ICEUPDT.179 if (L_REFSAL) then OJL1F405.59 CARYSALT(I,J) = carysalt(i,j) OJL1F405.60 & +CONST1*(salref-SALICE )*DELH(I,J) OJL1F405.61 & +CONST4*SUBLIM(I,J)*salref OJL1F405.62 else OJL1F405.63 CARYSALT(I,J) = carysalt(i,j) OJL1F405.64 & + CONST1*( SURFSAL(I,J) - SALICE )*DELH(I,J) OJL1F405.65 & + CONST4*SUBLIM(I,J)*SURFSAL(I,J) OJL1F405.66 endif OJL1F405.67 ENDIF ICEUPDT.183 ICEUPDT.184 ! NOW,FOR BOXES WHICH (A) HAVE BEEN ICY THROUGHOUT THE STEP,AND ICEUPDT.185 ! (B) HAVE A REDUCED ICE AREA: STORE THE HEAT NEEDED TO MELT THE ICEUPDT.186 ! SNOW THAT HAS 'FALLEN IN', FOR COOLING THE OCEAN NEXT STEP. ICEUPDT.187 ! ALSO MAKE A SIMILAR ADJUSTMENT TO SNOWMELT. ICEUPDT.188 ICEUPDT.189 IF ( ICY(I,J) .AND. DELA(I,J) .LT. 0.0 ) THEN ICEUPDT.190 SNOWMELT(I,J) = SNOWMELT(I,J) - HSNOW(I,J)*DELA(I,J) ICEUPDT.191 CARYHEAT(I,J) = caryheat(i,j) ICEUPDT.192 & + QSBYDT*HSNOW(I,J)*DELA(I,J) ICEUPDT.193 ENDIF ICEUPDT.194 ICEUPDT.195 ! ADD IN THE SNOW CONTRIBUTION TO CARYSALT. ICEUPDT.196 ICEUPDT.197 IF ( ICY(I,J) ) THEN ICEUPDT.198 if (L_REFSAL) then OJL1F405.68 SNOWMELT(I,J)=CONST2*SNOWMELT(I,J)*salref OJL1F405.69 else OJL1F405.70 SNOWMELT(I,J) = CONST2*SNOWMELT(I,J)*SURFSAL(I,J) OJL1F405.71 endif OJL1F405.72 CARYSALT(I,J) = CARYSALT(I,J) - SNOWMELT(I,J) ICEUPDT.200 ENDIF ICEUPDT.201 ICEUPDT.202 ENDDO ICEUPDT.203 ENDDO ICEUPDT.204 ICEUPDT.205 RETURN ICEUPDT.206 END ICEUPDT.207 !+ Update snow depth ICEUPDT.208 ! ICEUPDT.209 ! Subroutine Interface: ICEUPDT.210
SUBROUTINE ice_update_snow( 1ICEUPDT.211 *CALL ARGOINDX
ORH7F402.259 & imt,jmt ICEUPDT.212 &,aice,dela ICEUPDT.213 &,hsnow ICEUPDT.214 & ) ICEUPDT.215 ICEUPDT.216 IMPLICIT NONE ICEUPDT.217 ! ICEUPDT.218 ! Description: ICEUPDT.219 ! Updates snow depth when ice fraction has increased, so as to ICEUPDT.220 ! conserve the total mass of snow. ICEUPDT.221 ! ICEUPDT.222 ! Method: ICEUPDT.223 ! Straight forward nested do loops. ICEUPDT.224 ! ICEUPDT.225 ! Current Code Owner: Steve Foreman ICEUPDT.226 ! ICEUPDT.227 ! History: ICEUPDT.228 ! Version Date Comment ICEUPDT.229 ! ------- ---- ------- ICEUPDT.230 ! pre 4.0 Part of subroutine ICEFLOE ICEUPDT.231 ! 4.0 15.6.95 Code separated by Chris Sherlock ICEUPDT.232 ! ICEUPDT.233 ! Code Description: ICEUPDT.234 ! Language: FORTRAN 77 + common extensions. ICEUPDT.235 ! This code is written to UMDP3 v6 programming standards. ICEUPDT.236 ! ICEUPDT.237 ! System component covered: P4 ICEUPDT.238 ! System Task: ICEUPDT.239 ! ICEUPDT.240 ! Declarations: ICEUPDT.241 ! These are of the form:- ICEUPDT.242 ! INTEGER ExampleVariable !Description of variable ICEUPDT.243 ! ICEUPDT.244 ! Global variables (*CALLed COMDECKs etc...): ICEUPDT.245 ! NONE ICEUPDT.246 ! Subroutine arguments ICEUPDT.247 *CALL TYPOINDX
ORH7F402.260 ! Scalar arguments with intent(in): ICEUPDT.248 ! ORH3F402.230 INTEGER imt ! IN row size ICEUPDT.249 INTEGER jmt ! IN column size ICEUPDT.250 ICEUPDT.251 ! Array arguments with intent(in): ICEUPDT.252 REAL aice(imt,jmt) ! IN ice conc. ICEUPDT.253 REAL dela(imt,jmt) ! IN ice conc. increment ICEUPDT.254 ICEUPDT.255 ! Scalar arguments with intent(InOut): ICEUPDT.256 ICEUPDT.257 ! Array arguments with intent(InOut): ICEUPDT.258 REAL hsnow(imt,jmt) ! INOUT snow depth ICEUPDT.259 ICEUPDT.260 ! Scalar arguments with intent(out): ICEUPDT.261 ICEUPDT.262 ! Array arguments with intent(out): ICEUPDT.263 ICEUPDT.264 ! Local parameters: ICEUPDT.265 ICEUPDT.266 ! Local scalars: ICEUPDT.267 INTEGER i,j ! loop counters ICEUPDT.268 ICEUPDT.269 ! Local dynamic arrays: ICEUPDT.270 ICEUPDT.271 ! Function & Subroutine calls: ICEUPDT.272 ICEUPDT.273 !- End of header ICEUPDT.274 !------------------------------------------------------------------ ICEUPDT.275 ! REDISTRIBUTE SNOW IF ICE AREA HAS INCREASED,USING THE INITIAL ICEUPDT.276 ! AND FINAL AREAL FRACTIONS ICEUPDT.277 ICEUPDT.278 DO j = J_1,J_jmt ORH3F402.231 DO i=1,imt ICEUPDT.280 IF ( dela(i,j) .GT. 0.0 ) THEN ICEUPDT.281 hsnow(i,j) = (hsnow(i,j)*(aice(i,j)-dela(i,j)))/aice(i,j) ICEUPDT.282 ENDIF ICEUPDT.283 ENDDO ICEUPDT.284 ENDDO ICEUPDT.285 ICEUPDT.286 RETURN ICEUPDT.287 END ICEUPDT.288 *ENDIF ICEUPDT.289