在fluent 15.0中使用脚本和udf进行桥梁截面强迫振动计算(脚本和udf代码如下),该udf可以生成一个Weiyi文件,但是在该Weiyi文件中生成的升力、阻力、力矩随时间变化有的一直为0,有的一直不变,不能生成正常数值,请问升力、阻力、力矩如何生成正常数值。
注解:脚本为记事本文件,其中obstacles,zhuan,bianxing为动网格区域。
/file/read-case/Fluent.cas
/mesh/scale 0.02 0.02
/mesh/check
/define/models/solver/pressure-based yes
/define/models/unsteady-2nd-order? yes
/define/models/viscous/kw-sst? yes
/define/boundary-conditions/velocity-inlet inlet yes yes no 1.44 no 0. no 1 no 0 no no yes 0.2 5
/define/boundary-conditions/pressure-outlet outlet no 0. no yes no no yes 0.2 5 no no
/define/dynamic-mesh/dynamic-mesh? yes no no no no
/define/dynamic-mesh/controls/smoothing-parameters/constant-factor 0.005
/define/dynamic-mesh/controls/smoothing-parameters/max-iter 50
/define/dynamic-mesh/controls/smoothing-parameters/spring-on-all-elements? yes
/define/user-defined/compiled-functions compile "libudf" yes "Torsional.c" "" ""
/define/user-defined/compiled-functions load "libudf"
/define/dynamic-mesh/zones/create obstacle rigid-body "first::libudf" no 0. 0. 0. 2 constant 0. no
/define/dynamic-mesh/zones/create zhuan rigid-body "second::libudf" 0. 0. 0.
/define/dynamic-mesh/zones/create bianxing deforming yes all no 0.01813348 0.109047 0.5
/report/reference-values/compute/velocity-inlet inlet
/report/reference-values/area 1
/report/reference-values/density 1.225000023841819
/report/reference-values/enthalpy 1
/report/reference-values/length 1
/report/reference-values/pressure 0
/report/reference-values/temperature 288.16
/report/reference-values/velocity 1
/report/reference-values/viscosity 1.789400084817316e-05
/solve/set/p-v-coupling 20
/solve/set/gradient-scheme no yes
/solve/set/discretization-scheme/pressure 12
/solve/set/discretization-scheme/mom 4
/solve/set/discretization-scheme/k 4
/solve/set/discretization-scheme/omega 4
/solve/monitors/residual/convergence-criteria 1e-08 1e-08 1e-08 1e-08 1e-08
/solve/monitors/residual/plot? no
/solve/monitors/residual/print? no
/solve/monitors/force/set-drag-monitor cd_1 yes obstacle () no yes "1_drag.txt" no no 1 0
/solve/monitors/force/set-lift-monitor cl_1 yes obstacle () no yes "1_lift.txt" no no 0 1
/solve/monitors/force/set-moment-monitor cm_1 yes obstacle () no yes "1_moment.txt" no no 0 0 0 0 1
/solve/initialize/compute-defaults/velocity-inlet inlet
/solve/initialize/initialize-flow
/file/auto-save/data-frequency 100
/file/auto-save/case-frequency if-case-is-modified
/file/auto-save/retain-most-recent-files yes
/file/auto-save/max-files 2
../solve/set/data-sampling yes 1 yes yes
/solve/set/time-step 0.003
/solve/dual-time-iterate 30 20
/exit
#include "udf.h"
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
#include "math.h"
static double number = 0;
static double sudu[3];
static double Amp =-4 * M_PI / 180; /*The amplitude of the enforced motion with a unity of meter*/
static double freq_hz = 2; /*Frequency of the enforced motion with a unity of Hz*/
DEFINE_CG_MOTION(first,dt,vel,omega,time,dtime)
{
double Freq = 2 * M_PI * freq_hz; /*Frequency of the enforced motion with a unity of per rad*/
double disp; /*Displacement of the section centre*/
double jiaosudu[3];
double time_initial; /*time for the UDF to start*/
double force[ND_ND],moment[ND_ND];
double cog[ND_ND];
int x;
#if !RP_NODE
FILE *fp_1;
#endif
#if !RP_HOST
Domain *d;
Thread *t;
face_t f;
cell_t c;
double NV_VEC (A);
d = Get_Domain(1);
t = DT_THREAD(dt);
for(x=0; x[x] = DT_CG(dt)[x];
}
Compute_Force_And_Moment(d, t, cog, force, moment, FALSE);
#endif
node_to_host_double_4(force[0],force[1],moment[2],cog[1]);
if (number == 0)
{
time_initial = time - dtime;
number = number + 1;
}
disp = Amp * sin(Freq * (time - time_initial));
jiaosudu[2] = Amp * Freq * cos(Freq * (time - time_initial));
sudu[2] = jiaosudu[2];
#if !RP_NODE
fp_1 = fopen("Weiyi_Sudu.txt","a+");
fprintf(fp_1, "%.16lf %.16lf %.16lf %.16lf %.16lf %.16lf\n", time, disp, jiaosudu[2],force[0],force[1],moment[2]);
fclose(fp_1);
#endif
host_to_node_double_1(jiaosudu[2]);
#if !RP_HOST
/*Thread *t;*/
/*face_t f;*/
NV_S(vel, =, 0.0);
NV_S(omega, =, 0.0);
if (!Data_Valid_P())
return;
omega[2] = jiaosudu[2];
#endif
}
DEFINE_CG_MOTION(second,dt,vel,omega,time,dtime)
{
host_to_node_double_1(sudu[2]);
#if !RP_HOST
omega[2] = sudu[2];
#endif
}
引用chatGPT作答,根据您提供的信息,我发现您的UDF中有一些变量未被初始化,可能会影响计算结果,需要进行初始化。我还注意到您似乎没有在动态网格区域中定义强制运动,这可能会影响到升力、阻力、力矩的计算。我建议您按照以下步骤检查和修改您的代码:
1.在UDF中对所有变量进行初始化。例如,对于sudu数组,您需要对其进行初始化,否则在代码中使用sudu[0]时会出现未定义的错误。在这种情况下,您可以使用以下代码对sudu数组进行初始化:
sudu[0] = 0.0;
sudu[1] = 0.0;
sudu[2] = 0.0;
2.检查您的动态网格区域设置是否正确。您需要将障碍物区域(obstacle)和变形区域(deforming)与强制运动区域(rigid-body)相互连接。在您的代码中,我没有看到您将强制运动区域与任何动态网格区域连接起来,这可能导致您的升力、阻力和力矩计算不正确。您可以在定义动态网格区域时使用以下代码将其与强制运动区域连接起来:
/define/dynamic-mesh/zones/create obstacle rigid-body "first::libudf" no 0. 0. 0. 2 constant 0. no
/define/dynamic-mesh/zones/create zhuan rigid-body "second::libudf" 0. 0. 0.
/define/dynamic-mesh/zones/create bianxing deforming yes all no 0.01813348 0.109047 0.5
/define/dynamic-mesh/zones/connect obstacle bianxing
/define/dynamic-mesh/zones/connect zhuan bianxing
/define/dynamic-mesh/zones/connect obstacle zhuan
3.检查您的升力、阻力和力矩监视器是否正确设置。您需要将它们与障碍物区域相关联。在您的代码中,我没有看到您将升力、阻力和力矩监视器与任何障碍物区域相关联,这可能导致您无法正确地监视这些参数。您可以在设置监视器时使用以下代码将其与障碍物区域相关联:
/solve/monitors/force/set-drag-monitor cd_1 yes obstacle () no yes "1_drag.txt" no no 1 0
/solve/monitors/force/set-lift-monitor cl_1 yes obstacle () no yes "1_lift.txt" no no 0 1
/solve/monitors/force/set-moment-monitor cm_1 yes obstacle () no yes "1_moment.txt" no no 0 0 0 0 1
希望这些步骤可以帮助您解决问题。