<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.19" xml:lang="en-US">
  <compounddef id="namespacemom__wave__structure" kind="namespace" language="Fortran">
    <compoundname>mom_wave_structure</compoundname>
    <innerclass refid="structmom__wave__structure_1_1wave__structure__cs" prot="public">mom_wave_structure::wave_structure_cs</innerclass>
      <sectiondef kind="func">
      <memberdef kind="function" id="namespacemom__wave__structure_1a4e0b6a0e08df15fde4d87030567b6e11" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
        <type>subroutine, public</type>
        <definition>subroutine, public mom_wave_structure::wave_structure</definition>
        <argsstring>(h, tv, G, GV, US, cn, ModeNum, freq, CS, En, full_halos)</argsstring>
        <name>wave_structure</name>
        <param>
          <type>h</type>
          <defname>h</defname>
        </param>
        <param>
          <type>tv</type>
          <defname>tv</defname>
        </param>
        <param>
          <type>G</type>
          <defname>G</defname>
        </param>
        <param>
          <type>GV</type>
          <defname>GV</defname>
        </param>
        <param>
          <type>US</type>
          <defname>US</defname>
        </param>
        <param>
          <type>cn</type>
          <defname>cn</defname>
        </param>
        <param>
          <type>ModeNum</type>
          <defname>ModeNum</defname>
        </param>
        <param>
          <type>freq</type>
          <defname>freq</defname>
        </param>
        <param>
          <type>CS</type>
          <defname>CS</defname>
        </param>
        <param>
          <type>En</type>
          <defname>En</defname>
        </param>
        <param>
          <type>full_halos</type>
          <defname>full_halos</defname>
        </param>
        <briefdescription>
<para>This subroutine determines the internal wave velocity structure for any mode. </para>
        </briefdescription>
        <detaileddescription>
