level 1
lt520131444
楼主
大家好!
最近在做二维两自由度圆柱的涡激振动。应该是需要UDF和动网格实现,目前UDF已经编写好。网格及详细UDF见下:中间正方形部分为三角形非结构网格及边界层网格,也就是动网格区域,命名为dong;周围为静止网格,结构化的;圆柱命名为yuan。UDF:
/*头文件*/
#include<stdio.h>
#include"udf.h"
#include"dynamesh_tools.h"
#include"math.h"
#define UDF_FILENAME "udf_loc_vel_acc"
#define Temp_File "mytemp"
/* read current location,velocity and accelerator from file */
static void
read_loc_vel_acc_file (real *loc1, real *vel1,real *acc1, real *loc2, real *vel2, real *acc2)
{
FILE *fp = fopen(Temp_File, "r");
if (fp != NULL)
{
float read_loc1, read_vel1, read_acc1, read_loc2, read_vel2, read_acc2;
fscanf (fp, "%e %e %e %e %e %e", &read_loc1, &read_vel1, &read_acc1, &read_loc2, &read_vel2, &read_acc2);
fclose (fp);
*loc1 = (real) read_loc1;
*vel1 = (real) read_vel1;
*acc1 = (real) read_acc1;
*loc2 = (real) read_loc2;
*vel2 = (real) read_vel2;
*acc2 = (real) read_acc2;
Message ("\nUDF read viv: y_vel = %f, acc = %f, loc(m)= %f\n, x_vel = %f, acc = %f, loc(m)= %f\n", *vel1, *acc1, *loc1, *vel2, *acc2, *loc2);
}
else
{
*loc1 = 0.0;
*vel1 = 0.0;
*acc1 = 0.0;
*loc2 = 0.0;
*vel2 = 0.0;
*acc2 = 0.0;
Message("\nThe first reading of udf_loc_vel_acc_file\n");
}
}
/* write current location, velocity and acceleration into file */
static void
write_loc_vel_acc_file (real loc, real vel, real acc, real loc0, real vel0, real acc0)
{
FILE *fp = fopen(UDF_FILENAME, "a");
if (fp != NULL)
{
fprintf (fp, "%e %e %e %e %e %e\n", loc, vel, acc, loc0, vel0, acc0);
fclose (fp);
}
else
Message ("\nWarning: cannot write %s file", UDF_FILENAME);
}
/* write current location,velocity and acceleration into temp_file */
static void
write_loc_vel_acc_file2 (real loc, real vel, real acc, real loc0, real vel0, real acc0)
{
FILE *fp = fopen(Temp_File, "w");
if (fp != NULL)
{
fprintf (fp, "%e %e %e %e %e %e\n", loc, vel, acc, loc0, vel0, acc0);
fclose (fp);
}
else
Message ("\nWarning: cannot write %s file", Temp_File);
}
DEFINE_CG_MOTION(yuan,dt,cg_vel,cg_omega,time,dtime)/*见帮助文档,名称,速度,角速度,时间,步长*/
{
#define DELTA 0.5
#define BETA 0.25
#define K_SPRING 1200
#define MASS 337.5
#define xi 0.003
FILE *fp3,*fp4;
real wn=sqrt(K_SPRING/MASS);
real CC=2*xi*wn*MASS;
/*fn=2.92745*/
/*mass ratio equaul 2.4*/
real loc0,vel0,acc0,loc2,vel2,acc2;/*顺向*/
real loc,vel,acc,loc1,vel1,acc1;/*横向*/
real a0,a1,a2,a3,a4,a5,a6,a7,keff,reffh,reffs;
static int id1=4; /* Face ID of the cylinder */
static real f_glob[3]; /* Total forces (global) */
static real m_glob[3]; /* Moment (global) */
static real x_cg[3]; /* CG location */
static real force[3];
int i=0;
Thread *tf1;
Domain *domain = Get_Domain(1);
tf1 = Lookup_Thread(domain, id1);
a0=1/(BETA*dtime*dtime);
a1=DELTA/(BETA*dtime);
a2=1/(BETA*dtime);
a3=0.5/BETA-1;
a4=DELTA/BETA-1;
a5=0.5*dtime*(DELTA/BETA-2);
a6=dtime*(1-DELTA);
a7=DELTA*dtime;
keff=a0*MASS+a1*CC+K_SPRING;/*有效刚度*/
/* reset velocities */
NV_S (cg_vel, =, 0.0);/*重置速度*/
NV_S (cg_omega, =, 0.0);/*重置角速度*/
if (!Data_Valid_P ())
return;
/* Get CG position */
for (i=0; i<ND_ND; i++)
{
x_cg[i] = DT_CG(dt)[i];
}
/* compute force on cylinder */
force[i] = 0.0;
Compute_Force_And_Moment(domain, tf1, x_cg, f_glob, m_glob, TRUE);
for (i=0; i<ND_ND; i++)
{
force[i] = f_glob[i];
}
/*read data calculated in the former step*/
read_loc_vel_acc_file (&loc1, &vel1, &acc1, &loc2, &vel2, &acc2);
/* compute response of cylinder by newmark method*/
reffs=force[0]+MASS*(a0*loc2+a2*vel2+a3*acc2)+CC*(a1*loc2+a4*vel2+a5*acc2);
loc0=reffs/keff;
acc0=a0*(loc0-loc2)-a2*vel2-a3*acc2;
vel0=vel2+a6*acc2+a7*acc0;
x_cg[0]=x_cg[0]+vel0*dtime;
cg_vel[0]=vel0;
reffh=force[1]+MASS*(a0*loc1+a2*vel1+a3*acc1)+CC*(a1*loc1+a4*vel1+a5*acc1);
loc=reffh/keff;
acc=a0*(loc-loc1)-a2*vel1-a3*acc1;
vel=vel1+a6*acc1+a7*acc;
x_cg[1]=x_cg[1]+vel*dtime;
cg_vel[1]=vel;
Message ("\nUDF of yuan: time = %f, y_vel = %f, acc = %f, loc(m)= %f\n", time, vel, acc, loc);
write_loc_vel_acc_file (loc, vel, acc, loc0, vel0, acc0);
write_loc_vel_acc_file2 (loc, vel, acc, loc0, vel0, acc0);
fp3=fopen("sjieguo.txt","a+");
fprintf(fp3,"%f %e\n",time,x_cg[0]);/*输出时间位移值到txt文本中*/
fclose(fp3);
fp4=fopen("hjieguo.txt","a+");
fprintf(fp4,"%f %e\n",time,x_cg[1]);/*输出时间位移值到txt文本中*/
fclose(fp4);
}
设置动网格时第一个CG_MOTION连接给yuan,第二个连接到dong。但是计算时出现错误:received a fatal signal (Segmentation fault). 目前很困惑,不知道问题出现在哪。求大神帮忙看看解决一下。



