C $Header: /u/gcmpack/MITgcm/pkg/exf/exf_radiation.F,v 1.11 2014/10/20 03:13:32 gforget Exp $ C $Name: $ #include "EXF_OPTIONS.h" #ifdef ALLOW_AUTODIFF # include "AUTODIFF_OPTIONS.h" #endif SUBROUTINE EXF_RADIATION(myTime, myIter, myThid) C ================================================================== C SUBROUTINE exf_radiation C ================================================================== C C o Set radiative fluxes at the surface. C C ================================================================== C SUBROUTINE exf_radiation C ================================================================== IMPLICIT NONE C == global variables == #include "EEPARAMS.h" #include "SIZE.h" #include "PARAMS.h" #include "DYNVARS.h" #include "GRID.h" #include "EXF_PARAM.h" #include "EXF_FIELDS.h" #include "EXF_CONSTANTS.h" #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" #endif C == routine arguments == _RL myTime INTEGER myIter INTEGER myThid #ifdef ALLOW_DOWNWARD_RADIATION C == local variables == INTEGER bi,bj INTEGER i,j #ifdef ALLOW_ATM_TEMP INTEGER ks, kl _RL Tsf, SSTtmp, TsfSq #endif C == end of interface == C-- Use atmospheric state to compute surface fluxes. C-- Compute net from downward and downward from net longwave and C shortwave radiation, IF needed. C lwflux = Stefan-Boltzmann constant * emissivity * SST - lwdown C swflux = - ( 1 - albedo ) * swdown #ifdef ALLOW_ATM_TEMP ks = 1 kl = 2 IF ( lwfluxfile .EQ. ' ' .AND. lwdownfile .NE. ' ' ) THEN C Loop over tiles. DO bj = myByLo(myThid),myByHi(myThid) DO bi = myBxLo(myThid),myBxHi(myThid) IF ( Nr.GE.2 .AND. sstExtrapol.GT.0. _d 0 ) THEN DO j = 1,sNy DO i = 1,sNx Tsf = theta(i,j,ks,bi,bj) + cen2kel SSTtmp = sstExtrapol & *( theta(i,j,ks,bi,bj)-theta(i,j,kl,bi,bj) ) & * maskC(i,j,kl,bi,bj) Tsf = Tsf + MAX( SSTtmp, 0. _d 0 ) TsfSq = Tsf*Tsf lwflux(i,j,bi,bj) = & ocean_emissivity*stefanBoltzmann*TsfSq*TsfSq & - lwdown(i,j,bi,bj) #ifdef EXF_LWDOWN_WITH_EMISSIVITY & *ocean_emissivity C the lw exitance (= out-going long wave radiation) is C emissivity*stefanBoltzmann*T^4 + rho*lwdown, where the C reflectivity rho = 1-emissivity for conservation reasons: C the sum of emissivity, reflectivity, and transmissivity must be C one, and transmissivity is zero in our case (long wave radiation C does not penetrate the ocean surface) #endif /* EXF_LWDOWN_WITH_EMISSIVITY */ ENDDO ENDDO ELSE DO j = 1,sNy DO i = 1,sNx lwflux(i,j,bi,bj) = & ocean_emissivity*stefanBoltzmann* & ((theta(i,j,ks,bi,bj)+cen2kel)**4) & - lwdown(i,j,bi,bj) #ifdef EXF_LWDOWN_WITH_EMISSIVITY & *ocean_emissivity C the lw exitance (= out-going long wave radiation) is C emissivity*stefanBoltzmann*T^4 + rho*lwdown, where the C reflectivity rho = 1-emissivity for conservation reasons: C the sum of emissivity, reflectivity, and transmissivity must be C one, and transmissivity is zero in our case (long wave radiation C does not penetrate the ocean surface) #endif /* EXF_LWDOWN_WITH_EMISSIVITY */ ENDDO ENDDO ENDIF C-- end bi,bj loops ENDDO ENDDO ENDIF C-jmc: commented out: no need to compute Downward-LW (not used) from Net-LW c IF ( lwfluxfile .NE. ' ' .AND. lwdownfile .EQ. ' ' ) THEN C Loop over tiles. c DO bj = myByLo(myThid),myByHi(myThid) c DO bi = myBxLo(myThid),myBxHi(myThid) c DO j = 1,sNy c DO i = 1,sNx c lwdown(i,j,bi,bj) = c & ocean_emissivity*stefanBoltzmann* c & ((theta(i,j,ks,bi,bj)+cen2kel)**4) c & - lwflux(i,j,bi,bj) c ENDDO c ENDDO c ENDDO c ENDDO c ENDIF #endif /* ALLOW_ATM_TEMP */ #if defined(ALLOW_ATM_TEMP) || defined(SHORTWAVE_HEATING) IF ( swfluxfile .EQ. ' ' .AND. swdownfile .NE. ' ' ) THEN #ifdef ALLOW_ZENITHANGLE IF ( useExfZenAlbedo .OR. useExfZenIncoming ) THEN CALL EXF_ZENITHANGLE(myTime, myIter, myThid) #ifdef ALLOW_AUTODIFF_TAMC ELSE DO bj = myByLo(myThid),myByHi(myThid) DO bi = myBxLo(myThid),myBxHi(myThid) DO j = 1,sNy DO i = 1,sNx zen_albedo (i,j,bi,bj) = 0. _d 0 zen_fsol_diurnal (i,j,bi,bj) = 0. _d 0 zen_fsol_daily (i,j,bi,bj) = 0. _d 0 ENDDO ENDDO ENDDO ENDDO #endif ENDIF #endif DO bj = myByLo(myThid),myByHi(myThid) DO bi = myBxLo(myThid),myBxHi(myThid) DO j = 1,sNy DO i = 1,sNx #ifdef ALLOW_ZENITHANGLE IF ( useExfZenAlbedo ) THEN swflux(i,j,bi,bj) = - swdown(i,j,bi,bj) * & (1.0-zen_albedo(i,j,bi,bj)) ELSE swflux(i,j,bi,bj) = - swdown(i,j,bi,bj) * & (1.0-exf_albedo) ENDIF #else swflux(i,j,bi,bj) = - swdown(i,j,bi,bj) * & (1.0-exf_albedo) #endif ENDDO ENDDO ENDDO ENDDO ENDIF C-jmc: commented out: no need to compute Downward-SW (not used) from Net-SW c IF ( swfluxfile .NE. ' ' .AND. swdownfile .EQ. ' ' ) THEN c DO bj = myByLo(myThid),myByHi(myThid) c DO bi = myBxLo(myThid),myBxHi(myThid) c DO j = 1,sNy c DO i = 1,sNx c swdown(i,j,bi,bj) = -swflux(i,j,bi,bj) / (1.0-exf_albedo) c ENDDO c ENDDO c ENDDO c ENDDO c ENDIF #endif #endif /* ALLOW_DOWNWARD_RADIATION */ RETURN END