<para>This subroutine solves for the eigen vector [vertical structure, e(k)] associated with the first baroclinic mode speed [i.e., smallest eigen value (lam = 1/c^2)] of the system d2e/dz2 = -(N2/cn2)e, or (A-lam*I)e = 0, where A = -(1/N2)(d2/dz2), lam = 1/c^2, and I is the identity matrix. 2nd order discretization in the vertical lets this system be represented as</para>
<para>-Igu(k)*e(k-1) + (Igu(k)+Igl(k)-lam)*e(k) - Igl(k)*e(k+1) = 0.0</para>
<para>with rigid lid boundary conditions e(1) = e(nz+1) = 0.0 giving</para>
<para>(Igu(2)+Igl(2)-lam)*e(2) - Igl(2)*e(3) = 0.0 -Igu(nz)*e(nz-1) + (Igu(nz)+Igl(nz)-lam)*e(nz) = 0.0</para>
<para>where, upon noting N2 = reduced gravity/layer thickness, we get Igl(k) = 1.0/(gprime(k)*H(k)) ; Igu(k) = 1.0/(gprime(k)*H(k-1))</para>
<para>The eigen value for this system is approximated using &quot;wave_speed.&quot; This subroutine uses these eigen values (mode speeds) to estimate the corresponding eigen vectors (velocity structure) using the &quot;inverse iteration with shift&quot; method. The algorithm is</para>
<para>Pick a starting vector reasonably close to mode structure and with unit magnitude, b_guess For n=1,2,3,... Solve (A-lam*I)e = e_guess for e Set e_guess=e/|e| and repeat, with each iteration refining the estimate of e <parameterlist kind="param"><parameteritem>
<parameternamelist>
<parametername direction="in">g</parametername>
</parameternamelist>
<parameterdescription>
<para>The ocean&apos;s grid structure. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">gv</parametername>
</parameternamelist>
<parameterdescription>
<para>The ocean&apos;s vertical grid structure. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">us</parametername>
</parameternamelist>
<parameterdescription>
<para>A dimensional unit scaling type </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">h</parametername>
</parameternamelist>
<parameterdescription>
<para>Layer thicknesses [H ~&gt; m or kg m-2] </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">tv</parametername>
</parameternamelist>
<parameterdescription>
<para>A structure pointing to various thermodynamic variables. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">cn</parametername>
</parameternamelist>
<parameterdescription>
<para>The (non-rotational) mode internal gravity wave speed [L T-1 ~&gt; m s-1]. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">modenum</parametername>
</parameternamelist>
<parameterdescription>
<para>Mode number </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">freq</parametername>
</parameternamelist>
<parameterdescription>
<para>Intrinsic wave frequency [T-1 ~&gt; s-1]. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername>cs</parametername>
</parameternamelist>
<parameterdescription>
<para>The control structure returned by a previous call to wave_structure_init. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">en</parametername>
</parameternamelist>
<parameterdescription>
<para>Internal wave energy density [R Z3 T-2 ~&gt; J m-2] </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">full_halos</parametername>
</parameternamelist>
<parameterdescription>
<para>If true, do the calculation over the entire computational domain. </para>
</parameterdescription>
</parameteritem>
</parameterlist>
</para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/cermak/src/MOM6.devrob/src/diagnostics/MOM_wave_structure.F90" line="91" column="1" bodyfile="/home/cermak/src/MOM6.devrob/src/diagnostics/MOM_wave_structure.F90" bodystart="92" bodyend="556"/>
        <references refid="namespacemom__error__handler_1a460cfb79a06c29fc249952c2a3710d67" compoundref="MOM__error__handler_8F90" startline="72" endline="92">mom_error_handler::mom_error</references>
        <references refid="namespacemom__wave__structure_1ad8e6e47af44d24efcd3f3b80f4344fbd" compoundref="MOM__wave__structure_8F90" startline="563" endline="682">tridiag_solver</references>
        <referencedby refid="namespacemom__internal__tides_1aeeeea20ff7fe971846b7539d377f4389" compoundref="MOM__internal__tides_8F90" startline="154" endline="589">mom_internal_tides::propagate_int_tide</referencedby>
      </memberdef>
      <memberdef kind="function" id="namespacemom__wave__structure_1ad8e6e47af44d24efcd3f3b80f4344fbd" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
        <type>subroutine</type>
        <definition>subroutine mom_wave_structure::tridiag_solver</definition>
        <argsstring>(a, b, c, h, y, method, x)</argsstring>
        <name>tridiag_solver</name>
        <param>
          <type>a</type>
          <defname>a</defname>
        </param>
        <param>
          <type>b</type>
          <defname>b</defname>
        </param>
        <param>
          <type>c</type>
          <defname>c</defname>
        </param>
        <param>
          <type>h</type>
          <defname>h</defname>
        </param>
        <param>
          <type>y</type>
          <defname>y</defname>
        </param>
        <param>
          <type>method</type>
          <defname>method</defname>
        </param>
        <param>
          <type>x</type>
          <defname>x</defname>
        </param>
        <briefdescription>
<para>Solves a tri-diagonal system Ax=y using either the standard Thomas algorithm (TDMA_T) or its more stable variant that invokes the &quot;Hallberg substitution&quot; (TDMA_H). </para>
        </briefdescription>
        <detaileddescription>
