|
[Sponsors] |
![]() |
![]() |
#1 |
New Member
Mat
Join Date: Jan 2017
Posts: 23
Rep Power: 9 ![]() |
Hai
I am currently experiencing a very strange problem. I would be very thankful if some could help me. I am dealing with a simple concetric cylinder problem with simple udf. Geometry consists of three cylindrical bodies: 1.inner cylinder with velocity in and pressure out condition 2.solid middle cylinder 3.outer cylinder with pressure inlet condition. During modelling, I have made these 3 bodies into a multibody part by using 'form single body' option. currently, I am getting a segmentation error ( i believe the issue is related to accessing the cell pressure value). the UDF works fine when I access temperature macro instead of pressure. Moreover this same udf works with other 2d goemetries. preesue=5bar and a value of udmi_0=0.01 is patched after intialization. #include "udf.h" DEFINE_EXECUTE_AT_END(source_calculation) { Domain *d=Get_Domain(1); int zone_id=9; Thread *t = Lookup_Thread(d,zone_id); cell_t c; real dt=CURRENT_TIMESTEP; thread_loop_c(t,d) { begin_c_loop(c,t) { C_UDMI(c,t,1)=pow(10,5); if (((C_P(c,t)>C_UDMI(c,t,1))) && (C_UDMI(c,t,0)<0.99)) { C_UDMI(c,t,2)=0.001; } else { C_UDMI(c,t,2)=10; } C_UDMI(c,t,0)=C_UDMI(c,t,0)+(C_UDMI(c,t,2)*dt); } end_c_loop(c,t) } } Intersingly,this udf works well when multibody option is disabled.But i have to use multibody option to mesh my complex geomtry |
|
![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Join Date: Sep 2017
Posts: 246
Rep Power: 11 ![]() |
Hi Mataus,
One issue is that pressure is not stored in solid zones (because it has no meaning there). So C_P(c,t) causes a segmentation error there -- not really so strange. So, inside the "thread_loop_c(t,d)", you should really check which thread you have reached. In this instance, you could check "if(SOLID_THREAD_P(t))". A better, more general test is Code:
if(NULLP( THREAD_STORAGE(t, SV_P) )) { continue; /* or some other way to not use the thread */ } For vector quantities, you might find that you need something different: Code:
if(NULLP( T_STORAGE_R_NV(t, SV_T_G) )) { continue; /* or some other way to not use the gradient */ } Ed |
|
![]() |
![]() |
![]() |
![]() |
#3 |
New Member
Mat
Join Date: Jan 2017
Posts: 23
Rep Power: 9 ![]() |
Dear Ed,
thanks for your valuable comments. you are correct .the segmentation error is happening because of accessing pressure value in the solid region. But here the problem bit different. when I apply UDF in a particular id zone(outer cylinder region) it automatically applies to inner and middle cylinders. (it could be because of the multibody part option enabled.) then I have changed UDF slightly by adding "if (NNULLP( THREAD_STORAGE(t, SV_P)))" I think now it prevents accessing the pressure value from the solid region, and the UDF runs without segmentation error. but still, the UDF applies to both inner outer fluid domain. the volume monitors of UDMI 0,2 on both inner and outer regions are given below. the updated udf #include "udf.h" DEFINE_EXECUTE_AT_END(source_calculation) { Domain *d=Get_Domain(1); int zone_id=11; Thread *t = Lookup_Thread(d,zone_id); cell_t c; real dt=CURRENT_TIMESTEP; thread_loop_c(t,d) { begin_c_loop(c,t) { C_UDMI(c,t,1)=pow(10,5); if(NNULLP( THREAD_STORAGE(t, SV_P))) { if (C_P(c,t)>C_UDMI(c,t,1)) { C_UDMI(c,t,2)=1; } else { C_UDMI(c,t,2)=100; } C_UDMI(c,t,0)=C_UDMI(c,t,0)+(C_UDMI(c,t,2)*dt); } end_c_loop(c,t) } } } |
|
![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Join Date: Sep 2017
Posts: 246
Rep Power: 11 ![]() |
Hi Mataus,
An important point: in your latest code, you need end_c_loop to go after its associated curly-bracket, not before. Some efficiency points: the test on the thread applies to the whole thread, so it is better to do it once, outside the cell loop, rather than for every cell. Also, "pow(10,5)" is a slow way to get "1.e5". (You mentioned 5 bar in your original post -- but this is 1 bar. Also, whenever you think about pressure, you should stop and think about whether you mean absolute or gauge pressure, and whether you need to pay attention to the operating pressure in the model setup. Fluent stores (and supplies in C_P) pressure values relative to this operating pressure.) The command "thread_loop_c(t,d)" is a loop over all cell threads: each visit gets a new value in t. So, the first visit overwrites the value you got from "Lookup_Thread". I have not tried to interpret your images or work out all the details of your code, but I suspect that the code is doing what it has been told to do. Good luck! Ed |
|
![]() |
![]() |
![]() |
Tags |
segmentation fault, udf code |
|
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Pressure Inlet VS velocity Inlet difference | Mohsin | FLUENT | 9 | January 4, 2021 10:34 |
interFoam (HELYX-OS) pressure boundary conditions | SFr | OpenFOAM Running, Solving & CFD | 8 | June 23, 2016 16:36 |
Pressure Outlet Guage pressure | Mohsin | FLUENT | 36 | April 29, 2016 17:16 |
Calculation of the Governing Equations | Mihail | CFX | 7 | September 7, 2014 06:27 |
UDF Data Access Macro | Woo Meng Wai | FLUENT | 0 | November 6, 2007 20:23 |