--- MITgcm/pkg/seaice/seaice_tracer_phys.F 2011/06/13 23:21:18 1.3 +++ MITgcm/pkg/seaice/seaice_tracer_phys.F 2013/08/11 02:31:12 1.10 @@ -1,26 +1,30 @@ -C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/seaice/seaice_tracer_phys.F,v 1.3 2011/06/13 23:21:18 gforget Exp $ +C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/seaice/seaice_tracer_phys.F,v 1.10 2013/08/11 02:31:12 jmc Exp $ C $Name: $ #include "SEAICE_OPTIONS.h" CStartOfInterface SUBROUTINE SEAICE_TRACER_PHYS( myTime, myIter, myThid ) -C /=======================================================\ -C | SUBROUTINE seaice_tracer_phys | -C | o Time step SItr/SItrEFF as a result of | -C | seaice thermodynamics and specific tracer physics | -C \=======================================================/ +C *=======================================================* +C | SUBROUTINE seaice_tracer_phys +C | o Time step SItr/SItrEFF as a result of +C | seaice thermodynamics and specific tracer physics +C *=======================================================* IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" +#include "PARAMS.h" #include "FFIELDS.h" #include "DYNVARS.h" #include "SEAICE_SIZE.h" #include "SEAICE.h" #include "SEAICE_PARAMS.h" #include "SEAICE_TRACER.h" +#ifdef ALLOW_SALT_PLUME +# include "SALT_PLUME.h" +#endif C === Routine arguments === C INPUT: @@ -55,37 +59,24 @@ DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) - DO iTr=1,SItrMaxNum + DO iTr=1,SItrNumInUse -c 0) set ice-ocean and ice-snow exchange values +c 0) set ice-ocean and ice-snow exchange values c ============================================= DO J=1,sNy DO I=1,sNx - SItrFromOcean(i,j)=0. _d 0 - SItrFromFlood(i,j)=0. _d 0 - SItrExpand(i,j)=0. _d 0 + SItrFromOcean(i,j)=SItrFromOcean0(iTr) + SItrFromFlood(i,j)=SItrFromFlood0(iTr) + SItrExpand(i,j)=SItrExpand0(iTr) ENDDO ENDDO - if (SItrName(iTr).EQ.'age') then -c age tracer: no age in ocean, or effect from ice cover changes - elseif (SItrName(iTr).EQ.'salinity') then -c salinity tracer: - DO J=1,sNy - DO I=1,sNx - SItrFromOcean(i,j)=SIsal0 -#ifdef SEAICE_VARIABLE_SALINITY - if (SIsalFRAC.GT.0.) - & SItrFromOcean(i,j)=SIsalFRAC*salt(I,j,ks,bi,bj) -#endif -c as of now, flooding implies no salt extraction from ocean - ENDDO - ENDDO - elseif (SItrName(iTr).EQ.'one') then -c "ice concentration" tracer that should remain .EQ.1. +c salinity tracer: + if ( (SItrName(iTr).EQ.'salinity').AND. + & (SItrFromOceanFrac(iTr).GT.ZERO) ) then DO J=1,sNy DO I=1,sNx - SItrFromOcean(i,j)=1. _d 0 - SItrFromFlood(i,j)=1. _d 0 + SItrFromOcean(i,j)=SItrFromOceanFrac(iTr)*salt(I,j,ks,bi,bj) + SItrFromFlood(i,j)=SItrFromFloodFrac(iTr)*salt(I,j,ks,bi,bj) ENDDO ENDDO endif @@ -96,7 +87,7 @@ DO I=1,sNx HEFFprev=SItrHEFF(i,j,bi,bj,1) #ifdef ALLOW_SITRACER_DEBUG_DIAG - DIAGarray(I,J,5+(iTr-1)*5) = + DIAGarray(I,J,5+(iTr-1)*5) = & HEFFprev*SItracer(i,j,bi,bj,iTr) + SItrBucket(i,j,bi,bj,iTr) #endif c apply the sequence of thermodynamics increments to actual traceur @@ -133,7 +124,7 @@ SItrBucket(i,j,bi,bj,iTr)=SItrBucket(i,j,bi,bj,iTr) & -HEFFpost*SItrFromFlood(i,j)*(1. _d 0 - growFact) #ifdef ALLOW_SITRACER_DEBUG_DIAG - DIAGarray(I,J,5+(iTr-1)*5) = HEFFpost*SItracer(i,j,bi,bj,iTr) + DIAGarray(I,J,5+(iTr-1)*5) = HEFFpost*SItracer(i,j,bi,bj,iTr) & +SItrBucket(i,j,bi,bj,iTr)-DIAGarray(I,J,5+(iTr-1)*5) #endif ENDDO @@ -142,10 +133,10 @@ else c 1) or seaice cover expansion c ============================ -c this is much simpler than for ice volume/mass tracers, because -c properties of the ice surface are not be conserved across the +c this is much simpler than for ice volume/mass tracers, because +c properties of the ice surface are not be conserved across the c ocean-ice system, the contraction/expansion terms are all -c simultaneous (which is sane), and the only generic effect +c simultaneous (which is sane), and the only generic effect c is due to expansion (new cover). DO J=1,sNy DO I=1,sNx @@ -183,7 +174,6 @@ c "ice concentration" tracer: no specific process elseif (SItrName(iTr).EQ.'ridge') then c simple, made up, ice surface roughness index prototype -#ifndef SEAICE_GROWTH_LEGACY DO J=1,sNy DO I=1,sNx c ridging increases roughness @@ -197,33 +187,35 @@ SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*tmpscal1 ENDDO ENDDO -#endif endif c 3) ice-ocean tracer exchange/mapping to external variables c ========================================================== #ifdef ALLOW_DIAGNOSTICS - if (SItrMate(iTr).EQ.'HEFF') then - WRITE(diagName,'(A4,I2.2,A2)') 'SItr',iTr,'FX' + IF ( useDiagnostics .AND. SItrMate(iTr).EQ.'HEFF') THEN + WRITE(diagName,'(A4,I2.2,A2)') 'SItr',iTr,'Fx' tmpscal1=-ONE/SEAICE_deltaTtherm*SEAICE_rhoIce - CALL DIAGNOSTICS_SCALE_FILL(SItrBucket(1-oLx,1-oLy,bi,bj,iTr), + CALL DIAGNOSTICS_SCALE_FILL(SItrBucket(1-OLx,1-OLy,bi,bj,iTr), & tmpscal1, 1, diagName,0,1,2,bi,bj,myThid) - endif + ENDIF #endif - if (SItrName(iTr).EQ.'age') then -c age tracer: not passed to ocean - elseif (SItrName(iTr).EQ.'salinity') then + + if ( (SItrName(iTr).EQ.'salinity').AND. + & (SEAICE_salinityTracer) ) then c salinity tracer: salt flux -c DO J=1,sNy -c DO I=1,sNx -c saltFlux(I,J,bi,bj) = - SItrBucket(i,j,bi,bj,iTr) -c & *HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm*SEAICE_rhoIce + DO J=1,sNy + DO I=1,sNx + saltFlux(I,J,bi,bj) = - SItrBucket(i,j,bi,bj,iTr) + & *HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm*SEAICE_rhoIce c note: at this point of the time step, that is the correct sign -c saltPlumeFlux(I,J,bi,bj) = ... -c ENDDO -c ENDDO - elseif (SItrName(iTr).EQ.'one') then -c "ice concentration" tracer: not passed to ocean +#ifdef ALLOW_SALT_PLUME +c should work for both constant and variable ice salinity -- to be tested + saltPlumeFlux(I,J,bi,bj) = MAX(ZERO,saltFlux(I,J,bi,bj)) + & *SPsalFRAC*(salt(I,j,ks,bi,bj)-SItrFromOcean(i,j)) +#endif + ENDDO + ENDDO endif + DO J=1,sNy DO I=1,sNx #ifdef ALLOW_SITRACER_DEBUG_DIAG @@ -234,7 +226,9 @@ SItrBucket(i,j,bi,bj,iTr)=0. _d 0 ENDDO ENDDO + c TAF? elseif (SItrMate(iTr).EQ.'AREA') then + c 4) diagnostics c ============== #ifdef ALLOW_SITRACER_DEBUG_DIAG @@ -245,9 +239,7 @@ DIAGarray(I,J,1+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr) DIAGarray(I,J,2+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)*HEFFpost c DIAGarray(:,:,3) is the term of comparison for DIAGarray(:,:,2) - if (SItrName(iTr).EQ.'age') then - DIAGarray(I,J,3+(iTr-1)*5) = IceAgeTr(i,j,bi,bj,2) - elseif (SItrName(iTr).EQ.'salinity') then + if (SItrName(iTr).EQ.'salinity') then DIAGarray(I,J,3+(iTr-1)*5) = HSALT(i,j,bi,bj)/SEAICE_rhoIce elseif (SItrName(iTr).EQ.'one') then DIAGarray(I,J,3+(iTr-1)*5) = HEFFpost @@ -262,17 +254,13 @@ AREApost=SItrAREA(i,j,bi,bj,3) DIAGarray(I,J,1+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr) DIAGarray(I,J,2+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)*AREApost -c DIAGarray(:,:,3) is the term of comparison for DIAGarray(:,:,2) - if (SItrName(iTr).EQ.'age') then - DIAGarray(I,J,3+(iTr-1)*5) = IceAgeTr(i,j,bi,bj,1) - endif ENDDO ENDDO endif #endif ENDDO #ifdef ALLOW_SITRACER_DEBUG_DIAG - CALL DIAGNOSTICS_FILL(DIAGarray,'UDIAG1 ',0,Nr,3,bi,bj,myThid) +c CALL DIAGNOSTICS_FILL(DIAGarray,'UDIAG1 ',0,Nr,3,bi,bj,myThid) #endif ENDDO ENDDO