C $Header: /u/gcmpack/MITgcm/pkg/aim_v23/aim_aim2dyn.F,v 1.9 2014/05/12 01:32:41 jmc Exp $
C $Name: $
#include "AIM_OPTIONS.h"
CBOP
C !ROUTINE: AIM_AIM2DYN
C !INTERFACE:
SUBROUTINE AIM_AIM2DYN(
I bi, bj, myTime, myIter, myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | S/R AIM_AIM2DYN
C | o Remap AIM outputs to dynamics conforming arrays.
C |==========================================================*
C | Currently AIM exports to the dynmaics
C | - PBL drag coefficient
C | - Net tendency for temperature
C | - Net tendency for water vapor
C | Exporting drag has the nice property that it is a scalar.
C | This means that the exchanges on the AIM exported fields
C | do not need special piaring on the cube. It may not be
C | a good idea in the long term as it makes assumptions
C | about the momentum schemes within AIM.
C *==========================================================*
C \ev
C-------
C Note: Except LSC tendency, all others need to be /dpFac.
C-------
C !USES:
IMPLICIT NONE
C == Global variables ===
C-- size for MITgcm & Physics package :
#include "AIM_SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "SURFACE.h"
#include "AIM2DYN.h"
#include "com_physvar.h"
C !INPUT/OUTPUT PARAMETERS:
C == Routine arguments ==
C bi,bj :: Tile index
C myTime :: Current time of simulation ( s )
C myIter :: Current iteration number in simulation
C myThid :: Number of this instance of the routine
INTEGER bi, bj
_RL myTime
INTEGER myIter, myThid
CEOP
#ifdef ALLOW_AIM
C !LOCAL VARIABLES:
C == Local variables ==
C i,j,k :: loop counters
C I2,Katm :: loop counters
C conv_T2theta :: conversion factor from (absolute) Temp. to Pot.Temp.
_RL conv_T2theta
INTEGER i,j,k
INTEGER I2, Katm
#ifdef ALLOW_DIAGNOSTICS
LOGICAL physTendDiag
LOGICAL DIAGNOSTICS_IS_ON
EXTERNAL
#endif
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C-- Physics tendency term
#ifdef ALLOW_DIAGNOSTICS
physTendDiag = .FALSE.
IF (useDiagnostics) THEN
physTendDiag = DIAGNOSTICS_IS_ON( 'DIABT ', myThid )
& .OR. DIAGNOSTICS_IS_ON( 'DIABQ ', myThid )
ENDIF
#endif
C- Planetary boundary layer drag coeff.
DO j=1,sNy
DO i=1,sNx
I2 = i+(j-1)*sNx
aim_drag(i,j,bi,bj) = DRAG(I2,0,myThid)
ENDDO
ENDDO
#ifdef COMPONENT_MODULE
IF ( useCoupler ) THEN
C- Near surface wind speed
DO j=1,sNy
DO i=1,sNx
I2 = i+(j-1)*sNx
aim_surfWind(i,j,bi,bj) = SPEED0(I2,myThid)
ENDDO
ENDDO
ENDIF
#endif /* COMPONENT_MODULE */
DO k=1,Nr
Katm = _KD2KA( k )
conv_T2theta = (atm_Po/rC(k))**atm_kappa
C- Add all tendencies (ignoring partial cell factor) for T & Q
C and convert Temp. tendency to Pot.Temp. tendency
DO j=1,sNy
DO i=1,sNx
I2 = i+(j-1)*sNx
C temperature tendency
aim_dTdt(i,j,k,bi,bj) = ( TT_CNV(I2,Katm,myThid)
& +TT_PBL(I2,Katm,myThid)
& +TT_RSW(I2,Katm,myThid)
& +TT_RLW(I2,Katm,myThid)
& +TT_LSC(I2,Katm,myThid)
& )*conv_T2theta
C water vapor tendency
aim_dSdt(i,j,k,bi,bj) = QT_CNV(I2,Katm,myThid)
& +QT_PBL(I2,Katm,myThid)
& +QT_LSC(I2,Katm,myThid)
ENDDO
ENDDO
#ifdef NONLIN_FRSURF
IF ( select_rStar.GE.1 ) THEN
DO j=1,sNy
DO i=1,sNx
aim_dTdt(i,j,k,bi,bj) = aim_dTdt(i,j,k,bi,bj)
& / pStarFacK(i,j,bi,bj)
ENDDO
ENDDO
ENDIF
#endif /* NONLIN_FRSURF */
#ifdef ALLOW_DIAGNOSTICS
IF ( physTendDiag ) THEN
CALL DIAGNOSTICS_FILL( aim_dTdt, 'DIABT ',
& k, Nr, 1,bi,bj, myThid )
CALL DIAGNOSTICS_FILL( aim_dSdt, 'DIABQ ',
& k, Nr, 1,bi,bj, myThid )
ENDIF
#endif /* ALLOW_DIAGNOSTICS */
C- Account for partial cell filling:
#ifdef NONLIN_FRSURF
IF ( staggerTimeStep .AND. nonlinFreeSurf.GT.0 ) THEN
IF ( select_rStar.GT.0 ) THEN
DO j=1,sNy
DO i=1,sNx
aim_dTdt(i,j,k,bi,bj) = aim_dTdt(i,j,k,bi,bj)
& *recip_hFacC(i,j,k,bi,bj)
& /rStarExpC(i,j,bi,bj)
aim_dSdt(i,j,k,bi,bj) = aim_dSdt(i,j,k,bi,bj)
& *recip_hFacC(i,j,k,bi,bj)
& /rStarExpC(i,j,bi,bj)
ENDDO
ENDDO
ELSE
DO j=1,sNy
DO i=1,sNx
IF ( k.EQ.kSurfC(i,j,bi,bj) ) THEN
aim_dTdt(i,j,k,bi,bj) = aim_dTdt(i,j,k,bi,bj)
& /hFac_surfC(i,j,bi,bj)
aim_dSdt(i,j,k,bi,bj) = aim_dSdt(i,j,k,bi,bj)
& /hFac_surfC(i,j,bi,bj)
ELSE
aim_dTdt(i,j,k,bi,bj) = aim_dTdt(i,j,k,bi,bj)
& *recip_hFacC(i,j,k,bi,bj)
aim_dSdt(i,j,k,bi,bj) = aim_dSdt(i,j,k,bi,bj)
& *recip_hFacC(i,j,k,bi,bj)
ENDIF
ENDDO
ENDDO
ENDIF
ELSE
#else /* ndef NONLIN_FRSURF */
IF (.TRUE.) THEN
#endif /* NONLIN_FRSURF */
DO j=1,sNy
DO i=1,sNx
aim_dTdt(i,j,k,bi,bj) = aim_dTdt(i,j,k,bi,bj)
& *recip_hFacC(i,j,k,bi,bj)
aim_dSdt(i,j,k,bi,bj) = aim_dSdt(i,j,k,bi,bj)
& *recip_hFacC(i,j,k,bi,bj)
ENDDO
ENDDO
ENDIF
C--- end of k loop.
ENDDO
#endif /* ALLOW_AIM */
RETURN
END