Skip to content
Snippets Groups Projects
sfx-surface.cuh 1.82 KiB
Newer Older
  • Learn to ignore specific revisions
  • 数学の武士's avatar
    .
    数学の武士 committed
    #pragma once
    
    #include "sfx-data.h"
    #include "sfx-math.cuh"
    
    数学の武士's avatar
    .
    数学の武士 committed
    
    
    数学の武士's avatar
    数学の武士 committed
    template<typename T>
    FUCNTION_DECLARATION_SPECIFIER void get_thermal_roughness(T &z0_t, T &B,
        const T z0_m, const T Re, 
        const struct sfx_surface_param& param,
        const int surface_type)
    {
    
        // --- define B = logf(z0_m / z0_t)
        B = (Re <= param.Re_rough_min) ? param.B1_rough * logf(param.B3_rough * Re) + param.B2_rough : 
                                                     param.B4_rough * (powf(Re, param.B2_rough));
    
    数学の武士's avatar
    数学の武士 committed
    
        //   --- apply max restriction based on surface type
        if (surface_type == param.surface_ocean)  B = sfx_math::min(B, param.B_max_ocean);
    
    数学の武士's avatar
    数学の武士 committed
        if (surface_type == param.surface_lake)   B = sfx_math::min(B, param.B_max_lake);
        if (surface_type == param.surface_land)   B = sfx_math::min(B, param.B_max_land);
    
    数学の武士's avatar
    数学の武士 committed
    
        // --- define roughness [thermal]
        z0_t = z0_m / exp(B);
    }
    
    template<typename T>
    FUCNTION_DECLARATION_SPECIFIER void get_charnock_roughness(T &z0_m, T &u_dyn0,
    
    数学の武士's avatar
    数学の武士 committed
        const T U, const T h,
    
    数学の武士's avatar
    数学の武士 committed
        const sfx_surface_param& surface_param,
    
    数学の武士's avatar
    数学の武士 committed
        const int maxiters)
    
    数学の武士's avatar
    数学の武士 committed
    {
        T Uc, a, b, c, c_min, f;
    
        Uc = U;
        a = 0.0;
        b = 25.0;
    
        c_min = logf(surface_param.h_charnock) / surface_param.kappa;
    
    数学の武士's avatar
    数学の武士 committed
    
    
    数学の武士's avatar
    数学の武士 committed
        for (int i = 0; i < maxiters; i++)
    
    数学の武士's avatar
    数学の武士 committed
        {
    
            f = surface_param.c1_charnock - 2.0 * logf(Uc);
    
    数学の武士's avatar
    数学の武士 committed
            for (int j = 0; j < maxiters; j++)
    
    数学の武士's avatar
    数学の武士 committed
            {
    
                c = (f + 2.0 * logf(b)) / surface_param.kappa;
    
    数学の武士's avatar
    数学の武士 committed
                if (U <= 8.0e0) 
    
                    a = logf(1.0 + surface_param.c2_charnock * ( powf(b / Uc, 3) ) ) / surface_param.kappa;
    
    数学の武士's avatar
    数学の武士 committed
                c = sfx_math::max(c - a, c_min);
                b = c;
            }
    
    数学の武士's avatar
    数学の武士 committed
            z0_m = surface_param.h_charnock * exp(-c * surface_param.kappa);
    
    数学の武士's avatar
    数学の武士 committed
            z0_m = sfx_math::max(z0_m, T(0.000015e0));
    
            Uc = U * logf(surface_param.h_charnock / z0_m) / logf(h / z0_m);
    
    数学の武士's avatar
    数学の武士 committed
        }
        
        u_dyn0 = Uc / c;
    }