<para><parameterlist kind="param"><parameteritem>
<parameternamelist>
<parametername direction="in">a</parametername>
</parameternamelist>
<parameterdescription>
<para>lower diagonal with first entry equal to zero. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">b</parametername>
</parameternamelist>
<parameterdescription>
<para>middle diagonal. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">c</parametername>
</parameternamelist>
<parameterdescription>
<para>upper diagonal with last entry equal to zero. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">h</parametername>
</parameternamelist>
<parameterdescription>
<para>vector of values that have already been added to b; used for systems of the form (e.g. average layer thickness in vertical diffusion case): [ -alpha(k-1/2) ] * e(k-1) + [ alpha(k-1/2) + alpha(k+1/2) + h(k) ] * e(k) + [ -alpha(k+1/2) ] * e(k+1) = y(k) where a(k)=[-alpha(k-1/2)], b(k)=[alpha(k-1/2)+alpha(k+1/2) + h(k)], and c(k)=[-alpha(k+1/2)]. Only used with TDMA_H method. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">y</parametername>
</parameternamelist>
<parameterdescription>
<para>vector of known values on right hand side. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">method</parametername>
</parameternamelist>
<parameterdescription>
<para>A string describing the algorithm to use </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="out">x</parametername>
</parameternamelist>
<parameterdescription>
<para>vector of unknown values to solve for. </para>
</parameterdescription>
</parameteritem>
</parameterlist>
</para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/cermak/src/MOM6.devrob/src/diagnostics/MOM_wave_structure.F90" line="562" column="1" bodyfile="/home/cermak/src/MOM6.devrob/src/diagnostics/MOM_wave_structure.F90" bodystart="563" bodyend="682"/>
        <references refid="namespacemom__error__handler_1a460cfb79a06c29fc249952c2a3710d67" compoundref="MOM__error__handler_8F90" startline="72" endline="92">mom_error_handler::mom_error</references>
        <referencedby refid="namespacemom__wave__structure_1a4e0b6a0e08df15fde4d87030567b6e11" compoundref="MOM__wave__structure_8F90" startline="92" endline="556">wave_structure</referencedby>
      </memberdef>
      <memberdef kind="function" id="namespacemom__wave__structure_1a4dc27a0fbdbb402b9f4def03f70cfba2" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
        <type>subroutine, public</type>
        <definition>subroutine, public mom_wave_structure::wave_structure_init</definition>
        <argsstring>(Time, G, param_file, diag, CS)</argsstring>
        <name>wave_structure_init</name>
        <param>
          <type>Time</type>
          <defname>Time</defname>
        </param>
        <param>
          <type>G</type>
          <defname>G</defname>
        </param>
        <param>
          <type>param_file</type>
          <defname>param_file</defname>
        </param>
        <param>
          <type>diag</type>
          <defname>diag</defname>
        </param>
        <param>
          <type>CS</type>
          <defname>CS</defname>
        </param>
        <briefdescription>
<para>Allocate memory associated with the wave structure module and read parameters. </para>
        </briefdescription>
        <detaileddescription>
<para><parameterlist kind="param"><parameteritem>
<parameternamelist>
<parametername direction="in">time</parametername>
</parameternamelist>
<parameterdescription>
<para>The current model time. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">g</parametername>
</parameternamelist>
<parameterdescription>
<para>The ocean&apos;s grid structure. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">param_file</parametername>
</parameternamelist>
<parameterdescription>
<para>A structure to parse for run-time parameters. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername direction="in">diag</parametername>
</parameternamelist>
<parameterdescription>
<para>A structure that is used to regulate diagnostic output. </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername>cs</parametername>
</parameternamelist>
<parameterdescription>
<para>A pointer that is set to point to the control structure for this module. </para>
</parameterdescription>
</parameteritem>
</parameterlist>
</para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/cermak/src/MOM6.devrob/src/diagnostics/MOM_wave_structure.F90" line="686" column="1" bodyfile="/home/cermak/src/MOM6.devrob/src/diagnostics/MOM_wave_structure.F90" bodystart="687" bodyend="727"/>
        <references refid="namespacemom__error__handler_1a460cfb79a06c29fc249952c2a3710d67" compoundref="MOM__error__handler_8F90" startline="72" endline="92">mom_error_handler::mom_error</references>
        <referencedby refid="namespacemom__internal__tides_1a48431ac355c6fa3de7548bfdec620eb0" compoundref="MOM__internal__tides_8F90" startline="2102" endline="2544">mom_internal_tides::internal_tides_init</referencedby>
      </memberdef>
      </sectiondef>
    <briefdescription>
<para>Vertical structure functions for first baroclinic mode wave speed. </para>
    </briefdescription>
    <detaileddescription>
    </detaileddescription>
    <location file="/home/cermak/src/MOM6.devrob/src/diagnostics/MOM_wave_structure.F90" line="2" column="1"/>
  </compounddef>
</doxygen>
