(1) SOLAR_SOURCE penetration term may heat too much
When we calculate the penetration of shortwave radiation to deeper depths, should the total solar heating equal the amount prescribed at the ocean's surface, or may it be greater? That is, if we have swrad=600W/m2, does that 600W/m2 get distributed to deeper depths such that swrad(i,j,N-1)+swrad(i,j,N-2)+swrad(i,j,N-3)+...=600W/m2? If it should equal the prescribed swrad at the surface, then the routine lmd_swfrac_tile does not calculate the "fraction of the solar shortwave radiation" correctly. I output the spatially-varying swdk variable calculated via lmd_swfrac_tile with Jerlov water type 2, and summed the values across the layer depths of a NW Atlantic domain. To my surprise, I got summed fractions that exceeded 1 (the sums exceeded 10 in many coastal areas... see fig). My original thought was that the amount of solar shortwave radiation reaching the surface should be distributed to depths (which would make the sum of these fractions equal to 1), not applied in different amounts at each depth. Should this be the case or is my thinking wrong?
On to the next concern...
(2) Mismatch between heat flux and solar radiation with DIURNAL_SRFLUX
When SOLAR_SOURCE and DIURNAL_SRFLUX are both applied, ROMS reads in the net shortwave radiation for fields at >= 24 frequency, and imposes a diurnal cycle. The result is that the net solar radiative heating over the 24hr period is similar to that of a constant solar radiative heating, but peaks in the afternoon (see figure below: - red line=constant swrad prescribed, blue line = ROMS-calculated swrad with diurnal cycle. The "area under the curve" for each line is roughly equal). Now, the problem comes when SOLAR_SOURCE is also defined, since ROMS takes this newly-adjusted srflx and applies the solar radiative heating to depths below the surface. In pre_step3d.F, ROMS calculates the fraction of the solar radiation penetrating the water column with the term swdk, then calculates the net heating within each layer, i.e.
Code: Select all
!
! Compute vertical diffusive fluxes "FC" of the tracer fields at
! current time step n, and at horizontal RHO-points and vertical
! W-points.
!
... FC(i,k)=cff3*cff*Akt(i,j,k,ltrc)* &
& (t(i,j,k+1,nstp,itrc)- &
& t(i,j,k ,nstp,itrc))
...
!
! Add in incoming solar radiation at interior W-points using decay
! decay penetration function based on Jerlow water type.
!
...
FC(i,k)=FC(i,k)+dt(ng)*srflx(i,j)*swdk(i,j,k)
...
!
! Apply bottom and surface tracer flux conditions.
!
DO i=Istr,Iend
FC(i,0)=dt(ng)*btflx(i,j,itrc)
FC(i,N(ng))=dt(ng)*stflx(i,j,itrc)
END DO
!
! Compute new tracer field (m Tunits).
!
... cff1=Hz(i,j,k)*t(i,j,k,nstp,itrc)
cff2=FC(i,k)-FC(i,k-1)
t(i,j,k,nnew,itrc)=cff1+cff2
t(i,j,k,3,itrc)=t(i,j,k,nnew,itrc)/Hz(i,j,k)
...
Code: Select all
!
! SRFLX is reset on each time step in subroutine SET_DATA which
! interpolates values in the forcing file to the current date.
! This DIURNAL_SRFLUX option is provided so that SRFLX values
! corresponding to a greater or equal daily average can be modulated
! by the local length of day to produce a diurnal cycle with the
! same daily average as the original data. This approach assumes
! the net effect of clouds is incorporated into the SRFLX data.
!
! Normalization factor = INTEGRAL{ABS(a+b*COS(t)) dt} from 0 to 2*pi
! = (a*ARCCOS(-a/b)+SQRT(b**2-a**2))/pi
!
# ifndef BULK_FLUXES
!
! Before calculating the diurnal part of the shortwave, remove the
! original values of shortwave radiation from the net surface heat
! flux. The adjusted value will be added back in at the end.
!
stflx(i,j,itemp)=stflx(i,j,itemp)-srflx(i,j)
# endif
IF (ABS(cff1).gt.ABS(cff2)) THEN
IF (cff1*cff2.gt.0.0_r8) THEN
cff=cff1*2.0_r8*pi ! All day case
srflx(i,j)=MAX(0.0_r8, &
& srflx(i,j)/cff* &
& (cff1+cff2*COS(Hangle-lonr(i,j)*deg2rad)))
ELSE
srflx(i,j)=0.0_r8 ! All night case
END IF
ELSE
cff=(cff1*ACOS(-cff1/cff2)+SQRT(cff2*cff2-cff1*cff1))/pi
srflx(i,j)=MAX(0.0_r8, &
& srflx(i,j)/cff* &
& (cff1+cff2*COS(Hangle-lonr(i,j)*deg2rad)))
END IF
# ifndef BULK_FLUXES
stflx(i,j,itemp)=stflx(i,j,itemp)+srflx(i,j)
# endif
# endif
END DO
END DO
Thanks for any thoughts or suggestions.
Austin