do_advection_3d - 3D advection schemes

**INTERFACE:**

subroutine do_advection_3d(dt,f,uu,vv,ww,hu,hv,ho,hn, & split,hscheme,vscheme,AH,tag, & hires,advres)

Here, advection terms for all three-dimensional state variables are
calculated by means of a finite-volume approach (an exception
is the possibility to directly calculate the momentum advection
by a one-step three-dimensional upstream scheme,
see `uv_advection_3d`) and the advection step is carried out
as a fractional advection time step. Those 3D variables may be defined on
T-, U-, V- and W-points. The latter option is interesting for
turbulent quantities. Inside this advection
routine, it does not matter, wehre the advected variable is located
on the grid. All finite volume fluxes and geometric coefficients
need to be calculated before `do_advection_3d` is called.

Originally, this 3D advection routine has been written for tracer equations. There, after multiplying the layer-integrated and transformed to curvilinear coordinates tracer equation (40) with , the advective terms in this equation are discretised as follows.

First advection term in (40):

Second advection term in (40):

Vertical advective fluxes in (40):

The interfacial concentrations are calculated according to upwind or higher order directional split schemes, which are discussed in detail below and in sections 7.4.2 and 8.6.4.

However, as said above, in the same way these routines may be applied to quantities on U-, V-, and W-points, if the transports are properly calculated.

There are various combinations of advection schemes possible.

The options for `split` are:

split = NOSPLIT: |
no split (one 3D uvw step) |

split = FULLSPLIT: |
full step splitting (u + v + w) |

split = HALFSPLIT: |
half step splitting (u/2 + v/2 + w + v/2 + u/2) |

split = HVSPLIT: |
hor./ver. splitting (uv + w) |

The options for the horizontal scheme `hscheme` are:

scheme = NOADV: |
advection disabled |

scheme = UPSTREAM: |
first-order upstream (monotone) |

scheme = UPSTREAM_2DH: |
2DH upstream with forced monotonicity |

scheme = P2: |
third-order polynomial (non-monotone) |

scheme = SUPERBEE: |
second-order TVD (monotone) |

scheme = MUSCL: |
second-order TVD (monotone) |

scheme = P2_PDM: |
third-order ULTIMATE-QUICKEST (monotone) |

scheme = J7: |
2DH Arakawa J7 |

scheme = FCT: |
2DH FCT with forced monotonicity |

scheme = P2_2DH: |
2DH P2 with forced monotonicity |

The options for the vertical scheme `vscheme` are:

scheme = NOADV: |
advection disabled |

scheme = UPSTREAM: |
first-order upstream (monotone) |

scheme = P2: |
third-order polynomial (non-monotone) |

scheme = SUPERBEE: |
second-order TVD (monotone) |

scheme = MUSCL: |
second-order TVD (monotone) |

scheme = P2_PDM: |
third-order ULTIMATE-QUICKEST (monotone) |

With the compiler option `SLICE_MODEL`, the advection in
meridional direction is not executed.

**USES:**

use halo_zones, only: update_3d_halo,wait_halo,D_TAG,H_TAG,U_TAG,V_TAG use getm_timers, only: tic,toc,TIM_ADV3D,TIM_ADV3DH IMPLICIT NONE

REALTYPE,intent(in) :: dt,AH REALTYPE,dimension(I3DFIELD),intent(in) :: uu,vv,ww,ho,hn,hu,hv integer,intent(in) :: split,hscheme,vscheme,tag

REALTYPE,dimension(I3DFIELD),intent(inout) :: f

REALTYPE,dimension(I3DFIELD),target,intent(out),optional :: hires,advres

type(t_adv_grid),pointer :: adv_grid REALTYPE,dimension(I3DFIELD),target :: fi,hi,adv REALTYPE,dimension(:,:,:),pointer :: p_hi,p_adv integer :: tag2d,i,j,k

kklingbe 2017-10-02