Opened 8 years ago

Closed 8 years ago

#1043 closed Bug (fixed)

wrong sign of depth-int isoneutral-diffusive heat flux somehdif

Reported by: agn Owned by: acc
Priority: low Milestone:
Component: OCE Version: trunk
Severity: Keywords:


Using the standard implementation of isoneutral diffusion, the fields udiff_heattr and vdiff_heattr (saved as somehdif) created in traldf_iso.F90 have the wrong sign.
This problem is evident in trunk, 3.4.1 and 2012/dev_MERGE_2012, and has existed for some time, I believe. It gives, e.g. at 1 deg, northward heat transports in the Atlantic 0.07 PW too high.

The problem is apparent
(i) Looking at traldf_iso.F90 the updating of the tracer tendency has

ztra = zbtr * ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk) + zftv(ji,jj,jk) - zftv(ji,jj-1,jk) )
pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra

implying that zftu and zftv are opposite to the fluxes.

However these fluxes are *added* to give the diagnostic:

z2d(:,:) = 0._wp
DO jk = 1, jpkm1

DO jj = 2, jpjm1

DO ji = fs_2, fs_jpim1 ! vector opt.

z2d(ji,jj) = z2d(ji,jj) + zftv(ji,jj,jk)



z2d(:,:) = zztmp * z2d(:,:)
CALL lbc_lnk( z2d, 'V', -1. )
CALL iom_put( "vdiff_heattr", z2d ) ! heat transport in i-direction

(ii) Note also (l193-196 of traldf_iso.F90) that

zftv(ji,jj,jk) = ( zabe2 * zdjt(ji,jj,jk) &

& + zcof2 * ( zdkt (ji,jj+1) + zdk1t(ji,jj) &
& + zdk1t(ji,jj+1) + zdkt (ji,jj) ) ) * vmask(ji,jj,jk)

where (l179) zabe2 is +ve
and (l145)

zdjt(ji,jj,jk) = ( ptb(ji ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) * vmask(ji,jj,jk)

so the part of zftv (zabe2 * zdjt(ji,jj,jk) ) from horizontal gradients in T has the *same* sign as the T-gradient, so it must be the opposite of the flux.

(iii) diagnosed isoneutral heat fluxes are southward across the Gulf Stream, which makes no sense.

Commit History (4)


Branch dev_v3_4_STABLE_2012. #1043 also correct sign of diagnostic poleward diffusive transport


Branch dev_MERGE_2012. #1043 also correct sign of diagnostic poleward diffusive transport


Branch dev_v3_4_STABLE_2012. #1043 correct sign of diagnostic diffusive transport


Branch dev_MERGE_2012. #1043 correct sign of diagnostic diffusive transport

Change History (3)

comment:1 Changed 8 years ago by clevy

  • Owner changed from NEMO team to acc

comment:2 Changed 8 years ago by acc

It seems the minimal fix is to change the sign on the constant used in the diagnostic calculation, i.e:

            ! note sign is reversed to give down-gradient diffusive transports (#1043)
            zztmp = -1.0_wp * rau0 * rcp
            z2d(:,:) = zztmp * z2d(:,:)

But is there also the same error with the diaptr diagnostics?:

         ! "Poleward" diffusive heat or salt transports (T-S case only)
         IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nn_fptr ) == 0 ) ) THEN
            IF( jn == jp_tem)   htr_ldf(:) = ptr_vj( zftv(:,:,:) )
            IF( jn == jp_sal)   str_ldf(:) = ptr_vj( zftv(:,:,:) )

comment:3 Changed 8 years ago by acc

  • Resolution set to fixed
  • Status changed from new to closed

After discussion' also changed the sign of the argument passed to ptr_vj for the poleward transport diagnostic in traldf_bilapg.F90 and traldf_iso.F90.

Closing ticket.

Note: See TracTickets for help on using tickets.