|
[Sponsors] |
how to use UDF to obtain the thred of the interface between the liquid and the wall? |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
December 13, 2015, 05:42 |
how to use UDF to obtain the thred of the interface between the liquid and the wall?
|
#1 |
New Member
Qiong-yao Wang
Join Date: Apr 2014
Posts: 18
Rep Power: 12 |
hi, everyone, i'm using FLUENT two-phase flow model to simulate liquid sloshing in circle tank. i want to use UDF to obtain the boundary thread of the interface between the liquid and the wall(the red line in the figure),the interface(red line) will change all the time during sloshing, so it is difficulty for me to obtain the boundary thread of the interface, in fact, i obtained the whole circle wall instead of the interface!
please help me, thanks a lot! (PS:the following is a part of my UDF,which must have some problems.please help me to modify it. thanks.) Domain *subdomain= Get_Domain(3); thread_loop_f(tf1,subdomain) { int zone_ID = THREAD_ID(tf1); if(zone_ID==3) { begin_f_loop(f, tf1) { xv[0]=1; xv[1]=0; yv[0]=0; yv[1]=1; F_AREA (A, f, tf1); F_CENTROID(x,f,tf1); F_X_FORCE+=F_P(f, tf1)*NV_DOT(A,xv); F_Y_FORCE+=F_P(f, tf1)*NV_DOT(A,yv); F_FORCE+=F_P(f, tf1)*NV_MAG(A); Ax=Ax+A[0]; Ay=Ay+A[1]; fprintf(fout55,"%g,%g\n",x[0],x[1]); } end_f_loop(f, tf1) } 55.png |
|
December 15, 2015, 09:07 |
|
#2 | |
Senior Member
Join Date: Nov 2013
Posts: 1,965
Rep Power: 27 |
Quote:
|
||
December 15, 2015, 22:09 |
|
#3 | |
New Member
Qiong-yao Wang
Join Date: Apr 2014
Posts: 18
Rep Power: 12 |
Quote:
Tank you very much for your replying.In fact, I am very anxious these days.Well, for my research,I want to calculating liquid sloshing force exerted on the tank wall(the red line part in the figure),however,my code is in fact calculating the force exerted on the whole circle boudary instead of the red line part.Well, if the air pressure is not high, there is not big differences between the two cases, because the air pressure exerted on the tank can be ignored when compared to the dynamic liquid pressure, but there must be big diferences when under high air pressure condition.So,my problem is that I can not detect wet area(the red line part in the figure). My code is just detecting the whole circle.So, could you help me to detect the wet area!Tank you very much and best wishes! (sorry for my poor english that lead to your misunderstanding,if any question,please tell me. PS:attached the whole code and a more clear figure.tanks again.) sloshing .png # include "udf.h" DEFINE_EXECUTE_AT_END(force) { cell_t c; face_t f; real F_Y_FORCE=0.0; /*lateral force */ real F_Z_FORCE=0.0; /* vertical force */ real F_FORCE=0.0; /* resultant force */ real MOMENT_X=0.0; real x[ND_ND]; real NV_VEC(A); real Ay=0; /*projected area in lateral direction, used for validating the code */ real Az=0; /* projected area in lateral direction , used for validating the code */ real cy,cz; real wcy=0.0; real wcz=0.0; real va_liq=0.0; real z[ND_ND]; FILE *fout; FILE *fout2; FILE *fout3; FILE *fout4; FILE *fout11; FILE *fout22; FILE *fout33;/*Ay*/ FILE *fout44;/*Az*/ FILE *fout55; Thread *t; Thread *tf1; Domain *subdomain= Get_Domain(3); /*get the liquid phase domain*/ fout55 = fopen("COORDINATE.txt", "a"); thread_loop_f(tf1,subdomain) { int zone_ID = THREAD_ID(tf1); /*get the zone_ID of the thread*/ if(zone_ID==3) /* the zone_ID of the wall is 3(I think this is the problem)*/ { begin_f_loop(f, tf1) { F_AREA (A, f, tf1); F_CENTROID(x,f,tf1); F_Y_FORCE+=F_P(f, tf1)*A[0]; /*calculate lateral force*/ F_Z_FORCE+=F_P(f, tf1)*A[1]; /* calculate vertical force */ F_FORCE+=F_P(f, tf1)*NV_MAG(A); /* calculate resultant force */ MOMENT_X+=(-F_P(f,tf1)*NV_DOT(A,yv)*x[0]+F_P(f, tf1)*NV_DOT(A,xv)*(x[1]+1.015));/*pitch moment*/ Ay=Ay+A[0]; /* calculate projected area in lateral direction, used for validating the code: if the code is indeed detecting the wet area, A[0] should not be always zero during liquid sloshing. however, the results I got were the constant zero, which show that my code is in fact detecting the whole circle instead of the wet area, because circle is a symmetric figure, projected area in lateral direction should always be zero. */ Az=Az+A[1]; /* calculate projected area in vertical direction, used for validating the code: if the code is indeed detecting the wet area, A[1] should be always negative value during liquid sloshing. Because the projected area in vertical direction is along outside the normal direction, however, the results I got were the constant zero, which show that my code is in fact detecting the whole circle instead of the wet area, because circle is a symmetric figure, projected area in vertical direction should be always zero. */ fprintf(fout55,"%g,%g\n",x[0],x[1]); /*get the coordinate value of each cell at the wall boundary, x[0], x[1],used for validating the code: if the code is indeed detecting the wet area, I can plot the trajectory of the wet area use the coordinates of the all cells at the wet area. But, in fact, the trajectory I got was always a circle, this further show that this must be something wrong with my code. */ } end_f_loop(f, tf1) } } /*the following code is calculating the center of gravity of the liquid*/ thread_loop_c(t,subdomain) { begin_c_loop(c, t) { if(0<C_VOF(c,t)&&C_VOF(c,t)<=1.0) { va_liq = va_liq + C_VOLUME(c,t); C_CENTROID(z,c,t); wcy = wcy + z[0]*C_VOLUME(c,t); wcz = wcz + z[1]*C_VOLUME(c,t); } } end_c_loop(c, t) } cy=wcy/va_liq; cz=wcz/va_liq; fout = fopen("F_Y_FORCE.txt", "a"); fout2 = fopen("F_Z_FORCE.txt", "a"); fout3 = fopen("F_FORCE.txt", "a"); fout4 = fopen("MOMENT_X.txt", "a"); fout11 = fopen("Y-centroid of liquid.txt", "a"); fout22 = fopen("Z-centroid of liquid.txt", "a"); fout33 = fopen("Area in X.txt", "a"); fout44 = fopen("Area in Y.txt", "a"); fprintf(fout,"%g,%g\n",CURRENT_TIME,F_Y_FORCE); fprintf(fout2,"%g,%g\n",CURRENT_TIME,F_Z_FORCE); fprintf(fout3,"%g,%g\n",CURRENT_TIME,F_FORCE); fprintf(fout4,"%g,%g\n",CURRENT_TIME,MOMENT_X); fprintf(fout11,"%g,%g\n",CURRENT_TIME,cy); fprintf(fout22,"%g,%g\n",CURRENT_TIME,cz); fprintf(fout33,"%g,%g\n",CURRENT_TIME,Ax); fprintf(fout44,"%g,%g\n",CURRENT_TIME,Ay); fclose(fout); fclose(fout2); fclose(fout3); fclose(fout4); fclose(fout11); fclose(fout22); fclose(fout33); fclose(fout44); fclose(fout55); Message("\n F_Y_FORCE = %g\n", F_Y_FORCE); Message("\n F_Z_FORCE = %g\n", F_Z_FORCE); Message("\n F_FORCE = %g\n", F_FORCE); Message("\n MOMENT_X = %g\n", MOMENT_X); Message("\n Y-centroid of liquid = %g\n", cy); Message("\n Z-centroid of liquid = %g\n", cz); } |
||
December 16, 2015, 06:05 |
|
#4 |
Senior Member
Join Date: Nov 2013
Posts: 1,965
Rep Power: 27 |
If I would give you a face on the wall, how would you know if it is part of the 'dry wall' or part of the 'wet wall'?
Knowing the answer to this question is the first step in getting your program fixed. |
|
December 16, 2015, 11:20 |
help:how to use UDF to get the wet area thread in FLUENT software
|
#5 |
New Member
Qiong-yao Wang
Join Date: Apr 2014
Posts: 18
Rep Power: 12 |
Hi, everyone, I'm using FLUENT two-phase flow model to simulate liquid sloshing in circle tank. I want to calculate liquid sloshing force exerted on the tank wall, the force I get is by integration of dynamic liquid pressure exerted on wet area(the red line part in the figure), however, my code is in fact calculating the force by integration of pressure exerted on the whole circle boundary instead of the red line part. Well, if the air pressure is not high, there is not big differences between the two cases, because the air pressure exerted on the tank can be ignored when compared to the dynamic liquid pressure, but there must be big differences when under high air pressure condition. So, my problem is that I can not detect wet area(the red line part in the figure, wet area is changing with time during liquid sloshing). My code is just detecting the whole circle. So, could you help me to detect the wet area! Thank you very much. Best wishes!
sloshing .png # include "udf.h" DEFINE_EXECUTE_AT_END(force) { cell_t c; face_t f; real F_Y_FORCE=0.0; /*lateral force */ real F_Z_FORCE=0.0; /* vertical force */ real F_FORCE=0.0; /* resultant force */ real MOMENT_X=0.0; real x[ND_ND]; real NV_VEC(A); real Ay=0; /*projected area in lateral direction, used for validating the code */ real Az=0; /* projected area in lateral direction , used for validating the code */ real cy,cz; real wcy=0.0; real wcz=0.0; real va_liq=0.0; real z[ND_ND]; FILE *fout; FILE *fout2; FILE *fout3; FILE *fout4; FILE *fout11; FILE *fout22; FILE *fout33;/*Ay*/ FILE *fout44;/*Az*/ FILE *fout55; Thread *t; Thread *tf1; Domain *subdomain= Get_Domain(3); /*get the liquid phase domain*/ fout55 = fopen("COORDINATE.txt", "a"); thread_loop_f(tf1,subdomain) { int zone_ID = THREAD_ID(tf1); /*get the zone_ID of the thread*/ if(zone_ID==3) /* the zone_ID of the wall is 3(I think this is the problem)*/ { begin_f_loop(f, tf1) { F_AREA (A, f, tf1); F_CENTROID(x,f,tf1); F_Y_FORCE+=F_P(f, tf1)*A[0]; /*calculate lateral force*/ F_Z_FORCE+=F_P(f, tf1)*A[1]; /* calculate vertical force */ F_FORCE+=F_P(f, tf1)*NV_MAG(A); /* calculate resultant force */ MOMENT_X+=(-F_P(f,tf1)*NV_DOT(A,yv)*x[0]+F_P(f, tf1)*NV_DOT(A,xv)*(x[1]+1.015));/*pitch moment*/ Ay=Ay+A[0]; /* calculate projected area in lateral direction, used for validating the code: if the code is indeed detecting the wet area, A[0] should not be always zero during liquid sloshing. however, the results I got were the constant zero, which show that my code is in fact detecting the whole circle instead of the wet area, because circle is a symmetric figure, projected area in lateral direction should always be zero. */ Az=Az+A[1]; /* calculate projected area in vertical direction, used for validating the code: if the code is indeed detecting the wet area, A[1] should be always negative value during liquid sloshing. Because the projected area in vertical direction is along outside the normal direction, however, the results I got were the constant zero, which show that my code is in fact detecting the whole circle instead of the wet area, because circle is a symmetric figure, projected area in vertical direction should be always zero. */ fprintf(fout55,"%g,%g\n",x[0],x[1]); /*get the coordinate value of each cell at the wall boundary, x[0], x[1],used for validating the code: if the code is indeed detecting the wet area, I can plot the trajectory of the wet area use the coordinates of the all cells at the wet area. But, in fact, the trajectory I got was always a circle, this further show that this must be something wrong with my code. */ } end_f_loop(f, tf1) } } /*the following code is calculating the center of gravity of the liquid*/ thread_loop_c(t,subdomain) { begin_c_loop(c, t) { if(0<C_VOF(c,t)&&C_VOF(c,t)<=1.0) { va_liq = va_liq + C_VOLUME(c,t); C_CENTROID(z,c,t); wcy = wcy + z[0]*C_VOLUME(c,t); wcz = wcz + z[1]*C_VOLUME(c,t); } } end_c_loop(c, t) } cy=wcy/va_liq; cz=wcz/va_liq; fout = fopen("F_Y_FORCE.txt", "a"); fout2 = fopen("F_Z_FORCE.txt", "a"); fout3 = fopen("F_FORCE.txt", "a"); fout4 = fopen("MOMENT_X.txt", "a"); fout11 = fopen("Y-centroid of liquid.txt", "a"); fout22 = fopen("Z-centroid of liquid.txt", "a"); fout33 = fopen("Area in X.txt", "a"); fout44 = fopen("Area in Y.txt", "a"); fprintf(fout,"%g,%g\n",CURRENT_TIME,F_Y_FORCE); fprintf(fout2,"%g,%g\n",CURRENT_TIME,F_Z_FORCE); fprintf(fout3,"%g,%g\n",CURRENT_TIME,F_FORCE); fprintf(fout4,"%g,%g\n",CURRENT_TIME,MOMENT_X); fprintf(fout11,"%g,%g\n",CURRENT_TIME,cy); fprintf(fout22,"%g,%g\n",CURRENT_TIME,cz); fprintf(fout33,"%g,%g\n",CURRENT_TIME,Ax); fprintf(fout44,"%g,%g\n",CURRENT_TIME,Ay); fclose(fout); fclose(fout2); fclose(fout3); fclose(fout4); fclose(fout11); fclose(fout22); fclose(fout33); fclose(fout44); fclose(fout55); Message("\n F_Y_FORCE = %g\n", F_Y_FORCE); Message("\n F_Z_FORCE = %g\n", F_Z_FORCE); Message("\n F_FORCE = %g\n", F_FORCE); Message("\n MOMENT_X = %g\n", MOMENT_X); Message("\n Y-centroid of liquid = %g\n", cy); Message("\n Z-centroid of liquid = %g\n", cz); } |
|
December 17, 2015, 04:28 |
|
#6 |
Senior Member
Join Date: Nov 2013
Posts: 1,965
Rep Power: 27 |
This is a serious question. You have to tell Fluent what is "wet" and what is "dry", and the first step is to define for yourself what is "wet" and what is "dry".
|
|
December 17, 2015, 09:21 |
|
#7 |
New Member
Syed Aaquib Hazari
Join Date: Apr 2015
Location: Delft
Posts: 16
Rep Power: 11 |
Dear Pakk,
I have the same problem as hellowqy. When you say what is 'wet' and what is 'dry' do you mean initialising; THREAD_SUB_THREAD for each phase? Then the next step would be writing conditional statement where C_VOF would be between 0 & 1? Please let me know. Thanks. |
|
December 17, 2015, 10:18 |
|
#8 | |
Senior Member
Join Date: Nov 2013
Posts: 1,965
Rep Power: 27 |
Quote:
Suppose you are Fluent, and you have a numerical solution of this problem, and the only thing that is missing is the info about if a face is 'wet' or 'dry'. How would you decide if a face is 'wet' or 'dry', assuming you have all other data? Some wrong answers to show the kind of answer I am looking for: - A face is 'dry' if the temperature is above 350 K. - A face is 'dry' if the pressure is above 40000 Pa. These make no sense physically, but from a programming perspective you can define it this way without any problem. Then the next step would be to include an if-statement in the code. In pseudo-code: Code:
Loop over all faces { if (face is dry) { do nothing } else { calculate whatever you want to know } } |
||
December 17, 2015, 11:03 |
|
#9 | |
New Member
Syed Aaquib Hazari
Join Date: Apr 2015
Location: Delft
Posts: 16
Rep Power: 11 |
Quote:
So if I understood you correctly (for a stratified two phase flow) I can tell fluent to make a distinction between 'wet' and 'dry' based on a certain quantity, I will use density. If the density lies in between the primary and the secondary phase then I will modify my source term there. I hope this will work. Thanks once again Pakk! |
||
Tags |
boundary, fluent, interface, udf |
|
|