Skip to content
Snippets Groups Projects
acousticscaling.py 5.99 KiB
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
=======================================================================================
"""
Hkorb's avatar
Hkorb committed
from pyfluids import cpu
class OneDirectionalAcousticScaling:
Hkorb's avatar
Hkorb committed
    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

Hkorb's avatar
Hkorb committed
    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

Hkorb's avatar
Hkorb committed
    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):
Hkorb's avatar
Hkorb committed
        physical_params = cpu.parameters.PhysicalParameters()
        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):
Hkorb's avatar
Hkorb committed
        runtime_params = cpu.parameters.RuntimeParameters()
        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):
Hkorb's avatar
Hkorb committed
        kernel = cpu.kernel.LBMKernel(self._kernel.type)
        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)