C $Header: /u/gcmpack/MITgcm/pkg/streamice/streamice_advect_2dtracer.F,v 1.4 2017/07/25 11:30:01 mlosch Exp $ C $Name: $ #include "STREAMICE_OPTIONS.h" #ifdef ALLOW_AUTODIFF # include "AUTODIFF_OPTIONS.h" #endif C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP SUBROUTINE STREAMICE_ADVECT_2DTRACER ( & myThid, & myIter, & time_step, & uTrans, & vTrans, & bcMaskx, & bcMasky) C *============================================================* C | SUBROUTINE | C | o | C *============================================================* C | | C *============================================================* IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "GRID.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "STREAMICE.h" #include "STREAMICE_ADV.h" #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" #endif INTEGER myThid, myIter, Gi, Gj _RL time_step _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RS bcMaskx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RS bcMasky(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) ! _RL trac(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) #ifdef ALLOW_STREAMICE #ifdef ALLOW_STREAMICE_2DTRACER INTEGER i, j, bi, bj _RL thick_bd _RL sec_per_year, time_step_loc, MR, SMB, TMB _RL BCVALX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL BCVALY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL xtracflux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RL ytracflux(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) #ifdef STREAMICE_TRACER_AB _RL GAD_trac_2dNm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) #endif CHARACTER*(MAX_LEN_MBUF) msgBuf sec_per_year = 365.*86400. time_step_loc = time_step / sec_per_year PRINT *, "time_step_loc ", time_step_loc DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO j=1-3,sNy+3 DO i=1-3,sNx+3 ! H_streamice_prev(i,j,bi,bj) = ! & H_streamice(i,j,bi,bj) ytracflux (i,j,bi,bj) = 0. _d 0 xtracflux (i,j,bi,bj) = 0. _d 0 #ifdef STREAMICE_TRACER_AB GAD_trac_2dNm1(i,j,bi,bj)=GAD_trac_2d(i,j,bi,bj) GAD_trac_2d (i,j,bi,bj) = 0. _d 0 #endif IF (STREAMICE_ufacemask(i,j,bi,bj).eq.3.0) THEN BCVALX(i,j,bi,bj) = trac2d_ubdry_values_SI(i,j,bi,bj) ELSEIF (STREAMICE_ufacemask(i,j,bi,bj).eq.4.0) THEN BCVALX(i,j,bi,bj) = trac2d_ubdry_values_SI(i,j,bi,bj) ENDIF IF (STREAMICE_vfacemask(i,j,bi,bj).eq.3.0) THEN BCVALy(i,j,bi,bj) = trac2d_vbdry_values_SI(i,j,bi,bj) ELSEIF (STREAMICE_vfacemask(i,j,bi,bj).eq.4.0) THEN BCVALy(i,j,bi,bj) = trac2d_vbdry_values_SI(i,j,bi,bj) ENDIF ENDDO ENDDO ENDDO ENDDO _EXCH_XY_RL(BCVALX,myThid) _EXCH_XY_RL(BCVALY,myThid) #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE trac2d = comlev1, key=ikey_dynamics #endif CALL STREAMICE_ADV_FLUX_FL_X ( myThid , I uTrans , I trac2d , I BCMASKX, I BCVALX, O xtracflux, I time_step_loc) DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO j=1-3,sNy+3 DO i=1,sNx Gi = (myXGlobalLo-1)+(bi-1)*sNx+i Gj = (myYGlobalLo-1)+(bj-1)*sNy+j IF (((Gj .ge. 1) .and. (Gj .le. Ny)) & .or.STREAMICE_NS_PERIODIC) THEN IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0 .or. & STREAMICE_hmask(i,j,bi,bj).eq.2.0) THEN #ifdef STREAMICE_TRACER_AB GAD_trac_2d(i,j,bi,bj) = GAD_trac_2d(i,j,bi,bj) - #else trac2d(i,j,bi,bj) = trac2d(i,j,bi,bj) - #endif & ((xtracflux(i+1,j,bi,bj)*dyG(i+1,j,bi,bj) - & xtracflux(i,j,bi,bj)*dyG(i,j,bi,bj)) * & recip_rA (i,j,bi,bj) - & trac2d(i,j,bi,bj) * & (utrans(i+1,j,bi,bj)*dyG(i+1,j,bi,bj)- & utrans(i,j,bi,bj)*dyG(i,j,bi,bj)) * & recip_rA(i,j,bi,bj)) #ifndef STREAMICE_TRACER_AB & * time_step_loc #endif ENDIF ENDIF ENDDO ENDDO ENDDO ENDDO _EXCH_XY_RL(utrans,myThid) #ifdef ALLOW_AUTODIFF_TAMC # ifndef STREAMICE_TRACER_AB CADJ STORE trac2d = comlev1, key=ikey_dynamics # endif #endif CALL STREAMICE_ADV_FLUX_FL_Y ( myThid , I vTrans , I trac2d , I BCMASKy, I BCVALy, O ytracflux, I time_step_loc) DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO j=1,sNy DO i=1,sNx Gi = (myXGlobalLo-1)+(bi-1)*sNx+i Gj = (myYGlobalLo-1)+(bj-1)*sNy+j IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0 .or. & STREAMICE_hmask(i,j,bi,bj).eq.2.0) THEN ! IF (Gi.eq.34.and.Gj.eq.94) THEN ! print *, "GOT HERE YFLUX", ytracflux(i,j,bi,bj), ! & ytracflux(i,j+1,bi,bj),trac2d(i,j,bi,bj), ! & vtrans(i,j,bi,bj), vtrans(i,j+1,bi,bj), ! & bcmasky(i,j,bi,bj) ! ENDIF #ifdef STREAMICE_TRACER_AB GAD_trac_2d(i,j,bi,bj) = GAD_trac_2d(i,j,bi,bj) - #else trac2d(i,j,bi,bj) = trac2d(i,j,bi,bj) - #endif & ((ytracflux(i,j+1,bi,bj)*dxG(i,j+1,bi,bj) - & ytracflux(i,j,bi,bj)*dxG(i,j,bi,bj)) * & recip_rA (i,j,bi,bj) - & (vtrans(i,j+1,bi,bj)*dxG(i,j+1,bi,bj) - & vtrans(i,j,bi,bj)*dxG(i,j,bi,bj)) * & trac2d(i,j,bi,bj) * & recip_rA(i,j,bi,bj)) #ifndef STREAMICE_TRACER_AB & * time_step_loc #endif ENDIF ENDDO ENDDO ENDDO ENDDO #ifdef STREAMICE_TRACER_AB DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO j=1,sNy DO i=1,sNx trac2d(i,j,bi,bj) = trac2d(i,j,bi,bj) + time_step_loc * & GAD_trac_2d(i,j,bi,bj) IF (myIter.eq.0) THEN trac2d(i,j,bi,bj) = trac2d(i,j,bi,bj) + time_step_loc * & (.5+.01) * & (GAD_trac_2d(i,j,bi,bj) - GAD_trac_2dNm1(i,j,bi,bj)) ENDIF ENDDO ENDDO ENDDO ENDDO #endif _EXCH_XY_RL(trac2d, myThid) WRITE(msgBuf,'(A)') 'END STREAMICE_ADVECT_THICKNESS' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT , 1) #endif #endif RETURN END