scalar stokesFifthProperties::waveNumber()
{
    scalar lower(1.0e-7);

    scalar upper = Foam::max
        (
            4.0*PI_/( period_*Foam::sqrt( Foam::mag(G_)*depth_)),
            2.0*PI_/( Foam::pow( period_, 2.0))
        );

    scalar middle(0.5*(lower + upper) );

    scalar valLower( eval( lower ) ),
           valUpper( eval( upper ) ),
           valMiddle( eval( middle ) );

    while (true)
    {
        if (Foam::sign( valLower ) == Foam::sign( valMiddle ))
        {
            lower    = middle;
            valLower = valMiddle;
        }
        else
        {
            upper    = middle;
            valUpper = valMiddle;
        }

        middle = 0.5*( lower + upper );

        valMiddle = eval(middle);

        if (Foam::mag(valMiddle) < 1.0e-13)
        {
            break;
        }
    }

    return middle;
}
Ejemplo n.º 2
0
scalar stokesFirstProperties::linearWaveNumber() const
{
	scalar lower(0.0);

    scalar upper = Foam::max( 4.0 * PI_ / ( period_ * Foam::sqrt( Foam::mag(G_) * depth_)),
						      2.0 * PI_ / ( Foam::pow( period_, 2.0) ) );

    scalar middle(0.5 * (lower + upper) );

    scalar tanhMax(100);

    scalar valLower( Foam::pow(omega_, 2.0) - Foam::mag(G_) * lower * Foam::tanh( Foam::min(lower * depth_, tanhMax) ) ),
    	   valUpper( Foam::pow(omega_, 2.0) - Foam::mag(G_) * upper * Foam::tanh( Foam::min(upper * depth_, tanhMax) ) ),
    	   valMiddle( Foam::pow(omega_, 2.0) - Foam::mag(G_) * middle * Foam::tanh( Foam::min(middle * depth_, tanhMax) ) );

    while ( true )
    {
    	if ( Foam::sign( valLower ) == Foam::sign( valMiddle ) )
    	{
			lower    = middle;
			valLower = valMiddle;
    	}
    	else
    	{
    		upper    = middle;
    		valUpper = valMiddle;
    	}

    	middle = 0.5 * ( lower + upper );

    	valMiddle = Foam::pow(omega_, 2.0) - Foam::mag(G_) * middle * Foam::tanh( Foam::min(middle * depth_, tanhMax) );

    	if ( Foam::mag(valMiddle) < 1.0e-13 || Foam::mag(valLower - valUpper) / middle < 1.0e-13 )
    		break;
    }

	return middle;
}