| 756 | } |
| 757 | |
| 758 | void LBM::sanity_checks_constructor(const vector<Device_Info>& device_infos, const uint Nx, const uint Ny, const uint Nz, const uint Dx, const uint Dy, const uint Dz, const float nu, const float fx, const float fy, const float fz, const float sigma, const float alpha, const float beta, const uint particles_N, const float particles_rho) { // sanity checks on grid resolution and extension support |
| 759 | if((ulong)Nx*(ulong)Ny*(ulong)Nz==0ull) print_error("Grid point number is 0: "+to_string(Nx)+"x"+to_string(Ny)+"x"+to_string(Nz)+" = 0."); |
| 760 | if(Dx*Dy*Dz==0u) print_error("You specified 0 LBM grid domains ("+to_string(Dx)+"x"+to_string(Dy)+"x"+to_string(Dz)+"). There has to be at least 1 domain in every direction. Check your input in LBM constructor."); |
| 761 | const uint local_Nx=Nx/Dx+2u*(Dx>1u), local_Ny=Ny/Dy+2u*(Dy>1u), local_Nz=Nz/Dz+2u*(Dz>1u); |
| 762 | uint memory_available = max_uint; // in MB |
| 763 | for(Device_Info device_info : device_infos) memory_available = min(memory_available, device_info.memory); |
| 764 | uint memory_required = (uint)((ulong)Nx*(ulong)Ny*(ulong)Nz/((ulong)(Dx*Dy*Dz))*(ulong)bytes_per_cell_device()/1048576ull); // in MB |
| 765 | if(memory_required>memory_available) { |
| 766 | float factor = cbrt((float)memory_available/(float)memory_required); |
| 767 | const uint maxNx=(uint)(factor*(float)Nx), maxNy=(uint)(factor*(float)Ny), maxNz=(uint)(factor*(float)Nz); |
| 768 | string message = "Grid resolution ("+to_string(Nx)+", "+to_string(Ny)+", "+to_string(Nz)+") is too large: "+to_string(Dx*Dy*Dz)+"x "+to_string(memory_required)+" MB required, "+to_string(Dx*Dy*Dz)+"x "+to_string(memory_available)+" MB available. Largest possible resolution is ("+to_string(maxNx)+", "+to_string(maxNy)+", "+to_string(maxNz)+"). Restart the simulation with lower resolution or on different device(s) with more memory."; |
| 769 | #if !defined(FP16S)&&!defined(FP16C) |
| 770 | uint memory_required_fp16 = (uint)((ulong)Nx*(ulong)Ny*(ulong)Nz/((ulong)(Dx*Dy*Dz))*(ulong)(bytes_per_cell_device()-velocity_set*2u)/1048576ull); // in MB |
| 771 | float factor_fp16 = cbrt((float)memory_available/(float)memory_required_fp16); |
| 772 | const uint maxNx_fp16=(uint)(factor_fp16*(float)Nx), maxNy_fp16=(uint)(factor_fp16*(float)Ny), maxNz_fp16=(uint)(factor_fp16*(float)Nz); |
| 773 | message += " Consider using FP16S/FP16C memory compression to double maximum grid resolution to a maximum of ("+to_string(maxNx_fp16)+", "+to_string(maxNy_fp16)+", "+to_string(maxNz_fp16)+"); for this, uncomment \"#define FP16S\" or \"#define FP16C\" in defines.hpp."; |
| 774 | #endif // !FP16S&&!FP16C |
| 775 | print_error(message); |
| 776 | } |
| 777 | if(nu==0.0f) print_error("Viscosity cannot be 0. Change it in setup.cpp."); // sanity checks for viscosity |
| 778 | else if(nu<0.0f) print_error("Viscosity cannot be negative. Remove the \"-\" in setup.cpp."); |
| 779 | #ifdef D2Q9 |
| 780 | if(Nz!=1u) print_error("D2Q9 is the 2D velocity set. You have to set Nz=1u in the LBM constructor! Currently you have set Nz="+to_string(Nz)+"u."); |
| 781 | #endif // D2Q9 |
| 782 | #if !defined(SRT)&&!defined(TRT) |
| 783 | print_error("No LBM collision operator selected. Uncomment either \"#define SRT\" or \"#define TRT\" in defines.hpp"); |
| 784 | #elif defined(SRT)&&defined(TRT) |
| 785 | print_error("Too many LBM collision operators selected. Comment out either \"#define SRT\" or \"#define TRT\" in defines.hpp"); |
| 786 | #endif // SRT && TRT |
| 787 | #ifndef VOLUME_FORCE |
| 788 | if(fx!=0.0f||fy!=0.0f||fz!=0.0f) print_error("Volume force is set in LBM constructor in main_setup(), but VOLUME_FORCE is not enabled. Uncomment \"#define VOLUME_FORCE\" in defines.hpp."); |
| 789 | #else // VOLUME_FORCE |
| 790 | #ifndef FORCE_FIELD |
| 791 | if(fx==0.0f&&fy==0.0f&&fz==0.0f) print_warning("The VOLUME_FORCE extension is enabled but the volume force in LBM constructor is set to zero. You may disable the extension by commenting out \"#define VOLUME_FORCE\" in defines.hpp."); |
| 792 | #endif // FORCE_FIELD |
| 793 | #endif // VOLUME_FORCE |
| 794 | #ifndef SURFACE |
| 795 | if(sigma!=0.0f) print_error("Surface tension is set in LBM constructor in main_setup(), but SURFACE is not enabled. Uncomment \"#define SURFACE\" in defines.hpp."); |
| 796 | #endif // SURFACE |
| 797 | #ifndef TEMPERATURE |
| 798 | if(alpha!=0.0f||beta!=0.0f) print_error("Thermal diffusion/expansion coefficients are set in LBM constructor in main_setup(), but TEMPERATURE is not enabled. Uncomment \"#define TEMPERATURE\" in defines.hpp."); |
| 799 | #else // TEMPERATURE |
| 800 | if(alpha==0.0f&&beta==0.0f) print_warning("The TEMPERATURE extension is enabled but the thermal diffusion/expansion coefficients alpha/beta in the LBM constructor are both set to zero. You may disable the extension by commenting out \"#define TEMPERATURE\" in defines.hpp."); |
| 801 | #endif // TEMPERATURE |
| 802 | #ifdef PARTICLES |
| 803 | if(particles_N==0u) print_error("The PARTICLES extension is enabled but the number of particles is set to 0. Comment out \"#define PARTICLES\" in defines.hpp."); |
| 804 | #if !defined(VOLUME_FORCE)||!defined(FORCE_FIELD) |
| 805 | if(particles_rho!=1.0f) print_error("Particle density is set unequal to 1, but particle-fluid 2-way-coupling is not enabled. Uncomment both \"#define VOLUME_FORCE\" and \"#define FORCE_FIELD\" in defines.hpp."); |
| 806 | #endif // !VOLUME_FORCE||!FORCE_FIELD |
| 807 | #ifdef FORCE_FIELD |
| 808 | if(particles_rho==1.0f) print_warning("Particle density is set to 1, so particles behave as passive tracers without acting a force on the fluid, but particle-fluid 2-way-coupling is enabled. You may comment out \"#define FORCE_FIELD\" in defines.hpp."); |
| 809 | #endif // FORCE_FIELD |
| 810 | #else // PARTICLES |
| 811 | if(particles_N>0u) print_error("The PARTICLES extension is disabled but the number of particles is set to "+to_string(particles_N)+">0. Uncomment \"#define PARTICLES\" in defines.hpp."); |
| 812 | #endif // PARTICLES |
| 813 | } |
| 814 | |
| 815 | void LBM::sanity_checks_initialization() { // sanity checks during initialization on used extensions based on used flags |
nothing calls this directly
no test coverage detected