2019年04月04日 06点04分
1
最近在做二维两自由度圆柱的涡激振动。应该是需要UDF和动网格实现,目前UDF已经编写好。网格及详细UDF见下:中间正方形部分为三角形非结构网格及边界层网格,也就是动网格区域,命名为dong;周围为静止网格,结构化的;圆柱命名为yuan。UDF:
/*头文件*/
#include<stdio.h>
#include"udf.h"
#include"dynamesh_tools.h"
#include"math.h"
#define UDF_FILENAME "udf_loc_vel_acc"
#define Temp_File "mytemp"
/* read current location,velocity and accelerator from file */
static void
read_loc_vel_acc_file (real *loc1, real *vel1,real *acc1, real *loc2, real *vel2, real *acc2)
{
FILE *fp = fopen(Temp_File, "r");
if (fp != NULL)
{
float read_loc1, read_vel1, read_acc1, read_loc2, read_vel2, read_acc2;
fscanf (fp, "%e %e %e %e %e %e", &read_loc1, &read_vel1, &read_acc1, &read_loc2, &read_vel2, &read_acc2);
fclose (fp);
*loc1 = (real) read_loc1;
*vel1 = (real) read_vel1;
*acc1 = (real) read_acc1;
*loc2 = (real) read_loc2;
*vel2 = (real) read_vel2;
*acc2 = (real) read_acc2;
Message ("\nUDF read viv: y_vel = %f, acc = %f, loc(m)= %f\n, x_vel = %f, acc = %f, loc(m)= %f\n", *vel1, *acc1, *loc1, *vel2, *acc2, *loc2);
}
else
{
*loc1 = 0.0;
*vel1 = 0.0;
*acc1 = 0.0;
*loc2 = 0.0;
*vel2 = 0.0;
*acc2 = 0.0;
Message("\nThe first reading of udf_loc_vel_acc_file\n");
}
}
/* write current location, velocity and acceleration into file */
static void
write_loc_vel_acc_file (real loc, real vel, real acc, real loc0, real vel0, real acc0)
{
FILE *fp = fopen(UDF_FILENAME, "a");
if (fp != NULL)
{
fprintf (fp, "%e %e %e %e %e %e\n", loc, vel, acc, loc0, vel0, acc0);
fclose (fp);
}
else
Message ("\nWarning: cannot write %s file", UDF_FILENAME);
}
/* write current location,velocity and acceleration into temp_file */
static void
write_loc_vel_acc_file2 (real loc, real vel, real acc, real loc0, real vel0, real acc0)
{
FILE *fp = fopen(Temp_File, "w");
if (fp != NULL)
{
fprintf (fp, "%e %e %e %e %e %e\n", loc, vel, acc, loc0, vel0, acc0);
fclose (fp);
}
else
Message ("\nWarning: cannot write %s file", Temp_File);
}
DEFINE_CG_MOTION(yuan,dt,cg_vel,cg_omega,time,dtime)/*见帮助文档,名称,速度,角速度,时间,步长*/
{
#define DELTA 0.5
#define BETA 0.25
#define K_SPRING 1200
#define MASS 337.5
#define xi 0.003
FILE *fp3,*fp4;
real wn=sqrt(K_SPRING/MASS);
real CC=2*xi*wn*MASS;
/*fn=2.92745*/
/*mass ratio equaul 2.4*/
real loc0,vel0,acc0,loc2,vel2,acc2;/*顺向*/
real loc,vel,acc,loc1,vel1,acc1;/*横向*/
real a0,a1,a2,a3,a4,a5,a6,a7,keff,reffh,reffs;
static int id1=4; /* Face ID of the cylinder */
static real f_glob[3]; /* Total forces (global) */
static real m_glob[3]; /* Moment (global) */
static real x_cg[3]; /* CG location */
static real force[3];
int i=0;
Thread *tf1;
Domain *domain = Get_Domain(1);
tf1 = Lookup_Thread(domain, id1);
a0=1/(BETA*dtime*dtime);
a1=DELTA/(BETA*dtime);
a2=1/(BETA*dtime);
a3=0.5/BETA-1;
a4=DELTA/BETA-1;
a5=0.5*dtime*(DELTA/BETA-2);
a6=dtime*(1-DELTA);
a7=DELTA*dtime;
keff=a0*MASS+a1*CC+K_SPRING;/*有效刚度*/
/* reset velocities */
NV_S (cg_vel, =, 0.0);/*重置速度*/
NV_S (cg_omega, =, 0.0);/*重置角速度*/
if (!Data_Valid_P ())
return;
/* Get CG position */
for (i=0; i<ND_ND; i++)
{
x_cg[i] = DT_CG(dt)[i];
}
/* compute force on cylinder */
force[i] = 0.0;
Compute_Force_And_Moment(domain, tf1, x_cg, f_glob, m_glob, TRUE);
for (i=0; i<ND_ND; i++)
{
force[i] = f_glob[i];
}
/*read data calculated in the former step*/
read_loc_vel_acc_file (&loc1, &vel1, &acc1, &loc2, &vel2, &acc2);
/* compute response of cylinder by newmark method*/
reffs=force[0]+MASS*(a0*loc2+a2*vel2+a3*acc2)+CC*(a1*loc2+a4*vel2+a5*acc2);
loc0=reffs/keff;
acc0=a0*(loc0-loc2)-a2*vel2-a3*acc2;
vel0=vel2+a6*acc2+a7*acc0;
x_cg[0]=x_cg[0]+vel0*dtime;
cg_vel[0]=vel0;
reffh=force[1]+MASS*(a0*loc1+a2*vel1+a3*acc1)+CC*(a1*loc1+a4*vel1+a5*acc1);
loc=reffh/keff;
acc=a0*(loc-loc1)-a2*vel1-a3*acc1;
vel=vel1+a6*acc1+a7*acc;
x_cg[1]=x_cg[1]+vel*dtime;
cg_vel[1]=vel;
Message ("\nUDF of yuan: time = %f, y_vel = %f, acc = %f, loc(m)= %f\n", time, vel, acc, loc);
write_loc_vel_acc_file (loc, vel, acc, loc0, vel0, acc0);
write_loc_vel_acc_file2 (loc, vel, acc, loc0, vel0, acc0);
fp3=fopen("sjieguo.txt","a+");
fprintf(fp3,"%f %e\n",time,x_cg[0]);/*输出时间位移值到txt文本中*/
fclose(fp3);
fp4=fopen("hjieguo.txt","a+");
fprintf(fp4,"%f %e\n",time,x_cg[1]);/*输出时间位移值到txt文本中*/
fclose(fp4);
}
设置动网格时第一个CG_MOTION连接给yuan,第二个连接到dong。但是计算时出现错误:received a fatal signal (Segmentation fault). 目前很困惑,不知道问题出现在哪。求大神帮忙看看解决一下。


