--- MITgcm/model/src/dynamics.F 2005/07/30 22:09:38 1.121 +++ MITgcm/model/src/dynamics.F 2006/05/31 19:53:28 1.133 @@ -1,8 +1,13 @@ -C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/model/src/dynamics.F,v 1.121 2005/07/30 22:09:38 jmc Exp $ +C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/model/src/dynamics.F,v 1.133 2006/05/31 19:53:28 heimbach Exp $ C $Name: $ #include "PACKAGES_CONFIG.h" #include "CPP_OPTIONS.h" +#ifdef ALLOW_OBCS +# include "OBCS_OPTIONS.h" +#endif + +#undef DYNAMICS_GUGV_EXCH_CHECK CBOP C !ROUTINE: DYNAMICS @@ -30,6 +35,7 @@ C | with the free-surface evolution or the rigid-lid: C | U[n] = U* + dt x d/dx P C | V[n] = V* + dt x d/dy P +C | W[n] = W* + dt x d/dz P (NH mode) C | C | "Calculation of Gs" C | =================== @@ -85,11 +91,26 @@ # ifdef ALLOW_KPP # include "KPP.h" # endif +# ifdef ALLOW_PTRACERS +# include "PTRACERS_SIZE.h" +# include "PTRACERS.h" +# endif +# ifdef ALLOW_OBCS +# include "OBCS.h" +# ifdef ALLOW_PTRACERS +# include "OBCS_PTRACERS.h" +# endif +# endif +# ifdef ALLOW_MOM_FLUXFORM +# include "MOM_FLUXFORM.h" +# endif #endif /* ALLOW_AUTODIFF_TAMC */ C !CALLING SEQUENCE: C DYNAMICS() C | +C |-- CALC_EP_FORCING +C | C |-- CALC_GRAD_PHI_SURF C | C |-- CALC_VISCOSITY @@ -104,11 +125,17 @@ C | C |-- OBCS_APPLY_UV C | +C |-- MOM_U_IMPLICIT_R +C |-- MOM_V_IMPLICIT_R +C | C |-- IMPLDIFF C | C |-- OBCS_APPLY_UV C | -C |-- CALL DEBUG_STATS_RL +C |-- CALC_GW +C | +C |-- DIAGNOSTICS_FILL +C |-- DEBUG_STATS_RL C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == @@ -210,6 +237,11 @@ C--- CEOP +#ifdef ALLOW_DEBUG + IF ( debugLevel .GE. debLevB ) + & CALL DEBUG_ENTER( 'DYNAMICS', myThid ) +#endif + C-- Call to routine for calculation of C Eliassen-Palm-flux-forced U-tendency, C if desired: @@ -262,8 +294,8 @@ cph( c-- need some re-initialisation here to break dependencies cph) - gu(i,j,k,bi,bj) = 0. _d 0 - gv(i,j,k,bi,bj) = 0. _d 0 + gU(i,j,k,bi,bj) = 0. _d 0 + gV(i,j,k,bi,bj) = 0. _d 0 #endif ENDDO ENDDO @@ -282,6 +314,18 @@ phiSurfY(i,j) = 0. _d 0 guDissip(i,j) = 0. _d 0 gvDissip(i,j) = 0. _d 0 +#ifdef ALLOW_AUTODIFF_TAMC +cph( +c-- need some re-initialisation here to break dependencies +cph) +# ifdef NONLIN_FRSURF +# ifndef DISABLE_RSTAR_CODE + dWtransC(i,j,bi,bj) = 0. _d 0 + dWtransU(i,j,bi,bj) = 0. _d 0 + dWtransV(i,j,bi,bj) = 0. _d 0 +# endif +# endif /* NONLIN_FRSURF */ +#endif /* ALLOW_AUTODIFF_TAMC */ ENDDO ENDDO @@ -327,9 +371,9 @@ #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE KappaRU(:,:,:) -CADJ & = comlev1_bibj, key=idynkey, byte=isbyte +CADJ & = comlev1_bibj, key=idynkey, byte=isbyte CADJ STORE KappaRV(:,:,:) -CADJ & = comlev1_bibj, key=idynkey, byte=isbyte +CADJ & = comlev1_bibj, key=idynkey, byte=isbyte #endif /* ALLOW_AUTODIFF_TAMC */ C-- Start of dynamics loop @@ -353,36 +397,118 @@ CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte CADJ STORE salt (:,:,k,bi,bj) CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE gt(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE gs(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +# ifdef NONLIN_FRSURF +cph-test +CADJ STORE phiHydC (:,:) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE phiHydF (:,:) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE gudissip (:,:) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE gvdissip (:,:) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE fVerU (:,:,:) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE fVerV (:,:,:) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE gu(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE gv(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE gunm1(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE gvnm1(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +# ifndef DISABLE_RSTAR_CODE +CADJ STORE dwtransc(:,:,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE dwtransu(:,:,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE dwtransv(:,:,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +# endif +# ifdef ALLOW_CD_CODE +CADJ STORE unm1(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE vnm1(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE uVelD(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE vVelD(:,:,k,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +# endif +# endif #endif /* ALLOW_AUTODIFF_TAMC */ C-- Integrate hydrostatic balance for phiHyd with BC of C phiHyd(z=0)=0 - CALL CALC_PHI_HYD( + IF ( implicitIntGravWave ) THEN + CALL CALC_PHI_HYD( + I bi,bj,iMin,iMax,jMin,jMax,k, + I gT, gS, + U phiHydF, + O phiHydC, dPhiHydX, dPhiHydY, + I myTime, myIter, myThid ) + ELSE + CALL CALC_PHI_HYD( I bi,bj,iMin,iMax,jMin,jMax,k, I theta, salt, U phiHydF, O phiHydC, dPhiHydX, dPhiHydY, I myTime, myIter, myThid ) + ENDIF C-- Calculate accelerations in the momentum equations (gU, gV, ...) C and step forward storing the result in gU, gV, etc... IF ( momStepping ) THEN + IF (.NOT. vectorInvariantMomentum) THEN #ifdef ALLOW_MOM_FLUXFORM - IF (.NOT. vectorInvariantMomentum) CALL MOM_FLUXFORM( +C +# ifdef ALLOW_AUTODIFF_TAMC +# ifdef NONLIN_FRSURF +# ifndef DISABLE_RSTAR_CODE +CADJ STORE dwtransc(:,:,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE dwtransu(:,:,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE dwtransv(:,:,bi,bj) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +# endif +# endif +# endif /* ALLOW_AUTODIFF_TAMC */ +C + CALL MOM_FLUXFORM( I bi,bj,iMin,iMax,jMin,jMax,k,kup,kDown, I KappaRU, KappaRV, U fVerU, fVerV, O guDissip, gvDissip, I myTime, myIter, myThid) #endif + ELSE #ifdef ALLOW_MOM_VECINV - IF (vectorInvariantMomentum) CALL MOM_VECINV( +C +# ifdef ALLOW_AUTODIFF_TAMC +# ifdef NONLIN_FRSURF +CADJ STORE fVerU(:,:,:) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +CADJ STORE fVerV(:,:,:) +CADJ & = comlev1_bibj_k, key=kkey, byte=isbyte +# endif +# endif /* ALLOW_AUTODIFF_TAMC */ +C + CALL MOM_VECINV( I bi,bj,iMin,iMax,jMin,jMax,k,kup,kDown, I KappaRU, KappaRV, U fVerU, fVerV, O guDissip, gvDissip, I myTime, myIter, myThid) #endif + ENDIF +C CALL TIMESTEP( I bi,bj,iMin,iMax,jMin,jMax,k, I dPhiHydX,dPhiHydY, phiSurfX, phiSurfY, @@ -403,7 +529,7 @@ ENDDO C-- Implicit Vertical advection & viscosity -#ifdef INCLUDE_IMPLVERTADV_CODE +#if (defined (INCLUDE_IMPLVERTADV_CODE) && defined (ALLOW_MOM_COMMON)) IF ( momImplVertAdv ) THEN CALL MOM_U_IMPLICIT_R( kappaRU, I bi, bj, myTime, myIter, myThid ) @@ -419,7 +545,7 @@ #endif /* ALLOW_AUTODIFF_TAMC */ CALL IMPLDIFF( I bi, bj, iMin, iMax, jMin, jMax, - I 0, KappaRU,recip_HFacW, + I -1, KappaRU,recip_HFacW, U gU, I myThid ) #ifdef ALLOW_AUTODIFF_TAMC @@ -428,7 +554,7 @@ #endif /* ALLOW_AUTODIFF_TAMC */ CALL IMPLDIFF( I bi, bj, iMin, iMax, jMin, jMax, - I 0, KappaRV,recip_HFacS, + I -2, KappaRV,recip_HFacS, U gV, I myThid ) ENDIF @@ -475,6 +601,24 @@ C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| +#ifdef ALLOW_NONHYDROSTATIC +C-- Step forward W field in N-H algorithm + IF ( nonHydrostatic ) THEN +#ifdef ALLOW_DEBUG + IF ( debugLevel .GE. debLevB ) + & CALL DEBUG_CALL('CALC_GW', myThid ) +#endif + CALL TIMER_START('CALC_GW [DYNAMICS]',myThid) + CALL CALC_GW( myTime, myIter, myThid ) + ENDIF + IF ( nonHydrostatic.OR.implicitIntGravWave ) + & CALL TIMESTEP_WVEL( myTime, myIter, myThid ) + IF ( nonHydrostatic ) + & CALL TIMER_STOP ('CALC_GW [DYNAMICS]',myThid) +#endif + +C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| + Cml( C In order to compare the variance of phiHydLow of a p/z-coordinate C run with etaH of a z/p-coordinate run the drift of phiHydLow @@ -484,7 +628,7 @@ Cml) #ifdef ALLOW_DIAGNOSTICS - IF ( usediagnostics ) THEN + IF ( useDiagnostics ) THEN CALL DIAGNOSTICS_FILL(totPhihyd,'PHIHYD ',0,Nr,0,1,1,myThid) CALL DIAGNOSTICS_FILL(phiHydLow,'PHIBOT ',0, 1,0,1,1,myThid) @@ -520,5 +664,19 @@ ENDIF #endif +#ifdef DYNAMICS_GUGV_EXCH_CHECK +C- jmc: For safety checking only: This Exchange here should not change +C the solution. If solution changes, it means something is wrong, +C but it does not mean that it is less wrong with this exchange. + IF ( debugLevel .GT. debLevB ) THEN + CALL EXCH_UV_XYZ_RL(gU,gV,.TRUE.,myThid) + ENDIF +#endif + +#ifdef ALLOW_DEBUG + IF ( debugLevel .GE. debLevB ) + & CALL DEBUG_LEAVE( 'DYNAMICS', myThid ) +#endif + RETURN END