C $Header: /u/gcmpack/MITgcm/pkg/seaice/growth.F,v 1.23 2005/04/29 20:50:00 heimbach Exp $ C $Name: $ #include "SEAICE_OPTIONS.h" CStartOfInterface SUBROUTINE GROWTH( myTime, myIter, myThid ) C /==========================================================\ C | SUBROUTINE growth | C | o Updata ice thickness and snow depth | C |==========================================================| C \==========================================================/ IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "DYNVARS.h" #include "GRID.h" #include "FFIELDS.h" #include "SEAICE_PARAMS.h" #include "SEAICE.h" #include "SEAICE_FFIELDS.h" #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" #endif C === Routine arguments === C myTime - Simulation time C myIter - Simulation timestep number C myThid - Thread no. that called this routine. _RL myTime INTEGER myIter, myThid CEndOfInterface C === Local variables === C i,j,bi,bj - Loop counters INTEGER i, j, bi, bj _RL TBC, salinity_ice, SDF, Q0, QS _RL GAREA( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ) _RL GHEFF( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ) _RL AR ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, nSx, nSy ) C number of surface interface layer INTEGER kSurface if ( buoyancyRelation .eq. 'OCEANICP' ) then kSurface = Nr else kSurface = 1 endif salinity_ice=4.0 _d 0 ! ICE SALINITY TBC=SEAICE_freeze ! FREEZING TEMP. OF SEA WATER SDF=1000.0 _d 0/330.0 _d 0 ! RATIO OF WATER DESITY AND SNOW DENSITY Q0=1.0D-06/302.0 _d +00 ! INVERSE HEAT OF FUSION OF ICE QS=1.1 _d +08 ! HEAT OF FUSION OF SNOW DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) c cph( #ifdef ALLOW_AUTODIFF_TAMC act1 = bi - myBxLo(myThid) max1 = myBxHi(myThid) - myBxLo(myThid) + 1 act2 = bj - myByLo(myThid) max2 = myByHi(myThid) - myByLo(myThid) + 1 act3 = myThid - 1 max3 = nTx*nTy act4 = ikey_dynamics - 1 iicekey = (act1 + 1) + act2*max1 & + act3*max1*max2 & + act4*max1*max2*max3 #endif /* ALLOW_AUTODIFF_TAMC */ c #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE theta(:,:,:,bi,bj)= comlev1_bibj, CADJ & key = iicekey, byte = isbyte CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte CADJ STORE atemp(:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte #endif /* ALLOW_AUTODIFF_TAMC */ cph) DO J=1,sNy DO I=1,sNx SEAICE_SALT(I,J,bi,bj)=ZERO ENDDO ENDDO #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte #endif /* ALLOW_AUTODIFF_TAMC */ DO J=1,sNy DO I=1,sNx AR(I,J,bi,bj)=MIN(AREA(I,J,2,bi,bj), & HEFF(I,J,2,bi,bj)*1.0 _d +04) ENDDO ENDDO #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte #endif /* ALLOW_AUTODIFF_TAMC */ DO J=1,sNy DO I=1,sNx C-- Create or melt sea-ice so that first-level oceanic temperature C is approximately at the freezing point when there is sea-ice. C Initially the units of YNEG are m of sea-ice. C The factor dRf(1)/72.0764, used to convert temperature C change in deg K to m of sea-ice, is approximately: C dRf(1) * (sea water heat capacity = 3996 J/kg/K) C * (density of sea-water = 1026 kg/m^3) C / (latent heat of fusion of sea-ice = 334000 J/kg) C / (density of sea-ice = 910 kg/m^3) C Negative YNEG leads to ice growth. C Positive YNEG leads to ice melting. if ( .NOT. inAdMode ) then YNEG(I,J,bi,bj)=(theta(I,J,1,bi,bj)-TBC)*dRf(1)/72.0764 _d 0 else YNEG(I,J,bi,bj)= 0. endif GHEFF(I,J)=HEFF(I,J,1,bi,bj) HEFF(I,J,1,bi,bj)=MAX(ZERO,HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj)) YNEG(I,J,bi,bj)=GHEFF(I,J)-HEFF(I,J,1,bi,bj) SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj)-YNEG(I,J,bi,bj) C-- Now convert YNEG back to deg K. YNEG(I,J,bi,bj)=YNEG(I,J,bi,bj)*recip_dRf(1)*72.0764 _d 0 ENDDO ENDDO c ENDDO ENDDO cph( #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE area = comlev1, key = ikey_dynamics CADJ STORE atemp = comlev1, key = ikey_dynamics CADJ STORE heff = comlev1, key = ikey_dynamics CADJ STORE hsnow = comlev1, key = ikey_dynamics CADJ STORE lwdown = comlev1, key = ikey_dynamics CADJ STORE tice = comlev1, key = ikey_dynamics CADJ STORE uwind = comlev1, key = ikey_dynamics CADJ STORE vwind = comlev1, key = ikey_dynamics # ifdef SEAICE_MULTILEVEL CADJ STORE tices = comlev1, key = ikey_dynamics # endif #endif /* ALLOW_AUTODIFF_TAMC */ cph) C GROWTH SUBROUTINE CALCULATES TOTAL GROWTH TENDENCIES, C INCLUDING SNOWFALL CALL GROATB(A22,myThid) DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) cph( #ifdef ALLOW_AUTODIFF_TAMC act1 = bi - myBxLo(myThid) max1 = myBxHi(myThid) - myBxLo(myThid) + 1 act2 = bj - myByLo(myThid) max2 = myByHi(myThid) - myByLo(myThid) + 1 act3 = myThid - 1 max3 = nTx*nTy act4 = ikey_dynamics - 1 iicekey = (act1 + 1) + act2*max1 & + act3*max1*max2 & + act4*max1*max2*max3 #endif /* ALLOW_AUTODIFF_TAMC */ c #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte CADJ STORE fo(:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte CADJ STORE fice(:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte #endif /* ALLOW_AUTODIFF_TAMC */ cph) C NOW CALCULATE CORRECTED GROWTH DO J=1,sNy DO I=1,sNx GHEFF(I,J)=-SEAICE_deltaTtherm*FICE(I,J,bi,bj) GAREA(I,J)=HSNOW(I,J,bi,bj)*QS IF(GHEFF(I,J).GT.ZERO.AND.GHEFF(I,J).LE.GAREA(I,J)) THEN HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS C SNOW CONVERTED INTO WATER AND THEN INTO ICE C The factor 0.920 is used to convert m of sea-ice to m of freshwater SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) & -(GHEFF(I,J)/QS)/SDF/0.920 _d 0*AR(I,J,bi,bj) FICE(I,J,bi,bj)=ZERO ELSE IF(GHEFF(I,J).GT.GAREA(I,J)) THEN FICE(I,J,bi,bj)=-(GHEFF(I,J)-GAREA(I,J))/SEAICE_deltaTtherm SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) & -HSNOW(I,J,bi,bj)/SDF/0.920 _d 0*AR(I,J,bi,bj) HSNOW(I,J,bi,bj)=0.0 END
IF ENDDO ENDDO C NOW GET TOTAL GROWTH RATE DO J=1,sNy DO I=1,sNx FHEFF(I,J,bi,bj)=FICE(I,J,bi,bj)*AR(I,J,bi,bj) & +(ONE-AR(I,J,bi,bj))*FO(I,J,bi,bj) ENDDO ENDDO C NOW UPDATE AREA DO J=1,sNy DO I=1,sNx GHEFF(I,J)=-SEAICE_deltaTtherm*FHEFF(I,J,bi,bj)*Q0 GAREA(I,J)=SEAICE_deltaTtherm*FO(I,J,bi,bj)*Q0 GHEFF(I,J)=-ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J)) GAREA(I,J)=MAX(ZERO,GAREA(I,J)) HCORR(I,J,bi,bj)=MIN(ZERO,GHEFF(I,J)) ENDDO ENDDO DO J=1,sNy DO I=1,sNx GAREA(I,J)=TWO*(ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO & +HALF*HCORR(I,J,bi,bj)*AREA(I,J,2,bi,bj) & /(HEFF(I,J,1,bi,bj)+.00001 _d 0) AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+GAREA(I,J) ENDDO ENDDO C NOW UPDATE HEFF DO J=1,sNy DO I=1,sNx GHEFF(I,J)=-SEAICE_deltaTtherm* & FICE(I,J,bi,bj)*Q0*AR(I,J,bi,bj) GHEFF(I,J)=-ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J)) HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)+GHEFF(I,J) SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj)+GHEFF(I,J) C NOW CALCULATE QNETI UNDER ICE IF ANY QNETI(I,J,bi,bj)=(GHEFF(I,J)-SEAICE_deltaTtherm* & FICE(I,J,bi,bj)*Q0*AR(I,J,bi,bj))/Q0/SEAICE_deltaTtherm ENDDO ENDDO C NOW GET TOTAL QNET AND QSW DO J=1,sNy DO I=1,sNx QNET(I,J,bi,bj)=QNETI(I,J,bi,bj)*AR(I,J,bi,bj) & +(ONE-AR(I,J,bi,bj))*QNETO(I,J,bi,bj) QSW(I,J,bi,bj)=QSWI(I,J,bi,bj)*AR(I,J,bi,bj) & +(ONE-AR(I,J,bi,bj))*QSWO(I,J,bi,bj) c #ifndef SHORTWAVE_HEATING c QNET(I,J,bi,bj)=QNET(I,J,bi,bj)+QSW(I,J,bi,bj) c #endif C Add YNEG contribution to QNET QNET(I,J,bi,bj)=QNET(I,J,bi,bj) & +YNEG(I,J,bi,bj)/SEAICE_deltaTtherm*maskC(I,J,1,bi,bj) & *HeatCapacity_Cp*recip_horiVertRatio*rhoConst & *drF(kSurface)*hFacC(i,j,kSurface,bi,bj) ENDDO ENDDO C NOW UPDATE OTHER THINGS DO J=1,sNy DO I=1,sNx IF(FICE(I,J,bi,bj).GT.ZERO) THEN C FREEZING, PRECIP ADDED AS SNOW HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm* & PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF ELSE C ADD PRECIP AS RAIN, WATER CONVERTED INTO ICE BY /0.920 _d 0 SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) & -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)* & SEAICE_deltaTtherm/0.920 _d 0 ENDIF c Now add in precip over open water directly into ocean as negative salt SEAICE_SALT(I,J,bi,bj)=SEAICE_SALT(I,J,bi,bj) & -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj)) & *SEAICE_deltaTtherm/0.920 _d 0 C NOW GET FRESH WATER FLUX EmPmR(I,J,bi,bj)= maskC(I,J,1,bi,bj)*( & EVAP(I,J,bi,bj)-RUNOFF(I,J,bi,bj) & +SEAICE_SALT(I,J,bi,bj)*0.92 _d 0/SEAICE_deltaTtherm & ) ENDDO ENDDO #ifdef SEAICE_DEBUG c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid ) c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid ) CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid ) CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid ) CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid ) CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid ) CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid ) CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid ) CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid ) DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2) GAREA(I,J)=HEFF(I,J,1,bi,bj) print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj) ENDDO ENDDO CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid ) CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid ) DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx if(HEFF(i,j,1,bi,bj).gt.1.) then print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j, & HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj) print '(A,3f10.2)','QSW, QNET before/after correction', & QSW(I,J,bi,bj),QNETI(I,J,bi,bj)*AR(I,J,bi,bj) & +(ONE-AR(I,J,bi,bj))*QNETO(I,J,bi,bj), QNET(I,J,bi,bj) endif ENDDO ENDDO #endif /* SEAICE_DEBUG */ crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ? #define DO_WE_NEED_THIS C NOW ZERO OUTSIDE POINTS DO J=1,sNy DO I=1,sNx C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj) & ,HEFF(I,J,1,bi,bj)/.0001 _d 0) ENDDO ENDDO #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte #endif /* ALLOW_AUTODIFF_TAMC */ DO J=1,sNy DO I=1,sNx C NOW TRUNCATE AREA #ifdef DO_WE_NEED_THIS AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj)) ENDDO ENDDO #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj, CADJ & key = iicekey, byte = isbyte #endif /* ALLOW_AUTODIFF_TAMC */ DO J=1,sNy DO I=1,sNx AREA(I,J,1,bi,bj)=MAX(ZERO,AREA(I,J,1,bi,bj)) HSNOW(I,J,bi,bj)=MAX(ZERO,HSNOW(I,J,bi,bj)) #endif AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj) HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj) #ifdef DO_WE_NEED_THIS c HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj)) #endif HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj) ENDDO ENDDO ENDDO ENDDO RETURN END