-
-
March 1, 2024 at 8:46 amvikram chahalSubscriberi am doing coupled simulation of vehicle and fluid tank. In which i am trying to interact the vehicle bouncing and pitching motion to fluid tank and vice versa in fluent using udf. but during the interpretion of UDF i am getting parse error. can you suggest where changes are required. below is the udf:#include "udf.h"#include "thread.h" // Include the thread header fileDEFINE_EXECUTE_AT_END(coupled_simulation){real simulation_time = 0.0;real dt = 0.5; // Time step sizereal end_time = 4.0; // End time of simulationDefine vehicle parametersreal m_truck = 2000.0; // Mass of the truck (kg)real I_truck = 5000.0; // Moment of inertia of the truck (kg*m^2)real k1 = 2.86e10; // Front spring stiffness (N/m)real k2 = 3.870e5; // Rear spring stiffness (N/m)real l1 = 0.2; // Distance of front axle from CG (m)real l2 = 0.8; // Distance of rear axle from CG (m)real F_braking = -10000.0; // Braking force (N)// Define fluid parametersreal fluid_density = 1000.0; // Density of the fluid (kg/m^3)real fluid_velocity_x = 0.0; // Initial fluid velocity in x-direction (m/s)real fluid_velocity_y = 0.0; // Initial fluid velocity in y-direction (m/s)real fluid_velocity_z = 0.0; // Initial fluid velocity in z-direction (m/s)// Initial conditions for vehicle motionreal x = 0.0; // Initial vertical displacementreal theta = 0.0; // Initial angular displacementreal x_dot = 0.0; // Initial vertical velocityreal theta_dot = 0.0; // Initial angular velocity// Main simulation loopwhile (simulation_time < end_time){// Step 1: Calculate vehicle response to braking forcereal x_ddot = (-k1 * (x - l1 * theta) - k2 * (x + l2 * theta) + F_braking) / m_truck;real theta_ddot = (-k1 * l1 * (x - l1 * theta) + k2 * l2 * (x + l2 * theta)) / I_truck;x_dot += x_ddot * dt;theta_dot += theta_ddot * dt;x += x_dot * dt;theta += theta_dot * dt;real simulation_time = CURRENT_TIME + dt;// Step 2: Apply vehicle response to fluid tank and compute fluid forces and momentsreal fluid_force_x = 10.0;real fluid_force_y = 0.0;real fluid_force_z = 0.0;real fluid_moment_x = 0.0;real fluid_moment_y = 5.0;real fluid_moment_z = 0.0;Thread *t;face_t f;cell_t c;/* Loop over all cells */begin_c_loop(c, t){/* Loop over all faces of the cell */real A[ND_ND], F[ND_ND];real p = C_P(c, t); // Pressure of the cellC_CENTROID(A, c, t); // Centroid of the cellint i;for (i = 0; i < ND_ND; i++){F[i] = 0.0; // Initialize force vector}/* Loop over all faces of the cell */for (i = 0; i < THREAD_NFACES(t); i++){f = C_FACE(c, t, i);F_AREA(A, f, t); // Face area vector/* Calculate face force */int j;for (j = 0; j < ND_ND; j++){F[j] += p * F_AREA(A, f, t)[j]; // Pressure force on face}}/* Accumulate forces and moments */fluid_force_x += F[0];fluid_force_y += F[1];fluid_force_z += F[2];fluid_moment_x += (A[1] * F[2] - A[2] * F[1]);fluid_moment_y += (A[2] * F[0] - A[0] * F[2]);fluid_moment_z += (A[0] * F[1] - A[1] * F[0]);}end_c_loop(c, t)// Step 3: Update vehicle motion based on fluid forces and momentsExcitation force = fluid forcex_dot += fluid_force_x / m_truck * dt;theta_dot += fluid_moment_y / I_truck * dt;x += x_dot * dt;theta += theta_dot * dt;simulation_time +=dt;// Step 5: Output results if needed// printf("Time: %.2f, x: %.4f, theta: %.4f\n", simulation_time, x, theta);// Step 6: Check termination conditionif (simulation_time >= end_time)break;}}
-
March 1, 2024 at 9:53 amRobForum Moderator
Compile the code, not all functions are available in the Interpreted mode. I won't be debugging code, but if you give some clues where the error is I can have a brief look.
-
March 4, 2024 at 8:04 amvikram chahalSubscribereal fluid_force_x = 10.0;real fluid_force_y = 0.0;real fluid_force_z = 0.0;real fluid_moment_x = 0.0;real fluid_moment_y = 5.0;real fluid_moment_z = 0.0;Thread *t;face_t f;cell_t c;/* Loop over all cells */begin_c_loop(c, t){showing error in step 2 of this code line 44,45,46,47,48,49, 51,52,53 for real fluid force and moments in x,y,z direction showing parse error and line 56 showinfg t as undeclared variable.
-
-
March 4, 2024 at 8:00 amvikram chahalSubscriberreal fluid_force_x = 10.0;real fluid_force_y = 0.0;real fluid_force_z = 0.0;real fluid_moment_x = 0.0;real fluid_moment_y = 5.0;real fluid_moment_z = 0.0;Thread *t;face_t f;cell_t c;/* Loop over all cells */begin_c_loop(c, t){showing error in step 2 for real fluid force and moments in x,y,z direction showing parse error and showinfg t as undeclared variable.
-
March 4, 2024 at 10:03 amRobForum Moderator
OK, a parse error may be syntax related, so look in the few lines above the one reported in the error. But, if t (thread in your case?) is showing an error, where is that defined? DEFINE_EXECUTE_AT_END doesn't pass the thread so you need to tell the solver what it is.
-
March 26, 2024 at 8:15 amvikram chahalSubscriber#include "udf.h"#include
// Include the standard I/O library for file operations DEFINE_ADJUST(coupled_simulation1, d){real simulation_time = CURRENT_TIME; // Get the current simulation timereal dt = RP_Get_Real("flow-time-step"); // Get the flow time stepreal end_time = RP_Get_Real("flow-time-end"); // End time of simulationreal braking_duration = 2.0; // Duration of braking force (seconds)// Open file for writingFILE *fp;fp = fopen("E:\coupled trial 3\50 prcnt_files\dp0\FFF\Fluent\libudf6\result\simulation_results.txt", "w");if (fp == NULL) // Check if file was opened successfully{Message("Error opening file.\n");return -1; // Exit initialization function}Domain *domain = Get_Domain(3); // Replace 1 with the appropriate domain IDif (!domain){Message("Error: Unable to obtain domain.\n");fclose(fp); // Close the file before returningreturn -1; // Exit initialization function}// Define vehicle parametersreal m_truck = 5450.0; // Mass of the truck (kg)real I_truck = 5000.0; // Moment of inertia of the truck (kg*m^2)real k1 = 2.86e10; // Front spring stiffness (N/m)real k2 = 3.870e5; // Rear spring stiffness (N/m)real l1 = 0.2; // Distance of front axle from CG (m)real l2 = 0.8; // Distance of rear axle from CG (m)real F_braking = 27000.0; // Braking force (N)// Define fluid parametersreal fluid_density = 1000.0; // Density of the fluid (kg/m^3)// Initial conditions for vehicle motionreal x = 2.0; // Initial vertical displacementreal theta = 2.0; // Initial angular displacementreal x_dot = 0.0; // Initial vertical velocityreal theta_dot = 0.0; // Initial angular velocityreal fluid_force_x, fluid_force_y, fluid_force_z, fluid_moment_x, fluid_moment_y, fluid_moment_z;Thread *t;cell_t c;face_t f;// Main simulation loopwhile (simulation_time < end_time){// Step 1: Calculate vehicle response to braking forcereal F_brake = (simulation_time < braking_duration) ? F_braking : 0.0; // Apply braking force only within the braking durationreal x_ddot = (-k1 * (x - l1 * theta) - k2 * (x + l2 * theta) + F_braking) / m_truck;real theta_ddot = (-k1 * l1 * (x - l1 * theta) + k2 * l2 * (x + l2 * theta)) / I_truck;// Step 2: Apply vehicle response in terms of x(t) and theta(t) to fluid domain as a body force in the source termreal vehicle_force_x = 0.0; // Body force in x-directionreal vehicle_force_y = 0.0; // Body force in y-directionreal vehicle_force_z = 0.0; // Body force in z-directionreal vehicle_moment_x = 0.0; // vehicle moment in x-directionreal vehicle_moment_y = 0.0; // vehicle moment in y-directionreal vehicle_moment_z = 0.0; // vehicle moment in z-direction// Update the body force components based on vehicle response// For simplicity, assuming all the force acts in the z-directionvehicle_force_y = -m_truck * x_ddot;vehicle_moment_z = -k1 * l1 * (x - l1 * theta) + k2 * l2 * (x + l2 * theta);// Apply the body force to the fluid domaint = Lookup_Thread(domain, 3); // Assuming FLUID_THREAD_ID is the ID of the fluid threadthread_loop_c(t, d){C_UDMI(c, t, 0) = vehicle_force_x;C_UDMI(c, t, 1) = vehicle_force_y;C_UDMI(c, t, 2) = vehicle_force_z;// Apply the moment components based on vehicle response// Here, we'll assume all the moments act around the z-axisC_UDMI(c, t, 3) = 0.0; // Moment about x-axisC_UDMI(c, t, 4) = 0.0; // Moment about y-axisC_UDMI(c, t, 5) = vehicle_moment_z; // Moment about z-axis}// Step 3: Calculate fluid forces and momentsfluid_force_x = 0.0;fluid_force_y = 0.0;fluid_force_z = 0.0;fluid_moment_x = 0.0;fluid_moment_y = 0.0;fluid_moment_z = 0.0;// Loop over fluid cellsthread_loop_c(t, d){begin_c_loop(c, t){real A[ND_ND], F[ND_ND], F_area[ND_ND]; // Add F_area vector to store face areareal p = C_P(c, t); // Pressure of the cellC_CENTROID(A, c, t); // Centroid of the cellfor (int i = 0; i < ND_ND; i++){F[i] = 0.0; // Initialize force vector}// Loop over faces of the cell using C_FACE macrofor (int f = 0; f < C_NFACES(c, t); f++){face_t face = C_FACE(c, t, f);F_AREA(F_area, face, t); // Face area vector// Calculate face forcefor (int j = 0; j < ND_ND; j++){F[j] += p * F_area[j]; // Use F_area instead of calling F_AREA macro multiple times}}// Accumulate forces and momentsfluid_force_x += F[0];fluid_force_y += F[1];fluid_force_z += F[2];fluid_moment_x += (A[1] * F[2] - A[2] * F[1]);fluid_moment_y += (A[2] * F[0] - A[0] * F[2]);fluid_moment_z += (A[0] * F[1] - A[1] * F[0]);}end_c_loop(c, t);}// Step 4: Update vehicle response based on fluid forces and moments as excitation force on vehicle equationsx_dot += fluid_force_y / m_truck * dt;theta_dot += fluid_moment_z / I_truck * dt;x += x_dot * dt;theta += theta_dot * dt;// Update simulation results in the filefprintf(fp, "%.4f, %.4f\n", x, theta);printf("Time: %.2f, x: %.4f, theta: %.4f\n", simulation_time, x, theta);// Increment simulation timesimulation_time += dt;}// Close the file after simulationfclose(fp);return 0; // Successful initialization}now this code is getting compiled and hooking, but during simulation i am getting very low value of force in order of 0.4 N. i have doubt regarding macro i have used. could you please suggest me use of define_adjust macro is suitable for this coupled simulation or not?? -
March 26, 2024 at 11:39 amRobForum Moderator
How are you adding the force to the fluid cells?
-
March 27, 2024 at 4:12 amvikram chahalSubscriber
IN THIS WAY , PLEASE SUGGEST IF ANY CHANGES ARE REQUIRED
// Apply the body force to the fluid domaint = Lookup_Thread(domain, 3); // Assuming FLUID_THREAD_ID is the ID of the fluid threadthread_loop_c(t, d){C_UDMI(c, t, 0) = vehicle_force_x;C_UDMI(c, t, 1) = vehicle_force_y;C_UDMI(c, t, 2) = vehicle_force_z;// Apply the moment components based on vehicle response// Here, we'll assume all the moments act around the z-axisC_UDMI(c, t, 3) = 0.0; // Moment about x-axisC_UDMI(c, t, 4) = 0.0; // Moment about y-axisC_UDMI(c, t, 5) = vehicle_moment_z; // Moment about z-axis} -
April 2, 2024 at 12:34 pmRobForum Moderator
That adds the values to a UDM, it doesn't do anything to the solution.
-
April 4, 2024 at 6:55 amvikram chahalSubscriber
Thanks a lot Rob...
could you please tell how can i apply moment to a tank about z-axis that pass throug CG in ansys fluent.
-
-
April 4, 2024 at 10:59 amRobForum Moderator
That'll be DEFINE_SOURCE assuming you don't want to actually move the body around. Note, if the whole domain moves you don't need to remesh.
-
April 5, 2024 at 8:41 amvikram chahalSubscriber
could you please provide the UDF code. i have write this one
#include "udf.h"DEFINE_SOURCE(moment_source, c, t, dS, eqn){real time = CURRENT_TIME; // Get the current simulation timereal moment = 0.0; // Initialize moment to zeroreal CG[ND_ND]; // Center of gravity coordinatesreal cellCG[ND_ND]; // Cell center coordinatesC_CENTROID(CG, c, t); // Get CG of the domainC_CENTROID(cellCG, c, t); // Get cell center coordinatesreal distance_from_CG = cellCG[2] - CG[2]; // Distance along z-axis/* Check if time is within the specified duration */if (time <= 2.0){/* Apply moment only to cells at CG */if (distance_from_CG = 0.0){moment = 5000.0; // Apply 5000 Nm moment}dS[eqn] = 0.0; // Reset the source termreturn moment; // Return the moment as the source term}and hooked as the souce term of fluid domain under cell conditions.
-
-
April 5, 2024 at 6:13 amvikram chahalSubscriber
-
April 5, 2024 at 7:01 amvikram chahalSubscriber
where should i hook this UDF?
-
April 5, 2024 at 10:20 amRobForum Moderator
Source terms are hooked into the cell zones.
-
April 5, 2024 at 10:27 amvikram chahalSubscriber#include "udf.h"DEFINE_SOURCE(moment_source, c, t, dS, eqn){real time = CURRENT_TIME; // Get the current simulation timereal moment = 0.0; // Initialize moment to zeroreal CG[ND_ND]; // Center of gravity coordinatesreal cellCG[ND_ND]; // Cell center coordinatesC_CENTROID(CG, c, t); // Get CG of the domainC_CENTROID(cellCG, c, t); // Get cell center coordinatesreal distance_from_CG = cellCG[2] - CG[2]; // Distance along z-axis/* Check if time is within the specified duration */if (time <= 2.0){/* Apply moment only to cells at CG */if (distance_from_CG = 0.0){moment = 5000.0; // Apply 5000 Nm moment}dS[eqn] = 0.0; // Reset the source termreturn moment; // Return the moment as the source term}
and hooked as the souce term of fluid domain under cell conditions.
this UDF is giving very less value of force... could you please check it whether syntex and logic is correct or not.
-
-
April 5, 2024 at 10:53 amRobForum Moderator
You're returning a source at the centre position by the looks of it? I'm not able to check code, only point you at the manual.
-
- The topic ‘coupled simulation of vehicle and fluid tank’ is closed to new replies.
- Non-Intersected faces found for matching interface periodic-walls
- Script error Code: 800a000d
- Unburnt Hydrocarbons contour in ANSYS FORTE for sector mesh
- Help: About the expression of turbulent viscosity in Realizable k-e model
- Fluent fails with Intel MPI protocol on 2 nodes
- Cyclone (Stairmand) simulation using RSM
- error udf
- Diesel with Ammonia/Hydrogen blend combustion
- Mass Conservation Issue in Methane Pyrolysis Shock Tube Simulation
- Script Error
-
1281
-
591
-
543
-
524
-
366
© 2024 Copyright ANSYS, Inc. All rights reserved.