Newer
Older
r"""
=======================================================================================
____ ____ __ ______ __________ __ __ __ __
\ \ | | | | | _ \ |___ ___| | | | | / \ | |
\ \ | | | | | |_) | | | | | | | / \ | |
\ \ | | | | | _ / | | | | | | / /\ \ | |
\ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____
\ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______|
\ \ | | ________________________________________________________________
\ \ | | | ______________________________________________________________|
\ \| | | | __ __ __ __ ______ _______
\ | | |_____ | | | | | | | | | _ \ / _____)
\ | | _____| | | | | | | | | | | \ \ \_______
\ | | | | |_____ | \_/ | | | | |_/ / _____ |
\ _____| |__| |________| \_______/ |__| |______/ (_______/
This file is part of VirtualFluids. VirtualFluids is free software: you can
redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
! \file acousticscaling.py
! \ingroup tests
! \author Sven Marcus, Henry Korb
=======================================================================================
"""
class OneDirectionalAcousticScaling:
def __init__(self, grid_parameters: cpu.parameters.GridParameters,
physical_parameters: cpu.parameters.PhysicalParameters,
runtime_parameters: cpu.parameters.RuntimeParameters,
kernel: cpu.kernel.LBMKernel):
self._grid_params = grid_parameters
self._physical_params = physical_parameters
self._runtime_params = runtime_parameters
self._kernel = kernel
def configuration_for_scale_level(self, level: int = 1) -> tuple[cpu.parameters.GridParameters,
cpu.parameters.PhysicalParameters,
cpu.parameters.RuntimeParameters,
cpu.kernel.LBMKernel]:
if level < 0:
raise ValueError("level must be >= 0")
grid_params = self.clone_grid_params_for_level(level)
physical_params = self.clone_physical_parameters(level)
runtime_params = self.clone_runtime_params_for_level(level)
kernel = self.clone_kernel_for_level(level)
return grid_params, physical_params, runtime_params, kernel
def clone_grid_params_for_level(self, level) -> cpu.parameters.GridParameters:
grid_params = cpu.parameters.GridParameters()
grid_params.reference_direction_index = self._grid_params.reference_direction_index
grid_params.periodic_boundary_in_x1 = self._grid_params.periodic_boundary_in_x1
grid_params.periodic_boundary_in_x2 = self._grid_params.periodic_boundary_in_x2
grid_params.periodic_boundary_in_x3 = self._grid_params.periodic_boundary_in_x3
grid_params.number_of_nodes_per_direction = list(self._grid_params.number_of_nodes_per_direction)
grid_params.blocks_per_direction = list(self._grid_params.blocks_per_direction)
grid_params.node_distance = self._grid_params.node_distance
if level > 0:
grid_params.node_distance /= (level * 2)
grid_params.number_of_nodes_per_direction = [grid_params.number_of_nodes_per_direction[0],
grid_params.number_of_nodes_per_direction[1],
grid_params.number_of_nodes_per_direction[2] * (level * 2)]
grid_params.blocks_per_direction = [grid_params.blocks_per_direction[0],
grid_params.blocks_per_direction[1],
grid_params.blocks_per_direction[2] * (level * 2)]
return grid_params
def clone_physical_parameters(self, level):
physical_params.lattice_viscosity = self._physical_params.lattice_viscosity
if level > 0:
physical_params.lattice_viscosity *= (level * 2)
return physical_params
def clone_runtime_params_for_level(self, level):
runtime_params.number_of_timesteps = self._runtime_params.number_of_timesteps
runtime_params.number_of_threads = self._runtime_params.number_of_threads
runtime_params.timestep_log_interval = self._runtime_params.timestep_log_interval
if level > 0:
runtime_params.number_of_timesteps *= (level * 2)
return runtime_params
def clone_kernel_for_level(self, level):
kernel.use_forcing = self._kernel.use_forcing
kernel.forcing_in_x1 = self._kernel.forcing_in_x1
kernel.forcing_in_x2 = self._kernel.forcing_in_x2
kernel.forcing_in_x3 = self._kernel.forcing_in_x3
if level > 0:
kernel.forcing_in_x1 /= (level * 2)
kernel.forcing_in_x2 /= (level * 2)
kernel.forcing_in_x3 /= (level * 2)