-
-
July 20, 2018 at 8:29 pm
paoching
SubscriberI'm writing a UDF for galvanic corrosion deformation of Al and Cu block submerged in water.
The process goes like so:
1. the geometry is a 10mm*20mm*5mm electrolyte domain with one face split to 2 10mm square face representing boundary to Al and Cu electrode.
2. material is water-liquid for the entire domain with electric conductivity of 50 S/m.
3. potential boundary conditions are set to galvanic potential of Al and Cu at -0.85 V and -0.3 V respectively
4. using fluent's electric potential model, run steady state simulation
5. contour of Electric Current Magnitude is plotted as follow
6. I would then pass calculated "Electric Current Magnitude" as J to corrosion damage UDF to calculate corrosion rate in transient simulation and hook it to Dynamic mesh zone of Al electrode as mesh motion UDF
My question is how to pass the current density (or Electric Current Magnitude, a post-processing variable under potential) to UDF. I know there are micros that can pass cell or face variable like temperature and pressure to UDF like C_P(c,t) or F_T(f,t), but I can find no such macro for current density. Perhaps the potential model is still relatively new and incomplete? Is there anyway to work around that using UDM or RP variable?
Thanks in advance!
Paul Lee
P.S. attached is the UDF I have so far.
-
September 5, 2018 at 9:31 pm
jmccasli
Ansys EmployeeHi Paul,
The current is calculated from the Ohm's law i = -(electric conductivity) * gradient (electric potential), i.e.
Fluent has macros to access the value of the electric potential in the cell c of the thread ct: C_PHI_1(c,ct). Also the ith component of its gradient is obtained with C_PHI_1_G(c,ct). So you can compute the magnitude from the components and store it in a UDS or UDM as needed.
I hope this helps!
Regards,
Jeremy
-
September 6, 2018 at 10:51 pm
paoching
SubscriberThank you Jeremy, I've tried to implement C_PHI_1_G(c,ct) in my UDF as you suggested but ran into another error. Here is the updated UDF:
/**********************************************************
node motion based on corrosion rate calculated from electric
current density compiled UDF
**********************************************************/
#include "udf.h"
#include "metric.h"
#include "mem.h"
#include "sg_udms.h"
#include "sg.h"
#include "models.h"
#include "dynamesh_tools.h"
DEFINE_GRID_MOTION(corrosion_rate,domain,dt,time,dtime)
{
Thread *tf = DT_THREAD(dt);
face_t f;
cell_t c;
Node *v;
real y;
int n;
real F=96485.34; //Faraday's constant C/mol or A*s/mol
real MWT=26.981539; //molecular weight
int z=3; //al ion charge#
real RHO=2700000; //Al density g/m^3
real sigma=5;
real k=(-sigma*MWT/(z*F*RHO));
thread_loop_c (tf,domain)
{
begin_c_loop (c,tf)
{
C_UDMI(c,tf,0) = k*C_PHI_1_G(c,tf)[1];
}
end_c_loop (c,tf)
}
/* set deforming flag on adjacent cell zone */
SET_DEFORMING_THREAD_FLAG(THREAD_T0(tf));
Message ("time = %f, Cr = %fn", time);
begin_f_loop(f,tf)
{
f_node_loop(f,tf,n)
{
v = F_NODE(f,tf,n);
if (NODE_POS_NEED_UPDATE (v))
{
/* indicate that node position has been update
so that it's not updated more than once */
NODE_POS_UPDATED(v);
NODE_Y(v) -= C_UDMI(c,tf,0)*dtime; //new y position
}
}
}
end_f_loop(f,tf);
}
Although I can compile and load it, I got segmentation fault error after hooking it to dynamic mesh when previewing dynamic mesh and when solving transient case. Naturally, static case runs fine if UDF is not used.
Error: received a fatal signal (Segmentation fault).
Error Object: #f
Thoughts? a google search tell me that segmentation fault is the result of trying to access a variable that is not saved. But is it referring to the UDM or the C_PHI_G? I have made sure to enable UDM in fluent, so what could be causing this error?
-
September 7, 2018 at 5:20 am
DrAmine
Ansys EmployeeYou can only access the gradient of quantity if you are are in the DEFINE Macro eligible for that: Example Temperature gradient can be accessed directly if you have to define a Source for the energy equation. For all other scenarios like you have, there is an official and supported way (some other ways are possible) will be via /solve/set> expert and then choose to Keep temporary solver memory from being freed? [yes]. That should work for almost all gradients.
-
September 11, 2018 at 1:54 am
paoching
Subscriber
You can only access the gradient of quantity if you are are in the DEFINE Macro eligible for that: Example Temperature gradient can be accessed directly if you have to define a Source for the energy equation.
Do you mean that C_PHI_1_G(c,tf) isn't eligible in DEFINE_GRID_MOTION? if that is so, what variable is eligible? and what DEFINE macro can access potential gradient? is there a list somewhere? note that my thread_loop_c that house the C_PHI_1_G(c,tf) is inside the DEFINE_GRID_MOTION macro.
For all other scenarios like you have, there is an official and supported way (some other ways are possible) will be via /solve/set> expert and then choose to Keep temporary solver memory from being freed? [yes]. That should work for almost all gradients.
good tips on setting to keep solver memory, I've done so without changing my UDF and get the following error when previewing zone motion:
Updating mesh to time 1.00000e-01 (step = 00001)...
Info: Maximum Cell Skewness outside reasonable limits, using 0.95 instead.
Info: Maximum Cell Skewness outside reasonable limits, using 0.95 instead.
==============================================================================
Node 999999: Process 15004: Received signal SIGSEGV.
==============================================================================
==============================================================================
Node 1: Process 6236: Received signal SIGSEGV.
==============================================================================
MPI Application rank 0 exited before MPI_Finalize() with status -1073741819
The fl process could not be started.
Also, I could not run transient calculation as is, nothing happen when I press the calculate button. no error message is produced. A floating dialog box appear for a fraction of a second letting me know that I did press the calculate button, but nothing happens. My guess is that whatever error in dynamic mesh is preventing the solver to start properly.
-
September 13, 2018 at 6:47 pm
Konstantine Kourbatski
Ansys EmployeeYour code is wrong, dt is the dynamic zone thread, which is a face in you case, and using it in begin_c_loop will result is SIGSEGV. You also cannot NODE_Y(v) -= C_UDMI(c,tf,0)*dtime; as C_UDMI is a cell value not available on the face. Instead, you need to retrieve the gradient value from the cell center of the adjacent cell. Macros for this are described in the UDF manual
-
September 14, 2018 at 12:05 am
paoching
SubscriberThank you, I will attempt to fix the code as you suggested!
-
- You must be logged in to reply to this topic.

Earth Rescue – An Ansys Online Series
The climate crisis is here. But so is the human ingenuity to fight it. Earth Rescue reveals what visionary companies are doing today to engineer radical new ideas in the fight against climate change. Click here to watch the first episode.

Ansys Blog
Subscribe to the Ansys Blog to get great new content about the power of simulation delivered right to your email on a weekly basis. With content from Ansys experts, partners and customers you will learn about product development advances, thought leadership and trends and tips to better use Ansys tools. Sign up here.
- Suppress Fluent to open with GUI while performing in journal file
- Floating point exception in Fluent
- What are the differences between CFX and Fluent?
- Heat transfer coefficient
- Getting graph and tabular data from result in workbench mechanical
- The solver failed with a non-zero exit code of : 2
- Difference between K-epsilon and K-omega Turbulence Model
- Time Step Size and Courant Number
- Mesh Interfaces in ANSYS FLUENT
- error in cfd post
-
2684
-
2124
-
1349
-
1136
-
461
© 2023 Copyright ANSYS, Inc. All rights reserved.