Get Gradient Value

Fluent 计算过程中默认会将梯度值释放掉以降低内存占用,因此通常无法直接访问。但以下几种情况除外:

  • 压力、三个速度分量和 UDS 的梯度默认保存,可以直接获取
  • DEFINE_VECTOR_EXCHANGE_PROPERTY 中调用 C_VOF_G
  • 使用 DEFINE_SOURCE 到对应方程时,可以调用对应变量梯度。如 energy 源项中调用 C_T_G

The official way to use gradient macros

使用命令 solve/set/advanced/retain-temporary-solver-mem 使 Fluent 保留梯度值

梯度值是在迭代过程中求解的,因此在迭代开始之前,无法获得梯度值。如 DEFINE_ADJUST 宏在迭代开始之前调用了梯度,Fluent 会报错。可以使用 if(NULL!=T_STORAGE_R_NV(fluid_thread, SV_T_G)) 来判断是否已经建立了梯度值。

DEFINE_ADJUST(show_gradient, domain)
{
    face_t f;
    real T_gradient[ND_ND];
    int theInletID = GetZoneIdByName("inlet"); //根据边界名字获取其ID,如果返回-1表示找不到
    if (-1 == theInletID)
    {
        Message("Cannot find the boundary name 'inlet'. Please modify!\n");
        return;
    }

    Thread *wall_thread = Lookup_Thread(domain, theInletID);
    Thread *fluid_thread = THREAD_T0(wall_thread);

    begin_f_loop(f, wall_thread)
    {
        cell_t c0 = F_C0(f, wall_thread);
        // 如果温度梯度已经建立,一般迭代第二步以后就有梯度值了
        if(NULL!=T_STORAGE_R_NV(fluid_thread, SV_T_G))  
            NV_V(T_gradient, =, C_T_G(c0, fluid_thread));
        // 如果温度梯度尚未建立,一般是迭代第一步的开始
        else 
            NV_D(T_gradient,=,0,0,0);
        Message("c=%d, Temperature X gradient is %g\n", c0, T_gradient[0]);     
    }
    end_f_loop(f, wall_thread)
}

————————————————
转载自:https://blog.csdn.net/SuperUDF/article/details/128140287

The unofficial way to use gradient macros

There are undocumented macros that allow you to allocate memory and (re-)calculate gradient and reconstruction gradient macros on the fly. These are:

  • Alloc_Storage_Vars(domain, SV_*_RG, SV_*_G, SV_NULL)
  • Scalar_Reconstruction(domain, SV_*, -1, SV_*_RG, NULL)
  • Scalar_Derivatives(domain, SV_*, -1, SV_*_G, SV_*_RG, NULL)
  • Free_Storage_Vars(domain, SV_*_RG, SV_*_G, SV_NULL)

Example 1:

DEFINE_ADJUST(allocate_vof, d) 
{
    #if !RP_HOST 
    Domain *sd1, *sd2; 
    sd1 = DOMAIN_SUB_DOMAIN(d, 0); 
    sd2 = DOMAIN_SUB_DOMAIN(d, 1); 
    Alloc_Storage_Vars(sd1, SV_VOF_RG, SV_VOF_R, SV_NULL);
    Scalar_Reconstruction(sd1, SV_VOF, -1, SV_VOF_RG, NULL);
    Scalar_Derivatives(sd1, SV_VOF, -1, SV_VOF_G, SV_VOF_RG, Vof_Deriv_Accumulate);
    Alloc_Storage_Vars(sd2, SV_VOF_RG, SV_VOF_R, SV_NULL);
    Scalar_Reconstruction(sd2, SV_VOF, -1, SV_VOF_RG, NULL);
    Scalar_Derivatives(sd2, SV_VOF, -1, SV_VOF_G, SV_VOF_RG, Vof_Deriv_Accumulate);
    #endif 
}

Example 2:

DEFINE_ADJUST(Shear_stress_calculation,d)
{
    #if !RP_HOST
    face_t f;
    ......
    /* Allocate memory for temperature gradients */ 
    Alloc_Storage_Vars(d, SV_T_RG, SV_T_G, SV_NULL); 
    /* Calculate temperature gradients */ 
    T_derivatives(d); 
    /* Free memory for reconstruction gradient - this is NOT required */ 
    Free_Storage_Vars(d, SV_T_RG, SV_NULL);

    begin_f_loop(f,tf)
    {   
        ......
    }  
    end_f_loop(f,tf)

    /* Free memory for gradient - this is NOT required */ 
    Free_Storage_Vars(d, SV_T_G, SV_NULL);
    #endif /* ! RP_HOST */
}

转载自:https://pdfcoffee.com/2039716-3-pdf-free.html