\documentclass[tikz]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{amsmath}
\usetikzlibrary{arrows.meta}
\pgfplotsset{
  compat=newest,
}
\usepackage{xcolor}

% Dark Khaki
\definecolor{darkKhaki}%
  {rgb}{0.7215686274509804,0.5254901960784314,0.043137254901960784}
% Khaki
\definecolor{khaki}%
  {rgb}{0.9411764705882353,0.9019607843137255,0.5490196078431373}
% Royal Blue
\definecolor{royalBlue}%
  {rgb}{0.2549019607843137, 0.4117647058823529, 0.8823529411764706}
% Light Sky Blue
\definecolor{lightSkyBlue}%
  {rgb}{0.5294117647058824, 0.807843137254902, 0.9803921568627451}
% indianred 3
\definecolor{indianred}%
  {rgb}{0.803921568627451, 0.3333333333333333, 0.3333333333333333}
% rosybrown
\definecolor{rosybrown}%
  {rgb}{0.803921568627451, 0.6078431372549019, 0.6078431372549019}

\newcommand*{\bottom}[2]{{0.7 + (0.1*(1-cos(3.6*(#1)))^2 + 0.1*(1-cos(3.6*(#2)))^2)}}
\newcommand*{\hBottom}[2]{{9.0+0.5*cos(2.0*(#1))*sin(5.0*(100-(#2)))*cos((#1)*(100-(#2))/10.0)}}
\newcommand*{\hTop}[2]{{12.0+0.5*cos(1.8*(#1))*cos(1.8*(#1))+0.5*cos(2.0*(#1))*sin(5.0*(#2))*cos((#1)*(#2)/10.0)}}

% \makeatletter
% \def\pgfplotscolormappdfmax{1}
% \def\pgfplotscolormappdfmax@inv{1000}
% \makeatother

\begin{document}

\begin{tikzpicture}[
    figtext/.style={font=\small},
    annotations/.style={
      >=stealth,
      <->,
      shorten <= 0.5pt,
      shorten >= 0.5pt,
    },
    p2/.style={
      smooth,
      samples=100,
      domain=0:100,
    },
  ]

  \begin{axis}[
      view={70}{15},
      width={12cm},
      height={8cm},
      ticks=none,
      axis line style={draw=none},
      zmin=-0.55,
      xmin=-8.5,
      ymin=-8.5,
      point meta rel=per plot,
      p1/.style={
        surf,
        shader=interp,
        z buffer=sort,
        samples=50,
        domain=0:100,
        y domain=0:100,
      },
    ]

    % Fill in the back
    % Bottom fill
    \draw[fill opacity=1.0,fill={darkKhaki}]
      (0, 0, -0.5)
      -- plot[p2] (0, \x, \bottom{\x}{0.0})
      -- (0, 100, -0.5) -- cycle;

    \draw[fill opacity=1.0, fill={darkKhaki}]
      (0, 100, -0.5)
      -- plot[p2] (\x, 100, \bottom{100.0}{\x})
      -- (100, 100, -0.5) -- cycle;

    % Bottom layer fill
    \draw[fill opacity=0.4, fill={royalBlue}]
      (0, 0, 0.7)
      -- plot[p2] (0, \x, \hBottom{0.0}{\x})
      -- (0, 100, 0.2)
      -- plot[p2] (0, 100.0-\x, \bottom{0.0}{100.0-\x}) -- cycle;

    \draw[fill opacity=0.4, fill={royalBlue}]
      (0,100,0.7)
      -- plot[p2] (\x, 100, \hBottom{\x}{100.0})
      -- (100, 100, 0.2)
      -- plot[p2] (100.0-\x, 100.0, \bottom{100.0-\x}{100.0}) -- cycle;

    % Top layer fill
    \draw[fill opacity=0.2, fill={indianred}]
      (0,0,3.3)
      -- plot[p2] (0, \x, \hTop{0.0}{\x})
      -- (0, 100, 4)
      -- plot[p2] (0, 100.0-\x, \hBottom{0.0}{100.0-\x}) -- cycle;

    \draw[fill opacity=0.2, fill={indianred}]
      (0,100,3.3)
      -- plot[p2] (\x, 100, \hTop{\x}{100.0})
      -- (100, 100, 0)
      -- plot[p2] (100.0-\x, 100, \hBottom{100.0-\x}{100.0}) -- cycle;

    % Labelling the heights
    \draw[annotations] (-2, -3,-0.5) -- node[figtext, left] {$b$}   (-2, -3, 0.7);
    \draw[annotations] (-2, -3, 0.7) -- node[figtext, left] {$h_2$} (-2, -3, 9.3);
    \draw[annotations] (-2, -3, 9.3) -- node[figtext, left] {$h_1$} (-2, -3,12.5);

    % Labelling the rest
    \node[figtext, right] at (0, 0,10.5) {$\rho_1$ $\boldsymbol{u}_1$};
    \node[figtext, right] at (0, 0, 2.5) {$\rho_2$ $\boldsymbol{u}_2$};

    % Bottom Topography
    \addplot3[p1, opacity=1.0, colormap={bottomColorMap}{color=(khaki) color=(darkKhaki)}]
      {\bottom x y};

    % Bottom Layer
    \addplot3[p1, opacity=1.0, colormap={hBottomColorMap}{color=(royalBlue) color=(lightSkyBlue)}]
      {\hBottom x y};

    % Top Layer
    \addplot3[p1, opacity=0.7, colormap={hBottomColorMap}{color=(indianred) color=(rosybrown)}]
      {\hTop x y};

    % Bottom fill
    \draw[fill opacity=1.0,fill={darkKhaki}]
      (0, 0, -0.5) -- (0, 0, 0.2)
      -- plot[p2] (\x, 0, \bottom{\x}{0.0})
      -- (100, 0, -0.5) -- cycle;

    \draw[fill opacity=1.0, fill={darkKhaki}]
      (100, 0, -0.5) -- (100, 0, 1)
      -- plot[p2] (100, \x, \bottom{100.0}{\x})
      -- (100, 100, -0.5) -- cycle;

    % Bottom layer fill
    \draw[fill opacity=0.4, fill={royalBlue}]
      (0, 0, 0.2) -- (0, 0, 1)
      -- plot[p2] (\x, 0, \hBottom{\x}{0.0})
      -- (100, 0, 0.2)
      -- plot[p2] (100.0-\x, 0, \bottom{100.0-\x}{0.0}) -- cycle;

    \draw[fill opacity=0.4, fill={royalBlue}]
      (100,0,0.2) -- (100, 0, 1)
      -- plot[p2] (100, \x, \hBottom{100.0}{\x})
      -- (100, 100, 0.2)
      -- plot[p2] (100.0, 100.0-\x, \bottom{100.0}{100.0-\x}) -- cycle;

    % Top layer fill
    \draw[fill opacity=0.2, fill={indianred}]
      (0,0,2) -- (0, 0, 4)
      -- plot[p2] (\x, 0, \hTop{\x}{0.0})
      -- (100, 0, 4)
      -- plot[p2] (100.0-\x, 0, \hBottom{100.0-\x}{0.0}) -- cycle;

    \draw[fill opacity=0.2, fill={indianred}]
      (100,0,0) -- (100, 0, 1)
      -- plot[p2] (100, \x, \hTop{100.0}{\x})
      -- (100, 100, 0)
      -- plot[p2] (100.0, 100.0-\x, \hBottom{100.0}{100.0-\x}) -- cycle;
  \end{axis}
\end{tikzpicture}

\end{document}
