positive definite tracer advection schemes

Hello CROCO users,

I have a question about the advection schemes for tracers (e.g., temperature, salinity, passive tracer). In my simulation of a buoyancy-driven plume rising from a bottom heat source, I found that the concentration of the passive tracer I added to mark the plume fluid shows bogus negative values near the center of the source (see first image below). The same thing occurs in temperature (i.e., negative temperature anomaly at the source). Also, the negative minimum appears to grow with time (see second image below). I suspect these negative values are artifacts due to advection schemes. I am using WENO5 for trancers and TVD for velocities. The chosen cpp options are below:

define TS_HADV_WENO5

408 # define TS_VADV_WENO5
409 # define BIO_HADV_WENO5
410 # define UV_HADV_TVD
411 # define UV_VADV_TVD
412 # define W_HADV_TVD
413 # define W_VADV_TVD

I would like to know if there is a positive definite and monotonic scheme for tracers I can use other than WENO5.

I would appreciate if anyone can provide suggestions on diagnosing this issue.


image description
image description

Hi Guangyu, I also had a similar problem and I am curious to know if your issue has been resolved yet?

Hi Qinyue, It is unclear to me what is causing this issue. But I found that the artifacts in temperature tended to appear when the source heat flux was relatively large. So it appeared that these artifacts occur when there are large spatial gradients in temperature.

WENO5 is not the problem per se, but this scheme must be degraded near the bottom because the stencil is reduced there. The problem may simply be that the low-order scheme used at the first temperature point is not monotonic. We can try a first-order upwind scheme (in compute_vert_tracer_fluxes.h) to check this idea (there is a WENO3 scheme at the second point which seems to work well).

Many thanks for the suggestion, Patrick. I am wondering if you could help revise the source code in ‘compute_ver_tracer_fluxes.h’ to implement first-order upwind scheme for the second sigma layer? I will try to do it myself but more instructions will be much appreciated.

Try the following modifications.

in compute_vert_tracer_fluxes.h (WENO5 code), replace :

        FC(i,  1)=We(i,j,  1)*(        0.5*t(i,j,  1,nadv,itrc)
 &                       +0.58333333333333*t(i,j,  2,nadv,itrc)
 &                       -0.08333333333333*t(i,j,  3,nadv,itrc)
 &                                                            )
        FC(i,N-1)=We(i,j,N-1)*(        0.5*t(i,j,N  ,nadv,itrc)
 &                       +0.58333333333333*t(i,j,N-1,nadv,itrc)
 &                       -0.08333333333333*t(i,j,N-2,nadv,itrc)
 &                                                            )


        FC(i,1  )=We(i,j,1  )*flux1( t(i,j,1  ,nadv,itrc),
 &                                   t(i,j,2  ,nadv,itrc), We(i,j,1  ), 1.)

        FC(i,N-1)=We(i,j,N-1)*flux1( t(i,j,N-1,nadv,itrc),
 &                                   t(i,j,N  ,nadv,itrc), We(i,j,N-1), 1.)

Also, for the same points (1, N-1). In w_vadv_order5.h:


        FC(i,1)=We_r(i,1)*FLUX2( wz(i,j,1  ,nrhs),
 &                               wz(i,j,0  ,nrhs), We_r(i,1), 1.)

        FC(i,N)=We_r(i,N)*FLUX2( wz(i,j,N  ,nrhs),
 &                               wz(i,j,N-1,nrhs), We_r(i,N), 1.)


        FC(i,1)=We_r(i,1)*FLUX2( wz(i,j,0  ,nrhs),
 &                               wz(i,j,1  ,nrhs), We_r(i,1), 1.)

        FC(i,N)=We_r(i,N)*FLUX2( wz(i,j,N-1,nrhs),
 &                               wz(i,j,N  ,nrhs), We_r(i,N), 1.)

Hi Patrick, thanks a lot for sending me the revised code. I have implemented it and am now waiting for the test run to finish. It is very encouraging that the simulation has now gone past the previous time step when negative temperature anomalies appeared without showing any sign of that artifact.

I am happy to report back that this problem has been solved after implementing the changes in ‘comput_ver_tracer_fluxes’ and ‘w_vadv_order5’ as suggested by Patrick. Many thanks!!!