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