-
Notifications
You must be signed in to change notification settings - Fork 447
Description
I observed wavelike density disturbance bands appearing after a period of time in my submarine navigation acoustic field simulation. Why this is happening and if there are any solutions? Below are my simulation settings:
‘’‘
void main_setup() {
const uint3 lbm_N = resolution(float3(2.0f, 4.0f, 2.0f), 8000u); // input: simulation box aspect ratio and VRAM occupation in MB, output: grid resolution
const float si_u = 40.0f/3.6f;
const float si_length=100.0f, si_width=15.0f;
const float si_T = 200.0f;
const float si_nu=1.48E-6f, si_rho=1026.0f;
const float lbm_length = 0.2f*(float)lbm_N.y;
const float lbm_u = 0.075f;
units.set_m_kg_s(lbm_length, lbm_u, 1.0f, si_length, si_u, si_rho);
const float lbm_nu = units.nu(si_nu);
const ulong lbm_T = units.t(si_T);
const float Re = units.si_Re(si_width, si_u, si_nu);
const float si_T_char = si_length / si_u;
const float T_char_ratio = si_T / si_T_char;
print_info("Re = " + to_string(to_uint(Re)));
print_info("Velocity: " + to_string(si_u, 2u) + " m/s (" + to_string(si_u3.6f, 1u) + " km/h)");
print_info("Length: " + to_string(si_length, 1u) + " m, Width: " + to_string(si_width, 1u) + " m");
print_info("Domain: " + to_string(units.si_x((float)lbm_N.x), 1u) + " x " + to_string(units.si_x((float)lbm_N.y), 1u) + " x " + to_string(units.si_x((float)lbm_N.z), 1u) + " m");
print_info("Time: " + to_string(si_T, 1u) + " s (" + to_string(lbm_T) + " steps)");
print_info("T_char = " + to_string(si_T_char, 2u) + " s, T/T_char = " + to_string(T_char_ratio, 1u));
if(T_char_ratio < 10.0f) print_warning("Simulation time may be insufficient for steady state (recommended: >10 T_char)");
else if(T_char_ratio < 20.0f) print_info("Simulation time should be sufficient for quasi-steady state");
else print_info("Simulation time is sufficient for fully developed flow");
LBM lbm(lbm_N, 2u, 3u, 1u, lbm_nu);
const float3 center = lbm.center();
const float3x3 rotation = float3x3(float3(1, 0, 0), radians(0.0f))float3x3(float3(0, 0, 1), radians(0.0f))float3x3(float3(1, 0, 0), radians(0.0f));
Mesh mesh = read_stl(get_exe_path()+"../stl/ohio-1-2.stl", lbm.size(), center, rotation, lbm_length);
lbm.voxelize_mesh_on_device(mesh);
lbm.flags.read_from_device();
const uint Nx=lbm.get_Nx(), Ny=lbm.get_Ny(), Nz=lbm.get_Nz(); parallel_for(lbm.get_N(), [&](ulong n) { uint x=0u, y=0u, z=0u; lbm.coordinates(n, x, y, z);
if(lbm.flags[n]!=TYPE_S) lbm.u.y[n] = lbm_u;
if(x==0u||x==Nx-1u||y==0u||y==Ny-1u||z==0u||z==Nz-1u) lbm.flags[n] = TYPE_E; // all non periodic
}); // ####################################################################### run simulation, export images and data ##########################################################################
// lbm.graphics.visualization_modes = VIS_FLAG_SURFACE|VIS_Q_CRITERION;
lbm.run(0u, lbm_T); // initialize simulation
lbm.write_status();
const float si_T_start_export = 100.0f;
const float si_export_interval = 1.0f;
const ulong lbm_T_start_export = units.t(si_T_start_export);
const ulong export_interval = max(1ul, (ulong)units.t(si_export_interval));
while(lbm.get_t()<=lbm_T) { // main simulation loop
lbm.run(1u, lbm_T); // run dt time steps
if(lbm.get_t() >= lbm_T_start_export && (lbm.get_t() - lbm_T_start_export) % export_interval == 0ull) {
lbm.rho.write_device_to_vtk();
lbm.u.write_device_to_vtk();
lbm.write_mesh_to_vtk(mesh);
const float si_t = units.si_t(lbm.get_t());
print_info("Export at t = " + to_string(lbm.get_t()) + ", si_t = " + to_string(si_t, 2u) + " s");
}
}
lbm.write_status();
lbm.rho.write_device_to_vtk();
lbm.u.write_device_to_vtk();
lbm.write_mesh_to_vtk(mesh);
print_info("Data exported: rho-.vtk, u-.vtk, mesh-*.vtk");
} /**/
’‘’
