Fluids

Fluids

Topics related to Fluent, CFX, Turbogrid and more.

coupled simulation of vehicle and fluid tank

    • vikram chahal
      Subscriber

      Good morning sir/mam,

      i am doing coupled simulation of vehicle and fluid tank thtough UDF using ansys fluent.  UDF is succesfully compliled but at the time of running simulation it showing bad termination of FFF fluent and automatically shut down. below is my UDF.  

      #include "udf.h"

      DEFINE_ADJUST(coupled_simulation, d)
      {
          real simulation_time = RP_Get_Real("flow-time");
          real dt = 0.0001; // Time step size
          real end_time = 15; // End time of simulation

          Domain *domain = Get_Domain(2); // Assuming the fluid domain has ID 2

          if (!domain)
          {
              Message("Error: Unable to obtain domain.\n");
              return;
          }

          // Define vehicle parameters
          real 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 = 1000.0; // Braking force (N)

          // Define fluid parameters for water phase
          real fluid_density_water = 1000.0; // Density of water (kg/m^3)

          // Define fluid parameters for air phase
          real fluid_density_air = 1.2; // Density of air (kg/m^3)

          // Initial conditions for vehicle motion
          real x = 1.0; // Initial vertical displacement
          real theta = 1.0; // Initial angular displacement
          real x_dot = 0.0; // Initial vertical velocity
          real theta_dot = 0.0; // Initial angular velocity
          real x_ddot = 0.0; //vehicle acceleration

          real fluid_force_x_water = 0.0, fluid_force_x_air = 0.0;
          real fluid_force_y_water = 0.0, fluid_force_y_air = 0.0;
          real fluid_force_z_water = 0.0, fluid_force_z_air = 0.0;
          real fluid_moment_x_water = 0.0, fluid_moment_x_air = 0.0;
          real fluid_moment_y_water = 0.0, fluid_moment_y_air = 0.0;
          real fluid_moment_z_water = 0.0, fluid_moment_z_air = 0.0;

          Thread *t;
          face_t f;
          cell_t c;
         
          // Main simulation loop
          while (simulation_time < end_time)
          {
              // Step 1: Calculate vehicle response to braking force
              real 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 to fluid domain as a body force in the source term
          real vehicle_force_y = -m_truck * x_ddot;
          real vehicle_moment_z = -k1 * l1 * (x - l1 * theta) + k2 * l2 * (x + l2 * theta);


          // Loop over fluid cells
          t = Lookup_Thread(domain, 2); // Assuming FLUID_THREAD_ID is the ID of the fluid thread
          thread_loop_c(t, d)
          {
              begin_c_loop(c, t)
              {
                  // Apply the body force components based on vehicle response
                  // For simplicity, assuming all the force acts in the y-direction
                  C_UDMI(c, t, 0) = 0.0; // Body force in x-direction
                  C_UDMI(c, t, 1) = vehicle_force_y; // Body force in y-direction
                  C_UDMI(c, t, 2) = 0.0; // Body force in z-direction

                  // Apply the moment components based on vehicle response
                  // Here, we'll assume all the moments act around the z-axis
                  C_UDMI(c, t, 3) = 0.0; // Moment about x-axis
                  C_UDMI(c, t, 4) = 0.0; // Moment about y-axis
                  C_UDMI(c, t, 5) = vehicle_moment_z; // Moment about z-axis
              }
              end_c_loop(c, t);
          }

          // Step 3: Calculate fluid forces and moments for water and air phases
          // Loop over fluid cells
          t = Lookup_Thread(domain, 2); // Assuming FLUID_THREAD_ID is the ID of the fluid thread
          thread_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 area
                  real p = C_P(c, t);                     // Pressure of the cell (initialise pressure value in Fluent= mg/ base area)
                  C_CENTROID(A, c, t);                    // Centroid of the cell

                  for (int i = 0; i < ND_ND; i++)
                  {
                      F[i] = 0.0; // Initialize force vector
                  }

                  // Loop over faces of the cell using C_FACE macro
                  for (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 force
                      for (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 moments for water phase
                  fluid_force_x_water += F[0];
                  fluid_force_y_water += F[1];
                  fluid_force_z_water += F[2];
                  fluid_moment_x_water += (A[1] * F[2] - A[2] * F[1]);
                  fluid_moment_y_water += (A[2] * F[0] - A[0] * F[2]);
                  fluid_moment_z_water += (A[0] * F[1] - A[1] * F[0]);

                  // Accumulate forces and moments for air phase
                  fluid_force_x_air += F[0];
                  fluid_force_y_air += F[1];
                  fluid_force_z_air += F[2];
                  fluid_moment_x_air += (A[1] * F[2] - A[2] * F[1]);
                  fluid_moment_y_air += (A[2] * F[0] - A[0] * F[2]);
                  fluid_moment_z_air += (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 equations
          real fluid_force_x = fluid_force_x_water + fluid_force_x_air;
          real fluid_force_y = fluid_force_y_water + fluid_force_y_air;
          real fluid_force_z = fluid_force_z_water + fluid_force_z_air;
           real fluid_moment_x = fluid_moment_x_water + fluid_moment_x_air;
            real fluid_moment_y = fluid_moment_y_water + fluid_moment_y_air;
             real fluid_moment_z = fluid_moment_z_water + fluid_moment_z_air;

                  x_dot += fluid_force_x / m_truck * dt;
                  theta_dot += fluid_moment_z / I_truck * dt;

                  x += x_dot * dt;
               theta += theta_dot * dt;
               // Increment simulation time
              simulation_time += dt;

               // Step 5: Output results if needed
                  printf("Time: %.2f, x: %.4f, theta: %.4f\n", simulation_time, x, theta);
                  }
         
    • SRP
      Ansys Employee

      Hi,

      Before continue, add extra debugging output statements to your UDF to pinpoint the specific location of the fault. You may display intermediate variables, verify loop iterations, and confirm that each step of the computation is completed appropriately. Avoid needless memory allocations and deallocations within loops, as they might lead to memory leaks or segmentation problems.

    • vikram chahal
      Subscriber
      HOW CAN I DO THIS WITHOUT USING MEMORY ALLOCATION? could you please suggest any alternative for that
       // Apply the body force components based on vehicle response
                  // For simplicity, assuming all the force acts in the y-direction
                  C_UDMI(c, t, 0) = 0.0; // Body force in x-direction
                  C_UDMI(c, t, 1) = vehicle_force_y; // Body force in y-direction
                  C_UDMI(c, t, 2) = 0.0; // Body force in z-direction

       

                  // Apply the moment components based on vehicle response
                  // Here, we'll assume all the moments act around the z-axis
                  C_UDMI(c, t, 3) = 0.0; // Moment about x-axis
                  C_UDMI(c, t, 4) = 0.0; // Moment about y-axis
                  C_UDMI(c, t, 5) = vehicle_moment_z; // Moment about z-axis
              }
              end_c_loop(c, t);
    • SRP
      Ansys Employee

      Hi,

      I recommend that you first execute the code section by section to troubleshoot the issue, as I suggested in my previous response, so that we can determine whether there is an error. I hope this helps.

Viewing 3 reply threads
  • The topic ‘coupled simulation of vehicle and fluid tank’ is closed to new replies.