diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f88b0cd6a19bacbc784e3b0e3d9daa82fe2f88e..4294ee79222a9df0785ade41a6e58a8b39d26a62 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ ############################################################################### ## VirtualFluids CI Pipeline ## ############################################################################### -image: git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu20_04:1.3 +image: git.rz.tu-bs.de:4567/irmb/virtualfluids/ubuntu20_04:1.4 stages: - build @@ -133,27 +133,37 @@ gcc_9_python: - export CCACHE_DIR=$CI_PROJECT_DIR/cache script: - - python3 setup.py bdist_wheel build_ext --build-temp=_skbuild -- -DBUILD_VF_CPU=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CUDA_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache + - python3 setup.py bdist_wheel build_ext --build-temp=_skbuild -- -DBUILD_VF_CPU=ON -DBUILD_VF_DOUBLE_ACCURACY=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CUDA_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache ############################################################################### ## Container Upload ## ############################################################################### -build_singularity_image: +build_poiseuille_test_container: + image: + name: quay.io/singularity/singularity:v3.10.2 + entrypoint: [""] + stage: container_upload - needs: - - gcc_9_python + rules: + - if: $REMOTE_USER && $REMOTE_HOST && $PRIVATE_KEY && $CI_PIPELINE_SOURCE == "schedule" + when: always + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: never + - when: manual + allow_failure: true tags: - linux - privileged - rules: - - if: $CI_COMMIT_TAG + artifacts: + expire_in: 1 hrs + paths: + - Containers/PoiseuilleTestContainer.sif script: - - singularity build Containers/VirtualFluidsPython.sif Containers/VirtualFluidsPython.def - - singularity push --docker-username "${CI_REGISTRY_USER}" --docker-password "${CI_REGISTRY_PASSWORD}" Containers/VirtualFluidsPython.sif oras://"$CI_REGISTRY_IMAGE"/"$CI_PROJECT_NAME":"$CI_COMMIT_TAG" + - singularity build "Containers/PoiseuilleTestContainer.sif" "Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def" ############################################################################### ## Tests ## @@ -203,6 +213,28 @@ gcc_9_python_bindings_test: - python3 -m unittest discover -s Python -v +############################################################################### +gcc_9_python_hpc_test: + image: python:latest + stage: test + + needs: ["build_poiseuille_test_container"] + + rules: + - if: $REMOTE_USER && $REMOTE_HOST && $PRIVATE_KEY && $CI_PIPELINE_SOURCE == "schedule" + when: always + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: never + - when: manual + allow_failure: true + + before_script: + - pip install hpc-rocket + + script: + - hpc-rocket launch --watch Python/SlurmTests/poiseuille/rocket.yml + + ############################################################################### ## Benchmark ## ############################################################################### @@ -320,8 +352,7 @@ clang_build_analyzer_clang_10: - mkdir -p $CI_PROJECT_DIR/build - cd $CI_PROJECT_DIR/build - cmake .. - -DBUILD_VF_CPU=ON - -DBUILD_VF_GPU=ON + --preset=all_make -DCMAKE_CUDA_ARCHITECTURES=60 -DCMAKE_CXX_FLAGS=-ftime-trace - ClangBuildAnalyzer --start . @@ -353,8 +384,7 @@ include_what_you_use_clang_10: - mkdir -p $CI_PROJECT_DIR/build - cd $CI_PROJECT_DIR/build - cmake .. - -DBUILD_VF_CPU=ON - -DBUILD_VF_GPU=ON + --preset=all_make -DCMAKE_CUDA_ARCHITECTURES=60 -DBUILD_VF_INCLUDE_WHAT_YOU_USE=ON - make @@ -474,6 +504,7 @@ clang-tidy: - cd $CI_PROJECT_DIR/build - cmake .. -DBUILD_VF_CPU=ON + -DBUILD_VF_DOUBLE_ACCURACY=ON -DBUILD_VF_GPU=OFF - python3 ../utilities/filterCompileCommands.py compile_commands.json - run-clang-tidy -quiet > clangtidy.txt @@ -605,26 +636,3 @@ sonar-scanner: script: - cd $CI_PROJECT_DIR - sonar-scanner -X -Dsonar.verbose=true -Dsonar.login=$SONAR_SECURITY_TOKEN - -############################################################################### -## Release ## -############################################################################### -create_release: - stage: release - - image: registry.gitlab.com/gitlab-org/release-cli:latest - - needs: ["build_singularity_image"] - - rules: - - if: $CI_COMMIT_TAG - - script: - - echo "Creating release with tag $CI_COMMIT_TAG" - - release-cli create --name "VirtualFluids $CI_COMMIT_TAG" \ - --description "VirtualFluids CFD Simulator" \ - --tag-name "$CI_COMMIT_TAG" \ - --ref "$CI_COMMIT_SHA" \ - --job-token "$CI_JOB_TOKEN" \ - --assets-link="{'name':'VirtualFluidsSingularityImage_OpenMPI','url':'','type':'other','filepath':'Containers/VirtualFluidsOpenMPI.sif'}" - - build/bin/basicsTests diff --git a/CMake/cmake_config_files/BOMBADIL.config.cmake b/CMake/cmake_config_files/BOMBADIL.config.cmake new file mode 100644 index 0000000000000000000000000000000000000000..9c4bd4ecffab1e63161343ecc493eb9d9bc951a4 --- /dev/null +++ b/CMake/cmake_config_files/BOMBADIL.config.cmake @@ -0,0 +1,95 @@ +################################################################################# +# VirtualFluids MACHINE FILE +# Responsible: Konstantin Kutscher +# OS: Windows 10 +################################################################################# + +################################################################################# +# MPI +################################################################################# +#SET(MPI_DIR "C:/Program Files (x86)/mpich2") +#SET(MPI_DIR "C:/Program Files/mpich2") +#SET(USE_MPI_CXX_SYNTAX OFF) +#SET(MPI_COMPILER "C:/Program Files/mpich2/bin/mpicxx") +#SET(MPI_INCLUDE_PATH "C:/Program Files (x86)/mpich2/include") +#SET(MPI_LIBRARY "C:/Program Files/mpich2/lib/libmpi.a") +#SET(MPI_CXX_LIBRARY "C:/Program Files/MPICH2/lib/cxx.lib") +################################################################################# +# BOOST +################################################################################# +SET(BOOST_VERSION "1.60.0") +SET(BOOST_ROOT "d:/Tools/boost/boost_1_60_0") +SET(BOOST_DIR ${BOOST_ROOT}) +SET(BOOST_LIBRARYDIR ${BOOST_ROOT}"/stageMSVC64/lib") +################################################################################# +# VTK +################################################################################# +set(VTK_DIR "d:/Tools/VTK/build/VTK-8.0.0") + +################################################################################# +# LIGGGHTS +################################################################################# +set(LIGGGHTS_SOURCE_DIR "d:/Tools/LIGGGHTS/src") +set(LIGGGHTS_DEBUG_LIBRARY "d:/Tools/LIGGGHTS/build/Debug/liggghts.lib") +set(LIGGGHTS_RELEASE_LIBRARY "d:/Tools/LIGGGHTS/build/Release/liggghts.lib") + + + +################################################################################# +# METIS +################################################################################# +#IF(${USE_METIS}) +# SET(METIS_INCLUDEDIR "d:/Tools/metis-5.1.0/include") +# SET(METIS_DEBUG_LIBRARY "d:/Tools/metis-5.1.0/build/libmetis/Debug/metis.lib") +# SET(METIS_RELEASE_LIBRARY "d:/Tools/metis-5.1.0/build/libmetis/Release/metis.lib") + + # SET(METIS_INCLUDEDIR "/mnt/d/Tools/metis-5.1.0/include") + # SET(METIS_DEBUG_LIBRARY "/mnt/d/Tools/metis-5.1.0/build/Linux-x86_64/libmetis/libmetis.a") + # SET(METIS_RELEASE_LIBRARY "/mnt/d/Tools/metis-5.1.0/build/Linux-x86_64/libmetis/libmetis.a") +#ENDIF() + +################################################################################# +# PE +################################################################################# +IF(${USE_DEM_COUPLING}) + SET(PE_BINARY_DIR "d:/Tools/waLBerla/walberlaGit/build" CACHE PATH "pe binary dir") + SET(PE_ROOT "d:/Tools/waLBerla/walberlaGit" CACHE PATH "pe root") + + SET(PE_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/pe/Debug/pe.lib) + SET(PE_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/pe/Release/pe.lib) + SET(BLOCKFOREST_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/blockforest/Debug/blockforest.lib) + SET(BLOCKFOREST_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/blockforest/Release/blockforest.lib) + SET(DOMAIN_DECOMPOSITION_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/domain_decomposition/Debug/domain_decomposition.lib) + SET(DOMAIN_DECOMPOSITION_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/domain_decomposition/Release/domain_decomposition.lib) + SET(GEOMETRY_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/geometry/Debug/geometry.lib) + SET(GEOMETRY_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/geometry/Release/geometry.lib) + SET(CORE_DEBUG_LIBRARY ${PE_BINARY_DIR}/src/core/Debug/core.lib) + SET(CORE_RELEASE_LIBRARY ${PE_BINARY_DIR}/src/core/Release/core.lib) + + ENDIF() + +################################################################################## +# FETOL +################################################################################## +IF(${USE_FETOL}) + SET(FETOL_INCLUDEDIR "d:/Projects/FETOL/dev/CppFETOLlib") + SET(FETOL_DEBUG_LIBRARY "d:/Projects/FETOL/dev/CppFETOLlib/build/Debug/fetol.lib") + SET(FETOL_RELEASE_LIBRARY "d:/Projects/FETOL/dev/CppFETOLlib/build/Release/fetol.lib") + + SET(YAML_INCLUDEDIR "d:/Tools/yaml-cpp/include") + SET(YAML_DEBUG_LIBRARY "d:/Tools/yaml-cpp/buildVS11/Debug/libyaml-cppmdd.lib") + SET(YAML_RELEASE_LIBRARY "d:/Tools/yaml-cpp/buildVS11/Release/libyaml-cppmd.lib") + + SET(BOND_INCLUDEDIR "d:/Projects/FETOL/dev/bond_src/cpp/bond/fetol") + SET(BOND_DEBUG_LIBRARY "d:/Projects/FETOL/dev/bond_lib/Debug/bond.lib") + SET(BOND_RELEASE_LIBRARY "d:/Projects/FETOL/dev/bond_lib/Release/bond.lib") +ENDIF() + +################################################################################## +# Java +############################################################################## +### FindJNI.cmake +#find_package(JNI REQUIRED) +#SET(JNI_INCLUDE_DIRS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2} ${JAVA_AWT_INCLUDE_PATH}) +#SET(JNI_LIBRARIES ${JAVA_AWT_LIBRARY} ${JAVA_JVM_LIBRARY}) +#SET(JNI_FOUND 1) \ No newline at end of file diff --git a/CMake/cmake_config_files/MULE.config.cmake b/CMake/cmake_config_files/MULE.config.cmake index 91e788d2c1f0fc5ad4176408fe2aa54d9aca799d..2afbce6cc257fa0b8ff4dd7de580cb50c01369f1 100644 --- a/CMake/cmake_config_files/MULE.config.cmake +++ b/CMake/cmake_config_files/MULE.config.cmake @@ -1,5 +1,4 @@ SET(CMAKE_CUDA_ARCHITECTURES "75") list(APPEND USER_APPS "apps/gpu/LBM/ActuatorLine") -list(APPEND USER_APPS "apps/gpu/LBM/BoundaryLayer") list(APPEND USER_APPS "apps/gpu/LBM/SphereScaling") diff --git a/Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def b/Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def index a3836e7906b9be66ec79f68bf53ccc079db9d9ef..a275c88a6a46bfe806fce68e87aab571b66cc077 100644 --- a/Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def +++ b/Python/SlurmTests/poiseuille/PoiseuilleTestContainer.def @@ -1,11 +1,13 @@ BootStrap: docker From: ubuntu:20.04 +Stage: build %files 3rdParty 3rdParty apps apps CMake CMake Python Python + pythonbindings pythonbindings src src CMakeLists.txt CMakeLists.txt cpu.cmake cpu.cmake @@ -19,7 +21,8 @@ From: ubuntu:20.04 apt-get update && \ apt-get install -y \ build-essential \ - cmake=3.16.3-1ubuntu1 \ + ccache \ + git \ python3 \ python3-dev \ python3-pip \ @@ -27,10 +30,31 @@ From: ubuntu:20.04 libomp-dev \ libgl1 - pip3 install setuptools wheel numpy scipy pyvista + pip3 install setuptools wheel cmake numpy scipy pyvista export PYTHONPATH=Python - python3 /setup.py install + python3 /setup.py bdist_wheel build_ext --build-temp=build + pip3 install $(find dist/*.whl) + + +BootStrap: docker +From: ubuntu:20.04 +Stage: runtime + +%files from build + Python Python + dist dist + +%post + export DEBIAN_FRONTEND=noninteractive + apt-get update && \ + apt-get install -y \ + python3 \ + python3-pip \ + mpich \ + libgl1 + + pip3 install $(find dist/*.whl) %environment export PYTHONPATH=/Python diff --git a/Python/SlurmTests/poiseuille/rocket.yml b/Python/SlurmTests/poiseuille/rocket.yml new file mode 100644 index 0000000000000000000000000000000000000000..da64a48cd3f6fae69ae9f06648c7c156950a71ec --- /dev/null +++ b/Python/SlurmTests/poiseuille/rocket.yml @@ -0,0 +1,23 @@ +host: $REMOTE_HOST +user: $REMOTE_USER +private_keyfile: $PRIVATE_KEY + +copy: + - from: Python/SlurmTests/poiseuille/slurm.job + to: poiseuille_test/slurm.job + overwrite: true + + - from: Containers/PoiseuilleTestContainer.sif + to: poiseuille_test/PoiseuilleTestContainer.sif + overwrite: true + +collect: + - from: poiseuille_test/POISEUILLE_TEST.out + to: POISEUILLE_TEST.out + overwrite: true + +clean: + - poiseuille_test/* + +sbatch: poiseuille_test/slurm.job +continue_if_job_fails: true diff --git a/Python/SlurmTests/poiseuille/settings.py b/Python/SlurmTests/poiseuille/settings.py index d70a9574b3d7a3ed617069dd9aaa090c9f293ab0..a3cdc5dc8b627612c2d57a58db36c9fbaa72efac 100644 --- a/Python/SlurmTests/poiseuille/settings.py +++ b/Python/SlurmTests/poiseuille/settings.py @@ -1,3 +1,37 @@ +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 settings.py +! \ingroup Poiseuille +! \author Sven Marcus, Henry Korb +======================================================================================= +""" import os from acousticscaling import OneDirectionalAcousticScaling from pyfluids import cpu diff --git a/Python/SlurmTests/poiseuille/simulation_runner.py b/Python/SlurmTests/poiseuille/simulation_runner.py index 03fb24be7ea1a6468ae25ec3aa40ab59962ef91e..d54a35e72b298562f8ccec82677089f3898eec9b 100644 --- a/Python/SlurmTests/poiseuille/simulation_runner.py +++ b/Python/SlurmTests/poiseuille/simulation_runner.py @@ -5,7 +5,7 @@ from poiseuille.simulation import run_simulation from pyfluids.cpu.writer import Writer, OutputFormat -scale_level = int(os.environ["PYFLUIDS_SCALE_LEVEL"]) +scale_level = int(os.environ.get("PYFLUIDS_SCALE_LEVEL", 1)) grid_params, physical_params, runtime_params, kernel = Scaling.configuration_for_scale_level(scale_level) writer = Writer() diff --git a/Python/SlurmTests/poiseuille/slurm.job b/Python/SlurmTests/poiseuille/slurm.job index 488fc9a42f261d69a8212cff389721fdfb9cbf6e..b4e4da271920479ade008b28d4d2e6ce6343c3d3 100644 --- a/Python/SlurmTests/poiseuille/slurm.job +++ b/Python/SlurmTests/poiseuille/slurm.job @@ -1,5 +1,6 @@ #!/bin/bash #SBATCH -J PyFluidsTest +#SBATCH -o poiseuille_test/POISEUILLE_TEST.out #SBATCH --nodes=1 #SBATCH --ntasks-per-node=1 #SBATCH --cpus-per-task=20 @@ -9,6 +10,9 @@ #SBATCH --partition=standard source $HOME/.bashrc +module load singularity/3.9.9 + +cd poiseuille_test echo "PyFluids Poiseuille Test Case" echo "Number of tasks: ${SLURM_NTASKS}" diff --git a/Python/acousticscaling.py b/Python/acousticscaling.py index 9ba6f87653777830b7e6d860ae569246ff9505b7..7e71fed9fdd9f86415261ef4e22797021581f60c 100644 --- a/Python/acousticscaling.py +++ b/Python/acousticscaling.py @@ -1,3 +1,37 @@ +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 +======================================================================================= +""" from pyfluids import cpu diff --git a/Python/actuator_line/actuator_line.py b/Python/actuator_line/actuator_line.py index 44a757247f983ae2d2bafa2e91b65584936846c5..721af737ff6ef3340c3c2f6204aa6a7824cd1d2f 100644 --- a/Python/actuator_line/actuator_line.py +++ b/Python/actuator_line/actuator_line.py @@ -1,3 +1,37 @@ +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 actuator_line.py +! \ingroup actuator_line +! \author Henry Korb, Henrik Asmuth +======================================================================================= +""" #%% import numpy as np from pathlib import Path diff --git a/Python/boundary_layer/boundary_layer.py b/Python/boundary_layer/boundary_layer.py index e1ddb275ee78fcae3e48058dd172edc934e63062..6f6c64bc072d3afbb8aa5febbec209c26af2deee 100644 --- a/Python/boundary_layer/boundary_layer.py +++ b/Python/boundary_layer/boundary_layer.py @@ -1,3 +1,37 @@ +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 boundary_layer.py +! \ingroup boundary_layer +! \author Henry Korb, Henrik Asmuth +======================================================================================= +""" #%% import numpy as np from pathlib import Path diff --git a/Python/cubeflow/simulation.py b/Python/cubeflow/simulation.py index da8d4f3df9a07c086c643ca40bde1d24873b42b6..deb0411963aec65522af45cc48d7367f103232c6 100644 --- a/Python/cubeflow/simulation.py +++ b/Python/cubeflow/simulation.py @@ -1,3 +1,37 @@ +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 simulation.py +! \ingroup cubeflow +! \author Sven Marcus, Henry Korb +======================================================================================= +""" import os from pyfluids import cpu diff --git a/Python/liddrivencavity/simulation.py b/Python/liddrivencavity/simulation.py index 468cce6691bc29b78ccf3bd7b4dfe8821c1e546f..3c247b87a102e3c5a720f20748acc9f9f50bb178 100644 --- a/Python/liddrivencavity/simulation.py +++ b/Python/liddrivencavity/simulation.py @@ -1,3 +1,37 @@ +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 simulation.py +! \ingroup liddrivencavity +! \author Sven Marcus, Henry Korb +======================================================================================= +""" from pyfluids import cpu from pymuparser import Parser diff --git a/Python/poiseuille/poiseuille_hpc.py b/Python/poiseuille/poiseuille_hpc.py index e5a89250f5d6df8c490dca6d9641f3b9a3f4075c..b108f34445a71a686c4e22f685e26e10204113b3 100644 --- a/Python/poiseuille/poiseuille_hpc.py +++ b/Python/poiseuille/poiseuille_hpc.py @@ -1,3 +1,37 @@ +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 poiseuille_hpc.py +! \ingroup poiseuille +! \author Sven Marcus, Henry Korb +======================================================================================= +""" from poiseuille.simulation import run_simulation from pyfluids import cpu diff --git a/Python/poiseuille/simulation.py b/Python/poiseuille/simulation.py index 0f793d0c0bcf81016d6f9d0c65ba3637f6317ffa..a6f12e59fbd0a0ccad9a4db9ccde69b828cf90bf 100644 --- a/Python/poiseuille/simulation.py +++ b/Python/poiseuille/simulation.py @@ -1,3 +1,37 @@ +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 simulation.py +! \ingroup poiseuille +! \author Sven Marcus, Henry Korb +======================================================================================= +""" from pyfluids import cpu diff --git a/Python/poiseuille/test_poiseuille_l2.py b/Python/poiseuille/test_poiseuille_l2.py index 1c6cdbd0116301db7552aa10092a2da97d1c81e8..818cba40e115945c60e4fa2ac96b3b6b5ab0bba8 100644 --- a/Python/poiseuille/test_poiseuille_l2.py +++ b/Python/poiseuille/test_poiseuille_l2.py @@ -1,3 +1,37 @@ +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 test_poiseuille_l2.py +! \ingroup poiseuille +! \author Sven Marcus, Henry Korb +======================================================================================= +""" import os import shutil import unittest diff --git a/Python/tests/test_acousticscaling.py b/Python/tests/test_acousticscaling.py index e37b57c98e625f642ec000ec7a8ea83fe0df204c..02454b935e3a147e045f45c273392646aeca6b8c 100644 --- a/Python/tests/test_acousticscaling.py +++ b/Python/tests/test_acousticscaling.py @@ -1,3 +1,37 @@ +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 test_acousticscaling.py +! \ingroup tests +! \author Sven Marcus, Henry Korb +======================================================================================= +""" import unittest from typing import List diff --git a/Python/tests/test_boundaryconditions.py b/Python/tests/test_boundaryconditions.py index c2f6c494febe0708754f686bb804fa6a3baec6f1..d914c50cad2051188331b2efe604907091fa731e 100644 --- a/Python/tests/test_boundaryconditions.py +++ b/Python/tests/test_boundaryconditions.py @@ -1,3 +1,37 @@ +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 test_boundaryconditions.py +! \ingroup tests +! \author Sven Marcus, Henry Korb +======================================================================================= +""" import unittest from pyfluids import cpu diff --git a/Python/tests/test_geometry.py b/Python/tests/test_geometry.py index b0ac2f64b19c4002a208a9e85e952727b4ff2ee0..3d297f5c176cd99f7969adf37333588d86b77627 100644 --- a/Python/tests/test_geometry.py +++ b/Python/tests/test_geometry.py @@ -1,3 +1,37 @@ +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 test_geometry.py +! \ingroup tests +! \author Sven Marcus, Henry Korb +======================================================================================= +""" import unittest from pyfluids import cpu diff --git a/Python/tests/test_kernel.py b/Python/tests/test_kernel.py index 4736f4ebe41f3c93ca433c1577bf38d9d95ce6cb..e0159bec6802cb08d73214038b177091879fee46 100644 --- a/Python/tests/test_kernel.py +++ b/Python/tests/test_kernel.py @@ -1,3 +1,37 @@ +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 test_kernel.py +! \ingroup tests +! \author Sven Marcus, Henry Korb +======================================================================================= +""" import unittest from pyfluids import cpu diff --git a/apps/cpu/Applications.cmake b/apps/cpu/Applications.cmake index e8902e5ffbb3720365476afef50a4f3fbd0ddf76..68dfeb3ed7687da74d49a35337b0bae92798e80d 100644 --- a/apps/cpu/Applications.cmake +++ b/apps/cpu/Applications.cmake @@ -9,6 +9,16 @@ add_subdirectory(${APPS_ROOT_CPU}/sphere) add_subdirectory(${APPS_ROOT_CPU}/FlowAroundCylinder) add_subdirectory(${APPS_ROOT_CPU}/LaminarTubeFlow) add_subdirectory(${APPS_ROOT_CPU}/MultiphaseDropletTest) +add_subdirectory(${APPS_ROOT_CPU}/RisingBubble2D) +add_subdirectory(${APPS_ROOT_CPU}/JetBreakup) + +add_subdirectory(${APPS_ROOT_CPU}/ConvectionOfVortex) + +IF(${USE_LIGGGHTS}) + add_subdirectory(${APPS_ROOT_CPU}/LiggghtsApp) + add_subdirectory(${APPS_ROOT_CPU}/FallingSphere) + add_subdirectory(${APPS_ROOT_CPU}/Nozzle) +ENDIF() #add_subdirectory(tests) #add_subdirectory(Applications/gridRf) diff --git a/apps/cpu/ConvectionOfVortex/CMakeLists.txt b/apps/cpu/ConvectionOfVortex/CMakeLists.txt index 671dfcfeb944ed53dbe6192461db463f97a4e6f8..33d60676c7e0dfdde411c3c5b92a2534ea54fbfe 100644 --- a/apps/cpu/ConvectionOfVortex/CMakeLists.txt +++ b/apps/cpu/ConvectionOfVortex/CMakeLists.txt @@ -1,25 +1,8 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) - ######################################################## ## C++ PROJECT ### ######################################################## PROJECT(ConvectionOfVortex) -INCLUDE(${APPS_ROOT}/IncludsList.cmake) +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES cov.cpp ) -################################################################# -### LOCAL FILES ### -################################################################# -FILE(GLOB SPECIFIC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h - ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp ) - -SET(ALL_SOURCES ${ALL_SOURCES} ${SPECIFIC_FILES}) -SOURCE_GROUP(src FILES ${SPECIFIC_FILES}) - -SET(CAB_ADDITIONAL_LINK_LIBRARIES VirtualFluids) -################################################################# -### CREATE PROJECT ### -################################################################# -CREATE_CAB_PROJECT(cov BINARY) diff --git a/apps/cpu/ConvectionOfVortex/cov.cpp b/apps/cpu/ConvectionOfVortex/cov.cpp index 4e1f592b896c21da5bc6bc59f3b2bfb584650374..627f5d03abe32f43cf3eb33649e0f209595b8b6a 100644 --- a/apps/cpu/ConvectionOfVortex/cov.cpp +++ b/apps/cpu/ConvectionOfVortex/cov.cpp @@ -56,7 +56,7 @@ void run() //LBMReal nuLB = 8.66025e-6*4.0; //double yFactor = 4.0; - string pathname = "d:/temp/ConvectionOfVortex_0.00075_moments"; + //string pathname = "d:/temp/ConvectionOfVortex_0.00075_moments"; //double endTime = 160; //double outTime = 160; //LBMReal dx = 0.00075; @@ -75,7 +75,7 @@ void run() SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); - int baseLevel = 0; + //int baseLevel = 0; int refineLevel = 1; //bounding box @@ -150,7 +150,7 @@ void run() if (myid==0) GbSystem3D::writeGeoObject(geoOutflow4.get(), pathname+"/geo/geoOutflow4", WbWriterVtkXmlASCII::getInstance()); SPtr<D3Q27Interactor> outflowIntr4 = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow4, grid, outflowBCAdapter, Interactor3D::SOLID)); - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B)); + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M)); InteractorsHelper intHelper(grid, metisVisitor); //intHelper.addInteractor(outflowIntr1); //intHelper.addInteractor(outflowIntr2); @@ -163,10 +163,16 @@ void run() //set connectors //SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetInterpolationProcessor()); - SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetMomentsInterpolationProcessor()); + //SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetMomentsInterpolationProcessor()); //dynamicPointerCast<CompressibleOffsetMomentsInterpolationProcessor>(iProcessor)->setBulkOmegaToOmega(true); //SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetSquarePressureInterpolationProcessor()); - SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor); + + OneDistributionSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); + + SPtr<InterpolationProcessor> iProcessor(new CompressibleOffsetMomentsInterpolationProcessor()); + SetInterpolationConnectorsBlockVisitor setInterConnsVisitor(comm, nuLB, iProcessor); + grid->accept(setInterConnsVisitor); UBLOG(logINFO, "SetConnectorsBlockVisitor:start"); grid->accept(setConnsVisitor); diff --git a/apps/cpu/CouetteFlow/cflow.cpp b/apps/cpu/CouetteFlow/cflow.cpp index 276fbe125b5b3cd0271542f7e9d8ab9f9abca518..3de4a3b36f7453eaafca24648d0aa770fb954d63 100644 --- a/apps/cpu/CouetteFlow/cflow.cpp +++ b/apps/cpu/CouetteFlow/cflow.cpp @@ -184,7 +184,7 @@ void bflow(string configname) //////////////////////////////////////////// //METIS - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY)); //////////////////////////////////////////// /////delete solid blocks if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); diff --git a/apps/cpu/FallingSphere/CMakeLists.txt b/apps/cpu/FallingSphere/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..94eab3ae0601daaaf1dbe9053ec163058b88186b --- /dev/null +++ b/apps/cpu/FallingSphere/CMakeLists.txt @@ -0,0 +1,3 @@ +PROJECT(FallingSphere) + +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} LiggghtsCoupling FILES FallingSphere.cpp ) diff --git a/apps/cpu/FallingSphere/FallingSphere.cpp b/apps/cpu/FallingSphere/FallingSphere.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5f399c547e697199cbbde82b906169a8c1d5fd59 --- /dev/null +++ b/apps/cpu/FallingSphere/FallingSphere.cpp @@ -0,0 +1,174 @@ +#include <iostream> +#include <string> +#include <memory> + +#include "VirtualFluids.h" + +#include "LiggghtsCouplingCoProcessor.h" +#include "LiggghtsCouplingWrapper.h" +#include "IBcumulantK17LBMKernel.h" + +using namespace std; + + +int main(int argc, char *argv[]) +{ + std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + + // bounding box + double g_minX1 = 0; + double g_minX2 = 0; + double g_minX3 = 0; + + double g_maxX1 = 1; + double g_maxX2 = 1; + double g_maxX3 = 10; + + int blockNX[3] = { 16, 16, 16 }; + double dx = 1./32.; + + double d_part = 0.25; + double r_p = d_part / 2.0; + + //int blockNX[3] = { 10, 10, 10 }; + //double dx = 0.05; + + + double nuLB = 1e-2; + + SPtr<LBMKernel> kernel = make_shared<IBcumulantK17LBMKernel>(); + SPtr<BCProcessor> bcProc = make_shared<BCProcessor>(); + kernel->setBCProcessor(bcProc); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm())); + ////////////////////////////////////////////////////////////////////////////////// + // BC visitor + BoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + + SPtr<Grid3D> grid = make_shared<Grid3D>(comm); + grid->setPeriodicX1(true); + grid->setPeriodicX2(true); + grid->setPeriodicX3(false); + grid->setDeltaX(dx); + grid->setBlockNX(blockNX[0], blockNX[1], blockNX[2]); + + string outputPath = "f:/temp/FallingSpheresTest"; + + UbSystem::makeDirectory(outputPath); + UbSystem::makeDirectory(outputPath + "/liggghts"); + + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); + + SPtr<GbObject3D> gridCube = make_shared <GbCuboid3D>(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3); + if (myid == 0) + GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + SPtr<CoProcessor> ppblocks = + make_shared <WriteBlocksCoProcessor>(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, + WbWriterVtkXmlBinary::getInstance(), comm); + ppblocks->process(0); + ppblocks.reset(); + + double dx2 = 2.0 * dx; + GbCuboid3DPtr wallZmin( + new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_minX3)); + GbSystem3D::writeGeoObject(wallZmin.get(), outputPath + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallZmax( + new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_maxX3, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2)); + GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance()); + + SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + InteractorsHelper intHelper(grid, metisVisitor, true); + intHelper.addInteractor(wallZminInt); + intHelper.addInteractor(wallZmaxInt); + intHelper.selectBlocks(); + + SetKernelBlockVisitor kernelVisitor(kernel, nuLB, 1e9, 1e9); + grid->accept(kernelVisitor); + + intHelper.setBC(); + + InitDistributionsBlockVisitor initVisitor; + grid->accept(initVisitor); + + SPtr<UbScheduler> lScheduler = make_shared<UbScheduler>(1); + string inFile1 = "d:/Projects/VirtualFluids_Develop/apps/cpu/FallingSphere/in.lbdem"; + string inFile2 = "d:/Projects/VirtualFluids_Develop/apps/cpu/FallingSphere/in2.lbdem"; + MPI_Comm mpi_comm = *(MPI_Comm*)(comm->getNativeCommunicator()); + LiggghtsCouplingWrapper wrapper(argv, mpi_comm); + + + + // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 1.480, 2060, r_p/dx); + //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, LBMUnitConverter::AIR_20C, r_p / dx); + SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 0.1, 1000, r_p / dx, 0.01); + std::cout << units->toString() << std::endl; + + double v_frac = 0.1; + double dt_phys = units->getFactorTimeLbToW(); + int demSubsteps = 10; + double dt_dem = dt_phys / (double)demSubsteps; + int vtkSteps = 100; + string demOutDir = outputPath; + + wrapper.execCommand("echo none"); + + wrapper.setVariable("d_part", d_part); + //wrapper.setVariable("r_part", d_part/2.); + //wrapper.setVariable("v_frac", v_frac); + + wrapper.execFile((char*)inFile1.c_str()); + + //// set timestep and output directory + wrapper.setVariable("t_step", dt_dem); + wrapper.setVariable("dmp_stp", vtkSteps * demSubsteps); + wrapper.setVariable("dmp_dir", demOutDir); + + wrapper.execFile((char *)inFile2.c_str()); + wrapper.runUpto(demSubsteps - 1); + + SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor = + make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units); + + // boundary conditions grid + { + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor( + grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm)); + ppgeo->process(0); + ppgeo.reset(); + } + + grid->accept(bcVisitor); + + OneDistributionSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); + + + // write data for visualization of macroscopic quantities + SPtr<UbScheduler> visSch(new UbScheduler(vtkSteps)); + SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor( + new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), + SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + + int endTime = 3000; //20; + SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime)); + calculator->addCoProcessor(lcCoProcessor); + calculator->addCoProcessor(writeMQCoProcessor); + + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); + + + return 0; +} diff --git a/apps/cpu/FallingSphere/in.lbdem b/apps/cpu/FallingSphere/in.lbdem new file mode 100644 index 0000000000000000000000000000000000000000..b47a85c997fce75ba082490b305bbe9b55caeb25 --- /dev/null +++ b/apps/cpu/FallingSphere/in.lbdem @@ -0,0 +1,75 @@ +echo none + +units si +atom_style granular +atom_modify map array + + + +communicate single vel yes + +boundary f f f +newton off + +processors * * 1 +region box block 0. 1. 0. 1. 0. 10. units box +create_box 1 box + +variable skin equal 0.01 +neighbor ${skin} bin +neigh_modify delay 0 binsize 0.01 one 1000 + +fix grav all gravity 0.981 vector 0 0 -1 + + +fix m1 all property/global youngsModulus peratomtype 1e8 +fix m2 all property/global poissonsRatio peratomtype 0.4 +fix m3 all property/global coefficientRestitution peratomtypepair 1 0.95 +fix m4 all property/global coefficientFriction peratomtypepair 1 0.45 +fix m5 all property/global coefficientRollingFriction peratomtypepair 1 0.020 + +# lb coupling fix +fix lbcoupling all couple/lb/onetoone + + +pair_style gran model hertz tangential history rolling_friction cdt +pair_coeff * * + +fix 1 all nve/sphere + +fix xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0. +fix xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 1. +fix ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0. +fix ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 1. +fix zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0. +fix zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 2. + +create_atoms 1 single 0.5 0.5 9.75 +#create_atoms 1 single 0.38 0.05 0.05 + +set group all diameter ${d_part} density 2400 + +atom_modify sort 0 0.0 + +#fix pts1 all particletemplate/sphere 1 atom_type 1 density constant 1000 radius constant 0.015 +#fix pts2 all particletemplate/sphere 1 atom_type 1 density constant 1000 radius constant 0.01 +#fix pts1 all particletemplate/sphere 1 atom_type 1 density constant 1100 radius constant ${r_part} + +# fix pdd1 all particledistribution/discrete 6778 1 pts1 1.0 +# #fix pdd2 all particledistribution/discrete 6778 2 pts2 0.2 pts3 0.8 + +# # region insreg block 0.1 0.9 0.1 0.9 1.3 1.9 units box + + +# #fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once & +# # overlapcheck yes particles_in_region 350 region insreg ntry_mc 10000 +# fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once & + # overlapcheck yes volumefraction_region ${v_frac} region insreg ntry_mc 10000 +# #fix ins all insert/pack seed 1001 distributiontemplate pdd2 insert_every once & +# # overlapcheck yes volumefraction_region 0.05 region insreg ntry_mc 10000 +# #fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once & +# # overlapcheck yes particles_in_region 1 region insreg ntry_mc 10000 + +echo none + +run 1 diff --git a/apps/cpu/FallingSphere/in2.lbdem b/apps/cpu/FallingSphere/in2.lbdem new file mode 100644 index 0000000000000000000000000000000000000000..f11767f12f37fd34e218c528761c8a09e968660c --- /dev/null +++ b/apps/cpu/FallingSphere/in2.lbdem @@ -0,0 +1,25 @@ + +echo none + +timestep ${t_step} + +# thermo settings +fix ts all check/timestep/gran 10000 0.1 0.1 +compute 1 all erotate/sphere +thermo_style custom step atoms ke c_1 f_ts[1] f_ts[2] cpu +thermo 10000 +thermo_modify lost ignore norm no flush yes +compute_modify thermo_temp dynamic yes + +# particle dump +variable dmp_fname string ${dmp_dir}d_*.liggghts + +# dump dmp all custom ${dmp_stp} ${dmp_fname} & +# id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + +# dump dmp all custom ${dmp_stp} ${dmp_dir}d_*.liggghts & +# id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + +dump dmp all custom/vtk ${dmp_stp} ${dmp_dir}/liggghts/atom_*.vtk id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + +echo none \ No newline at end of file diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cfg b/apps/cpu/FlowAroundCylinder/cylinder.cfg index 0a7066ed9bc3351736c511d7aaeecaa04604fe55..97ece40e65d4ffe47a75e5377db49bd0018bbff6 100644 --- a/apps/cpu/FlowAroundCylinder/cylinder.cfg +++ b/apps/cpu/FlowAroundCylinder/cylinder.cfg @@ -1,6 +1,6 @@ -pathOut = d:/temp/cylinder_test +pathOut = d:/temp/cylinder_test_naming -numOfThreads = 4 +numOfThreads = 8 availMem = 15e9 refineLevel = 0 blockNx = 25 41 41 @@ -16,7 +16,7 @@ restartStep = 1000 cpStart = 1000 cpStep = 1000 -outTime = 10000 -endTime = 100000 +outTime = 10 +endTime = 100 nupsStep = 100 100 10000000 \ No newline at end of file diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cpp b/apps/cpu/FlowAroundCylinder/cylinder.cpp index 2f470d17dbac3600b2c42acede2bba9e6c45f872..5578ecb56b37e3b489e4c60d9a26adfa05e9b3d3 100644 --- a/apps/cpu/FlowAroundCylinder/cylinder.cpp +++ b/apps/cpu/FlowAroundCylinder/cylinder.cpp @@ -203,7 +203,7 @@ void run(string configname) SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID)); - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B)); + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M)); InteractorsHelper intHelper(grid, metisVisitor); intHelper.addInteractor(cylinderInt); intHelper.addInteractor(addWallYminInt); diff --git a/apps/cpu/HerschelBulkleyModel/hbflow.cpp b/apps/cpu/HerschelBulkleyModel/hbflow.cpp index 8483883aca772693758b9f52fcee53c54b84a1d5..b97942a1cd78c4ea9a5c73b4f24ddf4f6ae2edf6 100644 --- a/apps/cpu/HerschelBulkleyModel/hbflow.cpp +++ b/apps/cpu/HerschelBulkleyModel/hbflow.cpp @@ -218,7 +218,7 @@ void bflow(string configname) //////////////////////////////////////////// //METIS - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::RECURSIVE)); + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); //////////////////////////////////////////// /////delete solid blocks if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp index d86424869d5598adb2dfa61c1da2f6590bd79401..67f5a00ad49dcbe16a018e402f85ed02b3848650 100644 --- a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp +++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp @@ -159,10 +159,14 @@ void bflow(string configname) GbSystem3D::writeGeoObject(sphere.get(), outputPath + "/geo/sphere", WbWriterVtkXmlBinary::getInstance()); SPtr<D3Q27Interactor> sphereInt(new D3Q27Interactor(sphere, grid, noSlipBCAdapter, Interactor3D::SOLID)); + //////////////////////////////////////////// + //METIS + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY)); + //////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //restart SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart)); - SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, outputPath, comm)); + SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm)); restartCoProcessor->setLBMKernel(kernel); restartCoProcessor->setBCProcessor(bcProc); //restartCoProcessor->setNu(k); @@ -239,7 +243,7 @@ void bflow(string configname) //////////////////////////////////////////// //METIS - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY)); //////////////////////////////////////////// /////delete solid blocks if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); diff --git a/apps/cpu/JetBreakup/JetBreakup.cfg b/apps/cpu/JetBreakup/JetBreakup.cfg index 22d20f7d5667ae30c2f3405334566c4d109e7d9f..eef35c305065efe01befab99f96f385a32d932bc 100644 --- a/apps/cpu/JetBreakup/JetBreakup.cfg +++ b/apps/cpu/JetBreakup/JetBreakup.cfg @@ -1,39 +1,35 @@ -pathname = d:/temp/Multiphase -pathGeo = d:/Projects/VirtualFluids-Multiphase/source/Applications/Multiphase/backup -geoFile = JetBreakup2.ASCII.stl -numOfThreads = 4 +pathname = f:/Multiphase/JetBreakupCaseCSThreeNonConservativePressShortCorrPhaseOutflow1 +#pathGeo = d:/Projects/VirtualFluids-Multiphase/source/Applications/Multiphase/backup +pathGeo = d:/Projects/VirtualFluidsCombined/apps/cpu/Multiphase/backup +#geoFile = JetBreakupR.ASCII.stl +#geoFile = inlet1.stl +geoFile = tubeTransformed.stl + +numOfThreads = 16 availMem = 10e9 #Grid - -#boundingBox = -1.0 121.0 0.5 629.0 -1.0 121.0 #(Jet Breakup) (Original with inlet length) -#boundingBox = -60.5 60.5 -1.0 -201.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length) -#blocknx = 22 20 22 - -boundingBox = -60.5 60.5 -1.0 -21.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length) -blocknx = 22 20 22 - - -dx = 0.5 -refineLevel = 0 +blocknx = 25 25 25 #Simulation -uLB = 0.05 #inlet velocity -uF2 = 0.0001 -Re = 10 -nuL = 1.0e-5 #!1e-2 -nuG = 1.16e-4 #!1e-2 -densityRatio = 10 #30 -sigma = 4.66e-3 #surface tension 1e-4 ./. 1e-5 -interfaceThickness = 5 -radius = 615.0 (Jet Breakup) +case = 3 +U_LB = 0.01 #inlet velocity +#uF2 = 0.0001 +#Re = 10 +#nuL =0.00016922169811320757# 1.0e-5 #!1e-2 +#nuG =0.00016922169811320757# 1.16e-4 #!1e-2 +#densityRatio = 24.579710144927535 +#sigma = 1.7688679245283022e-07 +interfaceWidth = 5 + +D = 0.0001 # m +D_LB = 50 + contactAngle = 110.0 -gravity = 0.0 -#gravity = -5.04e-6 phi_L = 0.0 phi_H = 1.0 Phase-field Relaxation = 0.6 -Mobility = 0.02 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1 +Mobility = 0.02 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1 logToFile = false @@ -44,5 +40,5 @@ restartStep = 100000 cpStart = 100000 cpStep = 100000 -outTime = 1 -endTime = 200000000 \ No newline at end of file +outTime = 1 #205 +endTime = 100000#36000 \ No newline at end of file diff --git a/apps/cpu/JetBreakup/JetBreakup.cpp b/apps/cpu/JetBreakup/JetBreakup.cpp index eb7d705537e4307e4ca1066ac9d06dafb72449f4..01d4cc3eb5b7d46118d40bc5fbb98b16e57d82eb 100644 --- a/apps/cpu/JetBreakup/JetBreakup.cpp +++ b/apps/cpu/JetBreakup/JetBreakup.cpp @@ -1,516 +1,626 @@ #include <iostream> +#include <memory> #include <string> #include "VirtualFluids.h" using namespace std; +void setInflowBC(double x1, double x2, double x3, double radius, int dir) +{ + +} void run(string configname) { - try - { - vf::basics::ConfigurationFile config; - config.load(configname); - - string pathname = config.getString("pathname"); - string pathGeo = config.getString("pathGeo"); - string geoFile = config.getString("geoFile"); - int numOfThreads = config.getInt("numOfThreads"); - vector<int> blocknx = config.getVector<int>("blocknx"); - vector<double> boundingBox = config.getVector<double>("boundingBox"); - //vector<double> length = config.getVector<double>("length"); - double uLB = config.getDouble("uLB"); - double uF2 = config.getDouble("uF2"); - double nuL = config.getDouble("nuL"); - double nuG = config.getDouble("nuG"); - double densityRatio = config.getDouble("densityRatio"); - double sigma = config.getDouble("sigma"); - int interfaceThickness = config.getInt("interfaceThickness"); - double radius = config.getDouble("radius"); - double theta = config.getDouble("contactAngle"); - double gr = config.getDouble("gravity"); - double phiL = config.getDouble("phi_L"); - double phiH = config.getDouble("phi_H"); - double tauH = config.getDouble("Phase-field Relaxation"); - double mob = config.getDouble("Mobility"); - - - double endTime = config.getDouble("endTime"); - double outTime = config.getDouble("outTime"); - double availMem = config.getDouble("availMem"); - int refineLevel = config.getInt("refineLevel"); - double Re = config.getDouble("Re"); - double dx = config.getDouble("dx"); - bool logToFile = config.getBool("logToFile"); - double restartStep = config.getDouble("restartStep"); - double cpStart = config.getValue<double>("cpStart"); - double cpStep = config.getValue<double>("cpStep"); - bool newStart = config.getValue<bool>("newStart"); - - double beta = 12 * sigma / interfaceThickness; - double kappa = 1.5 * interfaceThickness * sigma; - - CommunicatorPtr comm = vf::mpi::MPICommunicator::getInstance(); - int myid = comm->getProcessID(); - - if (logToFile) - { + try { + + // Sleep(30000); + + vf::basics::ConfigurationFile config; + config.load(configname); + + string pathname = config.getValue<string>("pathname"); + //string pathGeo = config.getValue<string>("pathGeo"); + //string geoFile = config.getValue<string>("geoFile"); + int numOfThreads = config.getValue<int>("numOfThreads"); + vector<int> blocknx = config.getVector<int>("blocknx"); + //vector<double> boundingBox = config.getVector<double>("boundingBox"); + // vector<double> length = config.getVector<double>("length"); + double U_LB = config.getValue<double>("U_LB"); + // double uF2 = config.getValue<double>("uF2"); + //double nuL = config.getValue<double>("nuL"); + //double nuG = config.getValue<double>("nuG"); + //double densityRatio = config.getValue<double>("densityRatio"); + //double sigma = config.getValue<double>("sigma"); + int interfaceWidth = config.getValue<int>("interfaceWidth"); + //double D = config.getValue<double>("D"); + double theta = config.getValue<double>("contactAngle"); + double D_LB = config.getValue<double>("D_LB"); + double phiL = config.getValue<double>("phi_L"); + double phiH = config.getValue<double>("phi_H"); + double tauH = config.getValue<double>("Phase-field Relaxation"); + double mob = config.getValue<double>("Mobility"); + + double endTime = config.getValue<double>("endTime"); + double outTime = config.getValue<double>("outTime"); + double availMem = config.getValue<double>("availMem"); + //int refineLevel = config.getValue<int>("refineLevel"); + //double Re = config.getValue<double>("Re"); + + bool logToFile = config.getValue<bool>("logToFile"); + double restartStep = config.getValue<double>("restartStep"); + double cpStart = config.getValue<double>("cpStart"); + double cpStep = config.getValue<double>("cpStep"); + bool newStart = config.getValue<bool>("newStart"); + + + + int caseN = config.getValue<int>("case"); + + SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + if (myid == 0) + UBLOG(logINFO, "Jet Breakup: Start!"); + + if (logToFile) { #if defined(__unix__) - if (myid == 0) - { - const char* str = pathname.c_str(); - mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - } -#endif - - if (myid == 0) - { - stringstream logFilename; - logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt"; - UbLog::output_policy::setStream(logFilename.str()); - } - } - - //Sleep(30000); - - LBMReal dLB; // = length[1] / dx; - LBMReal rhoLB = 0.0; - LBMReal nuLB = nuL; //(uLB*dLB) / Re; - - LBMUnitConverterPtr conv = LBMUnitConverterPtr(new LBMUnitConverter()); - - const int baseLevel = 0; - - - - Grid3DPtr grid(new Grid3D(comm)); - //grid->setPeriodicX1(true); - //grid->setPeriodicX2(true); - //grid->setPeriodicX3(true); - ////////////////////////////////////////////////////////////////////////// - //restart - UbSchedulerPtr rSch(new UbScheduler(cpStep, cpStart)); - //RestartCoProcessor rp(grid, rSch, comm, pathname, RestartCoProcessor::TXT); - MPIIORestart1CoProcessor rcp(grid, rSch, pathname, comm); - ////////////////////////////////////////////////////////////////////////// - - - - - - mu::Parser fctF1; - //fctF1.SetExpr("vy1*(1-((x1-x0)^2+(x3-z0)^2)/(R^2))"); - //fctF1.SetExpr("vy1*(1-(sqrt((x1-x0)^2+(x3-z0)^2)/R))^0.1"); - fctF1.SetExpr("vy1"); - fctF1.DefineConst("vy1", -uLB); - fctF1.DefineConst("R", 8.0); - fctF1.DefineConst("x0", 0.0); - fctF1.DefineConst("z0", 0.0); - - - if (newStart) - { - - //bounding box - /*double g_minX1 = 0.0; - double g_minX2 = -length[1] / 2.0; - double g_minX3 = -length[2] / 2.0; - - double g_maxX1 = length[0]; - double g_maxX2 = length[1] / 2.0; - double g_maxX3 = length[2] / 2.0;*/ - - double g_minX1 = boundingBox[0]; - double g_minX2 = boundingBox[2]; - double g_minX3 = boundingBox[4]; - - double g_maxX1 = boundingBox[1]; - double g_maxX2 = boundingBox[3]; - double g_maxX3 = boundingBox[5]; - - //geometry - - //GbObject3DPtr innerCube(new GbCuboid3D(g_minX1+2, g_minX2+2, g_minX3+2, g_maxX1-2, g_maxX2-2, g_maxX3-2)); - - //GbObject3DPtr cylinder1(new GbCylinder3D(g_minX1 - 2.0*dx, g_maxX2/2, g_maxX3/2, g_minX1 + 12.0*dx, g_maxX2/2, g_maxX3/2, radius)); - //GbObject3DPtr cylinder2(new GbCylinder3D(g_minX1 + 12.0*dx, g_maxX2/2, g_maxX3/2, g_maxX1 + 2.0*dx, g_maxX2/2, g_maxX3/2, dLB / 2.0)); - - //GbObject3DPtr cylinder(new GbCylinder3D(g_minX1 - 2.0*dx, g_maxX2/2, g_maxX3/2, g_maxX1 + 2.0*dx, g_maxX2/2, g_maxX3/2, dLB / 2.0)); - //GbObject3DPtr cylinders(new GbObject3DManager()); - //GbObject3DPtr cylinders1(new GbObjectGroup3D()); - - - - - GbObject3DPtr gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); - if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); - - GbTriFaceMesh3DPtr cylinder; - if (myid == 0) UBLOG(logINFO, "Read geoFile:start"); - //cylinder = GbTriFaceMesh3DPtr(GbTriFaceMesh3DCreator::getInstance()->readMeshFromSTLFile2(pathGeo+"/"+geoFile, "geoCylinders", GbTriFaceMesh3D::KDTREE_SAHPLIT, false)); - cylinder = GbTriFaceMesh3DPtr(GbTriFaceMesh3DCreator::getInstance()->readMeshFromSTLFile(pathGeo + "/" + geoFile, "geoCylinders", GbTriFaceMesh3D::KDTREE_SAHPLIT)); - GbSystem3D::writeGeoObject(cylinder.get(), pathname + "/geo/Stlgeo", WbWriterVtkXmlBinary::getInstance()); - - - - //inflow - //GbCuboid3DPtr geoInflowF1(new GbCuboid3D(40.0, 628.0, 40.0, 80, 631.0, 80.0)); // For JetBreakup (Original) - //GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1-2.0*dx, g_minX2-2.0*dx, g_minX3-2.0*dx, g_maxX1+2.0*dx, g_minX2+2.0*dx, g_maxX3+2.0*dx)); - //if (myid == 0) GbSystem3D::writeGeoObject(geoInflowF1.get(), pathname + "/geo/geoInflowF1", WbWriterVtkXmlASCII::getInstance()); - - - ////outflow - ////GbCuboid3DPtr geoOutflow(new GbCuboid3D(-1.0, -1, -1.0, 121.0, 1.0, 121.0)); // For JetBreakup (Original) - //GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_minX1-2.0*dx, g_maxX2, g_minX3-2.0*dx, g_maxX1+2.0*dx, g_maxX2+2.0*dx, g_maxX3+2.0*dx)); - //if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance()); - - GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1, g_minX2-0.5*dx, g_minX3, g_maxX1, g_minX2 - 1.0*dx, g_maxX3)); - if (myid==0) GbSystem3D::writeGeoObject(geoInflowF1.get(), pathname+"/geo/geoInflowF1", WbWriterVtkXmlASCII::getInstance()); - - - //outflow - //GbCuboid3DPtr geoOutflow(new GbCuboid3D(-1.0, -1, -1.0, 121.0, 1.0, 121.0)); // For JetBreakup (Original) - GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_minX1, g_maxX2-1*dx, g_minX3, g_maxX1, g_maxX2, g_maxX3)); - if (myid==0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname+"/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance()); - - double blockLength = blocknx[0] * dx; - - - - if (myid == 0) - { - UBLOG(logINFO, "uLb = " << uLB); - UBLOG(logINFO, "rho = " << rhoLB); - UBLOG(logINFO, "nuLb = " << nuLB); - UBLOG(logINFO, "Re = " << Re); - UBLOG(logINFO, "dx = " << dx); - UBLOG(logINFO, "Preprocess - start"); - } - - grid->setDeltaX(dx); - grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); - - grid->setPeriodicX1(false); - grid->setPeriodicX2(false); - grid->setPeriodicX3(false); - - - - GenBlocksGridVisitor genBlocks(gridCube); - grid->accept(genBlocks); - - - - - //BC Adapter - ////////////////////////////////////////////////////////////////////////////// - BCAdapterPtr noSlipBCAdapter(new NoSlipBCAdapter()); - noSlipBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new NoSlipBCAlgorithmMultiphase())); - - - BCAdapterPtr denBCAdapter(new DensityBCAdapter(rhoLB)); - denBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new NonReflectingOutflowBCAlgorithmMultiphase())); - - double r = 5.0; //boost::dynamic_pointer_cast<GbCylinder3D>(cylinder)->getRadius(); - double cx1 = g_minX1; - double cx2 = 0.0; //cylinder->getX2Centroid(); - double cx3 = 0.0; //cylinder->getX3Centroid(); - - - - mu::Parser fctPhi_F1; - fctPhi_F1.SetExpr("phiH"); - fctPhi_F1.DefineConst("phiH", phiH); - - mu::Parser fctPhi_F2; - fctPhi_F2.SetExpr("phiL"); - fctPhi_F2.DefineConst("phiL", phiL); - - mu::Parser fctvel_F2_init; - fctvel_F2_init.SetExpr("U"); - fctvel_F2_init.DefineConst("U", 0); - - //fct.SetExpr("U"); - //fct.DefineConst("U", uLB); - //BCAdapterPtr velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST)); - - BCAdapterPtr velBCAdapterF1(new VelocityBCAdapterMultiphase(false, true, false, fctF1, phiH, 0.0, endTime)); - - //BCAdapterPtr velBCAdapterF2_1_init(new VelocityBCAdapterMultiphase(false, false, true, fctF2_1, phiH, 0.0, endTime)); - //BCAdapterPtr velBCAdapterF2_2_init(new VelocityBCAdapterMultiphase(false, false, true, fctF2_2, phiH, 0.0, endTime)); - - //BCAdapterPtr velBCAdapterF2_1_init(new VelocityBCAdapterMultiphase(false, false, true, fctvel_F2_init, phiL, 0.0, endTime)); - //BCAdapterPtr velBCAdapterF2_2_init(new VelocityBCAdapterMultiphase(false, false, true, fctvel_F2_init, phiL, 0.0, endTime)); - - velBCAdapterF1->setBcAlgorithm(BCAlgorithmPtr(new VelocityBCAlgorithmMultiphase())); - //velBCAdapterF2_1_init->setBcAlgorithm(BCAlgorithmPtr(new VelocityBCAlgorithmMultiphase())); - //velBCAdapterF2_2_init->setBcAlgorithm(BCAlgorithmPtr(new VelocityBCAlgorithmMultiphase())); - - - //velBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new VelocityWithDensityBCAlgorithm())); - //mu::Parser fct; - //fct.SetExpr("U"); - //fct.DefineConst("U", uLB); - //BCAdapterPtr velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST)); - //velBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new NonReflectingVelocityBCAlgorithm())); - - - ////////////////////////////////////////////////////////////////////////////////// - //BC visitor - BoundaryConditionsBlockVisitorMultiphase bcVisitor; - bcVisitor.addBC(noSlipBCAdapter); - bcVisitor.addBC(denBCAdapter); - bcVisitor.addBC(velBCAdapterF1); - //bcVisitor.addBC(velBCAdapterF2_1_init); - //bcVisitor.addBC(velBCAdapterF2_2_init); - - - - WriteBlocksCoProcessorPtr ppblocks(new WriteBlocksCoProcessor(grid, UbSchedulerPtr(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); - - ppblocks->process(0); - - Interactor3DPtr tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBCAdapter, Interactor3D::SOLID)); - - D3Q27InteractorPtr inflowF1Int = D3Q27InteractorPtr(new D3Q27Interactor(geoInflowF1, grid, velBCAdapterF1, Interactor3D::SOLID)); - - //D3Q27InteractorPtr inflowF2_1Int_init = D3Q27InteractorPtr(new D3Q27Interactor(geoInflowF2_1, grid, velBCAdapterF2_1_init, Interactor3D::SOLID)); - - //D3Q27InteractorPtr inflowF2_2Int_init = D3Q27InteractorPtr(new D3Q27Interactor(geoInflowF2_2, grid, velBCAdapterF2_2_init, Interactor3D::SOLID)); - - D3Q27InteractorPtr outflowInt = D3Q27InteractorPtr(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID)); - - //SetSolidBlockVisitor visitor1(inflowF2_1Int, SetSolidBlockVisitor::BC); - //grid->accept(visitor1); - //SetSolidBlockVisitor visitor2(inflowF2_2Int, SetSolidBlockVisitor::BC); - //grid->accept(visitor2); - - - Grid3DVisitorPtr metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW)); - InteractorsHelper intHelper(grid, metisVisitor); - intHelper.addInteractor(tubes); - intHelper.addInteractor(inflowF1Int); - intHelper.addInteractor(outflowInt); - intHelper.selectBlocks(); - - - ppblocks->process(0); - ppblocks.reset(); - - unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks(); - int ghostLayer = 3; - unsigned long long numberOfNodesPerBlock = (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]); - unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock; - unsigned long long numberOfNodesPerBlockWithGhostLayer = numberOfBlocks * (blocknx[0] + ghostLayer) * (blocknx[1] + ghostLayer) * (blocknx[2] + ghostLayer); - double needMemAll = double(numberOfNodesPerBlockWithGhostLayer * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4)); - double needMem = needMemAll / double(comm->getNumberOfProcesses()); - - if (myid == 0) - { - UBLOG(logINFO, "Number of blocks = " << numberOfBlocks); - UBLOG(logINFO, "Number of nodes = " << numberOfNodes); - int minInitLevel = grid->getCoarsestInitializedLevel(); - int maxInitLevel = grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - int nobl = grid->getNumberOfBlocks(level); - UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl); - UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock); + if (myid == 0) { + const char *str = pathname.c_str(); + mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); } - UBLOG(logINFO, "Necessary memory = " << needMemAll << " bytes"); - UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes"); - UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); - } - - LBMKernelPtr kernel; - - kernel = LBMKernelPtr(new MultiphaseCumulantLBMKernel(blocknx[0], blocknx[1], blocknx[2], MultiphaseCumulantLBMKernel::NORMAL)); - - kernel->setWithForcing(true); - kernel->setForcingX1(0.0); - kernel->setForcingX2(gr); - kernel->setForcingX3(0.0); - - kernel->setPhiL(phiL); - kernel->setPhiH(phiH); - kernel->setPhaseFieldRelaxation(tauH); - kernel->setMobility(mob); - - BCProcessorPtr bcProc(new BCProcessor()); - //BCProcessorPtr bcProc(new ThinWallBCProcessor()); - - kernel->setBCProcessor(bcProc); - - SetKernelBlockVisitorMultiphase kernelVisitor(kernel, nuL, nuG, densityRatio, beta, kappa, theta, availMem, needMem); - - grid->accept(kernelVisitor); - - if (refineLevel > 0) - { - SetUndefinedNodesBlockVisitor undefNodesVisitor; - grid->accept(undefNodesVisitor); - } - - //inflowF2_1Int->initInteractor(); - //inflowF2_2Int->initInteractor(); - - intHelper.setBC(); +#endif - - grid->accept(bcVisitor); - - //initialization of distributions - LBMReal x1c = radius; //g_minX1; //radius; //19; //(g_maxX1+g_minX1)/2; - LBMReal x2c = (g_maxX2 + g_minX2) / 2; //g_minX2 + 2; - LBMReal x3c = (g_maxX3 + g_minX3) / 2; - mu::Parser fct1; - - //fct1.SetExpr("0.5-0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)"); - //fct1.SetExpr("phiM-phiM*tanh((sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/(interfaceThickness*phiM))"); - - //fct1.SetExpr("0.5*(phiH + phiL)-0.5*(phiH - phiL)*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)"); - - - //fct1.SetExpr("0.5*(phiH + phiL) + 0.5*(phiH - phiL)*tanh(2*((x2-radius))/interfaceThickness)"); - fct1.SetExpr("phiL"); - fct1.DefineConst("x1c", x1c); - fct1.DefineConst("x2c", x2c); - fct1.DefineConst("x3c", x3c); - fct1.DefineConst("phiL", phiL); - fct1.DefineConst("phiH", phiH); - fct1.DefineConst("radius", radius); - fct1.DefineConst("interfaceThickness", interfaceThickness); - - mu::Parser fct2; - //fct2.SetExpr("vx1*(1-((x2-y0)^2+(x3-z0)^2)/(R^2))"); - fct2.SetExpr("vx1"); - fct2.DefineConst("R", 10.0); - fct2.DefineConst("vx1", uLB); - fct2.DefineConst("y0", 1.0); - fct2.DefineConst("z0", 31.0); - /*fct2.SetExpr("0.5*uLB-uLB*0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)"); - fct2.DefineConst("uLB", uLB); - fct2.DefineConst("x1c", x1c); - fct2.DefineConst("x2c", x2c); - fct2.DefineConst("x3c", x3c); - fct2.DefineConst("radius", radius); - fct2.DefineConst("interfaceThickness", interfaceThickness);*/ - - - InitDistributionsBlockVisitorMultiphase initVisitor(densityRatio, interfaceThickness, radius); - initVisitor.setPhi(fct1); - //initVisitor.setVx1(fct2); - grid->accept(initVisitor); - - //set connectors - InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor()); - //InterpolationProcessorPtr iProcessor(new CompressibleOffsetInterpolationProcessor()); - SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor); - //ConnectorFactoryPtr factory(new Block3DConnectorFactory()); - //ConnectorBlockVisitor setConnsVisitor(comm, nuLB, iProcessor, factory); - grid->accept(setConnsVisitor); - - //domain decomposition for threads - //PQueuePartitioningGridVisitor pqPartVisitor(numOfThreads); - //grid->accept(pqPartVisitor); - - - - - //boundary conditions grid - { - UbSchedulerPtr geoSch(new UbScheduler(1)); - WriteBoundaryConditionsCoProcessorPtr ppgeo( - new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); - ppgeo->process(0); - ppgeo.reset(); - } - - if (myid == 0) UBLOG(logINFO, "Preprocess - end"); - } - else - { - if (myid == 0) - { + if (myid == 0) { + stringstream logFilename; + logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt"; + UbLog::output_policy::setStream(logFilename.str()); + } + } + + // Sleep(30000); + + double rho_h=0, rho_l=0, r_rho=0, mu_h=0, /*mu_l,*/ Uo=0, D=0, sigma=0; + + switch (caseN) { + case 1: + //density of heavy fluid (kg/m^3) + rho_h = 848; + //density of light fluid (kg/m^3) + rho_l = 34.5; + //density ratio + r_rho = rho_h / rho_l; + //dynamic viscosity of heavy fluid (Pa � s) + mu_h = 2.87e-3; + //dynamic viscosity of light fluid (Pa � s) + //mu_l = 1.97e-5; + //velocity (m/s) + Uo = 100; + //diameter of jet (m) + D = 0.0001; + //surface tension (N/m) + sigma = 0.03; + break; + case 2: + // density of heavy fluid (kg/m^3) + rho_h = 848; + // density of light fluid (kg/m^3) + rho_l = 1.205; + // density ratio + r_rho = rho_h / rho_l; + // dynamic viscosity of heavy fluid (Pa � s) + mu_h = 2.87e-3; + // dynamic viscosity of light fluid (Pa � s) + //mu_l = 1.84e-5; + // velocity (m/s) + Uo = 200; + // diameter of jet (m) + D = 0.0001; + // surface tension (N/m) + sigma = 0.03; + break; + case 3: + // density of heavy fluid (kg/m^3) + rho_h = 1000; + // density of light fluid (kg/m^3) + rho_l = 1.0; + // density ratio + r_rho = rho_h / rho_l; + // dynamic viscosity of heavy fluid (Pa � s) + mu_h = 2.87e-3; + // dynamic viscosity of light fluid (Pa � s) + //mu_l = 1.84e-5; + // velocity (m/s) + Uo = 200; + // diameter of jet (m) + D = 0.0001; + // surface tension (N/m) + sigma = 0.03; + break; + } + + double Re = rho_h * Uo * D / mu_h; + double We = rho_h * Uo * Uo * D / sigma; + + double dx = D / D_LB; + double nu_h = U_LB * D_LB / Re; + double nu_l = nu_h; + + double rho_h_LB = 1; + //surface tension + double sigma_LB = rho_h_LB * U_LB * U_LB * D_LB / We; + + // LBMReal dLB = 0; // = length[1] / dx; + LBMReal rhoLB = 0.0; + //LBMReal nuLB = nu_l; //(uLB*dLB) / Re; + + double beta = 12.0 * sigma_LB / interfaceWidth; + double kappa = 1.5 * interfaceWidth * sigma_LB; + + if (myid == 0) { UBLOG(logINFO, "Parameters:"); - UBLOG(logINFO, "uLb = " << uLB); + UBLOG(logINFO, "U_LB = " << U_LB); UBLOG(logINFO, "rho = " << rhoLB); - UBLOG(logINFO, "nuLb = " << nuLB); + UBLOG(logINFO, "nu_l = " << nu_l); + UBLOG(logINFO, "nu_h = " << nu_h); UBLOG(logINFO, "Re = " << Re); + UBLOG(logINFO, "We = " << We); UBLOG(logINFO, "dx = " << dx); - UBLOG(logINFO, "number of levels = " << refineLevel + 1); + UBLOG(logINFO, "sigma = " << sigma); + UBLOG(logINFO, "density ratio = " << r_rho); + // UBLOG(logINFO, "number of levels = " << refineLevel + 1); UBLOG(logINFO, "numOfThreads = " << numOfThreads); UBLOG(logINFO, "path = " << pathname); - } - - rcp.restart((int)restartStep); - grid->setTimeStep(restartStep); - - //BCAdapterPtr velBCAdapter(new VelocityBCAdapter()); - //velBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new VelocityBCAlgorithm())); - //velBCAdapter->setBcAlgorithm(BCAlgorithmPtr(new VelocityWithDensityBCAlgorithm())); - //bcVisitor.addBC(velBCAdapter); - //grid->accept(bcVisitor); - - //set connectors - //InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor()); - InterpolationProcessorPtr iProcessor(new CompressibleOffsetInterpolationProcessor()); - SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor); - grid->accept(setConnsVisitor); - - if (myid == 0) UBLOG(logINFO, "Restart - end"); - } - UbSchedulerPtr visSch(new UbScheduler(outTime)); - WriteMacroscopicQuantitiesCoProcessor pp(grid, visSch, pathname, WbWriterVtkXmlASCII::getInstance(), conv, comm); - - UbSchedulerPtr nupsSch(new UbScheduler(10, 30, 100)); - NUPSCounterCoProcessor npr(grid, nupsSch, numOfThreads, comm); - - - - - + } + + SPtr<LBMUnitConverter> conv(new LBMUnitConverter()); + + // const int baseLevel = 0; + + SPtr<LBMKernel> kernel; + + // kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel()); + //kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel()); + kernel = SPtr<LBMKernel>(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel()); + + kernel->setWithForcing(true); + kernel->setForcingX1(0.0); + kernel->setForcingX2(0.0); + kernel->setForcingX3(0.0); + + kernel->setPhiL(phiL); + kernel->setPhiH(phiH); + kernel->setPhaseFieldRelaxation(tauH); + kernel->setMobility(mob); + + // nuL, nuG, densityRatio, beta, kappa, theta, + + kernel->setCollisionFactorMultiphase(nu_h, nu_l); + kernel->setDensityRatio(r_rho); + kernel->setMultiphaseModelParameters(beta, kappa); + kernel->setContactAngle(theta); + kernel->setInterfaceWidth(interfaceWidth); + //dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(0.0); + + SPtr<BCProcessor> bcProc(new BCProcessor()); + // BCProcessorPtr bcProc(new ThinWallBCProcessor()); + + kernel->setBCProcessor(bcProc); + + SPtr<Grid3D> grid(new Grid3D(comm)); + // grid->setPeriodicX1(true); + // grid->setPeriodicX2(true); + // grid->setPeriodicX3(true); + grid->setGhostLayerWidth(2); + + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor( + comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); + + ////////////////////////////////////////////////////////////////////////// + // restart + SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart)); + // SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm)); + SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm)); + // SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm)); + // rcp->setNu(nuLB); + // rcp->setNuLG(nuL, nuG); + // rcp->setDensityRatio(densityRatio); + + rcp->setLBMKernel(kernel); + rcp->setBCProcessor(bcProc); + ////////////////////////////////////////////////////////////////////////// + // BC Adapter + ////////////////////////////////////////////////////////////////////////////// + mu::Parser fctF1; + // fctF1.SetExpr("vy1*(1-((x1-x0)^2+(x3-z0)^2)/(R^2))"); + // fctF1.SetExpr("vy1*(1-(sqrt((x1-x0)^2+(x3-z0)^2)/R))^0.1"); + fctF1.SetExpr("vy1"); + fctF1.DefineConst("vy1", 0.0); + fctF1.DefineConst("R", 8.0); + fctF1.DefineConst("x0", 0.0); + fctF1.DefineConst("z0", 0.0); + // SPtr<BCAdapter> velBCAdapterF1( + // new MultiphaseVelocityBCAdapter(false, true, false, fctF1, phiH, 0.0, BCFunction::INFCONST)); + + mu::Parser fctF2; + fctF2.SetExpr("vy1"); + fctF2.DefineConst("vy1", U_LB); + + double startTime = 1; + SPtr<BCAdapter> velBCAdapterF1( + new MultiphaseVelocityBCAdapter(true, false, false, fctF1, phiH, 0.0, startTime)); + SPtr<BCAdapter> velBCAdapterF2( + new MultiphaseVelocityBCAdapter(true, false, false, fctF2, phiH, startTime, endTime)); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm())); + + SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB)); + denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm())); + + mu::Parser fctPhi_F1; + fctPhi_F1.SetExpr("phiH"); + fctPhi_F1.DefineConst("phiH", phiH); + + mu::Parser fctPhi_F2; + fctPhi_F2.SetExpr("phiL"); + fctPhi_F2.DefineConst("phiL", phiL); + + mu::Parser fctvel_F2_init; + fctvel_F2_init.SetExpr("U"); + fctvel_F2_init.DefineConst("U", 0); + + velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm())); + ////////////////////////////////////////////////////////////////////////////////// + // BC visitor + MultiphaseBoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + bcVisitor.addBC(denBCAdapter); // Ohne das BB? + bcVisitor.addBC(velBCAdapterF1); + + //SPtr<D3Q27Interactor> inflowF1Int; + //SPtr<D3Q27Interactor> cylInt; + + SPtr<D3Q27Interactor> inflowInt; + + if (newStart) { + + // if (newStart) { + + // bounding box + double g_minX1 = 0; + double g_minX2 = 0; + double g_minX3 = 0; + + //double g_maxX1 = 8.0*D; + //double g_maxX2 = 2.5*D; + //double g_maxX3 = 2.5*D; + + double g_maxX1 = 1.0 * D; // 8.0 * D; + double g_maxX2 = 2.0 * D; + double g_maxX3 = 2.0 * D; + + // geometry + SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + if (myid == 0) + GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", + WbWriterVtkXmlBinary::getInstance()); + + //if (myid == 0) + // UBLOG(logINFO, "Read geoFile:start"); + //SPtr<GbTriFaceMesh3D> cylinder = make_shared<GbTriFaceMesh3D>(); + //cylinder->readMeshFromSTLFileBinary(pathGeo + "/" + geoFile, false); + //GbSystem3D::writeGeoObject(cylinder.get(), pathname + "/geo/Stlgeo", WbWriterVtkXmlBinary::getInstance()); + //if (myid == 0) + // UBLOG(logINFO, "Read geoFile:stop"); + // inflow + // GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1, g_minX2 - 0.5 * dx, g_minX3, g_maxX1, g_minX2 - 1.0 * + // dx, g_maxX3)); + //GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1 * 0.5 - dx, g_minX2 - dx, g_minX3 * 0.5 - dx, + // g_maxX1 * 0.5 + dx, g_minX2, g_maxX3 * 0.5 + dx)); + //if (myid == 0) + // GbSystem3D::writeGeoObject(geoInflowF1.get(), pathname + "/geo/geoInflowF1", + // WbWriterVtkXmlASCII::getInstance()); + + GbCylinder3DPtr geoInflow(new GbCylinder3D(g_minX1 - 2.0*dx, g_maxX2 / 2.0, g_maxX3 / 2.0, g_minX1, + g_maxX2 / 2.0, + g_maxX3 / 2.0, D / 2.0)); + if (myid == 0) + GbSystem3D::writeGeoObject(geoInflow.get(), pathname + "/geo/geoInflow", + WbWriterVtkXmlASCII::getInstance()); + + GbCylinder3DPtr geoSolid(new GbCylinder3D(g_minX1 - 2.0 * dx, g_maxX2 / 2.0, g_maxX3 / 2.0, g_minX1-dx, + g_maxX2 / 2.0, g_maxX3 / 2.0, 1.5*D / 2.0)); + if (myid == 0) + GbSystem3D::writeGeoObject(geoSolid.get(), pathname + "/geo/geoSolid", + WbWriterVtkXmlASCII::getInstance()); + + + // GbCylinder3DPtr cylinder2( + // new GbCylinder3D(0.0, g_minX2 - 2.0 * dx / 2.0, 0.0, 0.0, g_minX2 + 4.0 * dx, 0.0, 8.0+2.0*dx)); + // if (myid == 0) + // GbSystem3D::writeGeoObject(cylinder2.get(), pathname + "/geo/cylinder2", + // WbWriterVtkXmlASCII::getInstance()); + // outflow + // GbCuboid3DPtr geoOutflow(new GbCuboid3D(-1.0, -1, -1.0, 121.0, 1.0, 121.0)); // For JetBreakup (Original) + // GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_minX1, g_maxX2 - 40 * dx, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_maxX1, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3)); + if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance()); + + // double blockLength = blocknx[0] * dx; + + if (myid == 0) { + UBLOG(logINFO, "Preprocess - start"); + } - //UbSchedulerPtr bcSch(new UbScheduler(1, 12000, 12000)); - //TimeDependentBCCoProcessorPtr inflowF2 (new TimeDependentBCCoProcessor(grid,bcSch)); - //inflowF2->addInteractor(inflowF2_1Int); - //inflowF2->addInteractor(inflowF2_2Int); + grid->setDeltaX(dx); + grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); + + grid->setPeriodicX1(false); + grid->setPeriodicX2(false); + grid->setPeriodicX3(false); + + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor( + grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); + + //SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBCAdapter, + // Interactor3D::SOLID, Interactor3D::POINTS)); + + // inflowF1Int = + // SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, noSlipBCAdapter, Interactor3D::SOLID)); + // inflowF1Int->addBCAdapter(velBCAdapterF2); + + SPtr<D3Q27Interactor> outflowInt(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID)); + + // Create boundary conditions geometry + GbCuboid3DPtr wallXmin( + new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_minX1, g_maxX2 + 2.0*dx, g_maxX3)); + GbSystem3D::writeGeoObject(wallXmin.get(), pathname + "/geo/wallXmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallXmax( + new GbCuboid3D(g_maxX1, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3)); + GbSystem3D::writeGeoObject(wallXmax.get(), pathname + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallZmin( + new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_minX3)); + GbSystem3D::writeGeoObject(wallZmin.get(), pathname + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallZmax( + new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_maxX3, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3 + 2.0*dx)); + GbSystem3D::writeGeoObject(wallZmax.get(), pathname + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallYmin( + new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_minX2, g_maxX3)); + GbSystem3D::writeGeoObject(wallYmin.get(), pathname + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallYmax( + new GbCuboid3D(g_minX1 - 2.0*dx, g_maxX2, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3)); + GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance()); + + // Add boundary conditions to grid generator + SPtr<D3Q27Interactor> wallXminInt( + new D3Q27Interactor(wallXmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallXmaxInt( + new D3Q27Interactor(wallXmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallZminInt( + new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallZmaxInt( + new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallYminInt( + new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallYmaxInt( + new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + //cylInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, velBCAdapterF1, Interactor3D::SOLID)); + //cylInt->addBCAdapter(velBCAdapterF2); + // SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBCAdapter, + // Interactor3D::SOLID)); + + inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapterF1, Interactor3D::SOLID)); + inflowInt->addBCAdapter(velBCAdapterF2); + + SPtr<D3Q27Interactor> solidInt = + SPtr<D3Q27Interactor>(new D3Q27Interactor(geoSolid, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + InteractorsHelper intHelper(grid, metisVisitor, true); + //intHelper.addInteractor(cylInt); + //intHelper.addInteractor(tubes); + intHelper.addInteractor(outflowInt); + // intHelper.addInteractor(cyl2Int); + + intHelper.addInteractor(wallXminInt); + //intHelper.addInteractor(wallXmaxInt); + intHelper.addInteractor(wallZminInt); + intHelper.addInteractor(wallZmaxInt); + intHelper.addInteractor(wallYminInt); + intHelper.addInteractor(wallYmaxInt); + intHelper.addInteractor(inflowInt); + //intHelper.addInteractor(solidInt); + + intHelper.selectBlocks(); + + ppblocks->process(0); + ppblocks.reset(); + + unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks(); + int ghostLayer = 3; + unsigned long long numberOfNodesPerBlock = + (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]); + unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock; + unsigned long long numberOfNodesPerBlockWithGhostLayer = + numberOfBlocks * (blocknx[0] + ghostLayer) * (blocknx[1] + ghostLayer) * (blocknx[2] + ghostLayer); + double needMemAll = + double(numberOfNodesPerBlockWithGhostLayer * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4)); + double needMem = needMemAll / double(comm->getNumberOfProcesses()); + + if (myid == 0) { + UBLOG(logINFO, "Number of blocks = " << numberOfBlocks); + UBLOG(logINFO, "Number of nodes = " << numberOfNodes); + int minInitLevel = grid->getCoarsestInitializedLevel(); + int maxInitLevel = grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) { + int nobl = grid->getNumberOfBlocks(level); + UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl); + UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock); + } + UBLOG(logINFO, "Necessary memory = " << needMemAll << " bytes"); + UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes"); + UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); + } - //CalculationManagerPtr calculation(new CalculationManager(grid, numOfThreads, endTime, visSch,CalculationManager::MPI)); - CalculationManagerPtr calculation(new CalculationManager(grid, numOfThreads, endTime, visSch)); - if (myid == 0) UBLOG(logINFO, "Simulation-start"); - calculation->calculate(); - if (myid == 0) UBLOG(logINFO, "Simulation-end"); - } - catch (std::exception& e) - { - cerr << e.what() << endl << flush; - } - catch (std::string& s) - { - cerr << s << endl; - } - catch (...) - { - cerr << "unknown exception" << endl; - } + MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nu_h, nu_l, availMem, needMem); + + grid->accept(kernelVisitor); + + //if (refineLevel > 0) { + // SetUndefinedNodesBlockVisitor undefNodesVisitor; + // grid->accept(undefNodesVisitor); + //} + + intHelper.setBC(); + + // initialization of distributions + //mu::Parser fct1; + //fct1.SetExpr("phiL"); + //fct1.DefineConst("phiL", phiL); + LBMReal x1c = 0; // (g_maxX1 - g_minX1-1)/2; // + LBMReal x2c = (g_maxX2 - g_minX2)/2; + LBMReal x3c = (g_maxX3 - g_minX3)/2; + + mu::Parser fct1; + fct1.SetExpr("0.5-0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)"); + fct1.DefineConst("x1c", x1c); + fct1.DefineConst("x2c", x2c); + fct1.DefineConst("x3c", x3c); + fct1.DefineConst("radius", 0.5*D); + fct1.DefineConst("interfaceThickness", interfaceWidth*dx); + + MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor; + initVisitor.setPhi(fct1); + grid->accept(initVisitor); + /////////////////////////////////////////////////////////////////////////////////////////// + //{ + // std::vector<std::vector<SPtr<Block3D>>> blockVector; + // int gridRank = comm->getProcessID(); + // int minInitLevel = grid->getCoarsestInitializedLevel(); + // int maxInitLevel = grid->getFinestInitializedLevel(); + // blockVector.resize(maxInitLevel + 1); + // for (int level = minInitLevel; level <= maxInitLevel; level++) { + // grid->getBlocks(level, gridRank, true, blockVector[level]); + //} + // for (int level = minInitLevel; level <= maxInitLevel; level++) { + // for (SPtr<Block3D> block : blockVector[level]) { + // if (block) { + // int ix1 = block->getX1(); + // int ix2 = block->getX2(); + // int ix3 = block->getX3(); + // int level = block->getLevel(); + + // for (int dir = 0; dir < D3Q27System::ENDDIR; dir++) { + // SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level); + + // if (!neighBlock) { + + // } + // } + // } + // } + //} + // SPtr<Block3D> block = grid->getBlock(0, 0, 0, 0); + // SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel()); + // SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + + // for (int ix3 = 0; ix3 <= 13; ix3++) { + // for (int ix2 = 0; ix2 <= 13; ix2++) { + // for (int ix1 = 0; ix1 <= 13; ix1++) { + // if (ix1 == 0 || ix2 == 0 || ix3 == 0 || ix1 == 13 || ix2 == 13 || ix3 == 13) + // bcArray->setUndefined(ix1, ix2, ix3); + // } + // } + // } + //} + //////////////////////////////////////////////////////////////////////////////////////////// + // boundary conditions grid + { + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor( + grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm)); + ppgeo->process(0); + ppgeo.reset(); + } + if (myid == 0) + UBLOG(logINFO, "Preprocess - end"); + } else { + rcp->restart((int)restartStep); + grid->setTimeStep(restartStep); + + if (myid == 0) + UBLOG(logINFO, "Restart - end"); + } + + // TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + // grid->accept(setConnsVisitor); + + // ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + + grid->accept(bcVisitor); + + ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + //TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); + + SPtr<UbScheduler> visSch(new UbScheduler(outTime)); + double t_ast, t; + t_ast = 7.19; + t = (int)(t_ast/(U_LB/(D_LB))); + visSch->addSchedule(t,t,t); //t=7.19 + SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor( + grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); + pp->process(0); + + SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); + SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); + + SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime)); + auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch)); + timeDepBC->addInteractor(inflowInt); + +#ifdef _OPENMP + omp_set_num_threads(numOfThreads); +#endif + + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(pp); + calculator->addCoProcessor(timeDepBC); + calculator->addCoProcessor(rcp); + + if (myid == 0) + UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) + UBLOG(logINFO, "Simulation-end"); + } catch (std::exception &e) { + cerr << e.what() << endl << flush; + } catch (std::string &s) { + cerr << s << endl; + } catch (...) { + cerr << "unknown exception" << endl; + } } -int main(int argc, char* argv[]) +int main(int argc, char *argv[]) { - //Sleep(30000); - if (argv != NULL) - { - if (argv[1] != NULL) - { - run(string(argv[1])); - } - else - { - cout << "Configuration file is missing!" << endl; - } - } - + // Sleep(30000); + if (argv != NULL) { + if (argv[1] != NULL) { + run(string(argv[1])); + } else { + cout << "Configuration file is missing!" << endl; + } + } } - diff --git a/apps/cpu/JetBreakup/JetBreakup.cpp.new b/apps/cpu/JetBreakup/JetBreakup.cpp.new new file mode 100644 index 0000000000000000000000000000000000000000..953a8dee8caf0e7972b79138c8480f1883ebdfec --- /dev/null +++ b/apps/cpu/JetBreakup/JetBreakup.cpp.new @@ -0,0 +1,638 @@ +#include <iostream> +#include <memory> +#include <string> + +#include "VirtualFluids.h" + +using namespace std; + +void setInflowBC(double x1, double x2, double x3, double radius, int dir) +{ + +} + +void run(string configname) +{ + try { + + // Sleep(30000); + + vf::basics::ConfigurationFile config; + config.load(configname); + + string pathname = config.getValue<string>("pathname"); + //string pathGeo = config.getValue<string>("pathGeo"); + //string geoFile = config.getValue<string>("geoFile"); + int numOfThreads = config.getValue<int>("numOfThreads"); + vector<int> blocknx = config.getVector<int>("blocknx"); + //vector<double> boundingBox = config.getVector<double>("boundingBox"); + // vector<double> length = config.getVector<double>("length"); + double U_LB = config.getValue<double>("U_LB"); + // double uF2 = config.getValue<double>("uF2"); + //double nuL = config.getValue<double>("nuL"); + //double nuG = config.getValue<double>("nuG"); + //double densityRatio = config.getValue<double>("densityRatio"); + //double sigma = config.getValue<double>("sigma"); + int interfaceWidth = config.getValue<int>("interfaceWidth"); + //double D = config.getValue<double>("D"); + double theta = config.getValue<double>("contactAngle"); + double D_LB = config.getValue<double>("D_LB"); + double phiL = config.getValue<double>("phi_L"); + double phiH = config.getValue<double>("phi_H"); + double tauH = config.getValue<double>("Phase-field Relaxation"); + double mob = config.getValue<double>("Mobility"); + + double endTime = config.getValue<double>("endTime"); + double outTime = config.getValue<double>("outTime"); + double availMem = config.getValue<double>("availMem"); + //int refineLevel = config.getValue<int>("refineLevel"); + //double Re = config.getValue<double>("Re"); + + bool logToFile = config.getValue<bool>("logToFile"); + double restartStep = config.getValue<double>("restartStep"); + double cpStart = config.getValue<double>("cpStart"); + double cpStep = config.getValue<double>("cpStep"); + bool newStart = config.getValue<bool>("newStart"); + + + + int caseN = config.getValue<int>("case"); + + SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + if (myid == 0) + UBLOG(logINFO, "Jet Breakup: Start!"); + + if (logToFile) { +#if defined(__unix__) + if (myid == 0) { + const char *str = pathname.c_str(); + mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + } +#endif + + if (myid == 0) { + stringstream logFilename; + logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt"; + UbLog::output_policy::setStream(logFilename.str()); + } + } + + // Sleep(30000); + + double rho_h, rho_l, r_rho, mu_h, mu_l, Uo, D, sigma; + + switch (caseN) { + case 1: + //density of heavy fluid (kg/m^3) + rho_h = 848; + //density of light fluid (kg/m^3) + rho_l = 34.5; + //density ratio + r_rho = rho_h / rho_l; + //dynamic viscosity of heavy fluid (Pa � s) + mu_h = 2.87e-3; + //dynamic viscosity of light fluid (Pa � s) + mu_l = 1.97e-5; + //velocity (m/s) + Uo = 100; + //diameter of jet (m) + D = 0.0001; + //surface tension (N/m) + sigma = 0.03; + break; + case 2: + // density of heavy fluid (kg/m^3) + rho_h = 848; + // density of light fluid (kg/m^3) + rho_l = 1.205; + // density ratio + r_rho = rho_h / rho_l; + // dynamic viscosity of heavy fluid (Pa � s) + mu_h = 2.87e-3; + // dynamic viscosity of light fluid (Pa � s) + mu_l = 1.84e-5; + // velocity (m/s) + Uo = 200; + // diameter of jet (m) + D = 0.0001; + // surface tension (N/m) + sigma = 0.03; + break; + case 3: + // density of heavy fluid (kg/m^3) + rho_h = 1000; + // density of light fluid (kg/m^3) + rho_l = 1.0; + // density ratio + r_rho = rho_h / rho_l; + // dynamic viscosity of heavy fluid (Pa � s) + mu_h = 2.87e-3; + // dynamic viscosity of light fluid (Pa � s) + mu_l = 1.84e-5; + // velocity (m/s) + Uo = 200; + // diameter of jet (m) + D = 0.0001; + // surface tension (N/m) + sigma = 0.03; + break; + } + + double Re = rho_h * Uo * D / mu_h; + double We = rho_h * Uo * Uo * D / sigma; + + double dx = D / D_LB; + double nu_h = U_LB * D_LB / Re; + double nu_l = nu_h; + + double rho_h_LB = 1; + //surface tension + double sigma_LB = rho_h_LB * U_LB * U_LB * D_LB / We; + + // LBMReal dLB = 0; // = length[1] / dx; + LBMReal rhoLB = 0.0; + LBMReal nuLB = nu_l; //(uLB*dLB) / Re; + + double beta = 12.0 * sigma_LB / interfaceWidth; + double kappa = 1.5 * interfaceWidth * sigma_LB; + + if (myid == 0) { + UBLOG(logINFO, "Parameters:"); + UBLOG(logINFO, "U_LB = " << U_LB); + UBLOG(logINFO, "rho = " << rhoLB); + UBLOG(logINFO, "nu_l = " << nu_l); + UBLOG(logINFO, "nu_h = " << nu_h); + UBLOG(logINFO, "Re = " << Re); + UBLOG(logINFO, "We = " << We); + UBLOG(logINFO, "dx = " << dx); + UBLOG(logINFO, "sigma = " << sigma); + UBLOG(logINFO, "density ratio = " << r_rho); + // UBLOG(logINFO, "number of levels = " << refineLevel + 1); + UBLOG(logINFO, "numOfThreads = " << numOfThreads); + UBLOG(logINFO, "path = " << pathname); + } + + SPtr<LBMUnitConverter> conv(new LBMUnitConverter()); + + // const int baseLevel = 0; + + SPtr<LBMKernel> kernel; + + // kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel()); + kernel = SPtr<LBMKernel>(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel()); + //kernel = SPtr<LBMKernel>(new MultiphaseVelocityBaseSplitDistributionLBMKernel()); + //kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel()); + + kernel->setWithForcing(true); + kernel->setForcingX1(0.0); + kernel->setForcingX2(0.0); + kernel->setForcingX3(0.0); + + kernel->setPhiL(phiL); + kernel->setPhiH(phiH); + kernel->setPhaseFieldRelaxation(tauH); + kernel->setMobility(mob); + + // nuL, nuG, densityRatio, beta, kappa, theta, + + kernel->setCollisionFactorMultiphase(nu_h, nu_l); + kernel->setDensityRatio(r_rho); + kernel->setMultiphaseModelParameters(beta, kappa); + kernel->setContactAngle(theta); + kernel->setInterfaceWidth(interfaceWidth); + //dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(0.0); + + SPtr<BCProcessor> bcProc(new BCProcessor()); + // BCProcessorPtr bcProc(new ThinWallBCProcessor()); + + kernel->setBCProcessor(bcProc); + + SPtr<Grid3D> grid(new Grid3D(comm)); + // grid->setPeriodicX1(true); + // grid->setPeriodicX2(true); + // grid->setPeriodicX3(true); + grid->setGhostLayerWidth(2); + + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor( + comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::RECURSIVE)); + + ////////////////////////////////////////////////////////////////////////// + // restart + SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart)); + // SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm)); + SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm)); + // SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm)); + // rcp->setNu(nuLB); + // rcp->setNuLG(nuL, nuG); + // rcp->setDensityRatio(densityRatio); + + rcp->setLBMKernel(kernel); + rcp->setBCProcessor(bcProc); + ////////////////////////////////////////////////////////////////////////// + // BC Adapter + ////////////////////////////////////////////////////////////////////////////// + // bounding box + double g_minX1 = 0; + double g_minX2 = 0; + double g_minX3 = 0; + + double g_maxX1 = 8.0 * D;//8.0 * D; + double g_maxX2 = 5.0 * D; + double g_maxX3 = 5.0 * D; + + //double g_maxX1 = 1.0 * D; // 8.0 * D; + //double g_maxX2 = 2.0 * D; + //double g_maxX3 = 2.0 * D; + + + LBMReal x1c = 0; // (g_maxX1 - g_minX1-1)/2; // + LBMReal x2c = (g_maxX2 - g_minX2) / 2; + LBMReal x3c = (g_maxX3 - g_minX3) / 2; + + mu::Parser fctF1; + // fctF1.SetExpr("vy1*(1-((x1-x0)^2+(x3-z0)^2)/(R^2))"); + // fctF1.SetExpr("vy1*(1-(sqrt((x1-x0)^2+(x3-z0)^2)/R))^0.1"); + fctF1.SetExpr("vy1"); + fctF1.DefineConst("vy1", 0.0); + fctF1.DefineConst("R", 8.0); + fctF1.DefineConst("x0", 0.0); + fctF1.DefineConst("z0", 0.0); + // SPtr<BCAdapter> velBCAdapterF1( + // new MultiphaseVelocityBCAdapter(false, true, false, fctF1, phiH, 0.0, BCFunction::INFCONST)); + + mu::Parser fctF2; + fctF2.SetExpr("vy1");//*(1-(sqrt((x2-x2c)*(x2-x2c)+(x3-x3c)*(x3-x3c))/R))"); + fctF2.DefineConst("vy1", U_LB); + fctF2.DefineConst("R", D*0.5); + fctF2.DefineConst("x1c", x1c); + fctF2.DefineConst("x2c", x2c); + fctF2.DefineConst("x3c", x3c); + + + double startTime = 1; + SPtr<BCAdapter> velBCAdapterF1( + new MultiphaseVelocityBCAdapter(true, false, false, fctF1, phiH, 0.0, startTime)); + SPtr<BCAdapter> velBCAdapterF2( + new MultiphaseVelocityBCAdapter(true, false, false, fctF2, phiH, startTime, endTime)); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm())); + + SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB)); + denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm())); + + mu::Parser fctPhi_F1; + fctPhi_F1.SetExpr("phiH"); + fctPhi_F1.DefineConst("phiH", phiH); + + mu::Parser fctPhi_F2; + fctPhi_F2.SetExpr("phiL"); + fctPhi_F2.DefineConst("phiL", phiL); + + mu::Parser fctvel_F2_init; + fctvel_F2_init.SetExpr("U"); + fctvel_F2_init.DefineConst("U", 0); + + velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm())); + ////////////////////////////////////////////////////////////////////////////////// + // BC visitor + MultiphaseBoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + bcVisitor.addBC(denBCAdapter); // Ohne das BB? + bcVisitor.addBC(velBCAdapterF1); + + //SPtr<D3Q27Interactor> inflowF1Int; + //SPtr<D3Q27Interactor> cylInt; + + SPtr<D3Q27Interactor> inflowInt; + + if (newStart) { + + // if (newStart) { + + + + + + // geometry + SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + if (myid == 0) + GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", + WbWriterVtkXmlBinary::getInstance()); + + //if (myid == 0) + // UBLOG(logINFO, "Read geoFile:start"); + //SPtr<GbTriFaceMesh3D> cylinder = make_shared<GbTriFaceMesh3D>(); + //cylinder->readMeshFromSTLFileBinary(pathGeo + "/" + geoFile, false); + //GbSystem3D::writeGeoObject(cylinder.get(), pathname + "/geo/Stlgeo", WbWriterVtkXmlBinary::getInstance()); + //if (myid == 0) + // UBLOG(logINFO, "Read geoFile:stop"); + // inflow + // GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1, g_minX2 - 0.5 * dx, g_minX3, g_maxX1, g_minX2 - 1.0 * + // dx, g_maxX3)); + //GbCuboid3DPtr geoInflowF1(new GbCuboid3D(g_minX1 * 0.5 - dx, g_minX2 - dx, g_minX3 * 0.5 - dx, + // g_maxX1 * 0.5 + dx, g_minX2, g_maxX3 * 0.5 + dx)); + //if (myid == 0) + // GbSystem3D::writeGeoObject(geoInflowF1.get(), pathname + "/geo/geoInflowF1", + // WbWriterVtkXmlASCII::getInstance()); + + GbCylinder3DPtr geoInflow(new GbCylinder3D(g_minX1 - 2.0*dx, g_maxX2 / 2.0, g_maxX3 / 2.0, g_minX1, + g_maxX2 / 2.0, + g_maxX3 / 2.0, D / 2.0)); + if (myid == 0) + GbSystem3D::writeGeoObject(geoInflow.get(), pathname + "/geo/geoInflow", + WbWriterVtkXmlASCII::getInstance()); + + GbCylinder3DPtr geoSolid(new GbCylinder3D(g_minX1 - 2.0 * dx, g_maxX2 / 2.0, g_maxX3 / 2.0, g_minX1-dx, + g_maxX2 / 2.0, g_maxX3 / 2.0, 1.5*D / 2.0)); + if (myid == 0) + GbSystem3D::writeGeoObject(geoSolid.get(), pathname + "/geo/geoSolid", + WbWriterVtkXmlASCII::getInstance()); + + + // GbCylinder3DPtr cylinder2( + // new GbCylinder3D(0.0, g_minX2 - 2.0 * dx / 2.0, 0.0, 0.0, g_minX2 + 4.0 * dx, 0.0, 8.0+2.0*dx)); + // if (myid == 0) + // GbSystem3D::writeGeoObject(cylinder2.get(), pathname + "/geo/cylinder2", + // WbWriterVtkXmlASCII::getInstance()); + // outflow + // GbCuboid3DPtr geoOutflow(new GbCuboid3D(-1.0, -1, -1.0, 121.0, 1.0, 121.0)); // For JetBreakup (Original) + // GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_minX1, g_maxX2 - 40 * dx, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + GbCuboid3DPtr geoOutflow(new GbCuboid3D(g_maxX1, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3)); + if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance()); + + // double blockLength = blocknx[0] * dx; + + if (myid == 0) { + UBLOG(logINFO, "Preprocess - start"); + } + + grid->setDeltaX(dx); + grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); + + grid->setPeriodicX1(false); + grid->setPeriodicX2(false); + grid->setPeriodicX3(false); + + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor( + grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); + + //SPtr<Interactor3D> tubes(new D3Q27TriFaceMeshInteractor(cylinder, grid, noSlipBCAdapter, + // Interactor3D::SOLID, Interactor3D::POINTS)); + + // inflowF1Int = + // SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, noSlipBCAdapter, Interactor3D::SOLID)); + // inflowF1Int->addBCAdapter(velBCAdapterF2); + + SPtr<D3Q27Interactor> outflowInt(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID)); + + // Create boundary conditions geometry + GbCuboid3DPtr wallXmin( + new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_minX1, g_maxX2 + 2.0*dx, g_maxX3)); + GbSystem3D::writeGeoObject(wallXmin.get(), pathname + "/geo/wallXmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallXmax( + new GbCuboid3D(g_maxX1, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3)); + GbSystem3D::writeGeoObject(wallXmax.get(), pathname + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallZmin( + new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_minX3)); + GbSystem3D::writeGeoObject(wallZmin.get(), pathname + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallZmax( + new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_maxX3, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3 + 2.0*dx)); + GbSystem3D::writeGeoObject(wallZmax.get(), pathname + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallYmin( + new GbCuboid3D(g_minX1 - 2.0*dx, g_minX2 - 2.0*dx, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_minX2, g_maxX3)); + GbSystem3D::writeGeoObject(wallYmin.get(), pathname + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallYmax( + new GbCuboid3D(g_minX1 - 2.0*dx, g_maxX2, g_minX3 - 2.0*dx, g_maxX1 + 2.0*dx, g_maxX2 + 2.0*dx, g_maxX3)); + GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance()); + + // Add boundary conditions to grid generator + SPtr<D3Q27Interactor> wallXminInt( + new D3Q27Interactor(wallXmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallXmaxInt( + new D3Q27Interactor(wallXmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallZminInt( + new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallZmaxInt( + new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallYminInt( + new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallYmaxInt( + new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + //cylInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(cylinder1, grid, velBCAdapterF1, Interactor3D::SOLID)); + //cylInt->addBCAdapter(velBCAdapterF2); + // SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBCAdapter, + // Interactor3D::SOLID)); + + inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapterF1, Interactor3D::SOLID)); + inflowInt->addBCAdapter(velBCAdapterF2); + + SPtr<D3Q27Interactor> solidInt = + SPtr<D3Q27Interactor>(new D3Q27Interactor(geoSolid, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + InteractorsHelper intHelper(grid, metisVisitor, true); + //intHelper.addInteractor(cylInt); + //intHelper.addInteractor(tubes); + intHelper.addInteractor(outflowInt); + // intHelper.addInteractor(cyl2Int); + + intHelper.addInteractor(wallXminInt); + //intHelper.addInteractor(wallXmaxInt); + intHelper.addInteractor(wallZminInt); + intHelper.addInteractor(wallZmaxInt); + intHelper.addInteractor(wallYminInt); + intHelper.addInteractor(wallYmaxInt); + intHelper.addInteractor(inflowInt); + //intHelper.addInteractor(solidInt); + + intHelper.selectBlocks(); + + ppblocks->process(0); + ppblocks.reset(); + + unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks(); + int ghostLayer = 3; + unsigned long long numberOfNodesPerBlock = + (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]); + unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock; + unsigned long long numberOfNodesPerBlockWithGhostLayer = + numberOfBlocks * (blocknx[0] + ghostLayer) * (blocknx[1] + ghostLayer) * (blocknx[2] + ghostLayer); + double needMemAll = + double(numberOfNodesPerBlockWithGhostLayer * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4)); + double needMem = needMemAll / double(comm->getNumberOfProcesses()); + + if (myid == 0) { + UBLOG(logINFO, "Number of blocks = " << numberOfBlocks); + UBLOG(logINFO, "Number of nodes = " << numberOfNodes); + int minInitLevel = grid->getCoarsestInitializedLevel(); + int maxInitLevel = grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) { + int nobl = grid->getNumberOfBlocks(level); + UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl); + UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock); + } + UBLOG(logINFO, "Necessary memory = " << needMemAll << " bytes"); + UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes"); + UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); + } + + MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nu_h, nu_l,0,0,0,0, availMem, needMem); + + grid->accept(kernelVisitor); + + //if (refineLevel > 0) { + // SetUndefinedNodesBlockVisitor undefNodesVisitor; + // grid->accept(undefNodesVisitor); + //} + + intHelper.setBC(); + + // initialization of distributions + //mu::Parser fct1; + //fct1.SetExpr("phiL"); + //fct1.DefineConst("phiL", phiL); + + mu::Parser fct1; + fct1.SetExpr(" 0.5 - 0.5 * tanh(2 * (sqrt((x1 - x1c) ^ 2 + (x2 - x2c) ^ 2 + (x3 - x3c) ^ 2) - radius) / interfaceThickness)"); + fct1.DefineConst("x1c", x1c); + fct1.DefineConst("x2c", x2c); + fct1.DefineConst("x3c", x3c); + fct1.DefineConst("radius", 0.5*D); + fct1.DefineConst("interfaceThickness", interfaceWidth*dx); + + MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor; + initVisitor.setPhi(fct1); + grid->accept(initVisitor); + /////////////////////////////////////////////////////////////////////////////////////////// + //{ + // std::vector<std::vector<SPtr<Block3D>>> blockVector; + // int gridRank = comm->getProcessID(); + // int minInitLevel = grid->getCoarsestInitializedLevel(); + // int maxInitLevel = grid->getFinestInitializedLevel(); + // blockVector.resize(maxInitLevel + 1); + // for (int level = minInitLevel; level <= maxInitLevel; level++) { + // grid->getBlocks(level, gridRank, true, blockVector[level]); + //} + // for (int level = minInitLevel; level <= maxInitLevel; level++) { + // for (SPtr<Block3D> block : blockVector[level]) { + // if (block) { + // int ix1 = block->getX1(); + // int ix2 = block->getX2(); + // int ix3 = block->getX3(); + // int level = block->getLevel(); + + // for (int dir = 0; dir < D3Q27System::ENDDIR; dir++) { + // SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level); + + // if (!neighBlock) { + + // } + // } + // } + // } + //} + // SPtr<Block3D> block = grid->getBlock(0, 0, 0, 0); + // SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel()); + // SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + + // for (int ix3 = 0; ix3 <= 13; ix3++) { + // for (int ix2 = 0; ix2 <= 13; ix2++) { + // for (int ix1 = 0; ix1 <= 13; ix1++) { + // if (ix1 == 0 || ix2 == 0 || ix3 == 0 || ix1 == 13 || ix2 == 13 || ix3 == 13) + // bcArray->setUndefined(ix1, ix2, ix3); + // } + // } + // } + //} + //////////////////////////////////////////////////////////////////////////////////////////// + // boundary conditions grid + { + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor( + grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm)); + ppgeo->process(0); + ppgeo.reset(); + } + + if (myid == 0) + UBLOG(logINFO, "Preprocess - end"); + } else { + rcp->restart((int)restartStep); + grid->setTimeStep(restartStep); + + if (myid == 0) + UBLOG(logINFO, "Restart - end"); + } + + // TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + // grid->accept(setConnsVisitor); + + // ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + + grid->accept(bcVisitor); + + ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + //TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); + + SPtr<UbScheduler> visSch(new UbScheduler(outTime)); + double t_ast, t; + t_ast = 7.19; + t = (int)(t_ast/(U_LB/(D_LB))); + visSch->addSchedule(t,t,t); //t=7.19 + SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor( + grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); + pp->process(0); + + SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); + SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); + + SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime)); + auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch)); + timeDepBC->addInteractor(inflowInt); + +#ifdef _OPENMP + omp_set_num_threads(numOfThreads); +#endif + + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(pp); + calculator->addCoProcessor(timeDepBC); + calculator->addCoProcessor(rcp); + + if (myid == 0) + UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) + UBLOG(logINFO, "Simulation-end"); + } catch (std::exception &e) { + cerr << e.what() << endl << flush; + } catch (std::string &s) { + cerr << s << endl; + } catch (...) { + cerr << "unknown exception" << endl; + } +} +int main(int argc, char *argv[]) +{ + // Sleep(30000); + if (argv != NULL) { + if (argv[1] != NULL) { + run(string(argv[1])); + } else { + cout << "Configuration file is missing!" << endl; + } + } +} diff --git a/apps/cpu/LaminarTubeFlow/ltf.cfg b/apps/cpu/LaminarTubeFlow/ltf.cfg index 8b8e33e4998835da80d2121925acc7d95c3ccd20..110b99d35005d90bfc869ff4f962b2e55560d543 100644 --- a/apps/cpu/LaminarTubeFlow/ltf.cfg +++ b/apps/cpu/LaminarTubeFlow/ltf.cfg @@ -17,10 +17,10 @@ Re = 10 logToFile = false newStart = true -restartStep = 100000 +restartStep = 10 -cpStart = 100000 -cpStep = 100000 +cpStart = 1000 +cpStep = 1000 -outTime = 1000 +outTime = 10 endTime = 1000 \ No newline at end of file diff --git a/apps/cpu/LaminarTubeFlow/ltf.cpp b/apps/cpu/LaminarTubeFlow/ltf.cpp index c8951903084ccacf208718f25948206b1c98c1ab..93fd31083a1da92bc5fb73bb0606c7a8121bb5b8 100644 --- a/apps/cpu/LaminarTubeFlow/ltf.cpp +++ b/apps/cpu/LaminarTubeFlow/ltf.cpp @@ -72,27 +72,28 @@ void run(string configname) noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm())); SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB)); - //denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm())); - denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm())); + denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm())); + //denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm())); - double startTime = 5; + //double startTime = 5; mu::Parser fct1; fct1.SetExpr("U"); - fct1.DefineConst("U", 0.00001); - SPtr<BCAdapter> velBCAdapter1(new VelocityBCAdapter(true, false, false, fct1, 0, startTime)); - velBCAdapter1->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); + fct1.DefineConst("U", uLB); + SPtr<BCAdapter> velBCAdapter1(new VelocityBCAdapter(true, false, false, fct1, 0, BCFunction::INFCONST)); + //velBCAdapter1->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); + velBCAdapter1->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm())); - mu::Parser fct2; - fct2.SetExpr("U"); - fct2.DefineConst("U", uLB); - SPtr<BCAdapter> velBCAdapter2(new VelocityBCAdapter(true, false, false, fct2, startTime, BCFunction::INFCONST)); + //mu::Parser fct2; + //fct2.SetExpr("U"); + //fct2.DefineConst("U", uLB); + //SPtr<BCAdapter> velBCAdapter2(new VelocityBCAdapter(true, false, false, fct2, startTime, BCFunction::INFCONST)); ////////////////////////////////////////////////////////////////////////////////// //BS visitor BoundaryConditionsBlockVisitor bcVisitor; bcVisitor.addBC(noSlipBCAdapter); bcVisitor.addBC(denBCAdapter); - //bcVisitor.addBC(velBCAdapter); + //bcVisitor.addBC(velBCAdapter1); SPtr<Grid3D> grid(new Grid3D(comm)); @@ -107,11 +108,16 @@ void run(string configname) kernel->setBCProcessor(bcProc); ////////////////////////////////////////////////////////////////////////// + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M)); //restart SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart)); - SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, pathname + "/mig", comm)); + //SPtr<MPIIOMigrationCoProcessor> migCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, pathname + "/mig", comm)); + SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, metisVisitor, pathname + "/mig", comm)); migCoProcessor->setLBMKernel(kernel); migCoProcessor->setBCProcessor(bcProc); + migCoProcessor->setNu(nuLB); + migCoProcessor->setNuLG(0.01, 0.01); + migCoProcessor->setDensityRatio(1); ////////////////////////////////////////////////////////////////////////// SPtr<D3Q27Interactor> inflowInt; @@ -157,7 +163,7 @@ void run(string configname) grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); grid->setPeriodicX1(false); - grid->setPeriodicX2(true); + grid->setPeriodicX2(false); grid->setPeriodicX3(false); if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); @@ -208,13 +214,13 @@ void run(string configname) //velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm())); inflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, velBCAdapter1, Interactor3D::SOLID)); - inflowInt->addBCAdapter(velBCAdapter2); + //inflowInt->addBCAdapter(velBCAdapter2); //outflow SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID)); - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B)); + //SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M)); InteractorsHelper intHelper(grid, metisVisitor); intHelper.addInteractor(cylinderInt); intHelper.addInteractor(inflowInt); @@ -313,9 +319,9 @@ void run(string configname) SPtr<UbScheduler> nupsSch(new UbScheduler(100, 100, 100000000)); SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); - SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime)); - auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch)); - timeDepBC->addInteractor(inflowInt); + //SPtr<UbScheduler> timeBCSch(new UbScheduler(1, startTime, startTime)); + //auto timeDepBC = make_shared<TimeDependentBCCoProcessor>(TimeDependentBCCoProcessor(grid, timeBCSch)); + //timeDepBC->addInteractor(inflowInt); omp_set_num_threads(numOfThreads); numOfThreads = 1; @@ -324,7 +330,7 @@ void run(string configname) calculator->addCoProcessor(npr); calculator->addCoProcessor(pp); calculator->addCoProcessor(migCoProcessor); - calculator->addCoProcessor(timeDepBC); + //calculator->addCoProcessor(timeDepBC); if (myid == 0) VF_LOG_INFO("Simulation-start"); calculator->calculate(); diff --git a/apps/cpu/LiggghtsApp/CMakeLists.txt b/apps/cpu/LiggghtsApp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..f3a2d925f1d082c8f2e9e52e31d8179fe82c9235 --- /dev/null +++ b/apps/cpu/LiggghtsApp/CMakeLists.txt @@ -0,0 +1,3 @@ +PROJECT(LiggghtsApp) + +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} LiggghtsCoupling FILES LiggghtsApp.cpp ) diff --git a/apps/cpu/LiggghtsApp/LiggghtsApp.cpp b/apps/cpu/LiggghtsApp/LiggghtsApp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b3c49ccaec94747efea9c28a1b1cb8a937c03444 --- /dev/null +++ b/apps/cpu/LiggghtsApp/LiggghtsApp.cpp @@ -0,0 +1,264 @@ +#include <iostream> +#include <string> +#include <memory> + +#include "VirtualFluids.h" + +//#include "lammps.h" +//#include "input.h" +//#include "atom.h" +//#include "modify.h" +//#include "fix_lb_coupling_onetoone.h" + +#include "LiggghtsCouplingCoProcessor.h" +#include "LiggghtsCouplingWrapper.h" +#include "IBcumulantK17LBMKernel.h" + +using namespace std; + + +int main(int argc, char *argv[]) +{ + //Sleep(30000); + + std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + + // bounding box + double g_minX1 = 0; + double g_minX2 = 0; + double g_minX3 = 0; + + double g_maxX1 = 1; + double g_maxX2 = 1; + double g_maxX3 = 2; + + int blockNX[3] = { 16, 16, 16 }; + + double dx = 1./32.; + + + double d_part = 0.25; + double r_p = d_part / 2.0; + + // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 1.480, 2060, r_p/dx); + // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, LBMUnitConverter::AIR_20C, r_p / dx); + // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 0.1, 1000, r_p / dx, 0.01); + SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 0.1, 1000, r_p / dx, 0.01); + //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, LBMUnitConverter::OIL, r_p / dx); + std::cout << units->toString() << std::endl; + + //double Re = 300; + double nuLB = 1e-2; // 5e-5; + + SPtr<LBMKernel> kernel = make_shared<IBcumulantK17LBMKernel>(); + SPtr<BCProcessor> bcProc = make_shared<BCProcessor>(); + kernel->setBCProcessor(bcProc); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm())); + ////////////////////////////////////////////////////////////////////////////////// + // BC visitor + BoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + + + + + SPtr<Grid3D> grid = make_shared<Grid3D>(comm); + grid->setPeriodicX1(true); + grid->setPeriodicX2(true); + grid->setPeriodicX3(false); + grid->setDeltaX(dx); + grid->setBlockNX(blockNX[0], blockNX[1], blockNX[2]); + + string outputPath = "d:/temp/LiggghtsCoupling"; + UbSystem::makeDirectory(outputPath); + UbSystem::makeDirectory(outputPath + "/liggghts"); + + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); + + SPtr<GbObject3D> gridCube = make_shared <GbCuboid3D>(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3); + if (myid == 0) + GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + SPtr<CoProcessor> ppblocks = + make_shared <WriteBlocksCoProcessor>(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, + WbWriterVtkXmlBinary::getInstance(), comm); + ppblocks->process(0); + ppblocks.reset(); + + double dx2 = 2.0 * dx; + GbCuboid3DPtr wallZmin( + new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_minX3)); + GbSystem3D::writeGeoObject(wallZmin.get(), outputPath + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallZmax( + new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_maxX3, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2)); + GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance()); + + SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + InteractorsHelper intHelper(grid, metisVisitor, true); + intHelper.addInteractor(wallZminInt); + intHelper.addInteractor(wallZmaxInt); + intHelper.selectBlocks(); + + SetKernelBlockVisitor kernelVisitor(kernel, nuLB, 1e9, 1e9); + grid->accept(kernelVisitor); + + intHelper.setBC(); + + InitDistributionsBlockVisitor initVisitor; + grid->accept(initVisitor); + + SPtr<UbScheduler> lScheduler = make_shared<UbScheduler>(1); + string inFile1 = "d:/Projects/VirtualFluids_Develop/apps/cpu/LiggghtsApp/in.lbdem"; + //string inFile1 = "d:/Tools/LIGGGHTS/examples/LIGGGHTS/Tutorials_public/chute_wear/in.chute_wear2"; + string inFile2 = "d:/Projects/VirtualFluids_Develop/apps/cpu/LiggghtsApp/in2.lbdem"; + MPI_Comm mpi_comm = *(MPI_Comm*)(comm->getNativeCommunicator()); + LiggghtsCouplingWrapper wrapper(argv, mpi_comm); + + + double v_frac = 0.1; + double dt_phys = units->getFactorTimeLbToW(); + int demSubsteps = 10; + double dt_dem = dt_phys / (double)demSubsteps; + int vtkSteps = 100; + string demOutDir = outputPath; // "d:/temp/lll2/"; + + //wrapper.execCommand("echo none"); + + wrapper.setVariable("r_part", d_part / 2); + wrapper.setVariable("v_frac", v_frac); + + wrapper.execFile((char*)inFile1.c_str()); + + + //// set timestep and output directory + wrapper.setVariable("t_step", dt_dem); + wrapper.setVariable("dmp_stp", vtkSteps * demSubsteps); + wrapper.setVariable("dmp_dir", demOutDir); + + wrapper.execFile((char *)inFile2.c_str()); + wrapper.runUpto(demSubsteps - 1); + + + SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor = + make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units); + + // boundary conditions grid + { + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor( + grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm)); + ppgeo->process(0); + ppgeo.reset(); + } + + grid->accept(bcVisitor); + + OneDistributionSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); + + + // write data for visualization of macroscopic quantities + SPtr<UbScheduler> visSch(new UbScheduler(vtkSteps)); + SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor( + new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), + SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + + int endTime = 3000; //20; + SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime)); + calculator->addCoProcessor(lcCoProcessor); + calculator->addCoProcessor(writeMQCoProcessor); + + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); + + //MPI_Init(&argc, &argv); + //MPI_Comm mpi_comm = *(MPI_Comm*)(comm->getNativeCommunicator()); + //LiggghtsCouplingWrapper wrapper(argv, mpi_comm); + + //wrapper.execFile("in2.lbdem"); + //wrapper.runUpto(demSubsteps - 1); + + //LAMMPS_NS::LAMMPS *lmp; + // // custom argument vector for LAMMPS library + // const char *lmpargv[] {"liblammps", "-log", "none"}; + // int lmpargc = sizeof(lmpargv)/sizeof(const char *); + + // // explicitly initialize MPI + // MPI_Init(&argc, &argv); + + // // create LAMMPS instance + // lmp = new LAMMPS_NS::LAMMPS(lmpargc, (char **)lmpargv, MPI_COMM_WORLD); + // lmp->input->file("in.lbdem"); + // //lmp->input->one("run 1"); + // + // //# Try extracting a global value + // // print("") + // // print("Attempting to get the number of atoms in simulation") + // // numAtoms = lmp.extract_global("natoms", 0) + // // print("natoms =", numAtoms) + + // // # Try extracting atom's positions + // // print("") + // // print("Attempting to get the atom's positions") + // // pos = lmp.extract_atom("x",3) + // // for k in range(0,numAtoms): + // // print("Pos[%i] = [%f, %f, %f]" % (k, pos[k][0], pos[k][1], pos[k][2])) + + // LAMMPS_NS::FixLbCouplingOnetoone + // *couplingFix + // = dynamic_cast<LAMMPS_NS::FixLbCouplingOnetoone*> + // (lmp->modify->find_fix_style("couple/lb/onetoone",0)); + + // cout << "test1\n"; + // + // //double **t_liggghts = couplingFix->get_torque_ptr(); + // cout << "test2\n"; + + // lmp->input->one("run 9 upto"); + + // for (int step = 0; step < 10; step++) + // { + // + + // int numAtoms = lmp->atom->natoms; + + // //double** pos = (double**)lmp->atom->extract("x"); + // double** pos = lmp->atom->x; + // + // //double* forceX = lmp->atom->fx; + + // for (int i = 0; i < numAtoms; i++) + // { + // double **f_liggghts = couplingFix->get_force_ptr(); + // double** force = lmp->atom->f; + // cout << "Pos[" << i << "] = [" << pos[i][0] << ", " << pos[i][1] << ", " << pos[i][2] << "]\n"; + // cout << "Force1[" << i << "] = [" << f_liggghts[i][0] << ", " << f_liggghts[i][1] << ", " << f_liggghts[i][2] << "]\n"; + // f_liggghts[i][0] += 0; + // f_liggghts[i][1] += 0; + // f_liggghts[i][2] += 500; + // cout << "Force2[" << i << "] = [" << force[i][0] << ", " << force[i][1] << ", " << force[i][2] << "]\n"; + // } + + // couplingFix->comm_force_torque(); + + // lmp->input->one("run 10000"); + // + // } + + // // delete LAMMPS instance + // delete lmp; + + // // stop MPI environment + //MPI_Finalize(); + return 0; +} diff --git a/apps/cpu/LiggghtsApp/in.lbdem b/apps/cpu/LiggghtsApp/in.lbdem new file mode 100644 index 0000000000000000000000000000000000000000..4c38d79268d38d284d536ea3d32b1038314e35ba --- /dev/null +++ b/apps/cpu/LiggghtsApp/in.lbdem @@ -0,0 +1,76 @@ +#verbose no + +units si +atom_style granular +atom_modify map array + + + +communicate single vel yes + +boundary f f f +newton off + +processors * * 1 +region box block 0. 1. 0. 1. 0. 2. units box +create_box 1 box + +variable skin equal 0.01 +neighbor ${skin} bin +neigh_modify delay 0 binsize 0.01 one 1000 + +fix grav all gravity 0.981 vector 0 0 -1 + + +fix m1 all property/global youngsModulus peratomtype 1e8 +fix m2 all property/global poissonsRatio peratomtype 0.4 +fix m3 all property/global coefficientRestitution peratomtypepair 1 0.95 +fix m4 all property/global coefficientFriction peratomtypepair 1 0.45 +fix m5 all property/global coefficientRollingFriction peratomtypepair 1 0.020 + +# lb coupling fix +fix lbcoupling all couple/lb/onetoone + + +pair_style gran model hertz tangential history rolling_friction cdt +pair_coeff * * + +fix 1 all nve/sphere + +fix xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0. +fix xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 1. +fix ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0. +fix ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 1. +fix zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0. +fix zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 2. + +#create_atoms 1 single 0.5 0.5 9.75 +#create_atoms 1 single 0.38 0.05 0.05 + +#set group all diameter 0.25 density 2400 + +#atom_modify sort 0 0.0 + +#fix pts1 all particletemplate/sphere 1 atom_type 1 density constant 1000 radius constant 0.015 +#fix pts2 all particletemplate/sphere 1 atom_type 1 density constant 1000 radius constant 0.01 +#fix pts1 all particletemplate/sphere 1 atom_type 1 density constant 1100 radius constant ${r_part} +fix pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2500 radius constant 0.01 + +fix pdd1 all particledistribution/discrete 32452843 1 pts1 1.0 +#fix pdd2 all particledistribution/discrete 6778 2 pts2 0.2 pts3 0.8 + +region insreg block 0.1 0.9 0.1 0.9 1.3 1.9 units box + + +#fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once & +# overlapcheck yes particles_in_region 350 region insreg ntry_mc 10000 +#fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once & +# overlapcheck yes volumefraction_region ${v_frac} region insreg ntry_mc 10000 +fix ins all insert/pack seed 32452867 distributiontemplate pdd1 insert_every once & + overlapcheck yes volumefraction_region 0.1 region insreg ntry_mc 1001 +#fix ins all insert/pack seed 1001 distributiontemplate pdd1 insert_every once & +# overlapcheck yes particles_in_region 1 region insreg ntry_mc 10000 + +echo none + +run 1 diff --git a/apps/cpu/LiggghtsApp/in2.lbdem b/apps/cpu/LiggghtsApp/in2.lbdem new file mode 100644 index 0000000000000000000000000000000000000000..aee0cc8dbdb5cd6bd72969343300eff2c2802a3d --- /dev/null +++ b/apps/cpu/LiggghtsApp/in2.lbdem @@ -0,0 +1,27 @@ + +echo none + +timestep ${t_step} + +# thermo settings +fix ts all check/timestep/gran 10000 0.1 0.1 +compute 1 all erotate/sphere +thermo_style custom step atoms ke c_1 f_ts[1] f_ts[2] cpu +thermo 10000 +thermo_modify lost ignore norm no flush yes +compute_modify thermo_temp dynamic yes + +# particle dump +variable dmp_fname string ${dmp_dir}d_*.liggghts + +#dump dmp all custom ${dmp_stp} ${dmp_fname} & +# id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + +#dump dmp all custom ${dmp_stp} ${dmp_dir}d_*.liggghts & +# id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + + + +dump dmp all custom/vtk ${dmp_stp} ${dmp_dir}/liggghts/atom_*.vtk id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + +echo none \ No newline at end of file diff --git a/apps/cpu/Multiphase/Multiphase.cfg b/apps/cpu/Multiphase/Multiphase.cfg index c294ea68ce96c751030380d52d16eb35d06f9faa..b2f435db04ce51f915c3994b8418ba97b49c4843 100644 --- a/apps/cpu/Multiphase/Multiphase.cfg +++ b/apps/cpu/Multiphase/Multiphase.cfg @@ -1,11 +1,11 @@ -pathname = d:/temp/MultiphaseNew5 +pathname = d:/temp/JetBreakup #pathGeo = d:/Projects/VirtualFluids-Multiphase/source/Applications/Multiphase/backup pathGeo = d:/Projects/VirtualFluidsCombined/apps/cpu/Multiphase/backup #geoFile = JetBreakupR.ASCII.stl #geoFile = inlet1.stl geoFile = tubeTransformed.stl -numOfThreads = 4 +numOfThreads = 1 availMem = 10e9 #Grid @@ -22,21 +22,23 @@ availMem = 10e9 #boundingBox = -40e-3 40e-3 1.0e-3 11.0e-3 -403-3 40e-3 #(Jet Breakup2) (Original without inlet length) #blocknx = 20 20 20 -boundingBox = 6.0e-3 46.0e-3 -5e-3 5e-3 -5e-3 5e-3 -blocknx = 20 20 20 +#boundingBox = 6.0e-3 46.0e-3 -5e-3 5e-3 -5e-3 5e-3 +#blocknx = 20 20 20 +boundingBox = 0 9 0 9 0 9 +blocknx = 10 10 10 -dx = 1.66666666667e-4 +dx = 1 #1.66666666667e-4 refineLevel = 0 #Simulation uLB = 0.005 #inlet velocity #uF2 = 0.0001 Re = 10 -nuL =1e-2# 1.0e-5 #!1e-2 -nuG =1e-2# 1.16e-4 #!1e-2 +nuL =1e-3# 1.0e-5 #!1e-2 +nuG =1e-6# 1.16e-4 #!1e-2 densityRatio = 1000 -sigma = 1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5 -interfaceThickness = 5 +sigma = 0 #1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5 +interfaceWidth = 5 radius = 615.0 (Jet Breakup) contactAngle = 110.0 gravity = 0.0 diff --git a/apps/cpu/Multiphase/Multiphase.cpp b/apps/cpu/Multiphase/Multiphase.cpp index 9fd7110f25bddb2f23ef550bbb9a7c0754fab9d8..09d74e1473e9fef8e7f29343d758359eaf0752a2 100644 --- a/apps/cpu/Multiphase/Multiphase.cpp +++ b/apps/cpu/Multiphase/Multiphase.cpp @@ -10,7 +10,7 @@ void run(string configname) { try { - //Sleep(20000); + //Sleep(30000); vf::basics::ConfigurationFile config; config.load(configname); @@ -28,8 +28,8 @@ void run(string configname) double nuG = config.getValue<double>("nuG"); double densityRatio = config.getValue<double>("densityRatio"); double sigma = config.getValue<double>("sigma"); - int interfaceThickness = config.getValue<int>("interfaceThickness"); - double radius = config.getValue<double>("radius"); + int interfaceWidth = config.getValue<int>("interfaceWidth"); + //double radius = config.getValue<double>("radius"); double theta = config.getValue<double>("contactAngle"); double gr = config.getValue<double>("gravity"); double phiL = config.getValue<double>("phi_L"); @@ -49,8 +49,8 @@ void run(string configname) double cpStep = config.getValue<double>("cpStep"); bool newStart = config.getValue<bool>("newStart"); - double beta = 12 * sigma / interfaceThickness; - double kappa = 1.5 * interfaceThickness * sigma; + double beta = 12 * sigma / interfaceWidth; + double kappa = 1.5 * interfaceWidth * sigma; SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); int myid = comm->getProcessID(); @@ -85,9 +85,12 @@ void run(string configname) SPtr<LBMKernel> kernel; - kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel()); + //kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel()); //kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel()); //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsCumulantLBMKernel()); + //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel()); + kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel()); kernel->setWithForcing(true); kernel->setForcingX1(0.0); @@ -99,29 +102,43 @@ void run(string configname) kernel->setPhaseFieldRelaxation(tauH); kernel->setMobility(mob); + //nuL, nuG, densityRatio, beta, kappa, theta, + + kernel->setCollisionFactorMultiphase(nuL, nuG); + kernel->setDensityRatio(densityRatio); + kernel->setMultiphaseModelParameters(beta, kappa); + kernel->setContactAngle(theta); + kernel->setInterfaceWidth(interfaceWidth); + SPtr<BCProcessor> bcProc(new BCProcessor()); // BCProcessorPtr bcProc(new ThinWallBCProcessor()); kernel->setBCProcessor(bcProc); SPtr<Grid3D> grid(new Grid3D(comm)); - // grid->setPeriodicX1(true); - // grid->setPeriodicX2(true); - // grid->setPeriodicX3(true); + //grid->setPeriodicX1(true); + //grid->setPeriodicX2(true); + //grid->setPeriodicX3(true); + grid->setGhostLayerWidth(2); + + + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); + ////////////////////////////////////////////////////////////////////////// // restart SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart)); //SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm)); - //SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, pathname, comm)); - SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm)); - rcp->setNu(nuLB); - rcp->setNuLG(nuL, nuG); - rcp->setDensityRatio(densityRatio); + SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm)); + //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm)); + //rcp->setNu(nuLB); + //rcp->setNuLG(nuL, nuG); + //rcp->setDensityRatio(densityRatio); rcp->setLBMKernel(kernel); rcp->setBCProcessor(bcProc); ////////////////////////////////////////////////////////////////////////// - + // BC Adapter + ////////////////////////////////////////////////////////////////////////////// mu::Parser fctF1; // fctF1.SetExpr("vy1*(1-((x1-x0)^2+(x3-z0)^2)/(R^2))"); // fctF1.SetExpr("vy1*(1-(sqrt((x1-x0)^2+(x3-z0)^2)/R))^0.1"); @@ -137,10 +154,36 @@ void run(string configname) fctF2.SetExpr("vy1"); fctF2.DefineConst("vy1", uLB); - double startTime = 500; + double startTime = 30; SPtr<BCAdapter> velBCAdapterF1(new MultiphaseVelocityBCAdapter(true, false, false, fctF1, phiH, 0.0, startTime)); SPtr<BCAdapter> velBCAdapterF2(new MultiphaseVelocityBCAdapter(true, false, false, fctF2, phiH, startTime, endTime)); + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm())); + + SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB)); + denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm())); + + mu::Parser fctPhi_F1; + fctPhi_F1.SetExpr("phiH"); + fctPhi_F1.DefineConst("phiH", phiH); + + mu::Parser fctPhi_F2; + fctPhi_F2.SetExpr("phiL"); + fctPhi_F2.DefineConst("phiL", phiL); + + mu::Parser fctvel_F2_init; + fctvel_F2_init.SetExpr("U"); + fctvel_F2_init.DefineConst("U", 0); + + velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm())); + ////////////////////////////////////////////////////////////////////////////////// + // BC visitor + MultiphaseBoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + bcVisitor.addBC(denBCAdapter); //Ohne das BB? + bcVisitor.addBC(velBCAdapterF1); + SPtr<D3Q27Interactor> inflowF1Int; SPtr<D3Q27Interactor> cylInt; if (newStart) { @@ -220,34 +263,6 @@ void run(string configname) GenBlocksGridVisitor genBlocks(gridCube); grid->accept(genBlocks); - // BC Adapter - ////////////////////////////////////////////////////////////////////////////// - SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); - noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm())); - - SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB)); - denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm())); - - mu::Parser fctPhi_F1; - fctPhi_F1.SetExpr("phiH"); - fctPhi_F1.DefineConst("phiH", phiH); - - mu::Parser fctPhi_F2; - fctPhi_F2.SetExpr("phiL"); - fctPhi_F2.DefineConst("phiL", phiL); - - mu::Parser fctvel_F2_init; - fctvel_F2_init.SetExpr("U"); - fctvel_F2_init.DefineConst("U", 0); - - velBCAdapterF1->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm())); - ////////////////////////////////////////////////////////////////////////////////// - // BC visitor - MultiphaseBoundaryConditionsBlockVisitor bcVisitor; - bcVisitor.addBC(noSlipBCAdapter); - bcVisitor.addBC(denBCAdapter); //Ohne das BB? - bcVisitor.addBC(velBCAdapterF1); - SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor( grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); @@ -286,8 +301,7 @@ void run(string configname) cylInt->addBCAdapter(velBCAdapterF2); //SPtr<D3Q27Interactor> cyl2Int(new D3Q27Interactor(cylinder2, grid, noSlipBCAdapter, Interactor3D::SOLID)); - SPtr<Grid3DVisitor> metisVisitor( - new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW)); + InteractorsHelper intHelper(grid, metisVisitor, true); intHelper.addInteractor(cylInt); intHelper.addInteractor(tubes); @@ -335,8 +349,7 @@ void run(string configname) UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); } - MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, densityRatio, beta, kappa, theta, availMem, - needMem); + MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, availMem, needMem); grid->accept(kernelVisitor); @@ -347,16 +360,56 @@ void run(string configname) intHelper.setBC(); - grid->accept(bcVisitor); - // initialization of distributions mu::Parser fct1; fct1.SetExpr("phiL"); fct1.DefineConst("phiL", phiL); - MultiphaseInitDistributionsBlockVisitor initVisitor(densityRatio, interfaceThickness, radius); + //MultiphaseInitDistributionsBlockVisitor initVisitor(interfaceThickness); + MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor; initVisitor.setPhi(fct1); grid->accept(initVisitor); - +/////////////////////////////////////////////////////////////////////////////////////////// + //{ + // std::vector<std::vector<SPtr<Block3D>>> blockVector; + // int gridRank = comm->getProcessID(); + // int minInitLevel = grid->getCoarsestInitializedLevel(); + // int maxInitLevel = grid->getFinestInitializedLevel(); + // blockVector.resize(maxInitLevel + 1); + // for (int level = minInitLevel; level <= maxInitLevel; level++) { + // grid->getBlocks(level, gridRank, true, blockVector[level]); + //} + // for (int level = minInitLevel; level <= maxInitLevel; level++) { + // for (SPtr<Block3D> block : blockVector[level]) { + // if (block) { + // int ix1 = block->getX1(); + // int ix2 = block->getX2(); + // int ix3 = block->getX3(); + // int level = block->getLevel(); + + // for (int dir = 0; dir < D3Q27System::ENDDIR; dir++) { + // SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level); + + // if (!neighBlock) { + + // } + // } + // } + // } + //} + // SPtr<Block3D> block = grid->getBlock(0, 0, 0, 0); + // SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel()); + // SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + + // for (int ix3 = 0; ix3 <= 13; ix3++) { + // for (int ix2 = 0; ix2 <= 13; ix2++) { + // for (int ix1 = 0; ix1 <= 13; ix1++) { + // if (ix1 == 0 || ix2 == 0 || ix3 == 0 || ix1 == 13 || ix2 == 13 || ix3 == 13) + // bcArray->setUndefined(ix1, ix2, ix3); + // } + // } + // } + //} + //////////////////////////////////////////////////////////////////////////////////////////// // boundary conditions grid { SPtr<UbScheduler> geoSch(new UbScheduler(1)); @@ -388,11 +441,16 @@ void run(string configname) UBLOG(logINFO, "Restart - end"); } - TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); - grid->accept(setConnsVisitor); + // TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + // grid->accept(setConnsVisitor); - //ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); - //grid->accept(setConnsVisitor); + //ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + + grid->accept(bcVisitor); + + //ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); SPtr<UbScheduler> visSch(new UbScheduler(outTime)); SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor( diff --git a/apps/cpu/Multiphase/MultiphaseGeier.cfg b/apps/cpu/Multiphase/MultiphaseGeier.cfg new file mode 100644 index 0000000000000000000000000000000000000000..d701725832cfd7337d383e9c98a60243c0c9b54e --- /dev/null +++ b/apps/cpu/Multiphase/MultiphaseGeier.cfg @@ -0,0 +1,68 @@ +#pathname = E:/Multiphase/HesamCodeWithCumulantsDensRatio +#pathname = E:/Multiphase/HesamCodeWithCumulantsQuartic +#pathname = E:/Multiphase/HesamCode +pathname = E:/Multiphase/VelocityFormSig1e-3SVarDens +pathGeo = C:/Users/geier/Documents/VirtualFluids_dev_Kostya/apps/cpu/Multiphase/backup +geoFile=tubeTransformed.stl +#geoFile = JetBreakup2.ASCII.stl +numOfThreads = 4 +availMem = 10e9 + +#Grid + +#boundingBox = -1.0 121.0 0.5 629.0 -1.0 121.0 #(Jet Breakup) (Original with inlet length) +#boundingBox = -60.5 60.5 -1.0 -201.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length) +#blocknx = 22 20 22 + +#boundingBox = -60.5 60.5 -1.0 -21.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length) +#boundingBox = -60.5 60.5 -21.0 -1.0 -60.5 60.5 #(Jet Breakup2) (Original without inlet length) +#blocknx = 22 20 22 + + +#dx = 0.5 + +#boundingBox = 6.0e-3 46.0e-3 -5e-3 5e-3 -5e-3 5e-3 +#boundingBox = 6.0e-3 86.0e-3 -5e-3 5e-3 -5e-3 5e-3 +#blocknx = 480 60 60 #20 20 20 + +boundingBox = 6.0e-3 16.0e-3 -5e-3 5e-3 -5e-3 5e-3 +blocknx = 20 20 20 + +#boundingBox = 6.0e-3 16.0e-3 -5e-3 5e-3 -5e-3 5e-3 +#blocknx = 60 60 60 #20 20 20 + + +dx = 1.66666666667e-4 + +refineLevel = 0 + +#Simulation +uLB =0.005# 0.0000005 #inlet velocity +#uLB=0.001 +uF2 = 0.0001 +Re = 10 +nuL =1e-3#1e-2# 1.0e-5 #!1e-2 +nuG =1e-6#1e-2# 1.16e-4 #!1e-2 +densityRatio = 1000#1000#1000 #30 +sigma =1e-3# 1e-4 #4.66e-3 #surface tension 1e-4 ./. 1e-5 +interfaceThickness = 5 +radius = 615.0 (Jet Breakup) +contactAngle = 110.0 +gravity = 0.0 +#gravity = -5.04e-6 +phi_L = 0.0 +phi_H = 1.0 +Phase-field Relaxation = 0.6 +Mobility = 0.1 #0.02 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1 + + +logToFile = false + +newStart = true +restartStep = 100000 + +cpStart = 100000 +cpStep = 100000 + +outTime = 100 +endTime = 200000000 \ No newline at end of file diff --git a/apps/cpu/MultiphaseDropletTest/DropletTest.cfg b/apps/cpu/MultiphaseDropletTest/DropletTest.cfg index 72c0144890c2fd8ba25fa0dfb7528fdbd1b889d8..016e34072c1ff69e284cc1743ad684cb1a382e82 100644 --- a/apps/cpu/MultiphaseDropletTest/DropletTest.cfg +++ b/apps/cpu/MultiphaseDropletTest/DropletTest.cfg @@ -1,32 +1,33 @@ -pathname = d:/temp/MultiphaseDropletTest +#pathname = d:/temp/MultiphaseDropletTest +pathname = E:/Multiphase/DropletTest_Test numOfThreads = 4 availMem = 10e9 #Grid -boundingBox = 0 128 0 64 0 64 -blocknx = 8 8 8 +boundingBox = 0 256 512 768 0 3 +blocknx = 16 16 3 dx = 1 refineLevel = 0 #Simulation -uLB = 0.005 +uLB = 0 #0.001#0.005#0.005 Re = 10 -nuL =1e-2# 1.0e-5 #!1e-2 -nuG =1e-2# 1.16e-4 #!1e-2 -densityRatio = 1000 -sigma = 1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5 -interfaceThickness = 5 -radius = 16 +nuL = 1e-2 #1e-5# 1.0e-5 #!1e-2 +nuG = 0.015811388300841892 #5e-2 #1e-4 # 1e-8 # 1.16e-4 #!1e-2 +densityRatio = 10 +sigma = 1.0850694444444444e-06 #1e-10 #1e-6 # 1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5 +interfaceThickness = 4.096 +radius = 25.6 contactAngle = 110.0 #gravity = 0.0 -gravity = -5.04e-6 +gravity = -1.0348028606838648e-08 #-5.04e-6 phi_L = 0.0 phi_H = 1.0 Phase-field Relaxation = 0.6 -Mobility = 0.02 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1 +Mobility = 0.056 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1 logToFile = false @@ -34,8 +35,10 @@ logToFile = false newStart = true restartStep = 100000 -cpStart = 100000 -cpStep = 100000 +cpStart = 1000 +cpStep = 1000 -outTime = 1 -endTime = 10000 \ No newline at end of file +outTime = 100 +endTime = 10000 + +rStep = 159990 #160000 \ No newline at end of file diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp index fe27ecce81cd97215600b54d613e7123cb80f261..54b59fcfd8bd93f220b3d3d4ebb5bb29881079e5 100644 --- a/apps/cpu/MultiphaseDropletTest/droplet.cpp +++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp @@ -2,6 +2,11 @@ #include <string> #include <memory> +#if defined(__unix__) +#include <stdio.h> +#include <stdlib.h> +#endif + #include "VirtualFluids.h" using namespace std; @@ -24,7 +29,7 @@ void run(string configname) int interfaceThickness = config.getValue<int>("interfaceThickness"); double radius = config.getValue<double>("radius"); double theta = config.getValue<double>("contactAngle"); - double gr = config.getValue<double>("gravity"); + //double gr = config.getValue<double>("gravity"); double phiL = config.getValue<double>("phi_L"); double phiH = config.getValue<double>("phi_H"); double tauH = config.getValue<double>("Phase-field Relaxation"); @@ -37,13 +42,11 @@ void run(string configname) double Re = config.getValue<double>("Re"); double dx = config.getValue<double>("dx"); bool logToFile = config.getValue<bool>("logToFile"); - //double restartStep = config.getValue<double>("restartStep"); - //double cpStart = config.getValue<double>("cpStart"); - //double cpStep = config.getValue<double>("cpStep"); + double restartStep = config.getValue<double>("restartStep"); + double cpStart = config.getValue<double>("cpStart"); + double cpStep = config.getValue<double>("cpStep"); bool newStart = config.getValue<bool>("newStart"); - - double beta = 12 * sigma / interfaceThickness; - double kappa = 1.5 * interfaceThickness * sigma; + //double rStep = config.getValue<double>("rStep"); SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); int myid = comm->getProcessID(); @@ -65,6 +68,22 @@ void run(string configname) UbLog::output_policy::setStream(logFilename.str()); } } + + std::string fileName = "./LastTimeStep" + std::to_string((int)boundingBox[1]) + ".txt"; + +//#if defined(__unix__) +// double lastTimeStep = 0; +// //if (!newStart) +// { +// std::ifstream ifstr(fileName); +// ifstr >> lastTimeStep; +// restartStep = lastTimeStep; +// if(endTime >= lastTimeStep) +// endTime = lastTimeStep + rStep; +// else +// return; +// } +//#endif //Sleep(30000); @@ -72,6 +91,49 @@ void run(string configname) LBMReal rhoLB = 0.0; LBMReal nuLB = nuL; //(uLB*dLB) / Re; + //diameter of circular droplet + LBMReal D = 2.0*radius; + + //density retio + LBMReal r_rho = densityRatio; + + //density of heavy fluid + LBMReal rho_h = 1.0; + //density of light fluid + LBMReal rho_l = rho_h / r_rho; + + //kinimatic viscosity + LBMReal nu_h = nuL; + //LBMReal nu_l = nuG; + //#dynamic viscosity + LBMReal mu_h = rho_h * nu_h; + + //gravity + LBMReal g_y = Re* Re* mu_h* mu_h / (rho_h * (rho_h - rho_l) * D * D * D); + //Eotvos number + LBMReal Eo = 100; + //surface tension + sigma = rho_h* g_y* D* D / Eo; + + //g_y = 0; + + double beta = 12.0 * sigma / interfaceThickness; + double kappa = 1.5 * interfaceThickness * sigma; + + if (myid == 0) { + //UBLOG(logINFO, "uLb = " << uLB); + //UBLOG(logINFO, "rho = " << rhoLB); + UBLOG(logINFO, "D = " << D); + UBLOG(logINFO, "nuL = " << nuL); + UBLOG(logINFO, "nuG = " << nuG); + UBLOG(logINFO, "Re = " << Re); + UBLOG(logINFO, "Eo = " << Eo); + UBLOG(logINFO, "g_y = " << g_y); + UBLOG(logINFO, "sigma = " << sigma); + UBLOG(logINFO, "dx = " << dx); + UBLOG(logINFO, "Preprocess - start"); + } + SPtr<LBMUnitConverter> conv(new LBMUnitConverter()); //const int baseLevel = 0; @@ -79,43 +141,66 @@ void run(string configname) SPtr<LBMKernel> kernel; //kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel()); - kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel()); - //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel()); + //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel()); + kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel()); + + mu::Parser fgr; + fgr.SetExpr("-(rho-rho_l)*g_y"); + fgr.DefineConst("rho_l", rho_l); + fgr.DefineConst("g_y", g_y); kernel->setWithForcing(true); - kernel->setForcingX1(gr); - kernel->setForcingX2(0.0); + kernel->setForcingX1(0.0); + kernel->setForcingX2(fgr); kernel->setForcingX3(0.0); kernel->setPhiL(phiL); kernel->setPhiH(phiH); kernel->setPhaseFieldRelaxation(tauH); kernel->setMobility(mob); + kernel->setInterfaceWidth(interfaceThickness); + + + kernel->setCollisionFactorMultiphase(nuL, nuG); + kernel->setDensityRatio(densityRatio); + kernel->setMultiphaseModelParameters(beta, kappa); + kernel->setContactAngle(theta); SPtr<BCProcessor> bcProc(new BCProcessor()); // BCProcessorPtr bcProc(new ThinWallBCProcessor()); kernel->setBCProcessor(bcProc); + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm())); + ////////////////////////////////////////////////////////////////////////////////// + // BC visitor + MultiphaseBoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + SPtr<Grid3D> grid(new Grid3D(comm)); grid->setDeltaX(dx); grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); grid->setPeriodicX1(true); - grid->setPeriodicX2(true); + grid->setPeriodicX2(false); grid->setPeriodicX3(true); + grid->setGhostLayerWidth(2); + + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); ////////////////////////////////////////////////////////////////////////// // restart - //SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart)); - ////SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm)); - ////SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, pathname, comm)); + SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart)); + //SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm)); + SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm)); //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm)); - //rcp->setNu(nuLB); - //rcp->setNuLG(nuL, nuG); - //rcp->setDensityRatio(densityRatio); + // rcp->setNu(nuLB); + // rcp->setNuLG(nuL, nuG); + // rcp->setDensityRatio(densityRatio); - //rcp->setLBMKernel(kernel); - //rcp->setBCProcessor(bcProc); + rcp->setLBMKernel(kernel); + rcp->setBCProcessor(bcProc); ////////////////////////////////////////////////////////////////////////// if (newStart) { @@ -135,32 +220,33 @@ void run(string configname) GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); - if (myid == 0) { - UBLOG(logINFO, "uLb = " << uLB); - UBLOG(logINFO, "rho = " << rhoLB); - UBLOG(logINFO, "nuLb = " << nuLB); - UBLOG(logINFO, "Re = " << Re); - UBLOG(logINFO, "dx = " << dx); - UBLOG(logINFO, "Preprocess - start"); - } + GenBlocksGridVisitor genBlocks(gridCube); grid->accept(genBlocks); + double dx2 = 2.0 * dx; + GbCuboid3DPtr wallYmin(new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_minX2, g_maxX3 + dx2)); + GbSystem3D::writeGeoObject(wallYmin.get(), pathname + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallYmax(new GbCuboid3D(g_minX1 - dx2, g_maxX2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2)); + GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance()); + + SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor( grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); - //SPtr<Grid3DVisitor> metisVisitor( - // new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW)); - //InteractorsHelper intHelper(grid, metisVisitor); - //intHelper.selectBlocks(); + InteractorsHelper intHelper(grid, metisVisitor, true); + intHelper.addInteractor(wallYminInt); + intHelper.addInteractor(wallYmaxInt); + intHelper.selectBlocks(); ppblocks->process(0); ppblocks.reset(); unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks(); - int ghostLayer = 3; + int ghostLayer = 5; unsigned long long numberOfNodesPerBlock = (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]); unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock; @@ -185,8 +271,7 @@ void run(string configname) UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); } - MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, densityRatio, beta, kappa, theta, availMem, - needMem); + MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, availMem, needMem); grid->accept(kernelVisitor); @@ -196,14 +281,13 @@ void run(string configname) } - //intHelper.setBC(); - - //grid->accept(bcVisitor); + intHelper.setBC(); // initialization of distributions - LBMReal x1c = (g_maxX1 - g_minX1-1)/2; - LBMReal x2c = (g_maxX2 - g_minX2-1)/2; - LBMReal x3c = (g_maxX3 - g_minX3-1)/2; + LBMReal x1c = 2.5 * D; // (g_maxX1 - g_minX1-1)/2; // + LBMReal x2c = 12.5 * D; //(g_maxX2 - g_minX2-1)/2; + LBMReal x3c = 1.5; //2.5 * D; //(g_maxX3 - g_minX3-1)/2; + //LBMReal x3c = 2.5 * D; mu::Parser fct1; fct1.SetExpr("0.5-0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)"); fct1.DefineConst("x1c", x1c); @@ -214,6 +298,7 @@ void run(string configname) mu::Parser fct2; fct2.SetExpr("0.5*uLB-uLB*0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)"); + //fct2.SetExpr("uLB"); fct2.DefineConst("uLB", uLB); fct2.DefineConst("x1c", x1c); fct2.DefineConst("x2c", x2c); @@ -221,7 +306,8 @@ void run(string configname) fct2.DefineConst("radius", radius); fct2.DefineConst("interfaceThickness", interfaceThickness); - MultiphaseInitDistributionsBlockVisitor initVisitor(densityRatio, interfaceThickness, radius); + //MultiphaseInitDistributionsBlockVisitor initVisitor(densityRatio); + MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor; initVisitor.setPhi(fct1); initVisitor.setVx1(fct2); grid->accept(initVisitor); @@ -250,34 +336,63 @@ void run(string configname) UBLOG(logINFO, "path = " << pathname); } - //rcp->restart((int)restartStep); - //grid->setTimeStep(restartStep); + rcp->restart((int)restartStep); + grid->setTimeStep(restartStep); if (myid == 0) UBLOG(logINFO, "Restart - end"); } - TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); - grid->accept(setConnsVisitor); + grid->accept(bcVisitor); + + //TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + //grid->accept(setConnsVisitor); - //ThreeDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + //ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); //grid->accept(setConnsVisitor); + TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); + SPtr<UbScheduler> visSch(new UbScheduler(outTime)); + double t_ast, t; + t_ast = 2; + t = (int)(t_ast/std::sqrt(g_y/D)); + visSch->addSchedule(t,t,t); //t=2 + t_ast = 3; + t = (int)(t_ast/std::sqrt(g_y/D)); + visSch->addSchedule(t,t,t); //t=3 + t_ast = 4; + t = (int)(t_ast/std::sqrt(g_y/D)); + visSch->addSchedule(t,t,t); //t=4 + t_ast = 5; + t = (int)(t_ast/std::sqrt(g_y/D)); + visSch->addSchedule(t,t,t); //t=5 + t_ast = 6; + t = (int)(t_ast/std::sqrt(g_y/D)); + visSch->addSchedule(t,t,t); //t=6 + t_ast = 7; + t = (int)(t_ast/std::sqrt(g_y/D)); + visSch->addSchedule(t,t,t); //t=7 + t_ast = 9; + t = (int)(t_ast/std::sqrt(g_y/D)); + visSch->addSchedule(t,t,t); //t=9 + SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor( grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); - //SPtr<WriteMacroscopicQuantitiesCoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor( - // grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); + if(grid->getTimeStep() == 0) + pp->process(0); SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); + omp_set_num_threads(numOfThreads); + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); calculator->addCoProcessor(npr); calculator->addCoProcessor(pp); - //calculator->addCoProcessor(rcp); - + calculator->addCoProcessor(rcp); if (myid == 0) @@ -285,6 +400,25 @@ void run(string configname) calculator->calculate(); if (myid == 0) UBLOG(logINFO, "Simulation-end"); + +//#if defined(__unix__) +// //if (!newStart) +// //{ +// if (myid == 0) +// { +// std::ofstream ostr(fileName); +// ostr << endTime; +// cout << "start sbatch\n"; +// //system("./start.sh"); +// //system("echo test!"); +// std::string str = "sbatch startJob" + std::to_string((int)boundingBox[1]) + ".sh"; +// //system("sbatch startJob512.sh"); +// system(str.c_str()); +// } +// //MPI_Barrier((MPI_Comm)comm->getNativeCommunicator()); +// //} +//#endif + } catch (std::exception &e) { cerr << e.what() << endl << flush; } catch (std::string &s) { diff --git a/apps/cpu/Nozzle/CMakeLists.txt b/apps/cpu/Nozzle/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..b653be79cefa91cb64408bdb7e7507bd79a57b26 --- /dev/null +++ b/apps/cpu/Nozzle/CMakeLists.txt @@ -0,0 +1,3 @@ +PROJECT(Nozzle) + +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} LiggghtsCoupling FILES nozzle.cpp ) diff --git a/apps/cpu/Nozzle/in.nozzle b/apps/cpu/Nozzle/in.nozzle new file mode 100644 index 0000000000000000000000000000000000000000..7b633f5538c72f164a7ddd25eedd0a20dc751467 --- /dev/null +++ b/apps/cpu/Nozzle/in.nozzle @@ -0,0 +1,127 @@ +# shotcrete nozzle simulation + +atom_style granular +atom_modify map array +boundary f f f +newton off + +communicate single vel yes + +units si + +#region domain block -1.35 -1.25 0.34 0.44 -0.25 0.25 units box +region domain block -1.35 -1.25 0.34 0.44 -0.4 0.25 units box +create_box 1 domain + +neighbor 0.002 bin +neigh_modify delay 0 + + +#Material properties required for new pair styles + +fix m1 all property/global youngsModulus peratomtype 5.e6 +fix m2 all property/global poissonsRatio peratomtype 0.45 +fix m3 all property/global coefficientRestitution peratomtypepair 1 0.3 +fix m4 all property/global coefficientFriction peratomtypepair 1 0.5 +fix m5 all property/global k_finnie peratomtypepair 1 1.0 + +# lb coupling fix +fix lbcoupling all couple/lb/onetoone + +#New pair style +pair_style gran model hertz tangential history #Hertzian without cohesion +pair_coeff * * + +timestep ${t_step} + +fix gravi all gravity 9.81 vector 0.0 0.0 -1.0 + +#the chute +#variable meshes_dir string d:/Projects/TRR277/Project/WP4/Liggghts/ +variable meshes_dir string d:/Projects/TRR277/Project/WP4/Liggghts/A04/ + +fix cad1 all mesh/surface file ${meshes_dir}Duese_Acc_Einlass.stl type 1 scale 0.001 +fix cad2 all mesh/surface file ${meshes_dir}Duese_Acc_Verteiler.stl type 1 scale 0.001 +fix cad3 all mesh/surface file ${meshes_dir}Duese_Air_Einlass.stl type 1 scale 0.001 +fix cad4 all mesh/surface file ${meshes_dir}Duese_Air_Verteiler.stl type 1 scale 0.001 +fix cad5 all mesh/surface file ${meshes_dir}Duese_Volcan_Duese.stl type 1 scale 0.001 +fix cad6 all mesh/surface file ${meshes_dir}Duese_Zwischenstueck.stl type 1 element_exclusion_list read list.file scale 0.001 curvature_tolerant yes + +fix inface all mesh/surface file ${meshes_dir}InsertDisk2.stl type 1 scale 0.001 +fix wallTop all mesh/surface file ${meshes_dir}InsertDisk3.stl type 1 scale 0.001 + +#fix granwalls all wall/gran model hertz tangential history mesh n_meshes 7 meshes cad1 cad2 cad3 cad4 cad5 cad6 wallTop +fix granwalls all wall/gran model hertz tangential history mesh n_meshes 8 meshes cad1 cad2 cad3 cad4 cad5 cad6 wallTop inface + +#distributions for insertion + +fix pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2500 radius constant 0.001 +fix pts2 all particletemplate/sphere 15485867 atom_type 1 density constant 2500 radius constant 0.002 +fix pdd1 all particledistribution/discrete 32452843 2 pts1 0.3 pts2 0.7 + +#region and insertion +group nve_group region domain +#region bc cylinder z 0.0 0.0 0.015 0.201 0.23 units box +#region bc cylinder z 0.0 0.0 10 213 220 units box + +region bc cylinder z -1.3013105 0.388582 0.01275005 0.18055 0.20105 units box + +#particle insertion +# fix ins nve_group insert/stream seed 32452867 distributiontemplate pdd1 & + # nparticles 6000 massrate 0.1 insert_every 1000 overlapcheck yes all_in no vel constant 0.0 0.0 -1.0 & + # insertion_face inface + + +# fix ins nve_group insert/stream seed 32452867 distributiontemplate pdd1 & + # nparticles 6000 massrate 0.1 insert_every 1000 overlapcheck yes all_in no vel constant 0.0 0.0 -1.0 & + # insertion_face inface + + # fix ins nve_group insert/stream seed 32452867 distributiontemplate pdd1 & + # nparticles 6000 massrate 0.1 insert_every ones overlapcheck yes all_in no vel constant 0.0 0.0 -1.0 & + # insertion_face inface + +#working setup +# fix ins nve_group insert/pack seed 32452867 distributiontemplate pdd1 insert_every 1000 & + # overlapcheck yes vel constant 0.0 0.0 -1.0 volumefraction_region 0.1 region bc ntry_mc 1001 +fix ins nve_group insert/pack seed 32452867 distributiontemplate pdd1 insert_every 10 & + overlapcheck yes vel constant 0.0 0.0 -1.0 volumefraction_region 0.1 region bc ntry_mc 1001 + +# fix ins all insert/stream seed 32452867 distributiontemplate pdd1 & + # nparticles INF massrate 0.1 overlapcheck yes all_in yes vel constant 0.0 0.0 -1.0 & + # insertion_face inface extrude_length 0.25 + + + +#apply nve integration to all particles that are inserted as single particles +fix integr nve_group nve/sphere + +#output settings, include total thermal energy +compute 1 all erotate/sphere +thermo_style custom step atoms ke c_1 vol +thermo 1000 +thermo_modify lost ignore norm no + +variable dmp_time_cad equal 100000000 + +dump dumpcad1 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad1_*.stl cad1 +dump dumpcad2 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad2_*.stl cad2 +dump dumpcad3 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad3_*.stl cad3 +dump dumpcad4 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad4_*.stl cad4 +dump dumpcad5 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad5_*.stl cad5 +dump dumpcad6 all mesh/stl ${dmp_time_cad} ${dmp_dir}/cad6_*.stl cad6 +dump dumpinface all mesh/stl ${dmp_time_cad} ${dmp_dir}/inface_*.stl inface +dump dumpwallTop all mesh/stl ${dmp_time_cad} ${dmp_dir}/wallTop_*.stl wallTop + +#insert the first particles so that dump is not empty +run 1 +dump dmp all custom/vtk ${dmp_stp} ${dmp_dir}/particles_*.vtk id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius + + +#run 1 +#run 1 + +#insert particles +#run 100000 upto +#unfix ins + + diff --git a/apps/cpu/Nozzle/nozzle.cpp b/apps/cpu/Nozzle/nozzle.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ab07f1f91ae20990d970e5850bec79607cf2b741 --- /dev/null +++ b/apps/cpu/Nozzle/nozzle.cpp @@ -0,0 +1,463 @@ +#include <iostream> +#include <string> +#include <memory> + +#include "VirtualFluids.h" + +#include "LiggghtsCouplingCoProcessor.h" +#include "LiggghtsCouplingWrapper.h" +#include "IBcumulantK17LBMKernel.h" + +using namespace std; + + +int main(int argc, char *argv[]) +{ + //Sleep(30000); + + std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + + // bounding box + //double g_minX1 = -1341.81e-3; + //double g_minX2 = 348.087e-3; + //double g_minX3 = -210e-3; + + //double g_maxX1 = -1260.81e-3; + //double g_maxX2 = 429.087e-3; + //double g_maxX3 = 214.5e-3; + + double g_minX1 = -1341.81e-3 + 10e-3; + double g_minX2 = 0.360872; + double g_minX3 = 0;//-210e-3; + + double g_maxX1 = -1260.81e-3 - 10e-3; + double g_maxX2 = 0.416302; + double g_maxX3 = 0.20105; //210e-3; + + int blockNX[3] = { 10, 10, 10 }; + + double dx = 1e-3; + + double uLB = 0.0001; + //double rhoLB = 0.0; + + // concrete + double d_part = 1e-3; + double V = 0.4; // flow rate [m^3/h] + double D = 0.026; // shotcrete inlet diameter [m] + double R = D / 2.0; // radius [m] + double A = UbMath::PI * R * R; + double u = V / 3600 / A; + double muConcrete = 2.1133054011798826; // [Pa s] + double tau0 = 715.218181094648; // + double rhoConcrete = 2400; // [kg/m^3] + double nu = muConcrete / rhoConcrete; + double rhoAir = 1.2041; // [kg/m^3] + //double Re_D = d_part * u / nu; + //if (myid == 0) UBLOG(logINFO, "Re_D = " << Re_D); + // + SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 2400, d_part / dx, uLB); + //double nuLB = D*units->getFactorLentghWToLb() * u*units->getFactorVelocityWToLb() / Re_D; + //if (myid == 0) UBLOG(logINFO, "nuLB = " << nuLB); + + double interfaceThickness = 4.096; + double sigma = 0.03; + double Re = rhoConcrete * u * d_part / muConcrete; + double We = rhoConcrete * u * u * d_part / sigma; + + double nu_h_LB = uLB * d_part / Re; + double nu_l_LB = nu_h_LB; + if (myid == 0) UBLOG(logINFO, "nu_h = " << nu_h_LB << " nu_l = " << nu_l_LB); + + double rho_h_LB = 1; + + // surface tension + double sigma_LB = rho_h_LB * uLB * uLB * d_part / We; + if (myid == 0) UBLOG(logINFO, "sigma_LB = " << sigma_LB); + + // LBMReal dLB = 0; // = length[1] / dx; + LBMReal rhoLB = 0.0; + //LBMReal nuLB = nu_l; //(uLB*dLB) / Re; + + double beta = 12.0 * sigma_LB / interfaceThickness; + double kappa = 1.5 * interfaceThickness * sigma_LB; + + double phiL = 0.0; + double phiH = 1.0; + double tauH = 0.6; // Phase - field Relaxation + double mob = 0.02; // Mobility + //double nuL = 1e-2; + //double nuG = 0.015811388300841892; + double densityRatio = rhoConcrete / rhoAir; + //double sigma_old = 1.0850694444444444e-06; + // + //double beta_old = 12.0 * sigma / interfaceThickness; + //double kappa_old = 1.5 * interfaceThickness * sigma; + + double theta = 110; //contact angle + + //https://civilsir.com/density-of-cement-sand-and-aggregate-in-kg-m3-list-of-material-density/ + + // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, 1.480, 2060, r_p/dx); + // SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(r_p, LBMUnitConverter::AIR_20C, r_p / dx); + //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 1000, d_part / dx, std::abs(uLB)); + //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 1000, d_part / dx, std::abs(uLB)); + //SPtr<LBMUnitConverter> units = std::make_shared<LBMUnitConverter>(d_part, 1., 2400, d_part / dx, uRef); + if (myid == 0) std::cout << units->toString() << std::endl; + + //SPtr<LBMKernel> kernel = make_shared<IBcumulantK17LBMKernel>(); + //SPtr<LBMKernel> kernel = make_shared<CumulantK17LBMKernel>(); + //SPtr<LBMKernel> kernel = make_shared<MultiphaseTwoPhaseFieldsPressureFilterLBMKernel>(); + SPtr<LBMKernel> kernel = make_shared<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(); + + kernel->setWithForcing(true); + kernel->setForcingX1(0.0); + kernel->setForcingX2(0.0); + kernel->setForcingX3(0.0); + + kernel->setPhiL(phiL); + kernel->setPhiH(phiH); + kernel->setPhaseFieldRelaxation(tauH); + kernel->setMobility(mob); + kernel->setInterfaceWidth(interfaceThickness); + + kernel->setCollisionFactorMultiphase(nu_h_LB, nu_l_LB); + kernel->setDensityRatio(densityRatio); + kernel->setMultiphaseModelParameters(beta, kappa); + kernel->setContactAngle(theta); + + SPtr<BCProcessor> bcProc = make_shared<BCProcessor>(); + kernel->setBCProcessor(bcProc); + + //SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm())); + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm())); + + + mu::Parser fct; + + { + // concrete inflow boundary condition + fct.SetExpr("U"); + fct.DefineConst("U", -u*units->getFactorVelocityWToLb()); + if (myid == 0) UBLOG(logINFO, "Concrete inflow velocity = " << u << " m/s"); + if (myid == 0) UBLOG(logINFO, "Concrete inflow velocity = " << u*units->getFactorVelocityWToLb() << " dx/dt"); + // // Štigler, J. (2014). Analytical velocity profile in tube for laminar and turbulent flow. Engineering + // // Mechanics, 21(6), 371-379. + // double cx1 = -1.31431 + R; + // double cx2 = 0.375582 + R; + // //double cx3 = 0.20105 + R; + // double L = g_maxX1 - g_minX1; + // double p_concrete = 7e5; // Pa = 7 Bar + // double p1 = p_concrete * units->getFactorPressureWToLb(); + // double p2 = 0.0; + // double drhoLB = 1.0 + rhoLB; + // double muLB = drhoLB * nuLB; + // double N = R * R / 2 * muLB * uLB * (p1 - p2) / L - 3; + + // // mu::Parser fct; + // fct.SetExpr("U*(1-(((((x2-y0)^2+(x1-x0)^2)^0.5)/R)^NplusOne))"); + // fct.DefineConst("x0", cx1); + // fct.DefineConst("y0", cx2); + // //fct.DefineConst("z0", cx3); + // fct.DefineConst("R", R); + // fct.DefineConst("U", uLB * ((N + 3) / (N + 1))); + // fct.DefineConst("NplusOne", N + 1.0); + } + + //SPtr<BCAdapter> inflowConcreteBCAdapter(new VelocityBCAdapter(false, false, true, fct, 0, BCFunction::INFCONST)); + //inflowConcreteBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); + SPtr<BCAdapter> inflowConcreteBCAdapter(new MultiphaseVelocityBCAdapter(false, false, true, fct, phiH, 0, BCFunction::INFCONST)); + inflowConcreteBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm())); + + { + //air inflow boundary condition + // Štigler, J. (2014). Analytical velocity profile in tube for laminar and turbulent flow. Engineering + // Mechanics, 21(6), 371-379. + //SPtr<LBMUnitConverter> unitsAir = std::make_shared<LBMUnitConverter>(d_part, LBMUnitConverter::AIR_20C, d_part / dx); + SPtr<LBMUnitConverter> unitsAir = std::make_shared<LBMUnitConverter>(d_part, 1., 1.2041, d_part / dx, uLB); + double V = 40; // flow rate [m^3/h] + double D = 0.0166; // air inlet diameter [m] + double R = D / 2.0; // radius [m] + double A = UbMath::PI * R * R; + double u = V / 3600 / A; + double uLB = u * unitsAir->getFactorVelocityWToLb(); + //double cx1 = -1.2788 + R; + double cx2 = 0.3803 + R; + double cx3 = 0.1517 + R; + double L = g_maxX1 - g_minX1; + double p_air = 7e5; // Pa = 7 Bar + double p1 = p_air; + double p2 = 0.0; + double mu = 17.2e-6; //Pa s, air 20° C + double N = R * R / 2 * mu * u * (p1 - p2) / L - 3; + if (myid == 0) UBLOG(logINFO, "Air inflow velocity = " << u << " m/s"); + if (myid == 0) UBLOG(logINFO, "Air inflow velocity = " << uLB << " dx/dt"); + + double nu = mu / rhoConcrete; + double Re = D * u / nu; + if (myid == 0) UBLOG(logINFO, "Re_air = " << Re); + + double nuLB = D * unitsAir->getFactorLentghWToLb() * uLB * unitsAir->getFactorVelocityWToLb() / Re; + if (myid == 0) UBLOG(logINFO, "nuLB_air = " << nuLB); + + // mu::Parser fct; + fct.SetExpr("U"); + fct.DefineConst("U", -uLB); + //fct.SetExpr("U*(1-(((((x2-y0)^2+(x3-z0)^2)^0.5)/R)^NplusOne))"); + ////fct.DefineConst("x0", cx1); + //fct.DefineConst("y0", cx2); + //fct.DefineConst("z0", cx3); + //fct.DefineConst("R", R); + //fct.DefineConst("U", -uLB * ((N + 3) / (N + 1))); + //fct.DefineConst("NplusOne", N + 1.0); + } + + //SPtr<BCAdapter> inflowAirBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST)); + //inflowAirBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); + SPtr<BCAdapter> inflowAirBCAdapter(new MultiphaseVelocityBCAdapter(true, false, false, fct, phiL, 0, BCFunction::INFCONST)); + inflowAirBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseVelocityBCAlgorithm())); + + SPtr<BCAdapter> outflowBCAdapter(new DensityBCAdapter(rhoLB)); + //outflowBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm())); + //SPtr<BCAdapter> outflowBCAdapter(new DensityBCAdapter(rhoLB)); + outflowBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNonReflectingOutflowBCAlgorithm())); + ////////////////////////////////////////////////////////////////////////////////// + // BC visitor + //BoundaryConditionsBlockVisitor bcVisitor;♣ + MultiphaseBoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + bcVisitor.addBC(inflowConcreteBCAdapter); + bcVisitor.addBC(inflowAirBCAdapter); + bcVisitor.addBC(outflowBCAdapter); + + SPtr<Grid3D> grid = make_shared<Grid3D>(comm); + grid->setPeriodicX1(false); + grid->setPeriodicX2(false); + grid->setPeriodicX3(false); + grid->setDeltaX(dx); + grid->setBlockNX(blockNX[0], blockNX[1], blockNX[2]); + grid->setGhostLayerWidth(2); + + string geoPath = "d:/Projects/TRR277/Project/WP4/NozzleGeo"; + + string outputPath = "d:/temp/NozzleFlowTest_Multiphase"; + UbSystem::makeDirectory(outputPath); + UbSystem::makeDirectory(outputPath + "/liggghts"); + + //if (myid == 0) { + // stringstream logFilename; + // logFilename << outputPath + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt"; + // UbLog::output_policy::setStream(logFilename.str()); + //} + + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); + + SPtr<GbObject3D> gridCube = make_shared <GbCuboid3D>(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3); + if (myid == 0) + GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + //geo + ////////////////////////////////////////////////////////// + int accuracy = Interactor3D::EDGES; + /////////////////////////////////// + SPtr<GbTriFaceMesh3D> meshNozzleAirDistributor = std::make_shared<GbTriFaceMesh3D>(); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirDistributor:start"); + meshNozzleAirDistributor->readMeshFromSTLFileASCII(geoPath + "/01_Nozzle_Air_Distributor.stl", false); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirDistributor:end"); + if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAirDistributor.get(), outputPath + "/geo/meshNozzleAirDistributor", WbWriterVtkXmlBinary::getInstance()); + SPtr<Interactor3D> intrNozzleAirDistributor = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAirDistributor, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy); + /////////////////////////////////////////////////////////// + SPtr<GbTriFaceMesh3D> meshNozzleAirInlet = std::make_shared<GbTriFaceMesh3D>(); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirInlet:start"); + meshNozzleAirInlet->readMeshFromSTLFileASCII(geoPath + "/02_Nozzle_Air_Inlet.stl", false); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleAirInlet:end"); + if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAirInlet.get(), outputPath + "/geo/meshNozzleAirInlet", WbWriterVtkXmlBinary::getInstance()); + SPtr<Interactor3D> intrNozzleAirInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAirInlet, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy); + /////////////////////////////////////////////////////////// + SPtr<GbTriFaceMesh3D> meshNozzleSpacer = std::make_shared<GbTriFaceMesh3D>(); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleSpacer:start"); + meshNozzleSpacer->readMeshFromSTLFileASCII(geoPath + "/03_Nozzle_Spacer.stl", true); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleSpacer:end"); + if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleSpacer.get(), outputPath + "/geo/meshNozzleSpacer", WbWriterVtkXmlBinary::getInstance()); + SPtr<Interactor3D> intrNozzleSpacer = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleSpacer, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy); + /////////////////////////////////////////////////////////// + SPtr<GbTriFaceMesh3D> meshNozzleAccDistributor = std::make_shared<GbTriFaceMesh3D>(); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccDistributor:start"); + meshNozzleAccDistributor->readMeshFromSTLFileASCII(geoPath + "/04_Nozzle_Acc_Distributor.stl", false); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccDistributor:end"); + if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAccDistributor.get(), outputPath + "/geo/meshNozzleAccDistributor", WbWriterVtkXmlBinary::getInstance()); + SPtr<Interactor3D> intrNozzleAccDistributor = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAccDistributor, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy); + /////////////////////////////////////////////////////////// + SPtr<GbTriFaceMesh3D> meshNozzleAccInlet = std::make_shared<GbTriFaceMesh3D>(); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccInlet:start"); + meshNozzleAccInlet->readMeshFromSTLFileASCII(geoPath + "/05_Nozzle_Acc_Inlet.stl", false); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleAccInlet:end"); + if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleAccInlet.get(), outputPath + "/geo/meshNozzleAccInlet", WbWriterVtkXmlBinary::getInstance()); + SPtr<Interactor3D> intrNozzleAccInlet = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleAccInlet, grid, noSlipBCAdapter, Interactor3D::SOLID, (Interactor3D::Accuracy)accuracy); + /////////////////////////////////////////////////////////// + SPtr<GbTriFaceMesh3D> meshNozzleVolcanNozzle1 = std::make_shared<GbTriFaceMesh3D>(); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle1:start"); + meshNozzleVolcanNozzle1->readMeshFromSTLFileBinary(geoPath + "/06_1_Nozzle_Volcan_Nozzle.stl", true); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle1:end"); + if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleVolcanNozzle1.get(), outputPath + "/geo/meshNozzleVolcanNozzle1", WbWriterVtkXmlBinary::getInstance()); + SPtr<Interactor3D> intrNozzleVolcanNozzle1 = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleVolcanNozzle1, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES); + /////////////////////////////////////////////////////////// + SPtr<GbTriFaceMesh3D> meshNozzleVolcanNozzle2 = std::make_shared<GbTriFaceMesh3D>(); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle2:start"); + meshNozzleVolcanNozzle2->readMeshFromSTLFileBinary(geoPath + "/06_2_Nozzle_Volcan_Nozzle.stl", true); + if (myid == 0) UBLOG(logINFO, "Read meshNozzleVolcanNozzle2:end"); + if (myid == 0) GbSystem3D::writeGeoObject(meshNozzleVolcanNozzle2.get(), outputPath + "/geo/meshNozzleVolcanNozzle2", WbWriterVtkXmlBinary::getInstance()); + SPtr<Interactor3D> intrNozzleVolcanNozzle2 = std::make_shared<D3Q27TriFaceMeshInteractor>(meshNozzleVolcanNozzle2, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES); + /////////////////////////////////////////////////////////// + //box + SPtr<D3Q27Interactor> intrBox = SPtr<D3Q27Interactor>(new D3Q27Interactor(gridCube, grid, noSlipBCAdapter, Interactor3D::INVERSESOLID)); + /////////////////////////////////////////////////////////// + //inflow + GbCylinder3DPtr geoInflow(new GbCylinder3D(-1.30181+0.0005, 0.390872-0.00229, 0.20105, -1.30181+0.0005, 0.390872-0.00229, 0.23, 0.013)); + if (myid == 0) GbSystem3D::writeGeoObject(geoInflow.get(), outputPath + "/geo/geoInflow", WbWriterVtkXmlASCII::getInstance()); + SPtr<D3Q27Interactor> intrInflow = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoInflow, grid, inflowConcreteBCAdapter, Interactor3D::SOLID)); + /////////////////////////////////////////////////////////// + //outflow + GbCylinder3DPtr geoOutflow(new GbCylinder3D(-1.30181+0.0005, 0.390872-0.00229, -0.22, -1.30181+0.0005, 0.390872-0.00229, -0.21, 0.013)); + if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), outputPath + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance()); + SPtr<D3Q27Interactor> intrOutflow = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, outflowBCAdapter, Interactor3D::SOLID)); + /////////////////////////////////////////////////////////// + SPtr<GbTriFaceMesh3D> geoAirInlet = std::make_shared<GbTriFaceMesh3D>(); + if (myid == 0) UBLOG(logINFO, "Read Air_Inlet:start"); + geoAirInlet->readMeshFromSTLFileASCII(geoPath + "/Air_Inlet.stl", true); + if (myid == 0) UBLOG(logINFO, "Read Air_Inlet:end"); + if (myid == 0) GbSystem3D::writeGeoObject(geoAirInlet.get(), outputPath + "/geo/geoAirInlet", WbWriterVtkXmlBinary::getInstance()); + SPtr<Interactor3D> intrAirInlet = std::make_shared<D3Q27TriFaceMeshInteractor>( + geoAirInlet, grid, inflowAirBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES); + /////////////////////////////////////////////////////////// + + InteractorsHelper intHelper(grid, metisVisitor, true); + intHelper.addInteractor(intrBox); + intHelper.addInteractor(intrInflow); + intHelper.addInteractor(intrAirInlet); + intHelper.addInteractor(intrOutflow); + intHelper.addInteractor(intrNozzleAirDistributor); + intHelper.addInteractor(intrNozzleAirInlet); + intHelper.addInteractor(intrNozzleSpacer); + intHelper.addInteractor(intrNozzleAccDistributor); + intHelper.addInteractor(intrNozzleAccInlet); + intHelper.addInteractor(intrNozzleVolcanNozzle1); + intHelper.addInteractor(intrNozzleVolcanNozzle2); + + + intHelper.selectBlocks(); + + SPtr<CoProcessor> ppblocks = make_shared<WriteBlocksCoProcessor>( + grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm); + ppblocks->process(0); + ppblocks.reset(); + + if (myid == 0) UBLOG(logINFO, Utilities::toString(grid, comm->getNumberOfProcesses())); + + + //SetKernelBlockVisitor kernelVisitor(kernel, nuLB, comm->getNumberOfProcesses()); + MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nu_h_LB, nu_l_LB, 1e9, 1); + grid->accept(kernelVisitor); + + intHelper.setBC(); + + //InitDistributionsBlockVisitor initVisitor; + //grid->accept(initVisitor); + + double x1c = -1.31431 + R; + double x2c = 0.375582 + R; + double x3c = 0.20105; + + mu::Parser fct1; + //fct1.SetExpr(" 0.5 - 0.5 * tanh(2 * (sqrt((x1 - x1c) ^ 2 + (x2 - x2c) ^ 2 + (x3 - x3c) ^ 2) - radius) / interfaceThickness)"); + fct1.SetExpr(" 0.5 - 0.5 * tanh(2 * (sqrt((x1 - x1c) ^ 2 + (x2 - x2c) ^ 2 + (x3 - x3c) ^ 2) - radius) / interfaceThickness)"); + fct1.DefineConst("x1c", x1c); + fct1.DefineConst("x2c", x2c); + fct1.DefineConst("x3c", x3c); + fct1.DefineConst("radius", R); + fct1.DefineConst("interfaceThickness", interfaceThickness * dx); + + MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor; + initVisitor.setPhi(fct1); + grid->accept(initVisitor); + + + string inFile1 = "d:/Projects/VirtualFluids_Develop/apps/cpu/Nozzle/in.nozzle"; + //string inFile2 = "d:/Projects/VirtualFluids_LIGGGHTS_coupling/apps/cpu/LiggghtsApp/in2.lbdem"; + MPI_Comm mpi_comm = *(MPI_Comm*)(comm->getNativeCommunicator()); + LiggghtsCouplingWrapper wrapper(argv, mpi_comm); + + double v_frac = 0.1; + double dt_phys = units->getFactorTimeLbToW(); + int demSubsteps = 10; + double dt_dem = dt_phys / (double)demSubsteps; + int vtkSteps = 1000; + string demOutDir = outputPath + "/liggghts"; + + //wrapper.execCommand("echo none"); + + //wrapper.execFile((char*)inFile1.c_str()); + + //// set timestep and output directory + wrapper.setVariable("t_step", dt_dem); + wrapper.setVariable("dmp_stp", vtkSteps * demSubsteps); + wrapper.setVariable("dmp_dir", demOutDir); + + //wrapper.execFile((char *)inFile1.c_str()); + //wrapper.runUpto(demSubsteps - 1); + //wrapper.runUpto(1000); + + SPtr<UbScheduler> lScheduler = make_shared<UbScheduler>(1); + SPtr<LiggghtsCouplingCoProcessor> lcCoProcessor = + make_shared<LiggghtsCouplingCoProcessor>(grid, lScheduler, comm, wrapper, demSubsteps, units); + + // boundary conditions grid + { + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm)); + ppgeo->process(0); + ppgeo.reset(); + } + + grid->accept(bcVisitor); + + //OneDistributionSetConnectorsBlockVisitor setConnsVisitor(comm); + //TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); + + int numOfThreads = 18; + omp_set_num_threads(numOfThreads); + + SPtr<UbScheduler> nupsSch = std::make_shared<UbScheduler>(10, 10, 100); + SPtr<NUPSCounterCoProcessor> nupsCoProcessor = make_shared<NUPSCounterCoProcessor>(grid, nupsSch, numOfThreads, comm); + + //// write data for visualization of macroscopic quantities + SPtr < UbScheduler> visSch(new UbScheduler(vtkSteps)); + //SPtr<UbScheduler> visSch(new UbScheduler(1, 8700, 8800)); + // visSch->addSchedule(1, 8700, 8800); + SPtr<WriteMultiphaseQuantitiesCoProcessor> writeMQCoProcessor( + new WriteMultiphaseQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlASCII::getInstance(), + SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + writeMQCoProcessor->process(0); + + int endTime = 1000000; + SPtr<Calculator> calculator(new BasicCalculator(grid, lScheduler, endTime)); + calculator->addCoProcessor(nupsCoProcessor); + // calculator->addCoProcessor(lcCoProcessor); + calculator->addCoProcessor(writeMQCoProcessor); + + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); + + + return 0; +} diff --git a/apps/cpu/PoiseuilleFlow/pf1.cpp b/apps/cpu/PoiseuilleFlow/pf1.cpp index 4e4d87ecc797db7545b2dae84e1f76220a02cc33..d4d856d51f66a1ac6800e1f2f78da5b219b54488 100644 --- a/apps/cpu/PoiseuilleFlow/pf1.cpp +++ b/apps/cpu/PoiseuilleFlow/pf1.cpp @@ -11,7 +11,7 @@ void pf1() int myid = comm->getProcessID(); //parameters - string pathOut = "/gfs1/work/niikonst/pflow_pipe_forcing"; + string pathOut = "d:/temp/test_dir_naming"; //"/gfs1/work/niikonst/pflow_pipe_forcing"; int numOfThreads = 1; int blocknx[3] ={ 10,10,10 }; double endTime = 10; @@ -27,12 +27,12 @@ void pf1() //simulation bounding box double g_minX1 = 0.0; - double g_minX2 = -50.0; - double g_minX3 = -50.0; + double g_minX2 = -10.0; + double g_minX3 = -10.0; - double g_maxX1 = 2000; - double g_maxX2 = 50; - double g_maxX3 = 50; + double g_maxX1 = 50; + double g_maxX2 = 10; + double g_maxX3 = 10; //Sleep(15000); @@ -76,7 +76,7 @@ void pf1() //set boundary conditions for blocks and create process decomposition for MPI SPtr<D3Q27Interactor> cylinderInt(new D3Q27Interactor(cylinder, grid, noSlipBCAdapter, Interactor3D::INVERSESOLID)); - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B)); + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M)); InteractorsHelper intHelper(grid, metisVisitor); intHelper.addInteractor(cylinderInt); intHelper.selectBlocks(); @@ -169,11 +169,11 @@ void pf1() //grid=SPtr<Grid3D>(new Grid3D(comm)); //restartCoProcessor->restart(200); - SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, pathOut + "/mig", comm)); - migCoProcessor->setLBMKernel(kernel); - migCoProcessor->setBCProcessor(bcProc); - migCoProcessor->setNu(nuLB); - migCoProcessor->restart(10); + //SPtr<MPIIOMigrationBECoProcessor> migCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, metisVisitor, pathOut + "/mig", comm)); + //migCoProcessor->setLBMKernel(kernel); + //migCoProcessor->setBCProcessor(bcProc); + //migCoProcessor->setNu(nuLB); + //migCoProcessor->restart(10); ppblocks->process(1); @@ -192,7 +192,7 @@ void pf1() SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); calculator->addCoProcessor(npr); calculator->addCoProcessor(writeMQCoProcessor); - calculator->addCoProcessor(migCoProcessor); + //calculator->addCoProcessor(migCoProcessor); //calculator->addCoProcessor(restartCoProcessor); if (myid == 0) UBLOG(logINFO, "Simulation-start"); diff --git a/apps/cpu/RisingBubble2D/CMakeLists.txt b/apps/cpu/RisingBubble2D/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..5741f1441d806d59a9efd1dd689e5ddba0e5eafc --- /dev/null +++ b/apps/cpu/RisingBubble2D/CMakeLists.txt @@ -0,0 +1,3 @@ +PROJECT(RisingBubble2D) + +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES RisingBubble2D.cpp ) diff --git a/apps/cpu/RisingBubble2D/RisingBubble2D.cfg b/apps/cpu/RisingBubble2D/RisingBubble2D.cfg new file mode 100644 index 0000000000000000000000000000000000000000..d0635ea272199311a6e09a68e77ae7ca59a239f0 --- /dev/null +++ b/apps/cpu/RisingBubble2D/RisingBubble2D.cfg @@ -0,0 +1,47 @@ +pathname = E:/Multiphase/RisingBubble2D_dr10_test + +numOfThreads = 4 +availMem = 10e9 + +#Grid + +#boundingBox = 0 160 0 320 0 3 +#blocknx = 16 16 3 +#blocknx = 80 80 3 + +boundingBox = 0 20 0 20 0 3 +blocknx = 20 20 3 + +dx = 1 +refineLevel = 0 + +#Simulation +uLB = 0 #0.001#0.005#0.005 +Re = 35 +#Eotvos number +Eo = 10; +nuL = 1e-3 +nuG = 1e-3 +densityRatio = 10 +sigma = 1.0850694444444444e-06 #1e-10 #1e-6 # 1e-5 #4.66e-3 #surface tension 1e-4 ./. 1e-5 +interfaceThickness = 4.096 +radius = 5 #40 +contactAngle = 110.0 +phi_L = 0.0 +phi_H = 1.0 +Phase-field Relaxation = 0.6 +Mobility = 0.056 # 0.01 ./. 0.08, fine correction of Phase-field Relaxation parameter, to activate it need to change in kernel tauH to tauH1 + + +logToFile = false + +newStart = false +restartStep = 10 + +cpStart = 10 +cpStep = 10 + +outTime = 100000 +endTime = 13 + +rStep = 159990 #160000 \ No newline at end of file diff --git a/apps/cpu/RisingBubble2D/RisingBubble2D.cpp b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp new file mode 100644 index 0000000000000000000000000000000000000000..19677aac71768b7cc0a5acba13e06c22dd6f4658 --- /dev/null +++ b/apps/cpu/RisingBubble2D/RisingBubble2D.cpp @@ -0,0 +1,455 @@ +#include <iostream> +#include <string> +#include <memory> + +#if defined(__unix__) +#include <stdio.h> +#include <stdlib.h> +#endif + +#include "VirtualFluids.h" + +using namespace std; + +void run(string configname) +{ + try { + vf::basics::ConfigurationFile config; + config.load(configname); + + string pathname = config.getValue<string>("pathname"); + int numOfThreads = config.getValue<int>("numOfThreads"); + vector<int> blocknx = config.getVector<int>("blocknx"); + vector<double> boundingBox = config.getVector<double>("boundingBox"); + double uLB = config.getValue<double>("uLB"); + double nuL = config.getValue<double>("nuL"); + double nuG = config.getValue<double>("nuG"); + double densityRatio = config.getValue<double>("densityRatio"); + //double sigma = config.getValue<double>("sigma"); + int interfaceThickness = config.getValue<int>("interfaceThickness"); + double radius = config.getValue<double>("radius"); + double theta = config.getValue<double>("contactAngle"); + double phiL = config.getValue<double>("phi_L"); + double phiH = config.getValue<double>("phi_H"); + double tauH = config.getValue<double>("Phase-field Relaxation"); + double mob = config.getValue<double>("Mobility"); + + double endTime = config.getValue<double>("endTime"); + double outTime = config.getValue<double>("outTime"); + double availMem = config.getValue<double>("availMem"); + int refineLevel = config.getValue<int>("refineLevel"); + double Re = config.getValue<double>("Re"); + double Eo = config.getValue<double>("Eo"); + double dx = config.getValue<double>("dx"); + bool logToFile = config.getValue<bool>("logToFile"); + double restartStep = config.getValue<double>("restartStep"); + double cpStart = config.getValue<double>("cpStart"); + double cpStep = config.getValue<double>("cpStep"); + bool newStart = config.getValue<bool>("newStart"); + //double rStep = config.getValue<double>("rStep"); + + std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + if (myid == 0) + UBLOG(logINFO, "2D Rising Bubble: Start!"); + + if (logToFile) { +#if defined(__unix__) + if (myid == 0) { + const char *str = pathname.c_str(); + mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + } +#endif + + if (myid == 0) { + stringstream logFilename; + logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt"; + UbLog::output_policy::setStream(logFilename.str()); + } + } + + std::string fileName = "./LastTimeStep" + std::to_string((int)boundingBox[1]) + ".txt"; + +//#if defined(__unix__) +// double lastTimeStep = 0; +// if (!newStart) +// { +// std::ifstream ifstr(fileName); +// ifstr >> lastTimeStep; +// restartStep = lastTimeStep; +// if(endTime >= lastTimeStep) +// endTime = lastTimeStep + rStep; +// else +// return; +// } +//#endif + + //Sleep(20000); + + // LBMReal dLB = 0; // = length[1] / dx; + LBMReal rhoLB = 0.0; + LBMReal nuLB = nuL; //(uLB*dLB) / Re; + + //diameter of circular droplet + LBMReal D = 2.0*radius; + + //density retio + //LBMReal r_rho = densityRatio; + + //density of heavy fluid + LBMReal rho_h = 1.0; + //density of light fluid + //LBMReal rho_l = rho_h / r_rho; + + //kinimatic viscosity + LBMReal nu_h = nuL; + //LBMReal nu_l = nuG; + //#dynamic viscosity + //LBMReal mu_h = rho_h * nu_h; + + //gravity + LBMReal g_y = Re * Re * nu_h * nu_h / (D*D*D); + //Eotvos number + //LBMReal Eo = 100; + //surface tension + LBMReal sigma = rho_h * g_y * D * D / Eo; + + //g_y = 0; + + double beta = 12.0 * sigma / interfaceThickness; + double kappa = 1.5 * interfaceThickness * sigma; + + if (myid == 0) { + //UBLOG(logINFO, "uLb = " << uLB); + //UBLOG(logINFO, "rho = " << rhoLB); + UBLOG(logINFO, "D = " << D); + UBLOG(logINFO, "nuL = " << nuL); + UBLOG(logINFO, "nuG = " << nuG); + UBLOG(logINFO, "Re = " << Re); + UBLOG(logINFO, "Eo = " << Eo); + UBLOG(logINFO, "g_y = " << g_y); + UBLOG(logINFO, "sigma = " << sigma); + UBLOG(logINFO, "dx = " << dx); + UBLOG(logINFO, "Preprocess - start"); + } + + SPtr<LBMUnitConverter> conv(new LBMUnitConverter()); + + //const int baseLevel = 0; + + SPtr<LBMKernel> kernel; + + //kernel = SPtr<LBMKernel>(new MultiphaseScratchCumulantLBMKernel()); + // kernel = SPtr<LBMKernel>(new MultiphaseCumulantLBMKernel()); + //kernel = SPtr<LBMKernel>(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel()); + kernel = SPtr<LBMKernel>(new MultiphasePressureFilterLBMKernel()); + + mu::Parser fgr; + fgr.SetExpr("-rho*g_y"); + fgr.DefineConst("g_y", g_y); + + kernel->setWithForcing(true); + kernel->setForcingX1(0.0); + kernel->setForcingX2(fgr); + kernel->setForcingX3(0.0); + + kernel->setPhiL(phiL); + kernel->setPhiH(phiH); + kernel->setPhaseFieldRelaxation(tauH); + kernel->setMobility(mob); + kernel->setInterfaceWidth(interfaceThickness); + + + kernel->setCollisionFactorMultiphase(nuL, nuG); + kernel->setDensityRatio(densityRatio); + kernel->setMultiphaseModelParameters(beta, kappa); + kernel->setContactAngle(theta); + dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(1.0); + + SPtr<BCProcessor> bcProc(new BCProcessor()); + + kernel->setBCProcessor(bcProc); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseNoSlipBCAlgorithm())); + SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter()); + slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new MultiphaseSlipBCAlgorithm())); + ////////////////////////////////////////////////////////////////////////////////// + // BC visitor + MultiphaseBoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + bcVisitor.addBC(slipBCAdapter); + + SPtr<Grid3D> grid(new Grid3D(comm)); + grid->setDeltaX(dx); + grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); + grid->setPeriodicX1(false); + grid->setPeriodicX2(false); + grid->setPeriodicX3(true); + grid->setGhostLayerWidth(2); + + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); + + ////////////////////////////////////////////////////////////////////////// + // restart + SPtr<UbScheduler> rSch(new UbScheduler(cpStep, cpStart)); + SPtr<MPIIORestartCoProcessor> rcp(new MPIIORestartCoProcessor(grid, rSch, pathname, comm)); + //SPtr<MPIIOMigrationCoProcessor> rcp(new MPIIOMigrationCoProcessor(grid, rSch, metisVisitor, pathname, comm)); + //SPtr<MPIIOMigrationBECoProcessor> rcp(new MPIIOMigrationBECoProcessor(grid, rSch, pathname, comm)); + // rcp->setNu(nuLB); + // rcp->setNuLG(nuL, nuG); + //rcp->setDensityRatio(densityRatio); + + rcp->setLBMKernel(kernel); + rcp->setBCProcessor(bcProc); + ////////////////////////////////////////////////////////////////////////// + + if (newStart) { + + // bounding box + double g_minX1 = boundingBox[0]; + double g_minX2 = boundingBox[2]; + double g_minX3 = boundingBox[4]; + + double g_maxX1 = boundingBox[1]; + double g_maxX2 = boundingBox[3]; + double g_maxX3 = boundingBox[5]; + + // geometry + SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + if (myid == 0) + GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", + WbWriterVtkXmlBinary::getInstance()); + + + + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + double dx2 = 2.0 * dx; + GbCuboid3DPtr wallXmin(new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_minX1, g_maxX2 + dx2, g_maxX3 + dx2)); + GbSystem3D::writeGeoObject(wallXmin.get(), pathname + "/geo/wallXmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallXmax(new GbCuboid3D(g_maxX1, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2)); + GbSystem3D::writeGeoObject(wallXmax.get(), pathname + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr wallYmin(new GbCuboid3D(g_minX1 - dx2, g_minX2 - dx2, g_minX3 - dx2, g_maxX1 + dx2, g_minX2, g_maxX3 + dx2)); + GbSystem3D::writeGeoObject(wallYmin.get(), pathname + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance()); + GbCuboid3DPtr wallYmax(new GbCuboid3D(g_minX1 - dx2, g_maxX2, g_minX3 - dx2, g_maxX1 + dx2, g_maxX2 + dx2, g_maxX3 + dx2)); + GbSystem3D::writeGeoObject(wallYmax.get(), pathname + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance()); + + SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, slipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, slipBCAdapter, Interactor3D::SOLID)); + + SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor( + grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); + + InteractorsHelper intHelper(grid, metisVisitor, true); + intHelper.addInteractor(wallXminInt); + intHelper.addInteractor(wallXmaxInt); + intHelper.addInteractor(wallYminInt); + intHelper.addInteractor(wallYmaxInt); + intHelper.selectBlocks(); + + ppblocks->process(0); + ppblocks.reset(); + + unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks(); + int ghostLayer = 5; + unsigned long long numberOfNodesPerBlock = + (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]); + unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock; + unsigned long long numberOfNodesPerBlockWithGhostLayer = + numberOfBlocks * (blocknx[0] + ghostLayer) * (blocknx[1] + ghostLayer) * (blocknx[2] + ghostLayer); + double needMemAll = + double(numberOfNodesPerBlockWithGhostLayer * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4)); + double needMem = needMemAll / double(comm->getNumberOfProcesses()); + + if (myid == 0) { + UBLOG(logINFO, "Number of blocks = " << numberOfBlocks); + UBLOG(logINFO, "Number of nodes = " << numberOfNodes); + int minInitLevel = grid->getCoarsestInitializedLevel(); + int maxInitLevel = grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) { + int nobl = grid->getNumberOfBlocks(level); + UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl); + UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock); + } + UBLOG(logINFO, "Necessary memory = " << needMemAll << " bytes"); + UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes"); + UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); + } + + MultiphaseSetKernelBlockVisitor kernelVisitor(kernel, nuL, nuG, availMem, needMem); + + grid->accept(kernelVisitor); + + if (refineLevel > 0) { + SetUndefinedNodesBlockVisitor undefNodesVisitor; + grid->accept(undefNodesVisitor); + } + + + intHelper.setBC(); + + // initialization of distributions + LBMReal x1c = D; + LBMReal x2c = D; + LBMReal x3c = 1.5; + //LBMReal x3c = 2.5 * D; + mu::Parser fct1; + fct1.SetExpr("0.5+0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)"); + fct1.DefineConst("x1c", x1c); + fct1.DefineConst("x2c", x2c); + fct1.DefineConst("x3c", x3c); + fct1.DefineConst("radius", radius); + fct1.DefineConst("interfaceThickness", interfaceThickness); + + mu::Parser fct2; + fct2.SetExpr("0.5*uLB+uLB*0.5*tanh(2*(sqrt((x1-x1c)^2+(x2-x2c)^2+(x3-x3c)^2)-radius)/interfaceThickness)"); + //fct2.SetExpr("uLB"); + fct2.DefineConst("uLB", uLB); + fct2.DefineConst("x1c", x1c); + fct2.DefineConst("x2c", x2c); + fct2.DefineConst("x3c", x3c); + fct2.DefineConst("radius", radius); + fct2.DefineConst("interfaceThickness", interfaceThickness); + + //MultiphaseInitDistributionsBlockVisitor initVisitor(densityRatio); + MultiphaseVelocityFormInitDistributionsBlockVisitor initVisitor; + initVisitor.setPhi(fct1); + initVisitor.setVx1(fct2); + grid->accept(initVisitor); + + // boundary conditions grid + { + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + SPtr<WriteBoundaryConditionsCoProcessor> ppgeo(new WriteBoundaryConditionsCoProcessor( + grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm)); + ppgeo->process(0); + ppgeo.reset(); + } + + if (myid == 0) + UBLOG(logINFO, "Preprocess - end"); + } else { + if (myid == 0) { + UBLOG(logINFO, "Parameters:"); + UBLOG(logINFO, "uLb = " << uLB); + UBLOG(logINFO, "rho = " << rhoLB); + UBLOG(logINFO, "nuLb = " << nuLB); + UBLOG(logINFO, "Re = " << Re); + UBLOG(logINFO, "dx = " << dx); + UBLOG(logINFO, "number of levels = " << refineLevel + 1); + UBLOG(logINFO, "numOfThreads = " << numOfThreads); + UBLOG(logINFO, "path = " << pathname); + } + + rcp->restart((int)restartStep); + grid->setTimeStep(restartStep); + + if (myid == 0) + UBLOG(logINFO, "Restart - end"); + } + + grid->accept(bcVisitor); + + //TwoDistributionsSetConnectorsBlockVisitor setConnsVisitor(comm); + //grid->accept(setConnsVisitor); + + //ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + //grid->accept(setConnsVisitor); + + TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor setConnsVisitor(comm); + grid->accept(setConnsVisitor); + + SPtr<UbScheduler> visSch(new UbScheduler(outTime)); + //visSch->addSchedule(307200,307200,307200); //t=2 + visSch->addSchedule(1228185,1228185,1228185); + //double t_ast, t; + //t_ast = 2; + //t = (int)(t_ast/std::sqrt(g_y/D)); + //visSch->addSchedule(t,t,t); //t=2 + //t_ast = 3; + //t = (int)(t_ast/std::sqrt(g_y/D)); + //visSch->addSchedule(t,t,t); //t=3 + //t_ast = 4; + //t = (int)(t_ast/std::sqrt(g_y/D)); + //visSch->addSchedule(t,t,t); //t=4 + //t_ast = 5; + //t = (int)(t_ast/std::sqrt(g_y/D)); + //visSch->addSchedule(t,t,t); //t=5 + //t_ast = 6; + //t = (int)(t_ast/std::sqrt(g_y/D)); + //visSch->addSchedule(t,t,t); //t=6 + //t_ast = 7; + //t = (int)(t_ast/std::sqrt(g_y/D)); + //visSch->addSchedule(t,t,t); //t=7 + //t_ast = 9; + //t = (int)(t_ast/std::sqrt(g_y/D)); + //visSch->addSchedule(t,t,t); //t=9 + + + SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor( + grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); + if(grid->getTimeStep() == 0) + pp->process(0); + + SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); + SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); + + //omp_set_num_threads(numOfThreads); + + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(pp); + calculator->addCoProcessor(rcp); + + + if (myid == 0) + UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) + UBLOG(logINFO, "Simulation-end"); + +//#if defined(__unix__) +// //if (!newStart) +// //{ +// if (myid == 0) +// { +// std::ofstream ostr(fileName); +// ostr << endTime; +// cout << "start sbatch\n"; +// //system("./start.sh"); +// //system("echo test!"); +// std::string str = "sbatch startJob" + std::to_string((int)boundingBox[1]) + ".sh"; +// //system("sbatch startJob512.sh"); +// system(str.c_str()); +// } +// //MPI_Barrier((MPI_Comm)comm->getNativeCommunicator()); +// //} +//#endif + + } catch (std::exception &e) { + cerr << e.what() << endl << flush; + } catch (std::string &s) { + cerr << s << endl; + } catch (...) { + cerr << "unknown exception" << endl; + } +} +int main(int argc, char *argv[]) +{ + // Sleep(30000); + if (argv != NULL) { + if (argv[1] != NULL) { + run(string(argv[1])); + } else { + cout << "Configuration file is missing!" << endl; + } + } +} diff --git a/apps/cpu/ViskomatXL/viskomat.cfg b/apps/cpu/ViskomatXL/viskomat.cfg index 4227ba9f821cfa9336a69c14b828829c6ff2ccb1..626948407375ec46c5f4d350416225f4159bb319 100644 --- a/apps/cpu/ViskomatXL/viskomat.cfg +++ b/apps/cpu/ViskomatXL/viskomat.cfg @@ -1,50 +1,38 @@ -outputPath = d:/temp/viskomatCylinderRestartTest3_Migration +outputPath = d:/temp/viskomatXL_restart_test geoPath = d:/Projects/TRR277/Project/WP1/Rheometer/Aileen -geoFile = fishbone.stl +#geoPath = d:/Projects/TRR277/Project/WP1/Rheometer +geoFile = fishboneT.stl +#geoFile = cylinder.stl -numOfThreads = 4 -availMem = 8e9 +numOfThreads = 1 +availMem = 15e9 logToFile = false -blocknx = 16 16 16 -#blocknx = 1 8 8 -#boundingBox = -4 171 -9.5 155.5 -76.5 82.5 -#boundingBox = -4 166 -9.5 155.5 -76.5 82.5 - -#boundingBox = -4 166 0 165 0 165 - -#boundingBox = -4 166 -82.5 82.5 -82.5 82.5 - +blocknx = 14 14 14 +#blocknx = 14 15 15 +#blocknx = 35 83 83 boundingBox = 0 140 -82.5 82.5 -82.5 82.5 -# around X -#blocknx = 1 16 16 -#boundingBox = 0 1 0 165 0 165 - -# around Y -#blocknx = 16 1 16 -#boundingBox = 0 165 0 1 0 165 - -#zero test -#blocknx = 8 8 8 -#boundingBox = 0 8 0 8 0 8 +#blocknx = 32 12 12 +#boundingBox = 0 32 -12 12 -12 12 +#boundingBox = 0 64 -24 24 -24 24 +#boundingBox = 0 64 -24 24 -24 24 deltax = 1 refineLevel = 0 -#nuLB = 1.5e-4 -OmegaLB = 1e-4 +OmegaLB = 1e-5 +mu = 5 # Pa s +N = 80 # rpm tau0 = 20e-7 +N = 30 -resolution = 32 -scaleFactor = 1 - -newStart = true -restartStep = 10000 +newStart = false +restartStep = 10 -cpStart = 10000 -cpStep = 10000 +cpStart = 10 +cpStep = 10 -outTime = 1000 -endTime = 1000000 \ No newline at end of file +outTime = 10000 +endTime = 20 \ No newline at end of file diff --git a/apps/cpu/ViskomatXL/viskomat.cpp b/apps/cpu/ViskomatXL/viskomat.cpp index be7d3e850b633f7f40b24eaffd024487447d0c12..0b20e9367f446f0f8d194e59d026d5a91f3e32e9 100644 --- a/apps/cpu/ViskomatXL/viskomat.cpp +++ b/apps/cpu/ViskomatXL/viskomat.cpp @@ -19,7 +19,6 @@ void bflow(string configname) int numOfThreads = config.getValue<int>("numOfThreads"); vector<int> blocknx = config.getVector<int>("blocknx"); vector<double> boundingBox = config.getVector<double>("boundingBox"); - //double nuLB = config.getValue<double>("nuLB"); double endTime = config.getValue<double>("endTime"); double outTime = config.getValue<double>("outTime"); double availMem = config.getValue<double>("availMem"); @@ -32,16 +31,13 @@ void bflow(string configname) bool newStart = config.getValue<bool>("newStart"); double OmegaLB = config.getValue<double>("OmegaLB"); double tau0 = config.getValue<double>("tau0"); - double scaleFactor = config.getValue<double>("scaleFactor"); - double resolution = config.getValue<double>("resolution"); + double N = config.getValue<double>("N"); + double mu = config.getValue<double>("mu"); - vf::basics::ConfigurationFile viscosity; - //viscosity.load(viscosityPath + "/viscosity.cfg"); - //double nuLB = viscosity.getValue<double>("nuLB"); - //outputPath = outputPath + "/rheometerBingham_" + config.getValue<string>("resolution") + "_" + config.getValue<string>("OmegaLB"); + vf::basics::ConfigurationFile viscosity; - SPtr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); + std::shared_ptr<vf::mpi::Communicator> comm = vf::mpi::MPICommunicator::getInstance(); int myid = comm->getProcessID(); if (logToFile) @@ -64,39 +60,32 @@ void bflow(string configname) LBMReal rhoLB = 0.0; - //akoustic - //OmegaLB /= scaleFactor; - //nuLB *=scaleFactor; - //endTime *= scaleFactor; - ////outTime = endTime; - //cpStart = endTime; - //cpStep = endTime; - -//diffusive - //OmegaLB /= scaleFactor * scaleFactor; - //tau0 /= scaleFactor * scaleFactor; - //endTime *= scaleFactor * scaleFactor; - //outTime = endTime; - //cpStart = endTime; - //cpStep = endTime; - - //double Re = 1.38230076758; - double N = 80; //rpm + //double N = 70; //rpm double Omega = 2 * UbMath::PI / 60.0 * N; //rad/s - double mu = 1; //Pa s + //double mu = 5; //Pa s double R = 0.165 / 2.0; //m double rho = 970; //kg/m^3 double Re = Omega * R * R * rho / mu; - double nuLB = OmegaLB * R * 1e3 * R * 1e3 / Re; + //double nuLB = OmegaLB * R * 1e3 * R * 1e3 / Re; - SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); - // double uWorld = (N * PI) / 30.0; //0.0037699111843 - // double rhoWorld = 2350.0; //kg/m^3 - //double R0 = boundingBox[0] * 0.5; + double dx = deltax * 1e-3; + double nuLB = OmegaLB * (R / dx)*(R / dx) / Re; + + double Bm = tau0/(mu*Omega); + double tau0LB = Bm*nuLB*OmegaLB; - //SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter(deltax, uWorld*R0, rhoWorld, 1.0, uLB)); - //if (myid == 0) UBLOG(logINFO, conv->toString()); + + //double dx = 1.0 * 1e-3; + //double nuLB = OmegaLB * (R / dx)*(R / dx) / Re; + + //acustic scaling + // OmegaLB /= 2.0; + // nuLB *= 2.0; + + SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); + //SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter(1, 1461, 970, 1e3)); + //UBLOG(logINFO, conv->toString()); //bounding box @@ -109,60 +98,35 @@ void bflow(string configname) double g_minX3 = boundingBox[4]; double g_maxX3 = boundingBox[5]; - //double g_minX1 = -boundingBox[0]/2.0; - //double g_minX2 = -boundingBox[1] / 2.0; - //double g_minX3 = -boundingBox[2]/2.0; - - //double g_maxX1 = boundingBox[0]/2.0; - //double g_maxX2 = boundingBox[1]/2.0; - //double g_maxX3 = boundingBox[2]/2.0; - -// double blockLength = 3.0 * deltax; - - // double d = 2.0 * radius; - // double U = uLB; - // double Gamma = U / d; - - // double muWorld = 20; //Pa*s - // double k = 0.0015; // muWorld / rhoWorld * conv->getFactorViscosityWToLb(); //(U * d) / (Re); - - // //double k = (U * d) / (Re * std::pow(Gamma, n - 1)); - // double yielStressWorld = 20; //Pa - // double tau0 = 1e-6;// 3e-6;//yielStressWorld * conv->getFactorPressureWToLb(); //Bn * k * std::pow(Gamma, n); - - //double k = 0.05; // (U * d) / (Re * std::pow(Gamma, n - 1)); - //double tau0 = 3e-6; //Bn * k * std::pow(Gamma, n); - - //double forcing = 8e-7; - - //double omegaMin = 1.0e-8; - SPtr<Rheology> thix = Rheology::getInstance(); //thix->setPowerIndex(n); //thix->setViscosityParameter(k); - thix->setYieldStress(tau0); + thix->setYieldStress(tau0LB); //thix->setOmegaMin(omegaMin); SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm())); //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyHerschelBulkleyModelNoSlipBCAlgorithm())); - //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm())); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelNoSlipBCAlgorithm())); SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter()); slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm())); + //slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SlipBCAlgorithm())); //// rotation around X-axis mu::Parser fctVy; - fctVy.SetExpr("-Omega*(x3-z0-r)"); + fctVy.SetExpr("-Omega*(x3-z0-r)/deltax"); fctVy.DefineConst("Omega", OmegaLB); fctVy.DefineConst("r", 0.5 * (g_maxX3 - g_minX3)); fctVy.DefineConst("z0", g_minX3); + fctVy.DefineConst("deltax", deltax); mu::Parser fctVz; - fctVz.SetExpr("Omega*(x2-y0-r)"); + fctVz.SetExpr("Omega*(x2-y0-r)/deltax"); fctVz.DefineConst("Omega", OmegaLB); fctVz.DefineConst("r", 0.5 * (g_maxX2 - g_minX2)); fctVz.DefineConst("y0", g_minX2); + fctVz.DefineConst("deltax", deltax); mu::Parser fctVx; fctVx.SetExpr("0.0"); @@ -183,8 +147,8 @@ void bflow(string configname) //fctVy.SetExpr("0.0"); SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, true, true, fctVx, fctVy, fctVz, 0, BCFunction::INFCONST)); - velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); - //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm())); + //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); + velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm())); //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm())); //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new RheologyBinghamModelVelocityBCAlgorithm())); @@ -195,7 +159,7 @@ void bflow(string configname) //BS visitor BoundaryConditionsBlockVisitor bcVisitor; - bcVisitor.addBC(noSlipBCAdapter); + //bcVisitor.addBC(noSlipBCAdapter); bcVisitor.addBC(slipBCAdapter); bcVisitor.addBC(velocityBCAdapter); //bcVisitor.addBC(densityBCAdapter); @@ -207,8 +171,8 @@ void bflow(string configname) //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantLBMKernel()); //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel()); //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new IncompressibleCumulantLBMKernel()); - SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantK17LBMKernel()); - //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyBinghamModelLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantK17LBMKernel()); + SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyBinghamModelLBMKernel()); //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel()); //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel()); kernel->setBCProcessor(bcProc); @@ -225,10 +189,14 @@ void bflow(string configname) SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + //////////////////////////////////////////// + //METIS + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::RECURSIVE)); + //////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //restart SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart)); - SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, outputPath, comm)); + SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm)); //SPtr<MPIIORestartCoProcessor> restartCoProcessor(new MPIIORestartCoProcessor(grid, mSch, outputPath, comm)); restartCoProcessor->setLBMKernel(kernel); restartCoProcessor->setBCProcessor(bcProc); @@ -237,26 +205,33 @@ void bflow(string configname) ////stator // rotation around X-axis - SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 - 3.0 * deltax, g_minX2 + 0.5 * (g_maxX2 - g_minX2), - g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_maxX1 + 3.0 * deltax, - g_minX2 + 0.5 * (g_maxX2 - g_minX2), g_minX3 + 0.5 * (g_maxX3 - g_minX3), 0.5 * (g_maxX3 - g_minX3) * 0.5)); - - // rotation around Y-axis - //SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 + 0.5 * (g_maxX1 - g_minX1), g_minX2 - 3.0 * deltax, - // g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_minX1 + 0.5 * (g_maxX1 - g_minX1), - // g_maxX2 + 3.0 * deltax, g_minX3 + 0.5 * (g_maxX3 - g_minX3), - // 0.5 * (g_maxX3 - g_minX3) * 0.5)); - - SPtr<D3Q27Interactor> statorInt = - SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID)); + //SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 - 3.0 * deltax, g_minX2 + 0.5 * (g_maxX2 - g_minX2), + // g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_maxX1 + 3.0 * deltax, + // g_minX2 + 0.5 * (g_maxX2 - g_minX2), g_minX3 + 0.5 * (g_maxX3 - g_minX3), 0.5 * (g_maxX3 - g_minX3) * 0.5)); + + // SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 - 4.0 * deltax, g_minX2 + 0.5 * (g_maxX2 - g_minX2), + // g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_maxX1 + 3.0 * deltax, + // g_minX2 + 0.5 * (g_maxX2 - g_minX2), g_minX3 + 0.5 * (g_maxX3 - g_minX3), 12.0*0.5)); + + //// // rotation around Y-axis + //// //SPtr<GbObject3D> stator(new GbCylinder3D(g_minX1 + 0.5 * (g_maxX1 - g_minX1), g_minX2 - 3.0 * deltax, + //// // g_minX3 + 0.5 * (g_maxX3 - g_minX3), g_minX1 + 0.5 * (g_maxX1 - g_minX1), + //// // g_maxX2 + 3.0 * deltax, g_minX3 + 0.5 * (g_maxX3 - g_minX3), + //// // 0.5 * (g_maxX3 - g_minX3) * 0.5)); + + // SPtr<D3Q27Interactor> statorInt = + // SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID)); - //SPtr<GbTriFaceMesh3D> stator = make_shared<GbTriFaceMesh3D>(); - //stator->readMeshFromSTLFileBinary(geoPath + "/" + geoFile, false); + SPtr<GbTriFaceMesh3D> stator = make_shared<GbTriFaceMesh3D>(); + stator->readMeshFromSTLFileBinary(geoPath + "/" + geoFile, false); + //stator->scale(2.0, 2.0, 2.0); + //stator->translate(16.0, 0.0, 0.0); //stator->translate(4.0, -73.0, -6.0); + + SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27TriFaceMeshInteractor>( + new D3Q27TriFaceMeshInteractor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES)); + GbSystem3D::writeGeoObject(stator.get(), outputPath + "/geo/stator", WbWriterVtkXmlBinary::getInstance()); - - //SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27TriFaceMeshInteractor>( - // new D3Q27TriFaceMeshInteractor(stator, grid, noSlipBCAdapter, Interactor3D::SOLID, Interactor3D::EDGES)); ////rotor (cylinder) // rotation around X-axis @@ -291,27 +266,22 @@ void bflow(string configname) if (myid == 0) { UBLOG(logINFO, "Parameters:"); - //UBLOG(logINFO, "forcing = " << forcing); UBLOG(logINFO, "N = " << N << " rpm"); UBLOG(logINFO, "Omega = " << Omega << " rad/s"); + UBLOG(logINFO, "mu = " << mu << " Pa s"); + UBLOG(logINFO, "tau0 = " << tau0<< " Pa"); + UBLOG(logINFO, "rho = " << rho<< " kg/m^3"); UBLOG(logINFO, "Re = " << Re); - UBLOG(logINFO, "rho = " << rhoLB); + UBLOG(logINFO, "Bm = " << Bm); + UBLOG(logINFO, "rhoLB = " << rhoLB); UBLOG(logINFO, "uLB = " << OmegaLB); UBLOG(logINFO, "nuLB = " << nuLB); - // UBLOG(logINFO, "Re = " << (U * d) / (k * std::pow(Gamma, n - 1))); - // UBLOG(logINFO, "Bn = " << tau0 /(k * std::pow(Gamma, n))); - // UBLOG(logINFO, "k = " << k); - // UBLOG(logINFO, "n = " << n); - UBLOG(logINFO, "tau0 = " << tau0); - UBLOG(logINFO, "scaleFactor = " << scaleFactor); - UBLOG(logINFO, "deltax = " << deltax); + UBLOG(logINFO, "tau0LB = " << tau0LB); + UBLOG(logINFO, "deltax = " << deltax << " mm"); UBLOG(logINFO, "number of levels = " << refineLevel + 1); UBLOG(logINFO, "number of threads = " << numOfThreads); UBLOG(logINFO, "number of processes = " << comm->getNumberOfProcesses()); UBLOG(logINFO, "blocknx = " << blocknx[0] << " " << blocknx[1] << " " << blocknx[2]); - UBLOG(logINFO, "resolution = " << resolution); - // UBLOG(logINFO, "boundingBox = " << boundingBox[0] << " " << boundingBox[1] << " " << boundingBox[2]); - // UBLOG(logINFO, "sphereCenter = " << sphereCenter[0] << " " << sphereCenter[1] << " " << sphereCenter[2]); UBLOG(logINFO, "output path = " << outputPath); UBLOG(logINFO, "Preprozess - start"); } @@ -335,17 +305,15 @@ void bflow(string configname) } - //////////////////////////////////////////// - //METIS - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); - //////////////////////////////////////////// + /////delete solid blocks if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); InteractorsHelper intHelper(grid, metisVisitor); - intHelper.addInteractor(wallXminInt); intHelper.addInteractor(wallXmaxInt); intHelper.addInteractor(statorInt); intHelper.addInteractor(rotorInt); + intHelper.addInteractor(wallXminInt); + intHelper.selectBlocks(); if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end"); ////////////////////////////////////// @@ -403,16 +371,16 @@ void bflow(string configname) else { restartCoProcessor->restart((int)restartStep); - grid->setTimeStep(restartStep); - //SetBcBlocksBlockVisitor v1(wallXminInt); - //grid->accept(v1); - //wallXminInt->initInteractor(); - // - //SetBcBlocksBlockVisitor v2(wallXmaxInt); - //grid->accept(v2); - //wallXmaxInt->initInteractor(); + //restartCoProcessor->readBlocks((int)restartStep); + //restartCoProcessor->readDataSet((int)restartStep); + ////restartCoProcessor->readBoundaryConds((int)restartStep); + //grid->setTimeStep((int)restartStep); + SetBcBlocksBlockVisitor v2(wallXmaxInt); + grid->accept(v2); + wallXmaxInt->initInteractor(); + SetBcBlocksBlockVisitor v3(statorInt); grid->accept(v3); statorInt->initInteractor(); @@ -421,10 +389,16 @@ void bflow(string configname) grid->accept(v4); rotorInt->initInteractor(); + SetBcBlocksBlockVisitor v1(wallXminInt); + grid->accept(v1); + wallXminInt->initInteractor(); + SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, + WbWriterVtkXmlBinary::getInstance(), comm)); + ppblocks->process(1); } - omp_set_num_threads(numOfThreads); + //omp_set_num_threads(numOfThreads); //set connectors //InterpolationProcessorPtr iProcessor(new ThixotropyInterpolationProcessor()); @@ -446,7 +420,7 @@ void bflow(string configname) SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); //writeMQCoProcessor->process(100); - SPtr<UbScheduler> forceSch(new UbScheduler(100)); + SPtr<UbScheduler> forceSch(new UbScheduler(1000)); SPtr<CalculateTorqueCoProcessor> fp = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueRotor.csv", comm); fp->addInteractor(rotorInt); SPtr<CalculateTorqueCoProcessor> fp2 = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueStator.csv", comm); @@ -457,9 +431,9 @@ void bflow(string configname) SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); calculator->addCoProcessor(npr); - calculator->addCoProcessor(fp); + //calculator->addCoProcessor(fp); calculator->addCoProcessor(fp2); - calculator->addCoProcessor(writeMQCoProcessor); + //calculator->addCoProcessor(writeMQCoProcessor); //calculator->addCoProcessor(writeThixotropicMQCoProcessor); calculator->addCoProcessor(restartCoProcessor); diff --git a/apps/cpu/rheometer/rheometer.cfg b/apps/cpu/rheometer/rheometer.cfg index 9eec8c6ded9b7a5ab8d1e6177c43354a4514ccc3..9b739bc67ed42d46c89adaefab1b020ad67da660 100644 --- a/apps/cpu/rheometer/rheometer.cfg +++ b/apps/cpu/rheometer/rheometer.cfg @@ -1,4 +1,4 @@ -#outputPath = d:/temp/rheometer/rheometerBinghamqQBB/rheometerBingham_tau_20e-7_nu_1.5e-3_new_lim_test +#outputPath = d:/temp/rheometerTest outputPath = d:/temp/Taylor-CouetteFlowIncompCum viscosityPath = d:/Projects/VirtualFluidsCombined/apps/cpu/rheometer @@ -8,7 +8,7 @@ logToFile = false blocknx = 16 16 1 #8 8 1 #boundingBox = 32 32 1 -deltax = 1 +deltax = 0.5 #boundingBox = 0.02 0.02 0.00125 #deltax = 0.000625 diff --git a/apps/cpu/rheometer/rheometer.cpp b/apps/cpu/rheometer/rheometer.cpp index c972d8fec3da4c6d4191948c7fcaafc9f061d13b..e79d9d13a3763cb5502c24f12fb6ec4d27651814 100644 --- a/apps/cpu/rheometer/rheometer.cpp +++ b/apps/cpu/rheometer/rheometer.cpp @@ -221,10 +221,14 @@ void bflow(string configname) SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + //////////////////////////////////////////// + //METIS + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY)); + //////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //restart SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart)); - SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, outputPath, comm)); + SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, metisVisitor, outputPath, comm)); restartCoProcessor->setLBMKernel(kernel); restartCoProcessor->setBCProcessor(bcProc); //restartCoProcessor->setNu(k); @@ -309,7 +313,7 @@ void bflow(string configname) //////////////////////////////////////////// //METIS - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_MMM, MetisPartitioner::KWAY)); //////////////////////////////////////////// /////delete solid blocks if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); diff --git a/apps/cpu/sphere/sphere.cpp b/apps/cpu/sphere/sphere.cpp index 5ab9a2a70f59273c326d7757faf13e4e338c6614..bad77ee999d96b89fea43183929ecf4a3b920588 100644 --- a/apps/cpu/sphere/sphere.cpp +++ b/apps/cpu/sphere/sphere.cpp @@ -180,7 +180,7 @@ void run(string configname) //outflow SPtr<D3Q27Interactor> outflowInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(geoOutflow, grid, denBCAdapter, Interactor3D::SOLID)); - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B)); + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::DIR_00M)); InteractorsHelper intHelper(grid, metisVisitor); intHelper.addInteractor(sphereInt); intHelper.addInteractor(addWallYminInt); diff --git a/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp b/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp index a2cc289985cd75427e358cf0fa24b7f921fbcbc9..8b5502329a542a8ce8259a08f6e67f4e491ab85f 100644 --- a/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp +++ b/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp @@ -1,4 +1,35 @@ - +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ActuatorLine.cpp +//! \ingroup ActuatorLine +//! \author Henry Korb, Henrik Asmuth +//======================================================================================= #define _USE_MATH_DEFINES #include <math.h> #include <string> @@ -220,7 +251,7 @@ void multipleLevel(const std::string& configPath) const real epsilon = dx*exp2(-level)*2.0; // width of gaussian smearing const real density = 1.225f; const uint nBlades = 3; - const uint nBladeNodes = 404; // passt zu auflösung von 105 Knoten + const uint nBladeNodes = reference_diameter * 4 + 3; // passt zu auflösung von 105 Knoten VF_LOG_INFO("number of blade nodes ALM = {}", nBladeNodes); const real tipspeed_ratio = 7.5f; // tipspeed ratio = angular vel * radius / inflow vel const real omega = 2*tipspeed_ratio*velocity/reference_diameter; diff --git a/apps/gpu/LBM/ActuatorLine/configActuatorLine.txt b/apps/gpu/LBM/ActuatorLine/configActuatorLine.txt index f637c47f2300e52c482ef1e34deca8109a5bcd04..c7b9c51788f24fc7452a3a8bf16acffe3a6e88ff 100644 --- a/apps/gpu/LBM/ActuatorLine/configActuatorLine.txt +++ b/apps/gpu/LBM/ActuatorLine/configActuatorLine.txt @@ -12,8 +12,8 @@ NodesPerDiameter=105 Velocity=9 ################################################## tStartOut=0 -tOut=5000 -tEnd=5000 +tOut=1 +tEnd=1 ################################################## # tStartTmpAveraging=100 diff --git a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp index 51b890d205c52650343c9aa2608f9bc3e237da56..5fc31904433bfe2df0722ab1c63f574d3fcb9a35 100644 --- a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp +++ b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp @@ -1,4 +1,35 @@ - +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 BoundaryLayer.cpp +//! \ingroup BoundaryLayer +//! \author Henry Korb, Henrik Asmuth +//======================================================================================= #define _USE_MATH_DEFINES #include <math.h> #include <string> @@ -150,10 +181,10 @@ void multipleLevel(const std::string& configPath) } const bool readPrecursor = config.getValue("readPrecursor", false); - int nTReadPrecursor; + int timestepsBetweenReadsPrecursor; if(readPrecursor) { - nTReadPrecursor = config.getValue<int>("nTimestepsReadPrecursor"); + timestepsBetweenReadsPrecursor = config.getValue<int>("nTimestepsReadPrecursor"); precursorDirectory = config.getValue<std::string>("precursorDirectory"); useDistributions = config.getValue<bool>("useDistributions", false); } @@ -235,12 +266,17 @@ void multipleLevel(const std::string& configPath) bool isLastSubDomain = (procID == nProcs-1 && nProcs > 1)? true: false; bool isMidSubDomain = (!isFirstSubDomain && !isLastSubDomain && nProcs > 1)? true: false; - if(isFirstSubDomain || isMidSubDomain) + if(isFirstSubDomain) { xGridMax += overlap; + if(!readPrecursor) xGridMin -= overlap; + } + if(isLastSubDomain) + { xGridMin -= overlap; + if(!readPrecursor) xGridMax += overlap; } - if(isLastSubDomain || isMidSubDomain) + if(isMidSubDomain) { xGridMax += overlap; xGridMin -= overlap; @@ -252,8 +288,7 @@ void multipleLevel(const std::string& configPath) { gridBuilder->setNumberOfLayers(4,0); real xMaxRefinement = readPrecursor? xGridMax-H: xGridMax; //Stop refinement some distance before outlet if domain ist not periodic - gridBuilder->addGrid( new Cuboid( xGridMin+dx, 0.f, 0.f, xMaxRefinement, L_y, 0.5*L_z) , 1 ); - + gridBuilder->addGrid( new Cuboid( xGridMin, 0.f, 0.f, xMaxRefinement, L_y, 0.5*L_z) , 1 ); para->setMaxLevel(2); scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible); } @@ -303,7 +338,8 @@ void multipleLevel(const std::string& configPath) if(isFirstSubDomain || nProcs == 1) { auto precursor = createFileCollection(precursorDirectory + "/precursor", FileType::VTK); - gridBuilder->setPrecursorBoundaryCondition(SideType::MX, precursor, nTReadPrecursor); + gridBuilder->setPrecursorBoundaryCondition(SideType::MX, precursor, timestepsBetweenReadsPrecursor); + // gridBuilder->setVelocityBoundaryCondition(SideType::MX, velocityLB, 0.0, 0.0); } if(isLastSubDomain || nProcs == 1) diff --git a/apps/gpu/LBM/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp b/apps/gpu/LBM/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp index 78ebd542b1171cca8a55e0c26a47da8134e4973c..045c208274bc6bc216d25e8c2fa905916a52f87b 100644 --- a/apps/gpu/LBM/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp +++ b/apps/gpu/LBM/TGV_3D_MultiGPU/TGV_3D_MultiGPU.cpp @@ -1,7 +1,38 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 TGV_3d_MuitiGPU.cpp +//! \ingroup TGV_3D_MultiGPU +//! \author Martin Schoenherr +//======================================================================================= //#define MPI_LOGGING //Martin Branch - #include <mpi.h> #if defined( MPI_LOGGING ) #include <mpe.h> diff --git a/cpu.cmake b/cpu.cmake index a6220ec1ffb9641b824ee26b8be8497ea340173f..13f216203bfeefb9c550b8be470af4cf181a44b4 100644 --- a/cpu.cmake +++ b/cpu.cmake @@ -29,6 +29,8 @@ SET(USE_CATALYST OFF CACHE BOOL "include Paraview Catalyst support") SET(USE_HLRN_LUSTRE OFF CACHE BOOL "include HLRN Lustre support") SET(USE_DEM_COUPLING OFF CACHE BOOL "PE plugin") +SET(USE_LIGGGHTS OFF CACHE BOOL "include LIGGGHTS library support") + #MPI IF((NOT ${CMAKE_CXX_COMPILER} MATCHES mpicxx) AND (NOT ${CMAKE_CXX_COMPILER} MATCHES mpiicpc))# OR NOT ${CMAKE_CXX_COMPILER} MATCHES cc OR NOT ${CMAKE_CXX_COMPILER} MATCHES mpiCC) FIND_PACKAGE(MPI REQUIRED) @@ -83,5 +85,9 @@ if(BUILD_VF_PYTHON_BINDINGS) add_subdirectory(src/cpu/simulationconfig) endif() +if(USE_LIGGGHTS) + add_subdirectory(src/cpu/LiggghtsCoupling) +endif() + set (APPS_ROOT_CPU "${VF_ROOT_DIR}/apps/cpu/") include(${APPS_ROOT_CPU}/Applications.cmake) \ No newline at end of file diff --git a/gpu.cmake b/gpu.cmake index 4d7cc9a87ece3d71ce48edc76cc5a5b972b598ce..5b175ca2a5fe7d289bd948e905ada612413333d2 100644 --- a/gpu.cmake +++ b/gpu.cmake @@ -25,11 +25,9 @@ add_subdirectory(src/gpu/GridGenerator) IF (BUILD_VF_GPU) add_subdirectory(src/gpu/VirtualFluids_GPU) - # add_subdirectory(apps/gpu/LBM/DrivenCavity) - # add_subdirectory(apps/gpu/LBM/DrivenCavityMultiGPU) - # add_subdirectory(apps/gpu/LBM/SphereGPU) - # add_subdirectory(apps/gpu/LBM/TGV_3D_MultiGPU) - # add_subdirectory(apps/gpu/LBM/BoundaryLayer) + add_subdirectory(apps/gpu/LBM/DrivenCavity) + add_subdirectory(apps/gpu/LBM/SphereGPU) + add_subdirectory(apps/gpu/LBM/BoundaryLayer) ELSE() MESSAGE( STATUS "exclude Virtual Fluids GPU." ) ENDIF() diff --git a/pythonbindings/CMakeLists.txt b/pythonbindings/CMakeLists.txt index 644b308c97760d6a8243ae7782f0737a1d168100..ea6ff833aae76c4ed9964b6d280d7e5a6dec26e0 100644 --- a/pythonbindings/CMakeLists.txt +++ b/pythonbindings/CMakeLists.txt @@ -1,4 +1,11 @@ -project(VirtualFluidsPython LANGUAGES CUDA CXX) +set(PYFLUIDS_LANGUAGES CXX) + +if(BUILD_VF_GPU) + set(PYFLUIDS_LANGUAGES CUDA CXX) +endif() + +project(VirtualFluidsPython LANGUAGES ${PYFLUIDS_LANGUAGES}) + pybind11_add_module(python_bindings MODULE src/VirtualFluids.cpp) set_target_properties( python_bindings PROPERTIES diff --git a/pythonbindings/pyfluids-stubs/bindings/__init__.pyi b/pythonbindings/pyfluids-stubs/bindings/__init__.pyi index f4bc6784201f9032af3193462b7681c7e58cdeab..4e7f353eab97cc536f8f18e72319af1cd7a1916a 100644 --- a/pythonbindings/pyfluids-stubs/bindings/__init__.pyi +++ b/pythonbindings/pyfluids-stubs/bindings/__init__.pyi @@ -1,3 +1,37 @@ +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 __init__.pyi +! \ingroup bindings +! \author Henry Korb +======================================================================================= +""" class ostream_redirect: def __init__(self, stdout: bool = ..., stderr: bool = ...) -> None: ... def __enter__(self) -> None: ... diff --git a/pythonbindings/pyfluids-stubs/bindings/basics/__init__.pyi b/pythonbindings/pyfluids-stubs/bindings/basics/__init__.pyi index 60259efe05c3bd95ed899f4e46cf30c9fff5d118..a41b7934ca706dc0db5bd6188fee3150456e0cd9 100644 --- a/pythonbindings/pyfluids-stubs/bindings/basics/__init__.pyi +++ b/pythonbindings/pyfluids-stubs/bindings/basics/__init__.pyi @@ -1,3 +1,37 @@ +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 __init__.py +! \ingroup basics +! \author Henry Korb +======================================================================================= +""" from typing import ClassVar from typing import overload diff --git a/pythonbindings/pyfluids-stubs/bindings/basics/logger.pyi b/pythonbindings/pyfluids-stubs/bindings/basics/logger.pyi index 2f3d84f41cb895e2b5769240fe9c8b17214c8a09..43938ff7646efd3c596ae29971cce39fed865fa6 100644 --- a/pythonbindings/pyfluids-stubs/bindings/basics/logger.pyi +++ b/pythonbindings/pyfluids-stubs/bindings/basics/logger.pyi @@ -1,3 +1,37 @@ +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 logger.pyi +! \ingroup basics +! \author Henry Korb +======================================================================================= +""" from typing import Any, ClassVar log: None @@ -26,7 +60,7 @@ class Logger: @staticmethod def add_stdout() -> None: ... @staticmethod - def enable_printed_rank_numbers() -> None: ... + def enable_printed_rank_numbers(print: bool) -> None: ... @staticmethod def set_debug_level(level: int) -> None: ... @staticmethod diff --git a/pythonbindings/pyfluids-stubs/bindings/gpu/__init__.pyi b/pythonbindings/pyfluids-stubs/bindings/gpu/__init__.pyi index 568a1c4ee414551dc9d6d007f4742aed407a5630..36c2fea76713e980bb95eb6726d778de8c9a6583 100644 --- a/pythonbindings/pyfluids-stubs/bindings/gpu/__init__.pyi +++ b/pythonbindings/pyfluids-stubs/bindings/gpu/__init__.pyi @@ -1,3 +1,37 @@ +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 __init__.pyi +! \ingroup gpu +! \author Henry Korb +======================================================================================= +""" from typing import Any, Callable, ClassVar, List, Optional from typing import overload diff --git a/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi b/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi index cf0329015b296b6f009a2fb0000afd799dd87363..8d715e4b4cd49e6dbf92da3aedddbc4b869067c4 100644 --- a/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi +++ b/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi @@ -1,3 +1,37 @@ +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 grid_generator.pyi +! \ingroup gpu +! \author Henry Korb +======================================================================================= +""" from typing import Any, List from typing import overload diff --git a/pythonbindings/pyfluids-stubs/bindings/gpu/probes.pyi b/pythonbindings/pyfluids-stubs/bindings/gpu/probes.pyi index a844bc9c5be78f3fca4d04540a7998b8b7386233..af9c40078e6009efebda4450b5c5e23586aa1e83 100644 --- a/pythonbindings/pyfluids-stubs/bindings/gpu/probes.pyi +++ b/pythonbindings/pyfluids-stubs/bindings/gpu/probes.pyi @@ -1,3 +1,37 @@ +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 probes.pyi +! \ingroup gpu +! \author Henry Korb +======================================================================================= +""" from typing import ClassVar, List import pyfluids.bindings.gpu diff --git a/pythonbindings/pyfluids-stubs/bindings/logger.pyi b/pythonbindings/pyfluids-stubs/bindings/logger.pyi index ead1b28984980c653ccdd68ec4ea2a14384c4140..fe84eeb18f3245ef72ed023b2de9db7b9131d144 100644 --- a/pythonbindings/pyfluids-stubs/bindings/logger.pyi +++ b/pythonbindings/pyfluids-stubs/bindings/logger.pyi @@ -1,3 +1,37 @@ +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 logger.pyi +! \ingroup bindings +! \author Henry Korb +======================================================================================= +""" class Logger: @staticmethod def change_log_path(path: str) -> None: ... diff --git a/pythonbindings/pyfluids/__init__.py b/pythonbindings/pyfluids/__init__.py index 5584420140073805ac66b07ffb9afe6eb9bd02e3..f0537b758267e22a72e5030340de7b87d52f35c3 100644 --- a/pythonbindings/pyfluids/__init__.py +++ b/pythonbindings/pyfluids/__init__.py @@ -1,3 +1,37 @@ +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 __init__.py +! \ingroup pyfluids +! \author Henry Korb +======================================================================================= +""" try: from .bindings import basics except ImportError: diff --git a/pythonbindings/pymuparser/__init__.py b/pythonbindings/pymuparser/__init__.py index 3a2ffbb3663be23e3dffcc4771da5fb24fd45f3e..398069bcba03b3fe710d9d9a6398e9c530b19ee9 100644 --- a/pythonbindings/pymuparser/__init__.py +++ b/pythonbindings/pymuparser/__init__.py @@ -1,3 +1,37 @@ +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 __init__.pyi +! \ingroup pymuparser +! \author Henry Korb +======================================================================================= +""" try: from .bindings import Parser except ImportError as e: diff --git a/pythonbindings/src/VirtualFluids.cpp b/pythonbindings/src/VirtualFluids.cpp index 151d1757530494a928893713de47d9b340d3ca10..20e5012e0af325440e502c704d6f372100306ab1 100644 --- a/pythonbindings/src/VirtualFluids.cpp +++ b/pythonbindings/src/VirtualFluids.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 VirtualFluids.cpp +//! \ingroup src +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include "basics/basics.cpp" #include "lbm/lbm.cpp" diff --git a/pythonbindings/src/basics/basics.cpp b/pythonbindings/src/basics/basics.cpp index 381e345d78226b25ec3a77a14340d2ef1171c8c9..e67dfb05308511c8bf79d7e860299f062f317194 100644 --- a/pythonbindings/src/basics/basics.cpp +++ b/pythonbindings/src/basics/basics.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 basics.cpp +//! \ingroup basics +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include "submodules/logger.cpp" #include "submodules/configuration_file.cpp" diff --git a/pythonbindings/src/basics/submodules/configuration_file.cpp b/pythonbindings/src/basics/submodules/configuration_file.cpp index 2bab1f4396cf43848b7ee56c3edfe6bb5bda880d..7fcd48c34824b9370eeac1872c899bf980176a52 100644 --- a/pythonbindings/src/basics/submodules/configuration_file.cpp +++ b/pythonbindings/src/basics/submodules/configuration_file.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 configuration_file.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include "basics/config/ConfigurationFile.h" diff --git a/pythonbindings/src/basics/submodules/lbm_or_gks.cpp b/pythonbindings/src/basics/submodules/lbm_or_gks.cpp index ed1deeca62fc57b7f44499b306e9f99b7f990604..d20cf2d1f631f6d36a80c36f1fb6c9c59d192090 100644 --- a/pythonbindings/src/basics/submodules/lbm_or_gks.cpp +++ b/pythonbindings/src/basics/submodules/lbm_or_gks.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 lbm_or_gks.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include "basics/Core/LbmOrGks.h" diff --git a/pythonbindings/src/basics/submodules/logger.cpp b/pythonbindings/src/basics/submodules/logger.cpp index 1816ccb50b3f4c4ede8d84e9e929e5eb3010fd2c..fa7e00e4dca06581b7a14d2bcf2628ed6af60001 100644 --- a/pythonbindings/src/basics/submodules/logger.cpp +++ b/pythonbindings/src/basics/submodules/logger.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 logger.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <pybind11/iostream.h> #include <basics/Core/Logger/Logger.h> @@ -17,7 +49,7 @@ namespace logger }) .def_static("set_debug_level", &logging::Logger::setDebugLevel) .def_static("time_stamp", &logging::Logger::timeStamp, py::arg("time_stamp")) - .def_static("enable_printed_rank_numbers", &logging::Logger::enablePrintedRankNumbers); + .def_static("enable_printed_rank_numbers", &logging::Logger::enablePrintedRankNumbers, py::arg("print")); loggerModule.attr("log") = logging::out; py::enum_<logging::Logger::Level>(loggerModule, "Level") diff --git a/pythonbindings/src/cpu/cpu.cpp b/pythonbindings/src/cpu/cpu.cpp index 554de53b47446366693aed31d534f6145ebea8ba..75143d913596c74a26f25ce64f1e6d214a442e34 100644 --- a/pythonbindings/src/cpu/cpu.cpp +++ b/pythonbindings/src/cpu/cpu.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 cpu.cpp +//! \ingroup cpu +//! \author Sven Marcus, Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include "submodules/boundaryconditions.cpp" #include "submodules/simulationconfig.cpp" diff --git a/pythonbindings/src/cpu/submodules/boundaryconditions.cpp b/pythonbindings/src/cpu/submodules/boundaryconditions.cpp index 3bff7bc069ca20fe1c0cf3d1847b9714e0381505..ac9ec8605dec51e8374c850b1c1b58314674c426 100644 --- a/pythonbindings/src/cpu/submodules/boundaryconditions.cpp +++ b/pythonbindings/src/cpu/submodules/boundaryconditions.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 boundaryconditions.cpp +//! \ingroup submodules +//! \author Sven Marcus, Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <pybind11/stl.h> #include <BoundaryConditions/DensityBCAdapter.h> diff --git a/pythonbindings/src/cpu/submodules/geometry.cpp b/pythonbindings/src/cpu/submodules/geometry.cpp index b7ff4dd761258d41687589d2dd89c3479093753e..4c4c47b002b9c7451a8d788ba82c4a19b78ca96f 100644 --- a/pythonbindings/src/cpu/submodules/geometry.cpp +++ b/pythonbindings/src/cpu/submodules/geometry.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 geometry.cpp +//! \ingroup submodules +//! \author Sven Marcus, Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <geometry3d/GbPoint3D.h> #include <geometry3d/GbObject3D.h> diff --git a/pythonbindings/src/cpu/submodules/kernel.cpp b/pythonbindings/src/cpu/submodules/kernel.cpp index fb291790632cc2041410f60a14fca8d966283343..b00d86579540a299e4bf3ed47bc09d4386f420a2 100644 --- a/pythonbindings/src/cpu/submodules/kernel.cpp +++ b/pythonbindings/src/cpu/submodules/kernel.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 kernel.cpp +//! \ingroup submodules +//! \author Sven Marcus, Henry Korb +//======================================================================================= #include <memory> #include <pybind11/pybind11.h> #include <simulationconfig/KernelFactory.h> diff --git a/pythonbindings/src/cpu/submodules/simulationconfig.cpp b/pythonbindings/src/cpu/submodules/simulationconfig.cpp index 60af4e36af4dca67e9262dd9f5ee1f46d5b7bb58..09d91f44e85f03c6150c56ce5762e7629212fba0 100644 --- a/pythonbindings/src/cpu/submodules/simulationconfig.cpp +++ b/pythonbindings/src/cpu/submodules/simulationconfig.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 simulationconfig.cpp +//! \ingroup submodules +//! \author Sven Marcus, Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <simulationconfig/Simulation.h> diff --git a/pythonbindings/src/cpu/submodules/simulationparameters.cpp b/pythonbindings/src/cpu/submodules/simulationparameters.cpp index acc272f2ee412cfbafd9007b4b18610cfd0a1e9b..b33d20f9e5d335a0ed381faf8786d88cc7642738 100644 --- a/pythonbindings/src/cpu/submodules/simulationparameters.cpp +++ b/pythonbindings/src/cpu/submodules/simulationparameters.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 simulationparameters.cpp +//! \ingroup submodules +//! \author Sven Marcus, Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <pybind11/stl.h> #include <complex> diff --git a/pythonbindings/src/cpu/submodules/writer.cpp b/pythonbindings/src/cpu/submodules/writer.cpp index d5ec527a27caf63d9a3066c51e1f675b307fe0b2..f1cfd8934c2da84266a93d5bcd91eb26f5f69d3f 100644 --- a/pythonbindings/src/cpu/submodules/writer.cpp +++ b/pythonbindings/src/cpu/submodules/writer.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 writer.cpp +//! \ingroup submodules +//! \author Sven Marcus, Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <simulationconfig/WriterConfiguration.h> diff --git a/pythonbindings/src/gpu/gpu.cpp b/pythonbindings/src/gpu/gpu.cpp index b747b49963ee6ea01166667ad343d635e6a63a8c..9eb160ae7765f16a6437e343cb878bb4b80877bf 100644 --- a/pythonbindings/src/gpu/gpu.cpp +++ b/pythonbindings/src/gpu/gpu.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 gpu.cpp +//! \ingroup gpu +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include "submodules/pre_collision_interactor.cpp" #include "submodules/simulation.cpp" diff --git a/pythonbindings/src/gpu/submodules/actuator_farm.cpp b/pythonbindings/src/gpu/submodules/actuator_farm.cpp index 234308dd8f807f8d53f2e458b47b224aaa31b711..a930616db3e0d0713bdf57157387d75d171603de 100644 --- a/pythonbindings/src/gpu/submodules/actuator_farm.cpp +++ b/pythonbindings/src/gpu/submodules/actuator_farm.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 actuator_farm.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <pybind11/numpy.h> #include <gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h> diff --git a/pythonbindings/src/gpu/submodules/boundary_conditions.cpp b/pythonbindings/src/gpu/submodules/boundary_conditions.cpp index e2fb05e9a23537d64da5c1244930ba4c584011ac..865817bb16f7b164c40bdc066645fb2e1f1c842e 100644 --- a/pythonbindings/src/gpu/submodules/boundary_conditions.cpp +++ b/pythonbindings/src/gpu/submodules/boundary_conditions.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 boindary_conditions.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <gpu/GridGenerator/grid/BoundaryConditions/Side.h> #include "gpu/VirtualFluids_GPU/Factories/BoundaryConditionFactory.h" diff --git a/pythonbindings/src/gpu/submodules/communicator.cpp b/pythonbindings/src/gpu/submodules/communicator.cpp index 63594a559735e2d0464bfa8f2fd916f23a3076ef..26a57061933fbdbfe3447ec89eeb07116a9b974b 100644 --- a/pythonbindings/src/gpu/submodules/communicator.cpp +++ b/pythonbindings/src/gpu/submodules/communicator.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 communicator.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <gpu/VirtualFluids_GPU/Communication/Communicator.h> diff --git a/pythonbindings/src/gpu/submodules/cuda_memory_manager.cpp b/pythonbindings/src/gpu/submodules/cuda_memory_manager.cpp index cda1bea9bebb5da2c57ec633b6839185ab28acc5..bbff4832cb73f47e3d1a5a6abd78e21da2473deb 100644 --- a/pythonbindings/src/gpu/submodules/cuda_memory_manager.cpp +++ b/pythonbindings/src/gpu/submodules/cuda_memory_manager.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 cuda_memory_manager.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h> #include <gpu/VirtualFluids_GPU/Parameter/Parameter.h> diff --git a/pythonbindings/src/gpu/submodules/grid_generator.cpp b/pythonbindings/src/gpu/submodules/grid_generator.cpp index a10b48cc7b7048c1522a783542dadf66010c84b3..3e9fb5655e26ffa6053a205da5a3e3f0f2ecd49f 100644 --- a/pythonbindings/src/gpu/submodules/grid_generator.cpp +++ b/pythonbindings/src/gpu/submodules/grid_generator.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 grid_generator.cpp +//! \ingroup submodules +//! \author Henry Korb, Henrik Asmuth +//======================================================================================= #include <pybind11/pybind11.h> #include "gpu/GridGenerator/utilities/communication.h" #include "gpu/GridGenerator/geometries/Object.h" diff --git a/pythonbindings/src/gpu/submodules/grid_provider.cpp b/pythonbindings/src/gpu/submodules/grid_provider.cpp index ff5749da2026c27a5241431fe3063bc5abb2e9aa..717e9d5cd82100636a5398c09662a0895ce8fb56 100644 --- a/pythonbindings/src/gpu/submodules/grid_provider.cpp +++ b/pythonbindings/src/gpu/submodules/grid_provider.cpp @@ -1,3 +1,34 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 grid_provider +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include "gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h" diff --git a/pythonbindings/src/gpu/submodules/grid_scaling_factory.cpp b/pythonbindings/src/gpu/submodules/grid_scaling_factory.cpp index 7ec35bee622178d302299d1d22616d89bfc26924..a3a572875a4695871c482a4308acab4214dbb481 100644 --- a/pythonbindings/src/gpu/submodules/grid_scaling_factory.cpp +++ b/pythonbindings/src/gpu/submodules/grid_scaling_factory.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 grid_scaling_factory.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <gpu/VirtualFluids_GPU/Factories/GridScalingFactory.h> diff --git a/pythonbindings/src/gpu/submodules/parameter.cpp b/pythonbindings/src/gpu/submodules/parameter.cpp index ae3a529a1d97ce87182b4cdd9469d8892ef52102..a7c42223e6a5bfa3caa89c0879e4133fc4123ad0 100644 --- a/pythonbindings/src/gpu/submodules/parameter.cpp +++ b/pythonbindings/src/gpu/submodules/parameter.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 parameter.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <pybind11/functional.h> #include <pybind11/stl.h> diff --git a/pythonbindings/src/gpu/submodules/pre_collision_interactor.cpp b/pythonbindings/src/gpu/submodules/pre_collision_interactor.cpp index 362ee1a8ce6112cfa9543f1b254e10f3e35822a1..308f6c37aada14c8c25c69245f603274ae2f18d8 100644 --- a/pythonbindings/src/gpu/submodules/pre_collision_interactor.cpp +++ b/pythonbindings/src/gpu/submodules/pre_collision_interactor.cpp @@ -1,3 +1,36 @@ + +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 pre_collision_interactor.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <gpu/VirtualFluids_GPU/PreCollisionInteractor/PreCollisionInteractor.h> diff --git a/pythonbindings/src/gpu/submodules/precursor_writer.cpp b/pythonbindings/src/gpu/submodules/precursor_writer.cpp index c7b921d253fdfda5d0cedae99e308dc232f42f5b..64164ef9993d7b4f22bff2390b418718f7c3208f 100644 --- a/pythonbindings/src/gpu/submodules/precursor_writer.cpp +++ b/pythonbindings/src/gpu/submodules/precursor_writer.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 precursor_writer.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <pybind11/stl.h> #include <pybind11/numpy.h> diff --git a/pythonbindings/src/gpu/submodules/probes.cpp b/pythonbindings/src/gpu/submodules/probes.cpp index 79ee11705e8b13fb556ff4cf030f58a30c8af980..7c26958df81a60f00c9909a91f5576a5931652d4 100644 --- a/pythonbindings/src/gpu/submodules/probes.cpp +++ b/pythonbindings/src/gpu/submodules/probes.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 probes.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <pybind11/stl.h> #include <gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h> diff --git a/pythonbindings/src/gpu/submodules/simulation.cpp b/pythonbindings/src/gpu/submodules/simulation.cpp index 8149f2d736d2bb70767311eb7a1b3fc6258df781..d32ef272a1fd26510439dde6ab3a9438d68009a7 100644 --- a/pythonbindings/src/gpu/submodules/simulation.cpp +++ b/pythonbindings/src/gpu/submodules/simulation.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 simulation.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <gpu/VirtualFluids_GPU/LBM/Simulation.h> #include <gpu/VirtualFluids_GPU/Communication/Communicator.h> diff --git a/pythonbindings/src/gpu/submodules/transient_bc_setter.cpp b/pythonbindings/src/gpu/submodules/transient_bc_setter.cpp index 293e311a4c07b313800d9c179d2b780df526b69c..89370ef4c1b91a0c8e480e968a1df3bd4fe540ca 100644 --- a/pythonbindings/src/gpu/submodules/transient_bc_setter.cpp +++ b/pythonbindings/src/gpu/submodules/transient_bc_setter.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 transient_bc_setter.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h> diff --git a/pythonbindings/src/gpu/submodules/turbulence_models.cpp b/pythonbindings/src/gpu/submodules/turbulence_models.cpp index 79ba5a5b43a925860db76be741e9181c3a4dbdf4..cfbb9e56127fee0cd90a482dde258d8b96389989 100644 --- a/pythonbindings/src/gpu/submodules/turbulence_models.cpp +++ b/pythonbindings/src/gpu/submodules/turbulence_models.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 turbulence_models.cpp +//! \ingroup submodules +//! \author Henry Korb +//======================================================================================= #include "pybind11/pybind11.h" #include "gpu/VirtualFluids_GPU/TurbulenceModels/TurbulenceModelFactory.h" #include "gpu/VirtualFluids_GPU/LBM/LB.h" diff --git a/pythonbindings/src/lbm/lbm.cpp b/pythonbindings/src/lbm/lbm.cpp index 441b9ff372f4e4513fee58c4a8a1cd78d38582dd..90fd4a71b0101469666936c89974de316e0e2b18 100644 --- a/pythonbindings/src/lbm/lbm.cpp +++ b/pythonbindings/src/lbm/lbm.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 lbm.cpp +//! \ingroup lbm +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> namespace lbm diff --git a/pythonbindings/src/logger/logger.cpp b/pythonbindings/src/logger/logger.cpp index bae2f93622d0e43d14a4abe08dddf67edfbe35bd..555b502fa9a56299895de0fa6dd6cfeb66c15024 100644 --- a/pythonbindings/src/logger/logger.cpp +++ b/pythonbindings/src/logger/logger.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 logging.cpp +//! \ingroup logger +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <logger/Logger.h> diff --git a/pythonbindings/src/muParser.cpp b/pythonbindings/src/muParser.cpp index 0b65d715be20ba0dff48fd57a36c4116bbdfc33d..eec39de0b72c21aaa924ea805414847aa9de4492 100644 --- a/pythonbindings/src/muParser.cpp +++ b/pythonbindings/src/muParser.cpp @@ -1,3 +1,35 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 muParser.cpp +//! \ingroup src +//! \author Henry Korb +//======================================================================================= #include <pybind11/pybind11.h> #include <muParser.h> diff --git a/src/basics/basics/writer/WbWriterVtkXmlImageBinary.cpp b/src/basics/basics/writer/WbWriterVtkXmlImageBinary.cpp index 35ab9002f7adec7aafb304fc82ba940ea6e637ba..798b55919df9e24dbc71ecfded5fb8a913cff8cf 100644 --- a/src/basics/basics/writer/WbWriterVtkXmlImageBinary.cpp +++ b/src/basics/basics/writer/WbWriterVtkXmlImageBinary.cpp @@ -28,7 +28,7 @@ // //! \file WbWriterVtkXmlImageBinary.cpp //! \ingroup writer -//! \author Soeren Freudiger, Sebastian Geller +//! \author Soeren Freudiger, Sebastian Geller, Henry Korb, Henrik Asmuth //======================================================================================= #include <basics/utilities/UbLogger.h> #include <basics/writer/WbWriterVtkXmlImageBinary.h> @@ -40,7 +40,7 @@ using namespace std; const std::string WbWriterVtkXmlImageBinary::pvdEndTag = " </Collection>\n</VTKFile>"; /*===============================================================================*/ string WbWriterVtkXmlImageBinary::writeCollection(const string &filename, const vector<string> &filenames, - const double &timeStep, const bool &sepGroups) + const double &timeStep, const bool &sepGroups) { string vtkfilename = filename + ".pvd"; ofstream out(vtkfilename.c_str()); @@ -79,7 +79,7 @@ string WbWriterVtkXmlImageBinary::writeCollection(const string &filename, const } /*===============================================================================*/ string WbWriterVtkXmlImageBinary::addFilesToCollection(const string &filename, const vector<string> &filenames, - const double &timeStep, const bool &sepGroups) + const double &timeStep, const bool &sepGroups) { string vtkfilename = filename; fstream test(vtkfilename.c_str(), ios::in); @@ -106,9 +106,10 @@ string WbWriterVtkXmlImageBinary::addFilesToCollection(const string &filename, c return vtkfilename; } /*===============================================================================*/ -string WbWriterVtkXmlImageBinary::writeParallelFile(const string &filename, const UbTupleInt6 &wholeExtent, const UbTupleFloat3 &origin, const UbTupleFloat3 &spacing, - vector<string> &pieceSources, vector<UbTupleInt6> &pieceExtents, - vector<string> &pointDataNames, vector<string> &cellDataNames) +string WbWriterVtkXmlImageBinary::writeParallelFile(const string &filename, const UbTupleInt6 &wholeExtent, + const UbTupleFloat3 &origin, const UbTupleFloat3 &spacing, + vector<string> &pieceSources, vector<UbTupleInt6> &pieceExtents, + vector<string> &pointDataNames, vector<string> &cellDataNames) { string vtkfilename = filename + ".pvti"; UBLOG(logDEBUG1, "WbWriterVtkXmlImageBinary::writeParallelFile to " << vtkfilename << " - start"); @@ -170,8 +171,8 @@ string WbWriterVtkXmlImageBinary::writeParallelFile(const string &filename, cons } /*===============================================================================*/ string WbWriterVtkXmlImageBinary::writeOctsWithCellData(const string &filename, vector<UbTupleFloat3> &nodes, - vector<UbTupleInt8> &cells, vector<string> &datanames, - vector<vector<double>> &celldata) + vector<UbTupleInt8> & /*cells*/, vector<string> &datanames, + vector<vector<double>> &celldata) { string vtkfilename = filename + getFileExtension(); UBLOG(logDEBUG1, "WbWriterVtkXmlImageBinary::writeOctsWithCellData to " << vtkfilename << " - start"); @@ -191,8 +192,8 @@ string WbWriterVtkXmlImageBinary::writeOctsWithCellData(const string &filename, } /*===============================================================================*/ string WbWriterVtkXmlImageBinary::writeOctsWithNodeData(const string &filename, vector<UbTupleFloat3> &nodes, - vector<UbTupleUInt8> &cells, vector<string> &datanames, - vector<vector<double>> &nodedata) + vector<UbTupleUInt8> & /*cells*/, vector<string> &datanames, + vector<vector<double>> &nodedata) { string vtkfilename = filename + getFileExtension(); UBLOG(logDEBUG1, "WbWriterVtkXmlImageBinary::writeOctsWithNodeData to " << vtkfilename << " - start"); @@ -213,8 +214,7 @@ string WbWriterVtkXmlImageBinary::writeOctsWithNodeData(const string &filename, } /*===============================================================================*/ string WbWriterVtkXmlImageBinary::writeNodesWithNodeData(const string &filename, vector<UbTupleFloat3> &nodes, - vector<string> &datanames, - vector<vector<double>> &nodedata) + vector<string> &datanames, vector<vector<double>> &nodedata) { string vtkfilename = filename + getFileExtension(); UBLOG(logDEBUG1, "WbWriterVtkXmlImageBinary::writeNodesWithNodeData to " << vtkfilename << " - start"); @@ -231,7 +231,8 @@ string WbWriterVtkXmlImageBinary::writeNodesWithNodeData(const string &filename, return vtkfilename; } -void WbWriterVtkXmlImageBinary::getMetaDataOfImage(vector<UbTupleFloat3> &nodes, UbTupleFloat3& origin, UbTupleFloat3& spacing, UbTupleInt6& extent) +void WbWriterVtkXmlImageBinary::getMetaDataOfImage(vector<UbTupleFloat3> &nodes, UbTupleFloat3 &origin, + UbTupleFloat3 &spacing, UbTupleInt6 &extent) { int nofNodes = (int)nodes.size(); val<1>(origin) = val<1>(nodes[0]); @@ -247,17 +248,17 @@ void WbWriterVtkXmlImageBinary::getMetaDataOfImage(vector<UbTupleFloat3> &nodes, int ny = (l_y) / val<2>(spacing); val<3>(spacing) = val<3>(nodes[nx*ny])-val<3>(nodes[0]); - val<1>(extent) = val<1>(origin)/val<1>(spacing); val<2>(extent) = val<1>(nodes[nofNodes-1])/val<1>(spacing); - val<3>(extent) = val<2>(origin)/val<2>(spacing); val<4>(extent) = val<2>(nodes[nofNodes-1])/val<2>(spacing); - val<5>(extent) = val<3>(origin)/val<3>(spacing); val<6>(extent) = val<3>(nodes[nofNodes-1])/val<3>(spacing); + val<1>(extent) = val<1>(origin) / val<1>(spacing); val<2>(extent) = val<1>(nodes[nofNodes - 1]) / val<1>(spacing); + val<3>(extent) = val<2>(origin) / val<2>(spacing); val<4>(extent) = val<2>(nodes[nofNodes - 1]) / val<2>(spacing); + val<5>(extent) = val<3>(origin) / val<3>(spacing); val<6>(extent) = val<3>(nodes[nofNodes - 1]) / val<3>(spacing); } -void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename, - vector<string> &pointDataNames, vector<string> &cellDataNames, - vector<vector<double>> &nodedata, vector<vector<double>> &celldata, - UbTupleInt6& wholeExtent, - UbTupleFloat3& origin, UbTupleFloat3& spacing, UbTupleInt6& extent, unsigned int precision) +void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename, vector<string> &pointDataNames, + vector<string> &cellDataNames, vector<vector<double>> &nodedata, + vector<vector<double>> &celldata, UbTupleInt6 &wholeExtent, + UbTupleFloat3 &origin, UbTupleFloat3 &spacing, UbTupleInt6 &extent, + unsigned int precision) { ofstream out(vtkfilename.c_str(), ios::out | ios::binary); out.precision(precision); @@ -273,14 +274,14 @@ void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename, throw UbException(UB_EXARGS, "couldn't open file " + vtkfilename); } - size_t nPoints = pointDataNames.size()>0 ? nodedata[0].size() : celldata[0].size(); + size_t nPoints = pointDataNames.size() > 0 ? nodedata[0].size() : celldata[0].size(); - int bytesPerByteVal = 4; //==sizeof(int) + int bytesPerByteVal = 4; //==sizeof(int) - int bytesScalarData = 1 /*scalar */ * (int)nPoints * sizeof(double); + int bytesScalarData = 1 /*scalar */ * (int)nPoints * sizeof(double); int offset = 0; - + // VTK FILE out << "<?xml version=\"1.0\"?>\n"; out << "<VTKFile type=\"ImageData\" version=\"0.1\" byte_order=\"LittleEndian\" >" @@ -307,23 +308,21 @@ void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename, << val<6>(extent) << "\">\n"; // DATA SECTION - if (pointDataNames.size()>0) - { + if (pointDataNames.size() > 0) { out << " <PointData>\n"; for (size_t s = 0; s < pointDataNames.size(); ++s) { - out << " <DataArray type=\"Float64\" Name=\"" << pointDataNames[s] << "\" format=\"appended\" offset=\"" - << offset << "\" /> \n"; + out << " <DataArray type=\"Float64\" Name=\"" << pointDataNames[s] + << "\" format=\"appended\" offset=\"" << offset << "\" /> \n"; offset += (bytesPerByteVal + bytesScalarData); } out << " </PointData>\n"; } - if (cellDataNames.size()>0) - { + if (cellDataNames.size() > 0) { out << " <CellData>\n"; for (size_t s = 0; s < cellDataNames.size(); ++s) { - out << " <DataArray type=\"Float64\" Name=\"" << cellDataNames[s] << "\" format=\"appended\" offset=\"" - << offset << "\" /> \n"; + out << " <DataArray type=\"Float64\" Name=\"" << cellDataNames[s] + << "\" format=\"appended\" offset=\"" << offset << "\" /> \n"; offset += (bytesPerByteVal + bytesScalarData); } out << " </CellData>\n"; @@ -336,7 +335,6 @@ void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename, out << " <AppendedData encoding=\"raw\">\n"; out << "_"; - // DATA SECTION // pointData for (size_t s = 0; s < pointDataNames.size(); ++s) { @@ -359,4 +357,4 @@ void WbWriterVtkXmlImageBinary::writeData(const string &vtkfilename, out << "</VTKFile>"; out << endl; out.close(); -} \ No newline at end of file +} diff --git a/src/cpu/LiggghtsCoupling/CMakeLists.txt b/src/cpu/LiggghtsCoupling/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..ed9d1f0e2bd8d0302f1d37aa3bde8a120ceb2312 --- /dev/null +++ b/src/cpu/LiggghtsCoupling/CMakeLists.txt @@ -0,0 +1,10 @@ + +set(LIGGGHTS_LIBRARIES optimized ${LIGGGHTS_RELEASE_LIBRARY} debug ${LIGGGHTS_DEBUG_LIBRARY}) + +vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser MPI::MPI_CXX VirtualFluidsCore ${LIGGGHTS_LIBRARIES}) + +vf_get_library_name(library_name) + +#target_link_directories(${library_name} PUBLIC ${LIGGGHTS_BINARY_DIR}) +target_include_directories(${library_name} PUBLIC ${LIGGGHTS_SOURCE_DIR}) + diff --git a/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7e36c2b9c8acd63af35d14ebcc7029a278977a4c --- /dev/null +++ b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.cpp @@ -0,0 +1,915 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 IBcumulantK17LBMKernel.cpp +//! \ingroup LBM +//! \author Konstantin Kutscher, Martin Geier +//======================================================================================= +#include "IBcumulantK17LBMKernel.h" +#include "D3Q27System.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include <cmath> +#include "DataSet3D.h" +#include "LBMKernel.h" +#include "Block3D.h" +#include "BCArray3D.h" + +#define PROOF_CORRECTNESS + +using namespace UbMath; + +////////////////////////////////////////////////////////////////////////// +IBcumulantK17LBMKernel::IBcumulantK17LBMKernel() +{ + this->compressible = true; + forcingX1 = 0.0; + forcingX2 = 0.0; + forcingX3 = 0.0; +} +////////////////////////////////////////////////////////////////////////// +void IBcumulantK17LBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> d(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); + dataSet->setFdistributions(d); + + particleData = std::make_shared<CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>>(nx[0] + 2, nx[1] + 2, nx[2] + 2); + + int minX1 = 0; + int minX2 = 0; + int minX3 = 0; + int maxX1 = nx[0]+2; + int maxX2 = nx[1]+2; + int maxX3 = nx[2]+2; + + LBMReal omega = collFactor; + + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + (*particleData)(x1, x2, x3) = std::make_shared<IBdynamicsParticleData>(); + } + } + } + +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> IBcumulantK17LBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new IBcumulantK17LBMKernel()); + kernel->setNX(nx); + std::dynamic_pointer_cast<IBcumulantK17LBMKernel>(kernel)->initDataSet(); + kernel->setCollisionFactor(this->collFactor); + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + kernel->setBlock(block.lock()); + + return kernel; +} +////////////////////////////////////////////////////////////////////////// +void IBcumulantK17LBMKernel::calculate(int step) +{ + ////////////////////////////////////////////////////////////////////////// + //! Cumulant K17 Kernel is based on + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! and + //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a> + //! + //! The cumulant kernel is executed in the following steps + //! + //////////////////////////////////////////////////////////////////////////////// + //! - Get node index coordinates from thredIdx, blockIdx, blockDim and gridDim. + //! + + using namespace std; + + //initializing of forcing stuff + if (withForcing) + { + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + } + ///////////////////////////////////// + + localDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + restDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + LBMReal omega = collFactor; + + + + for (int x3 = minX3; x3 < maxX3; x3++) + { + for (int x2 = minX2; x2 < maxX2; x2++) + { + for (int x1 = minX1; x1 < maxX1; x1++) + { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //! - Read distributions: style of reading and writing the distributions from/to stored arrays + //! dependent on timestep is based on the esoteric twist algorithm <a + //! href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), + //! DOI:10.3390/computation5020019 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + // E N T + // c c c + ////////// + // W S B + // a a a + + // Rest is b + + // mfxyz + // a - negative + // b - null + // c - positive + + // a b c + //-1 0 1 + + LBMReal mfcbb = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3); + + LBMReal mfabb = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->restDistributions)(x1, x2, x3); + + LBMReal f[D3Q27System::ENDF + 1]; + LBMReal fEq[D3Q27System::ENDF + 1]; + LBMReal fEqSolid[D3Q27System::ENDF + 1]; + LBMReal fPre[D3Q27System::ENDF + 1]; + + f[D3Q27System::DIR_000] = mfbbb; + + f[D3Q27System::DIR_P00] = mfcbb; + f[D3Q27System::DIR_0P0] = mfbcb; + f[D3Q27System::DIR_00P] = mfbbc; + f[D3Q27System::DIR_PP0] = mfccb; + f[D3Q27System::DIR_MP0] = mfacb; + f[D3Q27System::DIR_P0P] = mfcbc; + f[D3Q27System::DIR_M0P] = mfabc; + f[D3Q27System::DIR_0PP] = mfbcc; + f[D3Q27System::DIR_0MP] = mfbac; + f[D3Q27System::DIR_PPP] = mfccc; + f[D3Q27System::DIR_MPP] = mfacc; + f[D3Q27System::DIR_PMP] = mfcac; + f[D3Q27System::DIR_MMP] = mfaac; + + f[D3Q27System::DIR_M00] = mfabb; + f[D3Q27System::DIR_0M0] = mfbab; + f[D3Q27System::DIR_00M] = mfbba; + f[D3Q27System::DIR_MM0] = mfaab; + f[D3Q27System::DIR_PM0] = mfcab; + f[D3Q27System::DIR_M0M] = mfaba; + f[D3Q27System::DIR_P0M] = mfcba; + f[D3Q27System::DIR_0MM] = mfbaa; + f[D3Q27System::DIR_0PM] = mfbca; + f[D3Q27System::DIR_MMM] = mfaaa; + f[D3Q27System::DIR_PMM] = mfcaa; + f[D3Q27System::DIR_MPM] = mfaca; + f[D3Q27System::DIR_PPM] = mfcca; + + if ((*particleData)(x1, x2, x3)->solidFraction > SOLFRAC_MIN) { + fPre[D3Q27System::DIR_000] = mfbbb; + + fPre[D3Q27System::DIR_P00] = mfcbb; + fPre[D3Q27System::DIR_0P0] = mfbcb; + fPre[D3Q27System::DIR_00P] = mfbbc; + fPre[D3Q27System::DIR_PP0] = mfccb; + fPre[D3Q27System::DIR_MP0] = mfacb; + fPre[D3Q27System::DIR_P0P] = mfcbc; + fPre[D3Q27System::DIR_M0P] = mfabc; + fPre[D3Q27System::DIR_0PP] = mfbcc; + fPre[D3Q27System::DIR_0MP] = mfbac; + fPre[D3Q27System::DIR_PPP] = mfccc; + fPre[D3Q27System::DIR_MPP] = mfacc; + fPre[D3Q27System::DIR_PMP] = mfcac; + fPre[D3Q27System::DIR_MMP] = mfaac; + + fPre[D3Q27System::DIR_M00] = mfabb; + fPre[D3Q27System::DIR_0M0] = mfbab; + fPre[D3Q27System::DIR_00M] = mfbba; + fPre[D3Q27System::DIR_MM0] = mfaab; + fPre[D3Q27System::DIR_PM0] = mfcab; + fPre[D3Q27System::DIR_M0M] = mfaba; + fPre[D3Q27System::DIR_P0M] = mfcba; + fPre[D3Q27System::DIR_0MM] = mfbaa; + fPre[D3Q27System::DIR_0PM] = mfbca; + fPre[D3Q27System::DIR_MMM] = mfaaa; + fPre[D3Q27System::DIR_PMM] = mfcaa; + fPre[D3Q27System::DIR_MPM] = mfaca; + fPre[D3Q27System::DIR_PPM] = mfcca; + } + + (*particleData)(x1, x2, x3)->hydrodynamicForce.fill(0.0); + + if ((*particleData)(x1, x2, x3)->solidFraction <= SOLFRAC_MAX) { + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. + //! (J1)-(J3) <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), + //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + + mfbbb; + + LBMReal rho = c1 + drho; + LBMReal OOrho = c1 / rho; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)) / + rho; + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)) / + rho; + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)) / + rho; + //////////////////////////////////////////////////////////////////////////////////// + // forcing + /////////////////////////////////////////////////////////////////////////////////////////// + if (withForcing) { + muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1); + muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2); + muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3); + + forcingX1 = muForcingX1.Eval(); + forcingX2 = muForcingX2.Eval(); + forcingX3 = muForcingX3.Eval(); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), + //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + vvx += forcingX1 * deltaT * c1o2; // X + vvy += forcingX2 * deltaT * c1o2; // Y + vvz += forcingX3 * deltaT * c1o2; // Z + } + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal vx2 = vvx * vvx; + LBMReal vy2 = vvy * vvy; + LBMReal vz2 = vvz * vvz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Set relaxation limiters for third order cumulants to default value \f$ \lambda=0.001 \f$ + //! according to section 6 in <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et + //! al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + LBMReal wadjust; + LBMReal qudricLimitP = c1o100; + LBMReal qudricLimitM = c1o100; + LBMReal qudricLimitD = c1o100; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in + //! Appendix J in <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), + //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> see also Eq. (6)-(14) in <a + //! href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), + //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36, c1o36); + forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9, c1o9); + forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36, c1o36); + forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9, c1o9); + forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); + forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9, c1o9); + forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36, c1o36); + forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9, c1o9); + forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36, c1o36); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6, c1o6); + forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18, c1o18); + forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); + forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); + forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6, c1o6); + forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18, c1o18); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1, c1); + forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3, c1o3); + forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3, c1o3); + forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9, c1o9); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Setting relaxation rates for non-hydrodynamic cumulants (default values). Variable names and + //! equations according to <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. + //! (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! => [NAME IN PAPER]=[NAME IN CODE]=[DEFAULT VALUE]. + //! - Trace of second order cumulants \f$ C_{200}+C_{020}+C_{002} \f$ used to adjust bulk + //! viscosity:\f$\omega_2=OxxPyyPzz=1.0 \f$. + //! - Third order cumulants \f$ C_{120}+C_{102} \f$, \f$ C_{210}+C_{012} \f$, \f$ C_{201}+C_{021} + //! \f$: \f$\omega_3=OxyyPxzz\f$ set according to Eq. (111) with simplifications assuming + //! \f$\omega_2=1.0\f$. + //! - Third order cumulants \f$ C_{120}-C_{102} \f$, \f$ C_{210}-C_{012} \f$, \f$ C_{201}-C_{021} + //! \f$: \f$\omega_4 = OxyyMxzz\f$ set according to Eq. (112) with simplifications assuming + //! \f$\omega_2 = 1.0\f$. + //! - Third order cumulants \f$ C_{111} \f$: \f$\omega_5 = Oxyz\f$ set according to Eq. (113) with + //! simplifications assuming \f$\omega_2 = 1.0\f$ (modify for different bulk viscosity). + //! - Fourth order cumulants \f$ C_{220} \f$, \f$ C_{202} \f$, \f$ C_{022} \f$, \f$ C_{211} \f$, + //! \f$ C_{121} \f$, \f$ C_{112} \f$: for simplification all set to the same default value \f$ + //! \omega_6=\omega_7=\omega_8=O4=1.0 \f$. + //! - Fifth order cumulants \f$ C_{221}\f$, \f$C_{212}\f$, \f$C_{122}\f$: \f$\omega_9=O5=1.0\f$. + //! - Sixth order cumulant \f$ C_{222}\f$: \f$\omega_{10}=O6=1.0\f$. + //! + //////////////////////////////////////////////////////////// + // 2. + LBMReal OxxPyyPzz = c1; + //////////////////////////////////////////////////////////// + // 3. + LBMReal OxyyPxzz = + c8 * (-c2 + omega) * (c1 + c2 * omega) / (-c8 - c14 * omega + c7 * omega * omega); + LBMReal OxyyMxzz = + c8 * (-c2 + omega) * (-c7 + c4 * omega) / (c56 - c50 * omega + c9 * omega * omega); + LBMReal Oxyz = c24 * (-c2 + omega) * (-c2 - c7 * omega + c3 * omega * omega) / + (c48 + c152 * omega - c130 * omega * omega + c29 * omega * omega * omega); + //////////////////////////////////////////////////////////// + // 4. + LBMReal O4 = c1; + //////////////////////////////////////////////////////////// + // 5. + LBMReal O5 = c1; + //////////////////////////////////////////////////////////// + // 6. + LBMReal O6 = c1; + + //////////////////////////////////////////////////////////////////////////////////// + //! - A and B: parameters for fourth order convergence of the diffusion term according to Eq. (114) + //! and (115) <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), + //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> with simplifications assuming \f$\omega_2 = 1.0\f$ + //! (modify for different bulk viscosity). + //! + LBMReal A = (c4 + c2 * omega - c3 * omega * omega) / (c2 - c7 * omega + c5 * omega * omega); + LBMReal B = (c4 + c28 * omega - c14 * omega * omega) / (c6 - c21 * omega + c15 * omega * omega); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute cumulants from central moments according to Eq. (20)-(23) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), + //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////// + // 4. + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2 * mfbba * mfbab) * OOrho; + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2 * mfbba * mfabb) * OOrho; + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2 * mfbab * mfabb) * OOrho; + + LBMReal CUMcca = mfcca - (((mfcaa * mfaca + c2 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - + c1o9 * (drho * OOrho)); + LBMReal CUMcac = mfcac - (((mfcaa * mfaac + c2 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - + c1o9 * (drho * OOrho)); + LBMReal CUMacc = mfacc - (((mfaac * mfaca + c2 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - + c1o9 * (drho * OOrho)); + //////////////////////////////////////////////////////////// + // 5. + LBMReal CUMbcc = + mfbcc - + ((mfaac * mfbca + mfaca * mfbac + c4 * mfabb * mfbbb + c2 * (mfbab * mfacb + mfbba * mfabc)) + + c1o3 * (mfbca + mfbac)) * + OOrho; + LBMReal CUMcbc = + mfcbc - + ((mfaac * mfcba + mfcaa * mfabc + c4 * mfbab * mfbbb + c2 * (mfabb * mfcab + mfbba * mfbac)) + + c1o3 * (mfcba + mfabc)) * + OOrho; + LBMReal CUMccb = + mfccb - + ((mfcaa * mfacb + mfaca * mfcab + c4 * mfbba * mfbbb + c2 * (mfbab * mfbca + mfabb * mfcba)) + + c1o3 * (mfacb + mfcab)) * + OOrho; + //////////////////////////////////////////////////////////// + // 6. + LBMReal CUMccc = + mfccc + ((-c4 * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - + c4 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - + c2 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * + OOrho + + (c4 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2 * (mfcaa * mfaca * mfaac) + c16 * mfbba * mfbab * mfabb) * + OOrho * OOrho - + c1o3 * (mfacc + mfcac + mfcca) * OOrho - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) * + OOrho * OOrho * c2o3 + + c1o27 * ((drho * drho - drho) * OOrho * OOrho)); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute linear combinations of second and third order cumulants + //! + //////////////////////////////////////////////////////////// + // 2. + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + //////////////////////////////////////////////////////////// + // 3. + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //////////////////////////////////////////////////////////////////////////////////// + // incl. correction + //////////////////////////////////////////////////////////// + //! - Compute velocity gradients from second order cumulants according to Eq. (27)-(32) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), + //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> Further explanations of the correction in viscosity in + //! Appendix H of <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), + //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> Note that the division by rho is omitted here as we + //! need rho times the gradients later. + //! + LBMReal Dxy = -c3 * omega * mfbba; + LBMReal Dxz = -c3 * omega * mfbab; + LBMReal Dyz = -c3 * omega * mfabb; + LBMReal dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + omega * c3o2 * mxxMyy; + LBMReal dzuz = dxux + omega * c3o2 * mxxMzz; + //////////////////////////////////////////////////////////// + //! - Relaxation of second order cumulants with correction terms according to Eq. (33)-(35) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), + //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - + c3 * (c1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += omega * (-mxxMyy) - c3 * (c1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - c3 * (c1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////no correction + // mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz); + // mxxMyy += -(-omega) * (-mxxMyy); + // mxxMzz += -(-omega) * (-mxxMzz); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + + //////////////////////////////////////////////////////////////////////////////////// + // relax + ////////////////////////////////////////////////////////////////////////// + // incl. limiter + //! - Relaxation of third order cumulants including limiter according to Eq. (116)-(123) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), + //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + wadjust = Oxyz + (c1 - Oxyz) * abs(mfbbb) / (abs(mfbbb) + qudricLimitD); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxxyPyzz) / (abs(mxxyPyzz) + qudricLimitP); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxxyMyzz) / (abs(mxxyMyzz) + qudricLimitM); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxxzPyyz) / (abs(mxxzPyyz) + qudricLimitP); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxxzMyyz) / (abs(mxxzMyyz) + qudricLimitM); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxyyPxzz) / (abs(mxyyPxzz) + qudricLimitP); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxyyMxzz) / (abs(mxyyMxzz) + qudricLimitM); + mxyyMxzz += wadjust * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + // no limiter + // mfbbb += OxyyMxzz * (-mfbbb); + // mxxyPyzz += OxyyPxzz * (-mxxyPyzz); + // mxxyMyzz += OxyyMxzz * (-mxxyMyzz); + // mxxzPyyz += OxyyPxzz * (-mxxzPyyz); + // mxxzMyyz += OxyyMxzz * (-mxxzMyyz); + // mxyyPxzz += OxyyPxzz * (-mxyyPxzz); + // mxyyMxzz += OxyyMxzz * (-mxyyMxzz); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute inverse linear combinations of second and third order cumulants + //! + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-c2 * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - c2 * mxxMzz + mxxPyyPzz); + + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + ////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + // 4. + // no limiter + //! - Relax fourth order cumulants to modified equilibrium for fourth order convergence of diffusion + //! according to Eq. (43)-(48) <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et + //! al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + CUMacc = -O4 * (c1 / omega - c1o2) * (dyuy + dzuz) * c2o3 * A + (c1 - O4) * (CUMacc); + CUMcac = -O4 * (c1 / omega - c1o2) * (dxux + dzuz) * c2o3 * A + (c1 - O4) * (CUMcac); + CUMcca = -O4 * (c1 / omega - c1o2) * (dyuy + dxux) * c2o3 * A + (c1 - O4) * (CUMcca); + CUMbbc = -O4 * (c1 / omega - c1o2) * Dxy * c1o3 * B + (c1 - O4) * (CUMbbc); + CUMbcb = -O4 * (c1 / omega - c1o2) * Dxz * c1o3 * B + (c1 - O4) * (CUMbcb); + CUMcbb = -O4 * (c1 / omega - c1o2) * Dyz * c1o3 * B + (c1 - O4) * (CUMcbb); + + ////////////////////////////////////////////////////////////////////////// + // 5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + ////////////////////////////////////////////////////////////////////////// + // 6. + CUMccc += O6 * (-CUMccc); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute central moments from post collision cumulants according to Eq. (53)-(56) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), + //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + + ////////////////////////////////////////////////////////////////////////// + // 4. + mfcbb = CUMcbb + c1o3 * ((c3 * mfcaa + c1) * mfabb + c6 * mfbba * mfbab) * OOrho; + mfbcb = CUMbcb + c1o3 * ((c3 * mfaca + c1) * mfbab + c6 * mfbba * mfabb) * OOrho; + mfbbc = CUMbbc + c1o3 * ((c3 * mfaac + c1) * mfbba + c6 * mfbab * mfabb) * OOrho; + + mfcca = CUMcca + (((mfcaa * mfaca + c2 * mfbba * mfbba) * c9 + c3 * (mfcaa + mfaca)) * OOrho - + (drho * OOrho)) * + c1o9; + mfcac = CUMcac + (((mfcaa * mfaac + c2 * mfbab * mfbab) * c9 + c3 * (mfcaa + mfaac)) * OOrho - + (drho * OOrho)) * + c1o9; + mfacc = CUMacc + (((mfaac * mfaca + c2 * mfabb * mfabb) * c9 + c3 * (mfaac + mfaca)) * OOrho - + (drho * OOrho)) * + c1o9; + + ////////////////////////////////////////////////////////////////////////// + // 5. + mfbcc = CUMbcc + c1o3 * + (c3 * (mfaac * mfbca + mfaca * mfbac + c4 * mfabb * mfbbb + + c2 * (mfbab * mfacb + mfbba * mfabc)) + + (mfbca + mfbac)) * + OOrho; + mfcbc = CUMcbc + c1o3 * + (c3 * (mfaac * mfcba + mfcaa * mfabc + c4 * mfbab * mfbbb + + c2 * (mfabb * mfcab + mfbba * mfbac)) + + (mfcba + mfabc)) * + OOrho; + mfccb = CUMccb + c1o3 * + (c3 * (mfcaa * mfacb + mfaca * mfcab + c4 * mfbba * mfbbb + + c2 * (mfbab * mfbca + mfabb * mfcba)) + + (mfacb + mfcab)) * + OOrho; + + ////////////////////////////////////////////////////////////////////////// + // 6. + mfccc = + CUMccc - ((-c4 * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - + c4 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - + c2 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * + OOrho + + (c4 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2 * (mfcaa * mfaca * mfaac) + c16 * mfbba * mfbab * mfabb) * + OOrho * OOrho - + c1o3 * (mfacc + mfcac + mfcca) * OOrho - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) * + OOrho * OOrho * c2o3 + + c1o27 * ((drho * drho - drho) * OOrho * OOrho)); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Add acceleration (body force) to first order cumulants according to Eq. (85)-(87) in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), + //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + //////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in + //! Appendix J in <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), + //! DOI:10.1016/j.camwa.2015.05.001 ]</b></a> see also Eq. (88)-(96) in <a + //! href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), + //! DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1, c1); + backwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3, c1o3); + backwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3, c1o3); + backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9, c1o9); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6, c1o6); + backwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18, c1o18); + backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); + backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); + backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6, c1o6); + backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18, c1o18); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36, c1o36); + backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9, c1o9); + backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36, c1o36); + backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9, c1o9); + backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); + backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9, c1o9); + backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36, c1o36); + backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9, c1o9); + backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36, c1o36); + //////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + // proof correctness + ////////////////////////////////////////////////////////////////////////// +#ifdef PROOF_CORRECTNESS + LBMReal drho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + + (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) + + (mfbba + mfbbc) + mfbbb; + LBMReal dif = drho - drho_post; +#ifdef SINGLEPRECISION + if (dif > 10.0E-7 || dif < -10.0E-7) +#else + if (dif > 10.0E-15 || dif < -10.0E-15) +#endif + { + UB_THROW(UbException( + UB_EXARGS, + "rho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(drho_post) + + " dif=" + UbSystem::toString(dif) + " rho is not correct for node " + + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3) + + " in " + block.lock()->toString() + " step = " + UbSystem::toString(step))); + } +#endif + //////////////////////////////////////////////////////////////////////////////////// + //! - Write distributions: style of reading and writing the distributions from/to stored arrays + //! dependent on timestep is based on the esoteric twist algorithm <a + //! href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), + //! DOI:10.3390/computation5020019 ]</b></a> + //! + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->restDistributions)(x1, x2, x3) = mfbbb; + ////////////////////////////////////////////////////////////////////////// + f[D3Q27System::DIR_000] = mfbbb; + + f[D3Q27System::DIR_P00] = mfcbb; + f[D3Q27System::DIR_0P0] = mfbcb; + f[D3Q27System::DIR_00P] = mfbbc; + f[D3Q27System::DIR_PP0] = mfccb; + f[D3Q27System::DIR_MP0] = mfacb; + f[D3Q27System::DIR_P0P] = mfcbc; + f[D3Q27System::DIR_M0P] = mfabc; + f[D3Q27System::DIR_0PP] = mfbcc; + f[D3Q27System::DIR_0MP] = mfbac; + f[D3Q27System::DIR_PPP] = mfccc; + f[D3Q27System::DIR_MPP] = mfacc; + f[D3Q27System::DIR_PMP] = mfcac; + f[D3Q27System::DIR_MMP] = mfaac; + + f[D3Q27System::DIR_M00] = mfabb; + f[D3Q27System::DIR_0M0] = mfbab; + f[D3Q27System::DIR_00M] = mfbba; + f[D3Q27System::DIR_MM0] = mfaab; + f[D3Q27System::DIR_PM0] = mfcab; + f[D3Q27System::DIR_M0M] = mfaba; + f[D3Q27System::DIR_P0M] = mfcba; + f[D3Q27System::DIR_0MM] = mfbaa; + f[D3Q27System::DIR_0PM] = mfbca; + f[D3Q27System::DIR_MMM] = mfaaa; + f[D3Q27System::DIR_PMM] = mfcaa; + f[D3Q27System::DIR_MPM] = mfaca; + f[D3Q27System::DIR_PPM] = mfcca; + } + if ((*particleData)(x1, x2, x3)->solidFraction < SOLFRAC_MIN) + continue; + + LBMReal vx1, vx2, vx3, drho; + D3Q27System::calcCompMacroscopicValues(f, drho, vx1, vx2, vx3); + D3Q27System::calcCompFeq(fEq, drho, vx1, vx2, vx3); + + std::array<double, 3> uPart; + uPart[0] = (*particleData)(x1, x2, x3)->uPart[0] * (1. + drho); + uPart[1] = (*particleData)(x1, x2, x3)->uPart[1] * (1. + drho); + uPart[2] = (*particleData)(x1, x2, x3)->uPart[2] * (1. + drho); + + D3Q27System::calcCompFeq(fEqSolid, drho, uPart[0], uPart[1], uPart[2]); + + if ((*particleData)(x1, x2, x3)->solidFraction > SOLFRAC_MAX) { + double const bb0 = fEq[D3Q27System::DIR_000] - fEqSolid[D3Q27System::DIR_000]; + f[D3Q27System::DIR_000] = fPre[D3Q27System::DIR_000] + bb0; + for (int iPop = D3Q27System::FSTARTDIR; iPop <= D3Q27System::FENDDIR; iPop++) { + const int iOpp = D3Q27System::INVDIR[iPop]; + double const bb = ((fPre[iOpp] - fEq[iOpp]) - (fPre[iPop] - fEqSolid[iPop])); + double const bbOpp = ((fPre[iPop] - fEq[iPop]) - (fPre[iOpp] - fEqSolid[iOpp])); + + + f[iPop] = fPre[iPop] + bb; + f[iOpp] = fPre[iOpp] + bbOpp; + + (*particleData)(x1, x2, x3)->hydrodynamicForce[0] -= D3Q27System::DX1[iPop] * (bb - bbOpp); + (*particleData)(x1, x2, x3)->hydrodynamicForce[1] -= D3Q27System::DX2[iPop] * (bb - bbOpp); + (*particleData)(x1, x2, x3)->hydrodynamicForce[2] -= D3Q27System::DX3[iPop] * (bb - bbOpp); + } + } else { /* particleData.solidFraction < SOLFRAC_MAX */ +//#ifdef LBDEM_USE_WEIGHING + double const ooo = 1. / omega - 0.5; + double const B = (*particleData)(x1, x2, x3)->solidFraction * ooo / ((1. - (*particleData)(x1, x2, x3)->solidFraction) + ooo); +//#else +// T const B = particleData.solidFraction; +//#endif + double const oneMinB = 1. - B; + + double const bb0 = fEq[D3Q27System::DIR_000] - fEqSolid[D3Q27System::DIR_000]; + f[D3Q27System::DIR_000] = fPre[D3Q27System::DIR_000] + oneMinB * (f[D3Q27System::DIR_000] - fPre[D3Q27System::DIR_000]) + B * bb0; + + for (int iPop = D3Q27System::FSTARTDIR; iPop <= D3Q27System::FENDDIR; iPop++) { + int const iOpp = D3Q27System::INVDIR[iPop]; + double const bb = B * ((fPre[iOpp] - fEq[iOpp]) - (fPre[iPop] - fEqSolid[iPop])); + double const bbOpp = B * ((fPre[iPop] - fEq[iPop]) - (fPre[iOpp] - fEqSolid[iOpp])); + + f[iPop] = fPre[iPop] + oneMinB * (f[iPop] - fPre[iPop]) + bb; + f[iOpp] = fPre[iOpp] + oneMinB * (f[iOpp] - fPre[iOpp]) + bbOpp; + + (*particleData)(x1, x2, x3)->hydrodynamicForce[0] -= D3Q27System::DX1[iPop] * (bb - bbOpp); + (*particleData)(x1, x2, x3)->hydrodynamicForce[1] -= D3Q27System::DX2[iPop] * (bb - bbOpp); + (*particleData)(x1, x2, x3)->hydrodynamicForce[2] -= D3Q27System::DX3[iPop] * (bb - bbOpp); + } + } /* if solidFraction > SOLFRAC_MAX */ + + (*this->restDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000]; + + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::DIR_M00]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::DIR_0M0]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::DIR_00M]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::DIR_MM0]; + (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = f[D3Q27System::DIR_PM0]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::DIR_M0M]; + (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = f[D3Q27System::DIR_P0M]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::DIR_0MM]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = f[D3Q27System::DIR_0PM]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::DIR_MMM]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = f[D3Q27System::DIR_PMM]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = f[D3Q27System::DIR_MPM]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::DIR_PPM]; + + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = f[D3Q27System::DIR_P00]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = f[D3Q27System::DIR_0P0]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = f[D3Q27System::DIR_00P]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = f[D3Q27System::DIR_PP0]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = f[D3Q27System::DIR_MP0]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = f[D3Q27System::DIR_P0P]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = f[D3Q27System::DIR_M0P]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = f[D3Q27System::DIR_0PP]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = f[D3Q27System::DIR_0MP]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::DIR_PPP]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = f[D3Q27System::DIR_MPP]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = f[D3Q27System::DIR_PMP]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = f[D3Q27System::DIR_MMP]; + } + } + } + } +} +////////////////////////////////////////////////////////////////////////// + diff --git a/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h new file mode 100644 index 0000000000000000000000000000000000000000..2d5216d3607e4489cc93a062f66efdb6f2c2457a --- /dev/null +++ b/src/cpu/LiggghtsCoupling/IBcumulantK17LBMKernel.h @@ -0,0 +1,155 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 IBcumulantK17LBMKernel.h +//! \ingroup LiggghtsCoupling +//! \author Konstantin Kutscher, Martin Geier +//======================================================================================= + +#ifndef IBcumulantK17LBMKernel_h__ +#define IBcumulantK17LBMKernel_h__ + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "UbTiming.h" +#include "CbArray4D.h" +#include "CbArray3D.h" +#include "IBdynamicsParticleData.h" + + +//! \brief Compressible cumulant LBM kernel. +//! \details LBM implementation that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model +//! +//! The model is publisched in +//! <a href="http://dx.doi.org/10.1016/j.jcp.2017.05.040"><b>[ Geier et al., (2017), 10.1016/j.jcp.2017.05.040]</b></a>, +//! <a href="http://dx.doi.org/10.1016/j.jcp.2017.07.004"><b>[ Geier et al., (2017), 10.1016/j.jcp.2017.07.004]</b></a> +//! +class IBcumulantK17LBMKernel : public LBMKernel +{ +public: + IBcumulantK17LBMKernel(); + ~IBcumulantK17LBMKernel() = default; + void calculate(int step) override; + SPtr<LBMKernel> clone() override; + double getCalculationTime() override { return .0; } + CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr getParticleData() { return particleData; }; + void setParticleData(CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr particleData) + { + this->particleData = particleData; + }; + +protected: + inline void forwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K); + inline void backwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K); + inline void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + inline void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + + virtual void initDataSet(); + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr restDistributions; + + mu::value_type muX1, muX2, muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; + + CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr particleData; +}; + +//////////////////////////////////////////////////////////////////////////////// +//! \brief forward chimera transformation \ref forwardInverseChimeraWithK +//! Transformation from distributions to central moments according to Eq. (6)-(14) in +//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> +//! Modified for lower round-off errors. +//////////////////////////////////////////////////////////////////////////////// +inline void IBcumulantK17LBMKernel::forwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K) +{ + using namespace UbMath; + LBMReal m2 = mfa + mfc; + LBMReal m1 = mfc - mfa; + LBMReal m0 = m2 + mfb; + mfa = m0; + m0 *= Kinverse; + m0 += c1; + mfb = (m1 * Kinverse - m0 * vv) * K; + mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; +} +//////////////////////////////////////////////////////////////////////////////// +//! \brief backward chimera transformation \ref backwardInverseChimeraWithK +//! Transformation from central moments to distributions according to Eq. (57)-(65) in +//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> +//! ] Modified for lower round-off errors. +//////////////////////////////////////////////////////////////////////////////// +inline void IBcumulantK17LBMKernel::backwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K) +{ + using namespace UbMath; + LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (v2 - vv) * c1o2) * K; + LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (-v2)) * K; + mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (v2 + vv) * c1o2) * K; + mfa = m0; + mfb = m1; +} +//////////////////////////////////////////////////////////////////////////////// +//! \brief forward chimera transformation \ref forwardChimera +//! Transformation from distributions to central moments according to Eq. (6)-(14) in +//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> +//! for \f$ K_{abc}=0 \f$. This is to avoid unnessary floating point operations. +//! Modified for lower round-off errors. +//////////////////////////////////////////////////////////////////////////////// +inline void IBcumulantK17LBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) +{ + using namespace UbMath; + LBMReal m1 = (mfa + mfc) + mfb; + LBMReal m2 = mfc - mfa; + mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); + mfb = m2 - vv * m1; + mfa = m1; +} +//////////////////////////////////////////////////////////////////////////////// +//! \brief backward chimera transformation \ref backwardChimera +//! Transformation from central moments to distributions according to Eq. (57)-(65) in +//! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> +//! for \f$ K_{abc}=0 \f$. This is to avoid unnessary floating point operations. +//! Modified for lower round-off errors. +//////////////////////////////////////////////////////////////////////////////// +inline void IBcumulantK17LBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) +{ + using namespace UbMath; + LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); + LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; + mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); + mfb = mb; + mfa = ma; +} + +#endif // IBcumulantK17LBMKernel_h__ \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.cpp b/src/cpu/LiggghtsCoupling/IBdynamicsParticleData.h similarity index 62% rename from src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.cpp rename to src/cpu/LiggghtsCoupling/IBdynamicsParticleData.h index 33db1b0cf0fd07e5ac1db313ace368a3da0c7aed..6593a96542bb21ba03bbc1f76f731a416f8314a5 100644 --- a/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.cpp +++ b/src/cpu/LiggghtsCoupling/IBdynamicsParticleData.h @@ -26,33 +26,36 @@ // 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 Grid3DSystem.cpp -//! \ingroup Grid +//! \file DataSet3D.h +//! \ingroup LiggghtsCoupling //! \author Konstantin Kutscher //======================================================================================= -#include <Grid3DSystem.h> +#ifndef IBdynamicsParticleData_h +#define IBdynamicsParticleData_h -namespace Grid3DSystem -{ -const int INVDIR[] = { INV_E, INV_W, INV_N, INV_S, INV_T, INV_B, INV_NE, INV_NW, INV_SE, - INV_SW, INV_TE, INV_TW, INV_BE, INV_BW, INV_TN, INV_TS, INV_BN, INV_BS, - INV_TNE, INV_TNW, INV_TSE, INV_TSW, INV_BNE, INV_BNW, INV_BSE, INV_BSW }; +#include<array> -// index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -// direction: E, W, N, S, T, B, NE, SW, SE, NW, TE, BW, BE, TW, TN, BS, BN, TS, TNE TNW TSE TSW BNE BNW BSE -// BSW -const int EX1[] = { 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 }; -const int EX2[] = { 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 }; -const int EX3[] = { 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 }; -} // namespace Grid3DSystem +constexpr auto SOLFRAC_MIN = 0.001; +constexpr auto SOLFRAC_MAX = 0.999; + +struct IBdynamicsParticleData { +public: + IBdynamicsParticleData() + : partId(0), solidFraction(0.) + { + uPart[0] = 0.; + uPart[1] = 0.; + uPart[2] = 0.; + + hydrodynamicForce[0] = 0.; + hydrodynamicForce[1] = 0.; + hydrodynamicForce[2] = 0.; + }; + int partId; + double solidFraction; + std::array<double, 3> uPart; + std::array<double, 3> hydrodynamicForce; +}; -////////////////////////////////////////////////////////////////////////// -const int &Grid3DSystem::getInvertDirection(const int &direction) -{ -#ifdef _DEBUG - if (direction < STARTDIR || direction > ENDDIR) - throw UbException(UB_EXARGS, "unknown direction"); #endif - return INVDIR[direction]; -} diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp b/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..51d451064ff1b2e45433997b0e3e771b22f19ffb --- /dev/null +++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.cpp @@ -0,0 +1,413 @@ +#include "LiggghtsCouplingCoProcessor.h" +#include "GbSphere3D.h" +#include "mpi/MPICommunicator.h" +#include "CoProcessor.h" +#include "LiggghtsCouplingWrapper.h" +#include "Grid3D.h" +#include "Block3D.h" +#include "LBMKernel.h" +#include "DistributionArray3D.h" +#include "DataSet3D.h" +#include "IBcumulantK17LBMKernel.h" +#include "LBMUnitConverter.h" +#include "fix_lb_coupling_onetoone.h" + +LiggghtsCouplingCoProcessor::LiggghtsCouplingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, + SPtr<vf::mpi::Communicator> comm, + LiggghtsCouplingWrapper &wrapper, int demSteps, + SPtr<LBMUnitConverter> units) + : CoProcessor(grid, s), comm(comm), wrapper(wrapper), demSteps(demSteps), units(units) +{ + +} + +LiggghtsCouplingCoProcessor::~LiggghtsCouplingCoProcessor() +{ +} + +void LiggghtsCouplingCoProcessor::process(double actualTimeStep) +{ + if (comm->getProcessID() == 0) + std::cout << "LiggghtsCouplingCoProcessor step: " << actualTimeStep << "\n"; + + //comm->barrier(); + + getForcesFromLattice(); + + //comm->barrier(); + + wrapper.run(demSteps); + + //comm->barrier(); + + setSpheresOnLattice(); + + //comm->barrier(); +} + +void LiggghtsCouplingCoProcessor::setSpheresOnLattice() +{ + std::vector<int> excludeType; + + int nPart = wrapper.lmp->atom->nlocal + wrapper.lmp->atom->nghost; + + for (int iS = 0; iS < nPart; iS++) + { + int type = (int)wrapper.lmp->atom->type[iS]; + bool excludeFlag(false); + for (int iT = 0; iT < excludeType.size(); iT++) { + //std::cout << iS << " " << type << " " << excludeType[iT] << std::endl; + if (type == excludeType[iT]) { + excludeFlag = true; + break; + } + } + + if (excludeFlag) + continue; + + double x[3], v[3], omega[3]; + double r; + int id = wrapper.lmp->atom->tag[iS]; + + for (int i = 0; i < 3; i++) + { + x[i] = wrapper.lmp->atom->x[iS][i]; // * units->getFactorLentghWToLb(); // - 0.5; ???? + v[i] = wrapper.lmp->atom->v[iS][i] * units->getFactorVelocityWToLb(); + omega[i] = wrapper.lmp->atom->omega[iS][i] / units->getFactorTimeWToLb(); + } + + r = wrapper.lmp->atom->radius[iS]; // * units->getFactorLentghWToLb(); + + //std::cout << "x[0] = " << x[0] << ", x[1] = " << x[1] << ", x[2] = " << x[2] << std::endl; + //std::cout << "v[0] = " << v[0] << ", v[1] = " << v[1] << ", v[2] = " << v[2] << std::endl; + //std::cout << "omega[0] = " << omega[0] << ", omega[1] = " << omega[1] << ", omega[2] = " << omega[2] << std::endl; + //std::cout << "r = " << r << std::endl; + + setSingleSphere3D(x, v, omega, r, id); + } +} + +void LiggghtsCouplingCoProcessor::setSingleSphere3D(double *x, double *v, double *omega, /* double *com,*/ double r, + int id /*, bool initVelFlag*/) +{ + int level = 0; + //UbTupleInt3 bi = grid->getBlockIndexes(x[0], x[1], x[2], level); + //SPtr<Block3D> block = grid->getBlock(val<1>(bi), val<2>(bi), val<3>(bi), level); + + std::vector<SPtr<Block3D>> blocks; + grid->getBlocksByCuboid(level, x[0] - r, x[1] - r, x[2] - r, x[0] + r, x[1] + r, x[2] + r, blocks); + + for (SPtr<Block3D> block : blocks) { + if (block) { + SPtr<ILBMKernel> kernel = block->getKernel(); + SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); + + CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr particleData = + dynamicPointerCast<IBcumulantK17LBMKernel>(kernel)->getParticleData(); + + if (!particleData) + continue; + + int minX1 = 1; + int minX2 = 1; + int minX3 = 1; + + int maxX1 = (int)(distributions->getNX1()) - 1; + int maxX2 = (int)(distributions->getNX2()) - 1; + int maxX3 = (int)(distributions->getNX3()) - 1; + + for (int ix3 = minX3; ix3 < maxX3; ix3++) { + for (int ix2 = minX2; ix2 < maxX2; ix2++) { + for (int ix1 = minX1; ix1 < maxX1; ix1++) { + + //UbTupleInt3 blockNX = grid->getBlockNX(); + + //double const dx = val<1>(blockNX) * block->getX1() + ix1 - x[0]; + //double const dy = val<2>(blockNX) * block->getX2() + ix2 - x[1]; + //double const dz = val<3>(blockNX) * block->getX3() + ix3 - x[2]; + + Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3); + + double const dx = (worldCoordinates[0] - x[0]) * units->getFactorLentghWToLb(); + double const dy = (worldCoordinates[1] - x[1]) * units->getFactorLentghWToLb(); + double const dz = (worldCoordinates[2] - x[2]) * units->getFactorLentghWToLb(); + + double const sf = calcSolidFraction(dx, dy, dz, r * units->getFactorLentghWToLb()); + + double const sf_old = (*particleData)(ix1,ix2,ix3)->solidFraction; + int const id_old = (int)(*particleData)(ix1,ix2,ix3)->partId; + + int const decFlag = (sf > SOLFRAC_MIN) + 2 * (sf_old > SOLFRAC_MIN); + + switch (decFlag) { + case 0: // sf == 0 && sf_old == 0 + setToZero(*(*particleData)(ix1, ix2, ix3).get()); + break; // do nothing + case 1: // sf > 0 && sf_old == 0 + setValues(*(*particleData)(ix1, ix2, ix3).get(), id, sf, v, dx, dy, dz, omega); + break; + case 2: // sf == 0 && sf_old > 0 + if (id_old == id) // then particle has left this cell + setToZero(*(*particleData)(ix1, ix2, ix3).get()); + break; // else do nothing + case 3: // sf > 0 && sf_old > 0 + if (sf > sf_old || id_old == id) + setValues(*(*particleData)(ix1, ix2, ix3).get(), id, sf, v, dx, dy, dz, omega); + break; // else do nothing + } + // if desired, initialize interior of sphere with sphere velocity + // if (initVelFlag && sf > SOLFRAC_MAX) + // cell.defineVelocity(particleData->uPart); + + //if (sf > 0) { + // std::cout << "sf = " << sf << std::endl; + // std::cout << "ix1 = " << ix1 << ", ix2 = " << ix2 << ", ix3 = " << ix3 << std::endl; + //} + } + } + } + } + } + +} + +double LiggghtsCouplingCoProcessor::calcSolidFraction(double const dx_, double const dy_, double const dz_, + double const r_) +{ + static int const slicesPerDim = 5; + static double const sliceWidth = 1. / ((double)slicesPerDim); + static double const fraction = 1. / ((double)(slicesPerDim * slicesPerDim * slicesPerDim)); + + // should be sqrt(3.)/2. + // add a little to avoid roundoff errors + static const double sqrt3half = (double)sqrt(3.1) / 2.; + + double const dist = dx_ * dx_ + dy_ * dy_ + dz_ * dz_; + + double const r_p = r_ + sqrt3half; + if (dist > r_p * r_p) + return 0; + + double const r_m = r_ - sqrt3half; + if (dist < r_m * r_m) + return 1; + + double const r_sq = r_ * r_; + double dx_sq[slicesPerDim], dy_sq[slicesPerDim], dz_sq[slicesPerDim]; + + // pre-calculate d[xyz]_sq for efficiency + for (int i = 0; i < slicesPerDim; i++) { + double const delta = -0.5 + ((double)i + 0.5) * sliceWidth; + double const dx = dx_ + delta; + dx_sq[i] = dx * dx; + double const dy = dy_ + delta; + dy_sq[i] = dy * dy; + double const dz = dz_ + delta; + dz_sq[i] = dz * dz; + } + + unsigned int n(0); + for (int i = 0; i < slicesPerDim; i++) { + for (int j = 0; j < slicesPerDim; j++) { + for (int k = 0; k < slicesPerDim; k++) { + n += (dx_sq[i] + dy_sq[j] + dz_sq[k] < r_sq); + } + } + } + + return fraction * ((double)n); +} + + void LiggghtsCouplingCoProcessor::setValues(IBdynamicsParticleData &p, int const id, double const sf, double const *v, double const dx, double const dy, double const dz, double const *omega) +{ + p.uPart[0] = v[0]; + p.uPart[1] = v[1]; + p.uPart[2] = v[2]; + + if (omega != 0) { + p.uPart[0] += omega[1] * dz - omega[2] * dy; + p.uPart[1] += -omega[0] * dz + omega[2] * dx; + p.uPart[2] += omega[0] * dy - omega[1] * dx; + } + p.solidFraction = sf; + p.partId = id; +} + + +void LiggghtsCouplingCoProcessor::setToZero(IBdynamicsParticleData &p) +{ + p.uPart[0] = 0; + p.uPart[1] = 0; + p.uPart[2] = 0; + p.solidFraction = 0; + p.partId = 0; +} + +void LiggghtsCouplingCoProcessor::getForcesFromLattice() +{ + static std::vector<double> force, torque; + static typename ParticleData::ParticleDataArrayVector x_lb; + + int const nPart = wrapper.lmp->atom->nlocal + wrapper.lmp->atom->nghost; + int const n_force = nPart * 3; + + if (nPart == 0) + return; // no particles - no work + + if (nPart > x_lb.size()) { + for (int iPart = 0; iPart < x_lb.size(); iPart++) { + x_lb[iPart][0] = wrapper.lmp->atom->x[iPart][0]; + x_lb[iPart][1] = wrapper.lmp->atom->x[iPart][1]; + x_lb[iPart][2] = wrapper.lmp->atom->x[iPart][2]; + } + for (int iPart = x_lb.size(); iPart < nPart; iPart++) { + std::array<double, 3> ar = {wrapper.lmp->atom->x[iPart][0], + wrapper.lmp->atom->x[iPart][1], + wrapper.lmp->atom->x[iPart][2]}; + x_lb.push_back(ar); + } + + + } else { + for (int iPart = 0; iPart < nPart; iPart++) { + x_lb[iPart][0] = wrapper.lmp->atom->x[iPart][0]; + x_lb[iPart][1] = wrapper.lmp->atom->x[iPart][1]; + x_lb[iPart][2] = wrapper.lmp->atom->x[iPart][2]; + } + } + + if (n_force > force.size()) { + for (int i = 0; i < force.size(); i++) { + force[i] = 0; + torque[i] = 0; + } + for (int i = force.size(); i < n_force; i++) { + force.push_back(0.); + torque.push_back(0.); + } + } else { + for (int i = 0; i < n_force; i++) { + force[i] = 0; + torque[i] = 0; + } + } + + SumForceTorque3D(x_lb, &force.front(), &torque.front()); + + LAMMPS_NS::FixLbCouplingOnetoone *couplingFix = + dynamic_cast<LAMMPS_NS::FixLbCouplingOnetoone *>(wrapper.lmp->modify->find_fix_style("couple/lb/onetoone", 0)); + + double **f_liggghts = couplingFix->get_force_ptr(); + double **t_liggghts = couplingFix->get_torque_ptr(); + + for (int iPart = 0; iPart < nPart; iPart++) + for (int j = 0; j < 3; j++) { + f_liggghts[iPart][j] = 0; + t_liggghts[iPart][j] = 0; + } + + for (int iPart = 0; iPart < nPart; iPart++) { + int tag = wrapper.lmp->atom->tag[iPart]; + int liggghts_ind = wrapper.lmp->atom->map(tag); + + for (int j = 0; j < 3; j++) { + f_liggghts[liggghts_ind][j] += force[3 * iPart + j] * units->getFactorForceLbToW(); + t_liggghts[liggghts_ind][j] += torque[3 * iPart + j] * units->getFactorTorqueLbToW(); + } + } + couplingFix->comm_force_torque(); +} + +void LiggghtsCouplingCoProcessor::SumForceTorque3D(ParticleData::ParticleDataArrayVector &x, double *force, double *torque) +{ + int nx = grid->getNX1(), ny = grid->getNX2(), nz = grid->getNX3(); + + std::vector < SPtr < Block3D > > blocks; + int level = 0; + grid->getBlocks(level, grid->getRank(), true, blocks); + + + for (SPtr<Block3D> block : blocks) { + if (block) { + SPtr<ILBMKernel> kernel = block->getKernel(); + SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); + + CbArray3D<SPtr<IBdynamicsParticleData>, IndexerX3X2X1>::CbArray3DPtr particleData = + dynamicPointerCast<IBcumulantK17LBMKernel>(kernel)->getParticleData(); + + if (!particleData) + continue; + + int minX1 = 1; + int minX2 = 1; + int minX3 = 1; + + int maxX1 = (int)(distributions->getNX1()) - 1; + int maxX2 = (int)(distributions->getNX2()) - 1; + int maxX3 = (int)(distributions->getNX3()) - 1; + + for (int ix3 = minX3; ix3 < maxX3; ix3++) { + for (int ix2 = minX2; ix2 < maxX2; ix2++) { + for (int ix1 = minX1; ix1 < maxX1; ix1++) { + + // LIGGGHTS indices start at 1 + int const id = (*particleData)(ix1, ix2, ix3)->partId; + if (id < 1) + continue; // no particle here + + int const ind = wrapper.lmp->atom->map(id); + + Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3); + + double dx = (worldCoordinates[0] - x[ind][0]) * units->getFactorLentghWToLb(); + double dy = (worldCoordinates[1] - x[ind][1]) * units->getFactorLentghWToLb(); + double dz = (worldCoordinates[2] - x[ind][2]) * units->getFactorLentghWToLb(); + + // minimum image convention, needed if + // (1) PBC are used and + // (2) both ends of PBC lie on the same processor + if (dx > nx / 2) + dx -= nx; + else if (dx < -nx / 2) + dx += nx; + if (dy > ny / 2) + dy -= ny; + else if (dy < -ny / 2) + dy += ny; + if (dz > nz / 2) + dz -= nz; + else if (dz < -nz / 2) + dz += nz; + + double const forceX = (*particleData)(ix1, ix2, ix3)->hydrodynamicForce[0]; + double const forceY = (*particleData)(ix1, ix2, ix3)->hydrodynamicForce[1]; + double const forceZ = (*particleData)(ix1, ix2, ix3)->hydrodynamicForce[2]; + + double const torqueX = dy * forceZ - dz * forceY; + double const torqueY = -dx * forceZ + dz * forceX; + double const torqueZ = dx * forceY - dy * forceX; + + addForce(ind, 0, forceX, force); + addForce(ind, 1, forceY, force); + addForce(ind, 2, forceZ, force); + + addTorque(ind, 0, torqueX, torque); + addTorque(ind, 1, torqueY, torque); + addTorque(ind, 2, torqueZ, torque); + } + } + } + } + } + } + +void LiggghtsCouplingCoProcessor::addForce(int const partId, int const coord, double const value, double *force) +{ + force[3 * partId + coord] += value; +} + +void LiggghtsCouplingCoProcessor::addTorque(int const partId, int const coord, double const value, double *torque) +{ + torque[3 * partId + coord] += value; +} \ No newline at end of file diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h b/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..3e87c89d2b92e2d34465cc41ddeab98eee85c5ed --- /dev/null +++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingCoProcessor.h @@ -0,0 +1,104 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 LiggghtsCouplingCoProcessor.h +//! \ingroup LiggghtsCoupling +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef LiggghtsCouplingCoProcessor_h +#define LiggghtsCouplingCoProcessor_h + +#include "CoProcessor.h" + +#include "lammps.h" +#include "input.h" +#include "atom.h" +#include "modify.h" + +#include <memory> +#include <vector> + + +class CoProcessor; +namespace vf::mpi {class Communicator;} +class LiggghtsCouplingWrapper; +class Grid3D; +class Block3D; +struct IBdynamicsParticleData; +class LBMUnitConverter; + +struct ParticleData { + typedef typename std::vector<std::array<double, 3>> ParticleDataArrayVector; + typedef typename std::vector<double> ParticleDataScalarVector; +}; + +class LiggghtsCouplingCoProcessor : public CoProcessor +{ +public: + LiggghtsCouplingCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<vf::mpi::Communicator> comm, + LiggghtsCouplingWrapper &wrapper, int demSteps, SPtr<LBMUnitConverter> units); + virtual ~LiggghtsCouplingCoProcessor(); + + void process(double actualTimeStep) override; + + +protected: + void setSpheresOnLattice(); + + void setSingleSphere3D(double *x, double *v, double *omega, double r, int id /*, bool initVelFlag*/); + + double calcSolidFraction(double const dx_, double const dy_, double const dz_, double const r_); + + void setValues(IBdynamicsParticleData &p, int const id, double const sf, double const *v, double const dx, double const dy, double const dz, double const *omega); + + void setToZero(IBdynamicsParticleData &p); + + void getForcesFromLattice(); + + void SumForceTorque3D(ParticleData::ParticleDataArrayVector &x, double *force, double *torque); + + void addForce(int const partId, int const coord, double const value, double *force); + + void addTorque(int const partId, int const coord, double const value, double *torque); + +private: + SPtr<vf::mpi::Communicator> comm; + LiggghtsCouplingWrapper &wrapper; + SPtr<LBMUnitConverter> units; + int demSteps; + //std::vector<std::vector<SPtr<Block3D>>> blockVector; + //int minInitLevel; + //int maxInitLevel; + //int gridRank; + + double *force, *torque; +}; + +#endif + diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.cpp b/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9be87887a26d654d03dc8a32ed9e456ec352fef2 --- /dev/null +++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.cpp @@ -0,0 +1,85 @@ +/* + * This file is part of the LBDEMcoupling software. + * + * LBDEMcoupling 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, version 3. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + * + * Copyright 2014 Johannes Kepler University Linz + * + * Author: Philippe Seil (philippe.seil@jku.at) + */ + +#include "LiggghtsCouplingWrapper.h" +#include "mpi.h" +#include <iostream> +#include <sstream> + +LiggghtsCouplingWrapper::LiggghtsCouplingWrapper(char **argv, MPI_Comm communicator) + : lmp(0) +{ + // todo: get LAMMPS to recognize command line options + int argc_lmp = 1; + char **argv_lmp = 0; + argv_lmp = new char*[1]; + argv_lmp[0] = argv[0]; + + lmp = new LAMMPS_NS::LAMMPS(argc_lmp,argv_lmp,communicator); + + // delete[] argv_lmp[0]; + delete[] argv_lmp; +} +void LiggghtsCouplingWrapper::execFile(char* const fname) +{ + lmp->input->file(fname); +} +void LiggghtsCouplingWrapper::execCommand(std::stringstream const &cmd) +{ + lmp->input->one(cmd.str().c_str()); +} +void LiggghtsCouplingWrapper::execCommand(char* const cmd) +{ + lmp->input->one(cmd); +} +int LiggghtsCouplingWrapper::getNumParticles() +{ + return lammps_get_natoms(lmp); +} +void LiggghtsCouplingWrapper::setVariable(char const *name, double value) +{ + std::stringstream cmd; + cmd << "variable " << name << " equal " << value; + std::cout << cmd.str() << std::endl; + execCommand(cmd); +} +void LiggghtsCouplingWrapper::setVariable(char const *name, std::string &value) +{ + std::stringstream cmd; + cmd << "variable " << name << " string " << value; + std::cout << cmd.str() << std::endl; + execCommand(cmd); +} +void LiggghtsCouplingWrapper::run(int nSteps) +{ + std::stringstream cmd; + cmd << "run " << nSteps; + execCommand(cmd); +} +void LiggghtsCouplingWrapper::runUpto(int nSteps) +{ + std::stringstream cmd; + cmd << "run " << nSteps << " upto"; + execCommand(cmd); +} + + + + diff --git a/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.h b/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.h new file mode 100644 index 0000000000000000000000000000000000000000..a745a7e967ee7852a11cd37452012951e421c347 --- /dev/null +++ b/src/cpu/LiggghtsCoupling/LiggghtsCouplingWrapper.h @@ -0,0 +1,47 @@ +/* + * This file is part of the LBDEMcoupling software. + * + * LBDEMcoupling 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, version 3. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + * + * Copyright 2014 Johannes Kepler University Linz + * + * Author: Philippe Seil (philippe.seil@jku.at) + */ + +#ifndef LIGGGHTSCOUPLINGWRAPPER_H +#define LIGGGHTSCOUPLINGWRAPPER_H + +// necessary LAMMPS/LIGGGHTS includes + +#include "lammps.h" +#include "input.h" +#include "library.h" +#include "library_cfd_coupling.h" + +class LiggghtsCouplingWrapper { +public: + LiggghtsCouplingWrapper(char **argv, MPI_Comm communicator); + void execFile(char* const fname); + void execCommand(std::stringstream const &cmd); + void execCommand(char* const cmd); + void run(int nSteps); + void runUpto(int nSteps); + int getNumParticles(); + void setVariable(char const *name, double value); + void setVariable(char const *name, std::string &value); + + //private: + LAMMPS_NS::LAMMPS *lmp; +}; + +#endif /* LIGGGHTSCOUPLINGWRAPPER_H */ diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h index ee5f07a02552bbb04e21be2b3abd5b7015f14144..8aed1556b058c8420d79eab32646ae10112ec288 100644 --- a/src/cpu/VirtualFluids.h +++ b/src/cpu/VirtualFluids.h @@ -144,6 +144,7 @@ #include <BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h> #include <BoundaryConditions/MultiphaseVelocityBCAdapter.h> #include <BoundaryConditions/MultiphaseVelocityBCAlgorithm.h> +#include <BoundaryConditions/MultiphaseSlipBCAlgorithm.h> #include <Connectors/Block3DConnector.h> //#include <Connectors/Block3DConnectorFactory.h> @@ -161,6 +162,7 @@ #include <Connectors/TwoDistributionsFullDirectConnector.h> #include <Connectors/TwoDistributionsFullVectorConnector.h> + #include <Data/D3Q27EsoTwist3DSplittedVector.h> #include <Data/D3Q27EsoTwist3DSplittedVectorEx.h> #include <Data/DataSet3D.h> @@ -173,7 +175,6 @@ #include <Grid/Block3D.h> #include <Grid/Calculator.h> #include <Grid/Grid3D.h> -#include <Grid/Grid3DSystem.h> #include <Interactors/D3Q27Interactor.h> #include <Interactors/D3Q27TriFaceMeshInteractor.h> @@ -251,6 +252,11 @@ #include <LBM/MultiphaseCumulantLBMKernel.h> #include <LBM/MultiphaseScratchCumulantLBMKernel.h> #include <LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h> +#include <LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h> +#include <LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h> +#include <LBM/MultiphasePressureFilterLBMKernel.h> +#include <LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h> +#include <MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h> @@ -341,6 +347,7 @@ #include <Visitors/MultiphaseSetKernelBlockVisitor.h> #include <Visitors/MultiphaseBoundaryConditionsBlockVisitor.h> #include <Visitors/MultiphaseInitDistributionsBlockVisitor.h> +#include <Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h> #include <Visitors/SetInterpolationConnectorsBlockVisitor.h> #include <RefineAroundGbObjectHelper.h> diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h index 67a3620c0a37c623c697bf8ec6a3f70f2ba00247..f8e77af6d8280e61978740757c682fe9119d9710 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h @@ -69,6 +69,8 @@ public: static const char RheologyPowellEyringModelNoSlipBCAlgorithm = 18; static const char RheologyBinghamModelVelocityBCAlgorithm = 19; static const char MultiphaseNoSlipBCAlgorithm = 20; + static const char MultiphaseVelocityBCAlgorithm = 21; + public: diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.cpp index d66094dcc2277e297f03da91fe885f7e569d3aa2..abaf5480802c384d963134580c2408808a0885cd 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.cpp @@ -33,4 +33,4 @@ #include "BoundaryConditions.h" -const long long BoundaryConditions::maxOptionVal = (1 << optionDigits) - 1; // 2^3-1 -> 7 +const long long BoundaryConditions::maxOptionVal = (1 << optionDigits) - 1; // 2^2-1 -> 3 diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h index f59a899495c72a3f401b238de871e47a0282590b..fa61e7224ede371f1c28d3eab8e0ba795ccfa3b1 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h @@ -193,59 +193,59 @@ public: float getBoundaryVelocity(const int &direction) { switch (direction) { - case D3Q27System::E: + case D3Q27System::DIR_P00: return (float)(UbMath::c4o9 * (+bcVelocityX1)); //(2/cs^2)(=6)*rho_0(=1 bei inkompr)*wi*u*ei mit cs=1/sqrt(3) - case D3Q27System::W: + case D3Q27System::DIR_M00: return (float)(UbMath::c4o9 * (-bcVelocityX1)); // z.B. aus paper manfred MRT LB models in three dimensions (2002) - case D3Q27System::N: + case D3Q27System::DIR_0P0: return (float)(UbMath::c4o9 * (+bcVelocityX2)); - case D3Q27System::S: + case D3Q27System::DIR_0M0: return (float)(UbMath::c4o9 * (-bcVelocityX2)); - case D3Q27System::T: + case D3Q27System::DIR_00P: return (float)(UbMath::c4o9 * (+bcVelocityX3)); - case D3Q27System::B: + case D3Q27System::DIR_00M: return (float)(UbMath::c4o9 * (-bcVelocityX3)); - case D3Q27System::NE: + case D3Q27System::DIR_PP0: return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2)); - case D3Q27System::SW: + case D3Q27System::DIR_MM0: return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2)); - case D3Q27System::SE: + case D3Q27System::DIR_PM0: return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2)); - case D3Q27System::NW: + case D3Q27System::DIR_MP0: return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2)); - case D3Q27System::TE: + case D3Q27System::DIR_P0P: return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3)); - case D3Q27System::BW: + case D3Q27System::DIR_M0M: return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3)); - case D3Q27System::BE: + case D3Q27System::DIR_P0M: return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3)); - case D3Q27System::TW: + case D3Q27System::DIR_M0P: return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3)); - case D3Q27System::TN: + case D3Q27System::DIR_0PP: return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3)); - case D3Q27System::BS: + case D3Q27System::DIR_0MM: return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3)); - case D3Q27System::BN: + case D3Q27System::DIR_0PM: return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3)); - case D3Q27System::TS: + case D3Q27System::DIR_0MP: return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3)); - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); default: throw UbException(UB_EXARGS, "unknown error"); @@ -280,30 +280,6 @@ public: void setBoundaryDensity(float density) { this->bcDensity = density; } float getBoundaryDensity() { return this->bcDensity; } - ////Lodi extension - void setDensityLodiDensity(const float &bcLodiDensity) { this->bcLodiDensity = bcLodiDensity; } - void setDensityLodiVelocityX1(const float &bcLodiVelocityX1) { this->bcLodiVelocityX1 = bcLodiVelocityX1; } - void setDensityLodiVelocityX2(const float &bcLodiVelocityX2) { this->bcLodiVelocityX2 = bcLodiVelocityX2; } - void setDensityLodiVelocityX3(const float &bcLodiVelocityX3) { this->bcLodiVelocityX3 = bcLodiVelocityX3; } - void setDensityLodiLength(const float &bcLodiLentgh) { this->bcLodiLentgh = bcLodiLentgh; } - float getDensityLodiDensity() const { return this->bcLodiDensity; } - float getDensityLodiVelocityX1() const { return this->bcLodiVelocityX1; } - float getDensityLodiVelocityX2() const { return this->bcLodiVelocityX2; } - float getDensityLodiVelocityX3() const { return this->bcLodiVelocityX3; } - float getDensityLodiLength() const { return this->bcLodiLentgh; } - - float &densityLodiDensity() { return this->bcLodiDensity; } - float &densityLodiVelocityX1() { return this->bcLodiVelocityX1; } - float &densityLodiVelocityX2() { return this->bcLodiVelocityX2; } - float &densityLodiVelocityX3() { return this->bcLodiVelocityX3; } - float &densityLodiLentgh() { return this->bcLodiLentgh; } - - const float &densityLodiDensity() const { return this->bcLodiDensity; } - const float &densityLodiVelocityX1() const { return this->bcLodiVelocityX1; } - const float &densityLodiVelocityX2() const { return this->bcLodiVelocityX2; } - const float &densityLodiVelocityX3() const { return this->bcLodiVelocityX3; } - const float &densityLodiLentgh() const { return this->bcLodiLentgh; } - /*======================= Qs =============================*/ void setQ(const float &val, const int &direction) { q[direction] = val; } float getQ(const int &direction) { return q[direction]; } @@ -354,13 +330,6 @@ protected: float bcDensity{ 0.0f }; float bcPhaseField{ 0.0f }; - //FIXME: remove LODI variables, don't forget to adjust MPIIOCoProcessors - float bcLodiDensity{ 0.0f }; - float bcLodiVelocityX1{ 0.0f }; - float bcLodiVelocityX2{ 0.0f }; - float bcLodiVelocityX3{ 0.0f }; - float bcLodiLentgh{ 0.0f }; - float nx1{ 0.0f }, nx2{ 0.0f }, nx3{ 0.0f }; char algorithmType { -1 }; diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp index 8551c4371fed0f2c5d710fcf30ecad2da80abef3..bdddd2369377f1e2b30c86eb243bf4d4a843e06c 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/EqDensityBCAlgorithm.cpp @@ -63,17 +63,17 @@ void EqDensityBCAlgorithm::applyBC() int nx3 = x3; // flag points in direction of fluid - if (bcPtr->hasDensityBoundaryFlag(D3Q27System::E)) { + if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::W)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::N)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::S)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::T)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::B)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; } else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary...")); diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp index 51fc2d5abdfe7cfa5bafb7ae21571c684cd26b02..aafa0da55a085b1025c693cf29bfb18730b92882 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNoSlipBCAlgorithm.cpp @@ -66,17 +66,20 @@ void MultiphaseNoSlipBCAlgorithm::applyBC() { LBMReal f[D3Q27System::ENDF+1]; LBMReal h[D3Q27System::ENDF+1]; - LBMReal feq[D3Q27System::ENDF+1]; - LBMReal heq[D3Q27System::ENDF+1]; + LBMReal h2[D3Q27System::ENDF + 1]; + //LBMReal feq[D3Q27System::ENDF+1]; + //LBMReal heq[D3Q27System::ENDF+1]; distributions ->getDistributionInv(f, x1, x2, x3); + if (distributionsH2) + distributionsH2->getDistributionInv(h2, x1, x2, x3); distributionsH->getDistributionInv(h, x1, x2, x3); - LBMReal phi, vx1, vx2, vx3, p1; + // LBMReal phi, vx1, vx2, vx3, p1; - D3Q27System::calcDensity(h, phi); + // D3Q27System::calcDensity(h, phi); - calcMacrosFct(f, p1, vx1, vx2, vx3); - D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3); - D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3); + // calcMacrosFct(f, p1, vx1, vx2, vx3); + // D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3); + // D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3); for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++) { @@ -85,9 +88,18 @@ void MultiphaseNoSlipBCAlgorithm::applyBC() //quadratic bounce back const int invDir = D3Q27System::INVDIR[fdir]; LBMReal fReturn = f[invDir]; - distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); - LBMReal hReturn = h[invDir]; - distributionsH->setDistributionForDirection(hReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); + //distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); + distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB + LBMReal hReturn = h[invDir]; + // distributionsH->setDistributionForDirection(hReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); + distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB + if (distributionsH2) + { + LBMReal h2Return = h2[invDir]; + distributionsH2->setDistributionForDirection(h2Return, x1, x2, x3, invDir);//delay BB + // distributionsH2->setDistributionForDirection(h2Return, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir); + + } } } } diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp index d0a3b39c83c1d828801dd442fb387c4d4d33d589..054227ecd9f6d79b4f4f345335184e9da84359eb 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.cpp @@ -62,6 +62,11 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::addDistributionsH(SPtr<Distribut this->distributionsH = distributionsH; } ////////////////////////////////////////////////////////////////////////// +void MultiphaseNonReflectingOutflowBCAlgorithm::addDistributionsH2(SPtr<DistributionArray3D> distributionsH2) +{ + this->distributionsH2 = distributionsH2; +} +////////////////////////////////////////////////////////////////////////// void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC() { using namespace D3Q27System; @@ -70,6 +75,8 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC() LBMReal ftemp[ENDF+1]; LBMReal h[D3Q27System::ENDF+1]; LBMReal htemp[ENDF+1]; + LBMReal h2[D3Q27System::ENDF + 1]; + LBMReal h2temp[ENDF + 1]; int nx1 = x1; int nx2 = x2; @@ -77,277 +84,462 @@ void MultiphaseNonReflectingOutflowBCAlgorithm::applyBC() int direction = -1; //flag points in direction of fluid - if (bcPtr->hasDensityBoundaryFlag(E)) { nx1 += 1; direction = E; } - else if (bcPtr->hasDensityBoundaryFlag(W)) { nx1 -= 1; direction = W; } - else if (bcPtr->hasDensityBoundaryFlag(N)) { nx2 += 1; direction = N; } - else if (bcPtr->hasDensityBoundaryFlag(S)) { nx2 -= 1; direction = S; } - else if (bcPtr->hasDensityBoundaryFlag(T)) { nx3 += 1; direction = T; } - else if (bcPtr->hasDensityBoundaryFlag(B)) { nx3 -= 1; direction = B; } + if (bcPtr->hasDensityBoundaryFlag(DIR_P00)) { nx1 += 1; direction = DIR_P00; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_M00)) { nx1 -= 1; direction = DIR_M00; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_0P0)) { nx2 += 1; direction = DIR_0P0; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_0M0)) { nx2 -= 1; direction = DIR_0M0; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_00P)) { nx3 += 1; direction = DIR_00P; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_00M)) { nx3 -= 1; direction = DIR_00M; } else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary...")); distributions->getDistribution(f, x1, x2, x3); distributions->getDistribution(ftemp, nx1, nx2, nx3); distributionsH->getDistribution(h, x1, x2, x3); distributionsH->getDistribution(htemp, nx1, nx2, nx3); + distributionsH2->getDistribution(h2, x1, x2, x3); + distributionsH2->getDistribution(h2temp, nx1, nx2, nx3); - LBMReal phi, p1, vx1, vx2, vx3; + LBMReal /* phi,*/ p1, vx1, vx2, vx3; - D3Q27System::calcDensity(h, phi); + //D3Q27System::calcDensity(h, phi); calcMacrosFct(f, p1, vx1, vx2, vx3); switch (direction) { - case E: - f[E] = ftemp[E] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[E] ; - f[NE] = ftemp[NE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[NE] ; - f[SE] = ftemp[SE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[SE] ; - f[TE] = ftemp[TE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[TE] ; - f[BE] = ftemp[BE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[BE] ; - f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[TNE] ; - f[TSE] = ftemp[TSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[TSE] ; - f[BNE] = ftemp[BNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[BNE] ; - f[BSE] = ftemp[BSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[BSE] ; - - distributions->setDistributionInvForDirection(f[E], x1+DX1[W], x2+DX2[W], x3+DX3[W], W); - distributions->setDistributionInvForDirection(f[NE], x1+DX1[SW], x2+DX2[SW], x3+DX3[SW], SW); - distributions->setDistributionInvForDirection(f[SE], x1+DX1[NW], x2+DX2[NW], x3+DX3[NW], NW); - distributions->setDistributionInvForDirection(f[TE], x1+DX1[BW], x2+DX2[BW], x3+DX3[BW], BW); - distributions->setDistributionInvForDirection(f[BE], x1+DX1[TW], x2+DX2[TW], x3+DX3[TW], TW); - distributions->setDistributionInvForDirection(f[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW); + case DIR_P00: + f[DIR_P00] = ftemp[DIR_P00] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_P00] ; + f[DIR_PP0] = ftemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PP0] ; + f[DIR_PM0] = ftemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PM0] ; + f[DIR_P0P] = ftemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_P0P] ; + f[DIR_P0M] = ftemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_P0M] ; + f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PPP] ; + f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PMP] ; + f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PPM] ; + f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*f[DIR_PMM] ; + + distributions->setDistributionInvForDirection(f[DIR_P00], x1+DX1[DIR_M00], x2+DX2[DIR_M00], x3+DX3[DIR_M00], DIR_M00); + distributions->setDistributionInvForDirection(f[DIR_PP0], x1+DX1[DIR_MM0], x2+DX2[DIR_MM0], x3+DX3[DIR_MM0], DIR_MM0); + distributions->setDistributionInvForDirection(f[DIR_PM0], x1+DX1[DIR_MP0], x2+DX2[DIR_MP0], x3+DX3[DIR_MP0], DIR_MP0); + distributions->setDistributionInvForDirection(f[DIR_P0P], x1+DX1[DIR_M0M], x2+DX2[DIR_M0M], x3+DX3[DIR_M0M], DIR_M0M); + distributions->setDistributionInvForDirection(f[DIR_P0M], x1+DX1[DIR_M0P], x2+DX2[DIR_M0P], x3+DX3[DIR_M0P], DIR_M0P); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP); - h[E] = htemp[E] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[E] ; - h[NE] = htemp[NE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[NE] ; - h[SE] = htemp[SE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[SE] ; - h[TE] = htemp[TE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[TE] ; - h[BE] = htemp[BE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[BE] ; - h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[TNE] ; - h[TSE] = htemp[TSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[TSE] ; - h[BNE] = htemp[BNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[BNE] ; - h[BSE] = htemp[BSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[BSE] ; - - distributionsH->setDistributionInvForDirection(h[E], x1+DX1[W], x2+DX2[W], x3+DX3[W], W); - distributionsH->setDistributionInvForDirection(h[NE], x1+DX1[SW], x2+DX2[SW], x3+DX3[SW], SW); - distributionsH->setDistributionInvForDirection(h[SE], x1+DX1[NW], x2+DX2[NW], x3+DX3[NW], NW); - distributionsH->setDistributionInvForDirection(h[TE], x1+DX1[BW], x2+DX2[BW], x3+DX3[BW], BW); - distributionsH->setDistributionInvForDirection(h[BE], x1+DX1[TW], x2+DX2[TW], x3+DX3[TW], TW); - distributionsH->setDistributionInvForDirection(h[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW); - distributionsH->setDistributionInvForDirection(h[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW); - distributionsH->setDistributionInvForDirection(h[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW); - distributionsH->setDistributionInvForDirection(h[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW); + h[DIR_P00] = htemp[DIR_P00] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_P00] ; + h[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PP0] ; + h[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PM0] ; + h[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_P0P] ; + h[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_P0M] ; + h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PPP] ; + h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PMP] ; + h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PPM] ; + h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1)*h[DIR_PMM] ; + + distributionsH->setDistributionInvForDirection(h[DIR_P00], x1+DX1[DIR_M00], x2+DX2[DIR_M00], x3+DX3[DIR_M00], DIR_M00); + distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1+DX1[DIR_MM0], x2+DX2[DIR_MM0], x3+DX3[DIR_MM0], DIR_MM0); + distributionsH->setDistributionInvForDirection(h[DIR_PM0], x1+DX1[DIR_MP0], x2+DX2[DIR_MP0], x3+DX3[DIR_MP0], DIR_MP0); + distributionsH->setDistributionInvForDirection(h[DIR_P0P], x1+DX1[DIR_M0M], x2+DX2[DIR_M0M], x3+DX3[DIR_M0M], DIR_M0M); + distributionsH->setDistributionInvForDirection(h[DIR_P0M], x1+DX1[DIR_M0P], x2+DX2[DIR_M0P], x3+DX3[DIR_M0P], DIR_M0P); + distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM); + distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM); + distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP); + distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP); + + h2[DIR_P00] = h2temp[DIR_P00] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P00]; + h2[DIR_PP0] = h2temp[DIR_PP0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PP0]; + h2[DIR_PM0] = h2temp[DIR_PM0] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PM0]; + h2[DIR_P0P] = h2temp[DIR_P0P] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P0P]; + h2[DIR_P0M] = h2temp[DIR_P0M] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_P0M]; + h2[DIR_PPP] = h2temp[DIR_PPP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PPP]; + h2[DIR_PMP] = h2temp[DIR_PMP] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PMP]; + h2[DIR_PPM] = h2temp[DIR_PPM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PPM]; + h2[DIR_PMM] = h2temp[DIR_PMM] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h2[DIR_PMM]; + + distributionsH2->setDistributionInvForDirection(h2[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00); + distributionsH2->setDistributionInvForDirection(h2[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0); + distributionsH2->setDistributionInvForDirection(h2[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0); + distributionsH2->setDistributionInvForDirection(h2[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M); + distributionsH2->setDistributionInvForDirection(h2[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P); + distributionsH2->setDistributionInvForDirection(h2[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributionsH2->setDistributionInvForDirection(h2[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributionsH2->setDistributionInvForDirection(h2[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributionsH2->setDistributionInvForDirection(h2[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); break; - case W: - f[W] = ftemp[W] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[W] ; - f[NW] = ftemp[NW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[NW] ; - f[SW] = ftemp[SW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[SW] ; - f[TW] = ftemp[TW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[TW] ; - f[BW] = ftemp[BW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[BW] ; - f[TNW] = ftemp[TNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[TNW]; - f[TSW] = ftemp[TSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[TSW]; - f[BNW] = ftemp[BNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[BNW]; - f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*f[BSW]; - - distributions->setDistributionInvForDirection(f[W], x1+DX1[E], x2+DX2[E], x3+DX3[E], E); - distributions->setDistributionInvForDirection(f[NW], x1+DX1[SE], x2+DX2[SE], x3+DX3[SE], SE); - distributions->setDistributionInvForDirection(f[SW], x1+DX1[NE], x2+DX2[NE], x3+DX3[NE], NE); - distributions->setDistributionInvForDirection(f[TW], x1+DX1[BE], x2+DX2[BE], x3+DX3[BE], BE); - distributions->setDistributionInvForDirection(f[BW], x1+DX1[TE], x2+DX2[TE], x3+DX3[TE], TE); - distributions->setDistributionInvForDirection(f[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE); - distributions->setDistributionInvForDirection(f[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE); - distributions->setDistributionInvForDirection(f[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE); - - h[W] = htemp[W] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[W] ; - h[NW] = htemp[NW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[NW] ; - h[SW] = htemp[SW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[SW] ; - h[TW] = htemp[TW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[TW] ; - h[BW] = htemp[BW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[BW] ; - h[TNW] = htemp[TNW]* (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[TNW]; - h[TSW] = htemp[TSW]* (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[TSW]; - h[BNW] = htemp[BNW]* (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[BNW]; - h[BSW] = htemp[BSW]* (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1)*h[BSW]; - - distributionsH->setDistributionInvForDirection(h[W], x1+DX1[E], x2+DX2[E], x3+DX3[E], E); - distributionsH->setDistributionInvForDirection(h[NW], x1+DX1[SE], x2+DX2[SE], x3+DX3[SE], SE); - distributionsH->setDistributionInvForDirection(h[SW], x1+DX1[NE], x2+DX2[NE], x3+DX3[NE], NE); - distributionsH->setDistributionInvForDirection(h[TW], x1+DX1[BE], x2+DX2[BE], x3+DX3[BE], BE); - distributionsH->setDistributionInvForDirection(h[BW], x1+DX1[TE], x2+DX2[TE], x3+DX3[TE], TE); - distributionsH->setDistributionInvForDirection(h[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE); - distributionsH->setDistributionInvForDirection(h[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE); - distributionsH->setDistributionInvForDirection(h[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE); - distributionsH->setDistributionInvForDirection(h[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE); + case DIR_M00: + if (false /* vx1 >= 0*/) { + + f[DIR_M00] = ftemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M00]; + f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MP0]; + f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MM0]; + f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0P]; + f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0M]; + f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPP]; + f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMP]; + f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPM]; + f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMM]; + + distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); + + h[DIR_M00] = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M00]; + h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MP0]; + h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MM0]; + h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0P]; + h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0M]; + h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPP]; + h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMP]; + h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPM]; + h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMM]; + distributionsH->setDistributionInvForDirection(h[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); + + h2[DIR_M00] = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M00]; + h2[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MP0]; + h2[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MM0]; + h2[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M0P]; + h2[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M0M]; + h2[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPP]; + h2[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMP]; + h2[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPM]; + h2[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMM]; + + distributionsH2->setDistributionInvForDirection(h2[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributionsH2->setDistributionInvForDirection(h2[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributionsH2->setDistributionInvForDirection(h2[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributionsH2->setDistributionInvForDirection(h2[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributionsH2->setDistributionInvForDirection(h2[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributionsH2->setDistributionInvForDirection(h2[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH2->setDistributionInvForDirection(h2[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributionsH2->setDistributionInvForDirection(h2[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); + } else { + + f[DIR_M00] = ftemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M00]; + f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MP0]; + f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MM0]; + f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0P]; + f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_M0M]; + f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPP]; + f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMP]; + f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MPM]; + f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[DIR_MMM]; + + distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); + + h[DIR_M00] = htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M00]; + h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MP0]; + h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MM0]; + h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0P]; + h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_M0M]; + h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPP]; + h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMP]; + h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MPM]; + h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[DIR_MMM]; + + distributionsH->setDistributionInvForDirection(h[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); + + h2[DIR_M00] = 0.5 * (htemp[DIR_M00] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M00]); + h2[DIR_MP0] = 0.5 * (htemp[DIR_MP0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MP0]); + h2[DIR_MM0] = 0.5 * (htemp[DIR_MM0] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MM0]); + h2[DIR_M0P] = 0.5 * (htemp[DIR_M0P] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M0P]); + h2[DIR_M0M] = 0.5 * (htemp[DIR_M0M] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_M0M]); + h2[DIR_MPP] = 0.5 * (htemp[DIR_MPP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPP]); + h2[DIR_MMP] = 0.5 * (htemp[DIR_MMP] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMP]); + h2[DIR_MPM] = 0.5 * (htemp[DIR_MPM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MPM]); + h2[DIR_MMM] = 0.5 * (htemp[DIR_MMM] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h2[DIR_MMM]); + + distributionsH2->setDistributionInvForDirection(h2[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributionsH2->setDistributionInvForDirection(h2[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributionsH2->setDistributionInvForDirection(h2[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributionsH2->setDistributionInvForDirection(h2[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributionsH2->setDistributionInvForDirection(h2[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributionsH2->setDistributionInvForDirection(h2[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH2->setDistributionInvForDirection(h2[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributionsH2->setDistributionInvForDirection(h2[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); + } break; - case N: - f[N] = ftemp[N] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[N] ; - f[NE] = ftemp[NE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[NE] ; - f[NW] = ftemp[NW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[NW] ; - f[TN] = ftemp[TN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[TN] ; - f[BN] = ftemp[BN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[BN] ; - f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[TNE] ; - f[TNW] = ftemp[TNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[TNW] ; - f[BNE] = ftemp[BNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[BNE] ; - f[BNW] = ftemp[BNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[BNW] ; - - distributions->setDistributionInvForDirection(f[N], x1+DX1[S], x2+DX2[S], x3+DX3[S], S); - distributions->setDistributionInvForDirection(f[NE], x1+DX1[SW], x2+DX2[SW], x3+DX3[SW], SW); - distributions->setDistributionInvForDirection(f[NW], x1+DX1[SE], x2+DX2[SE], x3+DX3[SE], SE); - distributions->setDistributionInvForDirection(f[TN], x1+DX1[BS], x2+DX2[BS], x3+DX3[BS], BS); - distributions->setDistributionInvForDirection(f[BN], x1+DX1[TS], x2+DX2[TS], x3+DX3[TS], TS); - distributions->setDistributionInvForDirection(f[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE); - - h[N] = htemp[N] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[N] ; - h[NE] = htemp[NE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[NE] ; - h[NW] = htemp[NW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[NW] ; - h[TN] = htemp[TN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[TN] ; - h[BN] = htemp[BN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[BN] ; - h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[TNE] ; - h[TNW] = htemp[TNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[TNW] ; - h[BNE] = htemp[BNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[BNE] ; - h[BNW] = htemp[BNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[BNW] ; - - distributionsH->setDistributionInvForDirection(h[N], x1+DX1[S], x2+DX2[S], x3+DX3[S], S); - distributionsH->setDistributionInvForDirection(h[NE], x1+DX1[SW], x2+DX2[SW], x3+DX3[SW], SW); - distributionsH->setDistributionInvForDirection(h[NW], x1+DX1[SE], x2+DX2[SE], x3+DX3[SE], SE); - distributionsH->setDistributionInvForDirection(h[TN], x1+DX1[BS], x2+DX2[BS], x3+DX3[BS], BS); - distributionsH->setDistributionInvForDirection(h[BN], x1+DX1[TS], x2+DX2[TS], x3+DX3[TS], TS); - distributionsH->setDistributionInvForDirection(h[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW); - distributionsH->setDistributionInvForDirection(h[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE); - distributionsH->setDistributionInvForDirection(h[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW); - distributionsH->setDistributionInvForDirection(h[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE); + case DIR_0P0: + f[DIR_0P0] = ftemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_0P0] ; + f[DIR_PP0] = ftemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_PP0] ; + f[DIR_MP0] = ftemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_MP0] ; + f[DIR_0PP] = ftemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_0PP] ; + f[DIR_0PM] = ftemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_0PM] ; + f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_PPP] ; + f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_MPP] ; + f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_PPM] ; + f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*f[DIR_MPM] ; + + distributions->setDistributionInvForDirection(f[DIR_0P0], x1+DX1[DIR_0M0], x2+DX2[DIR_0M0], x3+DX3[DIR_0M0], DIR_0M0); + distributions->setDistributionInvForDirection(f[DIR_PP0], x1+DX1[DIR_MM0], x2+DX2[DIR_MM0], x3+DX3[DIR_MM0], DIR_MM0); + distributions->setDistributionInvForDirection(f[DIR_MP0], x1+DX1[DIR_PM0], x2+DX2[DIR_PM0], x3+DX3[DIR_PM0], DIR_PM0); + distributions->setDistributionInvForDirection(f[DIR_0PP], x1+DX1[DIR_0MM], x2+DX2[DIR_0MM], x3+DX3[DIR_0MM], DIR_0MM); + distributions->setDistributionInvForDirection(f[DIR_0PM], x1+DX1[DIR_0MP], x2+DX2[DIR_0MP], x3+DX3[DIR_0MP], DIR_0MP); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1+DX1[DIR_PMM], x2+DX2[DIR_PMM], x3+DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1+DX1[DIR_PMP], x2+DX2[DIR_PMP], x3+DX3[DIR_PMP], DIR_PMP); + + h[DIR_0P0] = htemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_0P0] ; + h[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_PP0] ; + h[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_MP0] ; + h[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_0PP] ; + h[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_0PM] ; + h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_PPP] ; + h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_MPP] ; + h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_PPM] ; + h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2)*h[DIR_MPM] ; + + distributionsH->setDistributionInvForDirection(h[DIR_0P0], x1+DX1[DIR_0M0], x2+DX2[DIR_0M0], x3+DX3[DIR_0M0], DIR_0M0); + distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1+DX1[DIR_MM0], x2+DX2[DIR_MM0], x3+DX3[DIR_MM0], DIR_MM0); + distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1+DX1[DIR_PM0], x2+DX2[DIR_PM0], x3+DX3[DIR_PM0], DIR_PM0); + distributionsH->setDistributionInvForDirection(h[DIR_0PP], x1+DX1[DIR_0MM], x2+DX2[DIR_0MM], x3+DX3[DIR_0MM], DIR_0MM); + distributionsH->setDistributionInvForDirection(h[DIR_0PM], x1+DX1[DIR_0MP], x2+DX2[DIR_0MP], x3+DX3[DIR_0MP], DIR_0MP); + distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM); + distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1+DX1[DIR_PMM], x2+DX2[DIR_PMM], x3+DX3[DIR_PMM], DIR_PMM); + distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP); + distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1+DX1[DIR_PMP], x2+DX2[DIR_PMP], x3+DX3[DIR_PMP], DIR_PMP); + + h2[DIR_0P0] = htemp[DIR_0P0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0P0]; + h2[DIR_PP0] = htemp[DIR_PP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PP0]; + h2[DIR_MP0] = htemp[DIR_MP0] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MP0]; + h2[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0PP]; + h2[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_0PM]; + h2[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PPP]; + h2[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MPP]; + h2[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_PPM]; + h2[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h2[DIR_MPM]; + + distributionsH2->setDistributionInvForDirection(h2[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0); + distributionsH2->setDistributionInvForDirection(h2[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0); + distributionsH2->setDistributionInvForDirection(h2[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributionsH2->setDistributionInvForDirection(h2[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM); + distributionsH2->setDistributionInvForDirection(h2[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP); + distributionsH2->setDistributionInvForDirection(h2[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributionsH2->setDistributionInvForDirection(h2[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH2->setDistributionInvForDirection(h2[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributionsH2->setDistributionInvForDirection(h2[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); break; - case S: - f[S] = ftemp[S] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[S] ; - f[SE] = ftemp[SE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[SE] ; - f[SW] = ftemp[SW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[SW] ; - f[TS] = ftemp[TS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[TS] ; - f[BS] = ftemp[BS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[BS] ; - f[TSE] = ftemp[TSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[TSE] ; - f[TSW] = ftemp[TSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[TSW] ; - f[BSE] = ftemp[BSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[BSE] ; - f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[BSW] ; - - distributions->setDistributionInvForDirection(f[S], x1+DX1[N], x2+DX2[N], x3+DX3[N], N); - distributions->setDistributionInvForDirection(f[SE], x1+DX1[NW], x2+DX2[NW], x3+DX3[NW], NW); - distributions->setDistributionInvForDirection(f[SW], x1+DX1[NE], x2+DX2[NE], x3+DX3[NE], NE); - distributions->setDistributionInvForDirection(f[TS], x1+DX1[BN], x2+DX2[BN], x3+DX3[BN], BN); - distributions->setDistributionInvForDirection(f[BS], x1+DX1[TN], x2+DX2[TN], x3+DX3[TN], TN); - distributions->setDistributionInvForDirection(f[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE); - distributions->setDistributionInvForDirection(f[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW); - distributions->setDistributionInvForDirection(f[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE); - - h[S] = htemp[S] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[S] ; - h[SE] = htemp[SE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[SE] ; - h[SW] = htemp[SW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[SW] ; - h[TS] = htemp[TS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[TS] ; - h[BS] = htemp[BS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[BS] ; - h[TSE] = htemp[TSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[TSE] ; - h[TSW] = htemp[TSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[TSW] ; - h[BSE] = htemp[BSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[BSE] ; - h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[BSW] ; - - distributionsH->setDistributionInvForDirection(h[S], x1+DX1[N], x2+DX2[N], x3+DX3[N], N); - distributionsH->setDistributionInvForDirection(h[SE], x1+DX1[NW], x2+DX2[NW], x3+DX3[NW], NW); - distributionsH->setDistributionInvForDirection(h[SW], x1+DX1[NE], x2+DX2[NE], x3+DX3[NE], NE); - distributionsH->setDistributionInvForDirection(h[TS], x1+DX1[BN], x2+DX2[BN], x3+DX3[BN], BN); - distributionsH->setDistributionInvForDirection(h[BS], x1+DX1[TN], x2+DX2[TN], x3+DX3[TN], TN); - distributionsH->setDistributionInvForDirection(h[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW); - distributionsH->setDistributionInvForDirection(h[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE); - distributionsH->setDistributionInvForDirection(h[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW); - distributionsH->setDistributionInvForDirection(h[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE); + case DIR_0M0: + f[DIR_0M0] = ftemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_0M0] ; + f[DIR_PM0] = ftemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_PM0] ; + f[DIR_MM0] = ftemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_MM0] ; + f[DIR_0MP] = ftemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_0MP] ; + f[DIR_0MM] = ftemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_0MM] ; + f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_PMP] ; + f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_MMP] ; + f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_PMM] ; + f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*f[DIR_MMM] ; + + distributions->setDistributionInvForDirection(f[DIR_0M0], x1+DX1[DIR_0P0], x2+DX2[DIR_0P0], x3+DX3[DIR_0P0], DIR_0P0); + distributions->setDistributionInvForDirection(f[DIR_PM0], x1+DX1[DIR_MP0], x2+DX2[DIR_MP0], x3+DX3[DIR_MP0], DIR_MP0); + distributions->setDistributionInvForDirection(f[DIR_MM0], x1+DX1[DIR_PP0], x2+DX2[DIR_PP0], x3+DX3[DIR_PP0], DIR_PP0); + distributions->setDistributionInvForDirection(f[DIR_0MP], x1+DX1[DIR_0PM], x2+DX2[DIR_0PM], x3+DX3[DIR_0PM], DIR_0PM); + distributions->setDistributionInvForDirection(f[DIR_0MM], x1+DX1[DIR_0PP], x2+DX2[DIR_0PP], x3+DX3[DIR_0PP], DIR_0PP); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1+DX1[DIR_PPM], x2+DX2[DIR_PPM], x3+DX3[DIR_PPM], DIR_PPM); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1+DX1[DIR_PPP], x2+DX2[DIR_PPP], x3+DX3[DIR_PPP], DIR_PPP); + + h[DIR_0M0] = htemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_0M0] ; + h[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_PM0] ; + h[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_MM0] ; + h[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_0MP] ; + h[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_0MM] ; + h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_PMP] ; + h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_MMP] ; + h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_PMM] ; + h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2)*h[DIR_MMM] ; + + distributionsH->setDistributionInvForDirection(h[DIR_0M0], x1+DX1[DIR_0P0], x2+DX2[DIR_0P0], x3+DX3[DIR_0P0], DIR_0P0); + distributionsH->setDistributionInvForDirection(h[DIR_PM0], x1+DX1[DIR_MP0], x2+DX2[DIR_MP0], x3+DX3[DIR_MP0], DIR_MP0); + distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1+DX1[DIR_PP0], x2+DX2[DIR_PP0], x3+DX3[DIR_PP0], DIR_PP0); + distributionsH->setDistributionInvForDirection(h[DIR_0MP], x1+DX1[DIR_0PM], x2+DX2[DIR_0PM], x3+DX3[DIR_0PM], DIR_0PM); + distributionsH->setDistributionInvForDirection(h[DIR_0MM], x1+DX1[DIR_0PP], x2+DX2[DIR_0PP], x3+DX3[DIR_0PP], DIR_0PP); + distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM); + distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1+DX1[DIR_PPM], x2+DX2[DIR_PPM], x3+DX3[DIR_PPM], DIR_PPM); + distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP); + distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1+DX1[DIR_PPP], x2+DX2[DIR_PPP], x3+DX3[DIR_PPP], DIR_PPP); + + h2[DIR_0M0] = htemp[DIR_0M0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0M0]; + h2[DIR_PM0] = htemp[DIR_PM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PM0]; + h2[DIR_MM0] = htemp[DIR_MM0] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MM0]; + h2[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0MP]; + h2[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_0MM]; + h2[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PMP]; + h2[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MMP]; + h2[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_PMM]; + h2[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h2[DIR_MMM]; + + distributionsH2->setDistributionInvForDirection(h2[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0); + distributionsH2->setDistributionInvForDirection(h2[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0); + distributionsH2->setDistributionInvForDirection(h2[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributionsH2->setDistributionInvForDirection(h2[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM); + distributionsH2->setDistributionInvForDirection(h2[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP); + distributionsH2->setDistributionInvForDirection(h2[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributionsH2->setDistributionInvForDirection(h2[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributionsH2->setDistributionInvForDirection(h2[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); + distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; - case T: - f[T] = ftemp[T] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[T] ; - f[TE] = ftemp[TE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TE] ; - f[TW] = ftemp[TW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TW] ; - f[TN] = ftemp[TN] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TN] ; - f[TS] = ftemp[TS] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TS] ; - f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TNE] ; - f[TNW] = ftemp[TNW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TNW] ; - f[TSE] = ftemp[TSE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TSE] ; - f[TSW] = ftemp[TSW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[TSW] ; - - distributions->setDistributionInvForDirection(f[T], x1+DX1[B], x2+DX2[B], x3+DX3[B], B); - distributions->setDistributionInvForDirection(f[TE], x1+DX1[BW], x2+DX2[BW], x3+DX3[BW], BW); - distributions->setDistributionInvForDirection(f[TW], x1+DX1[BE], x2+DX2[BE], x3+DX3[BE], BE); - distributions->setDistributionInvForDirection(f[TN], x1+DX1[BS], x2+DX2[BS], x3+DX3[BS], BS); - distributions->setDistributionInvForDirection(f[TS], x1+DX1[BN], x2+DX2[BN], x3+DX3[BN], BN); - distributions->setDistributionInvForDirection(f[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE); - - h[T] = htemp[T] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[T] ; - h[TE] = htemp[TE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TE] ; - h[TW] = htemp[TW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TW] ; - h[TN] = htemp[TN] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TN] ; - h[TS] = htemp[TS] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TS] ; - h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TNE] ; - h[TNW] = htemp[TNW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TNW] ; - h[TSE] = htemp[TSE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TSE] ; - h[TSW] = htemp[TSW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[TSW] ; - - distributionsH->setDistributionInvForDirection(h[T], x1+DX1[B], x2+DX2[B], x3+DX3[B], B); - distributionsH->setDistributionInvForDirection(h[TE], x1+DX1[BW], x2+DX2[BW], x3+DX3[BW], BW); - distributionsH->setDistributionInvForDirection(h[TW], x1+DX1[BE], x2+DX2[BE], x3+DX3[BE], BE); - distributionsH->setDistributionInvForDirection(h[TN], x1+DX1[BS], x2+DX2[BS], x3+DX3[BS], BS); - distributionsH->setDistributionInvForDirection(h[TS], x1+DX1[BN], x2+DX2[BN], x3+DX3[BN], BN); - distributionsH->setDistributionInvForDirection(h[TNE], x1+DX1[BSW], x2+DX2[BSW], x3+DX3[BSW], BSW); - distributionsH->setDistributionInvForDirection(h[TNW], x1+DX1[BSE], x2+DX2[BSE], x3+DX3[BSE], BSE); - distributionsH->setDistributionInvForDirection(h[TSE], x1+DX1[BNW], x2+DX2[BNW], x3+DX3[BNW], BNW); - distributionsH->setDistributionInvForDirection(h[TSW], x1+DX1[BNE], x2+DX2[BNE], x3+DX3[BNE], BNE); + case DIR_00P: + f[DIR_00P] = ftemp[DIR_00P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_00P] ; + f[DIR_P0P] = ftemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_P0P] ; + f[DIR_M0P] = ftemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_M0P] ; + f[DIR_0PP] = ftemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_0PP] ; + f[DIR_0MP] = ftemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_0MP] ; + f[DIR_PPP] = ftemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_PPP] ; + f[DIR_MPP] = ftemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_MPP] ; + f[DIR_PMP] = ftemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_PMP] ; + f[DIR_MMP] = ftemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*f[DIR_MMP] ; + + distributions->setDistributionInvForDirection(f[DIR_00P], x1+DX1[DIR_00M], x2+DX2[DIR_00M], x3+DX3[DIR_00M], DIR_00M); + distributions->setDistributionInvForDirection(f[DIR_P0P], x1+DX1[DIR_M0M], x2+DX2[DIR_M0M], x3+DX3[DIR_M0M], DIR_M0M); + distributions->setDistributionInvForDirection(f[DIR_M0P], x1+DX1[DIR_P0M], x2+DX2[DIR_P0M], x3+DX3[DIR_P0M], DIR_P0M); + distributions->setDistributionInvForDirection(f[DIR_0PP], x1+DX1[DIR_0MM], x2+DX2[DIR_0MM], x3+DX3[DIR_0MM], DIR_0MM); + distributions->setDistributionInvForDirection(f[DIR_0MP], x1+DX1[DIR_0PM], x2+DX2[DIR_0PM], x3+DX3[DIR_0PM], DIR_0PM); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1+DX1[DIR_PMM], x2+DX2[DIR_PMM], x3+DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1+DX1[DIR_PPM], x2+DX2[DIR_PPM], x3+DX3[DIR_PPM], DIR_PPM); + + h[DIR_00P] = htemp[DIR_00P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_00P] ; + h[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_P0P] ; + h[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_M0P] ; + h[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_0PP] ; + h[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_0MP] ; + h[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_PPP] ; + h[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_MPP] ; + h[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_PMP] ; + h[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3)*h[DIR_MMP] ; + + distributionsH->setDistributionInvForDirection(h[DIR_00P], x1+DX1[DIR_00M], x2+DX2[DIR_00M], x3+DX3[DIR_00M], DIR_00M); + distributionsH->setDistributionInvForDirection(h[DIR_P0P], x1+DX1[DIR_M0M], x2+DX2[DIR_M0M], x3+DX3[DIR_M0M], DIR_M0M); + distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1+DX1[DIR_P0M], x2+DX2[DIR_P0M], x3+DX3[DIR_P0M], DIR_P0M); + distributionsH->setDistributionInvForDirection(h[DIR_0PP], x1+DX1[DIR_0MM], x2+DX2[DIR_0MM], x3+DX3[DIR_0MM], DIR_0MM); + distributionsH->setDistributionInvForDirection(h[DIR_0MP], x1+DX1[DIR_0PM], x2+DX2[DIR_0PM], x3+DX3[DIR_0PM], DIR_0PM); + distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1+DX1[DIR_MMM], x2+DX2[DIR_MMM], x3+DX3[DIR_MMM], DIR_MMM); + distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1+DX1[DIR_PMM], x2+DX2[DIR_PMM], x3+DX3[DIR_PMM], DIR_PMM); + distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1+DX1[DIR_MPM], x2+DX2[DIR_MPM], x3+DX3[DIR_MPM], DIR_MPM); + distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1+DX1[DIR_PPM], x2+DX2[DIR_PPM], x3+DX3[DIR_PPM], DIR_PPM); + + h2[DIR_00P] = htemp[DIR_00P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_00P]; + h2[DIR_P0P] = htemp[DIR_P0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_P0P]; + h2[DIR_M0P] = htemp[DIR_M0P] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_M0P]; + h2[DIR_0PP] = htemp[DIR_0PP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_0PP]; + h2[DIR_0MP] = htemp[DIR_0MP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_0MP]; + h2[DIR_PPP] = htemp[DIR_PPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_PPP]; + h2[DIR_MPP] = htemp[DIR_MPP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_MPP]; + h2[DIR_PMP] = htemp[DIR_PMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_PMP]; + h2[DIR_MMP] = htemp[DIR_MMP] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h2[DIR_MMP]; + + distributionsH2->setDistributionInvForDirection(h2[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M); + distributionsH2->setDistributionInvForDirection(h2[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M); + distributionsH2->setDistributionInvForDirection(h2[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributionsH2->setDistributionInvForDirection(h2[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM); + distributionsH2->setDistributionInvForDirection(h2[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM); + distributionsH2->setDistributionInvForDirection(h2[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributionsH2->setDistributionInvForDirection(h2[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH2->setDistributionInvForDirection(h2[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributionsH2->setDistributionInvForDirection(h2[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); break; - case B: - f[B] = ftemp[B] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[B] ; - f[BE] = ftemp[BE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BE] ; - f[BW] = ftemp[BW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BW] ; - f[BN] = ftemp[BN] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BN] ; - f[BS] = ftemp[BS] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BS] ; - f[BNE] = ftemp[BNE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BNE] ; - f[BNW] = ftemp[BNW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BNW] ; - f[BSE] = ftemp[BSE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BSE] ; - f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[BSW] ; - - distributions->setDistributionInvForDirection(f[B], x1+DX1[T], x2+DX2[T], x3+DX3[T], T); - distributions->setDistributionInvForDirection(f[BE], x1+DX1[TW], x2+DX2[TW], x3+DX3[TW], TW); - distributions->setDistributionInvForDirection(f[BW], x1+DX1[TE], x2+DX2[TE], x3+DX3[TE], TE); - distributions->setDistributionInvForDirection(f[BN], x1+DX1[TS], x2+DX2[TS], x3+DX3[TS], TS); - distributions->setDistributionInvForDirection(f[BS], x1+DX1[TN], x2+DX2[TN], x3+DX3[TN], TN); - distributions->setDistributionInvForDirection(f[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE); - distributions->setDistributionInvForDirection(f[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW); - distributions->setDistributionInvForDirection(f[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE); - - h[B] = htemp[B] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[B] ; - h[BE] = htemp[BE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BE] ; - h[BW] = htemp[BW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BW] ; - h[BN] = htemp[BN] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BN] ; - h[BS] = htemp[BS] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BS] ; - h[BNE] = htemp[BNE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BNE] ; - h[BNW] = htemp[BNW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BNW] ; - h[BSE] = htemp[BSE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BSE] ; - h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[BSW] ; - - distributionsH->setDistributionInvForDirection(h[B], x1+DX1[T], x2+DX2[T], x3+DX3[T], T); - distributionsH->setDistributionInvForDirection(h[BE], x1+DX1[TW], x2+DX2[TW], x3+DX3[TW], TW); - distributionsH->setDistributionInvForDirection(h[BW], x1+DX1[TE], x2+DX2[TE], x3+DX3[TE], TE); - distributionsH->setDistributionInvForDirection(h[BN], x1+DX1[TS], x2+DX2[TS], x3+DX3[TS], TS); - distributionsH->setDistributionInvForDirection(h[BS], x1+DX1[TN], x2+DX2[TN], x3+DX3[TN], TN); - distributionsH->setDistributionInvForDirection(h[BNE], x1+DX1[TSW], x2+DX2[TSW], x3+DX3[TSW], TSW); - distributionsH->setDistributionInvForDirection(h[BNW], x1+DX1[TSE], x2+DX2[TSE], x3+DX3[TSE], TSE); - distributionsH->setDistributionInvForDirection(h[BSE], x1+DX1[TNW], x2+DX2[TNW], x3+DX3[TNW], TNW); - distributionsH->setDistributionInvForDirection(h[BSW], x1+DX1[TNE], x2+DX2[TNE], x3+DX3[TNE], TNE); + case DIR_00M: + f[DIR_00M] = ftemp[DIR_00M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_00M] ; + f[DIR_P0M] = ftemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_P0M] ; + f[DIR_M0M] = ftemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_M0M] ; + f[DIR_0PM] = ftemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_0PM] ; + f[DIR_0MM] = ftemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_0MM] ; + f[DIR_PPM] = ftemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_PPM] ; + f[DIR_MPM] = ftemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_MPM] ; + f[DIR_PMM] = ftemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_PMM] ; + f[DIR_MMM] = ftemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*f[DIR_MMM] ; + + distributions->setDistributionInvForDirection(f[DIR_00M], x1+DX1[DIR_00P], x2+DX2[DIR_00P], x3+DX3[DIR_00P], DIR_00P); + distributions->setDistributionInvForDirection(f[DIR_P0M], x1+DX1[DIR_M0P], x2+DX2[DIR_M0P], x3+DX3[DIR_M0P], DIR_M0P); + distributions->setDistributionInvForDirection(f[DIR_M0M], x1+DX1[DIR_P0P], x2+DX2[DIR_P0P], x3+DX3[DIR_P0P], DIR_P0P); + distributions->setDistributionInvForDirection(f[DIR_0PM], x1+DX1[DIR_0MP], x2+DX2[DIR_0MP], x3+DX3[DIR_0MP], DIR_0MP); + distributions->setDistributionInvForDirection(f[DIR_0MM], x1+DX1[DIR_0PP], x2+DX2[DIR_0PP], x3+DX3[DIR_0PP], DIR_0PP); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1+DX1[DIR_PMP], x2+DX2[DIR_PMP], x3+DX3[DIR_PMP], DIR_PMP); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1+DX1[DIR_PPP], x2+DX2[DIR_PPP], x3+DX3[DIR_PPP], DIR_PPP); + + h[DIR_00M] = htemp[DIR_00M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_00M] ; + h[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_P0M] ; + h[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_M0M] ; + h[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_0PM] ; + h[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_0MM] ; + h[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_PPM] ; + h[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_MPM] ; + h[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_PMM] ; + h[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3)*h[DIR_MMM] ; + + distributionsH->setDistributionInvForDirection(h[DIR_00M], x1+DX1[DIR_00P], x2+DX2[DIR_00P], x3+DX3[DIR_00P], DIR_00P); + distributionsH->setDistributionInvForDirection(h[DIR_P0M], x1+DX1[DIR_M0P], x2+DX2[DIR_M0P], x3+DX3[DIR_M0P], DIR_M0P); + distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1+DX1[DIR_P0P], x2+DX2[DIR_P0P], x3+DX3[DIR_P0P], DIR_P0P); + distributionsH->setDistributionInvForDirection(h[DIR_0PM], x1+DX1[DIR_0MP], x2+DX2[DIR_0MP], x3+DX3[DIR_0MP], DIR_0MP); + distributionsH->setDistributionInvForDirection(h[DIR_0MM], x1+DX1[DIR_0PP], x2+DX2[DIR_0PP], x3+DX3[DIR_0PP], DIR_0PP); + distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1+DX1[DIR_MMP], x2+DX2[DIR_MMP], x3+DX3[DIR_MMP], DIR_MMP); + distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1+DX1[DIR_PMP], x2+DX2[DIR_PMP], x3+DX3[DIR_PMP], DIR_PMP); + distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1+DX1[DIR_MPP], x2+DX2[DIR_MPP], x3+DX3[DIR_MPP], DIR_MPP); + distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1+DX1[DIR_PPP], x2+DX2[DIR_PPP], x3+DX3[DIR_PPP], DIR_PPP); + + h2[DIR_00M] = htemp[DIR_00M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_00M]; + h2[DIR_P0M] = htemp[DIR_P0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_P0M]; + h2[DIR_M0M] = htemp[DIR_M0M] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_M0M]; + h2[DIR_0PM] = htemp[DIR_0PM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_0PM]; + h2[DIR_0MM] = htemp[DIR_0MM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_0MM]; + h2[DIR_PPM] = htemp[DIR_PPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_PPM]; + h2[DIR_MPM] = htemp[DIR_MPM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_MPM]; + h2[DIR_PMM] = htemp[DIR_PMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_PMM]; + h2[DIR_MMM] = htemp[DIR_MMM] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h2[DIR_MMM]; + + distributionsH2->setDistributionInvForDirection(h2[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P); + distributionsH2->setDistributionInvForDirection(h2[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P); + distributionsH2->setDistributionInvForDirection(h2[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributionsH2->setDistributionInvForDirection(h2[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP); + distributionsH2->setDistributionInvForDirection(h2[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP); + distributionsH2->setDistributionInvForDirection(h2[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributionsH2->setDistributionInvForDirection(h2[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributionsH2->setDistributionInvForDirection(h2[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); + distributionsH2->setDistributionInvForDirection(h2[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; default: diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h index ee472e1664077a42e85cbc193725023a0e5edfb9..3fa67b2763eb5a3d6d456f72b2fdada5a6040782 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseNonReflectingOutflowBCAlgorithm.h @@ -39,11 +39,12 @@ class MultiphaseNonReflectingOutflowBCAlgorithm : public BCAlgorithm { public: - MultiphaseNonReflectingOutflowBCAlgorithm(); - ~MultiphaseNonReflectingOutflowBCAlgorithm(); - SPtr<BCAlgorithm> clone(); - void addDistributions(SPtr<DistributionArray3D> distributions); - void addDistributionsH(SPtr<DistributionArray3D> distributionsH); - void applyBC(); + MultiphaseNonReflectingOutflowBCAlgorithm(); + ~MultiphaseNonReflectingOutflowBCAlgorithm(); + SPtr<BCAlgorithm> clone(); + void addDistributions(SPtr<DistributionArray3D> distributions); + void addDistributionsH(SPtr<DistributionArray3D> distributionsH); + void addDistributionsH2(SPtr<DistributionArray3D> distributionsH2); + void applyBC(); }; #endif // MultiphaseNonReflectingOutflowBCAlgorithm_h__ diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp index beba9a256b869a37828efe44e886bb988bf9fa71..230a543f120a8ca8d18c5d2bb6a1c27e550aae92 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseSlipBCAlgorithm.cpp @@ -102,39 +102,39 @@ void MultiphaseSlipBCAlgorithm::applyBC() LBMReal velocity = 0.0; switch (invDir) { - case D3Q27System::E: velocity = (UbMath::c4o9*(+vx1)); break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) - case D3Q27System::W: velocity = (UbMath::c4o9*(-vx1)); break; //z.B. aus paper manfred MRT LB models in three dimensions (2002) - case D3Q27System::N: velocity = (UbMath::c4o9*(+vx2)); break; - case D3Q27System::S: velocity = (UbMath::c4o9*(-vx2)); break; - case D3Q27System::T: velocity = (UbMath::c4o9*(+vx3)); break; - case D3Q27System::B: velocity = (UbMath::c4o9*(-vx3)); break; - case D3Q27System::NE: velocity = (UbMath::c1o9*(+vx1+vx2)); break; - case D3Q27System::SW: velocity = (UbMath::c1o9*(-vx1-vx2)); break; - case D3Q27System::SE: velocity = (UbMath::c1o9*(+vx1-vx2)); break; - case D3Q27System::NW: velocity = (UbMath::c1o9*(-vx1+vx2)); break; - case D3Q27System::TE: velocity = (UbMath::c1o9*(+vx1 +vx3)); break; - case D3Q27System::BW: velocity = (UbMath::c1o9*(-vx1 -vx3)); break; - case D3Q27System::BE: velocity = (UbMath::c1o9*(+vx1 -vx3)); break; - case D3Q27System::TW: velocity = (UbMath::c1o9*(-vx1 +vx3)); break; - case D3Q27System::TN: velocity = (UbMath::c1o9*(+vx2+vx3)); break; - case D3Q27System::BS: velocity = (UbMath::c1o9*(-vx2-vx3)); break; - case D3Q27System::BN: velocity = (UbMath::c1o9*(+vx2-vx3)); break; - case D3Q27System::TS: velocity = (UbMath::c1o9*(-vx2+vx3)); break; - case D3Q27System::TNE: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break; - case D3Q27System::BSW: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break; - case D3Q27System::BNE: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break; - case D3Q27System::TSW: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break; - case D3Q27System::TSE: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break; - case D3Q27System::BNW: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break; - case D3Q27System::BSE: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break; - case D3Q27System::TNW: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break; + case D3Q27System::DIR_P00: velocity = (UbMath::c4o9*(+vx1)); break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) + case D3Q27System::DIR_M00: velocity = (UbMath::c4o9*(-vx1)); break; //z.B. aus paper manfred MRT LB models in three dimensions (2002) + case D3Q27System::DIR_0P0: velocity = (UbMath::c4o9*(+vx2)); break; + case D3Q27System::DIR_0M0: velocity = (UbMath::c4o9*(-vx2)); break; + case D3Q27System::DIR_00P: velocity = (UbMath::c4o9*(+vx3)); break; + case D3Q27System::DIR_00M: velocity = (UbMath::c4o9*(-vx3)); break; + case D3Q27System::DIR_PP0: velocity = (UbMath::c1o9*(+vx1+vx2)); break; + case D3Q27System::DIR_MM0: velocity = (UbMath::c1o9*(-vx1-vx2)); break; + case D3Q27System::DIR_PM0: velocity = (UbMath::c1o9*(+vx1-vx2)); break; + case D3Q27System::DIR_MP0: velocity = (UbMath::c1o9*(-vx1+vx2)); break; + case D3Q27System::DIR_P0P: velocity = (UbMath::c1o9*(+vx1 +vx3)); break; + case D3Q27System::DIR_M0M: velocity = (UbMath::c1o9*(-vx1 -vx3)); break; + case D3Q27System::DIR_P0M: velocity = (UbMath::c1o9*(+vx1 -vx3)); break; + case D3Q27System::DIR_M0P: velocity = (UbMath::c1o9*(-vx1 +vx3)); break; + case D3Q27System::DIR_0PP: velocity = (UbMath::c1o9*(+vx2+vx3)); break; + case D3Q27System::DIR_0MM: velocity = (UbMath::c1o9*(-vx2-vx3)); break; + case D3Q27System::DIR_0PM: velocity = (UbMath::c1o9*(+vx2-vx3)); break; + case D3Q27System::DIR_0MP: velocity = (UbMath::c1o9*(-vx2+vx3)); break; + case D3Q27System::DIR_PPP: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break; + case D3Q27System::DIR_MMM: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break; + case D3Q27System::DIR_PPM: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break; + case D3Q27System::DIR_MMP: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break; + case D3Q27System::DIR_PMP: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break; + case D3Q27System::DIR_MPM: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break; + case D3Q27System::DIR_PMM: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break; + case D3Q27System::DIR_MPP: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break; default: throw UbException(UB_EXARGS, "unknown error"); } LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(1.0+q)); distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); - LBMReal hReturn = ((1.0-q)/(1.0+q))*((h[invDir]-heq[invDir])/(1.0-collFactorPh)+heq[invDir])+((q/(1.0+q))*(h[invDir]+h[fdir])); - //LBMReal hReturn = h[invDir]; + //LBMReal hReturn = ((1.0-q)/(1.0+q))*((h[invDir]-heq[invDir])/(1.0-collFactorPh)+heq[invDir])+((q/(1.0+q))*(h[invDir]+h[fdir])); + LBMReal hReturn = h[invDir]; distributionsH->setDistributionForDirection(hReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); } } diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp index 58c359887fe8b4263d8140038dc03754aeab74bb..e4aaeeeb21a1e41617eed79ce05671c5425d01e4 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp @@ -37,7 +37,7 @@ MultiphaseVelocityBCAlgorithm::MultiphaseVelocityBCAlgorithm() { - BCAlgorithm::type = BCAlgorithm::VelocityBCAlgorithm; + BCAlgorithm::type = BCAlgorithm::MultiphaseVelocityBCAlgorithm; BCAlgorithm::preCollision = false; } ////////////////////////////////////////////////////////////////////////// @@ -84,6 +84,10 @@ void MultiphaseVelocityBCAlgorithm::applyBC() D3Q27System::calcDensity(h, phi); calcMacrosFct(f, p1, vx1, vx2, vx3); + vx1=bcPtr->getBoundaryVelocityX1(); + vx2 = bcPtr->getBoundaryVelocityX2(); + vx3 = bcPtr->getBoundaryVelocityX3(); + p1 = 0.0; D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3); D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3); @@ -94,30 +98,30 @@ void MultiphaseVelocityBCAlgorithm::applyBC() int nx3 = x3; //flag points in direction of fluid - if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; } - else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary...")); + if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; } + //else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary...")); phiBC = bcPtr->getBoundaryPhaseField(); D3Q27System::calcMultiphaseHeq(htemp, phiBC, vx1, vx2, vx3); //D3Q27System::calcMultiphaseHeq(htemp, phiBC, bcPtr->getBoundaryVelocityX1(), bcPtr->getBoundaryVelocityX2(), bcPtr->getBoundaryVelocityX2());//30.03.2021 EQ phase field BC! - for (int fdir = D3Q27System::STARTF; fdir<=D3Q27System::ENDF; fdir++) - { - if (bcPtr->hasVelocityBoundaryFlag(fdir)) - { - LBMReal hReturn = htemp[fdir]+h[fdir]-heq[fdir]; - //17.03.2021 Let us just set the plain eq - //LBMReal hReturn = htemp[fdir]; - distributionsH->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir); - if (distributionsH2) - distributionsH2->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir); - } - } + //for (int fdir = D3Q27System::STARTF; fdir<=D3Q27System::ENDF; fdir++) + //{ + // if (bcPtr->hasVelocityBoundaryFlag(fdir)) + // { + // LBMReal hReturn = htemp[fdir]+h[fdir]-heq[fdir]; + // //17.03.2021 Let us just set the plain eq + // //LBMReal hReturn = htemp[fdir]; + // distributionsH->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir); + // // if (distributionsH2) + // // distributionsH2->setDistributionForDirection(0, nx1, nx2, nx3, fdir); + // } + //} for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++) { @@ -129,7 +133,17 @@ void MultiphaseVelocityBCAlgorithm::applyBC() //16.03.2021 quick fix for velocity BC LBMReal fReturn = f[invDir] - velocity; //LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity)/(1.0+q)); - distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); + // distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);//no delay BB + distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB + + LBMReal hReturn = htemp[invDir]+h[invDir] - heq[invDir]; + distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB + if (distributionsH2) { + fReturn = h2[invDir] ; + // distributionsH2->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir); + distributionsH2->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB + } + } } diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new new file mode 100644 index 0000000000000000000000000000000000000000..7c21b30c8931e6f321abc3c9822eadb678f842f3 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/MultiphaseVelocityBCAlgorithm.cpp.new @@ -0,0 +1,151 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseVelocityBCAlgorithm.cpp +//! \ingroup BoundarConditions +//! \author Hesameddin Safari +//======================================================================================= + +#include "MultiphaseVelocityBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +MultiphaseVelocityBCAlgorithm::MultiphaseVelocityBCAlgorithm() +{ + BCAlgorithm::type = BCAlgorithm::MultiphaseVelocityBCAlgorithm; + BCAlgorithm::preCollision = false; +} +////////////////////////////////////////////////////////////////////////// +MultiphaseVelocityBCAlgorithm::~MultiphaseVelocityBCAlgorithm() +{ +} +////////////////////////////////////////////////////////////////////////// +SPtr<BCAlgorithm> MultiphaseVelocityBCAlgorithm::clone() +{ + SPtr<BCAlgorithm> bc(new MultiphaseVelocityBCAlgorithm()); + return bc; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributionsH) +{ + this->distributionsH = distributionsH; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityBCAlgorithm::addDistributionsH2(SPtr<DistributionArray3D> distributionsH) +{ + this->distributionsH2 = distributionsH; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityBCAlgorithm::applyBC() +{ + LBMReal f[D3Q27System::ENDF+1]; + LBMReal h[D3Q27System::ENDF+1]; + LBMReal h2[D3Q27System::ENDF + 1]; + LBMReal feq[D3Q27System::ENDF+1]; + LBMReal heq[D3Q27System::ENDF+1]; + LBMReal htemp[D3Q27System::ENDF+1]; + + distributions->getDistributionInv(f, x1, x2, x3); + distributionsH->getDistributionInv(h, x1, x2, x3); + if (distributionsH2) + distributionsH2->getDistributionInv(h2, x1, x2, x3); + LBMReal phi, vx1, vx2, vx3, p1, phiBC; + + D3Q27System::calcDensity(h, phi); + + calcMacrosFct(f, p1, vx1, vx2, vx3); + vx1=bcPtr->getBoundaryVelocityX1(); + vx2 = bcPtr->getBoundaryVelocityX2(); + vx3 = bcPtr->getBoundaryVelocityX3(); + p1 = 0.0; + D3Q27System::calcMultiphaseFeqVB(feq, p1, vx1, vx2, vx3); + D3Q27System::calcMultiphaseHeq(heq, phi, vx1, vx2, vx3); + + ///// added for phase field ////// + + int nx1 = x1; + int nx2 = x2; + int nx3 = x3; + + //flag points in direction of fluid + if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; } + //else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary...")); + + phiBC = bcPtr->getBoundaryPhaseField(); + + D3Q27System::calcMultiphaseHeq(htemp, phiBC, vx1, vx2, vx3); + //D3Q27System::calcMultiphaseHeq(htemp, phiBC, bcPtr->getBoundaryVelocityX1(), bcPtr->getBoundaryVelocityX2(), bcPtr->getBoundaryVelocityX2());//30.03.2021 EQ phase field BC! + //for (int fdir = D3Q27System::STARTF; fdir<=D3Q27System::ENDF; fdir++) + //{ + // if (bcPtr->hasVelocityBoundaryFlag(fdir)) + // { + // LBMReal hReturn = htemp[fdir]+h[fdir]-heq[fdir]; + // //17.03.2021 Let us just set the plain eq + // //LBMReal hReturn = htemp[fdir]; + // distributionsH->setDistributionForDirection(hReturn, nx1, nx2, nx3, fdir); + // // if (distributionsH2) + // // distributionsH2->setDistributionForDirection(0, nx1, nx2, nx3, fdir); + // } + //} + + for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++) + { + if (bcPtr->hasVelocityBoundaryFlag(fdir)) + { + const int invDir = D3Q27System::INVDIR[fdir]; + //LBMReal q = bcPtr->getQ(invDir);// m+m q=0 stabiler + LBMReal velocity = bcPtr->getBoundaryVelocity(invDir); + //16.03.2021 quick fix for velocity BC + LBMReal fReturn = f[invDir] - velocity; + //LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity)/(1.0+q)); + // distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);//no delay BB + distributions->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB + + LBMReal hReturn = htemp[invDir]+h[invDir] - heq[invDir]; + distributionsH->setDistributionForDirection(hReturn, x1, x2, x3, invDir);//delay BB + if (distributionsH2) { + fReturn = h2[invDir] ; + // distributionsH2->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir); + distributionsH2->setDistributionForDirection(fReturn, x1, x2, x3, invDir);//delay BB + } + + } + } + +} + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp index 9c4e47354f0d90a310030d848aa0cc5415567761..cf7a627b0c649aa0e1d00a8b137225b9e65b8476 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonEqDensityBCAlgorithm.cpp @@ -63,17 +63,17 @@ void NonEqDensityBCAlgorithm::applyBC() int nx3 = x3; // flag points in direction of fluid - if (bcPtr->hasDensityBoundaryFlag(D3Q27System::E)) { + if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::W)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::N)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::S)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::T)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; - } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::B)) { + } else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; } else return; // UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary...")); diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp index bb00c7bf2686628d4000c8b43ebfb8c5fd6c18ca..6fa4c7b5d85f4b1e5135f95b48f7d75a0cdbf3a4 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowBCAlgorithm.cpp @@ -69,24 +69,24 @@ void NonReflectingOutflowBCAlgorithm::applyBC() int direction = -1; // flag points in direction of fluid - if (bcPtr->hasDensityBoundaryFlag(E)) { + if (bcPtr->hasDensityBoundaryFlag(DIR_P00)) { nx1 += 1; - direction = E; - } else if (bcPtr->hasDensityBoundaryFlag(W)) { + direction = DIR_P00; + } else if (bcPtr->hasDensityBoundaryFlag(DIR_M00)) { nx1 -= 1; - direction = W; - } else if (bcPtr->hasDensityBoundaryFlag(N)) { + direction = DIR_M00; + } else if (bcPtr->hasDensityBoundaryFlag(DIR_0P0)) { nx2 += 1; - direction = N; - } else if (bcPtr->hasDensityBoundaryFlag(S)) { + direction = DIR_0P0; + } else if (bcPtr->hasDensityBoundaryFlag(DIR_0M0)) { nx2 -= 1; - direction = S; - } else if (bcPtr->hasDensityBoundaryFlag(T)) { + direction = DIR_0M0; + } else if (bcPtr->hasDensityBoundaryFlag(DIR_00P)) { nx3 += 1; - direction = T; - } else if (bcPtr->hasDensityBoundaryFlag(B)) { + direction = DIR_00P; + } else if (bcPtr->hasDensityBoundaryFlag(DIR_00M)) { nx3 -= 1; - direction = B; + direction = DIR_00M; } else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary...")); @@ -97,131 +97,131 @@ void NonReflectingOutflowBCAlgorithm::applyBC() calcMacrosFct(f, rho, vx1, vx2, vx3); switch (direction) { - case E: - f[E] = ftemp[E] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[E]; - f[NE] = ftemp[NE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[NE]; - f[SE] = ftemp[SE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[SE]; - f[TE] = ftemp[TE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TE]; - f[BE] = ftemp[BE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BE]; - f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TNE]; - f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TSE]; - f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BNE]; - f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BSE]; + case DIR_P00: + f[DIR_P00] = ftemp[DIR_P00] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P00]; + f[DIR_PP0] = ftemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PP0]; + f[DIR_PM0] = ftemp[DIR_PM0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PM0]; + f[DIR_P0P] = ftemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P0P]; + f[DIR_P0M] = ftemp[DIR_P0M] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P0M]; + f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PPP]; + f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PMP]; + f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PPM]; + f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PMM]; - distributions->setDistributionInvForDirection(f[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W); - distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); - distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); - distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); - distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); - distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + distributions->setDistributionInvForDirection(f[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00); + distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0); + distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0); + distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M); + distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); break; - case W: - f[W] = ftemp[W] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[W]; - f[NW] = ftemp[NW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[NW]; - f[SW] = ftemp[SW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[SW]; - f[TW] = ftemp[TW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TW]; - f[BW] = ftemp[BW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BW]; - f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TNW]; - f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TSW]; - f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BNW]; - f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BSW]; + case DIR_M00: + f[DIR_M00] = ftemp[DIR_M00] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M00]; + f[DIR_MP0] = ftemp[DIR_MP0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MP0]; + f[DIR_MM0] = ftemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MM0]; + f[DIR_M0P] = ftemp[DIR_M0P] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M0P]; + f[DIR_M0M] = ftemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M0M]; + f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MPP]; + f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MMP]; + f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MPM]; + f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MMM]; - distributions->setDistributionInvForDirection(f[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E); - distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); - distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); - distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); - distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); - distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); - distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); - distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; - case N: - f[N] = ftemp[N] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[N]; - f[NE] = ftemp[NE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[NE]; - f[NW] = ftemp[NW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[NW]; - f[TN] = ftemp[TN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TN]; - f[BN] = ftemp[BN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BN]; - f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TNE]; - f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TNW]; - f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BNE]; - f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BNW]; + case DIR_0P0: + f[DIR_0P0] = ftemp[DIR_0P0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0P0]; + f[DIR_PP0] = ftemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PP0]; + f[DIR_MP0] = ftemp[DIR_MP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MP0]; + f[DIR_0PP] = ftemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0PP]; + f[DIR_0PM] = ftemp[DIR_0PM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0PM]; + f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PPP]; + f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MPP]; + f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PPM]; + f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MPM]; - distributions->setDistributionInvForDirection(f[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S); - distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); - distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); - distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); - distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); - distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + distributions->setDistributionInvForDirection(f[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0); + distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0); + distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributions->setDistributionInvForDirection(f[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM); + distributions->setDistributionInvForDirection(f[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); break; - case S: - f[S] = ftemp[S] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[S]; - f[SE] = ftemp[SE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[SE]; - f[SW] = ftemp[SW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[SW]; - f[TS] = ftemp[TS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TS]; - f[BS] = ftemp[BS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BS]; - f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TSE]; - f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TSW]; - f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BSE]; - f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BSW]; + case DIR_0M0: + f[DIR_0M0] = ftemp[DIR_0M0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0M0]; + f[DIR_PM0] = ftemp[DIR_PM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PM0]; + f[DIR_MM0] = ftemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MM0]; + f[DIR_0MP] = ftemp[DIR_0MP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0MP]; + f[DIR_0MM] = ftemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0MM]; + f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PMP]; + f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MMP]; + f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PMM]; + f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MMM]; - distributions->setDistributionInvForDirection(f[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N); - distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); - distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); - distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); - distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); - distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); - distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); - distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributions->setDistributionInvForDirection(f[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0); + distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0); + distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributions->setDistributionInvForDirection(f[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM); + distributions->setDistributionInvForDirection(f[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; - case T: - f[T] = ftemp[T] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[T]; - f[TE] = ftemp[TE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TE]; - f[TW] = ftemp[TW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TW]; - f[TN] = ftemp[TN] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TN]; - f[TS] = ftemp[TS] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TS]; - f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TNE]; - f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TNW]; - f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TSE]; - f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TSW]; + case DIR_00P: + f[DIR_00P] = ftemp[DIR_00P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_00P]; + f[DIR_P0P] = ftemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_P0P]; + f[DIR_M0P] = ftemp[DIR_M0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_M0P]; + f[DIR_0PP] = ftemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_0PP]; + f[DIR_0MP] = ftemp[DIR_0MP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_0MP]; + f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_PPP]; + f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_MPP]; + f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_PMP]; + f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_MMP]; - distributions->setDistributionInvForDirection(f[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B); - distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); - distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); - distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); - distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); - distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + distributions->setDistributionInvForDirection(f[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M); + distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M); + distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributions->setDistributionInvForDirection(f[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM); + distributions->setDistributionInvForDirection(f[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); break; - case B: - f[B] = ftemp[B] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[B]; - f[BE] = ftemp[BE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BE]; - f[BW] = ftemp[BW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BW]; - f[BN] = ftemp[BN] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BN]; - f[BS] = ftemp[BS] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BS]; - f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BNE]; - f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BNW]; - f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BSE]; - f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BSW]; + case DIR_00M: + f[DIR_00M] = ftemp[DIR_00M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_00M]; + f[DIR_P0M] = ftemp[DIR_P0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_P0M]; + f[DIR_M0M] = ftemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_M0M]; + f[DIR_0PM] = ftemp[DIR_0PM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_0PM]; + f[DIR_0MM] = ftemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_0MM]; + f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_PPM]; + f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_MPM]; + f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_PMM]; + f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_MMM]; - distributions->setDistributionInvForDirection(f[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T); - distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); - distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); - distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); - distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); - distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); - distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); - distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributions->setDistributionInvForDirection(f[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P); + distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P); + distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributions->setDistributionInvForDirection(f[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP); + distributions->setDistributionInvForDirection(f[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; default: UB_THROW( diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp index 8d9317f9dee979ff9b81616c9f7554e129af4b47..151e10be4987e27622ce25b86c91c320c0d24406 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp @@ -61,10 +61,12 @@ void SimpleSlipBCAlgorithm::applyBC() LBMReal f[D3Q27System::ENDF+1]; LBMReal feq[D3Q27System::ENDF+1]; distributions->getDistributionInv(f, x1, x2, x3); - LBMReal vx1, vx2, vx3, drho; + LBMReal vx1, vx2, vx3, drho, rho; calcMacrosFct(f, drho, vx1, vx2, vx3); calcFeqFct(feq, drho, vx1, vx2, vx3); + rho = 1.0 + drho * compressibleFactor; + UbTupleFloat3 normale = bcPtr->getNormalVector(); LBMReal amp = vx1*val<1>(normale)+vx2*val<2>(normale)+vx3*val<3>(normale); @@ -81,35 +83,35 @@ void SimpleSlipBCAlgorithm::applyBC() LBMReal velocity = 0.0; switch (invDir) { - case D3Q27System::E: velocity = (UbMath::c4o9*(+vx1)); break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) - case D3Q27System::W: velocity = (UbMath::c4o9*(-vx1)); break; //z.B. aus paper manfred MRT LB models in three dimensions (2002) - case D3Q27System::N: velocity = (UbMath::c4o9*(+vx2)); break; - case D3Q27System::S: velocity = (UbMath::c4o9*(-vx2)); break; - case D3Q27System::T: velocity = (UbMath::c4o9*(+vx3)); break; - case D3Q27System::B: velocity = (UbMath::c4o9*(-vx3)); break; - case D3Q27System::NE: velocity = (UbMath::c1o9*(+vx1+vx2)); break; - case D3Q27System::SW: velocity = (UbMath::c1o9*(-vx1-vx2)); break; - case D3Q27System::SE: velocity = (UbMath::c1o9*(+vx1-vx2)); break; - case D3Q27System::NW: velocity = (UbMath::c1o9*(-vx1+vx2)); break; - case D3Q27System::TE: velocity = (UbMath::c1o9*(+vx1+vx3)); break; - case D3Q27System::BW: velocity = (UbMath::c1o9*(-vx1-vx3)); break; - case D3Q27System::BE: velocity = (UbMath::c1o9*(+vx1-vx3)); break; - case D3Q27System::TW: velocity = (UbMath::c1o9*(-vx1+vx3)); break; - case D3Q27System::TN: velocity = (UbMath::c1o9*(+vx2+vx3)); break; - case D3Q27System::BS: velocity = (UbMath::c1o9*(-vx2-vx3)); break; - case D3Q27System::BN: velocity = (UbMath::c1o9*(+vx2-vx3)); break; - case D3Q27System::TS: velocity = (UbMath::c1o9*(-vx2+vx3)); break; - case D3Q27System::TNE: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break; - case D3Q27System::BSW: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break; - case D3Q27System::BNE: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break; - case D3Q27System::TSW: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break; - case D3Q27System::TSE: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break; - case D3Q27System::BNW: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break; - case D3Q27System::BSE: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break; - case D3Q27System::TNW: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break; + case D3Q27System::DIR_P00: velocity = (UbMath::c4o9*(+vx1)); break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) + case D3Q27System::DIR_M00: velocity = (UbMath::c4o9*(-vx1)); break; //z.B. aus paper manfred MRT LB models in three dimensions (2002) + case D3Q27System::DIR_0P0: velocity = (UbMath::c4o9*(+vx2)); break; + case D3Q27System::DIR_0M0: velocity = (UbMath::c4o9*(-vx2)); break; + case D3Q27System::DIR_00P: velocity = (UbMath::c4o9*(+vx3)); break; + case D3Q27System::DIR_00M: velocity = (UbMath::c4o9*(-vx3)); break; + case D3Q27System::DIR_PP0: velocity = (UbMath::c1o9*(+vx1+vx2)); break; + case D3Q27System::DIR_MM0: velocity = (UbMath::c1o9*(-vx1-vx2)); break; + case D3Q27System::DIR_PM0: velocity = (UbMath::c1o9*(+vx1-vx2)); break; + case D3Q27System::DIR_MP0: velocity = (UbMath::c1o9*(-vx1+vx2)); break; + case D3Q27System::DIR_P0P: velocity = (UbMath::c1o9*(+vx1+vx3)); break; + case D3Q27System::DIR_M0M: velocity = (UbMath::c1o9*(-vx1-vx3)); break; + case D3Q27System::DIR_P0M: velocity = (UbMath::c1o9*(+vx1-vx3)); break; + case D3Q27System::DIR_M0P: velocity = (UbMath::c1o9*(-vx1+vx3)); break; + case D3Q27System::DIR_0PP: velocity = (UbMath::c1o9*(+vx2+vx3)); break; + case D3Q27System::DIR_0MM: velocity = (UbMath::c1o9*(-vx2-vx3)); break; + case D3Q27System::DIR_0PM: velocity = (UbMath::c1o9*(+vx2-vx3)); break; + case D3Q27System::DIR_0MP: velocity = (UbMath::c1o9*(-vx2+vx3)); break; + case D3Q27System::DIR_PPP: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break; + case D3Q27System::DIR_MMM: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break; + case D3Q27System::DIR_PPM: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break; + case D3Q27System::DIR_MMP: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break; + case D3Q27System::DIR_PMP: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break; + case D3Q27System::DIR_MPM: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break; + case D3Q27System::DIR_PMM: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break; + case D3Q27System::DIR_MPP: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break; default: throw UbException(UB_EXARGS, "unknown error"); } - LBMReal fReturn = f[invDir] - velocity;; + LBMReal fReturn = f[invDir] - velocity * rho; distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); } } diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp index 8bdc284d606fa621233fe1449801f4751cfef22a..0dc2d5d66e639b3b46bc9fe12cec96eba6e6adac 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAdapter.cpp @@ -56,17 +56,17 @@ void SlipBCAdapter::adaptBC(const D3Q27Interactor &interactor, SPtr<BoundaryCond if (!geo) throw UbException(UB_EXARGS, "derzeit nur fuer Cubes valide"); - if (bc->hasSlipBoundaryFlag(D3Q27System::E)) + if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_P00)) bc->setNormalVector(1.0, 0.0, 0.0); - else if (bc->hasSlipBoundaryFlag(D3Q27System::W)) + else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_M00)) bc->setNormalVector(-1.0, 0.0, 0.0); - else if (bc->hasSlipBoundaryFlag(D3Q27System::N)) + else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_0P0)) bc->setNormalVector(0.0, 1.0, 0.0); - else if (bc->hasSlipBoundaryFlag(D3Q27System::S)) + else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_0M0)) bc->setNormalVector(0.0, -1.0, 0.0); - else if (bc->hasSlipBoundaryFlag(D3Q27System::T)) + else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_00P)) bc->setNormalVector(0.0, 0.0, 1.0); - else if (bc->hasSlipBoundaryFlag(D3Q27System::B)) + else if (bc->hasSlipBoundaryFlag(D3Q27System::DIR_00M)) bc->setNormalVector(0.0, 0.0, -1.0); bc->setBcAlgorithmType(algorithmType); diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp index 825d2bc0175acb5b2c10df3a89e87512dcc2e6e3..5d9993c459b756dc1d8663907ee90bc0eabef51c 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp @@ -47,32 +47,32 @@ void SlipBCAlgorithm::applyBC() LBMReal velocity = 0.0; switch (invDir) { - case D3Q27System::E: velocity = (UbMath::c4o9*(+vx1)); break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) - case D3Q27System::W: velocity = (UbMath::c4o9*(-vx1)); break; //z.B. aus paper manfred MRT LB models in three dimensions (2002) - case D3Q27System::N: velocity = (UbMath::c4o9*(+vx2)); break; - case D3Q27System::S: velocity = (UbMath::c4o9*(-vx2)); break; - case D3Q27System::T: velocity = (UbMath::c4o9*(+vx3)); break; - case D3Q27System::B: velocity = (UbMath::c4o9*(-vx3)); break; - case D3Q27System::NE: velocity = (UbMath::c1o9*(+vx1+vx2)); break; - case D3Q27System::SW: velocity = (UbMath::c1o9*(-vx1-vx2)); break; - case D3Q27System::SE: velocity = (UbMath::c1o9*(+vx1-vx2)); break; - case D3Q27System::NW: velocity = (UbMath::c1o9*(-vx1+vx2)); break; - case D3Q27System::TE: velocity = (UbMath::c1o9*(+vx1+vx3)); break; - case D3Q27System::BW: velocity = (UbMath::c1o9*(-vx1-vx3)); break; - case D3Q27System::BE: velocity = (UbMath::c1o9*(+vx1-vx3)); break; - case D3Q27System::TW: velocity = (UbMath::c1o9*(-vx1+vx3)); break; - case D3Q27System::TN: velocity = (UbMath::c1o9*(+vx2+vx3)); break; - case D3Q27System::BS: velocity = (UbMath::c1o9*(-vx2-vx3)); break; - case D3Q27System::BN: velocity = (UbMath::c1o9*(+vx2-vx3)); break; - case D3Q27System::TS: velocity = (UbMath::c1o9*(-vx2+vx3)); break; - case D3Q27System::TNE: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break; - case D3Q27System::BSW: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break; - case D3Q27System::BNE: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break; - case D3Q27System::TSW: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break; - case D3Q27System::TSE: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break; - case D3Q27System::BNW: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break; - case D3Q27System::BSE: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break; - case D3Q27System::TNW: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break; + case D3Q27System::DIR_P00: velocity = (UbMath::c4o9*(+vx1)); break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) + case D3Q27System::DIR_M00: velocity = (UbMath::c4o9*(-vx1)); break; //z.B. aus paper manfred MRT LB models in three dimensions (2002) + case D3Q27System::DIR_0P0: velocity = (UbMath::c4o9*(+vx2)); break; + case D3Q27System::DIR_0M0: velocity = (UbMath::c4o9*(-vx2)); break; + case D3Q27System::DIR_00P: velocity = (UbMath::c4o9*(+vx3)); break; + case D3Q27System::DIR_00M: velocity = (UbMath::c4o9*(-vx3)); break; + case D3Q27System::DIR_PP0: velocity = (UbMath::c1o9*(+vx1+vx2)); break; + case D3Q27System::DIR_MM0: velocity = (UbMath::c1o9*(-vx1-vx2)); break; + case D3Q27System::DIR_PM0: velocity = (UbMath::c1o9*(+vx1-vx2)); break; + case D3Q27System::DIR_MP0: velocity = (UbMath::c1o9*(-vx1+vx2)); break; + case D3Q27System::DIR_P0P: velocity = (UbMath::c1o9*(+vx1+vx3)); break; + case D3Q27System::DIR_M0M: velocity = (UbMath::c1o9*(-vx1-vx3)); break; + case D3Q27System::DIR_P0M: velocity = (UbMath::c1o9*(+vx1-vx3)); break; + case D3Q27System::DIR_M0P: velocity = (UbMath::c1o9*(-vx1+vx3)); break; + case D3Q27System::DIR_0PP: velocity = (UbMath::c1o9*(+vx2+vx3)); break; + case D3Q27System::DIR_0MM: velocity = (UbMath::c1o9*(-vx2-vx3)); break; + case D3Q27System::DIR_0PM: velocity = (UbMath::c1o9*(+vx2-vx3)); break; + case D3Q27System::DIR_0MP: velocity = (UbMath::c1o9*(-vx2+vx3)); break; + case D3Q27System::DIR_PPP: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break; + case D3Q27System::DIR_MMM: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break; + case D3Q27System::DIR_PPM: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break; + case D3Q27System::DIR_MMP: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break; + case D3Q27System::DIR_PMP: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break; + case D3Q27System::DIR_MPM: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break; + case D3Q27System::DIR_PMM: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break; + case D3Q27System::DIR_MPP: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break; default: throw UbException(UB_EXARGS, "unknown error"); } LBMReal fReturn = ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(1.0+q)); diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp index ecfb98e67aa4c20603fd4b07e969ccb396c5e757..bec8e139e333f5fa18847ddbb5fbb11c5c5c1eac 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyDensityBCAlgorithm.cpp @@ -95,12 +95,12 @@ void ThixotropyDensityBCAlgorithm::applyBC() int nx3 = x3; //flag points in direction of fluid - if (bcPtr->hasDensityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; } - else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::W)) { nx1 += 1; } - else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; } - else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::S)) { nx2 += 1; } - else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; } - else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::B)) { nx3 += 1; } + if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; } else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary...")); LBMReal rhoBC = bcPtr->getBoundaryDensity(); diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp index 2750e606acff2fb7a9f906f67c0b48975a11261c..ed90cc7596e186ab9984f25e2ba0ecdb625c9135 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNonReflectingOutflowBCAlgorithm.cpp @@ -79,12 +79,12 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC() int direction = -1; //flag points in direction of fluid - if (bcPtr->hasDensityBoundaryFlag(E)) { nx1 += 1; direction = E; } - else if (bcPtr->hasDensityBoundaryFlag(W)) { nx1 -= 1; direction = W; } - else if (bcPtr->hasDensityBoundaryFlag(N)) { nx2 += 1; direction = N; } - else if (bcPtr->hasDensityBoundaryFlag(S)) { nx2 -= 1; direction = S; } - else if (bcPtr->hasDensityBoundaryFlag(T)) { nx3 += 1; direction = T; } - else if (bcPtr->hasDensityBoundaryFlag(B)) { nx3 -= 1; direction = B; } + if (bcPtr->hasDensityBoundaryFlag(DIR_P00)) { nx1 += 1; direction = DIR_P00; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_M00)) { nx1 -= 1; direction = DIR_M00; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_0P0)) { nx2 += 1; direction = DIR_0P0; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_0M0)) { nx2 -= 1; direction = DIR_0M0; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_00P)) { nx3 += 1; direction = DIR_00P; } + else if (bcPtr->hasDensityBoundaryFlag(DIR_00M)) { nx3 -= 1; direction = DIR_00M; } else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary...")); distributions->getDistribution(f, x1, x2, x3); @@ -95,131 +95,131 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC() switch (direction) { - case E: - f[E] = ftemp[E] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[E]; - f[NE] = ftemp[NE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[NE]; - f[SE] = ftemp[SE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[SE]; - f[TE] = ftemp[TE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TE]; - f[BE] = ftemp[BE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BE]; - f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TNE]; - f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[TSE]; - f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BNE]; - f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[BSE]; + case DIR_P00: + f[DIR_P00] = ftemp[DIR_P00] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P00]; + f[DIR_PP0] = ftemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PP0]; + f[DIR_PM0] = ftemp[DIR_PM0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PM0]; + f[DIR_P0P] = ftemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P0P]; + f[DIR_P0M] = ftemp[DIR_P0M] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_P0M]; + f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PPP]; + f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PMP]; + f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PPM]; + f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * f[DIR_PMM]; - distributions->setDistributionInvForDirection(f[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W); - distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); - distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); - distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); - distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); - distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + distributions->setDistributionInvForDirection(f[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00); + distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0); + distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0); + distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M); + distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); break; - case W: - f[W] = ftemp[W] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[W]; - f[NW] = ftemp[NW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[NW]; - f[SW] = ftemp[SW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[SW]; - f[TW] = ftemp[TW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TW]; - f[BW] = ftemp[BW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BW]; - f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TNW]; - f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[TSW]; - f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BNW]; - f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[BSW]; + case DIR_M00: + f[DIR_M00] = ftemp[DIR_M00] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M00]; + f[DIR_MP0] = ftemp[DIR_MP0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MP0]; + f[DIR_MM0] = ftemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MM0]; + f[DIR_M0P] = ftemp[DIR_M0P] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M0P]; + f[DIR_M0M] = ftemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_M0M]; + f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MPP]; + f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MMP]; + f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MPM]; + f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * f[DIR_MMM]; - distributions->setDistributionInvForDirection(f[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E); - distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); - distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); - distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); - distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); - distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); - distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); - distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributions->setDistributionInvForDirection(f[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; - case N: - f[N] = ftemp[N] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[N]; - f[NE] = ftemp[NE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[NE]; - f[NW] = ftemp[NW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[NW]; - f[TN] = ftemp[TN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TN]; - f[BN] = ftemp[BN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BN]; - f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TNE]; - f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[TNW]; - f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BNE]; - f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[BNW]; + case DIR_0P0: + f[DIR_0P0] = ftemp[DIR_0P0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0P0]; + f[DIR_PP0] = ftemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PP0]; + f[DIR_MP0] = ftemp[DIR_MP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MP0]; + f[DIR_0PP] = ftemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0PP]; + f[DIR_0PM] = ftemp[DIR_0PM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_0PM]; + f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PPP]; + f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MPP]; + f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_PPM]; + f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * f[DIR_MPM]; - distributions->setDistributionInvForDirection(f[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S); - distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); - distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); - distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); - distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); - distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + distributions->setDistributionInvForDirection(f[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0); + distributions->setDistributionInvForDirection(f[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0); + distributions->setDistributionInvForDirection(f[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributions->setDistributionInvForDirection(f[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM); + distributions->setDistributionInvForDirection(f[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); break; - case S: - f[S] = ftemp[S] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[S]; - f[SE] = ftemp[SE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[SE]; - f[SW] = ftemp[SW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[SW]; - f[TS] = ftemp[TS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TS]; - f[BS] = ftemp[BS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BS]; - f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TSE]; - f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[TSW]; - f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BSE]; - f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[BSW]; + case DIR_0M0: + f[DIR_0M0] = ftemp[DIR_0M0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0M0]; + f[DIR_PM0] = ftemp[DIR_PM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PM0]; + f[DIR_MM0] = ftemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MM0]; + f[DIR_0MP] = ftemp[DIR_0MP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0MP]; + f[DIR_0MM] = ftemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_0MM]; + f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PMP]; + f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MMP]; + f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_PMM]; + f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * f[DIR_MMM]; - distributions->setDistributionInvForDirection(f[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N); - distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); - distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); - distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); - distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); - distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); - distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); - distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributions->setDistributionInvForDirection(f[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0); + distributions->setDistributionInvForDirection(f[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0); + distributions->setDistributionInvForDirection(f[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributions->setDistributionInvForDirection(f[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM); + distributions->setDistributionInvForDirection(f[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; - case T: - f[T] = ftemp[T] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[T]; - f[TE] = ftemp[TE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TE]; - f[TW] = ftemp[TW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TW]; - f[TN] = ftemp[TN] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TN]; - f[TS] = ftemp[TS] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TS]; - f[TNE] = ftemp[TNE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TNE]; - f[TNW] = ftemp[TNW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TNW]; - f[TSE] = ftemp[TSE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TSE]; - f[TSW] = ftemp[TSW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[TSW]; + case DIR_00P: + f[DIR_00P] = ftemp[DIR_00P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_00P]; + f[DIR_P0P] = ftemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_P0P]; + f[DIR_M0P] = ftemp[DIR_M0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_M0P]; + f[DIR_0PP] = ftemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_0PP]; + f[DIR_0MP] = ftemp[DIR_0MP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_0MP]; + f[DIR_PPP] = ftemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_PPP]; + f[DIR_MPP] = ftemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_MPP]; + f[DIR_PMP] = ftemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_PMP]; + f[DIR_MMP] = ftemp[DIR_MMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * f[DIR_MMP]; - distributions->setDistributionInvForDirection(f[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B); - distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); - distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); - distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); - distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); - distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + distributions->setDistributionInvForDirection(f[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M); + distributions->setDistributionInvForDirection(f[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M); + distributions->setDistributionInvForDirection(f[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributions->setDistributionInvForDirection(f[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM); + distributions->setDistributionInvForDirection(f[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM); + distributions->setDistributionInvForDirection(f[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributions->setDistributionInvForDirection(f[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributions->setDistributionInvForDirection(f[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributions->setDistributionInvForDirection(f[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); break; - case B: - f[B] = ftemp[B] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[B]; - f[BE] = ftemp[BE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BE]; - f[BW] = ftemp[BW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BW]; - f[BN] = ftemp[BN] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BN]; - f[BS] = ftemp[BS] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BS]; - f[BNE] = ftemp[BNE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BNE]; - f[BNW] = ftemp[BNW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BNW]; - f[BSE] = ftemp[BSE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BSE]; - f[BSW] = ftemp[BSW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[BSW]; + case DIR_00M: + f[DIR_00M] = ftemp[DIR_00M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_00M]; + f[DIR_P0M] = ftemp[DIR_P0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_P0M]; + f[DIR_M0M] = ftemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_M0M]; + f[DIR_0PM] = ftemp[DIR_0PM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_0PM]; + f[DIR_0MM] = ftemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_0MM]; + f[DIR_PPM] = ftemp[DIR_PPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_PPM]; + f[DIR_MPM] = ftemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_MPM]; + f[DIR_PMM] = ftemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_PMM]; + f[DIR_MMM] = ftemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * f[DIR_MMM]; - distributions->setDistributionInvForDirection(f[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T); - distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); - distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); - distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); - distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); - distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); - distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); - distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributions->setDistributionInvForDirection(f[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P); + distributions->setDistributionInvForDirection(f[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P); + distributions->setDistributionInvForDirection(f[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributions->setDistributionInvForDirection(f[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP); + distributions->setDistributionInvForDirection(f[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP); + distributions->setDistributionInvForDirection(f[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributions->setDistributionInvForDirection(f[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributions->setDistributionInvForDirection(f[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); + distributions->setDistributionInvForDirection(f[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; default: UB_THROW(UbException(UB_EXARGS, "It isn't implemented non reflecting density boundary for this direction!")); @@ -239,131 +239,131 @@ void ThixotropyNonReflectingOutflowBCAlgorithm::applyBC() switch (direction) { - case E: - h[E] = htemp[E] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[E]; - h[NE] = htemp[NE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[NE]; - h[SE] = htemp[SE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[SE]; - h[TE] = htemp[TE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[TE]; - h[BE] = htemp[BE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[BE]; - h[TNE] = htemp[TNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[TNE]; - h[TSE] = htemp[TSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[TSE]; - h[BNE] = htemp[BNE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[BNE]; - h[BSE] = htemp[BSE] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[BSE]; + case DIR_P00: + h[DIR_P00] = htemp[DIR_P00] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_P00]; + h[DIR_PP0] = htemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PP0]; + h[DIR_PM0] = htemp[DIR_PM0] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PM0]; + h[DIR_P0P] = htemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_P0P]; + h[DIR_P0M] = htemp[DIR_P0M] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_P0M]; + h[DIR_PPP] = htemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PPP]; + h[DIR_PMP] = htemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PMP]; + h[DIR_PPM] = htemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PPM]; + h[DIR_PMM] = htemp[DIR_PMM] * (UbMath::one_over_sqrt3 + vx1) + (1.0 - UbMath::one_over_sqrt3 - vx1) * h[DIR_PMM]; - distributionsH->setDistributionInvForDirection(h[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W); - distributionsH->setDistributionInvForDirection(h[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); - distributionsH->setDistributionInvForDirection(h[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); - distributionsH->setDistributionInvForDirection(h[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); - distributionsH->setDistributionInvForDirection(h[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); - distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + distributionsH->setDistributionInvForDirection(h[DIR_P00], x1 + DX1[DIR_M00], x2 + DX2[DIR_M00], x3 + DX3[DIR_M00], DIR_M00); + distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0); + distributionsH->setDistributionInvForDirection(h[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0); + distributionsH->setDistributionInvForDirection(h[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M); + distributionsH->setDistributionInvForDirection(h[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P); + distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); break; - case W: - h[W] = htemp[W] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[W]; - h[NW] = htemp[NW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[NW]; - h[SW] = htemp[SW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[SW]; - h[TW] = htemp[TW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[TW]; - h[BW] = htemp[BW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[BW]; - h[TNW] = htemp[TNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[TNW]; - h[TSW] = htemp[TSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[TSW]; - h[BNW] = htemp[BNW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[BNW]; - h[BSW] = htemp[BSW] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[BSW]; + case DIR_M00: + h[DIR_M00] = htemp[DIR_M00] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_M00]; + h[DIR_MP0] = htemp[DIR_MP0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MP0]; + h[DIR_MM0] = htemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MM0]; + h[DIR_M0P] = htemp[DIR_M0P] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_M0P]; + h[DIR_M0M] = htemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_M0M]; + h[DIR_MPP] = htemp[DIR_MPP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MPP]; + h[DIR_MMP] = htemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MMP]; + h[DIR_MPM] = htemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MPM]; + h[DIR_MMM] = htemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx1) + (1.0 - UbMath::one_over_sqrt3 + vx1) * h[DIR_MMM]; - distributionsH->setDistributionInvForDirection(h[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E); - distributionsH->setDistributionInvForDirection(h[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); - distributionsH->setDistributionInvForDirection(h[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); - distributionsH->setDistributionInvForDirection(h[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); - distributionsH->setDistributionInvForDirection(h[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); - distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); - distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); - distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributionsH->setDistributionInvForDirection(h[DIR_M00], x1 + DX1[DIR_P00], x2 + DX2[DIR_P00], x3 + DX3[DIR_P00], DIR_P00); + distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; - case N: - h[N] = htemp[N] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[N]; - h[NE] = htemp[NE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[NE]; - h[NW] = htemp[NW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[NW]; - h[TN] = htemp[TN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[TN]; - h[BN] = htemp[BN] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[BN]; - h[TNE] = htemp[TNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[TNE]; - h[TNW] = htemp[TNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[TNW]; - h[BNE] = htemp[BNE] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[BNE]; - h[BNW] = htemp[BNW] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[BNW]; + case DIR_0P0: + h[DIR_0P0] = htemp[DIR_0P0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_0P0]; + h[DIR_PP0] = htemp[DIR_PP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_PP0]; + h[DIR_MP0] = htemp[DIR_MP0] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_MP0]; + h[DIR_0PP] = htemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_0PP]; + h[DIR_0PM] = htemp[DIR_0PM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_0PM]; + h[DIR_PPP] = htemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_PPP]; + h[DIR_MPP] = htemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_MPP]; + h[DIR_PPM] = htemp[DIR_PPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_PPM]; + h[DIR_MPM] = htemp[DIR_MPM] * (UbMath::one_over_sqrt3 + vx2) + (1.0 - UbMath::one_over_sqrt3 - vx2) * h[DIR_MPM]; - distributionsH->setDistributionInvForDirection(h[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S); - distributionsH->setDistributionInvForDirection(h[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); - distributionsH->setDistributionInvForDirection(h[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); - distributionsH->setDistributionInvForDirection(h[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); - distributionsH->setDistributionInvForDirection(h[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); - distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + distributionsH->setDistributionInvForDirection(h[DIR_0P0], x1 + DX1[DIR_0M0], x2 + DX2[DIR_0M0], x3 + DX3[DIR_0M0], DIR_0M0); + distributionsH->setDistributionInvForDirection(h[DIR_PP0], x1 + DX1[DIR_MM0], x2 + DX2[DIR_MM0], x3 + DX3[DIR_MM0], DIR_MM0); + distributionsH->setDistributionInvForDirection(h[DIR_MP0], x1 + DX1[DIR_PM0], x2 + DX2[DIR_PM0], x3 + DX3[DIR_PM0], DIR_PM0); + distributionsH->setDistributionInvForDirection(h[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM); + distributionsH->setDistributionInvForDirection(h[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP); + distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); break; - case S: - h[S] = htemp[S] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[S]; - h[SE] = htemp[SE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[SE]; - h[SW] = htemp[SW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[SW]; - h[TS] = htemp[TS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[TS]; - h[BS] = htemp[BS] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[BS]; - h[TSE] = htemp[TSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[TSE]; - h[TSW] = htemp[TSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[TSW]; - h[BSE] = htemp[BSE] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[BSE]; - h[BSW] = htemp[BSW] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[BSW]; + case DIR_0M0: + h[DIR_0M0] = htemp[DIR_0M0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_0M0]; + h[DIR_PM0] = htemp[DIR_PM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_PM0]; + h[DIR_MM0] = htemp[DIR_MM0] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_MM0]; + h[DIR_0MP] = htemp[DIR_0MP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_0MP]; + h[DIR_0MM] = htemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_0MM]; + h[DIR_PMP] = htemp[DIR_PMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_PMP]; + h[DIR_MMP] = htemp[DIR_MMP] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_MMP]; + h[DIR_PMM] = htemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_PMM]; + h[DIR_MMM] = htemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx2) + (1.0 - UbMath::one_over_sqrt3 + vx2) * h[DIR_MMM]; - distributionsH->setDistributionInvForDirection(h[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N); - distributionsH->setDistributionInvForDirection(h[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); - distributionsH->setDistributionInvForDirection(h[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); - distributionsH->setDistributionInvForDirection(h[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); - distributionsH->setDistributionInvForDirection(h[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); - distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); - distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); - distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributionsH->setDistributionInvForDirection(h[DIR_0M0], x1 + DX1[DIR_0P0], x2 + DX2[DIR_0P0], x3 + DX3[DIR_0P0], DIR_0P0); + distributionsH->setDistributionInvForDirection(h[DIR_PM0], x1 + DX1[DIR_MP0], x2 + DX2[DIR_MP0], x3 + DX3[DIR_MP0], DIR_MP0); + distributionsH->setDistributionInvForDirection(h[DIR_MM0], x1 + DX1[DIR_PP0], x2 + DX2[DIR_PP0], x3 + DX3[DIR_PP0], DIR_PP0); + distributionsH->setDistributionInvForDirection(h[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM); + distributionsH->setDistributionInvForDirection(h[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP); + distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); + distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); + distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; - case T: - h[T] = htemp[T] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[T]; - h[TE] = htemp[TE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TE]; - h[TW] = htemp[TW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TW]; - h[TN] = htemp[TN] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TN]; - h[TS] = htemp[TS] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TS]; - h[TNE] = htemp[TNE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TNE]; - h[TNW] = htemp[TNW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TNW]; - h[TSE] = htemp[TSE] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TSE]; - h[TSW] = htemp[TSW] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[TSW]; + case DIR_00P: + h[DIR_00P] = htemp[DIR_00P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_00P]; + h[DIR_P0P] = htemp[DIR_P0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_P0P]; + h[DIR_M0P] = htemp[DIR_M0P] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_M0P]; + h[DIR_0PP] = htemp[DIR_0PP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_0PP]; + h[DIR_0MP] = htemp[DIR_0MP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_0MP]; + h[DIR_PPP] = htemp[DIR_PPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_PPP]; + h[DIR_MPP] = htemp[DIR_MPP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_MPP]; + h[DIR_PMP] = htemp[DIR_PMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_PMP]; + h[DIR_MMP] = htemp[DIR_MMP] * (UbMath::one_over_sqrt3 + vx3) + (1.0 - UbMath::one_over_sqrt3 - vx3) * h[DIR_MMP]; - distributionsH->setDistributionInvForDirection(h[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B); - distributionsH->setDistributionInvForDirection(h[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); - distributionsH->setDistributionInvForDirection(h[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); - distributionsH->setDistributionInvForDirection(h[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); - distributionsH->setDistributionInvForDirection(h[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); - distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); - distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); - distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); - distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + distributionsH->setDistributionInvForDirection(h[DIR_00P], x1 + DX1[DIR_00M], x2 + DX2[DIR_00M], x3 + DX3[DIR_00M], DIR_00M); + distributionsH->setDistributionInvForDirection(h[DIR_P0P], x1 + DX1[DIR_M0M], x2 + DX2[DIR_M0M], x3 + DX3[DIR_M0M], DIR_M0M); + distributionsH->setDistributionInvForDirection(h[DIR_M0P], x1 + DX1[DIR_P0M], x2 + DX2[DIR_P0M], x3 + DX3[DIR_P0M], DIR_P0M); + distributionsH->setDistributionInvForDirection(h[DIR_0PP], x1 + DX1[DIR_0MM], x2 + DX2[DIR_0MM], x3 + DX3[DIR_0MM], DIR_0MM); + distributionsH->setDistributionInvForDirection(h[DIR_0MP], x1 + DX1[DIR_0PM], x2 + DX2[DIR_0PM], x3 + DX3[DIR_0PM], DIR_0PM); + distributionsH->setDistributionInvForDirection(h[DIR_PPP], x1 + DX1[DIR_MMM], x2 + DX2[DIR_MMM], x3 + DX3[DIR_MMM], DIR_MMM); + distributionsH->setDistributionInvForDirection(h[DIR_MPP], x1 + DX1[DIR_PMM], x2 + DX2[DIR_PMM], x3 + DX3[DIR_PMM], DIR_PMM); + distributionsH->setDistributionInvForDirection(h[DIR_PMP], x1 + DX1[DIR_MPM], x2 + DX2[DIR_MPM], x3 + DX3[DIR_MPM], DIR_MPM); + distributionsH->setDistributionInvForDirection(h[DIR_MMP], x1 + DX1[DIR_PPM], x2 + DX2[DIR_PPM], x3 + DX3[DIR_PPM], DIR_PPM); break; - case B: - h[B] = htemp[B] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[B]; - h[BE] = htemp[BE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BE]; - h[BW] = htemp[BW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BW]; - h[BN] = htemp[BN] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BN]; - h[BS] = htemp[BS] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BS]; - h[BNE] = htemp[BNE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BNE]; - h[BNW] = htemp[BNW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BNW]; - h[BSE] = htemp[BSE] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BSE]; - h[BSW] = htemp[BSW] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[BSW]; + case DIR_00M: + h[DIR_00M] = htemp[DIR_00M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_00M]; + h[DIR_P0M] = htemp[DIR_P0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_P0M]; + h[DIR_M0M] = htemp[DIR_M0M] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_M0M]; + h[DIR_0PM] = htemp[DIR_0PM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_0PM]; + h[DIR_0MM] = htemp[DIR_0MM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_0MM]; + h[DIR_PPM] = htemp[DIR_PPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_PPM]; + h[DIR_MPM] = htemp[DIR_MPM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_MPM]; + h[DIR_PMM] = htemp[DIR_PMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_PMM]; + h[DIR_MMM] = htemp[DIR_MMM] * (UbMath::one_over_sqrt3 - vx3) + (1.0 - UbMath::one_over_sqrt3 + vx3) * h[DIR_MMM]; - distributionsH->setDistributionInvForDirection(h[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T); - distributionsH->setDistributionInvForDirection(h[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); - distributionsH->setDistributionInvForDirection(h[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); - distributionsH->setDistributionInvForDirection(h[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); - distributionsH->setDistributionInvForDirection(h[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); - distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); - distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); - distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); - distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + distributionsH->setDistributionInvForDirection(h[DIR_00M], x1 + DX1[DIR_00P], x2 + DX2[DIR_00P], x3 + DX3[DIR_00P], DIR_00P); + distributionsH->setDistributionInvForDirection(h[DIR_P0M], x1 + DX1[DIR_M0P], x2 + DX2[DIR_M0P], x3 + DX3[DIR_M0P], DIR_M0P); + distributionsH->setDistributionInvForDirection(h[DIR_M0M], x1 + DX1[DIR_P0P], x2 + DX2[DIR_P0P], x3 + DX3[DIR_P0P], DIR_P0P); + distributionsH->setDistributionInvForDirection(h[DIR_0PM], x1 + DX1[DIR_0MP], x2 + DX2[DIR_0MP], x3 + DX3[DIR_0MP], DIR_0MP); + distributionsH->setDistributionInvForDirection(h[DIR_0MM], x1 + DX1[DIR_0PP], x2 + DX2[DIR_0PP], x3 + DX3[DIR_0PP], DIR_0PP); + distributionsH->setDistributionInvForDirection(h[DIR_PPM], x1 + DX1[DIR_MMP], x2 + DX2[DIR_MMP], x3 + DX3[DIR_MMP], DIR_MMP); + distributionsH->setDistributionInvForDirection(h[DIR_MPM], x1 + DX1[DIR_PMP], x2 + DX2[DIR_PMP], x3 + DX3[DIR_PMP], DIR_PMP); + distributionsH->setDistributionInvForDirection(h[DIR_PMM], x1 + DX1[DIR_MPP], x2 + DX2[DIR_MPP], x3 + DX3[DIR_MPP], DIR_MPP); + distributionsH->setDistributionInvForDirection(h[DIR_MMM], x1 + DX1[DIR_PPP], x2 + DX2[DIR_PPP], x3 + DX3[DIR_PPP], DIR_PPP); break; default: UB_THROW(UbException(UB_EXARGS, "It isn't implemented non reflecting density boundary for this direction!")); diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp index 6db2e6230560e313abcccbb08299f1928d5c0672..4748212417600b18615a938a6c7a2696ee00eb00 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityBCAlgorithm.cpp @@ -92,12 +92,12 @@ void ThixotropyVelocityBCAlgorithm::applyBC() int nx3 = x3; //flag points in direction of fluid - if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; } + if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; } else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary...")); //lambdaBC = bcPtr->getBoundaryThixotropy(); diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp index 532570386462c4dd0d6d7db118a19429bc7beff0..454b29bc459045b1f61746eeb7f5f5987f1762a7 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyVelocityWithDensityBCAlgorithm.cpp @@ -85,12 +85,12 @@ void ThixotropyVelocityWithDensityBCAlgorithm::applyBC() int nx3 = x3; //flag points in direction of fluid - if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; } - else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; } + if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_P00)) { nx1 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_M00)) { nx1 += 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0P0)) { nx2 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_0M0)) { nx2 += 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00P)) { nx3 -= 1; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::DIR_00M)) { nx3 += 1; } else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary...")); for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp index c63b1559492a1258d7322e4b3b1b17f9ba9b4d13..1fe6632b9de8cb64d98c072bfccaa72ce4bb9ee8 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp @@ -82,11 +82,12 @@ void VelocityWithDensityBCAlgorithm::applyBC() if (minX1 <= nX1 && maxX1 > nX1 && minX2 <= nX2 && maxX2 > nX2 && minX3 <= nX3 && maxX3 > nX3) { if (bcArray->isSolid(nX1, nX2, nX3)) { const int invDir = D3Q27System::INVDIR[fdir]; - // LBMReal q =1.0;// bcPtr->getQ(invDir);// m+m q=0 stabiler + //LBMReal q =1.0;// bcPtr->getQ(invDir);// m+m q=0 stabiler LBMReal velocity = bcPtr->getBoundaryVelocity(fdir); - // LBMReal fReturn = ((1.0 - q) / (1.0 + q))*((f[fdir] - feq[fdir]*collFactor) / (1.0 - - // collFactor)) + ((q*(f[fdir] + f[invDir]) - velocity*rho) / (1.0 + - // q))-drho*D3Q27System::WEIGTH[invDir]; + + //LBMReal fReturn = ((1.0 - q) / (1.0 + q))*((f[fdir] - feq[fdir]*collFactor) / (1.0 - + //collFactor)) + ((q*(f[fdir] + f[invDir]) - velocity*rho) / (1.0 + + //q))-drho*D3Q27System::WEIGTH[invDir]; // if q=1 // LBMReal fReturn = ((q*(f[fdir] + f[invDir]) - velocity*rho) / (1.0 + diff --git a/src/cpu/VirtualFluidsCore/CMakeLists.txt b/src/cpu/VirtualFluidsCore/CMakeLists.txt index a9ee657434ae6ace1fd85974d825469a9e038d68..b691fd34be1cff4f2bfed0fa4e0cf8860014ed90 100644 --- a/src/cpu/VirtualFluidsCore/CMakeLists.txt +++ b/src/cpu/VirtualFluidsCore/CMakeLists.txt @@ -16,7 +16,6 @@ IF(${USE_CATALYST}) list(APPEND VF_LIBRARIES optimized vtkParallelMPI debug vtkParallelMPI ) ENDIF() - IF(${USE_DEM_COUPLING}) INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/../DemCoupling/DemCoupling.cmake) ENDIF() @@ -25,6 +24,10 @@ if(BUILD_USE_OPENMP) list(APPEND VF_LIBRARIES OpenMP::OpenMP_CXX) endif() +IF(${USE_LIGGGHTS}) + list(APPEND VF_LIBRARIES optimized ${LIGGGHTS_RELEASE_LIBRARY} debug ${LIGGGHTS_DEBUG_LIBRARY}) +ENDIF() + vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser ${VF_LIBRARIES} PRIVATE_LINK lbm mpi logger) vf_get_library_name(library_name) @@ -46,6 +49,12 @@ IF(${USE_METIS} AND METIS_INCLUDEDIR) ENDIF() target_include_directories(${library_name} PRIVATE ${ZOLTAN_INCLUDEDIR}) + IF(${USE_VTK}) target_include_directories(${library_name} PRIVATE ${VTK_INCLUDE_DIRS}) ENDIF() + +IF(${USE_LIGGGHTS}) + target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../LiggghtsCoupling) + target_include_directories(${library_name} PUBLIC ${LIGGGHTS_SOURCE_DIR}) +ENDIF() \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp index 770e837a0f27b1cb42db385a44382c6bee402aaf..b2c7466f7cd6e7d5dd0aeb0baa152bfb6ced93ae 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp @@ -13,7 +13,7 @@ #include "EsoTwist3D.h" #include "DistributionArray3D.h" -CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : CoProcessor(grid, s), path(path_), comm(comm), forceX1global(0), forceX2global(0), forceX3global(0) +CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path_, std::shared_ptr<vf::mpi::Communicator> comm) : CoProcessor(grid, s), path(path_), comm(comm), torqueX1global(0), torqueX2global(0), torqueX3global(0) { if (comm->getProcessID() == comm->getRoot()) { @@ -68,9 +68,9 @@ void CalculateTorqueCoProcessor::collectData( double step ) } ostr << istep << ";"; - ostr << forceX1global << ";"; - ostr << forceX2global << ";"; - ostr << forceX3global; + ostr << torqueX1global << ";"; + ostr << torqueX2global << ";"; + ostr << torqueX3global; ostr << std::endl; ostr.close(); } @@ -78,9 +78,9 @@ void CalculateTorqueCoProcessor::collectData( double step ) ////////////////////////////////////////////////////////////////////////// void CalculateTorqueCoProcessor::calculateForces() { - forceX1global = 0.0; - forceX2global = 0.0; - forceX3global = 0.0; + torqueX1global = 0.0; + torqueX2global = 0.0; + torqueX3global = 0.0; for(SPtr<D3Q27Interactor> interactor : interactors) { @@ -97,18 +97,9 @@ void CalculateTorqueCoProcessor::calculateForces() SPtr<Block3D> block = t.first; std::set< std::vector<int> >& transNodeIndicesSet = t.second; - SPtr<ILBMKernel> kernel = block->getKernel(); + double deltaX = grid->getDeltaX(block); - if (kernel->getCompressible()) - { - calcMacrosFct = &D3Q27System::calcCompMacroscopicValues; - compressibleFactor = 1.0; - } - else - { - calcMacrosFct = &D3Q27System::calcIncompMacroscopicValues; - compressibleFactor = 0.0; - } + SPtr<ILBMKernel> kernel = block->getKernel(); SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); @@ -128,11 +119,6 @@ void CalculateTorqueCoProcessor::calculateForces() int x2 = node[1]; int x3 = node[2]; - Vector3D worldCoordinates = grid->getNodeCoordinates(block, x1, x2, x3); - double rx = worldCoordinates[0] - x1Centre; - double ry = worldCoordinates[1] - x2Centre; - double rz = worldCoordinates[2] - x3Centre; - //without ghost nodes if (x1 < minX1 || x1 > maxX1 || x2 < minX2 || x2 > maxX2 ||x3 < minX3 || x3 > maxX3 ) continue; @@ -144,48 +130,42 @@ void CalculateTorqueCoProcessor::calculateForces() double Fy = val<2>(forceVec); double Fz = val<3>(forceVec); + Vector3D worldCoordinates = grid->getNodeCoordinates(block, x1, x2, x3); + double rx = (worldCoordinates[0] - x1Centre) / deltaX; + double ry = (worldCoordinates[1] - x2Centre) / deltaX; + double rz = (worldCoordinates[2] - x3Centre) / deltaX; + torqueX1 += ry * Fz - rz * Fy; torqueX2 += rz * Fx - rx * Fz; torqueX3 += rx * Fy - ry * Fx; - //counter++; - //UBLOG(logINFO, "x1="<<(worldCoordinates[1] - x2Centre)<<",x2=" << (worldCoordinates[2] - x3Centre)<< ",x3=" << (worldCoordinates[0] - x1Centre) <<" forceX3 = " << forceX3); } } - //if we have got discretization with more level - // deltaX is LBM deltaX and equal LBM deltaT - double deltaX = LBMSystem::getDeltaT(block->getLevel()); //grid->getDeltaT(block); - double deltaXquadrat = deltaX*deltaX; - torqueX1 *= deltaXquadrat; - torqueX2 *= deltaXquadrat; - torqueX3 *= deltaXquadrat; distributions->swap(); - forceX1global += torqueX1; - forceX2global += torqueX2; - forceX3global += torqueX3; - - //UBLOG(logINFO, "forceX3global = " << forceX3global); + torqueX1global += torqueX1; + torqueX2global += torqueX2; + torqueX3global += torqueX3; } } std::vector<double> values; std::vector<double> rvalues; - values.push_back(forceX1global); - values.push_back(forceX2global); - values.push_back(forceX3global); + values.push_back(torqueX1global); + values.push_back(torqueX2global); + values.push_back(torqueX3global); rvalues = comm->gather(values); if (comm->getProcessID() == comm->getRoot()) { - forceX1global = 0.0; - forceX2global = 0.0; - forceX3global = 0.0; + torqueX1global = 0.0; + torqueX2global = 0.0; + torqueX3global = 0.0; for (int i = 0; i < (int)rvalues.size(); i+=3) { - forceX1global += rvalues[i]; - forceX2global += rvalues[i+1]; - forceX3global += rvalues[i+2]; + torqueX1global += rvalues[i]; + torqueX2global += rvalues[i+1]; + torqueX3global += rvalues[i+2]; } } } @@ -196,9 +176,6 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3, SP LBMReal fs[D3Q27System::ENDF + 1]; distributions->getDistributionInv(fs, x1, x2, x3); - LBMReal rho = 0.0, vx1 = 0.0, vx2 = 0.0, vx3 = 0.0, drho = 0.0; - calcMacrosFct(fs, drho, vx1, vx2, vx3); - rho = 1.0 + drho * compressibleFactor; if(bc) { @@ -216,22 +193,9 @@ UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3, SP f = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1, x2, x3, invDir); fnbr = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); - Vector3D boundaryVelocity; - boundaryVelocity[0] = bc->getBoundaryVelocityX1(); - boundaryVelocity[1] = bc->getBoundaryVelocityX2(); - boundaryVelocity[2] = bc->getBoundaryVelocityX3(); - double correction[3] = { 0.0, 0.0, 0.0 }; - if (bc->hasVelocityBoundaryFlag(fdir)) - { - const double forceTerm = f - fnbr; - correction[0] = forceTerm * boundaryVelocity[0]; - correction[1] = forceTerm * boundaryVelocity[1]; - correction[2] = forceTerm * boundaryVelocity[2]; - } - - forceX1 += (f + fnbr) * D3Q27System::DX1[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[0]; - forceX2 += (f + fnbr) * D3Q27System::DX2[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[1]; - forceX3 += (f + fnbr) * D3Q27System::DX3[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[2]; + forceX1 += (f + fnbr) * D3Q27System::DX1[invDir]; + forceX2 += (f + fnbr) * D3Q27System::DX2[invDir]; + forceX3 += (f + fnbr) * D3Q27System::DX3[invDir]; } } } diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h index b1a7f771f5dffb5146f66d2bc16399b92aaceba6..e488b442b60b2f726747a521e51cad9d4bacdbe9 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h +++ b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h @@ -40,13 +40,9 @@ private: std::string path; std::shared_ptr<vf::mpi::Communicator> comm; std::vector<SPtr<D3Q27Interactor> > interactors; - double forceX1global; - double forceX2global; - double forceX3global; - - typedef void(*CalcMacrosFct)(const LBMReal* const& /*f[27]*/, LBMReal& /*rho*/, LBMReal& /*vx1*/, LBMReal& /*vx2*/, LBMReal& /*vx3*/); - CalcMacrosFct calcMacrosFct; - LBMReal compressibleFactor; + double torqueX1global; + double torqueX2global; + double torqueX3global; }; diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp index 5a514606ad8486073e7c1e3679ee7a31916553df..cb2fd908ff78803e4262ae64e906b8dad3c14dff 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/ForceCalculator.cpp @@ -42,7 +42,7 @@ Vector3D ForceCalculator::getForces(int x1, int x2, int x3, SPtr<DistributionArr // UBLOG(logINFO, "c, c * bv(x,y,z): " << correction << ", " << correction * val<1>(boundaryVelocity) << // ", " << correction * val<2>(boundaryVelocity) << ", " << correction * val<3>(boundaryVelocity)); - // force consists of the MEM part and the galilean invariance correction including the boundary velocity + // force consists of the MEM part and the Galilean invariance correction including the boundary velocity forceX1 += (f + fnbr) * D3Q27System::DX1[invDir] - correction[0]; forceX2 += (f + fnbr) * D3Q27System::DX2[invDir] - correction[1]; forceX3 += (f + fnbr) * D3Q27System::DX3[invDir] - correction[2]; diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp index 73c0a2325953994c337934347e872223ba18452a..ed258864a4a87b473ca276064abf60ad5910828d 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/InSituVTKCoProcessor.cpp @@ -226,11 +226,11 @@ void InSituVTKCoProcessor::addData(SPtr<Block3D> block) UbSystem::toString(ix2) + "," + UbSystem::toString(ix3))); // vx3=999.0; - arrays[0]->InsertNextValue(rho * conv->getFactorDensityLbToW2()); - arrays[1]->InsertNextValue(vx1 * conv->getFactorVelocityLbToW2()); - arrays[2]->InsertNextValue(vx2 * conv->getFactorVelocityLbToW2()); - arrays[3]->InsertNextValue(vx3 * conv->getFactorVelocityLbToW2()); - arrays[4]->InsertNextValue(press * conv->getFactorPressureLbToW2()); + arrays[0]->InsertNextValue(rho * conv->getFactorDensityLbToW()); + arrays[1]->InsertNextValue(vx1 * conv->getFactorVelocityLbToW()); + arrays[2]->InsertNextValue(vx2 * conv->getFactorVelocityLbToW()); + arrays[3]->InsertNextValue(vx3 * conv->getFactorVelocityLbToW()); + arrays[4]->InsertNextValue(press * conv->getFactorPressureLbToW()); } } } diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp index 4f8f3a4b503f9490545ed760aaacf2778dece474..a16f32c7d9e0d83dff90a55bb139d4115285a196 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOCoProcessor.cpp @@ -55,7 +55,7 @@ MPIIOCoProcessor::MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const //----------------------------------------------------------------------- MPI_Datatype typesBC[3] = { MPI_LONG_LONG_INT, MPI_FLOAT, MPI_CHAR }; - int blocksBC[3] = { 5, 38, 1 }; + int blocksBC[3] = { 5, 34, 1 }; MPI_Aint offsetsBC[3], lbBC, extentBC; offsetsBC[0] = 0; @@ -70,7 +70,7 @@ MPIIOCoProcessor::MPIIOCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const //--------------------------------------- - MPI_Type_contiguous(8, MPI_CHAR, &arrayPresenceType); + MPI_Type_contiguous(9, MPI_CHAR, &arrayPresenceType); MPI_Type_commit(&arrayPresenceType); } @@ -425,8 +425,7 @@ void MPIIOCoProcessor::clearAllFiles(int step) MPI_File_set_size(file_handler, new_size); MPI_File_close(&file_handler); - std::string filename6 = - path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageFluktuationsArray.bin"; + std::string filename6 = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageFluktuationsArray.bin"; // MPI_File_delete(filename6.c_str(), info); int rc6 = MPI_File_open(MPI_COMM_WORLD, filename6.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); if (rc6 != MPI_SUCCESS) @@ -472,6 +471,13 @@ void MPIIOCoProcessor::clearAllFiles(int step) MPI_File_set_size(file_handler, new_size); MPI_File_close(&file_handler); + std::string filename12 = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPressureField.bin"; + int rc12 = MPI_File_open(MPI_COMM_WORLD, filename12.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); + if (rc12 != MPI_SUCCESS) + throw UbException(UB_EXARGS, "couldn't open file " + filename12); + MPI_File_set_size(file_handler, new_size); + MPI_File_close(&file_handler); + } void MPIIOCoProcessor::writeCpTimeStep(int step) diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp index b58376cebd7854a1aba1a2b69881ac445ad51082..34c247345d2d3cf1a9c527ab7a7b15e23f7ab5da 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.cpp @@ -10,7 +10,7 @@ #include "DataSet3D.h" #include "Grid3D.h" #include "LBMKernel.h" -#include "MetisPartitioningGridVisitor.h" +#include "Grid3DVisitor.h" #include "PointerDefinitions.h" #include "RenumberGridVisitor.h" #include "UbFileInputASCII.h" @@ -25,10 +25,11 @@ using namespace MPIIODataStructures; #define MESSAGE_TAG 80 #define SEND_BLOCK_SIZE 100000 -MPIIOMigrationBECoProcessor::MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm) +MPIIOMigrationBECoProcessor::MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm) : MPIIOCoProcessor(grid, s, path, comm), nue(-999.999), nuL(-999.999), nuG(-999.999), densityRatio(-999.999) { memset(&boundCondParamStr, 0, sizeof(boundCondParamStr)); + metisVisitor = mV; //------------------------- define MPI types --------------------------------- @@ -116,7 +117,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) int firstGlobalID {0}; std::vector<double> doubleValuesArrayF; // double-values (arrays of f's) in all blocks Fdistribution std::vector<double> doubleValuesArrayH1; // double-values (arrays of f's) in all blocks H1distribution - // std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks H2distribution + std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks H2distribution if (comm->isRoot()) { @@ -124,7 +125,8 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } - bool multiPhase = false; + bool multiPhase1 = false; + bool multiPhase2 = false; DSArraysPresence arrPresence; bool firstBlock = true; int doubleCountInBlock = 0; @@ -146,19 +148,20 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) D3Q27EsoTwist3DSplittedVectorPtrH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getHdistributions()); if (D3Q27EsoTwist3DSplittedVectorPtrH1 != 0) { - multiPhase = true; + multiPhase1 = true; localDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getLocalDistributions(); nonLocalDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getNonLocalDistributions(); zeroDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getZeroDistributions(); } - /*D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions()); + D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions()); if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0) { + multiPhase2 = true; localDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getLocalDistributions(); nonLocalDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getNonLocalDistributions(); zeroDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getZeroDistributions(); - }*/ + } if (firstBlock) // && block->getKernel()) // when first (any) valid block... @@ -242,6 +245,11 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) else arrPresence.isPhaseField2Present = false; + SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> pressureFieldPtr = block->getKernel()->getDataSet()->getPressureField(); + if (pressureFieldPtr) + arrPresence.isPressureFieldPresent = true; + else + arrPresence.isPressureFieldPresent = false; firstBlock = false; } @@ -253,7 +261,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) if (zeroDistributionsF && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0)) doubleValuesArrayF.insert(doubleValuesArrayF.end(), zeroDistributionsF->getDataVector().begin(), zeroDistributionsF->getDataVector().end()); - if (multiPhase) + if (multiPhase1) { if (localDistributionsH1 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0)) doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), localDistributionsH1->getDataVector().begin(), localDistributionsH1->getDataVector().end()); @@ -263,7 +271,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), zeroDistributionsH1->getDataVector().begin(), zeroDistributionsH1->getDataVector().end()); } - /*if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0) + if (multiPhase2) { if (localDistributionsH2 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0)) doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), localDistributionsH2->getDataVector().begin(), localDistributionsH2->getDataVector().end()); @@ -271,7 +279,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), nonLocalDistributionsH2->getDataVector().begin(), nonLocalDistributionsH2->getDataVector().end()); if (zeroDistributionsH2 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0)) doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), zeroDistributionsH2->getDataVector().begin(), zeroDistributionsH2->getDataVector().end()); - }*/ + } ic++; } @@ -318,7 +326,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) MPI_File_close(&file_handler); //-------------------------------- H1 ------------------------------------------------ - if (multiPhase) + if (multiPhase1) { filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH1.bin"; rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); @@ -333,7 +341,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) } //-------------------------------- H2 -------------------------------------------------- - /*if (D3Q27EsoTwist3DSplittedVectorPtr2 != 0) + if (multiPhase2) { filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); @@ -345,7 +353,7 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) MPI_File_sync(file_handler); MPI_File_close(&file_handler); - } */ + } //-------------------------------- @@ -395,6 +403,10 @@ void MPIIOMigrationBECoProcessor::writeDataSet(int step) if (arrPresence.isPhaseField2Present) write3DArray(step, PhaseField2, std::string("/cpPhaseField2.bin")); + + if (arrPresence.isPressureFieldPresent) + write3DArray(step, PressureField, std::string("/cpPressureField.bin")); + } void MPIIOMigrationBECoProcessor::write4DArray(int step, Arrays arrayType, std::string fname) @@ -562,6 +574,9 @@ void MPIIOMigrationBECoProcessor::write3DArray(int step, Arrays arrayType, std:: case PhaseField2: ___Array = block->getKernel()->getDataSet()->getPhaseField2(); break; + case PressureField: + ___Array = block->getKernel()->getDataSet()->getPressureField(); + break; default: UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::write3DArray : 3D array type does not exist!")); @@ -695,11 +710,7 @@ void MPIIOMigrationBECoProcessor::writeBoundaryConds(int step) bouCond->bcVelocityX2 = (float)bcArr->bcvector[bc]->getBoundaryVelocityX2(); bouCond->bcVelocityX3 = (float)bcArr->bcvector[bc]->getBoundaryVelocityX3(); bouCond->bcDensity = (float)bcArr->bcvector[bc]->getBoundaryDensity(); - bouCond->bcLodiDensity = (float)bcArr->bcvector[bc]->getDensityLodiDensity(); - bouCond->bcLodiVelocityX1 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX1(); - bouCond->bcLodiVelocityX2 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX2(); - bouCond->bcLodiVelocityX3 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX3(); - bouCond->bcLodiLentgh = (float)bcArr->bcvector[bc]->getDensityLodiLength(); + bouCond->bcPhaseField = (float)bcArr->bcvector[bc]->getBoundaryPhaseField(); bouCond->nx1 = (float)bcArr->bcvector[bc]->nx1; bouCond->nx2 = (float)bcArr->bcvector[bc]->nx2; bouCond->nx3 = (float)bcArr->bcvector[bc]->nx3; @@ -842,8 +853,7 @@ void MPIIOMigrationBECoProcessor::restart(int step) UBLOG(logINFO, "Load check point - start"); readBlocks(step); - SPtr<Grid3DVisitor> newMetisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); - grid->accept(newMetisVisitor); + grid->accept(metisVisitor); readDataSet(step); readBoundaryConds(step); @@ -980,6 +990,8 @@ void MPIIOMigrationBECoProcessor::blocksExchange(int tagN, int ind1, int ind2, i MPI_Waitall(requestCount, &requests[0], MPI_STATUSES_IGNORE); + MPI_Type_free(&sendBlockDoubleType); + delete[] blocksCounterSend; delete[] blocksCounterRec; delete[] rawDataSend; @@ -1011,7 +1023,8 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } - bool multiPhase = false; + bool multiPhase1 = false; + bool multiPhase2 = false; dataSetParam dataSetParamStr1, dataSetParamStr2, dataSetParamStr3; int blocksCountAll = grid->getNumberOfBlocks(); // quantity of all blocks in the grid @@ -1047,7 +1060,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) dataSetParamStr3.nx[0] * dataSetParamStr3.nx[1] * dataSetParamStr3.nx[2] * dataSetParamStr3.nx[3]; std::vector<double> doubleValuesArrayF(size_t(myBlocksCount * doubleCountInBlock)); // double-values in all blocks Fdistributions std::vector<double> doubleValuesArrayH1; // double-values in all blocks H1distributions - //std::vector<double> doubleValuesArrayH2; // double-values in all blocks H2distributions + std::vector<double> doubleValuesArrayH2; // double-values in all blocks H2distributions MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType); MPI_Type_commit(&dataSetDoubleType); @@ -1067,7 +1080,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) MPI_File_get_size(file_handler, &fsize); if (fsize > 0) { - multiPhase = true; + multiPhase1 = true; doubleValuesArrayH1.resize(myBlocksCount * doubleCountInBlock); read_offset = (MPI_Offset)(indexB * doubleCountInBlock * sizeof(double)) ; @@ -1075,6 +1088,22 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) } MPI_File_close(&file_handler); + //--------------------------------- H2 --------------------------------------------------------- + filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; + rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); + if (rc != MPI_SUCCESS) + throw UbException(UB_EXARGS, "couldn't open file " + filename); + MPI_File_get_size(file_handler, &fsize); + if (fsize > 0) + { + multiPhase2 = true; + doubleValuesArrayH2.resize(myBlocksCount * doubleCountInBlock); + + read_offset = (MPI_Offset)(indexB * doubleCountInBlock * sizeof(double)); + MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[0], int(myBlocksCount), dataSetDoubleType, MPI_STATUS_IGNORE); + } + MPI_File_close(&file_handler); + MPI_Type_free(&dataSetDoubleType); if (comm->isRoot()) @@ -1089,16 +1118,23 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) for (int r = 0; r < size; r++) rawDataReceiveF[r].resize(0); blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayF, rawDataReceiveF); + std::vector<double>* rawDataReceiveH1 = new std::vector<double>[size]; - for (int r = 0; r < size; r++) - rawDataReceiveH1[r].resize(0); - blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayH1, rawDataReceiveH1); + if (multiPhase1) + { + for (int r = 0; r < size; r++) + rawDataReceiveH1[r].resize(0); + blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayH1, rawDataReceiveH1); + } - /* std::vector<double>* rawDataReceiveH2 = new std::vector<double>[size]; + std::vector<double>* rawDataReceiveH2 = new std::vector<double>[size]; + if (multiPhase2) + { for (int r = 0; r < size; r++) rawDataReceiveH2[r].resize(0); - blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayH2, rawDataReceiveH2);*/ + blocksExchange(MESSAGE_TAG, indexB, indexE, int(doubleCountInBlock), doubleValuesArrayH2, rawDataReceiveH2); + } if (comm->isRoot()) { @@ -1110,9 +1146,9 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) //-------------------------------------- restore blocks --------------------------------- int blockID; - std::vector<LBMReal> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3; - std::vector<LBMReal> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13; - //std::vector<LBMReal> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23; + std::vector<double> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3; + std::vector<double> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13; + std::vector<double> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23; size_t vectorSize1 = dataSetParamStr1.nx[0] * dataSetParamStr1.nx[1] * dataSetParamStr1.nx[2] * dataSetParamStr1.nx[3]; size_t vectorSize2 = dataSetParamStr2.nx[0] * dataSetParamStr2.nx[1] * dataSetParamStr2.nx[2] * dataSetParamStr2.nx[3]; @@ -1128,21 +1164,24 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) index += 1; vectorsOfValuesF1.assign(rawDataReceiveF[r].data() + index, rawDataReceiveF[r].data() + index + vectorSize1); - if(multiPhase) + if(multiPhase1) vectorsOfValuesH11.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize1); - //vectorsOfValuesH21.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize1); + if (multiPhase2) + vectorsOfValuesH21.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize1); index += vectorSize1; vectorsOfValuesF2.assign(rawDataReceiveF[r].data() + index, rawDataReceiveF[r].data() + index + vectorSize2); - if (multiPhase) - vectorsOfValuesH12.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize1); - //vectorsOfValuesH22.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize1); + if (multiPhase1) + vectorsOfValuesH12.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize2); + if (multiPhase2) + vectorsOfValuesH22.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize2); index += vectorSize2; vectorsOfValuesF3.assign(rawDataReceiveF[r].data() + index, rawDataReceiveF[r].data() + index + vectorSize3); - if (multiPhase) - vectorsOfValuesH13.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize1); - //vectorsOfValuesH23.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize1); + if (multiPhase1) + vectorsOfValuesH13.assign(rawDataReceiveH1[r].data() + index, rawDataReceiveH1[r].data() + index + vectorSize3); + if (multiPhase2) + vectorsOfValuesH23.assign(rawDataReceiveH2[r].data() + index, rawDataReceiveH2[r].data() + index + vectorSize3); index += vectorSize3; SPtr<DistributionArray3D> mFdistributions(new D3Q27EsoTwist3DSplittedVector()); @@ -1158,7 +1197,7 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX3(dataSetParamStr1.nx3); SPtr<DistributionArray3D> mH1distributions(new D3Q27EsoTwist3DSplittedVector()); - if (multiPhase) + if (multiPhase1) { dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH11, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); @@ -1172,22 +1211,25 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setNX3(dataSetParamStr1.nx3); } - /*SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector()); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( + SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector()); + if (multiPhase2) + { + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH21, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( - new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3]))); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( - vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2]))); - - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);*/ - + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( + new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3]))); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2]))); + + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3); + } // find the nesessary block and fill it SPtr<Block3D> block = grid->getBlock(blockID); this->lbmKernel->setBlock(block); + this->lbmKernel->setNX(std::array<int, 3>{ {dataSetParamStr1.nx1, dataSetParamStr1.nx2, dataSetParamStr1.nx3}}); SPtr<LBMKernel> kernel = this->lbmKernel->clone(); LBMReal collFactor = LBMSystem::calcCollisionFactor(this->nue, block->getLevel()); LBMReal collFactorL = LBMSystem::calcCollisionFactor(this->nuL, block->getLevel()); @@ -1199,14 +1241,16 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) kernel->setDensityRatio(this->densityRatio); SPtr<DataSet3D> dataSetPtr = SPtr<DataSet3D>(new DataSet3D()); dataSetPtr->setFdistributions(mFdistributions); - if (multiPhase) + if (multiPhase1) dataSetPtr->setHdistributions(mH1distributions); -// dataSetPtr->setHdistributions(mH2distributions); + if (multiPhase2) + dataSetPtr->setH2distributions(mH2distributions); kernel->setDataSet(dataSetPtr); block->setKernel(kernel); } } - //if (comm->isRoot()) + + if (comm->isRoot()) { UBLOG(logINFO, "MPIIOMigrationBECoProcessor::readDataSet end of restore of data, rank = " << rank); UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); @@ -1254,9 +1298,12 @@ void MPIIOMigrationBECoProcessor::readDataSet(int step) if (arrPresence.isPhaseField2Present) readArray(step, PhaseField2, std::string("/cpPhaseField2.bin")); + if (arrPresence.isPressureFieldPresent) + readArray(step, PressureField, std::string("/cpPressureField.bin")); + delete[] rawDataReceiveF; -// delete[] rawDataReceiveH1; -// delete[] rawDataReceiveH2; + delete[] rawDataReceiveH1; + delete[] rawDataReceiveH2; } void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::string fname) @@ -1337,7 +1384,7 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin //----------------------------- restore data --------------------------------- int blockID; - std::vector<LBMReal> vectorsOfValues; + std::vector<double> vectorsOfValues; size_t index; size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; @@ -1399,6 +1446,11 @@ void MPIIOMigrationBECoProcessor::readArray(int step, Arrays arrType, std::strin vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); block->getKernel()->getDataSet()->setPhaseField2(___3DArray); break; + case PressureField: + ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); + block->getKernel()->getDataSet()->setPressureField(___3DArray); + break; default: UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationBECoProcessor::readArray : array type does not exist!")); break; @@ -1622,11 +1674,7 @@ void MPIIOMigrationBECoProcessor::readBoundaryConds(int step) bc->bcVelocityX2 = bcArray[ibc].bcVelocityX2; bc->bcVelocityX3 = bcArray[ibc].bcVelocityX3; bc->bcDensity = bcArray[ibc].bcDensity; - bc->bcLodiDensity = bcArray[ibc].bcLodiDensity; - bc->bcLodiVelocityX1 = bcArray[ibc].bcLodiVelocityX1; - bc->bcLodiVelocityX2 = bcArray[ibc].bcLodiVelocityX2; - bc->bcLodiVelocityX3 = bcArray[ibc].bcLodiVelocityX3; - bc->bcLodiLentgh = bcArray[ibc].bcLodiLentgh; + bc->bcPhaseField = bcArray[ibc].bcPhaseField; bc->nx1 = bcArray[ibc].nx1; bc->nx2 = bcArray[ibc].nx2; diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h index 7c9471246af0207d3baef1bb7e8e1726627d77b6..c60800ccd18e5ac523c5c85ea47219a96f8a69c5 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h +++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationBECoProcessor.h @@ -13,6 +13,7 @@ class UbScheduler; namespace vf::mpi {class Communicator;} class BCProcessor; class LBMKernel; +class Grid3DVisitor; //! \class MPIWriteBlocksBECoProcessor //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating @@ -26,11 +27,12 @@ class MPIIOMigrationBECoProcessor : public MPIIOCoProcessor ShearStressVal = 5, RelaxationFactor = 6, PhaseField1 = 7, - PhaseField2 = 8 + PhaseField2 = 8, + PressureField = 9 }; public: - MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, + MPIIOMigrationBECoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm); ~MPIIOMigrationBECoProcessor() override; //! Each timestep writes the grid into the files @@ -78,10 +80,6 @@ public: void blocksExchange(int tagN, int ind1, int ind2, int doubleCountInBlock, std::vector<double> &pV, std::vector<double> *rawDataReceive); -protected: - // std::string path; - // std::shared_ptr<vf::mpi::Communicator> comm; - private: // MPI_Datatype gridParamType, block3dType; // MPI_Datatype dataSetType, dataSetSmallType; @@ -93,6 +91,7 @@ private: MPIIODataStructures::boundCondParam boundCondParamStr; SPtr<LBMKernel> lbmKernel; SPtr<BCProcessor> bcProcessor; + SPtr<Grid3DVisitor> metisVisitor; double nue; double nuL; double nuG; diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp index daf31d6fd663574381d5d5d63263283f9681de7a..285d6c28ae92b3bad7fb6b1171f3a09a637e0729 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.cpp @@ -10,7 +10,7 @@ #include "DataSet3D.h" #include "Grid3D.h" #include "LBMKernel.h" -#include "MetisPartitioningGridVisitor.h" +#include "Grid3DVisitor.h" #include "PointerDefinitions.h" #include "RenumberBlockVisitor.h" #include "UbFileInputASCII.h" @@ -22,10 +22,11 @@ using namespace MPIIODataStructures; -MPIIOMigrationCoProcessor::MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm) +MPIIOMigrationCoProcessor::MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm) : MPIIOCoProcessor(grid, s, path, comm) { memset(&boundCondParamStr, 0, sizeof(boundCondParamStr)); + metisVisitor = mV; //------------------------- define MPI types --------------------------------- @@ -134,7 +135,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) DataSetMigration *dataSetArray = new DataSetMigration[blocksCount]; std::vector<double> doubleValuesArrayF; // double-values (arrays of f's) in all blocks Fdistribution std::vector<double> doubleValuesArrayH1; // double-values (arrays of f's) in all blocks H1distribution - // std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks H2distribution + std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks H2distribution if (comm->isRoot()) { @@ -142,8 +143,10 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } - bool multiPhase = false; + bool multiPhase1 = false; + bool multiPhase2 = false; DSArraysPresence arrPresence; + memset(&arrPresence, 0, sizeof(arrPresence)); bool firstBlock = true; size_t doubleCountInBlock = 0; int ic = 0; @@ -178,19 +181,20 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) D3Q27EsoTwist3DSplittedVectorPtrH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getHdistributions()); if (D3Q27EsoTwist3DSplittedVectorPtrH1 != 0) { - multiPhase = true; + multiPhase1 = true; localDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getLocalDistributions(); nonLocalDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getNonLocalDistributions(); zeroDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getZeroDistributions(); } - /*D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions()); + D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions()); if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0) { + multiPhase2 = true; localDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getLocalDistributions(); nonLocalDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getNonLocalDistributions(); zeroDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getZeroDistributions(); - }*/ + } if (firstBlock) // && block->getKernel()) // when first (any) valid block... { @@ -274,6 +278,12 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) else arrPresence.isPhaseField2Present = false; + SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> pressureFieldPtr = block->getKernel()->getDataSet()->getPressureField(); + if (pressureFieldPtr) + arrPresence.isPressureFieldPresent = true; + else + arrPresence.isPressureFieldPresent = false; + firstBlock = false; } @@ -284,7 +294,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) if (zeroDistributionsF && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0)) doubleValuesArrayF.insert(doubleValuesArrayF.end(), zeroDistributionsF->getDataVector().begin(), zeroDistributionsF->getDataVector().end()); - if (multiPhase) + if (multiPhase1) { if (localDistributionsH1 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0)) doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), localDistributionsH1->getDataVector().begin(), localDistributionsH1->getDataVector().end()); @@ -294,7 +304,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), zeroDistributionsH1->getDataVector().begin(), zeroDistributionsH1->getDataVector().end()); } - /*if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0) + if (multiPhase2) { if (localDistributionsH2 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0)) doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), localDistributionsH2->getDataVector().begin(), localDistributionsH2->getDataVector().end()); @@ -302,8 +312,8 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), nonLocalDistributionsH2->getDataVector().begin(), nonLocalDistributionsH2->getDataVector().end()); if (zeroDistributionsH2 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0)) doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), zeroDistributionsH2->getDataVector().begin(), zeroDistributionsH2->getDataVector().end()); - }*/ - + } + ic++; } } @@ -318,7 +328,6 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } - double start {0.}; double finish {0.}; if (comm->isRoot()) @@ -356,7 +365,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) MPI_File_close(&file_handler); //-------------------------------- H1 ---------------------------------------------------- - if (multiPhase) + if (multiPhase1) { filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH1.bin"; rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); @@ -376,7 +385,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) } //-------------------------------- H2 ---------------------------------------------------- - /*if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0) + if (multiPhase2) { filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); @@ -393,7 +402,7 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) MPI_File_sync(file_handler); MPI_File_close(&file_handler); - }*/ + } //-------------------------------- MPI_Type_free(&dataSetDoubleType); @@ -417,23 +426,18 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) if (arrPresence.isAverageDensityArrayPresent) write4DArray(step, AverageDensity, std::string("/cpAverageDensityArray.bin")); - // writeAverageDensityArray(step); if (arrPresence.isAverageVelocityArrayPresent) write4DArray(step, AverageVelocity, std::string("/cpAverageVelocityArray.bin")); - // writeAverageVelocityArray(step); if (arrPresence.isAverageFluktuationsArrayPresent) write4DArray(step, AverageFluktuations, std::string("/cpAverageFluktuationsArray.bin")); - // writeAverageFluktuationsArray(step); if (arrPresence.isAverageTripleArrayPresent) write4DArray(step, AverageTriple, std::string("/cpAverageTripleArray.bin")); - // writeAverageTripleArray(step); if (arrPresence.isShearStressValArrayPresent) write4DArray(step, ShearStressVal, std::string("/cpShearStressValArray.bin")); - // writeShearStressValArray(step); if (arrPresence.isRelaxationFactorPresent) write3DArray(step, RelaxationFactor, std::string("/cpRelaxationFactor.bin")); @@ -444,6 +448,9 @@ void MPIIOMigrationCoProcessor::writeDataSet(int step) if (arrPresence.isPhaseField2Present) write3DArray(step, PhaseField2, std::string("/cpPhaseField2.bin")); + if (arrPresence.isPressureFieldPresent) + write3DArray(step, PressureField, std::string("/cpPressureField.bin")); + } void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::string fname) @@ -469,7 +476,7 @@ void MPIIOMigrationCoProcessor::write4DArray(int step, Arrays arrayType, std::st if (comm->isRoot()) { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageDensityArray start collect data rank = " << rank); + UBLOG(logINFO, "MPIIOMigrationCoProcessor::write4DArray start collect data rank = " << rank); UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } @@ -599,7 +606,7 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st if (comm->isRoot()) { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray start collect data rank = " << rank); + UBLOG(logINFO, "MPIIOMigrationCoProcessor::write3DArray start collect data to file = " << fname); UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } @@ -625,6 +632,9 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st case PhaseField2: ___Array = block->getKernel()->getDataSet()->getPhaseField2(); break; + case PressureField: + ___Array = block->getKernel()->getDataSet()->getPressureField(); + break; default: UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::write3DArray : 3D array type does not exist!")); break; @@ -706,732 +716,6 @@ void MPIIOMigrationCoProcessor::write3DArray(int step, Arrays arrayType, std::st delete[] dataSetSmallArray; } -/* -void MPIIOMigrationCoProcessor::writeAverageDensityArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! - - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - std::vector<double> doubleValuesArray; // double-values of the AverageDensityArray in all blocks - dataSetParam dataSetParamStr; - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageDensityArray start collect data rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - bool firstBlock = true; - size_t doubleCountInBlock = 0; - int ic = 0; - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - dataSetSmallArray[ic].globalID = block->getGlobalID(); // id of the block needed to find it while -regenerating the grid - - SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > averageDensityArray = -block->getKernel()->getDataSet()->getAverageDensity(); - - if (firstBlock) // when first (any) valid block... - { - //if (averageDensityArray) - //{ - dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; - dataSetParamStr.nx[0] = static_cast<int>(averageDensityArray->getNX1()); - dataSetParamStr.nx[1] = static_cast<int>(averageDensityArray->getNX2()); - dataSetParamStr.nx[2] = static_cast<int>(averageDensityArray->getNX3()); - dataSetParamStr.nx[3] = static_cast<int>(averageDensityArray->getNX4()); - doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; - //} - //else - // break; - - firstBlock = false; - } - - if (averageDensityArray && (dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] -> 0) && (dataSetParamStr.nx[3] > 0)) doubleValuesArray.insert(doubleValuesArray.end(), -averageDensityArray->getDataVector().begin(), averageDensityArray->getDataVector().end()); - - ic++; - } - } - - // register new MPI-types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageDensityArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_Info info = MPI_INFO_NULL; - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageDensityArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // each process writes common parameters of a dataSet - MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - MPI_Offset write_offset; - size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double); - - for (size_t nb = 0; nb < blocksCount; nb++) - { - write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet); - MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); - } - - MPI_File_sync(file_handler); - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageDensityArray time: " << finish - start << " s"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::writeAverageVelocityArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! - - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks - dataSetParam dataSetParamStr; - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageVelocityArray start collect data rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - bool firstBlock = true; - size_t doubleCountInBlock = 0; - int ic = 0; - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - dataSetSmallArray[ic].globalID = block->getGlobalID(); // id of the block needed to find it while -regenerating the grid - - SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > AverageVelocityArray3DPtr = -block->getKernel()->getDataSet()->getAverageVelocity(); - - if (firstBlock) // when first (any) valid block... - { - //if (AverageVelocityArray3DPtr) - //{ - dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; - dataSetParamStr.nx[0] = static_cast<int>(AverageVelocityArray3DPtr->getNX1()); - dataSetParamStr.nx[1] = static_cast<int>(AverageVelocityArray3DPtr->getNX2()); - dataSetParamStr.nx[2] = static_cast<int>(AverageVelocityArray3DPtr->getNX3()); - dataSetParamStr.nx[3] = static_cast<int>(AverageVelocityArray3DPtr->getNX4()); - doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; - //} - //else - // break; - - firstBlock = false; - } - - if (AverageVelocityArray3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) && -(dataSetParamStr.nx[2]>0) && (dataSetParamStr.nx[3]>0)) doubleValuesArray.insert(doubleValuesArray.end(), -AverageVelocityArray3DPtr->getDataVector().begin(), AverageVelocityArray3DPtr->getDataVector().end()); - - ic++; - } - } - - // register new MPI-types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageVelocityArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_Info info = MPI_INFO_NULL; - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageVelocityArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // each process writes common parameters of a dataSet - MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - MPI_Offset write_offset; - size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double); - - for (size_t nb = 0; nb < blocksCount; nb++) - { - write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet); - MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); - } - - MPI_File_sync(file_handler); - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageVelocityArray time: " << finish - start << " s"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::writeAverageFluktuationsArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! - - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks - dataSetParam dataSetParamStr; - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageFluktuationsArray start collect data rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - bool firstBlock = true; - size_t doubleCountInBlock = 0; - int ic = 0; - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - dataSetSmallArray[ic].globalID = block->getGlobalID(); // id of the block needed to find it while -regenerating the grid - - SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > AverageFluctArray3DPtr = -block->getKernel()->getDataSet()->getAverageFluctuations(); - - if (firstBlock) // when first (any) valid block... - { - //if (AverageFluctArray3DPtr) - //{ - dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; - dataSetParamStr.nx[0] = static_cast<int>(AverageFluctArray3DPtr->getNX1()); - dataSetParamStr.nx[1] = static_cast<int>(AverageFluctArray3DPtr->getNX2()); - dataSetParamStr.nx[2] = static_cast<int>(AverageFluctArray3DPtr->getNX3()); - dataSetParamStr.nx[3] = static_cast<int>(AverageFluctArray3DPtr->getNX4()); - doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; - //} - //else - // break; - - firstBlock = false; - } - - if (AverageFluctArray3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) && -(dataSetParamStr.nx[2]>0) && (dataSetParamStr.nx[3]>0)) doubleValuesArray.insert(doubleValuesArray.end(), -AverageFluctArray3DPtr->getDataVector().begin(), AverageFluctArray3DPtr->getDataVector().end()); - - ic++; - } - } - - // register new MPI-types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageFluktuationsArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_Info info = MPI_INFO_NULL; -#ifdef HLRN_LUSTRE - MPI_Info_create(&info); - MPI_Info_set(info, "striping_factor", "40"); - MPI_Info_set(info, "striping_unit", "4M"); -#endif - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageFluktuationsArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // each process writes common parameters of a dataSet - MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - MPI_Offset write_offset; - size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double); - - for (size_t nb = 0; nb < blocksCount; nb++) - { - write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet); - MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); - } - - MPI_File_sync(file_handler); - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageFluktuationsArray time: " << finish - start << " s"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::writeAverageTripleArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! - - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks - dataSetParam dataSetParamStr; - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageTripleArray start collect data rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - bool firstBlock = true; - size_t doubleCountInBlock = 0; - int ic = 0; - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - dataSetSmallArray[ic].globalID = block->getGlobalID(); // id of the block needed to find it while -regenerating the grid - - SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > AverageTripleArray3DPtr = -block->getKernel()->getDataSet()->getAverageTriplecorrelations(); - - if (firstBlock) // when first (any) valid block... - { - //if (AverageTripleArray3DPtr) - //{ - dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; - dataSetParamStr.nx[0] = static_cast<int>(AverageTripleArray3DPtr->getNX1()); - dataSetParamStr.nx[1] = static_cast<int>(AverageTripleArray3DPtr->getNX2()); - dataSetParamStr.nx[2] = static_cast<int>(AverageTripleArray3DPtr->getNX3()); - dataSetParamStr.nx[3] = static_cast<int>(AverageTripleArray3DPtr->getNX4()); - doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; - //} - //else - // break; - - firstBlock = false; - } - - if (AverageTripleArray3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) && -(dataSetParamStr.nx[2]>0) && (dataSetParamStr.nx[3]>0)) doubleValuesArray.insert(doubleValuesArray.end(), -AverageTripleArray3DPtr->getDataVector().begin(), AverageTripleArray3DPtr->getDataVector().end()); - - ic++; - } - } - - // register new MPI-types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageTripleArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_Info info = MPI_INFO_NULL; - -#ifdef HLRN_LUSTRE - MPI_Info_create(&info); - MPI_Info_set(info, "striping_factor", "40"); - MPI_Info_set(info, "striping_unit", "4M"); -#endif - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageTripleArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // each process writes common parameters of a dataSet - MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - MPI_Offset write_offset; - size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double); - - for (size_t nb = 0; nb < blocksCount; nb++) - { - write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet); - MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); - } - - MPI_File_sync(file_handler); - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeAverageTripleArray time: " << finish - start << " s"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::writeShearStressValArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! - - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks - dataSetParam dataSetParamStr; - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeShearStressValArray start collect data rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - bool firstBlock = true; - size_t doubleCountInBlock = 0; - int ic = 0; - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - dataSetSmallArray[ic].globalID = block->getGlobalID(); // id of the block needed to find it while -regenerating the grid - - SPtr< CbArray4D<LBMReal, IndexerX4X3X2X1> > ShearStressValArray3DPtr = -block->getKernel()->getDataSet()->getShearStressValues(); - - if (firstBlock) // when first (any) valid block... - { - //if (ShearStressValArray3DPtr) - //{ - dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; - dataSetParamStr.nx[0] = static_cast<int>(ShearStressValArray3DPtr->getNX1()); - dataSetParamStr.nx[1] = static_cast<int>(ShearStressValArray3DPtr->getNX2()); - dataSetParamStr.nx[2] = static_cast<int>(ShearStressValArray3DPtr->getNX3()); - dataSetParamStr.nx[3] = static_cast<int>(ShearStressValArray3DPtr->getNX4()); - doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; - //} - //else - // break; - - firstBlock = false; - } - - if (ShearStressValArray3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) && -(dataSetParamStr.nx[2]>0) && (dataSetParamStr.nx[3]>0)) doubleValuesArray.insert(doubleValuesArray.end(), -ShearStressValArray3DPtr->getDataVector().begin(), ShearStressValArray3DPtr->getDataVector().end()); - - ic++; - } - } - - // register new MPI-types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeShearStressValArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_Info info = MPI_INFO_NULL; - -#ifdef HLRN_LUSTRE - MPI_Info_create(&info); - MPI_Info_set(info, "striping_factor", "40"); - MPI_Info_set(info, "striping_unit", "4M"); -#endif - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpShearStressValArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // each process writes common parameters of a dataSet - MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - MPI_Offset write_offset; - size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double); - - for (size_t nb = 0; nb < blocksCount; nb++) - { - write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet); - MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); - } - - MPI_File_sync(file_handler); - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeShearStressValArray time: " << finish - start << " s"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::writeRelaxationFactor(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! - - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks - dataSetParam dataSetParamStr; - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeRelaxationFactor start collect data rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - bool firstBlock = true; - size_t doubleCountInBlock = 0; - int ic = 0; - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - dataSetSmallArray[ic].globalID = block->getGlobalID(); // id of the block needed to find it while -regenerating the grid - - SPtr< CbArray3D<LBMReal, IndexerX3X2X1> > relaxationFactor3DPtr = -block->getKernel()->getDataSet()->getRelaxationFactor(); - - if (firstBlock) // when first (any) valid block... - { - //if (relaxationFactor3DPtr) - //{ - dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; - dataSetParamStr.nx[0] = static_cast<int>(relaxationFactor3DPtr->getNX1()); - dataSetParamStr.nx[1] = static_cast<int>(relaxationFactor3DPtr->getNX2()); - dataSetParamStr.nx[2] = static_cast<int>(relaxationFactor3DPtr->getNX3()); - dataSetParamStr.nx[3] = 1; - doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; - //} - //else - // break; - - firstBlock = false; - } - - if (relaxationFactor3DPtr && (dataSetParamStr.nx[0]>0) && (dataSetParamStr.nx[1]>0) && -(dataSetParamStr.nx[2]>0)) doubleValuesArray.insert(doubleValuesArray.end(), -relaxationFactor3DPtr->getDataVector().begin(), relaxationFactor3DPtr->getDataVector().end()); - - ic++; - } - } - - // register new MPI-types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeRelaxationFactor start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_Info info = MPI_INFO_NULL; - -#ifdef HLRN_LUSTRE - MPI_Info_create(&info); - MPI_Info_set(info, "striping_factor", "40"); - MPI_Info_set(info, "striping_unit", "4M"); -#endif - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpRelaxationFactor.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // each process writes common parameters of a dataSet - MPI_File_write_at(file_handler, 0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - MPI_Offset write_offset; - size_t sizeofOneDataSet = sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double); - - for (size_t nb = 0; nb < blocksCount; nb++) - { - write_offset = (MPI_Offset)(sizeof(dataSetParam) + dataSetSmallArray[nb].globalID * sizeofOneDataSet); - MPI_File_write_at(file_handler, write_offset, &dataSetSmallArray[nb], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[nb -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); - } - - MPI_File_sync(file_handler); - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::writeRelaxationFactor time: " << finish - start << " s"); - } - - delete[] dataSetSmallArray; -} -*/ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step) { int rank, size; @@ -1498,11 +782,7 @@ void MPIIOMigrationCoProcessor::writeBoundaryConds(int step) bouCond->bcVelocityX2 = (float)bcArr->bcvector[bc]->getBoundaryVelocityX2(); bouCond->bcVelocityX3 = (float)bcArr->bcvector[bc]->getBoundaryVelocityX3(); bouCond->bcDensity = (float)bcArr->bcvector[bc]->getBoundaryDensity(); - bouCond->bcLodiDensity = (float)bcArr->bcvector[bc]->getDensityLodiDensity(); - bouCond->bcLodiVelocityX1 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX1(); - bouCond->bcLodiVelocityX2 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX2(); - bouCond->bcLodiVelocityX3 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX3(); - bouCond->bcLodiLentgh = (float)bcArr->bcvector[bc]->getDensityLodiLength(); + bouCond->bcPhaseField = (float)bcArr->bcvector[bc]->getBoundaryPhaseField(); bouCond->nx1 = (float)bcArr->bcvector[bc]->nx1; bouCond->nx2 = (float)bcArr->bcvector[bc]->nx2; bouCond->nx3 = (float)bcArr->bcvector[bc]->nx3; @@ -1637,7 +917,6 @@ void MPIIOMigrationCoProcessor::restart(int step) readBlocks(step); - SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); grid->accept(metisVisitor); readDataSet(step); @@ -1668,7 +947,8 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) if (comm->isRoot()) start = MPI_Wtime(); - bool multiPhase = false; + bool multiPhase1 = false; + bool multiPhase2 = false; size_t blocksCount = 0; // quantity of the blocks, that belong to this process dataSetParam dataSetParamStr1, dataSetParamStr2, dataSetParamStr3; @@ -1699,7 +979,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) dataSetParamStr3.nx[0] * dataSetParamStr3.nx[1] * dataSetParamStr3.nx[2] * dataSetParamStr3.nx[3]; std::vector<double> doubleValuesArrayF(size_t(blocksCount * doubleCountInBlock)); // double-values in all blocks Fdistributions std::vector<double> doubleValuesArrayH1; // double-values in all blocks H1distributions - //std::vector<double> doubleValuesArrayH2; // double-values in all blocks H2distributions + std::vector<double> doubleValuesArrayH2; // double-values in all blocks H2distributions // define MPI_types depending on the block-specific information MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType); @@ -1724,6 +1004,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) MPI_File_close(&file_handler); //----------------------------------------- H1 ---------------------------------------------------- + ic = 0; MPI_Offset fsize; filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH1.bin"; rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); @@ -1732,7 +1013,7 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) MPI_File_get_size(file_handler, &fsize); if (fsize > 0) { - multiPhase = true; + multiPhase1 = true; doubleValuesArrayH1.resize(blocksCount * doubleCountInBlock); sizeofOneDataSet = size_t(doubleCountInBlock * sizeof(double)); @@ -1749,27 +1030,33 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) } MPI_File_close(&file_handler); - //----------------------------------------- H2 ---------------------------------------------------- - /*filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; + ic = 0; + filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - sizeofOneDataSet = size_t(doubleCountInBlock * sizeof(double)); - doubleValuesArrayH2.resize(blocksCount * doubleCountInBlock); - - for (int level = minInitLevel; level <= maxInitLevel; level++) + MPI_File_get_size(file_handler, &fsize); + if (fsize > 0) { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level + multiPhase2 = true; + doubleValuesArrayH2.resize(blocksCount * doubleCountInBlock); + + sizeofOneDataSet = size_t(doubleCountInBlock * sizeof(double)); + + for (int level = minInitLevel; level <= maxInitLevel; level++) { - read_offset = (MPI_Offset)(block->getGlobalID() * sizeofOneDataSet); - MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[ic * doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); - ic++; + for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level + { + read_offset = (MPI_Offset)(block->getGlobalID() * sizeofOneDataSet); + MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[ic * doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); + ic++; + } } - } - MPI_File_close(&file_handler);*/ + } + MPI_File_close(&file_handler); MPI_Type_free(&dataSetDoubleType); @@ -1782,9 +1069,9 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) } size_t index = 0; - std::vector<LBMReal> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3; - std::vector<LBMReal> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13; - //std::vector<LBMReal> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23; + std::vector<double> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3; + std::vector<double> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13; + std::vector<double> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23; size_t vectorSize1 = dataSetParamStr1.nx[0] * dataSetParamStr1.nx[1] * dataSetParamStr1.nx[2] * dataSetParamStr1.nx[3]; size_t vectorSize2 = dataSetParamStr2.nx[0] * dataSetParamStr2.nx[1] * dataSetParamStr2.nx[2] * dataSetParamStr2.nx[3]; @@ -1793,37 +1080,37 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) for (std::size_t n = 0; n < blocksCount; n++) { vectorsOfValuesF1.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize1); - if(multiPhase) + if(multiPhase1) vectorsOfValuesH11.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize1); - //vectorsOfValuesH21.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize1); + if (multiPhase2) + vectorsOfValuesH21.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize1); index += vectorSize1; vectorsOfValuesF2.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize2); - if (multiPhase) + if (multiPhase1) vectorsOfValuesH12.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize2); - //vectorsOfValuesH22.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize2); + if (multiPhase2) + vectorsOfValuesH22.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize2); index += vectorSize2; vectorsOfValuesF3.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize3); - if (multiPhase) + if (multiPhase1) vectorsOfValuesH13.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize3); - //vectorsOfValuesH23.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize3); + if (multiPhase2) + vectorsOfValuesH23.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize3); index += vectorSize3; - + SPtr<DistributionArray3D> mFdistributions(new D3Q27EsoTwist3DSplittedVector()); dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( - new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesF1, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); + new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesF1, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( - new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesF2, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3]))); + new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesF2, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3]))); dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( - vectorsOfValuesF3, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2]))); - - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX1(dataSetParamStr1.nx1); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX2(dataSetParamStr1.nx2); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX3(dataSetParamStr1.nx3); - + vectorsOfValuesF3, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2]))); + + //----------------------------------------- H1 ---------------------------------------------------- SPtr<DistributionArray3D> mH1distributions(new D3Q27EsoTwist3DSplittedVector()); - if (multiPhase) + if (multiPhase1) { dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH11, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); @@ -1837,21 +1124,31 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setNX3(dataSetParamStr1.nx3); } - /*SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector()); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( + SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector()); + if (multiPhase2) + { + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH21, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( - new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3]))); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( - vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2]))); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( + new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3]))); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2]))); + + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3); + } - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);*/ + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX1(dataSetParamStr1.nx1); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX2(dataSetParamStr1.nx2); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX3(dataSetParamStr1.nx3); // find the nesessary block and fill it SPtr<Block3D> block = grid->getBlock(dataSetArray[n].globalID); this->lbmKernel->setBlock(block); + this->lbmKernel->setNX(std::array<int, 3>{ {dataSetParamStr1.nx1, dataSetParamStr1.nx2, dataSetParamStr1.nx3}}); + UbTupleInt3 blockNX = grid->getBlockNX(); + this->lbmKernel->setNX(std::array<int, 3>{ { val<1>(blockNX), val<2>(blockNX), val<3>(blockNX) } }); SPtr<LBMKernel> kernel = this->lbmKernel->clone(); kernel->setGhostLayerWidth(dataSetArray[n].ghostLayerWidth); kernel->setCollisionFactor(dataSetArray[n].collFactor); @@ -1863,9 +1160,10 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) SPtr<DataSet3D> dataSetPtr = SPtr<DataSet3D>(new DataSet3D()); dataSetPtr->setFdistributions(mFdistributions); - if (multiPhase) + if (multiPhase1) dataSetPtr->setHdistributions(mH1distributions); - //dataSetPtr->setH2distributions(mH2distributions); + if (multiPhase2) + dataSetPtr->setH2distributions(mH2distributions); kernel->setDataSet(dataSetPtr); block->setKernel(kernel); } @@ -1891,27 +1189,21 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) if (arrPresence.isAverageDensityArrayPresent) readArray(step, AverageDensity, std::string("/cpAverageDensityArray.bin")); - // readAverageDensityArray(step); if (arrPresence.isAverageVelocityArrayPresent) readArray(step, AverageVelocity, std::string("/cpAverageVelocityArray.bin")); - // readAverageVelocityArray(step); if (arrPresence.isAverageFluktuationsArrayPresent) readArray(step, AverageFluktuations, std::string("/cpAverageFluktuationsArray.bin")); - // readAverageFluktuationsArray(step); if (arrPresence.isAverageTripleArrayPresent) readArray(step, AverageTriple, std::string("/cpAverageTripleArray.bin")); - // readAverageTripleArray(step); if (arrPresence.isShearStressValArrayPresent) readArray(step, ShearStressVal, std::string("/cpShearStressValArray.bin")); - // readShearStressValArray(step); if (arrPresence.isRelaxationFactorPresent) readArray(step, RelaxationFactor, std::string("/cpRelaxationFactor.bin")); - // readRelaxationFactor(step); if (arrPresence.isPhaseField1Present) readArray(step, PhaseField1, std::string("/cpPhaseField1.bin")); @@ -1919,6 +1211,9 @@ void MPIIOMigrationCoProcessor::readDataSet(int step) if (arrPresence.isPhaseField2Present) readArray(step, PhaseField2, std::string("/cpPhaseField2.bin")); + if (arrPresence.isPressureFieldPresent) + readArray(step, PressureField, std::string("/cpPressureField.bin")); + } void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string fname) @@ -1929,7 +1224,7 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string if (comm->isRoot()) { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray start MPI IO rank = " << rank); + UBLOG(logINFO, "MPIIOMigrationCoProcessor::readArray start fname = " << fname); UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } @@ -1997,19 +1292,19 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string //----------------------------- restore data --------------------------------- size_t index = 0; - size_t nextVectorSize = - dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; - std::vector<LBMReal> vectorsOfValues; - for (std::size_t n = 0; n < blocksCount; n++) { + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + SPtr<CbArray4D<LBMReal, IndexerX4X3X2X1>> ___4DArray; + SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> ___3DArray; + + for (std::size_t n = 0; n < blocksCount; n++) + { SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID); vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); index += nextVectorSize; // fill arrays - SPtr<CbArray4D<LBMReal, IndexerX4X3X2X1>> ___4DArray; - SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> ___3DArray; - switch (arrType) { case AverageDensity: @@ -2052,6 +1347,11 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); block->getKernel()->getDataSet()->setPhaseField2(___3DArray); break; + case PressureField: + ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); + block->getKernel()->getDataSet()->setPressureField(___3DArray); + break; default: UB_THROW(UbException(UB_EXARGS, "MPIIOMigrationCoProcessor::readArray : array type does not exist!")); break; @@ -2067,648 +1367,6 @@ void MPIIOMigrationCoProcessor::readArray(int step, Arrays arrType, std::string delete[] dataSetSmallArray; } -/*void MPIIOMigrationCoProcessor::readAverageDensityArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageDensityArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageDensityArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // read count of blocks - size_t blocksCount = 0; - dataSetParam dataSetParamStr; - memset(&dataSetParamStr, 0, sizeof(dataSetParam)); - - // read from the grid the blocks, that belong to this process - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all -blocks - - // define MPI_types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - size_t ic = 0; - MPI_Offset read_offset; - size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double)); - - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet); - MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++; - } - } - - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageDensityArray time: " << finish - start << " s"); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageDensityArray start of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - size_t index = 0; - size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++) - { - vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); - index += nextVectorSize; - - // fill mAverageDensity arrays - SPtr<AverageValuesArray3D> mAverageDensity; - //if -((dataSetParamStr.nx[0]==0)&&(dataSetParamStr.nx[1]==0)&&(dataSetParamStr.nx[2]==0)&&(dataSetParamStr.nx[3]==0)) - // mAverageDensity = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(); - //else - mAverageDensity = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, -IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], -dataSetParamStr.nx[3])); - - //std::cout << "rank=" << rank << ", dataSetArray[n].globalID=" << dataSetSmallArray[n].globalID << std::endl; - // find the nesessary block and fill it - SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID); - block->getKernel()->getDataSet()->setAverageDensity(mAverageDensity); - } - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageDensityArray end of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::readAverageVelocityArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageVelocityArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageVelocityArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // read count of blocks - size_t blocksCount = 0; - dataSetParam dataSetParamStr; - memset(&dataSetParamStr, 0, sizeof(dataSetParam)); - - // read from the grid the blocks, that belong to this process - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all -blocks - - // define MPI_types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - size_t ic = 0; - MPI_Offset read_offset; - size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double)); - - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet); - MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++; - } - } - - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageVelocityArray time: " << finish - start << " s"); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageVelocityArray start of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - size_t index = 0; - size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++) - { - vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); - index += nextVectorSize; - - // fill mAverageVelocity array - SPtr<AverageValuesArray3D> mAverageVelocity; - //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0) && -(dataSetParamStr.nx[3] == 0)) - // mAverageVelocity = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(); - //else - mAverageVelocity = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, -IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], -dataSetParamStr.nx[3])); - - // find the nesessary block and fill it - SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID); - block->getKernel()->getDataSet()->setAverageVelocity(mAverageVelocity); - } - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageVelocityArray end of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::readAverageFluktuationsArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageFluktuationsArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageFluktuationsArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // read count of blocks - size_t blocksCount = 0; - dataSetParam dataSetParamStr; - memset(&dataSetParamStr, 0, sizeof(dataSetParam)); - - // read from the grid the blocks, that belong to this process - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - int doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all -blocks - - // define MPI_types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - size_t ic = 0; - MPI_Offset read_offset; - size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double)); - - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet); - MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++; - } - } - - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageFluktuationsArray time: " << finish - start << " s"); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageFluktuationsArray start of restore of data, rank = " << -rank); UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - size_t index = 0; - size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++) - { - vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); - index += nextVectorSize; - - // fill AverageFluktuations array - SPtr<AverageValuesArray3D> mAverageFluktuations; - //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0) && -(dataSetParamStr.nx[3] == 0)) - // mAverageFluktuations = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(); - //else - mAverageFluktuations = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, -IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], -dataSetParamStr.nx[3])); - - // find the nesessary block and fill it - SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID); - block->getKernel()->getDataSet()->setAverageFluctuations(mAverageFluktuations); - } - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageFluktuationsArray end of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::readAverageTripleArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageTripleArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpAverageTripleArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // read count of blocks - size_t blocksCount = 0; - dataSetParam dataSetParamStr; - memset(&dataSetParamStr, 0, sizeof(dataSetParam)); - - // read from the grid the blocks, that belong to this process - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all -blocks - - // define MPI_types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - size_t ic = 0; - MPI_Offset read_offset; - size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double)); - - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet); - MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++; - } - } - - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageTripleArray time: " << finish - start << " s"); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageTripleArray start of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - size_t index = 0; - size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++) - { - vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); - index += nextVectorSize; - - // fill AverageTriplecorrelations array - SPtr<AverageValuesArray3D> mAverageTriplecorrelations; - //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0) && -(dataSetParamStr.nx[3] == 0)) - // mAverageTriplecorrelations = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(); - //else - mAverageTriplecorrelations = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, -IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], -dataSetParamStr.nx[3])); - - // find the nesessary block and fill it - SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID); - block->getKernel()->getDataSet()->setAverageTriplecorrelations(mAverageTriplecorrelations); - } - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readAverageTripleArray end of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::readShearStressValArray(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readShearStressValArray start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpShearStressValArray.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // read count of blocks - size_t blocksCount = 0; - dataSetParam dataSetParamStr; - memset(&dataSetParamStr, 0, sizeof(dataSetParam)); - - // read from the grid the blocks, that belong to this process - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all -blocks - - // define MPI_types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - size_t ic = 0; - MPI_Offset read_offset; - size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double)); - - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet); - MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++; - } - } - - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readShearStressValArray time: " << finish - start << " s"); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readShearStressValArray start of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - size_t index = 0; - size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++) - { - vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); - index += nextVectorSize; - - // fill ShearStressValuesArray array - SPtr<ShearStressValuesArray3D> mShearStressValues; - //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0) && -(dataSetParamStr.nx[3] == 0)) - // mShearStressValues = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(); - //else - mShearStressValues = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, -IndexerX4X3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], -dataSetParamStr.nx[3])); - - // find the nesessary block and fill it - SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID); - block->getKernel()->getDataSet()->setShearStressValues(mShearStressValues); - } - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readShearStressValArray end of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - delete[] dataSetSmallArray; -} - -void MPIIOMigrationCoProcessor::readRelaxationFactor(int step) -{ - int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Comm_size(MPI_COMM_WORLD, &size); - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readRelaxationFactor start MPI IO rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - double start {0.}; - double finish {0.}; - if (comm->isRoot()) start = MPI_Wtime(); - - MPI_File file_handler; - std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpRelaxationFactor.bin"; - int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); - if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - - // read count of blocks - size_t blocksCount = 0; - dataSetParam dataSetParamStr; - memset(&dataSetParamStr, 0, sizeof(dataSetParam)); - - // read from the grid the blocks, that belong to this process - std::vector<SPtr<Block3D>> blocksVector[25]; - int minInitLevel = this->grid->getCoarsestInitializedLevel(); - int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - grid->getBlocks(level, rank, blocksVector[level]); - blocksCount += static_cast<int>(blocksVector[level].size()); - } - - MPI_File_read_at(file_handler, (MPI_Offset)0, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); - - DataSetSmallMigration* dataSetSmallArray = new DataSetSmallMigration[blocksCount]; - size_t doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all -blocks - - // define MPI_types depending on the block-specific information - MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); - MPI_Type_commit(&dataSetDoubleType); - - size_t ic = 0; - MPI_Offset read_offset; - size_t sizeofOneDataSet = size_t(sizeof(DataSetSmallMigration) + doubleCountInBlock * sizeof(double)); - - for (int level = minInitLevel; level <= maxInitLevel; level++) - { - for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level - { - read_offset = (MPI_Offset)(sizeof(dataSetParam) + block->getGlobalID() * sizeofOneDataSet); - MPI_File_read_at(file_handler, read_offset, &dataSetSmallArray[ic], 1, dataSetSmallType, MPI_STATUS_IGNORE); - MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(DataSetSmallMigration)), &doubleValuesArray[ic -* doubleCountInBlock], 1, dataSetDoubleType, MPI_STATUS_IGNORE); ic++; - } - } - - MPI_File_close(&file_handler); - MPI_Type_free(&dataSetDoubleType); - - if (comm->isRoot()) - { - finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readRelaxationFactor time: " << finish - start << " s"); - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readRelaxationFactor start of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - size_t index = 0; - size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * -dataSetParamStr.nx[3]; std::vector<double> vectorsOfValues; for (int n = 0; n < blocksCount; n++) - { - vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); - index += nextVectorSize; - - // fill RelaxationFactor array - SPtr<RelaxationFactorArray3D> mRelaxationFactor; - //if ((dataSetParamStr.nx[0] == 0) && (dataSetParamStr.nx[1] == 0) && (dataSetParamStr.nx[2] == 0)) - // mRelaxationFactor = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(); - //else - mRelaxationFactor = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, -IndexerX3X2X1>(vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); - - // find the nesessary block and fill it - SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].globalID); - block->getKernel()->getDataSet()->setRelaxationFactor(mRelaxationFactor); - } - - if (comm->isRoot()) - { - UBLOG(logINFO, "MPIIOMigrationCoProcessor::readRelaxationFactor end of restore of data, rank = " << rank); - UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / -1073741824.0 << " GB"); - } - - delete[] dataSetSmallArray; -} -*/ - void MPIIOMigrationCoProcessor::readBoundaryConds(int step) { int rank, size; @@ -2816,11 +1474,7 @@ void MPIIOMigrationCoProcessor::readBoundaryConds(int step) bc->bcVelocityX2 = bcArray[ibc].bcVelocityX2; bc->bcVelocityX3 = bcArray[ibc].bcVelocityX3; bc->bcDensity = bcArray[ibc].bcDensity; - bc->bcLodiDensity = bcArray[ibc].bcLodiDensity; - bc->bcLodiVelocityX1 = bcArray[ibc].bcLodiVelocityX1; - bc->bcLodiVelocityX2 = bcArray[ibc].bcLodiVelocityX2; - bc->bcLodiVelocityX3 = bcArray[ibc].bcLodiVelocityX3; - bc->bcLodiLentgh = bcArray[ibc].bcLodiLentgh; + bc->bcPhaseField = bcArray[ibc].bcPhaseField; bc->nx1 = bcArray[ibc].nx1; bc->nx2 = bcArray[ibc].nx2; diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h index 1293d38d4a9f9a7ff7174db3473288cc1af70c4e..b822b783edd3628f947aadf20d6dc6109e9e3c31 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h +++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIOMigrationCoProcessor.h @@ -12,6 +12,7 @@ class UbScheduler; namespace vf::mpi {class Communicator;} class BCProcessor; class LBMKernel; +class Grid3DVisitor; //! \class MPIWriteBlocksCoProcessor //! \brief Writes the grid each timestep into the files and reads the grip from the files before regenerating @@ -26,10 +27,11 @@ public: ShearStressVal = 5, RelaxationFactor = 6, PhaseField1 = 7, - PhaseField2 = 8 + PhaseField2 = 8, + PressureField = 9 }; - MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm); + MPIIOMigrationCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, SPtr<Grid3DVisitor> mV, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm); ~MPIIOMigrationCoProcessor() override; //! Each timestep writes the grid into the files void process(double step) override; @@ -71,10 +73,6 @@ public: void clearAllFiles(int step); // void setNu(double nu); -protected: - // std::string path; - // std::shared_ptr<vf::mpi::Communicator> comm; - private: // MPI_Datatype gridParamType, block3dType; MPI_Datatype dataSetType, dataSetSmallType, dataSetDoubleType; @@ -83,7 +81,7 @@ private: MPIIODataStructures::boundCondParam boundCondParamStr; SPtr<LBMKernel> lbmKernel; SPtr<BCProcessor> bcProcessor; - // double nue; + SPtr<Grid3DVisitor> metisVisitor; }; #endif diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp index 2a35d2d203a242a1ddc89ab431f6772e49ceb98b..ea45bb14110a071724f816b3c7840ce0dfbd7327 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.cpp @@ -9,7 +9,7 @@ #include "D3Q27System.h" #include "DataSet3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMKernel.h" #include "UbFileInputASCII.h" #include "UbFileOutputASCII.h" @@ -140,7 +140,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step) DataSetRestart *dataSetArray = new DataSetRestart[blocksCount]; std::vector<double> doubleValuesArrayF; // double-values (arrays of f's) in all blocks Fdistribution std::vector<double> doubleValuesArrayH1; // double-values (arrays of f's) in all blocks H1distribution - // std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks H2distribution + std::vector<double> doubleValuesArrayH2; // double-values (arrays of f's) in all blocks H2distribution if (comm->isRoot()) { @@ -148,7 +148,8 @@ void MPIIORestartCoProcessor::writeDataSet(int step) UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } - bool multiPhase = false; + bool multiPhase1 = false; + bool multiPhase2 = false; DSArraysPresence arrPresence; bool firstBlock = true; int doubleCountInBlock = 0; @@ -188,36 +189,40 @@ void MPIIORestartCoProcessor::writeDataSet(int step) D3Q27EsoTwist3DSplittedVectorPtrH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getHdistributions()); if (D3Q27EsoTwist3DSplittedVectorPtrH1 != 0) { - multiPhase = true; + multiPhase1 = true; localDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getLocalDistributions(); nonLocalDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getNonLocalDistributions(); zeroDistributionsH1 = D3Q27EsoTwist3DSplittedVectorPtrH1->getZeroDistributions(); } - /*D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions()); + D3Q27EsoTwist3DSplittedVectorPtrH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(block->getKernel()->getDataSet()->getH2distributions()); if (D3Q27EsoTwist3DSplittedVectorPtrH2 != 0) { + multiPhase2 = true; localDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getLocalDistributions(); nonLocalDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getNonLocalDistributions(); zeroDistributionsH2 = D3Q27EsoTwist3DSplittedVectorPtrH2->getZeroDistributions(); - }*/ + } if (firstBlock) // when first (any) valid block... { - if (localDistributionsF) { + if (localDistributionsF) + { dataSetParamStr1.nx[0] = static_cast<int>(localDistributionsF->getNX1()); dataSetParamStr1.nx[1] = static_cast<int>(localDistributionsF->getNX2()); dataSetParamStr1.nx[2] = static_cast<int>(localDistributionsF->getNX3()); dataSetParamStr1.nx[3] = static_cast<int>(localDistributionsF->getNX4()); } - if (nonLocalDistributionsF) { + if (nonLocalDistributionsF) + { dataSetParamStr2.nx[0] = static_cast<int>(nonLocalDistributionsF->getNX1()); dataSetParamStr2.nx[1] = static_cast<int>(nonLocalDistributionsF->getNX2()); dataSetParamStr2.nx[2] = static_cast<int>(nonLocalDistributionsF->getNX3()); dataSetParamStr2.nx[3] = static_cast<int>(nonLocalDistributionsF->getNX4()); } - if (zeroDistributionsF) { + if (zeroDistributionsF) + { dataSetParamStr3.nx[0] = static_cast<int>(zeroDistributionsF->getNX1()); dataSetParamStr3.nx[1] = static_cast<int>(zeroDistributionsF->getNX2()); dataSetParamStr3.nx[2] = static_cast<int>(zeroDistributionsF->getNX3()); @@ -281,6 +286,12 @@ void MPIIORestartCoProcessor::writeDataSet(int step) else arrPresence.isPhaseField2Present = false; + SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> pressureFieldPtr = block->getKernel()->getDataSet()->getPressureField(); + if (pressureFieldPtr) + arrPresence.isPressureFieldPresent = true; + else + arrPresence.isPressureFieldPresent = false; + firstBlock = false; } @@ -291,7 +302,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step) if (zeroDistributionsF && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0)) doubleValuesArrayF.insert(doubleValuesArrayF.end(), zeroDistributionsF->getDataVector().begin(), zeroDistributionsF->getDataVector().end()); - if (multiPhase) + if (multiPhase1) { if (localDistributionsH1 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0)) doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), localDistributionsH1->getDataVector().begin(), localDistributionsH1->getDataVector().end()); @@ -300,15 +311,17 @@ void MPIIORestartCoProcessor::writeDataSet(int step) if (zeroDistributionsH1 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0)) doubleValuesArrayH1.insert(doubleValuesArrayH1.end(), zeroDistributionsH1->getDataVector().begin(), zeroDistributionsH1->getDataVector().end()); } - - /*if (localDistributionsH2 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0)) - doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), localDistributionsH2->getDataVector().begin(), localDistributionsH2->getDataVector().end()); - if (nonLocalDistributionsH2 && (dataSetParamStr2.nx[0] > 0) && (dataSetParamStr2.nx[1] > 0) && (dataSetParamStr2.nx[2] > 0) && (dataSetParamStr2.nx[3] > 0)) - doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), nonLocalDistributionsH2->getDataVector().begin(), nonLocalDistributionsH2->getDataVector().end()); - if (zeroDistributionsH2 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0)) - doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), zeroDistributionsH2->getDataVector().begin(), zeroDistributionsH2->getDataVector().end());*/ - - ic++; + if (multiPhase2) + { + if (localDistributionsH2 && (dataSetParamStr1.nx[0] > 0) && (dataSetParamStr1.nx[1] > 0) && (dataSetParamStr1.nx[2] > 0) && (dataSetParamStr1.nx[3] > 0)) + doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), localDistributionsH2->getDataVector().begin(), localDistributionsH2->getDataVector().end()); + if (nonLocalDistributionsH2 && (dataSetParamStr2.nx[0] > 0) && (dataSetParamStr2.nx[1] > 0) && (dataSetParamStr2.nx[2] > 0) && (dataSetParamStr2.nx[3] > 0)) + doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), nonLocalDistributionsH2->getDataVector().begin(), nonLocalDistributionsH2->getDataVector().end()); + if (zeroDistributionsH2 && (dataSetParamStr3.nx[0] > 0) && (dataSetParamStr3.nx[1] > 0) && (dataSetParamStr3.nx[2] > 0)) + doubleValuesArrayH2.insert(doubleValuesArrayH2.end(), zeroDistributionsH2->getDataVector().begin(), zeroDistributionsH2->getDataVector().end()); + } + + ic++; } } @@ -381,7 +394,7 @@ void MPIIORestartCoProcessor::writeDataSet(int step) MPI_File_close(&file_handler); //------------------------------------------------------------------------------------------------------------------ - if (multiPhase) + if (multiPhase1) { filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH1.bin"; rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); @@ -396,20 +409,23 @@ void MPIIORestartCoProcessor::writeDataSet(int step) MPI_File_close(&file_handler); } - //-------------------------------------------------------------------------------------------------------------------- - /*filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; - rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); - if (rc != MPI_SUCCESS) - throw UbException(UB_EXARGS, "couldn't open file " + filename); + //-------------------------------------------------------------------------------------------------------------------- + if (multiPhase2) + { + filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; + rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); + if (rc != MPI_SUCCESS) + throw UbException(UB_EXARGS, "couldn't open file " + filename); - // each process writes the dataSet arrays - if (doubleValuesArrayH1.size() > 0) - MPI_File_write_at(file_handler, write_offset, &doubleValuesArrayH2[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); + // each process writes the dataSet arrays + if (doubleValuesArrayH2.size() > 0) + MPI_File_write_at(file_handler, write_offset, &doubleValuesArrayH2[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); - MPI_File_sync(file_handler); - MPI_File_close(&file_handler);*/ + MPI_File_sync(file_handler); + MPI_File_close(&file_handler); + } + //------------------------------------------------------------------------------------------------------------------------ - //-------------------------------- MPI_Type_free(&dataSetDoubleType); delete[] dataSetArray; @@ -430,6 +446,33 @@ void MPIIORestartCoProcessor::writeDataSet(int step) MPI_File_close(&file_handler1); if (arrPresence.isAverageDensityArrayPresent) + write4DArray(step, AverageDensity, std::string("/cpAverageDensityArray.bin")); + + if (arrPresence.isAverageVelocityArrayPresent) + write4DArray(step, AverageVelocity, std::string("/cpAverageVelocityArray.bin")); + + if (arrPresence.isAverageFluktuationsArrayPresent) + write4DArray(step, AverageFluktuations, std::string("/cpAverageFluktuationsArray.bin")); + + if (arrPresence.isAverageTripleArrayPresent) + write4DArray(step, AverageTriple, std::string("/cpAverageTripleArray.bin")); + + if (arrPresence.isShearStressValArrayPresent) + write4DArray(step, ShearStressVal, std::string("/cpShearStressValArray.bin")); + + if (arrPresence.isRelaxationFactorPresent) + write3DArray(step, RelaxationFactor, std::string("/cpRelaxationFactor.bin")); + + if (arrPresence.isPhaseField1Present) + write3DArray(step, PhaseField1, std::string("/cpPhaseField1.bin")); + + if (arrPresence.isPhaseField2Present) + write3DArray(step, PhaseField2, std::string("/cpPhaseField2.bin")); + + if (arrPresence.isPressureFieldPresent) + write3DArray(step, PressureField, std::string("/cpPressureField.bin")); + + /*if (arrPresence.isAverageDensityArrayPresent) writeAverageDensityArray(step); if (arrPresence.isAverageVelocityArrayPresent) @@ -452,9 +495,327 @@ void MPIIORestartCoProcessor::writeDataSet(int step) if (arrPresence.isPhaseField2Present) writePhaseField(step, 2); + + if (arrPresence.isPressureFieldPresent) + writePressureField(step);*/ + +} + +void MPIIORestartCoProcessor::write4DArray(int step, Arrays arrayType, std::string fname) +{ + int rank, size; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! + + std::vector<SPtr<Block3D>> blocksVector[25]; + int minInitLevel = this->grid->getCoarsestInitializedLevel(); + int maxInitLevel = this->grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + grid->getBlocks(level, rank, blocksVector[level]); + blocksCount += static_cast<int>(blocksVector[level].size()); + } + + DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount]; + std::vector<double> doubleValuesArray; // double-values of the AverageDensityArray in all blocks + dataSetParam dataSetParamStr; + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::writeAverageDensityArray start collect data to file = " << fname); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + bool firstBlock = true; + int doubleCountInBlock = 0; + int ic = 0; + SPtr<CbArray4D<LBMReal, IndexerX4X3X2X1>> ___Array; + + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level + { + dataSetSmallArray[ic].x1 = block->getX1(); // coordinates of the block needed to find it while regenerating the grid + dataSetSmallArray[ic].x2 = block->getX2(); + dataSetSmallArray[ic].x3 = block->getX3(); + dataSetSmallArray[ic].level = block->getLevel(); + + switch (arrayType) + { + case AverageDensity: + ___Array = block->getKernel()->getDataSet()->getAverageDensity(); + break; + case AverageVelocity: + ___Array = block->getKernel()->getDataSet()->getAverageVelocity(); + break; + case AverageFluktuations: + ___Array = block->getKernel()->getDataSet()->getAverageFluctuations(); + break; + case AverageTriple: + ___Array = block->getKernel()->getDataSet()->getAverageTriplecorrelations(); + break; + case ShearStressVal: + ___Array = block->getKernel()->getDataSet()->getShearStressValues(); + break; + default: + UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::write4DArray : 4D array type does not exist!")); + break; + } + + if (firstBlock) // when first (any) valid block... + { + dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; + dataSetParamStr.nx[0] = static_cast<int>(___Array->getNX1()); + dataSetParamStr.nx[1] = static_cast<int>(___Array->getNX2()); + dataSetParamStr.nx[2] = static_cast<int>(___Array->getNX3()); + dataSetParamStr.nx[3] = static_cast<int>(___Array->getNX4()); + doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + + firstBlock = false; + } + + if (___Array && (dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0) && (dataSetParamStr.nx[3] > 0)) + doubleValuesArray.insert(doubleValuesArray.end(), ___Array->getDataVector().begin(), ___Array->getDataVector().end()); + + ic++; + } + } + + // register new MPI-types depending on the block-specific information + MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType); + MPI_Type_commit(&dataSetDoubleType); + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::write4DArray start MPI IO rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + // write to the file + // all processes calculate their offsets (quantity of bytes that the process is going to write) + // and notify the next process (with the rank = rank + 1) + MPI_Offset write_offset = (MPI_Offset)(size * sizeof(int)); + size_t next_write_offset = 0; + + if (size > 1) + { + if (rank == 0) + { + next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD); + } + else + { + MPI_Recv(&write_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + if (rank < size - 1) + MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD); + } + } + + double start{ 0. }; + double finish{ 0. }; + if (comm->isRoot()) + start = MPI_Wtime(); + + MPI_Info info = MPI_INFO_NULL; + +#ifdef HLRN_LUSTRE + MPI_Info_create(&info); + MPI_Info_set(info, "striping_factor", "40"); + MPI_Info_set(info, "striping_unit", "4M"); +#endif + + MPI_File file_handler; + std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + fname; + int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); + if (rc != MPI_SUCCESS) + throw UbException(UB_EXARGS, "couldn't open file " + filename); + + // each process writes the quantity of it's blocks + MPI_File_write_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE); + // each process writes common parameters of a dataSet + MPI_File_write_at(file_handler, write_offset, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); + // each process writes data identifying blocks + MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount, dataSetSmallType, MPI_STATUS_IGNORE); + // each process writes the dataSet arrays + if (doubleValuesArray.size() > 0) + MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)), + &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); + + MPI_File_sync(file_handler); + MPI_File_close(&file_handler); + MPI_Type_free(&dataSetDoubleType); + + if (comm->isRoot()) + { + finish = MPI_Wtime(); + UBLOG(logINFO, "MPIIORestartCoProcessor::write4DArray time: " << finish - start << " s"); + } + + delete[] dataSetSmallArray; +} + +void MPIIORestartCoProcessor::write3DArray(int step, Arrays arrayType, std::string fname) +{ + int rank, size; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! + + std::vector<SPtr<Block3D>> blocksVector[25]; + int minInitLevel = this->grid->getCoarsestInitializedLevel(); + int maxInitLevel = this->grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + grid->getBlocks(level, rank, blocksVector[level]); + blocksCount += static_cast<int>(blocksVector[level].size()); + } + + DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount]; + std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks + dataSetParam dataSetParamStr; + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::write3DArray start collect data to file = " << fname); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + bool firstBlock = true; + size_t doubleCountInBlock = 0; + int ic = 0; + SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> ___Array; + + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level + { + dataSetSmallArray[ic].x1 = block->getX1(); // coordinates of the block needed to find it while regenerating the grid + dataSetSmallArray[ic].x2 = block->getX2(); + dataSetSmallArray[ic].x3 = block->getX3(); + dataSetSmallArray[ic].level = block->getLevel(); + + switch (arrayType) + { + case RelaxationFactor: + ___Array = block->getKernel()->getDataSet()->getRelaxationFactor(); + break; + case PhaseField1: + ___Array = block->getKernel()->getDataSet()->getPhaseField(); + break; + case PhaseField2: + ___Array = block->getKernel()->getDataSet()->getPhaseField2(); + break; + case PressureField: + ___Array = block->getKernel()->getDataSet()->getPressureField(); + break; + default: + UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::write3DArray : 3D array type does not exist!")); + break; + } + + if (firstBlock) // when first (any) valid block... + { + dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; + dataSetParamStr.nx[0] = static_cast<int>(___Array->getNX1()); + dataSetParamStr.nx[1] = static_cast<int>(___Array->getNX2()); + dataSetParamStr.nx[2] = static_cast<int>(___Array->getNX3()); + dataSetParamStr.nx[3] = 1; + doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + + firstBlock = false; + } + + if (___Array && (dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0)) + doubleValuesArray.insert(doubleValuesArray.end(), ___Array->getDataVector().begin(), ___Array->getDataVector().end()); + + ic++; + } + } + + // register new MPI-types depending on the block-specific information + MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType); + MPI_Type_commit(&dataSetDoubleType); + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::write3DArray start MPI IO rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + // write to the file + // all processes calculate their offsets (quantity of bytes that the process is going to write) + // and notify the next process (with the rank = rank + 1) + MPI_Offset write_offset = (MPI_Offset)(size * sizeof(int)); + size_t next_write_offset = 0; + + if (size > 1) + { + if (rank == 0) + { + next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD); + } + else + { + MPI_Recv(&write_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + if (rank < size - 1) + MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD); + } +} + + + double start{ 0. }; + double finish{ 0. }; + if (comm->isRoot()) + start = MPI_Wtime(); + + MPI_Info info = MPI_INFO_NULL; + +#ifdef HLRN_LUSTRE + MPI_Info_create(&info); + MPI_Info_set(info, "striping_factor", "40"); + MPI_Info_set(info, "striping_unit", "4M"); +#endif + + MPI_File file_handler; + std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + fname; + int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); + if (rc != MPI_SUCCESS) + throw UbException(UB_EXARGS, "couldn't open file " + filename); + + // each process writes the quantity of it's blocks + MPI_File_write_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE); + // each process writes common parameters of a dataSet + MPI_File_write_at(file_handler, write_offset, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); + // each process writes data identifying blocks + MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount, + dataSetSmallType, MPI_STATUS_IGNORE); + // each process writes the dataSet arrays + if (doubleValuesArray.size() > 0) + MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)), + &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); + + + MPI_File_sync(file_handler); + MPI_File_close(&file_handler); + MPI_Type_free(&dataSetDoubleType); + + if (comm->isRoot()) + { + finish = MPI_Wtime(); + UBLOG(logINFO, "MPIIORestartCoProcessor ::write3DArray time: " << finish - start << " s"); + } + + delete[] dataSetSmallArray; } -void MPIIORestartCoProcessor::writeAverageDensityArray(int step) +/*void MPIIORestartCoProcessor::writeAverageDensityArray(int step) { int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &rank); @@ -1287,7 +1648,150 @@ void MPIIORestartCoProcessor::writeRelaxationFactor(int step) delete[] dataSetSmallArray; } -void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN) +void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN) +{ + int rank, size; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + int blocksCount = 0; // quantity of blocks in the grid, max 2147483648 blocks! + + std::vector<SPtr<Block3D>> blocksVector[25]; + int minInitLevel = this->grid->getCoarsestInitializedLevel(); + int maxInitLevel = this->grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + grid->getBlocks(level, rank, blocksVector[level]); + blocksCount += static_cast<int>(blocksVector[level].size()); + } + + DataSetSmallRestart *dataSetSmallArray = new DataSetSmallRestart[blocksCount]; + std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks + dataSetParam dataSetParamStr; + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField start collect data rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + bool firstBlock = true; + int doubleCountInBlock = 0; + int ic = 0; + SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> PhaseField3DPtr; + + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level + { + dataSetSmallArray[ic].x1 = block->getX1(); // coordinates of the block needed to find it while regenerating the grid + dataSetSmallArray[ic].x2 = block->getX2(); + dataSetSmallArray[ic].x3 = block->getX3(); + dataSetSmallArray[ic].level = block->getLevel(); + + if(fieldN == 1) + PhaseField3DPtr = block->getKernel()->getDataSet()->getPhaseField(); + else + PhaseField3DPtr = block->getKernel()->getDataSet()->getPhaseField2(); + + if (firstBlock) // when first (any) valid block... + { + dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; + dataSetParamStr.nx[0] = static_cast<int>(PhaseField3DPtr->getNX1()); + dataSetParamStr.nx[1] = static_cast<int>(PhaseField3DPtr->getNX2()); + dataSetParamStr.nx[2] = static_cast<int>(PhaseField3DPtr->getNX3()); + dataSetParamStr.nx[3] = 1; + doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::cout << "writePhaseField"<<fieldN<< " = " << dataSetParamStr.nx[0] << " " << dataSetParamStr.nx[1] << " " << dataSetParamStr.nx[2] << std::endl; + firstBlock = false; + } + if ((dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0)) + doubleValuesArray.insert(doubleValuesArray.end(), PhaseField3DPtr->getDataVector().begin(), PhaseField3DPtr->getDataVector().end()); + + ic++; + } + } + + // register new MPI-types depending on the block-specific information + MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); + MPI_Type_commit(&dataSetDoubleType); + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField start MPI IO rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + // write to the file + // all processes calculate their offsets (quantity of bytes that the process is going to write) + // and notify the next process (with the rank = rank + 1) + MPI_Offset write_offset = (MPI_Offset)(size * sizeof(int)); + size_t next_write_offset = 0; + + if (size > 1) + { + if (rank == 0) + { + next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD); + } + else + { + MPI_Recv(&write_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + if (rank < size - 1) + MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD); + } + } + + + double start {0.}; + double finish {0.}; + if (comm->isRoot()) + start = MPI_Wtime(); + + MPI_Info info = MPI_INFO_NULL; + +#ifdef HLRN_LUSTRE + MPI_Info_create(&info); + MPI_Info_set(info, "striping_factor", "40"); + MPI_Info_set(info, "striping_unit", "4M"); +#endif + + MPI_File file_handler; + std::string filename; + if(fieldN == 1) filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPhaseField1.bin"; + else filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPhaseField2.bin"; + int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); + if (rc != MPI_SUCCESS) + throw UbException(UB_EXARGS, "couldn't open file " + filename); + + // each process writes the quantity of it's blocks + MPI_File_write_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE); + // each process writes common parameters of a dataSet + MPI_File_write_at(file_handler, write_offset, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); + // each process writes data identifying blocks + MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount, + dataSetSmallType, MPI_STATUS_IGNORE); + // each process writes the dataSet arrays + if (doubleValuesArray.size() > 0) + MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)), + &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); + + MPI_File_sync(file_handler); + MPI_File_close(&file_handler); + MPI_Type_free(&dataSetDoubleType); + + if (comm->isRoot()) + { + finish = MPI_Wtime(); + UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField time: " << finish - start << " s"); + } + + delete[] dataSetSmallArray; +} + +void MPIIORestartCoProcessor::writePressureField(int step) { int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &rank); @@ -1298,28 +1802,28 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN) std::vector<SPtr<Block3D>> blocksVector[25]; int minInitLevel = this->grid->getCoarsestInitializedLevel(); int maxInitLevel = this->grid->getFinestInitializedLevel(); - for (int level = minInitLevel; level <= maxInitLevel; level++) + for (int level = minInitLevel; level <= maxInitLevel; level++) { grid->getBlocks(level, rank, blocksVector[level]); blocksCount += static_cast<int>(blocksVector[level].size()); } - DataSetSmallRestart *dataSetSmallArray = new DataSetSmallRestart[blocksCount]; + DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount]; std::vector<double> doubleValuesArray; // double-values (arrays of f's) in all blocks dataSetParam dataSetParamStr; - if (comm->isRoot()) + if (comm->isRoot()) { - UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField start collect data rank = " << rank); + UBLOG(logINFO, "MPIIORestartCoProcessor::writePressureField start collect data rank = " << rank); UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } - bool firstBlock = true; + bool firstBlock = true; int doubleCountInBlock = 0; - int ic = 0; - SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> PhaseField3DPtr; + int ic = 0; + SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> PressureField3DPtr; - for (int level = minInitLevel; level <= maxInitLevel; level++) + for (int level = minInitLevel; level <= maxInitLevel; level++) { for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level { @@ -1328,53 +1832,53 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN) dataSetSmallArray[ic].x3 = block->getX3(); dataSetSmallArray[ic].level = block->getLevel(); - if(fieldN == 1) - PhaseField3DPtr = block->getKernel()->getDataSet()->getPhaseField(); - else - PhaseField3DPtr = block->getKernel()->getDataSet()->getPhaseField2(); + PressureField3DPtr = block->getKernel()->getDataSet()->getPressureField(); if (firstBlock) // when first (any) valid block... { dataSetParamStr.nx1 = dataSetParamStr.nx2 = dataSetParamStr.nx3 = 0; - dataSetParamStr.nx[0] = static_cast<int>(PhaseField3DPtr->getNX1()); - dataSetParamStr.nx[1] = static_cast<int>(PhaseField3DPtr->getNX2()); - dataSetParamStr.nx[2] = static_cast<int>(PhaseField3DPtr->getNX3()); + dataSetParamStr.nx[0] = static_cast<int>(PressureField3DPtr->getNX1()); + dataSetParamStr.nx[1] = static_cast<int>(PressureField3DPtr->getNX2()); + dataSetParamStr.nx[2] = static_cast<int>(PressureField3DPtr->getNX3()); dataSetParamStr.nx[3] = 1; doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; firstBlock = false; } - if ((dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0)) - doubleValuesArray.insert(doubleValuesArray.end(), PhaseField3DPtr->getDataVector().begin(), PhaseField3DPtr->getDataVector().end()); + if ((dataSetParamStr.nx[0] > 0) && (dataSetParamStr.nx[1] > 0) && (dataSetParamStr.nx[2] > 0)) + doubleValuesArray.insert(doubleValuesArray.end(), PressureField3DPtr->getDataVector().begin(), + PressureField3DPtr->getDataVector().end()); + ic++; } } - - // register new MPI-types depending on the block-specific information + //doubleValuesArrayRW.assign(doubleValuesArray.begin(), doubleValuesArray.end()); + //std::cout << "doubleValuesArrayRW = " << doubleValuesArrayRW.size() << std::endl; + // register new MPI-types depending on the block-specific information MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); MPI_Type_commit(&dataSetDoubleType); - if (comm->isRoot()) + if (comm->isRoot()) { - UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField start MPI IO rank = " << rank); + UBLOG(logINFO, "MPIIORestartCoProcessor::writePressureField start MPI IO rank = " << rank); UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); } // write to the file // all processes calculate their offsets (quantity of bytes that the process is going to write) // and notify the next process (with the rank = rank + 1) - MPI_Offset write_offset = (MPI_Offset)(size * sizeof(int)); + MPI_Offset write_offset = (MPI_Offset)(size * sizeof(int)); size_t next_write_offset = 0; - if (size > 1) + if (size > 1) { - if (rank == 0) + if (rank == 0) { next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); MPI_Send(&next_write_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD); - } - else + } + else { MPI_Recv(&write_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); next_write_offset = write_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); @@ -1383,9 +1887,9 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN) } } - - double start {0.}; - double finish {0.}; + + double start{ 0. }; + double finish{ 0. }; if (comm->isRoot()) start = MPI_Wtime(); @@ -1398,9 +1902,7 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN) #endif MPI_File file_handler; - std::string filename; - if(fieldN == 1) filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPhaseField1.bin"; - else filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPhaseField2.bin"; + std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPressureField.bin"; int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, info, &file_handler); if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); @@ -1411,24 +1913,24 @@ void MPIIORestartCoProcessor::writePhaseField(int step, int fieldN) MPI_File_write_at(file_handler, write_offset, &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); // each process writes data identifying blocks MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount, - dataSetSmallType, MPI_STATUS_IGNORE); + dataSetSmallType, MPI_STATUS_IGNORE); // each process writes the dataSet arrays if (doubleValuesArray.size() > 0) MPI_File_write_at(file_handler, (MPI_Offset)(write_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)), - &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); + &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); MPI_File_sync(file_handler); MPI_File_close(&file_handler); MPI_Type_free(&dataSetDoubleType); - if (comm->isRoot()) + if (comm->isRoot()) { finish = MPI_Wtime(); - UBLOG(logINFO, "MPIIORestartCoProcessor::writePhaseField time: " << finish - start << " s"); + UBLOG(logINFO, "MPIIORestartCoProcessor::writePressureField time: " << finish - start << " s"); } delete[] dataSetSmallArray; -} +}*/ void MPIIORestartCoProcessor::writeBoundaryConds(int step) { @@ -1495,11 +1997,7 @@ void MPIIORestartCoProcessor::writeBoundaryConds(int step) bouCond->bcVelocityX2 = (float)bcArr->bcvector[bc]->getBoundaryVelocityX2(); bouCond->bcVelocityX3 = (float)bcArr->bcvector[bc]->getBoundaryVelocityX3(); bouCond->bcDensity = (float)bcArr->bcvector[bc]->getBoundaryDensity(); - bouCond->bcLodiDensity = (float)bcArr->bcvector[bc]->getDensityLodiDensity(); - bouCond->bcLodiVelocityX1 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX1(); - bouCond->bcLodiVelocityX2 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX2(); - bouCond->bcLodiVelocityX3 = (float)bcArr->bcvector[bc]->getDensityLodiVelocityX3(); - bouCond->bcLodiLentgh = (float)bcArr->bcvector[bc]->getDensityLodiLength(); + bouCond->bcPhaseField = (float)bcArr->bcvector[bc]->getBoundaryPhaseField(); bouCond->nx1 = (float)bcArr->bcvector[bc]->nx1; bouCond->nx2 = (float)bcArr->bcvector[bc]->nx2; bouCond->nx3 = (float)bcArr->bcvector[bc]->nx3; @@ -1685,7 +2183,8 @@ void MPIIORestartCoProcessor::readDataSet(int step) // calculate the read offset MPI_Offset read_offset = (MPI_Offset)(size * sizeof(int)); size_t next_read_offset = 0; - bool multiPhase = false; + bool multiPhase1 = false; + bool multiPhase2 = false; // read count of blocks int blocksCount = 0; @@ -1702,7 +2201,7 @@ void MPIIORestartCoProcessor::readDataSet(int step) dataSetParamStr3.nx[0] * dataSetParamStr3.nx[1] * dataSetParamStr3.nx[2] * dataSetParamStr3.nx[3]; std::vector<double> doubleValuesArrayF(size_t(blocksCount * doubleCountInBlock)); // double-values in all blocks Fdistributions std::vector<double> doubleValuesArrayH1; // double-values in all blocks H1distributions - //std::vector<double> doubleValuesArrayH2; // double-values in all blocks H2distributions + std::vector<double> doubleValuesArrayH2; // double-values in all blocks H2distributions // define MPI_types depending on the block-specific information MPI_Type_contiguous(int(doubleCountInBlock), MPI_DOUBLE, &dataSetDoubleType); @@ -1738,21 +2237,27 @@ void MPIIORestartCoProcessor::readDataSet(int step) MPI_File_get_size(file_handler, &fsize); if (fsize > 0) { - multiPhase = true; + multiPhase1 = true; doubleValuesArrayH1.resize(blocksCount * doubleCountInBlock); MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH1[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); } MPI_File_close(&file_handler); //-------------------------------------- H2 ----------------------------- - /*filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; + filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpDataSetH2.bin"; rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); if (rc != MPI_SUCCESS) throw UbException(UB_EXARGS, "couldn't open file " + filename); - doubleValuesArrayH2.resize(blocksCount * doubleCountInBlock); - MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); - MPI_File_close(&file_handler);*/ + MPI_File_get_size(file_handler, &fsize); + if (fsize > 0) + { + multiPhase2 = true; + doubleValuesArrayH2.resize(blocksCount * doubleCountInBlock); + MPI_File_read_at(file_handler, read_offset, &doubleValuesArrayH2[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); + } + MPI_File_close(&file_handler); + //------------------------------------------------------------------- MPI_Type_free(&dataSetDoubleType); @@ -1765,9 +2270,9 @@ void MPIIORestartCoProcessor::readDataSet(int step) } size_t index = 0; - std::vector<LBMReal> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3; - std::vector<LBMReal> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13; - //std::vector<LBMReal> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23; + std::vector<double> vectorsOfValuesF1, vectorsOfValuesF2, vectorsOfValuesF3; + std::vector<double> vectorsOfValuesH11, vectorsOfValuesH12, vectorsOfValuesH13; + std::vector<double> vectorsOfValuesH21, vectorsOfValuesH22, vectorsOfValuesH23; size_t vectorSize1 = dataSetParamStr1.nx[0] * dataSetParamStr1.nx[1] * dataSetParamStr1.nx[2] * dataSetParamStr1.nx[3]; size_t vectorSize2 = dataSetParamStr2.nx[0] * dataSetParamStr2.nx[1] * dataSetParamStr2.nx[2] * dataSetParamStr2.nx[3]; size_t vectorSize3 = dataSetParamStr3.nx[0] * dataSetParamStr3.nx[1] * dataSetParamStr3.nx[2] * dataSetParamStr3.nx[3]; @@ -1775,21 +2280,24 @@ void MPIIORestartCoProcessor::readDataSet(int step) for (int n = 0; n < blocksCount; n++) { vectorsOfValuesF1.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize1); - if (multiPhase) + if (multiPhase1) vectorsOfValuesH11.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize1); - //vectorsOfValuesH21.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize1); + if (multiPhase2) + vectorsOfValuesH21.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize1); index += vectorSize1; vectorsOfValuesF2.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize2); - if (multiPhase) + if (multiPhase1) vectorsOfValuesH12.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize2); - //vectorsOfValuesH22.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize2); + if (multiPhase2) + vectorsOfValuesH22.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize2); index += vectorSize2; vectorsOfValuesF3.assign(doubleValuesArrayF.data() + index, doubleValuesArrayF.data() + index + vectorSize3); - if (multiPhase) + if (multiPhase1) vectorsOfValuesH13.assign(doubleValuesArrayH1.data() + index, doubleValuesArrayH1.data() + index + vectorSize3); - //vectorsOfValuesH23.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize3); + if (multiPhase2) + vectorsOfValuesH23.assign(doubleValuesArrayH2.data() + index, doubleValuesArrayH2.data() + index + vectorSize3); index += vectorSize3; SPtr<DistributionArray3D> mFdistributions(new D3Q27EsoTwist3DSplittedVector()); @@ -1805,7 +2313,7 @@ void MPIIORestartCoProcessor::readDataSet(int step) dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mFdistributions)->setNX3(dataSetParamStr1.nx3); SPtr<DistributionArray3D> mH1distributions(new D3Q27EsoTwist3DSplittedVector()); - if (multiPhase) + if (multiPhase1) { dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH11, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); @@ -1818,22 +2326,27 @@ void MPIIORestartCoProcessor::readDataSet(int step) dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setNX2(dataSetParamStr1.nx2); dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH1distributions)->setNX3(dataSetParamStr1.nx3); } - /*SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector()); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( - new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH21, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( - new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3]))); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( - vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2]))); - - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2); - dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3);*/ - + + SPtr<DistributionArray3D> mH2distributions(new D3Q27EsoTwist3DSplittedVector()); + if (multiPhase2) + { + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( + new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH21, dataSetParamStr1.nx[0], dataSetParamStr1.nx[1], dataSetParamStr1.nx[2], dataSetParamStr1.nx[3]))); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNonLocalDistributions(CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr( + new CbArray4D<LBMReal, IndexerX4X3X2X1>(vectorsOfValuesH22, dataSetParamStr2.nx[0], dataSetParamStr2.nx[1], dataSetParamStr2.nx[2], dataSetParamStr2.nx[3]))); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setZeroDistributions(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValuesH23, dataSetParamStr3.nx[0], dataSetParamStr3.nx[1], dataSetParamStr3.nx[2]))); + + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX1(dataSetParamStr1.nx1); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX2(dataSetParamStr1.nx2); + dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(mH2distributions)->setNX3(dataSetParamStr1.nx3); + } + // find the nesessary block and fill it SPtr<Block3D> block = grid->getBlock(dataSetArray[n].x1, dataSetArray[n].x2, dataSetArray[n].x3, dataSetArray[n].level); this->lbmKernel->setBlock(block); + this->lbmKernel->setNX(std::array<int, 3>{{dataSetParamStr1.nx1, dataSetParamStr1.nx2, dataSetParamStr1.nx3}}); SPtr<LBMKernel> kernel = this->lbmKernel->clone(); kernel->setGhostLayerWidth(dataSetArray[n].ghostLayerWidth); kernel->setCollisionFactor(dataSetArray[n].collFactor); @@ -1845,9 +2358,10 @@ void MPIIORestartCoProcessor::readDataSet(int step) SPtr<DataSet3D> dataSetPtr = SPtr<DataSet3D>(new DataSet3D()); dataSetPtr->setFdistributions(mFdistributions); - if (multiPhase) + if (multiPhase1) dataSetPtr->setHdistributions(mH1distributions); - //dataSetPtr->setH2distributions(mH2distributions); + if (multiPhase2) + dataSetPtr->setH2distributions(mH2distributions); kernel->setDataSet(dataSetPtr); block->setKernel(kernel); } @@ -1871,7 +2385,7 @@ void MPIIORestartCoProcessor::readDataSet(int step) MPI_File_read_at(file_handler1, (MPI_Offset)0, &arrPresence, 1, arrayPresenceType, MPI_STATUS_IGNORE); MPI_File_close(&file_handler1); - if (arrPresence.isAverageDensityArrayPresent) + /*if (arrPresence.isAverageDensityArrayPresent) readAverageDensityArray(step); if (arrPresence.isAverageVelocityArrayPresent) @@ -1894,9 +2408,194 @@ void MPIIORestartCoProcessor::readDataSet(int step) if (arrPresence.isPhaseField2Present) readPhaseField(step, 2); + + if (arrPresence.isPressureFieldPresent) + readPressureField(step);*/ + + if (arrPresence.isAverageDensityArrayPresent) + readArray(step, AverageDensity, std::string("/cpAverageDensityArray.bin")); + + if (arrPresence.isAverageVelocityArrayPresent) + readArray(step, AverageVelocity, std::string("/cpAverageVelocityArray.bin")); + + if (arrPresence.isAverageFluktuationsArrayPresent) + readArray(step, AverageFluktuations, std::string("/cpAverageFluktuationsArray.bin")); + + if (arrPresence.isAverageTripleArrayPresent) + readArray(step, AverageTriple, std::string("/cpAverageTripleArray.bin")); + + if (arrPresence.isShearStressValArrayPresent) + readArray(step, ShearStressVal, std::string("/cpShearStressValArray.bin")); + + if (arrPresence.isRelaxationFactorPresent) + readArray(step, RelaxationFactor, std::string("/cpRelaxationFactor.bin")); + + if (arrPresence.isPhaseField1Present) + readArray(step, PhaseField1, std::string("/cpPhaseField1.bin")); + + if (arrPresence.isPhaseField2Present) + readArray(step, PhaseField2, std::string("/cpPhaseField2.bin")); + + if (arrPresence.isPressureFieldPresent) + readArray(step, PressureField, std::string("/cpPressureField.bin")); + +} + +void MPIIORestartCoProcessor::readArray(int step, Arrays arrType, std::string fname) +{ + int rank, size; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::readArray start fname = " << fname); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + double start{ 0. }; + double finish{ 0. }; + if (comm->isRoot()) + start = MPI_Wtime(); + + MPI_File file_handler; + std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + fname; + int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); + if (rc != MPI_SUCCESS) + throw UbException(UB_EXARGS, "couldn't open file " + filename); + + // read count of blocks + size_t blocksCount = 0; + dataSetParam dataSetParamStr; + memset(&dataSetParamStr, 0, sizeof(dataSetParam)); + + MPI_File_read_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE); + MPI_File_read_at(file_handler, (MPI_Offset)(size * sizeof(int)), &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); + + DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount]; + int doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all blocks + + // define MPI_types depending on the block-specific information + MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); + MPI_Type_commit(&dataSetDoubleType); + + // calculate the read offset + MPI_Offset read_offset = (MPI_Offset)(size * sizeof(int)); + size_t next_read_offset = 0; + + if (size > 1) + { + if (rank == 0) + { + next_read_offset = read_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + MPI_Send(&next_read_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD); + } + else + { + MPI_Recv(&read_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + next_read_offset = read_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + if (rank < size - 1) + MPI_Send(&next_read_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD); + } + } + + MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(dataSetParam)), dataSetSmallArray, (int)blocksCount, dataSetSmallType, MPI_STATUS_IGNORE); + if (doubleCountInBlock > 0) + MPI_File_read_at( + file_handler, + (MPI_Offset)(read_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)), + &doubleValuesArray[0], (int)blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); + MPI_File_close(&file_handler); + MPI_Type_free(&dataSetDoubleType); + + if (comm->isRoot()) + { + finish = MPI_Wtime(); + UBLOG(logINFO, "MPIIORestartCoProcessor::readArray time: " << finish - start << " s"); + UBLOG(logINFO, "MPIIORestartCoProcessor::readArray start of restore of data, rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + //----------------------------- restore data --------------------------------- + SPtr<CbArray4D<LBMReal, IndexerX4X3X2X1>> ___4DArray; + SPtr<CbArray3D<LBMReal, IndexerX3X2X1>> ___3DArray; + + size_t index = 0; + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + for (std::size_t n = 0; n < blocksCount; n++) + { + vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); + index += nextVectorSize; + + // find the nesessary block and fill it + SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].x1, dataSetSmallArray[n].x2, dataSetSmallArray[n].x3, dataSetSmallArray[n].level); + + // fill arrays + switch (arrType) + { + case AverageDensity: + ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3])); + block->getKernel()->getDataSet()->setAverageDensity(___4DArray); + break; + case AverageVelocity: + ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3])); + block->getKernel()->getDataSet()->setAverageVelocity(___4DArray); + break; + case AverageFluktuations: + ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3])); + block->getKernel()->getDataSet()->setAverageFluctuations(___4DArray); + break; + case AverageTriple: + ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3])); + block->getKernel()->getDataSet()->setAverageTriplecorrelations(___4DArray); + break; + case ShearStressVal: + ___4DArray = CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr(new CbArray4D<LBMReal, IndexerX4X3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2], dataSetParamStr.nx[3])); + block->getKernel()->getDataSet()->setShearStressValues(___4DArray); + break; + case RelaxationFactor: + ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); + block->getKernel()->getDataSet()->setRelaxationFactor(___3DArray); + break; + case PhaseField1: + ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); + block->getKernel()->getDataSet()->setPhaseField(___3DArray); + break; + case PhaseField2: + ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); + block->getKernel()->getDataSet()->setPhaseField2(___3DArray); + break; + case PressureField: + ___3DArray = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); + block->getKernel()->getDataSet()->setPressureField(___3DArray); + break; + default: + UB_THROW(UbException(UB_EXARGS, "MPIIORestartCoProcessor::readArray : array type does not exist!")); + break; + } + } + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::readArray end of restore of data, rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + delete[] dataSetSmallArray; } -void MPIIORestartCoProcessor::readAverageDensityArray(int step) +/*void MPIIORestartCoProcessor::readAverageDensityArray(int step) { int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &rank); @@ -1971,10 +2670,10 @@ void MPIIORestartCoProcessor::readAverageDensityArray(int step) } size_t index = 0; - size_t nextVectorSize = - dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; - std::vector<LBMReal> vectorsOfValues; - for (int n = 0; n < blocksCount; n++) { + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + for (int n = 0; n < blocksCount; n++) + { vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); index += nextVectorSize; @@ -2070,10 +2769,10 @@ void MPIIORestartCoProcessor::readAverageVelocityArray(int step) } size_t index = 0; - size_t nextVectorSize = - dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; - std::vector<LBMReal> vectorsOfValues; - for (int n = 0; n < blocksCount; n++) { + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + for (int n = 0; n < blocksCount; n++) + { vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); index += nextVectorSize; @@ -2170,10 +2869,10 @@ void MPIIORestartCoProcessor::readAverageFluktuationsArray(int step) } size_t index = 0; - size_t nextVectorSize = - dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; - std::vector<LBMReal> vectorsOfValues; - for (int n = 0; n < blocksCount; n++) { + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + for (int n = 0; n < blocksCount; n++) + { vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); index += nextVectorSize; @@ -2269,10 +2968,10 @@ void MPIIORestartCoProcessor::readAverageTripleArray(int step) } size_t index = 0; - size_t nextVectorSize = - dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; - std::vector<LBMReal> vectorsOfValues; - for (int n = 0; n < blocksCount; n++) { + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + for (int n = 0; n < blocksCount; n++) + { vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); index += nextVectorSize; @@ -2368,10 +3067,10 @@ void MPIIORestartCoProcessor::readShearStressValArray(int step) } size_t index = 0; - size_t nextVectorSize = - dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; - std::vector<LBMReal> vectorsOfValues; - for (int n = 0; n < blocksCount; n++) { + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + for (int n = 0; n < blocksCount; n++) + { vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); index += nextVectorSize; @@ -2467,10 +3166,10 @@ void MPIIORestartCoProcessor::readRelaxationFactor(int step) } size_t index = 0; - size_t nextVectorSize = - dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; - std::vector<LBMReal> vectorsOfValues; - for (int n = 0; n < blocksCount; n++) { + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + for (int n = 0; n < blocksCount; n++) + { vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); index += nextVectorSize; @@ -2570,7 +3269,8 @@ void MPIIORestartCoProcessor::readPhaseField(int step, int fieldN) size_t index = 0; size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; - std::vector<LBMReal> vectorsOfValues; + std::vector<double> vectorsOfValues; + std::cout << "readPhaseField"<< fieldN<<" = " << dataSetParamStr.nx[0] << " " << dataSetParamStr.nx[1] << " " << dataSetParamStr.nx[2] << std::endl; for (int n = 0; n < blocksCount; n++) { @@ -2588,6 +3288,12 @@ void MPIIORestartCoProcessor::readPhaseField(int step, int fieldN) block->getKernel()->getDataSet()->setPhaseField(mPhaseField); else block->getKernel()->getDataSet()->setPhaseField2(mPhaseField); + int nx1 = static_cast<int>(block->getKernel()->getDataSet()->getPhaseField()->getNX1()); + int nx2 = static_cast<int>(block->getKernel()->getDataSet()->getPhaseField()->getNX2()); + int nx3 = static_cast<int>(block->getKernel()->getDataSet()->getPhaseField()->getNX3()); + dataSetParamStr.nx[3] = 1; + doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::cout << "writePhaseField" << fieldN << " = " << nx1 << " " << nx2 << " " << nx3 << std::endl; } @@ -2600,6 +3306,106 @@ void MPIIORestartCoProcessor::readPhaseField(int step, int fieldN) delete[] dataSetSmallArray; } +void MPIIORestartCoProcessor::readPressureField(int step) +{ + int rank, size; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::readPressureField start MPI IO rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + double start{ 0. }; + double finish{ 0. }; + if (comm->isRoot()) + start = MPI_Wtime(); + + MPI_File file_handler; + std::string filename = path + "/mpi_io_cp/mpi_io_cp_" + UbSystem::toString(step) + "/cpPressureField.bin"; + int rc = MPI_File_open(MPI_COMM_WORLD, filename.c_str(), MPI_MODE_RDONLY, MPI_INFO_NULL, &file_handler); + if (rc != MPI_SUCCESS) + throw UbException(UB_EXARGS, "couldn't open file " + filename); + + // read count of blocks + int blocksCount = 0; + dataSetParam dataSetParamStr; + MPI_File_read_at(file_handler, (MPI_Offset)(rank * sizeof(int)), &blocksCount, 1, MPI_INT, MPI_STATUS_IGNORE); + MPI_File_read_at(file_handler, (MPI_Offset)(size * sizeof(int)), &dataSetParamStr, 1, dataSetParamType, MPI_STATUS_IGNORE); + + DataSetSmallRestart* dataSetSmallArray = new DataSetSmallRestart[blocksCount]; + int doubleCountInBlock = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> doubleValuesArray(blocksCount * doubleCountInBlock); // double-values in all blocks + + // define MPI_types depending on the block-specific information + MPI_Type_contiguous(doubleCountInBlock, MPI_DOUBLE, &dataSetDoubleType); + MPI_Type_commit(&dataSetDoubleType); + + // calculate the read offset + MPI_Offset read_offset = (MPI_Offset)(size * sizeof(int)); + size_t next_read_offset = 0; + + if (size > 1) + { + if (rank == 0) + { + next_read_offset = read_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + MPI_Send(&next_read_offset, 1, MPI_LONG_LONG_INT, 1, 5, MPI_COMM_WORLD); + } + else + { + MPI_Recv(&read_offset, 1, MPI_LONG_LONG_INT, rank - 1, 5, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + next_read_offset = read_offset + sizeof(dataSetParam) + blocksCount * (sizeof(DataSetSmallRestart) + doubleCountInBlock * sizeof(double)); + if (rank < size - 1) + MPI_Send(&next_read_offset, 1, MPI_LONG_LONG_INT, rank + 1, 5, MPI_COMM_WORLD); + } + } + + MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(dataSetParam)), dataSetSmallArray, blocksCount, dataSetSmallType, MPI_STATUS_IGNORE); + if (doubleCountInBlock > 0) + MPI_File_read_at(file_handler, (MPI_Offset)(read_offset + sizeof(dataSetParam) + blocksCount * sizeof(DataSetSmallRestart)), + &doubleValuesArray[0], blocksCount, dataSetDoubleType, MPI_STATUS_IGNORE); + MPI_File_close(&file_handler); + MPI_Type_free(&dataSetDoubleType); + + if (comm->isRoot()) + { + finish = MPI_Wtime(); + UBLOG(logINFO, "MPIIORestartCoProcessor::readPressureField time: " << finish - start << " s"); + UBLOG(logINFO, "MPIIORestartCoProcessor::readPressureField start of restore of data, rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + size_t index = 0; + size_t nextVectorSize = dataSetParamStr.nx[0] * dataSetParamStr.nx[1] * dataSetParamStr.nx[2] * dataSetParamStr.nx[3]; + std::vector<double> vectorsOfValues; + + for (int n = 0; n < blocksCount; n++) + { + vectorsOfValues.assign(doubleValuesArray.data() + index, doubleValuesArray.data() + index + nextVectorSize); + index += nextVectorSize; + + // fill Pressure array + SPtr<PressureFieldArray3D> mPressureField; + mPressureField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( + vectorsOfValues, dataSetParamStr.nx[0], dataSetParamStr.nx[1], dataSetParamStr.nx[2])); + + // find the nesessary block and fill it + SPtr<Block3D> block = grid->getBlock(dataSetSmallArray[n].x1, dataSetSmallArray[n].x2, dataSetSmallArray[n].x3, dataSetSmallArray[n].level); + block->getKernel()->getDataSet()->setPressureField(mPressureField); + } + + if (comm->isRoot()) + { + UBLOG(logINFO, "MPIIORestartCoProcessor::readPressureField end of restore of data, rank = " << rank); + UBLOG(logINFO, "Physical Memory currently used by current process: " << Utilities::getPhysMemUsedByMe() / 1073741824.0 << " GB"); + } + + delete[] dataSetSmallArray; +}*/ + void MPIIORestartCoProcessor::readBoundaryConds(int step) { int rank, size; @@ -2715,11 +3521,7 @@ void MPIIORestartCoProcessor::readBoundaryConds(int step) bc->bcVelocityX2 = bcArray[index].bcVelocityX2; bc->bcVelocityX3 = bcArray[index].bcVelocityX3; bc->bcDensity = bcArray[index].bcDensity; - bc->bcLodiDensity = bcArray[index].bcLodiDensity; - bc->bcLodiVelocityX1 = bcArray[index].bcLodiVelocityX1; - bc->bcLodiVelocityX2 = bcArray[index].bcLodiVelocityX2; - bc->bcLodiVelocityX3 = bcArray[index].bcLodiVelocityX3; - bc->bcLodiLentgh = bcArray[index].bcLodiLentgh; + bc->bcPhaseField = bcArray[ibc].bcPhaseField; bc->nx1 = bcArray[index].nx1; bc->nx2 = bcArray[index].nx2; diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h index b50eafb799f601a48aa0d80f5a4a0a17bab95d0f..1a1e1fb4d45066a93826fe7a819b056e10544036 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h +++ b/src/cpu/VirtualFluidsCore/CoProcessors/MPIIORestartCoProcessor.h @@ -20,6 +20,18 @@ class LBMKernel; class MPIIORestartCoProcessor : public MPIIOCoProcessor { public: + enum Arrays { + AverageDensity = 1, + AverageVelocity = 2, + AverageFluktuations = 3, + AverageTriple = 4, + ShearStressVal = 5, + RelaxationFactor = 6, + PhaseField1 = 7, + PhaseField2 = 8, + PressureField = 9 + }; + MPIIORestartCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, std::shared_ptr<vf::mpi::Communicator> comm); ~MPIIORestartCoProcessor() override; //! Each timestep writes the grid into the files @@ -30,13 +42,16 @@ public: void writeBlocks(int step); //! Writes the datasets of the blocks into the file cpDataSet.bin void writeDataSet(int step); - void writeAverageDensityArray(int step); - void writeAverageVelocityArray(int step); - void writeAverageFluktuationsArray(int step); - void writeAverageTripleArray(int step); - void writeShearStressValArray(int step); - void writeRelaxationFactor(int step); - void writePhaseField(int step, int num); + void write4DArray(int step, Arrays arrType, std::string fname); + void write3DArray(int step, Arrays arrType, std::string fname); + //void writeAverageDensityArray(int step); + //void writeAverageVelocityArray(int step); + //void writeAverageFluktuationsArray(int step); + //void writeAverageTripleArray(int step); + //void writeShearStressValArray(int step); + //void writeRelaxationFactor(int step); + //void writePhaseField(int step, int num); + //void writePressureField(int step); //! Writes the boundary conditions of the blocks into the file cpBC.bin void writeBoundaryConds(int step); @@ -44,14 +59,18 @@ public: void readBlocks(int step); //! Reads the datasets of the blocks from the file cpDataSet.bin void readDataSet(int step); - void readAverageDensityArray(int step); - void readAverageVelocityArray(int step); - void readAverageFluktuationsArray(int step); - void readAverageTripleArray(int step); - void readShearStressValArray(int step); - void readRelaxationFactor(int step); - void readPhaseField(int step, int num); - //! Reads the boundary conditions of the blocks from the file cpBC.bin + void readArray(int step, Arrays arrType, std::string fname); + + //void readAverageDensityArray(int step); + //void readAverageVelocityArray(int step); + //void readAverageFluktuationsArray(int step); + //void readAverageTripleArray(int step); + //void readShearStressValArray(int step); + //void readRelaxationFactor(int step); + //void readPhaseField(int step, int num); + //void readPressureField(int step); + // + //! Reads the boundary conditions of the blocks from the file cpBC.bin void readBoundaryConds(int step); //! The function sets LBMKernel void setLBMKernel(SPtr<LBMKernel> kernel); @@ -60,10 +79,6 @@ public: //! The function truncates the data files void clearAllFiles(int step); -protected: - // std::string path; - // std::shared_ptr<vf::mpi::Communicator> comm; - private: // MPI_Datatype gridParamType, block3dType; MPI_Datatype dataSetType, dataSetSmallType, dataSetDoubleType; @@ -72,6 +87,8 @@ private: MPIIODataStructures::boundCondParam boundCondParamStr; SPtr<LBMKernel> lbmKernel; SPtr<BCProcessor> bcProcessor; + + //std::vector<double> doubleValuesArrayRW; }; #endif diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp index 3765d2a999f73c476a4f1b250daeaefde971c277..64ecc177ff38403f346a519e8d0a5515a12713e4 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/ShearStressCoProcessor.cpp @@ -172,34 +172,34 @@ void ShearStressCoProcessor::calculateShearStress(double timeStep) ////////////////////////////////////////////////////////////////////////// // compute velocity ////////////////////////////////////////////////////////////////////////// - vx = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])); + vx = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])); - vy = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])); + vy = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])); - vz = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])); + vz = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) + + (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])); sxy = 3.0 * collFactor / (collFactor - 1.0) * - (((f[TNE] + f[BSW]) - (f[TSE] + f[BNW])) + (-(f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) + - (((f[NE] + f[SW]) - (f[SE] + f[NW]))) - vx * vy); + (((f[DIR_PPP] + f[DIR_MMM]) - (f[DIR_PMP] + f[DIR_MPM])) + (-(f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) + + (((f[DIR_PP0] + f[DIR_MM0]) - (f[DIR_PM0] + f[DIR_MP0]))) - vx * vy); sxz = 3.0 * collFactor / (collFactor - 1.0) * - (((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + (-(f[BSE] + f[TNW]) - (f[TSW] + f[BNE])) + - ((f[TE] + f[BW]) - (f[BE] + f[TW])) - vx * vz); + (((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + (-(f[DIR_PMM] + f[DIR_MPP]) - (f[DIR_MMP] + f[DIR_PPM])) + + ((f[DIR_P0P] + f[DIR_M0M]) - (f[DIR_P0M] + f[DIR_M0P])) - vx * vz); syz = 3.0 * collFactor / (collFactor - 1.0) * - (((f[TNE] + f[BSW]) - (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) - (f[TSW] + f[BNE])) + - (-(f[BN] + f[TS]) + (f[TN] + f[BS])) - vy * vz); + (((f[DIR_PPP] + f[DIR_MMM]) - (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) - (f[DIR_MMP] + f[DIR_PPM])) + + (-(f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM])) - vy * vz); LBMReal dxxMyy = 3.0 / 2.0 * collFactor / (collFactor - 1.0) * - (((f[TE] + f[BW]) + (f[BE] + f[TW])) - ((f[BN] + f[TS]) + (f[TN] + f[BS])) + - ((f[E] + f[W]) - (f[N] + f[S])) - vx * vx + vy * vy); + (((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) - ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM])) + + ((f[DIR_P00] + f[DIR_M00]) - (f[DIR_0P0] + f[DIR_0M0])) - vx * vx + vy * vy); LBMReal dxxMzz = 3.0 / 2.0 * collFactor / (collFactor - 1.0) * - ((((f[NE] + f[SW]) + (f[SE] + f[NW])) - ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + - ((f[E] + f[W]) - (f[T] + f[B])) - vx * vx + vz * vz); + ((((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) - ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) + + ((f[DIR_P00] + f[DIR_M00]) - (f[DIR_00P] + f[DIR_00M])) - vx * vx + vz * vz); // LBMReal dyyMzz =3.0/2.0 *collFactor/(collFactor-1.0)*((((f[NE] + f[SW]) + (f[SE] + // f[NW]))-((f[TE] + f[BW])+(f[BE]+ f[TW]))) @@ -562,32 +562,32 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g "ix2=" + UbSystem::toString(ix2) + "ix3=" + UbSystem::toString(ix3) + "GlobalID=" + UbSystem::toString(block->getGlobalID()) + "dx=" + UbSystem::toString(dx) + - "T=" + UbSystem::toString(bcPtr->getQ(D3Q27System::T)) + - "B=" + UbSystem::toString(bcPtr->getQ(D3Q27System::B)) + - "E=" + UbSystem::toString(bcPtr->getQ(D3Q27System::E)) + - "W=" + UbSystem::toString(bcPtr->getQ(D3Q27System::W)) + - "N=" + UbSystem::toString(bcPtr->getQ(D3Q27System::N)) + - "S=" + UbSystem::toString(bcPtr->getQ(D3Q27System::S)) + - "NE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::NE)) + - "SW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::SW)) + - "SE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::SE)) + - "NW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::NW)) + - "TE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TE)) + - "BW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BW)) + - "BE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BE)) + - "TW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TW)) + - "TN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TN)) + - "BS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BS)) + - "BN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BN)) + - "TS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TS)) + - "TNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TNE)) + - "TNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TNW)) + - "TSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TSE)) + - "TSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TSW)) + - "BNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BNE)) + - "BNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BNW)) + - "BSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BSE)) + - "BSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BSW) * dx))); + "T=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_00P)) + + "B=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_00M)) + + "E=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P00)) + + "W=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M00)) + + "N=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0P0)) + + "S=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0M0)) + + "NE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PP0)) + + "SW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MM0)) + + "SE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PM0)) + + "NW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MP0)) + + "TE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P0P)) + + "BW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M0M)) + + "BE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P0M)) + + "TW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M0P)) + + "TN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0PP)) + + "BS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0MM)) + + "BN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0PM)) + + "TS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0MP)) + + "TNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PPP)) + + "TNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MPP)) + + "TSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PMP)) + + "TSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MMP)) + + "BNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PPM)) + + "BNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MPM)) + + "BSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PMM)) + + "BSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MMM) * dx))); } } @@ -608,7 +608,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g if (ii <= 2) { LBMReal q = bcPtrIn->getQ(fdir); if (q != 999.00000) { - if (fdir == D3Q27System::E) { + if (fdir == D3Q27System::DIR_P00) { // if(!bcArray->isSolid(i, j, k))continue; if (i + q <= x + 1) { if (ii == 0) { @@ -634,7 +634,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g } } } - if (fdir == D3Q27System::W) { + if (fdir == D3Q27System::DIR_M00) { // if(!bcArray->isSolid(i, j, k))continue; if (i - q >= x) { if (ii == 0) { @@ -660,7 +660,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g } } } - if (fdir == D3Q27System::N) { + if (fdir == D3Q27System::DIR_0P0) { // if(!bcArray->isSolid(i, j, k))continue; if (j + q <= y + 1) { if (ii == 0) { @@ -686,7 +686,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g } } } - if (fdir == D3Q27System::S) { + if (fdir == D3Q27System::DIR_0M0) { // if(!bcArray->isSolid(i, j, k))continue; if (j - q >= y) { if (ii == 0) { @@ -713,7 +713,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g } } - if (fdir == D3Q27System::T) { + if (fdir == D3Q27System::DIR_00P) { // if(!bcArray->isSolid(i, j, k))continue; if (k + q <= z + 1) { if (ii == 0) { @@ -739,7 +739,7 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g } } } - if (fdir == D3Q27System::B) { + if (fdir == D3Q27System::DIR_00M) { // if(!bcArray->isSolid(i, j, k))continue; if (k - q >= z) { if (ii == 0) { @@ -788,32 +788,32 @@ void ShearStressCoProcessor::findPlane(int ix1, int ix2, int ix3, SPtr<Grid3D> g UB_EXARGS, "ii is=" + UbSystem::toString(ii) + " ix1=" + UbSystem::toString(ix1) + " ix2=" + UbSystem::toString(ix2) + " ix3=" + UbSystem::toString(ix3) + " Block3D::GlobalID=" + UbSystem::toString(block->getGlobalID()) + " dx=" + - UbSystem::toString(dx) + " T=" + UbSystem::toString(bcPtr->getQ(D3Q27System::T)) + - " B=" + UbSystem::toString(bcPtr->getQ(D3Q27System::B)) + - " E=" + UbSystem::toString(bcPtr->getQ(D3Q27System::E)) + - " W=" + UbSystem::toString(bcPtr->getQ(D3Q27System::W)) + - " N=" + UbSystem::toString(bcPtr->getQ(D3Q27System::N)) + - " S=" + UbSystem::toString(bcPtr->getQ(D3Q27System::S)) + - " NE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::NE)) + - " SW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::SW)) + - " SE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::SE)) + - " NW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::NW)) + - " TE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TE)) + - " BW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BW)) + - " BE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BE)) + - " TW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TW)) + - " TN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TN)) + - " BS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BS)) + - " BN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BN)) + - " TS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TS)) + - " TNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TNE)) + - " TNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TNW)) + - " TSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TSE)) + - " TSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::TSW)) + - " BNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BNE)) + - " BNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BNW)) + - " BSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BSE)) + - " BSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::BSW)))); + UbSystem::toString(dx) + " T=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_00P)) + + " B=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_00M)) + + " E=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P00)) + + " W=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M00)) + + " N=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0P0)) + + " S=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0M0)) + + " NE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PP0)) + + " SW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MM0)) + + " SE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PM0)) + + " NW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MP0)) + + " TE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P0P)) + + " BW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M0M)) + + " BE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_P0M)) + + " TW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_M0P)) + + " TN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0PP)) + + " BS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0MM)) + + " BN=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0PM)) + + " TS=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_0MP)) + + " TNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PPP)) + + " TNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MPP)) + + " TSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PMP)) + + " TSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MMP)) + + " BNE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PPM)) + + " BNW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MPM)) + + " BSE=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_PMM)) + + " BSW=" + UbSystem::toString(bcPtr->getQ(D3Q27System::DIR_MMM)))); } } } @@ -876,22 +876,22 @@ void ShearStressCoProcessor::initDistance() continue; int numberOfCorner = 0; - if (bc->getQ(D3Q27System::T) != 999.000) { + if (bc->getQ(D3Q27System::DIR_00P) != 999.000) { numberOfCorner++; } - if (bc->getQ(D3Q27System::B) != 999.000) { + if (bc->getQ(D3Q27System::DIR_00M) != 999.000) { numberOfCorner++; } - if (bc->getQ(D3Q27System::E) != 999.000) { + if (bc->getQ(D3Q27System::DIR_P00) != 999.000) { numberOfCorner++; } - if (bc->getQ(D3Q27System::W) != 999.000) { + if (bc->getQ(D3Q27System::DIR_M00) != 999.000) { numberOfCorner++; } - if (bc->getQ(D3Q27System::N) != 999.000) { + if (bc->getQ(D3Q27System::DIR_0P0) != 999.000) { numberOfCorner++; } - if (bc->getQ(D3Q27System::S) != 999.000) { + if (bc->getQ(D3Q27System::DIR_0M0) != 999.000) { numberOfCorner++; } // if(bc->hasVelocityBoundary()||bc->hasDensityBoundary())continue; diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp index 7391754ee92fe216b78245c38032dbfc0594ad62..d2874876ee9b36b9a17a6c4dcf88c4c7d0e948cb 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/TimeAveragedValuesCoProcessor.cpp @@ -413,7 +413,7 @@ void TimeAveragedValuesCoProcessor::calculateAverageValues(double timeSteps) (*av)(Vz, ix1, ix2, ix3) = uz; } - // fluctuations + // mean fluctuations if ((options & Fluctuations) == Fluctuations) { uxx = (*af)(Vxx, ix1, ix2, ix3) / timeSteps; uyy = (*af)(Vyy, ix1, ix2, ix3) / timeSteps; @@ -431,7 +431,7 @@ void TimeAveragedValuesCoProcessor::calculateAverageValues(double timeSteps) } if ((options & Triplecorrelations) == Triplecorrelations) { - // triple-correlations + // mean triple-correlations (*at)(Vxxx, ix1, ix2, ix3) = (*at)(Vxxx, ix1, ix2, ix3) / timeSteps - 3.0 * uxx * ux + 2.0 * ux * ux * ux; (*at)(Vxxy, ix1, ix2, ix3) = (*at)(Vxxy, ix1, ix2, ix3) / timeSteps - diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp index 51be3b53a9a3bc123b15e03d0925bd619fb01fa3..6a06a20d41fc8b57c43dd219623bb2d544d7a4a9 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/TurbulenceIntensityCoProcessor.cpp @@ -215,14 +215,14 @@ void TurbulenceIntensityCoProcessor::calculateAverageValues(double timeStep) ////////////////////////////////////////////////////////////////////////// // compute velocity ////////////////////////////////////////////////////////////////////////// - vx = f[E] - f[W] + f[NE] - f[SW] + f[SE] - f[NW] + f[TE] - f[BW] + f[BE] - f[TW] + - f[TNE] - f[TSW] + f[TSE] - f[TNW] + f[BNE] - f[BSW] + f[BSE] - f[BNW]; + vx = f[DIR_P00] - f[DIR_M00] + f[DIR_PP0] - f[DIR_MM0] + f[DIR_PM0] - f[DIR_MP0] + f[DIR_P0P] - f[DIR_M0M] + f[DIR_P0M] - f[DIR_M0P] + + f[DIR_PPP] - f[DIR_MMP] + f[DIR_PMP] - f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] + f[DIR_PMM] - f[DIR_MPM]; - vy = f[N] - f[S] + f[NE] - f[SW] - f[SE] + f[NW] + f[TN] - f[BS] + f[BN] - f[TS] + - f[TNE] - f[TSW] - f[TSE] + f[TNW] + f[BNE] - f[BSW] - f[BSE] + f[BNW]; + vy = f[DIR_0P0] - f[DIR_0M0] + f[DIR_PP0] - f[DIR_MM0] - f[DIR_PM0] + f[DIR_MP0] + f[DIR_0PP] - f[DIR_0MM] + f[DIR_0PM] - f[DIR_0MP] + + f[DIR_PPP] - f[DIR_MMP] - f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] + f[DIR_MPM]; - vz = f[T] - f[B] + f[TE] - f[BW] - f[BE] + f[TW] + f[TN] - f[BS] - f[BN] + f[TS] + - f[TNE] + f[TSW] + f[TSE] + f[TNW] - f[BNE] - f[BSW] - f[BSE] - f[BNW]; + vz = f[DIR_00P] - f[DIR_00M] + f[DIR_P0P] - f[DIR_M0M] - f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] - f[DIR_0MM] - f[DIR_0PM] + f[DIR_0MP] + + f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] - f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] - f[DIR_MPM]; ////////////////////////////////////////////////////////////////////////// // compute average values ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp index 536d2ee133517279aa2458d06aea8edcee1dd20f..523ae4ffb0ac78143e071054d8804f67bd2e12d6 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteBlocksCoProcessor.cpp @@ -123,7 +123,7 @@ void WriteBlocksCoProcessor::collectData(double step) // for (std::size_t i = 0; i<connectors.size(); i++) // if (connectors[i]) // { - // if (connectors[i]->getSendDir() == D3Q27System::BS) + // if (connectors[i]->getSendDir() == D3Q27System::DIR_0MM) // { // flag = true; @@ -146,7 +146,7 @@ void WriteBlocksCoProcessor::collectData(double step) // for (std::size_t i = 0; i<connectors.size(); i++) // if (connectors[i]) // { - // if (connectors[i]->getSendDir() == D3Q27System::BS) + // if (connectors[i]->getSendDir() == D3Q27System::DIR_0MM) // { // flag = true; diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp index 4bf2b30375145fb961cb7f932afc4aa15780820b..b886271b7f3842b0453a0fa16f53ca75442da9e9 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp @@ -182,13 +182,13 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) int maxX2 = (int)(distributions->getNX2()); int maxX3 = (int)(distributions->getNX3()); - // int minX1 = 1; - // int minX2 = 1; - // int minX3 = 1; + //int minX1 = 1; + //int minX2 = 1; + //int minX3 = 1; - // int maxX1 = (int)(distributions->getNX1()); - // int maxX2 = (int)(distributions->getNX2()); - // int maxX3 = (int)(distributions->getNX3()); + //int maxX1 = (int)(distributions->getNX1()); + //int maxX2 = (int)(distributions->getNX2()); + //int maxX3 = (int)(distributions->getNX3()); // nummern vergeben und node vector erstellen + daten sammeln CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1); @@ -202,7 +202,7 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) for (int ix3 = minX3; ix3 <= maxX3; ix3++) { for (int ix2 = minX2; ix2 <= maxX2; ix2++) { for (int ix1 = minX1; ix1 <= maxX1; ix1++) { - if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3)) { + if (/* !bcArray->isUndefined(ix1, ix2, ix3) &&*/ !bcArray->isSolid(ix1, ix2, ix3)) { int index = 0; nodeNumbers(ix1, ix2, ix3) = nr++; Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3); diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c71a12ee6d7bc17297cca377712b9a6b479bb336 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp @@ -0,0 +1,278 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 WriteMacroscopicQuantitiesPlusMassCoProcessor.cpp +//! \ingroup CoProcessors +//! \author Konstantin Kutscher +//======================================================================================= + +#include "WriteMacroscopicQuantitiesPlusMassCoProcessor.h" +#include "BCProcessor.h" +#include "LBMKernel.h" +#include <string> +#include <vector> + +#include "BCArray3D.h" +#include "Block3D.h" +#include "Communicator.h" +#include "DataSet3D.h" +#include "Grid3D.h" +#include "LBMUnitConverter.h" +#include "UbScheduler.h" +#include "basics/writer/WbWriterVtkXmlASCII.h" + +WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMassCoProcessor() = default; +////////////////////////////////////////////////////////////////////////// +WriteMacroscopicQuantitiesPlusMassCoProcessor::WriteMacroscopicQuantitiesPlusMassCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, + const std::string &path, + WbWriter *const writer, + SPtr<LBMUnitConverter> conv, + std::shared_ptr<vf::mpi::Communicator> comm) + : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm) +{ + gridRank = comm->getProcessID(); + minInitLevel = this->grid->getCoarsestInitializedLevel(); + maxInitLevel = this->grid->getFinestInitializedLevel(); + + blockVector.resize(maxInitLevel + 1); + + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + grid->getBlocks(level, gridRank, true, blockVector[level]); + } +} + +////////////////////////////////////////////////////////////////////////// +void WriteMacroscopicQuantitiesPlusMassCoProcessor::init() +{} + +////////////////////////////////////////////////////////////////////////// +void WriteMacroscopicQuantitiesPlusMassCoProcessor::process(double step) +{ + if (scheduler->isDue(step)) + collectData(step); + + UBLOG(logDEBUG3, "WriteMacroscopicQuantitiesPlusMassCoProcessor::update:" << step); +} + +////////////////////////////////////////////////////////////////////////// +void WriteMacroscopicQuantitiesPlusMassCoProcessor::collectData(double step) +{ + int istep = static_cast<int>(step); + + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + for (SPtr<Block3D> block : blockVector[level]) + { + if (block) + { + addDataMQ(block); + } + } + } + + std::string pfilePath, partPath, subfolder, cfilePath; + + subfolder = "mq" + UbSystem::toString(istep); + pfilePath = path + "/mq/" + subfolder; + cfilePath = path + "/mq/mq_collection"; + partPath = pfilePath + "/mq" + UbSystem::toString(gridRank) + "_" + UbSystem::toString(istep); + + std::string partName = writer->writeOctsWithNodeData(partPath, nodes, cells, datanames, data); + size_t found = partName.find_last_of("/"); + std::string piece = partName.substr(found + 1); + piece = subfolder + "/" + piece; + + std::vector<std::string> cellDataNames; + std::vector<std::string> pieces = comm->gather(piece); + if (comm->getProcessID() == comm->getRoot()) { + std::string pname = + WbWriterVtkXmlASCII::getInstance()->writeParallelFile(pfilePath, pieces, datanames, cellDataNames); + found = pname.find_last_of("/"); + piece = pname.substr(found + 1); + + std::vector<std::string> filenames; + filenames.push_back(piece); + if (step == CoProcessor::scheduler->getMinBegin()) + { + WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false); + } else + { + WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false); + } + UBLOG(logINFO, "WriteMacroscopicQuantitiesPlusMassCoProcessor step: " << istep); + } + + clearData(); +} + +////////////////////////////////////////////////////////////////////////// +void WriteMacroscopicQuantitiesPlusMassCoProcessor::clearData() +{ + nodes.clear(); + cells.clear(); + datanames.clear(); + data.clear(); +} + +////////////////////////////////////////////////////////////////////////// +void WriteMacroscopicQuantitiesPlusMassCoProcessor::addDataMQ(SPtr<Block3D> block) +{ + double level = (double)block->getLevel(); + + // Diese Daten werden geschrieben: + datanames.resize(0); + datanames.push_back("Rho"); + datanames.push_back("Vx"); + datanames.push_back("Vy"); + datanames.push_back("Vz"); + // datanames.push_back("Press"); + datanames.push_back("Level"); + // datanames.push_back("BlockID"); + // datanames.push_back("gamma"); + // datanames.push_back("collFactor"); + + data.resize(datanames.size()); + + SPtr<ILBMKernel> kernel = block->getKernel(); + SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); + LBMReal f[D3Q27System::ENDF + 1]; + LBMReal vx1, vx2, vx3, rho; + + // knotennummerierung faengt immer bei 0 an! + int SWB, SEB, NEB, NWB, SWT, SET, NET, NWT; + + if (block->getKernel()->getCompressible()) { + calcMacros = &D3Q27System::calcCompMacroscopicValues; + } else { + calcMacros = &D3Q27System::calcIncompMacroscopicValues; + } + + int minX1 = 0; + int minX2 = 0; + int minX3 = 0; + + int maxX1 = (int)(distributions->getNX1()); + int maxX2 = (int)(distributions->getNX2()); + int maxX3 = (int)(distributions->getNX3()); + + // int minX1 = 1; + // int minX2 = 1; + // int minX3 = 1; + + // int maxX1 = (int)(distributions->getNX1()); + // int maxX2 = (int)(distributions->getNX2()); + // int maxX3 = (int)(distributions->getNX3()); + + // nummern vergeben und node vector erstellen + daten sammeln + CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1); + maxX1 -= 2; + maxX2 -= 2; + maxX3 -= 2; + + // D3Q27BoundaryConditionPtr bcPtr; + int nr = (int)nodes.size(); + + for (int ix3 = minX3; ix3 <= maxX3; ix3++) { + for (int ix2 = minX2; ix2 <= maxX2; ix2++) { + for (int ix1 = minX1; ix1 <= maxX1; ix1++) { + if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3)) { + int index = 0; + nodeNumbers(ix1, ix2, ix3) = nr++; + Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3); + nodes.push_back(UbTupleFloat3(float(worldCoordinates[0]), float(worldCoordinates[1]), + float(worldCoordinates[2]))); + + distributions->getDistribution(f, ix1, ix2, ix3); + calcMacros(f, rho, vx1, vx2, vx3); + //double press = D3Q27System::getPressure(f); // D3Q27System::calcPress(f,rho,vx1,vx2,vx3); + + if (UbMath::isNaN(rho) || UbMath::isInfinity(rho)) + UB_THROW( UbException(UB_EXARGS,"rho is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+",node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //rho = 999.0; + //if (UbMath::isNaN(press) || UbMath::isInfinity(press)) + // UB_THROW( UbException(UB_EXARGS,"press is not a number (nan or -1.#IND) or infinity number + // -1.#INF in block="+block->toString()+", + // node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //press = 999.0; + if (UbMath::isNaN(vx1) || UbMath::isInfinity(vx1)) + UB_THROW( UbException(UB_EXARGS,"vx1 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //vx1 = 999.0; + if (UbMath::isNaN(vx2) || UbMath::isInfinity(vx2)) + UB_THROW( UbException(UB_EXARGS,"vx2 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //vx2 = 999.0; + if (UbMath::isNaN(vx3) || UbMath::isInfinity(vx3)) + UB_THROW( UbException(UB_EXARGS,"vx3 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //vx3 = 999.0; + + data[index++].push_back(rho); + data[index++].push_back(vx1); + data[index++].push_back(vx2); + data[index++].push_back(vx3); + + // shearRate = D3Q27System::getShearRate(f, collFactor); + + // LBMReal collFactorF = RheologyBinghamModelLBMKernel::getBinghamCollFactor(collFactor, yieldStress, + // shearRate, rho); + + // data[index++].push_back(shearRate); + // data[index++].push_back(collFactorF); + + // data[index++].push_back((rho+1.0) * conv->getFactorDensityLbToW() ); + // data[index++].push_back(vx1 * conv->getFactorVelocityLbToW()); + // data[index++].push_back(vx2 * conv->getFactorVelocityLbToW()); + // data[index++].push_back(vx3 * conv->getFactorVelocityLbToW()); + // data[index++].push_back((press * conv->getFactorPressureLbToW()) / ((rho+1.0) * + // conv->getFactorDensityLbToW())); + data[index++].push_back(level); + // data[index++].push_back(blockID); + } + } + } + } + maxX1 -= 1; + maxX2 -= 1; + maxX3 -= 1; + // cell vector erstellen + for (int ix3 = minX3; ix3 <= maxX3; ix3++) { + for (int ix2 = minX2; ix2 <= maxX2; ix2++) { + for (int ix1 = minX1; ix1 <= maxX1; ix1++) { + if ((SWB = nodeNumbers(ix1, ix2, ix3)) >= 0 && (SEB = nodeNumbers(ix1 + 1, ix2, ix3)) >= 0 && + (NEB = nodeNumbers(ix1 + 1, ix2 + 1, ix3)) >= 0 && (NWB = nodeNumbers(ix1, ix2 + 1, ix3)) >= 0 && + (SWT = nodeNumbers(ix1, ix2, ix3 + 1)) >= 0 && (SET = nodeNumbers(ix1 + 1, ix2, ix3 + 1)) >= 0 && + (NET = nodeNumbers(ix1 + 1, ix2 + 1, ix3 + 1)) >= 0 && + (NWT = nodeNumbers(ix1, ix2 + 1, ix3 + 1)) >= 0) { + cells.push_back(makeUbTuple((unsigned int)SWB, (unsigned int)SEB, (unsigned int)NEB, + (unsigned int)NWB, (unsigned int)SWT, (unsigned int)SET, + (unsigned int)NET, (unsigned int)NWT)); + } + } + } + } +} diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..07f1a12676902e5964fcb0127203c1b527c89778 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesPlusMassCoProcessor.h @@ -0,0 +1,99 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 WriteMacroscopicQuantitiesPlusMassCoProcessor.h +//! \ingroup CoProcessors +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef WriteMacroscopicQuantitiesPlusMassCoProcessor_H +#define WriteMacroscopicQuantitiesPlusMassCoProcessor_H + +#include <PointerDefinitions.h> +#include <string> +#include <vector> + +#include "CoProcessor.h" +#include "LBMSystem.h" +#include "UbTuple.h" + +namespace vf::mpi {class Communicator;} +class Grid3D; +class UbScheduler; +class LBMUnitConverter; +class WbWriter; +class Block3D; + +//! \brief A class writes macroscopic quantities information to a VTK-file +class WriteMacroscopicQuantitiesPlusMassCoProcessor : public CoProcessor +{ +public: + WriteMacroscopicQuantitiesPlusMassCoProcessor(); + //! \brief Construct WriteMacroscopicQuantitiesPlusMassCoProcessor object + //! \pre The Grid3D and UbScheduler objects must exist + //! \param grid is observable Grid3D object + //! \param s is UbScheduler object for scheduling of observer + //! \param path is path of folder for output + //! \param writer is WbWriter object + //! \param conv is LBMUnitConverter object + //! \param comm is Communicator object + WriteMacroscopicQuantitiesPlusMassCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, + WbWriter *const writer, SPtr<LBMUnitConverter> conv, std::shared_ptr<vf::mpi::Communicator> comm); + ~WriteMacroscopicQuantitiesPlusMassCoProcessor() override = default; + + void process(double step) override; + +protected: + //! Collect data for VTK-file + //! \param step is a time step + void collectData(double step); + //! Collect data for VTK-file + //! \param block is a time step + void addDataMQ(SPtr<Block3D> block); + void clearData(); + +private: + void init(); + std::vector<UbTupleFloat3> nodes; + std::vector<UbTupleUInt8> cells; + std::vector<std::string> datanames; + std::vector<std::vector<double>> data; + std::string path; + WbWriter *writer; + SPtr<LBMUnitConverter> conv; + std::vector<std::vector<SPtr<Block3D>>> blockVector; + int minInitLevel; + int maxInitLevel; + int gridRank; + std::shared_ptr<vf::mpi::Communicator> comm; + + using CalcMacrosFct = void (*)(const LBMReal *const &, LBMReal &, LBMReal &, LBMReal &, LBMReal &); + CalcMacrosFct calcMacros; +}; + +#endif diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp index c5442930623344fb528a7764fb1f1e314c35437c..0298c1dbeb1d4b4a9ed6afb0c202206d9d21c488 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp @@ -145,7 +145,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) { using namespace D3Q27System; using namespace UbMath; - + SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel()); //double level = (double)block->getLevel(); // Diese Daten werden geschrieben: @@ -155,17 +155,24 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) datanames.push_back("Vy"); datanames.push_back("Vz"); datanames.push_back("P1"); + datanames.push_back("Phi2"); + if (kernel->getDataSet()->getPressureField()) datanames.push_back("Pressure"); data.resize(datanames.size()); - SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel()); + SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); SPtr<DistributionArray3D> distributionsF = kernel->getDataSet()->getFdistributions(); SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions(); + SPtr<DistributionArray3D> distributionsH2 = kernel->getDataSet()->getH2distributions(); SPtr<PhaseFieldArray3D> divU = kernel->getDataSet()->getPhaseField(); + SPtr<PressureFieldArray3D> pressure; + if (kernel->getDataSet()->getPressureField()) pressure = kernel->getDataSet()->getPressureField(); + LBMReal f[D3Q27System::ENDF + 1]; LBMReal phi[D3Q27System::ENDF + 1]; + LBMReal phi2[D3Q27System::ENDF + 1]; LBMReal vx1, vx2, vx3, rho, p1, beta, kappa; LBMReal densityRatio = kernel->getDensityRatio(); @@ -193,6 +200,13 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) int minX1 = 0; int minX2 = 0; int minX3 = 0; + + if (kernel->getGhostLayerWidth() == 2) + { + minX1 = 1; + minX2 = 1; + minX3 = 1; + } // int maxX1 = (int)(distributions->getNX1()); // int maxX2 = (int)(distributions->getNX2()); @@ -202,6 +216,8 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1); CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField( new CbArray3D<LBMReal, IndexerX3X2X1>(maxX1, maxX2, maxX3, -999.0)); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField2( + new CbArray3D<LBMReal, IndexerX3X2X1>(maxX1, maxX2, maxX3, -999.0)); for (int ix3 = minX3; ix3 < maxX3; ix3++) { for (int ix2 = minX2; ix2 < maxX2; ix2++) { @@ -209,24 +225,38 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3)) { distributionsH->getDistribution(f, ix1, ix2, ix3); (*phaseField)(ix1, ix2, ix3) = - ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) + - (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) + - ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + - ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[REST]; + ((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) + + (((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) + ((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) + + ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) + + ((f[DIR_P00] + f[DIR_M00]) + (f[DIR_0P0] + f[DIR_0M0]) + (f[DIR_00P] + f[DIR_00M])) + f[DIR_000]; + if (distributionsH2) { + distributionsH2->getDistribution(f, ix1, ix2, ix3); + (*phaseField2)(ix1, ix2, ix3) = + ((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) + + (((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) + ((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) + + ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) + + ((f[DIR_P00] + f[DIR_M00]) + (f[DIR_0P0] + f[DIR_0M0]) + (f[DIR_00P] + f[DIR_00M])) + f[DIR_000]; + } + else { (*phaseField2)(ix1, ix2, ix3) = 999.0; } + } } } } - maxX1 -= 2; - maxX2 -= 2; - maxX3 -= 2; - - // maxX1 -= 1; - // maxX2 -= 1; - // maxX3 -= 1; + if (kernel->getGhostLayerWidth() == 1) + { + maxX1 -= 2; + maxX2 -= 2; + maxX3 -= 2; + } + else if (kernel->getGhostLayerWidth() == 2) + { + maxX1 -= 3; + maxX2 -= 3; + maxX3 -= 3; + } - // D3Q27BoundaryConditionPtr bcPtr; int nr = (int)nodes.size(); LBMReal dX1_phi; LBMReal dX2_phi; @@ -243,7 +273,8 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) nodes.push_back(UbTupleFloat3(float(worldCoordinates[0]), float(worldCoordinates[1]), float(worldCoordinates[2]))); - phi[REST] = (*phaseField)(ix1, ix2, ix3); + phi[DIR_000] = (*phaseField)(ix1, ix2, ix3); + phi2[DIR_000] = (*phaseField2)(ix1, ix2, ix3); if ((ix1 == 0) || (ix2 == 0) || (ix3 == 0)) { dX1_phi = 0.0; @@ -254,36 +285,68 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) // vx2 = 0.0; // vx3 = 0.0; } else { - phi[E] = (*phaseField)(ix1 + DX1[E], ix2 + DX2[E], ix3 + DX3[E]); - phi[N] = (*phaseField)(ix1 + DX1[N], ix2 + DX2[N], ix3 + DX3[N]); - phi[T] = (*phaseField)(ix1 + DX1[T], ix2 + DX2[T], ix3 + DX3[T]); - phi[W] = (*phaseField)(ix1 + DX1[W], ix2 + DX2[W], ix3 + DX3[W]); - phi[S] = (*phaseField)(ix1 + DX1[S], ix2 + DX2[S], ix3 + DX3[S]); - phi[B] = (*phaseField)(ix1 + DX1[B], ix2 + DX2[B], ix3 + DX3[B]); - phi[NE] = (*phaseField)(ix1 + DX1[NE], ix2 + DX2[NE], ix3 + DX3[NE]); - phi[NW] = (*phaseField)(ix1 + DX1[NW], ix2 + DX2[NW], ix3 + DX3[NW]); - phi[TE] = (*phaseField)(ix1 + DX1[TE], ix2 + DX2[TE], ix3 + DX3[TE]); - phi[TW] = (*phaseField)(ix1 + DX1[TW], ix2 + DX2[TW], ix3 + DX3[TW]); - phi[TN] = (*phaseField)(ix1 + DX1[TN], ix2 + DX2[TN], ix3 + DX3[TN]); - phi[TS] = (*phaseField)(ix1 + DX1[TS], ix2 + DX2[TS], ix3 + DX3[TS]); - phi[SW] = (*phaseField)(ix1 + DX1[SW], ix2 + DX2[SW], ix3 + DX3[SW]); - phi[SE] = (*phaseField)(ix1 + DX1[SE], ix2 + DX2[SE], ix3 + DX3[SE]); - phi[BW] = (*phaseField)(ix1 + DX1[BW], ix2 + DX2[BW], ix3 + DX3[BW]); - phi[BE] = (*phaseField)(ix1 + DX1[BE], ix2 + DX2[BE], ix3 + DX3[BE]); - phi[BS] = (*phaseField)(ix1 + DX1[BS], ix2 + DX2[BS], ix3 + DX3[BS]); - phi[BN] = (*phaseField)(ix1 + DX1[BN], ix2 + DX2[BN], ix3 + DX3[BN]); - phi[BSW] = (*phaseField)(ix1 + DX1[BSW], ix2 + DX2[BSW], ix3 + DX3[BSW]); - phi[BSE] = (*phaseField)(ix1 + DX1[BSE], ix2 + DX2[BSE], ix3 + DX3[BSE]); - phi[BNW] = (*phaseField)(ix1 + DX1[BNW], ix2 + DX2[BNW], ix3 + DX3[BNW]); - phi[BNE] = (*phaseField)(ix1 + DX1[BNE], ix2 + DX2[BNE], ix3 + DX3[BNE]); - phi[TNE] = (*phaseField)(ix1 + DX1[TNE], ix2 + DX2[TNE], ix3 + DX3[TNE]); - phi[TNW] = (*phaseField)(ix1 + DX1[TNW], ix2 + DX2[TNW], ix3 + DX3[TNW]); - phi[TSE] = (*phaseField)(ix1 + DX1[TSE], ix2 + DX2[TSE], ix3 + DX3[TSE]); - phi[TSW] = (*phaseField)(ix1 + DX1[TSW], ix2 + DX2[TSW], ix3 + DX3[TSW]); + phi[DIR_P00] = (*phaseField)(ix1 + DX1[DIR_P00], ix2 + DX2[DIR_P00], ix3 + DX3[DIR_P00]); + phi[DIR_0P0] = (*phaseField)(ix1 + DX1[DIR_0P0], ix2 + DX2[DIR_0P0], ix3 + DX3[DIR_0P0]); + phi[DIR_00P] = (*phaseField)(ix1 + DX1[DIR_00P], ix2 + DX2[DIR_00P], ix3 + DX3[DIR_00P]); + phi[DIR_M00] = (*phaseField)(ix1 + DX1[DIR_M00], ix2 + DX2[DIR_M00], ix3 + DX3[DIR_M00]); + phi[DIR_0M0] = (*phaseField)(ix1 + DX1[DIR_0M0], ix2 + DX2[DIR_0M0], ix3 + DX3[DIR_0M0]); + phi[DIR_00M] = (*phaseField)(ix1 + DX1[DIR_00M], ix2 + DX2[DIR_00M], ix3 + DX3[DIR_00M]); + phi[DIR_PP0] = (*phaseField)(ix1 + DX1[DIR_PP0], ix2 + DX2[DIR_PP0], ix3 + DX3[DIR_PP0]); + phi[DIR_MP0] = (*phaseField)(ix1 + DX1[DIR_MP0], ix2 + DX2[DIR_MP0], ix3 + DX3[DIR_MP0]); + phi[DIR_P0P] = (*phaseField)(ix1 + DX1[DIR_P0P], ix2 + DX2[DIR_P0P], ix3 + DX3[DIR_P0P]); + phi[DIR_M0P] = (*phaseField)(ix1 + DX1[DIR_M0P], ix2 + DX2[DIR_M0P], ix3 + DX3[DIR_M0P]); + phi[DIR_0PP] = (*phaseField)(ix1 + DX1[DIR_0PP], ix2 + DX2[DIR_0PP], ix3 + DX3[DIR_0PP]); + phi[DIR_0MP] = (*phaseField)(ix1 + DX1[DIR_0MP], ix2 + DX2[DIR_0MP], ix3 + DX3[DIR_0MP]); + phi[DIR_MM0] = (*phaseField)(ix1 + DX1[DIR_MM0], ix2 + DX2[DIR_MM0], ix3 + DX3[DIR_MM0]); + phi[DIR_PM0] = (*phaseField)(ix1 + DX1[DIR_PM0], ix2 + DX2[DIR_PM0], ix3 + DX3[DIR_PM0]); + phi[DIR_M0M] = (*phaseField)(ix1 + DX1[DIR_M0M], ix2 + DX2[DIR_M0M], ix3 + DX3[DIR_M0M]); + phi[DIR_P0M] = (*phaseField)(ix1 + DX1[DIR_P0M], ix2 + DX2[DIR_P0M], ix3 + DX3[DIR_P0M]); + phi[DIR_0MM] = (*phaseField)(ix1 + DX1[DIR_0MM], ix2 + DX2[DIR_0MM], ix3 + DX3[DIR_0MM]); + phi[DIR_0PM] = (*phaseField)(ix1 + DX1[DIR_0PM], ix2 + DX2[DIR_0PM], ix3 + DX3[DIR_0PM]); + phi[DIR_MMM] = (*phaseField)(ix1 + DX1[DIR_MMM], ix2 + DX2[DIR_MMM], ix3 + DX3[DIR_MMM]); + phi[DIR_PMM] = (*phaseField)(ix1 + DX1[DIR_PMM], ix2 + DX2[DIR_PMM], ix3 + DX3[DIR_PMM]); + phi[DIR_MPM] = (*phaseField)(ix1 + DX1[DIR_MPM], ix2 + DX2[DIR_MPM], ix3 + DX3[DIR_MPM]); + phi[DIR_PPM] = (*phaseField)(ix1 + DX1[DIR_PPM], ix2 + DX2[DIR_PPM], ix3 + DX3[DIR_PPM]); + phi[DIR_PPP] = (*phaseField)(ix1 + DX1[DIR_PPP], ix2 + DX2[DIR_PPP], ix3 + DX3[DIR_PPP]); + phi[DIR_MPP] = (*phaseField)(ix1 + DX1[DIR_MPP], ix2 + DX2[DIR_MPP], ix3 + DX3[DIR_MPP]); + phi[DIR_PMP] = (*phaseField)(ix1 + DX1[DIR_PMP], ix2 + DX2[DIR_PMP], ix3 + DX3[DIR_PMP]); + phi[DIR_MMP] = (*phaseField)(ix1 + DX1[DIR_MMP], ix2 + DX2[DIR_MMP], ix3 + DX3[DIR_MMP]); dX1_phi = 0.0 * gradX1_phi(phi); dX2_phi = 0.0 * gradX2_phi(phi); dX3_phi = 0.0 * gradX3_phi(phi); - mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi(phi); + mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(phi); + + //phi2[DIR_P00] = (*phaseField2)(ix1 + DX1[DIR_P00], ix2 + DX2[DIR_P00], ix3 + DX3[DIR_P00]); + //phi2[N] = (*phaseField2)(ix1 + DX1[N], ix2 + DX2[N], ix3 + DX3[N]); + //phi2[T] = (*phaseField2)(ix1 + DX1[T], ix2 + DX2[T], ix3 + DX3[T]); + //phi2[W] = (*phaseField2)(ix1 + DX1[W], ix2 + DX2[W], ix3 + DX3[W]); + //phi2[S] = (*phaseField2)(ix1 + DX1[S], ix2 + DX2[S], ix3 + DX3[S]); + //phi2[B] = (*phaseField2)(ix1 + DX1[B], ix2 + DX2[B], ix3 + DX3[B]); + //phi2[NE] = (*phaseField2)(ix1 + DX1[NE], ix2 + DX2[NE], ix3 + DX3[NE]); + //phi2[NW] = (*phaseField2)(ix1 + DX1[NW], ix2 + DX2[NW], ix3 + DX3[NW]); + //phi2[TE] = (*phaseField2)(ix1 + DX1[TE], ix2 + DX2[TE], ix3 + DX3[TE]); + //phi2[TW] = (*phaseField2)(ix1 + DX1[TW], ix2 + DX2[TW], ix3 + DX3[TW]); + //phi2[TN] = (*phaseField2)(ix1 + DX1[TN], ix2 + DX2[TN], ix3 + DX3[TN]); + //phi2[TS] = (*phaseField2)(ix1 + DX1[TS], ix2 + DX2[TS], ix3 + DX3[TS]); + //phi2[SW] = (*phaseField2)(ix1 + DX1[SW], ix2 + DX2[SW], ix3 + DX3[SW]); + //phi2[SE] = (*phaseField2)(ix1 + DX1[SE], ix2 + DX2[SE], ix3 + DX3[SE]); + //phi2[BW] = (*phaseField2)(ix1 + DX1[BW], ix2 + DX2[BW], ix3 + DX3[BW]); + //phi2[BE] = (*phaseField2)(ix1 + DX1[BE], ix2 + DX2[BE], ix3 + DX3[BE]); + //phi2[BS] = (*phaseField2)(ix1 + DX1[BS], ix2 + DX2[BS], ix3 + DX3[BS]); + //phi2[BN] = (*phaseField2)(ix1 + DX1[BN], ix2 + DX2[BN], ix3 + DX3[BN]); + //phi2[BSW] = (*phaseField2)(ix1 + DX1[BSW], ix2 + DX2[BSW], ix3 + DX3[BSW]); + //phi2[BSE] = (*phaseField2)(ix1 + DX1[BSE], ix2 + DX2[BSE], ix3 + DX3[BSE]); + //phi2[BNW] = (*phaseField2)(ix1 + DX1[BNW], ix2 + DX2[BNW], ix3 + DX3[BNW]); + //phi2[BNE] = (*phaseField2)(ix1 + DX1[BNE], ix2 + DX2[BNE], ix3 + DX3[BNE]); + //phi2[TNE] = (*phaseField2)(ix1 + DX1[TNE], ix2 + DX2[TNE], ix3 + DX3[TNE]); + //phi2[TNW] = (*phaseField2)(ix1 + DX1[TNW], ix2 + DX2[TNW], ix3 + DX3[TNW]); + //phi2[TSE] = (*phaseField2)(ix1 + DX1[TSE], ix2 + DX2[TSE], ix3 + DX3[TSE]); + //phi2[TSW] = (*phaseField2)(ix1 + DX1[TSW], ix2 + DX2[TSW], ix3 + DX3[TSW]); + + // mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi(phi); + + + } distributionsF->getDistribution(f, ix1, ix2, ix3); @@ -295,30 +358,47 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); // rho = phi[ZERO] + (1.0 - phi[ZERO])*1.0/densityRatio; - rho = rhoH + rhoToPhi * (phi[REST] - phiH); - - vx1 = - ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) / - (rho * c1o3) + - mu * dX1_phi / (2 * rho); - - vx2 = - ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) / - (rho * c1o3) + - mu * dX2_phi / (2 * rho); - - vx3 = - ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) / - (rho * c1o3) + - mu * dX3_phi / (2 * rho); - - p1 = (((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) + - (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) + - ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + - ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[REST]) + + rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); + + if (pressure) { + vx1 = + ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])) ; + + vx2 = + ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])) ; + + vx3 = + ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) + + (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])); + + } + else { + vx1 = + ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])) / + (rho * c1o3) + + mu * dX1_phi / (2 * rho); + + vx2 = + ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])) / + (rho * c1o3) + + mu * dX2_phi / (2 * rho); + + vx3 = + ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) + + (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])) / + (rho * c1o3) + + mu * dX3_phi / (2 * rho); + + } + + p1 = (((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) + + (((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) + ((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) + + ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) + + ((f[DIR_P00] + f[DIR_M00]) + (f[DIR_0P0] + f[DIR_0M0]) + (f[DIR_00P] + f[DIR_00M])) + f[DIR_000]) + (vx1 * rhoToPhi * dX1_phi * c1o3 + vx2 * rhoToPhi * dX2_phi * c1o3 + vx3 * rhoToPhi * dX3_phi * c1o3) / 2.0; @@ -346,7 +426,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) block->toString() + ", node=" + UbSystem::toString(ix1) + "," + UbSystem::toString(ix2) + "," + UbSystem::toString(ix3))); - if (UbMath::isNaN(phi[REST]) || UbMath::isInfinity(phi[REST])) + if (UbMath::isNaN(phi[DIR_000]) || UbMath::isInfinity(phi[DIR_000])) UB_THROW(UbException( UB_EXARGS, "phi is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" + block->toString() + ", node=" + UbSystem::toString(ix1) + "," + @@ -356,11 +436,13 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) UB_THROW( UbException(UB_EXARGS,"p1 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+ ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); - data[index++].push_back(phi[REST]); + data[index++].push_back(phi[DIR_000]); data[index++].push_back(vx1); data[index++].push_back(vx2); data[index++].push_back(vx3); data[index++].push_back(p1); + data[index++].push_back(phi2[DIR_000]); + if (pressure) data[index++].push_back((*pressure)(ix1, ix2, ix3)); } } } @@ -420,7 +502,7 @@ LBMReal WriteMultiphaseQuantitiesCoProcessor::nabla2_phi(const LBMReal *const &h using namespace D3Q27System; LBMReal sum = 0.0; for (int k = FSTARTDIR; k <= FENDDIR; k++) { - sum += WEIGTH[k] * (h[k] - h[REST]); + sum += WEIGTH[k] * (h[k] - h[DIR_000]); } return 6.0 * sum; } \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h index 7c5c4f136fc814bec2c9d782e7502668c785ab42..00ba4c4e915530a4678b7271b8f78648f267cd96 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h +++ b/src/cpu/VirtualFluidsCore/Connectors/CoarseToFineVectorConnector.h @@ -156,15 +156,15 @@ CoarseToFineVectorConnector<VectorTransmitter>::CoarseToFineVectorConnector( receiverEvenOddNW(receiverEvenOddNW), receiverOddEvenSE(receiverOddEvenSE), receiverOddOddNE(receiverOddOddNE), iprocessor(iprocessor) { - if (!(sendDir == D3Q27System::E || sendDir == D3Q27System::W || sendDir == D3Q27System::N || - sendDir == D3Q27System::S || sendDir == D3Q27System::T || sendDir == D3Q27System::B || - sendDir == D3Q27System::NE || sendDir == D3Q27System::SW || sendDir == D3Q27System::SE || - sendDir == D3Q27System::NW || sendDir == D3Q27System::TE || sendDir == D3Q27System::BW || - sendDir == D3Q27System::BE || sendDir == D3Q27System::TW || sendDir == D3Q27System::TN || - sendDir == D3Q27System::BS || sendDir == D3Q27System::BN || sendDir == D3Q27System::TS || - sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSE || - sendDir == D3Q27System::TSW || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW || - sendDir == D3Q27System::BSE || sendDir == D3Q27System::BSW)) { + if (!(sendDir == D3Q27System::DIR_P00 || sendDir == D3Q27System::DIR_M00 || sendDir == D3Q27System::DIR_0P0 || + sendDir == D3Q27System::DIR_0M0 || sendDir == D3Q27System::DIR_00P || sendDir == D3Q27System::DIR_00M || + sendDir == D3Q27System::DIR_PP0 || sendDir == D3Q27System::DIR_MM0 || sendDir == D3Q27System::DIR_PM0 || + sendDir == D3Q27System::DIR_MP0 || sendDir == D3Q27System::DIR_P0P || sendDir == D3Q27System::DIR_M0M || + sendDir == D3Q27System::DIR_P0M || sendDir == D3Q27System::DIR_M0P || sendDir == D3Q27System::DIR_0PP || + sendDir == D3Q27System::DIR_0MM || sendDir == D3Q27System::DIR_0PM || sendDir == D3Q27System::DIR_0MP || + sendDir == D3Q27System::DIR_PPP || sendDir == D3Q27System::DIR_MPP || sendDir == D3Q27System::DIR_PMP || + sendDir == D3Q27System::DIR_MMP || sendDir == D3Q27System::DIR_PPM || sendDir == D3Q27System::DIR_MPM || + sendDir == D3Q27System::DIR_PMM || sendDir == D3Q27System::DIR_MMM)) { throw UbException(UB_EXARGS, "invalid constructor for this direction"); } } @@ -310,44 +310,44 @@ void CoarseToFineVectorConnector<VectorTransmitter>::init() int iCellSize = 8; // size of interpolation cell switch (this->sendDir) { - case E: - case W: + case DIR_P00: + case DIR_M00: sendSize = bMaxX2 * bMaxX3 * sendDataPerNode * iCellSize; break; - case N: - case S: + case DIR_0P0: + case DIR_0M0: sendSize = bMaxX1 * bMaxX3 * sendDataPerNode * iCellSize; break; - case T: - case B: + case DIR_00P: + case DIR_00M: sendSize = bMaxX1 * bMaxX2 * sendDataPerNode * iCellSize; break; - case NE: - case SW: - case SE: - case NW: + case DIR_PP0: + case DIR_MM0: + case DIR_PM0: + case DIR_MP0: sendSize = 2 * bMaxX3 * sendDataPerNode * iCellSize; break; - case TE: - case BW: - case BE: - case TW: + case DIR_P0P: + case DIR_M0M: + case DIR_P0M: + case DIR_M0P: sendSize = 2 * bMaxX2 * sendDataPerNode * iCellSize; break; - case TN: - case BS: - case BN: - case TS: + case DIR_0PP: + case DIR_0MM: + case DIR_0PM: + case DIR_0MP: sendSize = 2 * bMaxX1 * sendDataPerNode * iCellSize; break; - case TNE: - case TNW: - case TSE: - case TSW: - case BNE: - case BNW: - case BSE: - case BSW: + case DIR_PPP: + case DIR_MPP: + case DIR_PMP: + case DIR_MMP: + case DIR_PPM: + case DIR_MPM: + case DIR_PMM: + case DIR_MMM: sendSize = 6 * bMaxX1 * sendDataPerNode * iCellSize; break; default: @@ -408,7 +408,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() int lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3; switch (sendDir) { - case E: + case DIR_P00: lMinX1 = maxX1 - 3; lMaxX1 = lMinX1 + 1; @@ -428,7 +428,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false); fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case W: + case DIR_M00: lMinX1 = 1; lMaxX1 = lMinX1 + 1; @@ -448,7 +448,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false); fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case N: + case DIR_0P0: lMinX2 = maxX2 - 3; lMaxX2 = lMinX2 + 1; @@ -468,7 +468,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false); fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case S: + case DIR_0M0: lMinX2 = 1; lMaxX2 = lMinX2 + 1; @@ -488,7 +488,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false); fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case T: + case DIR_00P: lMinX3 = maxX3 - 3; lMaxX3 = lMinX3 + 1; @@ -508,7 +508,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() getLocalMinMax(minX2, maxX2, false, lMinX2, lMaxX2, false); fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case B: + case DIR_00M: lMinX3 = 1; lMaxX3 = lMinX3 + 1; @@ -529,7 +529,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; /// N-S-E-W - case NE: + case DIR_PP0: lMinX1 = maxX1 - 3; lMaxX1 = lMinX1 + 2; lMinX2 = maxX2 - 3; @@ -543,7 +543,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case SW: + case DIR_MM0: lMinX1 = 0; lMaxX1 = lMinX1 + 2; lMinX2 = 0; @@ -557,7 +557,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case SE: + case DIR_PM0: lMinX1 = maxX1 - 3; lMaxX1 = lMinX1 + 2; lMinX2 = 0; @@ -571,7 +571,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case NW: + case DIR_MP0: lMinX1 = 0; lMaxX1 = lMinX1 + 2; lMinX2 = maxX2 - 3; @@ -585,7 +585,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; /////T-B-E-W - case TE: + case DIR_P0P: lMinX1 = maxX1 - 3; lMaxX1 = lMinX1 + 2; lMinX3 = maxX3 - 3; @@ -599,7 +599,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case BW: + case DIR_M0M: lMinX1 = 0; lMaxX1 = lMinX1 + 2; lMinX3 = 0; @@ -613,7 +613,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case BE: + case DIR_P0M: lMinX1 = maxX1 - 3; lMaxX1 = lMinX1 + 2; lMinX3 = 0; @@ -627,7 +627,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case TW: + case DIR_M0P: lMinX1 = 0; lMaxX1 = lMinX1 + 2; lMinX3 = maxX3 - 3; @@ -642,7 +642,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; //// /////T-B-N-S - case TN: + case DIR_0PP: lMinX2 = maxX2 - 3; lMaxX2 = lMinX2 + 2; lMinX3 = maxX3 - 3; @@ -656,7 +656,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case BS: + case DIR_0MM: lMinX2 = 0; lMaxX2 = lMinX2 + 2; lMinX3 = 0; @@ -670,7 +670,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case BN: + case DIR_0PM: lMinX2 = maxX2 - 3; lMaxX2 = lMinX2 + 2; lMinX3 = 0; @@ -684,7 +684,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; - case TS: + case DIR_0MP: lMinX2 = 0; lMaxX2 = lMinX2 + 2; lMinX3 = maxX3 - 3; @@ -699,7 +699,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() break; // TNE - case TNE: + case DIR_PPP: lMinX1 = maxX1 - 3; lMaxX1 = maxX1 - 1; lMinX2 = maxX2 - 3; @@ -710,7 +710,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // TNW - case TNW: + case DIR_MPP: lMinX1 = 0; lMaxX1 = 2; lMinX2 = maxX2 - 3; @@ -721,7 +721,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // TSE - case TSE: + case DIR_PMP: lMinX1 = maxX1 - 3; lMaxX1 = maxX1 - 1; lMinX2 = 0; @@ -732,7 +732,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // TSW - case TSW: + case DIR_MMP: lMinX1 = 0; lMaxX1 = 2; lMinX2 = 0; @@ -743,7 +743,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // BNE - case BNE: + case DIR_PPM: lMinX1 = maxX1 - 3; lMaxX1 = maxX1 - 1; lMinX2 = maxX2 - 3; @@ -754,7 +754,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // BNW - case BNW: + case DIR_MPM: lMinX1 = 0; lMaxX1 = 2; lMinX2 = maxX2 - 3; @@ -765,7 +765,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // BSE - case BSE: + case DIR_PMM: lMinX1 = maxX1 - 3; lMaxX1 = maxX1 - 1; lMinX2 = 0; @@ -776,7 +776,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVectorExt(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // BSW - case BSW: + case DIR_MMM: lMinX1 = 0; lMaxX1 = 2; lMinX2 = 0; @@ -912,7 +912,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() int dummy; switch (sendDir) { - case E: + case DIR_P00: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 1; getLocalMinMax(minX2, maxX2, true, lMinX2, lMaxX2, true); @@ -935,7 +935,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() getLocalMinMax(dummy, dummy, dummy, dummy, lMaxX2, lMaxX3); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case W: + case DIR_M00: lMinX1 = 3; lMaxX1 = lMinX1 + 1; getLocalMinMax(minX2, maxX2, true, lMinX2, lMaxX2, true); @@ -958,7 +958,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() getLocalMinMax(dummy, dummy, dummy, dummy, lMaxX2, lMaxX3); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case N: + case DIR_0P0: lMinX2 = maxX2 - 4; lMaxX2 = lMinX2 + 1; getLocalMinMax(minX1, maxX1, true, lMinX1, lMaxX1, true); @@ -981,7 +981,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() getLocalMinMax(dummy, dummy, dummy, lMaxX1, dummy, lMaxX3); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case S: + case DIR_0M0: lMinX2 = 3; lMaxX2 = lMinX2 + 1; getLocalMinMax(minX1, maxX1, true, lMinX1, lMaxX1, true); @@ -1004,7 +1004,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() getLocalMinMax(dummy, dummy, dummy, lMaxX1, dummy, lMaxX3); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case T: + case DIR_00P: lMinX3 = maxX3 - 4; lMaxX3 = lMinX3 + 1; getLocalMinMax(minX1, maxX1, true, lMinX1, lMaxX1, true); @@ -1027,7 +1027,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() getLocalMinMax(dummy, dummy, dummy, lMaxX1, lMaxX2, dummy); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); break; - case B: + case DIR_00M: lMinX3 = 3; lMaxX3 = lMinX3 + 1; getLocalMinMax(minX1, maxX1, true, lMinX1, lMaxX1, true); @@ -1052,7 +1052,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; // /////E-W-N-S - case NE: + case DIR_PP0: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 3; lMinX2 = maxX2 - 4; @@ -1079,7 +1079,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case SW: + case DIR_MM0: lMinX1 = 1; lMaxX1 = lMinX1 + 3; lMinX2 = 3; @@ -1106,7 +1106,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case SE: + case DIR_PM0: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 3; lMinX2 = 3; @@ -1133,7 +1133,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case NW: + case DIR_MP0: lMinX1 = 1; lMaxX1 = lMinX1 + 3; lMinX2 = maxX2 - 4; @@ -1160,7 +1160,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; // /////T-B-E-W - case TE: + case DIR_P0P: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 3; lMinX3 = maxX3 - 4; @@ -1187,7 +1187,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case BW: + case DIR_M0M: lMinX1 = 1; lMaxX1 = lMinX1 + 3; lMinX3 = 3; @@ -1214,7 +1214,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case BE: + case DIR_P0M: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 3; lMinX3 = 3; @@ -1241,7 +1241,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case TW: + case DIR_M0P: lMinX1 = 1; lMaxX1 = lMinX1 + 3; lMinX3 = maxX3 - 4; @@ -1269,7 +1269,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; /////////////////////////T-N-B-S - case TN: + case DIR_0PP: lMinX2 = maxX2 - 4; lMaxX2 = lMinX2 + 3; lMinX3 = maxX3 - 4; @@ -1296,7 +1296,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case BS: + case DIR_0MM: lMinX2 = 1; lMaxX2 = lMinX2 + 3; lMinX3 = 3; @@ -1323,7 +1323,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case BN: + case DIR_0PM: lMinX2 = maxX2 - 4; lMaxX2 = lMinX2 + 3; lMinX3 = 3; @@ -1350,7 +1350,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; - case TS: + case DIR_0MP: lMinX2 = 1; lMaxX2 = lMinX2 + 3; lMinX3 = maxX3 - 4; @@ -1378,7 +1378,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; // TNE - case TNE: + case DIR_PPP: lMinX1 = maxX1 - 4; lMaxX1 = maxX1 - 3; lMinX2 = maxX2 - 4; @@ -1405,7 +1405,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; // TNW - case TNW: + case DIR_MPP: lMinX1 = 3; lMaxX1 = 4; lMinX2 = maxX2 - 4; @@ -1432,7 +1432,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; // TSE - case TSE: + case DIR_PMP: lMinX1 = maxX1 - 4; lMaxX1 = maxX1 - 3; lMinX2 = 1; @@ -1458,7 +1458,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // TSW - case TSW: + case DIR_MMP: lMinX1 = 3; lMaxX1 = 4; lMinX2 = 1; @@ -1484,7 +1484,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // BNE - case BNE: + case DIR_PPM: lMinX1 = maxX1 - 4; lMaxX1 = maxX1 - 3; lMinX2 = maxX2 - 4; @@ -1511,7 +1511,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; // BNW - case BNW: + case DIR_MPM: lMinX1 = 3; lMaxX1 = 4; lMinX2 = maxX2 - 4; @@ -1537,7 +1537,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // BSE - case BSE: + case DIR_PMM: lMinX1 = maxX1 - 4; lMaxX1 = maxX1 - 3; lMinX2 = 1; @@ -1563,7 +1563,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataEvEv, indexEvEv); break; // BSW - case BSW: + case DIR_MMM: lMinX1 = 3; lMaxX1 = 4; lMinX2 = 1; @@ -1634,55 +1634,55 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, int TmaxX2 = maxX2; int TmaxX3 = maxX3; - if (block.lock()->hasInterpolationFlagCF(E)) { + if (block.lock()->hasInterpolationFlagCF(DIR_P00)) { if (maxX1 == TmaxX1) maxX1 -= 2; } - if (block.lock()->hasInterpolationFlagCF(W)) { + if (block.lock()->hasInterpolationFlagCF(DIR_M00)) { if (minX1 == TminX1) minX1 += 2; } - if (block.lock()->hasInterpolationFlagCF(N)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0P0)) { if (maxX2 == TmaxX2) maxX2 -= 2; } - if (block.lock()->hasInterpolationFlagCF(S)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0M0)) { if (minX2 == TminX2) minX2 += 2; } - if (block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (maxX3 == TmaxX3) maxX3 -= 2; } - if (block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (minX3 == TminX3) minX3 += 2; } // E-W-N-S - if (block.lock()->hasInterpolationFlagCF(NE) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(E)) { + if (block.lock()->hasInterpolationFlagCF(DIR_PP0) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_P00)) { if (maxX1 == TmaxX1) maxX1 -= 2; if (maxX2 == TmaxX2) maxX2 -= 2; } - if (block.lock()->hasInterpolationFlagCF(SW) && !block.lock()->hasInterpolationFlagCF(W) && - !block.lock()->hasInterpolationFlagCF(S)) { + if (block.lock()->hasInterpolationFlagCF(DIR_MM0) && !block.lock()->hasInterpolationFlagCF(DIR_M00) && + !block.lock()->hasInterpolationFlagCF(DIR_0M0)) { if (minX1 == TminX1) minX1 += 2; if (minX2 == TminX2) minX2 += 2; } - if (block.lock()->hasInterpolationFlagCF(SE) && !block.lock()->hasInterpolationFlagCF(E) && - !block.lock()->hasInterpolationFlagCF(S)) { + if (block.lock()->hasInterpolationFlagCF(DIR_PM0) && !block.lock()->hasInterpolationFlagCF(DIR_P00) && + !block.lock()->hasInterpolationFlagCF(DIR_0M0)) { if (maxX1 == TmaxX1) maxX1 -= 2; if (minX2 == TminX2) minX2 += 2; } - if (block.lock()->hasInterpolationFlagCF(NW) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(W)) { + if (block.lock()->hasInterpolationFlagCF(DIR_MP0) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_M00)) { if (minX1 == TminX1) minX1 += 2; if (maxX2 == TmaxX2) @@ -1690,29 +1690,29 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } // ////T-B-E-W - if (block.lock()->hasInterpolationFlagCF(TE) && !block.lock()->hasInterpolationFlagCF(E) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_P0P) && !block.lock()->hasInterpolationFlagCF(DIR_P00) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (maxX1 == TmaxX1) maxX1 -= 2; if (maxX3 == TmaxX3) maxX3 -= 2; } - if (block.lock()->hasInterpolationFlagCF(BW) && !block.lock()->hasInterpolationFlagCF(W) && - !block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_M0M) && !block.lock()->hasInterpolationFlagCF(DIR_M00) && + !block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (minX1 == TminX1) minX1 += 2; if (minX3 == TminX3) minX3 += 2; } - if (block.lock()->hasInterpolationFlagCF(BE) && !block.lock()->hasInterpolationFlagCF(E) && - !block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_P0M) && !block.lock()->hasInterpolationFlagCF(DIR_P00) && + !block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (maxX1 == TmaxX1) maxX1 -= 2; if (minX3 == TminX3) minX3 += 2; } - if (block.lock()->hasInterpolationFlagCF(TW) && !block.lock()->hasInterpolationFlagCF(W) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_M0P) && !block.lock()->hasInterpolationFlagCF(DIR_M00) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (minX1 == TminX1) minX1 += 2; if (maxX3 == TmaxX3) @@ -1720,29 +1720,29 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } ////T-B-N-S - if (block.lock()->hasInterpolationFlagCF(TN) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0PP) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (maxX2 == TmaxX2) maxX2 -= 2; if (maxX3 == TmaxX3) maxX3 -= 2; } - if (block.lock()->hasInterpolationFlagCF(BS) && !block.lock()->hasInterpolationFlagCF(S) && - !block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0MM) && !block.lock()->hasInterpolationFlagCF(DIR_0M0) && + !block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (minX2 == TminX2) minX2 += 2; if (minX3 == TminX3) minX3 += 2; } - if (block.lock()->hasInterpolationFlagCF(BN) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0PM) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (maxX2 == TmaxX2) maxX2 -= 2; if (minX3 == TminX3) minX3 += 2; } - if (block.lock()->hasInterpolationFlagCF(TS) && !block.lock()->hasInterpolationFlagCF(S) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0MP) && !block.lock()->hasInterpolationFlagCF(DIR_0M0) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (minX2 == TminX2) minX2 += 2; if (maxX3 == TmaxX3) @@ -1750,10 +1750,10 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } // if - // (block.lock()->hasInterpolationFlagCF(D3Q27System::TNE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::TN)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::NE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::T)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::N) - // && !block.lock()->hasInterpolationFlagCF(D3Q27System::E)) if - // (!block.lock()->hasInterpolationFlagCF(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::T)&& - // !block.lock()->hasInterpolationFlagCF(D3Q27System::E)) + // (block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_PPP)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_00P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_0P0) + // && !block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P00)) if + // (!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_00P)&& + // !block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P00)) //{ // if (maxX1==TmaxX1) maxX1 -= 2; // if (maxX2==TmaxX2) maxX2 -= 2; @@ -1774,55 +1774,55 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, int TmaxX2 = maxX2; int TmaxX3 = maxX3; - if (block.lock()->hasInterpolationFlagCF(E)) { + if (block.lock()->hasInterpolationFlagCF(DIR_P00)) { if (maxX1 == TmaxX1) maxX1 -= 2; } - if (block.lock()->hasInterpolationFlagCF(W)) { + if (block.lock()->hasInterpolationFlagCF(DIR_M00)) { if (minX1 == TminX1) minX1 += 2; } - if (block.lock()->hasInterpolationFlagCF(N)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0P0)) { if (maxX2 == TmaxX2) maxX2 -= 2; } - if (block.lock()->hasInterpolationFlagCF(S)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0M0)) { if (minX2 == TminX2) minX2 += 2; } - if (block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (maxX3 == TmaxX3) maxX3 -= 2; } - if (block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (minX3 == TminX3) minX3 += 2; } // E-W-N-S - if (block.lock()->hasInterpolationFlagCF(NE) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(E)) { + if (block.lock()->hasInterpolationFlagCF(DIR_PP0) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_P00)) { if (maxX1 == TmaxX1) maxX1 -= 2; if (maxX2 == TmaxX2) maxX2 -= 2; } - if (block.lock()->hasInterpolationFlagCF(SW) && !block.lock()->hasInterpolationFlagCF(W) && - !block.lock()->hasInterpolationFlagCF(S)) { + if (block.lock()->hasInterpolationFlagCF(DIR_MM0) && !block.lock()->hasInterpolationFlagCF(DIR_M00) && + !block.lock()->hasInterpolationFlagCF(DIR_0M0)) { if (minX1 == TminX1) minX1 += 2; if (minX2 == TminX2) minX2 += 2; } - if (block.lock()->hasInterpolationFlagCF(SE) && !block.lock()->hasInterpolationFlagCF(E) && - !block.lock()->hasInterpolationFlagCF(S)) { + if (block.lock()->hasInterpolationFlagCF(DIR_PM0) && !block.lock()->hasInterpolationFlagCF(DIR_P00) && + !block.lock()->hasInterpolationFlagCF(DIR_0M0)) { if (maxX1 == TmaxX1) maxX1 -= 2; if (minX2 == TminX2) minX2 += 2; } - if (block.lock()->hasInterpolationFlagCF(NW) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(W)) { + if (block.lock()->hasInterpolationFlagCF(DIR_MP0) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_M00)) { if (minX1 == TminX1) minX1 += 2; if (maxX2 == TmaxX2) @@ -1830,29 +1830,29 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } // ////T-B-E-W - if (block.lock()->hasInterpolationFlagCF(TE) && !block.lock()->hasInterpolationFlagCF(E) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_P0P) && !block.lock()->hasInterpolationFlagCF(DIR_P00) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (maxX1 == TmaxX1) maxX1 -= 2; if (maxX3 == TmaxX3) maxX3 -= 2; } - if (block.lock()->hasInterpolationFlagCF(BW) && !block.lock()->hasInterpolationFlagCF(W) && - !block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_M0M) && !block.lock()->hasInterpolationFlagCF(DIR_M00) && + !block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (minX1 == TminX1) minX1 += 2; if (minX3 == TminX3) minX3 += 2; } - if (block.lock()->hasInterpolationFlagCF(BE) && !block.lock()->hasInterpolationFlagCF(E) && - !block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_P0M) && !block.lock()->hasInterpolationFlagCF(DIR_P00) && + !block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (maxX1 == TmaxX1) maxX1 -= 2; if (minX3 == TminX3) minX3 += 2; } - if (block.lock()->hasInterpolationFlagCF(TW) && !block.lock()->hasInterpolationFlagCF(W) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_M0P) && !block.lock()->hasInterpolationFlagCF(DIR_M00) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (minX1 == TminX1) minX1 += 2; if (maxX3 == TmaxX3) @@ -1860,29 +1860,29 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } ////T-B-N-S - if (block.lock()->hasInterpolationFlagCF(TN) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0PP) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (maxX2 == TmaxX2) maxX2 -= 2; if (maxX3 == TmaxX3) maxX3 -= 2; } - if (block.lock()->hasInterpolationFlagCF(BS) && !block.lock()->hasInterpolationFlagCF(S) && - !block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0MM) && !block.lock()->hasInterpolationFlagCF(DIR_0M0) && + !block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (minX2 == TminX2) minX2 += 2; if (minX3 == TminX3) minX3 += 2; } - if (block.lock()->hasInterpolationFlagCF(BN) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(B)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0PM) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_00M)) { if (maxX2 == TmaxX2) maxX2 -= 2; if (minX3 == TminX3) minX3 += 2; } - if (block.lock()->hasInterpolationFlagCF(TS) && !block.lock()->hasInterpolationFlagCF(S) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0MP) && !block.lock()->hasInterpolationFlagCF(DIR_0M0) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { if (minX2 == TminX2) minX2 += 2; if (maxX3 == TmaxX3) @@ -1890,8 +1890,8 @@ void CoarseToFineVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } // if - // (block.lock()->hasInterpolationFlagCF(D3Q27System::TNE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::TN)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::NE)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::T)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::N) - // && !block.lock()->hasInterpolationFlagCF(D3Q27System::E)) + // (block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_PPP)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_00P)&&!block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_0P0) + // && !block.lock()->hasInterpolationFlagCF(D3Q27System::DIR_P00)) //{ // if (maxX1==TmaxX1) maxX1 -= 2; // if (maxX2==TmaxX2) maxX2 -= 2; @@ -1923,7 +1923,7 @@ void CoarseToFineVectorConnector<VectorTransmitter>::findCFnodes() int lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3; using namespace D3Q27System; - if (block.lock()->hasInterpolationFlagCF(W)) { + if (block.lock()->hasInterpolationFlagCF(DIR_M00)) { lMinX1 = 1; lMaxX1 = lMinX1 + 1; @@ -1943,8 +1943,8 @@ void CoarseToFineVectorConnector<VectorTransmitter>::findCFnodes() getLocalMinMax(minX3, maxX3, false, lMinX3, lMaxX3, false); findCFnodes(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, dataOdOd, indexOdOd); } - if (block.lock()->hasInterpolationFlagCF(TN) && !block.lock()->hasInterpolationFlagCF(N) && - !block.lock()->hasInterpolationFlagCF(T)) { + if (block.lock()->hasInterpolationFlagCF(DIR_0PP) && !block.lock()->hasInterpolationFlagCF(DIR_0P0) && + !block.lock()->hasInterpolationFlagCF(DIR_00P)) { lMinX2 = maxX2 - 3; lMaxX2 = lMinX2 + 1; lMinX3 = maxX3 - 3; diff --git a/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h index e430a0ad30dd7e3d0cd647271d79dd0c61f6b1f8..f8809f17b6676148faf3a94a1b9fcabede72fe58 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h +++ b/src/cpu/VirtualFluidsCore/Connectors/FineToCoarseVectorConnector.h @@ -143,16 +143,16 @@ FineToCoarseVectorConnector<VectorTransmitter>::FineToCoarseVectorConnector(SPtr : Block3DConnector(sendDir), block(block), sender(sender), receiver(receiver), iprocessor(iprocessor), connType(connType) { - if (!(sendDir == D3Q27System::E || sendDir == D3Q27System::W || sendDir == D3Q27System::N || - sendDir == D3Q27System::S || sendDir == D3Q27System::T || sendDir == D3Q27System::B || - sendDir == D3Q27System::NE || sendDir == D3Q27System::SW || sendDir == D3Q27System::SE || - sendDir == D3Q27System::NW || sendDir == D3Q27System::TE || sendDir == D3Q27System::BW || - sendDir == D3Q27System::BE || sendDir == D3Q27System::TW || sendDir == D3Q27System::TN || - sendDir == D3Q27System::BS || sendDir == D3Q27System::BN || sendDir == D3Q27System::TS + if (!(sendDir == D3Q27System::DIR_P00 || sendDir == D3Q27System::DIR_M00 || sendDir == D3Q27System::DIR_0P0 || + sendDir == D3Q27System::DIR_0M0 || sendDir == D3Q27System::DIR_00P || sendDir == D3Q27System::DIR_00M || + sendDir == D3Q27System::DIR_PP0 || sendDir == D3Q27System::DIR_MM0 || sendDir == D3Q27System::DIR_PM0 || + sendDir == D3Q27System::DIR_MP0 || sendDir == D3Q27System::DIR_P0P || sendDir == D3Q27System::DIR_M0M || + sendDir == D3Q27System::DIR_P0M || sendDir == D3Q27System::DIR_M0P || sendDir == D3Q27System::DIR_0PP || + sendDir == D3Q27System::DIR_0MM || sendDir == D3Q27System::DIR_0PM || sendDir == D3Q27System::DIR_0MP - || sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSE || - sendDir == D3Q27System::TSW || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW || - sendDir == D3Q27System::BSE || sendDir == D3Q27System::BSW + || sendDir == D3Q27System::DIR_PPP || sendDir == D3Q27System::DIR_MPP || sendDir == D3Q27System::DIR_PMP || + sendDir == D3Q27System::DIR_MMP || sendDir == D3Q27System::DIR_PPM || sendDir == D3Q27System::DIR_MPM || + sendDir == D3Q27System::DIR_PMM || sendDir == D3Q27System::DIR_MMM )) { throw UbException(UB_EXARGS, "invalid constructor for this direction"); @@ -235,44 +235,44 @@ void FineToCoarseVectorConnector<VectorTransmitter>::init() int iCellSize = 1; // size of interpolation cell switch (this->sendDir) { - case E: - case W: + case DIR_P00: + case DIR_M00: sendSize = (bMaxX2 - 1) / 2 * (bMaxX3 - 1) / 2 * sendDataPerNode * iCellSize; break; - case N: - case S: + case DIR_0P0: + case DIR_0M0: sendSize = (bMaxX1 - 1) / 2 * (bMaxX3 - 1) / 2 * sendDataPerNode * iCellSize; break; - case T: - case B: + case DIR_00P: + case DIR_00M: sendSize = (bMaxX1 - 1) / 2 * (bMaxX2 - 1) / 2 * sendDataPerNode * iCellSize; break; - case NE: - case SW: - case SE: - case NW: + case DIR_PP0: + case DIR_MM0: + case DIR_PM0: + case DIR_MP0: sendSize = (3 * bMaxX3 - 3) * sendDataPerNode * iCellSize; break; // buffer overhead, should be (3*bMaxX3-6) for even bMax3 - case TE: - case BW: - case BE: - case TW: + case DIR_P0P: + case DIR_M0M: + case DIR_P0M: + case DIR_M0P: sendSize = (3 * bMaxX2 - 3) * sendDataPerNode * iCellSize; break; - case TN: - case BS: - case BN: - case TS: + case DIR_0PP: + case DIR_0MM: + case DIR_0PM: + case DIR_0MP: sendSize = (3 * bMaxX1 - 3) * sendDataPerNode * iCellSize; break; - case TNE: - case TNW: - case TSE: - case TSW: - case BNE: - case BNW: - case BSE: - case BSW: + case DIR_PPP: + case DIR_MPP: + case DIR_PMP: + case DIR_MMP: + case DIR_PPM: + case DIR_MPM: + case DIR_PMM: + case DIR_MMM: sendSize = 3 * (3 * bMaxX1 - 3) * sendDataPerNode * iCellSize; break; default: @@ -321,42 +321,42 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() ////////////// switch (sendDir) { - case E: + case DIR_P00: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = maxX1 - 7; lMaxX1 = lMinX1 + 1; fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case W: + case DIR_M00: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = 5; lMaxX1 = lMinX1 + 1; fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case N: + case DIR_0P0: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX2 = maxX2 - 7; lMaxX2 = lMinX2 + 1; fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case S: + case DIR_0M0: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX2 = 5; lMaxX2 = lMinX2 + 1; fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case T: + case DIR_00P: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX3 = maxX3 - 7; lMaxX3 = lMinX3 + 1; fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case B: + case DIR_00M: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX3 = 5; @@ -365,7 +365,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // ////N-S-E-W - case NE: + case DIR_PP0: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = maxX1 - 7; @@ -380,7 +380,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() lMaxX2 = lMinX2 + 5; fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case SW: + case DIR_MM0: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); @@ -397,7 +397,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case SE: + case DIR_PM0: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = maxX1 - 7; @@ -414,7 +414,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; - case NW: + case DIR_MP0: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = 1; @@ -430,7 +430,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; //////T-B-E-W - case TE: + case DIR_P0P: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = maxX1 - 7; @@ -446,7 +446,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case BW: + case DIR_M0M: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = 1; @@ -462,7 +462,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case BE: + case DIR_P0M: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = maxX1 - 7; @@ -478,7 +478,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case TW: + case DIR_M0P: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX1 = 1; @@ -495,7 +495,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; ///////////////T-B-N-S // - case TN: + case DIR_0PP: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX2 = maxX2 - 7; @@ -511,7 +511,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case BS: + case DIR_0MM: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX2 = 1; @@ -527,7 +527,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case BN: + case DIR_0PM: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX2 = maxX2 - 7; @@ -543,7 +543,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() fillSendVector(fFrom, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case TS: + case DIR_0MP: getLocalMinMax(lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3); getLocalMins(lMinX1, lMinX2, lMinX3, oMinX1, oMinX2, oMinX3); lMinX2 = 1; @@ -560,7 +560,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // TNE - case TNE: + case DIR_PPP: lMinX1 = maxX1 - 7; lMaxX1 = maxX1 - 6; lMinX2 = maxX2 - 7; @@ -587,7 +587,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // TNW - case TNW: + case DIR_MPP: lMinX1 = 5; lMaxX1 = 6; lMinX2 = maxX2 - 7; @@ -616,7 +616,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // TSE - case TSE: + case DIR_PMP: lMinX1 = maxX1 - 7; lMaxX1 = maxX1 - 6; lMinX2 = 1; @@ -643,7 +643,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // TSW - case TSW: + case DIR_MMP: lMinX1 = 5; lMaxX1 = 6; lMinX2 = 1; @@ -670,7 +670,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // BNE - case BNE: + case DIR_PPM: lMinX1 = maxX1 - 7; lMaxX1 = maxX1 - 6; lMinX2 = maxX2 - 7; @@ -697,7 +697,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // BNW - case BNW: + case DIR_MPM: lMinX1 = 5; lMaxX1 = 6; lMinX2 = maxX2 - 7; @@ -725,7 +725,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // BSE - case BSE: + case DIR_PMM: lMinX1 = maxX1 - 7; lMaxX1 = maxX1 - 6; lMinX2 = 1; @@ -753,7 +753,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::fillSendVectors() break; // BSW - case BSW: + case DIR_MMM: lMinX1 = 5; lMaxX1 = 6; lMinX2 = 1; @@ -869,42 +869,42 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() lMaxX3 = maxX3 - 1; switch (sendDir) { - case E: + case DIR_P00: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 1; getLocalMinMaxCF(maxX2, lMinX2, lMaxX2); getLocalMinMaxCF(maxX3, lMinX3, lMaxX3); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case W: + case DIR_M00: lMinX1 = 2; lMaxX1 = lMinX1 + 1; getLocalMinMaxCF(maxX2, lMinX2, lMaxX2); getLocalMinMaxCF(maxX3, lMinX3, lMaxX3); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case N: + case DIR_0P0: lMinX2 = maxX2 - 4; lMaxX2 = lMinX2 + 1; getLocalMinMaxCF(maxX1, lMinX1, lMaxX1); getLocalMinMaxCF(maxX3, lMinX3, lMaxX3); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case S: + case DIR_0M0: lMinX2 = 2; lMaxX2 = lMinX2 + 1; getLocalMinMaxCF(maxX1, lMinX1, lMaxX1); getLocalMinMaxCF(maxX3, lMinX3, lMaxX3); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case T: + case DIR_00P: lMinX3 = maxX3 - 4; lMaxX3 = lMinX3 + 1; getLocalMinMaxCF(maxX1, lMinX1, lMaxX1); getLocalMinMaxCF(maxX2, lMinX2, lMaxX2); distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case B: + case DIR_00M: lMinX3 = 2; lMaxX3 = lMinX3 + 1; getLocalMinMaxCF(maxX1, lMinX1, lMaxX1); @@ -913,7 +913,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; /////E-W-N-S - case NE: + case DIR_PP0: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 3; lMinX2 = maxX2 - 4; @@ -922,7 +922,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case SW: + case DIR_MM0: lMinX1 = 0; lMaxX1 = lMinX1 + 3; lMinX2 = 0; @@ -931,7 +931,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case SE: + case DIR_PM0: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 3; lMinX2 = 0; @@ -940,7 +940,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case NW: + case DIR_MP0: lMinX1 = 0; lMaxX1 = lMinX1 + 3; lMinX2 = maxX2 - 4; @@ -950,7 +950,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; // // /////T-B-E-W - case TE: + case DIR_P0P: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 3; lMinX3 = maxX3 - 4; @@ -959,7 +959,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case BW: + case DIR_M0M: lMinX1 = 0; lMaxX1 = lMinX1 + 3; lMinX3 = 0; @@ -968,7 +968,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case BE: + case DIR_P0M: lMinX1 = maxX1 - 4; lMaxX1 = lMinX1 + 3; lMinX3 = 0; @@ -977,7 +977,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case TW: + case DIR_M0P: lMinX1 = 0; lMaxX1 = lMinX1 + 3; lMinX3 = maxX3 - 4; @@ -988,7 +988,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() // ////////////////T-B-N-S // - case TN: + case DIR_0PP: lMinX2 = maxX2 - 4; lMaxX2 = lMinX2 + 3; lMinX3 = maxX3 - 4; @@ -997,7 +997,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case BS: + case DIR_0MM: lMinX2 = 0; lMaxX2 = lMinX2 + 3; lMinX3 = 0; @@ -1006,7 +1006,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case BN: + case DIR_0PM: lMinX2 = maxX2 - 4; lMaxX2 = lMinX2 + 3; lMinX3 = 0; @@ -1015,7 +1015,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; - case TS: + case DIR_0MP: lMinX2 = 0; lMaxX2 = lMinX2 + 3; lMinX3 = maxX3 - 4; @@ -1025,7 +1025,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() break; // //TNE - case TNE: + case DIR_PPP: lMinX1 = maxX1 - 4; lMaxX1 = maxX1 - 1; lMinX2 = maxX2 - 4; @@ -1035,7 +1035,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; // TNW - case TNW: + case DIR_MPP: lMinX1 = 0; lMaxX1 = 3; lMinX2 = maxX2 - 4; @@ -1045,7 +1045,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; // TSE - case TSE: + case DIR_PMP: lMinX1 = maxX1 - 4; lMaxX1 = maxX1 - 1; lMinX2 = 0; @@ -1055,7 +1055,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; // TSW - case TSW: + case DIR_MMP: lMinX1 = 0; lMaxX1 = 3; lMinX2 = 0; @@ -1065,7 +1065,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; // BNE - case BNE: + case DIR_PPM: lMinX1 = maxX1 - 4; lMaxX1 = maxX1 - 1; lMinX2 = maxX2 - 4; @@ -1075,7 +1075,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; // BNW - case BNW: + case DIR_MPM: lMinX1 = 0; lMaxX1 = 3; lMinX2 = maxX2 - 4; @@ -1085,7 +1085,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; // BSE - case BSE: + case DIR_PMM: lMinX1 = maxX1 - 4; lMaxX1 = maxX1 - 1; lMinX2 = 0; @@ -1095,7 +1095,7 @@ void FineToCoarseVectorConnector<VectorTransmitter>::distributeReceiveVectors() distributeReceiveVector(fTo, lMinX1, lMinX2, lMinX3, lMaxX1, lMaxX2, lMaxX3, data, index); break; // BSW - case BSW: + case DIR_MMM: lMinX1 = 0; lMaxX1 = 3; lMinX2 = 0; @@ -1163,56 +1163,56 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, int TmaxX2 = maxX2; int TmaxX3 = maxX3; - if (block.lock()->hasInterpolationFlagFC(E)) { + if (block.lock()->hasInterpolationFlagFC(DIR_P00)) { if (maxX1 == TmaxX1) maxX1 -= 3; } - if (block.lock()->hasInterpolationFlagFC(W)) { + if (block.lock()->hasInterpolationFlagFC(DIR_M00)) { if (minX1 == TminX1) minX1 += 4; } - if (block.lock()->hasInterpolationFlagFC(N)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0P0)) { if (maxX2 == TmaxX2) maxX2 -= 3; } - if (block.lock()->hasInterpolationFlagFC(S)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0M0)) { if (minX2 == TminX2) minX2 += 4; } - if (block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (maxX3 == TmaxX3) maxX3 -= 3; } - if (block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (minX3 == TminX3) minX3 += 4; } //////////// /////E-W-N-S - if (block.lock()->hasInterpolationFlagFC(NE) && !block.lock()->hasInterpolationFlagFC(N) && - !block.lock()->hasInterpolationFlagFC(E)) { + if (block.lock()->hasInterpolationFlagFC(DIR_PP0) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) && + !block.lock()->hasInterpolationFlagFC(DIR_P00)) { if (maxX1 == TmaxX1) maxX1 -= 3; if (maxX2 == TmaxX2) maxX2 -= 3; } - if (block.lock()->hasInterpolationFlagFC(SW) && !block.lock()->hasInterpolationFlagFC(W) && - !block.lock()->hasInterpolationFlagFC(S)) { + if (block.lock()->hasInterpolationFlagFC(DIR_MM0) && !block.lock()->hasInterpolationFlagFC(DIR_M00) && + !block.lock()->hasInterpolationFlagFC(DIR_0M0)) { if (minX1 == TminX1) minX1 += 4; if (minX2 == TminX2) minX2 += 4; } - if (block.lock()->hasInterpolationFlagFC(SE) && !block.lock()->hasInterpolationFlagFC(E) && - !block.lock()->hasInterpolationFlagFC(S)) { + if (block.lock()->hasInterpolationFlagFC(DIR_PM0) && !block.lock()->hasInterpolationFlagFC(DIR_P00) && + !block.lock()->hasInterpolationFlagFC(DIR_0M0)) { if (maxX1 == TmaxX1) maxX1 -= 3; if (minX2 == TminX2) minX2 += 4; } - if (block.lock()->hasInterpolationFlagFC(NW) && !block.lock()->hasInterpolationFlagFC(N) && - !block.lock()->hasInterpolationFlagFC(W)) { + if (block.lock()->hasInterpolationFlagFC(DIR_MP0) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) && + !block.lock()->hasInterpolationFlagFC(DIR_M00)) { if (minX1 == TminX1) minX1 += 4; if (maxX2 == TmaxX2) @@ -1220,29 +1220,29 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } //////T-B-E-W - if (block.lock()->hasInterpolationFlagFC(TE) && !block.lock()->hasInterpolationFlagFC(E) && - !block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_P0P) && !block.lock()->hasInterpolationFlagFC(DIR_P00) && + !block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (maxX1 == TmaxX1) maxX1 -= 3; if (maxX3 == TmaxX3) maxX3 -= 3; } - if (block.lock()->hasInterpolationFlagFC(BW) && !block.lock()->hasInterpolationFlagFC(W) && - !block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_M0M) && !block.lock()->hasInterpolationFlagFC(DIR_M00) && + !block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (minX1 == TminX1) minX1 += 4; if (minX3 == TminX3) minX3 += 4; } - if (block.lock()->hasInterpolationFlagFC(BE) && !block.lock()->hasInterpolationFlagFC(E) && - !block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_P0M) && !block.lock()->hasInterpolationFlagFC(DIR_P00) && + !block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (maxX1 == TmaxX1) maxX1 -= 3; if (minX3 == TminX3) minX3 += 4; } - if (block.lock()->hasInterpolationFlagFC(TW) && !block.lock()->hasInterpolationFlagFC(W) && - !block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_M0P) && !block.lock()->hasInterpolationFlagFC(DIR_M00) && + !block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (minX1 == TminX1) minX1 += 4; if (maxX3 == TmaxX3) @@ -1250,29 +1250,29 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } ////T-B-N-S - if (block.lock()->hasInterpolationFlagFC(TN) && !block.lock()->hasInterpolationFlagFC(N) && - !block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0PP) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) && + !block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (maxX2 == TmaxX2) maxX2 -= 3; if (maxX3 == TmaxX3) maxX3 -= 3; } - if (block.lock()->hasInterpolationFlagFC(BS) && !block.lock()->hasInterpolationFlagFC(S) && - !block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0MM) && !block.lock()->hasInterpolationFlagFC(DIR_0M0) && + !block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (minX2 == TminX2) minX2 += 4; if (minX3 == TminX3) minX3 += 4; } - if (block.lock()->hasInterpolationFlagFC(BN) && !block.lock()->hasInterpolationFlagFC(N) && - !block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0PM) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) && + !block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (maxX2 == TmaxX2) maxX2 -= 3; if (minX3 == TminX3) minX3 += 4; } - if (block.lock()->hasInterpolationFlagFC(TS) && !block.lock()->hasInterpolationFlagFC(S) && - !block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0MP) && !block.lock()->hasInterpolationFlagFC(DIR_0M0) && + !block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (minX2 == TminX2) minX2 += 4; if (maxX3 == TmaxX3) @@ -1280,10 +1280,10 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } // if - // (block.lock()->hasInterpolationFlagFC(D3Q27System::TNE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::TN)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::NE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::T)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::N) - // && !block.lock()->hasInterpolationFlagFC(D3Q27System::E)) if - // (!block.lock()->hasInterpolationFlagFC(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::T) && - // !block.lock()->hasInterpolationFlagFC(D3Q27System::E)) + // (block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_PPP)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_0PP)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_PP0)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_00P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_0P0) + // && !block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P00)) if + // (!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_00P) && + // !block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P00)) //{ // if (maxX1==TmaxX1) maxX1 -= 3; // if (maxX2==TmaxX2) maxX2 -= 3; @@ -1304,56 +1304,56 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, int TmaxX2 = maxX2; int TmaxX3 = maxX3; - if (block.lock()->hasInterpolationFlagFC(E)) { + if (block.lock()->hasInterpolationFlagFC(DIR_P00)) { if (maxX1 == TmaxX1) maxX1 -= 3; } - if (block.lock()->hasInterpolationFlagFC(W)) { + if (block.lock()->hasInterpolationFlagFC(DIR_M00)) { if (minX1 == TminX1) minX1 += 4; } - if (block.lock()->hasInterpolationFlagFC(N)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0P0)) { if (maxX2 == TmaxX2) maxX2 -= 3; } - if (block.lock()->hasInterpolationFlagFC(S)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0M0)) { if (minX2 == TminX2) minX2 += 4; } - if (block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (maxX3 == TmaxX3) maxX3 -= 3; } - if (block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (minX3 == TminX3) minX3 += 4; } //////////// /////E-W-N-S - if (block.lock()->hasInterpolationFlagFC(NE) && !block.lock()->hasInterpolationFlagFC(N) && - !block.lock()->hasInterpolationFlagFC(E)) { + if (block.lock()->hasInterpolationFlagFC(DIR_PP0) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) && + !block.lock()->hasInterpolationFlagFC(DIR_P00)) { if (maxX1 == TmaxX1) maxX1 -= 3; if (maxX2 == TmaxX2) maxX2 -= 3; } - if (block.lock()->hasInterpolationFlagFC(SW) && !block.lock()->hasInterpolationFlagFC(W) && - !block.lock()->hasInterpolationFlagFC(S)) { + if (block.lock()->hasInterpolationFlagFC(DIR_MM0) && !block.lock()->hasInterpolationFlagFC(DIR_M00) && + !block.lock()->hasInterpolationFlagFC(DIR_0M0)) { if (minX1 == TminX1) minX1 += 4; if (minX2 == TminX2) minX2 += 4; } - if (block.lock()->hasInterpolationFlagFC(SE) && !block.lock()->hasInterpolationFlagFC(E) && - !block.lock()->hasInterpolationFlagFC(S)) { + if (block.lock()->hasInterpolationFlagFC(DIR_PM0) && !block.lock()->hasInterpolationFlagFC(DIR_P00) && + !block.lock()->hasInterpolationFlagFC(DIR_0M0)) { if (maxX1 == TmaxX1) maxX1 -= 3; if (minX2 == TminX2) minX2 += 4; } - if (block.lock()->hasInterpolationFlagFC(NW) && !block.lock()->hasInterpolationFlagFC(N) && - !block.lock()->hasInterpolationFlagFC(W)) { + if (block.lock()->hasInterpolationFlagFC(DIR_MP0) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) && + !block.lock()->hasInterpolationFlagFC(DIR_M00)) { if (minX1 == TminX1) minX1 += 4; if (maxX2 == TmaxX2) @@ -1361,29 +1361,29 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } //////T-B-E-W - if (block.lock()->hasInterpolationFlagFC(TE) && !block.lock()->hasInterpolationFlagFC(E) && - !block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_P0P) && !block.lock()->hasInterpolationFlagFC(DIR_P00) && + !block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (maxX1 == TmaxX1) maxX1 -= 3; if (maxX3 == TmaxX3) maxX3 -= 3; } - if (block.lock()->hasInterpolationFlagFC(BW) && !block.lock()->hasInterpolationFlagFC(W) && - !block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_M0M) && !block.lock()->hasInterpolationFlagFC(DIR_M00) && + !block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (minX1 == TminX1) minX1 += 4; if (minX3 == TminX3) minX3 += 4; } - if (block.lock()->hasInterpolationFlagFC(BE) && !block.lock()->hasInterpolationFlagFC(E) && - !block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_P0M) && !block.lock()->hasInterpolationFlagFC(DIR_P00) && + !block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (maxX1 == TmaxX1) maxX1 -= 3; if (minX3 == TminX3) minX3 += 4; } - if (block.lock()->hasInterpolationFlagFC(TW) && !block.lock()->hasInterpolationFlagFC(W) && - !block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_M0P) && !block.lock()->hasInterpolationFlagFC(DIR_M00) && + !block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (minX1 == TminX1) minX1 += 4; if (maxX3 == TmaxX3) @@ -1391,29 +1391,29 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } ////T-B-N-S - if (block.lock()->hasInterpolationFlagFC(TN) && !block.lock()->hasInterpolationFlagFC(N) && - !block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0PP) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) && + !block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (maxX2 == TmaxX2) maxX2 -= 3; if (maxX3 == TmaxX3) maxX3 -= 3; } - if (block.lock()->hasInterpolationFlagFC(BS) && !block.lock()->hasInterpolationFlagFC(S) && - !block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0MM) && !block.lock()->hasInterpolationFlagFC(DIR_0M0) && + !block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (minX2 == TminX2) minX2 += 4; if (minX3 == TminX3) minX3 += 4; } - if (block.lock()->hasInterpolationFlagFC(BN) && !block.lock()->hasInterpolationFlagFC(N) && - !block.lock()->hasInterpolationFlagFC(B)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0PM) && !block.lock()->hasInterpolationFlagFC(DIR_0P0) && + !block.lock()->hasInterpolationFlagFC(DIR_00M)) { if (maxX2 == TmaxX2) maxX2 -= 3; if (minX3 == TminX3) minX3 += 4; } - if (block.lock()->hasInterpolationFlagFC(TS) && !block.lock()->hasInterpolationFlagFC(S) && - !block.lock()->hasInterpolationFlagFC(T)) { + if (block.lock()->hasInterpolationFlagFC(DIR_0MP) && !block.lock()->hasInterpolationFlagFC(DIR_0M0) && + !block.lock()->hasInterpolationFlagFC(DIR_00P)) { if (minX2 == TminX2) minX2 += 4; if (maxX3 == TmaxX3) @@ -1421,8 +1421,8 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMinMax(int &minX1, } // if - // (block.lock()->hasInterpolationFlagFC(D3Q27System::TNE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::TE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::TN)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::NE)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::T)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::N) - // && !block.lock()->hasInterpolationFlagFC(D3Q27System::E)) + // (block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_PPP)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P0P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_0PP)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_PP0)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_00P)&&!block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_0P0) + // && !block.lock()->hasInterpolationFlagFC(D3Q27System::DIR_P00)) //{ // if (maxX1==TmaxX1) maxX1 -= 3; // if (maxX2==TmaxX2) maxX2 -= 3; @@ -1448,8 +1448,8 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in using namespace D3Q27System; switch (sendDir) { - case E: - case W: + case DIR_P00: + case DIR_M00: if (connType == OddEvenSE) minX2 += oMinX2; if (connType == OddOddNE) { @@ -1459,8 +1459,8 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in if (connType == EvenOddNW) minX3 += oMinX3; break; - case N: - case S: + case DIR_0P0: + case DIR_0M0: if (connType == OddEvenSE) minX1 += oMinX1; if (connType == OddOddNE) { @@ -1470,8 +1470,8 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in if (connType == EvenOddNW) minX3 += oMinX3; break; - case T: - case B: + case DIR_00P: + case DIR_00M: if (connType == OddEvenSE) minX1 += oMinX1; if (connType == OddOddNE) { @@ -1483,10 +1483,10 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in break; ///// - case NE: - case SW: - case SE: - case NW: + case DIR_PP0: + case DIR_MM0: + case DIR_PM0: + case DIR_MP0: // case SW: if (connType == OddEvenSE) // minX2 += oMinX2; @@ -1499,10 +1499,10 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in break; ////// - case TE: - case BW: - case BE: - case TW: + case DIR_P0P: + case DIR_M0M: + case DIR_P0M: + case DIR_M0P: if (connType == OddEvenSE) // minX1 += oMinX1; if (connType == OddOddNE) { @@ -1514,10 +1514,10 @@ void FineToCoarseVectorConnector<VectorTransmitter>::getLocalMins(int &minX1, in break; // ////// - case TN: - case BS: - case BN: - case TS: + case DIR_0PP: + case DIR_0MM: + case DIR_0PM: + case DIR_0MP: if (connType == OddEvenSE) minX1 += oMinX1; if (connType == OddOddNE) { diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.cpp index 858921de452937158c620011889707f9560f09b9..18a8319589cde954b7c2202e10f3eda61b435671 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.cpp +++ b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.cpp @@ -60,7 +60,7 @@ void FullDirectConnector::sendVectors() void FullDirectConnector::exchangeData() { // EAST - if (sendDir == D3Q27System::E) { + if (sendDir == D3Q27System::DIR_P00) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x2 = 1; x2 < maxX2; x2++) { exchangeData(maxX1 - 1, x2, x3, 0, x2, x3); @@ -68,7 +68,7 @@ void FullDirectConnector::exchangeData() } } // WEST - else if (sendDir == D3Q27System::W) { + else if (sendDir == D3Q27System::DIR_M00) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x2 = 1; x2 < maxX2; x2++) { exchangeData(1, x2, x3, maxX1, x2, x3); @@ -76,7 +76,7 @@ void FullDirectConnector::exchangeData() } } // NORTH - else if (sendDir == D3Q27System::N) { + else if (sendDir == D3Q27System::DIR_0P0) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x1 = 1; x1 < maxX1; x1++) { exchangeData(x1, maxX2 - 1, x3, x1, 0, x3); @@ -84,7 +84,7 @@ void FullDirectConnector::exchangeData() } } // SOUTH - else if (sendDir == D3Q27System::S) { + else if (sendDir == D3Q27System::DIR_0M0) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x1 = 1; x1 < maxX1; x1++) { exchangeData(x1, 1, x3, x1, maxX2, x3); @@ -93,7 +93,7 @@ void FullDirectConnector::exchangeData() } // TOP - else if (sendDir == D3Q27System::T) { + else if (sendDir == D3Q27System::DIR_00P) { for (int x2 = 1; x2 < maxX2; x2++) { for (int x1 = 1; x1 < maxX1; x1++) { exchangeData(x1, x2, maxX3 - 1, x1, x2, 0); @@ -101,7 +101,7 @@ void FullDirectConnector::exchangeData() } } // BOTTOM - else if (sendDir == D3Q27System::B) { + else if (sendDir == D3Q27System::DIR_00M) { for (int x2 = 1; x2 < maxX2; x2++) { for (int x1 = 1; x1 < maxX1; x1++) { exchangeData(x1, x2, 1, x1, x2, maxX3); @@ -109,77 +109,77 @@ void FullDirectConnector::exchangeData() } } // NORTHEAST - else if (sendDir == D3Q27System::NE) { + else if (sendDir == D3Q27System::DIR_PP0) { for (int x3 = 1; x3 < maxX3; x3++) { exchangeData(maxX1 - 1, maxX2 - 1, x3, 0, 0, x3); } } // NORTHWEST - else if (sendDir == D3Q27System::NW) { + else if (sendDir == D3Q27System::DIR_MP0) { for (int x3 = 1; x3 < maxX3; x3++) { exchangeData(1, maxX2 - 1, x3, maxX1, 0, x3); } } // SOUTHWEST - else if (sendDir == D3Q27System::SW) { + else if (sendDir == D3Q27System::DIR_MM0) { for (int x3 = 1; x3 < maxX3; x3++) { exchangeData(1, 1, x3, maxX1, maxX2, x3); } } // SOUTHEAST - else if (sendDir == D3Q27System::SE) { + else if (sendDir == D3Q27System::DIR_PM0) { for (int x3 = 1; x3 < maxX3; x3++) { exchangeData(maxX1 - 1, 1, x3, 0, maxX2, x3); } - } else if (sendDir == D3Q27System::TE) + } else if (sendDir == D3Q27System::DIR_P0P) for (int x2 = 1; x2 < maxX2; x2++) { exchangeData(maxX1 - 1, x2, maxX3 - 1, 0, x2, 0); } - else if (sendDir == D3Q27System::BW) + else if (sendDir == D3Q27System::DIR_M0M) for (int x2 = 1; x2 < maxX2; x2++) { exchangeData(1, x2, 1, maxX1, x2, maxX3); } - else if (sendDir == D3Q27System::BE) + else if (sendDir == D3Q27System::DIR_P0M) for (int x2 = 1; x2 < maxX2; x2++) { exchangeData(maxX1 - 1, x2, 1, 0, x2, maxX3); } - else if (sendDir == D3Q27System::TW) + else if (sendDir == D3Q27System::DIR_M0P) for (int x2 = 1; x2 < maxX2; x2++) { exchangeData(1, x2, maxX3 - 1, maxX1, x2, 0); } - else if (sendDir == D3Q27System::TN) + else if (sendDir == D3Q27System::DIR_0PP) for (int x1 = 1; x1 < maxX1; x1++) { exchangeData(x1, maxX2 - 1, maxX3 - 1, x1, 0, 0); } - else if (sendDir == D3Q27System::BS) + else if (sendDir == D3Q27System::DIR_0MM) for (int x1 = 1; x1 < maxX1; x1++) { exchangeData(x1, 1, 1, x1, maxX2, maxX3); } - else if (sendDir == D3Q27System::BN) + else if (sendDir == D3Q27System::DIR_0PM) for (int x1 = 1; x1 < maxX1; x1++) { exchangeData(x1, maxX2 - 1, 1, x1, 0, maxX3); } - else if (sendDir == D3Q27System::TS) + else if (sendDir == D3Q27System::DIR_0MP) for (int x1 = 1; x1 < maxX1; x1++) { exchangeData(x1, 1, maxX3 - 1, x1, maxX2, 0); } - else if (sendDir == D3Q27System::TSW) { + else if (sendDir == D3Q27System::DIR_MMP) { exchangeData(1, 1, maxX3 - 1, maxX1, maxX2, 0); - } else if (sendDir == D3Q27System::TSE) { + } else if (sendDir == D3Q27System::DIR_PMP) { exchangeData(maxX1 - 1, 1, maxX3 - 1, 0, maxX2, 0); - } else if (sendDir == D3Q27System::TNW) { + } else if (sendDir == D3Q27System::DIR_MPP) { exchangeData(1, maxX2 - 1, maxX3 - 1, maxX1, 0, 0); - } else if (sendDir == D3Q27System::TNE) { + } else if (sendDir == D3Q27System::DIR_PPP) { exchangeData(maxX1 - 1, maxX2 - 1, maxX3 - 1, 0, 0, 0); - } else if (sendDir == D3Q27System::BSW) { + } else if (sendDir == D3Q27System::DIR_MMM) { exchangeData(1, 1, 1, maxX1, maxX2, maxX3); - } else if (sendDir == D3Q27System::BSE) { + } else if (sendDir == D3Q27System::DIR_PMM) { exchangeData(maxX1 - 1, 1, 1, 0, maxX2, maxX3); - } else if (sendDir == D3Q27System::BNW) { + } else if (sendDir == D3Q27System::DIR_MPM) { exchangeData(1, maxX2 - 1, 1, maxX1, 0, maxX3); - } else if (sendDir == D3Q27System::BNE) { + } else if (sendDir == D3Q27System::DIR_PPM) { exchangeData(maxX1 - 1, maxX2 - 1, 1, 0, 0, maxX3); } else UB_THROW(UbException(UB_EXARGS, "unknown dir")); diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h index fb04de68aaa4ab360e38ae83c9d47d077c05e59f..81984eee943bf2548a4c8f49527f9a41178d5f71 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h +++ b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h @@ -49,7 +49,7 @@ public: protected: virtual void updatePointers() = 0; - void exchangeData(); + virtual void exchangeData(); virtual void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) = 0; int maxX1; diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.cpp index ccbd62c2ff247bb2b02f478974c40592b693ce20..d5b810015abc1172699b7489df4ea0aee8b02fe2 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.cpp +++ b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.cpp @@ -63,7 +63,7 @@ void FullVectorConnector::fillData() int index = 0; // EAST - if (sendDir == D3Q27System::E) { + if (sendDir == D3Q27System::DIR_P00) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x2 = 1; x2 < maxX2; x2++) { fillData(sdata, index, maxX1 - 1, x2, x3); @@ -71,7 +71,7 @@ void FullVectorConnector::fillData() } } // WEST - else if (sendDir == D3Q27System::W) { + else if (sendDir == D3Q27System::DIR_M00) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x2 = 1; x2 < maxX2; x2++) { fillData(sdata, index, 1, x2, x3); @@ -79,7 +79,7 @@ void FullVectorConnector::fillData() } } // NORTH - else if (sendDir == D3Q27System::N) { + else if (sendDir == D3Q27System::DIR_0P0) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x1 = 1; x1 < maxX1; x1++) { fillData(sdata, index, x1, maxX2 - 1, x3); @@ -87,7 +87,7 @@ void FullVectorConnector::fillData() } } // SOUTH - else if (sendDir == D3Q27System::S) { + else if (sendDir == D3Q27System::DIR_0M0) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x1 = 1; x1 < maxX1; x1++) { fillData(sdata, index, x1, 1, x3); @@ -95,7 +95,7 @@ void FullVectorConnector::fillData() } } // TOP - else if (sendDir == D3Q27System::T) { + else if (sendDir == D3Q27System::DIR_00P) { for (int x2 = 1; x2 < maxX2; x2++) { for (int x1 = 1; x1 < maxX1; x1++) { fillData(sdata, index, x1, x2, maxX3 - 1); @@ -103,7 +103,7 @@ void FullVectorConnector::fillData() } } // BOTTOM - else if (sendDir == D3Q27System::B) { + else if (sendDir == D3Q27System::DIR_00M) { for (int x2 = 1; x2 < maxX2; x2++) { for (int x1 = 1; x1 < maxX1; x1++) { fillData(sdata, index, x1, x2, 1); @@ -111,24 +111,24 @@ void FullVectorConnector::fillData() } } // NE NW SW SE - else if (sendDir == D3Q27System::NE || sendDir == D3Q27System::NW || sendDir == D3Q27System::SW || - sendDir == D3Q27System::SE) { + else if (sendDir == D3Q27System::DIR_PP0 || sendDir == D3Q27System::DIR_MP0 || sendDir == D3Q27System::DIR_MM0 || + sendDir == D3Q27System::DIR_PM0) { int x1 = 0; int x2 = 0; switch (sendDir) { - case D3Q27System::NE: + case D3Q27System::DIR_PP0: x1 = maxX1 - 1; x2 = maxX2 - 1; break; - case D3Q27System::NW: + case D3Q27System::DIR_MP0: x1 = 1; x2 = maxX2 - 1; break; - case D3Q27System::SW: + case D3Q27System::DIR_MM0: x1 = 1; x2 = 1; break; - case D3Q27System::SE: + case D3Q27System::DIR_PM0: x1 = maxX1 - 1; x2 = 1; break; @@ -138,24 +138,24 @@ void FullVectorConnector::fillData() } } // TE TW BW BE - else if (sendDir == D3Q27System::TE || sendDir == D3Q27System::TW || sendDir == D3Q27System::BW || - sendDir == D3Q27System::BE) { + else if (sendDir == D3Q27System::DIR_P0P || sendDir == D3Q27System::DIR_M0P || sendDir == D3Q27System::DIR_M0M || + sendDir == D3Q27System::DIR_P0M) { int x1 = 0; int x3 = 0; switch (sendDir) { - case D3Q27System::TE: + case D3Q27System::DIR_P0P: x1 = maxX1 - 1; x3 = maxX3 - 1; break; - case D3Q27System::TW: + case D3Q27System::DIR_M0P: x1 = 1; x3 = maxX3 - 1; break; - case D3Q27System::BW: + case D3Q27System::DIR_M0M: x1 = 1; x3 = 1; break; - case D3Q27System::BE: + case D3Q27System::DIR_P0M: x1 = maxX1 - 1; x3 = 1; break; @@ -165,24 +165,24 @@ void FullVectorConnector::fillData() } } // TN BN BS TS - else if (sendDir == D3Q27System::TN || sendDir == D3Q27System::BN || sendDir == D3Q27System::BS || - sendDir == D3Q27System::TS) { + else if (sendDir == D3Q27System::DIR_0PP || sendDir == D3Q27System::DIR_0PM || sendDir == D3Q27System::DIR_0MM || + sendDir == D3Q27System::DIR_0MP) { int x2 = 0; int x3 = 0; switch (sendDir) { - case D3Q27System::TN: + case D3Q27System::DIR_0PP: x3 = maxX3 - 1; x2 = maxX2 - 1; break; - case D3Q27System::BN: + case D3Q27System::DIR_0PM: x3 = 1; x2 = maxX2 - 1; break; - case D3Q27System::BS: + case D3Q27System::DIR_0MM: x3 = 1; x2 = 1; break; - case D3Q27System::TS: + case D3Q27System::DIR_0MP: x3 = maxX3 - 1; x2 = 1; break; @@ -192,49 +192,49 @@ void FullVectorConnector::fillData() } } // TNE TNW TSW TSE BNE BNW BSW BSE - else if (sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSW || - sendDir == D3Q27System::TSE || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW || - sendDir == D3Q27System::BSW || sendDir == D3Q27System::BSE) { + else if (sendDir == D3Q27System::DIR_PPP || sendDir == D3Q27System::DIR_MPP || sendDir == D3Q27System::DIR_MMP || + sendDir == D3Q27System::DIR_PMP || sendDir == D3Q27System::DIR_PPM || sendDir == D3Q27System::DIR_MPM || + sendDir == D3Q27System::DIR_MMM || sendDir == D3Q27System::DIR_PMM) { int x1 = 0; int x2 = 0; int x3 = 0; switch (sendDir) { - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: x1 = maxX1 - 1; x2 = maxX2 - 1; x3 = maxX3 - 1; break; - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: x1 = 1; x2 = maxX2 - 1; x3 = maxX3 - 1; break; - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: x1 = 1; x2 = 1; x3 = maxX3 - 1; break; - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: x1 = maxX1 - 1; x2 = 1; x3 = maxX3 - 1; break; - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: x1 = maxX1 - 1; x2 = maxX2 - 1; x3 = 1; break; - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: x1 = 1; x2 = maxX2 - 1; x3 = 1; break; - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: x1 = 1; x2 = 1; x3 = 1; break; - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: x1 = maxX1 - 1; x2 = 1; x3 = 1; @@ -257,37 +257,37 @@ void FullVectorConnector::distributeData() int index = 0; - if (sendDir == D3Q27System::W) { + if (sendDir == D3Q27System::DIR_M00) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x2 = 1; x2 < maxX2; x2++) { distributeData(rdata, index, 0, x2, x3); } } - } else if (sendDir == D3Q27System::E) { + } else if (sendDir == D3Q27System::DIR_P00) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x2 = 1; x2 < maxX2; x2++) { distributeData(rdata, index, maxX1, x2, x3); } } - } else if (sendDir == D3Q27System::S) { + } else if (sendDir == D3Q27System::DIR_0M0) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x1 = 1; x1 < maxX1; x1++) { distributeData(rdata, index, x1, 0, x3); } } - } else if (sendDir == D3Q27System::N) { + } else if (sendDir == D3Q27System::DIR_0P0) { for (int x3 = 1; x3 < maxX3; x3++) { for (int x1 = 1; x1 < maxX1; x1++) { distributeData(rdata, index, x1, maxX2, x3); } } - } else if (sendDir == D3Q27System::B) { + } else if (sendDir == D3Q27System::DIR_00M) { for (int x2 = 1; x2 < maxX2; x2++) { for (int x1 = 1; x1 < maxX1; x1++) { distributeData(rdata, index, x1, x2, 0); } } - } else if (sendDir == D3Q27System::T) { + } else if (sendDir == D3Q27System::DIR_00P) { for (int x2 = 1; x2 < maxX2; x2++) { for (int x1 = 1; x1 < maxX1; x1++) { distributeData(rdata, index, x1, x2, maxX3); @@ -295,25 +295,25 @@ void FullVectorConnector::distributeData() } } // NE NW SW SE - else if (sendDir == D3Q27System::NE || sendDir == D3Q27System::NW || sendDir == D3Q27System::SW || - sendDir == D3Q27System::SE) { + else if (sendDir == D3Q27System::DIR_PP0 || sendDir == D3Q27System::DIR_MP0 || sendDir == D3Q27System::DIR_MM0 || + sendDir == D3Q27System::DIR_PM0) { int x1 = 0; int x2 = 0; switch (sendDir) // wenn sendir NE dann kommen werte von SW { - case D3Q27System::NE: + case D3Q27System::DIR_PP0: x1 = maxX1; x2 = maxX2; break; - case D3Q27System::NW: + case D3Q27System::DIR_MP0: x1 = 0; x2 = maxX2; break; - case D3Q27System::SW: + case D3Q27System::DIR_MM0: x1 = 0; x2 = 0; break; - case D3Q27System::SE: + case D3Q27System::DIR_PM0: x1 = maxX1; x2 = 0; break; @@ -324,27 +324,27 @@ void FullVectorConnector::distributeData() } // TE TW BW BE - else if (sendDir == D3Q27System::TE || sendDir == D3Q27System::TW || sendDir == D3Q27System::BW || - sendDir == D3Q27System::BE) + else if (sendDir == D3Q27System::DIR_P0P || sendDir == D3Q27System::DIR_M0P || sendDir == D3Q27System::DIR_M0M || + sendDir == D3Q27System::DIR_P0M) { int x1 = 0; int x3 = 0; switch (sendDir) // wenn sendir NE dann kommen werte von SW { - case D3Q27System::TE: + case D3Q27System::DIR_P0P: x1 = maxX1; x3 = maxX3; break; - case D3Q27System::TW: + case D3Q27System::DIR_M0P: x1 = 0; x3 = maxX3; break; - case D3Q27System::BW: + case D3Q27System::DIR_M0M: x1 = 0; x3 = 0; break; - case D3Q27System::BE: + case D3Q27System::DIR_P0M: x1 = maxX1; x3 = 0; break; @@ -354,24 +354,24 @@ void FullVectorConnector::distributeData() } } // TN BN BS TS - else if (sendDir == D3Q27System::TN || sendDir == D3Q27System::BN || sendDir == D3Q27System::BS || - sendDir == D3Q27System::TS) { + else if (sendDir == D3Q27System::DIR_0PP || sendDir == D3Q27System::DIR_0PM || sendDir == D3Q27System::DIR_0MM || + sendDir == D3Q27System::DIR_0MP) { int x2 = 0; int x3 = 0; switch (sendDir) { - case D3Q27System::TN: + case D3Q27System::DIR_0PP: x3 = maxX3; x2 = maxX2; break; - case D3Q27System::BN: + case D3Q27System::DIR_0PM: x3 = 0; x2 = maxX2; break; - case D3Q27System::BS: + case D3Q27System::DIR_0MM: x3 = 0; x2 = 0; break; - case D3Q27System::TS: + case D3Q27System::DIR_0MP: x3 = maxX3; x2 = 0; break; @@ -381,50 +381,50 @@ void FullVectorConnector::distributeData() } } // TNE TNW TSW TSE BNE BNW BSW BSE - else if (sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSW || - sendDir == D3Q27System::TSE || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW || - sendDir == D3Q27System::BSW || sendDir == D3Q27System::BSE) { + else if (sendDir == D3Q27System::DIR_PPP || sendDir == D3Q27System::DIR_MPP || sendDir == D3Q27System::DIR_MMP || + sendDir == D3Q27System::DIR_PMP || sendDir == D3Q27System::DIR_PPM || sendDir == D3Q27System::DIR_MPM || + sendDir == D3Q27System::DIR_MMM || sendDir == D3Q27System::DIR_PMM) { int x1 = 0; int x2 = 0; int x3 = 0; switch (sendDir) { - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: x1 = maxX1; x2 = maxX2; x3 = maxX3; break; - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: x1 = 0; x2 = maxX2; x3 = maxX3; break; - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: x1 = 0; x2 = 0; x3 = maxX3; break; - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: x1 = maxX1; x2 = 0; x3 = maxX3; break; - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: x1 = maxX1; x2 = maxX2; x3 = 0; break; - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: x1 = 0; x2 = maxX2; x3 = 0; break; - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: x1 = 0; x2 = 0; x3 = 0; break; - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: x1 = maxX1; x2 = 0; x3 = 0; diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h index 39fc3d1afa3fb958b09d128bd67a5aca42acbc03..802a91290cfc0994e1ef2ae33fce78c6a6a4964e 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h +++ b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h @@ -56,8 +56,8 @@ public: protected: virtual void updatePointers() = 0; - void fillData(); - void distributeData(); + virtual void fillData(); + virtual void distributeData(); virtual void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) = 0; virtual void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) = 0; diff --git a/src/cpu/VirtualFluidsCore/Connectors/OneDistributionFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/OneDistributionFullVectorConnector.cpp index 739efcddb9ceea5c0951df83833d64ad90bb02c5..72f43858ae7e64538b4b9bdb7028a8c895e2e84d 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/OneDistributionFullVectorConnector.cpp +++ b/src/cpu/VirtualFluidsCore/Connectors/OneDistributionFullVectorConnector.cpp @@ -18,51 +18,51 @@ void OneDistributionFullVectorConnector::init() int anz = 27; switch (sendDir) { - case D3Q27System::REST: + case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; - case D3Q27System::E: - case D3Q27System::W: + case D3Q27System::DIR_P00: + case D3Q27System::DIR_M00: sender->getData().resize(maxX2 * maxX3 * anz, 0.0); break; - case D3Q27System::N: - case D3Q27System::S: + case D3Q27System::DIR_0P0: + case D3Q27System::DIR_0M0: sender->getData().resize(maxX1 * maxX3 * anz, 0.0); break; - case D3Q27System::T: - case D3Q27System::B: + case D3Q27System::DIR_00P: + case D3Q27System::DIR_00M: sender->getData().resize(maxX1 * maxX2 * anz, 0.0); break; - case D3Q27System::NE: - case D3Q27System::SW: - case D3Q27System::SE: - case D3Q27System::NW: + case D3Q27System::DIR_PP0: + case D3Q27System::DIR_MM0: + case D3Q27System::DIR_PM0: + case D3Q27System::DIR_MP0: sender->getData().resize(maxX3 * anz, 0.0); break; - case D3Q27System::TE: - case D3Q27System::BW: - case D3Q27System::BE: - case D3Q27System::TW: + case D3Q27System::DIR_P0P: + case D3Q27System::DIR_M0M: + case D3Q27System::DIR_P0M: + case D3Q27System::DIR_M0P: sender->getData().resize(maxX2 * anz, 0.0); break; - case D3Q27System::TN: - case D3Q27System::BS: - case D3Q27System::BN: - case D3Q27System::TS: + case D3Q27System::DIR_0PP: + case D3Q27System::DIR_0MM: + case D3Q27System::DIR_0PM: + case D3Q27System::DIR_0MP: sender->getData().resize(maxX1 * anz, 0.0); break; - case D3Q27System::TNE: - case D3Q27System::BSW: - case D3Q27System::BNE: - case D3Q27System::TSW: - case D3Q27System::TSE: - case D3Q27System::BNW: - case D3Q27System::BSE: - case D3Q27System::TNW: + case D3Q27System::DIR_PPP: + case D3Q27System::DIR_MMM: + case D3Q27System::DIR_PPM: + case D3Q27System::DIR_MMP: + case D3Q27System::DIR_PMP: + case D3Q27System::DIR_MPM: + case D3Q27System::DIR_PMM: + case D3Q27System::DIR_MPP: sender->getData().resize(anz, 0.0); break; diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..782b0f27d4b0cd006a27c89def02dad11ff558c5 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.cpp @@ -0,0 +1,317 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ThreeDistributionsDoubleGhostLayerFullDirectConnector.cpp +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#include "ThreeDistributionsDoubleGhostLayerFullDirectConnector.h" +#include "LBMKernel.h" +#include "DataSet3D.h" + +ThreeDistributionsDoubleGhostLayerFullDirectConnector::ThreeDistributionsDoubleGhostLayerFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir) + : FullDirectConnector(from, to, sendDir) +{ + +} +////////////////////////////////////////////////////////////////////////// +void ThreeDistributionsDoubleGhostLayerFullDirectConnector::init() +{ + FullDirectConnector::init(); + + fFrom =dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getFdistributions()); + fTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getFdistributions()); + hFrom = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getHdistributions()); + hTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getHdistributions()); + hFrom2 = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getH2distributions()); + hTo2 = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getH2distributions()); + pressureFrom = from.lock()->getKernel()->getDataSet()->getPressureField(); + pressureTo = to.lock()->getKernel()->getDataSet()->getPressureField(); +} +////////////////////////////////////////////////////////////////////////// +void ThreeDistributionsDoubleGhostLayerFullDirectConnector::sendVectors() +{ + updatePointers(); + exchangeData(); +} +////////////////////////////////////////////////////////////////////////// +void ThreeDistributionsDoubleGhostLayerFullDirectConnector::exchangeData() +{ + //////////////////////////////////////////////////////////// + // relation between ghost layer and regular nodes + // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes + // minX1 minX1p1 ... maxX1m1 maxX1 - ghost layer + //////////////////////////////////////////////////////////// + + int minX1 = 0; + int minX1p1 = minX1 + 1; + int minX1p2 = minX1 + 2; + int minX1p3 = minX1 + 3; + int maxX1m1 = maxX1 - 1; + int maxX1m2 = maxX1 - 2; + int maxX1m3 = maxX1 - 3; + + int minX2 = 0; + int minX2p1 = minX2 + 1; + int minX2p2 = minX2 + 2; + int minX2p3 = minX2 + 3; + int maxX2m1 = maxX2 - 1; + int maxX2m2 = maxX2 - 2; + int maxX2m3 = maxX2 - 3; + + int minX3 = 0; + int minX3p1 = minX3 + 1; + int minX3p2 = minX3 + 2; + int minX3p3 = minX3 + 3; + int maxX3m1 = maxX3 - 1; + int maxX3m2 = maxX3 - 2; + int maxX3m3 = maxX3 - 3; + + // EAST + if (sendDir == D3Q27System::DIR_P00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(maxX1m3, x2, x3, minX1, x2, x3); + exchangeData(maxX1m2, x2, x3, minX1p1, x2, x3); + } + } + } + // WEST + else if (sendDir == D3Q27System::DIR_M00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(minX1p3, x2, x3, maxX1, x2, x3); + exchangeData(minX1p2, x2, x3, maxX1m1, x2, x3); + } + } + } + // NORTH + else if (sendDir == D3Q27System::DIR_0P0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, maxX2m3, x3, x1, minX2, x3); + exchangeData(x1, maxX2m2, x3, x1, minX2p1, x3); + } + } + } + // SOUTH + else if (sendDir == D3Q27System::DIR_0M0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, minX2p3, x3, x1, maxX2, x3); + exchangeData(x1, minX2p2, x3, x1, maxX2m1, x3); + } + } + } + + // TOP + else if (sendDir == D3Q27System::DIR_00P) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, x2, maxX3m3, x1, x2, minX3); + exchangeData(x1, x2, maxX3m2, x1, x2, minX3p1); + } + } + } + // BOTTOM + else if (sendDir == D3Q27System::DIR_00M) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, x2, minX3p3, x1, x2, maxX3); + exchangeData(x1, x2, minX3p2, x1, x2, maxX3m1); + } + } + } + // NORTHEAST + else if (sendDir == D3Q27System::DIR_PP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + exchangeData(maxX1m3, maxX2m3, x3, minX1, minX2, x3); + exchangeData(maxX1m2, maxX2m2, x3, minX1p1, minX2p1, x3); + exchangeData(maxX1m3, maxX2m2, x3, minX1, minX2p1, x3); + exchangeData(maxX1m2, maxX2m3, x3, minX1p1, minX2, x3); + } + } + // NORTHWEST + else if (sendDir == D3Q27System::DIR_MP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + exchangeData(minX1p3, maxX2m3, x3, maxX1, minX2, x3); + exchangeData(minX1p2, maxX2m2, x3, maxX1m1, minX2p1, x3); + exchangeData(minX1p3, maxX2m2, x3, maxX1, minX2p1, x3); + exchangeData(minX1p2, maxX2m3, x3, maxX1m1, minX2, x3); + } + } + // SOUTHWEST + else if (sendDir == D3Q27System::DIR_MM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + exchangeData(minX1p3, minX2p3, x3, maxX1, maxX2, x3); + exchangeData(minX1p2, minX2p2, x3, maxX1m1, maxX2m1, x3); + exchangeData(minX1p3, minX2p2, x3, maxX1, maxX2m1, x3); + exchangeData(minX1p2, minX2p3, x3, maxX1m1, maxX2, x3); + } + } + // SOUTHEAST + else if (sendDir == D3Q27System::DIR_PM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + exchangeData(maxX1m3, minX2p3, x3, minX1, maxX2, x3); + exchangeData(maxX1m2, minX2p2, x3, minX1p1, maxX2m1, x3); + exchangeData(maxX1m3, minX2p2, x3, minX1, maxX2m1, x3); + exchangeData(maxX1m2, minX2p3, x3, minX1p1, maxX2, x3); + } + } else if (sendDir == D3Q27System::DIR_P0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(maxX1m3, x2, maxX3m3, minX1, x2, minX3); + exchangeData(maxX1m2, x2, maxX3m2, minX1p1, x2, minX3p1); + exchangeData(maxX1m3, x2, maxX3m2, minX1, x2, minX3p1); + exchangeData(maxX1m2, x2, maxX3m3, minX1p1, x2, minX3); + } + else if (sendDir == D3Q27System::DIR_M0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(minX1p3, x2, minX3p3, maxX1, x2, maxX3); + exchangeData(minX1p2, x2, minX3p2, maxX1m1, x2, maxX3m1); + exchangeData(minX1p3, x2, minX3p2, maxX1, x2, maxX3m1); + exchangeData(minX1p2, x2, minX3p3, maxX1m1, x2, maxX3); + } + else if (sendDir == D3Q27System::DIR_P0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(maxX1m3, x2, minX3p3, minX1, x2, maxX3); + exchangeData(maxX1m2, x2, minX3p2, minX1p1, x2, maxX3m1); + exchangeData(maxX1m3, x2, minX3p2, minX1, x2, maxX3m1); + exchangeData(maxX1m2, x2, minX3p3, minX1p1, x2, maxX3); + } + else if (sendDir == D3Q27System::DIR_M0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(minX1p3, x2, maxX3m3, maxX1, x2, minX3); + exchangeData(minX1p2, x2, maxX3m2, maxX1m1, x2, minX3p1); + exchangeData(minX1p3, x2, maxX3m2, maxX1, x2, minX3p1); + exchangeData(minX1p2, x2, maxX3m3, maxX1m1, x2, minX3); + } + else if (sendDir == D3Q27System::DIR_0PP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, maxX2m3, maxX3m3, x1, minX2, minX3); + exchangeData(x1, maxX2m2, maxX3m2, x1, minX2p1, minX3p1); + exchangeData(x1, maxX2m3, maxX3m2, x1, minX2, minX3p1); + exchangeData(x1, maxX2m2, maxX3m3, x1, minX2p1, minX3); + } + else if (sendDir == D3Q27System::DIR_0MM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, minX2p3, minX3p3, x1, maxX2, maxX3); + exchangeData(x1, minX2p2, minX3p2, x1, maxX2m1, maxX3m1); + exchangeData(x1, minX2p3, minX3p2, x1, maxX2, maxX3m1); + exchangeData(x1, minX2p2, minX3p3, x1, maxX2m1, maxX3); + } + else if (sendDir == D3Q27System::DIR_0PM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, maxX2m3, minX3p3, x1, minX2, maxX3); + exchangeData(x1, maxX2m2, minX3p2, x1, minX2p1, maxX3m1); + exchangeData(x1, maxX2m3, minX3p2, x1, minX2, maxX3m1); + exchangeData(x1, maxX2m2, minX3p3, x1, minX2p1, maxX3); + } + else if (sendDir == D3Q27System::DIR_0MP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, minX2p3, maxX3m3, x1, maxX2, minX3); + exchangeData(x1, minX2p2, maxX3m2, x1, maxX2m1, minX3p1); + exchangeData(x1, minX2p3, maxX3m2, x1, maxX2, minX3p1); + exchangeData(x1, minX2p2, maxX3m3, x1, maxX2m1, minX3); + } + else if (sendDir == D3Q27System::DIR_MMP) { + exchangeData(minX1p3, minX2p3, maxX3m3, maxX1, maxX2, minX3); + exchangeData(minX1p2, minX2p2, maxX3m2, maxX1m1, maxX2m1, minX3p1); + exchangeData(minX1p3, minX2p2, maxX3m2, maxX1, maxX2m1, minX3p1); + exchangeData(minX1p2, minX2p3, maxX3m2, maxX1m1, maxX2, minX3p1); + exchangeData(minX1p2, minX2p2, maxX3m3, maxX1m1, maxX2m1, minX3); + exchangeData(minX1p3, minX2p3, maxX3m2, maxX1, maxX2, minX3p1); + exchangeData(minX1p3, minX2p2, maxX3m3, maxX1, maxX2m1, minX3); + exchangeData(minX1p2, minX2p3, maxX3m3, maxX1m1, maxX2, minX3); + } else if (sendDir == D3Q27System::DIR_PMP) { + exchangeData(maxX1m3, minX1p3, maxX3m3, minX1, maxX2, minX3); + exchangeData(maxX1m2, minX1p2, maxX3m2, minX1p1, maxX2m1, minX3p1); + exchangeData(maxX1m3, minX1p2, maxX3m2, minX1, maxX2m1, minX3p1); + exchangeData(maxX1m2, minX1p3, maxX3m2, minX1p1, maxX2, minX3p1); + exchangeData(maxX1m2, minX1p2, maxX3m3, minX1p1, maxX2m1, minX3); + exchangeData(maxX1m3, minX1p3, maxX3m2, minX1, maxX2, minX3p1); + exchangeData(maxX1m3, minX1p2, maxX3m3, minX1, maxX2m1, minX3); + exchangeData(maxX1m2, minX1p3, maxX3m3, minX1p1, maxX2, minX3); + } else if (sendDir == D3Q27System::DIR_MPP) { + exchangeData(minX1p3, maxX2m3, maxX3m3, maxX1, minX2, minX3); + exchangeData(minX1p2, maxX2m2, maxX3m2, maxX1m1, minX2p1, minX3p1); + exchangeData(minX1p3, maxX2m2, maxX3m2, maxX1, minX2p1, minX3p1); + exchangeData(minX1p2, maxX2m3, maxX3m2, maxX1m1, minX2, minX3p1); + exchangeData(minX1p2, maxX2m2, maxX3m3, maxX1m1, minX2p1, minX3); + exchangeData(minX1p3, maxX2m3, maxX3m2, maxX1, minX2, minX3p1); + exchangeData(minX1p3, maxX2m2, maxX3m3, maxX1, minX2p1, minX3); + exchangeData(minX1p2, maxX2m3, maxX3m3, maxX1m1, minX2, minX3); + } else if (sendDir == D3Q27System::DIR_PPP) { + exchangeData(maxX1m3, maxX2m3, maxX3m3, minX1, minX2, minX3); + exchangeData(maxX1m2, maxX2m2, maxX3m2, minX1p1, minX2p1, minX3p1); + exchangeData(maxX1m3, maxX2m2, maxX3m2, minX1, minX2p1, minX3p1); + exchangeData(maxX1m2, maxX2m3, maxX3m2, minX1p1, minX2, minX3p1); + exchangeData(maxX1m2, maxX2m2, maxX3m3, minX1p1, minX2p1, minX3); + exchangeData(maxX1m3, maxX2m3, maxX3m2, minX1, minX2, minX3p1); + exchangeData(maxX1m3, maxX2m2, maxX3m3, minX1, minX2p1, minX3); + exchangeData(maxX1m2, maxX2m3, maxX3m3, minX1p1, minX2, minX3); + } else if (sendDir == D3Q27System::DIR_MMM) { + exchangeData(minX1p3, minX2p3, minX3p3, maxX1, maxX2, maxX3); + exchangeData(minX1p2, minX2p2, minX3p2, maxX1m1, maxX2m1, maxX3m1); + exchangeData(minX1p3, minX2p2, minX3p2, maxX1, maxX2m1, maxX3m1); + exchangeData(minX1p2, minX2p3, minX3p2, maxX1m1, maxX2, maxX3m1); + exchangeData(minX1p2, minX2p2, minX3p3, maxX1m1, maxX2m1, maxX3); + exchangeData(minX1p3, minX2p3, minX3p2, maxX1, maxX2, maxX3m1); + exchangeData(minX1p3, minX2p2, minX3p3, maxX1, maxX2m1, maxX3); + exchangeData(minX1p2, minX2p3, minX3p3, maxX1m1, maxX2, maxX3); + } else if (sendDir == D3Q27System::DIR_PMM) { + exchangeData(maxX1m3, minX2p3, minX3p3, minX1, maxX2, maxX3); + exchangeData(maxX1m2, minX2p2, minX3p2, minX1p1, maxX2m1, maxX3m1); + exchangeData(maxX1m3, minX2p2, minX3p2, minX1, maxX2m1, maxX3m1); + exchangeData(maxX1m2, minX2p3, minX3p2, minX1p1, maxX2, maxX3m1); + exchangeData(maxX1m2, minX2p2, minX3p3, minX1p1, maxX2m1, maxX3); + exchangeData(maxX1m3, minX2p3, minX3p2, minX1, maxX2, maxX3m1); + exchangeData(maxX1m3, minX2p2, minX3p3, minX1, maxX2m1, maxX3); + exchangeData(maxX1m2, minX2p3, minX3p3, minX1p1, maxX2, maxX3); + } else if (sendDir == D3Q27System::DIR_MPM) { + exchangeData(minX1p3, maxX2m3, minX3p3, maxX1, minX2, maxX3); + exchangeData(minX1p2, maxX2m2, minX3p2, maxX1m1, minX2p1, maxX3m1); + exchangeData(minX1p3, maxX2m2, minX3p2, maxX1, minX2p1, maxX3m1); + exchangeData(minX1p2, maxX2m3, minX3p2, maxX1m1, minX2, maxX3m1); + exchangeData(minX1p2, maxX2m2, minX3p3, maxX1m1, minX2p1, maxX3); + exchangeData(minX1p3, maxX2m3, minX3p2, maxX1, minX2, maxX3m1); + exchangeData(minX1p3, maxX2m2, minX3p3, maxX1, minX2p1, maxX3); + exchangeData(minX1p2, maxX2m3, minX3p3, maxX1m1, minX2, maxX3); + } else if (sendDir == D3Q27System::DIR_PPM) { + exchangeData(maxX1m3, maxX2m3, minX3p3, minX1, minX2, maxX3); + exchangeData(maxX1m2, maxX2m2, minX3p2, minX1p1, minX2p1, maxX3m1); + exchangeData(maxX1m3, maxX2m2, minX3p2, minX1, minX2p1, maxX3m1); + exchangeData(maxX1m2, maxX2m3, minX3p2, minX1p1, minX2, maxX3m1); + exchangeData(maxX1m2, maxX2m2, minX3p3, minX1p1, minX2p1, maxX3); + exchangeData(maxX1m3, maxX2m3, minX3p2, minX1, minX2, maxX3m1); + exchangeData(maxX1m3, maxX2m2, minX3p3, minX1, minX2p1, maxX3); + exchangeData(maxX1m2, maxX2m3, minX3p3, minX1p1, minX2, maxX3); + } else + UB_THROW(UbException(UB_EXARGS, "unknown dir")); + +} diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.h new file mode 100644 index 0000000000000000000000000000000000000000..1f53ca70aecd3531c986edb8a3933e9d4c5c5ba7 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullDirectConnector.h @@ -0,0 +1,239 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ThreeDistributionsDoubleGhostLayerFullDirectConnector.h +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef ThreeDistributionsDoubleGhostLayerFullDirectConnector_H +#define ThreeDistributionsDoubleGhostLayerFullDirectConnector_H + +#include "FullDirectConnector.h" +#include "Block3D.h" +#include "D3Q27System.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "basics/container/CbArray3D.h" +#include "basics/container/CbArray4D.h" +#include "DataSet3D.h" + +//! \brief Exchange data between blocks. +//! \details Connector send and receive full distributions between two blocks in shared memory. + +class ThreeDistributionsDoubleGhostLayerFullDirectConnector : public FullDirectConnector +{ +public: + ThreeDistributionsDoubleGhostLayerFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir); + void init() override; + void sendVectors() override; + +protected: + inline void updatePointers() override; + void exchangeData() override; + inline void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) override; + +private: + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromf; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromf; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsFromf; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsTof; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsTof; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsTof; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromh; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromh; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsFromh; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsToh; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsToh; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsToh; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromh2; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromh2; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsFromh2; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsToh2; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsToh2; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsToh2; + + SPtr<EsoTwist3D> fFrom, hFrom, hFrom2; + SPtr<EsoTwist3D> fTo, hTo, hTo2; + + SPtr<PressureFieldArray3D> pressureFrom, pressureTo; +}; +////////////////////////////////////////////////////////////////////////// +inline void ThreeDistributionsDoubleGhostLayerFullDirectConnector::updatePointers() +{ + localDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getLocalDistributions(); + nonLocalDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getNonLocalDistributions(); + zeroDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getZeroDistributions(); + + localDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getLocalDistributions(); + nonLocalDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getNonLocalDistributions(); + zeroDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getZeroDistributions(); + + localDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getLocalDistributions(); + nonLocalDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getNonLocalDistributions(); + zeroDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getZeroDistributions(); + + localDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getLocalDistributions(); + nonLocalDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getNonLocalDistributions(); + zeroDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getZeroDistributions(); + + localDistributionsFromh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom2)->getLocalDistributions(); + nonLocalDistributionsFromh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom2)->getNonLocalDistributions(); + zeroDistributionsFromh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom2)->getZeroDistributions(); + + localDistributionsToh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo2)->getLocalDistributions(); + nonLocalDistributionsToh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo2)->getNonLocalDistributions(); + zeroDistributionsToh2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo2)->getZeroDistributions(); +} +////////////////////////////////////////////////////////////////////////// +inline void ThreeDistributionsDoubleGhostLayerFullDirectConnector::exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) +{ + (*this->localDistributionsTof)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_E, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_N, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_T, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TN, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TS, x1From, x2From + 1, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From); + + (*this->nonLocalDistributionsTof)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_W, x1From + 1, x2From, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_S, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_B, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SE, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BE, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BN, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1); + + (*this->zeroDistributionsTof)(x1To, x2To, x3To) = (*this->zeroDistributionsFromf)(x1From, x2From, x3From); + + + (*this->localDistributionsToh)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_E, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_N, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_T, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TN, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TS, x1From, x2From + 1, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From); + + (*this->nonLocalDistributionsToh)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_W, x1From + 1, x2From, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_S, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_B, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SE, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BE, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BN, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1); + + (*this->zeroDistributionsToh)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh)(x1From, x2From, x3From); + + (*this->localDistributionsToh2)(D3Q27System::ET_E, x1To, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_E, x1From, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_N, x1To, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_N, x1From, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_T, x1To, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_T, x1From, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_NE, x1To, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_NE, x1From, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_NW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_TE, x1To, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_TE, x1From, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_TW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_TN, x1To, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_TN, x1From, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_TS, x1From, x2From + 1, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_TNE, x1To, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_TNE, x1From, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From); + (*this->localDistributionsToh2)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = + (*this->localDistributionsFromh2)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From); + + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_W, x1From + 1, x2From, x3From); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_S, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_B, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_SE, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BE, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BN, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsToh2)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = + (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1); + + (*this->zeroDistributionsToh2)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh2)(x1From, x2From, x3From); + + (*this->pressureTo)(x1To, x2To, x3To) = (*this->pressureFrom)(x1From, x2From, x3From); +} +#endif \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0b94f7b4a971462517db6dd07050942f4b8595c0 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.cpp @@ -0,0 +1,616 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ThreeDistributionsDoubleGhostLayerFullVectorConnector.cpp +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#include "ThreeDistributionsDoubleGhostLayerFullVectorConnector.h" +#include "Block3D.h" +#include "LBMKernel.h" +#include "EsoTwist3D.h" +#include "DataSet3D.h" + +////////////////////////////////////////////////////////////////////////// +ThreeDistributionsDoubleGhostLayerFullVectorConnector::ThreeDistributionsDoubleGhostLayerFullVectorConnector(SPtr<Block3D> block, + VectorTransmitterPtr sender, + VectorTransmitterPtr receiver, int sendDir) + : FullVectorConnector(block, sender, receiver, sendDir) +{ + if (!block || !sender || !receiver) + UB_THROW(UbException(UB_EXARGS, "sender or receiver == NULL!!")); + +} +////////////////////////////////////////////////////////////////////////// +void ThreeDistributionsDoubleGhostLayerFullVectorConnector::init() +{ + FullVectorConnector::init(); + + fDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getFdistributions()); + hDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getHdistributions()); + h2Dis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getH2distributions()); + pressure = block.lock()->getKernel()->getDataSet()->getPressureField(); + + int anz = 3*27+1; + switch (sendDir) + { + case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; + case D3Q27System::DIR_P00: + case D3Q27System::DIR_M00: sender->getData().resize(maxX2*maxX3*anz*2, 0.0); break; + case D3Q27System::DIR_0P0: + case D3Q27System::DIR_0M0: sender->getData().resize(maxX1*maxX3*anz*2, 0.0); break; + case D3Q27System::DIR_00P: + case D3Q27System::DIR_00M: sender->getData().resize(maxX1*maxX2*anz*2, 0.0); break; + + case D3Q27System::DIR_PP0: + case D3Q27System::DIR_MM0: + case D3Q27System::DIR_PM0: + case D3Q27System::DIR_MP0: sender->getData().resize(maxX3*anz*4, 0.0); break; + + case D3Q27System::DIR_P0P: + case D3Q27System::DIR_M0M: + case D3Q27System::DIR_P0M: + case D3Q27System::DIR_M0P: sender->getData().resize(maxX2*anz*4, 0.0); break; + + case D3Q27System::DIR_0PP: + case D3Q27System::DIR_0MM: + case D3Q27System::DIR_0PM: + case D3Q27System::DIR_0MP: sender->getData().resize(maxX1*anz*4, 0.0); break; + + case D3Q27System::DIR_PPP: + case D3Q27System::DIR_MMM: + case D3Q27System::DIR_PPM: + case D3Q27System::DIR_MMP: + case D3Q27System::DIR_PMP: + case D3Q27System::DIR_MPM: + case D3Q27System::DIR_PMM: + case D3Q27System::DIR_MPP: sender->getData().resize(anz*8, 0.0); break; + + default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir")); + } +} +////////////////////////////////////////////////////////////////////////// +void ThreeDistributionsDoubleGhostLayerFullVectorConnector::fillSendVectors() +{ + updatePointers(); + fillData(); +} +//////////////////////////////////////////////////////////////////////// +void ThreeDistributionsDoubleGhostLayerFullVectorConnector::fillData() +{ + //////////////////////////////////////////////////////////// + // relation between ghost layer and regular nodes + // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes + // minX1 minX1p1 ... maxX1m1 maxX1 - ghost layer + //////////////////////////////////////////////////////////// + + int minX1 = 0; + //int minX1p1 = minX1 + 1; + int minX1p2 = minX1 + 2; + int minX1p3 = minX1 + 3; + //int maxX1m1 = maxX1 - 1; + int maxX1m2 = maxX1 - 2; + int maxX1m3 = maxX1 - 3; + + int minX2 = 0; + //int minX2p1 = minX2 + 1; + int minX2p2 = minX2 + 2; + int minX2p3 = minX2 + 3; + //int maxX2m1 = maxX2 - 1; + int maxX2m2 = maxX2 - 2; + int maxX2m3 = maxX2 - 3; + + int minX3 = 0; + //int minX3p1 = minX3 + 1; + int minX3p2 = minX3 + 2; + int minX3p3 = minX3 + 3; + //int maxX3m1 = maxX3 - 1; + int maxX3m2 = maxX3 - 2; + int maxX3m3 = maxX3 - 3; + + vector_type &sdata = sender->getData(); + + int index = 0; + // EAST + if (sendDir == D3Q27System::DIR_P00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, x3); + fillData(sdata, index, maxX1m2, x2, x3); + } + } + } + // WEST + else if (sendDir == D3Q27System::DIR_M00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, x3); + fillData(sdata, index, minX1p2, x2, x3); + } + } + } + // NORTH + else if (sendDir == D3Q27System::DIR_0P0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, x3); + fillData(sdata, index, x1, maxX2m2, x3); + } + } + } + // SOUTH + else if (sendDir == D3Q27System::DIR_0M0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, x3); + fillData(sdata, index, x1, minX2p2, x3); + } + } + } + + // TOP + else if (sendDir == D3Q27System::DIR_00P) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, x2, maxX3m3); + fillData(sdata, index, x1, x2, maxX3m2); + } + } + } + // BOTTOM + else if (sendDir == D3Q27System::DIR_00M) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, x2, minX3p3); + fillData(sdata, index, x1, x2, minX3p2); + } + } + } + // NORTHEAST + else if (sendDir == D3Q27System::DIR_PP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, maxX1m3, maxX2m3, x3); + fillData(sdata, index, maxX1m2, maxX2m2, x3); + fillData(sdata, index, maxX1m3, maxX2m2, x3); + fillData(sdata, index, maxX1m2, maxX2m3, x3); + } + } + // NORTHWEST + else if (sendDir == D3Q27System::DIR_MP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, minX1p3, maxX2m3, x3); + fillData(sdata, index, minX1p2, maxX2m2, x3); + fillData(sdata, index, minX1p3, maxX2m2, x3); + fillData(sdata, index, minX1p2, maxX2m3, x3); + } + } + // SOUTHWEST + else if (sendDir == D3Q27System::DIR_MM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, minX1p3, minX2p3, x3); + fillData(sdata, index, minX1p2, minX2p2, x3); + fillData(sdata, index, minX1p3, minX2p2, x3); + fillData(sdata, index, minX1p2, minX2p3, x3); + } + } + // SOUTHEAST + else if (sendDir == D3Q27System::DIR_PM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, maxX1m3, minX2p3, x3); + fillData(sdata, index, maxX1m2, minX2p2, x3); + fillData(sdata, index, maxX1m3, minX2p2, x3); + fillData(sdata, index, maxX1m2, minX2p3, x3); + } + } else if (sendDir == D3Q27System::DIR_P0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, maxX3m3); + fillData(sdata, index, maxX1m2, x2, maxX3m2); + fillData(sdata, index, maxX1m3, x2, maxX3m2); + fillData(sdata, index, maxX1m2, x2, maxX3m3); + } + else if (sendDir == D3Q27System::DIR_M0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, minX3p3); + fillData(sdata, index, minX1p2, x2, minX3p2); + fillData(sdata, index, minX1p3, x2, minX3p2); + fillData(sdata, index, minX1p2, x2, minX3p3); + } + else if (sendDir == D3Q27System::DIR_P0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, minX3p3); + fillData(sdata, index, maxX1m2, x2, minX3p2); + fillData(sdata, index, maxX1m3, x2, minX3p2); + fillData(sdata, index, maxX1m2, x2, minX3p3); + } + else if (sendDir == D3Q27System::DIR_M0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, maxX3m3); + fillData(sdata, index, minX1p2, x2, maxX3m2); + fillData(sdata, index, minX1p3, x2, maxX3m2); + fillData(sdata, index, minX1p2, x2, maxX3m3); + } + else if (sendDir == D3Q27System::DIR_0PP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, maxX3m3); + fillData(sdata, index, x1, maxX2m2, maxX3m2); + fillData(sdata, index, x1, maxX2m3, maxX3m2); + fillData(sdata, index, x1, maxX2m2, maxX3m3); + } + else if (sendDir == D3Q27System::DIR_0MM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, minX3p3); + fillData(sdata, index, x1, minX2p2, minX3p2); + fillData(sdata, index, x1, minX2p3, minX3p2); + fillData(sdata, index, x1, minX2p2, minX3p3); + } + else if (sendDir == D3Q27System::DIR_0PM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, minX3p3); + fillData(sdata, index, x1, maxX2m2, minX3p2); + fillData(sdata, index, x1, maxX2m3, minX3p2); + fillData(sdata, index, x1, maxX2m2, minX3p3); + } + else if (sendDir == D3Q27System::DIR_0MP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, maxX3m3); + fillData(sdata, index, x1, minX2p2, maxX3m2); + fillData(sdata, index, x1, minX2p3, maxX3m2); + fillData(sdata, index, x1, minX2p2, maxX3m3); + } + else if (sendDir == D3Q27System::DIR_MMP) { + fillData(sdata, index, minX1p3, minX2p3, maxX3m3); + fillData(sdata, index, minX1p2, minX2p2, maxX3m2); + fillData(sdata, index, minX1p3, minX2p2, maxX3m2); + fillData(sdata, index, minX1p2, minX2p3, maxX3m2); + fillData(sdata, index, minX1p2, minX2p2, maxX3m3); + fillData(sdata, index, minX1p3, minX2p3, maxX3m2); + fillData(sdata, index, minX1p3, minX2p2, maxX3m3); + fillData(sdata, index, minX1p2, minX2p3, maxX3m3); + } else if (sendDir == D3Q27System::DIR_PMP) { + fillData(sdata, index, maxX1m3, minX1p3, maxX3m3); + fillData(sdata, index, maxX1m2, minX1p2, maxX3m2); + fillData(sdata, index, maxX1m3, minX1p2, maxX3m2); + fillData(sdata, index, maxX1m2, minX1p3, maxX3m2); + fillData(sdata, index, maxX1m2, minX1p2, maxX3m3); + fillData(sdata, index, maxX1m3, minX1p3, maxX3m2); + fillData(sdata, index, maxX1m3, minX1p2, maxX3m3); + fillData(sdata, index, maxX1m2, minX1p3, maxX3m3); + } else if (sendDir == D3Q27System::DIR_MPP) { + fillData(sdata, index, minX1p3, maxX2m3, maxX3m3); + fillData(sdata, index, minX1p2, maxX2m2, maxX3m2); + fillData(sdata, index, minX1p3, maxX2m2, maxX3m2); + fillData(sdata, index, minX1p2, maxX2m3, maxX3m2); + fillData(sdata, index, minX1p2, maxX2m2, maxX3m3); + fillData(sdata, index, minX1p3, maxX2m3, maxX3m2); + fillData(sdata, index, minX1p3, maxX2m2, maxX3m3); + fillData(sdata, index, minX1p2, maxX2m3, maxX3m3); + } else if (sendDir == D3Q27System::DIR_PPP) { + fillData(sdata, index, maxX1m3, maxX2m3, maxX3m3); + fillData(sdata, index, maxX1m2, maxX2m2, maxX3m2); + fillData(sdata, index, maxX1m3, maxX2m2, maxX3m2); + fillData(sdata, index, maxX1m2, maxX2m3, maxX3m2); + fillData(sdata, index, maxX1m2, maxX2m2, maxX3m3); + fillData(sdata, index, maxX1m3, maxX2m3, maxX3m2); + fillData(sdata, index, maxX1m3, maxX2m2, maxX3m3); + fillData(sdata, index, maxX1m2, maxX2m3, maxX3m3); + } else if (sendDir == D3Q27System::DIR_MMM) { + fillData(sdata, index, minX1p3, minX2p3, minX3p3); + fillData(sdata, index, minX1p2, minX2p2, minX3p2); + fillData(sdata, index, minX1p3, minX2p2, minX3p2); + fillData(sdata, index, minX1p2, minX2p3, minX3p2); + fillData(sdata, index, minX1p2, minX2p2, minX3p3); + fillData(sdata, index, minX1p3, minX2p3, minX3p2); + fillData(sdata, index, minX1p3, minX2p2, minX3p3); + fillData(sdata, index, minX1p2, minX2p3, minX3p3); + } else if (sendDir == D3Q27System::DIR_PMM) { + fillData(sdata, index, maxX1m3, minX2p3, minX3p3); + fillData(sdata, index, maxX1m2, minX2p2, minX3p2); + fillData(sdata, index, maxX1m3, minX2p2, minX3p2); + fillData(sdata, index, maxX1m2, minX2p3, minX3p2); + fillData(sdata, index, maxX1m2, minX2p2, minX3p3); + fillData(sdata, index, maxX1m3, minX2p3, minX3p2); + fillData(sdata, index, maxX1m3, minX2p2, minX3p3); + fillData(sdata, index, maxX1m2, minX2p3, minX3p3); + } else if (sendDir == D3Q27System::DIR_MPM) { + fillData(sdata, index, minX1p3, maxX2m3, minX3p3); + fillData(sdata, index, minX1p2, maxX2m2, minX3p2); + fillData(sdata, index, minX1p3, maxX2m2, minX3p2); + fillData(sdata, index, minX1p2, maxX2m3, minX3p2); + fillData(sdata, index, minX1p2, maxX2m2, minX3p3); + fillData(sdata, index, minX1p3, maxX2m3, minX3p2); + fillData(sdata, index, minX1p3, maxX2m2, minX3p3); + fillData(sdata, index, minX1p2, maxX2m3, minX3p3); + } else if (sendDir == D3Q27System::DIR_PPM) { + fillData(sdata, index, maxX1m3, maxX2m3, minX3p3); + fillData(sdata, index, maxX1m2, maxX2m2, minX3p2); + fillData(sdata, index, maxX1m3, maxX2m2, minX3p2); + fillData(sdata, index, maxX1m2, maxX2m3, minX3p2); + fillData(sdata, index, maxX1m2, maxX2m2, minX3p3); + fillData(sdata, index, maxX1m3, maxX2m3, minX3p2); + fillData(sdata, index, maxX1m3, maxX2m2, minX3p3); + fillData(sdata, index, maxX1m2, maxX2m3, minX3p3); + } else + UB_THROW(UbException(UB_EXARGS, "unknown dir")); +} +//////////////////////////////////////////////////////////////////////// +void ThreeDistributionsDoubleGhostLayerFullVectorConnector::distributeReceiveVectors() +{ + updatePointers(); + distributeData(); +} +//////////////////////////////////////////////////////////////////////// +void ThreeDistributionsDoubleGhostLayerFullVectorConnector::distributeData() +{ + vector_type &rdata = receiver->getData(); + + int index = 0; + //////////////////////////////////////////////////////////// + // relation between ghost layer and regular nodes + // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes + // minX1 minX1p1 ... maxX1m1 maxX1 - ghost layer + //////////////////////////////////////////////////////////// + + int minX1 = 0; + int minX1p1 = minX1 + 1; + int minX1p2 = minX1 + 2; + //int minX1p3 = minX1 + 3; + int maxX1m1 = maxX1 - 1; + int maxX1m2 = maxX1 - 2; + //int maxX1m3 = maxX1 - 3; + + int minX2 = 0; + int minX2p1 = minX2 + 1; + int minX2p2 = minX2 + 2; + //int minX2p3 = minX2 + 3; + int maxX2m1 = maxX2 - 1; + int maxX2m2 = maxX2 - 2; + //int maxX2m3 = maxX2 - 3; + + int minX3 = 0; + int minX3p1 = minX3 + 1; + int minX3p2 = minX3 + 2; + //int minX3p3 = minX3 + 3; + int maxX3m1 = maxX3 - 1; + int maxX3m2 = maxX3 - 2; + //int maxX3m3 = maxX3 - 3; + + if (sendDir == D3Q27System::DIR_M00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, x3); + distributeData(rdata, index, minX1p1, x2, x3); + } + } + } + else if (sendDir == D3Q27System::DIR_P00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, x3); + distributeData(rdata, index, maxX1m1, x2, x3); + } + } + } + else if (sendDir == D3Q27System::DIR_0M0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, x3); + distributeData(rdata, index, x1, minX2p1, x3); + } + } + } + else if (sendDir == D3Q27System::DIR_0P0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, x3); + distributeData(rdata, index, x1, maxX2m1, x3); + } + } + } + else if (sendDir == D3Q27System::DIR_00M) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, x2, minX3); + distributeData(rdata, index, x1, x2, minX3p1); + } + } + } + else if (sendDir == D3Q27System::DIR_00P) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, x2, maxX3); + distributeData(rdata, index, x1, x2, maxX3m1); + } + } + } + else if (sendDir == D3Q27System::DIR_MM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, minX1, minX2, x3); + distributeData(rdata, index, minX1p1, minX2p1, x3); + distributeData(rdata, index, minX1, minX2p1, x3); + distributeData(rdata, index, minX1p1, minX2, x3); + } + } + else if (sendDir == D3Q27System::DIR_PM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, maxX1, minX2, x3); + distributeData(rdata, index, maxX1m1, minX2p1, x3); + distributeData(rdata, index, maxX1, minX2p1, x3); + distributeData(rdata, index, maxX1m1, minX2, x3); + } + } + else if (sendDir == D3Q27System::DIR_PP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, maxX1, maxX2, x3); + distributeData(rdata, index, maxX1m1, maxX2m1, x3); + distributeData(rdata, index, maxX1, maxX2m1, x3); + distributeData(rdata, index, maxX1m1, maxX2, x3); + } + } + else if (sendDir == D3Q27System::DIR_MP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, minX1, maxX2, x3); + distributeData(rdata, index, minX1p1, maxX2m1, x3); + distributeData(rdata, index, minX1, maxX2m1, x3); + distributeData(rdata, index, minX1p1, maxX2, x3); + } + } else if (sendDir == D3Q27System::DIR_M0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, minX3); + distributeData(rdata, index, minX1p1, x2, minX3p1); + distributeData(rdata, index, minX1, x2, minX3p1); + distributeData(rdata, index, minX1p1, x2, minX3); + } + else if (sendDir == D3Q27System::DIR_P0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, maxX3); + distributeData(rdata, index, maxX1m1, x2, maxX3m1); + distributeData(rdata, index, maxX1, x2, maxX3m1); + distributeData(rdata, index, maxX1m1, x2, maxX3); + } + else if (sendDir == D3Q27System::DIR_M0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, maxX3); + distributeData(rdata, index, minX1p1, x2, maxX3m1); + distributeData(rdata, index, minX1, x2, maxX3m1); + distributeData(rdata, index, minX1p1, x2, maxX3); + } + else if (sendDir == D3Q27System::DIR_P0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, minX3); + distributeData(rdata, index, maxX1m1, x2, minX3p1); + distributeData(rdata, index, maxX1, x2, minX3p1); + distributeData(rdata, index, maxX1m1, x2, minX3); + } + else if (sendDir == D3Q27System::DIR_0MM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, minX3); + distributeData(rdata, index, x1, minX2p1, minX3p1); + distributeData(rdata, index, x1, minX2, minX3p1); + distributeData(rdata, index, x1, minX2p1, minX3); + } + else if (sendDir == D3Q27System::DIR_0PP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, maxX3); + distributeData(rdata, index, x1, maxX2m1, maxX3m1); + distributeData(rdata, index, x1, maxX2, maxX3m1); + distributeData(rdata, index, x1, maxX2m1, maxX3); + } + else if (sendDir == D3Q27System::DIR_0MP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, maxX3); + distributeData(rdata, index, x1, minX2p1, maxX3m1); + distributeData(rdata, index, x1, minX2, maxX3m1); + distributeData(rdata, index, x1, minX2p1, maxX3); + } + else if (sendDir == D3Q27System::DIR_0PM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, minX3); + distributeData(rdata, index, x1, maxX2m1, minX3p1); + distributeData(rdata, index, x1, maxX2, minX3p1); + distributeData(rdata, index, x1, maxX2m1, minX3); + } + else if (sendDir == D3Q27System::DIR_PPM) { + distributeData(rdata, index, maxX1, maxX2, minX3); + distributeData(rdata, index, maxX1m1, maxX2m1, minX3p1); + distributeData(rdata, index, maxX1, maxX2m1, minX3p1); + distributeData(rdata, index, maxX1m1, maxX2, minX3p1); + distributeData(rdata, index, maxX1m1, maxX2m1, minX3); + distributeData(rdata, index, maxX1, maxX2, minX3p1); + distributeData(rdata, index, maxX1, maxX2m1, minX3); + distributeData(rdata, index, maxX1m1, maxX2, minX3); + } else if (sendDir == D3Q27System::DIR_MPM) { + distributeData(rdata, index, minX1, maxX2, minX3); + distributeData(rdata, index, minX1p1, maxX2m1, minX3p1); + distributeData(rdata, index, minX1, maxX2m1, minX3p1); + distributeData(rdata, index, minX1p1, maxX2, minX3p1); + distributeData(rdata, index, minX1p1, maxX2m1, minX3); + distributeData(rdata, index, minX1, maxX2, minX3p1); + distributeData(rdata, index, minX1, maxX2m1, minX3); + distributeData(rdata, index, minX1p1, maxX2, minX3); + } else if (sendDir == D3Q27System::DIR_PMM) { + distributeData(rdata, index, maxX1, minX2, minX3); + distributeData(rdata, index, maxX1m1, minX2p1, minX3p1); + distributeData(rdata, index, maxX1, minX2p1, minX3p1); + distributeData(rdata, index, maxX1m1, minX2, minX3p1); + distributeData(rdata, index, maxX1m1, minX2p1, minX3); + distributeData(rdata, index, maxX1, minX2, minX3p1); + distributeData(rdata, index, maxX1, minX2p1, minX3); + distributeData(rdata, index, maxX1m1, minX2, minX3); + } else if (sendDir == D3Q27System::DIR_MMM) { + distributeData(rdata, index, minX1, minX2, minX3); + distributeData(rdata, index, minX1p1, minX2p1, minX3p1); + distributeData(rdata, index, minX1, minX2p1, minX3p1); + distributeData(rdata, index, minX1p1, minX2, minX3p1); + distributeData(rdata, index, minX1p1, minX2p1, minX3); + distributeData(rdata, index, minX1, minX2, minX3p1); + distributeData(rdata, index, minX1, minX2p1, minX3); + distributeData(rdata, index, minX1p1, minX2, minX3); + } else if (sendDir == D3Q27System::DIR_PPP) { + distributeData(rdata, index, maxX1, maxX2, maxX3); + distributeData(rdata, index, maxX1m1, maxX2m1, maxX3m1); + distributeData(rdata, index, maxX1, maxX2m1, maxX3m1); + distributeData(rdata, index, maxX1m1, maxX2, maxX3m1); + distributeData(rdata, index, maxX1m1, maxX2m1, maxX3); + distributeData(rdata, index, maxX1, maxX2, maxX3m1); + distributeData(rdata, index, maxX1, maxX2m1, maxX3); + distributeData(rdata, index, maxX1m1, maxX2, maxX3); + } else if (sendDir == D3Q27System::DIR_MPP) { + distributeData(rdata, index, minX1, maxX2, maxX3); + distributeData(rdata, index, minX1p1, maxX2m1, maxX3m1); + distributeData(rdata, index, minX1, maxX2m1, maxX3m1); + distributeData(rdata, index, minX1p1, maxX2, maxX3m1); + distributeData(rdata, index, minX1p1, maxX2m1, maxX3); + distributeData(rdata, index, minX1, maxX2, maxX3m1); + distributeData(rdata, index, minX1, maxX2m1, maxX3); + distributeData(rdata, index, minX1p1, maxX2, maxX3); + } else if (sendDir == D3Q27System::DIR_PMP) { + distributeData(rdata, index, maxX1, minX2, maxX3); + distributeData(rdata, index, maxX1m1, minX2p1, maxX3m1); + distributeData(rdata, index, maxX1, minX2p1, maxX3m1); + distributeData(rdata, index, maxX1m1, minX2, maxX3m1); + distributeData(rdata, index, maxX1m1, minX2p1, maxX3); + distributeData(rdata, index, maxX1, minX2, maxX3m1); + distributeData(rdata, index, maxX1, minX2p1, maxX3); + distributeData(rdata, index, maxX1m1, minX2, maxX3); + } else if (sendDir == D3Q27System::DIR_MMP) { + distributeData(rdata, index, minX1, minX2, maxX3); + distributeData(rdata, index, minX1p1, minX2p1, maxX3m1); + distributeData(rdata, index, minX1, minX2p1, maxX3m1); + distributeData(rdata, index, minX1p1, minX2, maxX3m1); + distributeData(rdata, index, minX1p1, minX2p1, maxX3); + distributeData(rdata, index, minX1, minX2, maxX3m1); + distributeData(rdata, index, minX1, minX2p1, maxX3); + distributeData(rdata, index, minX1p1, minX2, maxX3); + } else + UB_THROW(UbException(UB_EXARGS, "unknown dir")); + +} +////////////////////////////////////////////////////////////////////////// + + diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.h new file mode 100644 index 0000000000000000000000000000000000000000..408a8e79d8a22ae71f0f03d51205b6c01a391aae --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsDoubleGhostLayerFullVectorConnector.h @@ -0,0 +1,302 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ThreeDistributionsDoubleGhostLayerFullVectorConnector.h +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef ThreeDistributionsDoubleGhostLayerFullVectorConnector_H +#define ThreeDistributionsDoubleGhostLayerFullVectorConnector_H + +#include <vector> + +#include "FullVectorConnector.h" +#include "D3Q27System.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "basics/container/CbArray3D.h" +#include "basics/container/CbArray4D.h" +#include "DataSet3D.h" + +class EsoTwist3D; +class Block3D; + +//daten werden in einen vector (dieser befindet sich im transmitter) kopiert +//der vector wird via transmitter uebertragen +//transmitter kann ein lokal, MPI, RCG, CTL oder was auch immer fuer ein +//transmitter sein, der von Transmitter abgeleitet ist ;-) +class ThreeDistributionsDoubleGhostLayerFullVectorConnector : public FullVectorConnector +{ +public: + ThreeDistributionsDoubleGhostLayerFullVectorConnector(SPtr<Block3D> block, VectorTransmitterPtr sender, VectorTransmitterPtr receiver, int sendDir); + + void init() override; + + void fillSendVectors() override; + void distributeReceiveVectors() override; + +protected: + inline void updatePointers() override; + void fillData() override; + void distributeData() override; + inline void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) override; + inline void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) override; + +private: + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributions; + + SPtr<EsoTwist3D> fDis; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localHdistributions; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalHdistributions; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroHdistributions; + + SPtr<EsoTwist3D> hDis; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localH2distributions; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalH2distributions; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroH2distributions; + + SPtr<EsoTwist3D> h2Dis; + + SPtr<PressureFieldArray3D> pressure; + +}; +////////////////////////////////////////////////////////////////////////// +inline void ThreeDistributionsDoubleGhostLayerFullVectorConnector::updatePointers() +{ + localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions(); + nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions(); + zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions(); + + localHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions(); + nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions(); + zeroHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions(); + + localH2distributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getLocalDistributions(); + nonLocalH2distributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getNonLocalDistributions(); + zeroH2distributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getZeroDistributions(); +} +////////////////////////////////////////////////////////////////////////// +inline void ThreeDistributionsDoubleGhostLayerFullVectorConnector::fillData(vector_type& sdata, int& index, int x1, int x2, int x3) +{ + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroDistributions)(x1, x2, x3); + + + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroHdistributions)(x1, x2, x3); + + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroH2distributions)(x1, x2, x3); + + sdata[index++] = (*this->pressure)(x1, x2, x3); +} +////////////////////////////////////////////////////////////////////////// +inline void ThreeDistributionsDoubleGhostLayerFullVectorConnector::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3) +{ + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroDistributions)(x1, x2, x3) = rdata[index++]; + + + (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroHdistributions)(x1, x2, x3) = rdata[index++]; + + (*this->localH2distributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalH2distributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroH2distributions)(x1, x2, x3) = rdata[index++]; + + (*this->pressure)(x1, x2, x3) = rdata[index++]; +} + + +#endif + diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector.cpp index 2e726fc7b88c9ef229e503924eadcf53a9b06dfd..534076b7bfcb63386c75d6d8619b4b56bbd5c5ee 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector.cpp +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector.cpp @@ -59,37 +59,37 @@ void ThreeDistributionsFullVectorConnector::init() int anz = 3*27; switch (sendDir) { - case D3Q27System::REST: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; - case D3Q27System::E: - case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz, 0.0); break; - case D3Q27System::N: - case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0); break; - case D3Q27System::T: - case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0); break; + case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; + case D3Q27System::DIR_P00: + case D3Q27System::DIR_M00: sender->getData().resize(maxX2*maxX3*anz, 0.0); break; + case D3Q27System::DIR_0P0: + case D3Q27System::DIR_0M0: sender->getData().resize(maxX1*maxX3*anz, 0.0); break; + case D3Q27System::DIR_00P: + case D3Q27System::DIR_00M: sender->getData().resize(maxX1*maxX2*anz, 0.0); break; - case D3Q27System::NE: - case D3Q27System::SW: - case D3Q27System::SE: - case D3Q27System::NW: sender->getData().resize(maxX3*anz, 0.0); break; + case D3Q27System::DIR_PP0: + case D3Q27System::DIR_MM0: + case D3Q27System::DIR_PM0: + case D3Q27System::DIR_MP0: sender->getData().resize(maxX3*anz, 0.0); break; - case D3Q27System::TE: - case D3Q27System::BW: - case D3Q27System::BE: - case D3Q27System::TW: sender->getData().resize(maxX2*anz, 0.0); break; + case D3Q27System::DIR_P0P: + case D3Q27System::DIR_M0M: + case D3Q27System::DIR_P0M: + case D3Q27System::DIR_M0P: sender->getData().resize(maxX2*anz, 0.0); break; - case D3Q27System::TN: - case D3Q27System::BS: - case D3Q27System::BN: - case D3Q27System::TS: sender->getData().resize(maxX1*anz, 0.0); break; + case D3Q27System::DIR_0PP: + case D3Q27System::DIR_0MM: + case D3Q27System::DIR_0PM: + case D3Q27System::DIR_0MP: sender->getData().resize(maxX1*anz, 0.0); break; - case D3Q27System::TNE: - case D3Q27System::BSW: - case D3Q27System::BNE: - case D3Q27System::TSW: - case D3Q27System::TSE: - case D3Q27System::BNW: - case D3Q27System::BSE: - case D3Q27System::TNW: sender->getData().resize(anz, 0.0); break; + case D3Q27System::DIR_PPP: + case D3Q27System::DIR_MMM: + case D3Q27System::DIR_PPM: + case D3Q27System::DIR_MMP: + case D3Q27System::DIR_PMP: + case D3Q27System::DIR_MPM: + case D3Q27System::DIR_PMM: + case D3Q27System::DIR_MPP: sender->getData().resize(anz, 0.0); break; default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir")); } diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b46ffebeb144569311272050893118f34e862398 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.cpp @@ -0,0 +1,315 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 TwoDistributionsDoubleGhostLayerFullDirectConnector.cpp +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#include "TwoDistributionsDoubleGhostLayerFullDirectConnector.h" +#include "LBMKernel.h" +#include "DataSet3D.h" + +TwoDistributionsDoubleGhostLayerFullDirectConnector::TwoDistributionsDoubleGhostLayerFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir) + : FullDirectConnector(from, to, sendDir) +{ + +} +////////////////////////////////////////////////////////////////////////// +void TwoDistributionsDoubleGhostLayerFullDirectConnector::init() +{ + FullDirectConnector::init(); + + fFrom =dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getFdistributions()); + fTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getFdistributions()); + hFrom = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getHdistributions()); + hTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getHdistributions()); + pressureFrom = from.lock()->getKernel()->getDataSet()->getPressureField(); + pressureTo = to.lock()->getKernel()->getDataSet()->getPressureField(); +} +////////////////////////////////////////////////////////////////////////// +void TwoDistributionsDoubleGhostLayerFullDirectConnector::sendVectors() +{ + updatePointers(); + exchangeData(); +} +////////////////////////////////////////////////////////////////////////// +void TwoDistributionsDoubleGhostLayerFullDirectConnector::exchangeData() +{ + //////////////////////////////////////////////////////////// + // relation between ghost layer and regular nodes + // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes + // minX1 minX1p1 ... maxX1m1 maxX1 - ghost layer + //////////////////////////////////////////////////////////// + + int minX1 = 0; + int minX1p1 = minX1 + 1; + int minX1p2 = minX1 + 2; + int minX1p3 = minX1 + 3; + int maxX1m1 = maxX1 - 1; + int maxX1m2 = maxX1 - 2; + int maxX1m3 = maxX1 - 3; + + int minX2 = 0; + int minX2p1 = minX2 + 1; + int minX2p2 = minX2 + 2; + int minX2p3 = minX2 + 3; + int maxX2m1 = maxX2 - 1; + int maxX2m2 = maxX2 - 2; + int maxX2m3 = maxX2 - 3; + + int minX3 = 0; + int minX3p1 = minX3 + 1; + int minX3p2 = minX3 + 2; + int minX3p3 = minX3 + 3; + int maxX3m1 = maxX3 - 1; + int maxX3m2 = maxX3 - 2; + int maxX3m3 = maxX3 - 3; + + // EAST + if (sendDir == D3Q27System::DIR_P00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(maxX1m3, x2, x3, minX1, x2, x3); + exchangeData(maxX1m2, x2, x3, minX1p1, x2, x3); + } + } + } + // WEST + else if (sendDir == D3Q27System::DIR_M00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(minX1p3, x2, x3, maxX1, x2, x3); + exchangeData(minX1p2, x2, x3, maxX1m1, x2, x3); + } + } + } + // NORTH + else if (sendDir == D3Q27System::DIR_0P0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, maxX2m3, x3, x1, minX2, x3); + exchangeData(x1, maxX2m2, x3, x1, minX2p1, x3); + } + } + } + // SOUTH + else if (sendDir == D3Q27System::DIR_0M0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, minX2p3, x3, x1, maxX2, x3); + exchangeData(x1, minX2p2, x3, x1, maxX2m1, x3); + } + } + } + + // TOP + else if (sendDir == D3Q27System::DIR_00P) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, x2, maxX3m3, x1, x2, minX3); + exchangeData(x1, x2, maxX3m2, x1, x2, minX3p1); + } + } + } + // BOTTOM + else if (sendDir == D3Q27System::DIR_00M) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, x2, minX3p3, x1, x2, maxX3); + exchangeData(x1, x2, minX3p2, x1, x2, maxX3m1); + } + } + } + // NORTHEAST + else if (sendDir == D3Q27System::DIR_PP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + exchangeData(maxX1m3, maxX2m3, x3, minX1, minX2, x3); + exchangeData(maxX1m2, maxX2m2, x3, minX1p1, minX2p1, x3); + exchangeData(maxX1m3, maxX2m2, x3, minX1, minX2p1, x3); + exchangeData(maxX1m2, maxX2m3, x3, minX1p1, minX2, x3); + } + } + // NORTHWEST + else if (sendDir == D3Q27System::DIR_MP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + exchangeData(minX1p3, maxX2m3, x3, maxX1, minX2, x3); + exchangeData(minX1p2, maxX2m2, x3, maxX1m1, minX2p1, x3); + exchangeData(minX1p3, maxX2m2, x3, maxX1, minX2p1, x3); + exchangeData(minX1p2, maxX2m3, x3, maxX1m1, minX2, x3); + } + } + // SOUTHWEST + else if (sendDir == D3Q27System::DIR_MM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + exchangeData(minX1p3, minX2p3, x3, maxX1, maxX2, x3); + exchangeData(minX1p2, minX2p2, x3, maxX1m1, maxX2m1, x3); + exchangeData(minX1p3, minX2p2, x3, maxX1, maxX2m1, x3); + exchangeData(minX1p2, minX2p3, x3, maxX1m1, maxX2, x3); + } + } + // SOUTHEAST + else if (sendDir == D3Q27System::DIR_PM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + exchangeData(maxX1m3, minX2p3, x3, minX1, maxX2, x3); + exchangeData(maxX1m2, minX2p2, x3, minX1p1, maxX2m1, x3); + exchangeData(maxX1m3, minX2p2, x3, minX1, maxX2m1, x3); + exchangeData(maxX1m2, minX2p3, x3, minX1p1, maxX2, x3); + } + } else if (sendDir == D3Q27System::DIR_P0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(maxX1m3, x2, maxX3m3, minX1, x2, minX3); + exchangeData(maxX1m2, x2, maxX3m2, minX1p1, x2, minX3p1); + exchangeData(maxX1m3, x2, maxX3m2, minX1, x2, minX3p1); + exchangeData(maxX1m2, x2, maxX3m3, minX1p1, x2, minX3); + } + else if (sendDir == D3Q27System::DIR_M0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(minX1p3, x2, minX3p3, maxX1, x2, maxX3); + exchangeData(minX1p2, x2, minX3p2, maxX1m1, x2, maxX3m1); + exchangeData(minX1p3, x2, minX3p2, maxX1, x2, maxX3m1); + exchangeData(minX1p2, x2, minX3p3, maxX1m1, x2, maxX3); + } + else if (sendDir == D3Q27System::DIR_P0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(maxX1m3, x2, minX3p3, minX1, x2, maxX3); + exchangeData(maxX1m2, x2, minX3p2, minX1p1, x2, maxX3m1); + exchangeData(maxX1m3, x2, minX3p2, minX1, x2, maxX3m1); + exchangeData(maxX1m2, x2, minX3p3, minX1p1, x2, maxX3); + } + else if (sendDir == D3Q27System::DIR_M0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + exchangeData(minX1p3, x2, maxX3m3, maxX1, x2, minX3); + exchangeData(minX1p2, x2, maxX3m2, maxX1m1, x2, minX3p1); + exchangeData(minX1p3, x2, maxX3m2, maxX1, x2, minX3p1); + exchangeData(minX1p2, x2, maxX3m3, maxX1m1, x2, minX3); + } + else if (sendDir == D3Q27System::DIR_0PP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, maxX2m3, maxX3m3, x1, minX2, minX3); + exchangeData(x1, maxX2m2, maxX3m2, x1, minX2p1, minX3p1); + exchangeData(x1, maxX2m3, maxX3m2, x1, minX2, minX3p1); + exchangeData(x1, maxX2m2, maxX3m3, x1, minX2p1, minX3); + } + else if (sendDir == D3Q27System::DIR_0MM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, minX2p3, minX3p3, x1, maxX2, maxX3); + exchangeData(x1, minX2p2, minX3p2, x1, maxX2m1, maxX3m1); + exchangeData(x1, minX2p3, minX3p2, x1, maxX2, maxX3m1); + exchangeData(x1, minX2p2, minX3p3, x1, maxX2m1, maxX3); + } + else if (sendDir == D3Q27System::DIR_0PM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, maxX2m3, minX3p3, x1, minX2, maxX3); + exchangeData(x1, maxX2m2, minX3p2, x1, minX2p1, maxX3m1); + exchangeData(x1, maxX2m3, minX3p2, x1, minX2, maxX3m1); + exchangeData(x1, maxX2m2, minX3p3, x1, minX2p1, maxX3); + } + else if (sendDir == D3Q27System::DIR_0MP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + exchangeData(x1, minX2p3, maxX3m3, x1, maxX2, minX3); + exchangeData(x1, minX2p2, maxX3m2, x1, maxX2m1, minX3p1); + exchangeData(x1, minX2p3, maxX3m2, x1, maxX2, minX3p1); + exchangeData(x1, minX2p2, maxX3m3, x1, maxX2m1, minX3); + } + else if (sendDir == D3Q27System::DIR_MMP) { + exchangeData(minX1p3, minX2p3, maxX3m3, maxX1, maxX2, minX3); + exchangeData(minX1p2, minX2p2, maxX3m2, maxX1m1, maxX2m1, minX3p1); + exchangeData(minX1p3, minX2p2, maxX3m2, maxX1, maxX2m1, minX3p1); + exchangeData(minX1p2, minX2p3, maxX3m2, maxX1m1, maxX2, minX3p1); + exchangeData(minX1p2, minX2p2, maxX3m3, maxX1m1, maxX2m1, minX3); + exchangeData(minX1p3, minX2p3, maxX3m2, maxX1, maxX2, minX3p1); + exchangeData(minX1p3, minX2p2, maxX3m3, maxX1, maxX2m1, minX3); + exchangeData(minX1p2, minX2p3, maxX3m3, maxX1m1, maxX2, minX3); + } else if (sendDir == D3Q27System::DIR_PMP) { + exchangeData(maxX1m3, minX1p3, maxX3m3, minX1, maxX2, minX3); + exchangeData(maxX1m2, minX1p2, maxX3m2, minX1p1, maxX2m1, minX3p1); + exchangeData(maxX1m3, minX1p2, maxX3m2, minX1, maxX2m1, minX3p1); + exchangeData(maxX1m2, minX1p3, maxX3m2, minX1p1, maxX2, minX3p1); + exchangeData(maxX1m2, minX1p2, maxX3m3, minX1p1, maxX2m1, minX3); + exchangeData(maxX1m3, minX1p3, maxX3m2, minX1, maxX2, minX3p1); + exchangeData(maxX1m3, minX1p2, maxX3m3, minX1, maxX2m1, minX3); + exchangeData(maxX1m2, minX1p3, maxX3m3, minX1p1, maxX2, minX3); + } else if (sendDir == D3Q27System::DIR_MPP) { + exchangeData(minX1p3, maxX2m3, maxX3m3, maxX1, minX2, minX3); + exchangeData(minX1p2, maxX2m2, maxX3m2, maxX1m1, minX2p1, minX3p1); + exchangeData(minX1p3, maxX2m2, maxX3m2, maxX1, minX2p1, minX3p1); + exchangeData(minX1p2, maxX2m3, maxX3m2, maxX1m1, minX2, minX3p1); + exchangeData(minX1p2, maxX2m2, maxX3m3, maxX1m1, minX2p1, minX3); + exchangeData(minX1p3, maxX2m3, maxX3m2, maxX1, minX2, minX3p1); + exchangeData(minX1p3, maxX2m2, maxX3m3, maxX1, minX2p1, minX3); + exchangeData(minX1p2, maxX2m3, maxX3m3, maxX1m1, minX2, minX3); + } else if (sendDir == D3Q27System::DIR_PPP) { + exchangeData(maxX1m3, maxX2m3, maxX3m3, minX1, minX2, minX3); + exchangeData(maxX1m2, maxX2m2, maxX3m2, minX1p1, minX2p1, minX3p1); + exchangeData(maxX1m3, maxX2m2, maxX3m2, minX1, minX2p1, minX3p1); + exchangeData(maxX1m2, maxX2m3, maxX3m2, minX1p1, minX2, minX3p1); + exchangeData(maxX1m2, maxX2m2, maxX3m3, minX1p1, minX2p1, minX3); + exchangeData(maxX1m3, maxX2m3, maxX3m2, minX1, minX2, minX3p1); + exchangeData(maxX1m3, maxX2m2, maxX3m3, minX1, minX2p1, minX3); + exchangeData(maxX1m2, maxX2m3, maxX3m3, minX1p1, minX2, minX3); + } else if (sendDir == D3Q27System::DIR_MMM) { + exchangeData(minX1p3, minX2p3, minX3p3, maxX1, maxX2, maxX3); + exchangeData(minX1p2, minX2p2, minX3p2, maxX1m1, maxX2m1, maxX3m1); + exchangeData(minX1p3, minX2p2, minX3p2, maxX1, maxX2m1, maxX3m1); + exchangeData(minX1p2, minX2p3, minX3p2, maxX1m1, maxX2, maxX3m1); + exchangeData(minX1p2, minX2p2, minX3p3, maxX1m1, maxX2m1, maxX3); + exchangeData(minX1p3, minX2p3, minX3p2, maxX1, maxX2, maxX3m1); + exchangeData(minX1p3, minX2p2, minX3p3, maxX1, maxX2m1, maxX3); + exchangeData(minX1p2, minX2p3, minX3p3, maxX1m1, maxX2, maxX3); + } else if (sendDir == D3Q27System::DIR_PMM) { + exchangeData(maxX1m3, minX2p3, minX3p3, minX1, maxX2, maxX3); + exchangeData(maxX1m2, minX2p2, minX3p2, minX1p1, maxX2m1, maxX3m1); + exchangeData(maxX1m3, minX2p2, minX3p2, minX1, maxX2m1, maxX3m1); + exchangeData(maxX1m2, minX2p3, minX3p2, minX1p1, maxX2, maxX3m1); + exchangeData(maxX1m2, minX2p2, minX3p3, minX1p1, maxX2m1, maxX3); + exchangeData(maxX1m3, minX2p3, minX3p2, minX1, maxX2, maxX3m1); + exchangeData(maxX1m3, minX2p2, minX3p3, minX1, maxX2m1, maxX3); + exchangeData(maxX1m2, minX2p3, minX3p3, minX1p1, maxX2, maxX3); + } else if (sendDir == D3Q27System::DIR_MPM) { + exchangeData(minX1p3, maxX2m3, minX3p3, maxX1, minX2, maxX3); + exchangeData(minX1p2, maxX2m2, minX3p2, maxX1m1, minX2p1, maxX3m1); + exchangeData(minX1p3, maxX2m2, minX3p2, maxX1, minX2p1, maxX3m1); + exchangeData(minX1p2, maxX2m3, minX3p2, maxX1m1, minX2, maxX3m1); + exchangeData(minX1p2, maxX2m2, minX3p3, maxX1m1, minX2p1, maxX3); + exchangeData(minX1p3, maxX2m3, minX3p2, maxX1, minX2, maxX3m1); + exchangeData(minX1p3, maxX2m2, minX3p3, maxX1, minX2p1, maxX3); + exchangeData(minX1p2, maxX2m3, minX3p3, maxX1m1, minX2, maxX3); + } else if (sendDir == D3Q27System::DIR_PPM) { + exchangeData(maxX1m3, maxX2m3, minX3p3, minX1, minX2, maxX3); + exchangeData(maxX1m2, maxX2m2, minX3p2, minX1p1, minX2p1, maxX3m1); + exchangeData(maxX1m3, maxX2m2, minX3p2, minX1, minX2p1, maxX3m1); + exchangeData(maxX1m2, maxX2m3, minX3p2, minX1p1, minX2, maxX3m1); + exchangeData(maxX1m2, maxX2m2, minX3p3, minX1p1, minX2p1, maxX3); + exchangeData(maxX1m3, maxX2m3, minX3p2, minX1, minX2, maxX3m1); + exchangeData(maxX1m3, maxX2m2, minX3p3, minX1, minX2p1, maxX3); + exchangeData(maxX1m2, maxX2m3, minX3p3, minX1p1, minX2, maxX3); + } else + UB_THROW(UbException(UB_EXARGS, "unknown dir")); + +} diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.h new file mode 100644 index 0000000000000000000000000000000000000000..bc431f9f3bbb16587df76355c395fff780137b22 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullDirectConnector.h @@ -0,0 +1,167 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 TwoDistributionsDoubleGhostLayerFullDirectConnector.h +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef TwoDistributionsDoubleGhostLayerFullDirectConnector_H +#define TwoDistributionsDoubleGhostLayerFullDirectConnector_H + +#include "FullDirectConnector.h" +#include "Block3D.h" +#include "D3Q27System.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "basics/container/CbArray3D.h" +#include "basics/container/CbArray4D.h" +#include "DataSet3D.h" + +//! \brief Exchange data between blocks. +//! \details Connector send and receive full distributions between two blocks in shared memory. + +class TwoDistributionsDoubleGhostLayerFullDirectConnector : public FullDirectConnector +{ +public: + TwoDistributionsDoubleGhostLayerFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir); + void init() override; + void sendVectors() override; + +protected: + inline void updatePointers() override; + void exchangeData() override; + inline void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) override; + +private: + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromf; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromf; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsFromf; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsTof; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsTof; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsTof; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromh; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromh; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsFromh; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsToh; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsToh; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsToh; + + SPtr<EsoTwist3D> fFrom, hFrom; + SPtr<EsoTwist3D> fTo, hTo; + + SPtr<PressureFieldArray3D> pressureFrom, pressureTo; +}; +////////////////////////////////////////////////////////////////////////// +inline void TwoDistributionsDoubleGhostLayerFullDirectConnector::updatePointers() +{ + localDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getLocalDistributions(); + nonLocalDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getNonLocalDistributions(); + zeroDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getZeroDistributions(); + + localDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getLocalDistributions(); + nonLocalDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getNonLocalDistributions(); + zeroDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getZeroDistributions(); + + localDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getLocalDistributions(); + nonLocalDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getNonLocalDistributions(); + zeroDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getZeroDistributions(); + + localDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getLocalDistributions(); + nonLocalDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getNonLocalDistributions(); + zeroDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getZeroDistributions(); +} +////////////////////////////////////////////////////////////////////////// +inline void TwoDistributionsDoubleGhostLayerFullDirectConnector::exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) +{ + (*this->localDistributionsTof)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_E, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_N, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_T, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TN, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TS, x1From, x2From + 1, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From); + + (*this->nonLocalDistributionsTof)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_W, x1From + 1, x2From, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_S, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_B, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SE, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BE, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BN, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1); + + (*this->zeroDistributionsTof)(x1To, x2To, x3To) = (*this->zeroDistributionsFromf)(x1From, x2From, x3From); + + + (*this->localDistributionsToh)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_E, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_N, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_T, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TN, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TS, x1From, x2From + 1, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From); + + (*this->nonLocalDistributionsToh)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_W, x1From + 1, x2From, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_S, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_B, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SE, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BE, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BN, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1); + + (*this->zeroDistributionsToh)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh)(x1From, x2From, x3From); + + (*this->pressureTo)(x1To, x2To, x3To) = (*this->pressureFrom)(x1From, x2From, x3From); +} +#endif \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9dc8a99deb20f8f49f40f7d2e7c8a0c66b687fcb --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.cpp @@ -0,0 +1,615 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 TwoDistributionsDoubleGhostLayerFullVectorConnector.cpp +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#include "TwoDistributionsDoubleGhostLayerFullVectorConnector.h" +#include "Block3D.h" +#include "LBMKernel.h" +#include "EsoTwist3D.h" +#include "DataSet3D.h" + +////////////////////////////////////////////////////////////////////////// +TwoDistributionsDoubleGhostLayerFullVectorConnector::TwoDistributionsDoubleGhostLayerFullVectorConnector(SPtr<Block3D> block, + VectorTransmitterPtr sender, + VectorTransmitterPtr receiver, int sendDir) + : FullVectorConnector(block, sender, receiver, sendDir) +{ + if (!block || !sender || !receiver) + UB_THROW(UbException(UB_EXARGS, "sender or receiver == NULL!!")); + +} +////////////////////////////////////////////////////////////////////////// +void TwoDistributionsDoubleGhostLayerFullVectorConnector::init() +{ + FullVectorConnector::init(); + + fDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getFdistributions()); + hDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getHdistributions()); + pressure = block.lock()->getKernel()->getDataSet()->getPressureField(); + + int anz = 2*27+1; + switch (sendDir) + { + case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; + case D3Q27System::DIR_P00: + case D3Q27System::DIR_M00: sender->getData().resize(maxX2*maxX3*anz*2, 0.0); break; + case D3Q27System::DIR_0P0: + case D3Q27System::DIR_0M0: sender->getData().resize(maxX1*maxX3*anz*2, 0.0); break; + case D3Q27System::DIR_00P: + case D3Q27System::DIR_00M: sender->getData().resize(maxX1*maxX2*anz*2, 0.0); break; + + case D3Q27System::DIR_PP0: + case D3Q27System::DIR_MM0: + case D3Q27System::DIR_PM0: + case D3Q27System::DIR_MP0: sender->getData().resize(maxX3*anz*4, 0.0); break; + + case D3Q27System::DIR_P0P: + case D3Q27System::DIR_M0M: + case D3Q27System::DIR_P0M: + case D3Q27System::DIR_M0P: sender->getData().resize(maxX2*anz*4, 0.0); break; + + case D3Q27System::DIR_0PP: + case D3Q27System::DIR_0MM: + case D3Q27System::DIR_0PM: + case D3Q27System::DIR_0MP: sender->getData().resize(maxX1*anz*4, 0.0); break; + + case D3Q27System::DIR_PPP: + case D3Q27System::DIR_MMM: + case D3Q27System::DIR_PPM: + case D3Q27System::DIR_MMP: + case D3Q27System::DIR_PMP: + case D3Q27System::DIR_MPM: + case D3Q27System::DIR_PMM: + case D3Q27System::DIR_MPP: sender->getData().resize(anz*8, 0.0); break; + + default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir")); + } +} +////////////////////////////////////////////////////////////////////////// +void TwoDistributionsDoubleGhostLayerFullVectorConnector::fillSendVectors() +{ + updatePointers(); + fillData(); +} +//////////////////////////////////////////////////////////////////////// +void TwoDistributionsDoubleGhostLayerFullVectorConnector::fillData() +{ + //////////////////////////////////////////////////////////// + // relation between ghost layer and regular nodes + // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes + // minX1 minX1p1 ... maxX1m1 maxX1 - ghost layer + //////////////////////////////////////////////////////////// + + int minX1 = 0; + //int minX1p1 = minX1 + 1; + int minX1p2 = minX1 + 2; + int minX1p3 = minX1 + 3; + //int maxX1m1 = maxX1 - 1; + int maxX1m2 = maxX1 - 2; + int maxX1m3 = maxX1 - 3; + + int minX2 = 0; + //int minX2p1 = minX2 + 1; + int minX2p2 = minX2 + 2; + int minX2p3 = minX2 + 3; + //int maxX2m1 = maxX2 - 1; + int maxX2m2 = maxX2 - 2; + int maxX2m3 = maxX2 - 3; + + int minX3 = 0; + //int minX3p1 = minX3 + 1; + int minX3p2 = minX3 + 2; + int minX3p3 = minX3 + 3; + //int maxX3m1 = maxX3 - 1; + int maxX3m2 = maxX3 - 2; + int maxX3m3 = maxX3 - 3; + + vector_type &sdata = sender->getData(); + + int index = 0; + // EAST + if (sendDir == D3Q27System::DIR_P00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, x3); + fillData(sdata, index, maxX1m2, x2, x3); + } + } + } + // WEST + else if (sendDir == D3Q27System::DIR_M00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, x3); + fillData(sdata, index, minX1p2, x2, x3); + } + } + } + // NORTH + else if (sendDir == D3Q27System::DIR_0P0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, x3); + fillData(sdata, index, x1, maxX2m2, x3); + } + } + } + // SOUTH + else if (sendDir == D3Q27System::DIR_0M0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, x3); + fillData(sdata, index, x1, minX2p2, x3); + } + } + } + + // TOP + else if (sendDir == D3Q27System::DIR_00P) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, x2, maxX3m3); + fillData(sdata, index, x1, x2, maxX3m2); + } + } + } + // BOTTOM + else if (sendDir == D3Q27System::DIR_00M) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, x2, minX3p3); + fillData(sdata, index, x1, x2, minX3p2); + } + } + } + // NORTHEAST + else if (sendDir == D3Q27System::DIR_PP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, maxX1m3, maxX2m3, x3); + fillData(sdata, index, maxX1m2, maxX2m2, x3); + fillData(sdata, index, maxX1m3, maxX2m2, x3); + fillData(sdata, index, maxX1m2, maxX2m3, x3); + } + } + // NORTHWEST + else if (sendDir == D3Q27System::DIR_MP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, minX1p3, maxX2m3, x3); + fillData(sdata, index, minX1p2, maxX2m2, x3); + fillData(sdata, index, minX1p3, maxX2m2, x3); + fillData(sdata, index, minX1p2, maxX2m3, x3); + } + } + // SOUTHWEST + else if (sendDir == D3Q27System::DIR_MM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, minX1p3, minX2p3, x3); + fillData(sdata, index, minX1p2, minX2p2, x3); + fillData(sdata, index, minX1p3, minX2p2, x3); + fillData(sdata, index, minX1p2, minX2p3, x3); + } + } + // SOUTHEAST + else if (sendDir == D3Q27System::DIR_PM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, maxX1m3, minX2p3, x3); + fillData(sdata, index, maxX1m2, minX2p2, x3); + fillData(sdata, index, maxX1m3, minX2p2, x3); + fillData(sdata, index, maxX1m2, minX2p3, x3); + } + } else if (sendDir == D3Q27System::DIR_P0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, maxX3m3); + fillData(sdata, index, maxX1m2, x2, maxX3m2); + fillData(sdata, index, maxX1m3, x2, maxX3m2); + fillData(sdata, index, maxX1m2, x2, maxX3m3); + } + else if (sendDir == D3Q27System::DIR_M0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, minX3p3); + fillData(sdata, index, minX1p2, x2, minX3p2); + fillData(sdata, index, minX1p3, x2, minX3p2); + fillData(sdata, index, minX1p2, x2, minX3p3); + } + else if (sendDir == D3Q27System::DIR_P0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, minX3p3); + fillData(sdata, index, maxX1m2, x2, minX3p2); + fillData(sdata, index, maxX1m3, x2, minX3p2); + fillData(sdata, index, maxX1m2, x2, minX3p3); + } + else if (sendDir == D3Q27System::DIR_M0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, maxX3m3); + fillData(sdata, index, minX1p2, x2, maxX3m2); + fillData(sdata, index, minX1p3, x2, maxX3m2); + fillData(sdata, index, minX1p2, x2, maxX3m3); + } + else if (sendDir == D3Q27System::DIR_0PP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, maxX3m3); + fillData(sdata, index, x1, maxX2m2, maxX3m2); + fillData(sdata, index, x1, maxX2m3, maxX3m2); + fillData(sdata, index, x1, maxX2m2, maxX3m3); + } + else if (sendDir == D3Q27System::DIR_0MM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, minX3p3); + fillData(sdata, index, x1, minX2p2, minX3p2); + fillData(sdata, index, x1, minX2p3, minX3p2); + fillData(sdata, index, x1, minX2p2, minX3p3); + } + else if (sendDir == D3Q27System::DIR_0PM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, minX3p3); + fillData(sdata, index, x1, maxX2m2, minX3p2); + fillData(sdata, index, x1, maxX2m3, minX3p2); + fillData(sdata, index, x1, maxX2m2, minX3p3); + } + else if (sendDir == D3Q27System::DIR_0MP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, maxX3m3); + fillData(sdata, index, x1, minX2p2, maxX3m2); + fillData(sdata, index, x1, minX2p3, maxX3m2); + fillData(sdata, index, x1, minX2p2, maxX3m3); + } + else if (sendDir == D3Q27System::DIR_MMP) { + fillData(sdata, index, minX1p3, minX2p3, maxX3m3); + fillData(sdata, index, minX1p2, minX2p2, maxX3m2); + fillData(sdata, index, minX1p3, minX2p2, maxX3m2); + fillData(sdata, index, minX1p2, minX2p3, maxX3m2); + fillData(sdata, index, minX1p2, minX2p2, maxX3m3); + fillData(sdata, index, minX1p3, minX2p3, maxX3m2); + fillData(sdata, index, minX1p3, minX2p2, maxX3m3); + fillData(sdata, index, minX1p2, minX2p3, maxX3m3); + } else if (sendDir == D3Q27System::DIR_PMP) { + fillData(sdata, index, maxX1m3, minX1p3, maxX3m3); + fillData(sdata, index, maxX1m2, minX1p2, maxX3m2); + fillData(sdata, index, maxX1m3, minX1p2, maxX3m2); + fillData(sdata, index, maxX1m2, minX1p3, maxX3m2); + fillData(sdata, index, maxX1m2, minX1p2, maxX3m3); + fillData(sdata, index, maxX1m3, minX1p3, maxX3m2); + fillData(sdata, index, maxX1m3, minX1p2, maxX3m3); + fillData(sdata, index, maxX1m2, minX1p3, maxX3m3); + } else if (sendDir == D3Q27System::DIR_MPP) { + fillData(sdata, index, minX1p3, maxX2m3, maxX3m3); + fillData(sdata, index, minX1p2, maxX2m2, maxX3m2); + fillData(sdata, index, minX1p3, maxX2m2, maxX3m2); + fillData(sdata, index, minX1p2, maxX2m3, maxX3m2); + fillData(sdata, index, minX1p2, maxX2m2, maxX3m3); + fillData(sdata, index, minX1p3, maxX2m3, maxX3m2); + fillData(sdata, index, minX1p3, maxX2m2, maxX3m3); + fillData(sdata, index, minX1p2, maxX2m3, maxX3m3); + } else if (sendDir == D3Q27System::DIR_PPP) { + fillData(sdata, index, maxX1m3, maxX2m3, maxX3m3); + fillData(sdata, index, maxX1m2, maxX2m2, maxX3m2); + fillData(sdata, index, maxX1m3, maxX2m2, maxX3m2); + fillData(sdata, index, maxX1m2, maxX2m3, maxX3m2); + fillData(sdata, index, maxX1m2, maxX2m2, maxX3m3); + fillData(sdata, index, maxX1m3, maxX2m3, maxX3m2); + fillData(sdata, index, maxX1m3, maxX2m2, maxX3m3); + fillData(sdata, index, maxX1m2, maxX2m3, maxX3m3); + } else if (sendDir == D3Q27System::DIR_MMM) { + fillData(sdata, index, minX1p3, minX2p3, minX3p3); + fillData(sdata, index, minX1p2, minX2p2, minX3p2); + fillData(sdata, index, minX1p3, minX2p2, minX3p2); + fillData(sdata, index, minX1p2, minX2p3, minX3p2); + fillData(sdata, index, minX1p2, minX2p2, minX3p3); + fillData(sdata, index, minX1p3, minX2p3, minX3p2); + fillData(sdata, index, minX1p3, minX2p2, minX3p3); + fillData(sdata, index, minX1p2, minX2p3, minX3p3); + } else if (sendDir == D3Q27System::DIR_PMM) { + fillData(sdata, index, maxX1m3, minX2p3, minX3p3); + fillData(sdata, index, maxX1m2, minX2p2, minX3p2); + fillData(sdata, index, maxX1m3, minX2p2, minX3p2); + fillData(sdata, index, maxX1m2, minX2p3, minX3p2); + fillData(sdata, index, maxX1m2, minX2p2, minX3p3); + fillData(sdata, index, maxX1m3, minX2p3, minX3p2); + fillData(sdata, index, maxX1m3, minX2p2, minX3p3); + fillData(sdata, index, maxX1m2, minX2p3, minX3p3); + } else if (sendDir == D3Q27System::DIR_MPM) { + fillData(sdata, index, minX1p3, maxX2m3, minX3p3); + fillData(sdata, index, minX1p2, maxX2m2, minX3p2); + fillData(sdata, index, minX1p3, maxX2m2, minX3p2); + fillData(sdata, index, minX1p2, maxX2m3, minX3p2); + fillData(sdata, index, minX1p2, maxX2m2, minX3p3); + fillData(sdata, index, minX1p3, maxX2m3, minX3p2); + fillData(sdata, index, minX1p3, maxX2m2, minX3p3); + fillData(sdata, index, minX1p2, maxX2m3, minX3p3); + } else if (sendDir == D3Q27System::DIR_PPM) { + fillData(sdata, index, maxX1m3, maxX2m3, minX3p3); + fillData(sdata, index, maxX1m2, maxX2m2, minX3p2); + fillData(sdata, index, maxX1m3, maxX2m2, minX3p2); + fillData(sdata, index, maxX1m2, maxX2m3, minX3p2); + fillData(sdata, index, maxX1m2, maxX2m2, minX3p3); + fillData(sdata, index, maxX1m3, maxX2m3, minX3p2); + fillData(sdata, index, maxX1m3, maxX2m2, minX3p3); + fillData(sdata, index, maxX1m2, maxX2m3, minX3p3); + } else + UB_THROW(UbException(UB_EXARGS, "unknown dir")); +} +//////////////////////////////////////////////////////////////////////// +void TwoDistributionsDoubleGhostLayerFullVectorConnector::distributeReceiveVectors() +{ + updatePointers(); + distributeData(); +} +//////////////////////////////////////////////////////////////////////// +void TwoDistributionsDoubleGhostLayerFullVectorConnector::distributeData() +{ + vector_type &rdata = receiver->getData(); + + int index = 0; + //////////////////////////////////////////////////////////// + // relation between ghost layer and regular nodes + // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes + // minX1 minX1p1 ... maxX1m1 maxX1 - ghost layer + //////////////////////////////////////////////////////////// + + int minX1 = 0; + int minX1p1 = minX1 + 1; + int minX1p2 = minX1 + 2; + //int minX1p3 = minX1 + 3; + int maxX1m1 = maxX1 - 1; + int maxX1m2 = maxX1 - 2; + //int maxX1m3 = maxX1 - 3; + + int minX2 = 0; + int minX2p1 = minX2 + 1; + int minX2p2 = minX2 + 2; + //int minX2p3 = minX2 + 3; + int maxX2m1 = maxX2 - 1; + int maxX2m2 = maxX2 - 2; + //int maxX2m3 = maxX2 - 3; + + int minX3 = 0; + int minX3p1 = minX3 + 1; + int minX3p2 = minX3 + 2; + //int minX3p3 = minX3 + 3; + int maxX3m1 = maxX3 - 1; + int maxX3m2 = maxX3 - 2; + //int maxX3m3 = maxX3 - 3; + + if (sendDir == D3Q27System::DIR_M00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, x3); + distributeData(rdata, index, minX1p1, x2, x3); + } + } + } + else if (sendDir == D3Q27System::DIR_P00) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, x3); + distributeData(rdata, index, maxX1m1, x2, x3); + } + } + } + else if (sendDir == D3Q27System::DIR_0M0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, x3); + distributeData(rdata, index, x1, minX2p1, x3); + } + } + } + else if (sendDir == D3Q27System::DIR_0P0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, x3); + distributeData(rdata, index, x1, maxX2m1, x3); + } + } + } + else if (sendDir == D3Q27System::DIR_00M) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, x2, minX3); + distributeData(rdata, index, x1, x2, minX3p1); + } + } + } + else if (sendDir == D3Q27System::DIR_00P) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, x2, maxX3); + distributeData(rdata, index, x1, x2, maxX3m1); + } + } + } + else if (sendDir == D3Q27System::DIR_MM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, minX1, minX2, x3); + distributeData(rdata, index, minX1p1, minX2p1, x3); + distributeData(rdata, index, minX1, minX2p1, x3); + distributeData(rdata, index, minX1p1, minX2, x3); + } + } + else if (sendDir == D3Q27System::DIR_PM0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, maxX1, minX2, x3); + distributeData(rdata, index, maxX1m1, minX2p1, x3); + distributeData(rdata, index, maxX1, minX2p1, x3); + distributeData(rdata, index, maxX1m1, minX2, x3); + } + } + else if (sendDir == D3Q27System::DIR_PP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, maxX1, maxX2, x3); + distributeData(rdata, index, maxX1m1, maxX2m1, x3); + distributeData(rdata, index, maxX1, maxX2m1, x3); + distributeData(rdata, index, maxX1m1, maxX2, x3); + } + } + else if (sendDir == D3Q27System::DIR_MP0) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, minX1, maxX2, x3); + distributeData(rdata, index, minX1p1, maxX2m1, x3); + distributeData(rdata, index, minX1, maxX2m1, x3); + distributeData(rdata, index, minX1p1, maxX2, x3); + } + } else if (sendDir == D3Q27System::DIR_M0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, minX3); + distributeData(rdata, index, minX1p1, x2, minX3p1); + distributeData(rdata, index, minX1, x2, minX3p1); + distributeData(rdata, index, minX1p1, x2, minX3); + } + else if (sendDir == D3Q27System::DIR_P0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, maxX3); + distributeData(rdata, index, maxX1m1, x2, maxX3m1); + distributeData(rdata, index, maxX1, x2, maxX3m1); + distributeData(rdata, index, maxX1m1, x2, maxX3); + } + else if (sendDir == D3Q27System::DIR_M0P) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, maxX3); + distributeData(rdata, index, minX1p1, x2, maxX3m1); + distributeData(rdata, index, minX1, x2, maxX3m1); + distributeData(rdata, index, minX1p1, x2, maxX3); + } + else if (sendDir == D3Q27System::DIR_P0M) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, minX3); + distributeData(rdata, index, maxX1m1, x2, minX3p1); + distributeData(rdata, index, maxX1, x2, minX3p1); + distributeData(rdata, index, maxX1m1, x2, minX3); + } + else if (sendDir == D3Q27System::DIR_0MM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, minX3); + distributeData(rdata, index, x1, minX2p1, minX3p1); + distributeData(rdata, index, x1, minX2, minX3p1); + distributeData(rdata, index, x1, minX2p1, minX3); + } + else if (sendDir == D3Q27System::DIR_0PP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, maxX3); + distributeData(rdata, index, x1, maxX2m1, maxX3m1); + distributeData(rdata, index, x1, maxX2, maxX3m1); + distributeData(rdata, index, x1, maxX2m1, maxX3); + } + else if (sendDir == D3Q27System::DIR_0MP) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, maxX3); + distributeData(rdata, index, x1, minX2p1, maxX3m1); + distributeData(rdata, index, x1, minX2, maxX3m1); + distributeData(rdata, index, x1, minX2p1, maxX3); + } + else if (sendDir == D3Q27System::DIR_0PM) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, minX3); + distributeData(rdata, index, x1, maxX2m1, minX3p1); + distributeData(rdata, index, x1, maxX2, minX3p1); + distributeData(rdata, index, x1, maxX2m1, minX3); + } + else if (sendDir == D3Q27System::DIR_PPM) { + distributeData(rdata, index, maxX1, maxX2, minX3); + distributeData(rdata, index, maxX1m1, maxX2m1, minX3p1); + distributeData(rdata, index, maxX1, maxX2m1, minX3p1); + distributeData(rdata, index, maxX1m1, maxX2, minX3p1); + distributeData(rdata, index, maxX1m1, maxX2m1, minX3); + distributeData(rdata, index, maxX1, maxX2, minX3p1); + distributeData(rdata, index, maxX1, maxX2m1, minX3); + distributeData(rdata, index, maxX1m1, maxX2, minX3); + } else if (sendDir == D3Q27System::DIR_MPM) { + distributeData(rdata, index, minX1, maxX2, minX3); + distributeData(rdata, index, minX1p1, maxX2m1, minX3p1); + distributeData(rdata, index, minX1, maxX2m1, minX3p1); + distributeData(rdata, index, minX1p1, maxX2, minX3p1); + distributeData(rdata, index, minX1p1, maxX2m1, minX3); + distributeData(rdata, index, minX1, maxX2, minX3p1); + distributeData(rdata, index, minX1, maxX2m1, minX3); + distributeData(rdata, index, minX1p1, maxX2, minX3); + } else if (sendDir == D3Q27System::DIR_PMM) { + distributeData(rdata, index, maxX1, minX2, minX3); + distributeData(rdata, index, maxX1m1, minX2p1, minX3p1); + distributeData(rdata, index, maxX1, minX2p1, minX3p1); + distributeData(rdata, index, maxX1m1, minX2, minX3p1); + distributeData(rdata, index, maxX1m1, minX2p1, minX3); + distributeData(rdata, index, maxX1, minX2, minX3p1); + distributeData(rdata, index, maxX1, minX2p1, minX3); + distributeData(rdata, index, maxX1m1, minX2, minX3); + } else if (sendDir == D3Q27System::DIR_MMM) { + distributeData(rdata, index, minX1, minX2, minX3); + distributeData(rdata, index, minX1p1, minX2p1, minX3p1); + distributeData(rdata, index, minX1, minX2p1, minX3p1); + distributeData(rdata, index, minX1p1, minX2, minX3p1); + distributeData(rdata, index, minX1p1, minX2p1, minX3); + distributeData(rdata, index, minX1, minX2, minX3p1); + distributeData(rdata, index, minX1, minX2p1, minX3); + distributeData(rdata, index, minX1p1, minX2, minX3); + } else if (sendDir == D3Q27System::DIR_PPP) { + distributeData(rdata, index, maxX1, maxX2, maxX3); + distributeData(rdata, index, maxX1m1, maxX2m1, maxX3m1); + distributeData(rdata, index, maxX1, maxX2m1, maxX3m1); + distributeData(rdata, index, maxX1m1, maxX2, maxX3m1); + distributeData(rdata, index, maxX1m1, maxX2m1, maxX3); + distributeData(rdata, index, maxX1, maxX2, maxX3m1); + distributeData(rdata, index, maxX1, maxX2m1, maxX3); + distributeData(rdata, index, maxX1m1, maxX2, maxX3); + } else if (sendDir == D3Q27System::DIR_MPP) { + distributeData(rdata, index, minX1, maxX2, maxX3); + distributeData(rdata, index, minX1p1, maxX2m1, maxX3m1); + distributeData(rdata, index, minX1, maxX2m1, maxX3m1); + distributeData(rdata, index, minX1p1, maxX2, maxX3m1); + distributeData(rdata, index, minX1p1, maxX2m1, maxX3); + distributeData(rdata, index, minX1, maxX2, maxX3m1); + distributeData(rdata, index, minX1, maxX2m1, maxX3); + distributeData(rdata, index, minX1p1, maxX2, maxX3); + } else if (sendDir == D3Q27System::DIR_PMP) { + distributeData(rdata, index, maxX1, minX2, maxX3); + distributeData(rdata, index, maxX1m1, minX2p1, maxX3m1); + distributeData(rdata, index, maxX1, minX2p1, maxX3m1); + distributeData(rdata, index, maxX1m1, minX2, maxX3m1); + distributeData(rdata, index, maxX1m1, minX2p1, maxX3); + distributeData(rdata, index, maxX1, minX2, maxX3m1); + distributeData(rdata, index, maxX1, minX2p1, maxX3); + distributeData(rdata, index, maxX1m1, minX2, maxX3); + } else if (sendDir == D3Q27System::DIR_MMP) { + distributeData(rdata, index, minX1, minX2, maxX3); + distributeData(rdata, index, minX1p1, minX2p1, maxX3m1); + distributeData(rdata, index, minX1, minX2p1, maxX3m1); + distributeData(rdata, index, minX1p1, minX2, maxX3m1); + distributeData(rdata, index, minX1p1, minX2p1, maxX3); + distributeData(rdata, index, minX1, minX2, maxX3m1); + distributeData(rdata, index, minX1, minX2p1, maxX3); + distributeData(rdata, index, minX1p1, minX2, maxX3); + } else + UB_THROW(UbException(UB_EXARGS, "unknown dir")); + +} +////////////////////////////////////////////////////////////////////////// + + diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.h new file mode 100644 index 0000000000000000000000000000000000000000..508c9e90a2bced8560dcda6098d0fb4aea8b4d9a --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsDoubleGhostLayerFullVectorConnector.h @@ -0,0 +1,232 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 TwoDistributionsDoubleGhostLayerFullVectorConnector.h +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef TwoDistributionsDoubleGhostLayerFullVectorConnector_H +#define TwoDistributionsDoubleGhostLayerFullVectorConnector_H + +#include <vector> + +#include "FullVectorConnector.h" +#include "D3Q27System.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "basics/container/CbArray3D.h" +#include "basics/container/CbArray4D.h" +#include "DataSet3D.h" + +class EsoTwist3D; +class Block3D; + +//daten werden in einen vector (dieser befindet sich im transmitter) kopiert +//der vector wird via transmitter uebertragen +//transmitter kann ein lokal, MPI, RCG, CTL oder was auch immer fuer ein +//transmitter sein, der von Transmitter abgeleitet ist ;-) +class TwoDistributionsDoubleGhostLayerFullVectorConnector : public FullVectorConnector +{ +public: + TwoDistributionsDoubleGhostLayerFullVectorConnector(SPtr<Block3D> block, VectorTransmitterPtr sender, VectorTransmitterPtr receiver, int sendDir); + + void init() override; + + void fillSendVectors() override; + void distributeReceiveVectors() override; + +protected: + inline void updatePointers() override; + void fillData() override; + void distributeData() override; + inline void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) override; + inline void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) override; + +private: + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributions; + + SPtr<EsoTwist3D> fDis; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localHdistributions; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalHdistributions; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroHdistributions; + + SPtr<EsoTwist3D> hDis; + + SPtr<PressureFieldArray3D> pressure; + +}; +////////////////////////////////////////////////////////////////////////// +inline void TwoDistributionsDoubleGhostLayerFullVectorConnector::updatePointers() +{ + localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions(); + nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions(); + zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions(); + + localHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions(); + nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions(); + zeroHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions(); +} +////////////////////////////////////////////////////////////////////////// +inline void TwoDistributionsDoubleGhostLayerFullVectorConnector::fillData(vector_type& sdata, int& index, int x1, int x2, int x3) +{ + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroDistributions)(x1, x2, x3); + + + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroHdistributions)(x1, x2, x3); + + sdata[index++] = (*this->pressure)(x1, x2, x3); +} +////////////////////////////////////////////////////////////////////////// +inline void TwoDistributionsDoubleGhostLayerFullVectorConnector::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3) +{ + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroDistributions)(x1, x2, x3) = rdata[index++]; + + + (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroHdistributions)(x1, x2, x3) = rdata[index++]; + + (*this->pressure)(x1, x2, x3) = rdata[index++]; +} + + +#endif + diff --git a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsFullVectorConnector.cpp index 7fe8bc3643c337323ef25ee35c260597744e6191..bab931d93dd99cf89f4517159cef1d6efc000eff 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsFullVectorConnector.cpp +++ b/src/cpu/VirtualFluidsCore/Connectors/TwoDistributionsFullVectorConnector.cpp @@ -58,37 +58,37 @@ void TwoDistributionsFullVectorConnector::init() int anz = 2*27; switch (sendDir) { - case D3Q27System::REST: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; - case D3Q27System::E: - case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz, 0.0); break; - case D3Q27System::N: - case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0); break; - case D3Q27System::T: - case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0); break; + case D3Q27System::DIR_000: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; + case D3Q27System::DIR_P00: + case D3Q27System::DIR_M00: sender->getData().resize(maxX2*maxX3*anz, 0.0); break; + case D3Q27System::DIR_0P0: + case D3Q27System::DIR_0M0: sender->getData().resize(maxX1*maxX3*anz, 0.0); break; + case D3Q27System::DIR_00P: + case D3Q27System::DIR_00M: sender->getData().resize(maxX1*maxX2*anz, 0.0); break; - case D3Q27System::NE: - case D3Q27System::SW: - case D3Q27System::SE: - case D3Q27System::NW: sender->getData().resize(maxX3*anz, 0.0); break; + case D3Q27System::DIR_PP0: + case D3Q27System::DIR_MM0: + case D3Q27System::DIR_PM0: + case D3Q27System::DIR_MP0: sender->getData().resize(maxX3*anz, 0.0); break; - case D3Q27System::TE: - case D3Q27System::BW: - case D3Q27System::BE: - case D3Q27System::TW: sender->getData().resize(maxX2*anz, 0.0); break; + case D3Q27System::DIR_P0P: + case D3Q27System::DIR_M0M: + case D3Q27System::DIR_P0M: + case D3Q27System::DIR_M0P: sender->getData().resize(maxX2*anz, 0.0); break; - case D3Q27System::TN: - case D3Q27System::BS: - case D3Q27System::BN: - case D3Q27System::TS: sender->getData().resize(maxX1*anz, 0.0); break; + case D3Q27System::DIR_0PP: + case D3Q27System::DIR_0MM: + case D3Q27System::DIR_0PM: + case D3Q27System::DIR_0MP: sender->getData().resize(maxX1*anz, 0.0); break; - case D3Q27System::TNE: - case D3Q27System::BSW: - case D3Q27System::BNE: - case D3Q27System::TSW: - case D3Q27System::TSE: - case D3Q27System::BNW: - case D3Q27System::BSE: - case D3Q27System::TNW: sender->getData().resize(anz, 0.0); break; + case D3Q27System::DIR_PPP: + case D3Q27System::DIR_MMM: + case D3Q27System::DIR_PPM: + case D3Q27System::DIR_MMP: + case D3Q27System::DIR_PMP: + case D3Q27System::DIR_MPM: + case D3Q27System::DIR_PMM: + case D3Q27System::DIR_MPP: sender->getData().resize(anz, 0.0); break; default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir")); } diff --git a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSoA.cpp b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSoA.cpp index bd6d46c2bdaeb72244578b4e3f3625cd2dfe7ff1..0585947928e4fdc626659ed1a1d0e956fdd62de6 100644 --- a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSoA.cpp +++ b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSoA.cpp @@ -91,35 +91,35 @@ void D3Q27EsoTwist3DSoA::getDistribution(LBMReal *const f, size_t x1, size_t x2, size_t x2p = x2 + 1; size_t x3p = x3 + 1; - f[D3Q27System::E] = (*d.E)(x1, x2, x3); - f[D3Q27System::N] = (*d.N)(x1, x2, x3); - f[D3Q27System::T] = (*d.T)(x1, x2, x3); - f[D3Q27System::NE] = (*d.NE)(x1, x2, x3); - f[D3Q27System::NW] = (*d.NW)(x1p, x2, x3); - f[D3Q27System::TE] = (*d.TE)(x1, x2, x3); - f[D3Q27System::TW] = (*d.TW)(x1p, x2, x3); - f[D3Q27System::TN] = (*d.TN)(x1, x2, x3); - f[D3Q27System::TS] = (*d.TS)(x1, x2p, x3); - f[D3Q27System::TNE] = (*d.TNE)(x1, x2, x3); - f[D3Q27System::TNW] = (*d.TNW)(x1p, x2, x3); - f[D3Q27System::TSE] = (*d.TSE)(x1, x2p, x3); - f[D3Q27System::TSW] = (*d.TSW)(x1p, x2p, x3); + f[D3Q27System::DIR_P00] = (*d.E)(x1, x2, x3); + f[D3Q27System::DIR_0P0] = (*d.N)(x1, x2, x3); + f[D3Q27System::DIR_00P] = (*d.T)(x1, x2, x3); + f[D3Q27System::DIR_PP0] = (*d.NE)(x1, x2, x3); + f[D3Q27System::DIR_MP0] = (*d.NW)(x1p, x2, x3); + f[D3Q27System::DIR_P0P] = (*d.TE)(x1, x2, x3); + f[D3Q27System::DIR_M0P] = (*d.TW)(x1p, x2, x3); + f[D3Q27System::DIR_0PP] = (*d.TN)(x1, x2, x3); + f[D3Q27System::DIR_0MP] = (*d.TS)(x1, x2p, x3); + f[D3Q27System::DIR_PPP] = (*d.TNE)(x1, x2, x3); + f[D3Q27System::DIR_MPP] = (*d.TNW)(x1p, x2, x3); + f[D3Q27System::DIR_PMP] = (*d.TSE)(x1, x2p, x3); + f[D3Q27System::DIR_MMP] = (*d.TSW)(x1p, x2p, x3); - f[D3Q27System::W] = (*d.W)(x1p, x2, x3); - f[D3Q27System::S] = (*d.S)(x1, x2p, x3); - f[D3Q27System::B] = (*d.B)(x1, x2, x3p); - f[D3Q27System::SW] = (*d.SW)(x1p, x2p, x3); - f[D3Q27System::SE] = (*d.SE)(x1, x2p, x3); - f[D3Q27System::BW] = (*d.BW)(x1p, x2, x3p); - f[D3Q27System::BE] = (*d.BE)(x1, x2, x3p); - f[D3Q27System::BS] = (*d.BS)(x1, x2p, x3p); - f[D3Q27System::BN] = (*d.BN)(x1, x2, x3p); - f[D3Q27System::BSW] = (*d.BSW)(x1p, x2p, x3p); - f[D3Q27System::BSE] = (*d.BSE)(x1, x2p, x3p); - f[D3Q27System::BNW] = (*d.BNW)(x1p, x2, x3p); - f[D3Q27System::BNE] = (*d.BNE)(x1, x2, x3p); + f[D3Q27System::DIR_M00] = (*d.W)(x1p, x2, x3); + f[D3Q27System::DIR_0M0] = (*d.S)(x1, x2p, x3); + f[D3Q27System::DIR_00M] = (*d.B)(x1, x2, x3p); + f[D3Q27System::DIR_MM0] = (*d.SW)(x1p, x2p, x3); + f[D3Q27System::DIR_PM0] = (*d.SE)(x1, x2p, x3); + f[D3Q27System::DIR_M0M] = (*d.BW)(x1p, x2, x3p); + f[D3Q27System::DIR_P0M] = (*d.BE)(x1, x2, x3p); + f[D3Q27System::DIR_0MM] = (*d.BS)(x1, x2p, x3p); + f[D3Q27System::DIR_0PM] = (*d.BN)(x1, x2, x3p); + f[D3Q27System::DIR_MMM] = (*d.BSW)(x1p, x2p, x3p); + f[D3Q27System::DIR_PMM] = (*d.BSE)(x1, x2p, x3p); + f[D3Q27System::DIR_MPM] = (*d.BNW)(x1p, x2, x3p); + f[D3Q27System::DIR_PPM] = (*d.BNE)(x1, x2, x3p); - f[D3Q27System::REST] = (*d.REST)(x1, x2, x3); + f[D3Q27System::DIR_000] = (*d.REST)(x1, x2, x3); } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSoA::setDistribution(const LBMReal *const f, size_t x1, size_t x2, size_t x3) @@ -128,99 +128,99 @@ void D3Q27EsoTwist3DSoA::setDistribution(const LBMReal *const f, size_t x1, size size_t x2p = x2 + 1; size_t x3p = x3 + 1; - (*d.E)(x1, x2, x3) = f[D3Q27System::INV_E]; - (*d.N)(x1, x2, x3) = f[D3Q27System::INV_N]; - (*d.T)(x1, x2, x3) = f[D3Q27System::INV_T]; - (*d.NE)(x1, x2, x3) = f[D3Q27System::INV_NE]; - (*d.NW)(x1p, x2, x3) = f[D3Q27System::INV_NW]; - (*d.TE)(x1, x2, x3) = f[D3Q27System::INV_TE]; - (*d.TW)(x1p, x2, x3) = f[D3Q27System::INV_TW]; - (*d.TN)(x1, x2, x3) = f[D3Q27System::INV_TN]; - (*d.TS)(x1, x2p, x3) = f[D3Q27System::INV_TS]; - (*d.TNE)(x1, x2, x3) = f[D3Q27System::INV_TNE]; - (*d.TNW)(x1p, x2, x3) = f[D3Q27System::INV_TNW]; - (*d.TSE)(x1, x2p, x3) = f[D3Q27System::INV_TSE]; - (*d.TSW)(x1p, x2p, x3) = f[D3Q27System::INV_TSW]; + (*d.E)(x1, x2, x3) = f[D3Q27System::INV_P00]; + (*d.N)(x1, x2, x3) = f[D3Q27System::INV_0P0]; + (*d.T)(x1, x2, x3) = f[D3Q27System::INV_00P]; + (*d.NE)(x1, x2, x3) = f[D3Q27System::INV_PP0]; + (*d.NW)(x1p, x2, x3) = f[D3Q27System::INV_MP0]; + (*d.TE)(x1, x2, x3) = f[D3Q27System::INV_P0P]; + (*d.TW)(x1p, x2, x3) = f[D3Q27System::INV_M0P]; + (*d.TN)(x1, x2, x3) = f[D3Q27System::INV_0PP]; + (*d.TS)(x1, x2p, x3) = f[D3Q27System::INV_0MP]; + (*d.TNE)(x1, x2, x3) = f[D3Q27System::INV_PPP]; + (*d.TNW)(x1p, x2, x3) = f[D3Q27System::INV_MPP]; + (*d.TSE)(x1, x2p, x3) = f[D3Q27System::INV_PMP]; + (*d.TSW)(x1p, x2p, x3) = f[D3Q27System::INV_MMP]; - (*d.W)(x1p, x2, x3) = f[D3Q27System::INV_W]; - (*d.S)(x1, x2p, x3) = f[D3Q27System::INV_S]; - (*d.B)(x1, x2, x3p) = f[D3Q27System::INV_B]; - (*d.SW)(x1p, x2p, x3) = f[D3Q27System::INV_SW]; - (*d.SE)(x1, x2p, x3) = f[D3Q27System::INV_SE]; - (*d.BW)(x1p, x2, x3p) = f[D3Q27System::INV_BW]; - (*d.BE)(x1, x2, x3p) = f[D3Q27System::INV_BE]; - (*d.BS)(x1, x2p, x3p) = f[D3Q27System::INV_BS]; - (*d.BN)(x1, x2, x3p) = f[D3Q27System::INV_BN]; - (*d.BSW)(x1p, x2p, x3p) = f[D3Q27System::INV_BSW]; - (*d.BSE)(x1, x2p, x3p) = f[D3Q27System::INV_BSE]; - (*d.BNW)(x1p, x2, x3p) = f[D3Q27System::INV_BNW]; - (*d.BNE)(x1, x2, x3p) = f[D3Q27System::INV_BNE]; + (*d.W)(x1p, x2, x3) = f[D3Q27System::INV_M00]; + (*d.S)(x1, x2p, x3) = f[D3Q27System::INV_0M0]; + (*d.B)(x1, x2, x3p) = f[D3Q27System::INV_00M]; + (*d.SW)(x1p, x2p, x3) = f[D3Q27System::INV_MM0]; + (*d.SE)(x1, x2p, x3) = f[D3Q27System::INV_PM0]; + (*d.BW)(x1p, x2, x3p) = f[D3Q27System::INV_M0M]; + (*d.BE)(x1, x2, x3p) = f[D3Q27System::INV_P0M]; + (*d.BS)(x1, x2p, x3p) = f[D3Q27System::INV_0MM]; + (*d.BN)(x1, x2, x3p) = f[D3Q27System::INV_0PM]; + (*d.BSW)(x1p, x2p, x3p) = f[D3Q27System::INV_MMM]; + (*d.BSE)(x1, x2p, x3p) = f[D3Q27System::INV_PMM]; + (*d.BNW)(x1p, x2, x3p) = f[D3Q27System::INV_MPM]; + (*d.BNE)(x1, x2, x3p) = f[D3Q27System::INV_PPM]; - (*d.REST)(x1, x2, x3) = f[D3Q27System::REST]; + (*d.REST)(x1, x2, x3) = f[D3Q27System::DIR_000]; } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSoA::getDistributionInv(LBMReal *const f, size_t x1, size_t x2, size_t x3) { - f[D3Q27System::INV_E] = (*d.E)(x1, x2, x3); - f[D3Q27System::INV_N] = (*d.N)(x1, x2, x3); - f[D3Q27System::INV_T] = (*d.T)(x1, x2, x3); - f[D3Q27System::INV_NE] = (*d.NE)(x1, x2, x3); - f[D3Q27System::INV_NW] = (*d.NW)(x1 + 1, x2, x3); - f[D3Q27System::INV_TE] = (*d.TE)(x1, x2, x3); - f[D3Q27System::INV_TW] = (*d.TW)(x1 + 1, x2, x3); - f[D3Q27System::INV_TN] = (*d.TN)(x1, x2, x3); - f[D3Q27System::INV_TS] = (*d.TS)(x1, x2 + 1, x3); - f[D3Q27System::INV_TNE] = (*d.TNE)(x1, x2, x3); - f[D3Q27System::INV_TNW] = (*d.TNW)(x1 + 1, x2, x3); - f[D3Q27System::INV_TSE] = (*d.TSE)(x1, x2 + 1, x3); - f[D3Q27System::INV_TSW] = (*d.TSW)(x1 + 1, x2 + 1, x3); + f[D3Q27System::INV_P00] = (*d.E)(x1, x2, x3); + f[D3Q27System::INV_0P0] = (*d.N)(x1, x2, x3); + f[D3Q27System::INV_00P] = (*d.T)(x1, x2, x3); + f[D3Q27System::INV_PP0] = (*d.NE)(x1, x2, x3); + f[D3Q27System::INV_MP0] = (*d.NW)(x1 + 1, x2, x3); + f[D3Q27System::INV_P0P] = (*d.TE)(x1, x2, x3); + f[D3Q27System::INV_M0P] = (*d.TW)(x1 + 1, x2, x3); + f[D3Q27System::INV_0PP] = (*d.TN)(x1, x2, x3); + f[D3Q27System::INV_0MP] = (*d.TS)(x1, x2 + 1, x3); + f[D3Q27System::INV_PPP] = (*d.TNE)(x1, x2, x3); + f[D3Q27System::INV_MPP] = (*d.TNW)(x1 + 1, x2, x3); + f[D3Q27System::INV_PMP] = (*d.TSE)(x1, x2 + 1, x3); + f[D3Q27System::INV_MMP] = (*d.TSW)(x1 + 1, x2 + 1, x3); - f[D3Q27System::INV_W] = (*d.W)(x1 + 1, x2, x3); - f[D3Q27System::INV_S] = (*d.S)(x1, x2 + 1, x3); - f[D3Q27System::INV_B] = (*d.B)(x1, x2, x3 + 1); - f[D3Q27System::INV_SW] = (*d.SW)(x1 + 1, x2 + 1, x3); - f[D3Q27System::INV_SE] = (*d.SE)(x1, x2 + 1, x3); - f[D3Q27System::INV_BW] = (*d.BW)(x1 + 1, x2, x3 + 1); - f[D3Q27System::INV_BE] = (*d.BE)(x1, x2, x3 + 1); - f[D3Q27System::INV_BS] = (*d.BS)(x1, x2 + 1, x3 + 1); - f[D3Q27System::INV_BN] = (*d.BN)(x1, x2, x3 + 1); - f[D3Q27System::INV_BSW] = (*d.BSW)(x1 + 1, x2 + 1, x3 + 1); - f[D3Q27System::INV_BSE] = (*d.BSE)(x1, x2 + 1, x3 + 1); - f[D3Q27System::INV_BNW] = (*d.BNW)(x1 + 1, x2, x3 + 1); - f[D3Q27System::INV_BNE] = (*d.BNE)(x1, x2, x3 + 1); + f[D3Q27System::INV_M00] = (*d.W)(x1 + 1, x2, x3); + f[D3Q27System::INV_0M0] = (*d.S)(x1, x2 + 1, x3); + f[D3Q27System::INV_00M] = (*d.B)(x1, x2, x3 + 1); + f[D3Q27System::INV_MM0] = (*d.SW)(x1 + 1, x2 + 1, x3); + f[D3Q27System::INV_PM0] = (*d.SE)(x1, x2 + 1, x3); + f[D3Q27System::INV_M0M] = (*d.BW)(x1 + 1, x2, x3 + 1); + f[D3Q27System::INV_P0M] = (*d.BE)(x1, x2, x3 + 1); + f[D3Q27System::INV_0MM] = (*d.BS)(x1, x2 + 1, x3 + 1); + f[D3Q27System::INV_0PM] = (*d.BN)(x1, x2, x3 + 1); + f[D3Q27System::INV_MMM] = (*d.BSW)(x1 + 1, x2 + 1, x3 + 1); + f[D3Q27System::INV_PMM] = (*d.BSE)(x1, x2 + 1, x3 + 1); + f[D3Q27System::INV_MPM] = (*d.BNW)(x1 + 1, x2, x3 + 1); + f[D3Q27System::INV_PPM] = (*d.BNE)(x1, x2, x3 + 1); - f[D3Q27System::REST] = (*d.REST)(x1, x2, x3); + f[D3Q27System::DIR_000] = (*d.REST)(x1, x2, x3); } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSoA::setDistributionInv(const LBMReal *const f, size_t x1, size_t x2, size_t x3) { - //(*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f[D3Q27System::E]; - //(*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f[D3Q27System::N]; - //(*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f[D3Q27System::T]; - //(*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f[D3Q27System::NE]; - //(*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3) = f[D3Q27System::NW]; - //(*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f[D3Q27System::TE]; - //(*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3) = f[D3Q27System::TW]; - //(*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f[D3Q27System::TN]; - //(*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3) = f[D3Q27System::TS]; - //(*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f[D3Q27System::TNE]; - //(*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2, x3) = f[D3Q27System::TNW]; - //(*this->localDistributions)(D3Q27System::ET_TSE,x1, x2+1,x3) = f[D3Q27System::TSE]; - //(*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::TSW]; + //(*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f[D3Q27System::DIR_P00]; + //(*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f[D3Q27System::DIR_0P0]; + //(*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f[D3Q27System::DIR_00P]; + //(*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f[D3Q27System::DIR_PP0]; + //(*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3) = f[D3Q27System::DIR_MP0]; + //(*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f[D3Q27System::DIR_P0P]; + //(*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3) = f[D3Q27System::DIR_M0P]; + //(*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f[D3Q27System::DIR_0PP]; + //(*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3) = f[D3Q27System::DIR_0MP]; + //(*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f[D3Q27System::DIR_PPP]; + //(*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2, x3) = f[D3Q27System::DIR_MPP]; + //(*this->localDistributions)(D3Q27System::ET_TSE,x1, x2+1,x3) = f[D3Q27System::DIR_PMP]; + //(*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::DIR_MMP]; - //(*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ) = f[D3Q27System::W ]; - //(*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ) = f[D3Q27System::S ]; - //(*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ) = f[D3Q27System::B ]; - //(*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ) = f[D3Q27System::SW]; - //(*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ) = f[D3Q27System::SE]; - //(*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ) = f[D3Q27System::BW]; - //(*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ) = f[D3Q27System::BE]; - //(*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ) = f[D3Q27System::BS]; - //(*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ) = f[D3Q27System::BN]; + //(*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ) = f[D3Q27System::DIR_M00 ]; + //(*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ) = f[D3Q27System::DIR_0M0 ]; + //(*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ) = f[D3Q27System::DIR_00M ]; + //(*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ) = f[D3Q27System::DIR_MM0]; + //(*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ) = f[D3Q27System::DIR_PM0]; + //(*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ) = f[D3Q27System::DIR_M0M]; + //(*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ) = f[D3Q27System::DIR_P0M]; + //(*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ) = f[D3Q27System::DIR_0MM]; + //(*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ) = f[D3Q27System::DIR_0PM]; //(*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f[D3Q27System::BSW]; //(*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2+1,x3+1) = f[D3Q27System::BSE]; //(*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2, x3+1) = f[D3Q27System::BNW]; - //(*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1) = f[D3Q27System::BNE]; + //(*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1) = f[D3Q27System::DIR_DIR_PPM]; //(*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::REST]; } @@ -230,57 +230,57 @@ void D3Q27EsoTwist3DSoA::setDistributionForDirection(const LBMReal *const f, siz { // bool directionFlag = false; // if ((direction & EsoTwistD3Q27System::etE) == EsoTwistD3Q27System::etE) - // (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ) = f[D3Q27System::E]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ) = f[D3Q27System::DIR_P00]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etW) == EsoTwistD3Q27System::etW) - // (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f[D3Q27System::W]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f[D3Q27System::DIR_M00]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etS) == EsoTwistD3Q27System::etS) - // (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f[D3Q27System::S]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f[D3Q27System::DIR_0M0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etN) == EsoTwistD3Q27System::etN) - // (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ) = f[D3Q27System::N]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ) = f[D3Q27System::DIR_0P0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etB) == EsoTwistD3Q27System::etB) - // (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f[D3Q27System::B]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f[D3Q27System::DIR_00M]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etT) == EsoTwistD3Q27System::etT) - // (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ) = f[D3Q27System::T]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ) = f[D3Q27System::DIR_00P]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etSW) == EsoTwistD3Q27System::etSW) - // (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f[D3Q27System::SW]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f[D3Q27System::DIR_MM0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etNE) == EsoTwistD3Q27System::etNE) - // (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ) = f[D3Q27System::NE]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ) = f[D3Q27System::DIR_PP0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etNW) == EsoTwistD3Q27System::etNW) - // (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ) = f[D3Q27System::NW]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ) = f[D3Q27System::DIR_MP0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etSE) == EsoTwistD3Q27System::etSE) - // (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3) = f[D3Q27System::SE]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3) = f[D3Q27System::DIR_PM0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBW) == EsoTwistD3Q27System::etBW) - // (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f[D3Q27System::BW]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f[D3Q27System::DIR_M0M]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTE) == EsoTwistD3Q27System::etTE) - // (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ) = f[D3Q27System::TE]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ) = f[D3Q27System::DIR_P0P]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTW) == EsoTwistD3Q27System::etTW) - // (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ) = f[D3Q27System::TW]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ) = f[D3Q27System::DIR_M0P]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBE) == EsoTwistD3Q27System::etBE) - // (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3) = f[D3Q27System::BE]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3) = f[D3Q27System::DIR_P0M]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBS) == EsoTwistD3Q27System::etBS) - // (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f[D3Q27System::BS]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f[D3Q27System::DIR_0MM]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTN) == EsoTwistD3Q27System::etTN) - // (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ) = f[D3Q27System::TN]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ) = f[D3Q27System::DIR_0PP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTS) == EsoTwistD3Q27System::etTS) - // (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ) = f[D3Q27System::TS]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ) = f[D3Q27System::DIR_0MP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBN) == EsoTwistD3Q27System::etBN) - // (*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3) = f[D3Q27System::BN]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3) = f[D3Q27System::DIR_0PM]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBSW) == EsoTwistD3Q27System::etBSW) // (*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f[D3Q27System::BSW]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTNE) == EsoTwistD3Q27System::etTNE) - // (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f[D3Q27System::TNE]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f[D3Q27System::DIR_PPP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBSE) == EsoTwistD3Q27System::etBSE) // (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2, x3) = f[D3Q27System::BSE]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTNW) == EsoTwistD3Q27System::etTNW) - // (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2+1,x3+1) = f[D3Q27System::TNW]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2+1,x3+1) = f[D3Q27System::DIR_MPP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBNW) == EsoTwistD3Q27System::etBNW) // (*this->localDistributions)(D3Q27System::ET_TSE,x1, x2+1,x3) = f[D3Q27System::BNW]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTSE) == EsoTwistD3Q27System::etTSE) - // (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2, x3+1) = f[D3Q27System::TSE]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2, x3+1) = f[D3Q27System::DIR_PMP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBNE) == EsoTwistD3Q27System::etBNE) - // (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::BNE]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::DIR_DIR_PPM]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTSW) == EsoTwistD3Q27System::etTSW) - // (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1) = f[D3Q27System::TSW]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1) = f[D3Q27System::DIR_MMP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::REST) == EsoTwistD3Q27System::REST) // (*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::REST]; directionFlag=true; //#ifdef _DEBUG @@ -292,82 +292,82 @@ void D3Q27EsoTwist3DSoA::setDistributionForDirection(LBMReal f, size_t x1, size_ { // switch (direction) //{ - // case D3Q27System::E : + // case D3Q27System::DIR_P00 : // (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ) = f; // break; - // case D3Q27System::W : + // case D3Q27System::DIR_M00 : // (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f; // break; - // case D3Q27System::S : + // case D3Q27System::DIR_0M0 : // (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f; // break; - // case D3Q27System::N : + // case D3Q27System::DIR_0P0 : // (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ) = f; // break; - // case D3Q27System::B : + // case D3Q27System::DIR_00M : // (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f; // break; - // case D3Q27System::T : + // case D3Q27System::DIR_00P : // (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ) = f; // break; - // case D3Q27System::SW : + // case D3Q27System::DIR_MM0 : // (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f; // break; - // case D3Q27System::NE : + // case D3Q27System::DIR_PP0 : // (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ) = f; // break; - // case D3Q27System::NW : + // case D3Q27System::DIR_MP0 : // (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ) = f; // break; - // case D3Q27System::SE : + // case D3Q27System::DIR_PM0 : // (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3) = f; // break; - // case D3Q27System::BW : + // case D3Q27System::DIR_M0M : // (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f; // break; - // case D3Q27System::TE : + // case D3Q27System::DIR_P0P : // (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ) = f; // break; - // case D3Q27System::TW : + // case D3Q27System::DIR_M0P : // (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ) = f; // break; - // case D3Q27System::BE : + // case D3Q27System::DIR_P0M : // (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3) = f; // break; - // case D3Q27System::BS : + // case D3Q27System::DIR_0MM : // (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f; // break; - // case D3Q27System::TN : + // case D3Q27System::DIR_0PP : // (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ) = f; // break; - // case D3Q27System::TS : + // case D3Q27System::DIR_0MP : // (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ) = f; // break; - // case D3Q27System::BN : + // case D3Q27System::DIR_0PM : // (*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3) = f; // break; // case D3Q27System::BSW : // (*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f; // break; - // case D3Q27System::TNE : + // case D3Q27System::DIR_PPP : // (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f; // break; // case D3Q27System::BSE : // (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2, x3) = f; // break; - // case D3Q27System::TNW : + // case D3Q27System::DIR_MPP : // (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2+1,x3+1) = f; // break; // case D3Q27System::BNW : // (*this->localDistributions)(D3Q27System::ET_TSE,x1, x2+1,x3) = f; // break; - // case D3Q27System::TSE : + // case D3Q27System::DIR_PMP : // (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2, x3+1) = f; // break; - // case D3Q27System::BNE : + // case D3Q27System::DIR_DIR_PPM : // (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f; // break; - // case D3Q27System::TSW : + // case D3Q27System::DIR_MMP : // (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1) = f; // break; // case D3Q27System::REST : @@ -383,60 +383,60 @@ void D3Q27EsoTwist3DSoA::setDistributionInvForDirection(const LBMReal *const f, { // bool directionFlag = false; // if ((direction & EsoTwistD3Q27System::etE) == EsoTwistD3Q27System::etE) - // (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f[D3Q27System::E]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f[D3Q27System::DIR_P00]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etW) == EsoTwistD3Q27System::etW) - // (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ) = f[D3Q27System::W]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ) = f[D3Q27System::DIR_M00]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etS) == EsoTwistD3Q27System::etS) - // (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ) = f[D3Q27System::S]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ) = f[D3Q27System::DIR_0M0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etN) == EsoTwistD3Q27System::etN) - // (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f[D3Q27System::N]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f[D3Q27System::DIR_0P0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etB) == EsoTwistD3Q27System::etB) - // (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ) = f[D3Q27System::B]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ) = f[D3Q27System::DIR_00M]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etT) == EsoTwistD3Q27System::etT) - // (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f[D3Q27System::T]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f[D3Q27System::DIR_00P]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etSW) == EsoTwistD3Q27System::etSW) - // (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ) = f[D3Q27System::SW]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ) = f[D3Q27System::DIR_MM0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etNE) == EsoTwistD3Q27System::etNE) - // (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f[D3Q27System::NE]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f[D3Q27System::DIR_PP0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etNW) == EsoTwistD3Q27System::etNW) - // (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3) = f[D3Q27System::NW]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3) = f[D3Q27System::DIR_MP0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etSE) == EsoTwistD3Q27System::etSE) - // (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ) = f[D3Q27System::SE]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ) = f[D3Q27System::DIR_PM0]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBW) == EsoTwistD3Q27System::etBW) - // (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ) = f[D3Q27System::BW]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ) = f[D3Q27System::DIR_M0M]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTE) == EsoTwistD3Q27System::etTE) - // (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f[D3Q27System::TE]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f[D3Q27System::DIR_P0P]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTW) == EsoTwistD3Q27System::etTW) - // (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3) = f[D3Q27System::TW]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3) = f[D3Q27System::DIR_M0P]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBE) == EsoTwistD3Q27System::etBE) - // (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ) = f[D3Q27System::BE]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ) = f[D3Q27System::DIR_P0M]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBS) == EsoTwistD3Q27System::etBS) - // (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ) = f[D3Q27System::BS]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ) = f[D3Q27System::DIR_0MM]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTN) == EsoTwistD3Q27System::etTN) - // (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f[D3Q27System::TN]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f[D3Q27System::DIR_0PP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTS) == EsoTwistD3Q27System::etTS) - // (*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3) = f[D3Q27System::TS]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3) = f[D3Q27System::DIR_0MP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBN) == EsoTwistD3Q27System::etBN) - // (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ) = f[D3Q27System::BN]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ) = f[D3Q27System::DIR_0PM]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBSW) == EsoTwistD3Q27System::etBSW) // (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f[D3Q27System::BSW]; // directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTNE) == EsoTwistD3Q27System::etTNE) - // (*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f[D3Q27System::TNE]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f[D3Q27System::DIR_PPP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBSE) == EsoTwistD3Q27System::etBSE) // (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2+1,x3+1) = f[D3Q27System::BSE]; // directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTNW) == EsoTwistD3Q27System::etTNW) - // (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2, x3) = f[D3Q27System::TNW]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2, x3) = f[D3Q27System::DIR_MPP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBNW) == EsoTwistD3Q27System::etBNW) // (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2, x3+1) = f[D3Q27System::BNW]; // directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTSE) == EsoTwistD3Q27System::etTSE) - // (*this->localDistributions)(D3Q27System::ET_TSE,x1, x2+1,x3) = f[D3Q27System::TSE]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TSE,x1, x2+1,x3) = f[D3Q27System::DIR_PMP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etBNE) == EsoTwistD3Q27System::etBNE) - // (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1)= f[D3Q27System::BNE]; directionFlag=true; + // (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1)= f[D3Q27System::DIR_DIR_PPM]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::etTSW) == EsoTwistD3Q27System::etTSW) - // (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::TSW]; directionFlag=true; + // (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f[D3Q27System::DIR_MMP]; directionFlag=true; // if ((direction & EsoTwistD3Q27System::REST) == EsoTwistD3Q27System::REST) // (*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::REST]; directionFlag=true; //#ifdef _DEBUG @@ -449,82 +449,82 @@ void D3Q27EsoTwist3DSoA::setDistributionInvForDirection(LBMReal f, size_t x1, si { // switch (direction) //{ - // case D3Q27System::E : + // case D3Q27System::DIR_P00 : // (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f; // break; - // case D3Q27System::W : + // case D3Q27System::DIR_M00 : // (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ) = f; // break; - // case D3Q27System::S : + // case D3Q27System::DIR_0M0 : // (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ) = f; // break; - // case D3Q27System::N : + // case D3Q27System::DIR_0P0 : // (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f; // break; - // case D3Q27System::B : + // case D3Q27System::DIR_00M : // (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ) = f; // break; - // case D3Q27System::T : + // case D3Q27System::DIR_00P : // (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f; // break; - // case D3Q27System::SW : + // case D3Q27System::DIR_MM0 : // (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ) = f; // break; - // case D3Q27System::NE : + // case D3Q27System::DIR_PP0 : // (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f; // break; - // case D3Q27System::NW : + // case D3Q27System::DIR_MP0 : // (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3) = f; // break; - // case D3Q27System::SE : + // case D3Q27System::DIR_PM0 : // (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ) = f; // break; - // case D3Q27System::BW : + // case D3Q27System::DIR_M0M : // (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ) = f; // break; - // case D3Q27System::TE : + // case D3Q27System::DIR_P0P : // (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f; // break; - // case D3Q27System::TW : + // case D3Q27System::DIR_M0P : // (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3) = f; // break; - // case D3Q27System::BE : + // case D3Q27System::DIR_P0M : // (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ) = f; // break; - // case D3Q27System::BS : + // case D3Q27System::DIR_0MM : // (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ) = f; // break; - // case D3Q27System::TN : + // case D3Q27System::DIR_0PP : // (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f; // break; - // case D3Q27System::TS : + // case D3Q27System::DIR_0MP : // (*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3) = f; // break; - // case D3Q27System::BN : + // case D3Q27System::DIR_0PM : // (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ) = f; // break; // case D3Q27System::BSW : // (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1) = f; // break; - // case D3Q27System::TNE : + // case D3Q27System::DIR_PPP : // (*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f; // break; // case D3Q27System::BSE : // (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2+1,x3+1) = f; // break; - // case D3Q27System::TNW : + // case D3Q27System::DIR_MPP : // (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2, x3) = f; // break; // case D3Q27System::BNW : // (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2, x3+1) = f; // break; - // case D3Q27System::TSE : + // case D3Q27System::DIR_PMP : // (*this->localDistributions)(D3Q27System::ET_TSE,x1, x2+1,x3) = f; // break; - // case D3Q27System::BNE : + // case D3Q27System::DIR_DIR_PPM : // (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1) = f; // break; - // case D3Q27System::TSW : + // case D3Q27System::DIR_MMP : // (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3) = f; // break; // case D3Q27System::REST : @@ -540,57 +540,57 @@ LBMReal D3Q27EsoTwist3DSoA::getDistributionInvForDirection(size_t /*x1*/, size_t { // switch (direction) //{ - // case D3Q27System::E : + // case D3Q27System::DIR_P00 : // return (*this->nonLocalDistributions)(D3Q27System::ET_W,x1+1,x2, x3 ); - // case D3Q27System::W : + // case D3Q27System::DIR_M00 : // return (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3); - // case D3Q27System::S : + // case D3Q27System::DIR_0M0 : // return (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3); - // case D3Q27System::N : + // case D3Q27System::DIR_0P0 : // return (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2+1,x3 ); - // case D3Q27System::B : + // case D3Q27System::DIR_00M : // return (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3); - // case D3Q27System::T : + // case D3Q27System::DIR_00P : // return (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3+1 ); - // case D3Q27System::SW : + // case D3Q27System::DIR_MM0 : // return (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3); - // case D3Q27System::NE : + // case D3Q27System::DIR_PP0 : // return (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1+1,x2+1,x3 ); - // case D3Q27System::NW : + // case D3Q27System::DIR_MP0 : // return (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2+1,x3 ); - // case D3Q27System::SE : + // case D3Q27System::DIR_PM0 : // return (*this->localDistributions)(D3Q27System::ET_NW,x1+1,x2, x3); - // case D3Q27System::BW : + // case D3Q27System::DIR_M0M : // return (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3); - // case D3Q27System::TE : + // case D3Q27System::DIR_P0P : // return (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1+1,x2, x3+1 ); - // case D3Q27System::TW : + // case D3Q27System::DIR_M0P : // return (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3+1 ); - // case D3Q27System::BE : + // case D3Q27System::DIR_P0M : // return (*this->localDistributions)(D3Q27System::ET_TW,x1+1,x2, x3); - // case D3Q27System::BS : + // case D3Q27System::DIR_0MM : // return (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3); - // case D3Q27System::TN : + // case D3Q27System::DIR_0PP : // return (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2+1,x3+1 ); - // case D3Q27System::TS : + // case D3Q27System::DIR_0MP : // return (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3+1 ); - // case D3Q27System::BN : + // case D3Q27System::DIR_0PM : // return (*this->localDistributions)(D3Q27System::ET_TS,x1, x2+1,x3); // case D3Q27System::BSW : // return (*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3); - // case D3Q27System::TNE : + // case D3Q27System::DIR_PPP : // return (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1+1,x2+1,x3+1); // case D3Q27System::BSE : // return (*this->localDistributions)(D3Q27System::ET_TNW,x1+1,x2, x3); - // case D3Q27System::TNW : + // case D3Q27System::DIR_MPP : // return (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2+1,x3+1); // case D3Q27System::BNW : // return (*this->localDistributions)(D3Q27System::ET_TSE,x1, x2+1,x3); - // case D3Q27System::TSE : + // case D3Q27System::DIR_PMP : // return (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1+1,x2, x3+1); - // case D3Q27System::BNE : + // case D3Q27System::DIR_DIR_PPM : // return (*this->localDistributions)(D3Q27System::ET_TSW,x1+1,x2+1,x3); - // case D3Q27System::TSW : + // case D3Q27System::DIR_MMP : // return (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3+1); // case D3Q27System::REST : // return (*this->zeroDistributions)(x1,x2,x3); diff --git a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.cpp b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.cpp index 5e762c68bab806ee7c892c000869bce8c76431af..684238baad1752ab3fad051666da459fd8e11095 100644 --- a/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.cpp +++ b/src/cpu/VirtualFluidsCore/Data/D3Q27EsoTwist3DSplittedVector.cpp @@ -56,278 +56,278 @@ void D3Q27EsoTwist3DSplittedVector::swap() { std::swap(this->localDistributions, ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSplittedVector::getDistribution(LBMReal *const f, size_t x1, size_t x2, size_t x3) { - f[D3Q27System::E] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); - f[D3Q27System::N] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); - f[D3Q27System::T] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); - f[D3Q27System::NE] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); - f[D3Q27System::NW] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); - f[D3Q27System::TE] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); - f[D3Q27System::TW] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); - f[D3Q27System::TN] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); - f[D3Q27System::TS] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); - f[D3Q27System::TNE] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); - f[D3Q27System::TNW] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); - f[D3Q27System::TSE] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); - f[D3Q27System::TSW] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + f[D3Q27System::DIR_P00] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + f[D3Q27System::DIR_0P0] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + f[D3Q27System::DIR_00P] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + f[D3Q27System::DIR_PP0] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + f[D3Q27System::DIR_MP0] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + f[D3Q27System::DIR_P0P] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + f[D3Q27System::DIR_M0P] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + f[D3Q27System::DIR_0PP] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + f[D3Q27System::DIR_0MP] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + f[D3Q27System::DIR_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + f[D3Q27System::DIR_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + f[D3Q27System::DIR_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + f[D3Q27System::DIR_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); - f[D3Q27System::W] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); - f[D3Q27System::S] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); - f[D3Q27System::B] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); - f[D3Q27System::SW] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); - f[D3Q27System::SE] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); - f[D3Q27System::BW] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); - f[D3Q27System::BE] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); - f[D3Q27System::BS] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); - f[D3Q27System::BN] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); - f[D3Q27System::BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); - f[D3Q27System::BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); - f[D3Q27System::BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); - f[D3Q27System::BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + f[D3Q27System::DIR_M00] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + f[D3Q27System::DIR_0M0] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + f[D3Q27System::DIR_00M] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + f[D3Q27System::DIR_MM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + f[D3Q27System::DIR_PM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + f[D3Q27System::DIR_M0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + f[D3Q27System::DIR_P0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + f[D3Q27System::DIR_0MM] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + f[D3Q27System::DIR_0PM] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + f[D3Q27System::DIR_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + f[D3Q27System::DIR_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + f[D3Q27System::DIR_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + f[D3Q27System::DIR_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); - f[D3Q27System::REST] = (*this->zeroDistributions)(x1, x2, x3); + f[D3Q27System::DIR_000] = (*this->zeroDistributions)(x1, x2, x3); } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSplittedVector::setDistribution(const LBMReal *const f, size_t x1, size_t x2, size_t x3) { - (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::INV_E]; - (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::INV_N]; - (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::INV_T]; - (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::INV_NE]; - (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::INV_NW]; - (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::INV_TE]; - (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::INV_TW]; - (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::INV_TN]; - (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::INV_TS]; - (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::INV_TNE]; - (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::INV_TNW]; - (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::INV_TSE]; - (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::INV_TSW]; + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::INV_P00]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::INV_0P0]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::INV_00P]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::INV_PP0]; + (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::INV_MP0]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::INV_P0P]; + (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::INV_M0P]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::INV_0PP]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::INV_0MP]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::INV_PPP]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::INV_MPP]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::INV_PMP]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::INV_MMP]; - (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::INV_W]; - (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::INV_S]; - (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::INV_B]; - (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::INV_SW]; - (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::INV_SE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::INV_BW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::INV_BE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::INV_BS]; - (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::INV_BN]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::INV_BSW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::INV_BSE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::INV_BNW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::INV_BNE]; + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::INV_M00]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::INV_0M0]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::INV_00M]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::INV_MM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::INV_PM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::INV_M0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::INV_P0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::INV_0MM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::INV_0PM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::INV_MMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::INV_PMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::INV_MPM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::INV_PPM]; - (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST]; + (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000]; } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSplittedVector::getDistributionInv(LBMReal *const f, size_t x1, size_t x2, size_t x3) { - f[D3Q27System::INV_E] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); - f[D3Q27System::INV_N] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); - f[D3Q27System::INV_T] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); - f[D3Q27System::INV_NE] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); - f[D3Q27System::INV_NW] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); - f[D3Q27System::INV_TE] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); - f[D3Q27System::INV_TW] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); - f[D3Q27System::INV_TN] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); - f[D3Q27System::INV_TS] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); - f[D3Q27System::INV_TNE] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); - f[D3Q27System::INV_TNW] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); - f[D3Q27System::INV_TSE] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); - f[D3Q27System::INV_TSW] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + f[D3Q27System::INV_P00] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + f[D3Q27System::INV_0P0] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + f[D3Q27System::INV_00P] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + f[D3Q27System::INV_PP0] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + f[D3Q27System::INV_MP0] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + f[D3Q27System::INV_P0P] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + f[D3Q27System::INV_M0P] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + f[D3Q27System::INV_0PP] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + f[D3Q27System::INV_0MP] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + f[D3Q27System::INV_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + f[D3Q27System::INV_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + f[D3Q27System::INV_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + f[D3Q27System::INV_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); - f[D3Q27System::INV_W] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); - f[D3Q27System::INV_S] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); - f[D3Q27System::INV_B] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); - f[D3Q27System::INV_SW] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); - f[D3Q27System::INV_SE] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); - f[D3Q27System::INV_BW] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); - f[D3Q27System::INV_BE] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); - f[D3Q27System::INV_BS] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); - f[D3Q27System::INV_BN] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); - f[D3Q27System::INV_BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); - f[D3Q27System::INV_BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); - f[D3Q27System::INV_BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); - f[D3Q27System::INV_BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + f[D3Q27System::INV_M00] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + f[D3Q27System::INV_0M0] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + f[D3Q27System::INV_00M] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + f[D3Q27System::INV_MM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + f[D3Q27System::INV_PM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + f[D3Q27System::INV_M0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + f[D3Q27System::INV_P0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + f[D3Q27System::INV_0MM] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + f[D3Q27System::INV_0PM] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + f[D3Q27System::INV_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + f[D3Q27System::INV_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + f[D3Q27System::INV_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + f[D3Q27System::INV_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); - f[D3Q27System::REST] = (*this->zeroDistributions)(x1, x2, x3); + f[D3Q27System::DIR_000] = (*this->zeroDistributions)(x1, x2, x3); } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSplittedVector::setDistributionInv(const LBMReal *const f, size_t x1, size_t x2, size_t x3) { - (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::E]; - (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::N]; - (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::T]; - (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::NE]; - (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::NW]; - (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::TE]; - (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::TW]; - (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::TN]; - (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::TS]; - (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::TNE]; - (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::TNW]; - (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::TSE]; - (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::TSW]; + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::DIR_P00]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::DIR_0P0]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::DIR_00P]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::DIR_PP0]; + (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::DIR_MP0]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::DIR_P0P]; + (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::DIR_M0P]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::DIR_0PP]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::DIR_0MP]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::DIR_PPP]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::DIR_MPP]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::DIR_PMP]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_MMP]; - (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::W]; - (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::S]; - (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::B]; - (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::SW]; - (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::SE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::BW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::BE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::BS]; - (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::BN]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::BSW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::BSE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::BNW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::BNE]; + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::DIR_M00]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::DIR_0M0]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::DIR_00M]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_MM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::DIR_PM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_M0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::DIR_P0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_0MM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::DIR_0PM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_MMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_PMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_MPM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::DIR_PPM]; - (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST]; + (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000]; } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSplittedVector::setDistributionForDirection(const LBMReal *const f, size_t x1, size_t x2, size_t x3, unsigned long int direction) { if ((direction & EsoTwistD3Q27System::etE) == EsoTwistD3Q27System::etE) - (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::E]; + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::DIR_P00]; if ((direction & EsoTwistD3Q27System::etW) == EsoTwistD3Q27System::etW) - (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::W]; + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::DIR_M00]; if ((direction & EsoTwistD3Q27System::etS) == EsoTwistD3Q27System::etS) - (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::S]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::DIR_0M0]; if ((direction & EsoTwistD3Q27System::etN) == EsoTwistD3Q27System::etN) - (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::N]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::DIR_0P0]; if ((direction & EsoTwistD3Q27System::etB) == EsoTwistD3Q27System::etB) - (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::B]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::DIR_00M]; if ((direction & EsoTwistD3Q27System::etT) == EsoTwistD3Q27System::etT) - (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::T]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::DIR_00P]; if ((direction & EsoTwistD3Q27System::etSW) == EsoTwistD3Q27System::etSW) - (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::SW]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::DIR_MM0]; if ((direction & EsoTwistD3Q27System::etNE) == EsoTwistD3Q27System::etNE) - (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::NE]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_PP0]; if ((direction & EsoTwistD3Q27System::etNW) == EsoTwistD3Q27System::etNW) - (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::NW]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::DIR_MP0]; if ((direction & EsoTwistD3Q27System::etSE) == EsoTwistD3Q27System::etSE) - (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::SE]; + (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::DIR_PM0]; if ((direction & EsoTwistD3Q27System::etBW) == EsoTwistD3Q27System::etBW) - (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::BW]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::DIR_M0M]; if ((direction & EsoTwistD3Q27System::etTE) == EsoTwistD3Q27System::etTE) - (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::TE]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_P0P]; if ((direction & EsoTwistD3Q27System::etTW) == EsoTwistD3Q27System::etTW) - (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::TW]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::DIR_M0P]; if ((direction & EsoTwistD3Q27System::etBE) == EsoTwistD3Q27System::etBE) - (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::BE]; + (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::DIR_P0M]; if ((direction & EsoTwistD3Q27System::etBS) == EsoTwistD3Q27System::etBS) - (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::BS]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::DIR_0MM]; if ((direction & EsoTwistD3Q27System::etTN) == EsoTwistD3Q27System::etTN) - (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::TN]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_0PP]; if ((direction & EsoTwistD3Q27System::etTS) == EsoTwistD3Q27System::etTS) - (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::TS]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::DIR_0MP]; if ((direction & EsoTwistD3Q27System::etBN) == EsoTwistD3Q27System::etBN) - (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::BN]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::DIR_0PM]; if ((direction & EsoTwistD3Q27System::etBSW) == EsoTwistD3Q27System::etBSW) - (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::BSW]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::DIR_MMM]; if ((direction & EsoTwistD3Q27System::etTNE) == EsoTwistD3Q27System::etTNE) - (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::TNE]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_PPP]; if ((direction & EsoTwistD3Q27System::etBSE) == EsoTwistD3Q27System::etBSE) - (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::BSE]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::DIR_PMM]; if ((direction & EsoTwistD3Q27System::etTNW) == EsoTwistD3Q27System::etTNW) - (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::TNW]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_MPP]; if ((direction & EsoTwistD3Q27System::etBNW) == EsoTwistD3Q27System::etBNW) - (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::BNW]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::DIR_MPM]; if ((direction & EsoTwistD3Q27System::etTSE) == EsoTwistD3Q27System::etTSE) - (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::TSE]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_PMP]; if ((direction & EsoTwistD3Q27System::etBNE) == EsoTwistD3Q27System::etBNE) - (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::BNE]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_PPM]; if ((direction & EsoTwistD3Q27System::etTSW) == EsoTwistD3Q27System::etTSW) - (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::TSW]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::DIR_MMP]; if ((direction & EsoTwistD3Q27System::REST) == EsoTwistD3Q27System::REST) - (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST]; + (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000]; } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSplittedVector::setDistributionForDirection(LBMReal f, size_t x1, size_t x2, size_t x3, int direction) { switch (direction) { - case D3Q27System::E: + case D3Q27System::DIR_P00: (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f; break; - case D3Q27System::W: + case D3Q27System::DIR_M00: (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f; break; - case D3Q27System::S: + case D3Q27System::DIR_0M0: (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f; break; - case D3Q27System::N: + case D3Q27System::DIR_0P0: (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f; break; - case D3Q27System::B: + case D3Q27System::DIR_00M: (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f; break; - case D3Q27System::T: + case D3Q27System::DIR_00P: (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f; break; - case D3Q27System::SW: + case D3Q27System::DIR_MM0: (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f; break; - case D3Q27System::NE: + case D3Q27System::DIR_PP0: (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f; break; - case D3Q27System::NW: + case D3Q27System::DIR_MP0: (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f; break; - case D3Q27System::SE: + case D3Q27System::DIR_PM0: (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f; break; - case D3Q27System::BW: + case D3Q27System::DIR_M0M: (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f; break; - case D3Q27System::TE: + case D3Q27System::DIR_P0P: (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f; break; - case D3Q27System::TW: + case D3Q27System::DIR_M0P: (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f; break; - case D3Q27System::BE: + case D3Q27System::DIR_P0M: (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f; break; - case D3Q27System::BS: + case D3Q27System::DIR_0MM: (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f; break; - case D3Q27System::TN: + case D3Q27System::DIR_0PP: (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f; break; - case D3Q27System::TS: + case D3Q27System::DIR_0MP: (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f; break; - case D3Q27System::BN: + case D3Q27System::DIR_0PM: (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f; break; - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f; break; - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f; break; - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f; break; - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f; break; - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f; break; - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f; break; - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f; break; - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f; break; - case D3Q27System::REST: + case D3Q27System::DIR_000: (*this->zeroDistributions)(x1, x2, x3) = f; break; default: @@ -339,144 +339,144 @@ void D3Q27EsoTwist3DSplittedVector::setDistributionInvForDirection(const LBMReal size_t x3, unsigned long int direction) { if ((direction & EsoTwistD3Q27System::etE) == EsoTwistD3Q27System::etE) - (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::E]; + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::DIR_P00]; if ((direction & EsoTwistD3Q27System::etW) == EsoTwistD3Q27System::etW) - (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::W]; + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f[D3Q27System::DIR_M00]; if ((direction & EsoTwistD3Q27System::etS) == EsoTwistD3Q27System::etS) - (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::S]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f[D3Q27System::DIR_0M0]; if ((direction & EsoTwistD3Q27System::etN) == EsoTwistD3Q27System::etN) - (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::N]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::DIR_0P0]; if ((direction & EsoTwistD3Q27System::etB) == EsoTwistD3Q27System::etB) - (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::B]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f[D3Q27System::DIR_00M]; if ((direction & EsoTwistD3Q27System::etT) == EsoTwistD3Q27System::etT) - (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::T]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::DIR_00P]; if ((direction & EsoTwistD3Q27System::etSW) == EsoTwistD3Q27System::etSW) - (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::SW]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_MM0]; if ((direction & EsoTwistD3Q27System::etNE) == EsoTwistD3Q27System::etNE) - (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::NE]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::DIR_PP0]; if ((direction & EsoTwistD3Q27System::etNW) == EsoTwistD3Q27System::etNW) - (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::NW]; + (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f[D3Q27System::DIR_MP0]; if ((direction & EsoTwistD3Q27System::etSE) == EsoTwistD3Q27System::etSE) - (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::SE]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f[D3Q27System::DIR_PM0]; if ((direction & EsoTwistD3Q27System::etBW) == EsoTwistD3Q27System::etBW) - (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::BW]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_M0M]; if ((direction & EsoTwistD3Q27System::etTE) == EsoTwistD3Q27System::etTE) - (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::TE]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::DIR_P0P]; if ((direction & EsoTwistD3Q27System::etTW) == EsoTwistD3Q27System::etTW) - (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::TW]; + (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f[D3Q27System::DIR_M0P]; if ((direction & EsoTwistD3Q27System::etBE) == EsoTwistD3Q27System::etBE) - (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::BE]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f[D3Q27System::DIR_P0M]; if ((direction & EsoTwistD3Q27System::etBS) == EsoTwistD3Q27System::etBS) - (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::BS]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_0MM]; if ((direction & EsoTwistD3Q27System::etTN) == EsoTwistD3Q27System::etTN) - (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::TN]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::DIR_0PP]; if ((direction & EsoTwistD3Q27System::etTS) == EsoTwistD3Q27System::etTS) - (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::TS]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f[D3Q27System::DIR_0MP]; if ((direction & EsoTwistD3Q27System::etBN) == EsoTwistD3Q27System::etBN) - (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::BN]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f[D3Q27System::DIR_0PM]; if ((direction & EsoTwistD3Q27System::etBSW) == EsoTwistD3Q27System::etBSW) - (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::BSW]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_MMM]; if ((direction & EsoTwistD3Q27System::etTNE) == EsoTwistD3Q27System::etTNE) - (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::TNE]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::DIR_PPP]; if ((direction & EsoTwistD3Q27System::etBSE) == EsoTwistD3Q27System::etBSE) - (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::BSE]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f[D3Q27System::DIR_PMM]; if ((direction & EsoTwistD3Q27System::etTNW) == EsoTwistD3Q27System::etTNW) - (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::TNW]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f[D3Q27System::DIR_MPP]; if ((direction & EsoTwistD3Q27System::etBNW) == EsoTwistD3Q27System::etBNW) - (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::BNW]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f[D3Q27System::DIR_MPM]; if ((direction & EsoTwistD3Q27System::etTSE) == EsoTwistD3Q27System::etTSE) - (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::TSE]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f[D3Q27System::DIR_PMP]; if ((direction & EsoTwistD3Q27System::etBNE) == EsoTwistD3Q27System::etBNE) - (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::BNE]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f[D3Q27System::DIR_PPM]; if ((direction & EsoTwistD3Q27System::etTSW) == EsoTwistD3Q27System::etTSW) - (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::TSW]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f[D3Q27System::DIR_MMP]; if ((direction & EsoTwistD3Q27System::REST) == EsoTwistD3Q27System::REST) - (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST]; + (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000]; } ////////////////////////////////////////////////////////////////////////// void D3Q27EsoTwist3DSplittedVector::setDistributionInvForDirection(LBMReal f, size_t x1, size_t x2, size_t x3, unsigned long int direction) { switch (direction) { - case D3Q27System::E: + case D3Q27System::DIR_P00: (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f; break; - case D3Q27System::W: + case D3Q27System::DIR_M00: (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = f; break; - case D3Q27System::S: + case D3Q27System::DIR_0M0: (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = f; break; - case D3Q27System::N: + case D3Q27System::DIR_0P0: (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f; break; - case D3Q27System::B: + case D3Q27System::DIR_00M: (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = f; break; - case D3Q27System::T: + case D3Q27System::DIR_00P: (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f; break; - case D3Q27System::SW: + case D3Q27System::DIR_MM0: (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = f; break; - case D3Q27System::NE: + case D3Q27System::DIR_PP0: (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f; break; - case D3Q27System::NW: + case D3Q27System::DIR_MP0: (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = f; break; - case D3Q27System::SE: + case D3Q27System::DIR_PM0: (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = f; break; - case D3Q27System::BW: + case D3Q27System::DIR_M0M: (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = f; break; - case D3Q27System::TE: + case D3Q27System::DIR_P0P: (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f; break; - case D3Q27System::TW: + case D3Q27System::DIR_M0P: (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = f; break; - case D3Q27System::BE: + case D3Q27System::DIR_P0M: (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = f; break; - case D3Q27System::BS: + case D3Q27System::DIR_0MM: (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = f; break; - case D3Q27System::TN: + case D3Q27System::DIR_0PP: (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f; break; - case D3Q27System::TS: + case D3Q27System::DIR_0MP: (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = f; break; - case D3Q27System::BN: + case D3Q27System::DIR_0PM: (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = f; break; - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = f; break; - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f; break; - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = f; break; - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = f; break; - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = f; break; - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = f; break; - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = f; break; - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = f; break; - case D3Q27System::REST: + case D3Q27System::DIR_000: (*this->zeroDistributions)(x1, x2, x3) = f; break; default: @@ -487,59 +487,59 @@ void D3Q27EsoTwist3DSplittedVector::setDistributionInvForDirection(LBMReal f, si LBMReal D3Q27EsoTwist3DSplittedVector::getDistributionForDirection(size_t x1, size_t x2, size_t x3, int direction) { switch (direction) { - case D3Q27System::W: + case D3Q27System::DIR_M00: return (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); - case D3Q27System::E: + case D3Q27System::DIR_P00: return (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); - case D3Q27System::N: + case D3Q27System::DIR_0P0: return (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); - case D3Q27System::S: + case D3Q27System::DIR_0M0: return (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); - case D3Q27System::T: + case D3Q27System::DIR_00P: return (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); - case D3Q27System::B: + case D3Q27System::DIR_00M: return (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); - case D3Q27System::NE: + case D3Q27System::DIR_PP0: return (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); - case D3Q27System::SW: + case D3Q27System::DIR_MM0: return (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); - case D3Q27System::SE: + case D3Q27System::DIR_PM0: return (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); - case D3Q27System::NW: + case D3Q27System::DIR_MP0: return (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); - case D3Q27System::TE: + case D3Q27System::DIR_P0P: return (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); - case D3Q27System::BW: + case D3Q27System::DIR_M0M: return (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); - case D3Q27System::BE: + case D3Q27System::DIR_P0M: return (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); - case D3Q27System::TW: + case D3Q27System::DIR_M0P: return (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); - case D3Q27System::TN: + case D3Q27System::DIR_0PP: return (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); - case D3Q27System::BS: + case D3Q27System::DIR_0MM: return (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); - case D3Q27System::BN: + case D3Q27System::DIR_0PM: return (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); - case D3Q27System::TS: + case D3Q27System::DIR_0MP: return (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: return (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: return (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: return (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: return (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: return (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: return (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: return (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: return (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); - case D3Q27System::REST: + case D3Q27System::DIR_000: return (*this->zeroDistributions)(x1, x2, x3); default: UB_THROW(UbException(UB_EXARGS, "Direction didn't find")); @@ -549,59 +549,59 @@ LBMReal D3Q27EsoTwist3DSplittedVector::getDistributionForDirection(size_t x1, si LBMReal D3Q27EsoTwist3DSplittedVector::getDistributionInvForDirection(size_t x1, size_t x2, size_t x3, int direction) { switch (direction) { - case D3Q27System::E: + case D3Q27System::DIR_P00: return (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); - case D3Q27System::W: + case D3Q27System::DIR_M00: return (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); - case D3Q27System::S: + case D3Q27System::DIR_0M0: return (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); - case D3Q27System::N: + case D3Q27System::DIR_0P0: return (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); - case D3Q27System::B: + case D3Q27System::DIR_00M: return (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); - case D3Q27System::T: + case D3Q27System::DIR_00P: return (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); - case D3Q27System::SW: + case D3Q27System::DIR_MM0: return (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); - case D3Q27System::NE: + case D3Q27System::DIR_PP0: return (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); - case D3Q27System::NW: + case D3Q27System::DIR_MP0: return (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); - case D3Q27System::SE: + case D3Q27System::DIR_PM0: return (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); - case D3Q27System::BW: + case D3Q27System::DIR_M0M: return (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); - case D3Q27System::TE: + case D3Q27System::DIR_P0P: return (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); - case D3Q27System::TW: + case D3Q27System::DIR_M0P: return (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); - case D3Q27System::BE: + case D3Q27System::DIR_P0M: return (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); - case D3Q27System::BS: + case D3Q27System::DIR_0MM: return (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); - case D3Q27System::TN: + case D3Q27System::DIR_0PP: return (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); - case D3Q27System::TS: + case D3Q27System::DIR_0MP: return (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); - case D3Q27System::BN: + case D3Q27System::DIR_0PM: return (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: return (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: return (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: return (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: return (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: return (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: return (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: return (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: return (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); - case D3Q27System::REST: + case D3Q27System::DIR_000: return (*this->zeroDistributions)(x1, x2, x3); default: UB_THROW(UbException(UB_EXARGS, "Direction didn't find")); diff --git a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h index e53e38a74daea2a2a40ca53eff1aa1f4febcc27a..12b9e57489e39c15e912b5b679b768c16b89a83b 100644 --- a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h +++ b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h @@ -44,6 +44,7 @@ using AverageValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>; using ShearStressValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>; using RelaxationFactorArray3D = CbArray3D<LBMReal, IndexerX3X2X1>; using PhaseFieldArray3D = CbArray3D<LBMReal, IndexerX3X2X1>; +using PressureFieldArray3D = CbArray3D<LBMReal, IndexerX3X2X1>; //! A class provides an interface for data structures in the kernel. class DataSet3D @@ -88,6 +89,9 @@ public: SPtr<PhaseFieldArray3D> getPhaseField2() const; void setPhaseField2(SPtr<PhaseFieldArray3D> values); + SPtr<PressureFieldArray3D> getPressureField() const; + void setPressureField(SPtr<PressureFieldArray3D> values); + protected: private: SPtr<DistributionArray3D> fdistributions; @@ -103,8 +107,10 @@ private: SPtr<ShearStressValuesArray3D> shearStressValues; SPtr<RelaxationFactorArray3D> relaxationFactor; + SPtr<PhaseFieldArray3D> phaseField; SPtr<PhaseFieldArray3D> phaseField2; + SPtr<PressureFieldArray3D> pressureField; }; inline SPtr<DistributionArray3D> DataSet3D::getFdistributions() const { return fdistributions; } @@ -162,4 +168,8 @@ inline SPtr<PhaseFieldArray3D> DataSet3D::getPhaseField2() const { return phaseF inline void DataSet3D::setPhaseField2(SPtr<PhaseFieldArray3D> values) { phaseField2 = values; } +inline SPtr<PressureFieldArray3D> DataSet3D::getPressureField() const { return pressureField; } + +inline void DataSet3D::setPressureField(SPtr<PressureFieldArray3D> values) { pressureField = values; } + #endif diff --git a/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.cpp b/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.cpp index c456be678449744475a0ac6932850dceb0ee6f1c..b9a2e069edea6fa3e514b64e4e4174f0964a3a20 100644 --- a/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.cpp +++ b/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.cpp @@ -44,12 +44,12 @@ const int EsoTwistD3Q27System::ETX3[EsoTwistD3Q27System::ENDF + 1] = { 0, 0, 0, 0, 1, 1, 0, 0, -1, 0, -1, 0, 1, 0, 1, 0 }; const int EsoTwistD3Q27System::etINVDIR[EsoTwistD3Q27System::ENDF + 1] = { - D3Q27System::INV_E, D3Q27System::INV_W, D3Q27System::INV_N, D3Q27System::INV_S, D3Q27System::INV_T, - D3Q27System::INV_B, D3Q27System::INV_NE, D3Q27System::INV_SW, D3Q27System::INV_SE, D3Q27System::INV_NW, - D3Q27System::INV_TE, D3Q27System::INV_BW, D3Q27System::INV_BE, D3Q27System::INV_TW, D3Q27System::INV_TN, - D3Q27System::INV_BS, D3Q27System::INV_BN, D3Q27System::INV_TS, D3Q27System::INV_TNE, D3Q27System::INV_TNW, - D3Q27System::INV_TSE, D3Q27System::INV_TSW, D3Q27System::INV_BNE, D3Q27System::INV_BNW, D3Q27System::INV_BSE, - D3Q27System::INV_BSW, D3Q27System::REST + D3Q27System::INV_P00, D3Q27System::INV_M00, D3Q27System::INV_0P0, D3Q27System::INV_0M0, D3Q27System::INV_00P, + D3Q27System::INV_00M, D3Q27System::INV_PP0, D3Q27System::INV_MM0, D3Q27System::INV_PM0, D3Q27System::INV_MP0, + D3Q27System::INV_P0P, D3Q27System::INV_M0M, D3Q27System::INV_P0M, D3Q27System::INV_M0P, D3Q27System::INV_0PP, + D3Q27System::INV_0MM, D3Q27System::INV_0PM, D3Q27System::INV_0MP, D3Q27System::INV_PPP, D3Q27System::INV_MPP, + D3Q27System::INV_PMP, D3Q27System::INV_MMP, D3Q27System::INV_PPM, D3Q27System::INV_MPM, D3Q27System::INV_PMM, + D3Q27System::INV_MMM, D3Q27System::DIR_000 }; const unsigned long int EsoTwistD3Q27System::etDIR[EsoTwistD3Q27System::ENDF + 1] = { diff --git a/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.h b/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.h index 21752cc48a84b02bc24cb7efe9e3c5912f476dfd..7ccd413c662206ab3a12b3a1c88fcc81450f7a75 100644 --- a/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.h +++ b/src/cpu/VirtualFluidsCore/Data/EsoTwistD3Q27System.h @@ -47,60 +47,60 @@ struct EsoTwistD3Q27System { const static int STARTDIR = D3Q27System::STARTDIR; const static int ENDDIR = D3Q27System::ENDDIR; - static const int REST = D3Q27System::REST; /*f0 */ - static const int E = D3Q27System::E; /*f1 */ - static const int W = D3Q27System::W; /*f2 */ - static const int N = D3Q27System::N; /*f3 */ - static const int S = D3Q27System::S; /*f4 */ - static const int T = D3Q27System::T; /*f5 */ - static const int B = D3Q27System::B; /*f6 */ - static const int NE = D3Q27System::NE; /*f7 */ - static const int SW = D3Q27System::SW; /*f8 */ - static const int SE = D3Q27System::SE; /*f9 */ - static const int NW = D3Q27System::NW; /*f10*/ - static const int TE = D3Q27System::TE; /*f11*/ - static const int BW = D3Q27System::BW; /*f12*/ - static const int BE = D3Q27System::BE; /*f13*/ - static const int TW = D3Q27System::TW; /*f14*/ - static const int TN = D3Q27System::TN; /*f15*/ - static const int BS = D3Q27System::BS; /*f16*/ - static const int BN = D3Q27System::BN; /*f17*/ - static const int TS = D3Q27System::TS; /*f18*/ - static const int TNE = D3Q27System::TNE; - static const int TNW = D3Q27System::TNW; - static const int TSE = D3Q27System::TSE; - static const int TSW = D3Q27System::TSW; - static const int BNE = D3Q27System::BNE; - static const int BNW = D3Q27System::BNW; - static const int BSE = D3Q27System::BSE; - static const int BSW = D3Q27System::BSW; + static const int REST = D3Q27System::DIR_000; /*f0 */ + static const int E = D3Q27System::DIR_P00; /*f1 */ + static const int W = D3Q27System::DIR_M00; /*f2 */ + static const int N = D3Q27System::DIR_0P0; /*f3 */ + static const int S = D3Q27System::DIR_0M0; /*f4 */ + static const int T = D3Q27System::DIR_00P; /*f5 */ + static const int B = D3Q27System::DIR_00M; /*f6 */ + static const int NE = D3Q27System::DIR_PP0; /*f7 */ + static const int SW = D3Q27System::DIR_MM0; /*f8 */ + static const int SE = D3Q27System::DIR_PM0; /*f9 */ + static const int NW = D3Q27System::DIR_MP0; /*f10*/ + static const int TE = D3Q27System::DIR_P0P; /*f11*/ + static const int BW = D3Q27System::DIR_M0M; /*f12*/ + static const int BE = D3Q27System::DIR_P0M; /*f13*/ + static const int TW = D3Q27System::DIR_M0P; /*f14*/ + static const int TN = D3Q27System::DIR_0PP; /*f15*/ + static const int BS = D3Q27System::DIR_0MM; /*f16*/ + static const int BN = D3Q27System::DIR_0PM; /*f17*/ + static const int TS = D3Q27System::DIR_0MP; /*f18*/ + static const int TNE = D3Q27System::DIR_PPP; + static const int TNW = D3Q27System::DIR_MPP; + static const int TSE = D3Q27System::DIR_PMP; + static const int TSW = D3Q27System::DIR_MMP; + static const int BNE = D3Q27System::DIR_PPM; + static const int BNW = D3Q27System::DIR_MPM; + static const int BSE = D3Q27System::DIR_PMM; + static const int BSW = D3Q27System::DIR_MMM; - static const int INV_E = D3Q27System::W; - static const int INV_W = D3Q27System::E; - static const int INV_N = D3Q27System::S; - static const int INV_S = D3Q27System::N; - static const int INV_T = D3Q27System::B; - static const int INV_B = D3Q27System::T; - static const int INV_NE = D3Q27System::SW; - static const int INV_SW = D3Q27System::NE; - static const int INV_SE = D3Q27System::NW; - static const int INV_NW = D3Q27System::SE; - static const int INV_TE = D3Q27System::BW; - static const int INV_BW = D3Q27System::TE; - static const int INV_BE = D3Q27System::TW; - static const int INV_TW = D3Q27System::BE; - static const int INV_TN = D3Q27System::BS; - static const int INV_BS = D3Q27System::TN; - static const int INV_BN = D3Q27System::TS; - static const int INV_TS = D3Q27System::BN; - static const int INV_TNE = D3Q27System::BSW; - static const int INV_TNW = D3Q27System::BSE; - static const int INV_TSE = D3Q27System::BNW; - static const int INV_TSW = D3Q27System::BNE; - static const int INV_BNE = D3Q27System::TSW; - static const int INV_BNW = D3Q27System::TSE; - static const int INV_BSE = D3Q27System::TNW; - static const int INV_BSW = D3Q27System::TNE; + static const int INV_E = D3Q27System::DIR_M00; + static const int INV_W = D3Q27System::DIR_P00; + static const int INV_N = D3Q27System::DIR_0M0; + static const int INV_S = D3Q27System::DIR_0P0; + static const int INV_T = D3Q27System::DIR_00M; + static const int INV_B = D3Q27System::DIR_00P; + static const int INV_NE = D3Q27System::DIR_MM0; + static const int INV_SW = D3Q27System::DIR_PP0; + static const int INV_SE = D3Q27System::DIR_MP0; + static const int INV_NW = D3Q27System::DIR_PM0; + static const int INV_TE = D3Q27System::DIR_M0M; + static const int INV_BW = D3Q27System::DIR_P0P; + static const int INV_BE = D3Q27System::DIR_M0P; + static const int INV_TW = D3Q27System::DIR_P0M; + static const int INV_TN = D3Q27System::DIR_0MM; + static const int INV_BS = D3Q27System::DIR_0PP; + static const int INV_BN = D3Q27System::DIR_0MP; + static const int INV_TS = D3Q27System::DIR_0PM; + static const int INV_TNE = D3Q27System::DIR_MMM; + static const int INV_TNW = D3Q27System::DIR_PMM; + static const int INV_TSE = D3Q27System::DIR_MPM; + static const int INV_TSW = D3Q27System::DIR_PPM; + static const int INV_BNE = D3Q27System::DIR_MMP; + static const int INV_BNW = D3Q27System::DIR_PMP; + static const int INV_BSE = D3Q27System::DIR_MPP; + static const int INV_BSW = D3Q27System::DIR_PPP; static const unsigned long int etZERO; // 1;/*f0 */ static const unsigned long int etE; // 2; /*f1 */ diff --git a/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp b/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp index 79753c144f5cfff831f1d0415e9434c50b11bcea..c6a75187047f1b507389642baaa8471abecd1683 100644 --- a/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp +++ b/src/cpu/VirtualFluidsCore/Grid/Block3D.cpp @@ -34,7 +34,7 @@ #include "Block3D.h" #include "Block3DConnector.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMKernel.h" int Block3D::counter = 0; @@ -262,28 +262,27 @@ int Block3D::getNumberOfLocalConnectorsForSurfaces() if (connectors.size() < 6) return count; - for (int dir = 0; dir <= 5; dir++) // Hard coding. It works if you have 0...5 for E, N ... B - { - SPtr<Block3DConnector> connector = this->connectors[dir]; - if (this->connectors[dir]) { - if (connector->isLocalConnector()) + for (SPtr<Block3DConnector> c : connectors) { + if (c) { + if (c->getSendDir() >= D3Q27System::DIR_P00 && c->getSendDir() <= D3Q27System ::DIR_00M && c->isLocalConnector()) count++; } } + return count; } ////////////////////////////////////////////////////////////////////////// int Block3D::getNumberOfRemoteConnectorsForSurfaces() { int count = 0; - for (int dir = 0; dir <= 5; dir++) // Hard coding. It works if you have 0...5 for E, N ... B - { - SPtr<Block3DConnector> connector = this->connectors[dir]; - if (this->connectors[dir]) { - if (connector->isRemoteConnector()) + + for (SPtr<Block3DConnector> c : connectors) { + if (c) { + if (c->getSendDir() >= D3Q27System::DIR_P00 && c->getSendDir() <= D3Q27System ::DIR_00M && c->isRemoteConnector()) count++; } } + return count; } void Block3D::setCollectionOfInterpolationFlagCF(int flags) { interpolationFlagCF = flags; } @@ -335,13 +334,13 @@ std::string Block3D::toString() for (std::size_t i = 0; i < connectors.size(); i++) if (connectors[i]) { if (connectors[i]->isLocalConnector()) - ss << "l." << Grid3DSystem::getDirectionString(connectors[i]->getSendDir()) << ", "; + ss << "l." << D3Q27System::getDirectionString(connectors[i]->getSendDir()) << ", "; if (connectors[i]->isRemoteConnector()) - ss << "r." << Grid3DSystem::getDirectionString(connectors[i]->getSendDir()) << ", "; + ss << "r." << D3Q27System::getDirectionString(connectors[i]->getSendDir()) << ", "; if (connectors[i]->isInterpolationConnectorCF()) - ss << "cf." << Grid3DSystem::getDirectionString(connectors[i]->getSendDir()) << ", "; + ss << "cf." << D3Q27System::getDirectionString(connectors[i]->getSendDir()) << ", "; if (connectors[i]->isInterpolationConnectorFC()) - ss << "fc." << Grid3DSystem::getDirectionString(connectors[i]->getSendDir()) << ", "; + ss << "fc." << D3Q27System::getDirectionString(connectors[i]->getSendDir()) << ", "; } return ss.str(); } diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp b/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp index 9965b511d615a2cd7764a07cd234012a442fa675..8c9ccab62fa18f96abeca389ab437e62cdc80d7b 100644 --- a/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp +++ b/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp @@ -39,21 +39,21 @@ #include <geometry3d/CoordinateTransformation3D.h> #include "Block3DVisitor.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "Grid3DVisitor.h" #include "Interactor3D.h" -#include "LBMSystem.h" +#include "D3Q27System.h" #include <Block3D.h> #include <Communicator.h> using namespace std; -Grid3D::Grid3D() { levelSet.resize(Grid3DSystem::MAXLEVEL + 1); } +Grid3D::Grid3D() { levelSet.resize(D3Q27System::MAXLEVEL + 1); } ////////////////////////////////////////////////////////////////////////// Grid3D::Grid3D(std::shared_ptr<vf::mpi::Communicator> comm) { - levelSet.resize(Grid3DSystem::MAXLEVEL + 1); + levelSet.resize(D3Q27System::MAXLEVEL + 1); bundle = comm->getBundleID(); rank = comm->getProcessID(); } @@ -63,7 +63,7 @@ Grid3D::Grid3D(std::shared_ptr<vf::mpi::Communicator> comm, int blockNx1, int bl blockNx1(blockNx1), blockNx2(blockNx2), blockNx3(blockNx2), nx1(gridNx1), nx2(gridNx2), nx3(gridNx3) { - levelSet.resize(Grid3DSystem::MAXLEVEL + 1); + levelSet.resize(D3Q27System::MAXLEVEL + 1); bundle = comm->getBundleID(); rank = comm->getProcessID(); trafo = std::make_shared<CoordinateTransformation3D>(0.0, 0.0, 0.0, (double)blockNx1, (double)blockNx2, @@ -88,7 +88,7 @@ void Grid3D::accept(Block3DVisitor &blockVisitor) int startLevel = blockVisitor.getStartLevel(); int stopLevel = blockVisitor.getStopLevel(); - if (startLevel < 0 || stopLevel < 0 || startLevel > Grid3DSystem::MAXLEVEL || stopLevel > Grid3DSystem::MAXLEVEL) + if (startLevel < 0 || stopLevel < 0 || startLevel > D3Q27System::MAXLEVEL || stopLevel > D3Q27System::MAXLEVEL) throw UbException(UB_EXARGS, "not valid level!"); bool dir = startLevel < stopLevel; @@ -158,8 +158,8 @@ bool Grid3D::deleteBlock(int ix1, int ix2, int ix3, int level) void Grid3D::deleteBlocks() { std::vector<std::vector<SPtr<Block3D>>> blocksVector(25); - int minInitLevel = Grid3DSystem::MINLEVEL; - int maxInitLevel = Grid3DSystem::MAXLEVEL; + int minInitLevel = D3Q27System::MINLEVEL; + int maxInitLevel = D3Q27System::MAXLEVEL; for (int level = minInitLevel; level < maxInitLevel; level++) { getBlocks(level, blocksVector[level]); for (SPtr<Block3D> block : blocksVector[level]) // blocks of the current level @@ -265,7 +265,7 @@ void Grid3D::getSubBlocks(int ix1, int ix2, int ix3, int level, int levelDepth, return; if (level > 0 && !this->getSuperBlock(ix1, ix2, ix3, level)) return; - if (level >= Grid3DSystem::MAXLEVEL) + if (level >= D3Q27System::MAXLEVEL) throw UbException(UB_EXARGS, "Level bigger then MAXLEVEL"); int x1[] = { ix1 << 1, (ix1 << 1) + 1 }; @@ -300,7 +300,7 @@ bool Grid3D::expandBlock(int ix1, int ix2, int ix3, int level) ix3 = block->getX3(); int l = level + 1; - if (l > Grid3DSystem::MAXLEVEL) + if (l > D3Q27System::MAXLEVEL) throw UbException(UB_EXARGS, "level > Grid3D::MAXLEVEL"); int west = ix1 << 1; @@ -501,7 +501,7 @@ double Grid3D::getDeltaX(SPtr<Block3D> block) const { return getDeltaX(block->ge UbTupleDouble3 Grid3D::getNodeOffset(SPtr<Block3D> block) const { double delta = this->getDeltaX(block); - return makeUbTuple(OFFSET * delta, OFFSET * delta, OFFSET * delta); + return makeUbTuple(offset * delta, offset * delta, offset * delta); } //////////////////////////////////////////////////////////////////////////// Vector3D Grid3D::getNodeCoordinates(SPtr<Block3D> block, int ix1, int ix2, int ix3) const @@ -584,7 +584,7 @@ void Grid3D::checkLevel(int level) if (level < 0) { throw UbException(UB_EXARGS, "l(" + UbSystem::toString(level) + (string) ")<0"); } - if (level > Grid3DSystem::MAXLEVEL) { + if (level > D3Q27System::MAXLEVEL) { throw UbException(UB_EXARGS, "l(" + UbSystem::toString(level) + (string) ")>MAXLEVEL"); } if (this->levelSet[level].size() == 0) { @@ -596,7 +596,7 @@ bool Grid3D::hasLevel(int level) const { if (level < 0) return false; - if (level > Grid3DSystem::MAXLEVEL) + if (level > D3Q27System::MAXLEVEL) return false; if (this->levelSet[level].size() == 0) return false; @@ -616,7 +616,7 @@ UbTupleInt3 Grid3D::getBlockNX() const { return makeUbTuple(blockNx1, blockNx2, SPtr<Block3D> Grid3D::getNeighborBlock(int dir, int ix1, int ix2, int ix3, int level) const { - return this->getBlock(ix1 + Grid3DSystem::EX1[dir], ix2 + Grid3DSystem::EX2[dir], ix3 + Grid3DSystem::EX3[dir], + return this->getBlock(ix1 + D3Q27System::DX1[dir], ix2 + D3Q27System::DX2[dir], ix3 + D3Q27System::DX3[dir], level); } ////////////////////////////////////////////////////////////////////////// @@ -631,8 +631,7 @@ SPtr<Block3D> Grid3D::getNeighborBlock(int dir, SPtr<Block3D> block) const ////////////////////////////////////////////////////////////////////////// void Grid3D::getAllNeighbors(int ix1, int ix2, int ix3, int level, int levelDepth, std::vector<SPtr<Block3D>> &blocks) { - for (int dir = Grid3DSystem::STARTDIR; dir <= Grid3DSystem::ENDDIR; dir++) - // for (int dir = Grid3DSystem::STARTDIR; dir<=Grid3DSystem::TS; dir++) + for (int dir = D3Q27System::STARTDIR; dir <= D3Q27System::ENDDIR; dir++) { this->getNeighborBlocksForDirection(dir, ix1, ix2, ix3, level, levelDepth, blocks); } @@ -1100,82 +1099,82 @@ void Grid3D::getNeighborBlocksForDirection(int dir, int ix1, int ix2, int ix3, i std::vector<SPtr<Block3D>> &blocks) { switch (dir) { - case Grid3DSystem::E: + case D3Q27System::DIR_P00: this->getNeighborsEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::W: + case D3Q27System::DIR_M00: this->getNeighborsWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::N: + case D3Q27System::DIR_0P0: this->getNeighborsNorth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::S: + case D3Q27System::DIR_0M0: this->getNeighborsSouth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::T: + case D3Q27System::DIR_00P: this->getNeighborsTop(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::B: + case D3Q27System::DIR_00M: this->getNeighborsBottom(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::NE: + case D3Q27System::DIR_PP0: this->getNeighborsNorthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::SW: + case D3Q27System::DIR_MM0: this->getNeighborsSouthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::SE: + case D3Q27System::DIR_PM0: this->getNeighborsSouthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::NW: + case D3Q27System::DIR_MP0: this->getNeighborsNorthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TE: + case D3Q27System::DIR_P0P: this->getNeighborsTopEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BW: + case D3Q27System::DIR_M0M: this->getNeighborsBottomWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BE: + case D3Q27System::DIR_P0M: this->getNeighborsBottomEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TW: + case D3Q27System::DIR_M0P: this->getNeighborsTopWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TN: + case D3Q27System::DIR_0PP: this->getNeighborsTopNorth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BS: + case D3Q27System::DIR_0MM: this->getNeighborsBottomSouth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BN: + case D3Q27System::DIR_0PM: this->getNeighborsBottomNorth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TS: + case D3Q27System::DIR_0MP: this->getNeighborsTopSouth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TNE: + case D3Q27System::DIR_PPP: this->getNeighborsTopNorthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TNW: + case D3Q27System::DIR_MPP: this->getNeighborsTopNorthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TSE: + case D3Q27System::DIR_PMP: this->getNeighborsTopSouthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TSW: + case D3Q27System::DIR_MMP: this->getNeighborsTopSouthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BNE: + case D3Q27System::DIR_PPM: this->getNeighborsBottomNorthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BNW: + case D3Q27System::DIR_MPM: this->getNeighborsBottomNorthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BSE: + case D3Q27System::DIR_PMM: this->getNeighborsBottomSouthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BSW: + case D3Q27System::DIR_MMM: this->getNeighborsBottomSouthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; default: @@ -1263,85 +1262,85 @@ void Grid3D::getNeighborBlocksForDirectionWithREST(int dir, int ix1, int ix2, in std::vector<SPtr<Block3D>> &blocks) { switch (dir) { - case Grid3DSystem::E: + case D3Q27System::DIR_P00: this->getNeighborsEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::W: + case D3Q27System::DIR_M00: this->getNeighborsWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::N: + case D3Q27System::DIR_0P0: this->getNeighborsNorth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::S: + case D3Q27System::DIR_0M0: this->getNeighborsSouth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::T: + case D3Q27System::DIR_00P: this->getNeighborsTop(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::B: + case D3Q27System::DIR_00M: this->getNeighborsBottom(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::NE: + case D3Q27System::DIR_PP0: this->getNeighborsNorthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::SW: + case D3Q27System::DIR_MM0: this->getNeighborsSouthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::SE: + case D3Q27System::DIR_PM0: this->getNeighborsSouthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::NW: + case D3Q27System::DIR_MP0: this->getNeighborsNorthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TE: + case D3Q27System::DIR_P0P: this->getNeighborsTopEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BW: + case D3Q27System::DIR_M0M: this->getNeighborsBottomWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BE: + case D3Q27System::DIR_P0M: this->getNeighborsBottomEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TW: + case D3Q27System::DIR_M0P: this->getNeighborsTopWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TN: + case D3Q27System::DIR_0PP: this->getNeighborsTopNorth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BS: + case D3Q27System::DIR_0MM: this->getNeighborsBottomSouth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BN: + case D3Q27System::DIR_0PM: this->getNeighborsBottomNorth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TS: + case D3Q27System::DIR_0MP: this->getNeighborsTopSouth(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TNE: + case D3Q27System::DIR_PPP: this->getNeighborsTopNorthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TNW: + case D3Q27System::DIR_MPP: this->getNeighborsTopNorthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TSE: + case D3Q27System::DIR_PMP: this->getNeighborsTopSouthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::TSW: + case D3Q27System::DIR_MMP: this->getNeighborsTopSouthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BNE: + case D3Q27System::DIR_PPM: this->getNeighborsBottomNorthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BNW: + case D3Q27System::DIR_MPM: this->getNeighborsBottomNorthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BSE: + case D3Q27System::DIR_PMM: this->getNeighborsBottomSouthEast(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::BSW: + case D3Q27System::DIR_MMM: this->getNeighborsBottomSouthWest(ix1, ix2, ix3, level, levelDepth, blocks); break; - case Grid3DSystem::REST: + case D3Q27System::DIR_000: this->getNeighborsZero(ix1, ix2, ix3, level, levelDepth, blocks); break; default: @@ -1980,7 +1979,7 @@ void Grid3D::getBlocks(int level, int rank, bool active, std::vector<SPtr<Block3 ////////////////////////////////////////////////////////////////////////// int Grid3D::getFinestInitializedLevel() { - for (int i = Grid3DSystem::MAXLEVEL; i >= 0; i--) + for (int i = D3Q27System::MAXLEVEL; i >= 0; i--) if (this->levelSet[i].size() > 0) return (i); return (-1); @@ -1988,7 +1987,7 @@ int Grid3D::getFinestInitializedLevel() ////////////////////////////////////////////////////////////////////////// int Grid3D::getCoarsestInitializedLevel() { - for (int i = 0; i <= Grid3DSystem::MAXLEVEL; i++) + for (int i = 0; i <= D3Q27System::MAXLEVEL; i++) if (this->levelSet[i].size() > 0) return (i); return (-1); @@ -2221,6 +2220,16 @@ void Grid3D::calcStartCoordinatesWithOutOverlap(SPtr<Block3D> block, double &wor } } ////////////////////////////////////////////////////////////////////////// +int Grid3D::getGhostLayerWidth() const +{ + return static_cast<int>(offset + 0.5); +} +////////////////////////////////////////////////////////////////////////// +void Grid3D::setGhostLayerWidth(int ghostLayerWidth) +{ + this->offset = static_cast<double>(ghostLayerWidth) - 0.5; +} +////////////////////////////////////////////////////////////////////////// void Grid3D::setTimeStep(double step) { timeStep = step; } ////////////////////////////////////////////////////////////////////////// double Grid3D::getTimeStep() const { return timeStep; } @@ -2333,7 +2342,7 @@ void Grid3D::updateDistributedBlocks(std::shared_ptr<vf::mpi::Communicator> comm levelSet[l].clear(); } this->levelSet.clear(); - levelSet.resize(Grid3DSystem::MAXLEVEL + 1); + levelSet.resize(D3Q27System::MAXLEVEL + 1); int rsize = (int)blocks.size(); for (int i = 0; i < rsize; i += 5) { diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3D.h b/src/cpu/VirtualFluidsCore/Grid/Grid3D.h index 7527880cd5360d3006af2edcce2d5b56131d6e37..fabaaa655e2b63201256802473ec037279f0ea3b 100644 --- a/src/cpu/VirtualFluidsCore/Grid/Grid3D.h +++ b/src/cpu/VirtualFluidsCore/Grid/Grid3D.h @@ -51,8 +51,6 @@ namespace vf::mpi {class Communicator;} class Block3D; class Interactor3D; -#define OFFSET 0.5 - //! A class implements block grid ////////////////////////////////////////////////////////////////////////// class Grid3D : public enableSharedFromThis<Grid3D> @@ -214,9 +212,10 @@ public: int getNX1() const; int getNX2() const; int getNX3() const; - void calcStartCoordinatesAndDelta(SPtr<Block3D> block, double &worldX1, double &worldX2, double &worldX3, - double &deltaX); + void calcStartCoordinatesAndDelta(SPtr<Block3D> block, double &worldX1, double &worldX2, double &worldX3, double &deltaX); void calcStartCoordinatesWithOutOverlap(SPtr<Block3D> block, double &worldX1, double &worldX2, double &worldX3); + int getGhostLayerWidth() const; + void setGhostLayerWidth(int ghostLayerWidth); ////////////////////////////////////////////////////////////////////////// // LBM // double getDeltaT(SPtr<Block3D>) const; @@ -313,6 +312,8 @@ private: double orgDeltaX{ 1.0 }; double timeStep{ 0.0 }; + + double offset{ 0.5 }; }; #endif diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.h b/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.h deleted file mode 100644 index 94c3bf2a75bf8e7137b08c113c1caa878d8c0896..0000000000000000000000000000000000000000 --- a/src/cpu/VirtualFluidsCore/Grid/Grid3DSystem.h +++ /dev/null @@ -1,291 +0,0 @@ -//======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ -// \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ -// -// 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 Grid3DSystem.h -//! \ingroup Grid -//! \author Konstantin Kutscher -//======================================================================================= - -#ifndef Grid3DSystem_H -#define Grid3DSystem_H - -#include <cmath> -#include <iostream> -#include <string> - -#include <basics/utilities/UbException.h> -#include <basics/utilities/UbMath.h> - -namespace Grid3DSystem -{ -static const int STARTDIR = 0; - -static const int E /*f1 */ = 0; -static const int W /*f2 */ = 1; -static const int N /*f3 */ = 2; -static const int S /*f4 */ = 3; -static const int T /*f5 */ = 4; -static const int B /*f6 */ = 5; -static const int NE /*f7 */ = 6; -static const int SW /*f8 */ = 7; -static const int SE /*f9 */ = 8; -static const int NW /*f10*/ = 9; -static const int TE /*f11*/ = 10; -static const int BW /*f12*/ = 11; -static const int BE /*f13*/ = 12; -static const int TW /*f14*/ = 13; -static const int TN /*f15*/ = 14; -static const int BS /*f16*/ = 15; -static const int BN /*f17*/ = 16; -static const int TS /*f18*/ = 17; -static const int TNE = 18; -static const int TNW = 19; -static const int TSE = 20; -static const int TSW = 21; -static const int BNE = 22; -static const int BNW = 23; -static const int BSE = 24; -static const int BSW = 25; -static const int REST /*f0 */ = 26; - -static const int ENDDIR = 25; - -static const int INV_E = W; -static const int INV_W = E; -static const int INV_N = S; -static const int INV_S = N; -static const int INV_T = B; -static const int INV_B = T; -static const int INV_NE = SW; -static const int INV_NW = SE; -static const int INV_SE = NW; -static const int INV_SW = NE; -static const int INV_TE = BW; -static const int INV_TW = BE; -static const int INV_BE = TW; -static const int INV_BW = TE; -static const int INV_TN = BS; -static const int INV_TS = BN; -static const int INV_BN = TS; -static const int INV_BS = TN; -static const int INV_TNE = BSW; -static const int INV_TNW = BSE; -static const int INV_TSE = BNW; -static const int INV_TSW = BNE; -static const int INV_BNE = TSW; -static const int INV_BNW = TSE; -static const int INV_BSE = TNW; -static const int INV_BSW = TNE; - -extern const int INVDIR[ENDDIR + 1]; - -static const int MINLEVEL = 0; -static const int MAXLEVEL = 25; - -extern const int EX1[ENDDIR + 1]; -extern const int EX2[ENDDIR + 1]; -extern const int EX3[ENDDIR + 1]; - -inline std::string getDirectionString(int direction) -{ - switch (direction) { - case E: - return "E"; - case W: - return "W"; - case N: - return "N"; - case S: - return "S"; - case T: - return "T"; - case B: - return "B"; - case NE: - return "NE"; - case NW: - return "NW"; - case SE: - return "SE"; - case SW: - return "SW"; - case TE: - return "TE"; - case TW: - return "TW"; - case BE: - return "BE"; - case BW: - return "BW"; - case TN: - return "TN"; - case TS: - return "TS"; - case BN: - return "BN"; - case BS: - return "BS"; - case TNE: - return "TNE"; - case TNW: - return "TNW"; - case TSE: - return "TSE"; - case TSW: - return "TSW"; - case BNE: - return "BNE"; - case BNW: - return "BNW"; - case BSE: - return "BSE"; - case BSW: - return "BSW"; - default: - return "Cell3DSystem::getDrectionString(...) - unknown dir"; - } -} -static const int &getInvertDirection(const int &direction); - -////////////////////////////////////////////////////////////////////////// -static inline void setNeighborCoordinatesForDirection(int &x1, int &x2, int &x3, const int &direction) -{ - switch (direction) { - case Grid3DSystem::E: - x1++; - break; - case Grid3DSystem::N: - x2++; - break; - case Grid3DSystem::T: - x3++; - break; - case Grid3DSystem::W: - x1--; - break; - case Grid3DSystem::S: - x2--; - break; - case Grid3DSystem::B: - x3--; - break; - case Grid3DSystem::NE: - x1++; - x2++; - break; - case Grid3DSystem::NW: - x1--; - x2++; - break; - case Grid3DSystem::SW: - x1--; - x2--; - break; - case Grid3DSystem::SE: - x1++; - x2--; - break; - case Grid3DSystem::TE: - x1++; - x3++; - break; - case Grid3DSystem::BW: - x1--; - x3--; - break; - case Grid3DSystem::BE: - x1++; - x3--; - break; - case Grid3DSystem::TW: - x1--; - x3++; - break; - case Grid3DSystem::TN: - x2++; - x3++; - break; - case Grid3DSystem::BS: - x2--; - x3--; - break; - case Grid3DSystem::BN: - x2++; - x3--; - break; - case Grid3DSystem::TS: - x2--; - x3++; - break; - case Grid3DSystem::TNE: - x1++; - x2++; - x3++; - break; - case Grid3DSystem::TNW: - x1--; - x2++; - x3++; - break; - case Grid3DSystem::TSE: - x1++; - x2--; - x3++; - break; - case Grid3DSystem::TSW: - x1--; - x2--; - x3++; - break; - case Grid3DSystem::BNE: - x1++; - x2++; - x3--; - break; - case Grid3DSystem::BNW: - x1--; - x2++; - x3--; - break; - case Grid3DSystem::BSE: - x1++; - x2--; - x3--; - break; - case Grid3DSystem::BSW: - x1--; - x2--; - x3--; - break; - default: - throw UbException(UB_EXARGS, "no direction ..."); - } -} -} // namespace Grid3DSystem - -#endif diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp b/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp index bf1895b930f1c61d36d537319b53fe4b0abcd960..a834466f85b85890bf7c1a5a264807e6a0b13ee1 100644 --- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp +++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp @@ -90,108 +90,108 @@ void D3Q27Interactor::initRayVectors() int fdir; double c1oS2 = UbMath::one_over_sqrt2; double c1oS3 = UbMath::one_over_sqrt3; - fdir = D3Q27System::E; + fdir = D3Q27System::DIR_P00; rayX1[fdir] = 1.0; rayX2[fdir] = 0.0; rayX3[fdir] = 0.0; - fdir = D3Q27System::W; + fdir = D3Q27System::DIR_M00; rayX1[fdir] = -1.0; rayX2[fdir] = 0.0; rayX3[fdir] = 0.0; - fdir = D3Q27System::N; + fdir = D3Q27System::DIR_0P0; rayX1[fdir] = 0.0; rayX2[fdir] = 1.0; rayX3[fdir] = 0.0; - fdir = D3Q27System::S; + fdir = D3Q27System::DIR_0M0; rayX1[fdir] = 0.0; rayX2[fdir] = -1.0; rayX3[fdir] = 0.0; - fdir = D3Q27System::T; + fdir = D3Q27System::DIR_00P; rayX1[fdir] = 0.0; rayX2[fdir] = 0.0; rayX3[fdir] = 1.0; - fdir = D3Q27System::B; + fdir = D3Q27System::DIR_00M; rayX1[fdir] = 0.0; rayX2[fdir] = 0.0; rayX3[fdir] = -1.0; - fdir = D3Q27System::NE; + fdir = D3Q27System::DIR_PP0; rayX1[fdir] = c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] = 0.0; - fdir = D3Q27System::SW; + fdir = D3Q27System::DIR_MM0; rayX1[fdir] = -c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] = 0.0; - fdir = D3Q27System::SE; + fdir = D3Q27System::DIR_PM0; rayX1[fdir] = c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] = 0.0; - fdir = D3Q27System::NW; + fdir = D3Q27System::DIR_MP0; rayX1[fdir] = -c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] = 0.0; - fdir = D3Q27System::TE; + fdir = D3Q27System::DIR_P0P; rayX1[fdir] = c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = c1oS2; - fdir = D3Q27System::BW; + fdir = D3Q27System::DIR_M0M; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = -c1oS2; - fdir = D3Q27System::BE; + fdir = D3Q27System::DIR_P0M; rayX1[fdir] = c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = -c1oS2; - fdir = D3Q27System::TW; + fdir = D3Q27System::DIR_M0P; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = c1oS2; - fdir = D3Q27System::TN; + fdir = D3Q27System::DIR_0PP; rayX1[fdir] = 0.0; rayX2[fdir] = c1oS2; rayX3[fdir] = c1oS2; - fdir = D3Q27System::BS; + fdir = D3Q27System::DIR_0MM; rayX1[fdir] = 0.0; rayX2[fdir] = -c1oS2; rayX3[fdir] = -c1oS2; - fdir = D3Q27System::BN; + fdir = D3Q27System::DIR_0PM; rayX1[fdir] = 0.0; rayX2[fdir] = c1oS2; rayX3[fdir] = -c1oS2; - fdir = D3Q27System::TS; + fdir = D3Q27System::DIR_0MP; rayX1[fdir] = 0.0; rayX2[fdir] = -c1oS2; rayX3[fdir] = c1oS2; - fdir = D3Q27System::TNW; + fdir = D3Q27System::DIR_MPP; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = c1oS3; - fdir = D3Q27System::TNE; + fdir = D3Q27System::DIR_PPP; rayX1[fdir] = c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = c1oS3; - fdir = D3Q27System::TSW; + fdir = D3Q27System::DIR_MMP; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = c1oS3; - fdir = D3Q27System::TSE; + fdir = D3Q27System::DIR_PMP; rayX1[fdir] = c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = c1oS3; - fdir = D3Q27System::BNW; + fdir = D3Q27System::DIR_MPM; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = -c1oS3; - fdir = D3Q27System::BNE; + fdir = D3Q27System::DIR_PPM; rayX1[fdir] = c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = -c1oS3; - fdir = D3Q27System::BSW; + fdir = D3Q27System::DIR_MMM; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3; - fdir = D3Q27System::BSE; + fdir = D3Q27System::DIR_PMM; rayX1[fdir] = c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3; @@ -327,18 +327,18 @@ bool D3Q27Interactor::setDifferencesToGbObject3D(const SPtr<Block3D> block) UB_EXARGS, "fuer den bei LB nicht vorkommenden Fall deltaX1!=deltaX2!=deltaX3 nicht implementiert "); vector<double> distNeigh(D3Q27System::FENDDIR + 1, UbMath::sqrt2 * deltaX1); - distNeigh[D3Q27System::E] = distNeigh[D3Q27System::W] = distNeigh[D3Q27System::N] = deltaX1; - distNeigh[D3Q27System::S] = distNeigh[D3Q27System::T] = distNeigh[D3Q27System::B] = deltaX1; - distNeigh[D3Q27System::NE] = distNeigh[D3Q27System::NW] = distNeigh[D3Q27System::SW] = - distNeigh[D3Q27System::SE] = UbMath::sqrt2 * deltaX1; - distNeigh[D3Q27System::TE] = distNeigh[D3Q27System::TN] = distNeigh[D3Q27System::TW] = - distNeigh[D3Q27System::TS] = UbMath::sqrt2 * deltaX1; - distNeigh[D3Q27System::BE] = distNeigh[D3Q27System::BN] = distNeigh[D3Q27System::BW] = - distNeigh[D3Q27System::BS] = UbMath::sqrt2 * deltaX1; - distNeigh[D3Q27System::TNE] = distNeigh[D3Q27System::TNW] = distNeigh[D3Q27System::TSE] = - distNeigh[D3Q27System::TSW] = UbMath::sqrt3 * deltaX1; - distNeigh[D3Q27System::BNE] = distNeigh[D3Q27System::BNW] = distNeigh[D3Q27System::BSE] = - distNeigh[D3Q27System::BSW] = UbMath::sqrt3 * deltaX1; + distNeigh[D3Q27System::DIR_P00] = distNeigh[D3Q27System::DIR_M00] = distNeigh[D3Q27System::DIR_0P0] = deltaX1; + distNeigh[D3Q27System::DIR_0M0] = distNeigh[D3Q27System::DIR_00P] = distNeigh[D3Q27System::DIR_00M] = deltaX1; + distNeigh[D3Q27System::DIR_PP0] = distNeigh[D3Q27System::DIR_MP0] = distNeigh[D3Q27System::DIR_MM0] = + distNeigh[D3Q27System::DIR_PM0] = UbMath::sqrt2 * deltaX1; + distNeigh[D3Q27System::DIR_P0P] = distNeigh[D3Q27System::DIR_0PP] = distNeigh[D3Q27System::DIR_M0P] = + distNeigh[D3Q27System::DIR_0MP] = UbMath::sqrt2 * deltaX1; + distNeigh[D3Q27System::DIR_P0M] = distNeigh[D3Q27System::DIR_0PM] = distNeigh[D3Q27System::DIR_M0M] = + distNeigh[D3Q27System::DIR_0MM] = UbMath::sqrt2 * deltaX1; + distNeigh[D3Q27System::DIR_PPP] = distNeigh[D3Q27System::DIR_MPP] = distNeigh[D3Q27System::DIR_PMP] = + distNeigh[D3Q27System::DIR_MMP] = UbMath::sqrt3 * deltaX1; + distNeigh[D3Q27System::DIR_PPM] = distNeigh[D3Q27System::DIR_MPM] = distNeigh[D3Q27System::DIR_PMM] = + distNeigh[D3Q27System::DIR_MMM] = UbMath::sqrt3 * deltaX1; double q; bool pointOnBoundary = false; @@ -613,132 +613,132 @@ void D3Q27Interactor::addQsLineSet(std::vector<UbTupleFloat3> &nodes, std::vecto if (bc->hasBoundaryConditionFlag(D3Q27System::INVDIR[dir])) { double x1b, x2b, x3b, q = bc->getQ(dir); switch (dir) { - case D3Q27System::E: + case D3Q27System::DIR_P00: x1b = x1a + q * dx; x2b = x2a; x3b = x3a; break; - case D3Q27System::N: + case D3Q27System::DIR_0P0: x1b = x1a; x2b = x2a + q * dx; x3b = x3a; break; - case D3Q27System::W: + case D3Q27System::DIR_M00: x1b = x1a - q * dx; x2b = x2a; x3b = x3a; break; - case D3Q27System::S: + case D3Q27System::DIR_0M0: x1b = x1a; x2b = x2a - q * dx; x3b = x3a; break; - case D3Q27System::NE: + case D3Q27System::DIR_PP0: x1b = x1a + q * dx; x2b = x2a + q * dx; x3b = x3a; break; - case D3Q27System::NW: + case D3Q27System::DIR_MP0: x1b = x1a - q * dx; x2b = x2a + q * dx; x3b = x3a; break; - case D3Q27System::SW: + case D3Q27System::DIR_MM0: x1b = x1a - q * dx; x2b = x2a - q * dx; x3b = x3a; break; - case D3Q27System::SE: + case D3Q27System::DIR_PM0: x1b = x1a + q * dx; x2b = x2a - q * dx; x3b = x3a; break; - case D3Q27System::T: + case D3Q27System::DIR_00P: x1b = x1a; x2b = x2a; x3b = x3a + q * dx; break; - case D3Q27System::TE: + case D3Q27System::DIR_P0P: x1b = x1a + q * dx; x2b = x2a; x3b = x3a + q * dx; break; - case D3Q27System::TN: + case D3Q27System::DIR_0PP: x1b = x1a; x2b = x2a + q * dx; x3b = x3a + q * dx; break; - case D3Q27System::TW: + case D3Q27System::DIR_M0P: x1b = x1a - q * dx; x2b = x2a; x3b = x3a + q * dx; break; - case D3Q27System::TS: + case D3Q27System::DIR_0MP: x1b = x1a; x2b = x2a - q * dx; x3b = x3a + q * dx; break; - case D3Q27System::B: + case D3Q27System::DIR_00M: x1b = x1a; x2b = x2a; x3b = x3a - q * dx; break; - case D3Q27System::BE: + case D3Q27System::DIR_P0M: x1b = x1a + q * dx; x2b = x2a; x3b = x3a - q * dx; break; - case D3Q27System::BN: + case D3Q27System::DIR_0PM: x1b = x1a; x2b = x2a + q * dx; x3b = x3a - q * dx; break; - case D3Q27System::BW: + case D3Q27System::DIR_M0M: x1b = x1a - q * dx; x2b = x2a; x3b = x3a - q * dx; break; - case D3Q27System::BS: + case D3Q27System::DIR_0MM: x1b = x1a; x2b = x2a - q * dx; x3b = x3a - q * dx; break; - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: x1b = x1a + q * dx; x2b = x2a + q * dx; x3b = x3a + q * dx; break; - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: x1b = x1a - q * dx; x2b = x2a - q * dx; x3b = x3a - q * dx; break; - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: x1b = x1a + q * dx; x2b = x2a + q * dx; x3b = x3a - q * dx; break; - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: x1b = x1a - q * dx; x2b = x2a - q * dx; x3b = x3a + q * dx; break; - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: x1b = x1a + q * dx; x2b = x2a - q * dx; x3b = x3a + q * dx; break; - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: x1b = x1a - q * dx; x2b = x2a + q * dx; x3b = x3a - q * dx; break; - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: x1b = x1a + q * dx; x2b = x2a - q * dx; x3b = x3a - q * dx; break; - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: x1b = x1a - q * dx; x2b = x2a + q * dx; x3b = x3a + q * dx; @@ -782,17 +782,17 @@ vector<pair<GbPoint3D, GbPoint3D>> D3Q27Interactor::getQsLineSet() bool include_TN_Edge = false; //(x1/x2/x3)=([0..blocknx1[/blocknx2/blocknx1) bool include_TE_Edge = false; //(x1/x2/x3)=(blocknx1/[0..blocknx2[/blocknx2) if (block) { - if (!block->getConnector(D3Q27System::N)) + if (!block->getConnector(D3Q27System::DIR_0P0)) include_N_Face = true; - if (!block->getConnector(D3Q27System::E)) + if (!block->getConnector(D3Q27System::DIR_P00)) include_E_Face = true; - if (!block->getConnector(D3Q27System::T)) + if (!block->getConnector(D3Q27System::DIR_00P)) include_T_Face = true; - if (!block->getConnector(D3Q27System::NE) && include_N_Face && include_E_Face) + if (!block->getConnector(D3Q27System::DIR_PP0) && include_N_Face && include_E_Face) include_NE_Edge = true; - if (!block->getConnector(D3Q27System::TN) && include_T_Face && include_N_Face) + if (!block->getConnector(D3Q27System::DIR_0PP) && include_T_Face && include_N_Face) include_TN_Edge = true; - if (!block->getConnector(D3Q27System::TE) && include_T_Face && include_E_Face) + if (!block->getConnector(D3Q27System::DIR_P0P) && include_T_Face && include_E_Face) include_TE_Edge = true; } @@ -834,132 +834,132 @@ vector<pair<GbPoint3D, GbPoint3D>> D3Q27Interactor::getQsLineSet() if (bc->hasBoundaryConditionFlag(D3Q27System::INVDIR[dir])) { double x1b, x2b, x3b, q = bc->getQ(dir); switch (dir) { - case D3Q27System::E: + case D3Q27System::DIR_P00: x1b = x1a + q * dx; x2b = x2a; x3b = x3a; break; - case D3Q27System::N: + case D3Q27System::DIR_0P0: x1b = x1a; x2b = x2a + q * dx; x3b = x3a; break; - case D3Q27System::W: + case D3Q27System::DIR_M00: x1b = x1a - q * dx; x2b = x2a; x3b = x3a; break; - case D3Q27System::S: + case D3Q27System::DIR_0M0: x1b = x1a; x2b = x2a - q * dx; x3b = x3a; break; - case D3Q27System::NE: + case D3Q27System::DIR_PP0: x1b = x1a + q * dx; x2b = x2a + q * dx; x3b = x3a; break; - case D3Q27System::NW: + case D3Q27System::DIR_MP0: x1b = x1a - q * dx; x2b = x2a + q * dx; x3b = x3a; break; - case D3Q27System::SW: + case D3Q27System::DIR_MM0: x1b = x1a - q * dx; x2b = x2a - q * dx; x3b = x3a; break; - case D3Q27System::SE: + case D3Q27System::DIR_PM0: x1b = x1a + q * dx; x2b = x2a - q * dx; x3b = x3a; break; - case D3Q27System::T: + case D3Q27System::DIR_00P: x1b = x1a; x2b = x2a; x3b = x3a + q * dx; break; - case D3Q27System::TE: + case D3Q27System::DIR_P0P: x1b = x1a + q * dx; x2b = x2a; x3b = x3a + q * dx; break; - case D3Q27System::TN: + case D3Q27System::DIR_0PP: x1b = x1a; x2b = x2a + q * dx; x3b = x3a + q * dx; break; - case D3Q27System::TW: + case D3Q27System::DIR_M0P: x1b = x1a - q * dx; x2b = x2a; x3b = x3a + q * dx; break; - case D3Q27System::TS: + case D3Q27System::DIR_0MP: x1b = x1a; x2b = x2a - q * dx; x3b = x3a + q * dx; break; - case D3Q27System::B: + case D3Q27System::DIR_00M: x1b = x1a; x2b = x2a; x3b = x3a - q * dx; break; - case D3Q27System::BE: + case D3Q27System::DIR_P0M: x1b = x1a + q * dx; x2b = x2a; x3b = x3a - q * dx; break; - case D3Q27System::BN: + case D3Q27System::DIR_0PM: x1b = x1a; x2b = x2a + q * dx; x3b = x3a - q * dx; break; - case D3Q27System::BW: + case D3Q27System::DIR_M0M: x1b = x1a - q * dx; x2b = x2a; x3b = x3a - q * dx; break; - case D3Q27System::BS: + case D3Q27System::DIR_0MM: x1b = x1a; x2b = x2a - q * dx; x3b = x3a - q * dx; break; - case D3Q27System::TNE: + case D3Q27System::DIR_PPP: x1b = x1a + q * dx; x2b = x2a + q * dx; x3b = x3a + q * dx; break; - case D3Q27System::BSW: + case D3Q27System::DIR_MMM: x1b = x1a - q * dx; x2b = x2a - q * dx; x3b = x3a - q * dx; break; - case D3Q27System::BNE: + case D3Q27System::DIR_PPM: x1b = x1a + q * dx; x2b = x2a + q * dx; x3b = x3a - q * dx; break; - case D3Q27System::TSW: + case D3Q27System::DIR_MMP: x1b = x1a - q * dx; x2b = x2a - q * dx; x3b = x3a + q * dx; break; - case D3Q27System::TSE: + case D3Q27System::DIR_PMP: x1b = x1a + q * dx; x2b = x2a - q * dx; x3b = x3a + q * dx; break; - case D3Q27System::BNW: + case D3Q27System::DIR_MPM: x1b = x1a - q * dx; x2b = x2a + q * dx; x3b = x3a - q * dx; break; - case D3Q27System::BSE: + case D3Q27System::DIR_PMM: x1b = x1a + q * dx; x2b = x2a - q * dx; x3b = x3a - q * dx; break; - case D3Q27System::TNW: + case D3Q27System::DIR_MPP: x1b = x1a - q * dx; x2b = x2a + q * dx; x3b = x3a + q * dx; diff --git a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp index 37c6c47f05215b1d210ef943e639b1cb957ca63d..c7b13d3834a6bb822b945f9425ba21b8d5be399d 100644 --- a/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp +++ b/src/cpu/VirtualFluidsCore/Interactors/D3Q27TriFaceMeshInteractor.cpp @@ -364,9 +364,9 @@ void D3Q27TriFaceMeshInteractor::setQs(const double &timeStep) // tmpSolidNodesFromOtherInteractors[block]; double q, distance; - double &nodeDx1 = nodeDeltaToNeigh[level][D3Q27System::E]; - double &nodeDx2 = nodeDeltaToNeigh[level][D3Q27System::N]; - double &nodeDx3 = nodeDeltaToNeigh[level][D3Q27System::T]; + double &nodeDx1 = nodeDeltaToNeigh[level][D3Q27System::DIR_P00]; + double &nodeDx2 = nodeDeltaToNeigh[level][D3Q27System::DIR_0P0]; + double &nodeDx3 = nodeDeltaToNeigh[level][D3Q27System::DIR_00P]; // fuer OBB-Test double qEinflussDelta = 1.1 * sqrt(nodeDx1 * nodeDx1 + nodeDx2 * nodeDx2 + nodeDx3 * nodeDx3); @@ -522,7 +522,8 @@ void D3Q27TriFaceMeshInteractor::setQs(const double &timeStep) bc = SPtr<BoundaryConditions>(new BoundaryConditions); ; bcMatrix->setBC(ix1, ix2, ix3, bc); - } else if (UbMath::less(bc->getQ(fdir), q)) // schon ein kuerzeres q voehanden? + } else if (UbMath::less(bc->getQ(fdir), q) && + UbMath::equal(-999.0, q)) // schon ein kuerzeres q voehanden? { // neu:: 18.05.2010 // um falsche qs die evtl durch die "wand" gehen zu vermeiden @@ -879,9 +880,9 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const double &timeStep) std::set<std::vector<int>> &solidsFromOtherInteractors = tmpSolidNodesFromOtherInteractors[block]; double q, internX1, internX2, internX3, distance; - double &nodeDx1 = nodeDeltaToNeigh[level][D3Q27System::E]; - double &nodeDx2 = nodeDeltaToNeigh[level][D3Q27System::N]; - double &nodeDx3 = nodeDeltaToNeigh[level][D3Q27System::T]; + double &nodeDx1 = nodeDeltaToNeigh[level][D3Q27System::DIR_P00]; + double &nodeDx2 = nodeDeltaToNeigh[level][D3Q27System::DIR_0P0]; + double &nodeDx3 = nodeDeltaToNeigh[level][D3Q27System::DIR_00P]; // fuer OBB-Test double qEinflussDelta = 1.1 * sqrt(nodeDx1 * nodeDx1 + nodeDx2 * nodeDx2 + nodeDx3 * nodeDx3); @@ -1180,9 +1181,9 @@ void D3Q27TriFaceMeshInteractor::initInteractor2(const double &timeStep) std::set<UbTupleInt3> &solidNodeIndices = this->solidNodeIndicesMap[block]; - float nodeDeltaX1 = (float)nodeDeltaToNeigh[level][D3Q27System::E]; - float nodeDeltaX2 = (float)nodeDeltaToNeigh[level][D3Q27System::N]; - float nodeDeltaX3 = (float)nodeDeltaToNeigh[level][D3Q27System::T]; + float nodeDeltaX1 = (float)nodeDeltaToNeigh[level][D3Q27System::DIR_P00]; + float nodeDeltaX2 = (float)nodeDeltaToNeigh[level][D3Q27System::DIR_0P0]; + float nodeDeltaX3 = (float)nodeDeltaToNeigh[level][D3Q27System::DIR_00P]; // flagfield matrix initialisieren CbArray3D<FLAGS> flagField(blocknx1, blocknx2, blocknx3, UNDEF_FLAG); diff --git a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp index f96c7aa2f75391c667b873e8a91a758a989d9cc2..38e5be2e5d35a51f79cb1da8ff7ce9b8b5589656 100644 --- a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp +++ b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp @@ -80,7 +80,7 @@ void InteractorsHelper::deleteSolidBlocks() } } - if (deleteBlocks) + if (interactors.size() > 0 && deleteBlocks) updateGrid(); } ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp index 20851b019a3a0abd2c8865c7c40530e73bcf6245..50a5339ea01d70ff0076ef81bda16db22e56ffe7 100644 --- a/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/BGKLBMKernel.cpp @@ -91,117 +91,117 @@ void BGKLBMKernel::calculate(int step) ////////////////////////////////////////////////////////////////////////// // read distribution //////////////////////////////////////////////////////////////////////////// - f[REST] = (*this->zeroDistributions)(x1, x2, x3); + f[DIR_000] = (*this->zeroDistributions)(x1, x2, x3); - f[E] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); - f[N] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); - f[T] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); - f[NE] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); - f[NW] = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3); - f[TE] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); - f[TW] = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3); - f[TN] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); - f[TS] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3); - f[TNE] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); - f[TNW] = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3); - f[TSE] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3); - f[TSW] = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3); + f[DIR_P00] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + f[DIR_0P0] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + f[DIR_00P] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + f[DIR_PP0] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + f[DIR_MP0] = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3); + f[DIR_P0P] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + f[DIR_M0P] = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3); + f[DIR_0PP] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + f[DIR_0MP] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3); + f[DIR_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + f[DIR_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3); + f[DIR_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3); + f[DIR_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3); - f[W] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3); - f[S] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3); - f[B] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p); - f[SW] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3); - f[SE] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3); - f[BW] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p); - f[BE] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p); - f[BS] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p); - f[BN] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p); - f[BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p); - f[BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p); - f[BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p); - f[BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p); + f[DIR_M00] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3); + f[DIR_0M0] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3); + f[DIR_00M] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p); + f[DIR_MM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3); + f[DIR_PM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3); + f[DIR_M0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p); + f[DIR_P0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p); + f[DIR_0MM] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p); + f[DIR_0PM] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p); + f[DIR_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p); + f[DIR_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p); + f[DIR_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p); + f[DIR_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p); ////////////////////////////////////////////////////////////////////////// - drho = f[REST] + f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + - f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS] + f[TNE] + f[TSW] + f[TSE] + f[TNW] + - f[BNE] + f[BSW] + f[BSE] + f[BNW]; + drho = f[DIR_000] + f[DIR_P00] + f[DIR_M00] + f[DIR_0P0] + f[DIR_0M0] + f[DIR_00P] + f[DIR_00M] + f[DIR_PP0] + f[DIR_MM0] + f[DIR_PM0] + f[DIR_MP0] + f[DIR_P0P] + + f[DIR_M0M] + f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] + f[DIR_0MM] + f[DIR_0PM] + f[DIR_0MP] + f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] + + f[DIR_PPM] + f[DIR_MMM] + f[DIR_PMM] + f[DIR_MPM]; - vx1 = f[E] - f[W] + f[NE] - f[SW] + f[SE] - f[NW] + f[TE] - f[BW] + f[BE] - f[TW] + f[TNE] - - f[TSW] + f[TSE] - f[TNW] + f[BNE] - f[BSW] + f[BSE] - f[BNW]; + vx1 = f[DIR_P00] - f[DIR_M00] + f[DIR_PP0] - f[DIR_MM0] + f[DIR_PM0] - f[DIR_MP0] + f[DIR_P0P] - f[DIR_M0M] + f[DIR_P0M] - f[DIR_M0P] + f[DIR_PPP] - + f[DIR_MMP] + f[DIR_PMP] - f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] + f[DIR_PMM] - f[DIR_MPM]; - vx2 = f[N] - f[S] + f[NE] - f[SW] - f[SE] + f[NW] + f[TN] - f[BS] + f[BN] - f[TS] + f[TNE] - - f[TSW] - f[TSE] + f[TNW] + f[BNE] - f[BSW] - f[BSE] + f[BNW]; + vx2 = f[DIR_0P0] - f[DIR_0M0] + f[DIR_PP0] - f[DIR_MM0] - f[DIR_PM0] + f[DIR_MP0] + f[DIR_0PP] - f[DIR_0MM] + f[DIR_0PM] - f[DIR_0MP] + f[DIR_PPP] - + f[DIR_MMP] - f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] + f[DIR_MPM]; - vx3 = f[T] - f[B] + f[TE] - f[BW] - f[BE] + f[TW] + f[TN] - f[BS] - f[BN] + f[TS] + f[TNE] + - f[TSW] + f[TSE] + f[TNW] - f[BNE] - f[BSW] - f[BSE] - f[BNW]; + vx3 = f[DIR_00P] - f[DIR_00M] + f[DIR_P0P] - f[DIR_M0M] - f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] - f[DIR_0MM] - f[DIR_0PM] + f[DIR_0MP] + f[DIR_PPP] + + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] - f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] - f[DIR_MPM]; LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - feq[REST] = c8o27 * (drho - cu_sq); - feq[E] = c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq); - feq[W] = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq); - feq[N] = c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq); - feq[S] = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq); - feq[T] = c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq); - feq[B] = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq); - feq[NE] = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); - feq[SW] = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); - feq[SE] = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); - feq[NW] = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); - feq[TE] = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); - feq[BW] = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); - feq[BE] = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); - feq[TW] = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); - feq[TN] = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); - feq[BS] = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); - feq[BN] = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); - feq[TS] = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); - feq[TNE] = c1o216 * + feq[DIR_000] = c8o27 * (drho - cu_sq); + feq[DIR_P00] = c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq); + feq[DIR_M00] = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq); + feq[DIR_0P0] = c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq); + feq[DIR_0M0] = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq); + feq[DIR_00P] = c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq); + feq[DIR_00M] = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq); + feq[DIR_PP0] = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); + feq[DIR_MM0] = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); + feq[DIR_PM0] = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); + feq[DIR_MP0] = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); + feq[DIR_P0P] = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); + feq[DIR_M0M] = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); + feq[DIR_P0M] = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); + feq[DIR_M0P] = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); + feq[DIR_0PP] = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); + feq[DIR_0MM] = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); + feq[DIR_0PM] = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); + feq[DIR_0MP] = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); + feq[DIR_PPP] = c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq); - feq[BSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + + feq[DIR_MMM] = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq); - feq[BNE] = c1o216 * + feq[DIR_PPM] = c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq); - feq[TSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + + feq[DIR_MMP] = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq); - feq[TSE] = c1o216 * + feq[DIR_PMP] = c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq); - feq[BNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + + feq[DIR_MPM] = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq); - feq[BSE] = c1o216 * + feq[DIR_PMM] = c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq); - feq[TNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + + feq[DIR_MPP] = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq); // Relaxation - f[REST] += (feq[REST] - f[REST]) * collFactor; - f[E] += (feq[E] - f[E]) * collFactor; - f[W] += (feq[W] - f[W]) * collFactor; - f[N] += (feq[N] - f[N]) * collFactor; - f[S] += (feq[S] - f[S]) * collFactor; - f[T] += (feq[T] - f[T]) * collFactor; - f[B] += (feq[B] - f[B]) * collFactor; - f[NE] += (feq[NE] - f[NE]) * collFactor; - f[SW] += (feq[SW] - f[SW]) * collFactor; - f[SE] += (feq[SE] - f[SE]) * collFactor; - f[NW] += (feq[NW] - f[NW]) * collFactor; - f[TE] += (feq[TE] - f[TE]) * collFactor; - f[BW] += (feq[BW] - f[BW]) * collFactor; - f[BE] += (feq[BE] - f[BE]) * collFactor; - f[TW] += (feq[TW] - f[TW]) * collFactor; - f[TN] += (feq[TN] - f[TN]) * collFactor; - f[BS] += (feq[BS] - f[BS]) * collFactor; - f[BN] += (feq[BN] - f[BN]) * collFactor; - f[TS] += (feq[TS] - f[TS]) * collFactor; + f[DIR_000] += (feq[DIR_000] - f[DIR_000]) * collFactor; + f[DIR_P00] += (feq[DIR_P00] - f[DIR_P00]) * collFactor; + f[DIR_M00] += (feq[DIR_M00] - f[DIR_M00]) * collFactor; + f[DIR_0P0] += (feq[DIR_0P0] - f[DIR_0P0]) * collFactor; + f[DIR_0M0] += (feq[DIR_0M0] - f[DIR_0M0]) * collFactor; + f[DIR_00P] += (feq[DIR_00P] - f[DIR_00P]) * collFactor; + f[DIR_00M] += (feq[DIR_00M] - f[DIR_00M]) * collFactor; + f[DIR_PP0] += (feq[DIR_PP0] - f[DIR_PP0]) * collFactor; + f[DIR_MM0] += (feq[DIR_MM0] - f[DIR_MM0]) * collFactor; + f[DIR_PM0] += (feq[DIR_PM0] - f[DIR_PM0]) * collFactor; + f[DIR_MP0] += (feq[DIR_MP0] - f[DIR_MP0]) * collFactor; + f[DIR_P0P] += (feq[DIR_P0P] - f[DIR_P0P]) * collFactor; + f[DIR_M0M] += (feq[DIR_M0M] - f[DIR_M0M]) * collFactor; + f[DIR_P0M] += (feq[DIR_P0M] - f[DIR_P0M]) * collFactor; + f[DIR_M0P] += (feq[DIR_M0P] - f[DIR_M0P]) * collFactor; + f[DIR_0PP] += (feq[DIR_0PP] - f[DIR_0PP]) * collFactor; + f[DIR_0MM] += (feq[DIR_0MM] - f[DIR_0MM]) * collFactor; + f[DIR_0PM] += (feq[DIR_0PM] - f[DIR_0PM]) * collFactor; + f[DIR_0MP] += (feq[DIR_0MP] - f[DIR_0MP]) * collFactor; - f[TNE] += (feq[TNE] - f[TNE]) * collFactor; - f[BSW] += (feq[BSW] - f[BSW]) * collFactor; - f[BNE] += (feq[BNE] - f[BNE]) * collFactor; - f[TSW] += (feq[TSW] - f[TSW]) * collFactor; - f[TSE] += (feq[TSE] - f[TSE]) * collFactor; - f[BNW] += (feq[BNW] - f[BNW]) * collFactor; - f[BSE] += (feq[BSE] - f[BSE]) * collFactor; - f[TNW] += (feq[TNW] - f[TNW]) * collFactor; + f[DIR_PPP] += (feq[DIR_PPP] - f[DIR_PPP]) * collFactor; + f[DIR_MMM] += (feq[DIR_MMM] - f[DIR_MMM]) * collFactor; + f[DIR_PPM] += (feq[DIR_PPM] - f[DIR_PPM]) * collFactor; + f[DIR_MMP] += (feq[DIR_MMP] - f[DIR_MMP]) * collFactor; + f[DIR_PMP] += (feq[DIR_PMP] - f[DIR_PMP]) * collFactor; + f[DIR_MPM] += (feq[DIR_MPM] - f[DIR_MPM]) * collFactor; + f[DIR_PMM] += (feq[DIR_PMM] - f[DIR_PMM]) * collFactor; + f[DIR_MPP] += (feq[DIR_MPP] - f[DIR_MPP]) * collFactor; ////////////////////////////////////////////////////////////////////////// // forcing @@ -214,39 +214,39 @@ void BGKLBMKernel::calculate(int step) forcingX2 = muForcingX2.Eval(); forcingX3 = muForcingX3.Eval(); - f[REST] += 0.0; - f[E] += 3.0 * c2o27 * (forcingX1); - f[W] += 3.0 * c2o27 * (-forcingX1); - f[N] += 3.0 * c2o27 * (forcingX2); - f[S] += 3.0 * c2o27 * (-forcingX2); - f[T] += 3.0 * c2o27 * (forcingX3); - f[B] += 3.0 * c2o27 * (-forcingX3); - f[NE] += 3.0 * c1o54 * (forcingX1 + forcingX2); - f[SW] += 3.0 * c1o54 * (-forcingX1 - forcingX2); - f[SE] += 3.0 * c1o54 * (forcingX1 - forcingX2); - f[NW] += 3.0 * c1o54 * (-forcingX1 + forcingX2); - f[TE] += 3.0 * c1o54 * (forcingX1 + forcingX3); - f[BW] += 3.0 * c1o54 * (-forcingX1 - forcingX3); - f[BE] += 3.0 * c1o54 * (forcingX1 - forcingX3); - f[TW] += 3.0 * c1o54 * (-forcingX1 + forcingX3); - f[TN] += 3.0 * c1o54 * (forcingX2 + forcingX3); - f[BS] += 3.0 * c1o54 * (-forcingX2 - forcingX3); - f[BN] += 3.0 * c1o54 * (forcingX2 - forcingX3); - f[TS] += 3.0 * c1o54 * (-forcingX2 + forcingX3); - f[TNE] += 3.0 * c1o216 * (forcingX1 + forcingX2 + forcingX3); - f[BSW] += 3.0 * c1o216 * (-forcingX1 - forcingX2 - forcingX3); - f[BNE] += 3.0 * c1o216 * (forcingX1 + forcingX2 - forcingX3); - f[TSW] += 3.0 * c1o216 * (-forcingX1 - forcingX2 + forcingX3); - f[TSE] += 3.0 * c1o216 * (forcingX1 - forcingX2 + forcingX3); - f[BNW] += 3.0 * c1o216 * (-forcingX1 + forcingX2 - forcingX3); - f[BSE] += 3.0 * c1o216 * (forcingX1 - forcingX2 - forcingX3); - f[TNW] += 3.0 * c1o216 * (-forcingX1 + forcingX2 + forcingX3); + f[DIR_000] += 0.0; + f[DIR_P00] += 3.0 * c2o27 * (forcingX1); + f[DIR_M00] += 3.0 * c2o27 * (-forcingX1); + f[DIR_0P0] += 3.0 * c2o27 * (forcingX2); + f[DIR_0M0] += 3.0 * c2o27 * (-forcingX2); + f[DIR_00P] += 3.0 * c2o27 * (forcingX3); + f[DIR_00M] += 3.0 * c2o27 * (-forcingX3); + f[DIR_PP0] += 3.0 * c1o54 * (forcingX1 + forcingX2); + f[DIR_MM0] += 3.0 * c1o54 * (-forcingX1 - forcingX2); + f[DIR_PM0] += 3.0 * c1o54 * (forcingX1 - forcingX2); + f[DIR_MP0] += 3.0 * c1o54 * (-forcingX1 + forcingX2); + f[DIR_P0P] += 3.0 * c1o54 * (forcingX1 + forcingX3); + f[DIR_M0M] += 3.0 * c1o54 * (-forcingX1 - forcingX3); + f[DIR_P0M] += 3.0 * c1o54 * (forcingX1 - forcingX3); + f[DIR_M0P] += 3.0 * c1o54 * (-forcingX1 + forcingX3); + f[DIR_0PP] += 3.0 * c1o54 * (forcingX2 + forcingX3); + f[DIR_0MM] += 3.0 * c1o54 * (-forcingX2 - forcingX3); + f[DIR_0PM] += 3.0 * c1o54 * (forcingX2 - forcingX3); + f[DIR_0MP] += 3.0 * c1o54 * (-forcingX2 + forcingX3); + f[DIR_PPP] += 3.0 * c1o216 * (forcingX1 + forcingX2 + forcingX3); + f[DIR_MMM] += 3.0 * c1o216 * (-forcingX1 - forcingX2 - forcingX3); + f[DIR_PPM] += 3.0 * c1o216 * (forcingX1 + forcingX2 - forcingX3); + f[DIR_MMP] += 3.0 * c1o216 * (-forcingX1 - forcingX2 + forcingX3); + f[DIR_PMP] += 3.0 * c1o216 * (forcingX1 - forcingX2 + forcingX3); + f[DIR_MPM] += 3.0 * c1o216 * (-forcingX1 + forcingX2 - forcingX3); + f[DIR_PMM] += 3.0 * c1o216 * (forcingX1 - forcingX2 - forcingX3); + f[DIR_MPP] += 3.0 * c1o216 * (-forcingX1 + forcingX2 + forcingX3); } ////////////////////////////////////////////////////////////////////////// #ifdef PROOF_CORRECTNESS - LBMReal rho_post = f[REST] + f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + f[NE] + f[SW] + f[SE] + - f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS] + f[TNE] + - f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]; + LBMReal rho_post = f[DIR_000] + f[DIR_P00] + f[DIR_M00] + f[DIR_0P0] + f[DIR_0M0] + f[DIR_00P] + f[DIR_00M] + f[DIR_PP0] + f[DIR_MM0] + f[DIR_PM0] + + f[DIR_MP0] + f[DIR_P0P] + f[DIR_M0M] + f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] + f[DIR_0MM] + f[DIR_0PM] + f[DIR_0MP] + f[DIR_PPP] + + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] + f[DIR_MMM] + f[DIR_PMM] + f[DIR_MPM]; LBMReal dif = drho - rho_post; #ifdef SINGLEPRECISION if (dif > 10.0E-7 || dif < -10.0E-7) @@ -263,35 +263,35 @@ void BGKLBMKernel::calculate(int step) ////////////////////////////////////////////////////////////////////////// // write distribution ////////////////////////////////////////////////////////////////////////// - (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::INV_E]; - (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::INV_N]; - (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::INV_T]; - (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::INV_NE]; - (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = f[D3Q27System::INV_NW]; - (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::INV_TE]; - (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = f[D3Q27System::INV_TW]; - (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::INV_TN]; - (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = f[D3Q27System::INV_TS]; - (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::INV_TNE]; - (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = f[D3Q27System::INV_TNW]; - (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = f[D3Q27System::INV_TSE]; - (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::INV_TSW]; + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::INV_P00]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::INV_0P0]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::INV_00P]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::INV_PP0]; + (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = f[D3Q27System::INV_MP0]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::INV_P0P]; + (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = f[D3Q27System::INV_M0P]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::INV_0PP]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = f[D3Q27System::INV_0MP]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::INV_PPP]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = f[D3Q27System::INV_MPP]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = f[D3Q27System::INV_PMP]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::INV_MMP]; - (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = f[D3Q27System::INV_W]; - (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = f[D3Q27System::INV_S]; - (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = f[D3Q27System::INV_B]; - (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = f[D3Q27System::INV_SW]; - (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = f[D3Q27System::INV_SE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = f[D3Q27System::INV_BW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = f[D3Q27System::INV_BE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = f[D3Q27System::INV_BS]; - (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = f[D3Q27System::INV_BN]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::INV_BSW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = f[D3Q27System::INV_BSE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = f[D3Q27System::INV_BNW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = f[D3Q27System::INV_BNE]; + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = f[D3Q27System::INV_M00]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = f[D3Q27System::INV_0M0]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = f[D3Q27System::INV_00M]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = f[D3Q27System::INV_MM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = f[D3Q27System::INV_PM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = f[D3Q27System::INV_M0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = f[D3Q27System::INV_P0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = f[D3Q27System::INV_0MM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = f[D3Q27System::INV_0PM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::INV_MMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = f[D3Q27System::INV_PMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = f[D3Q27System::INV_MPM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = f[D3Q27System::INV_PPM]; - (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST]; + (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000]; ////////////////////////////////////////////////////////////////////////// } } diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp index 94635f85810d81563efafb4a560a230ac3bc3056..b1e48abd9ed3c0a2b4bff26090c20512d94eff7f 100644 --- a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulant4thOrderViscosityLBMKernel.cpp @@ -117,7 +117,7 @@ void CompressibleCumulant4thOrderViscosityLBMKernel::calculate(int step) //LBMReal B = (four + twentyeight*omega - fourteen*omega*omega) / (six - twentyone*omega + fiveteen*omega*omega); LBMReal A = (4.0*omega*omega+2.0*omega*OxxPyyPzz*(omega-6.0)+OxxPyyPzz*OxxPyyPzz*(omega*(10.0-3.0*omega)-4.0))/((omega-OxxPyyPzz)*(OxxPyyPzz*(2.0+3.0*omega)-8.0*omega)); - //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' ) + //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' ) LBMReal B = (4.0*omega*OxxPyyPzz*(9.0*omega-16.0)-4.0*omega*omega-2.0*OxxPyyPzz*OxxPyyPzz*(2.0+9.0*omega*(omega-2.0)))/(3.0*(omega-OxxPyyPzz)*(OxxPyyPzz*(2.0+3.0*omega)-8.0*omega)); for (int x3 = minX3; x3 < maxX3; x3++) diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp index 036b35379ec218585a43a67d03f2a03deb79d6e5..a359db9cd61ef3042130f5148abdc4cf1488617a 100644 --- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetInterpolationProcessor.cpp @@ -66,11 +66,11 @@ void CompressibleOffsetInterpolationProcessor::calcMoments(const LBMReal* const press = drho; //interpolate rho! - kxy = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13 - kyz = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))/(one + drho)-(vx2*vx3)); - kxz = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))/(one + drho)-(vx1*vx3)); - kxxMyy = -3./2.*omega*((((f[BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))/(one + drho)-(vx1*vx1-vx2*vx2)); - kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))/(one + drho)-(vx1*vx1-vx3*vx3)); + kxy = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13 + kyz = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(one + drho)-(vx2*vx3)); + kxz = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(one + drho)-(vx1*vx3)); + kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(one + drho)-(vx1*vx1-vx2*vx2)); + kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(one + drho)-(vx1*vx1-vx3*vx3)); } ////////////////////////////////////////////////////////////////////////// void CompressibleOffsetInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, LBMReal omega, LBMReal eps_new) @@ -471,33 +471,33 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeCF(LBMReal* f LBMReal feq[ENDF+1]; D3Q27System::calcCompFeq(feq,rho,vx1,vx2,vx3); - f[E] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[E]; - f[W] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[W]; - f[N] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[N]; - f[S] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[S]; - f[T] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[T]; - f[B] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[B]; - f[NE] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[NE]; - f[SW] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[SW]; - f[SE] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[SE]; - f[NW] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[NW]; - f[TE] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[TE]; - f[BW] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[BW]; - f[BE] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[BE]; - f[TW] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[TW]; - f[TN] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[TN]; - f[BS] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[BS]; - f[BN] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[BN]; - f[TS] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[TS]; - f[TNE] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[TNE]; - f[TSW] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[TSW]; - f[TSE] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[TSE]; - f[TNW] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[TNW]; - f[BNE] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[BNE]; - f[BSW] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[BSW]; - f[BSE] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[BSE]; - f[BNW] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[BNW]; - f[REST] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO + feq[REST]; + f[DIR_P00] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[DIR_P00]; + f[DIR_M00] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[DIR_M00]; + f[DIR_0P0] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[DIR_0P0]; + f[DIR_0M0] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[DIR_0M0]; + f[DIR_00P] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[DIR_00P]; + f[DIR_00M] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[DIR_00M]; + f[DIR_PP0] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[DIR_PP0]; + f[DIR_MM0] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[DIR_MM0]; + f[DIR_PM0] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[DIR_PM0]; + f[DIR_MP0] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[DIR_MP0]; + f[DIR_P0P] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[DIR_P0P]; + f[DIR_M0M] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[DIR_M0M]; + f[DIR_P0M] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[DIR_P0M]; + f[DIR_M0P] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[DIR_M0P]; + f[DIR_0PP] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[DIR_0PP]; + f[DIR_0MM] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[DIR_0MM]; + f[DIR_0PM] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[DIR_0PM]; + f[DIR_0MP] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[DIR_0MP]; + f[DIR_PPP] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[DIR_PPP]; + f[DIR_MMP] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[DIR_MMP]; + f[DIR_PMP] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[DIR_PMP]; + f[DIR_MPP] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[DIR_MPP]; + f[DIR_PPM] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[DIR_PPM]; + f[DIR_MMM] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[DIR_MMM]; + f[DIR_PMM] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[DIR_PMM]; + f[DIR_MPM] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[DIR_MPM]; + f[DIR_000] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO + feq[DIR_000]; } ////////////////////////////////////////////////////////////////////////// //Position SWB -0.25, -0.25, -0.25 @@ -665,33 +665,33 @@ void CompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(LBMReal* f f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o)); f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o)); - f[E] = f_E + feq[E]; - f[W] = f_E + feq[W]; - f[N] = f_N + feq[N]; - f[S] = f_N + feq[S]; - f[T] = f_T + feq[T]; - f[B] = f_T + feq[B]; - f[NE] = f_NE + feq[NE]; - f[SW] = f_NE + feq[SW]; - f[SE] = f_SE + feq[SE]; - f[NW] = f_SE + feq[NW]; - f[TE] = f_TE + feq[TE]; - f[BW] = f_TE + feq[BW]; - f[BE] = f_BE + feq[BE]; - f[TW] = f_BE + feq[TW]; - f[TN] = f_TN + feq[TN]; - f[BS] = f_TN + feq[BS]; - f[BN] = f_BN + feq[BN]; - f[TS] = f_BN + feq[TS]; - f[TNE] = f_TNE + feq[TNE]; - f[TNW] = f_TNW + feq[TNW]; - f[TSE] = f_TSE + feq[TSE]; - f[TSW] = f_TSW + feq[TSW]; - f[BNE] = f_TSW + feq[BNE]; - f[BNW] = f_TSE + feq[BNW]; - f[BSE] = f_TNW + feq[BSE]; - f[BSW] = f_TNE + feq[BSW]; - f[REST] = f_ZERO + feq[REST]; + f[DIR_P00] = f_E + feq[DIR_P00]; + f[DIR_M00] = f_E + feq[DIR_M00]; + f[DIR_0P0] = f_N + feq[DIR_0P0]; + f[DIR_0M0] = f_N + feq[DIR_0M0]; + f[DIR_00P] = f_T + feq[DIR_00P]; + f[DIR_00M] = f_T + feq[DIR_00M]; + f[DIR_PP0] = f_NE + feq[DIR_PP0]; + f[DIR_MM0] = f_NE + feq[DIR_MM0]; + f[DIR_PM0] = f_SE + feq[DIR_PM0]; + f[DIR_MP0] = f_SE + feq[DIR_MP0]; + f[DIR_P0P] = f_TE + feq[DIR_P0P]; + f[DIR_M0M] = f_TE + feq[DIR_M0M]; + f[DIR_P0M] = f_BE + feq[DIR_P0M]; + f[DIR_M0P] = f_BE + feq[DIR_M0P]; + f[DIR_0PP] = f_TN + feq[DIR_0PP]; + f[DIR_0MM] = f_TN + feq[DIR_0MM]; + f[DIR_0PM] = f_BN + feq[DIR_0PM]; + f[DIR_0MP] = f_BN + feq[DIR_0MP]; + f[DIR_PPP] = f_TNE + feq[DIR_PPP]; + f[DIR_MPP] = f_TNW + feq[DIR_MPP]; + f[DIR_PMP] = f_TSE + feq[DIR_PMP]; + f[DIR_MMP] = f_TSW + feq[DIR_MMP]; + f[DIR_PPM] = f_TSW + feq[DIR_PPM]; + f[DIR_MPM] = f_TSE + feq[DIR_MPM]; + f[DIR_PMM] = f_TNW + feq[DIR_PMM]; + f[DIR_MMM] = f_TNE + feq[DIR_MMM]; + f[DIR_000] = f_ZERO + feq[DIR_000]; } ////////////////////////////////////////////////////////////////////////// void CompressibleOffsetInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3) diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp index 4dec637580458cfa77d151b810df04a853116de8..e6883626c94e8de2b01f0c331f7580a7a7b9b9d2 100644 --- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetMomentsInterpolationProcessor.cpp @@ -95,11 +95,11 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcMoments(const LBMReal* press = drho; //interpolate rho! - kxy = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13 - kyz = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))/(one + drho)-(vx2*vx3)); - kxz = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))/(one + drho)-(vx1*vx3)); - kxxMyy = -3./2.*omega*((((f[BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))/(one + drho)-(vx1*vx1-vx2*vx2)); - kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))/(one + drho)-(vx1*vx1-vx3*vx3)); + kxy = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13 + kyz = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(one + drho)-(vx2*vx3)); + kxz = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(one + drho)-(vx1*vx3)); + kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(one + drho)-(vx1*vx1-vx2*vx2)); + kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(one + drho)-(vx1*vx1-vx3*vx3)); } ////////////////////////////////////////////////////////////////////////// void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, LBMReal omega, LBMReal eps_new) @@ -785,33 +785,33 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeCF(LBM mfccc = m2; //////////////////////////////////////////////////////////////////////////////////// - f[E] = mfcbb; - f[W] = mfabb; - f[N] = mfbcb; - f[S] = mfbab; - f[T] = mfbbc; - f[B] = mfbba; - f[NE] = mfccb; - f[SW] = mfaab; - f[SE] = mfcab; - f[NW] = mfacb; - f[TE] = mfcbc; - f[BW] = mfaba; - f[BE] = mfcba; - f[TW] = mfabc; - f[TN] = mfbcc; - f[BS] = mfbaa; - f[BN] = mfbca; - f[TS] = mfbac; - f[REST] = mfbbb; - f[TNE] = mfccc; - f[TSE] = mfcac; - f[BNE] = mfcca; - f[BSE] = mfcaa; - f[TNW] = mfacc; - f[TSW] = mfaac; - f[BNW] = mfaca; - f[BSW] = mfaaa; + f[DIR_P00] = mfcbb; + f[DIR_M00] = mfabb; + f[DIR_0P0] = mfbcb; + f[DIR_0M0] = mfbab; + f[DIR_00P] = mfbbc; + f[DIR_00M] = mfbba; + f[DIR_PP0] = mfccb; + f[DIR_MM0] = mfaab; + f[DIR_PM0] = mfcab; + f[DIR_MP0] = mfacb; + f[DIR_P0P] = mfcbc; + f[DIR_M0M] = mfaba; + f[DIR_P0M] = mfcba; + f[DIR_M0P] = mfabc; + f[DIR_0PP] = mfbcc; + f[DIR_0MM] = mfbaa; + f[DIR_0PM] = mfbca; + f[DIR_0MP] = mfbac; + f[DIR_000] = mfbbb; + f[DIR_PPP] = mfccc; + f[DIR_PMP] = mfcac; + f[DIR_PPM] = mfcca; + f[DIR_PMM] = mfcaa; + f[DIR_MPP] = mfacc; + f[DIR_MMP] = mfaac; + f[DIR_MPM] = mfaca; + f[DIR_MMM] = mfaaa; } ////////////////////////////////////////////////////////////////////////// //Position SWB -0.25, -0.25, -0.25 @@ -1004,7 +1004,7 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeFC(LBM LBMReal mxxyMyzz = zeroReal; LBMReal mxxzPyyz = zeroReal; LBMReal mxxzMyyz = zeroReal; - LBMReal mxyyPxzz = zeroReal; + LBMReal mxyyPxzz = zeroReal; LBMReal mxyyMxzz = zeroReal; // linear combinations back @@ -1233,33 +1233,33 @@ void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedNodeFC(LBM mfccc = m2; //////////////////////////////////////////////////////////////////////////////////// - f[E] = mfcbb; - f[W] = mfabb; - f[N] = mfbcb; - f[S] = mfbab; - f[T] = mfbbc; - f[B] = mfbba; - f[NE] = mfccb; - f[SW] = mfaab; - f[SE] = mfcab; - f[NW] = mfacb; - f[TE] = mfcbc; - f[BW] = mfaba; - f[BE] = mfcba; - f[TW] = mfabc; - f[TN] = mfbcc; - f[BS] = mfbaa; - f[BN] = mfbca; - f[TS] = mfbac; - f[REST] = mfbbb; - f[TNE] = mfccc; - f[TSE] = mfcac; - f[BNE] = mfcca; - f[BSE] = mfcaa; - f[TNW] = mfacc; - f[TSW] = mfaac; - f[BNW] = mfaca; - f[BSW] = mfaaa; + f[DIR_P00] = mfcbb; + f[DIR_M00] = mfabb; + f[DIR_0P0] = mfbcb; + f[DIR_0M0] = mfbab; + f[DIR_00P] = mfbbc; + f[DIR_00M] = mfbba; + f[DIR_PP0] = mfccb; + f[DIR_MM0] = mfaab; + f[DIR_PM0] = mfcab; + f[DIR_MP0] = mfacb; + f[DIR_P0P] = mfcbc; + f[DIR_M0M] = mfaba; + f[DIR_P0M] = mfcba; + f[DIR_M0P] = mfabc; + f[DIR_0PP] = mfbcc; + f[DIR_0MM] = mfbaa; + f[DIR_0PM] = mfbca; + f[DIR_0MP] = mfbac; + f[DIR_000] = mfbbb; + f[DIR_PPP] = mfccc; + f[DIR_PMP] = mfcac; + f[DIR_PPM] = mfcca; + f[DIR_PMM] = mfcaa; + f[DIR_MPP] = mfacc; + f[DIR_MMP] = mfaac; + f[DIR_MPM] = mfaca; + f[DIR_MMM] = mfaaa; } ////////////////////////////////////////////////////////////////////////// void CompressibleOffsetMomentsInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3) diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp index 7a19f156e4447acd9d4451ce4c1a1de7bf5c990d..c9cc8138dcf1d4ce11ee4e2aa7b733f2174f367d 100644 --- a/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleOffsetSquarePressureInterpolationProcessor.cpp @@ -85,11 +85,11 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcMoments(const L press = drho; //interpolate rho! - kxy = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13 - kyz = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))/(one + drho)-(vx2*vx3)); - kxz = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))/(one + drho)-(vx1*vx3)); - kxxMyy = -3./2.*omega*((((f[BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))/(one + drho)-(vx1*vx1-vx2*vx2)); - kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))/(one + drho)-(vx1*vx1-vx3*vx3)); + kxy = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))/(one + drho)-(vx1*vx2));// might not be optimal MG 25.2.13 + kyz = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))/(one + drho)-(vx2*vx3)); + kxz = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))/(one + drho)-(vx1*vx3)); + kxxMyy = -3./2.*omega*((((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))/(one + drho)-(vx1*vx1-vx2*vx2)); + kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))/(one + drho)-(vx1*vx1-vx3*vx3)); } ////////////////////////////////////////////////////////////////////////// void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, LBMReal omega, LBMReal eps_new) @@ -780,33 +780,33 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod mfccc = m2; //////////////////////////////////////////////////////////////////////////////////// - f[E] = mfcbb; - f[W] = mfabb; - f[N] = mfbcb; - f[S] = mfbab; - f[T] = mfbbc; - f[B] = mfbba; - f[NE] = mfccb; - f[SW] = mfaab; - f[SE] = mfcab; - f[NW] = mfacb; - f[TE] = mfcbc; - f[BW] = mfaba; - f[BE] = mfcba; - f[TW] = mfabc; - f[TN] = mfbcc; - f[BS] = mfbaa; - f[BN] = mfbca; - f[TS] = mfbac; - f[REST] = mfbbb; - f[TNE] = mfccc; - f[TSE] = mfcac; - f[BNE] = mfcca; - f[BSE] = mfcaa; - f[TNW] = mfacc; - f[TSW] = mfaac; - f[BNW] = mfaca; - f[BSW] = mfaaa; + f[DIR_P00] = mfcbb; + f[DIR_M00] = mfabb; + f[DIR_0P0] = mfbcb; + f[DIR_0M0] = mfbab; + f[DIR_00P] = mfbbc; + f[DIR_00M] = mfbba; + f[DIR_PP0] = mfccb; + f[DIR_MM0] = mfaab; + f[DIR_PM0] = mfcab; + f[DIR_MP0] = mfacb; + f[DIR_P0P] = mfcbc; + f[DIR_M0M] = mfaba; + f[DIR_P0M] = mfcba; + f[DIR_M0P] = mfabc; + f[DIR_0PP] = mfbcc; + f[DIR_0MM] = mfbaa; + f[DIR_0PM] = mfbca; + f[DIR_0MP] = mfbac; + f[DIR_000] = mfbbb; + f[DIR_PPP] = mfccc; + f[DIR_PMP] = mfcac; + f[DIR_PPM] = mfcca; + f[DIR_PMM] = mfcaa; + f[DIR_MPP] = mfacc; + f[DIR_MMP] = mfaac; + f[DIR_MPM] = mfaca; + f[DIR_MMM] = mfaaa; } ////////////////////////////////////////////////////////////////////////// //Position SWB -0.25, -0.25, -0.25 @@ -1233,33 +1233,33 @@ void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedNod mfccc = m2; //////////////////////////////////////////////////////////////////////////////////// - f[E] = mfcbb; - f[W] = mfabb; - f[N] = mfbcb; - f[S] = mfbab; - f[T] = mfbbc; - f[B] = mfbba; - f[NE] = mfccb; - f[SW] = mfaab; - f[SE] = mfcab; - f[NW] = mfacb; - f[TE] = mfcbc; - f[BW] = mfaba; - f[BE] = mfcba; - f[TW] = mfabc; - f[TN] = mfbcc; - f[BS] = mfbaa; - f[BN] = mfbca; - f[TS] = mfbac; - f[REST] = mfbbb; - f[TNE] = mfccc; - f[TSE] = mfcac; - f[BNE] = mfcca; - f[BSE] = mfcaa; - f[TNW] = mfacc; - f[TSW] = mfaac; - f[BNW] = mfaca; - f[BSW] = mfaaa; + f[DIR_P00] = mfcbb; + f[DIR_M00] = mfabb; + f[DIR_0P0] = mfbcb; + f[DIR_0M0] = mfbab; + f[DIR_00P] = mfbbc; + f[DIR_00M] = mfbba; + f[DIR_PP0] = mfccb; + f[DIR_MM0] = mfaab; + f[DIR_PM0] = mfcab; + f[DIR_MP0] = mfacb; + f[DIR_P0P] = mfcbc; + f[DIR_M0M] = mfaba; + f[DIR_P0M] = mfcba; + f[DIR_M0P] = mfabc; + f[DIR_0PP] = mfbcc; + f[DIR_0MM] = mfbaa; + f[DIR_0PM] = mfbca; + f[DIR_0MP] = mfbac; + f[DIR_000] = mfbbb; + f[DIR_PPP] = mfccc; + f[DIR_PMP] = mfcac; + f[DIR_PPM] = mfcca; + f[DIR_PMM] = mfcaa; + f[DIR_MPP] = mfacc; + f[DIR_MMP] = mfaac; + f[DIR_MPM] = mfaca; + f[DIR_MMM] = mfaaa; } ////////////////////////////////////////////////////////////////////////// void CompressibleOffsetSquarePressureInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3) diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp index 105603b35d043799672a58fda83ba503af70b703..7e2fd17c0577ea4606f4b38530985411764b5bdb 100644 --- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.cpp @@ -6,20 +6,35 @@ namespace D3Q27System { using namespace UbMath; -// index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 25 26 +// index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // f: E, W, N, S, T, B, NE, SW, SE, NW, TE, BW, BE, TW, TN, BS, BN, TS, TNE TNW TSE TSW BNE BNW BSE BSW -const int DX1[] = { 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 }; -const int DX2[] = { 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 }; -const int DX3[] = { 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 }; - -const double WEIGTH[] = { c2o27, c2o27, c2o27, c2o27, c2o27, c2o27, c1o54, c1o54, c1o54, - c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, - c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c8o27 }; - -const int INVDIR[] = { INV_E, INV_W, INV_N, INV_S, INV_T, INV_B, INV_NE, INV_SW, INV_SE, - INV_NW, INV_TE, INV_BW, INV_BE, INV_TW, INV_TN, INV_BS, INV_BN, INV_TS, - INV_TNE, INV_TNW, INV_TSE, INV_TSW, INV_BNE, INV_BNW, INV_BSE, INV_BSW }; - +//const int DX1[] = { 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 }; +//const int DX2[] = { 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 }; +//const int DX3[] = { 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 }; + +// index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 +// f: REST, E, W, N, S, T, B, NE, SW, SE, NW, TE, BW, BE, TW, TN, BS, BN, TS, TNE TNW TSE TSW BNE BNW BSE BSW +const int DX1[] = { 0, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 }; +const int DX2[] = { 0, 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 }; +const int DX3[] = { 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 }; + +const double WEIGTH[] = { c8o27, + c2o27, c2o27, c2o27, c2o27, c2o27, c2o27, + c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, c1o54, + c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c1o216, c1o216 }; + +const int INVDIR[] = { DIR_000, INV_P00, INV_M00, INV_0P0, INV_0M0, INV_00P, INV_00M, INV_PP0, INV_MM0, INV_PM0, + INV_MP0, INV_P0P, INV_M0M, INV_P0M, INV_M0P, INV_0PP, INV_0MM, INV_0PM, INV_0MP, + INV_PPP, INV_MPP, INV_PMP, INV_MMP, INV_PPM, INV_MPM, INV_PMM, INV_MMM }; + +// index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +// direction: E, W, N, S, T, B, NE, SW, SE, NW, TE, BW, BE, TW, TN, BS, BN, TS, TNE TNW TSE TSW BNE BNW BSE +// BSW +const int EX1[] = { 0, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1, 1, -1, 1, -1 }; +const int EX2[] = { 0, 0, 0, 1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, -1 }; +const int EX3[] = { 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1 }; + +////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h index bdb443ee2e40bf53a60ebf61c249a8e80aedd4b3..d8822219484599e8f31fa86564ecdaf844679d52 100644 --- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h +++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h @@ -47,14 +47,14 @@ namespace D3Q27System { ////////////////////////////////////////////////////////////////////////// // DIRECTION STUFF -static const int FSTARTDIR = 0; -static const int FENDDIR = 25; // D3Q27 +static const int FSTARTDIR = 1; +static const int FENDDIR = 26; // D3Q27 static const int STARTF = 0; static const int ENDF = 26; // D3Q27 -static const int STARTDIR = 0; -static const int ENDDIR = 26; // all geometric directions +static const int STARTDIR = 1; //0 +static const int ENDDIR = 26;//26 // all geometric directions extern const int DX1[ENDDIR + 1]; extern const int DX2[ENDDIR + 1]; @@ -63,60 +63,123 @@ extern const double WEIGTH[ENDDIR + 1]; extern const double cNorm[3][ENDDIR]; -static const int E = 0; -static const int W = 1; -static const int N = 2; -static const int S = 3; -static const int T = 4; -static const int B = 5; -static const int NE = 6; -static const int SW = 7; -static const int SE = 8; -static const int NW = 9; -static const int TE = 10; -static const int BW = 11; -static const int BE = 12; -static const int TW = 13; -static const int TN = 14; -static const int BS = 15; -static const int BN = 16; -static const int TS = 17; -static const int TNE = 18; -static const int TNW = 19; -static const int TSE = 20; -static const int TSW = 21; -static const int BNE = 22; -static const int BNW = 23; -static const int BSE = 24; -static const int BSW = 25; -static const int REST = 26; +static const int MINLEVEL = 0; +static const int MAXLEVEL = 25; -static const int INV_E = W; -static const int INV_W = E; -static const int INV_N = S; -static const int INV_S = N; -static const int INV_T = B; -static const int INV_B = T; -static const int INV_NE = SW; -static const int INV_SW = NE; -static const int INV_SE = NW; -static const int INV_NW = SE; -static const int INV_TE = BW; -static const int INV_BW = TE; -static const int INV_BE = TW; -static const int INV_TW = BE; -static const int INV_TN = BS; -static const int INV_BS = TN; -static const int INV_BN = TS; -static const int INV_TS = BN; -static const int INV_TNE = BSW; -static const int INV_TNW = BSE; -static const int INV_TSE = BNW; -static const int INV_TSW = BNE; -static const int INV_BNE = TSW; -static const int INV_BNW = TSE; -static const int INV_BSE = TNW; -static const int INV_BSW = TNE; +extern const int EX1[ENDDIR + 1]; +extern const int EX2[ENDDIR + 1]; +extern const int EX3[ENDDIR + 1]; + +//static const int E = 0; +//static const int W = 1; +//static const int N = 2; +//static const int S = 3; +//static const int T = 4; +//static const int B = 5; +//static const int NE = 6; +//static const int SW = 7; +//static const int SE = 8; +//static const int NW = 9; +//static const int TE = 10; +//static const int BW = 11; +//static const int BE = 12; +//static const int TW = 13; +//static const int TN = 14; +//static const int BS = 15; +//static const int BN = 16; +//static const int TS = 17; +//static const int TNE = 18; +//static const int TNW = 19; +//static const int TSE = 20; +//static const int TSW = 21; +//static const int BNE = 22; +//static const int BNW = 23; +//static const int BSE = 24; +//static const int BSW = 25; +//static const int REST = 26; + +//static constexpr int REST = 0; +//static constexpr int E = 1; +//static constexpr int W = 2; +//static constexpr int N = 3; +//static constexpr int S = 4; +//static constexpr int T = 5; +//static constexpr int B = 6; +//static constexpr int NE = 7; +//static constexpr int SW = 8; +//static constexpr int SE = 9; +//static constexpr int NW = 10; +//static constexpr int TE = 11; +//static constexpr int BW = 12; +//static constexpr int BE = 13; +//static constexpr int TW = 14; +//static constexpr int TN = 15; +//static constexpr int BS = 16; +//static constexpr int BN = 17; +//static constexpr int TS = 18; +//static constexpr int TNE = 19; +//static constexpr int TNW = 20; +//static constexpr int TSE = 21; +//static constexpr int TSW = 22; +//static constexpr int BNE = 23; +//static constexpr int BNW = 24; +//static constexpr int BSE = 25; +//static constexpr int BSW = 26; + +static constexpr int DIR_000 = 0; +static constexpr int DIR_P00 = 1; +static constexpr int DIR_M00 = 2; +static constexpr int DIR_0P0 = 3; +static constexpr int DIR_0M0 = 4; +static constexpr int DIR_00P = 5; +static constexpr int DIR_00M = 6; +static constexpr int DIR_PP0 = 7; +static constexpr int DIR_MM0 = 8; +static constexpr int DIR_PM0 = 9; +static constexpr int DIR_MP0 = 10; +static constexpr int DIR_P0P = 11; +static constexpr int DIR_M0M = 12; +static constexpr int DIR_P0M = 13; +static constexpr int DIR_M0P = 14; +static constexpr int DIR_0PP = 15; +static constexpr int DIR_0MM = 16; +static constexpr int DIR_0PM = 17; +static constexpr int DIR_0MP = 18; +static constexpr int DIR_PPP = 19; +static constexpr int DIR_MPP = 20; +static constexpr int DIR_PMP = 21; +static constexpr int DIR_MMP = 22; +static constexpr int DIR_PPM = 23; +static constexpr int DIR_MPM = 24; +static constexpr int DIR_PMM = 25; +static constexpr int DIR_MMM = 26; + +static constexpr int INV_P00 = DIR_M00; +static constexpr int INV_M00 = DIR_P00; +static constexpr int INV_0P0 = DIR_0M0; +static constexpr int INV_0M0 = DIR_0P0; +static constexpr int INV_00P = DIR_00M; +static constexpr int INV_00M = DIR_00P; +static constexpr int INV_PP0 = DIR_MM0; +static constexpr int INV_MM0 = DIR_PP0; +static constexpr int INV_PM0 = DIR_MP0; +static constexpr int INV_MP0 = DIR_PM0; +static constexpr int INV_P0P = DIR_M0M; +static constexpr int INV_M0M = DIR_P0P; +static constexpr int INV_P0M = DIR_M0P; +static constexpr int INV_M0P = DIR_P0M; +static constexpr int INV_0PP = DIR_0MM; +static constexpr int INV_0MM = DIR_0PP; +static constexpr int INV_0PM = DIR_0MP; +static constexpr int INV_0MP = DIR_0PM; +static constexpr int INV_PPP = DIR_MMM; +static constexpr int INV_MPP = DIR_PMM; +static constexpr int INV_PMP = DIR_MPM; +static constexpr int INV_MMP = DIR_PPM; +static constexpr int INV_PPM = DIR_MMP; +static constexpr int INV_MPM = DIR_PMP; +static constexpr int INV_PMM = DIR_MPP; +static constexpr int INV_MMM = DIR_PPP; extern const int INVDIR[ENDDIR + 1]; @@ -147,6 +210,181 @@ static const int ET_BNW = 11; static const int ET_TSW = 12; static const int ET_BNE = 12; +////////////////////////////////////////////////////////////////////////// +inline std::string getDirectionString(int direction) +{ + switch (direction) { + case DIR_P00: + return "E"; + case DIR_M00: + return "W"; + case DIR_0P0: + return "N"; + case DIR_0M0: + return "S"; + case DIR_00P: + return "T"; + case DIR_00M: + return "B"; + case DIR_PP0: + return "NE"; + case DIR_MP0: + return "NW"; + case DIR_PM0: + return "SE"; + case DIR_MM0: + return "SW"; + case DIR_P0P: + return "TE"; + case DIR_M0P: + return "TW"; + case DIR_P0M: + return "BE"; + case DIR_M0M: + return "BW"; + case DIR_0PP: + return "TN"; + case DIR_0MP: + return "TS"; + case DIR_0PM: + return "BN"; + case DIR_0MM: + return "BS"; + case DIR_PPP: + return "TNE"; + case DIR_MPP: + return "TNW"; + case DIR_PMP: + return "TSE"; + case DIR_MMP: + return "TSW"; + case DIR_PPM: + return "BNE"; + case DIR_MPM: + return "BNW"; + case DIR_PMM: + return "BSE"; + case DIR_MMM: + return "BSW"; + default: + return "Cell3DSystem::getDrectionString(...) - unknown dir"; + } +} +////////////////////////////////////////////////////////////////////////// +static inline void setNeighborCoordinatesForDirection(int &x1, int &x2, int &x3, const int &direction) +{ + switch (direction) { + case D3Q27System::DIR_P00: + x1++; + break; + case D3Q27System::DIR_0P0: + x2++; + break; + case D3Q27System::DIR_00P: + x3++; + break; + case D3Q27System::DIR_M00: + x1--; + break; + case D3Q27System::DIR_0M0: + x2--; + break; + case D3Q27System::DIR_00M: + x3--; + break; + case D3Q27System::DIR_PP0: + x1++; + x2++; + break; + case D3Q27System::DIR_MP0: + x1--; + x2++; + break; + case D3Q27System::DIR_MM0: + x1--; + x2--; + break; + case D3Q27System::DIR_PM0: + x1++; + x2--; + break; + case D3Q27System::DIR_P0P: + x1++; + x3++; + break; + case D3Q27System::DIR_M0M: + x1--; + x3--; + break; + case D3Q27System::DIR_P0M: + x1++; + x3--; + break; + case D3Q27System::DIR_M0P: + x1--; + x3++; + break; + case D3Q27System::DIR_0PP: + x2++; + x3++; + break; + case D3Q27System::DIR_0MM: + x2--; + x3--; + break; + case D3Q27System::DIR_0PM: + x2++; + x3--; + break; + case D3Q27System::DIR_0MP: + x2--; + x3++; + break; + case D3Q27System::DIR_PPP: + x1++; + x2++; + x3++; + break; + case D3Q27System::DIR_MPP: + x1--; + x2++; + x3++; + break; + case D3Q27System::DIR_PMP: + x1++; + x2--; + x3++; + break; + case D3Q27System::DIR_MMP: + x1--; + x2--; + x3++; + break; + case D3Q27System::DIR_PPM: + x1++; + x2++; + x3--; + break; + case D3Q27System::DIR_MPM: + x1--; + x2++; + x3--; + break; + case D3Q27System::DIR_PMM: + x1++; + x2--; + x3--; + break; + case D3Q27System::DIR_MMM: + x1--; + x2--; + x3--; + break; + default: + throw UbException(UB_EXARGS, "no direction ..."); + } +} + ////////////////////////////////////////////////////////////////////////// // MACROSCOPIC VALUES /*=====================================================================*/ @@ -164,69 +402,69 @@ LBMReal getIncompVelocityX3(const LBMReal *const &f /*[27]*/); /*=====================================================================*/ static void calcDensity(const LBMReal *const &f /*[27]*/, LBMReal &rho) { - rho = ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) + - (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) + - ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + - ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[REST]; + rho = ((f[DIR_PPP] + f[DIR_MMM]) + (f[DIR_PMP] + f[DIR_MPM])) + ((f[DIR_PMM] + f[DIR_MPP]) + (f[DIR_MMP] + f[DIR_PPM])) + + (((f[DIR_PP0] + f[DIR_MM0]) + (f[DIR_PM0] + f[DIR_MP0])) + ((f[DIR_P0P] + f[DIR_M0M]) + (f[DIR_P0M] + f[DIR_M0P])) + + ((f[DIR_0PM] + f[DIR_0MP]) + (f[DIR_0PP] + f[DIR_0MM]))) + + ((f[DIR_P00] + f[DIR_M00]) + (f[DIR_0P0] + f[DIR_0M0]) + (f[DIR_00P] + f[DIR_00M])) + f[DIR_000]; } /*=====================================================================*/ static void calcIncompVelocityX1(const LBMReal *const &f /*[27]*/, LBMReal &vx1) { - vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])); + vx1 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])); } /*=====================================================================*/ static void calcIncompVelocityX2(const LBMReal *const &f /*[27]*/, LBMReal &vx2) { - vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])); + vx2 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])); } /*=====================================================================*/ static void calcIncompVelocityX3(const LBMReal *const &f /*[27]*/, LBMReal &vx3) { - vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])); + vx3 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) + + (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])); } /*=====================================================================*/ static LBMReal getCompVelocityX1(const LBMReal *const &f /*[27]*/) { - return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) / + return ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])) / getDensity(f); } /*=====================================================================*/ static LBMReal getCompVelocityX2(const LBMReal *const &f /*[27]*/) { - return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) / + return ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])) / getDensity(f); } /*=====================================================================*/ static LBMReal getCompVelocityX3(const LBMReal *const &f /*[27]*/) { - return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) / + return ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) + + (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])) / getDensity(f); } /*=====================================================================*/ static void calcCompVelocityX1(const LBMReal *const &f /*[27]*/, LBMReal &vx1) { - vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) / + vx1 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_PMM] - f[DIR_MPP]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_P0M] - f[DIR_M0P]) + (f[DIR_P0P] - f[DIR_M0M])) + ((f[DIR_PM0] - f[DIR_MP0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_P00] - f[DIR_M00])) / getDensity(f); } /*=====================================================================*/ static void calcCompVelocityX2(const LBMReal *const &f /*[27]*/, LBMReal &vx2) { - vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) / + vx2 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_MPM] - f[DIR_PMP])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_PPM] - f[DIR_MMP]))) + + (((f[DIR_0PM] - f[DIR_0MP]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_MP0] - f[DIR_PM0]) + (f[DIR_PP0] - f[DIR_MM0]))) + (f[DIR_0P0] - f[DIR_0M0])) / getDensity(f); } /*=====================================================================*/ static void calcCompVelocityX3(const LBMReal *const &f /*[27]*/, LBMReal &vx3) { - vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) / + vx3 = ((((f[DIR_PPP] - f[DIR_MMM]) + (f[DIR_PMP] - f[DIR_MPM])) + ((f[DIR_MPP] - f[DIR_PMM]) + (f[DIR_MMP] - f[DIR_PPM]))) + + (((f[DIR_0MP] - f[DIR_0PM]) + (f[DIR_0PP] - f[DIR_0MM])) + ((f[DIR_M0P] - f[DIR_P0M]) + (f[DIR_P0P] - f[DIR_M0M]))) + (f[DIR_00P] - f[DIR_00M])) / getDensity(f); } /*=====================================================================*/ @@ -259,85 +497,85 @@ static LBMReal getCompFeqForDirection(const int &direction, const LBMReal &drho, LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); LBMReal rho = drho + UbMath::one; switch (direction) { - case REST: + case DIR_000: return REAL_CAST(UbMath::c8o27 * (drho + rho * (-cu_sq))); - case E: + case DIR_P00: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq))); - case W: + case DIR_M00: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq))); - case N: + case DIR_0P0: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq))); - case S: + case DIR_0M0: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq))); - case T: + case DIR_00P: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq))); - case B: + case DIR_00M: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq))); - case NE: + case DIR_PP0: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq))); - case SW: + case DIR_MM0: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq))); - case SE: + case DIR_PM0: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq))); - case NW: + case DIR_MP0: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq))); - case TE: + case DIR_P0P: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq))); - case BW: + case DIR_M0M: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq))); - case BE: + case DIR_P0M: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq))); - case TW: + case DIR_M0P: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq))); - case TN: + case DIR_0PP: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq))); - case BS: + case DIR_0MM: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq))); - case BN: + case DIR_0PM: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq))); - case TS: + case DIR_0MP: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq))); - case TNE: + case DIR_PPP: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq))); - case BSW: + case DIR_MMM: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq))); - case BNE: + case DIR_PPM: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq))); - case TSW: + case DIR_MMP: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq))); - case TSE: + case DIR_PMP: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq))); - case BNW: + case DIR_MPM: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq))); - case BSE: + case DIR_PMM: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq))); - case TNW: + case DIR_MPP: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq))); @@ -352,43 +590,43 @@ static void calcCompFeq(LBMReal *const &feq /*[27]*/, const LBMReal &drho, const LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); LBMReal rho = drho + UbMath::one; - feq[REST] = UbMath::c8o27 * (drho + rho * (-cu_sq)); - feq[E] = UbMath::c2o27 * (drho + rho * (3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq)); - feq[W] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq)); - feq[N] = UbMath::c2o27 * (drho + rho * (3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq)); - feq[S] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq)); - feq[T] = UbMath::c2o27 * (drho + rho * (3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq)); - feq[B] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq)); - feq[NE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); - feq[SW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); - feq[SE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); - feq[NW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); - feq[TE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); - feq[BW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); - feq[BE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); - feq[TW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); - feq[TN] = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); - feq[BS] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); - feq[BN] = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); - feq[TS] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); - feq[TNE] = UbMath::c1o216 * + feq[DIR_000] = UbMath::c8o27 * (drho + rho * (-cu_sq)); + feq[DIR_P00] = UbMath::c2o27 * (drho + rho * (3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq)); + feq[DIR_M00] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq)); + feq[DIR_0P0] = UbMath::c2o27 * (drho + rho * (3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq)); + feq[DIR_0M0] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq)); + feq[DIR_00P] = UbMath::c2o27 * (drho + rho * (3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq)); + feq[DIR_00M] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq)); + feq[DIR_PP0] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); + feq[DIR_MM0] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); + feq[DIR_PM0] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); + feq[DIR_MP0] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); + feq[DIR_P0P] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); + feq[DIR_M0M] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); + feq[DIR_P0M] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); + feq[DIR_M0P] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); + feq[DIR_0PP] = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); + feq[DIR_0MM] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); + feq[DIR_0PM] = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); + feq[DIR_0MP] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); + feq[DIR_PPP] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); - feq[BSW] = + feq[DIR_MMM] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); - feq[BNE] = UbMath::c1o216 * + feq[DIR_PPM] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); - feq[TSW] = + feq[DIR_MMP] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); - feq[TSE] = UbMath::c1o216 * + feq[DIR_PMP] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); - feq[BNW] = + feq[DIR_MPM] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); - feq[BSE] = UbMath::c1o216 * + feq[DIR_PMM] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); - feq[TNW] = + feq[DIR_MPP] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); } @@ -399,78 +637,78 @@ static LBMReal getIncompFeqForDirection(const int &direction, const LBMReal &drh LBMReal cu_sq = 1.5f * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); switch (direction) { - case REST: + case DIR_000: return REAL_CAST(UbMath::c8o27 * (drho - cu_sq)); - case E: + case DIR_P00: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq)); - case W: + case DIR_M00: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq)); - case N: + case DIR_0P0: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq)); - case S: + case DIR_0M0: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq)); - case T: + case DIR_00P: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq)); - case B: + case DIR_00M: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq)); - case NE: + case DIR_PP0: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); - case SW: + case DIR_MM0: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); - case SE: + case DIR_PM0: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); - case NW: + case DIR_MP0: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); - case TE: + case DIR_P0P: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); - case BW: + case DIR_M0M: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); - case BE: + case DIR_P0M: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); - case TW: + case DIR_M0P: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); - case TN: + case DIR_0PP: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); - case BS: + case DIR_0MM: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); - case BN: + case DIR_0PM: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); - case TS: + case DIR_0MP: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); - case TNE: + case DIR_PPP: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); - case BSW: + case DIR_MMM: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); - case BNE: + case DIR_PPM: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); - case TSW: + case DIR_MMP: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); - case TSE: + case DIR_PMP: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); - case BNW: + case DIR_MPM: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); - case BSE: + case DIR_PMM: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); - case TNW: + case DIR_MPP: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); default: @@ -483,40 +721,40 @@ static void calcIncompFeq(LBMReal *const &feq /*[27]*/, const LBMReal &drho, con { LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - feq[REST] = UbMath::c8o27 * (drho - cu_sq); - feq[E] = UbMath::c2o27 * (drho + 3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq); - feq[W] = UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq); - feq[N] = UbMath::c2o27 * (drho + 3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq); - feq[S] = UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq); - feq[T] = UbMath::c2o27 * (drho + 3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq); - feq[B] = UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq); - feq[NE] = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); - feq[SW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); - feq[SE] = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); - feq[NW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); - feq[TE] = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); - feq[BW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); - feq[BE] = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); - feq[TW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); - feq[TN] = UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); - feq[BS] = UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); - feq[BN] = UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); - feq[TS] = UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); - feq[TNE] = UbMath::c1o216 * + feq[DIR_000] = UbMath::c8o27 * (drho - cu_sq); + feq[DIR_P00] = UbMath::c2o27 * (drho + 3.0 * (vx1) + UbMath::c9o2 * (vx1) * (vx1)-cu_sq); + feq[DIR_M00] = UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq); + feq[DIR_0P0] = UbMath::c2o27 * (drho + 3.0 * (vx2) + UbMath::c9o2 * (vx2) * (vx2)-cu_sq); + feq[DIR_0M0] = UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq); + feq[DIR_00P] = UbMath::c2o27 * (drho + 3.0 * (vx3) + UbMath::c9o2 * (vx3) * (vx3)-cu_sq); + feq[DIR_00M] = UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq); + feq[DIR_PP0] = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); + feq[DIR_MM0] = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); + feq[DIR_PM0] = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); + feq[DIR_MP0] = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); + feq[DIR_P0P] = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); + feq[DIR_M0M] = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); + feq[DIR_P0M] = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); + feq[DIR_M0P] = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); + feq[DIR_0PP] = UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); + feq[DIR_0MM] = UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); + feq[DIR_0PM] = UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); + feq[DIR_0MP] = UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); + feq[DIR_PPP] = UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq); - feq[BSW] = UbMath::c1o216 * + feq[DIR_MMM] = UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq); - feq[BNE] = UbMath::c1o216 * + feq[DIR_PPM] = UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq); - feq[TSW] = UbMath::c1o216 * + feq[DIR_MMP] = UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq); - feq[TSE] = UbMath::c1o216 * + feq[DIR_PMP] = UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq); - feq[BNW] = UbMath::c1o216 * + feq[DIR_MPM] = UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq); - feq[BSE] = UbMath::c1o216 * + feq[DIR_PMM] = UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq); - feq[TNW] = UbMath::c1o216 * + feq[DIR_MPP] = UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq); } ////////////////////////////////////////////////////////////////////////// @@ -524,57 +762,57 @@ static inline float getBoundaryVelocityForDirection(const int &direction, const const float &bcVelocityX2, const float &bcVelocityX3) { switch (direction) { - case E: + case DIR_P00: return (float)(UbMath::c4o9 * (+bcVelocityX1)); - case W: + case DIR_M00: return (float)(UbMath::c4o9 * (-bcVelocityX1)); - case N: + case DIR_0P0: return (float)(UbMath::c4o9 * (+bcVelocityX2)); - case S: + case DIR_0M0: return (float)(UbMath::c4o9 * (-bcVelocityX2)); - case T: + case DIR_00P: return (float)(UbMath::c4o9 * (+bcVelocityX3)); - case B: + case DIR_00M: return (float)(UbMath::c4o9 * (-bcVelocityX3)); - case NE: + case DIR_PP0: return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2)); - case SW: + case DIR_MM0: return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2)); - case SE: + case DIR_PM0: return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2)); - case NW: + case DIR_MP0: return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2)); - case TE: + case DIR_P0P: return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3)); - case BW: + case DIR_M0M: return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3)); - case BE: + case DIR_P0M: return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3)); - case TW: + case DIR_M0P: return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3)); - case TN: + case DIR_0PP: return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3)); - case BS: + case DIR_0MM: return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3)); - case BN: + case DIR_0PM: return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3)); - case TS: + case DIR_0MP: return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3)); - case TNE: + case DIR_PPP: return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); - case BSW: + case DIR_MMM: return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); - case BNE: + case DIR_PPM: return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); - case TSW: + case DIR_MMP: return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); - case TSE: + case DIR_PMP: return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); - case BNW: + case DIR_MPM: return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); - case BSE: + case DIR_PMM: return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); - case TNW: + case DIR_MPP: return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); default: throw UbException(UB_EXARGS, "unknown direction"); @@ -612,15 +850,15 @@ static std::vector<int> getEX(const int &exn) ex.resize(ENDDIR + 1); switch (exn) { case 1: - for (int dir = STARTDIR; dir < ENDDIR; ++dir) + for (int dir = STARTDIR; dir <= ENDDIR; ++dir) ex[dir] = DX1[dir]; break; case 2: - for (int dir = STARTDIR; dir < ENDDIR; ++dir) + for (int dir = STARTDIR; dir <= ENDDIR; ++dir) ex[dir] = DX2[dir]; break; case 3: - for (int dir = STARTDIR; dir < ENDDIR; ++dir) + for (int dir = STARTDIR; dir <= ENDDIR; ++dir) ex[dir] = DX3[dir]; break; } @@ -631,28 +869,28 @@ static inline void calcDistanceToNeighbors(std::vector<double> &distNeigh, const { // distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1); - distNeigh[E] = distNeigh[W] = distNeigh[N] = deltaX1; - distNeigh[S] = distNeigh[T] = distNeigh[B] = deltaX1; - distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = UbMath::sqrt2 * deltaX1; - distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = UbMath::sqrt2 * deltaX1; - distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = UbMath::sqrt2 * deltaX1; - distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = UbMath::sqrt3 * deltaX1; - distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = UbMath::sqrt3 * deltaX1; + distNeigh[DIR_P00] = distNeigh[DIR_M00] = distNeigh[DIR_0P0] = deltaX1; + distNeigh[DIR_0M0] = distNeigh[DIR_00P] = distNeigh[DIR_00M] = deltaX1; + distNeigh[DIR_PP0] = distNeigh[DIR_MP0] = distNeigh[DIR_MM0] = distNeigh[DIR_PM0] = UbMath::sqrt2 * deltaX1; + distNeigh[DIR_P0P] = distNeigh[DIR_0PP] = distNeigh[DIR_M0P] = distNeigh[DIR_0MP] = UbMath::sqrt2 * deltaX1; + distNeigh[DIR_P0M] = distNeigh[DIR_0PM] = distNeigh[DIR_M0M] = distNeigh[DIR_0MM] = UbMath::sqrt2 * deltaX1; + distNeigh[DIR_PPP] = distNeigh[DIR_MPP] = distNeigh[DIR_PMP] = distNeigh[DIR_MMP] = UbMath::sqrt3 * deltaX1; + distNeigh[DIR_PPM] = distNeigh[DIR_MPM] = distNeigh[DIR_PMM] = distNeigh[DIR_MMM] = UbMath::sqrt3 * deltaX1; } ////////////////////////////////////////////////////////////////////////// static inline void calcDistanceToNeighbors(std::vector<double> &distNeigh, const double &deltaX1, const double &deltaX2, const double &deltaX3) { // distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1); - distNeigh[E] = distNeigh[W] = deltaX1; - distNeigh[N] = distNeigh[S] = deltaX2; - distNeigh[T] = distNeigh[B] = deltaX3; - distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2); - distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt(deltaX1 * deltaX1 + deltaX3 * deltaX3); - distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt(deltaX2 * deltaX2 + deltaX3 * deltaX3); - distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = + distNeigh[DIR_P00] = distNeigh[DIR_M00] = deltaX1; + distNeigh[DIR_0P0] = distNeigh[DIR_0M0] = deltaX2; + distNeigh[DIR_00P] = distNeigh[DIR_00M] = deltaX3; + distNeigh[DIR_PP0] = distNeigh[DIR_MP0] = distNeigh[DIR_MM0] = distNeigh[DIR_PM0] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2); + distNeigh[DIR_P0P] = distNeigh[DIR_0PP] = distNeigh[DIR_M0P] = distNeigh[DIR_0MP] = sqrt(deltaX1 * deltaX1 + deltaX3 * deltaX3); + distNeigh[DIR_P0M] = distNeigh[DIR_0PM] = distNeigh[DIR_M0M] = distNeigh[DIR_0MM] = sqrt(deltaX2 * deltaX2 + deltaX3 * deltaX3); + distNeigh[DIR_PPP] = distNeigh[DIR_MPP] = distNeigh[DIR_PMP] = distNeigh[DIR_MMP] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3); - distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = + distNeigh[DIR_PPM] = distNeigh[DIR_MPM] = distNeigh[DIR_PMM] = distNeigh[DIR_MMM] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3); } ////////////////////////////////////////////////////////////////////////// @@ -661,107 +899,107 @@ static inline void initRayVectors(double *const &rayX1, double *const &rayX2, do int fdir; double c1oS2 = UbMath::one_over_sqrt2; double c1oS3 = UbMath::one_over_sqrt3; - fdir = E; + fdir = DIR_P00; rayX1[fdir] = 1.0; rayX2[fdir] = 0.0; rayX3[fdir] = 0.0; - fdir = W; + fdir = DIR_M00; rayX1[fdir] = -1.0; rayX2[fdir] = 0.0; rayX3[fdir] = 0.0; - fdir = N; + fdir = DIR_0P0; rayX1[fdir] = 0.0; rayX2[fdir] = 1.0; rayX3[fdir] = 0.0; - fdir = S; + fdir = DIR_0M0; rayX1[fdir] = 0.0; rayX2[fdir] = -1.0; rayX3[fdir] = 0.0; - fdir = T; + fdir = DIR_00P; rayX1[fdir] = 0.0; rayX2[fdir] = 0.0; rayX3[fdir] = 1.0; - fdir = B; + fdir = DIR_00M; rayX1[fdir] = 0.0; rayX2[fdir] = 0.0; rayX3[fdir] = -1.0; - fdir = NE; + fdir = DIR_PP0; rayX1[fdir] = c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] = 0.0; - fdir = SW; + fdir = DIR_MM0; rayX1[fdir] = -c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] = 0.0; - fdir = SE; + fdir = DIR_PM0; rayX1[fdir] = c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] = 0.0; - fdir = NW; + fdir = DIR_MP0; rayX1[fdir] = -c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] = 0.0; - fdir = TE; + fdir = DIR_P0P; rayX1[fdir] = c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = c1oS2; - fdir = BW; + fdir = DIR_M0M; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = -c1oS2; - fdir = BE; + fdir = DIR_P0M; rayX1[fdir] = c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = -c1oS2; - fdir = TW; + fdir = DIR_M0P; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = c1oS2; - fdir = TN; + fdir = DIR_0PP; rayX1[fdir] = 0.0; rayX2[fdir] = c1oS2; rayX3[fdir] = c1oS2; - fdir = BS; + fdir = DIR_0MM; rayX1[fdir] = 0.0; rayX2[fdir] = -c1oS2; rayX3[fdir] = -c1oS2; - fdir = BN; + fdir = DIR_0PM; rayX1[fdir] = 0.0; rayX2[fdir] = c1oS2; rayX3[fdir] = -c1oS2; - fdir = TS; + fdir = DIR_0MP; rayX1[fdir] = 0.0; rayX2[fdir] = -c1oS2; rayX3[fdir] = c1oS2; - fdir = TNE; + fdir = DIR_PPP; rayX1[fdir] = c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = c1oS3; - fdir = TNW; + fdir = DIR_MPP; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = c1oS3; - fdir = TSE; + fdir = DIR_PMP; rayX1[fdir] = c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = c1oS3; - fdir = TSW; + fdir = DIR_MMP; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = c1oS3; - fdir = BNE; + fdir = DIR_PPM; rayX1[fdir] = c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = -c1oS3; - fdir = BNW; + fdir = DIR_MPM; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = -c1oS3; - fdir = BSE; + fdir = DIR_PMM; rayX1[fdir] = c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3; - fdir = BSW; + fdir = DIR_MMM; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3; @@ -770,9 +1008,9 @@ static inline void initRayVectors(double *const &rayX1, double *const &rayX2, do static inline LBMReal calcPress(const LBMReal *const f, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3) { LBMReal op = 1.0; - return ((f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + - 2. * (f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS]) + - 3. * (f[TNE] + f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]) - + return ((f[DIR_P00] + f[DIR_M00] + f[DIR_0P0] + f[DIR_0M0] + f[DIR_00P] + f[DIR_00M] + + 2. * (f[DIR_PP0] + f[DIR_MM0] + f[DIR_PM0] + f[DIR_MP0] + f[DIR_P0P] + f[DIR_M0M] + f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] + f[DIR_0MM] + f[DIR_0PM] + f[DIR_0MP]) + + 3. * (f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] + f[DIR_MMM] + f[DIR_PMM] + f[DIR_MPM]) - (vx1 * vx1 + vx2 * vx2 + vx3 * vx3)) * (1 - 0.5 * op) + op * 0.5 * (rho)) * @@ -781,35 +1019,35 @@ static inline LBMReal calcPress(const LBMReal *const f, LBMReal rho, LBMReal vx1 ////////////////////////////////////////////////////////////////////////// static inline LBMReal getShearRate(const LBMReal *const f, LBMReal collFactorF) { - LBMReal mfcbb = f[E]; - LBMReal mfbcb = f[N]; - LBMReal mfbbc = f[T]; - LBMReal mfccb = f[NE]; - LBMReal mfacb = f[NW]; - LBMReal mfcbc = f[TE]; - LBMReal mfabc = f[TW]; - LBMReal mfbcc = f[TN]; - LBMReal mfbac = f[TS]; - LBMReal mfccc = f[TNE]; - LBMReal mfacc = f[TNW]; - LBMReal mfcac = f[TSE]; - LBMReal mfaac = f[TSW]; + LBMReal mfcbb = f[DIR_P00]; + LBMReal mfbcb = f[DIR_0P0]; + LBMReal mfbbc = f[DIR_00P]; + LBMReal mfccb = f[DIR_PP0]; + LBMReal mfacb = f[DIR_MP0]; + LBMReal mfcbc = f[DIR_P0P]; + LBMReal mfabc = f[DIR_M0P]; + LBMReal mfbcc = f[DIR_0PP]; + LBMReal mfbac = f[DIR_0MP]; + LBMReal mfccc = f[DIR_PPP]; + LBMReal mfacc = f[DIR_MPP]; + LBMReal mfcac = f[DIR_PMP]; + LBMReal mfaac = f[DIR_MMP]; - LBMReal mfabb = f[W]; - LBMReal mfbab = f[S]; - LBMReal mfbba = f[B]; - LBMReal mfaab = f[SW]; - LBMReal mfcab = f[SE]; - LBMReal mfaba = f[BW]; - LBMReal mfcba = f[BE]; - LBMReal mfbaa = f[BS]; - LBMReal mfbca = f[BN]; - LBMReal mfaaa = f[BSW]; - LBMReal mfcaa = f[BSE]; - LBMReal mfaca = f[BNW]; - LBMReal mfcca = f[BNE]; + LBMReal mfabb = f[DIR_M00]; + LBMReal mfbab = f[DIR_0M0]; + LBMReal mfbba = f[DIR_00M]; + LBMReal mfaab = f[DIR_MM0]; + LBMReal mfcab = f[DIR_PM0]; + LBMReal mfaba = f[DIR_M0M]; + LBMReal mfcba = f[DIR_P0M]; + LBMReal mfbaa = f[DIR_0MM]; + LBMReal mfbca = f[DIR_0PM]; + LBMReal mfaaa = f[DIR_MMM]; + LBMReal mfcaa = f[DIR_PMM]; + LBMReal mfaca = f[DIR_MPM]; + LBMReal mfcca = f[DIR_PPM]; - LBMReal mfbbb = f[REST]; + LBMReal mfbbb = f[DIR_000]; LBMReal m0, m1, m2; @@ -1113,40 +1351,40 @@ static void calcMultiphaseFeq(LBMReal *const &feq /*[27]*/, const LBMReal &rho, using namespace UbMath; LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - feq[REST] = c8o27 * (p1 + rho * c1o3 * (-cu_sq)); - feq[E] = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq)); - feq[W] = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)); - feq[N] = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq)); - feq[S] = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)); - feq[T] = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq)); - feq[B] = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)); - feq[NE] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); - feq[SW] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); - feq[SE] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); - feq[NW] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); - feq[TE] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); - feq[BW] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); - feq[BE] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); - feq[TW] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); - feq[TN] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); - feq[BS] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); - feq[BN] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); - feq[TS] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); - feq[TNE] = + feq[DIR_000] = c8o27 * (p1 + rho * c1o3 * (-cu_sq)); + feq[DIR_P00] = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq)); + feq[DIR_M00] = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)); + feq[DIR_0P0] = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq)); + feq[DIR_0M0] = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)); + feq[DIR_00P] = c2o27 * (p1 + rho * c1o3 * (3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq)); + feq[DIR_00M] = c2o27 * (p1 + rho * c1o3 * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)); + feq[DIR_PP0] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); + feq[DIR_MM0] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); + feq[DIR_PM0] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); + feq[DIR_MP0] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); + feq[DIR_P0P] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); + feq[DIR_M0M] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); + feq[DIR_P0M] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); + feq[DIR_M0P] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); + feq[DIR_0PP] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); + feq[DIR_0MM] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); + feq[DIR_0PM] = c1o54 * (p1 + rho * c1o3 * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); + feq[DIR_0MP] = c1o54 * (p1 + rho * c1o3 * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); + feq[DIR_PPP] = c1o216 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); - feq[BSW] = c1o216 * + feq[DIR_MMM] = c1o216 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); - feq[BNE] = + feq[DIR_PPM] = c1o216 * (p1 + rho * c1o3 * (3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); - feq[TSW] = c1o216 * + feq[DIR_MMP] = c1o216 * (p1 + rho * c1o3 * (3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); - feq[TSE] = + feq[DIR_PMP] = c1o216 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); - feq[BNW] = c1o216 * + feq[DIR_MPM] = c1o216 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); - feq[BSE] = + feq[DIR_PMM] = c1o216 * (p1 + rho * c1o3 * (3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); - feq[TNW] = c1o216 * + feq[DIR_MPP] = c1o216 * (p1 + rho * c1o3 * (3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); } ////////////////////////////////////////////////////////////////////////// @@ -1156,33 +1394,33 @@ static void calcMultiphaseFeqVB(LBMReal *const &feq /*[27]*/, const LBMReal &p1, using namespace UbMath; LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - feq[REST] = p1 + c8o27 * (-cu_sq); - feq[E] = c2o27 * ((3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq)); - feq[W] = c2o27 * ((3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)); - feq[N] = c2o27 * ((3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq)); - feq[S] = c2o27 * ((3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)); - feq[T] = c2o27 * ((3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq)); - feq[B] = c2o27 * ((3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)); - feq[NE] = c1o54 * ((3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); - feq[SW] = c1o54 * ((3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); - feq[SE] = c1o54 * ((3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); - feq[NW] = c1o54 * ((3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); - feq[TE] = c1o54 * ((3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); - feq[BW] = c1o54 * ((3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); - feq[BE] = c1o54 * ((3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); - feq[TW] = c1o54 * ((3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); - feq[TN] = c1o54 * ((3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); - feq[BS] = c1o54 * ((3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); - feq[BN] = c1o54 * ((3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); - feq[TS] = c1o54 * ((3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); - feq[TNE] = c1o216 * ((3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); - feq[BSW] = c1o216 * ((3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); - feq[BNE] = c1o216 * ((3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); - feq[TSW] = c1o216 * ((3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); - feq[TSE] = c1o216 * ((3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); - feq[BNW] = c1o216 * ((3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); - feq[BSE] = c1o216 * ((3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); - feq[TNW] = c1o216 * ((3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); + feq[DIR_000] = p1 + c8o27 * (-cu_sq); + feq[DIR_P00] = c2o27 * ((3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq)); + feq[DIR_M00] = c2o27 * ((3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)); + feq[DIR_0P0] = c2o27 * ((3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq)); + feq[DIR_0M0] = c2o27 * ((3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)); + feq[DIR_00P] = c2o27 * ((3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq)); + feq[DIR_00M] = c2o27 * ((3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)); + feq[DIR_PP0] = c1o54 * ((3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); + feq[DIR_MM0] = c1o54 * ((3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); + feq[DIR_PM0] = c1o54 * ((3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); + feq[DIR_MP0] = c1o54 * ((3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); + feq[DIR_P0P] = c1o54 * ((3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); + feq[DIR_M0M] = c1o54 * ((3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); + feq[DIR_P0M] = c1o54 * ((3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); + feq[DIR_M0P] = c1o54 * ((3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); + feq[DIR_0PP] = c1o54 * ((3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); + feq[DIR_0MM] = c1o54 * ((3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); + feq[DIR_0PM] = c1o54 * ((3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); + feq[DIR_0MP] = c1o54 * ((3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); + feq[DIR_PPP] = c1o216 * ((3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); + feq[DIR_MMM] = c1o216 * ((3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); + feq[DIR_PPM] = c1o216 * ((3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); + feq[DIR_MMP] = c1o216 * ((3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); + feq[DIR_PMP] = c1o216 * ((3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); + feq[DIR_MPM] = c1o216 * ((3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); + feq[DIR_PMM] = c1o216 * ((3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); + feq[DIR_MPP] = c1o216 * ((3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); } ////////////////////////////////////////////////////////////////////////// static void calcMultiphaseHeq(LBMReal *const &heq /*[27]*/, const LBMReal &phi, const LBMReal &vx1, const LBMReal &vx2, @@ -1191,35 +1429,34 @@ static void calcMultiphaseHeq(LBMReal *const &heq /*[27]*/, const LBMReal &phi, using namespace UbMath; LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - heq[REST] = c8o27 * phi * (1.0 - cu_sq); - heq[E] = c2o27 * phi * (1.0 + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq); - heq[W] = c2o27 * phi * (1.0 + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq); - heq[N] = c2o27 * phi * (1.0 + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq); - heq[S] = c2o27 * phi * (1.0 + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq); - heq[T] = c2o27 * phi * (1.0 + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq); - heq[B] = c2o27 * phi * (1.0 + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq); - heq[NE] = c1o54 * phi * (1.0 + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); - heq[SW] = c1o54 * phi * (1.0 + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); - heq[SE] = c1o54 * phi * (1.0 + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); - heq[NW] = c1o54 * phi * (1.0 + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); - heq[TE] = c1o54 * phi * (1.0 + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); - heq[BW] = c1o54 * phi * (1.0 + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); - heq[BE] = c1o54 * phi * (1.0 + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); - heq[TW] = c1o54 * phi * (1.0 + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); - heq[TN] = c1o54 * phi * (1.0 + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); - heq[BS] = c1o54 * phi * (1.0 + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); - heq[BN] = c1o54 * phi * (1.0 + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); - heq[TS] = c1o54 * phi * (1.0 + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); - heq[TNE] = c1o216 * phi * (1.0 + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq); - heq[BSW] = c1o216 * phi * (1.0 + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq); - heq[BNE] = c1o216 * phi * (1.0 + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq); - heq[TSW] = c1o216 * phi * (1.0 + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq); - heq[TSE] = c1o216 * phi * (1.0 + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq); - heq[BNW] = c1o216 * phi * (1.0 + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq); - heq[BSE] = c1o216 * phi * (1.0 + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq); - heq[TNW] = c1o216 * phi * (1.0 + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq); + heq[DIR_000] = c8o27 * phi * (1.0 - cu_sq); + heq[DIR_P00] = c2o27 * phi * (1.0 + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq); + heq[DIR_M00] = c2o27 * phi * (1.0 + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq); + heq[DIR_0P0] = c2o27 * phi * (1.0 + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq); + heq[DIR_0M0] = c2o27 * phi * (1.0 + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq); + heq[DIR_00P] = c2o27 * phi * (1.0 + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq); + heq[DIR_00M] = c2o27 * phi * (1.0 + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq); + heq[DIR_PP0] = c1o54 * phi * (1.0 + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); + heq[DIR_MM0] = c1o54 * phi * (1.0 + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); + heq[DIR_PM0] = c1o54 * phi * (1.0 + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); + heq[DIR_MP0] = c1o54 * phi * (1.0 + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); + heq[DIR_P0P] = c1o54 * phi * (1.0 + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); + heq[DIR_M0M] = c1o54 * phi * (1.0 + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); + heq[DIR_P0M] = c1o54 * phi * (1.0 + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); + heq[DIR_M0P] = c1o54 * phi * (1.0 + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); + heq[DIR_0PP] = c1o54 * phi * (1.0 + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); + heq[DIR_0MM] = c1o54 * phi * (1.0 + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); + heq[DIR_0PM] = c1o54 * phi * (1.0 + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); + heq[DIR_0MP] = c1o54 * phi * (1.0 + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); + heq[DIR_PPP] = c1o216 * phi * (1.0 + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq); + heq[DIR_MMM] = c1o216 * phi * (1.0 + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq); + heq[DIR_PPM] = c1o216 * phi * (1.0 + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq); + heq[DIR_MMP] = c1o216 * phi * (1.0 + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq); + heq[DIR_PMP] = c1o216 * phi * (1.0 + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq); + heq[DIR_MPM] = c1o216 * phi * (1.0 + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq); + heq[DIR_PMM] = c1o216 * phi * (1.0 + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq); + heq[DIR_MPP] = c1o216 * phi * (1.0 + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq); } -////////////////////////////////////////////////////////////////////////// } // namespace D3Q27System #endif diff --git a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp index 089b505a5f5d357e378c1e556caeffc3e51bc411..90bc1998454e980c86054934222b251699f1412a 100644 --- a/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/IncompressibleCumulantWithSpongeLayerLBMKernel.cpp @@ -68,37 +68,37 @@ void IncompressibleCumulantWithSpongeLayerLBMKernel::initRelaxFactor(int vdir, d { switch (direction) { - case D3Q27System::E: + case D3Q27System::DIR_P00: muX1 = (double)(x1 + ix1 * maxX1); if (muX1 >= (sizeX - sizeSP) / deltaT) spongeFactor = (sizeX - (muX1 * deltaT + 1)) / sizeSP / 2.0 + 0.5; else spongeFactor = 1.0; break; - case D3Q27System::W: + case D3Q27System::DIR_M00: muX1 = (double)(x1 + ix1 * maxX1); if (muX1 <= sizeSP / deltaT) spongeFactor = (sizeSP - (muX1 * deltaT + 1)) / sizeSP / 2.0 + 0.5; else spongeFactor = 1.0; break; - case D3Q27System::N: + case D3Q27System::DIR_0P0: muX2 = (double)(x2 + ix2 * maxX2); if (muX2 >= (sizeX - sizeSP) / deltaT) spongeFactor = (sizeX - (muX2 * deltaT + 1)) / sizeSP / 2.0 + 0.5; else spongeFactor = 1.0; break; - case D3Q27System::S: + case D3Q27System::DIR_0M0: muX2 = (double)(x2 + ix2 * maxX2); if (muX2 <= sizeSP / deltaT) spongeFactor = (sizeSP - (muX2 * deltaT + 1)) / sizeSP / 2.0 + 0.5; else spongeFactor = 1.0; break; - case D3Q27System::T: + case D3Q27System::DIR_00P: muX3 = (double)(x3 + ix3 * maxX3); if (muX3 >= (sizeX - sizeSP) / deltaT) spongeFactor = (sizeX - (muX3 * deltaT + 1)) / sizeSP / 2.0 + 0.5; else spongeFactor = 1.0; break; - case D3Q27System::B: + case D3Q27System::DIR_00M: muX3 = (double)(x3 + ix3 * maxX3); if (muX3 <= sizeSP / deltaT) spongeFactor = (sizeSP - (muX3 * deltaT + 1)) / sizeSP / 2.0 + 0.5; diff --git a/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp index 15e6f1dddb88f31e7bf57e2d3235e04b48da1080..39b83f72a835ade4f903910a502383c6e3cd2323 100644 --- a/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/IncompressibleOffsetInterpolationProcessor.cpp @@ -61,7 +61,7 @@ void IncompressibleOffsetInterpolationProcessor::calcMoments(const LBMReal* cons { using namespace D3Q27System; - //UBLOG(logINFO,"D3Q27System::BW = " << D3Q27System::BW); + //UBLOG(logINFO,"D3Q27System::DIR_M0M = " << D3Q27System::DIR_M0M); //UBLOG(logINFO,"BW = " << BW); LBMReal rho = 0.0; @@ -82,14 +82,14 @@ void IncompressibleOffsetInterpolationProcessor::calcMoments(const LBMReal* cons //press = D3Q27System::calcPress(f,rho,vx1,vx2,vx3); press = rho; //interpolate rho! - kxy = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))-(vx1*vx2));// might not be optimal MG 25.2.13 - kyz = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))-(vx2*vx3)); - kxz = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))-(vx1*vx3)); - kxxMyy = -3./2.*omega*((((f[D3Q27System::BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))-(vx1*vx1-vx2*vx2)); - kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))-(vx1*vx1-vx3*vx3)); - //kxxMzz = -3./2.*omega*(((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[E])-(f[B]+f[T])))-(vx1*vx1-vx3*vx3)); + kxy = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))-(vx1*vx2));// might not be optimal MG 25.2.13 + kyz = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))-(vx2*vx3)); + kxz = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))-(vx1*vx3)); + kxxMyy = -3./2.*omega*((((f[D3Q27System::DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))-(vx1*vx1-vx2*vx2)); + kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))-(vx1*vx1-vx3*vx3)); + //kxxMzz = -3./2.*omega*(((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[DIR_P00])-(f[B]+f[T])))-(vx1*vx1-vx3*vx3)); - //UBLOG(logINFO, "t1 = "<<(((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))); + //UBLOG(logINFO, "t1 = "<<(((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[17]+f[BN])))+((f[W]+f[DIR_P00])-(f[B]+f[T]))); //UBLOG(logINFO, "kxxMzz = "<<kxxMzz); //UBLOG(logINFO,"f[BW] = " << f[BW] << " BW = " << BW); @@ -543,33 +543,33 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNode(LBMReal* f LBMReal feq[ENDF+1]; D3Q27System::calcIncompFeq(feq,rho,vx1,vx2,vx3); - f[E] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[E]; - f[W] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[W]; - f[N] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[N]; - f[S] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[S]; - f[T] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[T]; - f[B] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[B]; - f[NE] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[NE]; - f[SW] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[SW]; - f[SE] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[SE]; - f[NW] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[NW]; - f[TE] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[TE]; - f[BW] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[BW]; - f[BE] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[BE]; - f[TW] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[TW]; - f[TN] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[TN]; - f[BS] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[BS]; - f[BN] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[BN]; - f[TS] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[TS]; - f[TNE] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[TNE]; - f[TSW] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[TSW]; - f[TSE] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[TSE]; - f[TNW] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[TNW]; - f[BNE] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[BNE]; - f[BSW] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[BSW]; - f[BSE] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[BSE]; - f[BNW] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[BNW]; - f[REST] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO + feq[REST]; + f[DIR_P00] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[DIR_P00]; + f[DIR_M00] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[DIR_M00]; + f[DIR_0P0] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[DIR_0P0]; + f[DIR_0M0] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[DIR_0M0]; + f[DIR_00P] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[DIR_00P]; + f[DIR_00M] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[DIR_00M]; + f[DIR_PP0] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[DIR_PP0]; + f[DIR_MM0] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[DIR_MM0]; + f[DIR_PM0] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[DIR_PM0]; + f[DIR_MP0] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[DIR_MP0]; + f[DIR_P0P] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[DIR_P0P]; + f[DIR_M0M] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[DIR_M0M]; + f[DIR_P0M] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[DIR_P0M]; + f[DIR_M0P] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[DIR_M0P]; + f[DIR_0PP] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[DIR_0PP]; + f[DIR_0MM] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[DIR_0MM]; + f[DIR_0PM] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[DIR_0PM]; + f[DIR_0MP] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[DIR_0MP]; + f[DIR_PPP] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[DIR_PPP]; + f[DIR_MMP] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[DIR_MMP]; + f[DIR_PMP] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[DIR_PMP]; + f[DIR_MPP] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[DIR_MPP]; + f[DIR_PPM] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[DIR_PPM]; + f[DIR_MMM] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[DIR_MMM]; + f[DIR_PMM] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[DIR_PMM]; + f[DIR_MPM] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[DIR_MPM]; + f[DIR_000] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO + feq[DIR_000]; } ////////////////////////////////////////////////////////////////////////// //Position SWB -0.25, -0.25, -0.25 @@ -737,33 +737,33 @@ void IncompressibleOffsetInterpolationProcessor::calcInterpolatedNodeFC(LBMReal* f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o)); f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o)); - f[E] = f_E + feq[E]; - f[W] = f_E + feq[W]; - f[N] = f_N + feq[N]; - f[S] = f_N + feq[S]; - f[T] = f_T + feq[T]; - f[B] = f_T + feq[B]; - f[NE] = f_NE + feq[NE]; - f[SW] = f_NE + feq[SW]; - f[SE] = f_SE + feq[SE]; - f[NW] = f_SE + feq[NW]; - f[TE] = f_TE + feq[TE]; - f[BW] = f_TE + feq[BW]; - f[BE] = f_BE + feq[BE]; - f[TW] = f_BE + feq[TW]; - f[TN] = f_TN + feq[TN]; - f[BS] = f_TN + feq[BS]; - f[BN] = f_BN + feq[BN]; - f[TS] = f_BN + feq[TS]; - f[TNE] = f_TNE + feq[TNE]; - f[TNW] = f_TNW + feq[TNW]; - f[TSE] = f_TSE + feq[TSE]; - f[TSW] = f_TSW + feq[TSW]; - f[BNE] = f_TSW + feq[BNE]; - f[BNW] = f_TSE + feq[BNW]; - f[BSE] = f_TNW + feq[BSE]; - f[BSW] = f_TNE + feq[BSW]; - f[REST] = f_ZERO + feq[REST]; + f[DIR_P00] = f_E + feq[DIR_P00]; + f[DIR_M00] = f_E + feq[DIR_M00]; + f[DIR_0P0] = f_N + feq[DIR_0P0]; + f[DIR_0M0] = f_N + feq[DIR_0M0]; + f[DIR_00P] = f_T + feq[DIR_00P]; + f[DIR_00M] = f_T + feq[DIR_00M]; + f[DIR_PP0] = f_NE + feq[DIR_PP0]; + f[DIR_MM0] = f_NE + feq[DIR_MM0]; + f[DIR_PM0] = f_SE + feq[DIR_PM0]; + f[DIR_MP0] = f_SE + feq[DIR_MP0]; + f[DIR_P0P] = f_TE + feq[DIR_P0P]; + f[DIR_M0M] = f_TE + feq[DIR_M0M]; + f[DIR_P0M] = f_BE + feq[DIR_P0M]; + f[DIR_M0P] = f_BE + feq[DIR_M0P]; + f[DIR_0PP] = f_TN + feq[DIR_0PP]; + f[DIR_0MM] = f_TN + feq[DIR_0MM]; + f[DIR_0PM] = f_BN + feq[DIR_0PM]; + f[DIR_0MP] = f_BN + feq[DIR_0MP]; + f[DIR_PPP] = f_TNE + feq[DIR_PPP]; + f[DIR_MPP] = f_TNW + feq[DIR_MPP]; + f[DIR_PMP] = f_TSE + feq[DIR_PMP]; + f[DIR_MMP] = f_TSW + feq[DIR_MMP]; + f[DIR_PPM] = f_TSW + feq[DIR_PPM]; + f[DIR_MPM] = f_TSE + feq[DIR_MPM]; + f[DIR_PMM] = f_TNW + feq[DIR_PMM]; + f[DIR_MMM] = f_TNE + feq[DIR_MMM]; + f[DIR_000] = f_ZERO + feq[DIR_000]; } ////////////////////////////////////////////////////////////////////////// void IncompressibleOffsetInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3) diff --git a/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp index 554fc6614c11e2e8b96f5829d81d1c27e9365870..c37571337e537c324b557ac6c76680a63fc89b00 100644 --- a/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/InitDensityLBMKernel.cpp @@ -894,45 +894,45 @@ void InitDensityLBMKernel::calculate(int /*step*/) ////////////////////////////////////////////////////////////////////////// //read distribution //////////////////////////////////////////////////////////////////////////// - f[REST] = (*this->zeroDistributions)(x1, x2, x3); + f[DIR_000] = (*this->zeroDistributions)(x1, x2, x3); - f[E] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); - f[N] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); - f[T] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); - f[NE] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); - f[NW] = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3); - f[TE] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); - f[TW] = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3); - f[TN] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); - f[TS] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3); - f[TNE] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); - f[TNW] = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3); - f[TSE] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3); - f[TSW] = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3); + f[DIR_P00] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + f[DIR_0P0] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + f[DIR_00P] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + f[DIR_PP0] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + f[DIR_MP0] = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3); + f[DIR_P0P] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + f[DIR_M0P] = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3); + f[DIR_0PP] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + f[DIR_0MP] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3); + f[DIR_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + f[DIR_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3); + f[DIR_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3); + f[DIR_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3); - f[W] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3); - f[S] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3); - f[B] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p); - f[SW] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3); - f[SE] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3); - f[BW] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p); - f[BE] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p); - f[BS] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p); - f[BN] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p); - f[BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p); - f[BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p); - f[BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p); - f[BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p); + f[DIR_M00] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3); + f[DIR_0M0] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3); + f[DIR_00M] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p); + f[DIR_MM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3); + f[DIR_PM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3); + f[DIR_M0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p); + f[DIR_P0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p); + f[DIR_0MM] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p); + f[DIR_0PM] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p); + f[DIR_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p); + f[DIR_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p); + f[DIR_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p); + f[DIR_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p); ////////////////////////////////////////////////////////////////////////// - drho = ((f[TNE]+f[BSW])+(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])+(f[TSW]+f[BNE])) - +(((f[NE]+f[SW])+(f[SE]+f[NW]))+((f[TE]+f[BW])+(f[BE]+f[TW])) - +((f[BN]+f[TS])+(f[TN]+f[BS])))+((f[E]+f[W])+(f[N]+f[S]) - +(f[T]+f[B]))+f[REST]; + drho = ((f[DIR_PPP]+f[DIR_MMM])+(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])+(f[DIR_MMP]+f[DIR_PPM])) + +(((f[DIR_PP0]+f[DIR_MM0])+(f[DIR_PM0]+f[DIR_MP0]))+((f[DIR_P0P]+f[DIR_M0M])+(f[DIR_P0M]+f[DIR_M0P])) + +((f[DIR_0PM]+f[DIR_0MP])+(f[DIR_0PP]+f[DIR_0MM])))+((f[DIR_P00]+f[DIR_M00])+(f[DIR_0P0]+f[DIR_0M0]) + +(f[DIR_00P]+f[DIR_00M]))+f[DIR_000]; //vx1 = ((((f[TNE]-f[BSW])+(f[TSE]-f[BNW]))+((f[BSE]-f[TNW])+(f[BNE]-f[TSW])))+ // (((f[BE]-f[TW])+(f[TE]-f[BW]))+((f[SE]-f[NW])+(f[NE]-f[SW])))+ - // (f[E]-f[W])); + // (f[DIR_P00]-f[W])); //vx2 = ((((f[TNE]-f[BSW])+(f[BNW]-f[TSE]))+((f[TNW]-f[BSE])+(f[BNE]-f[TSW])))+ // (((f[BN]-f[TS])+(f[TN]-f[BS]))+((f[NW]-f[SE])+(f[NE]-f[SW])))+ @@ -956,67 +956,67 @@ void InitDensityLBMKernel::calculate(int /*step*/) LBMReal cu_sq = 1.5*(vx1*vx1+vx2*vx2+vx3*vx3); - feq[REST] = c8o27*(drho-cu_sq); - feq[E] = c2o27*(drho+3.0*(vx1)+c9o2*(vx1)*(vx1)-cu_sq); - feq[W] = c2o27*(drho+3.0*(-vx1)+c9o2*(-vx1)*(-vx1)-cu_sq); - feq[N] = c2o27*(drho+3.0*(vx2)+c9o2*(vx2)*(vx2)-cu_sq); - feq[S] = c2o27*(drho+3.0*(-vx2)+c9o2*(-vx2)*(-vx2)-cu_sq); - feq[T] = c2o27*(drho+3.0*(vx3)+c9o2*(vx3)*(vx3)-cu_sq); - feq[B] = c2o27*(drho+3.0*(-vx3)+c9o2*(-vx3)*(-vx3)-cu_sq); - feq[NE] = c1o54*(drho+3.0*(vx1+vx2)+c9o2*(vx1+vx2)*(vx1+vx2)-cu_sq); - feq[SW] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq); - feq[SE] = c1o54*(drho+3.0*(vx1-vx2)+c9o2*(vx1-vx2)*(vx1-vx2)-cu_sq); - feq[NW] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq); - feq[TE] = c1o54*(drho+3.0*(vx1+vx3)+c9o2*(vx1+vx3)*(vx1+vx3)-cu_sq); - feq[BW] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq); - feq[BE] = c1o54*(drho+3.0*(vx1-vx3)+c9o2*(vx1-vx3)*(vx1-vx3)-cu_sq); - feq[TW] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq); - feq[TN] = c1o54*(drho+3.0*(vx2+vx3)+c9o2*(vx2+vx3)*(vx2+vx3)-cu_sq); - feq[BS] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq); - feq[BN] = c1o54*(drho+3.0*(vx2-vx3)+c9o2*(vx2-vx3)*(vx2-vx3)-cu_sq); - feq[TS] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq); - feq[TNE] = c1o216*(drho+3.0*(vx1+vx2+vx3)+c9o2*(vx1+vx2+vx3)*(vx1+vx2+vx3)-cu_sq); - feq[BSW] = c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); - feq[BNE] = c1o216*(drho+3.0*(vx1+vx2-vx3)+c9o2*(vx1+vx2-vx3)*(vx1+vx2-vx3)-cu_sq); - feq[TSW] = c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); - feq[TSE] = c1o216*(drho+3.0*(vx1-vx2+vx3)+c9o2*(vx1-vx2+vx3)*(vx1-vx2+vx3)-cu_sq); - feq[BNW] = c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); - feq[BSE] = c1o216*(drho+3.0*(vx1-vx2-vx3)+c9o2*(vx1-vx2-vx3)*(vx1-vx2-vx3)-cu_sq); - feq[TNW] = c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); + feq[DIR_000] = c8o27*(drho-cu_sq); + feq[DIR_P00] = c2o27*(drho+3.0*(vx1)+c9o2*(vx1)*(vx1)-cu_sq); + feq[DIR_M00] = c2o27*(drho+3.0*(-vx1)+c9o2*(-vx1)*(-vx1)-cu_sq); + feq[DIR_0P0] = c2o27*(drho+3.0*(vx2)+c9o2*(vx2)*(vx2)-cu_sq); + feq[DIR_0M0] = c2o27*(drho+3.0*(-vx2)+c9o2*(-vx2)*(-vx2)-cu_sq); + feq[DIR_00P] = c2o27*(drho+3.0*(vx3)+c9o2*(vx3)*(vx3)-cu_sq); + feq[DIR_00M] = c2o27*(drho+3.0*(-vx3)+c9o2*(-vx3)*(-vx3)-cu_sq); + feq[DIR_PP0] = c1o54*(drho+3.0*(vx1+vx2)+c9o2*(vx1+vx2)*(vx1+vx2)-cu_sq); + feq[DIR_MM0] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq); + feq[DIR_PM0] = c1o54*(drho+3.0*(vx1-vx2)+c9o2*(vx1-vx2)*(vx1-vx2)-cu_sq); + feq[DIR_MP0] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq); + feq[DIR_P0P] = c1o54*(drho+3.0*(vx1+vx3)+c9o2*(vx1+vx3)*(vx1+vx3)-cu_sq); + feq[DIR_M0M] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq); + feq[DIR_P0M] = c1o54*(drho+3.0*(vx1-vx3)+c9o2*(vx1-vx3)*(vx1-vx3)-cu_sq); + feq[DIR_M0P] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq); + feq[DIR_0PP] = c1o54*(drho+3.0*(vx2+vx3)+c9o2*(vx2+vx3)*(vx2+vx3)-cu_sq); + feq[DIR_0MM] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq); + feq[DIR_0PM] = c1o54*(drho+3.0*(vx2-vx3)+c9o2*(vx2-vx3)*(vx2-vx3)-cu_sq); + feq[DIR_0MP] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq); + feq[DIR_PPP] = c1o216*(drho+3.0*(vx1+vx2+vx3)+c9o2*(vx1+vx2+vx3)*(vx1+vx2+vx3)-cu_sq); + feq[DIR_MMM] = c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); + feq[DIR_PPM] = c1o216*(drho+3.0*(vx1+vx2-vx3)+c9o2*(vx1+vx2-vx3)*(vx1+vx2-vx3)-cu_sq); + feq[DIR_MMP] = c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); + feq[DIR_PMP] = c1o216*(drho+3.0*(vx1-vx2+vx3)+c9o2*(vx1-vx2+vx3)*(vx1-vx2+vx3)-cu_sq); + feq[DIR_MPM] = c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); + feq[DIR_PMM] = c1o216*(drho+3.0*(vx1-vx2-vx3)+c9o2*(vx1-vx2-vx3)*(vx1-vx2-vx3)-cu_sq); + feq[DIR_MPP] = c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); //Relaxation - f[REST] += (feq[REST]-f[REST])*collFactor; - f[E] += (feq[E]-f[E])*collFactor; - f[W] += (feq[W]-f[W])*collFactor; - f[N] += (feq[N]-f[N])*collFactor; - f[S] += (feq[S]-f[S])*collFactor; - f[T] += (feq[T]-f[T])*collFactor; - f[B] += (feq[B]-f[B])*collFactor; - f[NE] += (feq[NE]-f[NE])*collFactor; - f[SW] += (feq[SW]-f[SW])*collFactor; - f[SE] += (feq[SE]-f[SE])*collFactor; - f[NW] += (feq[NW]-f[NW])*collFactor; - f[TE] += (feq[TE]-f[TE])*collFactor; - f[BW] += (feq[BW]-f[BW])*collFactor; - f[BE] += (feq[BE]-f[BE])*collFactor; - f[TW] += (feq[TW]-f[TW])*collFactor; - f[TN] += (feq[TN]-f[TN])*collFactor; - f[BS] += (feq[BS]-f[BS])*collFactor; - f[BN] += (feq[BN]-f[BN])*collFactor; - f[TS] += (feq[TS]-f[TS])*collFactor; + f[DIR_000] += (feq[DIR_000]-f[DIR_000])*collFactor; + f[DIR_P00] += (feq[DIR_P00]-f[DIR_P00])*collFactor; + f[DIR_M00] += (feq[DIR_M00]-f[DIR_M00])*collFactor; + f[DIR_0P0] += (feq[DIR_0P0]-f[DIR_0P0])*collFactor; + f[DIR_0M0] += (feq[DIR_0M0]-f[DIR_0M0])*collFactor; + f[DIR_00P] += (feq[DIR_00P]-f[DIR_00P])*collFactor; + f[DIR_00M] += (feq[DIR_00M]-f[DIR_00M])*collFactor; + f[DIR_PP0] += (feq[DIR_PP0]-f[DIR_PP0])*collFactor; + f[DIR_MM0] += (feq[DIR_MM0]-f[DIR_MM0])*collFactor; + f[DIR_PM0] += (feq[DIR_PM0]-f[DIR_PM0])*collFactor; + f[DIR_MP0] += (feq[DIR_MP0]-f[DIR_MP0])*collFactor; + f[DIR_P0P] += (feq[DIR_P0P]-f[DIR_P0P])*collFactor; + f[DIR_M0M] += (feq[DIR_M0M]-f[DIR_M0M])*collFactor; + f[DIR_P0M] += (feq[DIR_P0M]-f[DIR_P0M])*collFactor; + f[DIR_M0P] += (feq[DIR_M0P]-f[DIR_M0P])*collFactor; + f[DIR_0PP] += (feq[DIR_0PP]-f[DIR_0PP])*collFactor; + f[DIR_0MM] += (feq[DIR_0MM]-f[DIR_0MM])*collFactor; + f[DIR_0PM] += (feq[DIR_0PM]-f[DIR_0PM])*collFactor; + f[DIR_0MP] += (feq[DIR_0MP]-f[DIR_0MP])*collFactor; - f[TNE] += (feq[TNE]-f[TNE])*collFactor; - f[BSW] += (feq[BSW]-f[BSW])*collFactor; - f[BNE] += (feq[BNE]-f[BNE])*collFactor; - f[TSW] += (feq[TSW]-f[TSW])*collFactor; - f[TSE] += (feq[TSE]-f[TSE])*collFactor; - f[BNW] += (feq[BNW]-f[BNW])*collFactor; - f[BSE] += (feq[BSE]-f[BSE])*collFactor; - f[TNW] += (feq[TNW]-f[TNW])*collFactor; + f[DIR_PPP] += (feq[DIR_PPP]-f[DIR_PPP])*collFactor; + f[DIR_MMM] += (feq[DIR_MMM]-f[DIR_MMM])*collFactor; + f[DIR_PPM] += (feq[DIR_PPM]-f[DIR_PPM])*collFactor; + f[DIR_MMP] += (feq[DIR_MMP]-f[DIR_MMP])*collFactor; + f[DIR_PMP] += (feq[DIR_PMP]-f[DIR_PMP])*collFactor; + f[DIR_MPM] += (feq[DIR_MPM]-f[DIR_MPM])*collFactor; + f[DIR_PMM] += (feq[DIR_PMM]-f[DIR_PMM])*collFactor; + f[DIR_MPP] += (feq[DIR_MPP]-f[DIR_MPP])*collFactor; ////////////////////////////////////////////////////////////////////////// #ifdef PROOF_CORRECTNESS - LBMReal rho_post = f[REST]+f[E]+f[W]+f[N]+f[S]+f[T]+f[B] + LBMReal rho_post = f[REST]+f[DIR_P00]+f[W]+f[N]+f[S]+f[T]+f[B] +f[NE]+f[SW]+f[SE]+f[NW]+f[TE]+f[BW]+f[BE] +f[TW]+f[TN]+f[BS]+f[BN]+f[TS]+f[TNE]+f[TSW] +f[TSE]+f[TNW]+f[BNE]+f[BSW]+f[BSE]+f[BNW]; @@ -1033,35 +1033,35 @@ void InitDensityLBMKernel::calculate(int /*step*/) ////////////////////////////////////////////////////////////////////////// //write distribution ////////////////////////////////////////////////////////////////////////// - (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::INV_E]; - (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::INV_N]; - (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::INV_T]; - (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::INV_NE]; - (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = f[D3Q27System::INV_NW]; - (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::INV_TE]; - (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = f[D3Q27System::INV_TW]; - (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::INV_TN]; - (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = f[D3Q27System::INV_TS]; - (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::INV_TNE]; - (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = f[D3Q27System::INV_TNW]; - (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = f[D3Q27System::INV_TSE]; - (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::INV_TSW]; + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = f[D3Q27System::INV_P00]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = f[D3Q27System::INV_0P0]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = f[D3Q27System::INV_00P]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = f[D3Q27System::INV_PP0]; + (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = f[D3Q27System::INV_MP0]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = f[D3Q27System::INV_P0P]; + (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = f[D3Q27System::INV_M0P]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = f[D3Q27System::INV_0PP]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = f[D3Q27System::INV_0MP]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = f[D3Q27System::INV_PPP]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = f[D3Q27System::INV_MPP]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = f[D3Q27System::INV_PMP]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = f[D3Q27System::INV_MMP]; - (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = f[D3Q27System::INV_W]; - (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = f[D3Q27System::INV_S]; - (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = f[D3Q27System::INV_B]; - (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = f[D3Q27System::INV_SW]; - (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = f[D3Q27System::INV_SE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = f[D3Q27System::INV_BW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = f[D3Q27System::INV_BE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = f[D3Q27System::INV_BS]; - (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = f[D3Q27System::INV_BN]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::INV_BSW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = f[D3Q27System::INV_BSE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = f[D3Q27System::INV_BNW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = f[D3Q27System::INV_BNE]; + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = f[D3Q27System::INV_M00]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = f[D3Q27System::INV_0M0]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = f[D3Q27System::INV_00M]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = f[D3Q27System::INV_MM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = f[D3Q27System::INV_PM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = f[D3Q27System::INV_M0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = f[D3Q27System::INV_P0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = f[D3Q27System::INV_0MM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = f[D3Q27System::INV_0PM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = f[D3Q27System::INV_MMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = f[D3Q27System::INV_PMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = f[D3Q27System::INV_MPM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = f[D3Q27System::INV_PPM]; - (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::REST]; + (*this->zeroDistributions)(x1, x2, x3) = f[D3Q27System::DIR_000]; ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp index fa0fd08c9ac1da11483dad6061c96fd3672ad3a4..3c588e1506d8649149daad5588e2290c0832334a 100644 --- a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.cpp @@ -111,12 +111,13 @@ void LBMKernel::setForcingX3(const std::string &muParserString) ////////////////////////////////////////////////////////////////////////// void LBMKernel::checkFunction(mu::Parser fct) { - double x1 = 1.0, x2 = 1.0, x3 = 1.0, dt = 1.0, nue = 1.0; + double x1 = 1.0, x2 = 1.0, x3 = 1.0, dt = 1.0, nue = 1.0, rho = 1.0; fct.DefineVar("x1", &x1); fct.DefineVar("x2", &x2); fct.DefineVar("x3", &x3); fct.DefineVar("dt", &dt); fct.DefineVar("nue", &nue); + fct.DefineVar("rho", &rho); try { fct.Eval(); @@ -231,3 +232,5 @@ double LBMKernel::getPhaseFieldRelaxation() const { return tauH; } ////////////////////////////////////////////////////////////////////////// void LBMKernel::setMobility(double mob) { this->mob = mob; } ////////////////////////////////////////////////////////////////////////// +void LBMKernel::setInterfaceWidth(double w) { this->interfaceWidth = w; } +////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h index d4c477dee5fbdaa4b66b3d0d3200d4cab761dc0f..d5eb02d4c0ef310cdfd63d283abc9719996e5f84 100644 --- a/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h +++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernel.h @@ -128,6 +128,7 @@ public: void setPhaseFieldRelaxation(double tauH); double getPhaseFieldRelaxation() const; void setMobility(double mob); + void setInterfaceWidth(double w); protected: SPtr<DataSet3D> dataSet; @@ -163,6 +164,7 @@ protected: LBMReal phiH; LBMReal tauH; LBMReal mob; + LBMReal interfaceWidth { 4.0 }; private: void checkFunction(mu::Parser fct); diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp b/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp index 6076eb018097dc77afcf37af2d14206325be463c..1fcdf118fa920d648b511c60ebbc48542e164be0 100644 --- a/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/LBMKernelETD3Q27BGK.cpp @@ -88,113 +88,113 @@ void LBMKernelETD3Q27BGK::calculate(int /*step*/) ////////////////////////////////////////////////////////////////////////// //read distribution //////////////////////////////////////////////////////////////////////////// - f[REST] = (*this->zeroDistributions)(x1,x2,x3); + f[DIR_000] = (*this->zeroDistributions)(x1,x2,x3); - f[E] = (*this->localDistributions)(D3Q27System::ET_E, x1,x2,x3); - f[N] = (*this->localDistributions)(D3Q27System::ET_N,x1,x2,x3); - f[T] = (*this->localDistributions)(D3Q27System::ET_T,x1,x2,x3); - f[NE] = (*this->localDistributions)(D3Q27System::ET_NE,x1,x2,x3); - f[NW] = (*this->localDistributions)(D3Q27System::ET_NW,x1p,x2,x3); - f[TE] = (*this->localDistributions)(D3Q27System::ET_TE,x1,x2,x3); - f[TW] = (*this->localDistributions)(D3Q27System::ET_TW, x1p,x2,x3); - f[TN] = (*this->localDistributions)(D3Q27System::ET_TN,x1,x2,x3); - f[TS] = (*this->localDistributions)(D3Q27System::ET_TS,x1,x2p,x3); - f[TNE] = (*this->localDistributions)(D3Q27System::ET_TNE,x1,x2,x3); - f[TNW] = (*this->localDistributions)(D3Q27System::ET_TNW,x1p,x2,x3); - f[TSE] = (*this->localDistributions)(D3Q27System::ET_TSE,x1,x2p,x3); - f[TSW] = (*this->localDistributions)(D3Q27System::ET_TSW,x1p,x2p,x3); + f[DIR_P00] = (*this->localDistributions)(D3Q27System::ET_E, x1,x2,x3); + f[DIR_0P0] = (*this->localDistributions)(D3Q27System::ET_N,x1,x2,x3); + f[DIR_00P] = (*this->localDistributions)(D3Q27System::ET_T,x1,x2,x3); + f[DIR_PP0] = (*this->localDistributions)(D3Q27System::ET_NE,x1,x2,x3); + f[DIR_MP0] = (*this->localDistributions)(D3Q27System::ET_NW,x1p,x2,x3); + f[DIR_P0P] = (*this->localDistributions)(D3Q27System::ET_TE,x1,x2,x3); + f[DIR_M0P] = (*this->localDistributions)(D3Q27System::ET_TW, x1p,x2,x3); + f[DIR_0PP] = (*this->localDistributions)(D3Q27System::ET_TN,x1,x2,x3); + f[DIR_0MP] = (*this->localDistributions)(D3Q27System::ET_TS,x1,x2p,x3); + f[DIR_PPP] = (*this->localDistributions)(D3Q27System::ET_TNE,x1,x2,x3); + f[DIR_MPP] = (*this->localDistributions)(D3Q27System::ET_TNW,x1p,x2,x3); + f[DIR_PMP] = (*this->localDistributions)(D3Q27System::ET_TSE,x1,x2p,x3); + f[DIR_MMP] = (*this->localDistributions)(D3Q27System::ET_TSW,x1p,x2p,x3); - f[W ] = (*this->nonLocalDistributions)(D3Q27System::ET_W,x1p,x2,x3 ); - f[S ] = (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,x2p,x3 ); - f[B ] = (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,x2,x3p ); - f[SW] = (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1p,x2p,x3 ); - f[SE] = (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,x2p,x3 ); - f[BW] = (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1p,x2,x3p ); - f[BE] = (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,x2,x3p ); - f[BS] = (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,x2p,x3p ); - f[BN] = (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,x2,x3p ); - f[BSW] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1p,x2p,x3p); - f[BSE] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,x2p,x3p); - f[BNW] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1p,x2,x3p); - f[BNE] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,x2,x3p); + f[DIR_M00] = (*this->nonLocalDistributions)(D3Q27System::ET_W,x1p,x2,x3 ); + f[DIR_0M0] = (*this->nonLocalDistributions)(D3Q27System::ET_S,x1,x2p,x3 ); + f[DIR_00M] = (*this->nonLocalDistributions)(D3Q27System::ET_B,x1,x2,x3p ); + f[DIR_MM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1p,x2p,x3 ); + f[DIR_PM0] = (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1,x2p,x3 ); + f[DIR_M0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1p,x2,x3p ); + f[DIR_P0M] = (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1,x2,x3p ); + f[DIR_0MM] = (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1,x2p,x3p ); + f[DIR_0PM] = (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1,x2,x3p ); + f[DIR_MMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1p,x2p,x3p); + f[DIR_PMM] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1,x2p,x3p); + f[DIR_MPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1p,x2,x3p); + f[DIR_PPM] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1,x2,x3p); ////////////////////////////////////////////////////////////////////////// - drho = f[REST] + f[E] + f[W] + f[N] + f[S] + f[T] + f[B] - + f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE] - + f[TW] + f[TN] + f[BS] + f[BN] + f[TS] + f[TNE] + f[TSW] - + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]; + drho = f[DIR_000] + f[DIR_P00] + f[DIR_M00] + f[DIR_0P0] + f[DIR_0M0] + f[DIR_00P] + f[DIR_00M] + + f[DIR_PP0] + f[DIR_MM0] + f[DIR_PM0] + f[DIR_MP0] + f[DIR_P0P] + f[DIR_M0M] + f[DIR_P0M] + + f[DIR_M0P] + f[DIR_0PP] + f[DIR_0MM] + f[DIR_0PM] + f[DIR_0MP] + f[DIR_PPP] + f[DIR_MMP] + + f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] + f[DIR_MMM] + f[DIR_PMM] + f[DIR_MPM]; - vx1 = f[E] - f[W] + f[NE] - f[SW] + f[SE] - f[NW] + f[TE] - f[BW] - + f[BE] - f[TW] + f[TNE] - f[TSW] + f[TSE] - f[TNW] + f[BNE] - f[BSW] - + f[BSE] - f[BNW]; + vx1 = f[DIR_P00] - f[DIR_M00] + f[DIR_PP0] - f[DIR_MM0] + f[DIR_PM0] - f[DIR_MP0] + f[DIR_P0P] - f[DIR_M0M] + + f[DIR_P0M] - f[DIR_M0P] + f[DIR_PPP] - f[DIR_MMP] + f[DIR_PMP] - f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] + + f[DIR_PMM] - f[DIR_MPM]; - vx2 = f[N] - f[S] + f[NE] - f[SW] - f[SE] + f[NW] + f[TN] - f[BS] + f[BN] - - f[TS] + f[TNE] - f[TSW] - f[TSE] + f[TNW] + f[BNE] - f[BSW] - f[BSE] - + f[BNW]; + vx2 = f[DIR_0P0] - f[DIR_0M0] + f[DIR_PP0] - f[DIR_MM0] - f[DIR_PM0] + f[DIR_MP0] + f[DIR_0PP] - f[DIR_0MM] + f[DIR_0PM] + - f[DIR_0MP] + f[DIR_PPP] - f[DIR_MMP] - f[DIR_PMP] + f[DIR_MPP] + f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] + + f[DIR_MPM]; - vx3 = f[T] - f[B] + f[TE] - f[BW] - f[BE] + f[TW] + f[TN] - f[BS] - f[BN] - + f[TS] + f[TNE] + f[TSW] + f[TSE] + f[TNW] - f[BNE] - f[BSW] - f[BSE] - - f[BNW]; + vx3 = f[DIR_00P] - f[DIR_00M] + f[DIR_P0P] - f[DIR_M0M] - f[DIR_P0M] + f[DIR_M0P] + f[DIR_0PP] - f[DIR_0MM] - f[DIR_0PM] + + f[DIR_0MP] + f[DIR_PPP] + f[DIR_MMP] + f[DIR_PMP] + f[DIR_MPP] - f[DIR_PPM] - f[DIR_MMM] - f[DIR_PMM] + - f[DIR_MPM]; LBMReal cu_sq=1.5*(vx1*vx1+vx2*vx2+vx3*vx3); - feq[REST] = c8o27*(drho-cu_sq); - feq[E] = c2o27*(drho+3.0*( vx1 )+c9o2*( vx1 )*( vx1 )-cu_sq); - feq[W] = c2o27*(drho+3.0*(-vx1 )+c9o2*(-vx1 )*(-vx1 )-cu_sq); - feq[N] = c2o27*(drho+3.0*( vx2)+c9o2*( vx2)*( vx2)-cu_sq); - feq[S] = c2o27*(drho+3.0*( -vx2)+c9o2*( -vx2)*( -vx2)-cu_sq); - feq[T] = c2o27*(drho+3.0*( vx3 )+c9o2*( vx3)*( vx3)-cu_sq); - feq[B] = c2o27*(drho+3.0*( -vx3)+c9o2*( -vx3)*( -vx3)-cu_sq); - feq[NE] = c1o54*(drho+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq); - feq[SW] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq); - feq[SE] = c1o54*(drho+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq); - feq[NW] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq); - feq[TE] = c1o54*(drho+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq); - feq[BW] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq); - feq[BE] = c1o54*(drho+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq); - feq[TW] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq); - feq[TN] = c1o54*(drho+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); - feq[BS] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq); - feq[BN] = c1o54*(drho+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); - feq[TS] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq); - feq[TNE]= c1o216*(drho+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); - feq[BSW]= c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); - feq[BNE]= c1o216*(drho+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); - feq[TSW]= c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); - feq[TSE]= c1o216*(drho+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); - feq[BNW]= c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); - feq[BSE]= c1o216*(drho+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); - feq[TNW]= c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); + feq[DIR_000] = c8o27*(drho-cu_sq); + feq[DIR_P00] = c2o27*(drho+3.0*( vx1 )+c9o2*( vx1 )*( vx1 )-cu_sq); + feq[DIR_M00] = c2o27*(drho+3.0*(-vx1 )+c9o2*(-vx1 )*(-vx1 )-cu_sq); + feq[DIR_0P0] = c2o27*(drho+3.0*( vx2)+c9o2*( vx2)*( vx2)-cu_sq); + feq[DIR_0M0] = c2o27*(drho+3.0*( -vx2)+c9o2*( -vx2)*( -vx2)-cu_sq); + feq[DIR_00P] = c2o27*(drho+3.0*( vx3 )+c9o2*( vx3)*( vx3)-cu_sq); + feq[DIR_00M] = c2o27*(drho+3.0*( -vx3)+c9o2*( -vx3)*( -vx3)-cu_sq); + feq[DIR_PP0] = c1o54*(drho+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq); + feq[DIR_MM0] = c1o54*(drho+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq); + feq[DIR_PM0] = c1o54*(drho+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq); + feq[DIR_MP0] = c1o54*(drho+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq); + feq[DIR_P0P] = c1o54*(drho+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq); + feq[DIR_M0M] = c1o54*(drho+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq); + feq[DIR_P0M] = c1o54*(drho+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq); + feq[DIR_M0P] = c1o54*(drho+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq); + feq[DIR_0PP] = c1o54*(drho+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); + feq[DIR_0MM] = c1o54*(drho+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq); + feq[DIR_0PM] = c1o54*(drho+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); + feq[DIR_0MP] = c1o54*(drho+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq); + feq[DIR_PPP]= c1o216*(drho+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); + feq[DIR_MMM]= c1o216*(drho+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); + feq[DIR_PPM]= c1o216*(drho+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); + feq[DIR_MMP]= c1o216*(drho+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); + feq[DIR_PMP]= c1o216*(drho+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); + feq[DIR_MPM]= c1o216*(drho+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); + feq[DIR_PMM]= c1o216*(drho+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); + feq[DIR_MPP]= c1o216*(drho+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); //Relaxation - f[REST] += (feq[REST]-f[REST])*collFactor; - f[E] += (feq[E]-f[E])*collFactor; - f[W] += (feq[W]-f[W])*collFactor; - f[N] += (feq[N]-f[N])*collFactor; - f[S] += (feq[S]-f[S])*collFactor; - f[T] += (feq[T]-f[T])*collFactor; - f[B] += (feq[B]-f[B])*collFactor; - f[NE] += (feq[NE]-f[NE])*collFactor; - f[SW] += (feq[SW]-f[SW])*collFactor; - f[SE] += (feq[SE]-f[SE])*collFactor; - f[NW] += (feq[NW]-f[NW])*collFactor; - f[TE] += (feq[TE]-f[TE])*collFactor; - f[BW] += (feq[BW]-f[BW])*collFactor; - f[BE] += (feq[BE]-f[BE])*collFactor; - f[TW] += (feq[TW]-f[TW])*collFactor; - f[TN] += (feq[TN]-f[TN])*collFactor; - f[BS] += (feq[BS]-f[BS])*collFactor; - f[BN] += (feq[BN]-f[BN])*collFactor; - f[TS] += (feq[TS]-f[TS])*collFactor; + f[DIR_000] += (feq[DIR_000]-f[DIR_000])*collFactor; + f[DIR_P00] += (feq[DIR_P00]-f[DIR_P00])*collFactor; + f[DIR_M00] += (feq[DIR_M00]-f[DIR_M00])*collFactor; + f[DIR_0P0] += (feq[DIR_0P0]-f[DIR_0P0])*collFactor; + f[DIR_0M0] += (feq[DIR_0M0]-f[DIR_0M0])*collFactor; + f[DIR_00P] += (feq[DIR_00P]-f[DIR_00P])*collFactor; + f[DIR_00M] += (feq[DIR_00M]-f[DIR_00M])*collFactor; + f[DIR_PP0] += (feq[DIR_PP0]-f[DIR_PP0])*collFactor; + f[DIR_MM0] += (feq[DIR_MM0]-f[DIR_MM0])*collFactor; + f[DIR_PM0] += (feq[DIR_PM0]-f[DIR_PM0])*collFactor; + f[DIR_MP0] += (feq[DIR_MP0]-f[DIR_MP0])*collFactor; + f[DIR_P0P] += (feq[DIR_P0P]-f[DIR_P0P])*collFactor; + f[DIR_M0M] += (feq[DIR_M0M]-f[DIR_M0M])*collFactor; + f[DIR_P0M] += (feq[DIR_P0M]-f[DIR_P0M])*collFactor; + f[DIR_M0P] += (feq[DIR_M0P]-f[DIR_M0P])*collFactor; + f[DIR_0PP] += (feq[DIR_0PP]-f[DIR_0PP])*collFactor; + f[DIR_0MM] += (feq[DIR_0MM]-f[DIR_0MM])*collFactor; + f[DIR_0PM] += (feq[DIR_0PM]-f[DIR_0PM])*collFactor; + f[DIR_0MP] += (feq[DIR_0MP]-f[DIR_0MP])*collFactor; - f[TNE] += (feq[TNE]-f[TNE])*collFactor; - f[BSW] += (feq[BSW]-f[BSW])*collFactor; - f[BNE] += (feq[BNE]-f[BNE])*collFactor; - f[TSW] += (feq[TSW]-f[TSW])*collFactor; - f[TSE] += (feq[TSE]-f[TSE])*collFactor; - f[BNW] += (feq[BNW]-f[BNW])*collFactor; - f[BSE] += (feq[BSE]-f[BSE])*collFactor; - f[TNW] += (feq[TNW]-f[TNW])*collFactor; + f[DIR_PPP] += (feq[DIR_PPP]-f[DIR_PPP])*collFactor; + f[DIR_MMM] += (feq[DIR_MMM]-f[DIR_MMM])*collFactor; + f[DIR_PPM] += (feq[DIR_PPM]-f[DIR_PPM])*collFactor; + f[DIR_MMP] += (feq[DIR_MMP]-f[DIR_MMP])*collFactor; + f[DIR_PMP] += (feq[DIR_PMP]-f[DIR_PMP])*collFactor; + f[DIR_MPM] += (feq[DIR_MPM]-f[DIR_MPM])*collFactor; + f[DIR_PMM] += (feq[DIR_PMM]-f[DIR_PMM])*collFactor; + f[DIR_MPP] += (feq[DIR_MPP]-f[DIR_MPP])*collFactor; ////////////////////////////////////////////////////////////////////////// //forcing @@ -208,37 +208,37 @@ void LBMKernelETD3Q27BGK::calculate(int /*step*/) forcingX2 = muForcingX2.Eval(); forcingX3 = muForcingX3.Eval(); - f[REST] += 0.0 ; - f[E ] += 3.0*c2o27 * (forcingX1) ; - f[W ] += 3.0*c2o27 * (-forcingX1) ; - f[N ] += 3.0*c2o27 * (forcingX2) ; - f[S ] += 3.0*c2o27 * (-forcingX2) ; - f[T ] += 3.0*c2o27 * (forcingX3) ; - f[B ] += 3.0*c2o27 * (-forcingX3); - f[NE ] += 3.0*c1o54 * ( forcingX1+forcingX2 ) ; - f[SW ] += 3.0*c1o54 * (-forcingX1-forcingX2 ) ; - f[SE ] += 3.0*c1o54 * ( forcingX1-forcingX2 ) ; - f[NW ] += 3.0*c1o54 * (-forcingX1+forcingX2 ) ; - f[TE ] += 3.0*c1o54 * ( forcingX1 +forcingX3) ; - f[BW ] += 3.0*c1o54 * (-forcingX1 -forcingX3) ; - f[BE ] += 3.0*c1o54 * ( forcingX1 -forcingX3) ; - f[TW ] += 3.0*c1o54 * (-forcingX1 +forcingX3) ; - f[TN ] += 3.0*c1o54 * ( forcingX2+forcingX3) ; - f[BS ] += 3.0*c1o54 * ( -forcingX2-forcingX3) ; - f[BN ] += 3.0*c1o54 * ( forcingX2-forcingX3) ; - f[TS ] += 3.0*c1o54 * ( -forcingX2+forcingX3) ; - f[TNE] += 3.0*c1o216* ( forcingX1+forcingX2+forcingX3) ; - f[BSW] += 3.0*c1o216* (-forcingX1-forcingX2-forcingX3) ; - f[BNE] += 3.0*c1o216* ( forcingX1+forcingX2-forcingX3) ; - f[TSW] += 3.0*c1o216* (-forcingX1-forcingX2+forcingX3) ; - f[TSE] += 3.0*c1o216* ( forcingX1-forcingX2+forcingX3) ; - f[BNW] += 3.0*c1o216* (-forcingX1+forcingX2-forcingX3) ; - f[BSE] += 3.0*c1o216* ( forcingX1-forcingX2-forcingX3) ; - f[TNW] += 3.0*c1o216* (-forcingX1+forcingX2+forcingX3) ; + f[DIR_000] += 0.0 ; + f[DIR_P00] += 3.0*c2o27 * (forcingX1) ; + f[DIR_M00] += 3.0*c2o27 * (-forcingX1) ; + f[DIR_0P0] += 3.0*c2o27 * (forcingX2) ; + f[DIR_0M0] += 3.0*c2o27 * (-forcingX2) ; + f[DIR_00P] += 3.0*c2o27 * (forcingX3) ; + f[DIR_00M] += 3.0*c2o27 * (-forcingX3); + f[DIR_PP0] += 3.0*c1o54 * ( forcingX1+forcingX2 ) ; + f[DIR_MM0 ] += 3.0*c1o54 * (-forcingX1-forcingX2 ) ; + f[DIR_PM0 ] += 3.0*c1o54 * ( forcingX1-forcingX2 ) ; + f[DIR_MP0 ] += 3.0*c1o54 * (-forcingX1+forcingX2 ) ; + f[DIR_P0P ] += 3.0*c1o54 * ( forcingX1 +forcingX3) ; + f[DIR_M0M ] += 3.0*c1o54 * (-forcingX1 -forcingX3) ; + f[DIR_P0M ] += 3.0*c1o54 * ( forcingX1 -forcingX3) ; + f[DIR_M0P ] += 3.0*c1o54 * (-forcingX1 +forcingX3) ; + f[DIR_0PP ] += 3.0*c1o54 * ( forcingX2+forcingX3) ; + f[DIR_0MM ] += 3.0*c1o54 * ( -forcingX2-forcingX3) ; + f[DIR_0PM ] += 3.0*c1o54 * ( forcingX2-forcingX3) ; + f[DIR_0MP ] += 3.0*c1o54 * ( -forcingX2+forcingX3) ; + f[DIR_PPP] += 3.0*c1o216* ( forcingX1+forcingX2+forcingX3) ; + f[DIR_MMM] += 3.0*c1o216* (-forcingX1-forcingX2-forcingX3) ; + f[DIR_PPM] += 3.0*c1o216* ( forcingX1+forcingX2-forcingX3) ; + f[DIR_MMP] += 3.0*c1o216* (-forcingX1-forcingX2+forcingX3) ; + f[DIR_PMP] += 3.0*c1o216* ( forcingX1-forcingX2+forcingX3) ; + f[DIR_MPM] += 3.0*c1o216* (-forcingX1+forcingX2-forcingX3) ; + f[DIR_PMM] += 3.0*c1o216* ( forcingX1-forcingX2-forcingX3) ; + f[DIR_MPP] += 3.0*c1o216* (-forcingX1+forcingX2+forcingX3) ; } ////////////////////////////////////////////////////////////////////////// #ifdef PROOF_CORRECTNESS - LBMReal rho_post = f[REST] + f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + LBMReal rho_post = f[REST] + f[DIR_P00] + f[W] + f[N] + f[S] + f[T] + f[B] + f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS] + f[TNE] + f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]; @@ -255,35 +255,35 @@ void LBMKernelETD3Q27BGK::calculate(int /*step*/) ////////////////////////////////////////////////////////////////////////// //write distribution ////////////////////////////////////////////////////////////////////////// - (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f[D3Q27System::INV_E]; - (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f[D3Q27System::INV_N]; - (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f[D3Q27System::INV_T]; - (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f[D3Q27System::INV_NE]; - (*this->localDistributions)(D3Q27System::ET_NW,x1p,x2, x3) = f[D3Q27System::INV_NW]; - (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f[D3Q27System::INV_TE]; - (*this->localDistributions)(D3Q27System::ET_TW,x1p,x2, x3) = f[D3Q27System::INV_TW]; - (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f[D3Q27System::INV_TN]; - (*this->localDistributions)(D3Q27System::ET_TS,x1, x2p,x3) = f[D3Q27System::INV_TS]; - (*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f[D3Q27System::INV_TNE]; - (*this->localDistributions)(D3Q27System::ET_TNW,x1p,x2, x3) = f[D3Q27System::INV_TNW]; - (*this->localDistributions)(D3Q27System::ET_TSE,x1, x2p,x3) = f[D3Q27System::INV_TSE]; - (*this->localDistributions)(D3Q27System::ET_TSW,x1p,x2p,x3) = f[D3Q27System::INV_TSW]; + (*this->localDistributions)(D3Q27System::ET_E,x1, x2, x3) = f[D3Q27System::INV_P00]; + (*this->localDistributions)(D3Q27System::ET_N,x1, x2, x3) = f[D3Q27System::INV_0P0]; + (*this->localDistributions)(D3Q27System::ET_T,x1, x2, x3) = f[D3Q27System::INV_00P]; + (*this->localDistributions)(D3Q27System::ET_NE,x1, x2, x3) = f[D3Q27System::INV_PP0]; + (*this->localDistributions)(D3Q27System::ET_NW,x1p,x2, x3) = f[D3Q27System::INV_MP0]; + (*this->localDistributions)(D3Q27System::ET_TE,x1, x2, x3) = f[D3Q27System::INV_P0P]; + (*this->localDistributions)(D3Q27System::ET_TW,x1p,x2, x3) = f[D3Q27System::INV_M0P]; + (*this->localDistributions)(D3Q27System::ET_TN,x1, x2, x3) = f[D3Q27System::INV_0PP]; + (*this->localDistributions)(D3Q27System::ET_TS,x1, x2p,x3) = f[D3Q27System::INV_0MP]; + (*this->localDistributions)(D3Q27System::ET_TNE,x1, x2, x3) = f[D3Q27System::INV_PPP]; + (*this->localDistributions)(D3Q27System::ET_TNW,x1p,x2, x3) = f[D3Q27System::INV_MPP]; + (*this->localDistributions)(D3Q27System::ET_TSE,x1, x2p,x3) = f[D3Q27System::INV_PMP]; + (*this->localDistributions)(D3Q27System::ET_TSW,x1p,x2p,x3) = f[D3Q27System::INV_MMP]; - (*this->nonLocalDistributions)(D3Q27System::ET_W,x1p,x2, x3 ) = f[D3Q27System::INV_W ]; - (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2p,x3 ) = f[D3Q27System::INV_S ]; - (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3p ) = f[D3Q27System::INV_B ]; - (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1p,x2p,x3 ) = f[D3Q27System::INV_SW]; - (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2p,x3 ) = f[D3Q27System::INV_SE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1p,x2, x3p ) = f[D3Q27System::INV_BW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3p ) = f[D3Q27System::INV_BE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2p,x3p ) = f[D3Q27System::INV_BS]; - (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3p ) = f[D3Q27System::INV_BN]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1p,x2p,x3p) = f[D3Q27System::INV_BSW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2p,x3p) = f[D3Q27System::INV_BSE]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1p,x2, x3p) = f[D3Q27System::INV_BNW]; - (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3p) = f[D3Q27System::INV_BNE]; + (*this->nonLocalDistributions)(D3Q27System::ET_W,x1p,x2, x3 ) = f[D3Q27System::INV_M00 ]; + (*this->nonLocalDistributions)(D3Q27System::ET_S,x1, x2p,x3 ) = f[D3Q27System::INV_0M0 ]; + (*this->nonLocalDistributions)(D3Q27System::ET_B,x1, x2, x3p ) = f[D3Q27System::INV_00M ]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW,x1p,x2p,x3 ) = f[D3Q27System::INV_MM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE,x1, x2p,x3 ) = f[D3Q27System::INV_PM0]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW,x1p,x2, x3p ) = f[D3Q27System::INV_M0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE,x1, x2, x3p ) = f[D3Q27System::INV_P0M]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS,x1, x2p,x3p ) = f[D3Q27System::INV_0MM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN,x1, x2, x3p ) = f[D3Q27System::INV_0PM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW,x1p,x2p,x3p) = f[D3Q27System::INV_MMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE,x1, x2p,x3p) = f[D3Q27System::INV_PMM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW,x1p,x2, x3p) = f[D3Q27System::INV_MPM]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE,x1, x2, x3p) = f[D3Q27System::INV_PPM]; - (*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::REST]; + (*this->zeroDistributions)(x1,x2,x3) = f[D3Q27System::DIR_000]; ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h b/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h index 40570cc3847f71a1942791afa7e95145daafb53b..de485c28da920b150476ad8e7b4e1f03019e132e 100644 --- a/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h +++ b/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h @@ -97,14 +97,6 @@ public: this->init(refLengthWorld, csWorld, rhoWorld, csWorld, refLengthLb, rhoLb, csLb); } - LBMUnitConverter(int /*dummy*/, double uReal, double uLB, double nuReal, double nuLB) - { - factorVelocityLbToW = uReal / uLB; - factorViscosityLbToW = nuReal / nuLB; - factorDensityLbToW = factorViscosityLbToW * factorVelocityLbToW * factorVelocityLbToW; - factorPressureLbToW = factorDensityLbToW; - } - virtual ~LBMUnitConverter() = default; double getRefRhoLb() { return refRhoLb; } @@ -124,10 +116,7 @@ public: double getFactorDensityLbToW() { return this->factorMassLbToW / std::pow(factorLengthLbToW, 3.0); } double getFactorDensityWToLb() { return 1.0 / this->getFactorDensityLbToW(); } - double getFactorPressureLbToW() - { - return this->factorMassLbToW / (std::pow(factorTimeLbToW, 2.0) * factorLengthLbToW); - } + double getFactorPressureLbToW(){ return this->factorMassLbToW / (factorLengthLbToW * factorTimeLbToW * factorTimeLbToW); } double getFactorPressureWToLb() { return 1.0 / this->getFactorPressureLbToW(); } double getFactorMassLbToW() { return this->factorMassLbToW; } @@ -136,14 +125,14 @@ public: double getFactorForceLbToW() { return factorMassLbToW * factorLengthLbToW / (factorTimeLbToW * factorTimeLbToW); } double getFactorForceWToLb() { return 1.0 / this->getFactorForceLbToW(); } + double getFactorTorqueLbToW() { return factorMassLbToW * factorLengthLbToW * factorLengthLbToW / (factorTimeLbToW * factorTimeLbToW);} + double getFactorTorqueWToLb() { return 1.0 / this->getFactorTorqueLbToW(); } + double getFactorAccLbToW() { return factorLengthLbToW / (factorTimeLbToW * factorTimeLbToW); } double getFactorAccWToLb() { return 1.0 / this->getFactorAccLbToW(); } double getFactorTimeLbToW(double deltaX) const { return factorTimeWithoutDx * deltaX; } - ////////////////////////////////////////////////////////////////////////// - double getFactorVelocityLbToW2() { return factorVelocityLbToW; } - double getFactorDensityLbToW2() { return factorDensityLbToW; } - double getFactorPressureLbToW2() { return factorPressureLbToW; } + /*==========================================================*/ friend inline std::ostream &operator<<(std::ostream &os, LBMUnitConverter c) @@ -212,11 +201,6 @@ protected: double factorMassLbToW{ 1.0 }; double refRhoLb{ 1.0 }; double factorTimeWithoutDx{ 0.0 }; - - double factorVelocityLbToW{ 1.0 }; - double factorViscosityLbToW{ 1.0 }; - double factorDensityLbToW{ 1.0 }; - double factorPressureLbToW{ 1.0 }; }; #endif // LBMUNITCONVERTER_H diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp index e092301175713d16e9397cb1a5890967f83cb1c2..ad80b372251a11161de68c6935097da8eec3edc5 100644 --- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.cpp @@ -235,19 +235,25 @@ void MultiphaseCumulantLBMKernel::calculate(int step) LBMReal dX3_phi = gradX3_phi(); LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9; - collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL); + collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL); - LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi(); + LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(); //----------- Calculating Macroscopic Values ------------- - LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH); + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); if (withForcing) { // muX1 = static_cast<double>(x1-1+ix1*maxX1); // muX2 = static_cast<double>(x2-1+ix2*maxX2); // muX3 = static_cast<double>(x3-1+ix3*maxX3); + muForcingX1.DefineVar("rho",&muRho); + muForcingX2.DefineVar("rho",&muRho); + muForcingX3.DefineVar("rho",&muRho); + + muRho = rho; + forcingX1 = muForcingX1.Eval(); forcingX2 = muForcingX2.Eval(); forcingX3 = muForcingX3.Eval(); @@ -287,7 +293,7 @@ void MultiphaseCumulantLBMKernel::calculate(int step) LBMReal uz2 = uz * uz; //----------- Calculating Forcing Terms * ------------- - for (int dir = STARTF; dir <= (FENDDIR); dir++) { + for (int dir = FSTARTDIR; dir <= FENDDIR; dir++) { LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz; LBMReal velSq1 = velProd * velProd; LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)); @@ -302,41 +308,41 @@ void MultiphaseCumulantLBMKernel::calculate(int step) (DX3[dir]) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3)); } - LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); - LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi; - forcingTerm[REST] = (-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) + + LBMReal gamma = WEIGTH[DIR_000] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); + LBMReal fac1 = (gamma - WEIGTH[DIR_000]) * c1o3 * rhoToPhi; + forcingTerm[DIR_000] = (-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) + (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) + (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3)); //-------------------------------------------------------- - mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[E]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; - mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; - mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; - mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; - mfacb = 3.0 * (mfacb + 0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; - mfcbc = 3.0 * (mfcbc + 0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; - mfabc = 3.0 * (mfabc + 0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; - mfbcc = 3.0 * (mfbcc + 0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; - mfbac = 3.0 * (mfbac + 0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; - mfccc = 3.0 * (mfccc + 0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; - mfacc = 3.0 * (mfacc + 0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; - mfcac = 3.0 * (mfcac + 0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; - mfaac = 3.0 * (mfaac + 0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; - mfabb = 3.0 * (mfabb + 0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; - mfbab = 3.0 * (mfbab + 0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; - mfbba = 3.0 * (mfbba + 0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; - mfaab = 3.0 * (mfaab + 0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; - mfcab = 3.0 * (mfcab + 0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; - mfaba = 3.0 * (mfaba + 0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; - mfcba = 3.0 * (mfcba + 0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; - mfbaa = 3.0 * (mfbaa + 0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; - mfbca = 3.0 * (mfbca + 0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; - mfaaa = 3.0 * (mfaaa + 0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; - mfcaa = 3.0 * (mfcaa + 0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; - mfaca = 3.0 * (mfaca + 0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; - mfcca = 3.0 * (mfcca + 0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; - mfbbb = 3.0 * (mfbbb + 0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]; + mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[DIR_0P0]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[DIR_00P]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[DIR_PP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + mfacb = 3.0 * (mfacb + 0.5 * forcingTerm[DIR_MP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + mfcbc = 3.0 * (mfcbc + 0.5 * forcingTerm[DIR_P0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + mfabc = 3.0 * (mfabc + 0.5 * forcingTerm[DIR_M0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + mfbcc = 3.0 * (mfbcc + 0.5 * forcingTerm[DIR_0PP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + mfbac = 3.0 * (mfbac + 0.5 * forcingTerm[DIR_0MP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + mfccc = 3.0 * (mfccc + 0.5 * forcingTerm[DIR_PPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + mfacc = 3.0 * (mfacc + 0.5 * forcingTerm[DIR_MPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + mfcac = 3.0 * (mfcac + 0.5 * forcingTerm[DIR_PMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + mfaac = 3.0 * (mfaac + 0.5 * forcingTerm[DIR_MMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + mfabb = 3.0 * (mfabb + 0.5 * forcingTerm[DIR_M00]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + mfbab = 3.0 * (mfbab + 0.5 * forcingTerm[DIR_0M0]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + mfbba = 3.0 * (mfbba + 0.5 * forcingTerm[DIR_00M]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + mfaab = 3.0 * (mfaab + 0.5 * forcingTerm[DIR_MM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + mfcab = 3.0 * (mfcab + 0.5 * forcingTerm[DIR_PM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + mfaba = 3.0 * (mfaba + 0.5 * forcingTerm[DIR_M0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + mfcba = 3.0 * (mfcba + 0.5 * forcingTerm[DIR_P0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + mfbaa = 3.0 * (mfbaa + 0.5 * forcingTerm[DIR_0MM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + mfbca = 3.0 * (mfbca + 0.5 * forcingTerm[DIR_0PM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + mfaaa = 3.0 * (mfaaa + 0.5 * forcingTerm[DIR_MMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + mfcaa = 3.0 * (mfcaa + 0.5 * forcingTerm[DIR_PMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + mfaca = 3.0 * (mfaca + 0.5 * forcingTerm[DIR_MPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + mfcca = 3.0 * (mfcca + 0.5 * forcingTerm[DIR_PPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + mfbbb = 3.0 * (mfbbb + 0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]; LBMReal rho1 = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + @@ -1018,33 +1024,33 @@ void MultiphaseCumulantLBMKernel::calculate(int step) } #endif - mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[E]; - mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N]; - mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T]; - mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE]; - mfacb = rho * c1o3 * (mfacb) + 0.5 * forcingTerm[NW]; - mfcbc = rho * c1o3 * (mfcbc) + 0.5 * forcingTerm[TE]; - mfabc = rho * c1o3 * (mfabc) + 0.5 * forcingTerm[TW]; - mfbcc = rho * c1o3 * (mfbcc) + 0.5 * forcingTerm[TN]; - mfbac = rho * c1o3 * (mfbac) + 0.5 * forcingTerm[TS]; - mfccc = rho * c1o3 * (mfccc) + 0.5 * forcingTerm[TNE]; - mfacc = rho * c1o3 * (mfacc) + 0.5 * forcingTerm[TNW]; - mfcac = rho * c1o3 * (mfcac) + 0.5 * forcingTerm[TSE]; - mfaac = rho * c1o3 * (mfaac) + 0.5 * forcingTerm[TSW]; - mfabb = rho * c1o3 * (mfabb) + 0.5 * forcingTerm[W]; - mfbab = rho * c1o3 * (mfbab) + 0.5 * forcingTerm[S]; - mfbba = rho * c1o3 * (mfbba) + 0.5 * forcingTerm[B]; - mfaab = rho * c1o3 * (mfaab) + 0.5 * forcingTerm[SW]; - mfcab = rho * c1o3 * (mfcab) + 0.5 * forcingTerm[SE]; - mfaba = rho * c1o3 * (mfaba) + 0.5 * forcingTerm[BW]; - mfcba = rho * c1o3 * (mfcba) + 0.5 * forcingTerm[BE]; - mfbaa = rho * c1o3 * (mfbaa) + 0.5 * forcingTerm[BS]; - mfbca = rho * c1o3 * (mfbca) + 0.5 * forcingTerm[BN]; - mfaaa = rho * c1o3 * (mfaaa) + 0.5 * forcingTerm[BSW]; - mfcaa = rho * c1o3 * (mfcaa) + 0.5 * forcingTerm[BSE]; - mfaca = rho * c1o3 * (mfaca) + 0.5 * forcingTerm[BNW]; - mfcca = rho * c1o3 * (mfcca) + 0.5 * forcingTerm[BNE]; - mfbbb = rho * c1o3 * (mfbbb) + 0.5 * forcingTerm[REST]; + mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00]; + mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[DIR_0P0]; + mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[DIR_00P]; + mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[DIR_PP0]; + mfacb = rho * c1o3 * (mfacb) + 0.5 * forcingTerm[DIR_MP0]; + mfcbc = rho * c1o3 * (mfcbc) + 0.5 * forcingTerm[DIR_P0P]; + mfabc = rho * c1o3 * (mfabc) + 0.5 * forcingTerm[DIR_M0P]; + mfbcc = rho * c1o3 * (mfbcc) + 0.5 * forcingTerm[DIR_0PP]; + mfbac = rho * c1o3 * (mfbac) + 0.5 * forcingTerm[DIR_0MP]; + mfccc = rho * c1o3 * (mfccc) + 0.5 * forcingTerm[DIR_PPP]; + mfacc = rho * c1o3 * (mfacc) + 0.5 * forcingTerm[DIR_MPP]; + mfcac = rho * c1o3 * (mfcac) + 0.5 * forcingTerm[DIR_PMP]; + mfaac = rho * c1o3 * (mfaac) + 0.5 * forcingTerm[DIR_MMP]; + mfabb = rho * c1o3 * (mfabb) + 0.5 * forcingTerm[DIR_M00]; + mfbab = rho * c1o3 * (mfbab) + 0.5 * forcingTerm[DIR_0M0]; + mfbba = rho * c1o3 * (mfbba) + 0.5 * forcingTerm[DIR_00M]; + mfaab = rho * c1o3 * (mfaab) + 0.5 * forcingTerm[DIR_MM0]; + mfcab = rho * c1o3 * (mfcab) + 0.5 * forcingTerm[DIR_PM0]; + mfaba = rho * c1o3 * (mfaba) + 0.5 * forcingTerm[DIR_M0M]; + mfcba = rho * c1o3 * (mfcba) + 0.5 * forcingTerm[DIR_P0M]; + mfbaa = rho * c1o3 * (mfbaa) + 0.5 * forcingTerm[DIR_0MM]; + mfbca = rho * c1o3 * (mfbca) + 0.5 * forcingTerm[DIR_0PM]; + mfaaa = rho * c1o3 * (mfaaa) + 0.5 * forcingTerm[DIR_MMM]; + mfcaa = rho * c1o3 * (mfcaa) + 0.5 * forcingTerm[DIR_PMM]; + mfaca = rho * c1o3 * (mfaca) + 0.5 * forcingTerm[DIR_MPM]; + mfcca = rho * c1o3 * (mfcca) + 0.5 * forcingTerm[DIR_PPM]; + mfbbb = rho * c1o3 * (mfbbb) + 0.5 * forcingTerm[DIR_000]; ////////////////////////////////////////////////////////////////////////// // write distribution for F @@ -1085,84 +1091,84 @@ void MultiphaseCumulantLBMKernel::calculate(int step) ///////////////////// PHASE-FIELD BGK SOLVER /////////////////////////////// - h[E] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); - h[N] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); - h[T] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); - h[NE] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); - h[NW] = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); - h[TE] = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); - h[TW] = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); - h[TN] = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); - h[TS] = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); - h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); - h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); - h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); - h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); - - h[W] = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); - h[S] = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); - h[B] = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); - h[SW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); - h[SE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); - h[BW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); - h[BE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); - h[BS] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); - h[BN] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); - h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); - h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); - h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); - h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); - - h[REST] = (*this->zeroDistributionsH)(x1, x2, x3); + h[DIR_P00] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH)(x1, x2, x3); for (int dir = STARTF; dir < (ENDF + 1); dir++) { LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz; LBMReal velSq1 = velProd * velProd; LBMReal hEq; //, gEq; - if (dir != REST) { + if (dir != DIR_000) { LBMReal dirGrad_phi = (phi[dir] - phi[INVDIR[dir]]) / 2.0; - LBMReal hSource = (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST]) * (dirGrad_phi) / denom; - hEq = phi[REST] * WEIGTH[dir] * (1.0 + 3.0 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)) + hSource * WEIGTH[dir]; + LBMReal hSource = (tauH - 0.5) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * (dirGrad_phi) / denom; + hEq = phi[DIR_000] * WEIGTH[dir] * (1.0 + 3.0 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)) + hSource * WEIGTH[dir]; // This corresponds with the collision factor of 1.0 which equals (tauH + 0.5). h[dir] = h[dir] - (h[dir] - hEq) / (tauH); } else { - hEq = phi[REST] * WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); - h[REST] = h[REST] - (h[REST] - hEq) / (tauH); + hEq = phi[DIR_000] * WEIGTH[DIR_000] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); + h[DIR_000] = h[DIR_000] - (h[DIR_000] - hEq) / (tauH); } } - (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3) = h[D3Q27System::INV_E]; - (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3) = h[D3Q27System::INV_N]; - (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3) = h[D3Q27System::INV_T]; - (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3) = h[D3Q27System::INV_NE]; - (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3) = h[D3Q27System::INV_NW]; - (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3) = h[D3Q27System::INV_TE]; - (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3) = h[D3Q27System::INV_TW]; - (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3) = h[D3Q27System::INV_TN]; - (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3) = h[D3Q27System::INV_TS]; - (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3) = h[D3Q27System::INV_TNE]; - (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3) = h[D3Q27System::INV_TNW]; - (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3) = h[D3Q27System::INV_TSE]; - (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = h[D3Q27System::INV_TSW]; - - (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3) = h[D3Q27System::INV_W]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3) = h[D3Q27System::INV_S]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p) = h[D3Q27System::INV_B]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3) = h[D3Q27System::INV_SW]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3) = h[D3Q27System::INV_SE]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p) = h[D3Q27System::INV_BW]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p) = h[D3Q27System::INV_BE]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p) = h[D3Q27System::INV_BS]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p) = h[D3Q27System::INV_BN]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = h[D3Q27System::INV_BSW]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p) = h[D3Q27System::INV_BSE]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p) = h[D3Q27System::INV_BNW]; - (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p) = h[D3Q27System::INV_BNE]; - - (*this->zeroDistributionsH)(x1, x2, x3) = h[D3Q27System::REST]; + (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3) = h[D3Q27System::INV_P00]; + (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3) = h[D3Q27System::INV_0P0]; + (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3) = h[D3Q27System::INV_00P]; + (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3) = h[D3Q27System::INV_PP0]; + (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3) = h[D3Q27System::INV_MP0]; + (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3) = h[D3Q27System::INV_P0P]; + (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3) = h[D3Q27System::INV_M0P]; + (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3) = h[D3Q27System::INV_0PP]; + (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3) = h[D3Q27System::INV_0MP]; + (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3) = h[D3Q27System::INV_PPP]; + (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3) = h[D3Q27System::INV_MPP]; + (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3) = h[D3Q27System::INV_PMP]; + (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = h[D3Q27System::INV_MMP]; + + (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3) = h[D3Q27System::INV_M00]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3) = h[D3Q27System::INV_0M0]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p) = h[D3Q27System::INV_00M]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3) = h[D3Q27System::INV_MM0]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3) = h[D3Q27System::INV_PM0]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p) = h[D3Q27System::INV_M0M]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p) = h[D3Q27System::INV_P0M]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p) = h[D3Q27System::INV_0MM]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p) = h[D3Q27System::INV_0PM]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = h[D3Q27System::INV_MMM]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p) = h[D3Q27System::INV_PMM]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p) = h[D3Q27System::INV_MPM]; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p) = h[D3Q27System::INV_PPM]; + + (*this->zeroDistributionsH)(x1, x2, x3) = h[D3Q27System::DIR_000]; ///////////////////// END OF OLD BGK SOLVER /////////////////////////////// } @@ -1209,7 +1215,7 @@ LBMReal MultiphaseCumulantLBMKernel::nabla2_phi() using namespace D3Q27System; LBMReal sum = 0.0; for (int k = FSTARTDIR; k <= FENDDIR; k++) { - sum += WEIGTH[k] * (phi[k] - phi[REST]); + sum += WEIGTH[k] * (phi[k] - phi[DIR_000]); } return 6.0 * sum; } @@ -1236,35 +1242,35 @@ void MultiphaseCumulantLBMKernel::computePhasefield() int x2p = x2 + 1; int x3p = x3 + 1; - h[E] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); - h[N] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); - h[T] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); - h[NE] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); - h[NW] = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); - h[TE] = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); - h[TW] = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); - h[TN] = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); - h[TS] = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); - h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); - h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); - h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); - h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); - - h[W] = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); - h[S] = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); - h[B] = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); - h[SW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); - h[SE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); - h[BW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); - h[BE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); - h[BS] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); - h[BN] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); - h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); - h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); - h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); - h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); - - h[REST] = (*this->zeroDistributionsH)(x1, x2, x3); + h[DIR_P00] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH)(x1, x2, x3); } } } @@ -1278,7 +1284,7 @@ void MultiphaseCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1 SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); - phi[REST] = (*ph)(x1, x2, x3); + phi[DIR_000] = (*ph)(x1, x2, x3); for (int k = FSTARTDIR; k <= FENDDIR; k++) { diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h index 0985242ba6b79dc03e7940498f24c542f475a64a..fdc47f340dbfaadfd40f4f62885350a82f2cc202 100644 --- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseCumulantLBMKernel.h @@ -91,6 +91,7 @@ protected: mu::value_type muX1,muX2,muX3; mu::value_type muDeltaT; mu::value_type muNu; + mu::value_type muRho; LBMReal forcingX1; LBMReal forcingX2; LBMReal forcingX3; diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bd4df8aea33d26b3db75af3e00df564b7ded3efe --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.cpp @@ -0,0 +1,1669 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphasePressureFilterCompressibleAirLBMKernel.cpp +//! \ingroup LBMKernel +//! \author M. Geier, K. Kutscher, Hesameddin Safari +//======================================================================================= + +#include "MultiphasePressureFilterCompressibleAirLBMKernel.h" +#include "BCArray3D.h" +#include "Block3D.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "D3Q27System.h" +#include "DataSet3D.h" +#include "LBMKernel.h" +#include <cmath> + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +MultiphasePressureFilterCompressibleAirLBMKernel::MultiphasePressureFilterCompressibleAirLBMKernel() { this->compressible = false; } +////////////////////////////////////////////////////////////////////////// +void MultiphasePressureFilterCompressibleAirLBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); + SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field + + SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new CbArray3D<LBMReal, IndexerX3X2X1>( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + dataSet->setFdistributions(f); + dataSet->setHdistributions(h); // For phase-field + dataSet->setPhaseField(divU1); + dataSet->setPressureField(pressure); + + phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0)); + + divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> MultiphasePressureFilterCompressibleAirLBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new MultiphasePressureFilterCompressibleAirLBMKernel()); + kernel->setNX(nx); + dynamicPointerCast<MultiphasePressureFilterCompressibleAirLBMKernel>(kernel)->initDataSet(); + kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG); + kernel->setDensityRatio(this->densityRatio); + kernel->setMultiphaseModelParameters(this->beta, this->kappa); + kernel->setContactAngle(this->contactAngle); + kernel->setPhiL(this->phiL); + kernel->setPhiH(this->phiH); + kernel->setPhaseFieldRelaxation(this->tauH); + kernel->setMobility(this->mob); + kernel->setInterfaceWidth(this->interfaceWidth); + + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + kernel->setGhostLayerWidth(2); + dynamicPointerCast<MultiphasePressureFilterCompressibleAirLBMKernel>(kernel)->initForcing(); + + return kernel; +} +////////////////////////////////////////////////////////////////////////// +void MultiphasePressureFilterCompressibleAirLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m2 = mfa + mfc; + LBMReal m1 = mfc - mfa; + LBMReal m0 = m2 + mfb; + mfa = m0; + m0 *= Kinverse; + m0 += oneMinusRho; + mfb = (m1 * Kinverse - m0 * vv) * K; + mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; +} + +//////////////////////////////////////////////////////////////////////////////// +void MultiphasePressureFilterCompressibleAirLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K; + LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K; + mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K; + mfa = m0; + mfb = m1; +} + + +//////////////////////////////////////////////////////////////////////////////// +void MultiphasePressureFilterCompressibleAirLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal m1 = (mfa + mfc) + mfb; + LBMReal m2 = mfc - mfa; + mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); + mfb = m2 - vv * m1; + mfa = m1; +} + + +void MultiphasePressureFilterCompressibleAirLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); + LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; + mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); + mfb = mb; + mfa = ma; +} + + +void MultiphasePressureFilterCompressibleAirLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + using namespace UbMath; + + forcingX1 = 0.0; + forcingX2 = 0.0; + forcingX3 = 0.0; + + LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5; + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + localDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions(); + nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions(); + zeroDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions(); + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) { + for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) { + for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + (*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc)) ) + + (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) + + ((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) + + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb; + + ////// read F-distributions for velocity formalism + + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); //Incompressible + //LBMReal rho = rhoH + rhoToPhi * ((*pressure)(x1, x2, x3) - phiH); //wrong? + //! variable density -> TRANSFER! + //LBMReal rho = rhoH * ((*phaseField)(x1, x2, x3)) + rhoL * ((*phaseField2)(x1, x2, x3)); + + (*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + rho * c1o3 * drho; + + //(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3; + ////!!!!!! relplace by pointer swap! + //(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3); + } + } + } + } + + LBMReal collFactorM; + + ////Periodic Filter + for (int x3 = minX3-1; x3 <= maxX3; x3++) { + for (int x2 = minX2-1; x2 <= maxX2; x2++) { + for (int x1 = minX1-1; x1 <= maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + + LBMReal sum = 0.; + + ///Version for boundaries + for (int xx = -1; xx <= 1; xx++) { + //int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0; + int xxx = xx + x1; + + for (int yy = -1; yy <= 1; yy++) { + //int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0; + int yyy = yy + x2; + + for (int zz = -1; zz <= 1; zz++) { + //int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0; + int zzz = zz + x3; + + if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) { + sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz); + } + else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3); + } + + + } + } + } + (*pressure)(x1, x2, x3) = sum; + } + } + } + } + + ////!filter + + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + ////////////////////////////////////////////////////////////////////////// + // Read distributions and phase field + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + // E N T + // c c c + ////////// + // W S B + // a a a + + // Rest ist b + + // mfxyz + // a - negative + // b - null + // c - positive + + // a b c + //-1 0 1 + + findNeighbors(phaseField, x1, x2, x3); + + LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal dX1_phi = gradX1_phi(); + LBMReal dX2_phi = gradX2_phi(); + LBMReal dX3_phi = gradX3_phi(); + + LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9; + LBMReal normX1 = dX1_phi / denom; + LBMReal normX2 = dX2_phi / denom; + LBMReal normX3 = dX3_phi / denom; + + + + collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL); + + + LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(); + + //----------- Calculating Macroscopic Values ------------- + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); //Incompressible + //LBMReal rho = rhoL + (rhoH - rhoL) * phi[REST] + (one - phi[REST]) * (*pressure)(x1, x2, x3) * three; //compressible + + LBMReal m0, m1, m2; + LBMReal rhoRef=c1; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb))/rhoRef; + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab))/rhoRef; + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba))/rhoRef; + + LBMReal gradPx = 0.0; + LBMReal gradPy = 0.0; + LBMReal gradPz = 0.0; + for (int dir1 = -1; dir1 <= 1; dir1++) { + for (int dir2 = -1; dir2 <= 1; dir2++) { + int yyy = x2 + dir1; + int zzz = x3 + dir2; + if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) { + gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) { + gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + int xxx = x1 + dir1; + if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) { + gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) { + gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + yyy = x2 + dir2; + if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) { + gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) { + gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + } + } + + //Viscosity increase by pressure gradient + LBMReal errPhi = (((1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale)- denom); + //LBMReal limVis = 0.0000001*10;//0.01; + // collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM); + // collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM; + errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi; + //collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis); + + //3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW]))) + //+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) + + //+WEIGTH[N] * (phi2[T] - phi2[B])); + + muRho = rho; + + forcingX1 = muForcingX1.Eval()/rho - gradPx/rho; + forcingX2 = muForcingX2.Eval()/rho - gradPy/rho; + forcingX3 = muForcingX3.Eval()/rho - gradPz/rho; + + vvx += forcingX1 * deltaT * 0.5; // X + vvy += forcingX2 * deltaT * 0.5; // Y + vvz += forcingX3 * deltaT * 0.5; // Z + + ///surface tension force + vvx += mu * dX1_phi * c1o2 / rho; + vvy += mu * dX2_phi * c1o2 / rho ; + vvz += mu * dX3_phi * c1o2 / rho; + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!! + + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + + // mfaaa = 0.0; + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + // LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + // LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + /////fourth order parameters; here only for test. Move out of loop! + + LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0))); + LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); + // LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); + LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' ) + LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + + // LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho)); + mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa + //mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); + LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; + + LBMReal Dxy = -three * collFactorM * mfbba; + LBMReal Dxz = -three * collFactorM * mfbab; + LBMReal Dyz = -three * collFactorM * mfabb; + + //relax + mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorM * (-mfabb); + mfbab += collFactorM * (-mfbab); + mfbba += collFactorM * (-mfbba); + + ////updated pressure + //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; + mfaaa = 0.0; // Pressure elimination as in standard velocity model + // mfaaa += (rho - c1) * (dxux + dyuy + dzuz); + + mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa + + // mxxPyyPzz += (mfaaa + mfaaaS) * c1o2; + //mfaaa = mfaaaS; + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc); + CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac); + CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca); + CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc); + CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb); + CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho; + + + //////// + + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho); + mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho); + mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho); + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// + //#ifdef PROOF_CORRECTNESS + LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + // //LBMReal dif = fabs(drho - rho_post); + // LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post; + //#ifdef SINGLEPRECISION + // if (dif > 10.0E-7 || dif < -10.0E-7) + //#else + // if (dif > 10.0E-15 || dif < -10.0E-15) + //#endif + // { + // UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post) + // + " dif=" + UbSystem::toString(dif) + // + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + // //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); + // //exit(EXIT_FAILURE); + // } + //#endif + + if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post)) + UB_THROW(UbException( + UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," + + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac ;//* rho * c1o3; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3; + // !Old Kernel +///////////////////// P H A S E - F I E L D S O L V E R +//////////////////////////////////////////// +/////CUMULANT PHASE-FIELD + LBMReal omegaD =1.0/( 3.0 * mob + 0.5); + { + mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // second component + LBMReal concentration = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal oneMinusRho = c1- concentration; + + LBMReal cx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal cy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal cz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal cx2 = cx * cx; + LBMReal cy2 = cy * cy; + LBMReal cz2 = cz * cz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfaab, mfabb, mfacb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + forwardChimera(mfaba, mfbba, mfcba, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfaab, mfbab, mfcab, cx, cx2); + forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + //! - experimental Cumulant ... to be published ... hopefully + //! + + // linearized orthogonalization of 3rd order central moments + LBMReal Mabc = mfabc - mfaba * c1o3; + LBMReal Mbca = mfbca - mfbaa * c1o3; + LBMReal Macb = mfacb - mfaab * c1o3; + LBMReal Mcba = mfcba - mfaba * c1o3; + LBMReal Mcab = mfcab - mfaab * c1o3; + LBMReal Mbac = mfbac - mfbaa * c1o3; + // linearized orthogonalization of 5th order central moments + LBMReal Mcbc = mfcbc - mfaba * c1o9; + LBMReal Mbcc = mfbcc - mfbaa * c1o9; + LBMReal Mccb = mfccb - mfaab * c1o9; + + // collision of 1st order moments + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + + cx2 = cx * cx; + cy2 = cy * cy; + cz2 = cz * cz; + + // equilibration of 2nd order moments + mfbba = zeroReal; + mfbab = zeroReal; + mfabb = zeroReal; + + mfcaa = c1o3 * concentration; + mfaca = c1o3 * concentration; + mfaac = c1o3 * concentration; + + // equilibration of 3rd order moments + Mabc = zeroReal; + Mbca = zeroReal; + Macb = zeroReal; + Mcba = zeroReal; + Mcab = zeroReal; + Mbac = zeroReal; + mfbbb = zeroReal; + + // from linearized orthogonalization 3rd order central moments to central moments + mfabc = Mabc + mfaba * c1o3; + mfbca = Mbca + mfbaa * c1o3; + mfacb = Macb + mfaab * c1o3; + mfcba = Mcba + mfaba * c1o3; + mfcab = Mcab + mfaab * c1o3; + mfbac = Mbac + mfbaa * c1o3; + + // equilibration of 4th order moments + mfacc = c1o9 * concentration; + mfcac = c1o9 * concentration; + mfcca = c1o9 * concentration; + + mfcbb = zeroReal; + mfbcb = zeroReal; + mfbbc = zeroReal; + + // equilibration of 5th order moments + Mcbc = zeroReal; + Mbcc = zeroReal; + Mccb = zeroReal; + + // from linearized orthogonalization 5th order central moments to central moments + mfcbc = Mcbc + mfaba * c1o9; + mfbcc = Mbcc + mfbaa * c1o9; + mfccb = Mccb + mfaab * c1o9; + + // equilibration of 6th order moment + mfccc = c1o27 * concentration; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + backwardChimera(mfaba, mfbba, mfcba, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfaab, mfbab, mfcab, cx, cx2); + backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfaab, mfabb, mfacb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + + + (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3 ) = mfcbb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3 ) = mfbcb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3 ) = mfccb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3 ) = mfacb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb; + } + } + } + } + } +} +////////////////////////////////////////////////////////////////////////// + +LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX1_phi() +{ + using namespace D3Q27System; + return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00])); +} + +LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX2_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0])); +} + +LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX3_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M])); +} + +LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX1_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00])); +} + +LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX2_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0])); +} + +LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::gradX3_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M])); +} + +LBMReal MultiphasePressureFilterCompressibleAirLBMKernel::nabla2_phi() +{ + using namespace D3Q27System; + LBMReal sum = 0.0; + sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000]))) + + (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000])))); + sum += WEIGTH[DIR_0PP] * ( + (((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000]))) + + (((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000]))) + + (((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000]))) + ); + sum += WEIGTH[DIR_00P] * ( + ((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000])) + + ((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000])) + + ((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000])) + ); + + return 6.0 * sum; +} + +void MultiphasePressureFilterCompressibleAirLBMKernel::computePhasefield() +{ + using namespace D3Q27System; + SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth; + int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth; + int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth; + + //------------- Computing the phase-field ------------------ + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + // if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + h[DIR_P00] = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3); + } + } + } + } +} + +void MultiphasePressureFilterCompressibleAirLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } else { + phi[k] = 0.0; + } + } +} + +void MultiphasePressureFilterCompressibleAirLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi2[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } + else { + phi2[k] = 0.0; + } + } +} + +void MultiphasePressureFilterCompressibleAirLBMKernel::swapDistributions() +{ + LBMKernel::swapDistributions(); + dataSet->getHdistributions()->swap(); +} + +void MultiphasePressureFilterCompressibleAirLBMKernel::initForcing() +{ + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + + muForcingX1.DefineVar("rho",&muRho); + muForcingX2.DefineVar("rho",&muRho); + muForcingX3.DefineVar("rho",&muRho); + +} diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h new file mode 100644 index 0000000000000000000000000000000000000000..e15f29e0434c0d5f59977226cab91455f2a39f70 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterCompressibleAirLBMKernel.h @@ -0,0 +1,116 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphasePressureFilterCompressibleAirLBMKernel.h +//! \ingroup LBMKernel +//! \author M. Geier, K. Kutscher, Hesameddin Safari +//======================================================================================= + +#ifndef MultiphasePressureFilterCompressibleAirLBMKernel_H +#define MultiphasePressureFilterCompressibleAirLBMKernel_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +//! \brief Multiphase Cascaded Cumulant LBM kernel. +//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model +//! \author M. Geier, K. Kutscher, Hesameddin Safari +class MultiphasePressureFilterCompressibleAirLBMKernel : public LBMKernel +{ +public: + MultiphasePressureFilterCompressibleAirLBMKernel(); + virtual ~MultiphasePressureFilterCompressibleAirLBMKernel(void) = default; + void calculate(int step) override; + SPtr<LBMKernel> clone() override; + + + ///refactor + //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure; + + + double getCalculationTime() override { return .0; } +protected: + virtual void initDataSet(); + void swapDistributions() override; + + void initForcing(); + + void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + + LBMReal f1[D3Q27System::ENDF+1]; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH1; + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld; + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU; + + LBMReal h [D3Q27System::ENDF+1]; + LBMReal h2[D3Q27System::ENDF + 1]; + LBMReal g [D3Q27System::ENDF+1]; + LBMReal phi[D3Q27System::ENDF+1]; + LBMReal phi2[D3Q27System::ENDF + 1]; + LBMReal pr1[D3Q27System::ENDF+1]; + LBMReal phi_cutoff[D3Q27System::ENDF+1]; + + LBMReal gradX1_phi(); + LBMReal gradX2_phi(); + LBMReal gradX3_phi(); + LBMReal gradX1_phi2(); + LBMReal gradX2_phi2(); + LBMReal gradX3_phi2(); + void computePhasefield(); + void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3); + void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3); + + LBMReal nabla2_phi(); + + mu::value_type muX1,muX2,muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + mu::value_type muRho; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; +}; + +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e1d24a2272f0846a29045bd9438db6b0dc729d36 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.cpp @@ -0,0 +1,1773 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphasePressureFilterLBMKernel.cpp +//! \ingroup LBMKernel +//! \author M. Geier, K. Kutscher, Hesameddin Safari +//======================================================================================= + +#include "MultiphasePressureFilterLBMKernel.h" +#include "BCArray3D.h" +#include "Block3D.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "D3Q27System.h" +#include "DataSet3D.h" +#include "LBMKernel.h" +#include <cmath> + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +MultiphasePressureFilterLBMKernel::MultiphasePressureFilterLBMKernel() { this->compressible = false; } +////////////////////////////////////////////////////////////////////////// +void MultiphasePressureFilterLBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); // For phase-field + + //SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new CbArray3D<LBMReal, IndexerX3X2X1>( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + dataSet->setFdistributions(f); + dataSet->setHdistributions(h); // For phase-field + //dataSet->setPhaseField(divU1); + dataSet->setPressureField(pressure); + + phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + + divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> MultiphasePressureFilterLBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new MultiphasePressureFilterLBMKernel()); + kernel->setNX(nx); + dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->initDataSet(); + kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG); + kernel->setDensityRatio(this->densityRatio); + kernel->setMultiphaseModelParameters(this->beta, this->kappa); + kernel->setContactAngle(this->contactAngle); + kernel->setPhiL(this->phiL); + kernel->setPhiH(this->phiH); + kernel->setPhaseFieldRelaxation(this->tauH); + kernel->setMobility(this->mob); + kernel->setInterfaceWidth(this->interfaceWidth); + + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + kernel->setGhostLayerWidth(2); + dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->initForcing(); + dynamicPointerCast<MultiphasePressureFilterLBMKernel>(kernel)->setPhaseFieldBC(this->phaseFieldBC); + + return kernel; +} +////////////////////////////////////////////////////////////////////////// +void MultiphasePressureFilterLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m2 = mfa + mfc; + LBMReal m1 = mfc - mfa; + LBMReal m0 = m2 + mfb; + mfa = m0; + m0 *= Kinverse; + m0 += oneMinusRho; + mfb = (m1 * Kinverse - m0 * vv) * K; + mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; +} + +//////////////////////////////////////////////////////////////////////////////// +void MultiphasePressureFilterLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K; + LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K; + mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K; + mfa = m0; + mfb = m1; +} + + +//////////////////////////////////////////////////////////////////////////////// +void MultiphasePressureFilterLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal m1 = (mfa + mfc) + mfb; + LBMReal m2 = mfc - mfa; + mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); + mfb = m2 - vv * m1; + mfa = m1; +} + + +void MultiphasePressureFilterLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); + LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; + mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); + mfb = mb; + mfa = ma; +} + + +void MultiphasePressureFilterLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + using namespace UbMath; + + forcingX1 = 0.0; + forcingX2 = 0.0; + forcingX3 = 0.0; + + LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5; + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + localDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions(); + nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions(); + zeroDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions(); + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) { + for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) { + for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + (*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc)) ) + + (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) + + ((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) + + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb; + + ////// read F-distributions for velocity formalism + + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); + + (*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + rho * c1o3 * drho; + } + } + } + } + + LBMReal collFactorM; + + ////Periodic Filter + for (int x3 = minX3-1; x3 <= maxX3; x3++) { + for (int x2 = minX2-1; x2 <= maxX2; x2++) { + for (int x1 = minX1-1; x1 <= maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + + LBMReal sum = 0.; + + ///Version for boundaries + for (int xx = -1; xx <= 1; xx++) { + //int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0; + int xxx = xx + x1; + + for (int yy = -1; yy <= 1; yy++) { + //int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0; + int yyy = yy + x2; + + for (int zz = -1; zz <= 1; zz++) { + //int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0; + int zzz = zz + x3; + + if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) { + sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz); + } + else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3); + } + + + } + } + } + (*pressure)(x1, x2, x3) = sum; + } + } + } + } + + ////!filter + + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + ////////////////////////////////////////////////////////////////////////// + // Read distributions and phase field + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + // E N T + // c c c + ////////// + // W S B + // a a a + + // Rest ist b + + // mfxyz + // a - negative + // b - null + // c - positive + + // a b c + //-1 0 1 + + findNeighbors(phaseField, x1, x2, x3); + + LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal dX1_phi = gradX1_phi(); + LBMReal dX2_phi = gradX2_phi(); + LBMReal dX3_phi = gradX3_phi(); + + LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9; + LBMReal normX1 = dX1_phi / denom; + LBMReal normX2 = dX2_phi / denom; + LBMReal normX3 = dX3_phi / denom; + + dX1_phi = normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + dX2_phi = normX2 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + dX3_phi = normX3 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + + collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL); + + + LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(); + + //----------- Calculating Macroscopic Values ------------- + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); + + LBMReal m0, m1, m2; + LBMReal rhoRef=c1; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb))/rhoRef; + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab))/rhoRef; + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba))/rhoRef; + + LBMReal gradPx = 0.0; + LBMReal gradPy = 0.0; + LBMReal gradPz = 0.0; + for (int dir1 = -1; dir1 <= 1; dir1++) { + for (int dir2 = -1; dir2 <= 1; dir2++) { + int yyy = x2 + dir1; + int zzz = x3 + dir2; + if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) { + gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) { + gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + int xxx = x1 + dir1; + if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) { + gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) { + gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + yyy = x2 + dir2; + if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) { + gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) { + gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + } + } + + //Viscosity increase by pressure gradient + LBMReal errPhi = (((1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale)- denom); + //LBMReal limVis = 0.0000001*10;//0.01; + // collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM); + // collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM; + errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi; + //collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis); + + //3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW]))) + //+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) + + //+WEIGTH[N] * (phi2[T] - phi2[B])); + + muRho = rho; + + forcingX1 = muForcingX1.Eval()/rho - gradPx/rho; + forcingX2 = muForcingX2.Eval()/rho - gradPy/rho; + forcingX3 = muForcingX3.Eval()/rho - gradPz/rho; + + forcingX1 += mu * dX1_phi / rho; + forcingX2 += mu * dX2_phi / rho; + forcingX3 += mu * dX3_phi / rho; + + vvx += forcingX1 * deltaT * 0.5; // X + vvy += forcingX2 * deltaT * 0.5; // Y + vvz += forcingX3 * deltaT * 0.5; // Z + + ///surface tension force + //vvx += mu * dX1_phi * c1o2 / rho; + //vvy += mu * dX2_phi * c1o2 / rho ; + //vvz += mu * dX3_phi * c1o2 / rho; + + //Abbas + LBMReal pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; + + LBMReal M200 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)))) + + ((mfabb + mfcbb)))); + LBMReal M020 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + + ((mfbab + mfbcb)))); + LBMReal M002 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + + (+((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + + ((mfbba + mfbbc)))); + + LBMReal M110 = ((((((mfaaa + mfccc) + (-mfcac - mfaca)) + ((mfaac + mfcca) + (-mfcaa - mfacc))) + + (((mfaab + mfccb) + (-mfacb - mfcab)))) + )); + LBMReal M101 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcac + mfaca) - (mfcaa + mfacc))) + + (((mfaba + mfcbc) + (-mfabc - mfcba)))) + )); + LBMReal M011 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcaa + mfacc) - (mfcac + mfaca))) + + (((mfbaa + mfbcc) + (-mfbac - mfbca)))) + )); + LBMReal vvxI = vvx; + LBMReal vvyI = vvy; + LBMReal vvzI = vvz; + + //LBMReal collFactorStore = collFactorM; + //LBMReal stress; + for (int iter = 0; iter < 1; iter++) { + LBMReal OxxPyyPzz = 1.0; + LBMReal mxxPyyPzz = (M200 - vvxI * vvxI) + (M020 - vvyI * vvyI) + (M002 - vvzI * vvzI); + mxxPyyPzz -= c3 * pStar; + + LBMReal mxxMyy = (M200 - vvxI * vvxI) - (M020 - vvyI * vvyI); + LBMReal mxxMzz = (M200 - vvxI * vvxI) - (M002 - vvzI * vvzI); + LBMReal mxy = M110 - vvxI * vvyI; + LBMReal mxz = M101 - vvxI * vvzI; + LBMReal myz = M011 - vvyI * vvzI; + + ///////Bingham + //LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); + //LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; + //LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; + //LBMReal Dxy = -three * collFactorM * mxy; + //LBMReal Dxz = -three * collFactorM * mxz; + //LBMReal Dyz = -three * collFactorM * myz; + + //LBMReal tau0 = phi[REST] * 1.0e-7;//(phi[REST]>0.01)?1.0e-6: 0; + //LBMReal shearRate =fabs(pStar)*0.0e-2+ sqrt(c2 * (dxux * dxux + dyuy * dyuy + dzuz * dzuz) + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho); + //collFactorM = collFactorM * (UbMath::one - (collFactorM * tau0) / (shearRate * c1o3 /* *rho*/ + 1.0e-15)); + //collFactorM = (collFactorM < -1000000) ? -1000000 : collFactorM; + ////if(collFactorM < 0.1) { + //// int test = 1; + ////} + //////!Bingham + + + mxxMyy *= c1 - collFactorM * c1o2; + mxxMzz *= c1 - collFactorM * c1o2; + mxy *= c1 - collFactorM * c1o2; + mxz *= c1 - collFactorM * c1o2; + myz *= c1 - collFactorM * c1o2; + mxxPyyPzz *= c1 - OxxPyyPzz * c1o2; + //mxxPyyPzz += c3o2 * pStar; + LBMReal mxx = (mxxMyy + mxxMzz + mxxPyyPzz) * c1o3; + LBMReal myy = (-c2 * mxxMyy + mxxMzz + mxxPyyPzz) * c1o3; + LBMReal mzz = (mxxMyy - c2 * mxxMzz + mxxPyyPzz) * c1o3; + vvxI = vvx - (mxx * dX1_phi + mxy * dX2_phi + mxz * dX3_phi) * rhoToPhi / (rho); + vvyI = vvy - (mxy * dX1_phi + myy * dX2_phi + myz * dX3_phi) * rhoToPhi / (rho); + vvzI = vvz - (mxz * dX1_phi + myz * dX2_phi + mzz * dX3_phi) * rhoToPhi / (rho); + + + + } + + + forcingX1 += c2 * (vvxI - vvx); + forcingX2 += c2 * (vvyI - vvy); + forcingX3 += c2 * (vvzI - vvz); + + mfabb += c1o2 * (-forcingX1) * c2o9; + mfbab += c1o2 * (-forcingX2) * c2o9; + mfbba += c1o2 * (-forcingX3) * c2o9; + mfaab += c1o2 * (-forcingX1 - forcingX2) * c1o18; + mfcab += c1o2 * (forcingX1 - forcingX2) * c1o18; + mfaba += c1o2 * (-forcingX1 - forcingX3) * c1o18; + mfcba += c1o2 * (forcingX1 - forcingX3) * c1o18; + mfbaa += c1o2 * (-forcingX2 - forcingX3) * c1o18; + mfbca += c1o2 * (forcingX2 - forcingX3) * c1o18; + mfaaa += c1o2 * (-forcingX1 - forcingX2 - forcingX3) * c1o72; + mfcaa += c1o2 * (forcingX1 - forcingX2 - forcingX3) * c1o72; + mfaca += c1o2 * (-forcingX1 + forcingX2 - forcingX3) * c1o72; + mfcca += c1o2 * (forcingX1 + forcingX2 - forcingX3) * c1o72; + mfcbb += c1o2 * (forcingX1)*c2o9; + mfbcb += c1o2 * (forcingX2)*c2o9; + mfbbc += c1o2 * (forcingX3)*c2o9; + mfccb += c1o2 * (forcingX1 + forcingX2) * c1o18; + mfacb += c1o2 * (-forcingX1 + forcingX2) * c1o18; + mfcbc += c1o2 * (forcingX1 + forcingX3) * c1o18; + mfabc += c1o2 * (-forcingX1 + forcingX3) * c1o18; + mfbcc += c1o2 * (forcingX2 + forcingX3) * c1o18; + mfbac += c1o2 * (-forcingX2 + forcingX3) * c1o18; + mfccc += c1o2 * (forcingX1 + forcingX2 + forcingX3) * c1o72; + mfacc += c1o2 * (-forcingX1 + forcingX2 + forcingX3) * c1o72; + mfcac += c1o2 * (forcingX1 - forcingX2 + forcingX3) * c1o72; + mfaac += c1o2 * (-forcingX1 - forcingX2 + forcingX3) * c1o72; + + + + vvx = vvxI; + vvy = vvyI; + vvz = vvzI; + + //!Abbas + + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!! + + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + + // mfaaa = 0.0; + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + // LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + // LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + /////fourth order parameters; here only for test. Move out of loop! + + LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0))); + LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); + LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); + LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' ) + LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + + // LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho)); + mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa + //mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); + LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; + + LBMReal Dxy = -three * collFactorM * mfbba; + LBMReal Dxz = -three * collFactorM * mfbab; + LBMReal Dyz = -three * collFactorM * mfabb; + + //relax + mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorM * (-mfabb); + mfbab += collFactorM * (-mfbab); + mfbba += collFactorM * (-mfbba); + + ////updated pressure + //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; + mfaaa = 0.0; // Pressure elimination as in standard velocity model + // mfaaa += (rho - c1) * (dxux + dyuy + dzuz); + + mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa + + // mxxPyyPzz += (mfaaa + mfaaaS) * c1o2; + //mfaaa = mfaaaS; + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + wadjust = Oxyz + (1. - Oxyz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc); + CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac); + CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca); + CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc); + CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb); + CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho; + + + //////// + + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + //mfbaa = -mfbaa; + //mfaba = -mfaba; + //mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + //mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho); + //mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho); + //mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho); + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + + ////forcing + + mfabb += c1o2 * (-forcingX1) * c2o9; + mfbab += c1o2 * (-forcingX2) * c2o9; + mfbba += c1o2 * (-forcingX3) * c2o9; + mfaab += c1o2 * (-forcingX1 - forcingX2) * c1o18; + mfcab += c1o2 * (forcingX1 - forcingX2) * c1o18; + mfaba += c1o2 * (-forcingX1 - forcingX3) * c1o18; + mfcba += c1o2 * (forcingX1 - forcingX3) * c1o18; + mfbaa += c1o2 * (-forcingX2 - forcingX3) * c1o18; + mfbca += c1o2 * (forcingX2 - forcingX3) * c1o18; + mfaaa += c1o2 * (-forcingX1 - forcingX2 - forcingX3) * c1o72; + mfcaa += c1o2 * (forcingX1 - forcingX2 - forcingX3) * c1o72; + mfaca += c1o2 * (-forcingX1 + forcingX2 - forcingX3) * c1o72; + mfcca += c1o2 * (forcingX1 + forcingX2 - forcingX3) * c1o72; + mfcbb += c1o2 * (forcingX1)*c2o9; + mfbcb += c1o2 * (forcingX2)*c2o9; + mfbbc += c1o2 * (forcingX3)*c2o9; + mfccb += c1o2 * (forcingX1 + forcingX2) * c1o18; + mfacb += c1o2 * (-forcingX1 + forcingX2) * c1o18; + mfcbc += c1o2 * (forcingX1 + forcingX3) * c1o18; + mfabc += c1o2 * (-forcingX1 + forcingX3) * c1o18; + mfbcc += c1o2 * (forcingX2 + forcingX3) * c1o18; + mfbac += c1o2 * (-forcingX2 + forcingX3) * c1o18; + mfccc += c1o2 * (forcingX1 + forcingX2 + forcingX3) * c1o72; + mfacc += c1o2 * (-forcingX1 + forcingX2 + forcingX3) * c1o72; + mfcac += c1o2 * (forcingX1 - forcingX2 + forcingX3) * c1o72; + mfaac += c1o2 * (-forcingX1 - forcingX2 + forcingX3) * c1o72; + + + + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// + //#ifdef PROOF_CORRECTNESS + LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + // //LBMReal dif = fabs(drho - rho_post); + // LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post; + //#ifdef SINGLEPRECISION + // if (dif > 10.0E-7 || dif < -10.0E-7) + //#else + // if (dif > 10.0E-15 || dif < -10.0E-15) + //#endif + // { + // UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post) + // + " dif=" + UbSystem::toString(dif) + // + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + // //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); + // //exit(EXIT_FAILURE); + // } + //#endif + + if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post)) + UB_THROW(UbException( + UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," + + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac ;//* rho * c1o3; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3; + // !Old Kernel +///////////////////// P H A S E - F I E L D S O L V E R +//////////////////////////////////////////// +/////CUMULANT PHASE-FIELD + LBMReal omegaD =1.0/( 3.0 * mob + 0.5); + { + mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // second component + LBMReal concentration = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal oneMinusRho = c1- concentration; + + LBMReal cx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal cy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal cz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal cx2 = cx * cx; + LBMReal cy2 = cy * cy; + LBMReal cz2 = cz * cz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfaab, mfabb, mfacb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + forwardChimera(mfaba, mfbba, mfcba, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfaab, mfbab, mfcab, cx, cx2); + forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + //! - experimental Cumulant ... to be published ... hopefully + //! + + // linearized orthogonalization of 3rd order central moments + LBMReal Mabc = mfabc - mfaba * c1o3; + LBMReal Mbca = mfbca - mfbaa * c1o3; + LBMReal Macb = mfacb - mfaab * c1o3; + LBMReal Mcba = mfcba - mfaba * c1o3; + LBMReal Mcab = mfcab - mfaab * c1o3; + LBMReal Mbac = mfbac - mfbaa * c1o3; + // linearized orthogonalization of 5th order central moments + LBMReal Mcbc = mfcbc - mfaba * c1o9; + LBMReal Mbcc = mfbcc - mfbaa * c1o9; + LBMReal Mccb = mfccb - mfaab * c1o9; + + // collision of 1st order moments + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + + cx2 = cx * cx; + cy2 = cy * cy; + cz2 = cz * cz; + + // equilibration of 2nd order moments + mfbba = zeroReal; + mfbab = zeroReal; + mfabb = zeroReal; + + mfcaa = c1o3 * concentration; + mfaca = c1o3 * concentration; + mfaac = c1o3 * concentration; + + // equilibration of 3rd order moments + Mabc = zeroReal; + Mbca = zeroReal; + Macb = zeroReal; + Mcba = zeroReal; + Mcab = zeroReal; + Mbac = zeroReal; + mfbbb = zeroReal; + + // from linearized orthogonalization 3rd order central moments to central moments + mfabc = Mabc + mfaba * c1o3; + mfbca = Mbca + mfbaa * c1o3; + mfacb = Macb + mfaab * c1o3; + mfcba = Mcba + mfaba * c1o3; + mfcab = Mcab + mfaab * c1o3; + mfbac = Mbac + mfbaa * c1o3; + + // equilibration of 4th order moments + mfacc = c1o9 * concentration; + mfcac = c1o9 * concentration; + mfcca = c1o9 * concentration; + + mfcbb = zeroReal; + mfbcb = zeroReal; + mfbbc = zeroReal; + + // equilibration of 5th order moments + Mcbc = zeroReal; + Mbcc = zeroReal; + Mccb = zeroReal; + + // from linearized orthogonalization 5th order central moments to central moments + mfcbc = Mcbc + mfaba * c1o9; + mfbcc = Mbcc + mfbaa * c1o9; + mfccb = Mccb + mfaab * c1o9; + + // equilibration of 6th order moment + mfccc = c1o27 * concentration; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + backwardChimera(mfaba, mfbba, mfcba, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfaab, mfbab, mfcab, cx, cx2); + backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfaab, mfabb, mfacb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + + + (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3 ) = mfcbb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3 ) = mfbcb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3 ) = mfccb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3 ) = mfacb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb; + } + } + } + } + } +} +////////////////////////////////////////////////////////////////////////// + +LBMReal MultiphasePressureFilterLBMKernel::gradX1_phi() +{ + using namespace D3Q27System; + return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00])); +} + +LBMReal MultiphasePressureFilterLBMKernel::gradX2_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0])); +} + +LBMReal MultiphasePressureFilterLBMKernel::gradX3_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M])); +} + +LBMReal MultiphasePressureFilterLBMKernel::nabla2_phi() +{ + using namespace D3Q27System; + LBMReal sum = 0.0; + sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000]))) + + (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000])))); + sum += WEIGTH[DIR_0PP] * ( + (((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000]))) + + (((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000]))) + + (((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000]))) + ); + sum += WEIGTH[DIR_00P] * ( + ((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000])) + + ((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000])) + + ((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000])) + ); + + return 6.0 * sum; +} + +void MultiphasePressureFilterLBMKernel::computePhasefield() +{ + using namespace D3Q27System; + SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth; + int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth; + int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth; + + //------------- Computing the phase-field ------------------ + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + // if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + h[DIR_P00] = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3); + } + } + } + } +} + +void MultiphasePressureFilterLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } else { + phi[k] = phaseFieldBC; + } + } +} + +void MultiphasePressureFilterLBMKernel::swapDistributions() +{ + LBMKernel::swapDistributions(); + dataSet->getHdistributions()->swap(); +} + +void MultiphasePressureFilterLBMKernel::initForcing() +{ + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + + muForcingX1.DefineVar("rho",&muRho); + muForcingX2.DefineVar("rho",&muRho); + muForcingX3.DefineVar("rho",&muRho); + +} diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h new file mode 100644 index 0000000000000000000000000000000000000000..9b2b568b2854b3351361d8e9687fbbc6a0d7f284 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphasePressureFilterLBMKernel.h @@ -0,0 +1,111 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphasePressureFilterLBMKernel.h +//! \ingroup LBMKernel +//! \author M. Geier, K. Kutscher, Hesameddin Safari +//======================================================================================= + +#ifndef MultiphasePressureFilterLBMKernel_H +#define MultiphasePressureFilterLBMKernel_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +//! \brief Multiphase Cascaded Cumulant LBM kernel. +//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model +//! \author M. Geier, K. Kutscher, Hesameddin Safari +class MultiphasePressureFilterLBMKernel : public LBMKernel +{ +public: + MultiphasePressureFilterLBMKernel(); + virtual ~MultiphasePressureFilterLBMKernel(void) = default; + void calculate(int step) override; + SPtr<LBMKernel> clone() override; + double getCalculationTime() override { return .0; } + + void setPhaseFieldBC(LBMReal bc) + { + phaseFieldBC = bc; + } + LBMReal getPhaseFieldBC() + { + return phaseFieldBC; + } + +protected: + virtual void initDataSet(); + void swapDistributions() override; + + void initForcing(); + + void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH1; + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld; + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU; + + LBMReal h [D3Q27System::ENDF+1]; + LBMReal phi[D3Q27System::ENDF+1]; + + LBMReal gradX1_phi(); + LBMReal gradX2_phi(); + LBMReal gradX3_phi(); + void computePhasefield(); + void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3); + + LBMReal nabla2_phi(); + + mu::value_type muX1,muX2,muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + mu::value_type muRho; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; + + LBMReal phaseFieldBC { 0.0 }; // if 0.0 then light fluid on the wall, else if 1.0 havy fluid +}; + +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp index 505007e0cc2c7ef8238956568224125e046aafa1..7424fdcbe8a36b7020e53fd78e154577fdc9ab47 100644 --- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseScratchCumulantLBMKernel.cpp @@ -39,6 +39,7 @@ #include "DataSet3D.h" #include "LBMKernel.h" #include <cmath> +#include <iostream> #define PROOF_CORRECTNESS @@ -163,6 +164,16 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0)); + /////For velocity filter + + //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr velocityX( + // new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0)); + //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr velocityY( + // new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0)); + //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr velocityZ( + // new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0)); + + for (int x3 = 0; x3 <= maxX3; x3++) { for (int x2 = 0; x2 <= maxX2; x2++) { for (int x1 = 0; x1 <= maxX1; x1++) { @@ -207,7 +218,63 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) // (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + // (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + // (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + ///Velocity filter + + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + + LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); + + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) / rho * c3; + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) / rho * c3; + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) / rho * c3; + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) / rho * c3; + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) / rho * c3; + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) / rho * c3; + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) / rho * c3; + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) / rho * c3; + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) / rho * c3; + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) / rho * c3; + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) / rho * c3; + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) / rho * c3; + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) / rho * c3; + + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) / rho * c3; + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) / rho * c3; + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) / rho * c3; + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) / rho * c3; + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) / rho * c3; + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) / rho * c3; + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) / rho * c3; + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) / rho * c3; + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) / rho * c3; + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) / rho * c3; + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) / rho * c3; + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) / rho * c3; + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) / rho * c3; + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3) / rho * c3; + + //(*velocityX)(x1, x2, x3) = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + // (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + // (mfcbb - mfabb)) ; + //(*velocityY)(x1, x2, x3) = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + // (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + // (mfbcb - mfbab)) ; + //(*velocityZ)(x1, x2, x3) = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + // (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + // (mfbbc - mfbba)) ; + + + + } + else { (*phaseField)(x1, x2, x3) = 0; } } } } @@ -218,6 +285,10 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) for (int x3 = minX3; x3 < maxX3; x3++) { for (int x2 = minX2; x2 < maxX2; x2++) { for (int x1 = minX1; x1 < maxX1; x1++) { + + //for (int x3 = minX3+1; x3 < maxX3-1; x3++) { + // for (int x2 = minX2+1; x2 < maxX2-1; x2++) { + // for (int x1 = minX1+1; x1 < maxX1-1; x1++) { if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { int x1p = x1 + 1; int x2p = x2 + 1; @@ -245,7 +316,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) //-1 0 1 findNeighbors(phaseField, x1, x2, x3); - + //// reading distributions here appears to be unnecessary! LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); @@ -284,6 +355,62 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) LBMReal dX2_phi = gradX2_phi(); LBMReal dX3_phi = gradX3_phi(); + //LBMReal dX1_phi = 3.0*(( + // WEIGTH[TNE]*((((*phaseField)(x1 + 1, x2+1, x3+1)- (*phaseField)(x1 - 1, x2 - 1, x3 - 1))+ ((*phaseField)(x1 + 1, x2 - 1, x3 + 1) - (*phaseField)(x1 - 1, x2 + 1, x3 - 1))) + // + (((*phaseField)(x1 + 1, x2 - 1, x3 - 1) - (*phaseField)(x1 - 1, x2 + 1, x3 + 1)) + ((*phaseField)(x1 + 1, x2 + 1, x3 - 1) - (*phaseField)(x1 - 1, x2 - 1, x3 + 1)))) + // +WEIGTH[NE]* ((((*phaseField)(x1 + 1, x2 + 1, x3) - (*phaseField)(x1 - 1, x2 - 1, x3)) + ((*phaseField)(x1 + 1, x2 - 1, x3) - (*phaseField)(x1 - 1, x2 + 1, x3 ))) + // + (((*phaseField)(x1 + 1, x2, x3 - 1) - (*phaseField)(x1 - 1, x2, x3 + 1)) + ((*phaseField)(x1 + 1, x2, x3 + 1) - (*phaseField)(x1 - 1, x2, x3 - 1))))) + // +WEIGTH[N]*((*phaseField)(x1 + 1, x2, x3 ) - (*phaseField)(x1 - 1, x2, x3)) + // ); + ////if (dX1_phi != NdX1_phi) {std::cout<<dX1_phi<<" "<< NdX1_phi<<std::endl;} + + //LBMReal dX2_phi = 3.0 * (( + // WEIGTH[TNE] * ((((*phaseField)(x1 + 1, x2 + 1, x3 + 1) - (*phaseField)(x1 - 1, x2 - 1, x3 - 1)) + ((*phaseField)(x1 -1, x2 + 1, x3 + 1) - (*phaseField)(x1 + 1, x2 - 1, x3 - 1))) + // + (((*phaseField)(x1 - 1, x2 + 1, x3 - 1) - (*phaseField)(x1 + 1, x2 - 1, x3 + 1)) + ((*phaseField)(x1 + 1, x2 + 1, x3 - 1) - (*phaseField)(x1 - 1, x2 - 1, x3 + 1)))) + // + WEIGTH[NE] * ((((*phaseField)(x1 + 1, x2 + 1, x3) - (*phaseField)(x1 - 1, x2 - 1, x3)) + ((*phaseField)(x1 - 1, x2 + 1, x3) - (*phaseField)(x1 + 1, x2 - 1, x3))) + // + (((*phaseField)(x1, x2+1, x3 - 1) - (*phaseField)(x1 , x2-1, x3 + 1)) + ((*phaseField)(x1 , x2+1, x3 + 1) - (*phaseField)(x1 , x2-1, x3 - 1))))) + // + WEIGTH[N] * ((*phaseField)(x1 , x2+1, x3) - (*phaseField)(x1 , x2-1, x3)) + // ); + + //LBMReal dX3_phi = 3.0 * (( + // WEIGTH[TNE] * ((((*phaseField)(x1 + 1, x2 + 1, x3 + 1) - (*phaseField)(x1 - 1, x2 - 1, x3 - 1)) + ((*phaseField)(x1 - 1, x2 + 1, x3 + 1) - (*phaseField)(x1 + 1, x2 - 1, x3 - 1))) + // + (((*phaseField)(x1 - 1, x2 - 1, x3 + 1) - (*phaseField)(x1 + 1, x2 + 1, x3 - 1)) + ((*phaseField)(x1 + 1, x2 - 1, x3 + 1) - (*phaseField)(x1 - 1, x2 + 1, x3 - 1)))) + // + WEIGTH[NE] * ((((*phaseField)(x1 + 1, x2, x3+1) - (*phaseField)(x1 - 1, x2, x3-1)) + ((*phaseField)(x1 - 1, x2, x3+1) - (*phaseField)(x1 + 1, x2, x3-1))) + // + (((*phaseField)(x1, x2 - 1, x3 + 1) - (*phaseField)(x1, x2 + 1, x3 - 1)) + ((*phaseField)(x1, x2 + 1, x3 + 1) - (*phaseField)(x1, x2 - 1, x3 - 1))))) + // + WEIGTH[N] * ((*phaseField)(x1, x2, x3+1) - (*phaseField)(x1, x2, x3-1)) + // ); + + /////////////////////////////////////// + + //LBMReal dX1_phi2 = 1.5 * (( + // WEIGTH[TNE] * ((((*phaseField)(x1 + 2, x2 + 2, x3 + 2) - (*phaseField)(x1 - 2, x2 - 2, x3 - 2)) + ((*phaseField)(x1 + 2, x2 - 2, x3 + 2) - (*phaseField)(x1 - 2, x2 + 2, x3 - 2))) + // + (((*phaseField)(x1 + 2, x2 - 2, x3 - 2) - (*phaseField)(x1 - 2, x2 + 2, x3 + 2)) + ((*phaseField)(x1 + 2, x2 + 2, x3 - 2) - (*phaseField)(x1 - 2, x2 - 2, x3 + 2)))) + // + WEIGTH[NE] * ((((*phaseField)(x1 + 2, x2 + 2, x3) - (*phaseField)(x1 - 2, x2 - 2, x3)) + ((*phaseField)(x1 + 2, x2 - 2, x3) - (*phaseField)(x1 - 2, x2 + 2, x3))) + // + (((*phaseField)(x1 + 2, x2, x3 - 2) - (*phaseField)(x1 - 2, x2, x3 + 2)) + ((*phaseField)(x1 + 2, x2, x3 + 2) - (*phaseField)(x1 - 2, x2, x3 - 2))))) + // + WEIGTH[N] * ((*phaseField)(x1 + 2, x2, x3) - (*phaseField)(x1 - 2, x2, x3)) + // ); + ////if (dX1_phi != NdX1_phi) {std::cout<<dX1_phi<<" "<< NdX1_phi<<std::endl;} + + //LBMReal dX2_phi2 = 1.5 * (( + // WEIGTH[TNE] * ((((*phaseField)(x1 + 2, x2 + 2, x3 + 2) - (*phaseField)(x1 - 2, x2 - 2, x3 - 2)) + ((*phaseField)(x1 - 2, x2 + 2, x3 + 2) - (*phaseField)(x1 + 2, x2 - 2, x3 - 2))) + // + (((*phaseField)(x1 - 2, x2 + 2, x3 - 2) - (*phaseField)(x1 + 2, x2 - 2, x3 + 2)) + ((*phaseField)(x1 + 2, x2 + 2, x3 - 2) - (*phaseField)(x1 - 2, x2 - 2, x3 + 2)))) + // + WEIGTH[NE] * ((((*phaseField)(x1 + 2, x2 + 2, x3) - (*phaseField)(x1 - 2, x2 - 2, x3)) + ((*phaseField)(x1 - 2, x2 + 2, x3) - (*phaseField)(x1 + 2, x2 - 2, x3))) + // + (((*phaseField)(x1, x2 + 2, x3 - 2) - (*phaseField)(x1, x2 - 2, x3 + 2)) + ((*phaseField)(x1, x2 + 2, x3 + 2) - (*phaseField)(x1, x2 - 2, x3 - 2))))) + // + WEIGTH[N] * ((*phaseField)(x1, x2 + 2, x3) - (*phaseField)(x1, x2 - 2, x3)) + // ); + + //LBMReal dX3_phi2 = 1.5 * (( + // WEIGTH[TNE] * ((((*phaseField)(x1 + 2, x2 + 2, x3 + 2) - (*phaseField)(x1 - 2, x2 - 2, x3 - 2)) + ((*phaseField)(x1 - 2, x2 + 2, x3 + 2) - (*phaseField)(x1 + 2, x2 - 2, x3 - 2))) + // + (((*phaseField)(x1 - 2, x2 - 2, x3 + 2) - (*phaseField)(x1 + 2, x2 + 2, x3 - 2)) + ((*phaseField)(x1 + 2, x2 - 2, x3 + 2) - (*phaseField)(x1 - 2, x2 + 2, x3 - 2)))) + // + WEIGTH[NE] * ((((*phaseField)(x1 + 2, x2, x3 + 2) - (*phaseField)(x1 - 2, x2, x3 - 2)) + ((*phaseField)(x1 - 2, x2, x3 + 2) - (*phaseField)(x1 + 2, x2, x3 - 2))) + // + (((*phaseField)(x1, x2 - 2, x3 + 2) - (*phaseField)(x1, x2 + 2, x3 - 2)) + ((*phaseField)(x1, x2 + 2, x3 + 2) - (*phaseField)(x1, x2 - 2, x3 - 2))))) + // + WEIGTH[N] * ((*phaseField)(x1, x2, x3 + 2) - (*phaseField)(x1, x2, x3 - 2)) + // ); + + //dX1_phi = (2*dX1_phi -1*dX1_phi2);// 2 * dX1_phi - dX1_phi2; + //dX2_phi = (2*dX2_phi -1*dX2_phi2);// 2 * dX2_phi - dX2_phi2; + //dX3_phi = (2*dX3_phi -1*dX3_phi2);// 2 * dX3_phi - dX3_phi2; + LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9; LBMReal normX1 = dX1_phi/denom; @@ -304,28 +431,28 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) ///!test - collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL); + collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL); //collFactorM = phi[REST] - phiL < (phiH - phiL) * 0.05 ? collFactorG : collFactorL; - LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi(); + LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(); //----------- Calculating Macroscopic Values ------------- - LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH); - - if (withForcing) { - // muX1 = static_cast<double>(x1-1+ix1*maxX1); - // muX2 = static_cast<double>(x2-1+ix2*maxX2); - // muX3 = static_cast<double>(x3-1+ix3*maxX3); - - forcingX1 = muForcingX1.Eval(); - forcingX2 = muForcingX2.Eval(); - forcingX3 = muForcingX3.Eval(); - - LBMReal rho_m = 1.0 / densityRatio; - forcingX1 = forcingX1 * (rho - rho_m); - forcingX2 = forcingX2 * (rho - rho_m); - forcingX3 = forcingX3 * (rho - rho_m); - + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); + + if (withForcing) { + // muX1 = static_cast<double>(x1-1+ix1*maxX1); + // muX2 = static_cast<double>(x2-1+ix2*maxX2); + // muX3 = static_cast<double>(x3-1+ix3*maxX3); + + forcingX1 = muForcingX1.Eval(); + forcingX2 = muForcingX2.Eval(); + forcingX3 = muForcingX3.Eval(); + + LBMReal rho_m = 1.0 / densityRatio; + forcingX1 = forcingX1 * (rho - rho_m); + forcingX2 = forcingX2 * (rho - rho_m); + forcingX3 = forcingX3 * (rho - rho_m); + } ////Incompressible Kernal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)/rho*c3; @@ -387,69 +514,272 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) vvz += mu * dX3_phi * c1o2; + + ////Velocity filter 14.04.2021 + // LBMReal lap_vx, lap_vy,lap_vz; + // { + // LBMReal sum = 0.0; + // sum += WEIGTH[TNE] * (((((*velocityX)(x1+1, x2+1, x3+1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 - 1, x3 - 1) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1 + 1, x2 + 1, x3 - 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 + 1, x2 - 1, x3 + 1) - (*velocityX)(x1, x2, x3)))) + // + ((((*velocityX)(x1 + 1, x2 - 1, x3 + 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 + 1, x3 - 1) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1 - 1, x2 + 1, x3 + 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 + 1, x2 - 1, x3 - 1) - (*velocityX)(x1, x2, x3))))); + // sum += WEIGTH[TN] * ( + // ((((*velocityX)(x1 + 1, x2 + 1, x3 ) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 - 1, x3) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1 + 1, x2 - 1, x3) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 + 1, x3) - (*velocityX)(x1, x2, x3)))) + // + ((((*velocityX)(x1 + 1, x2 , x3+1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2 , x3-1) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1 +1 , x2 , x3-1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 - 1, x2, x3 + 1) - (*velocityX)(x1, x2, x3)))) + // + ((((*velocityX)(x1 , x2+1, x3 + 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1, x2 - 1, x3 - 1) - (*velocityX)(x1, x2, x3))) + (((*velocityX)(x1, x2 + 1, x3 - 1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1, x2 - 1, x3 + 1) - (*velocityX)(x1, x2, x3)))) + // ); + // sum += WEIGTH[T] * ( + // (((*velocityX)(x1-1, x2 , x3 ) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1 + 1, x2, x3) - (*velocityX)(x1, x2, x3))) + // + (((*velocityX)(x1 , x2-1, x3) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1, x2 + 1, x3) - (*velocityX)(x1, x2, x3))) + // + (((*velocityX)(x1, x2, x3-1) - (*velocityX)(x1, x2, x3)) + ((*velocityX)(x1, x2, x3+1) - (*velocityX)(x1, x2, x3))) + // ); + // //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // // sum += WEIGTH[k] * (phi[k] - phi[REST]); + // //} + // lap_vx=6.0 * sum; + + //sum = 0.0; + //sum += WEIGTH[TNE] * (((((*velocityY)(x1 + 1, x2 + 1, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2 - 1, x3 - 1) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1 + 1, x2 + 1, x3 - 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 + 1, x2 - 1, x3 + 1) - (*velocityY)(x1, x2, x3)))) + // + ((((*velocityY)(x1 + 1, x2 - 1, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2 + 1, x3 - 1) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1 - 1, x2 + 1, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 + 1, x2 - 1, x3 - 1) - (*velocityY)(x1, x2, x3))))); + //sum += WEIGTH[TN] * ( + // ((((*velocityY)(x1 + 1, x2 + 1, x3) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2 - 1, x3) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1 + 1, x2 - 1, x3) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2 + 1, x3) - (*velocityY)(x1, x2, x3)))) + // + ((((*velocityY)(x1 + 1, x2, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2, x3 - 1) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1 + 1, x2, x3 - 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 - 1, x2, x3 + 1) - (*velocityY)(x1, x2, x3)))) + // + ((((*velocityY)(x1, x2 + 1, x3 + 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1, x2 - 1, x3 - 1) - (*velocityY)(x1, x2, x3))) + (((*velocityY)(x1, x2 + 1, x3 - 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1, x2 - 1, x3 + 1) - (*velocityY)(x1, x2, x3)))) + // ); + //sum += WEIGTH[T] * ( + // (((*velocityY)(x1 - 1, x2, x3) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1 + 1, x2, x3) - (*velocityY)(x1, x2, x3))) + // + (((*velocityY)(x1, x2 - 1, x3) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1, x2 + 1, x3) - (*velocityY)(x1, x2, x3))) + // + (((*velocityY)(x1, x2, x3 - 1) - (*velocityY)(x1, x2, x3)) + ((*velocityY)(x1, x2, x3 + 1) - (*velocityY)(x1, x2, x3))) + // ); + + //lap_vy = 6.0 * sum; + + //sum = 0.0; + //sum += WEIGTH[TNE] * (((((*velocityZ)(x1 + 1, x2 + 1, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2 - 1, x3 - 1) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1 + 1, x2 + 1, x3 - 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 + 1, x2 - 1, x3 + 1) - (*velocityZ)(x1, x2, x3)))) + // + ((((*velocityZ)(x1 + 1, x2 - 1, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2 + 1, x3 - 1) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1 - 1, x2 + 1, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 + 1, x2 - 1, x3 - 1) - (*velocityZ)(x1, x2, x3))))); + //sum += WEIGTH[TN] * ( + // ((((*velocityZ)(x1 + 1, x2 + 1, x3) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2 - 1, x3) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1 + 1, x2 - 1, x3) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2 + 1, x3) - (*velocityZ)(x1, x2, x3)))) + // + ((((*velocityZ)(x1 + 1, x2, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2, x3 - 1) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1 + 1, x2, x3 - 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 - 1, x2, x3 + 1) - (*velocityZ)(x1, x2, x3)))) + // + ((((*velocityZ)(x1, x2 + 1, x3 + 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1, x2 - 1, x3 - 1) - (*velocityZ)(x1, x2, x3))) + (((*velocityZ)(x1, x2 + 1, x3 - 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1, x2 - 1, x3 + 1) - (*velocityZ)(x1, x2, x3)))) + // ); + //sum += WEIGTH[T] * ( + // (((*velocityZ)(x1 - 1, x2, x3) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1 + 1, x2, x3) - (*velocityZ)(x1, x2, x3))) + // + (((*velocityZ)(x1, x2 - 1, x3) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1, x2 + 1, x3) - (*velocityZ)(x1, x2, x3))) + // + (((*velocityZ)(x1, x2, x3 - 1) - (*velocityZ)(x1, x2, x3)) + ((*velocityZ)(x1, x2, x3 + 1) - (*velocityZ)(x1, x2, x3))) + // ); + + //lap_vz = 6.0 * sum; + + // } + + // if (lap_vx != 0.0) { + // lap_vx = lap_vx; + // } + ///----Classic source term 8.4.2021 + LBMReal vvxF, vvyF, vvzF; + vvxF = vvx;//-2*c1o24 * lap_vx;// + vvyF = vvy;//-2*c1o24 * lap_vy;// + vvzF = vvz;//-2*c1o24 * lap_vz;// + +// vvxF = 1.2* vvx- 0.2*0.5 * ((*velocityX)(x1 - 1, x2, x3) + (*velocityX)(x1 + 1, x2, x3)); +// vvyF = 1.2 *vvy- 0.2*0.5* ((*velocityY)(x1 , x2-1, x3) + (*velocityY)(x1 , x2+1, x3)); +// vvzF = 1.2 *vvz-0.2*0.5* ((*velocityZ)(x1 , x2, x3-1) + (*velocityZ)(x1 , x2, x3+1)); + //if (vvxF != vvx) { + // vvxF = vvxF; + //} + LBMReal weightGrad = 1.0-denom*denom/(denom*denom+0.0001*0.001); + LBMReal dX1_phiF = dX1_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX1; + LBMReal dX2_phiF = dX2_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX2; + LBMReal dX3_phiF = dX3_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX3; + + //dX1_phiF *= 1.2; + //dX2_phiF *= 1.2; + //dX3_phiF *= 1.2; + + //LBMReal gradFD = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi); + //LBMReal gradPhi = (1.0 - phi[REST]) * (phi[REST]); + //gradPhi = (gradPhi > gradFD) ? gradPhi : gradFD; + //dX1_phiF = gradPhi * normX1; + // dX2_phiF = gradPhi * normX2; + // dX3_phiF = gradPhi * normX3; + LBMReal ux2; LBMReal uy2; LBMReal uz2; - ux2 = vvx * vvx; - uy2 = vvy * vvy; - uz2 = vvz * vvz; + ux2 = vvxF * vvxF; + uy2 = vvyF * vvyF; + uz2 = vvzF * vvzF; LBMReal forcingTerm[D3Q27System::ENDF + 1]; - for (int dir = STARTF; dir <= (FENDDIR); dir++) { - LBMReal velProd = DX1[dir] * vvx + DX2[dir] * vvy + DX3[dir] * vvz; + for (int dir = FSTARTDIR; dir <= FENDDIR; dir++) { + LBMReal velProd = DX1[dir] * vvxF + DX2[dir] * vvyF + DX3[dir] * vvzF; LBMReal velSq1 = velProd * velProd; - LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)); + LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + (4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2))); LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi; forcingTerm[dir] = - (-vvx) * (fac1 * dX1_phi ) + - (-vvy) * (fac1 * dX2_phi ) + - (-vvz) * (fac1 * dX3_phi ) + - (DX1[dir]) * (fac1 * dX1_phi ) + - (DX2[dir]) * (fac1 * dX2_phi ) + - (DX3[dir]) * (fac1 * dX3_phi ); + (-vvxF) * (fac1 * dX1_phiF ) + + (-vvyF) * (fac1 * dX2_phiF ) + + (-vvzF) * (fac1 * dX3_phiF ) + + (DX1[dir]) * (fac1 * dX1_phiF ) + + (DX2[dir]) * (fac1 * dX2_phiF ) + + (DX3[dir]) * (fac1 * dX3_phiF ); + + //LBMReal biDif= (-((*phaseField)(x1 + 2 * DX1[dir], x2 + 2 * DX2[dir], x3 + 2 * DX3[dir])) + 4 * ((*phaseField)(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir])) + // - 3*((*phaseField)(x1 , x2 , x3 )) )*0.5; + //LBMReal ceDif = (((*phaseField)(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir])) - ((*phaseField)(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir]))) * 0.5; + + ////ceDif = ((((*phaseField)(x1 + 2*DX1[dir], x2 + 2*DX2[dir], x3 + 2*DX3[dir])) - ((*phaseField)(x1 , x2 , x3 ))) * biDif < 0) ? + //// (!bcArray->isSolid(x1+2*DX1[dir], x2+2*DX2[dir], x3+2*DX3[dir]) && !bcArray->isUndefined(x1 + 2 * DX1[dir], x2 + 2 * DX2[dir], x3 + 2 * DX3[dir]) && !bcArray->isSolid(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir]) && !bcArray->isUndefined(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir]) && !bcArray->isSolid(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir]) && !bcArray->isUndefined(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir])) ? + //// (biDif+ceDif)*0.5 : ceDif: ceDif; + + //ceDif = ((((*phaseField)(x1 + 2 * DX1[dir], x2 + 2 * DX2[dir], x3 + 2 * DX3[dir])) - ((*phaseField)(x1, x2, x3))) * biDif < 0) ? biDif : ceDif; + + //forcingTerm[dir] = + // (-vvxF) * (fac1 * dX1_phiF) + + // (-vvyF) * (fac1 * dX2_phiF) + + // (-vvzF) * (fac1 * dX3_phiF) + + // fac1 * ceDif;//(((*phaseField)(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir])) - ((*phaseField)(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir]))) * 0.5; + // //( -((*phaseField)(x1 +2* DX1[dir], x2 + 2 * DX2[dir], x3 + 2 * DX3[dir])) + 5*((*phaseField)(x1 + DX1[dir], x2 + DX2[dir], x3 + DX3[dir])) + // //- 3*((*phaseField)(x1 , x2 , x3 )) - ((*phaseField)(x1 - DX1[dir], x2 - DX2[dir], x3 - DX3[dir])) )*0.25; + + } - LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); - LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi; - forcingTerm[REST] = (-vvx) * (fac1 * dX1_phi ) + - (-vvy) * (fac1 * dX2_phi ) + - (-vvz) * (fac1 * dX3_phi ); - - mfcbb += 3.0 * ( 0.5 * forcingTerm[E]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; - mfbcb += 3.0 * ( 0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; - mfbbc += 3.0 * ( 0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; - mfccb += 3.0 * ( 0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; - mfacb += 3.0 * ( 0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; - mfcbc += 3.0 * ( 0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; - mfabc += 3.0 * ( 0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; - mfbcc += 3.0 * ( 0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; - mfbac += 3.0 * ( 0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; - mfccc += 3.0 * ( 0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; - mfacc += 3.0 * ( 0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; - mfcac += 3.0 * ( 0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; - mfaac += 3.0 * ( 0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; - mfabb += 3.0 * ( 0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; - mfbab += 3.0 * ( 0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; - mfbba += 3.0 * ( 0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; - mfaab += 3.0 * ( 0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; - mfcab += 3.0 * ( 0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; - mfaba += 3.0 * ( 0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; - mfcba += 3.0 * ( 0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; - mfbaa += 3.0 * ( 0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; - mfbca += 3.0 * ( 0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; - mfaaa += 3.0 * ( 0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; - mfcaa += 3.0 * ( 0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; - mfaca += 3.0 * ( 0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; - mfcca += 3.0 * ( 0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; - mfbbb += 3.0 * ( 0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + LBMReal gamma = WEIGTH[DIR_000] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); + LBMReal fac1 = (gamma - WEIGTH[DIR_000]) * c1o3 * rhoToPhi; + forcingTerm[DIR_000] = (-vvxF) * (fac1 * dX1_phiF ) + + (-vvyF) * (fac1 * dX2_phiF ) + + (-vvzF) * (fac1 * dX3_phiF ); + + //////// + // LBMReal divAfterSource= + //( mfcbb + 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF) *(vvzF)-1)+ + //( mfbcb + 3.0 * (0.5 * forcingTerm[N]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfbbc + 3.0 * (0.5 * forcingTerm[T]) / rho ) *((vvxF) *(vvxF) +(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfccb + 3.0 * (0.5 * forcingTerm[NE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfacb + 3.0 * (0.5 * forcingTerm[NW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfcbc + 3.0 * (0.5 * forcingTerm[TE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfabc + 3.0 * (0.5 * forcingTerm[TW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfbcc + 3.0 * (0.5 * forcingTerm[TN]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfbac + 3.0 * (0.5 * forcingTerm[TS]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfccc + 3.0 * (0.5 * forcingTerm[TNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfacc + 3.0 * (0.5 * forcingTerm[TNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfcac + 3.0 * (0.5 * forcingTerm[TSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfaac + 3.0 * (0.5 * forcingTerm[TSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfabb + 3.0 * (0.5 * forcingTerm[W]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF) *(vvzF)-1)+ + //( mfbab + 3.0 * (0.5 * forcingTerm[S]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfbba + 3.0 * (0.5 * forcingTerm[B]) / rho ) *((vvxF) *(vvxF) +(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfaab + 3.0 * (0.5 * forcingTerm[SW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfcab + 3.0 * (0.5 * forcingTerm[SE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfaba + 3.0 * (0.5 * forcingTerm[BW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfcba + 3.0 * (0.5 * forcingTerm[BE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfbaa + 3.0 * (0.5 * forcingTerm[BS]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfbca + 3.0 * (0.5 * forcingTerm[BN]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfaaa + 3.0 * (0.5 * forcingTerm[BSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfcaa + 3.0 * (0.5 * forcingTerm[BSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfaca + 3.0 * (0.5 * forcingTerm[BNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfcca + 3.0 * (0.5 * forcingTerm[BNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfbbb + 3.0 * (0.5 * forcingTerm[REST]) / rho)*((vvxF)*(vvxF)+(vvyF)*(vvyF)+(vvzF)*(vvzF)-1); + + // LBMReal divBeforeSource = + // (mfcbb) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) + + // (mfbcb) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfbbc) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfccb) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfacb) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfcbc) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfabc) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfbcc) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfbac) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfccc) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfacc) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfcac) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfaac) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfabb) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) + + // (mfbab) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfbba) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfaab) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfcab) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfaba) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfcba) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfbaa) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfbca) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfaaa) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfcaa) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfaca) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfcca) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfbbb) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF) * (vvzF)-1); + //if (divAfterSource - divBeforeSource != 0 && phi[REST]>0.0001 && phi[REST]<0.999) { + // std::cout << phi[REST]<<" "<< divAfterSource << " " << divBeforeSource <<" "<< divAfterSource/ divBeforeSource << std::endl; + //} + + //if (fabs(divAfterSource - divBeforeSource)/(fabs(divAfterSource) + fabs(divBeforeSource)+1e-10) > 1e-5) { + // LBMReal scaleDiv =0.95+(1-0.95)* (divBeforeSource) / (divBeforeSource - divAfterSource); + + // forcingTerm[DIR_P00] *=scaleDiv; + // forcingTerm[N] *=scaleDiv; + // forcingTerm[T] *=scaleDiv; + // forcingTerm[NE] *=scaleDiv; + // forcingTerm[NW] *=scaleDiv; + // forcingTerm[TE] *=scaleDiv; + // forcingTerm[TW] *=scaleDiv; + // forcingTerm[TN] *=scaleDiv; + // forcingTerm[TS] *=scaleDiv; + // forcingTerm[TNE] *=scaleDiv; + // forcingTerm[TNW] *=scaleDiv; + // forcingTerm[TSE] *=scaleDiv; + // forcingTerm[TSW] *=scaleDiv; + // forcingTerm[W] *=scaleDiv; + // forcingTerm[S] *=scaleDiv; + // forcingTerm[B] *=scaleDiv; + // forcingTerm[SW] *=scaleDiv; + // forcingTerm[SE] *=scaleDiv; + // forcingTerm[BW] *=scaleDiv; + // forcingTerm[BE] *=scaleDiv; + // forcingTerm[BS] *=scaleDiv; + // forcingTerm[BN] *=scaleDiv; + // forcingTerm[BSW] *=scaleDiv; + // forcingTerm[BSE] *=scaleDiv; + // forcingTerm[BNW] *=scaleDiv; + // forcingTerm[BNE] *=scaleDiv; + // forcingTerm[REST] *=scaleDiv; + //} + //////// - //-------------------------------------------------------- + mfcbb +=3.0 * ( 0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + mfbcb +=3.0 * ( 0.5 * forcingTerm[DIR_0P0]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + mfbbc +=3.0 * ( 0.5 * forcingTerm[DIR_00P]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + mfccb +=3.0 * ( 0.5 * forcingTerm[DIR_PP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + mfacb +=3.0 * ( 0.5 * forcingTerm[DIR_MP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + mfcbc +=3.0 * ( 0.5 * forcingTerm[DIR_P0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + mfabc +=3.0 * ( 0.5 * forcingTerm[DIR_M0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + mfbcc +=3.0 * ( 0.5 * forcingTerm[DIR_0PP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + mfbac +=3.0 * ( 0.5 * forcingTerm[DIR_0MP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + mfccc +=3.0 * ( 0.5 * forcingTerm[DIR_PPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + mfacc +=3.0 * ( 0.5 * forcingTerm[DIR_MPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + mfcac +=3.0 * ( 0.5 * forcingTerm[DIR_PMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + mfaac +=3.0 * ( 0.5 * forcingTerm[DIR_MMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + mfabb +=3.0 * ( 0.5 * forcingTerm[DIR_M00]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + mfbab +=3.0 * ( 0.5 * forcingTerm[DIR_0M0]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + mfbba +=3.0 * ( 0.5 * forcingTerm[DIR_00M]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + mfaab +=3.0 * ( 0.5 * forcingTerm[DIR_MM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + mfcab +=3.0 * ( 0.5 * forcingTerm[DIR_PM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + mfaba +=3.0 * ( 0.5 * forcingTerm[DIR_M0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + mfcba +=3.0 * ( 0.5 * forcingTerm[DIR_P0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + mfbaa +=3.0 * ( 0.5 * forcingTerm[DIR_0MM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + mfbca +=3.0 * ( 0.5 * forcingTerm[DIR_0PM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + mfaaa +=3.0 * ( 0.5 * forcingTerm[DIR_MMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + mfcaa +=3.0 * ( 0.5 * forcingTerm[DIR_PMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + mfaca +=3.0 * ( 0.5 * forcingTerm[DIR_MPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + mfcca +=3.0 * ( 0.5 * forcingTerm[DIR_PPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + mfbbb +=3.0 * ( 0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + + //-------------------------------------------------------- + //////////End classic source term //forcing /////////////////////////////////////////////////////////////////////////////////////////// if (withForcing) @@ -753,11 +1083,11 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) /////fourth order parameters; here only for test. Move out of loop! LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0))); - LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); - LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); - LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); - //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' ) - LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); + LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); + LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' ) + LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); //Cum 4. @@ -802,13 +1132,25 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) // mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz); //17.03.2021 attempt for statililization by assymptotically vanishing bias - LBMReal correctionScaling =0.0* rhoToPhi /rho;// +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000; - mxxPyyPzz += (1.0/3.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz)* correctionScaling; // As in Hesam's code - mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy)* correctionScaling; - mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; - mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; - mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; - mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + //LBMReal correctionScaling = rhoToPhi /rho;// +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000; + //mxxPyyPzz += (1.0/3.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz)* correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy)* correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + + + //14.04.2021 filtered velocity + + //LBMReal correctionScaling = rhoToPhi / rho;// +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000; + //mxxPyyPzz += (1.0 / 3.0) * (dX1_phi * vvxF + dX2_phi * vvyF + dX3_phi * vvzF) * correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvxF - dX2_phi * vvyF) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvxF - dX3_phi * vvzF) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvzF + dX3_phi * vvyF) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvzF + dX3_phi * vvxF) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvyF + dX2_phi * vvxF) * correctionScaling; + LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; @@ -819,6 +1161,20 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) LBMReal Dyz = -three * collFactorM * mfabb; ////relax unfiltered + //! divergenceFilter 10.05.2021 + LBMReal divMag= (1.0 - phi[DIR_000]) * (phi[DIR_000])*10*5*sqrt(fabs((OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz)))); + // LBMReal divMag = 500 *500* 50*(fabs((OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz))))* (fabs((OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz)))); + //LBMReal divMag = (dX1_phi * dxux) > 0 ? (dX1_phi * dxux) : 0; + //divMag += (dX2_phi * dyuy) > 0 ? (dX2_phi * dyuy) : 0; + //divMag += (dX3_phi * dzuz) > 0 ? (dX3_phi * dzuz) : 0; + //divMag *= 5000; + //divMag+= denom * 10 * 5 * sqrt(fabs((OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz)))); + //LBMReal divMag = 5000 * (fabs(dX1_phi * dxux)+fabs(dX2_phi * dyuy)+fabs(dX3_phi * dzuz)); + collFactorM = collFactorM / (1.0 + 3.0 * divMag); + + collFactorM = (collFactorM > 1.0) ? collFactorM : 1.0; + + mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy); mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz); @@ -848,15 +1204,29 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) //applying phase field gradients second part: //mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz); - mxxPyyPzz += (1.0 / 3.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; // As in Hesam's code - mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; - mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; - mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; - mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; - mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + //mxxPyyPzz += (1.0 / 3.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + + + //////updated pressure + //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; + + + //mxxPyyPzz += (1.0 / 3.0) * (dX1_phi * vvxF + dX2_phi * vvyF + dX3_phi * vvzF) * correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvxF - dX2_phi * vvyF) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvxF - dX3_phi * vvzF) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvzF + dX3_phi * vvyF) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvzF + dX3_phi * vvxF) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvyF + dX2_phi * vvxF) * correctionScaling; + + + //////updated pressure + //mfaaa += (dX1_phi * vvxF + dX2_phi * vvyF + dX3_phi * vvzF) * correctionScaling; - ////updated pressure - mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; mxxPyyPzz += mfaaa;//12.03.21 shifted by mfaaa // mxxPyyPzz = mfaaa; //12.03.21 reguarized pressure !? @@ -1249,33 +1619,33 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) /////classical source term 8.4.2021 - mfcbb += 3.0 * (0.5 * forcingTerm[E]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; - mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; - mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; - mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; - mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; - mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; - mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; - mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; - mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; - mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; - mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; - mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; - mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; - mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; - mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; - mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; - mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; - mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; - mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; - mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; - mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; - mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; - mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; - mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; - mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; - mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; - mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + mfbcb += 3.0 * (0.5 * forcingTerm[DIR_0P0]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + mfbbc += 3.0 * (0.5 * forcingTerm[DIR_00P]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + mfccb += 3.0 * (0.5 * forcingTerm[DIR_PP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + mfacb += 3.0 * (0.5 * forcingTerm[DIR_MP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + mfcbc += 3.0 * (0.5 * forcingTerm[DIR_P0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + mfabc += 3.0 * (0.5 * forcingTerm[DIR_M0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + mfbcc += 3.0 * (0.5 * forcingTerm[DIR_0PP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + mfbac += 3.0 * (0.5 * forcingTerm[DIR_0MP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + mfccc += 3.0 * (0.5 * forcingTerm[DIR_PPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + mfacc += 3.0 * (0.5 * forcingTerm[DIR_MPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + mfcac += 3.0 * (0.5 * forcingTerm[DIR_PMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + mfaac += 3.0 * (0.5 * forcingTerm[DIR_MMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + mfabb += 3.0 * (0.5 * forcingTerm[DIR_M00]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + mfbab += 3.0 * (0.5 * forcingTerm[DIR_0M0]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + mfbba += 3.0 * (0.5 * forcingTerm[DIR_00M]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + mfaab += 3.0 * (0.5 * forcingTerm[DIR_MM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + mfcab += 3.0 * (0.5 * forcingTerm[DIR_PM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + mfaba += 3.0 * (0.5 * forcingTerm[DIR_M0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + mfcba += 3.0 * (0.5 * forcingTerm[DIR_P0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + mfbaa += 3.0 * (0.5 * forcingTerm[DIR_0MM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + mfbca += 3.0 * (0.5 * forcingTerm[DIR_0PM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + mfaaa += 3.0 * (0.5 * forcingTerm[DIR_MMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + mfcaa += 3.0 * (0.5 * forcingTerm[DIR_PMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + mfaca += 3.0 * (0.5 * forcingTerm[DIR_MPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + mfcca += 3.0 * (0.5 * forcingTerm[DIR_PPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + mfbbb += 3.0 * (0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] @@ -1370,7 +1740,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) // // //-------------------------------------------------------- // -// mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[E]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; +// mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; // mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; // mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; // mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; @@ -2078,7 +2448,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) // } //#endif // -// mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[E]; +// mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00]; // mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N]; // mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T]; // mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE]; @@ -2301,9 +2671,9 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) LBMReal Mccb = mfccb - mfaab * c1o9; // collision of 1st order moments - cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale; - cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale; - cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale; + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx; //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy; @@ -2453,7 +2823,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) /////////////////// PHASE-FIELD BGK SOLVER /////////////////////////////// //using namespace D3Q27System; - // h[E] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + // h[DIR_P00] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); // h[N] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); // h[T] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); // h[NE] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); @@ -2542,7 +2912,7 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) } } } - } + dataSet->setPhaseField(divU); } } @@ -2551,9 +2921,9 @@ void MultiphaseScratchCumulantLBMKernel::calculate(int step) LBMReal MultiphaseScratchCumulantLBMKernel::gradX1_phi() { using namespace D3Q27System; - return 3.0* ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) + (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) + (phi[BNE] - phi[TSW]))) - + WEIGTH[NE] * (((phi[TE] - phi[BW]) + (phi[BE] - phi[TW])) + ((phi[SE] - phi[NW]) + (phi[NE] - phi[SW])))) + - +WEIGTH[N] * (phi[E] - phi[W])); + return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00])); //LBMReal sum = 0.0; //for (int k = FSTARTDIR; k <= FENDDIR; k++) { // sum += WEIGTH[k] * DX1[k] * phi[k]; @@ -2564,9 +2934,9 @@ LBMReal MultiphaseScratchCumulantLBMKernel::gradX1_phi() LBMReal MultiphaseScratchCumulantLBMKernel::gradX2_phi() { using namespace D3Q27System; - return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[BNE] - phi[TSW])- (phi[TSE] - phi[BNW]))) - + WEIGTH[NE] * (((phi[TN] - phi[BS]) + (phi[BN] - phi[TS])) + ((phi[NE] - phi[SW])- (phi[SE] - phi[NW])))) + - +WEIGTH[N] * (phi[N] - phi[S])); + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0])); //LBMReal sum = 0.0; //for (int k = FSTARTDIR; k <= FENDDIR; k++) { // sum += WEIGTH[k] * DX2[k] * phi[k]; @@ -2577,9 +2947,9 @@ LBMReal MultiphaseScratchCumulantLBMKernel::gradX2_phi() LBMReal MultiphaseScratchCumulantLBMKernel::gradX3_phi() { using namespace D3Q27System; - return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) - (phi[BNE] - phi[TSW]))) - + WEIGTH[NE] * (((phi[TE] - phi[BW]) - (phi[BE] - phi[TW])) + ((phi[TS] - phi[BN]) + (phi[TN] - phi[BS])))) + - +WEIGTH[N] * (phi[T] - phi[B])); + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M])); //LBMReal sum = 0.0; //for (int k = FSTARTDIR; k <= FENDDIR; k++) { // sum += WEIGTH[k] * DX3[k] * phi[k]; @@ -2591,17 +2961,17 @@ LBMReal MultiphaseScratchCumulantLBMKernel::nabla2_phi() { using namespace D3Q27System; LBMReal sum = 0.0; - sum += WEIGTH[TNE] * ((((phi[TNE] - phi[REST]) + (phi[BSW] - phi[REST])) + ((phi[TSW] - phi[REST]) + (phi[BNE] - phi[REST]))) - + (((phi[TNW] - phi[REST]) + (phi[BSE] - phi[REST])) + ((phi[TSE] - phi[REST]) + (phi[BNW] - phi[REST])))); - sum += WEIGTH[TN] * ( - (((phi[TN] - phi[REST]) + (phi[BS] - phi[REST])) + ((phi[TS] - phi[REST]) + (phi[BN] - phi[REST]))) - + (((phi[TE] - phi[REST]) + (phi[BW] - phi[REST])) + ((phi[TW] - phi[REST]) + (phi[BE] - phi[REST]))) - + (((phi[NE] - phi[REST]) + (phi[SW] - phi[REST])) + ((phi[NW] - phi[REST]) + (phi[SE] - phi[REST]))) + sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000]))) + + (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000])))); + sum += WEIGTH[DIR_0PP] * ( + (((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000]))) + + (((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000]))) + + (((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000]))) ); - sum += WEIGTH[T] * ( - ((phi[T] - phi[REST]) + (phi[B] - phi[REST])) - + ((phi[N] - phi[REST]) + (phi[S] - phi[REST])) - + ((phi[E] - phi[REST]) + (phi[W] - phi[REST])) + sum += WEIGTH[DIR_00P] * ( + ((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000])) + + ((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000])) + + ((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000])) ); //for (int k = FSTARTDIR; k <= FENDDIR; k++) { // sum += WEIGTH[k] * (phi[k] - phi[REST]); @@ -2631,35 +3001,35 @@ void MultiphaseScratchCumulantLBMKernel::computePhasefield() int x2p = x2 + 1; int x3p = x3 + 1; - h[E] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); - h[N] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); - h[T] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); - h[NE] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); - h[NW] = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); - h[TE] = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); - h[TW] = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); - h[TN] = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); - h[TS] = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); - h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); - h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); - h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); - h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); - - h[W] = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); - h[S] = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); - h[B] = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); - h[SW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); - h[SE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); - h[BW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); - h[BE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); - h[BS] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); - h[BN] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); - h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); - h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); - h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); - h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); - - h[REST] = (*this->zeroDistributionsH)(x1, x2, x3); + h[DIR_P00] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH)(x1, x2, x3); } } } @@ -2673,7 +3043,7 @@ void MultiphaseScratchCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal, Indexe SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); - phi[REST] = (*ph)(x1, x2, x3); + phi[DIR_000] = (*ph)(x1, x2, x3); for (int k = FSTARTDIR; k <= FENDDIR; k++) { diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0d84520603d6c3a149efa30f298832e97fa623eb --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp @@ -0,0 +1,3024 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp +//! \ingroup LBMKernel +//! \author M. Geier, K. Kutscher, Hesameddin Safari +//======================================================================================= + +#include "MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h" +#include "BCArray3D.h" +#include "Block3D.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "D3Q27System.h" +#include "DataSet3D.h" +#include "LBMKernel.h" +#include <cmath> +#include <iostream> +#include <string> + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::MultiphaseSimpleVelocityBaseExternalPressureLBMKernel() { this->compressible = false; } +////////////////////////////////////////////////////////////////////////// +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); + SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field + SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); + SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new CbArray3D<LBMReal, IndexerX3X2X1>( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + p1Old = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + dataSet->setFdistributions(f); + dataSet->setHdistributions(h); // For phase-field + dataSet->setH2distributions(h2); + dataSet->setPhaseField(divU1); + dataSet->setPressureField(pressure); + + phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0)); + phaseFieldOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 999.0)); + + divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel()); + kernel->setNX(nx); + dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initDataSet(); + kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG); + kernel->setDensityRatio(this->densityRatio); + kernel->setMultiphaseModelParameters(this->beta, this->kappa); + kernel->setContactAngle(this->contactAngle); + kernel->setPhiL(this->phiL); + kernel->setPhiH(this->phiH); + kernel->setPhaseFieldRelaxation(this->tauH); + kernel->setMobility(this->mob); + kernel->setInterfaceWidth(this->interfaceWidth); + + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + kernel->setGhostLayerWidth(2); + dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initForcing(); + + return kernel; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m2 = mfa + mfc; + LBMReal m1 = mfc - mfa; + LBMReal m0 = m2 + mfb; + mfa = m0; + m0 *= Kinverse; + m0 += oneMinusRho; + mfb = (m1 * Kinverse - m0 * vv) * K; + mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; +} + +//////////////////////////////////////////////////////////////////////////////// +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K; + LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K; + mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K; + mfa = m0; + mfb = m1; +} + + +//////////////////////////////////////////////////////////////////////////////// +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal m1 = (mfa + mfc) + mfb; + LBMReal m2 = mfc - mfa; + mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); + mfb = m2 - vv * m1; + mfa = m1; +} + + +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); + LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; + mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); + mfb = mb; + mfa = ma; +} + + +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + using namespace UbMath; + + forcingX1 = 0.0; + forcingX2 = 0.0; + forcingX3 = 0.0; + + LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5; + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + localDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions(); + nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions(); + zeroDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions(); + + localDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions(); + nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions(); + zeroDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions(); + + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + LBMReal omegaDRho = 1.0;// 1.25;// 1.3; + + for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) { + for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) { + for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + (*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc)) ) + + (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) + + ((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) + + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb; + if ((*phaseField)(x1, x2, x3) > 1 ) { + (*phaseField)(x1, x2, x3) = c1; + } + + if ((*phaseField)(x1, x2, x3) < 0) { + (*phaseField)(x1, x2, x3) = 0; + } + ////// read F-distributions for velocity formalism + + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + //LBMReal rhoH = 1.0; + //LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoH = 1.0*densityRatio; + LBMReal rhoL = 1.0; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal drho = (((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)) ) + + (((mfaab + mfccb) + (mfacb + mfcab) ) + ((mfaba + mfcbc) + (mfabc + mfcba) ) + ((mfbaa + mfbcc) + (mfbac + mfbca) ))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + + omegaDRho = 2.0;// 1.5; + drho *= omegaDRho; + LBMReal keepDrho = drho; + drho = ((*p1Old)(x1, x2, x3) + drho) * c1o2; + // drho = ((*p1Old)(x1, x2, x3)*c2o3 + drho*c1o3) ; + (*p1Old)(x1, x2, x3) = keepDrho; + + //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); //Incompressible +///Density correction + //LBMReal dX1_phi = gradX1_phi(); + //LBMReal dX2_phi = gradX2_phi(); + //LBMReal dX3_phi = gradX3_phi(); + //LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + // (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + // (mfcbb - mfabb)) ; + //LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + // (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + // (mfbcb - mfbab)) ; + //LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + // (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + // (mfbbc - mfbba)) ; + //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressure)(x1, x2, x3); //explicit Compressible + //(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho-(rhoH-rhoL)*(vvx*dX1_phi+vvy*dX2_phi+vvz*dX3_phi)*c1o3)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho); + + //(*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) - c1o3 * drho * ((*phaseField)(x1, x2, x3) * (rhoH - rhoL) + rhoL)) / (c1 - ((*phaseField)(x1, x2, x3) - c1) * drho); + //LBMReal rho=rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3); + //LBMReal tempDrho = drho; + //drho = (drho*0.9 + (*pressureOld)(x1, x2, x3)*0.1) ; + //(*pressureOld)(x1, x2, x3) = tempDrho; + + //Mathematica + + //LBMReal rho = ((*pressure)(x1, x2, x3) - (*phaseField)(x1, x2, x3) * (*pressure)(x1, x2, x3) + c1o3 * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (c1o3 + c1o3 * drho * (-1 + (*phaseField)(x1, x2, x3))); + (*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) + c1o3 * drho * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (1 + drho * (-1 + (*phaseField)(x1, x2, x3))); +/////Full Filter + //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH)+(one- (*phaseField)(x1, x2, x3))*three* (*pressure)(x1, x2, x3); //explicit Compressible + //(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho); +//// reduced Filter + //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3); //explicit Compressible + //(*pressure)(x1, x2, x3) = (((*pressureOld)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho); + + //rho = (rho)/(one- (one - (*phaseField)(x1, x2, x3)) * drho); // now implicit Compressible + + //(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3; + ////!!!!!! relplace by pointer swap! + //(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3); + } + } + } + } + + LBMReal collFactorM; + + ////Periodic Filter + //for (int x3 = minX3-1; x3 <= maxX3; x3++) { + // for (int x2 = minX2-1; x2 <= maxX2; x2++) { + // for (int x1 = minX1-1; x1 <= maxX1; x1++) { + // if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + + // LBMReal sum = 0.; + + // ///Version for boundaries + // for (int xx = -1; xx <= 1; xx++) { + // //int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0; + // int xxx = xx + x1; + + // for (int yy = -1; yy <= 1; yy++) { + // //int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0; + // int yyy = yy + x2; + + // for (int zz = -1; zz <= 1; zz++) { + // //int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0; + // int zzz = zz + x3; + + // if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) { + // sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz); + // } + // else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3); + // } + + + // } + // } + // } + // (*pressure)(x1, x2, x3) = sum; + // } + // } + // } + //} + + ////!filter + + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + ////////////////////////////////////////////////////////////////////////// + // Read distributions and phase field + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + // E N T + // c c c + ////////// + // W S B + // a a a + + // Rest ist b + + // mfxyz + // a - negative + // b - null + // c - positive + + // a b c + //-1 0 1 + + findNeighbors(phaseField, x1, x2, x3); + + LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + + LBMReal mfhcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfhbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfhbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfhccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfhacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfhcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfhabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfhbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfhbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfhccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfhacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfhcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfhaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfhabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfhbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfhbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfhaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfhcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfhaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfhcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfhbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfhbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfhaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfhcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfhaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfhcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfhbbb = (*this->zeroDistributionsH2)(x1, x2, x3); + + //LBMReal rhoH = 1.0; + //LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0/ densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal dX1_phi = gradX1_phi(); + LBMReal dX2_phi = gradX2_phi(); + LBMReal dX3_phi = gradX3_phi(); + + LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9+1e-3; + // 01.09.2022: unclear what value we have to add to the normal: lager values better cut of in gas phase? + LBMReal normX1 = dX1_phi / denom; + LBMReal normX2 = dX2_phi / denom; + LBMReal normX3 = dX3_phi / denom; + + + + collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL); + + + LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(); + + //----------- Calculating Macroscopic Values ------------- + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); //Incompressible + + ///scaled phase field + //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) / ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) + (c1 - (*phaseField)(x1, x2, x3)) * (c1 - (*phaseField)(x1, x2, x3))) - phiH); + ///!scaled phase field + + //LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH)+(one-phi[DIR_000])* (*pressure)(x1, x2, x3)*three; //compressible + //LBMReal rho = rhoL + (rhoH - rhoL) * phi[DIR_000] + (one - phi[DIR_000]) * (*pressure)(x1, x2, x3) * three; //compressible + + LBMReal m0, m1, m2; + LBMReal rhoRef=c1; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb))/rhoRef; + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab))/rhoRef; + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba))/rhoRef; + ////Filter&Gradient merged + LBMReal pressureHere = (*pressureOld)(x1, x2, x3); + //LBMReal pressureHere = (*pressure)(x1, x2, x3); + + LBMReal arrayP[3][3][3] = { {{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}}, + {{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}}, + { {pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}} }; + //LBMReal LaplaceP = 0.0; + //LaplaceP += WEIGTH[DIR_PPP] * (((((*pressureOld)(x1+1,x2+1,x3+1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 + 1) - pressureHere))) + // + ((((*pressureOld)(x1 + 1, x2 - 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 + 1) - pressureHere)))); + //LaplaceP += WEIGTH[DIR_0PP] * ( + // ((((*pressureOld)(x1 + 1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3) - pressureHere))) + // + ((((*pressureOld)(x1 + 1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 -1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 + 1) - pressureHere))) + // + ((((*pressureOld)(x1, x2 + 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 + 1) - pressureHere))) + // ); + //LaplaceP += WEIGTH[DIR_00P] * ( + // (((*pressureOld)(x1 + 1, x2, x3) - pressureHere) + ((*pressureOld)(x1, x2-1, x3) - pressureHere)) + // + (((*pressureOld)(x1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3) - pressureHere)) + // + (((*pressureOld)(x1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2, x3 - 1) - pressureHere)) + // ); + + //LaplaceP= 6.0 * LaplaceP; + + //LBMReal sum = 0.0; + + for (int dir1 = -1; dir1 <= 1; dir1++) { + for (int dir2 = -1; dir2 <= 1; dir2++) { + for (int dir3 = -1; dir3 <= 1; dir3++){ + int xxx = x1 + dir1; + int yyy = x2 + dir2; + int zzz = x3 + dir3; + if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressureOld)(xxx, yyy, zzz); + //if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressure)(xxx, yyy, zzz); + // sum += 64.0 / (216.0 * (c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)) * (c1 + c3 * abs(dir3))) * arrayP[dir1 + 1][dir2 + 1][dir3 + 1]; + } + } + } +// (*pressure)(x1, x2, x3) = sum;// *0.1 + (1.0 - 0.1) * (*pressureOld)(x1, x2, x3); + + + (*pressure)(x1, x2, x3) = (((((arrayP[0][0][0] + arrayP[2][2][2]) + (arrayP[0][2][0] + arrayP[2][0][2])) + ((arrayP[2][0][0] + arrayP[0][2][2]) + (arrayP[2][2][0] + arrayP[0][0][2]))) * c1o216 + + (((arrayP[0][0][1] + arrayP[2][2][1]) + (arrayP[0][1][0] + arrayP[2][1][2])) + ((arrayP[1][0][0] + arrayP[1][2][2]) + (arrayP[0][1][2] + arrayP[2][1][0])) + ((arrayP[1][0][2] + arrayP[1][2][0]) + (arrayP[0][2][1] + arrayP[2][0][1]))) * c1o54) + + ((arrayP[0][1][1] + arrayP[2][1][1]) + (arrayP[1][0][1] + arrayP[1][2][1]) + (arrayP[1][1][0] + arrayP[1][1][2])) * c2o27) + + arrayP[1][1][1] * c8o27; + //LBMReal gradPx = 0.0; + //LBMReal gradPy = 0.0; + //LBMReal gradPz = 0.0; + //for (int dir1 = -1; dir1 <= 1; dir1++) { + // for (int dir2 = -1; dir2 <= 1; dir2++) { + // gradPx -= arrayP[0][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // gradPx += arrayP[2][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + + + + // gradPy -= arrayP[dir1+1][0][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // gradPy += arrayP[dir1+1][2][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // + + // gradPz -= arrayP[dir1+1][dir2+1][0] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // gradPz += arrayP[dir1+1][dir2+1][2] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + //} + + //LBMReal gradPx = ((((arrayP[2][0][0] - arrayP[0][2][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72 + // + (((arrayP[2][1][0] - arrayP[0][1][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[2][0][1] - arrayP[0][2][1]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18) + // + (arrayP[2][1][1] - arrayP[0][1][1]) * c2o9; + //LBMReal gradPy = ((((arrayP[0][2][0] - arrayP[2][0][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[0][2][2] - arrayP[2][0][0]))) * c1o72 + // + (((arrayP[1][2][0] - arrayP[1][0][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[0][2][1] - arrayP[2][0][1]) + (arrayP[1][2][2] - arrayP[1][0][0]))) * c1o18) + // + (arrayP[1][2][1] - arrayP[1][0][1]) * c2o9; + //LBMReal gradPz = ((((arrayP[0][0][2] - arrayP[2][2][0]) + (arrayP[0][2][2] - arrayP[2][0][0])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72 + // + (((arrayP[0][1][2] - arrayP[2][1][0]) + (arrayP[1][2][2] - arrayP[1][0][0])) + ((arrayP[1][0][2] - arrayP[1][2][0]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18) + // + (arrayP[1][1][2] - arrayP[1][1][0]) * c2o9; + + //gradPx *=c1 - (*pressure)(x1, x2, x3)+pressureHere; + //gradPy *=c1 - (*pressure)(x1, x2, x3) + pressureHere; + //gradPz *=c1 - (*pressure)(x1, x2, x3) + pressureHere; + + ////!Filter&Gradient merged + //LBMReal gradPx = 0.0; + //LBMReal gradPy = 0.0; + //LBMReal gradPz = 0.0; + //for (int dir1 = -1; dir1 <= 1; dir1++) { + // for (int dir2 = -1; dir2 <= 1; dir2++) { + // int yyy = x2 + dir1; + // int zzz = x3 + dir2; + // if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) { + // gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // else { + // gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) { + // gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // else { + // gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + + // int xxx = x1 + dir1; + // if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) { + // gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // else { + // gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) { + // gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // else { + // gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + + // yyy = x2 + dir2; + // if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) { + // gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // else { + // gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) { + // gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + // else { + // gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + // } + + // } + //} + + //Viscosity increase by phase field residuum + //LBMReal errPhi = (((1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale)- denom); + //LBMReal limVis = 0.01;// 0.0000001 * 10;//0.01; + // collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM); + // collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM; + //errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi; + //collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis); + + //3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP]))) + //+WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) + + //+WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M])); + + muRho = rho; + + ////external pressure + //forcingX1 =/* muForcingX1.Eval()/rho */- gradPx/rho; + //forcingX2 =/* muForcingX2.Eval()/rho */- gradPy/rho; + //forcingX3 =/* muForcingX3.Eval()/rho */- gradPz/rho; + + /////////////////////////////////////////////// + + //LBMReal pBefore = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + // + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + // + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; + //pBefore = -c1o3 * (-1.0e-10)/((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) ); + ////if (vvx * vvx + vvy * vvy + vvz * vvz > 1.0e-100) { + // mfabb -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_P00] * (rhoH - rhoL) / (phiH - phiL))); + // mfbab -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0P0] * (rhoH - rhoL) / (phiH - phiL))); + // mfbba -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_00P] * (rhoH - rhoL) / (phiH - phiL))); + // mfaab -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PP0] * (rhoH - rhoL) / (phiH - phiL))); + // mfcab -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MP0] * (rhoH - rhoL) / (phiH - phiL))); + // mfaba -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_P0P] * (rhoH - rhoL) / (phiH - phiL))); + // mfcba -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_M0P] * (rhoH - rhoL) / (phiH - phiL))); + // mfbaa -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0PP] * (rhoH - rhoL) / (phiH - phiL))); + // mfbca -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0MP] * (rhoH - rhoL) / (phiH - phiL))); + // mfaaa -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PPP] * (rhoH - rhoL) / (phiH - phiL))); + // mfcaa -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MPP] * (rhoH - rhoL) / (phiH - phiL))); + // mfaca -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PMP] * (rhoH - rhoL) / (phiH - phiL))); + // mfcca -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MMP] * (rhoH - rhoL) / (phiH - phiL))); + // mfcbb -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_M00] * (rhoH - rhoL) / (phiH - phiL))); + // mfbcb -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0M0] * (rhoH - rhoL) / (phiH - phiL))); + // mfbbc -= pBefore * c2o9 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_00M] * (rhoH - rhoL) / (phiH - phiL))); + // mfccb -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MM0] * (rhoH - rhoL) / (phiH - phiL))); + // mfacb -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PM0] * (rhoH - rhoL) / (phiH - phiL))); + // mfcbc -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_M0M] * (rhoH - rhoL) / (phiH - phiL))); + // mfabc -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_P0M] * (rhoH - rhoL) / (phiH - phiL))); + // mfbcc -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0MM] * (rhoH - rhoL) / (phiH - phiL))); + // mfbac -= pBefore * c1o18 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_0PM] * (rhoH - rhoL) / (phiH - phiL))); + // mfccc -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MMM] * (rhoH - rhoL) / (phiH - phiL))); + // mfacc -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PMM] * (rhoH - rhoL) / (phiH - phiL))); + // mfcac -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_MPM] * (rhoH - rhoL) / (phiH - phiL))); + // mfaac -= pBefore * c1o72 * ((rhoL + phi[DIR_000] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[DIR_PPM] * (rhoH - rhoL) / (phiH - phiL))); + // mfbbb -= pBefore * 8.0 / 9.0; + //} + + /////////////////////////////////////////////// + + LBMReal pStarStart = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; + + ///////////////////// + //LBMReal vvxh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) + + // (((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) + + // (mfhcbb - mfhabb)) / rhoRef; + //LBMReal vvyh = ((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) + + // (((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) + + // (mfhbcb - mfhbab)) / rhoRef; + //LBMReal vvzh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) + + // (((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) + + // (mfhbbc - mfhbba)) / rhoRef; + + //LBMReal deltaPP = 0*(vvxh * dX1_phi + vvyh * dX2_phi + vvzh * dX3_phi) * rhoToPhi / (rho); + //mfhbcb += c1o6* c2o9 * deltaPP; + //mfhbbc += c1o6* c2o9 * deltaPP; + //mfhcbb += c1o6* c2o9 * deltaPP; + //mfhccb += c1o6* c1o18 * deltaPP; + //mfhacb += c1o6* c1o18 * deltaPP; + //mfhcbc += c1o6* c1o18 * deltaPP; + //mfhabc += c1o6* c1o18 * deltaPP; + //mfhbcc += c1o6* c1o18 * deltaPP; + //mfhbac += c1o6* c1o18 * deltaPP; + //mfhccc += c1o6* c1o72 * deltaPP; + //mfhacc += c1o6* c1o72 * deltaPP; + //mfhcac += c1o6* c1o72 * deltaPP; + //mfhaac += c1o6* c1o72 * deltaPP; + //mfhabb += c1o6* c2o9 * deltaPP; + //mfhbab += c1o6* c2o9 * deltaPP; + //mfhbba += c1o6* c2o9 * deltaPP; + //mfhaab += c1o6* c1o18 * deltaPP; + //mfhcab += c1o6* c1o18 * deltaPP; + //mfhaba += c1o6* c1o18 * deltaPP; + //mfhcba += c1o6* c1o18 * deltaPP; + //mfhbaa += c1o6* c1o18 * deltaPP; + //mfhbca += c1o6* c1o18 * deltaPP; + //mfhaaa += c1o6* c1o72 * deltaPP; + //mfhcaa += c1o6* c1o72 * deltaPP; + //mfhaca += c1o6* c1o72 * deltaPP; + //mfhcca += c1o6* c1o72 * deltaPP; + //mfhbbb += c1o6* c4 * c2o9 * deltaPP; + + ////////////////////// + + /////Recovering the origin distributions + //LBMReal mfStartcbb = mfcbb ; + //LBMReal mfStartbcb = mfbcb ; + //LBMReal mfStartbbc = mfbbc ; + //LBMReal mfStartccb = mfccb ; + //LBMReal mfStartacb = mfacb ; + //LBMReal mfStartcbc = mfcbc ; + //LBMReal mfStartabc = mfabc ; + //LBMReal mfStartbcc = mfbcc ; + //LBMReal mfStartbac = mfbac ; + //LBMReal mfStartccc = mfccc ; + //LBMReal mfStartacc = mfacc ; + //LBMReal mfStartcac = mfcac ; + //LBMReal mfStartaac = mfaac ; + //LBMReal mfStartabb = mfabb ; + //LBMReal mfStartbab = mfbab ; + //LBMReal mfStartbba = mfbba ; + //LBMReal mfStartaab = mfaab ; + //LBMReal mfStartcab = mfcab ; + //LBMReal mfStartaba = mfaba ; + //LBMReal mfStartcba = mfcba ; + //LBMReal mfStartbaa = mfbaa ; + //LBMReal mfStartbca = mfbca ; + //LBMReal mfStartaaa = mfaaa ; + //LBMReal mfStartcaa = mfcaa ; + //LBMReal mfStartaca = mfaca ; + //LBMReal mfStartcca = mfcca ; + //LBMReal mfStartbbb = mfbbb ; + + + mfcbb += mfhcbb /rho; + mfbcb += mfhbcb /rho; + mfbbc += mfhbbc /rho; + mfccb += mfhccb /rho; + mfacb += mfhacb /rho; + mfcbc += mfhcbc /rho; + mfabc += mfhabc /rho; + mfbcc += mfhbcc /rho; + mfbac += mfhbac /rho; + mfccc += mfhccc /rho; + mfacc += mfhacc /rho; + mfcac += mfhcac /rho; + mfaac += mfhaac /rho; + mfabb += mfhabb /rho; + mfbab += mfhbab /rho; + mfbba += mfhbba /rho; + mfaab += mfhaab /rho; + mfcab += mfhcab /rho; + mfaba += mfhaba /rho; + mfcba += mfhcba /rho; + mfbaa += mfhbaa /rho; + mfbca += mfhbca /rho; + mfaaa += mfhaaa /rho; + mfcaa += mfhcaa /rho; + mfaca += mfhaca /rho; + mfcca += mfhcca /rho; + mfbbb += mfhbbb /rho; + + + + //Abbas + LBMReal pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; + //22.09.22 not yet in balance, repaire here + //LBMReal ppStar = ((((((mfhaaa + mfhccc) + (mfhaac + mfhcca)) + ((mfhcac + mfhaca) + (mfhcaa + mfhacc)))*c3 + // + (((mfhaab + mfhccb) + (mfhacb + mfhcab)) + ((mfhaba + mfhcbc) + (mfhabc + mfhcba)) + ((mfhbaa + mfhbcc) + (mfhbac + mfhbca))))*c2 + // + ((mfhabb + mfhcbb) + (mfhbab + mfhbcb) + (mfhbba + mfhbbc))) ) * c1o3/rho; + + //ppStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) * c3 + // + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) * c2 + // + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)))) * c1o3 ; + + //(*phaseFieldOld)(x1, x2, x3) = ((*phaseFieldOld)(x1, x2, x3) > 99.0) ? phi[DIR_000] : (*phaseFieldOld)(x1, x2, x3); + //LBMReal dtPhi = phi[DIR_000] - (*phaseFieldOld)(x1, x2, x3); + //LBMReal deltaP = -pStar * (c1 - rho / (rho + c1o2 * rhoToPhi * dtPhi));// -pStar * pStar * pStar * 1.0e-4 * rho * rho * rho; + //LBMReal deltaP = pStar * (c1 - mfhbbb*rho) * c1o2;//Explicit + //LBMReal deltaP = pStar * (c1 - mfhbbb * rho) / (c1 + mfhbbb * rho);//Semi-Implicit + //(*phaseFieldOld)(x1, x2, x3) = phi[DIR_000]; + + //mfabb += c2o9 *deltaP; + //mfbab += c2o9 *deltaP; + //mfbba += c2o9 *deltaP; + //mfaab += c1o18*deltaP; + //mfcab += c1o18*deltaP; + //mfaba += c1o18*deltaP; + //mfcba += c1o18*deltaP; + //mfbaa += c1o18*deltaP; + //mfbca += c1o18*deltaP; + //mfaaa += c1o72*deltaP; + //mfcaa += c1o72*deltaP; + //mfaca += c1o72*deltaP; + //mfcca += c1o72*deltaP; + //mfcbb += c2o9 *deltaP; + //mfbcb += c2o9 *deltaP; + //mfbbc += c2o9 *deltaP; + //mfccb += c1o18*deltaP; + //mfacb += c1o18*deltaP; + //mfcbc += c1o18*deltaP; + //mfabc += c1o18*deltaP; + //mfbcc += c1o18*deltaP; + //mfbac += c1o18*deltaP; + //mfccc += c1o72*deltaP; + //mfacc += c1o72*deltaP; + //mfcac += c1o72*deltaP; + //mfaac += c1o72*deltaP; + + //pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + // + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + // + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; + + + + + //mfabb -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_P00])*rhoToPhi/rho; + //mfbab -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_0P0])*rhoToPhi/rho; + //mfbba -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_00P])*rhoToPhi/rho; + //mfaab -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_PP0])*rhoToPhi/rho; + //mfcab -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_MP0])*rhoToPhi/rho; + //mfaba -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_P0P])*rhoToPhi/rho; + //mfcba -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_M0P])*rhoToPhi/rho; + //mfbaa -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_0PP])*rhoToPhi/rho; + //mfbca -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_0MP])*rhoToPhi/rho; + //mfaaa -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_PPP])*rhoToPhi/rho; + //mfcaa -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_MPP])*rhoToPhi/rho; + //mfaca -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_PMP])*rhoToPhi/rho; + //mfcca -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_MMP])*rhoToPhi/rho; + //mfcbb -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_M00])*rhoToPhi/rho; + //mfbcb -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_0M0])*rhoToPhi/rho; + //mfbbc -= c1o2 * c2o9 *pStar*(phi[DIR_000]-phi[DIR_00M])*rhoToPhi/rho; + //mfccb -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_MM0])*rhoToPhi/rho; + //mfacb -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_PM0])*rhoToPhi/rho; + //mfcbc -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_M0M])*rhoToPhi/rho; + //mfabc -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_P0M])*rhoToPhi/rho; + //mfbcc -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_0MM])*rhoToPhi/rho; + //mfbac -= c1o2 * c1o18*pStar*(phi[DIR_000]-phi[DIR_0PM])*rhoToPhi/rho; + //mfccc -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_MMM])*rhoToPhi/rho; + //mfacc -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_PMM])*rhoToPhi/rho; + //mfcac -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_MPM])*rhoToPhi/rho; + //mfaac -= c1o2 * c1o72*pStar*(phi[DIR_000]-phi[DIR_PPM])*rhoToPhi/rho; + + + //forcingX1 =/* muForcingX1.Eval() / rho*/ - pStar * dX1_phi * rhoToPhi / rho; + //forcingX2 =/* muForcingX2.Eval() / rho*/ - pStar * dX2_phi * rhoToPhi / rho; + //forcingX3 =/* muForcingX3.Eval() / rho*/ - pStar * dX3_phi * rhoToPhi / rho; + + + //mfabb += (-forcingX1) * c2o9; + //mfbab += (-forcingX2) * c2o9; + //mfbba += (-forcingX3) * c2o9; + //mfaab += (-forcingX1 - forcingX2) * c1o16; + //mfcab += (forcingX1 - forcingX2) * c1o16; + //mfaba += (-forcingX1 - forcingX3) * c1o16; + //mfcba += (forcingX1 - forcingX3) * c1o16; + //mfbaa += (-forcingX2 - forcingX3) * c1o16; + //mfbca += (forcingX2 - forcingX3) * c1o16; + //mfaaa += (-forcingX1 - forcingX2 - forcingX3) * c1o72; + //mfcaa += (forcingX1 - forcingX2 - forcingX3) * c1o72; + //mfaca += (-forcingX1 + forcingX2 - forcingX3) * c1o72; + //mfcca += (forcingX1 + forcingX2 - forcingX3) * c1o72; + //mfcbb += (forcingX1)*c2o9; + //mfbcb += (forcingX2)*c2o9; + //mfbbc += (forcingX3)*c2o9; + //mfccb += (forcingX1 + forcingX2) * c1o16; + //mfacb += (-forcingX1 + forcingX2) * c1o16; + //mfcbc += (forcingX1 + forcingX3) * c1o16; + //mfabc += (-forcingX1 + forcingX3) * c1o16; + //mfbcc += (forcingX2 + forcingX3) * c1o16; + //mfbac += (-forcingX2 + forcingX3) * c1o16; + //mfccc += (forcingX1 + forcingX2 + forcingX3) * c1o72; + //mfacc += (-forcingX1 + forcingX2 + forcingX3) * c1o72; + //mfcac += (forcingX1 - forcingX2 + forcingX3) * c1o72; + //mfaac += (-forcingX1 - forcingX2 + forcingX3) * c1o72; + + //LBMReal saveForceX1 = forcingX1; + //LBMReal saveForceX2 = forcingX2; + //LBMReal saveForceX3 = forcingX3; + + vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)) / rhoRef; + vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)) / rhoRef; + vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)) / rhoRef; + + + //LBMReal dRhoInvX = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) + + // (((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) + + // (mfhcbb - mfhabb))); + //LBMReal dRhoInvY = -(((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) + + // (((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) + + // (mfhbcb - mfhbab))); + //LBMReal dRhoInvZ = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) + + // (((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) + + // (mfhbbc - mfhbba))); + + + forcingX1 = 0.0; + forcingX2 = 0.0; + forcingX3 = 0.0; + //!Abbas + //LBMReal dX1_rhoInv = gradX1_rhoInv(rhoL, rhoH - rhoL); + //LBMReal dX2_rhoInv = gradX2_rhoInv(rhoL, rhoH - rhoL); + //LBMReal dX3_rhoInv = gradX3_rhoInv(rhoL, rhoH - rhoL); + //forcingX1 =/* muForcingX1.Eval() / rho*/ +pStar * dX1_rhoInv * rho; + //forcingX2 =/* muForcingX2.Eval() / rho*/ +pStar * dX2_rhoInv * rho; + //forcingX3 =/* muForcingX3.Eval() / rho*/ +pStar * dX3_rhoInv * rho; + + //forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho + pStar * dX1_rhoInv * rho) *c1o2; + //forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho + pStar * dX2_rhoInv * rho) *c1o2; + //forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho + pStar * dX3_rhoInv * rho) *c1o2; + //LBMReal FdX1_phi = normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + //LBMReal FdX2_phi = normX2 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + //LBMReal FdX3_phi = normX3 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + + + //forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho ) ; + //forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho ) ; + //forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho ) ; + + //forcingX1 = (pStar * dRhoInvX* rho *c3) ; + //forcingX2 = (pStar * dRhoInvY* rho *c3) ; + //forcingX3 = (pStar * dRhoInvZ* rho *c3) ; + //if (phi[DIR_000] > 0.1 && phi[DIR_000] < 0.9) std::cout << phi[DIR_000] << " " << dX1_phi * rhoToPhi / rho << " " << dRhoInvX * rho *3<< std::endl; + //LBMReal forcingX1ALTERNAT = ( pStar * dX1_rhoInv * rho) ; + //LBMReal forcingX2ALTERNAT = ( pStar * dX2_rhoInv * rho) ; + //LBMReal forcingX3ALTERNAT = ( pStar * dX3_rhoInv * rho) ; + + //forcingX1 = (fabs(vvx + c1o2 * forcingX1) < fabs(vvx + c1o2 * forcingX1ALTERNAT)) ? forcingX1 : forcingX1ALTERNAT; + //forcingX2 = (fabs(vvy + c1o2 * forcingX2) < fabs(vvy + c1o2 * forcingX2ALTERNAT)) ? forcingX2 : forcingX2ALTERNAT; + //forcingX3 = (fabs(vvz + c1o2 * forcingX3) < fabs(vvz + c1o2 * forcingX3ALTERNAT)) ? forcingX3 : forcingX3ALTERNAT; + + // forcingX1 = -pStar * rhoToPhi / rho * normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + // forcingX2 = -pStar * rhoToPhi / rho * normX2 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + // forcingX3 = -pStar * rhoToPhi / rho * normX3 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale; + + //forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho *(c1- phi[DIR_000]) + pStar * dX1_rhoInv * rho*(phi[DIR_000])); + //forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho *(c1- phi[DIR_000]) + pStar * dX2_rhoInv * rho*(phi[DIR_000])); + //forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho *(c1- phi[DIR_000]) + pStar * dX3_rhoInv * rho*(phi[DIR_000])); + //if (phi[DIR_000] > 0.3 && phi[DIR_000] < 0.7) + //{ + // int test = 1; + // std::cout << phi[DIR_000] <<" "<< dX1_phi <<" "<< normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale<<" "<< normX1 * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale/ dX1_phi<< std::endl; + //} + + + + //LBMReal scaleGrad = c2 * phi[DIR_000] * (1.0 - phi[DIR_000]) / ((phi[DIR_000] * phi[DIR_000] + (1.0 - phi[DIR_000]) * (1.0 - phi[DIR_000])) * (phi[DIR_000] * phi[DIR_000] + (1.0 - phi[DIR_000]) * (1.0 - phi[DIR_000]))); + //dX1_phi *= scaleGrad; + //dX2_phi *= scaleGrad; + //dX3_phi *= scaleGrad; + + ///Experimental interface sharpening force 20.06.2022 + + //LBMReal scaleSharpener = 1.0; + //forcingX1 += scaleSharpener * (FdX1_phi - dX1_phi) * fabsf(FdX1_phi - dX1_phi) / rho; + //forcingX2 += scaleSharpener * (FdX2_phi - dX2_phi) * fabsf(FdX2_phi - dX2_phi) / rho; + //forcingX3 += scaleSharpener * (FdX3_phi - dX3_phi) * fabsf(FdX3_phi - dX3_phi) / rho; + ///surface tension force + forcingX1 += mu * dX1_phi/rho; + forcingX2 += mu * dX2_phi/rho; + forcingX3 += mu * dX3_phi/rho; + + //LBMReal forcingBIAS = 0.5; + forcingX1 += muForcingX1.Eval() / rho;//*phi[DIR_000]; + forcingX2 += muForcingX2.Eval() / rho;// * phi[DIR_000]; + forcingX3 += muForcingX3.Eval() / rho;// * phi[DIR_000]; + + // //19.08.2022 + //vvx += vvxh / rho * c1o2; + //vvy += vvyh / rho * c1o2; + //vvz += vvzh / rho * c1o2; + // // + + + vvx += (forcingX1) * deltaT * c1o2; + vvy += (forcingX2) * deltaT * c1o2; + vvz += (forcingX3) * deltaT * c1o2; + + //vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT * c1o2; // X + //vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT * c1o2; // Y + //vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT * c1o2; // Z + + + + // vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT * forcingBIAS; // X + // vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT * forcingBIAS; // Y + // vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT * forcingBIAS; // Z + + + + //Abbas + //LBMReal M200 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + // + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) )) + // + ((mfabb + mfcbb))) ); + //LBMReal M020 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + // + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + // + ( (mfbab + mfbcb) )) ); + //LBMReal M002 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) + // + ( + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) + // + ( (mfbba + mfbbc)))); + + //LBMReal M110 = ((((((mfaaa + mfccc) + (-mfcac - mfaca)) + ((mfaac + mfcca) + (-mfcaa -mfacc))) + // + (((mfaab + mfccb) + (-mfacb - mfcab)) )) + // ) ); + //LBMReal M101 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcac + mfaca) - (mfcaa + mfacc))) + // + (((mfaba + mfcbc) + (-mfabc - mfcba)))) + // )); + //LBMReal M011 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ( (mfcaa + mfacc)- (mfcac + mfaca))) + // + (((mfbaa + mfbcc) + (-mfbac - mfbca)))) + // )); + LBMReal vvxI = vvx; + LBMReal vvyI = vvy; + LBMReal vvzI = vvz; + + //LBMReal collFactorStore=collFactorM; + //LBMReal stress; + //for(int iter=0;iter<5;iter++) + //{ + // LBMReal OxxPyyPzz = 1.0; + // LBMReal mxxPyyPzz = (M200-vvxI*vvxI) + (M020-vvyI*vvyI) + (M002-vvzI*vvzI); + // //pStar = mxxPyyPzz * c1o3; + //mxxPyyPzz -= c3 *pStar; + + //LBMReal mxxMyy = (M200-vvxI*vvxI) - (M020-vvyI*vvyI); + //LBMReal mxxMzz = (M200-vvxI*vvxI) - (M002-vvzI*vvzI); + //LBMReal mxy = M110 - vvxI * vvyI; + //LBMReal mxz = M101 - vvxI * vvzI; + //LBMReal myz = M011 - vvyI * vvzI; + + + //mxxMyy *= c1 - collFactorM * c1o2; + //mxxMzz *= c1 - collFactorM * c1o2; + //mxy *= c1 - collFactorM * c1o2; + //mxz *= c1 - collFactorM * c1o2; + //myz *= c1 - collFactorM * c1o2; + //mxxPyyPzz *= c1 - OxxPyyPzz * c1o2; + ////mxxPyyPzz = mxxPyyPzz*fabs(mxxPyyPzz)/(1.0e-6+fabs(mxxPyyPzz)); + ////mxxPyyPzz += c3 * pStar; + //LBMReal mxx = (mxxMyy + mxxMzz + mxxPyyPzz)*c1o3; + //LBMReal myy = (-c2*mxxMyy + mxxMzz + mxxPyyPzz)*c1o3; + //LBMReal mzz = (mxxMyy -c2* mxxMzz + mxxPyyPzz) * c1o3; + //vvxI = vvx - (mxx * dX1_phi + mxy * dX2_phi + mxz * dX3_phi) * rhoToPhi / (rho); + //vvyI = vvy - (mxy * dX1_phi + myy * dX2_phi + myz * dX3_phi) * rhoToPhi / (rho); + //vvzI = vvz - (mxz * dX1_phi + myz * dX2_phi + mzz * dX3_phi) * rhoToPhi / (rho); + + + //// vvzI = vvz + (mxz * dRhoInvX + myz * dRhoInvY + mzz * dRhoInvZ) * (rho)*c3; + //// vvxI = vvx + (mxx * dRhoInvX + mxy * dRhoInvY + mxz * dRhoInvZ) * (rho)*c3; + //// vvyI = vvy + (mxy * dRhoInvX + myy * dRhoInvY + myz * dRhoInvZ) * (rho)*c3; + + + // //LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); + // // + // //LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; + // //LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; + // //LBMReal Dxy = -three * collFactorM * mxy; + // //LBMReal Dxz = -three * collFactorM * mxz; + // //LBMReal Dyz = -three * collFactorM * myz; + // ////LBMReal stress = sqrt(sqrt((dyuy+dxux+dzuz)* (dyuy + dxux + dzuz))) * sqrt(forcingX1 * forcingX1 + forcingX2 * forcingX2 + forcingX3 * forcingX3); + // // stress = sqrt(dyuy * dyuy + dxux * dxux + dzuz*dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz)*sqrt(forcingX1*forcingX1+forcingX2*forcingX2+forcingX3*forcingX3); + // ////collFactorM = collFactorStore + (1.75 - collFactorStore) * stress / (stress + 1.0e-8); + // // + // //LBMReal dX2_rho = (rhoToPhi)*dX2_phi; + // //LBMReal dX1_rho = (rhoToPhi)*dX1_phi; + // //LBMReal dX3_rho = (rhoToPhi)*dX3_phi; + // ////vvxI= vvx+ c1o6 * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho); + // ////vvyI= vvy+ c1o6 * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho); + // ////vvzI= vvz+ c1o6 * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho); + + // //vvxI = vvx + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho); + // //vvyI = vvy + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho); + // //vvzI = vvz + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho); + + // ////vvxI = vvx - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rhoInv + Dxy * dX2_rhoInv + Dxz * dX3_rhoInv); + // ////vvyI = vvy - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rhoInv + 2 * dyuy * dX2_rhoInv + Dyz * dX3_rhoInv); + // ////vvzI = vvz - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rhoInv + Dyz * dX2_rhoInv + 2 * dyuy * dX3_rhoInv); + + + //} + // //forcingX1+=(vvxI-vvx)/(deltaT* forcingBIAS) + muForcingX1.Eval() / rho; + // //forcingX2 += (vvyI - vvy) / (deltaT * forcingBIAS) + muForcingX2.Eval() / rho; + // //forcingX3 += (vvzI - vvz) / (deltaT * forcingBIAS) + muForcingX3.Eval() / rho; + + + //// forcingX1 += c2 * (vvxI - vvx); + //// forcingX2 += c2 * (vvyI - vvy); + //// forcingX3 += c2 * (vvzI - vvz); + + + //mfabb += c1o2*(-forcingX1) * c2o9; + //mfbab += c1o2*(-forcingX2) * c2o9; + //mfbba += c1o2*(-forcingX3) * c2o9; + //mfaab += c1o2*(-forcingX1 - forcingX2) * c1o18; + //mfcab += c1o2*( forcingX1 - forcingX2) * c1o18; + //mfaba += c1o2*(-forcingX1 - forcingX3) * c1o18; + //mfcba += c1o2*( forcingX1 - forcingX3) * c1o18; + //mfbaa += c1o2*(-forcingX2 - forcingX3) * c1o18; + //mfbca += c1o2*( forcingX2 - forcingX3) * c1o18; + //mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72; + //mfcaa += c1o2*(forcingX1 - forcingX2 - forcingX3) * c1o72; + //mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72; + //mfcca += c1o2*(forcingX1 + forcingX2 - forcingX3) * c1o72; + //mfcbb += c1o2*(forcingX1)*c2o9; + //mfbcb += c1o2*(forcingX2)*c2o9; + //mfbbc += c1o2*(forcingX3)*c2o9; + //mfccb += c1o2*( forcingX1 + forcingX2) * c1o18; + //mfacb += c1o2*(-forcingX1 + forcingX2) * c1o18; + //mfcbc += c1o2*( forcingX1 + forcingX3) * c1o18; + //mfabc += c1o2*(-forcingX1 + forcingX3) * c1o18; + //mfbcc += c1o2*( forcingX2 + forcingX3) * c1o18; + //mfbac += c1o2*(-forcingX2 + forcingX3) * c1o18; + //mfccc += c1o2*(forcingX1 + forcingX2 + forcingX3) * c1o72; + //mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72; + //mfcac += c1o2*(forcingX1 - forcingX2 + forcingX3) * c1o72; + //mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72; + + + //forcingX1 = saveForceX1; + //forcingX2 = saveForceX2; + //forcingX3 = saveForceX3; + vvx = vvxI; + vvy = vvyI; + vvz = vvzI; + + + + //!Abbas + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + //pStar =ppStar- (vx2 + vy2 + vz2)*pStar; + // pStar = (pStar + ppStar)*c1o2; + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + /////////////// + //mfabb -= pStar * c2o9; + //mfbab -= pStar * c2o9; + //mfbba -= pStar * c2o9; + //mfaab -= pStar * c1o16; + //mfcab -= pStar * c1o16; + //mfaba -= pStar * c1o16; + //mfcba -= pStar * c1o16; + //mfbaa -= pStar * c1o16; + //mfbca -= pStar * c1o16; + //mfaaa -= pStar * c1o72; + //mfcaa -= pStar * c1o72; + //mfaca -= pStar * c1o72; + //mfcca -= pStar * c1o72; + //mfcbb -= pStar * c2o9; + //mfbcb -= pStar * c2o9; + //mfbbc -= pStar * c2o9; + //mfccb -= pStar * c1o16; + //mfacb -= pStar * c1o16; + //mfcbc -= pStar * c1o16; + //mfabc -= pStar * c1o16; + //mfbcc -= pStar * c1o16; + //mfbac -= pStar * c1o16; + //mfccc -= pStar * c1o72; + //mfacc -= pStar * c1o72; + //mfcac -= pStar * c1o72; + //mfaac -= pStar * c1o72; + //mfbbb -= pStar * 8.0/9.0; + /////////////////// + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!! + + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01 / (c1 + 1.0e4 * phi[DIR_000] * (c1 - phi[DIR_000])); //LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + + // mfaaa = 0.0; + LBMReal OxxPyyPzz = 1.0; //omega2 or bulk viscosity + // LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + // LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + //collFactorM+= (1.7 - collFactorM) * fabs(mfaaa) / (fabs(mfaaa) + 0.001f); + + + /////fourth order parameters; here only for test. Move out of loop! + + LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0))); + LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); + LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); + LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' ) + LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + //LBMReal stress = 1.0;// stress / (stress + 1.0e-10); + //stress = 1.0; + //OxyyPxzz += stress*(1.0-OxyyPxzz); + //OxyyPxzz = c3 * (collFactorM - c2) / (collFactorM - c3); + //OxyyMxzz += stress*(1.0-OxyyMxzz); + //Oxyz += stress*(1.0-Oxyz); + //A *= 1.0-stress; + //BB *= 1.0-stress; + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + //pStar = (mxxPyyPzz+vx2+vy2+vz2) * c1o3;//does not work + //pStar = (mxxPyyPzz) * c1o3; + //pStar = pStar + 1.5 * (mxxPyyPzz * c1o3 - pStar); + //mfaaa = mxxPyyPzz; + // LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho)); + mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa + //mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + /// + LBMReal mmfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + LBMReal mmfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + LBMReal mmfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + LBMReal mmfabb = mfabb; + LBMReal mmfbab = mfbab; + LBMReal mmfbba = mfbba; + /// + + LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz)*0; + //LBMReal dxux = -c1o2 * (mxxMyy + mxxMzz) * collFactorM - mfaaa * c1o3* omegaDRho; + LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; + LBMReal Dxy = -three * collFactorM * mfbba; + LBMReal Dxz = -three * collFactorM * mfbab; + LBMReal Dyz = -three * collFactorM * mfabb; +// // attempt to improve implicit stress computation by fixed iteration +// LBMReal dX2_rho = (rhoToPhi)*dX2_phi; +// LBMReal dX1_rho = (rhoToPhi)*dX1_phi; +// LBMReal dX3_rho = (rhoToPhi)*dX3_phi; +// +// LBMReal dfx= c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho); +// LBMReal dfy = c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho); +// LBMReal dfz = c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho); +// +// for (int iteration = 0; iteration < 5; iteration++) { +// mxxMyy = (mfcaa - dfx * dfx * c1o2) - (mfaca - dfy * dfy * c1o2); +// mxxMzz = (mfcaa - dfx * dfx * c1o2) - (mfaac - dfz * dfz * c1o2); +// } +/////end fixed iteration +// + + + //relax + mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorM * (-mfabb); + mfbab += collFactorM * (-mfbab); + mfbba += collFactorM * (-mfbba); + + //if (fabsf(mfaaa + (dxux + dyuy + dzuz) > 1e-9)){ + // std::cout << mfaaa <<" "<< (dxux + dyuy + dzuz)<< std::endl; + //} + + + ////updated pressure + //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; + //mfaaa *= (one-omegaDRho);// (mfaaa + (dxux + dyuy + dzuz)) * .5; // Pressure elimination as in standard velocity model + // mfaaa += (rho - c1) * (dxux + dyuy + dzuz); + + mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa + + // mxxPyyPzz += (mfaaa + mfaaaS) * c1o2; + //mfaaa = mfaaaS; + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + mmfcaa += c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz- mfaaa); + mmfaca += c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz- mfaaa); + mmfaac += c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz- mfaaa); + mmfabb += mfabb; + mmfbab += mfbab; + mmfbba += mfbba; + + //relax + wadjust = Oxyz + (1. - Oxyz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc); + CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac); + CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca); + CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc); + CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb); + CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho; + + + //////// + + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa;// *(c1 - forcingBIAS) / forcingBIAS; + mfaba = -mfaba;// *(c1 - forcingBIAS) / forcingBIAS; + mfaab = -mfaab;// *(c1 - forcingBIAS) / forcingBIAS; + + //mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho); + //mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho); + //mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho); + + mfbaa -= c1o2 * rhoToPhi * (mmfcaa* dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho); + mfaba -= c1o2 * rhoToPhi * (mmfbba* dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho); + mfaab -= c1o2 * rhoToPhi * (mmfbab* dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho); + + vvx -= c1o4 * rhoToPhi * (mmfcaa * dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho); + vvy -= c1o4 * rhoToPhi * (mmfbba * dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho); + vvz -= c1o4 * rhoToPhi * (mmfbab * dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho); + + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + + //mmfcaa =0;// c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz - mfaaa); + //mmfaca =0;// c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz - mfaaa); + //mmfaac =0;// c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz - mfaaa); + //mmfabb =0;// mfabb; + //mmfbab =0;// mfbab; + //mmfbba =0;// mfbba; + + + ////////////////////////////////////////////////////////////////////////////////////// + //grad Rho + //LBMReal dX1_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX1_phi - phi[DIR_000] * three * gradPx; + //LBMReal dX2_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX2_phi - phi[DIR_000] * three * gradPy; + //LBMReal dX3_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX3_phi - phi[DIR_000] * three * gradPz; + + //LBMReal dX2_rho = (rhoToPhi ) * dX2_phi ; + //LBMReal dX1_rho = (rhoToPhi ) * dX1_phi ; + //LBMReal dX3_rho = (rhoToPhi ) * dX3_phi ; + /////////////////////////////////////////////////////////////////////////////////////// + //mfbaa += c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho); + //mfaba += c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho); + //mfaab += c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho); + + ///////Fakhari pressure correction + //mfbaa -= mfaaa / rho * dX1_rho*c1o3; + //mfaba -= mfaaa / rho * dX2_rho*c1o3; + //mfaab -= mfaaa / rho * dX3_rho*c1o3; + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + /////SimpleForce + + //mfabb += c2o9 * deltaP; + //mfbab += c2o9 * deltaP; + //mfbba += c2o9 * deltaP; + //mfaab += c1o18 * deltaP; + //mfcab += c1o18 * deltaP; + //mfaba += c1o18 * deltaP; + //mfcba += c1o18 * deltaP; + //mfbaa += c1o18 * deltaP; + //mfbca += c1o18 * deltaP; + //mfaaa += c1o72 * deltaP; + //mfcaa += c1o72 * deltaP; + //mfaca += c1o72 * deltaP; + //mfcca += c1o72 * deltaP; + //mfcbb += c2o9 * deltaP; + //mfbcb += c2o9 * deltaP; + //mfbbc += c2o9 * deltaP; + //mfccb += c1o18 * deltaP; + //mfacb += c1o18 * deltaP; + //mfcbc += c1o18 * deltaP; + //mfabc += c1o18 * deltaP; + //mfbcc += c1o18 * deltaP; + //mfbac += c1o18 * deltaP; + //mfccc += c1o72 * deltaP; + //mfacc += c1o72 * deltaP; + //mfcac += c1o72 * deltaP; + //mfaac += c1o72 * deltaP; + + //mfabb += c1o2*(-forcingX1 ) * c2o9; + //mfbab += c1o2*( - forcingX2 ) * c2o9; + //mfbba += c1o2*( - forcingX3) * c2o9; + //mfaab += c1o2*(-forcingX1 - forcingX2 ) * c1o18; + //mfcab += c1o2*( forcingX1 - forcingX2 ) * c1o18; + //mfaba += c1o2*(-forcingX1 - forcingX3) * c1o18; + //mfcba += c1o2*( forcingX1 - forcingX3) * c1o18; + //mfbaa += c1o2*( - forcingX2 - forcingX3) * c1o18; + //mfbca += c1o2*( forcingX2 - forcingX3) * c1o18; + //mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72; + //mfcaa += c1o2*( forcingX1 - forcingX2 - forcingX3) * c1o72; + //mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72; + //mfcca += c1o2*( forcingX1 + forcingX2 - forcingX3) * c1o72; + //mfcbb += c1o2*( forcingX1 ) * c2o9; + //mfbcb += c1o2*( forcingX2 ) * c2o9; + //mfbbc += c1o2*( forcingX3) * c2o9; + //mfccb += c1o2*( forcingX1 + forcingX2 ) * c1o18; + //mfacb += c1o2*(-forcingX1 + forcingX2 ) * c1o18; + //mfcbc += c1o2*( forcingX1 + forcingX3) * c1o18; + //mfabc += c1o2*(-forcingX1 + forcingX3) * c1o18; + //mfbcc += c1o2*( forcingX2 + forcingX3) * c1o18; + //mfbac += c1o2*( - forcingX2 + forcingX3) * c1o18; + //mfccc += c1o2*( forcingX1 + forcingX2 + forcingX3) * c1o72; + //mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72; + //mfcac += c1o2*( forcingX1 - forcingX2 + forcingX3) * c1o72; + //mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72; + //pStarStart -= (vx2 + vy2 + vz2) * c1o3; + + ///Take the diffusion part with out + + //mfStartcbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::E , zeroReal, vvx, vvy, vvz); + //mfStartbcb -= D3Q27System::getIncompFeqForDirection(D3Q27System::N , zeroReal, vvx, vvy, vvz); + //mfStartbbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::T , zeroReal, vvx, vvy, vvz); + //mfStartccb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NE , zeroReal, vvx, vvy, vvz); + //mfStartacb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NW , zeroReal, vvx, vvy, vvz); + //mfStartcbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TE , zeroReal, vvx, vvy, vvz); + //mfStartabc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TW , zeroReal, vvx, vvy, vvz); + //mfStartbcc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TN , zeroReal, vvx, vvy, vvz); + //mfStartbac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TS , zeroReal, vvx, vvy, vvz); + //mfStartccc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNE, zeroReal, vvx, vvy, vvz); + //mfStartacc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNW, zeroReal, vvx, vvy, vvz); + //mfStartcac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSE, zeroReal, vvx, vvy, vvz); + //mfStartaac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSW, zeroReal, vvx, vvy, vvz); + //mfStartabb -= D3Q27System::getIncompFeqForDirection(D3Q27System::W , zeroReal, vvx, vvy, vvz); + //mfStartbab -= D3Q27System::getIncompFeqForDirection(D3Q27System::S , zeroReal, vvx, vvy, vvz); + //mfStartbba -= D3Q27System::getIncompFeqForDirection(D3Q27System::B , zeroReal, vvx, vvy, vvz); + //mfStartaab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SW , zeroReal, vvx, vvy, vvz); + //mfStartcab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SE , zeroReal, vvx, vvy, vvz); + //mfStartaba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BW , zeroReal, vvx, vvy, vvz); + //mfStartcba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BE , zeroReal, vvx, vvy, vvz); + //mfStartbaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BS , zeroReal, vvx, vvy, vvz); + //mfStartbca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BN , zeroReal, vvx, vvy, vvz); + //mfStartaaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSW, zeroReal, vvx, vvy, vvz); + //mfStartcaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSE, zeroReal, vvx, vvy, vvz); + //mfStartaca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNW, zeroReal, vvx, vvy, vvz); + //mfStartcca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNE, zeroReal, vvx, vvy, vvz); + //mfStartbbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::REST, zeroReal, vvx, vvy, vvz); + // + //pStar += pStarStart*(omegaDRho-c1); + + //mfStartcbb = c2o9 * pStar; + // mfStartbcb= c2o9 * pStar; + // mfStartbbc= c2o9 * pStar; + // mfStartccb= c1o18 * pStar; + // mfStartacb= c1o18 * pStar; + // mfStartcbc= c1o18 * pStar; + // mfStartabc= c1o18 * pStar; + // mfStartbcc= c1o18 * pStar; + // mfStartbac= c1o18 * pStar; + // mfStartccc= c1o72 * pStar; + // mfStartacc= c1o72 * pStar; + // mfStartcac= c1o72 * pStar; + // mfStartaac= c1o72 * pStar; + // mfStartabb= c2o9 * pStar; + // mfStartbab= c2o9 * pStar; + // mfStartbba= c2o9 * pStar; + // mfStartaab= c1o18 * pStar; + // mfStartcab= c1o18 * pStar; + // mfStartaba= c1o18 * pStar; + // mfStartcba= c1o18 * pStar; + // mfStartbaa= c1o18 * pStar; + // mfStartbca= c1o18 * pStar; + // mfStartaaa= c1o72 * pStar; + // mfStartcaa= c1o72 * pStar; + // mfStartaca= c1o72 * pStar; + // mfStartcca= c1o72 * pStar; + // mfStartbbb= c4 * c2o9 * pStar; + + //mfaaa -= c1o2 * (mfStartaaa + mfStartccc)+ c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa); + //mfaab -= c1o2 * (mfStartaab + mfStartccb)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)); + //mfaac -= c1o2 * (mfStartaac + mfStartcca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa); + //mfaba -= c1o2 * (mfStartaba + mfStartcbc)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa); + //mfabb -= c1o2 * (mfStartabb + mfStartcbb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa); + //mfabc -= c1o2 * (mfStartabc + mfStartcba)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa); + //mfaca -= c1o2 * (mfStartaca + mfStartcac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa); + //mfacb -= c1o2 * (mfStartacb + mfStartcab)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)); + //mfacc -= c1o2 * (mfStartacc + mfStartcaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa); + //mfbaa -= c1o2 * (mfStartbaa + mfStartbcc)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa); + //mfbab -= c1o2 * (mfStartbab + mfStartbcb)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa); + //mfbac -= c1o2 * (mfStartbac + mfStartbca)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa); + //mfbba -= c1o2 * (mfStartbba + mfStartbbc)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa); + //mfbbb -= (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa)); + //mfbbc -= c1o2 * (mfStartbbc + mfStartbba)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa); + //mfbca -= c1o2 * (mfStartbca + mfStartbac)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa); + //mfbcb -= c1o2 * (mfStartbcb + mfStartbab)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa); + //mfbcc -= c1o2 * (mfStartbcc + mfStartbaa)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa); + //mfcaa -= c1o2 * (mfStartcaa + mfStartacc)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa); + //mfcab -= c1o2 * (mfStartcab + mfStartacb)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)); + //mfcac -= c1o2 * (mfStartcac + mfStartaca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa); + //mfcba -= c1o2 * (mfStartcba + mfStartabc)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa); + //mfcbb -= c1o2 * (mfStartcbb + mfStartabb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa); + //mfcbc -= c1o2 * (mfStartcbc + mfStartaba)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa); + //mfcca -= c1o2 * (mfStartcca + mfStartaac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa); + //mfccb -= c1o2 * (mfStartccb + mfStartaab)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)); + //mfccc -= c1o2 * (mfStartccc + mfStartaaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa); + + //mfhaaa =rho*( c1o2 * (mfStartaaa + mfStartccc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa)); + //mfhaab =rho*( c1o2 * (mfStartaab + mfStartccb) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa))); + //mfhaac =rho*( c1o2 * (mfStartaac + mfStartcca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa)); + //mfhaba =rho*( c1o2 * (mfStartaba + mfStartcbc) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa)); + //mfhabb =rho*( c1o2 * (mfStartabb + mfStartcbb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa)); + //mfhabc =rho*( c1o2 * (mfStartabc + mfStartcba) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa)); + //mfhaca =rho*( c1o2 * (mfStartaca + mfStartcac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa)); + //mfhacb =rho*( c1o2 * (mfStartacb + mfStartcab) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa))); + //mfhacc =rho*( c1o2 * (mfStartacc + mfStartcaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa)); + //mfhbaa =rho*( c1o2 * (mfStartbaa + mfStartbcc) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa)); + //mfhbab =rho*( c1o2 * (mfStartbab + mfStartbcb) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa)); + //mfhbac =rho*( c1o2 * (mfStartbac + mfStartbca) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa)); + //mfhbba =rho*( c1o2 * (mfStartbba + mfStartbbc) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa)); + //mfhbbb =rho*( (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa))); + //mfhbbc =rho*( c1o2 * (mfStartbbc + mfStartbba) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa)); + //mfhbca =rho*( c1o2 * (mfStartbca + mfStartbac) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa)); + //mfhbcb =rho*( c1o2 * (mfStartbcb + mfStartbab) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa)); + //mfhbcc =rho*( c1o2 * (mfStartbcc + mfStartbaa) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa)); + //mfhcaa =rho*( c1o2 * (mfStartcaa + mfStartacc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa)); + //mfhcab =rho*( c1o2 * (mfStartcab + mfStartacb) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa))); + //mfhcac =rho*( c1o2 * (mfStartcac + mfStartaca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa)); + //mfhcba =rho*( c1o2 * (mfStartcba + mfStartabc) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa)); + //mfhcbb =rho*( c1o2 * (mfStartcbb + mfStartabb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa)); + //mfhcbc =rho*( c1o2 * (mfStartcbc + mfStartaba) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa)); + //mfhcca =rho*( c1o2 * (mfStartcca + mfStartaac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa)); + //mfhccb =rho*( c1o2 * (mfStartccb + mfStartaab) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa))); + //mfhccc =rho*( c1o2 * (mfStartccc + mfStartaaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa)); + + + + + pStar += pStarStart*(omegaDRho-c1); + + mfcbb -= c2o9*pStar; + mfbcb -= c2o9*pStar; + mfbbc -= c2o9*pStar; + mfccb -= c1o18*pStar; + mfacb -= c1o18*pStar; + mfcbc -= c1o18*pStar; + mfabc -= c1o18*pStar; + mfbcc -= c1o18*pStar; + mfbac -= c1o18*pStar; + mfccc -= c1o72*pStar; + mfacc -= c1o72*pStar; + mfcac -= c1o72*pStar; + mfaac -= c1o72*pStar; + mfabb -= c2o9*pStar; + mfbab -= c2o9*pStar; + mfbba -= c2o9*pStar; + mfaab -= c1o18*pStar; + mfcab -= c1o18*pStar; + mfaba -= c1o18*pStar; + mfcba -= c1o18*pStar; + mfbaa -= c1o18*pStar; + mfbca -= c1o18*pStar; + mfaaa -= c1o72*pStar; + mfcaa -= c1o72*pStar; + mfaca -= c1o72*pStar; + mfcca -= c1o72*pStar; + mfbbb -= c4*c2o9*pStar; + + mfhbcb = rho*c2o9 * pStar; + mfhbbc = rho*c2o9 * pStar; + mfhcbb = rho*c2o9 * pStar; + mfhccb = rho*c1o18 * pStar; + mfhacb = rho*c1o18 * pStar; + mfhcbc = rho*c1o18 * pStar; + mfhabc = rho*c1o18 * pStar; + mfhbcc = rho*c1o18 * pStar; + mfhbac = rho*c1o18 * pStar; + mfhccc = rho*c1o72 * pStar; + mfhacc = rho*c1o72 * pStar; + mfhcac = rho*c1o72 * pStar; + mfhaac = rho*c1o72 * pStar; + mfhabb = rho*c2o9 * pStar; + mfhbab = rho*c2o9 * pStar; + mfhbba = rho*c2o9 * pStar; + mfhaab = rho*c1o18 * pStar; + mfhcab = rho*c1o18 * pStar; + mfhaba = rho*c1o18 * pStar; + mfhcba = rho*c1o18 * pStar; + mfhbaa = rho*c1o18 * pStar; + mfhbca = rho*c1o18 * pStar; + mfhaaa = rho*c1o72 * pStar; + mfhcaa = rho*c1o72 * pStar; + mfhaca = rho*c1o72 * pStar; + mfhcca = rho*c1o72 * pStar; + mfhbbb = rho*c4 * c2o9 * pStar; + + //mfStartbcb = c2o9 * pStarStart; + //mfStartbbc = c2o9 * pStarStart; + //mfStartcbb = c2o9 * pStarStart; + //mfStartccb = c1o18 * pStarStart; + //mfStartacb = c1o18 * pStarStart; + //mfStartcbc = c1o18 * pStarStart; + //mfStartabc = c1o18 * pStarStart; + //mfStartbcc = c1o18 * pStarStart; + //mfStartbac = c1o18 * pStarStart; + //mfStartccc = c1o72 * pStarStart; + //mfStartacc = c1o72 * pStarStart; + //mfStartcac = c1o72 * pStarStart; + //mfStartaac = c1o72 * pStarStart; + //mfStartabb = c2o9 * pStarStart; + //mfStartbab = c2o9 * pStarStart; + //mfStartbba = c2o9 * pStarStart; + //mfStartaab = c1o18 * pStarStart; + //mfStartcab = c1o18 * pStarStart; + //mfStartaba = c1o18 * pStarStart; + //mfStartcba = c1o18 * pStarStart; + //mfStartbaa = c1o18 * pStarStart; + //mfStartbca = c1o18 * pStarStart; + //mfStartaaa = c1o72 * pStarStart; + //mfStartcaa = c1o72 * pStarStart; + //mfStartaca = c1o72 * pStarStart; + //mfStartcca = c1o72 * pStarStart; + //mfStartbbb = c4 * c2o9 * pStarStart; + + //LBMReal scaleSplit = 0.5; + //mfStartbcb = mfStartbcb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; + //mfStartbbc = mfStartbbc*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; + //mfStartcbb = mfStartcbb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; + //mfStartccb = mfStartccb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartacb = mfStartacb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartcbc = mfStartcbc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartabc = mfStartabc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartbcc = mfStartbcc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartbac = mfStartbac*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartccc = mfStartccc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; + //mfStartacc = mfStartacc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; + //mfStartcac = mfStartcac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; + //mfStartaac = mfStartaac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; + //mfStartabb = mfStartabb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; + //mfStartbab = mfStartbab*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; + //mfStartbba = mfStartbba*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; + //mfStartaab = mfStartaab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartcab = mfStartcab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartaba = mfStartaba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartcba = mfStartcba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartbaa = mfStartbaa*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartbca = mfStartbca*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; + //mfStartaaa = mfStartaaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; + //mfStartcaa = mfStartcaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; + //mfStartaca = mfStartaca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; + //mfStartcca = mfStartcca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; + //mfStartbbb = mfStartbbb*scaleSplit+(c1-scaleSplit)* c4 * c2o9 * pStarStart; + + + //mfaaa -= c1o2 * (mfStartaaa + mfStartccc); + // mfaab -= c1o2 * (mfStartaab + mfStartccb); + // mfaac -= c1o2 * (mfStartaac + mfStartcca); + // mfaba -= c1o2 * (mfStartaba + mfStartcbc); + // mfabb -= c1o2 * (mfStartabb + mfStartcbb); + // mfabc -= c1o2 * (mfStartabc + mfStartcba); + // mfaca -= c1o2 * (mfStartaca + mfStartcac); + // mfacb -= c1o2 * (mfStartacb + mfStartcab); + // mfacc -= c1o2 * (mfStartacc + mfStartcaa); + // mfbaa -= c1o2 * (mfStartbaa + mfStartbcc); + // mfbab -= c1o2 * (mfStartbab + mfStartbcb); + // mfbac -= c1o2 * (mfStartbac + mfStartbca); + // mfbba -= c1o2 * (mfStartbba + mfStartbbc); + //mfbbb -= (mfStartbbb); + // mfbbc -= c1o2 * (mfStartbbc + mfStartbba); + // mfbca -= c1o2 * (mfStartbca + mfStartbac); + // mfbcb -= c1o2 * (mfStartbcb + mfStartbab); + // mfbcc -= c1o2 * (mfStartbcc + mfStartbaa); + // mfcaa -= c1o2 * (mfStartcaa + mfStartacc); + // mfcab -= c1o2 * (mfStartcab + mfStartacb); + // mfcac -= c1o2 * (mfStartcac + mfStartaca); + // mfcba -= c1o2 * (mfStartcba + mfStartabc); + // mfcbb -= c1o2 * (mfStartcbb + mfStartabb); + // mfcbc -= c1o2 * (mfStartcbc + mfStartaba); + // mfcca -= c1o2 * (mfStartcca + mfStartaac); + // mfccb -= c1o2 * (mfStartccb + mfStartaab); + // mfccc -= c1o2 * (mfStartccc + mfStartaaa); + // + //mfhaaa += rho*c1o2 * (mfStartaaa + mfStartccc); + //mfhaab += rho*c1o2 * (mfStartaab + mfStartccb); + //mfhaac += rho*c1o2 * (mfStartaac + mfStartcca); + //mfhaba += rho*c1o2 * (mfStartaba + mfStartcbc); + //mfhabb += rho*c1o2 * (mfStartabb + mfStartcbb); + //mfhabc += rho*c1o2 * (mfStartabc + mfStartcba); + //mfhaca += rho*c1o2 * (mfStartaca + mfStartcac); + //mfhacb += rho*c1o2 * (mfStartacb + mfStartcab); + //mfhacc += rho*c1o2 * (mfStartacc + mfStartcaa); + //mfhbaa += rho*c1o2 * (mfStartbaa + mfStartbcc); + //mfhbab += rho*c1o2 * (mfStartbab + mfStartbcb); + //mfhbac += rho*c1o2 * (mfStartbac + mfStartbca); + //mfhbba += rho*c1o2 * (mfStartbba + mfStartbbc); + //mfhbbb += rho*(mfStartbbb); + //mfhbbc += rho*c1o2 * (mfStartbbc + mfStartbba); + //mfhbca += rho*c1o2 * (mfStartbca + mfStartbac); + //mfhbcb += rho*c1o2 * (mfStartbcb + mfStartbab); + //mfhbcc += rho*c1o2 * (mfStartbcc + mfStartbaa); + //mfhcaa += rho*c1o2 * (mfStartcaa + mfStartacc); + //mfhcab += rho*c1o2 * (mfStartcab + mfStartacb); + //mfhcac += rho*c1o2 * (mfStartcac + mfStartaca); + //mfhcba += rho*c1o2 * (mfStartcba + mfStartabc); + //mfhcbb += rho*c1o2 * (mfStartcbb + mfStartabb); + //mfhcbc += rho*c1o2 * (mfStartcbc + mfStartaba); + //mfhcca += rho*c1o2 * (mfStartcca + mfStartaac); + //mfhccb += rho*c1o2 * (mfStartccb + mfStartaab); + //mfhccc += rho*c1o2 * (mfStartccc + mfStartaaa); + //mfhbcb += c1o6 * c2o9 * deltaPP; + //mfhbbc += c1o6 * c2o9 * deltaPP; + //mfhcbb += c1o6 * c2o9 * deltaPP; + //mfhccb += c1o6 * c1o18 * deltaPP; + //mfhacb += c1o6 * c1o18 * deltaPP; + //mfhcbc += c1o6 * c1o18 * deltaPP; + //mfhabc += c1o6 * c1o18 * deltaPP; + //mfhbcc += c1o6 * c1o18 * deltaPP; + //mfhbac += c1o6 * c1o18 * deltaPP; + //mfhccc += c1o6 * c1o72 * deltaPP; + //mfhacc += c1o6 * c1o72 * deltaPP; + //mfhcac += c1o6 * c1o72 * deltaPP; + //mfhaac += c1o6 * c1o72 * deltaPP; + //mfhabb += c1o6 * c2o9 * deltaPP; + //mfhbab += c1o6 * c2o9 * deltaPP; + //mfhbba += c1o6 * c2o9 * deltaPP; + //mfhaab += c1o6 * c1o18 * deltaPP; + //mfhcab += c1o6 * c1o18 * deltaPP; + //mfhaba += c1o6 * c1o18 * deltaPP; + //mfhcba += c1o6 * c1o18 * deltaPP; + //mfhbaa += c1o6 * c1o18 * deltaPP; + //mfhbca += c1o6 * c1o18 * deltaPP; + //mfhaaa += c1o6 * c1o72 * deltaPP; + //mfhcaa += c1o6 * c1o72 * deltaPP; + //mfhaca += c1o6 * c1o72 * deltaPP; + //mfhcca += c1o6 * c1o72 * deltaPP; + //mfhbbb += c1o6 * c4 * c2o9 * deltaPP; + + + //mfhbcb = c1o3/rho * c2o9 ; + //mfhbbc = c1o3/rho * c2o9 ; + //mfhcbb = c1o3/rho * c2o9 ; + //mfhccb = c1o3/rho * c1o18 ; + //mfhacb = c1o3/rho * c1o18 ; + //mfhcbc = c1o3/rho * c1o18 ; + //mfhabc = c1o3/rho * c1o18 ; + //mfhbcc = c1o3/rho * c1o18 ; + //mfhbac = c1o3/rho * c1o18 ; + //mfhccc = c1o3/rho * c1o72 ; + //mfhacc = c1o3/rho * c1o72 ; + //mfhcac = c1o3/rho * c1o72 ; + //mfhaac = c1o3/rho * c1o72 ; + //mfhabb = c1o3/rho * c2o9 ; + //mfhbab = c1o3/rho * c2o9 ; + //mfhbba = c1o3/rho * c2o9 ; + //mfhaab = c1o3/rho * c1o18 ; + //mfhcab = c1o3/rho * c1o18 ; + //mfhaba = c1o3/rho * c1o18 ; + //mfhcba = c1o3/rho * c1o18 ; + //mfhbaa = c1o3/rho * c1o18 ; + //mfhbca = c1o3/rho * c1o18 ; + //mfhaaa = c1o3/rho * c1o72 ; + //mfhcaa = c1o3/rho * c1o72 ; + //mfhaca = c1o3/rho * c1o72 ; + //mfhcca = c1o3/rho * c1o72 ; + //mfhbbb = c1/rho;//c1o3/rho * c4 * c2o9 ; + + + + //mfabb += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_M00]) * rhoToPhi / rho; + //mfbab += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_0M0]) * rhoToPhi / rho; + //mfbba += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_00M]) * rhoToPhi / rho; + //mfaab += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_MM0]) * rhoToPhi / rho; + //mfcab += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_PM0]) * rhoToPhi / rho; + //mfaba += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_M0M]) * rhoToPhi / rho; + //mfcba += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_P0M]) * rhoToPhi / rho; + //mfbaa += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_0MM]) * rhoToPhi / rho; + //mfbca += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_0PM]) * rhoToPhi / rho; + //mfaaa += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_MMM]) * rhoToPhi / rho; + //mfcaa += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_PMM]) * rhoToPhi / rho; + //mfaca += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_MPM]) * rhoToPhi / rho; + //mfcca += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_PPM]) * rhoToPhi / rho; + //mfcbb += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_P00]) * rhoToPhi / rho; + //mfbcb += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_0P0]) * rhoToPhi / rho; + //mfbbc += c1o2 * c2o9 * pStar * (phi[DIR_000] - phi[DIR_00P]) * rhoToPhi / rho; + //mfccb += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_PP0]) * rhoToPhi / rho; + //mfacb += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_MP0]) * rhoToPhi / rho; + //mfcbc += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_P0P]) * rhoToPhi / rho; + //mfabc += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_M0P]) * rhoToPhi / rho; + //mfbcc += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_0PP]) * rhoToPhi / rho; + //mfbac += c1o2 * c1o18 * pStar * (phi[DIR_000] - phi[DIR_0MP]) * rhoToPhi / rho; + //mfccc += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_PPP]) * rhoToPhi / rho; + //mfacc += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_MPP]) * rhoToPhi / rho; + //mfcac += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_PMP]) * rhoToPhi / rho; + //mfaac += c1o2 * c1o72 * pStar * (phi[DIR_000] - phi[DIR_MMP]) * rhoToPhi / rho; + + /////////////// + //mfabb += (pBefore-pStar) * c2o9 ; + //mfbab += (pBefore-pStar) * c2o9 ; + //mfbba += (pBefore-pStar) * c2o9 ; + //mfaab += (pBefore-pStar) * c1o18 ; + //mfcab += (pBefore-pStar) * c1o18 ; + //mfaba += (pBefore-pStar) * c1o18 ; + //mfcba += (pBefore-pStar) * c1o18 ; + //mfbaa += (pBefore-pStar) * c1o18 ; + //mfbca += (pBefore-pStar) * c1o18 ; + //mfaaa += (pBefore-pStar) * c1o72 ; + //mfcaa += (pBefore-pStar) * c1o72 ; + //mfaca += (pBefore-pStar) * c1o72 ; + //mfcca += (pBefore-pStar) * c1o72 ; + //mfcbb += (pBefore-pStar) * c2o9 ; + //mfbcb += (pBefore-pStar) * c2o9 ; + //mfbbc += (pBefore-pStar) * c2o9 ; + //mfccb += (pBefore-pStar) * c1o18 ; + //mfacb += (pBefore-pStar) * c1o18 ; + //mfcbc += (pBefore-pStar) * c1o18 ; + //mfabc += (pBefore-pStar) * c1o18 ; + //mfbcc += (pBefore-pStar) * c1o18 ; + //mfbac += (pBefore-pStar) * c1o18 ; + //mfccc += (pBefore-pStar) * c1o72 ; + //mfacc += (pBefore-pStar) * c1o72 ; + //mfcac += (pBefore-pStar) * c1o72 ; + //mfaac += (pBefore-pStar) * c1o72 ; + //mfbbb += (pBefore-pStar) * 8.0 / 9.0; + + //mfabb = (pBefore ) * c2o9; + //mfbab = (pBefore ) * c2o9; + //mfbba = (pBefore ) * c2o9; + //mfaab = (pBefore ) * c1o16; + //mfcab = (pBefore ) * c1o16; + //mfaba = (pBefore ) * c1o16; + //mfcba = (pBefore ) * c1o16; + //mfbaa = (pBefore ) * c1o16; + //mfbca = (pBefore ) * c1o16; + //mfaaa = (pBefore ) * c1o72; + //mfcaa = (pBefore ) * c1o72; + //mfaca = (pBefore ) * c1o72; + //mfcca = (pBefore ) * c1o72; + //mfcbb = (pBefore ) * c2o9; + //mfbcb = (pBefore ) * c2o9; + //mfbbc = (pBefore ) * c2o9; + //mfccb = (pBefore ) * c1o16; + //mfacb = (pBefore ) * c1o16; + //mfcbc = (pBefore ) * c1o16; + //mfabc = (pBefore ) * c1o16; + //mfbcc = (pBefore ) * c1o16; + //mfbac = (pBefore ) * c1o16; + //mfccc = (pBefore ) * c1o72; + //mfacc = (pBefore ) * c1o72; + //mfcac = (pBefore ) * c1o72; + //mfaac = (pBefore ) * c1o72; + //mfbbb = (pBefore ) * 8.0 / 9.0; + /////////////////// + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// + //#ifdef PROOF_CORRECTNESS + LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + // //LBMReal dif = fabs(drho - rho_post); + // LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post; + //#ifdef SINGLEPRECISION + // if (dif > 10.0E-7 || dif < -10.0E-7) + //#else + // if (dif > 10.0E-15 || dif < -10.0E-15) + //#endif + // { + // UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post) + // + " dif=" + UbSystem::toString(dif) + // + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + // //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); + // //exit(EXIT_FAILURE); + // } + //#endif + + if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post)) + UB_THROW(UbException( + UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," + + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac ;//* rho * c1o3; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3; + + + (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3) = mfhabb;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3) = mfhbab;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3) = mfhbba;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3) = mfhaab;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3) = mfhcab;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3) = mfhaba;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3) = mfhcba;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3) = mfhbaa;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3) = mfhbca;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3) = mfhaaa;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3) = mfhcaa;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3) = mfhaca;//* rho * c1o3; + (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfhcca;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3) = mfhcbb;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3) = mfhbcb;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p) = mfhbbc;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3) = mfhccb;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3) = mfhacb;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p) = mfhcbc;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p) = mfhabc;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p) = mfhbcc;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p) = mfhbac;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfhccc;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfhacc;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfhcac;//* rho * c1o3; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p) = mfhaac;//* rho * c1o3; + + (*this->zeroDistributionsH2)(x1, x2, x3) = mfhbbb;// *rho* c1o3; + + // !Old Kernel +///////////////////// P H A S E - F I E L D S O L V E R +//////////////////////////////////////////// +/////CUMULANT PHASE-FIELD + LBMReal omegaD =1.0/( 3.0 * mob + 0.5); + { + mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // second component + LBMReal concentration = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal oneMinusRho = c1- concentration; + + LBMReal cx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal cy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal cz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal cx2 = cx * cx; + LBMReal cy2 = cy * cy; + LBMReal cz2 = cz * cz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfaab, mfabb, mfacb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + forwardChimera(mfaba, mfbba, mfcba, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfaab, mfbab, mfcab, cx, cx2); + forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + //! - experimental Cumulant ... to be published ... hopefully + //! + + // linearized orthogonalization of 3rd order central moments + LBMReal Mabc = mfabc - mfaba * c1o3; + LBMReal Mbca = mfbca - mfbaa * c1o3; + LBMReal Macb = mfacb - mfaab * c1o3; + LBMReal Mcba = mfcba - mfaba * c1o3; + LBMReal Mcab = mfcab - mfaab * c1o3; + LBMReal Mbac = mfbac - mfbaa * c1o3; + // linearized orthogonalization of 5th order central moments + LBMReal Mcbc = mfcbc - mfaba * c1o9; + LBMReal Mbcc = mfbcc - mfbaa * c1o9; + LBMReal Mccb = mfccb - mfaab * c1o9; + + //31.05.2022 addaptive mobility + //omegaD = c1 + (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) / (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration)) + fabs((1.0 - concentration) * (concentration)) * c1o6 * oneOverInterfaceScale+1.0e-200); + //omegaD = c2 * (concentration * (concentration - c1)) / (-c6 * (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) + (concentration * (concentration - c1))+1.0e-200); + // collision of 1st order moments + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + normX1 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + normX2 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + normX3 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale; + + cx2 = cx * cx; + cy2 = cy * cy; + cz2 = cz * cz; + + // equilibration of 2nd order moments + mfbba = zeroReal; + mfbab = zeroReal; + mfabb = zeroReal; + + mfcaa = c1o3 * concentration; + mfaca = c1o3 * concentration; + mfaac = c1o3 * concentration; + + // equilibration of 3rd order moments + Mabc = zeroReal; + Mbca = zeroReal; + Macb = zeroReal; + Mcba = zeroReal; + Mcab = zeroReal; + Mbac = zeroReal; + mfbbb = zeroReal; + + // from linearized orthogonalization 3rd order central moments to central moments + mfabc = Mabc + mfaba * c1o3; + mfbca = Mbca + mfbaa * c1o3; + mfacb = Macb + mfaab * c1o3; + mfcba = Mcba + mfaba * c1o3; + mfcab = Mcab + mfaab * c1o3; + mfbac = Mbac + mfbaa * c1o3; + + // equilibration of 4th order moments + mfacc = c1o9 * concentration; + mfcac = c1o9 * concentration; + mfcca = c1o9 * concentration; + + mfcbb = zeroReal; + mfbcb = zeroReal; + mfbbc = zeroReal; + + // equilibration of 5th order moments + Mcbc = zeroReal; + Mbcc = zeroReal; + Mccb = zeroReal; + + // from linearized orthogonalization 5th order central moments to central moments + mfcbc = Mcbc + mfaba * c1o9; + mfbcc = Mbcc + mfbaa * c1o9; + mfccb = Mccb + mfaab * c1o9; + + // equilibration of 6th order moment + mfccc = c1o27 * concentration; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + backwardChimera(mfaba, mfbba, mfcba, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfaab, mfbab, mfcab, cx, cx2); + backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfaab, mfabb, mfacb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + + + (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3 ) = mfcbb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3 ) = mfbcb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3 ) = mfccb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3 ) = mfacb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb; + + + + + } + } + } + } + } +} +////////////////////////////////////////////////////////////////////////// + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi() +{ + using namespace D3Q27System; + return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00])); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0])); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M])); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_rhoInv(LBMReal rhoL,LBMReal rhoDIV) +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((1.0/(rhoL+rhoDIV*phi[DIR_PPP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMM])) + (1.0 / (rhoL + rhoDIV * phi[DIR_PMM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPP]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PMP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPM])) + (1.0 / (rhoL + rhoDIV * phi[DIR_PPM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMP])))) + + WEIGTH[DIR_PP0] * (((1.0 / (rhoL + rhoDIV * phi[DIR_P0P]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M0M])) + (1.0 / (rhoL + rhoDIV * phi[DIR_P0M]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M0P]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PM0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MP0])) + (1.0 / (rhoL + rhoDIV * phi[DIR_PP0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MM0]))))) + + +WEIGTH[DIR_0P0] * (1.0 / (rhoL + rhoDIV * phi[DIR_P00]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M00]))); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_rhoInv(LBMReal rhoL,LBMReal rhoDIV) +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((1.0 / (rhoL + rhoDIV * phi[DIR_PPP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMM])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PMM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPP]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PPM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMP])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PMP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPM])))) + + WEIGTH[DIR_PP0] * (((1.0 / (rhoL + rhoDIV * phi[DIR_0PP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0MM])) + (1.0 / (rhoL + rhoDIV * phi[DIR_0PM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0MP]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PP0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MM0])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PM0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MP0]))))) + + +WEIGTH[DIR_0P0] * (1.0 / (rhoL + rhoDIV * phi[DIR_0P0]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0M0]))); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_rhoInv(LBMReal rhoL, LBMReal rhoDIV) +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((1.0 / (rhoL + rhoDIV * phi[DIR_PPP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMM])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PMM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPP]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_PMP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MPM])) - (1.0 / (rhoL + rhoDIV * phi[DIR_PPM]) - 1.0 / (rhoL + rhoDIV * phi[DIR_MMP])))) + + WEIGTH[DIR_PP0] * (((1.0 / (rhoL + rhoDIV * phi[DIR_P0P]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M0M])) - (1.0 / (rhoL + rhoDIV * phi[DIR_P0M]) - 1.0 / (rhoL + rhoDIV * phi[DIR_M0P]))) + ((1.0 / (rhoL + rhoDIV * phi[DIR_0MP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0PM])) + (1.0 / (rhoL + rhoDIV * phi[DIR_0PP]) - 1.0 / (rhoL + rhoDIV * phi[DIR_0MM]))))) + + +WEIGTH[DIR_0P0] * (1.0 / (rhoL + rhoDIV * phi[DIR_00P]) - 1.0 / (rhoL + rhoDIV * phi[DIR_00M]))); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00])); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0])); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M])); +} + +LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::nabla2_phi() +{ + using namespace D3Q27System; + LBMReal sum = 0.0; + sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000]))) + + (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000])))); + sum += WEIGTH[DIR_0PP] * ( + (((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000]))) + + (((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000]))) + + (((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000]))) + ); + sum += WEIGTH[DIR_00P] * ( + ((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000])) + + ((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000])) + + ((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000])) + ); + + + return 6.0 * sum; +} + +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::computePhasefield() +{ + using namespace D3Q27System; + SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth; + int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth; + int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth; + + //------------- Computing the phase-field ------------------ + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + // if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + h[DIR_P00] = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3); + } + } + } + } +} + +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } else { + //phi[k] = (*ph)(x1 , x2, x3 );// neutral wetting + phi[k] = 0.0;//unwetting + } + } +} + +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi2[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } + else { + phi2[k] = 0.05; + } + } +} + +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::swapDistributions() +{ + LBMKernel::swapDistributions(); + dataSet->getHdistributions()->swap(); + dataSet->getH2distributions()->swap(); +} + +void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initForcing() +{ + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + + muForcingX1.DefineVar("rho",&muRho); + muForcingX2.DefineVar("rho",&muRho); + muForcingX3.DefineVar("rho",&muRho); + +} diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old new file mode 100644 index 0000000000000000000000000000000000000000..2ab0e9df73c83b4de2b8824667452414f42dfa1d --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp.old @@ -0,0 +1,3024 @@ +////======================================================================================= +//// ____ ____ __ ______ __________ __ __ __ __ +//// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +//// \ \ | | | | | |_) | | | | | | | / \ | | +//// \ \ | | | | | _ / | | | | | | / /\ \ | | +//// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +//// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +//// \ \ | | ________________________________________________________________ +//// \ \ | | | ______________________________________________________________| +//// \ \| | | | __ __ __ __ ______ _______ +//// \ | | |_____ | | | | | | | | | _ \ / _____) +//// \ | | _____| | | | | | | | | | | \ \ \_______ +//// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +//// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +//// +//// 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 MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.cpp +////! \ingroup LBMKernel +////! \author M. Geier, K. Kutscher, Hesameddin Safari +////======================================================================================= +// +//#include "MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h" +//#include "BCArray3D.h" +//#include "Block3D.h" +//#include "D3Q27EsoTwist3DSplittedVector.h" +//#include "D3Q27System.h" +//#include "DataSet3D.h" +//#include "LBMKernel.h" +//#include <cmath> +//#include <iostream> +//#include <string> +// +//#define PROOF_CORRECTNESS +// +//////////////////////////////////////////////////////////////////////////// +//MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::MultiphaseSimpleVelocityBaseExternalPressureLBMKernel() { this->compressible = false; } +//////////////////////////////////////////////////////////////////////////// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initDataSet() +//{ +// SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); +// SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field +// SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); +// SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); +// CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new CbArray3D<LBMReal, IndexerX3X2X1>( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); +// pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); +// p1Old = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); +// dataSet->setFdistributions(f); +// dataSet->setHdistributions(h); // For phase-field +// dataSet->setH2distributions(h2); +// dataSet->setPhaseField(divU1); +// dataSet->setPressureField(pressure); +// +// phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0)); +// phaseFieldOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 999.0)); +// +// divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); +//} +//////////////////////////////////////////////////////////////////////////// +//SPtr<LBMKernel> MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::clone() +//{ +// SPtr<LBMKernel> kernel(new MultiphaseSimpleVelocityBaseExternalPressureLBMKernel()); +// kernel->setNX(nx); +// dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initDataSet(); +// kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG); +// kernel->setDensityRatio(this->densityRatio); +// kernel->setMultiphaseModelParameters(this->beta, this->kappa); +// kernel->setContactAngle(this->contactAngle); +// kernel->setPhiL(this->phiL); +// kernel->setPhiH(this->phiH); +// kernel->setPhaseFieldRelaxation(this->tauH); +// kernel->setMobility(this->mob); +// kernel->setInterfaceWidth(this->interfaceWidth); +// +// kernel->setBCProcessor(bcProcessor->clone(kernel)); +// kernel->setWithForcing(withForcing); +// kernel->setForcingX1(muForcingX1); +// kernel->setForcingX2(muForcingX2); +// kernel->setForcingX3(muForcingX3); +// kernel->setIndex(ix1, ix2, ix3); +// kernel->setDeltaT(deltaT); +// kernel->setGhostLayerWidth(2); +// dynamicPointerCast<MultiphaseSimpleVelocityBaseExternalPressureLBMKernel>(kernel)->initForcing(); +// +// return kernel; +//} +//////////////////////////////////////////////////////////////////////////// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { +// using namespace UbMath; +// LBMReal m2 = mfa + mfc; +// LBMReal m1 = mfc - mfa; +// LBMReal m0 = m2 + mfb; +// mfa = m0; +// m0 *= Kinverse; +// m0 += oneMinusRho; +// mfb = (m1 * Kinverse - m0 * vv) * K; +// mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; +//} +// +////////////////////////////////////////////////////////////////////////////////// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { +// using namespace UbMath; +// LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K; +// LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K; +// mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K; +// mfa = m0; +// mfb = m1; +//} +// +// +////////////////////////////////////////////////////////////////////////////////// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { +// using namespace UbMath; +// LBMReal m1 = (mfa + mfc) + mfb; +// LBMReal m2 = mfc - mfa; +// mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); +// mfb = m2 - vv * m1; +// mfa = m1; +//} +// +// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { +// using namespace UbMath; +// LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); +// LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; +// mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); +// mfb = mb; +// mfa = ma; +//} +// +// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::calculate(int step) +//{ +// using namespace D3Q27System; +// using namespace UbMath; +// +// forcingX1 = 0.0; +// forcingX2 = 0.0; +// forcingX3 = 0.0; +// +// LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5; +// ///////////////////////////////////// +// +// localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); +// nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); +// zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); +// +// localDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions(); +// nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions(); +// zeroDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions(); +// +// localDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions(); +// nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions(); +// zeroDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions(); +// +// +// CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField(); +// +// SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); +// +// const int bcArrayMaxX1 = (int)bcArray->getNX1(); +// const int bcArrayMaxX2 = (int)bcArray->getNX2(); +// const int bcArrayMaxX3 = (int)bcArray->getNX3(); +// +// int minX1 = ghostLayerWidth; +// int minX2 = ghostLayerWidth; +// int minX3 = ghostLayerWidth; +// int maxX1 = bcArrayMaxX1 - ghostLayerWidth; +// int maxX2 = bcArrayMaxX2 - ghostLayerWidth; +// int maxX3 = bcArrayMaxX3 - ghostLayerWidth; +// LBMReal omegaDRho = 1.0;// 1.25;// 1.3; +// +// for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) { +// for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) { +// for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) { +// if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { +// int x1p = x1 + 1; +// int x2p = x2 + 1; +// int x3p = x3 + 1; +// +// LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); +// LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); +// LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); +// LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); +// LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); +// LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); +// LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); +// LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); +// LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); +// LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); +// LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); +// LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); +// LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); +// LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); +// LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); +// LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); +// LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); +// LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); +// LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); +// LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); +// LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); +// LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); +// LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); +// LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); +// LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); +// LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); +// +// LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); +// (*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc)) ) + +// (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) + +// ((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) + +// (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb; +// if ((*phaseField)(x1, x2, x3) > 1 ) { +// (*phaseField)(x1, x2, x3) = c1; +// } +// +// if ((*phaseField)(x1, x2, x3) < 0) { +// (*phaseField)(x1, x2, x3) = 0; +// } +// ////// read F-distributions for velocity formalism +// +// mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); +// mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); +// mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); +// mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); +// mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); +// mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); +// mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); +// mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); +// mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); +// mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); +// mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); +// mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); +// mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); +// mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); +// mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); +// mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); +// mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); +// mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); +// mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); +// mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); +// mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); +// mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); +// mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); +// mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); +// mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); +// mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); +// +// mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); +// +// //LBMReal rhoH = 1.0; +// //LBMReal rhoL = 1.0 / densityRatio; +// +// LBMReal rhoH = 1.0*densityRatio; +// LBMReal rhoL = 1.0; +// +// LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); +// +// LBMReal drho = (((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc)) ) +// + (((mfaab + mfccb) + (mfacb + mfcab) ) + ((mfaba + mfcbc) + (mfabc + mfcba) ) + ((mfbaa + mfbcc) + (mfbac + mfbca) ))) +// + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; +// +// omegaDRho = 2.0;// 1.5; +// drho *= omegaDRho; +// LBMReal keepDrho = drho; +// drho = ((*p1Old)(x1, x2, x3) + drho) * c1o2; +// // drho = ((*p1Old)(x1, x2, x3)*c2o3 + drho*c1o3) ; +// (*p1Old)(x1, x2, x3) = keepDrho; +// +// //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); //Incompressible +/////Density correction +// //LBMReal dX1_phi = gradX1_phi(); +// //LBMReal dX2_phi = gradX2_phi(); +// //LBMReal dX3_phi = gradX3_phi(); +// //LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + +// // (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + +// // (mfcbb - mfabb)) ; +// //LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + +// // (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + +// // (mfbcb - mfbab)) ; +// //LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + +// // (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + +// // (mfbbc - mfbba)) ; +// //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressure)(x1, x2, x3); //explicit Compressible +// //(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho-(rhoH-rhoL)*(vvx*dX1_phi+vvy*dX2_phi+vvz*dX3_phi)*c1o3)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho); +// +// //(*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) - c1o3 * drho * ((*phaseField)(x1, x2, x3) * (rhoH - rhoL) + rhoL)) / (c1 - ((*phaseField)(x1, x2, x3) - c1) * drho); +// //LBMReal rho=rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3); +// //LBMReal tempDrho = drho; +// //drho = (drho*0.9 + (*pressureOld)(x1, x2, x3)*0.1) ; +// //(*pressureOld)(x1, x2, x3) = tempDrho; +// +// //Mathematica +// +// LBMReal rho = ((*pressure)(x1, x2, x3) - (*phaseField)(x1, x2, x3) * (*pressure)(x1, x2, x3) + c1o3 * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (c1o3 + c1o3 * drho * (-1 + (*phaseField)(x1, x2, x3))); +// (*pressureOld)(x1, x2, x3) = ((*pressure)(x1, x2, x3) + c1o3 * drho * (rhoH + ((*phaseField)(x1, x2, x3) - phiH) * rhoToPhi)) / (1 + drho * (-1 + (*phaseField)(x1, x2, x3))); +///////Full Filter +// //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH)+(one- (*phaseField)(x1, x2, x3))*three* (*pressure)(x1, x2, x3); //explicit Compressible +// //(*pressureOld)(x1, x2, x3) = (((*pressure)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho); +////// reduced Filter +// //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH) + (one - (*phaseField)(x1, x2, x3)) * three * (*pressureOld)(x1, x2, x3); //explicit Compressible +// //(*pressure)(x1, x2, x3) = (((*pressureOld)(x1, x2, x3) + rho * c1o3 * drho)) / (one - (one - (*phaseField)(x1, x2, x3)) * drho); +// +// //rho = (rho)/(one- (one - (*phaseField)(x1, x2, x3)) * drho); // now implicit Compressible +// +// //(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3; +// ////!!!!!! relplace by pointer swap! +// //(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3); +// } +// } +// } +// } +// +// LBMReal collFactorM; +// +// ////Periodic Filter +// //for (int x3 = minX3-1; x3 <= maxX3; x3++) { +// // for (int x2 = minX2-1; x2 <= maxX2; x2++) { +// // for (int x1 = minX1-1; x1 <= maxX1; x1++) { +// // if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { +// +// // LBMReal sum = 0.; +// +// // ///Version for boundaries +// // for (int xx = -1; xx <= 1; xx++) { +// // //int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0; +// // int xxx = xx + x1; +// +// // for (int yy = -1; yy <= 1; yy++) { +// // //int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0; +// // int yyy = yy + x2; +// +// // for (int zz = -1; zz <= 1; zz++) { +// // //int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0; +// // int zzz = zz + x3; +// +// // if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) { +// // sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz); +// // } +// // else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3); +// // } +// +// +// // } +// // } +// // } +// // (*pressure)(x1, x2, x3) = sum; +// // } +// // } +// // } +// //} +// +// ////!filter +// +// for (int x3 = minX3; x3 < maxX3; x3++) { +// for (int x2 = minX2; x2 < maxX2; x2++) { +// for (int x1 = minX1; x1 < maxX1; x1++) { +// if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { +// int x1p = x1 + 1; +// int x2p = x2 + 1; +// int x3p = x3 + 1; +// +// ////////////////////////////////////////////////////////////////////////// +// // Read distributions and phase field +// //////////////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////////////// +// +// // E N T +// // c c c +// ////////// +// // W S B +// // a a a +// +// // Rest ist b +// +// // mfxyz +// // a - negative +// // b - null +// // c - positive +// +// // a b c +// //-1 0 1 +// +// findNeighbors(phaseField, x1, x2, x3); +// +// LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); +// LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); +// LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); +// LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); +// LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); +// LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); +// LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); +// LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); +// LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); +// LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); +// LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); +// LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); +// LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); +// LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); +// LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); +// LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); +// LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); +// LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); +// LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); +// LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); +// LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); +// LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); +// LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); +// LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); +// LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); +// LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); +// +// LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); +// +// +// LBMReal mfhcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3); +// LBMReal mfhbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3); +// LBMReal mfhbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3); +// LBMReal mfhccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3); +// LBMReal mfhacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3); +// LBMReal mfhcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3); +// LBMReal mfhabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3); +// LBMReal mfhbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3); +// LBMReal mfhbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3); +// LBMReal mfhccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3); +// LBMReal mfhacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3); +// LBMReal mfhcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3); +// LBMReal mfhaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3); +// LBMReal mfhabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3); +// LBMReal mfhbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3); +// LBMReal mfhbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p); +// LBMReal mfhaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3); +// LBMReal mfhcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3); +// LBMReal mfhaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p); +// LBMReal mfhcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p); +// LBMReal mfhbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p); +// LBMReal mfhbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p); +// LBMReal mfhaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p); +// LBMReal mfhcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p); +// LBMReal mfhaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p); +// LBMReal mfhcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p); +// +// LBMReal mfhbbb = (*this->zeroDistributionsH2)(x1, x2, x3); +// +// //LBMReal rhoH = 1.0; +// //LBMReal rhoL = 1.0 / densityRatio; +// +// LBMReal rhoH = 1.0; +// LBMReal rhoL = 1.0/ densityRatio; +// +// LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); +// +// LBMReal dX1_phi = gradX1_phi(); +// LBMReal dX2_phi = gradX2_phi(); +// LBMReal dX3_phi = gradX3_phi(); +// +// LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9+1e-3; +// // 01.09.2022: unclear what value we have to add to the normal: lager values better cut of in gas phase? +// LBMReal normX1 = dX1_phi / denom; +// LBMReal normX2 = dX2_phi / denom; +// LBMReal normX3 = dX3_phi / denom; +// +// +// +// collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL); +// +// +// LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi(); +// +// //----------- Calculating Macroscopic Values ------------- +// LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH); //Incompressible +// +// ///scaled phase field +// //LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) / ((*phaseField)(x1, x2, x3) * (*phaseField)(x1, x2, x3) + (c1 - (*phaseField)(x1, x2, x3)) * (c1 - (*phaseField)(x1, x2, x3))) - phiH); +// ///!scaled phase field +// +// //LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH)+(one-phi[REST])* (*pressure)(x1, x2, x3)*three; //compressible +// //LBMReal rho = rhoL + (rhoH - rhoL) * phi[REST] + (one - phi[REST]) * (*pressure)(x1, x2, x3) * three; //compressible +// +// LBMReal m0, m1, m2; +// LBMReal rhoRef=c1; +// +// LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + +// (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + +// (mfcbb - mfabb))/rhoRef; +// LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + +// (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + +// (mfbcb - mfbab))/rhoRef; +// LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + +// (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + +// (mfbbc - mfbba))/rhoRef; +// ////Filter&Gradient merged +// LBMReal pressureHere = (*pressureOld)(x1, x2, x3); +// //LBMReal pressureHere = (*pressure)(x1, x2, x3); +// +// LBMReal arrayP[3][3][3] = { {{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}}, +// {{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}}, +// { {pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere},{pressureHere,pressureHere,pressureHere}} }; +// //LBMReal LaplaceP = 0.0; +// //LaplaceP += WEIGTH[TNE] * (((((*pressureOld)(x1+1,x2+1,x3+1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3 + 1) - pressureHere))) +// // + ((((*pressureOld)(x1 + 1, x2 - 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3 + 1) - pressureHere)))); +// //LaplaceP += WEIGTH[TN] * ( +// // ((((*pressureOld)(x1 + 1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 - 1, x3) - pressureHere)) + (((*pressureOld)(x1 + 1, x2 - 1, x3) - pressureHere) + ((*pressureOld)(x1 - 1, x2 + 1, x3) - pressureHere))) +// // + ((((*pressureOld)(x1 + 1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 -1) - pressureHere)) + (((*pressureOld)(x1 + 1, x2, x3 - 1) - pressureHere) + ((*pressureOld)(x1 - 1, x2, x3 + 1) - pressureHere))) +// // + ((((*pressureOld)(x1, x2 + 1, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 - 1) - pressureHere)) + (((*pressureOld)(x1, x2 + 1, x3 - 1) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3 + 1) - pressureHere))) +// // ); +// //LaplaceP += WEIGTH[T] * ( +// // (((*pressureOld)(x1 + 1, x2, x3) - pressureHere) + ((*pressureOld)(x1, x2-1, x3) - pressureHere)) +// // + (((*pressureOld)(x1, x2 + 1, x3) - pressureHere) + ((*pressureOld)(x1, x2 - 1, x3) - pressureHere)) +// // + (((*pressureOld)(x1, x2, x3 + 1) - pressureHere) + ((*pressureOld)(x1, x2, x3 - 1) - pressureHere)) +// // ); +// +// //LaplaceP= 6.0 * LaplaceP; +// +// //LBMReal sum = 0.0; +// +// for (int dir1 = -1; dir1 <= 1; dir1++) { +// for (int dir2 = -1; dir2 <= 1; dir2++) { +// for (int dir3 = -1; dir3 <= 1; dir3++){ +// int xxx = x1 + dir1; +// int yyy = x2 + dir2; +// int zzz = x3 + dir3; +// if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressureOld)(xxx, yyy, zzz); +// //if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) arrayP[dir1 + 1][dir2 + 1][dir3 + 1] = (*pressure)(xxx, yyy, zzz); +// // sum += 64.0 / (216.0 * (c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2)) * (c1 + c3 * abs(dir3))) * arrayP[dir1 + 1][dir2 + 1][dir3 + 1]; +// } +// } +// } +//// (*pressure)(x1, x2, x3) = sum;// *0.1 + (1.0 - 0.1) * (*pressureOld)(x1, x2, x3); +// +// +// (*pressure)(x1, x2, x3) = (((((arrayP[0][0][0] + arrayP[2][2][2]) + (arrayP[0][2][0] + arrayP[2][0][2])) + ((arrayP[2][0][0] + arrayP[0][2][2]) + (arrayP[2][2][0] + arrayP[0][0][2]))) * c1o216 +// + (((arrayP[0][0][1] + arrayP[2][2][1]) + (arrayP[0][1][0] + arrayP[2][1][2])) + ((arrayP[1][0][0] + arrayP[1][2][2]) + (arrayP[0][1][2] + arrayP[2][1][0])) + ((arrayP[1][0][2] + arrayP[1][2][0]) + (arrayP[0][2][1] + arrayP[2][0][1]))) * c1o54) +// + ((arrayP[0][1][1] + arrayP[2][1][1]) + (arrayP[1][0][1] + arrayP[1][2][1]) + (arrayP[1][1][0] + arrayP[1][1][2])) * c2o27) +// + arrayP[1][1][1] * c8o27; +// //LBMReal gradPx = 0.0; +// //LBMReal gradPy = 0.0; +// //LBMReal gradPz = 0.0; +// //for (int dir1 = -1; dir1 <= 1; dir1++) { +// // for (int dir2 = -1; dir2 <= 1; dir2++) { +// // gradPx -= arrayP[0][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // gradPx += arrayP[2][dir1+1][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// +// +// +// // gradPy -= arrayP[dir1+1][0][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // gradPy += arrayP[dir1+1][2][dir2+1] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // +// +// // gradPz -= arrayP[dir1+1][dir2+1][0] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // gradPz += arrayP[dir1+1][dir2+1][2] * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// //} +// +// LBMReal gradPx = ((((arrayP[2][0][0] - arrayP[0][2][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72 +// + (((arrayP[2][1][0] - arrayP[0][1][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[2][0][1] - arrayP[0][2][1]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18) +// + (arrayP[2][1][1] - arrayP[0][1][1]) * c2o9; +// LBMReal gradPy = ((((arrayP[0][2][0] - arrayP[2][0][2]) + (arrayP[2][2][0] - arrayP[0][0][2])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[0][2][2] - arrayP[2][0][0]))) * c1o72 +// + (((arrayP[1][2][0] - arrayP[1][0][2]) + (arrayP[2][2][1] - arrayP[0][0][1])) + ((arrayP[0][2][1] - arrayP[2][0][1]) + (arrayP[1][2][2] - arrayP[1][0][0]))) * c1o18) +// + (arrayP[1][2][1] - arrayP[1][0][1]) * c2o9; +// LBMReal gradPz = ((((arrayP[0][0][2] - arrayP[2][2][0]) + (arrayP[0][2][2] - arrayP[2][0][0])) + ((arrayP[2][2][2] - arrayP[0][0][0]) + (arrayP[2][0][2] - arrayP[0][2][0]))) * c1o72 +// + (((arrayP[0][1][2] - arrayP[2][1][0]) + (arrayP[1][2][2] - arrayP[1][0][0])) + ((arrayP[1][0][2] - arrayP[1][2][0]) + (arrayP[2][1][2] - arrayP[0][1][0]))) * c1o18) +// + (arrayP[1][1][2] - arrayP[1][1][0]) * c2o9; +// +// //gradPx *=c1 - (*pressure)(x1, x2, x3)+pressureHere; +// //gradPy *=c1 - (*pressure)(x1, x2, x3) + pressureHere; +// //gradPz *=c1 - (*pressure)(x1, x2, x3) + pressureHere; +// +// ////!Filter&Gradient merged +// //LBMReal gradPx = 0.0; +// //LBMReal gradPy = 0.0; +// //LBMReal gradPz = 0.0; +// //for (int dir1 = -1; dir1 <= 1; dir1++) { +// // for (int dir2 = -1; dir2 <= 1; dir2++) { +// // int yyy = x2 + dir1; +// // int zzz = x3 + dir2; +// // if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) { +// // gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // else { +// // gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) { +// // gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // else { +// // gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// +// // int xxx = x1 + dir1; +// // if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) { +// // gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // else { +// // gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) { +// // gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // else { +// // gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// +// // yyy = x2 + dir2; +// // if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) { +// // gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // else { +// // gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) { +// // gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// // else { +// // gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); +// // } +// +// // } +// //} +// +// //Viscosity increase by phase field residuum +// //LBMReal errPhi = (((1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale)- denom); +// //LBMReal limVis = 0.01;// 0.0000001 * 10;//0.01; +// // collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM); +// // collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM; +// //errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi; +// //collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis); +// +// //3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW]))) +// //+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) + +// //+WEIGTH[N] * (phi2[T] - phi2[B])); +// +// muRho = rho; +// +// ////external pressure +// //forcingX1 =/* muForcingX1.Eval()/rho */- gradPx/rho; +// //forcingX2 =/* muForcingX2.Eval()/rho */- gradPy/rho; +// //forcingX3 =/* muForcingX3.Eval()/rho */- gradPz/rho; +// +// /////////////////////////////////////////////// +// +// //LBMReal pBefore = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) +// // + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) +// // + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; +// //pBefore = -c1o3 * (-1.0e-10)/((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) ); +// ////if (vvx * vvx + vvy * vvy + vvz * vvz > 1.0e-100) { +// // mfabb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[E] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbab -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[N] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbba -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[T] * (rhoH - rhoL) / (phiH - phiL))); +// // mfaab -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[NE] * (rhoH - rhoL) / (phiH - phiL))); +// // mfcab -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[NW] * (rhoH - rhoL) / (phiH - phiL))); +// // mfaba -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TE] * (rhoH - rhoL) / (phiH - phiL))); +// // mfcba -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TW] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbaa -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TN] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbca -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TS] * (rhoH - rhoL) / (phiH - phiL))); +// // mfaaa -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TNE] * (rhoH - rhoL) / (phiH - phiL))); +// // mfcaa -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TNW] * (rhoH - rhoL) / (phiH - phiL))); +// // mfaca -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TSE] * (rhoH - rhoL) / (phiH - phiL))); +// // mfcca -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[TSW] * (rhoH - rhoL) / (phiH - phiL))); +// // mfcbb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[W] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbcb -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[S] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbbc -= pBefore * c2o9 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[B] * (rhoH - rhoL) / (phiH - phiL))); +// // mfccb -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[SW] * (rhoH - rhoL) / (phiH - phiL))); +// // mfacb -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[SE] * (rhoH - rhoL) / (phiH - phiL))); +// // mfcbc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BW] * (rhoH - rhoL) / (phiH - phiL))); +// // mfabc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BE] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbcc -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BS] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbac -= pBefore * c1o18 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BN] * (rhoH - rhoL) / (phiH - phiL))); +// // mfccc -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BSW] * (rhoH - rhoL) / (phiH - phiL))); +// // mfacc -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BSE] * (rhoH - rhoL) / (phiH - phiL))); +// // mfcac -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BNW] * (rhoH - rhoL) / (phiH - phiL))); +// // mfaac -= pBefore * c1o72 * ((rhoL + phi[REST] * (rhoH - rhoL) / (phiH - phiL)) / (rhoL + phi[BNE] * (rhoH - rhoL) / (phiH - phiL))); +// // mfbbb -= pBefore * 8.0 / 9.0; +// //} +// +// /////////////////////////////////////////////// +// +// LBMReal pStarStart = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) +// + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) +// + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; +// +// ///////////////////// +// //LBMReal vvxh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) + +// // (((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) + +// // (mfhcbb - mfhabb)) / rhoRef; +// //LBMReal vvyh = ((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) + +// // (((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) + +// // (mfhbcb - mfhbab)) / rhoRef; +// //LBMReal vvzh = ((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) + +// // (((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) + +// // (mfhbbc - mfhbba)) / rhoRef; +// +// //LBMReal deltaPP = 0*(vvxh * dX1_phi + vvyh * dX2_phi + vvzh * dX3_phi) * rhoToPhi / (rho); +// //mfhbcb += c1o6* c2o9 * deltaPP; +// //mfhbbc += c1o6* c2o9 * deltaPP; +// //mfhcbb += c1o6* c2o9 * deltaPP; +// //mfhccb += c1o6* c1o18 * deltaPP; +// //mfhacb += c1o6* c1o18 * deltaPP; +// //mfhcbc += c1o6* c1o18 * deltaPP; +// //mfhabc += c1o6* c1o18 * deltaPP; +// //mfhbcc += c1o6* c1o18 * deltaPP; +// //mfhbac += c1o6* c1o18 * deltaPP; +// //mfhccc += c1o6* c1o72 * deltaPP; +// //mfhacc += c1o6* c1o72 * deltaPP; +// //mfhcac += c1o6* c1o72 * deltaPP; +// //mfhaac += c1o6* c1o72 * deltaPP; +// //mfhabb += c1o6* c2o9 * deltaPP; +// //mfhbab += c1o6* c2o9 * deltaPP; +// //mfhbba += c1o6* c2o9 * deltaPP; +// //mfhaab += c1o6* c1o18 * deltaPP; +// //mfhcab += c1o6* c1o18 * deltaPP; +// //mfhaba += c1o6* c1o18 * deltaPP; +// //mfhcba += c1o6* c1o18 * deltaPP; +// //mfhbaa += c1o6* c1o18 * deltaPP; +// //mfhbca += c1o6* c1o18 * deltaPP; +// //mfhaaa += c1o6* c1o72 * deltaPP; +// //mfhcaa += c1o6* c1o72 * deltaPP; +// //mfhaca += c1o6* c1o72 * deltaPP; +// //mfhcca += c1o6* c1o72 * deltaPP; +// //mfhbbb += c1o6* c4 * c2o9 * deltaPP; +// +// ////////////////////// +// +// /////Recovering the origin distributions +// //LBMReal mfStartcbb = mfcbb ; +// //LBMReal mfStartbcb = mfbcb ; +// //LBMReal mfStartbbc = mfbbc ; +// //LBMReal mfStartccb = mfccb ; +// //LBMReal mfStartacb = mfacb ; +// //LBMReal mfStartcbc = mfcbc ; +// //LBMReal mfStartabc = mfabc ; +// //LBMReal mfStartbcc = mfbcc ; +// //LBMReal mfStartbac = mfbac ; +// //LBMReal mfStartccc = mfccc ; +// //LBMReal mfStartacc = mfacc ; +// //LBMReal mfStartcac = mfcac ; +// //LBMReal mfStartaac = mfaac ; +// //LBMReal mfStartabb = mfabb ; +// //LBMReal mfStartbab = mfbab ; +// //LBMReal mfStartbba = mfbba ; +// //LBMReal mfStartaab = mfaab ; +// //LBMReal mfStartcab = mfcab ; +// //LBMReal mfStartaba = mfaba ; +// //LBMReal mfStartcba = mfcba ; +// //LBMReal mfStartbaa = mfbaa ; +// //LBMReal mfStartbca = mfbca ; +// //LBMReal mfStartaaa = mfaaa ; +// //LBMReal mfStartcaa = mfcaa ; +// //LBMReal mfStartaca = mfaca ; +// //LBMReal mfStartcca = mfcca ; +// //LBMReal mfStartbbb = mfbbb ; +// +// +// mfcbb += mfhcbb /rho; +// mfbcb += mfhbcb /rho; +// mfbbc += mfhbbc /rho; +// mfccb += mfhccb /rho; +// mfacb += mfhacb /rho; +// mfcbc += mfhcbc /rho; +// mfabc += mfhabc /rho; +// mfbcc += mfhbcc /rho; +// mfbac += mfhbac /rho; +// mfccc += mfhccc /rho; +// mfacc += mfhacc /rho; +// mfcac += mfhcac /rho; +// mfaac += mfhaac /rho; +// mfabb += mfhabb /rho; +// mfbab += mfhbab /rho; +// mfbba += mfhbba /rho; +// mfaab += mfhaab /rho; +// mfcab += mfhcab /rho; +// mfaba += mfhaba /rho; +// mfcba += mfhcba /rho; +// mfbaa += mfhbaa /rho; +// mfbca += mfhbca /rho; +// mfaaa += mfhaaa /rho; +// mfcaa += mfhcaa /rho; +// mfaca += mfhaca /rho; +// mfcca += mfhcca /rho; +// mfbbb += mfhbbb /rho; +// +// +// +// //Abbas +// LBMReal pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) +// + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) +// + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; +// //22.09.22 not yet in balance, repaire here +// LBMReal ppStar = ((((((mfhaaa + mfhccc) + (mfhaac + mfhcca)) + ((mfhcac + mfhaca) + (mfhcaa + mfhacc)))*c3 +// + (((mfhaab + mfhccb) + (mfhacb + mfhcab)) + ((mfhaba + mfhcbc) + (mfhabc + mfhcba)) + ((mfhbaa + mfhbcc) + (mfhbac + mfhbca))))*c2 +// + ((mfhabb + mfhcbb) + (mfhbab + mfhbcb) + (mfhbba + mfhbbc))) ) * c1o3/rho; +// +// ppStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) * c3 +// + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) * c2 +// + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)))) * c1o3 ; +// +// //(*phaseFieldOld)(x1, x2, x3) = ((*phaseFieldOld)(x1, x2, x3) > 99.0) ? phi[REST] : (*phaseFieldOld)(x1, x2, x3); +// //LBMReal dtPhi = phi[REST] - (*phaseFieldOld)(x1, x2, x3); +// //LBMReal deltaP = -pStar * (c1 - rho / (rho + c1o2 * rhoToPhi * dtPhi));// -pStar * pStar * pStar * 1.0e-4 * rho * rho * rho; +// //LBMReal deltaP = pStar * (c1 - mfhbbb*rho) * c1o2;//Explicit +// //LBMReal deltaP = pStar * (c1 - mfhbbb * rho) / (c1 + mfhbbb * rho);//Semi-Implicit +// //(*phaseFieldOld)(x1, x2, x3) = phi[REST]; +// +// //mfabb += c2o9 *deltaP; +// //mfbab += c2o9 *deltaP; +// //mfbba += c2o9 *deltaP; +// //mfaab += c1o18*deltaP; +// //mfcab += c1o18*deltaP; +// //mfaba += c1o18*deltaP; +// //mfcba += c1o18*deltaP; +// //mfbaa += c1o18*deltaP; +// //mfbca += c1o18*deltaP; +// //mfaaa += c1o72*deltaP; +// //mfcaa += c1o72*deltaP; +// //mfaca += c1o72*deltaP; +// //mfcca += c1o72*deltaP; +// //mfcbb += c2o9 *deltaP; +// //mfbcb += c2o9 *deltaP; +// //mfbbc += c2o9 *deltaP; +// //mfccb += c1o18*deltaP; +// //mfacb += c1o18*deltaP; +// //mfcbc += c1o18*deltaP; +// //mfabc += c1o18*deltaP; +// //mfbcc += c1o18*deltaP; +// //mfbac += c1o18*deltaP; +// //mfccc += c1o72*deltaP; +// //mfacc += c1o72*deltaP; +// //mfcac += c1o72*deltaP; +// //mfaac += c1o72*deltaP; +// +// //pStar = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) +// // + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) +// // + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb) * c1o3; +// +// +// +// +// //mfabb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[E ])*rhoToPhi/rho; +// //mfbab -= c1o2 * c2o9 *pStar*(phi[REST]-phi[N ])*rhoToPhi/rho; +// //mfbba -= c1o2 * c2o9 *pStar*(phi[REST]-phi[T ])*rhoToPhi/rho; +// //mfaab -= c1o2 * c1o18*pStar*(phi[REST]-phi[NE ])*rhoToPhi/rho; +// //mfcab -= c1o2 * c1o18*pStar*(phi[REST]-phi[NW ])*rhoToPhi/rho; +// //mfaba -= c1o2 * c1o18*pStar*(phi[REST]-phi[TE ])*rhoToPhi/rho; +// //mfcba -= c1o2 * c1o18*pStar*(phi[REST]-phi[TW ])*rhoToPhi/rho; +// //mfbaa -= c1o2 * c1o18*pStar*(phi[REST]-phi[TN ])*rhoToPhi/rho; +// //mfbca -= c1o2 * c1o18*pStar*(phi[REST]-phi[TS ])*rhoToPhi/rho; +// //mfaaa -= c1o2 * c1o72*pStar*(phi[REST]-phi[TNE])*rhoToPhi/rho; +// //mfcaa -= c1o2 * c1o72*pStar*(phi[REST]-phi[TNW])*rhoToPhi/rho; +// //mfaca -= c1o2 * c1o72*pStar*(phi[REST]-phi[TSE])*rhoToPhi/rho; +// //mfcca -= c1o2 * c1o72*pStar*(phi[REST]-phi[TSW])*rhoToPhi/rho; +// //mfcbb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[W ])*rhoToPhi/rho; +// //mfbcb -= c1o2 * c2o9 *pStar*(phi[REST]-phi[S ])*rhoToPhi/rho; +// //mfbbc -= c1o2 * c2o9 *pStar*(phi[REST]-phi[B ])*rhoToPhi/rho; +// //mfccb -= c1o2 * c1o18*pStar*(phi[REST]-phi[SW ])*rhoToPhi/rho; +// //mfacb -= c1o2 * c1o18*pStar*(phi[REST]-phi[SE ])*rhoToPhi/rho; +// //mfcbc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BW ])*rhoToPhi/rho; +// //mfabc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BE ])*rhoToPhi/rho; +// //mfbcc -= c1o2 * c1o18*pStar*(phi[REST]-phi[BS ])*rhoToPhi/rho; +// //mfbac -= c1o2 * c1o18*pStar*(phi[REST]-phi[BN ])*rhoToPhi/rho; +// //mfccc -= c1o2 * c1o72*pStar*(phi[REST]-phi[BSW])*rhoToPhi/rho; +// //mfacc -= c1o2 * c1o72*pStar*(phi[REST]-phi[BSE])*rhoToPhi/rho; +// //mfcac -= c1o2 * c1o72*pStar*(phi[REST]-phi[BNW])*rhoToPhi/rho; +// //mfaac -= c1o2 * c1o72*pStar*(phi[REST]-phi[BNE])*rhoToPhi/rho; +// +// +// //forcingX1 =/* muForcingX1.Eval() / rho*/ - pStar * dX1_phi * rhoToPhi / rho; +// //forcingX2 =/* muForcingX2.Eval() / rho*/ - pStar * dX2_phi * rhoToPhi / rho; +// //forcingX3 =/* muForcingX3.Eval() / rho*/ - pStar * dX3_phi * rhoToPhi / rho; +// +// +// //mfabb += (-forcingX1) * c2o9; +// //mfbab += (-forcingX2) * c2o9; +// //mfbba += (-forcingX3) * c2o9; +// //mfaab += (-forcingX1 - forcingX2) * c1o16; +// //mfcab += (forcingX1 - forcingX2) * c1o16; +// //mfaba += (-forcingX1 - forcingX3) * c1o16; +// //mfcba += (forcingX1 - forcingX3) * c1o16; +// //mfbaa += (-forcingX2 - forcingX3) * c1o16; +// //mfbca += (forcingX2 - forcingX3) * c1o16; +// //mfaaa += (-forcingX1 - forcingX2 - forcingX3) * c1o72; +// //mfcaa += (forcingX1 - forcingX2 - forcingX3) * c1o72; +// //mfaca += (-forcingX1 + forcingX2 - forcingX3) * c1o72; +// //mfcca += (forcingX1 + forcingX2 - forcingX3) * c1o72; +// //mfcbb += (forcingX1)*c2o9; +// //mfbcb += (forcingX2)*c2o9; +// //mfbbc += (forcingX3)*c2o9; +// //mfccb += (forcingX1 + forcingX2) * c1o16; +// //mfacb += (-forcingX1 + forcingX2) * c1o16; +// //mfcbc += (forcingX1 + forcingX3) * c1o16; +// //mfabc += (-forcingX1 + forcingX3) * c1o16; +// //mfbcc += (forcingX2 + forcingX3) * c1o16; +// //mfbac += (-forcingX2 + forcingX3) * c1o16; +// //mfccc += (forcingX1 + forcingX2 + forcingX3) * c1o72; +// //mfacc += (-forcingX1 + forcingX2 + forcingX3) * c1o72; +// //mfcac += (forcingX1 - forcingX2 + forcingX3) * c1o72; +// //mfaac += (-forcingX1 - forcingX2 + forcingX3) * c1o72; +// +// LBMReal saveForceX1 = forcingX1; +// LBMReal saveForceX2 = forcingX2; +// LBMReal saveForceX3 = forcingX3; +// +// vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + +// (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + +// (mfcbb - mfabb)) / rhoRef; +// vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + +// (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + +// (mfbcb - mfbab)) / rhoRef; +// vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + +// (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + +// (mfbbc - mfbba)) / rhoRef; +// +// +// LBMReal dRhoInvX = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhcaa - mfhacc) + (mfhcca - mfhaac))) + +// (((mfhcba - mfhabc) + (mfhcbc - mfhaba)) + ((mfhcab - mfhacb) + (mfhccb - mfhaab))) + +// (mfhcbb - mfhabb))); +// LBMReal dRhoInvY = -(((((mfhccc - mfhaaa) + (mfhaca - mfhcac)) + ((mfhacc - mfhcaa) + (mfhcca - mfhaac))) + +// (((mfhbca - mfhbac) + (mfhbcc - mfhbaa)) + ((mfhacb - mfhcab) + (mfhccb - mfhaab))) + +// (mfhbcb - mfhbab))); +// LBMReal dRhoInvZ = -(((((mfhccc - mfhaaa) + (mfhcac - mfhaca)) + ((mfhacc - mfhcaa) + (mfhaac - mfhcca))) + +// (((mfhbac - mfhbca) + (mfhbcc - mfhbaa)) + ((mfhabc - mfhcba) + (mfhcbc - mfhaba))) + +// (mfhbbc - mfhbba))); +// +// +// forcingX1 = 0.0; +// forcingX2 = 0.0; +// forcingX3 = 0.0; +// //!Abbas +// //LBMReal dX1_rhoInv = gradX1_rhoInv(rhoL, rhoH - rhoL); +// //LBMReal dX2_rhoInv = gradX2_rhoInv(rhoL, rhoH - rhoL); +// //LBMReal dX3_rhoInv = gradX3_rhoInv(rhoL, rhoH - rhoL); +// //forcingX1 =/* muForcingX1.Eval() / rho*/ +pStar * dX1_rhoInv * rho; +// //forcingX2 =/* muForcingX2.Eval() / rho*/ +pStar * dX2_rhoInv * rho; +// //forcingX3 =/* muForcingX3.Eval() / rho*/ +pStar * dX3_rhoInv * rho; +// +// //forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho + pStar * dX1_rhoInv * rho) *c1o2; +// //forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho + pStar * dX2_rhoInv * rho) *c1o2; +// //forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho + pStar * dX3_rhoInv * rho) *c1o2; +// LBMReal FdX1_phi = normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale; +// LBMReal FdX2_phi = normX2 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale; +// LBMReal FdX3_phi = normX3 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale; +// +// +// //forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho ) ; +// //forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho ) ; +// //forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho ) ; +// +// //forcingX1 = (pStar * dRhoInvX* rho *c3) ; +// //forcingX2 = (pStar * dRhoInvY* rho *c3) ; +// //forcingX3 = (pStar * dRhoInvZ* rho *c3) ; +// //if (phi[REST] > 0.1 && phi[REST] < 0.9) std::cout << phi[REST] << " " << dX1_phi * rhoToPhi / rho << " " << dRhoInvX * rho *3<< std::endl; +// //LBMReal forcingX1ALTERNAT = ( pStar * dX1_rhoInv * rho) ; +// //LBMReal forcingX2ALTERNAT = ( pStar * dX2_rhoInv * rho) ; +// //LBMReal forcingX3ALTERNAT = ( pStar * dX3_rhoInv * rho) ; +// +// //forcingX1 = (fabs(vvx + c1o2 * forcingX1) < fabs(vvx + c1o2 * forcingX1ALTERNAT)) ? forcingX1 : forcingX1ALTERNAT; +// //forcingX2 = (fabs(vvy + c1o2 * forcingX2) < fabs(vvy + c1o2 * forcingX2ALTERNAT)) ? forcingX2 : forcingX2ALTERNAT; +// //forcingX3 = (fabs(vvz + c1o2 * forcingX3) < fabs(vvz + c1o2 * forcingX3ALTERNAT)) ? forcingX3 : forcingX3ALTERNAT; +// +// // forcingX1 = -pStar * rhoToPhi / rho * normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale; +// // forcingX2 = -pStar * rhoToPhi / rho * normX2 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale; +// // forcingX3 = -pStar * rhoToPhi / rho * normX3 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale; +// +// //forcingX1 = (-pStar * dX1_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX1_rhoInv * rho*(phi[REST])); +// //forcingX2 = (-pStar * dX2_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX2_rhoInv * rho*(phi[REST])); +// //forcingX3 = (-pStar * dX3_phi * rhoToPhi / rho *(c1- phi[REST]) + pStar * dX3_rhoInv * rho*(phi[REST])); +// //if (phi[REST] > 0.3 && phi[REST] < 0.7) +// //{ +// // int test = 1; +// // std::cout << phi[REST] <<" "<< dX1_phi <<" "<< normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale<<" "<< normX1 * (1.0 - phi[REST]) * (phi[REST]) * oneOverInterfaceScale/ dX1_phi<< std::endl; +// //} +// +// +// +// //LBMReal scaleGrad = c2 * phi[REST] * (1.0 - phi[REST]) / ((phi[REST] * phi[REST] + (1.0 - phi[REST]) * (1.0 - phi[REST])) * (phi[REST] * phi[REST] + (1.0 - phi[REST]) * (1.0 - phi[REST]))); +// //dX1_phi *= scaleGrad; +// //dX2_phi *= scaleGrad; +// //dX3_phi *= scaleGrad; +// +// ///Experimental interface sharpening force 20.06.2022 +// +// LBMReal scaleSharpener = 1.0; +// //forcingX1 += scaleSharpener * (FdX1_phi - dX1_phi) * fabsf(FdX1_phi - dX1_phi) / rho; +// //forcingX2 += scaleSharpener * (FdX2_phi - dX2_phi) * fabsf(FdX2_phi - dX2_phi) / rho; +// //forcingX3 += scaleSharpener * (FdX3_phi - dX3_phi) * fabsf(FdX3_phi - dX3_phi) / rho; +// ///surface tension force +// forcingX1 += mu * dX1_phi/rho; +// forcingX2 += mu * dX2_phi/rho; +// forcingX3 += mu * dX3_phi/rho; +// +// LBMReal forcingBIAS = 0.5; +// forcingX1 += muForcingX1.Eval() / rho;//*phi[REST]; +// forcingX2 += muForcingX2.Eval() / rho;// * phi[REST]; +// forcingX3 += muForcingX3.Eval() / rho;// * phi[REST]; +// +// // //19.08.2022 +// //vvx += vvxh / rho * c1o2; +// //vvy += vvyh / rho * c1o2; +// //vvz += vvzh / rho * c1o2; +// // // +// +// +// vvx += (forcingX1) * deltaT * c1o2; +// vvy += (forcingX2) * deltaT * c1o2; +// vvz += (forcingX3) * deltaT * c1o2; +// +// //vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT * c1o2; // X +// //vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT * c1o2; // Y +// //vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT * c1o2; // Z +// +// +// +// // vvx += (forcingX1 + muForcingX1.Eval() / rho) * deltaT * forcingBIAS; // X +// // vvy += (forcingX2 + muForcingX2.Eval() / rho) * deltaT * forcingBIAS; // Y +// // vvz += (forcingX3 + muForcingX3.Eval() / rho) * deltaT * forcingBIAS; // Z +// +// +// +// //Abbas +// LBMReal M200 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) +// + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfaba + mfcbc) + (mfabc + mfcba)) )) +// + ((mfabb + mfcbb))) ); +// LBMReal M020 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) +// + (((mfaab + mfccb) + (mfacb + mfcab)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) +// + ( (mfbab + mfbcb) )) ); +// LBMReal M002 = ((((((mfaaa + mfccc) + (mfaac + mfcca)) + ((mfcac + mfaca) + (mfcaa + mfacc))) +// + ( + ((mfaba + mfcbc) + (mfabc + mfcba)) + ((mfbaa + mfbcc) + (mfbac + mfbca)))) +// + ( (mfbba + mfbbc)))); +// +// LBMReal M110 = ((((((mfaaa + mfccc) + (-mfcac - mfaca)) + ((mfaac + mfcca) + (-mfcaa -mfacc))) +// + (((mfaab + mfccb) + (-mfacb - mfcab)) )) +// ) ); +// LBMReal M101 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ((mfcac + mfaca) - (mfcaa + mfacc))) +// + (((mfaba + mfcbc) + (-mfabc - mfcba)))) +// )); +// LBMReal M011 = ((((((mfaaa + mfccc) - (mfaac + mfcca)) + ( (mfcaa + mfacc)- (mfcac + mfaca))) +// + (((mfbaa + mfbcc) + (-mfbac - mfbca)))) +// )); +// LBMReal vvxI = vvx; +// LBMReal vvyI = vvy; +// LBMReal vvzI = vvz; +// +// LBMReal collFactorStore=collFactorM; +// LBMReal stress; +// //for(int iter=0;iter<5;iter++) +// //{ +// // LBMReal OxxPyyPzz = 1.0; +// // LBMReal mxxPyyPzz = (M200-vvxI*vvxI) + (M020-vvyI*vvyI) + (M002-vvzI*vvzI); +// // //pStar = mxxPyyPzz * c1o3; +// //mxxPyyPzz -= c3 *pStar; +// +// //LBMReal mxxMyy = (M200-vvxI*vvxI) - (M020-vvyI*vvyI); +// //LBMReal mxxMzz = (M200-vvxI*vvxI) - (M002-vvzI*vvzI); +// //LBMReal mxy = M110 - vvxI * vvyI; +// //LBMReal mxz = M101 - vvxI * vvzI; +// //LBMReal myz = M011 - vvyI * vvzI; +// +// +// //mxxMyy *= c1 - collFactorM * c1o2; +// //mxxMzz *= c1 - collFactorM * c1o2; +// //mxy *= c1 - collFactorM * c1o2; +// //mxz *= c1 - collFactorM * c1o2; +// //myz *= c1 - collFactorM * c1o2; +// //mxxPyyPzz *= c1 - OxxPyyPzz * c1o2; +// ////mxxPyyPzz = mxxPyyPzz*fabs(mxxPyyPzz)/(1.0e-6+fabs(mxxPyyPzz)); +// ////mxxPyyPzz += c3 * pStar; +// //LBMReal mxx = (mxxMyy + mxxMzz + mxxPyyPzz)*c1o3; +// //LBMReal myy = (-c2*mxxMyy + mxxMzz + mxxPyyPzz)*c1o3; +// //LBMReal mzz = (mxxMyy -c2* mxxMzz + mxxPyyPzz) * c1o3; +// //vvxI = vvx - (mxx * dX1_phi + mxy * dX2_phi + mxz * dX3_phi) * rhoToPhi / (rho); +// //vvyI = vvy - (mxy * dX1_phi + myy * dX2_phi + myz * dX3_phi) * rhoToPhi / (rho); +// //vvzI = vvz - (mxz * dX1_phi + myz * dX2_phi + mzz * dX3_phi) * rhoToPhi / (rho); +// +// +// //// vvzI = vvz + (mxz * dRhoInvX + myz * dRhoInvY + mzz * dRhoInvZ) * (rho)*c3; +// //// vvxI = vvx + (mxx * dRhoInvX + mxy * dRhoInvY + mxz * dRhoInvZ) * (rho)*c3; +// //// vvyI = vvy + (mxy * dRhoInvX + myy * dRhoInvY + myz * dRhoInvZ) * (rho)*c3; +// +// +// // //LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); +// // // +// // //LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; +// // //LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; +// // //LBMReal Dxy = -three * collFactorM * mxy; +// // //LBMReal Dxz = -three * collFactorM * mxz; +// // //LBMReal Dyz = -three * collFactorM * myz; +// // ////LBMReal stress = sqrt(sqrt((dyuy+dxux+dzuz)* (dyuy + dxux + dzuz))) * sqrt(forcingX1 * forcingX1 + forcingX2 * forcingX2 + forcingX3 * forcingX3); +// // // stress = sqrt(dyuy * dyuy + dxux * dxux + dzuz*dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz)*sqrt(forcingX1*forcingX1+forcingX2*forcingX2+forcingX3*forcingX3); +// // ////collFactorM = collFactorStore + (1.75 - collFactorStore) * stress / (stress + 1.0e-8); +// // // +// // //LBMReal dX2_rho = (rhoToPhi)*dX2_phi; +// // //LBMReal dX1_rho = (rhoToPhi)*dX1_phi; +// // //LBMReal dX3_rho = (rhoToPhi)*dX3_phi; +// // ////vvxI= vvx+ c1o6 * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho); +// // ////vvyI= vvy+ c1o6 * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho); +// // ////vvzI= vvz+ c1o6 * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho); +// +// // //vvxI = vvx + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho); +// // //vvyI = vvy + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho); +// // //vvzI = vvz + c1o3*forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho); +// +// // ////vvxI = vvx - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (2 * dxux * dX1_rhoInv + Dxy * dX2_rhoInv + Dxz * dX3_rhoInv); +// // ////vvyI = vvy - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxy * dX1_rhoInv + 2 * dyuy * dX2_rhoInv + Dyz * dX3_rhoInv); +// // ////vvzI = vvz - c1o3 * forcingBIAS * (c1 / collFactorM - c1o2) * (Dxz * dX1_rhoInv + Dyz * dX2_rhoInv + 2 * dyuy * dX3_rhoInv); +// +// +// //} +// // //forcingX1+=(vvxI-vvx)/(deltaT* forcingBIAS) + muForcingX1.Eval() / rho; +// // //forcingX2 += (vvyI - vvy) / (deltaT * forcingBIAS) + muForcingX2.Eval() / rho; +// // //forcingX3 += (vvzI - vvz) / (deltaT * forcingBIAS) + muForcingX3.Eval() / rho; +// +// +// //// forcingX1 += c2 * (vvxI - vvx); +// //// forcingX2 += c2 * (vvyI - vvy); +// //// forcingX3 += c2 * (vvzI - vvz); +// +// +// //mfabb += c1o2*(-forcingX1) * c2o9; +// //mfbab += c1o2*(-forcingX2) * c2o9; +// //mfbba += c1o2*(-forcingX3) * c2o9; +// //mfaab += c1o2*(-forcingX1 - forcingX2) * c1o18; +// //mfcab += c1o2*( forcingX1 - forcingX2) * c1o18; +// //mfaba += c1o2*(-forcingX1 - forcingX3) * c1o18; +// //mfcba += c1o2*( forcingX1 - forcingX3) * c1o18; +// //mfbaa += c1o2*(-forcingX2 - forcingX3) * c1o18; +// //mfbca += c1o2*( forcingX2 - forcingX3) * c1o18; +// //mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72; +// //mfcaa += c1o2*(forcingX1 - forcingX2 - forcingX3) * c1o72; +// //mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72; +// //mfcca += c1o2*(forcingX1 + forcingX2 - forcingX3) * c1o72; +// //mfcbb += c1o2*(forcingX1)*c2o9; +// //mfbcb += c1o2*(forcingX2)*c2o9; +// //mfbbc += c1o2*(forcingX3)*c2o9; +// //mfccb += c1o2*( forcingX1 + forcingX2) * c1o18; +// //mfacb += c1o2*(-forcingX1 + forcingX2) * c1o18; +// //mfcbc += c1o2*( forcingX1 + forcingX3) * c1o18; +// //mfabc += c1o2*(-forcingX1 + forcingX3) * c1o18; +// //mfbcc += c1o2*( forcingX2 + forcingX3) * c1o18; +// //mfbac += c1o2*(-forcingX2 + forcingX3) * c1o18; +// //mfccc += c1o2*(forcingX1 + forcingX2 + forcingX3) * c1o72; +// //mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72; +// //mfcac += c1o2*(forcingX1 - forcingX2 + forcingX3) * c1o72; +// //mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72; +// +// +// //forcingX1 = saveForceX1; +// //forcingX2 = saveForceX2; +// //forcingX3 = saveForceX3; +// vvx = vvxI; +// vvy = vvyI; +// vvz = vvzI; +// +// +// +// //!Abbas +// +// LBMReal vx2; +// LBMReal vy2; +// LBMReal vz2; +// vx2 = vvx * vvx; +// vy2 = vvy * vvy; +// vz2 = vvz * vvz; +// //pStar =ppStar- (vx2 + vy2 + vz2)*pStar; +// // pStar = (pStar + ppStar)*c1o2; +// /////////////////////////////////////////////////////////////////////////////////////////// +// LBMReal oMdrho; +// /////////////// +// //mfabb -= pStar * c2o9; +// //mfbab -= pStar * c2o9; +// //mfbba -= pStar * c2o9; +// //mfaab -= pStar * c1o16; +// //mfcab -= pStar * c1o16; +// //mfaba -= pStar * c1o16; +// //mfcba -= pStar * c1o16; +// //mfbaa -= pStar * c1o16; +// //mfbca -= pStar * c1o16; +// //mfaaa -= pStar * c1o72; +// //mfcaa -= pStar * c1o72; +// //mfaca -= pStar * c1o72; +// //mfcca -= pStar * c1o72; +// //mfcbb -= pStar * c2o9; +// //mfbcb -= pStar * c2o9; +// //mfbbc -= pStar * c2o9; +// //mfccb -= pStar * c1o16; +// //mfacb -= pStar * c1o16; +// //mfcbc -= pStar * c1o16; +// //mfabc -= pStar * c1o16; +// //mfbcc -= pStar * c1o16; +// //mfbac -= pStar * c1o16; +// //mfccc -= pStar * c1o72; +// //mfacc -= pStar * c1o72; +// //mfcac -= pStar * c1o72; +// //mfaac -= pStar * c1o72; +// //mfbbb -= pStar * 8.0/9.0; +// /////////////////// +// +// oMdrho = mfccc + mfaaa; +// m0 = mfaca + mfcac; +// m1 = mfacc + mfcaa; +// m2 = mfaac + mfcca; +// oMdrho += m0; +// m1 += m2; +// oMdrho += m1; +// m0 = mfbac + mfbca; +// m1 = mfbaa + mfbcc; +// m0 += m1; +// m1 = mfabc + mfcba; +// m2 = mfaba + mfcbc; +// m1 += m2; +// m0 += m1; +// m1 = mfacb + mfcab; +// m2 = mfaab + mfccb; +// m1 += m2; +// m0 += m1; +// oMdrho += m0; +// m0 = mfabb + mfcbb; +// m1 = mfbab + mfbcb; +// m2 = mfbba + mfbbc; +// m0 += m1 + m2; +// m0 += mfbbb; //hat gefehlt +// oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!! +// +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal wadjust; +// LBMReal qudricLimit = 0.01 / (c1 + 1.0e4 * phi[REST] * (c1 - phi[REST])); //LBMReal qudricLimit = 0.01; +// //////////////////////////////////////////////////////////////////////////////////// +// //Hin +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// m2 = mfaaa + mfaac; +// m1 = mfaac - mfaaa; +// m0 = m2 + mfaab; +// mfaaa = m0; +// m0 += c1o36 * oMdrho; +// mfaab = m1 - m0 * vvz; +// mfaac = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaba + mfabc; +// m1 = mfabc - mfaba; +// m0 = m2 + mfabb; +// mfaba = m0; +// m0 += c1o9 * oMdrho; +// mfabb = m1 - m0 * vvz; +// mfabc = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaca + mfacc; +// m1 = mfacc - mfaca; +// m0 = m2 + mfacb; +// mfaca = m0; +// m0 += c1o36 * oMdrho; +// mfacb = m1 - m0 * vvz; +// mfacc = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbaa + mfbac; +// m1 = mfbac - mfbaa; +// m0 = m2 + mfbab; +// mfbaa = m0; +// m0 += c1o9 * oMdrho; +// mfbab = m1 - m0 * vvz; +// mfbac = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbba + mfbbc; +// m1 = mfbbc - mfbba; +// m0 = m2 + mfbbb; +// mfbba = m0; +// m0 += c4o9 * oMdrho; +// mfbbb = m1 - m0 * vvz; +// mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbca + mfbcc; +// m1 = mfbcc - mfbca; +// m0 = m2 + mfbcb; +// mfbca = m0; +// m0 += c1o9 * oMdrho; +// mfbcb = m1 - m0 * vvz; +// mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcaa + mfcac; +// m1 = mfcac - mfcaa; +// m0 = m2 + mfcab; +// mfcaa = m0; +// m0 += c1o36 * oMdrho; +// mfcab = m1 - m0 * vvz; +// mfcac = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcba + mfcbc; +// m1 = mfcbc - mfcba; +// m0 = m2 + mfcbb; +// mfcba = m0; +// m0 += c1o9 * oMdrho; +// mfcbb = m1 - m0 * vvz; +// mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcca + mfccc; +// m1 = mfccc - mfcca; +// m0 = m2 + mfccb; +// mfcca = m0; +// m0 += c1o36 * oMdrho; +// mfccb = m1 - m0 * vvz; +// mfccc = m2 - 2. * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// m2 = mfaaa + mfaca; +// m1 = mfaca - mfaaa; +// m0 = m2 + mfaba; +// mfaaa = m0; +// m0 += c1o6 * oMdrho; +// mfaba = m1 - m0 * vvy; +// mfaca = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaab + mfacb; +// m1 = mfacb - mfaab; +// m0 = m2 + mfabb; +// mfaab = m0; +// mfabb = m1 - m0 * vvy; +// mfacb = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaac + mfacc; +// m1 = mfacc - mfaac; +// m0 = m2 + mfabc; +// mfaac = m0; +// m0 += c1o18 * oMdrho; +// mfabc = m1 - m0 * vvy; +// mfacc = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbaa + mfbca; +// m1 = mfbca - mfbaa; +// m0 = m2 + mfbba; +// mfbaa = m0; +// m0 += c2o3 * oMdrho; +// mfbba = m1 - m0 * vvy; +// mfbca = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbab + mfbcb; +// m1 = mfbcb - mfbab; +// m0 = m2 + mfbbb; +// mfbab = m0; +// mfbbb = m1 - m0 * vvy; +// mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbac + mfbcc; +// m1 = mfbcc - mfbac; +// m0 = m2 + mfbbc; +// mfbac = m0; +// m0 += c2o9 * oMdrho; +// mfbbc = m1 - m0 * vvy; +// mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcaa + mfcca; +// m1 = mfcca - mfcaa; +// m0 = m2 + mfcba; +// mfcaa = m0; +// m0 += c1o6 * oMdrho; +// mfcba = m1 - m0 * vvy; +// mfcca = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcab + mfccb; +// m1 = mfccb - mfcab; +// m0 = m2 + mfcbb; +// mfcab = m0; +// mfcbb = m1 - m0 * vvy; +// mfccb = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcac + mfccc; +// m1 = mfccc - mfcac; +// m0 = m2 + mfcbc; +// mfcac = m0; +// m0 += c1o18 * oMdrho; +// mfcbc = m1 - m0 * vvy; +// mfccc = m2 - 2. * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// m2 = mfaaa + mfcaa; +// m1 = mfcaa - mfaaa; +// m0 = m2 + mfbaa; +// mfaaa = m0; +// m0 += 1. * oMdrho; +// mfbaa = m1 - m0 * vvx; +// mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaba + mfcba; +// m1 = mfcba - mfaba; +// m0 = m2 + mfbba; +// mfaba = m0; +// mfbba = m1 - m0 * vvx; +// mfcba = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaca + mfcca; +// m1 = mfcca - mfaca; +// m0 = m2 + mfbca; +// mfaca = m0; +// m0 += c1o3 * oMdrho; +// mfbca = m1 - m0 * vvx; +// mfcca = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaab + mfcab; +// m1 = mfcab - mfaab; +// m0 = m2 + mfbab; +// mfaab = m0; +// mfbab = m1 - m0 * vvx; +// mfcab = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfabb + mfcbb; +// m1 = mfcbb - mfabb; +// m0 = m2 + mfbbb; +// mfabb = m0; +// mfbbb = m1 - m0 * vvx; +// mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfacb + mfccb; +// m1 = mfccb - mfacb; +// m0 = m2 + mfbcb; +// mfacb = m0; +// mfbcb = m1 - m0 * vvx; +// mfccb = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaac + mfcac; +// m1 = mfcac - mfaac; +// m0 = m2 + mfbac; +// mfaac = m0; +// m0 += c1o3 * oMdrho; +// mfbac = m1 - m0 * vvx; +// mfcac = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfabc + mfcbc; +// m1 = mfcbc - mfabc; +// m0 = m2 + mfbbc; +// mfabc = m0; +// mfbbc = m1 - m0 * vvx; +// mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfacc + mfccc; +// m1 = mfccc - mfacc; +// m0 = m2 + mfbcc; +// mfacc = m0; +// m0 += c1o9 * oMdrho; +// mfbcc = m1 - m0 * vvx; +// mfccc = m2 - 2. * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// // Cumulants +// //////////////////////////////////////////////////////////////////////////////////// +// +// // mfaaa = 0.0; +// LBMReal OxxPyyPzz = 1.0; //omega2 or bulk viscosity +// // LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// +// // LBMReal OxyyMxzz = 1.;//2+s9;// +// LBMReal O4 = 1.; +// LBMReal O5 = 1.; +// LBMReal O6 = 1.; +// +// //collFactorM+= (1.7 - collFactorM) * fabs(mfaaa) / (fabs(mfaaa) + 0.001f); +// +// +// /////fourth order parameters; here only for test. Move out of loop! +// +// LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0))); +// LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); +// LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); +// LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); +// //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::B' ) +// LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); +// //LBMReal stress = 1.0;// stress / (stress + 1.0e-10); +// stress = 1.0; +// //OxyyPxzz += stress*(1.0-OxyyPxzz); +// //OxyyPxzz = c3 * (collFactorM - c2) / (collFactorM - c3); +// //OxyyMxzz += stress*(1.0-OxyyMxzz); +// //Oxyz += stress*(1.0-Oxyz); +// //A *= 1.0-stress; +// //BB *= 1.0-stress; +// +// //Cum 4. +// //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 +// //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 +// //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 +// +// LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); +// LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); +// LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); +// +// LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); +// LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); +// LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); +// +// //Cum 5. +// LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; +// LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; +// LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; +// +// //Cum 6. +// LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb +// - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) +// - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) +// - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) +// + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +// + 2. * (mfcaa * mfaca * mfaac) +// + 16. * mfbba * mfbab * mfabb) +// - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho +// - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) +// + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +// + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; +// +// //2. +// // linear combinations +// LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; +// //pStar = (mxxPyyPzz+vx2+vy2+vz2) * c1o3;//does not work +// //pStar = (mxxPyyPzz) * c1o3; +// //pStar = pStar + 1.5 * (mxxPyyPzz * c1o3 - pStar); +// //mfaaa = mxxPyyPzz; +// // LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho)); +// mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa +// //mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa +// LBMReal mxxMyy = mfcaa - mfaca; +// LBMReal mxxMzz = mfcaa - mfaac; +// +// /// +// LBMReal mmfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); +// LBMReal mmfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); +// LBMReal mmfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); +// LBMReal mmfabb = mfabb; +// LBMReal mmfbab = mfbab; +// LBMReal mmfbba = mfbba; +// /// +// +// LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz)*0; +// //LBMReal dxux = -c1o2 * (mxxMyy + mxxMzz) * collFactorM - mfaaa * c1o3* omegaDRho; +// LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; +// LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; +// LBMReal Dxy = -three * collFactorM * mfbba; +// LBMReal Dxz = -three * collFactorM * mfbab; +// LBMReal Dyz = -three * collFactorM * mfabb; +//// // attempt to improve implicit stress computation by fixed iteration +//// LBMReal dX2_rho = (rhoToPhi)*dX2_phi; +//// LBMReal dX1_rho = (rhoToPhi)*dX1_phi; +//// LBMReal dX3_rho = (rhoToPhi)*dX3_phi; +//// +//// LBMReal dfx= c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho); +//// LBMReal dfy = c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho); +//// LBMReal dfz = c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho); +//// +//// for (int iteration = 0; iteration < 5; iteration++) { +//// mxxMyy = (mfcaa - dfx * dfx * c1o2) - (mfaca - dfy * dfy * c1o2); +//// mxxMzz = (mfcaa - dfx * dfx * c1o2) - (mfaac - dfz * dfz * c1o2); +//// } +///////end fixed iteration +//// +// +// +// //relax +// mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); +// mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy); +// mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz); +// +// mfabb += collFactorM * (-mfabb); +// mfbab += collFactorM * (-mfbab); +// mfbba += collFactorM * (-mfbba); +// +// //if (fabsf(mfaaa + (dxux + dyuy + dzuz) > 1e-9)){ +// // std::cout << mfaaa <<" "<< (dxux + dyuy + dzuz)<< std::endl; +// //} +// +// +// ////updated pressure +// //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; +// //mfaaa *= (one-omegaDRho);// (mfaaa + (dxux + dyuy + dzuz)) * .5; // Pressure elimination as in standard velocity model +// // mfaaa += (rho - c1) * (dxux + dyuy + dzuz); +// +// mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa +// +// // mxxPyyPzz += (mfaaa + mfaaaS) * c1o2; +// //mfaaa = mfaaaS; +// // linear combinations back +// mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); +// mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); +// mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); +// +// //3. +// // linear combinations +// LBMReal mxxyPyzz = mfcba + mfabc; +// LBMReal mxxyMyzz = mfcba - mfabc; +// +// LBMReal mxxzPyyz = mfcab + mfacb; +// LBMReal mxxzMyyz = mfcab - mfacb; +// +// LBMReal mxyyPxzz = mfbca + mfbac; +// LBMReal mxyyMxzz = mfbca - mfbac; +// +// mmfcaa += c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz- mfaaa); +// mmfaca += c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz- mfaaa); +// mmfaac += c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz- mfaaa); +// mmfabb += mfabb; +// mmfbab += mfbab; +// mmfbba += mfbba; +// +// //relax +// wadjust = Oxyz + (1. - Oxyz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); +// mfbbb += wadjust * (-mfbbb); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); +// mxxyPyzz += wadjust * (-mxxyPyzz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); +// mxxyMyzz += wadjust * (-mxxyMyzz); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); +// mxxzPyyz += wadjust * (-mxxzPyyz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); +// mxxzMyyz += wadjust * (-mxxzMyyz); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); +// mxyyPxzz += wadjust * (-mxyyPxzz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); +// mxyyMxzz += wadjust * (-mxyyMxzz); +// +// // linear combinations back +// mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; +// mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; +// mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; +// mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; +// mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; +// mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; +// +// //4. +// CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc); +// CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac); +// CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca); +// CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc); +// CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb); +// CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb); +// +// //5. +// CUMbcc += O5 * (-CUMbcc); +// CUMcbc += O5 * (-CUMcbc); +// CUMccb += O5 * (-CUMccb); +// +// //6. +// CUMccc += O6 * (-CUMccc); +// +// //back cumulants to central moments +// //4. +// //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 +// //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 +// //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 +// +// mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); +// mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); +// mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); +// +// mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; +// mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; +// mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; +// +// //5. +// mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; +// mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; +// mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; +// +// //6. +// mfccc = CUMccc - ((-4. * mfbbb * mfbbb +// - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) +// - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) +// - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) +// + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +// + 2. * (mfcaa * mfaca * mfaac) +// + 16. * mfbba * mfbab * mfabb) +// - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho +// - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) +// + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +// + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho; +// +// +// //////// +// +// +// //////////////////////////////////////////////////////////////////////////////////// +// //forcing +// mfbaa = -mfbaa;// *(c1 - forcingBIAS) / forcingBIAS; +// mfaba = -mfaba;// *(c1 - forcingBIAS) / forcingBIAS; +// mfaab = -mfaab;// *(c1 - forcingBIAS) / forcingBIAS; +// +// //mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho); +// //mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho); +// //mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho); +// +// mfbaa -= c1o2 * rhoToPhi * (mmfcaa* dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho); +// mfaba -= c1o2 * rhoToPhi * (mmfbba* dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho); +// mfaab -= c1o2 * rhoToPhi * (mmfbab* dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho); +// +// vvx -= c1o4 * rhoToPhi * (mmfcaa * dX1_phi + mmfbba * dX2_phi + mmfbab * dX3_phi) / (rho); +// vvy -= c1o4 * rhoToPhi * (mmfbba * dX1_phi + mmfaca * dX2_phi + mmfabb * dX3_phi) / (rho); +// vvz -= c1o4 * rhoToPhi * (mmfbab * dX1_phi + mmfabb * dX2_phi + mmfaac * dX3_phi) / (rho); +// +// vx2 = vvx * vvx; +// vy2 = vvy * vvy; +// vz2 = vvz * vvz; +// +// //mmfcaa =0;// c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz - mfaaa); +// //mmfaca =0;// c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz - mfaaa); +// //mmfaac =0;// c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz - mfaaa); +// //mmfabb =0;// mfabb; +// //mmfbab =0;// mfbab; +// //mmfbba =0;// mfbba; +// +// +// ////////////////////////////////////////////////////////////////////////////////////// +// //grad Rho +// //LBMReal dX1_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX1_phi - phi[REST] * three * gradPx; +// //LBMReal dX2_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX2_phi - phi[REST] * three * gradPy; +// //LBMReal dX3_rho = (rhoToPhi - three * (*pressure)(x1, x2, x3)) * dX3_phi - phi[REST] * three * gradPz; +// +// //LBMReal dX2_rho = (rhoToPhi ) * dX2_phi ; +// //LBMReal dX1_rho = (rhoToPhi ) * dX1_phi ; +// //LBMReal dX3_rho = (rhoToPhi ) * dX3_phi ; +// /////////////////////////////////////////////////////////////////////////////////////// +// //mfbaa += c1o3 * (c1 / collFactorM - c1o2) *(2 * dxux * dX1_rho + Dxy * dX2_rho + Dxz * dX3_rho) / (rho); +// //mfaba += c1o3 * (c1 / collFactorM - c1o2) *(Dxy * dX1_rho + 2 * dyuy * dX2_rho + Dyz * dX3_rho) / (rho); +// //mfaab += c1o3 * (c1 / collFactorM - c1o2) *(Dxz * dX1_rho + Dyz * dX2_rho + 2 * dyuy * dX3_rho) / (rho); +// +// ///////Fakhari pressure correction +// //mfbaa -= mfaaa / rho * dX1_rho*c1o3; +// //mfaba -= mfaaa / rho * dX2_rho*c1o3; +// //mfaab -= mfaaa / rho * dX3_rho*c1o3; +// //////////////////////////////////////////////////////////////////////////////////// +// //back +// //////////////////////////////////////////////////////////////////////////////////// +// //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; +// m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; +// m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; +// mfaaa = m0; +// mfaab = m1; +// mfaac = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; +// m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); +// m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; +// mfaba = m0; +// mfabb = m1; +// mfabc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; +// m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; +// m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; +// mfaca = m0; +// mfacb = m1; +// mfacc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; +// m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); +// m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; +// mfbaa = m0; +// mfbab = m1; +// mfbac = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; +// m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); +// m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; +// mfbba = m0; +// mfbbb = m1; +// mfbbc = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; +// m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); +// m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; +// mfbca = m0; +// mfbcb = m1; +// mfbcc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; +// m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; +// m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; +// mfcaa = m0; +// mfcab = m1; +// mfcac = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; +// m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); +// m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; +// mfcba = m0; +// mfcbb = m1; +// mfcbc = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; +// m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; +// m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; +// mfcca = m0; +// mfccb = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; +// m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; +// mfaaa = m0; +// mfaba = m1; +// mfaca = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; +// m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; +// mfaab = m0; +// mfabb = m1; +// mfacb = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; +// m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; +// mfaac = m0; +// mfabc = m1; +// mfacc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; +// m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); +// m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; +// mfbaa = m0; +// mfbba = m1; +// mfbca = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; +// m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); +// m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; +// mfbab = m0; +// mfbbb = m1; +// mfbcb = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; +// m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); +// m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; +// mfbac = m0; +// mfbbc = m1; +// mfbcc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; +// m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; +// mfcaa = m0; +// mfcba = m1; +// mfcca = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; +// m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; +// mfcab = m0; +// mfcbb = m1; +// mfccb = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; +// m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; +// mfcac = m0; +// mfcbc = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; +// m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaaa = m0; +// mfbaa = m1; +// mfcaa = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; +// m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaba = m0; +// mfbba = m1; +// mfcba = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; +// m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaca = m0; +// mfbca = m1; +// mfcca = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; +// m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaab = m0; +// mfbab = m1; +// mfcab = m2; +// ///////////b//////////////////////////////////////////////////////////////////////// +// m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; +// m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfabb = m0; +// mfbbb = m1; +// mfcbb = m2; +// ///////////b//////////////////////////////////////////////////////////////////////// +// m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; +// m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfacb = m0; +// mfbcb = m1; +// mfccb = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; +// m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaac = m0; +// mfbac = m1; +// mfcac = m2; +// ///////////c//////////////////////////////////////////////////////////////////////// +// m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; +// m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfabc = m0; +// mfbbc = m1; +// mfcbc = m2; +// ///////////c//////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; +// m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; +// mfacc = m0; +// mfbcc = m1; +// mfccc = m2; +// /////SimpleForce +// +// //mfabb += c2o9 * deltaP; +// //mfbab += c2o9 * deltaP; +// //mfbba += c2o9 * deltaP; +// //mfaab += c1o18 * deltaP; +// //mfcab += c1o18 * deltaP; +// //mfaba += c1o18 * deltaP; +// //mfcba += c1o18 * deltaP; +// //mfbaa += c1o18 * deltaP; +// //mfbca += c1o18 * deltaP; +// //mfaaa += c1o72 * deltaP; +// //mfcaa += c1o72 * deltaP; +// //mfaca += c1o72 * deltaP; +// //mfcca += c1o72 * deltaP; +// //mfcbb += c2o9 * deltaP; +// //mfbcb += c2o9 * deltaP; +// //mfbbc += c2o9 * deltaP; +// //mfccb += c1o18 * deltaP; +// //mfacb += c1o18 * deltaP; +// //mfcbc += c1o18 * deltaP; +// //mfabc += c1o18 * deltaP; +// //mfbcc += c1o18 * deltaP; +// //mfbac += c1o18 * deltaP; +// //mfccc += c1o72 * deltaP; +// //mfacc += c1o72 * deltaP; +// //mfcac += c1o72 * deltaP; +// //mfaac += c1o72 * deltaP; +// +// //mfabb += c1o2*(-forcingX1 ) * c2o9; +// //mfbab += c1o2*( - forcingX2 ) * c2o9; +// //mfbba += c1o2*( - forcingX3) * c2o9; +// //mfaab += c1o2*(-forcingX1 - forcingX2 ) * c1o18; +// //mfcab += c1o2*( forcingX1 - forcingX2 ) * c1o18; +// //mfaba += c1o2*(-forcingX1 - forcingX3) * c1o18; +// //mfcba += c1o2*( forcingX1 - forcingX3) * c1o18; +// //mfbaa += c1o2*( - forcingX2 - forcingX3) * c1o18; +// //mfbca += c1o2*( forcingX2 - forcingX3) * c1o18; +// //mfaaa += c1o2*(-forcingX1 - forcingX2 - forcingX3) * c1o72; +// //mfcaa += c1o2*( forcingX1 - forcingX2 - forcingX3) * c1o72; +// //mfaca += c1o2*(-forcingX1 + forcingX2 - forcingX3) * c1o72; +// //mfcca += c1o2*( forcingX1 + forcingX2 - forcingX3) * c1o72; +// //mfcbb += c1o2*( forcingX1 ) * c2o9; +// //mfbcb += c1o2*( forcingX2 ) * c2o9; +// //mfbbc += c1o2*( forcingX3) * c2o9; +// //mfccb += c1o2*( forcingX1 + forcingX2 ) * c1o18; +// //mfacb += c1o2*(-forcingX1 + forcingX2 ) * c1o18; +// //mfcbc += c1o2*( forcingX1 + forcingX3) * c1o18; +// //mfabc += c1o2*(-forcingX1 + forcingX3) * c1o18; +// //mfbcc += c1o2*( forcingX2 + forcingX3) * c1o18; +// //mfbac += c1o2*( - forcingX2 + forcingX3) * c1o18; +// //mfccc += c1o2*( forcingX1 + forcingX2 + forcingX3) * c1o72; +// //mfacc += c1o2*(-forcingX1 + forcingX2 + forcingX3) * c1o72; +// //mfcac += c1o2*( forcingX1 - forcingX2 + forcingX3) * c1o72; +// //mfaac += c1o2*(-forcingX1 - forcingX2 + forcingX3) * c1o72; +// //pStarStart -= (vx2 + vy2 + vz2) * c1o3; +// +// ///Take the diffusion part with out +// +// //mfStartcbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::E , zeroReal, vvx, vvy, vvz); +// //mfStartbcb -= D3Q27System::getIncompFeqForDirection(D3Q27System::N , zeroReal, vvx, vvy, vvz); +// //mfStartbbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::T , zeroReal, vvx, vvy, vvz); +// //mfStartccb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NE , zeroReal, vvx, vvy, vvz); +// //mfStartacb -= D3Q27System::getIncompFeqForDirection(D3Q27System::NW , zeroReal, vvx, vvy, vvz); +// //mfStartcbc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TE , zeroReal, vvx, vvy, vvz); +// //mfStartabc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TW , zeroReal, vvx, vvy, vvz); +// //mfStartbcc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TN , zeroReal, vvx, vvy, vvz); +// //mfStartbac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TS , zeroReal, vvx, vvy, vvz); +// //mfStartccc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNE, zeroReal, vvx, vvy, vvz); +// //mfStartacc -= D3Q27System::getIncompFeqForDirection(D3Q27System::TNW, zeroReal, vvx, vvy, vvz); +// //mfStartcac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSE, zeroReal, vvx, vvy, vvz); +// //mfStartaac -= D3Q27System::getIncompFeqForDirection(D3Q27System::TSW, zeroReal, vvx, vvy, vvz); +// //mfStartabb -= D3Q27System::getIncompFeqForDirection(D3Q27System::W , zeroReal, vvx, vvy, vvz); +// //mfStartbab -= D3Q27System::getIncompFeqForDirection(D3Q27System::S , zeroReal, vvx, vvy, vvz); +// //mfStartbba -= D3Q27System::getIncompFeqForDirection(D3Q27System::B , zeroReal, vvx, vvy, vvz); +// //mfStartaab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SW , zeroReal, vvx, vvy, vvz); +// //mfStartcab -= D3Q27System::getIncompFeqForDirection(D3Q27System::SE , zeroReal, vvx, vvy, vvz); +// //mfStartaba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BW , zeroReal, vvx, vvy, vvz); +// //mfStartcba -= D3Q27System::getIncompFeqForDirection(D3Q27System::BE , zeroReal, vvx, vvy, vvz); +// //mfStartbaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BS , zeroReal, vvx, vvy, vvz); +// //mfStartbca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BN , zeroReal, vvx, vvy, vvz); +// //mfStartaaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSW, zeroReal, vvx, vvy, vvz); +// //mfStartcaa -= D3Q27System::getIncompFeqForDirection(D3Q27System::BSE, zeroReal, vvx, vvy, vvz); +// //mfStartaca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNW, zeroReal, vvx, vvy, vvz); +// //mfStartcca -= D3Q27System::getIncompFeqForDirection(D3Q27System::BNE, zeroReal, vvx, vvy, vvz); +// //mfStartbbb -= D3Q27System::getIncompFeqForDirection(D3Q27System::REST, zeroReal, vvx, vvy, vvz); +// // +// //pStar += pStarStart*(omegaDRho-c1); +// +// //mfStartcbb = c2o9 * pStar; +// // mfStartbcb= c2o9 * pStar; +// // mfStartbbc= c2o9 * pStar; +// // mfStartccb= c1o18 * pStar; +// // mfStartacb= c1o18 * pStar; +// // mfStartcbc= c1o18 * pStar; +// // mfStartabc= c1o18 * pStar; +// // mfStartbcc= c1o18 * pStar; +// // mfStartbac= c1o18 * pStar; +// // mfStartccc= c1o72 * pStar; +// // mfStartacc= c1o72 * pStar; +// // mfStartcac= c1o72 * pStar; +// // mfStartaac= c1o72 * pStar; +// // mfStartabb= c2o9 * pStar; +// // mfStartbab= c2o9 * pStar; +// // mfStartbba= c2o9 * pStar; +// // mfStartaab= c1o18 * pStar; +// // mfStartcab= c1o18 * pStar; +// // mfStartaba= c1o18 * pStar; +// // mfStartcba= c1o18 * pStar; +// // mfStartbaa= c1o18 * pStar; +// // mfStartbca= c1o18 * pStar; +// // mfStartaaa= c1o72 * pStar; +// // mfStartcaa= c1o72 * pStar; +// // mfStartaca= c1o72 * pStar; +// // mfStartcca= c1o72 * pStar; +// // mfStartbbb= c4 * c2o9 * pStar; +// +// //mfaaa -= c1o2 * (mfStartaaa + mfStartccc)+ c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa); +// //mfaab -= c1o2 * (mfStartaab + mfStartccb)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)); +// //mfaac -= c1o2 * (mfStartaac + mfStartcca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa); +// //mfaba -= c1o2 * (mfStartaba + mfStartcbc)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa); +// //mfabb -= c1o2 * (mfStartabb + mfStartcbb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa); +// //mfabc -= c1o2 * (mfStartabc + mfStartcba)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa); +// //mfaca -= c1o2 * (mfStartaca + mfStartcac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa); +// //mfacb -= c1o2 * (mfStartacb + mfStartcab)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)); +// //mfacc -= c1o2 * (mfStartacc + mfStartcaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa); +// //mfbaa -= c1o2 * (mfStartbaa + mfStartbcc)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa); +// //mfbab -= c1o2 * (mfStartbab + mfStartbcb)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa); +// //mfbac -= c1o2 * (mfStartbac + mfStartbca)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa); +// //mfbba -= c1o2 * (mfStartbba + mfStartbbc)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa); +// //mfbbb -= (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa)); +// //mfbbc -= c1o2 * (mfStartbbc + mfStartbba)+c1o9 * (c2 * mmfaac - mmfaca - mmfcaa); +// //mfbca -= c1o2 * (mfStartbca + mfStartbac)+c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa); +// //mfbcb -= c1o2 * (mfStartbcb + mfStartbab)+c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa); +// //mfbcc -= c1o2 * (mfStartbcc + mfStartbaa)+c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa); +// //mfcaa -= c1o2 * (mfStartcaa + mfStartacc)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa); +// //mfcab -= c1o2 * (mfStartcab + mfStartacb)+c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa)); +// //mfcac -= c1o2 * (mfStartcac + mfStartaca)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa); +// //mfcba -= c1o2 * (mfStartcba + mfStartabc)+c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa); +// //mfcbb -= c1o2 * (mfStartcbb + mfStartabb)+c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa); +// //mfcbc -= c1o2 * (mfStartcbc + mfStartaba)+c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa); +// //mfcca -= c1o2 * (mfStartcca + mfStartaac)+c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa); +// //mfccb -= c1o2 * (mfStartccb + mfStartaab)+c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa)); +// //mfccc -= c1o2 * (mfStartccc + mfStartaaa)+c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa); +// +// //mfhaaa =rho*( c1o2 * (mfStartaaa + mfStartccc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa)); +// //mfhaab =rho*( c1o2 * (mfStartaab + mfStartccb) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa))); +// //mfhaac =rho*( c1o2 * (mfStartaac + mfStartcca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa)); +// //mfhaba =rho*( c1o2 * (mfStartaba + mfStartcbc) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa)); +// //mfhabb =rho*( c1o2 * (mfStartabb + mfStartcbb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa)); +// //mfhabc =rho*( c1o2 * (mfStartabc + mfStartcba) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa)); +// //mfhaca =rho*( c1o2 * (mfStartaca + mfStartcac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa)); +// //mfhacb =rho*( c1o2 * (mfStartacb + mfStartcab) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa))); +// //mfhacc =rho*( c1o2 * (mfStartacc + mfStartcaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa)); +// //mfhbaa =rho*( c1o2 * (mfStartbaa + mfStartbcc) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa)); +// //mfhbab =rho*( c1o2 * (mfStartbab + mfStartbcb) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa)); +// //mfhbac =rho*( c1o2 * (mfStartbac + mfStartbca) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa)); +// //mfhbba =rho*( c1o2 * (mfStartbba + mfStartbbc) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa)); +// //mfhbbb =rho*( (mfStartbbb)-(c4o9 * (mmfaac + mmfaca + mmfcaa))); +// //mfhbbc =rho*( c1o2 * (mfStartbbc + mfStartbba) + c1o9 * (c2 * mmfaac - mmfaca - mmfcaa)); +// //mfhbca =rho*( c1o2 * (mfStartbca + mfStartbac) + c1o36 * (c2 * mmfaac - 6 * mmfabb + c2 * mmfaca - mmfcaa)); +// //mfhbcb =rho*( c1o2 * (mfStartbcb + mfStartbab) + c1o9 * (-mmfaac + c2 * mmfaca - mmfcaa)); +// //mfhbcc =rho*( c1o2 * (mfStartbcc + mfStartbaa) + c1o36 * (c2 * mmfaac + c6 * mmfabb + c2 * mmfaca - mmfcaa)); +// //mfhcaa =rho*( c1o2 * (mfStartcaa + mfStartacc) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca - c3 * mmfbab - c3 * mmfbba + mmfcaa)); +// //mfhcab =rho*( c1o2 * (mfStartcab + mfStartacb) + c1o36 * (-mmfaac + c2 * (mmfaca - c3 * mmfbba + mmfcaa))); +// //mfhcac =rho*( c1o2 * (mfStartcac + mfStartaca) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca + c3 * mmfbab - c3 * mmfbba + mmfcaa)); +// //mfhcba =rho*( c1o2 * (mfStartcba + mfStartabc) + c1o36 * (c2 * mmfaac - mmfaca - 6 * mmfbab + c2 * mmfcaa)); +// //mfhcbb =rho*( c1o2 * (mfStartcbb + mfStartabb) + c1o9 * (-mmfaac - mmfaca + c2 * mmfcaa)); +// //mfhcbc =rho*( c1o2 * (mfStartcbc + mfStartaba) + c1o36 * (c2 * mmfaac - mmfaca + c6 * mmfbab + c2 * mmfcaa)); +// //mfhcca =rho*( c1o2 * (mfStartcca + mfStartaac) + c1o72 * (mmfaac - c3 * mmfabb + mmfaca - c3 * mmfbab + c3 * mmfbba + mmfcaa)); +// //mfhccb =rho*( c1o2 * (mfStartccb + mfStartaab) + c1o36 * (-mmfaac + c2 * (mmfaca + c3 * mmfbba + mmfcaa))); +// //mfhccc =rho*( c1o2 * (mfStartccc + mfStartaaa) + c1o72 * (mmfaac + c3 * mmfabb + mmfaca + c3 * mmfbab + c3 * mmfbba + mmfcaa)); +// +// +// +// +// pStar += pStarStart*(omegaDRho-c1); +// +// mfcbb -= c2o9*pStar; +// mfbcb -= c2o9*pStar; +// mfbbc -= c2o9*pStar; +// mfccb -= c1o18*pStar; +// mfacb -= c1o18*pStar; +// mfcbc -= c1o18*pStar; +// mfabc -= c1o18*pStar; +// mfbcc -= c1o18*pStar; +// mfbac -= c1o18*pStar; +// mfccc -= c1o72*pStar; +// mfacc -= c1o72*pStar; +// mfcac -= c1o72*pStar; +// mfaac -= c1o72*pStar; +// mfabb -= c2o9*pStar; +// mfbab -= c2o9*pStar; +// mfbba -= c2o9*pStar; +// mfaab -= c1o18*pStar; +// mfcab -= c1o18*pStar; +// mfaba -= c1o18*pStar; +// mfcba -= c1o18*pStar; +// mfbaa -= c1o18*pStar; +// mfbca -= c1o18*pStar; +// mfaaa -= c1o72*pStar; +// mfcaa -= c1o72*pStar; +// mfaca -= c1o72*pStar; +// mfcca -= c1o72*pStar; +// mfbbb -= c4*c2o9*pStar; +// +// mfhbcb = rho*c2o9 * pStar; +// mfhbbc = rho*c2o9 * pStar; +// mfhcbb = rho*c2o9 * pStar; +// mfhccb = rho*c1o18 * pStar; +// mfhacb = rho*c1o18 * pStar; +// mfhcbc = rho*c1o18 * pStar; +// mfhabc = rho*c1o18 * pStar; +// mfhbcc = rho*c1o18 * pStar; +// mfhbac = rho*c1o18 * pStar; +// mfhccc = rho*c1o72 * pStar; +// mfhacc = rho*c1o72 * pStar; +// mfhcac = rho*c1o72 * pStar; +// mfhaac = rho*c1o72 * pStar; +// mfhabb = rho*c2o9 * pStar; +// mfhbab = rho*c2o9 * pStar; +// mfhbba = rho*c2o9 * pStar; +// mfhaab = rho*c1o18 * pStar; +// mfhcab = rho*c1o18 * pStar; +// mfhaba = rho*c1o18 * pStar; +// mfhcba = rho*c1o18 * pStar; +// mfhbaa = rho*c1o18 * pStar; +// mfhbca = rho*c1o18 * pStar; +// mfhaaa = rho*c1o72 * pStar; +// mfhcaa = rho*c1o72 * pStar; +// mfhaca = rho*c1o72 * pStar; +// mfhcca = rho*c1o72 * pStar; +// mfhbbb = rho*c4 * c2o9 * pStar; +// +// //mfStartbcb = c2o9 * pStarStart; +// //mfStartbbc = c2o9 * pStarStart; +// //mfStartcbb = c2o9 * pStarStart; +// //mfStartccb = c1o18 * pStarStart; +// //mfStartacb = c1o18 * pStarStart; +// //mfStartcbc = c1o18 * pStarStart; +// //mfStartabc = c1o18 * pStarStart; +// //mfStartbcc = c1o18 * pStarStart; +// //mfStartbac = c1o18 * pStarStart; +// //mfStartccc = c1o72 * pStarStart; +// //mfStartacc = c1o72 * pStarStart; +// //mfStartcac = c1o72 * pStarStart; +// //mfStartaac = c1o72 * pStarStart; +// //mfStartabb = c2o9 * pStarStart; +// //mfStartbab = c2o9 * pStarStart; +// //mfStartbba = c2o9 * pStarStart; +// //mfStartaab = c1o18 * pStarStart; +// //mfStartcab = c1o18 * pStarStart; +// //mfStartaba = c1o18 * pStarStart; +// //mfStartcba = c1o18 * pStarStart; +// //mfStartbaa = c1o18 * pStarStart; +// //mfStartbca = c1o18 * pStarStart; +// //mfStartaaa = c1o72 * pStarStart; +// //mfStartcaa = c1o72 * pStarStart; +// //mfStartaca = c1o72 * pStarStart; +// //mfStartcca = c1o72 * pStarStart; +// //mfStartbbb = c4 * c2o9 * pStarStart; +// +// //LBMReal scaleSplit = 0.5; +// //mfStartbcb = mfStartbcb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; +// //mfStartbbc = mfStartbbc*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; +// //mfStartcbb = mfStartcbb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; +// //mfStartccb = mfStartccb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartacb = mfStartacb*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartcbc = mfStartcbc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartabc = mfStartabc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartbcc = mfStartbcc*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartbac = mfStartbac*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartccc = mfStartccc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; +// //mfStartacc = mfStartacc*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; +// //mfStartcac = mfStartcac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; +// //mfStartaac = mfStartaac*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; +// //mfStartabb = mfStartabb*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; +// //mfStartbab = mfStartbab*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; +// //mfStartbba = mfStartbba*scaleSplit+(c1-scaleSplit)* c2o9 * pStarStart; +// //mfStartaab = mfStartaab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartcab = mfStartcab*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartaba = mfStartaba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartcba = mfStartcba*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartbaa = mfStartbaa*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartbca = mfStartbca*scaleSplit+(c1-scaleSplit)* c1o18 * pStarStart; +// //mfStartaaa = mfStartaaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; +// //mfStartcaa = mfStartcaa*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; +// //mfStartaca = mfStartaca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; +// //mfStartcca = mfStartcca*scaleSplit+(c1-scaleSplit)* c1o72 * pStarStart; +// //mfStartbbb = mfStartbbb*scaleSplit+(c1-scaleSplit)* c4 * c2o9 * pStarStart; +// +// +// //mfaaa -= c1o2 * (mfStartaaa + mfStartccc); +// // mfaab -= c1o2 * (mfStartaab + mfStartccb); +// // mfaac -= c1o2 * (mfStartaac + mfStartcca); +// // mfaba -= c1o2 * (mfStartaba + mfStartcbc); +// // mfabb -= c1o2 * (mfStartabb + mfStartcbb); +// // mfabc -= c1o2 * (mfStartabc + mfStartcba); +// // mfaca -= c1o2 * (mfStartaca + mfStartcac); +// // mfacb -= c1o2 * (mfStartacb + mfStartcab); +// // mfacc -= c1o2 * (mfStartacc + mfStartcaa); +// // mfbaa -= c1o2 * (mfStartbaa + mfStartbcc); +// // mfbab -= c1o2 * (mfStartbab + mfStartbcb); +// // mfbac -= c1o2 * (mfStartbac + mfStartbca); +// // mfbba -= c1o2 * (mfStartbba + mfStartbbc); +// //mfbbb -= (mfStartbbb); +// // mfbbc -= c1o2 * (mfStartbbc + mfStartbba); +// // mfbca -= c1o2 * (mfStartbca + mfStartbac); +// // mfbcb -= c1o2 * (mfStartbcb + mfStartbab); +// // mfbcc -= c1o2 * (mfStartbcc + mfStartbaa); +// // mfcaa -= c1o2 * (mfStartcaa + mfStartacc); +// // mfcab -= c1o2 * (mfStartcab + mfStartacb); +// // mfcac -= c1o2 * (mfStartcac + mfStartaca); +// // mfcba -= c1o2 * (mfStartcba + mfStartabc); +// // mfcbb -= c1o2 * (mfStartcbb + mfStartabb); +// // mfcbc -= c1o2 * (mfStartcbc + mfStartaba); +// // mfcca -= c1o2 * (mfStartcca + mfStartaac); +// // mfccb -= c1o2 * (mfStartccb + mfStartaab); +// // mfccc -= c1o2 * (mfStartccc + mfStartaaa); +// // +// //mfhaaa += rho*c1o2 * (mfStartaaa + mfStartccc); +// //mfhaab += rho*c1o2 * (mfStartaab + mfStartccb); +// //mfhaac += rho*c1o2 * (mfStartaac + mfStartcca); +// //mfhaba += rho*c1o2 * (mfStartaba + mfStartcbc); +// //mfhabb += rho*c1o2 * (mfStartabb + mfStartcbb); +// //mfhabc += rho*c1o2 * (mfStartabc + mfStartcba); +// //mfhaca += rho*c1o2 * (mfStartaca + mfStartcac); +// //mfhacb += rho*c1o2 * (mfStartacb + mfStartcab); +// //mfhacc += rho*c1o2 * (mfStartacc + mfStartcaa); +// //mfhbaa += rho*c1o2 * (mfStartbaa + mfStartbcc); +// //mfhbab += rho*c1o2 * (mfStartbab + mfStartbcb); +// //mfhbac += rho*c1o2 * (mfStartbac + mfStartbca); +// //mfhbba += rho*c1o2 * (mfStartbba + mfStartbbc); +// //mfhbbb += rho*(mfStartbbb); +// //mfhbbc += rho*c1o2 * (mfStartbbc + mfStartbba); +// //mfhbca += rho*c1o2 * (mfStartbca + mfStartbac); +// //mfhbcb += rho*c1o2 * (mfStartbcb + mfStartbab); +// //mfhbcc += rho*c1o2 * (mfStartbcc + mfStartbaa); +// //mfhcaa += rho*c1o2 * (mfStartcaa + mfStartacc); +// //mfhcab += rho*c1o2 * (mfStartcab + mfStartacb); +// //mfhcac += rho*c1o2 * (mfStartcac + mfStartaca); +// //mfhcba += rho*c1o2 * (mfStartcba + mfStartabc); +// //mfhcbb += rho*c1o2 * (mfStartcbb + mfStartabb); +// //mfhcbc += rho*c1o2 * (mfStartcbc + mfStartaba); +// //mfhcca += rho*c1o2 * (mfStartcca + mfStartaac); +// //mfhccb += rho*c1o2 * (mfStartccb + mfStartaab); +// //mfhccc += rho*c1o2 * (mfStartccc + mfStartaaa); +// //mfhbcb += c1o6 * c2o9 * deltaPP; +// //mfhbbc += c1o6 * c2o9 * deltaPP; +// //mfhcbb += c1o6 * c2o9 * deltaPP; +// //mfhccb += c1o6 * c1o18 * deltaPP; +// //mfhacb += c1o6 * c1o18 * deltaPP; +// //mfhcbc += c1o6 * c1o18 * deltaPP; +// //mfhabc += c1o6 * c1o18 * deltaPP; +// //mfhbcc += c1o6 * c1o18 * deltaPP; +// //mfhbac += c1o6 * c1o18 * deltaPP; +// //mfhccc += c1o6 * c1o72 * deltaPP; +// //mfhacc += c1o6 * c1o72 * deltaPP; +// //mfhcac += c1o6 * c1o72 * deltaPP; +// //mfhaac += c1o6 * c1o72 * deltaPP; +// //mfhabb += c1o6 * c2o9 * deltaPP; +// //mfhbab += c1o6 * c2o9 * deltaPP; +// //mfhbba += c1o6 * c2o9 * deltaPP; +// //mfhaab += c1o6 * c1o18 * deltaPP; +// //mfhcab += c1o6 * c1o18 * deltaPP; +// //mfhaba += c1o6 * c1o18 * deltaPP; +// //mfhcba += c1o6 * c1o18 * deltaPP; +// //mfhbaa += c1o6 * c1o18 * deltaPP; +// //mfhbca += c1o6 * c1o18 * deltaPP; +// //mfhaaa += c1o6 * c1o72 * deltaPP; +// //mfhcaa += c1o6 * c1o72 * deltaPP; +// //mfhaca += c1o6 * c1o72 * deltaPP; +// //mfhcca += c1o6 * c1o72 * deltaPP; +// //mfhbbb += c1o6 * c4 * c2o9 * deltaPP; +// +// +// //mfhbcb = c1o3/rho * c2o9 ; +// //mfhbbc = c1o3/rho * c2o9 ; +// //mfhcbb = c1o3/rho * c2o9 ; +// //mfhccb = c1o3/rho * c1o18 ; +// //mfhacb = c1o3/rho * c1o18 ; +// //mfhcbc = c1o3/rho * c1o18 ; +// //mfhabc = c1o3/rho * c1o18 ; +// //mfhbcc = c1o3/rho * c1o18 ; +// //mfhbac = c1o3/rho * c1o18 ; +// //mfhccc = c1o3/rho * c1o72 ; +// //mfhacc = c1o3/rho * c1o72 ; +// //mfhcac = c1o3/rho * c1o72 ; +// //mfhaac = c1o3/rho * c1o72 ; +// //mfhabb = c1o3/rho * c2o9 ; +// //mfhbab = c1o3/rho * c2o9 ; +// //mfhbba = c1o3/rho * c2o9 ; +// //mfhaab = c1o3/rho * c1o18 ; +// //mfhcab = c1o3/rho * c1o18 ; +// //mfhaba = c1o3/rho * c1o18 ; +// //mfhcba = c1o3/rho * c1o18 ; +// //mfhbaa = c1o3/rho * c1o18 ; +// //mfhbca = c1o3/rho * c1o18 ; +// //mfhaaa = c1o3/rho * c1o72 ; +// //mfhcaa = c1o3/rho * c1o72 ; +// //mfhaca = c1o3/rho * c1o72 ; +// //mfhcca = c1o3/rho * c1o72 ; +// //mfhbbb = c1/rho;//c1o3/rho * c4 * c2o9 ; +// +// +// +// //mfabb += c1o2 * c2o9 * pStar * (phi[REST] - phi[W]) * rhoToPhi / rho; +// //mfbab += c1o2 * c2o9 * pStar * (phi[REST] - phi[S]) * rhoToPhi / rho; +// //mfbba += c1o2 * c2o9 * pStar * (phi[REST] - phi[B]) * rhoToPhi / rho; +// //mfaab += c1o2 * c1o18 * pStar * (phi[REST] - phi[SW]) * rhoToPhi / rho; +// //mfcab += c1o2 * c1o18 * pStar * (phi[REST] - phi[SE]) * rhoToPhi / rho; +// //mfaba += c1o2 * c1o18 * pStar * (phi[REST] - phi[BW]) * rhoToPhi / rho; +// //mfcba += c1o2 * c1o18 * pStar * (phi[REST] - phi[BE]) * rhoToPhi / rho; +// //mfbaa += c1o2 * c1o18 * pStar * (phi[REST] - phi[BS]) * rhoToPhi / rho; +// //mfbca += c1o2 * c1o18 * pStar * (phi[REST] - phi[BN]) * rhoToPhi / rho; +// //mfaaa += c1o2 * c1o72 * pStar * (phi[REST] - phi[BSW]) * rhoToPhi / rho; +// //mfcaa += c1o2 * c1o72 * pStar * (phi[REST] - phi[BSE]) * rhoToPhi / rho; +// //mfaca += c1o2 * c1o72 * pStar * (phi[REST] - phi[BNW]) * rhoToPhi / rho; +// //mfcca += c1o2 * c1o72 * pStar * (phi[REST] - phi[BNE]) * rhoToPhi / rho; +// //mfcbb += c1o2 * c2o9 * pStar * (phi[REST] - phi[E]) * rhoToPhi / rho; +// //mfbcb += c1o2 * c2o9 * pStar * (phi[REST] - phi[N]) * rhoToPhi / rho; +// //mfbbc += c1o2 * c2o9 * pStar * (phi[REST] - phi[T]) * rhoToPhi / rho; +// //mfccb += c1o2 * c1o18 * pStar * (phi[REST] - phi[NE]) * rhoToPhi / rho; +// //mfacb += c1o2 * c1o18 * pStar * (phi[REST] - phi[NW]) * rhoToPhi / rho; +// //mfcbc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TE]) * rhoToPhi / rho; +// //mfabc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TW]) * rhoToPhi / rho; +// //mfbcc += c1o2 * c1o18 * pStar * (phi[REST] - phi[TN]) * rhoToPhi / rho; +// //mfbac += c1o2 * c1o18 * pStar * (phi[REST] - phi[TS]) * rhoToPhi / rho; +// //mfccc += c1o2 * c1o72 * pStar * (phi[REST] - phi[TNE]) * rhoToPhi / rho; +// //mfacc += c1o2 * c1o72 * pStar * (phi[REST] - phi[TNW]) * rhoToPhi / rho; +// //mfcac += c1o2 * c1o72 * pStar * (phi[REST] - phi[TSE]) * rhoToPhi / rho; +// //mfaac += c1o2 * c1o72 * pStar * (phi[REST] - phi[TSW]) * rhoToPhi / rho; +// +// /////////////// +// //mfabb += (pBefore-pStar) * c2o9 ; +// //mfbab += (pBefore-pStar) * c2o9 ; +// //mfbba += (pBefore-pStar) * c2o9 ; +// //mfaab += (pBefore-pStar) * c1o18 ; +// //mfcab += (pBefore-pStar) * c1o18 ; +// //mfaba += (pBefore-pStar) * c1o18 ; +// //mfcba += (pBefore-pStar) * c1o18 ; +// //mfbaa += (pBefore-pStar) * c1o18 ; +// //mfbca += (pBefore-pStar) * c1o18 ; +// //mfaaa += (pBefore-pStar) * c1o72 ; +// //mfcaa += (pBefore-pStar) * c1o72 ; +// //mfaca += (pBefore-pStar) * c1o72 ; +// //mfcca += (pBefore-pStar) * c1o72 ; +// //mfcbb += (pBefore-pStar) * c2o9 ; +// //mfbcb += (pBefore-pStar) * c2o9 ; +// //mfbbc += (pBefore-pStar) * c2o9 ; +// //mfccb += (pBefore-pStar) * c1o18 ; +// //mfacb += (pBefore-pStar) * c1o18 ; +// //mfcbc += (pBefore-pStar) * c1o18 ; +// //mfabc += (pBefore-pStar) * c1o18 ; +// //mfbcc += (pBefore-pStar) * c1o18 ; +// //mfbac += (pBefore-pStar) * c1o18 ; +// //mfccc += (pBefore-pStar) * c1o72 ; +// //mfacc += (pBefore-pStar) * c1o72 ; +// //mfcac += (pBefore-pStar) * c1o72 ; +// //mfaac += (pBefore-pStar) * c1o72 ; +// //mfbbb += (pBefore-pStar) * 8.0 / 9.0; +// +// //mfabb = (pBefore ) * c2o9; +// //mfbab = (pBefore ) * c2o9; +// //mfbba = (pBefore ) * c2o9; +// //mfaab = (pBefore ) * c1o16; +// //mfcab = (pBefore ) * c1o16; +// //mfaba = (pBefore ) * c1o16; +// //mfcba = (pBefore ) * c1o16; +// //mfbaa = (pBefore ) * c1o16; +// //mfbca = (pBefore ) * c1o16; +// //mfaaa = (pBefore ) * c1o72; +// //mfcaa = (pBefore ) * c1o72; +// //mfaca = (pBefore ) * c1o72; +// //mfcca = (pBefore ) * c1o72; +// //mfcbb = (pBefore ) * c2o9; +// //mfbcb = (pBefore ) * c2o9; +// //mfbbc = (pBefore ) * c2o9; +// //mfccb = (pBefore ) * c1o16; +// //mfacb = (pBefore ) * c1o16; +// //mfcbc = (pBefore ) * c1o16; +// //mfabc = (pBefore ) * c1o16; +// //mfbcc = (pBefore ) * c1o16; +// //mfbac = (pBefore ) * c1o16; +// //mfccc = (pBefore ) * c1o72; +// //mfacc = (pBefore ) * c1o72; +// //mfcac = (pBefore ) * c1o72; +// //mfaac = (pBefore ) * c1o72; +// //mfbbb = (pBefore ) * 8.0 / 9.0; +// /////////////////// +// +// ////////////////////////////////////////////////////////////////////////// +// //proof correctness +// ////////////////////////////////////////////////////////////////////////// +// //#ifdef PROOF_CORRECTNESS +// LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +// + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) +// + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; +// // //LBMReal dif = fabs(drho - rho_post); +// // LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post; +// //#ifdef SINGLEPRECISION +// // if (dif > 10.0E-7 || dif < -10.0E-7) +// //#else +// // if (dif > 10.0E-15 || dif < -10.0E-15) +// //#endif +// // { +// // UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post) +// // + " dif=" + UbSystem::toString(dif) +// // + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// // //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); +// // //exit(EXIT_FAILURE); +// // } +// //#endif +// +// if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post)) +// UB_THROW(UbException( +// UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," + +// UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// +// ////////////////////////////////////////////////////////////////////////// +// //write distribution +// ////////////////////////////////////////////////////////////////////////// +// (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca ;//* rho * c1o3; +// (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac ;//* rho * c1o3; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac ;//* rho * c1o3; +// +// (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3; +// +// +// (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3) = mfhabb;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3) = mfhbab;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3) = mfhbba;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3) = mfhaab;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3) = mfhcab;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3) = mfhaba;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3) = mfhcba;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3) = mfhbaa;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3) = mfhbca;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3) = mfhaaa;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3) = mfhcaa;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3) = mfhaca;//* rho * c1o3; +// (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfhcca;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3) = mfhcbb;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3) = mfhbcb;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p) = mfhbbc;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3) = mfhccb;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3) = mfhacb;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p) = mfhcbc;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p) = mfhabc;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p) = mfhbcc;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p) = mfhbac;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfhccc;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfhacc;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfhcac;//* rho * c1o3; +// (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p) = mfhaac;//* rho * c1o3; +// +// (*this->zeroDistributionsH2)(x1, x2, x3) = mfhbbb;// *rho* c1o3; +// +// // !Old Kernel +/////////////////////// P H A S E - F I E L D S O L V E R +////////////////////////////////////////////// +///////CUMULANT PHASE-FIELD +// LBMReal omegaD =1.0/( 3.0 * mob + 0.5); +// { +// mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); +// mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); +// mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); +// mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); +// mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); +// mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); +// mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); +// mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); +// mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); +// mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); +// mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); +// mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); +// mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); +// mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); +// mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); +// mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); +// mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); +// mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); +// mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); +// mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); +// mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); +// mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); +// mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); +// mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); +// mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); +// mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); +// mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); +// +// +// //////////////////////////////////////////////////////////////////////////////////// +// //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref +// //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> +// //! +// //////////////////////////////////////////////////////////////////////////////////// +// // second component +// LBMReal concentration = +// ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + +// (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + +// ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal oneMinusRho = c1- concentration; +// +// LBMReal cx = +// ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + +// (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + +// (mfcbb - mfabb)); +// LBMReal cy = +// ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + +// (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + +// (mfbcb - mfbab)); +// LBMReal cz = +// ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + +// (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + +// (mfbbc - mfbba)); +// +// //////////////////////////////////////////////////////////////////////////////////// +// // calculate the square of velocities for this lattice node +// LBMReal cx2 = cx * cx; +// LBMReal cy2 = cy * cy; +// LBMReal cz2 = cz * cz; +// //////////////////////////////////////////////////////////////////////////////////// +// //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref +// //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> +// //! see also Eq. (6)-(14) in \ref +// //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> +// //! +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); +// +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); +// forwardChimera(mfaab, mfabb, mfacb, cy, cy2); +// forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); +// forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); +// forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); +// forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); +// forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); +// forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); +// +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); +// forwardChimera(mfaba, mfbba, mfcba, cx, cx2); +// forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); +// forwardChimera(mfaab, mfbab, mfcab, cx, cx2); +// forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); +// forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); +// forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); +// forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); +// forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); +// +// //////////////////////////////////////////////////////////////////////////////////// +// //! - experimental Cumulant ... to be published ... hopefully +// //! +// +// // linearized orthogonalization of 3rd order central moments +// LBMReal Mabc = mfabc - mfaba * c1o3; +// LBMReal Mbca = mfbca - mfbaa * c1o3; +// LBMReal Macb = mfacb - mfaab * c1o3; +// LBMReal Mcba = mfcba - mfaba * c1o3; +// LBMReal Mcab = mfcab - mfaab * c1o3; +// LBMReal Mbac = mfbac - mfbaa * c1o3; +// // linearized orthogonalization of 5th order central moments +// LBMReal Mcbc = mfcbc - mfaba * c1o9; +// LBMReal Mbcc = mfbcc - mfbaa * c1o9; +// LBMReal Mccb = mfccb - mfaab * c1o9; +// +// //31.05.2022 addaptive mobility +// //omegaD = c1 + (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) / (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration)) + fabs((1.0 - concentration) * (concentration)) * c1o6 * oneOverInterfaceScale+1.0e-200); +// //omegaD = c2 * (concentration * (concentration - c1)) / (-c6 * (sqrt((cx - vvx * concentration) * (cx - vvx * concentration) + (cy - vvy * concentration) * (cy - vvy * concentration) + (cz - vvz * concentration) * (cz - vvz * concentration))) + (concentration * (concentration - c1))+1.0e-200); +// // collision of 1st order moments +// cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + +// normX1 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale; +// cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + +// normX2 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale; +// cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + +// normX3 * (c1 - 0.5 * omegaD) * (1.0 - concentration) * (concentration) * c1o3 * oneOverInterfaceScale; +// +// cx2 = cx * cx; +// cy2 = cy * cy; +// cz2 = cz * cz; +// +// // equilibration of 2nd order moments +// mfbba = zeroReal; +// mfbab = zeroReal; +// mfabb = zeroReal; +// +// mfcaa = c1o3 * concentration; +// mfaca = c1o3 * concentration; +// mfaac = c1o3 * concentration; +// +// // equilibration of 3rd order moments +// Mabc = zeroReal; +// Mbca = zeroReal; +// Macb = zeroReal; +// Mcba = zeroReal; +// Mcab = zeroReal; +// Mbac = zeroReal; +// mfbbb = zeroReal; +// +// // from linearized orthogonalization 3rd order central moments to central moments +// mfabc = Mabc + mfaba * c1o3; +// mfbca = Mbca + mfbaa * c1o3; +// mfacb = Macb + mfaab * c1o3; +// mfcba = Mcba + mfaba * c1o3; +// mfcab = Mcab + mfaab * c1o3; +// mfbac = Mbac + mfbaa * c1o3; +// +// // equilibration of 4th order moments +// mfacc = c1o9 * concentration; +// mfcac = c1o9 * concentration; +// mfcca = c1o9 * concentration; +// +// mfcbb = zeroReal; +// mfbcb = zeroReal; +// mfbbc = zeroReal; +// +// // equilibration of 5th order moments +// Mcbc = zeroReal; +// Mbcc = zeroReal; +// Mccb = zeroReal; +// +// // from linearized orthogonalization 5th order central moments to central moments +// mfcbc = Mcbc + mfaba * c1o9; +// mfbcc = Mbcc + mfbaa * c1o9; +// mfccb = Mccb + mfaab * c1o9; +// +// // equilibration of 6th order moment +// mfccc = c1o27 * concentration; +// +// //////////////////////////////////////////////////////////////////////////////////// +// //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in +// //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> +// //! see also Eq. (88)-(96) in +// //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> +// //! +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); +// backwardChimera(mfaba, mfbba, mfcba, cx, cx2); +// backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); +// backwardChimera(mfaab, mfbab, mfcab, cx, cx2); +// backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); +// backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); +// backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); +// backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); +// backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); +// +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); +// backwardChimera(mfaab, mfabb, mfacb, cy, cy2); +// backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); +// backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); +// backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); +// backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); +// backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); +// +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); +// backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); +// +// +// +// (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3) = mfabb; +// (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3) = mfbab; +// (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3) = mfbba; +// (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; +// (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; +// (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; +// (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; +// (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; +// (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; +// (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; +// (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; +// (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; +// (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; +// +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3 ) = mfcbb; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3 ) = mfbcb; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3 ) = mfccb; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3 ) = mfacb; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; +// (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; +// +// (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb; +// +// +// +// +// } +// } +// } +// } +// } +//} +//////////////////////////////////////////////////////////////////////////// +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi() +//{ +// using namespace D3Q27System; +// return 3.0* ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) + (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) + (phi[BNE] - phi[TSW]))) +// + WEIGTH[NE] * (((phi[TE] - phi[BW]) + (phi[BE] - phi[TW])) + ((phi[SE] - phi[NW]) + (phi[NE] - phi[SW])))) + +// +WEIGTH[N] * (phi[E] - phi[W])); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi() +//{ +// using namespace D3Q27System; +// return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[BNE] - phi[TSW])- (phi[TSE] - phi[BNW]))) +// + WEIGTH[NE] * (((phi[TN] - phi[BS]) + (phi[BN] - phi[TS])) + ((phi[NE] - phi[SW])- (phi[SE] - phi[NW])))) + +// +WEIGTH[N] * (phi[N] - phi[S])); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi() +//{ +// using namespace D3Q27System; +// return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) - (phi[BNE] - phi[TSW]))) +// + WEIGTH[NE] * (((phi[TE] - phi[BW]) - (phi[BE] - phi[TW])) + ((phi[TS] - phi[BN]) + (phi[TN] - phi[BS])))) + +// +WEIGTH[N] * (phi[T] - phi[B])); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_rhoInv(LBMReal rhoL,LBMReal rhoDIV) +//{ +// using namespace D3Q27System; +// return 3.0 * ((WEIGTH[TNE] * (((1.0/(rhoL+rhoDIV*phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) + (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW])) + (1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW])))) +// + WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TE]) - 1.0 / (rhoL + rhoDIV * phi[BW])) + (1.0 / (rhoL + rhoDIV * phi[BE]) - 1.0 / (rhoL + rhoDIV * phi[TW]))) + ((1.0 / (rhoL + rhoDIV * phi[SE]) - 1.0 / (rhoL + rhoDIV * phi[NW])) + (1.0 / (rhoL + rhoDIV * phi[NE]) - 1.0 / (rhoL + rhoDIV * phi[SW]))))) + +// +WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[E]) - 1.0 / (rhoL + rhoDIV * phi[W]))); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_rhoInv(LBMReal rhoL,LBMReal rhoDIV) +//{ +// using namespace D3Q27System; +// return 3.0 * ((WEIGTH[TNE] * (((1.0 / (rhoL + rhoDIV * phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) - (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW])) - (1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW])))) +// + WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TN]) - 1.0 / (rhoL + rhoDIV * phi[BS])) + (1.0 / (rhoL + rhoDIV * phi[BN]) - 1.0 / (rhoL + rhoDIV * phi[TS]))) + ((1.0 / (rhoL + rhoDIV * phi[NE]) - 1.0 / (rhoL + rhoDIV * phi[SW])) - (1.0 / (rhoL + rhoDIV * phi[SE]) - 1.0 / (rhoL + rhoDIV * phi[NW]))))) + +// +WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[N]) - 1.0 / (rhoL + rhoDIV * phi[S]))); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_rhoInv(LBMReal rhoL, LBMReal rhoDIV) +//{ +// using namespace D3Q27System; +// return 3.0 * ((WEIGTH[TNE] * (((1.0 / (rhoL + rhoDIV * phi[TNE]) - 1.0 / (rhoL + rhoDIV * phi[BSW])) - (1.0 / (rhoL + rhoDIV * phi[BSE]) - 1.0 / (rhoL + rhoDIV * phi[TNW]))) + ((1.0 / (rhoL + rhoDIV * phi[TSE]) - 1.0 / (rhoL + rhoDIV * phi[BNW])) - (1.0 / (rhoL + rhoDIV * phi[BNE]) - 1.0 / (rhoL + rhoDIV * phi[TSW])))) +// + WEIGTH[NE] * (((1.0 / (rhoL + rhoDIV * phi[TE]) - 1.0 / (rhoL + rhoDIV * phi[BW])) - (1.0 / (rhoL + rhoDIV * phi[BE]) - 1.0 / (rhoL + rhoDIV * phi[TW]))) + ((1.0 / (rhoL + rhoDIV * phi[TS]) - 1.0 / (rhoL + rhoDIV * phi[BN])) + (1.0 / (rhoL + rhoDIV * phi[TN]) - 1.0 / (rhoL + rhoDIV * phi[BS]))))) + +// +WEIGTH[N] * (1.0 / (rhoL + rhoDIV * phi[T]) - 1.0 / (rhoL + rhoDIV * phi[B]))); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX1_phi2() +//{ +// using namespace D3Q27System; +// return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) + (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) + (phi2[BNE] - phi2[TSW]))) +// + WEIGTH[NE] * (((phi2[TE] - phi2[BW]) + (phi2[BE] - phi2[TW])) + ((phi2[SE] - phi2[NW]) + (phi2[NE] - phi2[SW])))) + +// +WEIGTH[N] * (phi2[E] - phi2[W])); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX2_phi2() +//{ +// using namespace D3Q27System; +// return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[BNE] - phi2[TSW]) - (phi2[TSE] - phi2[BNW]))) +// + WEIGTH[NE] * (((phi2[TN] - phi2[BS]) + (phi2[BN] - phi2[TS])) + ((phi2[NE] - phi2[SW]) - (phi2[SE] - phi2[NW])))) + +// +WEIGTH[N] * (phi2[N] - phi2[S])); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::gradX3_phi2() +//{ +// using namespace D3Q27System; +// return 3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW]))) +// + WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) + +// +WEIGTH[N] * (phi2[T] - phi2[B])); +//} +// +//LBMReal MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::nabla2_phi() +//{ +// using namespace D3Q27System; +// LBMReal sum = 0.0; +// sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000]))) +// + (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000])))); +// sum += WEIGTH[DIR_0PP] * ( +// (((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000]))) +// + (((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000]))) +// + (((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000]))) +// ); +// sum += WEIGTH[DIR_00P] * ( +// ((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000])) +// + ((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000])) +// + ((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000])) +// ); +// +// +// return 6.0 * sum; +//} +// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::computePhasefield() +//{ +// using namespace D3Q27System; +// SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions(); +// +// int minX1 = ghostLayerWidth; +// int minX2 = ghostLayerWidth; +// int minX3 = ghostLayerWidth; +// int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth; +// int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth; +// int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth; +// +// //------------- Computing the phase-field ------------------ +// for (int x3 = minX3; x3 < maxX3; x3++) { +// for (int x2 = minX2; x2 < maxX2; x2++) { +// for (int x1 = minX1; x1 < maxX1; x1++) { +// // if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3)) +// { +// int x1p = x1 + 1; +// int x2p = x2 + 1; +// int x3p = x3 + 1; +// +// h[E] = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); +// h[N] = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); +// h[T] = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); +// h[NE] = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); +// h[NW] = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); +// h[TE] = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); +// h[TW] = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); +// h[TN] = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); +// h[TS] = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); +// h[TNE] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); +// h[TNW] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); +// h[TSE] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); +// h[TSW] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); +// +// h[W] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); +// h[S] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); +// h[B] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); +// h[SW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); +// h[SE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); +// h[BW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); +// h[BE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); +// h[BS] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); +// h[BN] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); +// h[BSW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); +// h[BSE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); +// h[BNW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); +// h[BNE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); +// +// h[REST] = (*this->zeroDistributionsH1)(x1, x2, x3); +// } +// } +// } +// } +//} +// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, +// int x3) +//{ +// using namespace D3Q27System; +// +// SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); +// +// phi[REST] = (*ph)(x1, x2, x3); +// +// +// for (int k = FSTARTDIR; k <= FENDDIR; k++) { +// +// if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { +// phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); +// } else { +// //phi[k] = (*ph)(x1 , x2, x3 );// neutral wetting +// phi[k] = 0.0;//unwetting +// } +// } +//} +// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, +// int x3) +//{ +// using namespace D3Q27System; +// +// SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); +// +// phi2[REST] = (*ph)(x1, x2, x3); +// +// +// for (int k = FSTARTDIR; k <= FENDDIR; k++) { +// +// if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { +// phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); +// } +// else { +// phi2[k] = 0.05; +// } +// } +//} +// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::swapDistributions() +//{ +// LBMKernel::swapDistributions(); +// dataSet->getHdistributions()->swap(); +// dataSet->getH2distributions()->swap(); +//} +// +//void MultiphaseSimpleVelocityBaseExternalPressureLBMKernel::initForcing() +//{ +// muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); +// muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); +// muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); +// +// muDeltaT = deltaT; +// +// muForcingX1.DefineVar("dt", &muDeltaT); +// muForcingX2.DefineVar("dt", &muDeltaT); +// muForcingX3.DefineVar("dt", &muDeltaT); +// +// muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); +// +// muForcingX1.DefineVar("nu", &muNu); +// muForcingX2.DefineVar("nu", &muNu); +// muForcingX3.DefineVar("nu", &muNu); +// +// muForcingX1.DefineVar("rho",&muRho); +// muForcingX2.DefineVar("rho",&muRho); +// muForcingX3.DefineVar("rho",&muRho); +// +//} diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h new file mode 100644 index 0000000000000000000000000000000000000000..c5bc3560408698d4e83a2f45fcbeaf1b5b37317d --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h @@ -0,0 +1,125 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseSimpleVelocityBaseExternalPressureLBMKernel.h +//! \ingroup LBMKernel +//! \author M. Geier, K. Kutscher, Hesameddin Safari +//======================================================================================= + +#ifndef MultiphaseSimpleVelocityBaseExternalPressureLBMKernel_H +#define MultiphaseSimpleVelocityBaseExternalPressureLBMKernel_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +//! \brief Multiphase Cascaded Cumulant LBM kernel. +//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model +//! \author M. Geier, K. Kutscher, Hesameddin Safari +class MultiphaseSimpleVelocityBaseExternalPressureLBMKernel : public LBMKernel +{ +public: + MultiphaseSimpleVelocityBaseExternalPressureLBMKernel(); + virtual ~MultiphaseSimpleVelocityBaseExternalPressureLBMKernel(void) = default; + void calculate(int step) override; + SPtr<LBMKernel> clone() override; + + + ///refactor + //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure; + + + double getCalculationTime() override { return .0; } +protected: + virtual void initDataSet(); + void swapDistributions() override; + + void initForcing(); + + void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + + LBMReal f1[D3Q27System::ENDF+1]; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH1; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH2; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH2; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH2; + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr p1Old; + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseFieldOld; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU; + + LBMReal h [D3Q27System::ENDF+1]; + LBMReal h2[D3Q27System::ENDF + 1]; + LBMReal g [D3Q27System::ENDF+1]; + LBMReal phi[D3Q27System::ENDF+1]; + LBMReal phi2[D3Q27System::ENDF + 1]; + LBMReal pr1[D3Q27System::ENDF+1]; + LBMReal phi_cutoff[D3Q27System::ENDF+1]; + + LBMReal gradX1_phi(); + LBMReal gradX2_phi(); + LBMReal gradX3_phi(); + LBMReal gradX1_rhoInv(LBMReal rhoL, LBMReal rhoDIV); + LBMReal gradX2_rhoInv(LBMReal rhoL, LBMReal rhoDIV); + LBMReal gradX3_rhoInv(LBMReal rhoL, LBMReal rhoDIV); + LBMReal gradX1_phi2(); + LBMReal gradX2_phi2(); + LBMReal gradX3_phi2(); + void computePhasefield(); + void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3); + void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3); + + LBMReal nabla2_phi(); + + mu::value_type muX1,muX2,muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + mu::value_type muRho; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; +}; + +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp index 102af60353833207231451f55acda91d03efbdd4..db1397374771efd414bdeccbefe605b810cf449b 100644 --- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.cpp @@ -289,6 +289,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) //-1 0 1 findNeighbors(phaseField, x1, x2, x3); + findNeighbors2(phaseField2, x1, x2, x3); LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); @@ -328,72 +329,71 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) LBMReal dX2_phi = gradX2_phi(); LBMReal dX3_phi = gradX3_phi(); - LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9; - LBMReal normX1 = dX1_phi/denom; - LBMReal normX2 = dX2_phi/denom; - LBMReal normX3 = dX3_phi/denom; + LBMReal dX1_phi2 = gradX1_phi2(); + LBMReal dX2_phi2 = gradX2_phi2(); + LBMReal dX3_phi2 = gradX3_phi2(); - collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[REST] - phiH) / (phiH - phiL); + LBMReal denom2 = sqrt(dX1_phi * dX1_phi+ dX1_phi2 * dX1_phi2 + dX2_phi * dX2_phi + dX2_phi2 * dX2_phi2 + dX3_phi * dX3_phi+ dX3_phi2 * dX3_phi2) + 1e-9; + LBMReal normX1 = (dX1_phi-dX1_phi2)/denom2; + LBMReal normX2 = (dX2_phi-dX2_phi2)/denom2; + LBMReal normX3 = (dX3_phi-dX3_phi2)/denom2; - LBMReal mu = 2 * beta * phi[REST] * (phi[REST] - 1) * (2 * phi[REST] - 1) - kappa * nabla2_phi(); + //LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9; + //LBMReal normX1 = dX1_phi / denom; + //LBMReal normX2 = dX2_phi / denom; + //LBMReal normX3 = dX3_phi / denom; - //----------- Calculating Macroscopic Values ------------- - LBMReal rho = rhoH + rhoToPhi * (phi[REST] - phiH); - if (withForcing) { - // muX1 = static_cast<double>(x1-1+ix1*maxX1); - // muX2 = static_cast<double>(x2-1+ix2*maxX2); - // muX3 = static_cast<double>(x3-1+ix3*maxX3); - forcingX1 = muForcingX1.Eval(); - forcingX2 = muForcingX2.Eval(); - forcingX3 = muForcingX3.Eval(); + collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL); + + + LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(); - LBMReal rho_m = 1.0 / densityRatio; - forcingX1 = forcingX1 * (rho - rho_m); - forcingX2 = forcingX2 * (rho - rho_m); - forcingX3 = forcingX3 * (rho - rho_m); + //----------- Calculating Macroscopic Values ------------- + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); ////Incompressible Kernal - mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3)/rho; - mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) / rho; - mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) / rho; - mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) / rho; - mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) / rho; - mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) / rho; - mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) / rho; - mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) / rho; - mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) / rho; - mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) / rho; - mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) / rho; - mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) / rho; - mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) / rho; - - mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) / rho; - mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) / rho; - mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) / rho; - mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) / rho; - mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) / rho; - mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) / rho; - mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) / rho; - mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) / rho; - mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) / rho; - mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) / rho; - mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) / rho; - mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) / rho; - mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) / rho; - - mfbbb = (*this->zeroDistributionsF)(x1, x2, x3) / rho; + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) / rho * c3; + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) / rho * c3; + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) / rho * c3; + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) / rho * c3; + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) / rho * c3; + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) / rho * c3; + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) / rho * c3; + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) / rho * c3; + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) / rho * c3; + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) / rho * c3; + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) / rho * c3; + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) / rho * c3; + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) / rho * c3; + + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) / rho * c3; + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) / rho * c3; + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) / rho * c3; + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) / rho * c3; + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) / rho * c3; + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) / rho * c3; + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) / rho * c3; + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) / rho * c3; + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) / rho * c3; + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) / rho * c3; + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) / rho * c3; + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) / rho * c3; + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) / rho * c3; + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3) / rho * c3; + LBMReal m0, m1, m2; LBMReal rhoRef=c1; //LBMReal - LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) - + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) - + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + // LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + // + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + // + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + @@ -405,11 +405,240 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + (mfbbc - mfbba))/rhoRef; + + if (withForcing) { + // muX1 = static_cast<double>(x1-1+ix1*maxX1); + // muX2 = static_cast<double>(x2-1+ix2*maxX2); + // muX3 = static_cast<double>(x3-1+ix3*maxX3); + + forcingX1 = muForcingX1.Eval(); + forcingX2 = muForcingX2.Eval(); + forcingX3 = muForcingX3.Eval(); + + //LBMReal rho_m = 1.0 / densityRatio; + //forcingX1 = forcingX1 * (rho - rho_m); + //forcingX2 = forcingX2 * (rho - rho_m); + //forcingX3 = forcingX3 * (rho - rho_m); + vvx += forcingX1 * deltaT * 0.5; // X + vvy += forcingX2 * deltaT * 0.5; // Y + vvz += forcingX3 * deltaT * 0.5; // Z + + } + + ///surface tension force vvx += mu * dX1_phi*c1o2; - vvy += mu * dX2_phi * c1o2; + vvy += mu * dX2_phi * c1o2 ; vvz += mu * dX3_phi * c1o2; + //////classic source term + ///----Classic source term 8.4.2021 + + LBMReal vvxF, vvyF, vvzF; + vvxF = vvx;//-2*c1o24 * lap_vx;// + vvyF = vvy;//-2*c1o24 * lap_vy;// + vvzF = vvz;//-2*c1o24 * lap_vz;// + +// vvxF = 1.2* vvx- 0.2*0.5 * ((*velocityX)(x1 - 1, x2, x3) + (*velocityX)(x1 + 1, x2, x3)); +// vvyF = 1.2 *vvy- 0.2*0.5* ((*velocityY)(x1 , x2-1, x3) + (*velocityY)(x1 , x2+1, x3)); +// vvzF = 1.2 *vvz-0.2*0.5* ((*velocityZ)(x1 , x2, x3-1) + (*velocityZ)(x1 , x2, x3+1)); + //if (vvxF != vvx) { + // vvxF = vvxF; + //} + LBMReal weightGrad = 1.0;// -denom * denom / (denom * denom + 0.0001 * 0.001); + LBMReal dX1_phiF = dX1_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX1; + LBMReal dX2_phiF = dX2_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX2; + LBMReal dX3_phiF = dX3_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * normX3; + + //dX1_phiF *= 1.2; + //dX2_phiF *= 1.2; + //dX3_phiF *= 1.2; + + //LBMReal gradFD = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi); + //LBMReal gradPhi = (1.0 - phi[REST]) * (phi[REST]); + //gradPhi = (gradPhi > gradFD) ? gradPhi : gradFD; + //dX1_phiF = gradPhi * normX1; + // dX2_phiF = gradPhi * normX2; + // dX3_phiF = gradPhi * normX3; + + LBMReal ux2; + LBMReal uy2; + LBMReal uz2; + ux2 = vvxF * vvxF; + uy2 = vvyF * vvyF; + uz2 = vvzF * vvzF; + LBMReal forcingTerm[D3Q27System::ENDF + 1]; + for (int dir = FSTARTDIR; dir <= FENDDIR; dir++) { + LBMReal velProd = DX1[dir] * vvxF + DX2[dir] * vvyF + DX3[dir] * vvzF; + LBMReal velSq1 = velProd * velProd; + LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + (4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2))); + + //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi; + + //forcingTerm[dir] = + // (-vvxF) * (fac1 * dX1_phiF) + + // (-vvyF) * (fac1 * dX2_phiF) + + // (-vvzF) * (fac1 * dX3_phiF) + + // (DX1[dir]) * (fac1 * dX1_phiF) + + // (DX2[dir]) * (fac1 * dX2_phiF) + + // (DX3[dir]) * (fac1 * dX3_phiF); + + + LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 ; + + forcingTerm[dir] = + (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)) + + (DX1[dir]) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + (DX2[dir]) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + (DX3[dir]) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)); + + + + } + + LBMReal gamma = WEIGTH[DIR_000] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); + LBMReal fac1 = (gamma - WEIGTH[DIR_000]) * c1o3 * rhoToPhi; + forcingTerm[DIR_000] = (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)); + + //////// + // LBMReal divAfterSource= + //( mfcbb + 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF) *(vvzF)-1)+ + //( mfbcb + 3.0 * (0.5 * forcingTerm[N]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfbbc + 3.0 * (0.5 * forcingTerm[T]) / rho ) *((vvxF) *(vvxF) +(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfccb + 3.0 * (0.5 * forcingTerm[NE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfacb + 3.0 * (0.5 * forcingTerm[NW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfcbc + 3.0 * (0.5 * forcingTerm[TE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfabc + 3.0 * (0.5 * forcingTerm[TW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfbcc + 3.0 * (0.5 * forcingTerm[TN]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfbac + 3.0 * (0.5 * forcingTerm[TS]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfccc + 3.0 * (0.5 * forcingTerm[TNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfacc + 3.0 * (0.5 * forcingTerm[TNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfcac + 3.0 * (0.5 * forcingTerm[TSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfaac + 3.0 * (0.5 * forcingTerm[TSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfabb + 3.0 * (0.5 * forcingTerm[W]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF) *(vvzF)-1)+ + //( mfbab + 3.0 * (0.5 * forcingTerm[S]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfbba + 3.0 * (0.5 * forcingTerm[B]) / rho ) *((vvxF) *(vvxF) +(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfaab + 3.0 * (0.5 * forcingTerm[SW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfcab + 3.0 * (0.5 * forcingTerm[SE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfaba + 3.0 * (0.5 * forcingTerm[BW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfcba + 3.0 * (0.5 * forcingTerm[BE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfbaa + 3.0 * (0.5 * forcingTerm[BS]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfbca + 3.0 * (0.5 * forcingTerm[BN]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfaaa + 3.0 * (0.5 * forcingTerm[BSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfcaa + 3.0 * (0.5 * forcingTerm[BSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfaca + 3.0 * (0.5 * forcingTerm[BNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfcca + 3.0 * (0.5 * forcingTerm[BNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfbbb + 3.0 * (0.5 * forcingTerm[REST]) / rho)*((vvxF)*(vvxF)+(vvyF)*(vvyF)+(vvzF)*(vvzF)-1); + + // LBMReal divBeforeSource = + // (mfcbb) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) + + // (mfbcb) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfbbc) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfccb) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfacb) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfcbc) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfabc) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfbcc) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfbac) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfccc) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfacc) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfcac) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfaac) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfabb) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) + + // (mfbab) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfbba) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfaab) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfcab) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfaba) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfcba) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfbaa) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfbca) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfaaa) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfcaa) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfaca) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfcca) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfbbb) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF) * (vvzF)-1); + //if (divAfterSource - divBeforeSource != 0 && phi[REST]>0.0001 && phi[REST]<0.999) { + // std::cout << phi[REST]<<" "<< divAfterSource << " " << divBeforeSource <<" "<< divAfterSource/ divBeforeSource << std::endl; + //} + + //if (fabs(divAfterSource - divBeforeSource)/(fabs(divAfterSource) + fabs(divBeforeSource)+1e-10) > 1e-5) { + // LBMReal scaleDiv =0.95+(1-0.95)* (divBeforeSource) / (divBeforeSource - divAfterSource); + + // forcingTerm[DIR_P00] *=scaleDiv; + // forcingTerm[N] *=scaleDiv; + // forcingTerm[T] *=scaleDiv; + // forcingTerm[NE] *=scaleDiv; + // forcingTerm[NW] *=scaleDiv; + // forcingTerm[TE] *=scaleDiv; + // forcingTerm[TW] *=scaleDiv; + // forcingTerm[TN] *=scaleDiv; + // forcingTerm[TS] *=scaleDiv; + // forcingTerm[TNE] *=scaleDiv; + // forcingTerm[TNW] *=scaleDiv; + // forcingTerm[TSE] *=scaleDiv; + // forcingTerm[TSW] *=scaleDiv; + // forcingTerm[W] *=scaleDiv; + // forcingTerm[S] *=scaleDiv; + // forcingTerm[B] *=scaleDiv; + // forcingTerm[SW] *=scaleDiv; + // forcingTerm[SE] *=scaleDiv; + // forcingTerm[BW] *=scaleDiv; + // forcingTerm[BE] *=scaleDiv; + // forcingTerm[BS] *=scaleDiv; + // forcingTerm[BN] *=scaleDiv; + // forcingTerm[BSW] *=scaleDiv; + // forcingTerm[BSE] *=scaleDiv; + // forcingTerm[BNW] *=scaleDiv; + // forcingTerm[BNE] *=scaleDiv; + // forcingTerm[REST] *=scaleDiv; + //} + //////// + + + mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + mfbcb += 3.0 * (0.5 * forcingTerm[DIR_0P0]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + mfbbc += 3.0 * (0.5 * forcingTerm[DIR_00P]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + mfccb += 3.0 * (0.5 * forcingTerm[DIR_PP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + mfacb += 3.0 * (0.5 * forcingTerm[DIR_MP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + mfcbc += 3.0 * (0.5 * forcingTerm[DIR_P0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + mfabc += 3.0 * (0.5 * forcingTerm[DIR_M0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + mfbcc += 3.0 * (0.5 * forcingTerm[DIR_0PP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + mfbac += 3.0 * (0.5 * forcingTerm[DIR_0MP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + mfccc += 3.0 * (0.5 * forcingTerm[DIR_PPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + mfacc += 3.0 * (0.5 * forcingTerm[DIR_MPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + mfcac += 3.0 * (0.5 * forcingTerm[DIR_PMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + mfaac += 3.0 * (0.5 * forcingTerm[DIR_MMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + mfabb += 3.0 * (0.5 * forcingTerm[DIR_M00]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + mfbab += 3.0 * (0.5 * forcingTerm[DIR_0M0]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + mfbba += 3.0 * (0.5 * forcingTerm[DIR_00M]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + mfaab += 3.0 * (0.5 * forcingTerm[DIR_MM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + mfcab += 3.0 * (0.5 * forcingTerm[DIR_PM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + mfaba += 3.0 * (0.5 * forcingTerm[DIR_M0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + mfcba += 3.0 * (0.5 * forcingTerm[DIR_P0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + mfbaa += 3.0 * (0.5 * forcingTerm[DIR_0MM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + mfbca += 3.0 * (0.5 * forcingTerm[DIR_0PM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + mfaaa += 3.0 * (0.5 * forcingTerm[DIR_MMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + mfcaa += 3.0 * (0.5 * forcingTerm[DIR_PMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + mfaca += 3.0 * (0.5 * forcingTerm[DIR_MPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + mfcca += 3.0 * (0.5 * forcingTerm[DIR_PPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + mfbbb += 3.0 * (0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + + //-------------------------------------------------------- + + + + + + //////end classic source term + + + + //forcing /////////////////////////////////////////////////////////////////////////////////////////// if (withForcing) @@ -418,13 +647,13 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2); muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3); - forcingX1 = muForcingX1.Eval(); - forcingX2 = muForcingX2.Eval(); - forcingX3 = muForcingX3.Eval(); + //forcingX1 = muForcingX1.Eval(); + //forcingX2 = muForcingX2.Eval(); + //forcingX3 = muForcingX3.Eval(); - vvx += forcingX1 * deltaT * 0.5; // X - vvy += forcingX2 * deltaT * 0.5; // Y - vvz += forcingX3 * deltaT * 0.5; // Z + //vvx += forcingX1 * deltaT * 0.5; // X + //vvy += forcingX2 * deltaT * 0.5; // Y + //vvz += forcingX3 * deltaT * 0.5; // Z } LBMReal vx2; @@ -697,12 +926,24 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) // Cumulants //////////////////////////////////////////////////////////////////////////////////// LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity - LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// - LBMReal OxyyMxzz = 1.;//2+s9;// + // LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + // LBMReal OxyyMxzz = 1.;//2+s9;// LBMReal O4 = 1.; LBMReal O5 = 1.; LBMReal O6 = 1.; + + + /////fourth order parameters; here only for test. Move out of loop! + + LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0))); + LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); + // LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); + LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' ) + LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + + //Cum 4. //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 @@ -744,19 +985,24 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) //applying phase field gradients first part: // mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz); // 17.03.2021 attempt for statililization by assymptotically vanishing bias - LBMReal correctionScaling = - rhoToPhi / rho; // +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000; - mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * - correctionScaling; // As in Hesam's code - mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; - mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; - mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; - mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; - mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; - - LBMReal dxux = 0.0;// -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); - LBMReal dyuy = 0.0;// dxux + collFactorM * c3o2 * mxxMyy; - LBMReal dzuz = 0.0;// dxux + collFactorM * c3o2 * mxxMzz; + //LBMReal correctionScaling = + // rhoToPhi / rho; // +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000; + //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * + // correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + + LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); + LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; + + LBMReal Dxy = -three * collFactorM * mfbba; + LBMReal Dxz = -three * collFactorM * mfbab; + LBMReal Dyz = -three * collFactorM * mfabb; + //relax mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); @@ -769,16 +1015,16 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) //applying phase field gradients second part: //mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz); - mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * - correctionScaling; // As in Hesam's code - mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; - mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; - mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; - mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; - mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * + // correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; ////updated pressure - mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; + //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa // linear combinations back @@ -822,13 +1068,19 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; //4. - CUMacc += O4 * (-CUMacc); - CUMcac += O4 * (-CUMcac); - CUMcca += O4 * (-CUMcca); - - CUMbbc += O4 * (-CUMbbc); - CUMbcb += O4 * (-CUMbcb); - CUMcbb += O4 * (-CUMcbb); + //CUMacc += O4 * (-CUMacc); + //CUMcac += O4 * (-CUMcac); + //CUMcca += O4 * (-CUMcca); + + //CUMbbc += O4 * (-CUMbbc); + //CUMbcb += O4 * (-CUMbcb); + //CUMcbb += O4 * (-CUMcbb); + CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc); + CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac); + CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca); + CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc); + CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb); + CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb); //5. CUMbcc += O5 * (-CUMbcc); @@ -1090,60 +1342,92 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) mfbcc = m1; mfccc = m2; + /////classical source term 8.4.2021 + + mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + mfbcb += 3.0 * (0.5 * forcingTerm[DIR_0P0]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + mfbbc += 3.0 * (0.5 * forcingTerm[DIR_00P]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + mfccb += 3.0 * (0.5 * forcingTerm[DIR_PP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + mfacb += 3.0 * (0.5 * forcingTerm[DIR_MP0]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + mfcbc += 3.0 * (0.5 * forcingTerm[DIR_P0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + mfabc += 3.0 * (0.5 * forcingTerm[DIR_M0P]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + mfbcc += 3.0 * (0.5 * forcingTerm[DIR_0PP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + mfbac += 3.0 * (0.5 * forcingTerm[DIR_0MP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + mfccc += 3.0 * (0.5 * forcingTerm[DIR_PPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + mfacc += 3.0 * (0.5 * forcingTerm[DIR_MPP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + mfcac += 3.0 * (0.5 * forcingTerm[DIR_PMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + mfaac += 3.0 * (0.5 * forcingTerm[DIR_MMP]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + mfabb += 3.0 * (0.5 * forcingTerm[DIR_M00]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + mfbab += 3.0 * (0.5 * forcingTerm[DIR_0M0]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + mfbba += 3.0 * (0.5 * forcingTerm[DIR_00M]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + mfaab += 3.0 * (0.5 * forcingTerm[DIR_MM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + mfcab += 3.0 * (0.5 * forcingTerm[DIR_PM0]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + mfaba += 3.0 * (0.5 * forcingTerm[DIR_M0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + mfcba += 3.0 * (0.5 * forcingTerm[DIR_P0M]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + mfbaa += 3.0 * (0.5 * forcingTerm[DIR_0MM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + mfbca += 3.0 * (0.5 * forcingTerm[DIR_0PM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + mfaaa += 3.0 * (0.5 * forcingTerm[DIR_MMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + mfcaa += 3.0 * (0.5 * forcingTerm[DIR_PMM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + mfaca += 3.0 * (0.5 * forcingTerm[DIR_MPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + mfcca += 3.0 * (0.5 * forcingTerm[DIR_PPM]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + mfbbb += 3.0 * (0.5 * forcingTerm[DIR_000]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + + + ////////////////////////////////////////////////////////////////////////// //proof correctness ////////////////////////////////////////////////////////////////////////// -#ifdef PROOF_CORRECTNESS - LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) - + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) - + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; - //LBMReal dif = fabs(drho - rho_post); - LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post; -#ifdef SINGLEPRECISION - if (dif > 10.0E-7 || dif < -10.0E-7) -#else - if (dif > 10.0E-15 || dif < -10.0E-15) -#endif - { - UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post) - + " dif=" + UbSystem::toString(dif) - + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); - //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); - //exit(EXIT_FAILURE); - } -#endif +//#ifdef PROOF_CORRECTNESS +// LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +// + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) +// + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; +// //LBMReal dif = fabs(drho - rho_post); +// LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post; +//#ifdef SINGLEPRECISION +// if (dif > 10.0E-7 || dif < -10.0E-7) +//#else +// if (dif > 10.0E-15 || dif < -10.0E-15) +//#endif +// { +// UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post) +// + " dif=" + UbSystem::toString(dif) +// + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); +// //exit(EXIT_FAILURE); +// } +//#endif ////////////////////////////////////////////////////////////////////////// //write distribution ////////////////////////////////////////////////////////////////////////// - (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb * rho; - (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab * rho; - (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba * rho; - (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab * rho; - (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab * rho; - (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba * rho; - (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba * rho; - (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa * rho; - (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca * rho; - (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa * rho; - (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa * rho; - (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca * rho; - (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca * rho; - - (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac * rho; - (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac * rho; - - (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb * rho; + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca * rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca * rho * c1o3; + + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac * rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac * rho * c1o3; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb * rho * c1o3; ////////////////////////////////////////////////////////////////////////// ////!Incompressible Kernal @@ -1203,7 +1487,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) // // //-------------------------------------------------------- // -// mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[E]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; +// mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; // mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; // mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; // mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; @@ -1911,7 +2195,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) // } //#endif // -// mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[E]; +// mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00]; // mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N]; // mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T]; // mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE]; @@ -1977,7 +2261,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) //////////////////////////////////////////// /////CUMULANT PHASE-FIELD LBMReal omegaD =1.0/( 3.0 * mob + 0.5); - + { mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); @@ -2134,12 +2418,15 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) LBMReal Mccb = mfccb - mfaab * c1o9; // collision of 1st order moments + // LBMReal ccx, ccy, ccz; + + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + - normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale; + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + - normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale; + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + - normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * c1o3 * oneOverInterfaceScale; + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx; //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy; @@ -2281,6 +2568,323 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb; + } + + ////Phasefield 2: + + { + + normX1 *= -1; + normX2 *= -1; + normX3 *= -1; + + mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p); + mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3); + + + //////////////////////////////////////////////////////////////////////////////////// +//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref +//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> +//! +//////////////////////////////////////////////////////////////////////////////////// +// fluid component + //LBMReal drhoFluid = + // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) + + // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) + + // ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb; + + //LBMReal rhoFluid = c1 + drhoFluid; + //LBMReal OOrhoFluid = c1 / rhoFluid; + + + //LBMReal vvx = + // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) + + // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) + + // (fcbb - fabb)) * OOrhoFluid; + //LBMReal vvy = + // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) + + // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) + + // (fbcb - fbab)) * OOrhoFluid; + //LBMReal vvz = + // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) + + // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) + + // (fbbc - fbba)) * OOrhoFluid; + + // LBMReal vvx = ux; + // LBMReal vvy = uy; + // LBMReal vvz = uz; + //////////////////////////////////////////////////////////////////////////////////// + // second component + LBMReal concentration = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + // LBMReal fx = forces[0]; + // LBMReal fy = forces[1]; + // LBMReal fz = -concentration * forces[2]; + // vvx += fx * c1o2; + // vvy += fy * c1o2; + // vvz += fz * c1o2; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal oneMinusRho = c1 - concentration; + + LBMReal cx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal cy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal cz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal cx2 = cx * cx; + LBMReal cy2 = cy * cy; + LBMReal cz2 = cz * cz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfaab, mfabb, mfacb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + forwardChimera(mfaba, mfbba, mfcba, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfaab, mfbab, mfcab, cx, cx2); + forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + //! - experimental Cumulant ... to be published ... hopefully + //! + + // linearized orthogonalization of 3rd order central moments + LBMReal Mabc = mfabc - mfaba * c1o3; + LBMReal Mbca = mfbca - mfbaa * c1o3; + LBMReal Macb = mfacb - mfaab * c1o3; + LBMReal Mcba = mfcba - mfaba * c1o3; + LBMReal Mcab = mfcab - mfaab * c1o3; + LBMReal Mbac = mfbac - mfbaa * c1o3; + // linearized orthogonalization of 5th order central moments + LBMReal Mcbc = mfcbc - mfaba * c1o9; + LBMReal Mbcc = mfbcc - mfbaa * c1o9; + LBMReal Mccb = mfccb - mfaab * c1o9; + + // collision of 1st order moments + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + normX1 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + normX2 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + normX3 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + + //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx; + //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy; +//mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz; + + + cx2 = cx * cx; + cy2 = cy * cy; + cz2 = cz * cz; + + // equilibration of 2nd order moments + mfbba = zeroReal; + mfbab = zeroReal; + mfabb = zeroReal; + + mfcaa = c1o3 * concentration; + mfaca = c1o3 * concentration; + mfaac = c1o3 * concentration; + + + //LBMReal omega2 = 1.0f;// omegaD; + //mfbba *= (c1 - omega2); + //mfbab *= (c1 - omega2); + //mfabb *= (c1 - omega2); + + //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration; + + // equilibration of 3rd order moments + Mabc = zeroReal; + Mbca = zeroReal; + Macb = zeroReal; + Mcba = zeroReal; + Mcab = zeroReal; + Mbac = zeroReal; + mfbbb = zeroReal; + + // from linearized orthogonalization 3rd order central moments to central moments + mfabc = Mabc + mfaba * c1o3; + mfbca = Mbca + mfbaa * c1o3; + mfacb = Macb + mfaab * c1o3; + mfcba = Mcba + mfaba * c1o3; + mfcab = Mcab + mfaab * c1o3; + mfbac = Mbac + mfbaa * c1o3; + + // equilibration of 4th order moments + mfacc = c1o9 * concentration; + mfcac = c1o9 * concentration; + mfcca = c1o9 * concentration; + + mfcbb = zeroReal; + mfbcb = zeroReal; + mfbbc = zeroReal; + + // equilibration of 5th order moments + Mcbc = zeroReal; + Mbcc = zeroReal; + Mccb = zeroReal; + + // from linearized orthogonalization 5th order central moments to central moments + mfcbc = Mcbc + mfaba * c1o9; + mfbcc = Mbcc + mfbaa * c1o9; + mfccb = Mccb + mfaab * c1o9; + + // equilibration of 6th order moment + mfccc = c1o27 * concentration; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + backwardChimera(mfaba, mfbba, mfcba, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfaab, mfbab, mfcab, cx, cx2); + backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfaab, mfabb, mfacb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + + + (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH2)(x1, x2, x3) = mfbbb; + + } + + /////!CUMULANT PHASE-FIELD @@ -2288,7 +2892,7 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) ///////////////////// PHASE-FIELD BGK SOLVER /////////////////////////////// - //h[E] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + //h[DIR_P00] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); //h[N] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); //h[T] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); //h[NE] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); @@ -2371,8 +2975,8 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) } } } - } - dataSet->setPhaseField(divU); + + // dataSet->setPhaseField(divU); } } ////////////////////////////////////////////////////////////////////////// @@ -2380,9 +2984,9 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::calculate(int step) LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX1_phi() { using namespace D3Q27System; - return 3.0* ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) + (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) + (phi[BNE] - phi[TSW]))) - + WEIGTH[NE] * (((phi[TE] - phi[BW]) + (phi[BE] - phi[TW])) + ((phi[SE] - phi[NW]) + (phi[NE] - phi[SW])))) + - +WEIGTH[N] * (phi[E] - phi[W])); + return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00])); //LBMReal sum = 0.0; //for (int k = FSTARTDIR; k <= FENDDIR; k++) { // sum += WEIGTH[k] * DX1[k] * phi[k]; @@ -2393,9 +2997,9 @@ LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX1_phi() LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX2_phi() { using namespace D3Q27System; - return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[BNE] - phi[TSW])- (phi[TSE] - phi[BNW]))) - + WEIGTH[NE] * (((phi[TN] - phi[BS]) + (phi[BN] - phi[TS])) + ((phi[NE] - phi[SW])- (phi[SE] - phi[NW])))) + - +WEIGTH[N] * (phi[N] - phi[S])); + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0])); //LBMReal sum = 0.0; //for (int k = FSTARTDIR; k <= FENDDIR; k++) { // sum += WEIGTH[k] * DX2[k] * phi[k]; @@ -2406,9 +3010,9 @@ LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX2_phi() LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX3_phi() { using namespace D3Q27System; - return 3.0 * ((WEIGTH[TNE] * (((phi[TNE] - phi[BSW]) - (phi[BSE] - phi[TNW])) + ((phi[TSE] - phi[BNW]) - (phi[BNE] - phi[TSW]))) - + WEIGTH[NE] * (((phi[TE] - phi[BW]) - (phi[BE] - phi[TW])) + ((phi[TS] - phi[BN]) + (phi[TN] - phi[BS])))) + - +WEIGTH[N] * (phi[T] - phi[B])); + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M])); //LBMReal sum = 0.0; //for (int k = FSTARTDIR; k <= FENDDIR; k++) { // sum += WEIGTH[k] * DX3[k] * phi[k]; @@ -2416,21 +3020,64 @@ LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX3_phi() //return 3.0 * sum; } +LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX1_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX1[k] * phi2[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX2_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX2[k] * phi2[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::gradX3_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX3[k] * phi2[k]; + //} + //return 3.0 * sum; +} + + + + + LBMReal MultiphaseTwoPhaseFieldsCumulantLBMKernel::nabla2_phi() { using namespace D3Q27System; LBMReal sum = 0.0; - sum += WEIGTH[TNE] * ((((phi[TNE] - phi[REST]) + (phi[BSW] - phi[REST])) + ((phi[TSW] - phi[REST]) + (phi[BNE] - phi[REST]))) - + (((phi[TNW] - phi[REST]) + (phi[BSE] - phi[REST])) + ((phi[TSE] - phi[REST]) + (phi[BNW] - phi[REST])))); - sum += WEIGTH[TN] * ( - (((phi[TN] - phi[REST]) + (phi[BS] - phi[REST])) + ((phi[TS] - phi[REST]) + (phi[BN] - phi[REST]))) - + (((phi[TE] - phi[REST]) + (phi[BW] - phi[REST])) + ((phi[TW] - phi[REST]) + (phi[BE] - phi[REST]))) - + (((phi[NE] - phi[REST]) + (phi[SW] - phi[REST])) + ((phi[NW] - phi[REST]) + (phi[SE] - phi[REST]))) + sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000]))) + + (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000])))); + sum += WEIGTH[DIR_0PP] * ( + (((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000]))) + + (((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000]))) + + (((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000]))) ); - sum += WEIGTH[T] * ( - ((phi[T] - phi[REST]) + (phi[B] - phi[REST])) - + ((phi[N] - phi[REST]) + (phi[S] - phi[REST])) - + ((phi[E] - phi[REST]) + (phi[W] - phi[REST])) + sum += WEIGTH[DIR_00P] * ( + ((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000])) + + ((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000])) + + ((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000])) ); //for (int k = FSTARTDIR; k <= FENDDIR; k++) { // sum += WEIGTH[k] * (phi[k] - phi[REST]); @@ -2460,35 +3107,35 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::computePhasefield() int x2p = x2 + 1; int x3p = x3 + 1; - h[E] = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); - h[N] = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); - h[T] = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); - h[NE] = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); - h[NW] = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); - h[TE] = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); - h[TW] = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); - h[TN] = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); - h[TS] = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); - h[TNE] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); - h[TNW] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); - h[TSE] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); - h[TSW] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); - - h[W] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); - h[S] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); - h[B] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); - h[SW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); - h[SE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); - h[BW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); - h[BE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); - h[BS] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); - h[BN] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); - h[BSW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); - h[BSE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); - h[BNW] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); - h[BNE] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); - - h[REST] = (*this->zeroDistributionsH1)(x1, x2, x3); + h[DIR_P00] = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3); } } } @@ -2502,7 +3149,8 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal, SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); - phi[REST] = (*ph)(x1, x2, x3); + phi[DIR_000] = (*ph)(x1, x2, x3); + for (int k = FSTARTDIR; k <= FENDDIR; k++) { @@ -2514,8 +3162,30 @@ void MultiphaseTwoPhaseFieldsCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal, } } +void MultiphaseTwoPhaseFieldsCumulantLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi2[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } + else { + phi2[k] = 0.0; + } + } +} + void MultiphaseTwoPhaseFieldsCumulantLBMKernel::swapDistributions() { LBMKernel::swapDistributions(); dataSet->getHdistributions()->swap(); + dataSet->getH2distributions()->swap(); } \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h index bc7609a2903948e6362a91e863cd10c9376a37be..a65fe073fc18258f518f72df97e6e8751adc4479 100644 --- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsCumulantLBMKernel.h @@ -80,18 +80,23 @@ protected: LBMReal h2[D3Q27System::ENDF + 1]; LBMReal g [D3Q27System::ENDF+1]; LBMReal phi[D3Q27System::ENDF+1]; + LBMReal phi2[D3Q27System::ENDF + 1]; LBMReal pr1[D3Q27System::ENDF+1]; LBMReal phi_cutoff[D3Q27System::ENDF+1]; LBMReal gradX1_phi(); LBMReal gradX2_phi(); LBMReal gradX3_phi(); + LBMReal gradX1_phi2(); + LBMReal gradX2_phi2(); + LBMReal gradX3_phi2(); //LBMReal gradX1_pr1(); //LBMReal gradX2_pr1(); //LBMReal gradX3_pr1(); //LBMReal dirgradC_phi(int n, int k); void computePhasefield(); void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3); + void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3); //void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, int x1, int x2, int x3); //void pressureFiltering(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf_filtered /*Pressure-Field*/); diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3baddc4fef5447c83b242727276fd0ec7b64c206 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp @@ -0,0 +1,3580 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.cpp +//! \ingroup LBMKernel +//! \author Hesameddin Safari +//======================================================================================= + +#include "MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h" +#include "BCArray3D.h" +#include "Block3D.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "D3Q27System.h" +#include "DataSet3D.h" +#include "LBMKernel.h" +#include <cmath> + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::MultiphaseTwoPhaseFieldsPressureFilterLBMKernel() { this->compressible = false; } +////////////////////////////////////////////////////////////////////////// +void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); + SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field + SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field + //SPtr<PhaseFieldArray3D> divU(new PhaseFieldArray3D( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + SPtr<PhaseFieldArray3D> divU1(new PhaseFieldArray3D( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new CbArray3D<LBMReal, IndexerX3X2X1>( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + dataSet->setFdistributions(f); + dataSet->setHdistributions(h); // For phase-field + dataSet->setH2distributions(h2); // For phase-field + //dataSet->setPhaseField(divU); + dataSet->setPhaseField(divU1); + dataSet->setPressureField(pressure); + + phaseField = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0)); + phaseField2 = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.0)); + divU = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new MultiphaseTwoPhaseFieldsPressureFilterLBMKernel()); + kernel->setNX(nx); + dynamicPointerCast<MultiphaseTwoPhaseFieldsPressureFilterLBMKernel>(kernel)->initDataSet(); + kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG); + kernel->setDensityRatio(this->densityRatio); + kernel->setMultiphaseModelParameters(this->beta, this->kappa); + kernel->setContactAngle(this->contactAngle); + kernel->setPhiL(this->phiL); + kernel->setPhiH(this->phiH); + kernel->setPhaseFieldRelaxation(this->tauH); + kernel->setMobility(this->mob); + kernel->setInterfaceWidth(this->interfaceWidth); + + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + kernel->setGhostLayerWidth(2); + dynamicPointerCast<MultiphaseTwoPhaseFieldsPressureFilterLBMKernel>(kernel)->initForcing(); + + return kernel; +} +////////////////////////////////////////////////////////////////////////// + void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m2 = mfa + mfc; + LBMReal m1 = mfc - mfa; + LBMReal m0 = m2 + mfb; + mfa = m0; + m0 *= Kinverse; + m0 += oneMinusRho; + mfb = (m1 * Kinverse - m0 * vv) * K; + mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; +} + +//////////////////////////////////////////////////////////////////////////////// + void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K; + LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K; + mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K; + mfa = m0; + mfb = m1; +} + + +//////////////////////////////////////////////////////////////////////////////// + void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal m1 = (mfa + mfc) + mfb; + LBMReal m2 = mfc - mfa; + mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); + mfb = m2 - vv * m1; + mfa = m1; +} + + + void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); + LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; + mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); + mfb = mb; + mfa = ma; +} + + +void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + using namespace UbMath; + + forcingX1 = 0.0; + forcingX2 = 0.0; + forcingX3 = 0.0; + + LBMReal oneOverInterfaceScale = c4 / interfaceWidth; //1.0;//1.5; + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + localDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions(); + nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions(); + zeroDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions(); + + localDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions(); + nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions(); + zeroDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions(); + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + + + //TODO + //very expensive !!!!! + //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField( + // new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, -999.0)); + // CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField2( + // new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, -999.0)); + // CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU( + // new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0)); + +//#pragma omp parallel for + for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) { + for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) { + for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + (*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc)) ) + + (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) + + ((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) + + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb; + + mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3); + (*phaseField2)(x1, x2, x3) = + (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc))) + + (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) + + ((mfbaa + mfbac) + (mfbca + mfbcc))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb; + //(*phaseField)(x1, x2, x3) = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + // (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + + // (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + + // (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + +////// read F-distributions for velocity formalism + + + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal rho = rhoH + rhoToPhi * ((*phaseField)(x1, x2, x3) - phiH); + //! variable density -> TRANSFER! + //LBMReal rho = rhoH * ((*phaseField)(x1, x2, x3)) + rhoL * ((*phaseField2)(x1, x2, x3)); + + (*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + rho * c1o3 * drho; + + //(*pressure)(x1, x2, x3) = (((*phaseField)(x1, x2, x3)) + ((*phaseField2)(x1, x2, x3)) - c1) * c1o3; + ////!!!!!! relplace by pointer swap! + //(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3); + } + } + } + } + + LBMReal collFactorM; + //LBMReal forcingTerm[D3Q27System::ENDF + 1]; + + ////filter + + //for (int x3 = minX3; x3 < maxX3; x3++) { + // for (int x2 = minX2; x2 < maxX2; x2++) { + // for (int x1 = minX1; x1 < maxX1; x1++) { + // if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + + // LBMReal sum = 0.; + + // //Lapalce pressure + // //sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3+1) - (*pressure)(x1, x2, x3)))) + // // + ((((*pressure)(x1+1, x2-1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3+1) - (*pressure)(x1, x2, x3))))); + // //sum += WEIGTH[TN] * ( + // // ((((*pressure)(x1+1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3) - (*pressure)(x1, x2, x3)))) + // // + ((((*pressure)(x1+1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3+1) - (*pressure)(x1, x2, x3)))) + // // + ((((*pressure)(x1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) - (*pressure)(x1, x2, x3)))) + // // ); + // //sum += WEIGTH[T] * ( + // // (((*pressure)(x1+1, x2, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3) - (*pressure)(x1, x2, x3))) + // // + (((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3) - (*pressure)(x1, x2, x3))) + // // + (((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2, x3-1) - (*pressure)(x1, x2, x3))) + // // ); + + + // //LBMReal pressureFilter = 100; + // //(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + pressureFilter * sum * (sqrt(fabs(sum))); + + // //Situpol Eq. 81 + // sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1)) + ((*pressure)(x1-1, x2-1, x3-1) )) + (((*pressure)(x1+1, x2+1, x3-1) ) + ((*pressure)(x1-1, x2-1, x3+1) ))) + // + ((((*pressure)(x1+1, x2-1, x3+1) ) + ((*pressure)(x1-1, x2+1, x3-1) )) + (((*pressure)(x1+1, x2-1, x3-1) ) + ((*pressure)(x1-1, x2+1, x3+1) )))); + // sum += WEIGTH[TN] * ( + // ((((*pressure)(x1+1, x2+1, x3) ) + ((*pressure)(x1-1, x2-1, x3) )) + (((*pressure)(x1+1, x2-1, x3) ) + ((*pressure)(x1-1, x2+1, x3) ))) + // + ((((*pressure)(x1+1, x2, x3+1) ) + ((*pressure)(x1-1, x2, x3-1) )) + (((*pressure)(x1+1, x2, x3-1) ) + ((*pressure)(x1-1, x2, x3+1) ))) + // + ((((*pressure)(x1, x2+1, x3+1) ) + ((*pressure)(x1, x2-1, x3-1) )) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) ))) + // ); + // sum += WEIGTH[T] * ( + // (((*pressure)(x1+1, x2, x3) ) + ((*pressure)(x1-1, x2, x3) )) + // + (((*pressure)(x1, x2+1, x3) ) + ((*pressure)(x1, x2-1, x3) )) + // + (((*pressure)(x1, x2, x3+1)) + ((*pressure)(x1, x2, x3-1) )) + // ); + // sum += WEIGTH[REST] * (*pressure)(x1, x2, x3); + // (*pressureOld)(x1, x2, x3) = sum; + + + + + // } + // } + // } + //} + + ////Periodic Filter +//#pragma omp parallel for + for (int x3 = minX3-1; x3 <= maxX3; x3++) { + for (int x2 = minX2-1; x2 <= maxX2; x2++) { + for (int x1 = minX1-1; x1 <= maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + + LBMReal sum = 0.; + + + + //Lapalce pressure + //sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3+1) - (*pressure)(x1, x2, x3)))) + // + ((((*pressure)(x1+1, x2-1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3+1) - (*pressure)(x1, x2, x3))))); + //sum += WEIGTH[TN] * ( + // ((((*pressure)(x1+1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3) - (*pressure)(x1, x2, x3)))) + // + ((((*pressure)(x1+1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3+1) - (*pressure)(x1, x2, x3)))) + // + ((((*pressure)(x1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) - (*pressure)(x1, x2, x3)))) + // ); + //sum += WEIGTH[T] * ( + // (((*pressure)(x1+1, x2, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3) - (*pressure)(x1, x2, x3))) + // + (((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3) - (*pressure)(x1, x2, x3))) + // + (((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2, x3-1) - (*pressure)(x1, x2, x3))) + // ); + + + //LBMReal pressureFilter = 100; + //(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + pressureFilter * sum * (sqrt(fabs(sum))); + + //Situpol Eq. 81 + + //int x1p = (x1 < maxX1) ? x1 + 1 : 0; + //int x1m = (x1 > 0) ? x1 - 1 : maxX1; + //int x2p = (x2 < maxX2) ? x2 + 1 : 0; + //int x2m = (x2 > 0) ? x2 - 1 : maxX2; + //int x3p = (x3 < maxX3) ? x3 + 1 : 0; + //int x3m = (x3 > 0) ? x3 - 1 : maxX3; + //sum += WEIGTH[TNE] * (((((*pressure)(x1p, x2p, x3p)) + ((*pressure)(x1m, x2m, x3m))) + (((*pressure)(x1p, x2p, x3m)) + ((*pressure)(x1m, x2m, x3p)))) + // + ((((*pressure)(x1p, x2m, x3p)) + ((*pressure)(x1m, x2p, x3m))) + (((*pressure)(x1p, x2m, x3m)) + ((*pressure)(x1m, x2p, x3p))))); + //sum += WEIGTH[TN] * ( + // ((((*pressure)(x1p, x2p, x3)) + ((*pressure)(x1m, x2m, x3))) + (((*pressure)(x1p, x2m, x3)) + ((*pressure)(x1m, x2p, x3)))) + // + ((((*pressure)(x1p, x2, x3p)) + ((*pressure)(x1m, x2, x3m))) + (((*pressure)(x1p, x2, x3m)) + ((*pressure)(x1m, x2, x3p)))) + // + ((((*pressure)(x1, x2p, x3p)) + ((*pressure)(x1, x2m, x3m))) + (((*pressure)(x1, x2p, x3m) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2m, x3p)))) + // ); + //sum += WEIGTH[T] * ( + // (((*pressure)(x1p, x2, x3)) + ((*pressure)(x1m, x2, x3))) + // + (((*pressure)(x1, x2p, x3)) + ((*pressure)(x1, x2m, x3))) + // + (((*pressure)(x1, x2, x3p)) + ((*pressure)(x1, x2, x3m))) + // ); + //sum += WEIGTH[REST] * (*pressure)(x1, x2, x3); + //(*pressureOld)(x1, x2, x3) = sum; + + ///Version for boundaries + for (int xx = -1; xx <= 1; xx++) { + //int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0; + int xxx = xx + x1; + + for (int yy = -1; yy <= 1; yy++) { + //int yyy = (yy+x2 <= maxX2) ?( (yy + x2 > 0) ? yy + x2 : maxX2) : 0; + int yyy = yy + x2; + + for (int zz = -1; zz <= 1; zz++) { + //int zzz = (zz+x3 <= maxX3) ? zzz = ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0; + int zzz = zz + x3; + + if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) { + sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressureOld)(xxx, yyy, zzz); + } + else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressureOld)(x1, x2, x3); + } + + + } + } + } + (*pressure)(x1, x2, x3) = sum; + + + + } + } + } + } + +//#pragma omp parallel for + // for (int x3 = minX3-1; x3 <= maxX3; x3++) { + // for (int x2 = minX2-1; x2 <= maxX2; x2++) { + // for (int x1 = minX1-1; x1 <= maxX1; x1++) { + // if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + // ///filter! + + // (*pressure)(x1, x2, x3) = (*pressureOld)(x1, x2, x3); + // } + // } + // } + // } + ////!filter + + +//#pragma omp parallel for + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + + + ////////////////////////////////////////////////////////////////////////// + // Read distributions and phase field + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + // E N T + // c c c + ////////// + // W S B + // a a a + + // Rest ist b + + // mfxyz + // a - negative + // b - null + // c - positive + + // a b c + //-1 0 1 + + findNeighbors(phaseField, x1, x2, x3); + findNeighbors2(phaseField2, x1, x2, x3); + + LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal dX1_phi = gradX1_phi(); + LBMReal dX2_phi = gradX2_phi(); + LBMReal dX3_phi = gradX3_phi(); + + //LBMReal dX1_phi2 = gradX1_phi2(); + //LBMReal dX2_phi2 = gradX2_phi2(); + //LBMReal dX3_phi2 = gradX3_phi2(); + + + // LBMReal denom2 = sqrt(dX1_phi * dX1_phi+ dX1_phi2 * dX1_phi2 + dX2_phi * dX2_phi + dX2_phi2 * dX2_phi2 + dX3_phi * dX3_phi+ dX3_phi2 * dX3_phi2) + 1e-9; + // LBMReal normX1 = (dX1_phi-dX1_phi2)/denom2; + //LBMReal normX2 = (dX2_phi-dX2_phi2)/denom2; + //LBMReal normX3 = (dX3_phi-dX3_phi2)/denom2; + + LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9; + LBMReal normX1 = dX1_phi / denom; + LBMReal normX2 = dX2_phi / denom; + LBMReal normX3 = dX3_phi / denom; + + + + collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL); + + + LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(); + + //----------- Calculating Macroscopic Values ------------- + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); + + //! variable density -> TRANSFER! + //LBMReal rho = rhoH * ((*phaseField)(x1, x2, x3)) + rhoL * ((*phaseField2)(x1, x2, x3)); + + + ////Incompressible Kernal + + //mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) ;// / rho * c3; + //mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) ;// / rho * c3; + //mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) ;// / rho * c3; + //mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) ;// / rho * c3; + //mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) ;// / rho * c3; + //mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) ;// / rho * c3; + //mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) ;// / rho * c3; + //mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) ;// / rho * c3; + //mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) ;// / rho * c3; + //mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) ;// / rho * c3; + //mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) ;// / rho * c3; + //mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) ;// / rho * c3; + //mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) ;// / rho * c3; + //mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) ;// / rho * c3; + //mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) ;// / rho * c3; + //mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) ;// / rho * c3; + //mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) ;// / rho * c3; + //mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) ;// / rho * c3; + //mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) ;// / rho * c3; + //mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) ;// / rho * c3; + //mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) ;// / rho * c3; + //mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) ;// / rho * c3; + //mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) ;// / rho * c3; + //mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) ;// / rho * c3; + //mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) ;// / rho * c3; + //mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) ;// / rho * c3; + + //mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);// / rho * c3; + + + LBMReal m0, m1, m2; + LBMReal rhoRef=c1; + + //LBMReal + // LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + // + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + // + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb))/rhoRef; + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab))/rhoRef; + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba))/rhoRef; + + // (*pressure)(x1, x2, x3) = (*pressureOld)(x1, x2, x3)+rho*c1o3*drho; + + //LBMReal gradPx = c1o2 * ((*pressure)(x1 + 1, x2, x3) - (*pressure)(x1 - 1, x2, x3)); + //LBMReal gradPy = c1o2 * ((*pressure)(x1, x2 + 1, x3) - (*pressure)(x1, x2 - 1, x3)); + //LBMReal gradPz = c1o2 * ((*pressure)(x1, x2, x3 + 1) - (*pressure)(x1, x2, x3 - 1)); + + //LBMReal gradPx = 3.0 * (WEIGTH[TNE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 + 1, x2 - 1, x3 + 1) - (*pressure)(x1 - 1, x2 + 1, x3 - 1))) + // + (((*pressure)(x1 + 1, x2 - 1, x3 - 1) - (*pressure)(x1 - 1, x2 + 1, x3 + 1)) + ((*pressure)(x1 + 1, x2 + 1, x3 - 1) - (*pressure)(x1 - 1, x2 - 1, x3 + 1)))) + // + WEIGTH[NE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3) - (*pressure)(x1 - 1, x2 - 1, x3)) + ((*pressure)(x1 + 1, x2 - 1, x3) - (*pressure)(x1 - 1, x2 + 1, x3))) + // + (((*pressure)(x1 + 1, x2, x3 - 1) - (*pressure)(x1 - 1, x2, x3 + 1)) + ((*pressure)(x1 + 1, x2, x3 + 1) - (*pressure)(x1 - 1, x2, x3 - 1)))) + // + WEIGTH[DIR_P00] * ((*pressure)(x1 + 1, x2, x3) - (*pressure)(x1 - 1, x2, x3))); + + //LBMReal gradPy = 3.0 * (WEIGTH[TNE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 - 1, x2 + 1, x3 + 1) - (*pressure)(x1 + 1, x2 - 1, x3 - 1))) + // + (((*pressure)(x1 - 1, x2 + 1, x3 - 1) - (*pressure)(x1 + 1, x2 - 1, x3 + 1)) + ((*pressure)(x1 + 1, x2 + 1, x3 - 1) - (*pressure)(x1 - 1, x2 - 1, x3 + 1)))) + // + WEIGTH[NE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3) - (*pressure)(x1 - 1, x2 - 1, x3)) + ((*pressure)(x1 - 1, x2 + 1, x3) - (*pressure)(x1 + 1, x2 - 1, x3))) + // + (((*pressure)(x1, x2+1, x3 - 1) - (*pressure)(x1, x2-1, x3 + 1)) + ((*pressure)(x1, x2+1, x3 + 1) - (*pressure)(x1, x2-1, x3 - 1)))) + // + WEIGTH[DIR_P00] * ((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2-1, x3))); + + //LBMReal gradPz = 3.0 * (WEIGTH[TNE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 - 1, x2 + 1, x3 + 1) - (*pressure)(x1 + 1, x2 - 1, x3 - 1))) + // + (((*pressure)(x1 - 1, x2 - 1, x3 + 1) - (*pressure)(x1 + 1, x2 + 1, x3 - 1)) + ((*pressure)(x1 + 1, x2 - 1, x3 + 1) - (*pressure)(x1 - 1, x2 + 1, x3 - 1)))) + // + WEIGTH[NE] * ( + // (((*pressure)(x1 + 1, x2, x3+1) - (*pressure)(x1 - 1, x2, x3-1)) + ((*pressure)(x1 - 1, x2, x3+1) - (*pressure)(x1 + 1, x2, x3-1))) + // + (((*pressure)(x1, x2 - 1, x3 + 1) - (*pressure)(x1, x2 + 1, x3 - 1)) + ((*pressure)(x1, x2 + 1, x3 + 1) - (*pressure)(x1, x2 - 1, x3 - 1)))) + // + WEIGTH[DIR_P00] * ((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3-1))); + + + LBMReal gradPx = 0.0; + LBMReal gradPy = 0.0; + LBMReal gradPz = 0.0; + for (int dir1 = -1; dir1 <= 1; dir1++) { + for (int dir2 = -1; dir2 <= 1; dir2++) { + int yyy = x2 + dir1; + int zzz = x3 + dir2; + if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) { + gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 + 1, yyy, zzz)) { + gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + int xxx = x1 + dir1; + if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) { + gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2+1, zzz)) { + gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + yyy = x2 + dir2; + if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) { + gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) { + gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + } + } + + //Viscosity increase by pressure gradient + LBMReal errPhi = (((1.0 - phi[DIR_000]) * (phi[DIR_000]) * oneOverInterfaceScale)- denom); + //LBMReal limVis = 0.0000001*10;//0.01; + // collFactorM =collFactorM/(c1+limVis*(errPhi*errPhi)*collFactorM); + // collFactorM = (collFactorM < 1.8) ? 1.8 : collFactorM; + errPhi = errPhi * errPhi* errPhi * errPhi * errPhi * errPhi; + //collFactorM = collFactorM + (1.8 - collFactorM) * errPhi / (errPhi + limVis); + + //3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW]))) + //+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) + + //+WEIGTH[N] * (phi2[T] - phi2[B])); + + //if (withForcing) { + // muX1 = static_cast<double>(x1-1+ix1*maxX1); + // muX2 = static_cast<double>(x2-1+ix2*maxX2); + // muX3 = static_cast<double>(x3-1+ix3*maxX3); + + // forcingX1 = muForcingX1.Eval()+c1o3*drho*dX1_phi*rhoToPhi/rho;//-gradPx/rho; + // forcingX2 = muForcingX2.Eval() + c1o3*drho*dX2_phi * rhoToPhi / rho;//-gradPy/rho; + //forcingX3 = muForcingX3.Eval() + c1o3*drho*dX3_phi * rhoToPhi / rho;//-gradPz/rho; + + + muRho = rho; + + //muForcingX1.DefineConst("rho", rho); + //muForcingX2.DefineConst("rho", rho); + //muForcingX3.DefineConst("rho", rho); + + + forcingX1 = muForcingX1.Eval()/rho - gradPx/rho; + forcingX2 = muForcingX2.Eval()/rho - gradPy/rho; + forcingX3 = muForcingX3.Eval()/rho - gradPz/rho; + + //LBMReal rho_m = 1.0 / densityRatio; + //forcingX1 = forcingX1 * (rho - rho_m); + //forcingX2 = forcingX2 * (rho - rho_m); + //forcingX3 = forcingX3 * (rho - rho_m); + vvx += forcingX1 * deltaT * 0.5; // X + vvy += forcingX2 * deltaT * 0.5; // Y + vvz += forcingX3 * deltaT * 0.5; // Z + + //} + + + ///surface tension force + vvx += mu * dX1_phi * c1o2 / rho; + vvy += mu * dX2_phi * c1o2 / rho ; + vvz += mu * dX3_phi * c1o2 / rho; + + //////classic source term + ///----Classic source term 8.4.2021 + + //LBMReal vvxF, vvyF, vvzF; + //vvxF = vvx;//-2*c1o24 * lap_vx;// + //vvyF = vvy;//-2*c1o24 * lap_vy;// + //vvzF = vvz;//-2*c1o24 * lap_vz;// + +// vvxF = 1.2* vvx- 0.2*0.5 * ((*velocityX)(x1 - 1, x2, x3) + (*velocityX)(x1 + 1, x2, x3)); +// vvyF = 1.2 *vvy- 0.2*0.5* ((*velocityY)(x1 , x2-1, x3) + (*velocityY)(x1 , x2+1, x3)); +// vvzF = 1.2 *vvz-0.2*0.5* ((*velocityZ)(x1 , x2, x3-1) + (*velocityZ)(x1 , x2, x3+1)); + //if (vvxF != vvx) { + // vvxF = vvxF; + //} + //LBMReal weightGrad = 1.0;// -denom * denom / (denom * denom + 0.0001 * 0.001); + //LBMReal dX1_phiF = dX1_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX1; + //LBMReal dX2_phiF = dX2_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX2; + //LBMReal dX3_phiF = dX3_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX3; + + //dX1_phiF *= 1.2; + //dX2_phiF *= 1.2; + //dX3_phiF *= 1.2; + + //LBMReal gradFD = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi); + //LBMReal gradPhi = (1.0 - phi[REST]) * (phi[REST]); + //gradPhi = (gradPhi > gradFD) ? gradPhi : gradFD; + //dX1_phiF = gradPhi * normX1; + // dX2_phiF = gradPhi * normX2; + // dX3_phiF = gradPhi * normX3; + + //LBMReal ux2; + //LBMReal uy2; + //LBMReal uz2; + //ux2 = vvxF * vvxF; + //uy2 = vvyF * vvyF; + //uz2 = vvzF * vvzF; + //LBMReal forcingTerm[D3Q27System::ENDF + 1]; + //for (int dir = STARTF; dir <= (FENDDIR); dir++) { + // LBMReal velProd = DX1[dir] * vvxF + DX2[dir] * vvyF + DX3[dir] * vvzF; + // LBMReal velSq1 = velProd * velProd; + // LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + (4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2))); + + // //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi; + + // //forcingTerm[dir] = + // // (-vvxF) * (fac1 * dX1_phiF) + + // // (-vvyF) * (fac1 * dX2_phiF) + + // // (-vvzF) * (fac1 * dX3_phiF) + + // // (DX1[dir]) * (fac1 * dX1_phiF) + + // // (DX2[dir]) * (fac1 * dX2_phiF) + + // // (DX3[dir]) * (fac1 * dX3_phiF); + + + // //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 ; + + // //forcingTerm[dir] = + // // (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + // // (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + // // (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)) + + // // (DX1[dir]) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + // // (DX2[dir]) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + // // (DX3[dir]) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)); + + + + //} + + //LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); + //LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi; + //forcingTerm[REST] = (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + // (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + // (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)); + + //////// + // LBMReal divAfterSource= + //( mfcbb + 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF) *(vvzF)-1)+ + //( mfbcb + 3.0 * (0.5 * forcingTerm[N]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfbbc + 3.0 * (0.5 * forcingTerm[T]) / rho ) *((vvxF) *(vvxF) +(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfccb + 3.0 * (0.5 * forcingTerm[NE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfacb + 3.0 * (0.5 * forcingTerm[NW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfcbc + 3.0 * (0.5 * forcingTerm[TE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfabc + 3.0 * (0.5 * forcingTerm[TW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfbcc + 3.0 * (0.5 * forcingTerm[TN]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfbac + 3.0 * (0.5 * forcingTerm[TS]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfccc + 3.0 * (0.5 * forcingTerm[TNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfacc + 3.0 * (0.5 * forcingTerm[TNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfcac + 3.0 * (0.5 * forcingTerm[TSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfaac + 3.0 * (0.5 * forcingTerm[TSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfabb + 3.0 * (0.5 * forcingTerm[W]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF) *(vvzF)-1)+ + //( mfbab + 3.0 * (0.5 * forcingTerm[S]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfbba + 3.0 * (0.5 * forcingTerm[B]) / rho ) *((vvxF) *(vvxF) +(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfaab + 3.0 * (0.5 * forcingTerm[SW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfcab + 3.0 * (0.5 * forcingTerm[SE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfaba + 3.0 * (0.5 * forcingTerm[BW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfcba + 3.0 * (0.5 * forcingTerm[BE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfbaa + 3.0 * (0.5 * forcingTerm[BS]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfbca + 3.0 * (0.5 * forcingTerm[BN]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfaaa + 3.0 * (0.5 * forcingTerm[BSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfcaa + 3.0 * (0.5 * forcingTerm[BSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfaca + 3.0 * (0.5 * forcingTerm[BNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfcca + 3.0 * (0.5 * forcingTerm[BNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfbbb + 3.0 * (0.5 * forcingTerm[REST]) / rho)*((vvxF)*(vvxF)+(vvyF)*(vvyF)+(vvzF)*(vvzF)-1); + + // LBMReal divBeforeSource = + // (mfcbb) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) + + // (mfbcb) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfbbc) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfccb) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfacb) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfcbc) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfabc) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfbcc) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfbac) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfccc) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfacc) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfcac) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfaac) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfabb) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) + + // (mfbab) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfbba) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfaab) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfcab) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfaba) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfcba) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfbaa) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfbca) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfaaa) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfcaa) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfaca) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfcca) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfbbb) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF) * (vvzF)-1); + //if (divAfterSource - divBeforeSource != 0 && phi[REST]>0.0001 && phi[REST]<0.999) { + // std::cout << phi[REST]<<" "<< divAfterSource << " " << divBeforeSource <<" "<< divAfterSource/ divBeforeSource << std::endl; + //} + + //if (fabs(divAfterSource - divBeforeSource)/(fabs(divAfterSource) + fabs(divBeforeSource)+1e-10) > 1e-5) { + // LBMReal scaleDiv =0.95+(1-0.95)* (divBeforeSource) / (divBeforeSource - divAfterSource); + + // forcingTerm[DIR_P00] *=scaleDiv; + // forcingTerm[N] *=scaleDiv; + // forcingTerm[T] *=scaleDiv; + // forcingTerm[NE] *=scaleDiv; + // forcingTerm[NW] *=scaleDiv; + // forcingTerm[TE] *=scaleDiv; + // forcingTerm[TW] *=scaleDiv; + // forcingTerm[TN] *=scaleDiv; + // forcingTerm[TS] *=scaleDiv; + // forcingTerm[TNE] *=scaleDiv; + // forcingTerm[TNW] *=scaleDiv; + // forcingTerm[TSE] *=scaleDiv; + // forcingTerm[TSW] *=scaleDiv; + // forcingTerm[W] *=scaleDiv; + // forcingTerm[S] *=scaleDiv; + // forcingTerm[B] *=scaleDiv; + // forcingTerm[SW] *=scaleDiv; + // forcingTerm[SE] *=scaleDiv; + // forcingTerm[BW] *=scaleDiv; + // forcingTerm[BE] *=scaleDiv; + // forcingTerm[BS] *=scaleDiv; + // forcingTerm[BN] *=scaleDiv; + // forcingTerm[BSW] *=scaleDiv; + // forcingTerm[BSE] *=scaleDiv; + // forcingTerm[BNW] *=scaleDiv; + // forcingTerm[BNE] *=scaleDiv; + // forcingTerm[REST] *=scaleDiv; + //} + //////// + + + //mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + //mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + //mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + //mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + //mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + //mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + //mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + //mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + //mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + //mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + //mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + //mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + //mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + //mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + //mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + //mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + //mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + //mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + //mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + //mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + //mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + //mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + //mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + //mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + //mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + //mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + //mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + + //-------------------------------------------------------- + + + + + + //////end classic source term + + + + + //forcing + /////////////////////////////////////////////////////////////////////////////////////////// + //if (withForcing) + //{ + // muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1); + // muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2); + // muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3); + + // //forcingX1 = muForcingX1.Eval(); + // //forcingX2 = muForcingX2.Eval(); + // //forcingX3 = muForcingX3.Eval(); + + // //vvx += forcingX1 * deltaT * 0.5; // X + // //vvy += forcingX2 * deltaT * 0.5; // Y + // //vvz += forcingX3 * deltaT * 0.5; // Z + //} + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!! + + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + + + // mfaaa = 0.0; + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + // LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + // LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + + + /////fourth order parameters; here only for test. Move out of loop! + + LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0))); + LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); + // LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); + LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' ) + LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; + + ///storing pre collision second moments + // LBMReal mbxx = mfcaa - c1o3 * mfaaa; + // LBMReal mbyy = mfaca - c1o3 * mfaaa; + // LBMReal mbzz = mfaac - c1o3 * mfaaa; + // LBMReal mbxy = mfbba; + // LBMReal mbxz = mfbab; + // LBMReal mbyz = mfabb; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + + // LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho)); + mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa + //mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + //applying phase field gradients first part: + // mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz); + // 17.03.2021 attempt for statililization by assymptotically vanishing bias + //LBMReal correctionScaling = + // rhoToPhi / rho; // +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000; + //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * + // correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + + LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); + LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; + + LBMReal Dxy = -three * collFactorM * mfbba; + LBMReal Dxz = -three * collFactorM * mfbab; + LBMReal Dyz = -three * collFactorM * mfabb; + + + //relax + mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorM * (-mfabb); + mfbab += collFactorM * (-mfbab); + mfbba += collFactorM * (-mfbba); + + //applying phase field gradients second part: + //mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz); + //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * + // correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + + ////updated pressure + //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; + mfaaa = 0.0; // Pressure elimination as in standard velocity model + // mfaaa += (rho - c1) * (dxux + dyuy + dzuz); + + mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa + + // mxxPyyPzz += (mfaaa + mfaaaS) * c1o2; + //mfaaa = mfaaaS; + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + //CUMacc += O4 * (-CUMacc); + //CUMcac += O4 * (-CUMcac); + //CUMcca += O4 * (-CUMcca); + + //CUMbbc += O4 * (-CUMbbc); + //CUMbcb += O4 * (-CUMbcb); + //CUMcbb += O4 * (-CUMcbb); + CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc); + CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac); + CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca); + CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc); + CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb); + CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho; + + + //////// + + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + //mfbaa += -rho * rhoToPhi * c1o2 * ((mbxx + mfcaa) * dX1_phi + (mbxy + mfbba) * dX2_phi + (mbxz + mfbab) * dX3_phi); + //mfaba += -rho * rhoToPhi * c1o2 * ((mbxy + mfbba) * dX1_phi + (mbyy + mfaca) * dX2_phi + (mbyz + mfabb) * dX3_phi); + //mfaab += -rho * rhoToPhi * c1o2 * ((mbxz + mfbab) * dX1_phi + (mbyz + mfabb) * dX2_phi + (mbzz + mfaac) * dX3_phi); + mfbaa += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (2 * dxux * dX1_phi + Dxy * dX2_phi + Dxz * dX3_phi) / (rho); + mfaba += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxy * dX1_phi + 2 * dyuy * dX2_phi + Dyz * dX3_phi) / (rho); + mfaab += c1o3 * (c1 / collFactorM - c1o2) * rhoToPhi * (Dxz * dX1_phi + Dyz * dX2_phi + 2 * dyuy * dX3_phi) / (rho); + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + + /////classical source term 8.4.2021 + + //mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + //mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + //mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + //mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + //mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + //mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + //mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + //mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + //mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + //mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + //mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + //mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + //mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + //mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + //mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + //mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + //mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + //mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + //mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + //mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + //mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + //mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + //mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + //mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + //mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + //mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + //mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + + + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +//#ifdef PROOF_CORRECTNESS + LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; +// //LBMReal dif = fabs(drho - rho_post); +// LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post; +//#ifdef SINGLEPRECISION +// if (dif > 10.0E-7 || dif < -10.0E-7) +//#else +// if (dif > 10.0E-15 || dif < -10.0E-15) +//#endif +// { +// UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post) +// + " dif=" + UbSystem::toString(dif) +// + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); +// //exit(EXIT_FAILURE); +// } +//#endif + + if (UbMath::isNaN(rho_post) || UbMath::isInfinity(rho_post)) + UB_THROW(UbException( + UB_EXARGS, "rho_post is not a number (nan or -1.#IND) or infinity number -1.#INF, node=" + UbSystem::toString(x1) + "," + + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac ;//* rho * c1o3; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3; + ////////////////////////////////////////////////////////////////////////// + + ////!Incompressible Kernal + + +// ///////Old Kernel \|/ +// // ux += forcingX1*deltaT*0.5; // X +// // uy += forcingX2*deltaT*0.5; // Y +// // uz += forcingX3*deltaT*0.5; // Z +// } +// +// LBMReal ux = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + +// (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + +// (mfcbb - mfabb)) / +// (rho * c1o3) + +// (mu * dX1_phi + forcingX1) / (2 * rho); +// +// LBMReal uy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + +// (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + +// (mfbcb - mfbab)) / +// (rho * c1o3) + +// (mu * dX2_phi + forcingX2) / (2 * rho); +// +// LBMReal uz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + +// (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + +// (mfbbc - mfbba)) / +// (rho * c1o3) + +// (mu * dX3_phi + forcingX3) / (2 * rho); +// +// //-------------------------------------------------------- +// +// LBMReal ux2 = ux * ux; +// LBMReal uy2 = uy * uy; +// LBMReal uz2 = uz * uz; +// +// //----------- Calculating Forcing Terms * ------------- +// for (int dir = STARTF; dir <= (FENDDIR); dir++) { +// LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz; +// LBMReal velSq1 = velProd * velProd; +// LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)); +// +// LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi; +// +// forcingTerm[dir] = ((-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) + +// (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) + +// (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3))) + +// (DX1[dir]) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) + +// (DX2[dir]) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) + +// (DX3[dir]) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3)); +// } +// +// LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); +// LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi; +// forcingTerm[REST] = (-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) + +// (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) + +// (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3)); +// +// //-------------------------------------------------------- +// +// mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; +// mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; +// mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; +// mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; +// mfacb = 3.0 * (mfacb + 0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; +// mfcbc = 3.0 * (mfcbc + 0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; +// mfabc = 3.0 * (mfabc + 0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; +// mfbcc = 3.0 * (mfbcc + 0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; +// mfbac = 3.0 * (mfbac + 0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; +// mfccc = 3.0 * (mfccc + 0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; +// mfacc = 3.0 * (mfacc + 0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; +// mfcac = 3.0 * (mfcac + 0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; +// mfaac = 3.0 * (mfaac + 0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; +// mfabb = 3.0 * (mfabb + 0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; +// mfbab = 3.0 * (mfbab + 0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; +// mfbba = 3.0 * (mfbba + 0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; +// mfaab = 3.0 * (mfaab + 0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; +// mfcab = 3.0 * (mfcab + 0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; +// mfaba = 3.0 * (mfaba + 0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; +// mfcba = 3.0 * (mfcba + 0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; +// mfbaa = 3.0 * (mfbaa + 0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; +// mfbca = 3.0 * (mfbca + 0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; +// mfaaa = 3.0 * (mfaaa + 0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; +// mfcaa = 3.0 * (mfcaa + 0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; +// mfaca = 3.0 * (mfaca + 0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; +// mfcca = 3.0 * (mfcca + 0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; +// mfbbb = 3.0 * (mfbbb + 0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]; +// +// LBMReal rho1 = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + +// (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + +// (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) + +// (mfbba + mfbbc) + mfbbb; +// +// +// LBMReal oMdrho, m0, m1, m2; +// +// oMdrho = mfccc + mfaaa; +// m0 = mfaca + mfcac; +// m1 = mfacc + mfcaa; +// m2 = mfaac + mfcca; +// oMdrho += m0; +// m1 += m2; +// oMdrho += m1; +// m0 = mfbac + mfbca; +// m1 = mfbaa + mfbcc; +// m0 += m1; +// m1 = mfabc + mfcba; +// m2 = mfaba + mfcbc; +// m1 += m2; +// m0 += m1; +// m1 = mfacb + mfcab; +// m2 = mfaab + mfccb; +// m1 += m2; +// m0 += m1; +// oMdrho += m0; +// m0 = mfabb + mfcbb; +// m1 = mfbab + mfbcb; +// m2 = mfbba + mfbbc; +// m0 += m1 + m2; +// m0 += mfbbb; // hat gefehlt +// oMdrho = 1. - (oMdrho + m0); +// // oMdrho = rho - (oMdrho + m0); +// +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal wadjust; +// LBMReal qudricLimit = 0.01; +// //////////////////////////////////////////////////////////////////////////////////// +// // Hin +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// m2 = mfaaa + mfaac; +// m1 = mfaac - mfaaa; +// m0 = m2 + mfaab; +// mfaaa = m0; +// m0 += c1o36 * oMdrho; +// mfaab = m1 - m0 * uz; +// mfaac = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaba + mfabc; +// m1 = mfabc - mfaba; +// m0 = m2 + mfabb; +// mfaba = m0; +// m0 += c1o9 * oMdrho; +// mfabb = m1 - m0 * uz; +// mfabc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaca + mfacc; +// m1 = mfacc - mfaca; +// m0 = m2 + mfacb; +// mfaca = m0; +// m0 += c1o36 * oMdrho; +// mfacb = m1 - m0 * uz; +// mfacc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbaa + mfbac; +// m1 = mfbac - mfbaa; +// m0 = m2 + mfbab; +// mfbaa = m0; +// m0 += c1o9 * oMdrho; +// mfbab = m1 - m0 * uz; +// mfbac = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbba + mfbbc; +// m1 = mfbbc - mfbba; +// m0 = m2 + mfbbb; +// mfbba = m0; +// m0 += c4o9 * oMdrho; +// mfbbb = m1 - m0 * uz; +// mfbbc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbca + mfbcc; +// m1 = mfbcc - mfbca; +// m0 = m2 + mfbcb; +// mfbca = m0; +// m0 += c1o9 * oMdrho; +// mfbcb = m1 - m0 * uz; +// mfbcc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcaa + mfcac; +// m1 = mfcac - mfcaa; +// m0 = m2 + mfcab; +// mfcaa = m0; +// m0 += c1o36 * oMdrho; +// mfcab = m1 - m0 * uz; +// mfcac = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcba + mfcbc; +// m1 = mfcbc - mfcba; +// m0 = m2 + mfcbb; +// mfcba = m0; +// m0 += c1o9 * oMdrho; +// mfcbb = m1 - m0 * uz; +// mfcbc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcca + mfccc; +// m1 = mfccc - mfcca; +// m0 = m2 + mfccb; +// mfcca = m0; +// m0 += c1o36 * oMdrho; +// mfccb = m1 - m0 * uz; +// mfccc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// m2 = mfaaa + mfaca; +// m1 = mfaca - mfaaa; +// m0 = m2 + mfaba; +// mfaaa = m0; +// m0 += c1o6 * oMdrho; +// mfaba = m1 - m0 * uy; +// mfaca = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaab + mfacb; +// m1 = mfacb - mfaab; +// m0 = m2 + mfabb; +// mfaab = m0; +// mfabb = m1 - m0 * uy; +// mfacb = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaac + mfacc; +// m1 = mfacc - mfaac; +// m0 = m2 + mfabc; +// mfaac = m0; +// m0 += c1o18 * oMdrho; +// mfabc = m1 - m0 * uy; +// mfacc = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbaa + mfbca; +// m1 = mfbca - mfbaa; +// m0 = m2 + mfbba; +// mfbaa = m0; +// m0 += c2o3 * oMdrho; +// mfbba = m1 - m0 * uy; +// mfbca = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbab + mfbcb; +// m1 = mfbcb - mfbab; +// m0 = m2 + mfbbb; +// mfbab = m0; +// mfbbb = m1 - m0 * uy; +// mfbcb = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbac + mfbcc; +// m1 = mfbcc - mfbac; +// m0 = m2 + mfbbc; +// mfbac = m0; +// m0 += c2o9 * oMdrho; +// mfbbc = m1 - m0 * uy; +// mfbcc = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcaa + mfcca; +// m1 = mfcca - mfcaa; +// m0 = m2 + mfcba; +// mfcaa = m0; +// m0 += c1o6 * oMdrho; +// mfcba = m1 - m0 * uy; +// mfcca = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcab + mfccb; +// m1 = mfccb - mfcab; +// m0 = m2 + mfcbb; +// mfcab = m0; +// mfcbb = m1 - m0 * uy; +// mfccb = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcac + mfccc; +// m1 = mfccc - mfcac; +// m0 = m2 + mfcbc; +// mfcac = m0; +// m0 += c1o18 * oMdrho; +// mfcbc = m1 - m0 * uy; +// mfccc = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// m2 = mfaaa + mfcaa; +// m1 = mfcaa - mfaaa; +// m0 = m2 + mfbaa; +// mfaaa = m0; +// m0 += 1. * oMdrho; +// mfbaa = m1 - m0 * ux; +// mfcaa = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaba + mfcba; +// m1 = mfcba - mfaba; +// m0 = m2 + mfbba; +// mfaba = m0; +// mfbba = m1 - m0 * ux; +// mfcba = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaca + mfcca; +// m1 = mfcca - mfaca; +// m0 = m2 + mfbca; +// mfaca = m0; +// m0 += c1o3 * oMdrho; +// mfbca = m1 - m0 * ux; +// mfcca = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaab + mfcab; +// m1 = mfcab - mfaab; +// m0 = m2 + mfbab; +// mfaab = m0; +// mfbab = m1 - m0 * ux; +// mfcab = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfabb + mfcbb; +// m1 = mfcbb - mfabb; +// m0 = m2 + mfbbb; +// mfabb = m0; +// mfbbb = m1 - m0 * ux; +// mfcbb = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfacb + mfccb; +// m1 = mfccb - mfacb; +// m0 = m2 + mfbcb; +// mfacb = m0; +// mfbcb = m1 - m0 * ux; +// mfccb = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaac + mfcac; +// m1 = mfcac - mfaac; +// m0 = m2 + mfbac; +// mfaac = m0; +// m0 += c1o3 * oMdrho; +// mfbac = m1 - m0 * ux; +// mfcac = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfabc + mfcbc; +// m1 = mfcbc - mfabc; +// m0 = m2 + mfbbc; +// mfabc = m0; +// mfbbc = m1 - m0 * ux; +// mfcbc = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfacc + mfccc; +// m1 = mfccc - mfacc; +// m0 = m2 + mfbcc; +// mfacc = m0; +// m0 += c1o9 * oMdrho; +// mfbcc = m1 - m0 * ux; +// mfccc = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// // Cumulants +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal OxxPyyPzz = 1.; // omega2 or bulk viscosity +// LBMReal OxyyPxzz = 1.; //-s9;//2+s9;// +// LBMReal OxyyMxzz = 1.; // 2+s9;// +// LBMReal O4 = 1.; +// LBMReal O5 = 1.; +// LBMReal O6 = 1.; +// +// // Cum 4. +// LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); +// LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); +// LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); +// +// LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + +// c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); +// LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + +// c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); +// LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + +// c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); +// +// // Cum 5. +// LBMReal CUMbcc = mfbcc - +// (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + +// 2. * (mfbab * mfacb + mfbba * mfabc)) - +// c1o3 * (mfbca + mfbac) * oMdrho; +// LBMReal CUMcbc = mfcbc - +// (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + +// 2. * (mfabb * mfcab + mfbba * mfbac)) - +// c1o3 * (mfcba + mfabc) * oMdrho; +// LBMReal CUMccb = mfccb - +// (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + +// 2. * (mfbab * mfbca + mfabb * mfcba)) - +// c1o3 * (mfacb + mfcab) * oMdrho; +// +// // Cum 6. +// LBMReal CUMccc = +// mfccc + +// ((-4. * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - +// 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - +// 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + +// (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + +// 2. * (mfcaa * mfaca * mfaac) + 16. * mfbba * mfbab * mfabb) - +// c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho - +// c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - +// c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + +// (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + +// (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * +// c2o3 * oMdrho) + +// c1o27 * oMdrho; +// +// // 2. +// // linear combinations +// LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; +// LBMReal mxxMyy = mfcaa - mfaca; +// LBMReal mxxMzz = mfcaa - mfaac; +// +// LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); +// LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; +// LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; +// +// (*divU)(x1, x2, x3) = dxux + dyuy + dzuz; +// +// // relax +// mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - +// 3. * (1. - c1o2 * OxxPyyPzz) * (ux2 * dxux + uy2 * dyuy + uz2 * dzuz); +// mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (ux2 * dxux - uy2 * dyuy); +// mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (ux2 * dxux - uz2 * dzuz); +// +// mfabb += collFactorM * (-mfabb); +// mfbab += collFactorM * (-mfbab); +// mfbba += collFactorM * (-mfbba); +// +// // linear combinations back +// mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); +// mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); +// mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); +// +// // 3. +// // linear combinations +// LBMReal mxxyPyzz = mfcba + mfabc; +// LBMReal mxxyMyzz = mfcba - mfabc; +// +// LBMReal mxxzPyyz = mfcab + mfacb; +// LBMReal mxxzMyyz = mfcab - mfacb; +// +// LBMReal mxyyPxzz = mfbca + mfbac; +// LBMReal mxyyMxzz = mfbca - mfbac; +// +// // relax +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); +// mfbbb += wadjust * (-mfbbb); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); +// mxxyPyzz += wadjust * (-mxxyPyzz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); +// mxxyMyzz += wadjust * (-mxxyMyzz); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); +// mxxzPyyz += wadjust * (-mxxzPyyz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); +// mxxzMyyz += wadjust * (-mxxzMyyz); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); +// mxyyPxzz += wadjust * (-mxyyPxzz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); +// mxyyMxzz += wadjust * (-mxyyMxzz); +// +// // linear combinations back +// mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; +// mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; +// mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; +// mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; +// mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; +// mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; +// +// // 4. +// CUMacc += O4 * (-CUMacc); +// CUMcac += O4 * (-CUMcac); +// CUMcca += O4 * (-CUMcca); +// +// CUMbbc += O4 * (-CUMbbc); +// CUMbcb += O4 * (-CUMbcb); +// CUMcbb += O4 * (-CUMcbb); +// +// // 5. +// CUMbcc += O5 * (-CUMbcc); +// CUMcbc += O5 * (-CUMcbc); +// CUMccb += O5 * (-CUMccb); +// +// // 6. +// CUMccc += O6 * (-CUMccc); +// +// // back cumulants to central moments +// // 4. +// mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); +// mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); +// mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); +// +// mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + +// c1o9 * (oMdrho - 1) * oMdrho; +// mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + +// c1o9 * (oMdrho - 1) * oMdrho; +// mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + +// c1o9 * (oMdrho - 1) * oMdrho; +// +// // 5. +// mfbcc = CUMbcc + +// (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + +// 2. * (mfbab * mfacb + mfbba * mfabc)) + +// c1o3 * (mfbca + mfbac) * oMdrho; +// mfcbc = CUMcbc + +// (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + +// 2. * (mfabb * mfcab + mfbba * mfbac)) + +// c1o3 * (mfcba + mfabc) * oMdrho; +// mfccb = CUMccb + +// (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + +// 2. * (mfbab * mfbca + mfabb * mfcba)) + +// c1o3 * (mfacb + mfcab) * oMdrho; +// +// // 6. +// mfccc = CUMccc - +// ((-4. * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - +// 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) - +// 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + +// (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + +// 2. * (mfcaa * mfaca * mfaac) + 16. * mfbba * mfbab * mfabb) - +// c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho - +// c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - +// c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + +// (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + +// (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * +// c2o3 * oMdrho) - +// c1o27 * oMdrho; +// +// //////////////////////////////////////////////////////////////////////////////////// +// // forcing +// mfbaa = -mfbaa; +// mfaba = -mfaba; +// mfaab = -mfaab; +// ////////////////////////////////////////////////////////////////////////////////////// +// +// //////////////////////////////////////////////////////////////////////////////////// +// // back +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// m0 = mfaac * c1o2 + mfaab * (uz - c1o2) + (mfaaa + 1. * oMdrho) * (uz2 - uz) * c1o2; +// m1 = -mfaac - 2. * mfaab * uz + mfaaa * (1. - uz2) - 1. * oMdrho * uz2; +// m2 = mfaac * c1o2 + mfaab * (uz + c1o2) + (mfaaa + 1. * oMdrho) * (uz2 + uz) * c1o2; +// mfaaa = m0; +// mfaab = m1; +// mfaac = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfabc * c1o2 + mfabb * (uz - c1o2) + mfaba * (uz2 - uz) * c1o2; +// m1 = -mfabc - 2. * mfabb * uz + mfaba * (1. - uz2); +// m2 = mfabc * c1o2 + mfabb * (uz + c1o2) + mfaba * (uz2 + uz) * c1o2; +// mfaba = m0; +// mfabb = m1; +// mfabc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacc * c1o2 + mfacb * (uz - c1o2) + (mfaca + c1o3 * oMdrho) * (uz2 - uz) * c1o2; +// m1 = -mfacc - 2. * mfacb * uz + mfaca * (1. - uz2) - c1o3 * oMdrho * uz2; +// m2 = mfacc * c1o2 + mfacb * (uz + c1o2) + (mfaca + c1o3 * oMdrho) * (uz2 + uz) * c1o2; +// mfaca = m0; +// mfacb = m1; +// mfacc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfbac * c1o2 + mfbab * (uz - c1o2) + mfbaa * (uz2 - uz) * c1o2; +// m1 = -mfbac - 2. * mfbab * uz + mfbaa * (1. - uz2); +// m2 = mfbac * c1o2 + mfbab * (uz + c1o2) + mfbaa * (uz2 + uz) * c1o2; +// mfbaa = m0; +// mfbab = m1; +// mfbac = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbbc * c1o2 + mfbbb * (uz - c1o2) + mfbba * (uz2 - uz) * c1o2; +// m1 = -mfbbc - 2. * mfbbb * uz + mfbba * (1. - uz2); +// m2 = mfbbc * c1o2 + mfbbb * (uz + c1o2) + mfbba * (uz2 + uz) * c1o2; +// mfbba = m0; +// mfbbb = m1; +// mfbbc = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcc * c1o2 + mfbcb * (uz - c1o2) + mfbca * (uz2 - uz) * c1o2; +// m1 = -mfbcc - 2. * mfbcb * uz + mfbca * (1. - uz2); +// m2 = mfbcc * c1o2 + mfbcb * (uz + c1o2) + mfbca * (uz2 + uz) * c1o2; +// mfbca = m0; +// mfbcb = m1; +// mfbcc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcac * c1o2 + mfcab * (uz - c1o2) + (mfcaa + c1o3 * oMdrho) * (uz2 - uz) * c1o2; +// m1 = -mfcac - 2. * mfcab * uz + mfcaa * (1. - uz2) - c1o3 * oMdrho * uz2; +// m2 = mfcac * c1o2 + mfcab * (uz + c1o2) + (mfcaa + c1o3 * oMdrho) * (uz2 + uz) * c1o2; +// mfcaa = m0; +// mfcab = m1; +// mfcac = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfcbc * c1o2 + mfcbb * (uz - c1o2) + mfcba * (uz2 - uz) * c1o2; +// m1 = -mfcbc - 2. * mfcbb * uz + mfcba * (1. - uz2); +// m2 = mfcbc * c1o2 + mfcbb * (uz + c1o2) + mfcba * (uz2 + uz) * c1o2; +// mfcba = m0; +// mfcbb = m1; +// mfcbc = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfccb * (uz - c1o2) + (mfcca + c1o9 * oMdrho) * (uz2 - uz) * c1o2; +// m1 = -mfccc - 2. * mfccb * uz + mfcca * (1. - uz2) - c1o9 * oMdrho * uz2; +// m2 = mfccc * c1o2 + mfccb * (uz + c1o2) + (mfcca + c1o9 * oMdrho) * (uz2 + uz) * c1o2; +// mfcca = m0; +// mfccb = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// m0 = mfaca * c1o2 + mfaba * (uy - c1o2) + (mfaaa + c1o6 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfaca - 2. * mfaba * uy + mfaaa * (1. - uy2) - c1o6 * oMdrho * uy2; +// m2 = mfaca * c1o2 + mfaba * (uy + c1o2) + (mfaaa + c1o6 * oMdrho) * (uy2 + uy) * c1o2; +// mfaaa = m0; +// mfaba = m1; +// mfaca = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacb * c1o2 + mfabb * (uy - c1o2) + (mfaab + c2o3 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfacb - 2. * mfabb * uy + mfaab * (1. - uy2) - c2o3 * oMdrho * uy2; +// m2 = mfacb * c1o2 + mfabb * (uy + c1o2) + (mfaab + c2o3 * oMdrho) * (uy2 + uy) * c1o2; +// mfaab = m0; +// mfabb = m1; +// mfacb = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacc * c1o2 + mfabc * (uy - c1o2) + (mfaac + c1o6 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfacc - 2. * mfabc * uy + mfaac * (1. - uy2) - c1o6 * oMdrho * uy2; +// m2 = mfacc * c1o2 + mfabc * (uy + c1o2) + (mfaac + c1o6 * oMdrho) * (uy2 + uy) * c1o2; +// mfaac = m0; +// mfabc = m1; +// mfacc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfbca * c1o2 + mfbba * (uy - c1o2) + mfbaa * (uy2 - uy) * c1o2; +// m1 = -mfbca - 2. * mfbba * uy + mfbaa * (1. - uy2); +// m2 = mfbca * c1o2 + mfbba * (uy + c1o2) + mfbaa * (uy2 + uy) * c1o2; +// mfbaa = m0; +// mfbba = m1; +// mfbca = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcb * c1o2 + mfbbb * (uy - c1o2) + mfbab * (uy2 - uy) * c1o2; +// m1 = -mfbcb - 2. * mfbbb * uy + mfbab * (1. - uy2); +// m2 = mfbcb * c1o2 + mfbbb * (uy + c1o2) + mfbab * (uy2 + uy) * c1o2; +// mfbab = m0; +// mfbbb = m1; +// mfbcb = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcc * c1o2 + mfbbc * (uy - c1o2) + mfbac * (uy2 - uy) * c1o2; +// m1 = -mfbcc - 2. * mfbbc * uy + mfbac * (1. - uy2); +// m2 = mfbcc * c1o2 + mfbbc * (uy + c1o2) + mfbac * (uy2 + uy) * c1o2; +// mfbac = m0; +// mfbbc = m1; +// mfbcc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcca * c1o2 + mfcba * (uy - c1o2) + (mfcaa + c1o18 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfcca - 2. * mfcba * uy + mfcaa * (1. - uy2) - c1o18 * oMdrho * uy2; +// m2 = mfcca * c1o2 + mfcba * (uy + c1o2) + (mfcaa + c1o18 * oMdrho) * (uy2 + uy) * c1o2; +// mfcaa = m0; +// mfcba = m1; +// mfcca = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccb * c1o2 + mfcbb * (uy - c1o2) + (mfcab + c2o9 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfccb - 2. * mfcbb * uy + mfcab * (1. - uy2) - c2o9 * oMdrho * uy2; +// m2 = mfccb * c1o2 + mfcbb * (uy + c1o2) + (mfcab + c2o9 * oMdrho) * (uy2 + uy) * c1o2; +// mfcab = m0; +// mfcbb = m1; +// mfccb = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfcbc * (uy - c1o2) + (mfcac + c1o18 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfccc - 2. * mfcbc * uy + mfcac * (1. - uy2) - c1o18 * oMdrho * uy2; +// m2 = mfccc * c1o2 + mfcbc * (uy + c1o2) + (mfcac + c1o18 * oMdrho) * (uy2 + uy) * c1o2; +// mfcac = m0; +// mfcbc = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// m0 = mfcaa * c1o2 + mfbaa * (ux - c1o2) + (mfaaa + c1o36 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcaa - 2. * mfbaa * ux + mfaaa * (1. - ux2) - c1o36 * oMdrho * ux2; +// m2 = mfcaa * c1o2 + mfbaa * (ux + c1o2) + (mfaaa + c1o36 * oMdrho) * (ux2 + ux) * c1o2; +// mfaaa = m0; +// mfbaa = m1; +// mfcaa = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcba * c1o2 + mfbba * (ux - c1o2) + (mfaba + c1o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcba - 2. * mfbba * ux + mfaba * (1. - ux2) - c1o9 * oMdrho * ux2; +// m2 = mfcba * c1o2 + mfbba * (ux + c1o2) + (mfaba + c1o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfaba = m0; +// mfbba = m1; +// mfcba = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcca * c1o2 + mfbca * (ux - c1o2) + (mfaca + c1o36 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcca - 2. * mfbca * ux + mfaca * (1. - ux2) - c1o36 * oMdrho * ux2; +// m2 = mfcca * c1o2 + mfbca * (ux + c1o2) + (mfaca + c1o36 * oMdrho) * (ux2 + ux) * c1o2; +// mfaca = m0; +// mfbca = m1; +// mfcca = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcab * c1o2 + mfbab * (ux - c1o2) + (mfaab + c1o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcab - 2. * mfbab * ux + mfaab * (1. - ux2) - c1o9 * oMdrho * ux2; +// m2 = mfcab * c1o2 + mfbab * (ux + c1o2) + (mfaab + c1o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfaab = m0; +// mfbab = m1; +// mfcab = m2; +// ///////////b//////////////////////////////////////////////////////////////////////// +// m0 = mfcbb * c1o2 + mfbbb * (ux - c1o2) + (mfabb + c4o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcbb - 2. * mfbbb * ux + mfabb * (1. - ux2) - c4o9 * oMdrho * ux2; +// m2 = mfcbb * c1o2 + mfbbb * (ux + c1o2) + (mfabb + c4o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfabb = m0; +// mfbbb = m1; +// mfcbb = m2; +// ///////////b//////////////////////////////////////////////////////////////////////// +// m0 = mfccb * c1o2 + mfbcb * (ux - c1o2) + (mfacb + c1o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfccb - 2. * mfbcb * ux + mfacb * (1. - ux2) - c1o9 * oMdrho * ux2; +// m2 = mfccb * c1o2 + mfbcb * (ux + c1o2) + (mfacb + c1o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfacb = m0; +// mfbcb = m1; +// mfccb = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcac * c1o2 + mfbac * (ux - c1o2) + (mfaac + c1o36 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcac - 2. * mfbac * ux + mfaac * (1. - ux2) - c1o36 * oMdrho * ux2; +// m2 = mfcac * c1o2 + mfbac * (ux + c1o2) + (mfaac + c1o36 * oMdrho) * (ux2 + ux) * c1o2; +// mfaac = m0; +// mfbac = m1; +// mfcac = m2; +// ///////////c//////////////////////////////////////////////////////////////////////// +// m0 = mfcbc * c1o2 + mfbbc * (ux - c1o2) + (mfabc + c1o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcbc - 2. * mfbbc * ux + mfabc * (1. - ux2) - c1o9 * oMdrho * ux2; +// m2 = mfcbc * c1o2 + mfbbc * (ux + c1o2) + (mfabc + c1o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfabc = m0; +// mfbbc = m1; +// mfcbc = m2; +// ///////////c//////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfbcc * (ux - c1o2) + (mfacc + c1o36 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfccc - 2. * mfbcc * ux + mfacc * (1. - ux2) - c1o36 * oMdrho * ux2; +// m2 = mfccc * c1o2 + mfbcc * (ux + c1o2) + (mfacc + c1o36 * oMdrho) * (ux2 + ux) * c1o2; +// mfacc = m0; +// mfbcc = m1; +// mfccc = m2; +// +// /////////////////////////////////////////////////////////////////////////// +// +// ////////////////////////////////////////////////////////////////////////// +// // proof correctness +// ////////////////////////////////////////////////////////////////////////// +//#ifdef PROOF_CORRECTNESS +// LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + +// (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + +// (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) + +// (mfbba + mfbbc) + mfbbb; +// +// LBMReal dif = rho1 - rho_post; +//#ifdef SINGLEPRECISION +// if (dif > 10.0E-7 || dif < -10.0E-7) +//#else +// if (dif > 10.0E-15 || dif < -10.0E-15) +//#endif +// { +// UB_THROW(UbException(UB_EXARGS, +// "rho=" + UbSystem::toString(rho) + ", rho_post=" + +// UbSystem::toString(rho_post) + " dif=" + UbSystem::toString(dif) + +// " rho is not correct for node " + UbSystem::toString(x1) + "," + +// UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// } +//#endif +// +// mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00]; +// mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N]; +// mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T]; +// mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE]; +// mfacb = rho * c1o3 * (mfacb) + 0.5 * forcingTerm[NW]; +// mfcbc = rho * c1o3 * (mfcbc) + 0.5 * forcingTerm[TE]; +// mfabc = rho * c1o3 * (mfabc) + 0.5 * forcingTerm[TW]; +// mfbcc = rho * c1o3 * (mfbcc) + 0.5 * forcingTerm[TN]; +// mfbac = rho * c1o3 * (mfbac) + 0.5 * forcingTerm[TS]; +// mfccc = rho * c1o3 * (mfccc) + 0.5 * forcingTerm[TNE]; +// mfacc = rho * c1o3 * (mfacc) + 0.5 * forcingTerm[TNW]; +// mfcac = rho * c1o3 * (mfcac) + 0.5 * forcingTerm[TSE]; +// mfaac = rho * c1o3 * (mfaac) + 0.5 * forcingTerm[TSW]; +// mfabb = rho * c1o3 * (mfabb) + 0.5 * forcingTerm[W]; +// mfbab = rho * c1o3 * (mfbab) + 0.5 * forcingTerm[S]; +// mfbba = rho * c1o3 * (mfbba) + 0.5 * forcingTerm[B]; +// mfaab = rho * c1o3 * (mfaab) + 0.5 * forcingTerm[SW]; +// mfcab = rho * c1o3 * (mfcab) + 0.5 * forcingTerm[SE]; +// mfaba = rho * c1o3 * (mfaba) + 0.5 * forcingTerm[BW]; +// mfcba = rho * c1o3 * (mfcba) + 0.5 * forcingTerm[BE]; +// mfbaa = rho * c1o3 * (mfbaa) + 0.5 * forcingTerm[BS]; +// mfbca = rho * c1o3 * (mfbca) + 0.5 * forcingTerm[BN]; +// mfaaa = rho * c1o3 * (mfaaa) + 0.5 * forcingTerm[BSW]; +// mfcaa = rho * c1o3 * (mfcaa) + 0.5 * forcingTerm[BSE]; +// mfaca = rho * c1o3 * (mfaca) + 0.5 * forcingTerm[BNW]; +// mfcca = rho * c1o3 * (mfcca) + 0.5 * forcingTerm[BNE]; +// mfbbb = rho * c1o3 * (mfbbb) + 0.5 * forcingTerm[REST]; +// +// ////////////////////////////////////////////////////////////////////////// +// // write distribution for F +// ////////////////////////////////////////////////////////////////////////// +// +// (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb; +// (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab; +// (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba; +// (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; +// (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; +// (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; +// (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; +// (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; +// (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; +// (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; +// (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; +// (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; +// (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; +// +// (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; +// +// (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb; +// !Old Kernel + ///////////////////// P H A S E - F I E L D S O L V E R + //////////////////////////////////////////// + /////CUMULANT PHASE-FIELD + LBMReal omegaD =1.0/( 3.0 * mob + 0.5); + { + mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // fluid component + //LBMReal drhoFluid = + // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) + + // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) + + // ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb; + + //LBMReal rhoFluid = c1 + drhoFluid; + //LBMReal OOrhoFluid = c1 / rhoFluid; + + + //LBMReal vvx = + // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) + + // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) + + // (fcbb - fabb)) * OOrhoFluid; + //LBMReal vvy = + // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) + + // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) + + // (fbcb - fbab)) * OOrhoFluid; + //LBMReal vvz = + // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) + + // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) + + // (fbbc - fbba)) * OOrhoFluid; + + // LBMReal vvx = ux; + // LBMReal vvy = uy; + // LBMReal vvz = uz; + //////////////////////////////////////////////////////////////////////////////////// + // second component + LBMReal concentration = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + // LBMReal fx = forces[0]; + // LBMReal fy = forces[1]; + // LBMReal fz = -concentration * forces[2]; + // vvx += fx * c1o2; + // vvy += fy * c1o2; + // vvz += fz * c1o2; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal oneMinusRho = c1- concentration; + + LBMReal cx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal cy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal cz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal cx2 = cx * cx; + LBMReal cy2 = cy * cy; + LBMReal cz2 = cz * cz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfaab, mfabb, mfacb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + forwardChimera(mfaba, mfbba, mfcba, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfaab, mfbab, mfcab, cx, cx2); + forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + //! - experimental Cumulant ... to be published ... hopefully + //! + + // linearized orthogonalization of 3rd order central moments + LBMReal Mabc = mfabc - mfaba * c1o3; + LBMReal Mbca = mfbca - mfbaa * c1o3; + LBMReal Macb = mfacb - mfaab * c1o3; + LBMReal Mcba = mfcba - mfaba * c1o3; + LBMReal Mcab = mfcab - mfaab * c1o3; + LBMReal Mbac = mfbac - mfbaa * c1o3; + // linearized orthogonalization of 5th order central moments + LBMReal Mcbc = mfcbc - mfaba * c1o9; + LBMReal Mbcc = mfbcc - mfbaa * c1o9; + LBMReal Mccb = mfccb - mfaab * c1o9; + + // collision of 1st order moments + // LBMReal ccx, ccy, ccz; + + + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + + //cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + // normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST])*(phi[REST]+phi2[REST]) * c1o3 * oneOverInterfaceScale; + //cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + // normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * (phi[REST] + phi2[REST]) * c1o3 * oneOverInterfaceScale; + //cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + // normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[REST]) * (phi[REST]) * (phi[REST] + phi2[REST]) * c1o3 * oneOverInterfaceScale; + + //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx; + //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy; + //mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz; + + + cx2 = cx * cx; + cy2 = cy * cy; + cz2 = cz * cz; + + // equilibration of 2nd order moments + mfbba = zeroReal; + mfbab = zeroReal; + mfabb = zeroReal; + + mfcaa = c1o3 * concentration; + mfaca = c1o3 * concentration; + mfaac = c1o3 * concentration; + + + //LBMReal omega2 = 1.0f;// omegaD; + //mfbba *= (c1 - omega2); + //mfbab *= (c1 - omega2); + //mfabb *= (c1 - omega2); + + //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration; + + // equilibration of 3rd order moments + Mabc = zeroReal; + Mbca = zeroReal; + Macb = zeroReal; + Mcba = zeroReal; + Mcab = zeroReal; + Mbac = zeroReal; + mfbbb = zeroReal; + + // from linearized orthogonalization 3rd order central moments to central moments + mfabc = Mabc + mfaba * c1o3; + mfbca = Mbca + mfbaa * c1o3; + mfacb = Macb + mfaab * c1o3; + mfcba = Mcba + mfaba * c1o3; + mfcab = Mcab + mfaab * c1o3; + mfbac = Mbac + mfbaa * c1o3; + + // equilibration of 4th order moments + mfacc = c1o9 * concentration; + mfcac = c1o9 * concentration; + mfcca = c1o9 * concentration; + + mfcbb = zeroReal; + mfbcb = zeroReal; + mfbbc = zeroReal; + + // equilibration of 5th order moments + Mcbc = zeroReal; + Mbcc = zeroReal; + Mccb = zeroReal; + + // from linearized orthogonalization 5th order central moments to central moments + mfcbc = Mcbc + mfaba * c1o9; + mfbcc = Mbcc + mfbaa * c1o9; + mfccb = Mccb + mfaab * c1o9; + + // equilibration of 6th order moment + mfccc = c1o27 * concentration; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + backwardChimera(mfaba, mfbba, mfcba, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfaab, mfbab, mfcab, cx, cx2); + backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfaab, mfabb, mfacb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + + + (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3 ) = mfcbb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3 ) = mfbcb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3 ) = mfccb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3 ) = mfacb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb; + } + + ////Phasefield 2: + + { + + normX1 *= -1; + normX2 *= -1; + normX3 *= -1; + + mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p); + mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3); + + + //////////////////////////////////////////////////////////////////////////////////// +//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref +//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> +//! +//////////////////////////////////////////////////////////////////////////////////// +// fluid component + //LBMReal drhoFluid = + // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) + + // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) + + // ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb; + + //LBMReal rhoFluid = c1 + drhoFluid; + //LBMReal OOrhoFluid = c1 / rhoFluid; + + + //LBMReal vvx = + // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) + + // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) + + // (fcbb - fabb)) * OOrhoFluid; + //LBMReal vvy = + // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) + + // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) + + // (fbcb - fbab)) * OOrhoFluid; + //LBMReal vvz = + // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) + + // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) + + // (fbbc - fbba)) * OOrhoFluid; + + // LBMReal vvx = ux; + // LBMReal vvy = uy; + // LBMReal vvz = uz; + //////////////////////////////////////////////////////////////////////////////////// + // second component + LBMReal concentration = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + // LBMReal fx = forces[0]; + // LBMReal fy = forces[1]; + // LBMReal fz = -concentration * forces[2]; + // vvx += fx * c1o2; + // vvy += fy * c1o2; + // vvz += fz * c1o2; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal oneMinusRho = c1 - concentration; + + LBMReal cx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal cy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal cz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal cx2 = cx * cx; + LBMReal cy2 = cy * cy; + LBMReal cz2 = cz * cz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfaab, mfabb, mfacb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + forwardChimera(mfaba, mfbba, mfcba, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfaab, mfbab, mfcab, cx, cx2); + forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + //! - experimental Cumulant ... to be published ... hopefully + //! + + // linearized orthogonalization of 3rd order central moments + LBMReal Mabc = mfabc - mfaba * c1o3; + LBMReal Mbca = mfbca - mfbaa * c1o3; + LBMReal Macb = mfacb - mfaab * c1o3; + LBMReal Mcba = mfcba - mfaba * c1o3; + LBMReal Mcab = mfcab - mfaab * c1o3; + LBMReal Mbac = mfbac - mfbaa * c1o3; + // linearized orthogonalization of 5th order central moments + LBMReal Mcbc = mfcbc - mfaba * c1o9; + LBMReal Mbcc = mfbcc - mfbaa * c1o9; + LBMReal Mccb = mfccb - mfaab * c1o9; + + // collision of 1st order moments + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + normX1 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + normX2 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + normX3 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + + //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx; + //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy; +//mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz; + + + cx2 = cx * cx; + cy2 = cy * cy; + cz2 = cz * cz; + + // equilibration of 2nd order moments + mfbba = zeroReal; + mfbab = zeroReal; + mfabb = zeroReal; + + mfcaa = c1o3 * concentration; + mfaca = c1o3 * concentration; + mfaac = c1o3 * concentration; + + + //LBMReal omega2 = 1.0f;// omegaD; + //mfbba *= (c1 - omega2); + //mfbab *= (c1 - omega2); + //mfabb *= (c1 - omega2); + + //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration; + + // equilibration of 3rd order moments + Mabc = zeroReal; + Mbca = zeroReal; + Macb = zeroReal; + Mcba = zeroReal; + Mcab = zeroReal; + Mbac = zeroReal; + mfbbb = zeroReal; + + // from linearized orthogonalization 3rd order central moments to central moments + mfabc = Mabc + mfaba * c1o3; + mfbca = Mbca + mfbaa * c1o3; + mfacb = Macb + mfaab * c1o3; + mfcba = Mcba + mfaba * c1o3; + mfcab = Mcab + mfaab * c1o3; + mfbac = Mbac + mfbaa * c1o3; + + // equilibration of 4th order moments + mfacc = c1o9 * concentration; + mfcac = c1o9 * concentration; + mfcca = c1o9 * concentration; + + mfcbb = zeroReal; + mfbcb = zeroReal; + mfbbc = zeroReal; + + // equilibration of 5th order moments + Mcbc = zeroReal; + Mbcc = zeroReal; + Mccb = zeroReal; + + // from linearized orthogonalization 5th order central moments to central moments + mfcbc = Mcbc + mfaba * c1o9; + mfbcc = Mbcc + mfbaa * c1o9; + mfccb = Mccb + mfaab * c1o9; + + // equilibration of 6th order moment + mfccc = c1o27 * concentration; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + backwardChimera(mfaba, mfbba, mfcba, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfaab, mfbab, mfcab, cx, cx2); + backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfaab, mfabb, mfacb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + + + (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH2)(x1, x2, x3) = mfbbb; + + } + + + + /////!CUMULANT PHASE-FIELD + + + + ///////////////////// PHASE-FIELD BGK SOLVER /////////////////////////////// + + //h[DIR_P00] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + //h[N] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + //h[T] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + //h[NE] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + //h[NW] = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + //h[TE] = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + //h[TW] = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + //h[TN] = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + //h[TS] = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + //h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + //h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + //h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + //h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + //h[W] = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + //h[S] = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + //h[B] = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + //h[SW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + //h[SE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + //h[BW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + //h[BE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + //h[BS] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + //h[BN] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + //h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + //h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + //h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + //h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + //h[REST] = (*this->zeroDistributionsH)(x1, x2, x3); + + //for (int dir = STARTF; dir < (ENDF + 1); dir++) { + // LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz; + // LBMReal velSq1 = velProd * velProd; + // LBMReal hEq; //, gEq; + + // if (dir != REST) { + // LBMReal dirGrad_phi = (phi[dir] - phi[INVDIR[dir]]) / 2.0; + // LBMReal hSource = (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST]) * (dirGrad_phi) / denom; + // hEq = phi[REST] * WEIGTH[dir] * (1.0 + 3.0 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)) + hSource * WEIGTH[dir]; + + // // This corresponds with the collision factor of 1.0 which equals (tauH + 0.5). + // h[dir] = h[dir] - (h[dir] - hEq) / (tauH); + + // } else { + // hEq = phi[REST] * WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); + // h[REST] = h[REST] - (h[REST] - hEq) / (tauH); + // } + //} + + //(*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3) = h[D3Q27System::INV_E]; + //(*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3) = h[D3Q27System::INV_N]; + //(*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3) = h[D3Q27System::INV_T]; + //(*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3) = h[D3Q27System::INV_NE]; + //(*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3) = h[D3Q27System::INV_NW]; + //(*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3) = h[D3Q27System::INV_TE]; + //(*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3) = h[D3Q27System::INV_TW]; + //(*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3) = h[D3Q27System::INV_TN]; + //(*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3) = h[D3Q27System::INV_TS]; + //(*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3) = h[D3Q27System::INV_TNE]; + //(*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3) = h[D3Q27System::INV_TNW]; + //(*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3) = h[D3Q27System::INV_TSE]; + //(*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = h[D3Q27System::INV_TSW]; + + //(*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3) = h[D3Q27System::INV_W]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3) = h[D3Q27System::INV_S]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p) = h[D3Q27System::INV_B]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3) = h[D3Q27System::INV_SW]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3) = h[D3Q27System::INV_SE]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p) = h[D3Q27System::INV_BW]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p) = h[D3Q27System::INV_BE]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p) = h[D3Q27System::INV_BS]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p) = h[D3Q27System::INV_BN]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = h[D3Q27System::INV_BSW]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p) = h[D3Q27System::INV_BSE]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p) = h[D3Q27System::INV_BNW]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p) = h[D3Q27System::INV_BNE]; + + //(*this->zeroDistributionsH)(x1, x2, x3) = h[D3Q27System::REST]; + + ///////////////////// END OF OLD BGK SOLVER /////////////////////////////// + } + } + } + + // dataSet->setPhaseField(divU); + } +} +////////////////////////////////////////////////////////////////////////// + +LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX1_phi() +{ + using namespace D3Q27System; + return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX1[k] * phi[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX2_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX2[k] * phi[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX3_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX3[k] * phi[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX1_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX1[k] * phi2[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX2_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX2[k] * phi2[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::gradX3_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX3[k] * phi2[k]; + //} + //return 3.0 * sum; +} + + + + + +LBMReal MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::nabla2_phi() +{ + using namespace D3Q27System; + LBMReal sum = 0.0; + sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000]))) + + (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000])))); + sum += WEIGTH[DIR_0PP] * ( + (((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000]))) + + (((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000]))) + + (((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000]))) + ); + sum += WEIGTH[DIR_00P] * ( + ((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000])) + + ((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000])) + + ((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000])) + ); + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * (phi[k] - phi[REST]); + //} + return 6.0 * sum; +} + +void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::computePhasefield() +{ + using namespace D3Q27System; + SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth; + int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth; + int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth; + + //------------- Computing the phase-field ------------------ + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + // if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + h[DIR_P00] = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3); + } + } + } + } +} + +void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } else { + phi[k] = 0.0; + } + } +} + +void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi2[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } + else { + phi2[k] = 0.0; + } + } +} + +void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::swapDistributions() +{ + LBMKernel::swapDistributions(); + dataSet->getHdistributions()->swap(); + dataSet->getH2distributions()->swap(); +} + +void MultiphaseTwoPhaseFieldsPressureFilterLBMKernel::initForcing() +{ + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + + muForcingX1.DefineVar("rho",&muRho); + muForcingX2.DefineVar("rho",&muRho); + muForcingX3.DefineVar("rho",&muRho); + +} diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h new file mode 100644 index 0000000000000000000000000000000000000000..7d20f8210474b665da49c88068746a39faacfb2e --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h @@ -0,0 +1,130 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseTwoPhaseFieldsPressureFilterLBMKernel.h +//! \ingroup LBMKernel +//! \author Hesameddin Safari +//======================================================================================= + +#ifndef MultiphaseTwoPhaseFieldsPressureFilterLBMKernel_H +#define MultiphaseTwoPhaseFieldsPressureFilterLBMKernel_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +//! \brief Multiphase Cascaded Cumulant LBM kernel. +//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model +//! \author H. Safari, K. Kutscher, M. Geier +class MultiphaseTwoPhaseFieldsPressureFilterLBMKernel : public LBMKernel +{ +public: + MultiphaseTwoPhaseFieldsPressureFilterLBMKernel(); + virtual ~MultiphaseTwoPhaseFieldsPressureFilterLBMKernel(void) = default; + void calculate(int step) override; + SPtr<LBMKernel> clone() override; + + + ///refactor + //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure; + + + double getCalculationTime() override { return .0; } +protected: + virtual void initDataSet(); + void swapDistributions() override; + + void initForcing(); + + void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + + LBMReal f1[D3Q27System::ENDF+1]; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH1; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH2; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH2; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH2; + + //CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr phaseField; + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld; + + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField2; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU; + + LBMReal h [D3Q27System::ENDF+1]; + LBMReal h2[D3Q27System::ENDF + 1]; + LBMReal g [D3Q27System::ENDF+1]; + LBMReal phi[D3Q27System::ENDF+1]; + LBMReal phi2[D3Q27System::ENDF + 1]; + LBMReal pr1[D3Q27System::ENDF+1]; + LBMReal phi_cutoff[D3Q27System::ENDF+1]; + + LBMReal gradX1_phi(); + LBMReal gradX2_phi(); + LBMReal gradX3_phi(); + LBMReal gradX1_phi2(); + LBMReal gradX2_phi2(); + LBMReal gradX3_phi2(); + //LBMReal gradX1_pr1(); + //LBMReal gradX2_pr1(); + //LBMReal gradX3_pr1(); + //LBMReal dirgradC_phi(int n, int k); + void computePhasefield(); + void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3); + void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3); + //void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, int x1, int x2, int x3); + //void pressureFiltering(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf_filtered /*Pressure-Field*/); + + LBMReal nabla2_phi(); + + + mu::value_type muX1,muX2,muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + mu::value_type muRho; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; +}; + +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ffed1483ca63e674b26023aca87cb63986644813 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp @@ -0,0 +1,3488 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.cpp +//! \ingroup LBMKernel +//! \author Hesameddin Safari +//======================================================================================= + +#include "MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h" +#include "BCArray3D.h" +#include "Block3D.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "D3Q27System.h" +#include "DataSet3D.h" +#include "LBMKernel.h" +#include <cmath> + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel() { this->compressible = false; } +////////////////////////////////////////////////////////////////////////// +void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> f(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); + SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); // For phase-field + SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); // For phase-field + SPtr<PhaseFieldArray3D> divU(new PhaseFieldArray3D(nx[0] + 2, nx[1] + 2, nx[2] + 2, 0.0)); + pressure= CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 2, nx[1] + 2, nx[2] + 2, 0.0)); + pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 2, nx[1] + 2, nx[2] + 2, 0.0)); + dataSet->setFdistributions(f); + dataSet->setHdistributions(h); // For phase-field + dataSet->setH2distributions(h2); // For phase-field + dataSet->setPhaseField(divU); +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel()); + kernel->setNX(nx); + dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel>(kernel)->initDataSet(); + kernel->setCollisionFactorMultiphase(this->collFactorL, this->collFactorG); + kernel->setDensityRatio(this->densityRatio); + kernel->setMultiphaseModelParameters(this->beta, this->kappa); + kernel->setContactAngle(this->contactAngle); + kernel->setPhiL(this->phiL); + kernel->setPhiH(this->phiH); + kernel->setPhaseFieldRelaxation(this->tauH); + kernel->setMobility(this->mob); + + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + + return kernel; +} +////////////////////////////////////////////////////////////////////////// + void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m2 = mfa + mfc; + LBMReal m1 = mfc - mfa; + LBMReal m0 = m2 + mfb; + mfa = m0; + m0 *= Kinverse; + m0 += oneMinusRho; + mfb = (m1 * Kinverse - m0 * vv) * K; + mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; +} + +//////////////////////////////////////////////////////////////////////////////// + void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho) { + using namespace UbMath; + LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 - vv) * c1o2) * K; + LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (-v2)) * K; + mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + oneMinusRho) * (v2 + vv) * c1o2) * K; + mfa = m0; + mfb = m1; +} + + +//////////////////////////////////////////////////////////////////////////////// + void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal m1 = (mfa + mfc) + mfb; + LBMReal m2 = mfc - mfa; + mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); + mfb = m2 - vv * m1; + mfa = m1; +} + + + void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { + using namespace UbMath; + LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); + LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; + mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); + mfb = mb; + mfa = ma; +} + + +void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + using namespace UbMath; + + forcingX1 = 0.0; + forcingX2 = 0.0; + forcingX3 = 0.0; + + LBMReal oneOverInterfaceScale = 1.0; + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + localDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions(); + nonLocalDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions(); + zeroDistributionsH1 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions(); + + localDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getLocalDistributions(); + nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions(); + zeroDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + //TODO + //very expensive !!!!! + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField( + new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, -999.0)); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr phaseField2( + new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, -999.0)); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr divU( + new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0)); + +#pragma omp parallel for + for (int x3 = 0; x3 <= maxX3; x3++) { + for (int x2 = 0; x2 <= maxX2; x2++) { + for (int x1 = 0; x1 <= maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + LBMReal mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + (*phaseField)(x1, x2, x3) = (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc)) ) + + (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) + + ((mfbaa + mfbac) + (mfbca + mfbcc))) + ((mfabb + mfcbb) + + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb; + + mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3); + (*phaseField2)(x1, x2, x3) = + (((mfaaa + mfccc) + (mfaca + mfcac)) + ((mfaac + mfcca) + (mfcaa + mfacc))) + + (((mfaab + mfacb) + (mfcab + mfccb)) + ((mfaba + mfabc) + (mfcba + mfcbc)) + + ((mfbaa + mfbac) + (mfbca + mfbcc))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc)) + mfbbb; + //(*phaseField)(x1, x2, x3) = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + // (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + + // (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + + // (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + +////// read F-distributions for velocity formalism + + + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); + (*pressure)(x1, x2, x3) = (*pressure)(x1, x2, x3) + rho * c1o3 * drho; + + ////!!!!!! relplace by pointer swap! + (*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3); + } + } + } + } + + LBMReal collFactorM; + //LBMReal forcingTerm[D3Q27System::ENDF + 1]; + + ////filter + + //for (int x3 = minX3; x3 < maxX3; x3++) { + // for (int x2 = minX2; x2 < maxX2; x2++) { + // for (int x1 = minX1; x1 < maxX1; x1++) { + // if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + + // LBMReal sum = 0.; + + // //Lapalce pressure + // //sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3+1) - (*pressure)(x1, x2, x3)))) + // // + ((((*pressure)(x1+1, x2-1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3+1) - (*pressure)(x1, x2, x3))))); + // //sum += WEIGTH[TN] * ( + // // ((((*pressure)(x1+1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3) - (*pressure)(x1, x2, x3)))) + // // + ((((*pressure)(x1+1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3+1) - (*pressure)(x1, x2, x3)))) + // // + ((((*pressure)(x1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) - (*pressure)(x1, x2, x3)))) + // // ); + // //sum += WEIGTH[T] * ( + // // (((*pressure)(x1+1, x2, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3) - (*pressure)(x1, x2, x3))) + // // + (((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3) - (*pressure)(x1, x2, x3))) + // // + (((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2, x3-1) - (*pressure)(x1, x2, x3))) + // // ); + + + // //LBMReal pressureFilter = 100; + // //(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + pressureFilter * sum * (sqrt(fabs(sum))); + + // //Situpol Eq. 81 + // sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1)) + ((*pressure)(x1-1, x2-1, x3-1) )) + (((*pressure)(x1+1, x2+1, x3-1) ) + ((*pressure)(x1-1, x2-1, x3+1) ))) + // + ((((*pressure)(x1+1, x2-1, x3+1) ) + ((*pressure)(x1-1, x2+1, x3-1) )) + (((*pressure)(x1+1, x2-1, x3-1) ) + ((*pressure)(x1-1, x2+1, x3+1) )))); + // sum += WEIGTH[TN] * ( + // ((((*pressure)(x1+1, x2+1, x3) ) + ((*pressure)(x1-1, x2-1, x3) )) + (((*pressure)(x1+1, x2-1, x3) ) + ((*pressure)(x1-1, x2+1, x3) ))) + // + ((((*pressure)(x1+1, x2, x3+1) ) + ((*pressure)(x1-1, x2, x3-1) )) + (((*pressure)(x1+1, x2, x3-1) ) + ((*pressure)(x1-1, x2, x3+1) ))) + // + ((((*pressure)(x1, x2+1, x3+1) ) + ((*pressure)(x1, x2-1, x3-1) )) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) ))) + // ); + // sum += WEIGTH[T] * ( + // (((*pressure)(x1+1, x2, x3) ) + ((*pressure)(x1-1, x2, x3) )) + // + (((*pressure)(x1, x2+1, x3) ) + ((*pressure)(x1, x2-1, x3) )) + // + (((*pressure)(x1, x2, x3+1)) + ((*pressure)(x1, x2, x3-1) )) + // ); + // sum += WEIGTH[REST] * (*pressure)(x1, x2, x3); + // (*pressureOld)(x1, x2, x3) = sum; + + + + + // } + // } + // } + //} + + ////Periodic Filter +#pragma omp parallel for + for (int x3 = 0; x3 <= maxX3; x3++) { + for (int x2 = 0; x2 <= maxX2; x2++) { + for (int x1 = 0; x1 <= maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + + LBMReal sum = 0.; + + + + //Lapalce pressure + //sum += WEIGTH[TNE] * (((((*pressure)(x1+1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3+1) - (*pressure)(x1, x2, x3)))) + // + ((((*pressure)(x1+1, x2-1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3+1) - (*pressure)(x1, x2, x3))))); + //sum += WEIGTH[TN] * ( + // ((((*pressure)(x1+1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2-1, x3) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2-1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2+1, x3) - (*pressure)(x1, x2, x3)))) + // + ((((*pressure)(x1+1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1+1, x2, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3+1) - (*pressure)(x1, x2, x3)))) + // + ((((*pressure)(x1, x2+1, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3-1) - (*pressure)(x1, x2, x3))) + (((*pressure)(x1, x2+1, x3-1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3+1) - (*pressure)(x1, x2, x3)))) + // ); + //sum += WEIGTH[T] * ( + // (((*pressure)(x1+1, x2, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1-1, x2, x3) - (*pressure)(x1, x2, x3))) + // + (((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2-1, x3) - (*pressure)(x1, x2, x3))) + // + (((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2, x3-1) - (*pressure)(x1, x2, x3))) + // ); + + + //LBMReal pressureFilter = 100; + //(*pressureOld)(x1, x2, x3) = (*pressure)(x1, x2, x3) + pressureFilter * sum * (sqrt(fabs(sum))); + + //Situpol Eq. 81 + + //int x1p = (x1 < maxX1) ? x1 + 1 : 0; + //int x1m = (x1 > 0) ? x1 - 1 : maxX1; + //int x2p = (x2 < maxX2) ? x2 + 1 : 0; + //int x2m = (x2 > 0) ? x2 - 1 : maxX2; + //int x3p = (x3 < maxX3) ? x3 + 1 : 0; + //int x3m = (x3 > 0) ? x3 - 1 : maxX3; + //sum += WEIGTH[TNE] * (((((*pressure)(x1p, x2p, x3p)) + ((*pressure)(x1m, x2m, x3m))) + (((*pressure)(x1p, x2p, x3m)) + ((*pressure)(x1m, x2m, x3p)))) + // + ((((*pressure)(x1p, x2m, x3p)) + ((*pressure)(x1m, x2p, x3m))) + (((*pressure)(x1p, x2m, x3m)) + ((*pressure)(x1m, x2p, x3p))))); + //sum += WEIGTH[TN] * ( + // ((((*pressure)(x1p, x2p, x3)) + ((*pressure)(x1m, x2m, x3))) + (((*pressure)(x1p, x2m, x3)) + ((*pressure)(x1m, x2p, x3)))) + // + ((((*pressure)(x1p, x2, x3p)) + ((*pressure)(x1m, x2, x3m))) + (((*pressure)(x1p, x2, x3m)) + ((*pressure)(x1m, x2, x3p)))) + // + ((((*pressure)(x1, x2p, x3p)) + ((*pressure)(x1, x2m, x3m))) + (((*pressure)(x1, x2p, x3m) - (*pressure)(x1, x2, x3)) + ((*pressure)(x1, x2m, x3p)))) + // ); + //sum += WEIGTH[T] * ( + // (((*pressure)(x1p, x2, x3)) + ((*pressure)(x1m, x2, x3))) + // + (((*pressure)(x1, x2p, x3)) + ((*pressure)(x1, x2m, x3))) + // + (((*pressure)(x1, x2, x3p)) + ((*pressure)(x1, x2, x3m))) + // ); + //sum += WEIGTH[REST] * (*pressure)(x1, x2, x3); + //(*pressureOld)(x1, x2, x3) = sum; + + ///Version for boundaries + for (int xx = -1; xx <= 1; xx++) { + int xxx = (xx+x1 <= maxX1) ? ((xx + x1 > 0) ? xx + x1 : maxX1) : 0; + + for (int yy = -1; yy <= 1; yy++) { + int yyy = (yy+x2 <= maxX2) ? ((yy + x2 > 0) ? yy + x2 : maxX2) : 0; + + for (int zz = -1; zz <= 1; zz++) { + int zzz = (zz+x3 <= maxX3) ? ((zz + x3 > 0) ? zz + x3 : maxX3 ): 0; + + if (!bcArray->isSolid(xxx, yyy, zzz) && !bcArray->isUndefined(xxx, yyy, zzz)) { + sum+= 64.0/(216.0*(c1+c3*abs(xx))* (c1 + c3 * abs(yy))* (c1 + c3 * abs(zz)))*(*pressure)(xxx, yyy, zzz); + } + else{ sum+= 64.0 / (216.0 * (c1 + c3 * abs(xx)) * (c1 + c3 * abs(yy)) * (c1 + c3 * abs(zz))) * (*pressure)(x1, x2, x3); + } + + + } + } + } + (*pressureOld)(x1, x2, x3) = sum; + + + + } + } + } + } + +#pragma omp parallel for + for (int x3 = 0; x3 <= maxX3; x3++) { + for (int x2 = 0; x2 <= maxX2; x2++) { + for (int x1 = 0; x1 <= maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + ///filter! + + (*pressure)(x1, x2, x3) = (*pressureOld)(x1, x2, x3); + } + } + } + } + ////!filter + + +#pragma omp parallel for + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + + + ////////////////////////////////////////////////////////////////////////// + // Read distributions and phase field + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + // E N T + // c c c + ////////// + // W S B + // a a a + + // Rest ist b + + // mfxyz + // a - negative + // b - null + // c - positive + + // a b c + //-1 0 1 + + findNeighbors(phaseField, x1, x2, x3); + findNeighbors2(phaseField2, x1, x2, x3); + + LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal rhoH = 1.0; + LBMReal rhoL = 1.0 / densityRatio; + + LBMReal rhoToPhi = (rhoH - rhoL) / (phiH - phiL); + + LBMReal dX1_phi = gradX1_phi(); + LBMReal dX2_phi = gradX2_phi(); + LBMReal dX3_phi = gradX3_phi(); + + //LBMReal dX1_phi2 = gradX1_phi2(); + //LBMReal dX2_phi2 = gradX2_phi2(); + //LBMReal dX3_phi2 = gradX3_phi2(); + + + // LBMReal denom2 = sqrt(dX1_phi * dX1_phi+ dX1_phi2 * dX1_phi2 + dX2_phi * dX2_phi + dX2_phi2 * dX2_phi2 + dX3_phi * dX3_phi+ dX3_phi2 * dX3_phi2) + 1e-9; + // LBMReal normX1 = (dX1_phi-dX1_phi2)/denom2; + //LBMReal normX2 = (dX2_phi-dX2_phi2)/denom2; + //LBMReal normX3 = (dX3_phi-dX3_phi2)/denom2; + + LBMReal denom = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi) + 1e-9; + LBMReal normX1 = dX1_phi / denom; + LBMReal normX2 = dX2_phi / denom; + LBMReal normX3 = dX3_phi / denom; + + + + collFactorM = collFactorL + (collFactorL - collFactorG) * (phi[DIR_000] - phiH) / (phiH - phiL); + + + LBMReal mu = 2 * beta * phi[DIR_000] * (phi[DIR_000] - 1) * (2 * phi[DIR_000] - 1) - kappa * nabla2_phi(); + + //----------- Calculating Macroscopic Values ------------- + LBMReal rho = rhoH + rhoToPhi * (phi[DIR_000] - phiH); + + ////Incompressible Kernal + + //mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) ;// / rho * c3; + //mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) ;// / rho * c3; + //mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) ;// / rho * c3; + //mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) ;// / rho * c3; + //mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) ;// / rho * c3; + //mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) ;// / rho * c3; + //mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) ;// / rho * c3; + //mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) ;// / rho * c3; + //mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) ;// / rho * c3; + //mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) ;// / rho * c3; + //mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) ;// / rho * c3; + //mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) ;// / rho * c3; + //mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) ;// / rho * c3; + //mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) ;// / rho * c3; + //mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) ;// / rho * c3; + //mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) ;// / rho * c3; + //mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) ;// / rho * c3; + //mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) ;// / rho * c3; + //mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) ;// / rho * c3; + //mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) ;// / rho * c3; + //mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) ;// / rho * c3; + //mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) ;// / rho * c3; + //mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) ;// / rho * c3; + //mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) ;// / rho * c3; + //mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) ;// / rho * c3; + //mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) ;// / rho * c3; + + //mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);// / rho * c3; + + + LBMReal m0, m1, m2; + LBMReal rhoRef=c1; + + //LBMReal + // LBMReal drho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + // + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + // + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb))/rhoRef; + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab))/rhoRef; + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba))/rhoRef; + + // (*pressure)(x1, x2, x3) = (*pressureOld)(x1, x2, x3)+rho*c1o3*drho; + + //LBMReal gradPx = c1o2 * ((*pressure)(x1 + 1, x2, x3) - (*pressure)(x1 - 1, x2, x3)); + //LBMReal gradPy = c1o2 * ((*pressure)(x1, x2 + 1, x3) - (*pressure)(x1, x2 - 1, x3)); + //LBMReal gradPz = c1o2 * ((*pressure)(x1, x2, x3 + 1) - (*pressure)(x1, x2, x3 - 1)); + + //LBMReal gradPx = 3.0 * (WEIGTH[TNE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 + 1, x2 - 1, x3 + 1) - (*pressure)(x1 - 1, x2 + 1, x3 - 1))) + // + (((*pressure)(x1 + 1, x2 - 1, x3 - 1) - (*pressure)(x1 - 1, x2 + 1, x3 + 1)) + ((*pressure)(x1 + 1, x2 + 1, x3 - 1) - (*pressure)(x1 - 1, x2 - 1, x3 + 1)))) + // + WEIGTH[NE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3) - (*pressure)(x1 - 1, x2 - 1, x3)) + ((*pressure)(x1 + 1, x2 - 1, x3) - (*pressure)(x1 - 1, x2 + 1, x3))) + // + (((*pressure)(x1 + 1, x2, x3 - 1) - (*pressure)(x1 - 1, x2, x3 + 1)) + ((*pressure)(x1 + 1, x2, x3 + 1) - (*pressure)(x1 - 1, x2, x3 - 1)))) + // + WEIGTH[DIR_P00] * ((*pressure)(x1 + 1, x2, x3) - (*pressure)(x1 - 1, x2, x3))); + + //LBMReal gradPy = 3.0 * (WEIGTH[TNE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 - 1, x2 + 1, x3 + 1) - (*pressure)(x1 + 1, x2 - 1, x3 - 1))) + // + (((*pressure)(x1 - 1, x2 + 1, x3 - 1) - (*pressure)(x1 + 1, x2 - 1, x3 + 1)) + ((*pressure)(x1 + 1, x2 + 1, x3 - 1) - (*pressure)(x1 - 1, x2 - 1, x3 + 1)))) + // + WEIGTH[NE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3) - (*pressure)(x1 - 1, x2 - 1, x3)) + ((*pressure)(x1 - 1, x2 + 1, x3) - (*pressure)(x1 + 1, x2 - 1, x3))) + // + (((*pressure)(x1, x2+1, x3 - 1) - (*pressure)(x1, x2-1, x3 + 1)) + ((*pressure)(x1, x2+1, x3 + 1) - (*pressure)(x1, x2-1, x3 - 1)))) + // + WEIGTH[DIR_P00] * ((*pressure)(x1, x2+1, x3) - (*pressure)(x1, x2-1, x3))); + + //LBMReal gradPz = 3.0 * (WEIGTH[TNE] * ( + // (((*pressure)(x1 + 1, x2 + 1, x3 + 1) - (*pressure)(x1 - 1, x2 - 1, x3 - 1)) + ((*pressure)(x1 - 1, x2 + 1, x3 + 1) - (*pressure)(x1 + 1, x2 - 1, x3 - 1))) + // + (((*pressure)(x1 - 1, x2 - 1, x3 + 1) - (*pressure)(x1 + 1, x2 + 1, x3 - 1)) + ((*pressure)(x1 + 1, x2 - 1, x3 + 1) - (*pressure)(x1 - 1, x2 + 1, x3 - 1)))) + // + WEIGTH[NE] * ( + // (((*pressure)(x1 + 1, x2, x3+1) - (*pressure)(x1 - 1, x2, x3-1)) + ((*pressure)(x1 - 1, x2, x3+1) - (*pressure)(x1 + 1, x2, x3-1))) + // + (((*pressure)(x1, x2 - 1, x3 + 1) - (*pressure)(x1, x2 + 1, x3 - 1)) + ((*pressure)(x1, x2 + 1, x3 + 1) - (*pressure)(x1, x2 - 1, x3 - 1)))) + // + WEIGTH[DIR_P00] * ((*pressure)(x1, x2, x3+1) - (*pressure)(x1, x2, x3-1))); + + + LBMReal gradPx = 0.0; + LBMReal gradPy = 0.0; + LBMReal gradPz = 0.0; + for (int dir1 = -1; dir1 <= 1; dir1++) { + for (int dir2 = -1; dir2 <= 1; dir2++) { + int yyy = x2 + dir1; + int zzz = x3 + dir2; + if (!bcArray->isSolid(x1-1, yyy, zzz) && !bcArray->isUndefined(x1-1, yyy, zzz)) { + gradPx -= (*pressure)(x1 - 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPx -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(x1 + 1, yyy, zzz) && !bcArray->isUndefined(x1 - 1, yyy, zzz)) { + gradPx += (*pressure)(x1 + 1, yyy, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPx += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + int xxx = x1 + dir1; + if (!bcArray->isSolid(xxx, x2-1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) { + gradPy -= (*pressure)(xxx, x2-1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPy -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(xxx, x2+1, zzz) && !bcArray->isUndefined(xxx, x2-1, zzz)) { + gradPy += (*pressure)(xxx, x2+1, zzz) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPy += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + yyy = x2 + dir2; + if (!bcArray->isSolid(xxx, yyy, x3-1) && !bcArray->isUndefined(xxx, yyy, x3-1)) { + gradPz -= (*pressure)(xxx, yyy, x3-1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPz -= (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + if (!bcArray->isSolid(xxx, yyy, x3+1) && !bcArray->isUndefined(xxx, yyy, x3+1)) { + gradPz += (*pressure)(xxx, yyy, x3+1) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + else { + gradPz += (*pressure)(x1, x2, x3) * c2o9 / ((c1 + c3 * abs(dir1)) * (c1 + c3 * abs(dir2))); + } + + } + } + + //3.0 * ((WEIGTH[TNE] * (((phi2[TNE] - phi2[BSW]) - (phi2[BSE] - phi2[TNW])) + ((phi2[TSE] - phi2[BNW]) - (phi2[BNE] - phi2[TSW]))) + //+WEIGTH[NE] * (((phi2[TE] - phi2[BW]) - (phi2[BE] - phi2[TW])) + ((phi2[TS] - phi2[BN]) + (phi2[TN] - phi2[BS])))) + + //+WEIGTH[N] * (phi2[T] - phi2[B])); + + if (withForcing) { + // muX1 = static_cast<double>(x1-1+ix1*maxX1); + // muX2 = static_cast<double>(x2-1+ix2*maxX2); + // muX3 = static_cast<double>(x3-1+ix3*maxX3); + + // forcingX1 = muForcingX1.Eval()+c1o3*drho*dX1_phi*rhoToPhi/rho;//-gradPx/rho; + // forcingX2 = muForcingX2.Eval() + c1o3*drho*dX2_phi * rhoToPhi / rho;//-gradPy/rho; + //forcingX3 = muForcingX3.Eval() + c1o3*drho*dX3_phi * rhoToPhi / rho;//-gradPz/rho; + + forcingX1 = muForcingX1.Eval() -gradPx/rho; + forcingX2 = muForcingX2.Eval() -gradPy/rho; + forcingX3 = muForcingX3.Eval() -gradPz/rho; + + //LBMReal rho_m = 1.0 / densityRatio; + //forcingX1 = forcingX1 * (rho - rho_m); + //forcingX2 = forcingX2 * (rho - rho_m); + //forcingX3 = forcingX3 * (rho - rho_m); + vvx += forcingX1 * deltaT * 0.5; // X + vvy += forcingX2 * deltaT * 0.5; // Y + vvz += forcingX3 * deltaT * 0.5; // Z + + } + + + ///surface tension force + vvx += mu * dX1_phi * c1o2; + vvy += mu * dX2_phi * c1o2 ; + vvz += mu * dX3_phi * c1o2; + + //////classic source term + ///----Classic source term 8.4.2021 + + //LBMReal vvxF, vvyF, vvzF; + //vvxF = vvx;//-2*c1o24 * lap_vx;// + //vvyF = vvy;//-2*c1o24 * lap_vy;// + //vvzF = vvz;//-2*c1o24 * lap_vz;// + +// vvxF = 1.2* vvx- 0.2*0.5 * ((*velocityX)(x1 - 1, x2, x3) + (*velocityX)(x1 + 1, x2, x3)); +// vvyF = 1.2 *vvy- 0.2*0.5* ((*velocityY)(x1 , x2-1, x3) + (*velocityY)(x1 , x2+1, x3)); +// vvzF = 1.2 *vvz-0.2*0.5* ((*velocityZ)(x1 , x2, x3-1) + (*velocityZ)(x1 , x2, x3+1)); + //if (vvxF != vvx) { + // vvxF = vvxF; + //} + //LBMReal weightGrad = 1.0;// -denom * denom / (denom * denom + 0.0001 * 0.001); + //LBMReal dX1_phiF = dX1_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX1; + //LBMReal dX2_phiF = dX2_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX2; + //LBMReal dX3_phiF = dX3_phi * weightGrad + (1.0 - weightGrad) * (1.0 - phi[REST]) * (phi[REST]) * normX3; + + //dX1_phiF *= 1.2; + //dX2_phiF *= 1.2; + //dX3_phiF *= 1.2; + + //LBMReal gradFD = sqrt(dX1_phi * dX1_phi + dX2_phi * dX2_phi + dX3_phi * dX3_phi); + //LBMReal gradPhi = (1.0 - phi[REST]) * (phi[REST]); + //gradPhi = (gradPhi > gradFD) ? gradPhi : gradFD; + //dX1_phiF = gradPhi * normX1; + // dX2_phiF = gradPhi * normX2; + // dX3_phiF = gradPhi * normX3; + + //LBMReal ux2; + //LBMReal uy2; + //LBMReal uz2; + //ux2 = vvxF * vvxF; + //uy2 = vvyF * vvyF; + //uz2 = vvzF * vvzF; + //LBMReal forcingTerm[D3Q27System::ENDF + 1]; + //for (int dir = STARTF; dir <= (FENDDIR); dir++) { + // LBMReal velProd = DX1[dir] * vvxF + DX2[dir] * vvyF + DX3[dir] * vvzF; + // LBMReal velSq1 = velProd * velProd; + // LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + (4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2))); + + // //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi; + + // //forcingTerm[dir] = + // // (-vvxF) * (fac1 * dX1_phiF) + + // // (-vvyF) * (fac1 * dX2_phiF) + + // // (-vvzF) * (fac1 * dX3_phiF) + + // // (DX1[dir]) * (fac1 * dX1_phiF) + + // // (DX2[dir]) * (fac1 * dX2_phiF) + + // // (DX3[dir]) * (fac1 * dX3_phiF); + + + // //LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 ; + + // //forcingTerm[dir] = + // // (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + // // (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + // // (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)) + + // // (DX1[dir]) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + // // (DX2[dir]) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + // // (DX3[dir]) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)); + + + + //} + + //LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); + //LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi; + //forcingTerm[REST] = (-vvxF) * (fac1 * (dX1_phiF * rhoH + dX2_phi2 * rhoL)) + + // (-vvyF) * (fac1 * (dX2_phiF * rhoH + dX2_phi2 * rhoL)) + + // (-vvzF) * (fac1 * (dX3_phiF * rhoH + dX3_phi2 * rhoL)); + + //////// + // LBMReal divAfterSource= + //( mfcbb + 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF) *(vvzF)-1)+ + //( mfbcb + 3.0 * (0.5 * forcingTerm[N]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfbbc + 3.0 * (0.5 * forcingTerm[T]) / rho ) *((vvxF) *(vvxF) +(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfccb + 3.0 * (0.5 * forcingTerm[NE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfacb + 3.0 * (0.5 * forcingTerm[NW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF) *(vvzF)-1)+ + //( mfcbc + 3.0 * (0.5 * forcingTerm[TE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfabc + 3.0 * (0.5 * forcingTerm[TW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF-1)*(vvzF-1)-1)+ + //( mfbcc + 3.0 * (0.5 * forcingTerm[TN]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfbac + 3.0 * (0.5 * forcingTerm[TS]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfccc + 3.0 * (0.5 * forcingTerm[TNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfacc + 3.0 * (0.5 * forcingTerm[TNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfcac + 3.0 * (0.5 * forcingTerm[TSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfaac + 3.0 * (0.5 * forcingTerm[TSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF-1)*(vvzF-1)-1)+ + //( mfabb + 3.0 * (0.5 * forcingTerm[W]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF) *(vvzF)-1)+ + //( mfbab + 3.0 * (0.5 * forcingTerm[S]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfbba + 3.0 * (0.5 * forcingTerm[B]) / rho ) *((vvxF) *(vvxF) +(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfaab + 3.0 * (0.5 * forcingTerm[SW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfcab + 3.0 * (0.5 * forcingTerm[SE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF) *(vvzF)-1)+ + //( mfaba + 3.0 * (0.5 * forcingTerm[BW]) / rho ) *((vvxF+1)*(vvxF+1)+(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfcba + 3.0 * (0.5 * forcingTerm[BE]) / rho ) *((vvxF-1)*(vvxF-1)+(vvyF) *(vvyF) +(vvzF+1)*(vvzF+1)-1)+ + //( mfbaa + 3.0 * (0.5 * forcingTerm[BS]) / rho ) *((vvxF) *(vvxF) +(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfbca + 3.0 * (0.5 * forcingTerm[BN]) / rho ) *((vvxF) *(vvxF) +(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfaaa + 3.0 * (0.5 * forcingTerm[BSW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfcaa + 3.0 * (0.5 * forcingTerm[BSE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF+1)*(vvyF+1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfaca + 3.0 * (0.5 * forcingTerm[BNW]) / rho) *((vvxF+1)*(vvxF+1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfcca + 3.0 * (0.5 * forcingTerm[BNE]) / rho) *((vvxF-1)*(vvxF-1)+(vvyF-1)*(vvyF-1)+(vvzF+1)*(vvzF+1)-1)+ + //( mfbbb + 3.0 * (0.5 * forcingTerm[REST]) / rho)*((vvxF)*(vvxF)+(vvyF)*(vvyF)+(vvzF)*(vvzF)-1); + + // LBMReal divBeforeSource = + // (mfcbb) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) + + // (mfbcb) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfbbc) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfccb) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfacb) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF) * (vvzF)-1) + + // (mfcbc) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfabc) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF - 1) * (vvzF - 1)-1) + + // (mfbcc) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfbac) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfccc) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfacc) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfcac) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfaac) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF - 1) * (vvzF - 1)-1) + + // (mfabb) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF) * (vvzF)-1) + + // (mfbab) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfbba) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfaab) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfcab) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF) * (vvzF)-1) + + // (mfaba) * ((vvxF + 1) * (vvxF + 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfcba) * ((vvxF - 1) * (vvxF - 1) + (vvyF) * (vvyF)+(vvzF + 1) * (vvzF + 1)-1) + + // (mfbaa) * ((vvxF) * (vvxF)+(vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfbca) * ((vvxF) * (vvxF)+(vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfaaa) * ((vvxF + 1) * (vvxF + 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfcaa) * ((vvxF - 1) * (vvxF - 1) + (vvyF + 1) * (vvyF + 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfaca) * ((vvxF + 1) * (vvxF + 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfcca) * ((vvxF - 1) * (vvxF - 1) + (vvyF - 1) * (vvyF - 1) + (vvzF + 1) * (vvzF + 1)-1) + + // (mfbbb) * ((vvxF) * (vvxF)+(vvyF) * (vvyF)+(vvzF) * (vvzF)-1); + //if (divAfterSource - divBeforeSource != 0 && phi[REST]>0.0001 && phi[REST]<0.999) { + // std::cout << phi[REST]<<" "<< divAfterSource << " " << divBeforeSource <<" "<< divAfterSource/ divBeforeSource << std::endl; + //} + + //if (fabs(divAfterSource - divBeforeSource)/(fabs(divAfterSource) + fabs(divBeforeSource)+1e-10) > 1e-5) { + // LBMReal scaleDiv =0.95+(1-0.95)* (divBeforeSource) / (divBeforeSource - divAfterSource); + + // forcingTerm[DIR_P00] *=scaleDiv; + // forcingTerm[N] *=scaleDiv; + // forcingTerm[T] *=scaleDiv; + // forcingTerm[NE] *=scaleDiv; + // forcingTerm[NW] *=scaleDiv; + // forcingTerm[TE] *=scaleDiv; + // forcingTerm[TW] *=scaleDiv; + // forcingTerm[TN] *=scaleDiv; + // forcingTerm[TS] *=scaleDiv; + // forcingTerm[TNE] *=scaleDiv; + // forcingTerm[TNW] *=scaleDiv; + // forcingTerm[TSE] *=scaleDiv; + // forcingTerm[TSW] *=scaleDiv; + // forcingTerm[W] *=scaleDiv; + // forcingTerm[S] *=scaleDiv; + // forcingTerm[B] *=scaleDiv; + // forcingTerm[SW] *=scaleDiv; + // forcingTerm[SE] *=scaleDiv; + // forcingTerm[BW] *=scaleDiv; + // forcingTerm[BE] *=scaleDiv; + // forcingTerm[BS] *=scaleDiv; + // forcingTerm[BN] *=scaleDiv; + // forcingTerm[BSW] *=scaleDiv; + // forcingTerm[BSE] *=scaleDiv; + // forcingTerm[BNW] *=scaleDiv; + // forcingTerm[BNE] *=scaleDiv; + // forcingTerm[REST] *=scaleDiv; + //} + //////// + + + //mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + //mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + //mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + //mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + //mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + //mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + //mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + //mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + //mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + //mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + //mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + //mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + //mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + //mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + //mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + //mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + //mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + //mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + //mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + //mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + //mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + //mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + //mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + //mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + //mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + //mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + //mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + + //-------------------------------------------------------- + + + + + + //////end classic source term + + + + + //forcing + /////////////////////////////////////////////////////////////////////////////////////////// + if (withForcing) + { + muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1); + muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2); + muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3); + + //forcingX1 = muForcingX1.Eval(); + //forcingX2 = muForcingX2.Eval(); + //forcingX3 = muForcingX3.Eval(); + + //vvx += forcingX1 * deltaT * 0.5; // X + //vvy += forcingX2 * deltaT * 0.5; // Y + //vvz += forcingX3 * deltaT * 0.5; // Z + } + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = (rhoRef - (oMdrho + m0))/rhoRef;// 12.03.21 check derivation!!!! + + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + + + // mfaaa = 0.0; + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + // LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + // LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + + + /////fourth order parameters; here only for test. Move out of loop! + + LBMReal OxyyPxzz = 8.0 * (collFactorM - 2.0) * (OxxPyyPzz * (3.0 * collFactorM - 1.0) - 5.0 * collFactorM) / (8.0 * (5.0 - 2.0 * collFactorM) * collFactorM + OxxPyyPzz * (8.0 + collFactorM * (9.0 * collFactorM - 26.0))); + LBMReal OxyyMxzz = 8.0 * (collFactorM - 2.0) * (collFactorM + OxxPyyPzz * (3.0 * collFactorM - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * collFactorM + 9.0 * collFactorM * collFactorM) - 8.0 * collFactorM); + // LBMReal Oxyz = 24.0 * (collFactorM - 2.0) * (4.0 * collFactorM * collFactorM + collFactorM * OxxPyyPzz * (18.0 - 13.0 * collFactorM) + OxxPyyPzz * OxxPyyPzz * (2.0 + collFactorM * (6.0 * collFactorM - 11.0))) / (16.0 * collFactorM * collFactorM * (collFactorM - 6.0) - 2.0 * collFactorM * OxxPyyPzz * (216.0 + 5.0 * collFactorM * (9.0 * collFactorM - 46.0)) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (3.0 * collFactorM - 10.0) * (15.0 * collFactorM - 28.0) - 48.0)); + LBMReal A = (4.0 * collFactorM * collFactorM + 2.0 * collFactorM * OxxPyyPzz * (collFactorM - 6.0) + OxxPyyPzz * OxxPyyPzz * (collFactorM * (10.0 - 3.0 * collFactorM) - 4.0)) / ((collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + //FIXME: warning C4459: declaration of 'B' hides global declaration (message : see declaration of 'D3Q27System::DIR_00M' ) + LBMReal BB = (4.0 * collFactorM * OxxPyyPzz * (9.0 * collFactorM - 16.0) - 4.0 * collFactorM * collFactorM - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * collFactorM * (collFactorM - 2.0))) / (3.0 * (collFactorM - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * collFactorM) - 8.0 * collFactorM)); + + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + + // LBMReal mfaaaS = (mfaaa * (-4 - 3 * OxxPyyPzz * (-1 + rho)) + 6 * mxxPyyPzz * OxxPyyPzz * (-1 + rho)) / (-4 + 3 * OxxPyyPzz * (-1 + rho)); + mxxPyyPzz -= mfaaa ;//12.03.21 shifted by mfaaa + //mxxPyyPzz-=(mfaaa+mfaaaS)*c1o2;//12.03.21 shifted by mfaaa + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + //applying phase field gradients first part: + // mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz); + // 17.03.2021 attempt for statililization by assymptotically vanishing bias + //LBMReal correctionScaling = + // rhoToPhi / rho; // +0.5;// (vx2 + vy2 + vz2) * 100;// +0.5;//(vx2 + vy2 + vz2)*1000; + //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * + // correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + + LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (/*mfaaa*/ -mxxPyyPzz); + LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; + + LBMReal Dxy = -three * collFactorM * mfbba; + LBMReal Dxz = -three * collFactorM * mfbab; + LBMReal Dyz = -three * collFactorM * mfabb; + + + //relax + mxxPyyPzz += OxxPyyPzz * (/*mfaaa*/ - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorM * (-mfabb); + mfbab += collFactorM * (-mfbab); + mfbba += collFactorM * (-mfbba); + + //applying phase field gradients second part: + //mxxPyyPzz += c2o3 * rhoToPhi * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz); + //mxxPyyPzz += (1.0 / 6.0) * (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * + // correctionScaling; // As in Hesam's code + //mxxMyy += c1o3 * (dX1_phi * vvx - dX2_phi * vvy) * correctionScaling; + //mxxMzz += c1o3 * (dX1_phi * vvx - dX3_phi * vvz) * correctionScaling; + //mfabb += c1o6 * (dX2_phi * vvz + dX3_phi * vvy) * correctionScaling; + //mfbab += c1o6 * (dX1_phi * vvz + dX3_phi * vvx) * correctionScaling; + //mfbba += c1o6 * (dX1_phi * vvy + dX2_phi * vvx) * correctionScaling; + + ////updated pressure + //mfaaa += (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling; + mfaaa = 0.0; // Pressure elimination as in standard velocity model + // mfaaa += (rho - c1) * (dxux + dyuy + dzuz); + + mxxPyyPzz += mfaaa; // 12.03.21 shifted by mfaaa + + // mxxPyyPzz += (mfaaa + mfaaaS) * c1o2; + //mfaaa = mfaaaS; + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + //CUMacc += O4 * (-CUMacc); + //CUMcac += O4 * (-CUMcac); + //CUMcca += O4 * (-CUMcca); + + //CUMbbc += O4 * (-CUMbbc); + //CUMbcb += O4 * (-CUMbcb); + //CUMcbb += O4 * (-CUMcbb); + CUMacc = -O4 * (one / collFactorM - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc); + CUMcac = -O4 * (one / collFactorM - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac); + CUMcca = -O4 * (one / collFactorM - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca); + CUMbbc = -O4 * (one / collFactorM - c1o2) * Dxy * c1o3 * BB + (one - O4) * (CUMbbc); + CUMbcb = -O4 * (one / collFactorM - c1o2) * Dxz * c1o3 * BB + (one - O4) * (CUMbcb); + CUMcbb = -O4 * (one / collFactorM - c1o2) * Dyz * c1o3 * BB + (one - O4) * (CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - c1) * oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho; + + + //////// + + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + + /////classical source term 8.4.2021 + + //mfcbb += 3.0 * (0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; + //mfbcb += 3.0 * (0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; + //mfbbc += 3.0 * (0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; + //mfccb += 3.0 * (0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; + //mfacb += 3.0 * (0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; + //mfcbc += 3.0 * (0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; + //mfabc += 3.0 * (0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; + //mfbcc += 3.0 * (0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; + //mfbac += 3.0 * (0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; + //mfccc += 3.0 * (0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; + //mfacc += 3.0 * (0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; + //mfcac += 3.0 * (0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; + //mfaac += 3.0 * (0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; + //mfabb += 3.0 * (0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; + //mfbab += 3.0 * (0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; + //mfbba += 3.0 * (0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; + //mfaab += 3.0 * (0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; + //mfcab += 3.0 * (0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; + //mfaba += 3.0 * (0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; + //mfcba += 3.0 * (0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; + //mfbaa += 3.0 * (0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; + //mfbca += 3.0 * (0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; + //mfaaa += 3.0 * (0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; + //mfcaa += 3.0 * (0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; + //mfaca += 3.0 * (0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; + //mfcca += 3.0 * (0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; + //mfbbb += 3.0 * (0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST] + + + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +//#ifdef PROOF_CORRECTNESS +// LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +// + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) +// + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; +// //LBMReal dif = fabs(drho - rho_post); +// LBMReal dif = drho + (dX1_phi * vvx + dX2_phi * vvy + dX3_phi * vvz) * correctionScaling - rho_post; +//#ifdef SINGLEPRECISION +// if (dif > 10.0E-7 || dif < -10.0E-7) +//#else +// if (dif > 10.0E-15 || dif < -10.0E-15) +//#endif +// { +// UB_THROW(UbException(UB_EXARGS, "drho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(rho_post) +// + " dif=" + UbSystem::toString(dif) +// + " drho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): drho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); +// //exit(EXIT_FAILURE); +// } +//#endif + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca ;//* rho * c1o3; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac ;//* rho * c1o3; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac ;//* rho * c1o3; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;// *rho* c1o3; + ////////////////////////////////////////////////////////////////////////// + + ////!Incompressible Kernal + + +// ///////Old Kernel \|/ +// // ux += forcingX1*deltaT*0.5; // X +// // uy += forcingX2*deltaT*0.5; // Y +// // uz += forcingX3*deltaT*0.5; // Z +// } +// +// LBMReal ux = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + +// (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + +// (mfcbb - mfabb)) / +// (rho * c1o3) + +// (mu * dX1_phi + forcingX1) / (2 * rho); +// +// LBMReal uy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + +// (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + +// (mfbcb - mfbab)) / +// (rho * c1o3) + +// (mu * dX2_phi + forcingX2) / (2 * rho); +// +// LBMReal uz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + +// (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + +// (mfbbc - mfbba)) / +// (rho * c1o3) + +// (mu * dX3_phi + forcingX3) / (2 * rho); +// +// //-------------------------------------------------------- +// +// LBMReal ux2 = ux * ux; +// LBMReal uy2 = uy * uy; +// LBMReal uz2 = uz * uz; +// +// //----------- Calculating Forcing Terms * ------------- +// for (int dir = STARTF; dir <= (FENDDIR); dir++) { +// LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz; +// LBMReal velSq1 = velProd * velProd; +// LBMReal gamma = WEIGTH[dir] * (1.0 + 3 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)); +// +// LBMReal fac1 = (gamma - WEIGTH[dir]) * c1o3 * rhoToPhi; +// +// forcingTerm[dir] = ((-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) + +// (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) + +// (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3))) + +// (DX1[dir]) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) + +// (DX2[dir]) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) + +// (DX3[dir]) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3)); +// } +// +// LBMReal gamma = WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); +// LBMReal fac1 = (gamma - WEIGTH[REST]) * c1o3 * rhoToPhi; +// forcingTerm[REST] = (-ux) * (fac1 * dX1_phi + gamma * (mu * dX1_phi + forcingX1)) + +// (-uy) * (fac1 * dX2_phi + gamma * (mu * dX2_phi + forcingX2)) + +// (-uz) * (fac1 * dX3_phi + gamma * (mu * dX3_phi + forcingX3)); +// +// //-------------------------------------------------------- +// +// mfcbb = 3.0 * (mfcbb + 0.5 * forcingTerm[DIR_P00]) / rho; //-(3.0*p1 - rho)*WEIGTH[E ]; +// mfbcb = 3.0 * (mfbcb + 0.5 * forcingTerm[N]) / rho; //-(3.0*p1 - rho)*WEIGTH[N ]; +// mfbbc = 3.0 * (mfbbc + 0.5 * forcingTerm[T]) / rho; //-(3.0*p1 - rho)*WEIGTH[T ]; +// mfccb = 3.0 * (mfccb + 0.5 * forcingTerm[NE]) / rho; //-(3.0*p1 - rho)*WEIGTH[NE ]; +// mfacb = 3.0 * (mfacb + 0.5 * forcingTerm[NW]) / rho; //-(3.0*p1 - rho)*WEIGTH[NW ]; +// mfcbc = 3.0 * (mfcbc + 0.5 * forcingTerm[TE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TE ]; +// mfabc = 3.0 * (mfabc + 0.5 * forcingTerm[TW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TW ]; +// mfbcc = 3.0 * (mfbcc + 0.5 * forcingTerm[TN]) / rho; //-(3.0*p1 - rho)*WEIGTH[TN ]; +// mfbac = 3.0 * (mfbac + 0.5 * forcingTerm[TS]) / rho; //-(3.0*p1 - rho)*WEIGTH[TS ]; +// mfccc = 3.0 * (mfccc + 0.5 * forcingTerm[TNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNE]; +// mfacc = 3.0 * (mfacc + 0.5 * forcingTerm[TNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TNW]; +// mfcac = 3.0 * (mfcac + 0.5 * forcingTerm[TSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSE]; +// mfaac = 3.0 * (mfaac + 0.5 * forcingTerm[TSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[TSW]; +// mfabb = 3.0 * (mfabb + 0.5 * forcingTerm[W]) / rho; //-(3.0*p1 - rho)*WEIGTH[W ]; +// mfbab = 3.0 * (mfbab + 0.5 * forcingTerm[S]) / rho; //-(3.0*p1 - rho)*WEIGTH[S ]; +// mfbba = 3.0 * (mfbba + 0.5 * forcingTerm[B]) / rho; //-(3.0*p1 - rho)*WEIGTH[B ]; +// mfaab = 3.0 * (mfaab + 0.5 * forcingTerm[SW]) / rho; //-(3.0*p1 - rho)*WEIGTH[SW ]; +// mfcab = 3.0 * (mfcab + 0.5 * forcingTerm[SE]) / rho; //-(3.0*p1 - rho)*WEIGTH[SE ]; +// mfaba = 3.0 * (mfaba + 0.5 * forcingTerm[BW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BW ]; +// mfcba = 3.0 * (mfcba + 0.5 * forcingTerm[BE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BE ]; +// mfbaa = 3.0 * (mfbaa + 0.5 * forcingTerm[BS]) / rho; //-(3.0*p1 - rho)*WEIGTH[BS ]; +// mfbca = 3.0 * (mfbca + 0.5 * forcingTerm[BN]) / rho; //-(3.0*p1 - rho)*WEIGTH[BN ]; +// mfaaa = 3.0 * (mfaaa + 0.5 * forcingTerm[BSW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSW]; +// mfcaa = 3.0 * (mfcaa + 0.5 * forcingTerm[BSE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BSE]; +// mfaca = 3.0 * (mfaca + 0.5 * forcingTerm[BNW]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNW]; +// mfcca = 3.0 * (mfcca + 0.5 * forcingTerm[BNE]) / rho; //-(3.0*p1 - rho)*WEIGTH[BNE]; +// mfbbb = 3.0 * (mfbbb + 0.5 * forcingTerm[REST]) / rho; //- (3.0*p1 - rho)*WEIGTH[REST]; +// +// LBMReal rho1 = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + +// (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + +// (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) + +// (mfbba + mfbbc) + mfbbb; +// +// +// LBMReal oMdrho, m0, m1, m2; +// +// oMdrho = mfccc + mfaaa; +// m0 = mfaca + mfcac; +// m1 = mfacc + mfcaa; +// m2 = mfaac + mfcca; +// oMdrho += m0; +// m1 += m2; +// oMdrho += m1; +// m0 = mfbac + mfbca; +// m1 = mfbaa + mfbcc; +// m0 += m1; +// m1 = mfabc + mfcba; +// m2 = mfaba + mfcbc; +// m1 += m2; +// m0 += m1; +// m1 = mfacb + mfcab; +// m2 = mfaab + mfccb; +// m1 += m2; +// m0 += m1; +// oMdrho += m0; +// m0 = mfabb + mfcbb; +// m1 = mfbab + mfbcb; +// m2 = mfbba + mfbbc; +// m0 += m1 + m2; +// m0 += mfbbb; // hat gefehlt +// oMdrho = 1. - (oMdrho + m0); +// // oMdrho = rho - (oMdrho + m0); +// +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal wadjust; +// LBMReal qudricLimit = 0.01; +// //////////////////////////////////////////////////////////////////////////////////// +// // Hin +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// m2 = mfaaa + mfaac; +// m1 = mfaac - mfaaa; +// m0 = m2 + mfaab; +// mfaaa = m0; +// m0 += c1o36 * oMdrho; +// mfaab = m1 - m0 * uz; +// mfaac = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaba + mfabc; +// m1 = mfabc - mfaba; +// m0 = m2 + mfabb; +// mfaba = m0; +// m0 += c1o9 * oMdrho; +// mfabb = m1 - m0 * uz; +// mfabc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaca + mfacc; +// m1 = mfacc - mfaca; +// m0 = m2 + mfacb; +// mfaca = m0; +// m0 += c1o36 * oMdrho; +// mfacb = m1 - m0 * uz; +// mfacc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbaa + mfbac; +// m1 = mfbac - mfbaa; +// m0 = m2 + mfbab; +// mfbaa = m0; +// m0 += c1o9 * oMdrho; +// mfbab = m1 - m0 * uz; +// mfbac = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbba + mfbbc; +// m1 = mfbbc - mfbba; +// m0 = m2 + mfbbb; +// mfbba = m0; +// m0 += c4o9 * oMdrho; +// mfbbb = m1 - m0 * uz; +// mfbbc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbca + mfbcc; +// m1 = mfbcc - mfbca; +// m0 = m2 + mfbcb; +// mfbca = m0; +// m0 += c1o9 * oMdrho; +// mfbcb = m1 - m0 * uz; +// mfbcc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcaa + mfcac; +// m1 = mfcac - mfcaa; +// m0 = m2 + mfcab; +// mfcaa = m0; +// m0 += c1o36 * oMdrho; +// mfcab = m1 - m0 * uz; +// mfcac = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcba + mfcbc; +// m1 = mfcbc - mfcba; +// m0 = m2 + mfcbb; +// mfcba = m0; +// m0 += c1o9 * oMdrho; +// mfcbb = m1 - m0 * uz; +// mfcbc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcca + mfccc; +// m1 = mfccc - mfcca; +// m0 = m2 + mfccb; +// mfcca = m0; +// m0 += c1o36 * oMdrho; +// mfccb = m1 - m0 * uz; +// mfccc = m2 - 2. * m1 * uz + uz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// m2 = mfaaa + mfaca; +// m1 = mfaca - mfaaa; +// m0 = m2 + mfaba; +// mfaaa = m0; +// m0 += c1o6 * oMdrho; +// mfaba = m1 - m0 * uy; +// mfaca = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaab + mfacb; +// m1 = mfacb - mfaab; +// m0 = m2 + mfabb; +// mfaab = m0; +// mfabb = m1 - m0 * uy; +// mfacb = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaac + mfacc; +// m1 = mfacc - mfaac; +// m0 = m2 + mfabc; +// mfaac = m0; +// m0 += c1o18 * oMdrho; +// mfabc = m1 - m0 * uy; +// mfacc = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbaa + mfbca; +// m1 = mfbca - mfbaa; +// m0 = m2 + mfbba; +// mfbaa = m0; +// m0 += c2o3 * oMdrho; +// mfbba = m1 - m0 * uy; +// mfbca = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbab + mfbcb; +// m1 = mfbcb - mfbab; +// m0 = m2 + mfbbb; +// mfbab = m0; +// mfbbb = m1 - m0 * uy; +// mfbcb = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbac + mfbcc; +// m1 = mfbcc - mfbac; +// m0 = m2 + mfbbc; +// mfbac = m0; +// m0 += c2o9 * oMdrho; +// mfbbc = m1 - m0 * uy; +// mfbcc = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcaa + mfcca; +// m1 = mfcca - mfcaa; +// m0 = m2 + mfcba; +// mfcaa = m0; +// m0 += c1o6 * oMdrho; +// mfcba = m1 - m0 * uy; +// mfcca = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcab + mfccb; +// m1 = mfccb - mfcab; +// m0 = m2 + mfcbb; +// mfcab = m0; +// mfcbb = m1 - m0 * uy; +// mfccb = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcac + mfccc; +// m1 = mfccc - mfcac; +// m0 = m2 + mfcbc; +// mfcac = m0; +// m0 += c1o18 * oMdrho; +// mfcbc = m1 - m0 * uy; +// mfccc = m2 - 2. * m1 * uy + uy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// m2 = mfaaa + mfcaa; +// m1 = mfcaa - mfaaa; +// m0 = m2 + mfbaa; +// mfaaa = m0; +// m0 += 1. * oMdrho; +// mfbaa = m1 - m0 * ux; +// mfcaa = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaba + mfcba; +// m1 = mfcba - mfaba; +// m0 = m2 + mfbba; +// mfaba = m0; +// mfbba = m1 - m0 * ux; +// mfcba = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaca + mfcca; +// m1 = mfcca - mfaca; +// m0 = m2 + mfbca; +// mfaca = m0; +// m0 += c1o3 * oMdrho; +// mfbca = m1 - m0 * ux; +// mfcca = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaab + mfcab; +// m1 = mfcab - mfaab; +// m0 = m2 + mfbab; +// mfaab = m0; +// mfbab = m1 - m0 * ux; +// mfcab = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfabb + mfcbb; +// m1 = mfcbb - mfabb; +// m0 = m2 + mfbbb; +// mfabb = m0; +// mfbbb = m1 - m0 * ux; +// mfcbb = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfacb + mfccb; +// m1 = mfccb - mfacb; +// m0 = m2 + mfbcb; +// mfacb = m0; +// mfbcb = m1 - m0 * ux; +// mfccb = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaac + mfcac; +// m1 = mfcac - mfaac; +// m0 = m2 + mfbac; +// mfaac = m0; +// m0 += c1o3 * oMdrho; +// mfbac = m1 - m0 * ux; +// mfcac = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfabc + mfcbc; +// m1 = mfcbc - mfabc; +// m0 = m2 + mfbbc; +// mfabc = m0; +// mfbbc = m1 - m0 * ux; +// mfcbc = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfacc + mfccc; +// m1 = mfccc - mfacc; +// m0 = m2 + mfbcc; +// mfacc = m0; +// m0 += c1o9 * oMdrho; +// mfbcc = m1 - m0 * ux; +// mfccc = m2 - 2. * m1 * ux + ux2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// // Cumulants +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal OxxPyyPzz = 1.; // omega2 or bulk viscosity +// LBMReal OxyyPxzz = 1.; //-s9;//2+s9;// +// LBMReal OxyyMxzz = 1.; // 2+s9;// +// LBMReal O4 = 1.; +// LBMReal O5 = 1.; +// LBMReal O6 = 1.; +// +// // Cum 4. +// LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); +// LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); +// LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); +// +// LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + +// c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); +// LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + +// c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); +// LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + +// c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); +// +// // Cum 5. +// LBMReal CUMbcc = mfbcc - +// (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + +// 2. * (mfbab * mfacb + mfbba * mfabc)) - +// c1o3 * (mfbca + mfbac) * oMdrho; +// LBMReal CUMcbc = mfcbc - +// (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + +// 2. * (mfabb * mfcab + mfbba * mfbac)) - +// c1o3 * (mfcba + mfabc) * oMdrho; +// LBMReal CUMccb = mfccb - +// (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + +// 2. * (mfbab * mfbca + mfabb * mfcba)) - +// c1o3 * (mfacb + mfcab) * oMdrho; +// +// // Cum 6. +// LBMReal CUMccc = +// mfccc + +// ((-4. * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - +// 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - +// 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + +// (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + +// 2. * (mfcaa * mfaca * mfaac) + 16. * mfbba * mfbab * mfabb) - +// c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho - +// c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - +// c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + +// (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + +// (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * +// c2o3 * oMdrho) + +// c1o27 * oMdrho; +// +// // 2. +// // linear combinations +// LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; +// LBMReal mxxMyy = mfcaa - mfaca; +// LBMReal mxxMzz = mfcaa - mfaac; +// +// LBMReal dxux = -c1o2 * collFactorM * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); +// LBMReal dyuy = dxux + collFactorM * c3o2 * mxxMyy; +// LBMReal dzuz = dxux + collFactorM * c3o2 * mxxMzz; +// +// (*divU)(x1, x2, x3) = dxux + dyuy + dzuz; +// +// // relax +// mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - +// 3. * (1. - c1o2 * OxxPyyPzz) * (ux2 * dxux + uy2 * dyuy + uz2 * dzuz); +// mxxMyy += collFactorM * (-mxxMyy) - 3. * (1. - c1o2 * collFactorM) * (ux2 * dxux - uy2 * dyuy); +// mxxMzz += collFactorM * (-mxxMzz) - 3. * (1. - c1o2 * collFactorM) * (ux2 * dxux - uz2 * dzuz); +// +// mfabb += collFactorM * (-mfabb); +// mfbab += collFactorM * (-mfbab); +// mfbba += collFactorM * (-mfbba); +// +// // linear combinations back +// mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); +// mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); +// mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); +// +// // 3. +// // linear combinations +// LBMReal mxxyPyzz = mfcba + mfabc; +// LBMReal mxxyMyzz = mfcba - mfabc; +// +// LBMReal mxxzPyyz = mfcab + mfacb; +// LBMReal mxxzMyyz = mfcab - mfacb; +// +// LBMReal mxyyPxzz = mfbca + mfbac; +// LBMReal mxyyMxzz = mfbca - mfbac; +// +// // relax +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); +// mfbbb += wadjust * (-mfbbb); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); +// mxxyPyzz += wadjust * (-mxxyPyzz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); +// mxxyMyzz += wadjust * (-mxxyMyzz); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); +// mxxzPyyz += wadjust * (-mxxzPyyz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); +// mxxzMyyz += wadjust * (-mxxzMyyz); +// wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); +// mxyyPxzz += wadjust * (-mxyyPxzz); +// wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); +// mxyyMxzz += wadjust * (-mxyyMxzz); +// +// // linear combinations back +// mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; +// mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; +// mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; +// mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; +// mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; +// mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; +// +// // 4. +// CUMacc += O4 * (-CUMacc); +// CUMcac += O4 * (-CUMcac); +// CUMcca += O4 * (-CUMcca); +// +// CUMbbc += O4 * (-CUMbbc); +// CUMbcb += O4 * (-CUMbcb); +// CUMcbb += O4 * (-CUMcbb); +// +// // 5. +// CUMbcc += O5 * (-CUMbcc); +// CUMcbc += O5 * (-CUMcbc); +// CUMccb += O5 * (-CUMccb); +// +// // 6. +// CUMccc += O6 * (-CUMccc); +// +// // back cumulants to central moments +// // 4. +// mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); +// mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); +// mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); +// +// mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + +// c1o9 * (oMdrho - 1) * oMdrho; +// mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + +// c1o9 * (oMdrho - 1) * oMdrho; +// mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + +// c1o9 * (oMdrho - 1) * oMdrho; +// +// // 5. +// mfbcc = CUMbcc + +// (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + +// 2. * (mfbab * mfacb + mfbba * mfabc)) + +// c1o3 * (mfbca + mfbac) * oMdrho; +// mfcbc = CUMcbc + +// (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + +// 2. * (mfabb * mfcab + mfbba * mfbac)) + +// c1o3 * (mfcba + mfabc) * oMdrho; +// mfccb = CUMccb + +// (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + +// 2. * (mfbab * mfbca + mfabb * mfcba)) + +// c1o3 * (mfacb + mfcab) * oMdrho; +// +// // 6. +// mfccc = CUMccc - +// ((-4. * mfbbb * mfbbb - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - +// 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) - +// 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + +// (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + +// 2. * (mfcaa * mfaca * mfaac) + 16. * mfbba * mfbab * mfabb) - +// c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho - +// c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - +// c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + +// (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + +// (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * +// c2o3 * oMdrho) - +// c1o27 * oMdrho; +// +// //////////////////////////////////////////////////////////////////////////////////// +// // forcing +// mfbaa = -mfbaa; +// mfaba = -mfaba; +// mfaab = -mfaab; +// ////////////////////////////////////////////////////////////////////////////////////// +// +// //////////////////////////////////////////////////////////////////////////////////// +// // back +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// m0 = mfaac * c1o2 + mfaab * (uz - c1o2) + (mfaaa + 1. * oMdrho) * (uz2 - uz) * c1o2; +// m1 = -mfaac - 2. * mfaab * uz + mfaaa * (1. - uz2) - 1. * oMdrho * uz2; +// m2 = mfaac * c1o2 + mfaab * (uz + c1o2) + (mfaaa + 1. * oMdrho) * (uz2 + uz) * c1o2; +// mfaaa = m0; +// mfaab = m1; +// mfaac = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfabc * c1o2 + mfabb * (uz - c1o2) + mfaba * (uz2 - uz) * c1o2; +// m1 = -mfabc - 2. * mfabb * uz + mfaba * (1. - uz2); +// m2 = mfabc * c1o2 + mfabb * (uz + c1o2) + mfaba * (uz2 + uz) * c1o2; +// mfaba = m0; +// mfabb = m1; +// mfabc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacc * c1o2 + mfacb * (uz - c1o2) + (mfaca + c1o3 * oMdrho) * (uz2 - uz) * c1o2; +// m1 = -mfacc - 2. * mfacb * uz + mfaca * (1. - uz2) - c1o3 * oMdrho * uz2; +// m2 = mfacc * c1o2 + mfacb * (uz + c1o2) + (mfaca + c1o3 * oMdrho) * (uz2 + uz) * c1o2; +// mfaca = m0; +// mfacb = m1; +// mfacc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfbac * c1o2 + mfbab * (uz - c1o2) + mfbaa * (uz2 - uz) * c1o2; +// m1 = -mfbac - 2. * mfbab * uz + mfbaa * (1. - uz2); +// m2 = mfbac * c1o2 + mfbab * (uz + c1o2) + mfbaa * (uz2 + uz) * c1o2; +// mfbaa = m0; +// mfbab = m1; +// mfbac = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbbc * c1o2 + mfbbb * (uz - c1o2) + mfbba * (uz2 - uz) * c1o2; +// m1 = -mfbbc - 2. * mfbbb * uz + mfbba * (1. - uz2); +// m2 = mfbbc * c1o2 + mfbbb * (uz + c1o2) + mfbba * (uz2 + uz) * c1o2; +// mfbba = m0; +// mfbbb = m1; +// mfbbc = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcc * c1o2 + mfbcb * (uz - c1o2) + mfbca * (uz2 - uz) * c1o2; +// m1 = -mfbcc - 2. * mfbcb * uz + mfbca * (1. - uz2); +// m2 = mfbcc * c1o2 + mfbcb * (uz + c1o2) + mfbca * (uz2 + uz) * c1o2; +// mfbca = m0; +// mfbcb = m1; +// mfbcc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcac * c1o2 + mfcab * (uz - c1o2) + (mfcaa + c1o3 * oMdrho) * (uz2 - uz) * c1o2; +// m1 = -mfcac - 2. * mfcab * uz + mfcaa * (1. - uz2) - c1o3 * oMdrho * uz2; +// m2 = mfcac * c1o2 + mfcab * (uz + c1o2) + (mfcaa + c1o3 * oMdrho) * (uz2 + uz) * c1o2; +// mfcaa = m0; +// mfcab = m1; +// mfcac = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfcbc * c1o2 + mfcbb * (uz - c1o2) + mfcba * (uz2 - uz) * c1o2; +// m1 = -mfcbc - 2. * mfcbb * uz + mfcba * (1. - uz2); +// m2 = mfcbc * c1o2 + mfcbb * (uz + c1o2) + mfcba * (uz2 + uz) * c1o2; +// mfcba = m0; +// mfcbb = m1; +// mfcbc = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfccb * (uz - c1o2) + (mfcca + c1o9 * oMdrho) * (uz2 - uz) * c1o2; +// m1 = -mfccc - 2. * mfccb * uz + mfcca * (1. - uz2) - c1o9 * oMdrho * uz2; +// m2 = mfccc * c1o2 + mfccb * (uz + c1o2) + (mfcca + c1o9 * oMdrho) * (uz2 + uz) * c1o2; +// mfcca = m0; +// mfccb = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// m0 = mfaca * c1o2 + mfaba * (uy - c1o2) + (mfaaa + c1o6 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfaca - 2. * mfaba * uy + mfaaa * (1. - uy2) - c1o6 * oMdrho * uy2; +// m2 = mfaca * c1o2 + mfaba * (uy + c1o2) + (mfaaa + c1o6 * oMdrho) * (uy2 + uy) * c1o2; +// mfaaa = m0; +// mfaba = m1; +// mfaca = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacb * c1o2 + mfabb * (uy - c1o2) + (mfaab + c2o3 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfacb - 2. * mfabb * uy + mfaab * (1. - uy2) - c2o3 * oMdrho * uy2; +// m2 = mfacb * c1o2 + mfabb * (uy + c1o2) + (mfaab + c2o3 * oMdrho) * (uy2 + uy) * c1o2; +// mfaab = m0; +// mfabb = m1; +// mfacb = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacc * c1o2 + mfabc * (uy - c1o2) + (mfaac + c1o6 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfacc - 2. * mfabc * uy + mfaac * (1. - uy2) - c1o6 * oMdrho * uy2; +// m2 = mfacc * c1o2 + mfabc * (uy + c1o2) + (mfaac + c1o6 * oMdrho) * (uy2 + uy) * c1o2; +// mfaac = m0; +// mfabc = m1; +// mfacc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfbca * c1o2 + mfbba * (uy - c1o2) + mfbaa * (uy2 - uy) * c1o2; +// m1 = -mfbca - 2. * mfbba * uy + mfbaa * (1. - uy2); +// m2 = mfbca * c1o2 + mfbba * (uy + c1o2) + mfbaa * (uy2 + uy) * c1o2; +// mfbaa = m0; +// mfbba = m1; +// mfbca = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcb * c1o2 + mfbbb * (uy - c1o2) + mfbab * (uy2 - uy) * c1o2; +// m1 = -mfbcb - 2. * mfbbb * uy + mfbab * (1. - uy2); +// m2 = mfbcb * c1o2 + mfbbb * (uy + c1o2) + mfbab * (uy2 + uy) * c1o2; +// mfbab = m0; +// mfbbb = m1; +// mfbcb = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcc * c1o2 + mfbbc * (uy - c1o2) + mfbac * (uy2 - uy) * c1o2; +// m1 = -mfbcc - 2. * mfbbc * uy + mfbac * (1. - uy2); +// m2 = mfbcc * c1o2 + mfbbc * (uy + c1o2) + mfbac * (uy2 + uy) * c1o2; +// mfbac = m0; +// mfbbc = m1; +// mfbcc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcca * c1o2 + mfcba * (uy - c1o2) + (mfcaa + c1o18 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfcca - 2. * mfcba * uy + mfcaa * (1. - uy2) - c1o18 * oMdrho * uy2; +// m2 = mfcca * c1o2 + mfcba * (uy + c1o2) + (mfcaa + c1o18 * oMdrho) * (uy2 + uy) * c1o2; +// mfcaa = m0; +// mfcba = m1; +// mfcca = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccb * c1o2 + mfcbb * (uy - c1o2) + (mfcab + c2o9 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfccb - 2. * mfcbb * uy + mfcab * (1. - uy2) - c2o9 * oMdrho * uy2; +// m2 = mfccb * c1o2 + mfcbb * (uy + c1o2) + (mfcab + c2o9 * oMdrho) * (uy2 + uy) * c1o2; +// mfcab = m0; +// mfcbb = m1; +// mfccb = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfcbc * (uy - c1o2) + (mfcac + c1o18 * oMdrho) * (uy2 - uy) * c1o2; +// m1 = -mfccc - 2. * mfcbc * uy + mfcac * (1. - uy2) - c1o18 * oMdrho * uy2; +// m2 = mfccc * c1o2 + mfcbc * (uy + c1o2) + (mfcac + c1o18 * oMdrho) * (uy2 + uy) * c1o2; +// mfcac = m0; +// mfcbc = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// m0 = mfcaa * c1o2 + mfbaa * (ux - c1o2) + (mfaaa + c1o36 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcaa - 2. * mfbaa * ux + mfaaa * (1. - ux2) - c1o36 * oMdrho * ux2; +// m2 = mfcaa * c1o2 + mfbaa * (ux + c1o2) + (mfaaa + c1o36 * oMdrho) * (ux2 + ux) * c1o2; +// mfaaa = m0; +// mfbaa = m1; +// mfcaa = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcba * c1o2 + mfbba * (ux - c1o2) + (mfaba + c1o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcba - 2. * mfbba * ux + mfaba * (1. - ux2) - c1o9 * oMdrho * ux2; +// m2 = mfcba * c1o2 + mfbba * (ux + c1o2) + (mfaba + c1o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfaba = m0; +// mfbba = m1; +// mfcba = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcca * c1o2 + mfbca * (ux - c1o2) + (mfaca + c1o36 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcca - 2. * mfbca * ux + mfaca * (1. - ux2) - c1o36 * oMdrho * ux2; +// m2 = mfcca * c1o2 + mfbca * (ux + c1o2) + (mfaca + c1o36 * oMdrho) * (ux2 + ux) * c1o2; +// mfaca = m0; +// mfbca = m1; +// mfcca = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcab * c1o2 + mfbab * (ux - c1o2) + (mfaab + c1o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcab - 2. * mfbab * ux + mfaab * (1. - ux2) - c1o9 * oMdrho * ux2; +// m2 = mfcab * c1o2 + mfbab * (ux + c1o2) + (mfaab + c1o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfaab = m0; +// mfbab = m1; +// mfcab = m2; +// ///////////b//////////////////////////////////////////////////////////////////////// +// m0 = mfcbb * c1o2 + mfbbb * (ux - c1o2) + (mfabb + c4o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcbb - 2. * mfbbb * ux + mfabb * (1. - ux2) - c4o9 * oMdrho * ux2; +// m2 = mfcbb * c1o2 + mfbbb * (ux + c1o2) + (mfabb + c4o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfabb = m0; +// mfbbb = m1; +// mfcbb = m2; +// ///////////b//////////////////////////////////////////////////////////////////////// +// m0 = mfccb * c1o2 + mfbcb * (ux - c1o2) + (mfacb + c1o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfccb - 2. * mfbcb * ux + mfacb * (1. - ux2) - c1o9 * oMdrho * ux2; +// m2 = mfccb * c1o2 + mfbcb * (ux + c1o2) + (mfacb + c1o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfacb = m0; +// mfbcb = m1; +// mfccb = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcac * c1o2 + mfbac * (ux - c1o2) + (mfaac + c1o36 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcac - 2. * mfbac * ux + mfaac * (1. - ux2) - c1o36 * oMdrho * ux2; +// m2 = mfcac * c1o2 + mfbac * (ux + c1o2) + (mfaac + c1o36 * oMdrho) * (ux2 + ux) * c1o2; +// mfaac = m0; +// mfbac = m1; +// mfcac = m2; +// ///////////c//////////////////////////////////////////////////////////////////////// +// m0 = mfcbc * c1o2 + mfbbc * (ux - c1o2) + (mfabc + c1o9 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfcbc - 2. * mfbbc * ux + mfabc * (1. - ux2) - c1o9 * oMdrho * ux2; +// m2 = mfcbc * c1o2 + mfbbc * (ux + c1o2) + (mfabc + c1o9 * oMdrho) * (ux2 + ux) * c1o2; +// mfabc = m0; +// mfbbc = m1; +// mfcbc = m2; +// ///////////c//////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfbcc * (ux - c1o2) + (mfacc + c1o36 * oMdrho) * (ux2 - ux) * c1o2; +// m1 = -mfccc - 2. * mfbcc * ux + mfacc * (1. - ux2) - c1o36 * oMdrho * ux2; +// m2 = mfccc * c1o2 + mfbcc * (ux + c1o2) + (mfacc + c1o36 * oMdrho) * (ux2 + ux) * c1o2; +// mfacc = m0; +// mfbcc = m1; +// mfccc = m2; +// +// /////////////////////////////////////////////////////////////////////////// +// +// ////////////////////////////////////////////////////////////////////////// +// // proof correctness +// ////////////////////////////////////////////////////////////////////////// +//#ifdef PROOF_CORRECTNESS +// LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + +// (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + +// (mfbaa + mfbac + mfbca + mfbcc) + (mfabb + mfcbb) + (mfbab + mfbcb) + +// (mfbba + mfbbc) + mfbbb; +// +// LBMReal dif = rho1 - rho_post; +//#ifdef SINGLEPRECISION +// if (dif > 10.0E-7 || dif < -10.0E-7) +//#else +// if (dif > 10.0E-15 || dif < -10.0E-15) +//#endif +// { +// UB_THROW(UbException(UB_EXARGS, +// "rho=" + UbSystem::toString(rho) + ", rho_post=" + +// UbSystem::toString(rho_post) + " dif=" + UbSystem::toString(dif) + +// " rho is not correct for node " + UbSystem::toString(x1) + "," + +// UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// } +//#endif +// +// mfcbb = rho * c1o3 * (mfcbb) + 0.5 * forcingTerm[DIR_P00]; +// mfbcb = rho * c1o3 * (mfbcb) + 0.5 * forcingTerm[N]; +// mfbbc = rho * c1o3 * (mfbbc) + 0.5 * forcingTerm[T]; +// mfccb = rho * c1o3 * (mfccb) + 0.5 * forcingTerm[NE]; +// mfacb = rho * c1o3 * (mfacb) + 0.5 * forcingTerm[NW]; +// mfcbc = rho * c1o3 * (mfcbc) + 0.5 * forcingTerm[TE]; +// mfabc = rho * c1o3 * (mfabc) + 0.5 * forcingTerm[TW]; +// mfbcc = rho * c1o3 * (mfbcc) + 0.5 * forcingTerm[TN]; +// mfbac = rho * c1o3 * (mfbac) + 0.5 * forcingTerm[TS]; +// mfccc = rho * c1o3 * (mfccc) + 0.5 * forcingTerm[TNE]; +// mfacc = rho * c1o3 * (mfacc) + 0.5 * forcingTerm[TNW]; +// mfcac = rho * c1o3 * (mfcac) + 0.5 * forcingTerm[TSE]; +// mfaac = rho * c1o3 * (mfaac) + 0.5 * forcingTerm[TSW]; +// mfabb = rho * c1o3 * (mfabb) + 0.5 * forcingTerm[W]; +// mfbab = rho * c1o3 * (mfbab) + 0.5 * forcingTerm[S]; +// mfbba = rho * c1o3 * (mfbba) + 0.5 * forcingTerm[B]; +// mfaab = rho * c1o3 * (mfaab) + 0.5 * forcingTerm[SW]; +// mfcab = rho * c1o3 * (mfcab) + 0.5 * forcingTerm[SE]; +// mfaba = rho * c1o3 * (mfaba) + 0.5 * forcingTerm[BW]; +// mfcba = rho * c1o3 * (mfcba) + 0.5 * forcingTerm[BE]; +// mfbaa = rho * c1o3 * (mfbaa) + 0.5 * forcingTerm[BS]; +// mfbca = rho * c1o3 * (mfbca) + 0.5 * forcingTerm[BN]; +// mfaaa = rho * c1o3 * (mfaaa) + 0.5 * forcingTerm[BSW]; +// mfcaa = rho * c1o3 * (mfcaa) + 0.5 * forcingTerm[BSE]; +// mfaca = rho * c1o3 * (mfaca) + 0.5 * forcingTerm[BNW]; +// mfcca = rho * c1o3 * (mfcca) + 0.5 * forcingTerm[BNE]; +// mfbbb = rho * c1o3 * (mfbbb) + 0.5 * forcingTerm[REST]; +// +// ////////////////////////////////////////////////////////////////////////// +// // write distribution for F +// ////////////////////////////////////////////////////////////////////////// +// +// (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb; +// (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab; +// (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba; +// (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; +// (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; +// (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; +// (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; +// (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; +// (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; +// (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; +// (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; +// (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; +// (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; +// +// (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; +// (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; +// +// (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb; +// !Old Kernel + ///////////////////// P H A S E - F I E L D S O L V E R + //////////////////////////////////////////// + /////CUMULANT PHASE-FIELD + LBMReal omegaD =1.0/( 3.0 * mob + 0.5); + { + mfcbb = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + mfbbb = (*this->zeroDistributionsH1)(x1, x2, x3); + + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // fluid component + //LBMReal drhoFluid = + // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) + + // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) + + // ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb; + + //LBMReal rhoFluid = c1 + drhoFluid; + //LBMReal OOrhoFluid = c1 / rhoFluid; + + + //LBMReal vvx = + // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) + + // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) + + // (fcbb - fabb)) * OOrhoFluid; + //LBMReal vvy = + // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) + + // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) + + // (fbcb - fbab)) * OOrhoFluid; + //LBMReal vvz = + // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) + + // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) + + // (fbbc - fbba)) * OOrhoFluid; + + // LBMReal vvx = ux; + // LBMReal vvy = uy; + // LBMReal vvz = uz; + //////////////////////////////////////////////////////////////////////////////////// + // second component + LBMReal concentration = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + // LBMReal fx = forces[0]; + // LBMReal fy = forces[1]; + // LBMReal fz = -concentration * forces[2]; + // vvx += fx * c1o2; + // vvy += fy * c1o2; + // vvz += fz * c1o2; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal oneMinusRho = c1- concentration; + + LBMReal cx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal cy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal cz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal cx2 = cx * cx; + LBMReal cy2 = cy * cy; + LBMReal cz2 = cz * cz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfaab, mfabb, mfacb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + forwardChimera(mfaba, mfbba, mfcba, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfaab, mfbab, mfcab, cx, cx2); + forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + //! - experimental Cumulant ... to be published ... hopefully + //! + + // linearized orthogonalization of 3rd order central moments + LBMReal Mabc = mfabc - mfaba * c1o3; + LBMReal Mbca = mfbca - mfbaa * c1o3; + LBMReal Macb = mfacb - mfaab * c1o3; + LBMReal Mcba = mfcba - mfaba * c1o3; + LBMReal Mcab = mfcab - mfaab * c1o3; + LBMReal Mbac = mfbac - mfbaa * c1o3; + // linearized orthogonalization of 5th order central moments + LBMReal Mcbc = mfcbc - mfaba * c1o9; + LBMReal Mbcc = mfbcc - mfbaa * c1o9; + LBMReal Mccb = mfccb - mfaab * c1o9; + + // collision of 1st order moments + // LBMReal ccx, ccy, ccz; + + + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + normX1 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + normX2 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + normX3 * (c1 - 0.5 * omegaD) * (1.0 - phi[DIR_000]) * (phi[DIR_000]) * c1o3 * oneOverInterfaceScale; + + //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx; + //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy; + //mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz; + + + cx2 = cx * cx; + cy2 = cy * cy; + cz2 = cz * cz; + + // equilibration of 2nd order moments + mfbba = zeroReal; + mfbab = zeroReal; + mfabb = zeroReal; + + mfcaa = c1o3 * concentration; + mfaca = c1o3 * concentration; + mfaac = c1o3 * concentration; + + + //LBMReal omega2 = 1.0f;// omegaD; + //mfbba *= (c1 - omega2); + //mfbab *= (c1 - omega2); + //mfabb *= (c1 - omega2); + + //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration; + + // equilibration of 3rd order moments + Mabc = zeroReal; + Mbca = zeroReal; + Macb = zeroReal; + Mcba = zeroReal; + Mcab = zeroReal; + Mbac = zeroReal; + mfbbb = zeroReal; + + // from linearized orthogonalization 3rd order central moments to central moments + mfabc = Mabc + mfaba * c1o3; + mfbca = Mbca + mfbaa * c1o3; + mfacb = Macb + mfaab * c1o3; + mfcba = Mcba + mfaba * c1o3; + mfcab = Mcab + mfaab * c1o3; + mfbac = Mbac + mfbaa * c1o3; + + // equilibration of 4th order moments + mfacc = c1o9 * concentration; + mfcac = c1o9 * concentration; + mfcca = c1o9 * concentration; + + mfcbb = zeroReal; + mfbcb = zeroReal; + mfbbc = zeroReal; + + // equilibration of 5th order moments + Mcbc = zeroReal; + Mbcc = zeroReal; + Mccb = zeroReal; + + // from linearized orthogonalization 5th order central moments to central moments + mfcbc = Mcbc + mfaba * c1o9; + mfbcc = Mbcc + mfbaa * c1o9; + mfccb = Mccb + mfaab * c1o9; + + // equilibration of 6th order moment + mfccc = c1o27 * concentration; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + backwardChimera(mfaba, mfbba, mfcba, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfaab, mfbab, mfcab, cx, cx2); + backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfaab, mfabb, mfacb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + + + (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3 ) = mfcbb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3 ) = mfbcb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3 ) = mfccb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3 ) = mfacb; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH1)(x1,x2,x3) = mfbbb; + } + + ////Phasefield 2: + + { + + normX1 *= -1; + normX2 *= -1; + normX3 *= -1; + + mfcbb = (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3); + mfabb = (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p); + mfbbb = (*this->zeroDistributionsH2)(x1, x2, x3); + + + //////////////////////////////////////////////////////////////////////////////////// +//! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref +//! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> +//! +//////////////////////////////////////////////////////////////////////////////////// +// fluid component + //LBMReal drhoFluid = + // ((((fccc + faaa) + (faca + fcac)) + ((facc + fcaa) + (faac + fcca))) + + // (((fbac + fbca) + (fbaa + fbcc)) + ((fabc + fcba) + (faba + fcbc)) + ((facb + fcab) + (faab + fccb))) + + // ((fabb + fcbb) + (fbab + fbcb) + (fbba + fbbc))) + fbbb; + + //LBMReal rhoFluid = c1 + drhoFluid; + //LBMReal OOrhoFluid = c1 / rhoFluid; + + + //LBMReal vvx = + // ((((fccc - faaa) + (fcac - faca)) + ((fcaa - facc) + (fcca - faac))) + + // (((fcba - fabc) + (fcbc - faba)) + ((fcab - facb) + (fccb - faab))) + + // (fcbb - fabb)) * OOrhoFluid; + //LBMReal vvy = + // ((((fccc - faaa) + (faca - fcac)) + ((facc - fcaa) + (fcca - faac))) + + // (((fbca - fbac) + (fbcc - fbaa)) + ((facb - fcab) + (fccb - faab))) + + // (fbcb - fbab)) * OOrhoFluid; + //LBMReal vvz = + // ((((fccc - faaa) + (fcac - faca)) + ((facc - fcaa) + (faac - fcca))) + + // (((fbac - fbca) + (fbcc - fbaa)) + ((fabc - fcba) + (fcbc - faba))) + + // (fbbc - fbba)) * OOrhoFluid; + + // LBMReal vvx = ux; + // LBMReal vvy = uy; + // LBMReal vvz = uz; + //////////////////////////////////////////////////////////////////////////////////// + // second component + LBMReal concentration = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + // LBMReal fx = forces[0]; + // LBMReal fy = forces[1]; + // LBMReal fz = -concentration * forces[2]; + // vvx += fx * c1o2; + // vvy += fy * c1o2; + // vvz += fz * c1o2; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal oneMinusRho = c1 - concentration; + + LBMReal cx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal cy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal cz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal cx2 = cx * cx; + LBMReal cy2 = cy * cy; + LBMReal cz2 = cz * cz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfaab, mfabb, mfacb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + forwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + forwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + forwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + forwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + forwardChimera(mfaba, mfbba, mfcba, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfaab, mfbab, mfcab, cx, cx2); + forwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + forwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + forwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + forwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + forwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c3, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + //! - experimental Cumulant ... to be published ... hopefully + //! + + // linearized orthogonalization of 3rd order central moments + LBMReal Mabc = mfabc - mfaba * c1o3; + LBMReal Mbca = mfbca - mfbaa * c1o3; + LBMReal Macb = mfacb - mfaab * c1o3; + LBMReal Mcba = mfcba - mfaba * c1o3; + LBMReal Mcab = mfcab - mfaab * c1o3; + LBMReal Mbac = mfbac - mfbaa * c1o3; + // linearized orthogonalization of 5th order central moments + LBMReal Mcbc = mfcbc - mfaba * c1o9; + LBMReal Mbcc = mfbcc - mfbaa * c1o9; + LBMReal Mccb = mfccb - mfaab * c1o9; + + // collision of 1st order moments + cx = cx * (c1 - omegaD) + omegaD * vvx * concentration + + normX1 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + cy = cy * (c1 - omegaD) + omegaD * vvy * concentration + + normX2 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + cz = cz * (c1 - omegaD) + omegaD * vvz * concentration + + normX3 * (c1 - 0.5 * omegaD) * ( phi[DIR_000]) * (phi2[DIR_000]) * c1o3 * oneOverInterfaceScale; + + //mhx = (ux * phi[REST] + normX1 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhx; + //mhy = (uy * phi[REST] + normX2 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhy; +//mhz = (uz * phi[REST] + normX3 * (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST])) / tauH + (1.0 - 1.0 / tauH) * mhz; + + + cx2 = cx * cx; + cy2 = cy * cy; + cz2 = cz * cz; + + // equilibration of 2nd order moments + mfbba = zeroReal; + mfbab = zeroReal; + mfabb = zeroReal; + + mfcaa = c1o3 * concentration; + mfaca = c1o3 * concentration; + mfaac = c1o3 * concentration; + + + //LBMReal omega2 = 1.0f;// omegaD; + //mfbba *= (c1 - omega2); + //mfbab *= (c1 - omega2); + //mfabb *= (c1 - omega2); + + //mfcaa = mfcaa*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaca = mfaca*(c1 - omega2) + omega2*c1o3 * concentration; + //mfaac = mfaac*(c1 - omega2) + omega2*c1o3 * concentration; + + // equilibration of 3rd order moments + Mabc = zeroReal; + Mbca = zeroReal; + Macb = zeroReal; + Mcba = zeroReal; + Mcab = zeroReal; + Mbac = zeroReal; + mfbbb = zeroReal; + + // from linearized orthogonalization 3rd order central moments to central moments + mfabc = Mabc + mfaba * c1o3; + mfbca = Mbca + mfbaa * c1o3; + mfacb = Macb + mfaab * c1o3; + mfcba = Mcba + mfaba * c1o3; + mfcab = Mcab + mfaab * c1o3; + mfbac = Mbac + mfbaa * c1o3; + + // equilibration of 4th order moments + mfacc = c1o9 * concentration; + mfcac = c1o9 * concentration; + mfcca = c1o9 * concentration; + + mfcbb = zeroReal; + mfbcb = zeroReal; + mfbbc = zeroReal; + + // equilibration of 5th order moments + Mcbc = zeroReal; + Mbcc = zeroReal; + Mccb = zeroReal; + + // from linearized orthogonalization 5th order central moments to central moments + mfcbc = Mcbc + mfaba * c1o9; + mfbcc = Mbcc + mfbaa * c1o9; + mfccb = Mccb + mfaab * c1o9; + + // equilibration of 6th order moment + mfccc = c1o27 * concentration; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfbaa, mfcaa, cx, cx2, c1, c1, oneMinusRho); + backwardChimera(mfaba, mfbba, mfcba, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaca, mfbca, mfcca, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfaab, mfbab, mfcab, cx, cx2); + backwardChimera(mfabb, mfbbb, mfcbb, cx, cx2); + backwardChimera(mfacb, mfbcb, mfccb, cx, cx2); + backwardInverseChimeraWithKincompressible(mfaac, mfbac, mfcac, cx, cx2, c3, c1o3, oneMinusRho); + backwardChimera(mfabc, mfbbc, mfcbc, cx, cx2); + backwardInverseChimeraWithKincompressible(mfacc, mfbcc, mfccc, cx, cx2, c9, c1o9, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaba, mfaca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfaab, mfabb, mfacb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfaac, mfabc, mfacc, cy, cy2, c18, c1o18, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbba, mfbca, cy, cy2, c3o2, c2o3, oneMinusRho); + backwardChimera(mfbab, mfbbb, mfbcb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfbac, mfbbc, mfbcc, cy, cy2, c9o2, c2o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcba, mfcca, cy, cy2, c6, c1o6, oneMinusRho); + backwardChimera(mfcab, mfcbb, mfccb, cy, cy2); + backwardInverseChimeraWithKincompressible(mfcac, mfcbc, mfccc, cy, cy2, c18, c1o18, oneMinusRho); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithKincompressible(mfaaa, mfaab, mfaac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaba, mfabb, mfabc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfaca, mfacb, mfacc, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbaa, mfbab, mfbac, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbba, mfbbb, mfbbc, cz, cz2, c9o4, c4o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfbca, mfbcb, mfbcc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcaa, mfcab, mfcac, cz, cz2, c36, c1o36, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcba, mfcbb, mfcbc, cz, cz2, c9, c1o9, oneMinusRho); + backwardInverseChimeraWithKincompressible(mfcca, mfccb, mfccc, cz, cz2, c36, c1o36, oneMinusRho); + + + + (*this->localDistributionsH2)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH2)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH2)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH2)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH2)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH2)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH2)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH2)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH2)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH2)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH2)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH2)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH2)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH2)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH2)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH2)(x1, x2, x3) = mfbbb; + + } + + + + /////!CUMULANT PHASE-FIELD + + + + ///////////////////// PHASE-FIELD BGK SOLVER /////////////////////////////// + + //h[DIR_P00] = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + //h[N] = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + //h[T] = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + //h[NE] = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + //h[NW] = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + //h[TE] = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + //h[TW] = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + //h[TN] = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + //h[TS] = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + //h[TNE] = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + //h[TNW] = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + //h[TSE] = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + //h[TSW] = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + //h[W] = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + //h[S] = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + //h[B] = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + //h[SW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + //h[SE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + //h[BW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + //h[BE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + //h[BS] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + //h[BN] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + //h[BSW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + //h[BSE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + //h[BNW] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + //h[BNE] = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + //h[REST] = (*this->zeroDistributionsH)(x1, x2, x3); + + //for (int dir = STARTF; dir < (ENDF + 1); dir++) { + // LBMReal velProd = DX1[dir] * ux + DX2[dir] * uy + DX3[dir] * uz; + // LBMReal velSq1 = velProd * velProd; + // LBMReal hEq; //, gEq; + + // if (dir != REST) { + // LBMReal dirGrad_phi = (phi[dir] - phi[INVDIR[dir]]) / 2.0; + // LBMReal hSource = (tauH - 0.5) * (1.0 - phi[REST]) * (phi[REST]) * (dirGrad_phi) / denom; + // hEq = phi[REST] * WEIGTH[dir] * (1.0 + 3.0 * velProd + 4.5 * velSq1 - 1.5 * (ux2 + uy2 + uz2)) + hSource * WEIGTH[dir]; + + // // This corresponds with the collision factor of 1.0 which equals (tauH + 0.5). + // h[dir] = h[dir] - (h[dir] - hEq) / (tauH); + + // } else { + // hEq = phi[REST] * WEIGTH[REST] * (1.0 - 1.5 * (ux2 + uy2 + uz2)); + // h[REST] = h[REST] - (h[REST] - hEq) / (tauH); + // } + //} + + //(*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3) = h[D3Q27System::INV_E]; + //(*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3) = h[D3Q27System::INV_N]; + //(*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3) = h[D3Q27System::INV_T]; + //(*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3) = h[D3Q27System::INV_NE]; + //(*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3) = h[D3Q27System::INV_NW]; + //(*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3) = h[D3Q27System::INV_TE]; + //(*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3) = h[D3Q27System::INV_TW]; + //(*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3) = h[D3Q27System::INV_TN]; + //(*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3) = h[D3Q27System::INV_TS]; + //(*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3) = h[D3Q27System::INV_TNE]; + //(*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3) = h[D3Q27System::INV_TNW]; + //(*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3) = h[D3Q27System::INV_TSE]; + //(*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = h[D3Q27System::INV_TSW]; + + //(*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3) = h[D3Q27System::INV_W]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3) = h[D3Q27System::INV_S]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p) = h[D3Q27System::INV_B]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3) = h[D3Q27System::INV_SW]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3) = h[D3Q27System::INV_SE]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p) = h[D3Q27System::INV_BW]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p) = h[D3Q27System::INV_BE]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p) = h[D3Q27System::INV_BS]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p) = h[D3Q27System::INV_BN]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = h[D3Q27System::INV_BSW]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p) = h[D3Q27System::INV_BSE]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p) = h[D3Q27System::INV_BNW]; + //(*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p) = h[D3Q27System::INV_BNE]; + + //(*this->zeroDistributionsH)(x1, x2, x3) = h[D3Q27System::REST]; + + ///////////////////// END OF OLD BGK SOLVER /////////////////////////////// + } + } + } + + // dataSet->setPhaseField(divU); + } +} +////////////////////////////////////////////////////////////////////////// + +LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX1_phi() +{ + using namespace D3Q27System; + return 3.0* ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) + (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) + (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) + (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_PM0] - phi[DIR_MP0]) + (phi[DIR_PP0] - phi[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_P00] - phi[DIR_M00])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX1[k] * phi[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX2_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PPM] - phi[DIR_MMP])- (phi[DIR_PMP] - phi[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_0PP] - phi[DIR_0MM]) + (phi[DIR_0PM] - phi[DIR_0MP])) + ((phi[DIR_PP0] - phi[DIR_MM0])- (phi[DIR_PM0] - phi[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_0P0] - phi[DIR_0M0])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX2[k] * phi[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX3_phi() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi[DIR_PPP] - phi[DIR_MMM]) - (phi[DIR_PMM] - phi[DIR_MPP])) + ((phi[DIR_PMP] - phi[DIR_MPM]) - (phi[DIR_PPM] - phi[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi[DIR_P0P] - phi[DIR_M0M]) - (phi[DIR_P0M] - phi[DIR_M0P])) + ((phi[DIR_0MP] - phi[DIR_0PM]) + (phi[DIR_0PP] - phi[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi[DIR_00P] - phi[DIR_00M])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX3[k] * phi[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX1_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) + (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) + (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) + (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_PM0] - phi2[DIR_MP0]) + (phi2[DIR_PP0] - phi2[DIR_MM0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_P00] - phi2[DIR_M00])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX1[k] * phi2[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX2_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PPM] - phi2[DIR_MMP]) - (phi2[DIR_PMP] - phi2[DIR_MPM]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_0PP] - phi2[DIR_0MM]) + (phi2[DIR_0PM] - phi2[DIR_0MP])) + ((phi2[DIR_PP0] - phi2[DIR_MM0]) - (phi2[DIR_PM0] - phi2[DIR_MP0])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_0P0] - phi2[DIR_0M0])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX2[k] * phi2[k]; + //} + //return 3.0 * sum; +} + +LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::gradX3_phi2() +{ + using namespace D3Q27System; + return 3.0 * ((WEIGTH[DIR_PPP] * (((phi2[DIR_PPP] - phi2[DIR_MMM]) - (phi2[DIR_PMM] - phi2[DIR_MPP])) + ((phi2[DIR_PMP] - phi2[DIR_MPM]) - (phi2[DIR_PPM] - phi2[DIR_MMP]))) + + WEIGTH[DIR_PP0] * (((phi2[DIR_P0P] - phi2[DIR_M0M]) - (phi2[DIR_P0M] - phi2[DIR_M0P])) + ((phi2[DIR_0MP] - phi2[DIR_0PM]) + (phi2[DIR_0PP] - phi2[DIR_0MM])))) + + +WEIGTH[DIR_0P0] * (phi2[DIR_00P] - phi2[DIR_00M])); + //LBMReal sum = 0.0; + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * DX3[k] * phi2[k]; + //} + //return 3.0 * sum; +} + + + + + +LBMReal MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::nabla2_phi() +{ + using namespace D3Q27System; + LBMReal sum = 0.0; + sum += WEIGTH[DIR_PPP] * ((((phi[DIR_PPP] - phi[DIR_000]) + (phi[DIR_MMM] - phi[DIR_000])) + ((phi[DIR_MMP] - phi[DIR_000]) + (phi[DIR_PPM] - phi[DIR_000]))) + + (((phi[DIR_MPP] - phi[DIR_000]) + (phi[DIR_PMM] - phi[DIR_000])) + ((phi[DIR_PMP] - phi[DIR_000]) + (phi[DIR_MPM] - phi[DIR_000])))); + sum += WEIGTH[DIR_0PP] * ( + (((phi[DIR_0PP] - phi[DIR_000]) + (phi[DIR_0MM] - phi[DIR_000])) + ((phi[DIR_0MP] - phi[DIR_000]) + (phi[DIR_0PM] - phi[DIR_000]))) + + (((phi[DIR_P0P] - phi[DIR_000]) + (phi[DIR_M0M] - phi[DIR_000])) + ((phi[DIR_M0P] - phi[DIR_000]) + (phi[DIR_P0M] - phi[DIR_000]))) + + (((phi[DIR_PP0] - phi[DIR_000]) + (phi[DIR_MM0] - phi[DIR_000])) + ((phi[DIR_MP0] - phi[DIR_000]) + (phi[DIR_PM0] - phi[DIR_000]))) + ); + sum += WEIGTH[DIR_00P] * ( + ((phi[DIR_00P] - phi[DIR_000]) + (phi[DIR_00M] - phi[DIR_000])) + + ((phi[DIR_0P0] - phi[DIR_000]) + (phi[DIR_0M0] - phi[DIR_000])) + + ((phi[DIR_P00] - phi[DIR_000]) + (phi[DIR_M00] - phi[DIR_000])) + ); + //for (int k = FSTARTDIR; k <= FENDDIR; k++) { + // sum += WEIGTH[k] * (phi[k] - phi[REST]); + //} + return 6.0 * sum; +} + +void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::computePhasefield() +{ + using namespace D3Q27System; + SPtr<DistributionArray3D> distributionsH = dataSet->getHdistributions(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = (int)distributionsH->getNX1() - ghostLayerWidth; + int maxX2 = (int)distributionsH->getNX2() - ghostLayerWidth; + int maxX3 = (int)distributionsH->getNX3() - ghostLayerWidth; + + //------------- Computing the phase-field ------------------ + for (int x3 = minX3; x3 < maxX3; x3++) { + for (int x2 = minX2; x2 < maxX2; x2++) { + for (int x1 = minX1; x1 < maxX1; x1++) { + // if(!bcArray->isSolid(x1,x2,x3) && !bcArray->isUndefined(x1,x2,x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + h[DIR_P00] = (*this->localDistributionsH1)(D3Q27System::ET_E, x1, x2, x3); + h[DIR_0P0] = (*this->localDistributionsH1)(D3Q27System::ET_N, x1, x2, x3); + h[DIR_00P] = (*this->localDistributionsH1)(D3Q27System::ET_T, x1, x2, x3); + h[DIR_PP0] = (*this->localDistributionsH1)(D3Q27System::ET_NE, x1, x2, x3); + h[DIR_MP0] = (*this->localDistributionsH1)(D3Q27System::ET_NW, x1p, x2, x3); + h[DIR_P0P] = (*this->localDistributionsH1)(D3Q27System::ET_TE, x1, x2, x3); + h[DIR_M0P] = (*this->localDistributionsH1)(D3Q27System::ET_TW, x1p, x2, x3); + h[DIR_0PP] = (*this->localDistributionsH1)(D3Q27System::ET_TN, x1, x2, x3); + h[DIR_0MP] = (*this->localDistributionsH1)(D3Q27System::ET_TS, x1, x2p, x3); + h[DIR_PPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNE, x1, x2, x3); + h[DIR_MPP] = (*this->localDistributionsH1)(D3Q27System::ET_TNW, x1p, x2, x3); + h[DIR_PMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSE, x1, x2p, x3); + h[DIR_MMP] = (*this->localDistributionsH1)(D3Q27System::ET_TSW, x1p, x2p, x3); + + h[DIR_M00] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_W, x1p, x2, x3); + h[DIR_0M0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_S, x1, x2p, x3); + h[DIR_00M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_B, x1, x2, x3p); + h[DIR_MM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SW, x1p, x2p, x3); + h[DIR_PM0] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_SE, x1, x2p, x3); + h[DIR_M0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BW, x1p, x2, x3p); + h[DIR_P0M] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BE, x1, x2, x3p); + h[DIR_0MM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BS, x1, x2p, x3p); + h[DIR_0PM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BN, x1, x2, x3p); + h[DIR_MMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSW, x1p, x2p, x3p); + h[DIR_PMM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BSE, x1, x2p, x3p); + h[DIR_MPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNW, x1p, x2, x3p); + h[DIR_PPM] = (*this->nonLocalDistributionsH1)(D3Q27System::ET_BNE, x1, x2, x3p); + + h[DIR_000] = (*this->zeroDistributionsH1)(x1, x2, x3); + } + } + } + } +} + +void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::findNeighbors(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } else { + phi[k] = 0.0; + } + } +} + +void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, + int x3) +{ + using namespace D3Q27System; + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + phi2[DIR_000] = (*ph)(x1, x2, x3); + + + for (int k = FSTARTDIR; k <= FENDDIR; k++) { + + if (!bcArray->isSolid(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k])) { + phi2[k] = (*ph)(x1 + DX1[k], x2 + DX2[k], x3 + DX3[k]); + } + else { + phi2[k] = 0.0; + } + } +} + +void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel::swapDistributions() +{ + LBMKernel::swapDistributions(); + dataSet->getHdistributions()->swap(); + dataSet->getH2distributions()->swap(); +} \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h new file mode 100644 index 0000000000000000000000000000000000000000..070aff23ff78d079d12806b529a750b007ae7137 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h @@ -0,0 +1,119 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel.h +//! \ingroup LBMKernel +//! \author Hesameddin Safari +//======================================================================================= + +#ifndef MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel_H +#define MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +//! \brief Multiphase Cascaded Cumulant LBM kernel. +//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model +//! \author H. Safari, K. Kutscher, M. Geier +class MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel : public LBMKernel +{ +public: + MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel(); + virtual ~MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel(void) = default; + void calculate(int step) override; + SPtr<LBMKernel> clone() override; + void forwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void backwardInverseChimeraWithKincompressible(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K, LBMReal oneMinusRho); + void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + + ///refactor + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld; + + double getCalculationTime() override { return .0; } +protected: + virtual void initDataSet(); + void swapDistributions() override; + LBMReal f1[D3Q27System::ENDF+1]; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH1; + CbArray4D<LBMReal,IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH1; + CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH1; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH2; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH2; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH2; + + //CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr phaseField; + + + LBMReal h [D3Q27System::ENDF+1]; + LBMReal h2[D3Q27System::ENDF + 1]; + LBMReal g [D3Q27System::ENDF+1]; + LBMReal phi[D3Q27System::ENDF+1]; + LBMReal phi2[D3Q27System::ENDF + 1]; + LBMReal pr1[D3Q27System::ENDF+1]; + LBMReal phi_cutoff[D3Q27System::ENDF+1]; + + LBMReal gradX1_phi(); + LBMReal gradX2_phi(); + LBMReal gradX3_phi(); + LBMReal gradX1_phi2(); + LBMReal gradX2_phi2(); + LBMReal gradX3_phi2(); + //LBMReal gradX1_pr1(); + //LBMReal gradX2_pr1(); + //LBMReal gradX3_pr1(); + //LBMReal dirgradC_phi(int n, int k); + void computePhasefield(); + void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, int x1, int x2, int x3); + void findNeighbors2(CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr ph, int x1, int x2, int x3); + //void findNeighbors(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr ph /*Phase-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, int x1, int x2, int x3); + //void pressureFiltering(CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf /*Pressure-Field*/, CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr pf_filtered /*Pressure-Field*/); + + LBMReal nabla2_phi(); + + + mu::value_type muX1,muX2,muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; +}; + +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp index 7ee35063f0cfeb9379313a38b9eeb6f0e6388d49..09cd40c8eceb10fa57ba136ea5f1439211f928ab 100644 --- a/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/RheologyInterpolationProcessor.cpp @@ -121,11 +121,11 @@ void RheologyInterpolationProcessor::calcMoments(const LBMReal* const f, LBMReal press = rho; //interpolate rho! - kxy = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))-(vx1*vx2));// might not be optimal MG 25.2.13 - kyz = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))-(vx2*vx3)); - kxz = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))-(vx1*vx3)); - kxxMyy = -3./2.*omega*((((f[D3Q27System::BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))-(vx1*vx1-vx2*vx2)); - kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))-(vx1*vx1-vx3*vx3)); + kxy = -3.*omega*((((f[DIR_MMP]+f[DIR_PPM])-(f[DIR_MPP]+f[DIR_PMM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_MPM]+f[DIR_PMP])))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_MP0]+f[DIR_PM0]))-(vx1*vx2));// might not be optimal MG 25.2.13 + kyz = -3.*omega*((((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMP]+f[DIR_MPM]))+((f[DIR_PMM]+f[DIR_MPP])-(f[DIR_MMP]+f[DIR_PPM])))+((f[DIR_0MM]+f[DIR_0PP])-(f[DIR_0MP]+f[DIR_0PM]))-(vx2*vx3)); + kxz = -3.*omega*((((f[DIR_MPM]+f[DIR_PMP])-(f[DIR_MMP]+f[DIR_PPM]))+((f[DIR_MMM]+f[DIR_PPP])-(f[DIR_PMM]+f[DIR_MPP])))+((f[DIR_M0M]+f[DIR_P0P])-(f[DIR_M0P]+f[DIR_P0M]))-(vx1*vx3)); + kxxMyy = -3./2.*omega*((((f[D3Q27System::DIR_M0M]+f[DIR_P0P])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_M0P]+f[DIR_P0M])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_0M0]+f[DIR_0P0]))-(vx1*vx1-vx2*vx2)); + kxxMzz = -3./2.*omega*((((f[DIR_MP0]+f[DIR_PM0])-(f[DIR_0MM]+f[DIR_0PP]))+((f[DIR_MM0]+f[DIR_PP0])-(f[DIR_0MP]+f[DIR_0PM])))+((f[DIR_M00]+f[DIR_P00])-(f[DIR_00M]+f[DIR_00P]))-(vx1*vx1-vx3*vx3)); } ////////////////////////////////////////////////////////////////////////// void RheologyInterpolationProcessor::calcInterpolatedCoefficiets_intern(const D3Q27ICell& icell, @@ -443,33 +443,33 @@ void RheologyInterpolationProcessor::calcInterpolatedNode(LBMReal* f, /*LBMReal LBMReal feq[ENDF+1]; D3Q27System::calcIncompFeq(feq,rho,vx1,vx2,vx3); - f[E] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[E]; - f[W] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[W]; - f[N] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[N]; - f[S] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[S]; - f[T] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[T]; - f[B] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[B]; - f[NE] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[NE]; - f[SW] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[SW]; - f[SE] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[SE]; - f[NW] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[NW]; - f[TE] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[TE]; - f[BW] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[BW]; - f[BE] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[BE]; - f[TW] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[TW]; - f[TN] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[TN]; - f[BS] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[BS]; - f[BN] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[BN]; - f[TS] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[TS]; - f[TNE] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[TNE]; - f[TSW] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[TSW]; - f[TSE] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[TSE]; - f[TNW] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[TNW]; - f[BNE] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[BNE]; - f[BSW] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[BSW]; - f[BSE] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[BSE]; - f[BNW] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[BNW]; - f[REST] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO + feq[REST]; + f[DIR_P00] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[DIR_P00]; + f[DIR_M00] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[DIR_M00]; + f[DIR_0P0] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[DIR_0P0]; + f[DIR_0M0] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[DIR_0M0]; + f[DIR_00P] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[DIR_00P]; + f[DIR_00M] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[DIR_00M]; + f[DIR_PP0] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[DIR_PP0]; + f[DIR_MM0] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[DIR_MM0]; + f[DIR_PM0] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[DIR_PM0]; + f[DIR_MP0] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[DIR_MP0]; + f[DIR_P0P] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[DIR_P0P]; + f[DIR_M0M] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[DIR_M0M]; + f[DIR_P0M] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[DIR_P0M]; + f[DIR_M0P] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[DIR_M0P]; + f[DIR_0PP] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[DIR_0PP]; + f[DIR_0MM] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[DIR_0MM]; + f[DIR_0PM] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[DIR_0PM]; + f[DIR_0MP] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[DIR_0MP]; + f[DIR_PPP] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[DIR_PPP]; + f[DIR_MMP] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[DIR_MMP]; + f[DIR_PMP] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[DIR_PMP]; + f[DIR_MPP] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[DIR_MPP]; + f[DIR_PPM] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[DIR_PPM]; + f[DIR_MMM] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[DIR_MMM]; + f[DIR_PMM] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[DIR_PMM]; + f[DIR_MPM] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[DIR_MPM]; + f[DIR_000] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO + feq[DIR_000]; } ////////////////////////////////////////////////////////////////////////// //Position SWB -0.25, -0.25, -0.25 @@ -632,33 +632,33 @@ void RheologyInterpolationProcessor::calcInterpolatedNodeFC(LBMReal* f, LBMReal f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o)); f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o)); - f[E] = f_E + feq[E]; - f[W] = f_E + feq[W]; - f[N] = f_N + feq[N]; - f[S] = f_N + feq[S]; - f[T] = f_T + feq[T]; - f[B] = f_T + feq[B]; - f[NE] = f_NE + feq[NE]; - f[SW] = f_NE + feq[SW]; - f[SE] = f_SE + feq[SE]; - f[NW] = f_SE + feq[NW]; - f[TE] = f_TE + feq[TE]; - f[BW] = f_TE + feq[BW]; - f[BE] = f_BE + feq[BE]; - f[TW] = f_BE + feq[TW]; - f[TN] = f_TN + feq[TN]; - f[BS] = f_TN + feq[BS]; - f[BN] = f_BN + feq[BN]; - f[TS] = f_BN + feq[TS]; - f[TNE] = f_TNE + feq[TNE]; - f[TNW] = f_TNW + feq[TNW]; - f[TSE] = f_TSE + feq[TSE]; - f[TSW] = f_TSW + feq[TSW]; - f[BNE] = f_TSW + feq[BNE]; - f[BNW] = f_TSE + feq[BNW]; - f[BSE] = f_TNW + feq[BSE]; - f[BSW] = f_TNE + feq[BSW]; - f[REST] = f_ZERO + feq[REST]; + f[DIR_P00] = f_E + feq[DIR_P00]; + f[DIR_M00] = f_E + feq[DIR_M00]; + f[DIR_0P0] = f_N + feq[DIR_0P0]; + f[DIR_0M0] = f_N + feq[DIR_0M0]; + f[DIR_00P] = f_T + feq[DIR_00P]; + f[DIR_00M] = f_T + feq[DIR_00M]; + f[DIR_PP0] = f_NE + feq[DIR_PP0]; + f[DIR_MM0] = f_NE + feq[DIR_MM0]; + f[DIR_PM0] = f_SE + feq[DIR_PM0]; + f[DIR_MP0] = f_SE + feq[DIR_MP0]; + f[DIR_P0P] = f_TE + feq[DIR_P0P]; + f[DIR_M0M] = f_TE + feq[DIR_M0M]; + f[DIR_P0M] = f_BE + feq[DIR_P0M]; + f[DIR_M0P] = f_BE + feq[DIR_M0P]; + f[DIR_0PP] = f_TN + feq[DIR_0PP]; + f[DIR_0MM] = f_TN + feq[DIR_0MM]; + f[DIR_0PM] = f_BN + feq[DIR_0PM]; + f[DIR_0MP] = f_BN + feq[DIR_0MP]; + f[DIR_PPP] = f_TNE + feq[DIR_PPP]; + f[DIR_MPP] = f_TNW + feq[DIR_MPP]; + f[DIR_PMP] = f_TSE + feq[DIR_PMP]; + f[DIR_MMP] = f_TSW + feq[DIR_MMP]; + f[DIR_PPM] = f_TSW + feq[DIR_PPM]; + f[DIR_MPM] = f_TSE + feq[DIR_MPM]; + f[DIR_PMM] = f_TNW + feq[DIR_PMM]; + f[DIR_MMM] = f_TNE + feq[DIR_MMM]; + f[DIR_000] = f_ZERO + feq[DIR_000]; } ////////////////////////////////////////////////////////////////////////// void RheologyInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3) diff --git a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h index c8bd2d0797af86858b40a1a29a154107f04e46c8..74627f6181cd02002e2bc2c7a2d284ff288f3c59 100644 --- a/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h +++ b/src/cpu/VirtualFluidsCore/Parallel/MPIIODataStructures.h @@ -117,12 +117,7 @@ struct BoundaryCondition { float bcVelocityX2; float bcVelocityX3; float bcDensity; - - float bcLodiDensity; - float bcLodiVelocityX1; - float bcLodiVelocityX2; - float bcLodiVelocityX3; - float bcLodiLentgh; + float bcPhaseField; float nx1, nx2, nx3; float q[26]; @@ -172,6 +167,7 @@ struct DSArraysPresence { bool isRelaxationFactorPresent; bool isPhaseField1Present; bool isPhaseField2Present; + bool isPressureFieldPresent; }; } // namespace MPIIODataStructures #endif \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/Utilities/MemoryUtil.h b/src/cpu/VirtualFluidsCore/Utilities/MemoryUtil.h index 670a597cb84bd4e98450dad2743a8100f04497ea..4c9f30a902196f8fef5187442f45b94dc64de283 100644 --- a/src/cpu/VirtualFluidsCore/Utilities/MemoryUtil.h +++ b/src/cpu/VirtualFluidsCore/Utilities/MemoryUtil.h @@ -60,6 +60,13 @@ #if defined(__CYGWIN__) #define MEMORYUTIL_CYGWIN #endif + +#include <iostream> +#include <sstream> +#include <string> +#include <vector> +#include "Grid3D.h" + ////////////////////////////////////////////////////////////////////////// // MemoryUtil ////////////////////////////////////////////////////////////////////////// @@ -159,6 +166,43 @@ static long long getPhysMemUsedByMe() } ////////////////////////////////////////////////////////////////////////// +static std::string toString(SPtr<Grid3D> grid, int numberOfProcesses) +{ + unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks(); + int ghostLayer = grid->getGhostLayerWidth()*2+1; + UbTupleInt3 blockNx = grid->getBlockNX(); + + unsigned long long numberOfNodesPerBlock = (unsigned long long)(val<1>(blockNx)) * + (unsigned long long)(val<2>(blockNx)) * + (unsigned long long)(val<3>(blockNx)); + unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock; + unsigned long long numberOfNodesPerBlockWithGhostLayer = numberOfBlocks * (val<1>(blockNx) + ghostLayer) * + (val<2>(blockNx) + ghostLayer) * + (val<3>(blockNx) + ghostLayer); + double needMemAll = double(numberOfNodesPerBlockWithGhostLayer*(27*sizeof(double)+sizeof(int)+sizeof(float)*4)); + double needMem = needMemAll / double(numberOfProcesses); + + std::ostringstream out; + out << "Grid information:" << std::endl; + out << "###################################################" << std::endl; + out << "# Number of blocks = " << numberOfBlocks << std::endl; + out << "# Number of nodes = " << numberOfNodes << std::endl; + int minInitLevel = grid->getCoarsestInitializedLevel(); + int maxInitLevel = grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level<=maxInitLevel; level++) + { + int nobl = grid->getNumberOfBlocks(level); + out << "# Number of blocks for level " << level << " = " << nobl << std::endl; + out << "# Number of nodes for level " << level << " = " << nobl * numberOfNodesPerBlock << std::endl; + } + out << "# Necessary memory = " << needMemAll << " bytes" << std::endl; + out << "# Necessary memory per process = " << needMem << " bytes" << std::endl; + out << "# Available memory per process = " << (double)getTotalPhysMem() << " bytes" << std::endl; + out << "###################################################" << std::endl; + + return out.str(); +} + } // namespace Utilities #endif diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp index a6372fc31712899dab0b8edaf919a141663991ca..f5c87b9fc695d81ad492f89113f2d9e5c56fa9a7 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp @@ -39,7 +39,7 @@ #include "D3Q27EsoTwist3DSplittedVector.h" #include "DataSet3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "BCAdapter.h" #include "Block3D.h" #include "BCArray3D.h" @@ -52,7 +52,9 @@ #include "ThixotropyVelocityWithDensityBCAlgorithm.h" -BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) {} +BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL) +{ +} ////////////////////////////////////////////////////////////////////////// BoundaryConditionsBlockVisitor::~BoundaryConditionsBlockVisitor() = default; ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp index b222d2c67af03cae39a385c91f25b29962565c39..e26b59729594fc3175e523e25d23ce7adc56d74e 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/ChangeBoundaryDensityBlockVisitor.cpp @@ -4,11 +4,11 @@ #include "Block3D.h" #include "BoundaryConditions.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMKernel.h" ChangeBoundaryDensityBlockVisitor::ChangeBoundaryDensityBlockVisitor(float oldBoundaryDensity, float newBoundaryDensity) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), oldBoundaryDensity(oldBoundaryDensity), + : Block3DVisitor(0, D3Q27System::MAXLEVEL), oldBoundaryDensity(oldBoundaryDensity), newBoundaryDensity(newBoundaryDensity) { } diff --git a/src/cpu/VirtualFluidsCore/Visitors/CheckRatioBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/CheckRatioBlockVisitor.cpp index 1f8a9c30e1f7a98812a06716cb461ee0e7d41aba..d329763a43d6985b8930ec0e73b7a06b991801d0 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/CheckRatioBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/CheckRatioBlockVisitor.cpp @@ -1,10 +1,10 @@ #include "CheckRatioBlockVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" CheckRatioBlockVisitor::CheckRatioBlockVisitor(int levelDepth /*shut be maxGridLevel*/, bool includeNotActiveBlocks) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks), + : Block3DVisitor(0, D3Q27System::MAXLEVEL), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks), state(true) { } diff --git a/src/cpu/VirtualFluidsCore/Visitors/GenBlocksGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/GenBlocksGridVisitor.cpp index a8270d40d7b2e193024056551591f6b0f3464b5e..29ea3bfda98c2ce191d1f7c5bc20691049dc2a04 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/GenBlocksGridVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/GenBlocksGridVisitor.cpp @@ -35,7 +35,7 @@ #include "Block3D.h" #include "CoordinateTransformation3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include <geometry3d/GbObject3D.h> diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp index aba67e6749a47e1c06bf28f01d284799eb39c328..0ba49c1a0683d052a07caae46410b5ea8c35aad7 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp @@ -38,10 +38,10 @@ #include "DataSet3D.h" #include "EsoTwist3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMKernel.h" -InitDistributionsBlockVisitor::InitDistributionsBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) +InitDistributionsBlockVisitor::InitDistributionsBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL) { this->setVx1(0.0); this->setVx2(0.0); @@ -247,33 +247,33 @@ void InitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D> double f_TNW = - eps_new *((bz + cy)/(36.*o)) - f_TNE; - f[E] = f_E + feq[E]; - f[W] = f_E + feq[W]; - f[N] = f_N + feq[N]; - f[S] = f_N + feq[S]; - f[T] = f_T + feq[T]; - f[B] = f_T + feq[B]; - f[NE] = f_NE + feq[NE]; - f[SW] = f_NE + feq[SW]; - f[SE] = f_SE + feq[SE]; - f[NW] = f_SE + feq[NW]; - f[TE] = f_TE + feq[TE]; - f[BW] = f_TE + feq[BW]; - f[BE] = f_BE + feq[BE]; - f[TW] = f_BE + feq[TW]; - f[TN] = f_TN + feq[TN]; - f[BS] = f_TN + feq[BS]; - f[BN] = f_BN + feq[BN]; - f[TS] = f_BN + feq[TS]; - f[TNE] = f_TNE + feq[TNE]; - f[TNW] = f_TNW + feq[TNW]; - f[TSE] = f_TSE + feq[TSE]; - f[TSW] = f_TSW + feq[TSW]; - f[BNE] = f_TSW + feq[BNE]; - f[BNW] = f_TSE + feq[BNW]; - f[BSE] = f_TNW + feq[BSE]; - f[BSW] = f_TNE + feq[BSW]; - f[REST] = f_ZERO + feq[REST]; + f[DIR_P00] = f_E + feq[DIR_P00]; + f[DIR_M00] = f_E + feq[DIR_M00]; + f[DIR_0P0] = f_N + feq[DIR_0P0]; + f[DIR_0M0] = f_N + feq[DIR_0M0]; + f[DIR_00P] = f_T + feq[DIR_00P]; + f[DIR_00M] = f_T + feq[DIR_00M]; + f[DIR_PP0] = f_NE + feq[DIR_PP0]; + f[DIR_MM0] = f_NE + feq[DIR_MM0]; + f[DIR_PM0] = f_SE + feq[DIR_PM0]; + f[DIR_MP0] = f_SE + feq[DIR_MP0]; + f[DIR_P0P] = f_TE + feq[DIR_P0P]; + f[DIR_M0M] = f_TE + feq[DIR_M0M]; + f[DIR_P0M] = f_BE + feq[DIR_P0M]; + f[DIR_M0P] = f_BE + feq[DIR_M0P]; + f[DIR_0PP] = f_TN + feq[DIR_0PP]; + f[DIR_0MM] = f_TN + feq[DIR_0MM]; + f[DIR_0PM] = f_BN + feq[DIR_0PM]; + f[DIR_0MP] = f_BN + feq[DIR_0MP]; + f[DIR_PPP] = f_TNE + feq[DIR_PPP]; + f[DIR_MPP] = f_TNW + feq[DIR_MPP]; + f[DIR_PMP] = f_TSE + feq[DIR_PMP]; + f[DIR_MMP] = f_TSW + feq[DIR_MMP]; + f[DIR_PPM] = f_TSW + feq[DIR_PPM]; + f[DIR_MPM] = f_TSE + feq[DIR_MPM]; + f[DIR_PMM] = f_TNW + feq[DIR_PMM]; + f[DIR_MMM] = f_TNE + feq[DIR_MMM]; + f[DIR_000] = f_ZERO + feq[DIR_000]; //calcFeqsFct(f,rho,vx1,vx2,vx3); distributions->setDistribution(f, ix1, ix2, ix3); diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp index b10151a9d2926546c2807db05912f79f6815bf86..1bcb6057f5b5987ced9adc17e7d6fabd262911e6 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsFromFileBlockVisitor.cpp @@ -5,14 +5,14 @@ #include "DataSet3D.h" #include "EsoTwist3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "InitDensityLBMKernel.h" #include "LBMKernel.h" #include <basics/utilities/UbFileInputASCII.h> InitDistributionsFromFileBlockVisitor::InitDistributionsFromFileBlockVisitor(/*LBMReal nu, */ LBMReal rho, std::string filename) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), /*nu(nu),*/ rho(rho) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), /*nu(nu),*/ rho(rho) { UbFileInputASCII in(filename); if (!in) { @@ -202,7 +202,7 @@ void InitDistributionsFromFileBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr< // f_TSW = -eps_new *((ay + bx) / (36.*o)) - f_TNE; double f_TSE = -eps_new *((az + cx) / (36.*o)) - // f_TNE; double f_TNW = -eps_new *((bz + cy) / (36.*o)) - f_TNE; - // f[E] = f_E + feq[E]; + // f[DIR_P00] = f_E + feq[DIR_P00]; // f[W] = f_E + feq[W]; // f[N] = f_N + feq[N]; // f[S] = f_N + feq[S]; diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp index 343353c7b7caf58269e1b25799dbbc730fc227b5..567ce2e7ff5b40f3c8042bd404394a3fbf9ffee4 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsWithInterpolationGridVisitor.cpp @@ -7,7 +7,7 @@ #include "D3Q27EsoTwist3DSplittedVector.h" #include "DataSet3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "InterpolationProcessor.h" #include "LBMKernel.h" #include <CbArray2D.h> diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp index f9be891771838940294a5e3b348a0b4d8c31f366..9c8c05babe4fc2d454908095e8a232eb14434df2 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp @@ -34,7 +34,7 @@ #include "InitThixotropyBlockVisitor.h" #include "LBMKernel.h" #include "BCProcessor.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "DataSet3D.h" #include "EsoTwist3D.h" #include "Grid3D.h" @@ -42,7 +42,7 @@ #include "BCArray3D.h" InitThixotropyBlockVisitor::InitThixotropyBlockVisitor() - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) + : Block3DVisitor(0, D3Q27System::MAXLEVEL) { //this->setVx1(0.0); //this->setVx2(0.0); @@ -56,7 +56,7 @@ InitThixotropyBlockVisitor::InitThixotropyBlockVisitor() } ////////////////////////////////////////////////////////////////////////// //InitThixotropyBlockVisitor::InitThixotropyBlockVisitor(LBMReal lambda /*LBMReal nu, LBMReal D, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3, LBMReal c, LBMReal f1, LBMReal f2, LBMReal f3*/) -// : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) +// : Block3DVisitor(0, D3Q27System::MAXLEVEL) //{ // //this->setVx1(vx1); // //this->setVx2(vx2); @@ -426,7 +426,7 @@ void InitThixotropyBlockVisitor::checkFunction(mu::Parser fct) // double f_TNW = -eps_new * ((bz + cy) / (36. * o)) - f_TNE; // // -// f[E] = f_E + feq[E]; +// f[DIR_P00] = f_E + feq[DIR_P00]; // f[W] = f_E + feq[W]; // f[N] = f_N + feq[N]; // f[S] = f_N + feq[S]; diff --git a/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp index 412e9347d707fe2e4ad733cf53419f18f86faf01..7546aa30721cac1655fba94cb3d68e98d1398546 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/MetisPartitioningGridVisitor.cpp @@ -133,7 +133,7 @@ void MetisPartitioningGridVisitor::buildMetisGraphLevelIntersected(SPtr<Grid3D> // the weights of the vertices are 2^level of grid (1, 2, 4, 8 .....) 1<<level metis.vwgt.push_back((idx_t)(1 << block->getLevel())); - for (int dir = 0; dir <= numOfDirs; dir++) { + for (int dir = D3Q27System::DIR_P00; dir <= numOfDirs; dir++) { SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, block); if (neighBlock) { if (this->getPartitionCondition(neighBlock, level)) { @@ -200,7 +200,7 @@ void MetisPartitioningGridVisitor::buildMetisGraphLevelBased(SPtr<Grid3D> grid, metis.xadj.push_back(edges); metis.vwgt.push_back(vertexWeight); - for (int dir = 0; dir <= numOfDirs; dir++) { + for (int dir = D3Q27System::DIR_P00; dir <= numOfDirs; dir++) { SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, block); if (neighBlock) { if (this->getPartitionCondition(neighBlock, level)) { @@ -256,11 +256,11 @@ void MetisPartitioningGridVisitor::clear() int MetisPartitioningGridVisitor::getEdgeWeight(int dir) { using namespace D3Q27System; - if (dir <= B) { + if (dir <= DIR_00M) { return 100; - } else if (dir >= NE && dir <= TS) { + } else if (dir >= DIR_PP0 && dir <= DIR_0MP) { return 10; - } else if (dir >= TNE) { + } else if (dir >= DIR_PPP) { return 1; } diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp index 34dba741103d8160304507b5e68a311c5149ddbd..003d5d31204fafc82f78a0fddb04897c2c60e77f 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseBoundaryConditionsBlockVisitor.cpp @@ -39,14 +39,14 @@ #include "D3Q27EsoTwist3DSplittedVector.h" #include "DataSet3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "BCAdapter.h" #include "Block3D.h" #include "BCArray3D.h" #include "LBMKernel.h" MultiphaseBoundaryConditionsBlockVisitor::MultiphaseBoundaryConditionsBlockVisitor() : -Block3DVisitor(0, Grid3DSystem::MAXLEVEL) +Block3DVisitor(0, D3Q27System::MAXLEVEL) { } diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp index 4213e2b79a83107a8a545e5daa3001c5a86af35d..a35fc289b7505c722151e2a5afe98815131a989d 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.cpp @@ -38,11 +38,11 @@ #include "DataSet3D.h" #include "EsoTwist3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMKernel.h" MultiphaseInitDistributionsBlockVisitor::MultiphaseInitDistributionsBlockVisitor() - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) + : Block3DVisitor(0, D3Q27System::MAXLEVEL) { this->setVx1(0.0); this->setVx2(0.0); @@ -50,16 +50,13 @@ MultiphaseInitDistributionsBlockVisitor::MultiphaseInitDistributionsBlockVisitor this->setRho(0.0); } ////////////////////////////////////////////////////////////////////////// -MultiphaseInitDistributionsBlockVisitor::MultiphaseInitDistributionsBlockVisitor( LBMReal densityRatio, LBMReal intThickness, LBMReal radius, LBMReal vx1, LBMReal vx2, LBMReal vx3) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), densityRatio(densityRatio) /*, intThickness(intThickness), radius(radius) */ +MultiphaseInitDistributionsBlockVisitor::MultiphaseInitDistributionsBlockVisitor( LBMReal densityRatio, LBMReal vx1, LBMReal vx2, LBMReal vx3, LBMReal rho) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), densityRatio(densityRatio) { - (void) intThickness; - (void) radius; - this->setVx1(vx1); this->setVx2(vx2); this->setVx3(vx3); -} + this->setRho(rho);} ////////////////////////////////////////////////////////////////////////// void MultiphaseInitDistributionsBlockVisitor::setVx1( const mu::Parser& parser) { @@ -165,7 +162,7 @@ void MultiphaseInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPt this->muRho.DefineVar("x1",&x1); this->muRho.DefineVar("x2",&x2); this->muRho.DefineVar("x3",&x3); this->muPhi.DefineVar("x1",&x1); this->muPhi.DefineVar("x2",&x2); this->muPhi.DefineVar("x3",&x3); - LBMReal vx1, vx2, vx3, rho, p1, phi; + LBMReal vx1, vx2, vx3, rho, /*p1,*/ phi; int gridRank = grid->getRank(); int blockRank = block->getRank(); @@ -196,7 +193,7 @@ void MultiphaseInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPt x3 = coords[2]; - p1 = 0.0; + //p1 = 0.0; //p1 = muRho.Eval(); vx1 = muVx1.Eval(); vx2 = muVx2.Eval(); @@ -223,74 +220,105 @@ void MultiphaseInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPt LBMReal gamma = WEIGTH[dir]*(3*velProd + 4.5*velSq1 - 1.5*(vx1Sq+vx2Sq+vx3Sq)); feq[dir] = rho*WEIGTH[dir]*(1 + 3*velProd + 4.5*velSq1 - 1.5*(vx1Sq+vx2Sq+vx3Sq)); - //geq[dir] = p1*WEIGTH1[dir] + gamma; - geq[dir] = p1*WEIGTH[dir]/(rho*UbMath::c1o3) + gamma; + //geq[dir] = p1*WEIGTH[dir] + gamma; + //geq[dir] = p1*WEIGTH[dir]/(rho*UbMath::c1o3) + gamma*rho; + //geq[dir] = (p1*WEIGTH[dir]/(rho*UbMath::c1o3) + gamma*rho)*UbMath::c1o3; + geq[dir] = (gamma*rho)*UbMath::c1o3; } - f[E] = geq[E] ; - f[W] = geq[W] ; - f[N] = geq[N] ; - f[S] = geq[S] ; - f[T] = geq[T] ; - f[B] = geq[B] ; - f[NE] = geq[NE] ; - f[SW] = geq[SW] ; - f[SE] = geq[SE] ; - f[NW] = geq[NW] ; - f[TE] = geq[TE] ; - f[BW] = geq[BW] ; - f[BE] = geq[BE] ; - f[TW] = geq[TW] ; - f[TN] = geq[TN] ; - f[BS] = geq[BS] ; - f[BN] = geq[BN] ; - f[TS] = geq[TS] ; - f[TNE] = geq[TNE] ; - f[TNW] = geq[TNW] ; - f[TSE] = geq[TSE] ; - f[TSW] = geq[TSW] ; - f[BNE] = geq[BNE] ; - f[BNW] = geq[BNW] ; - f[BSE] = geq[BSE] ; - f[BSW] = geq[BSW] ; - f[REST] = geq[REST] ; + f[DIR_P00] = geq[DIR_P00] ; + f[DIR_M00] = geq[DIR_M00] ; + f[DIR_0P0] = geq[DIR_0P0] ; + f[DIR_0M0] = geq[DIR_0M0] ; + f[DIR_00P] = geq[DIR_00P] ; + f[DIR_00M] = geq[DIR_00M] ; + f[DIR_PP0] = geq[DIR_PP0] ; + f[DIR_MM0] = geq[DIR_MM0] ; + f[DIR_PM0] = geq[DIR_PM0] ; + f[DIR_MP0] = geq[DIR_MP0] ; + f[DIR_P0P] = geq[DIR_P0P] ; + f[DIR_M0M] = geq[DIR_M0M] ; + f[DIR_P0M] = geq[DIR_P0M] ; + f[DIR_M0P] = geq[DIR_M0P] ; + f[DIR_0PP] = geq[DIR_0PP] ; + f[DIR_0MM] = geq[DIR_0MM] ; + f[DIR_0PM] = geq[DIR_0PM] ; + f[DIR_0MP] = geq[DIR_0MP] ; + f[DIR_PPP] = geq[DIR_PPP] ; + f[DIR_MPP] = geq[DIR_MPP] ; + f[DIR_PMP] = geq[DIR_PMP] ; + f[DIR_MMP] = geq[DIR_MMP] ; + f[DIR_PPM] = geq[DIR_PPM] ; + f[DIR_MPM] = geq[DIR_MPM] ; + f[DIR_PMM] = geq[DIR_PMM] ; + f[DIR_MMM] = geq[DIR_MMM] ; + f[DIR_000] = geq[DIR_000] ; distributionsF->setDistribution(f, ix1, ix2, ix3); distributionsF->setDistributionInv(f, ix1, ix2, ix3); - f[E] = phi * feq[E] / rho; - f[W] = phi * feq[W] / rho; - f[N] = phi * feq[N] / rho; - f[S] = phi * feq[S] / rho; - f[T] = phi * feq[T] / rho; - f[B] = phi * feq[B] / rho; - f[NE] = phi * feq[NE] / rho; - f[SW] = phi * feq[SW] / rho; - f[SE] = phi * feq[SE] / rho; - f[NW] = phi * feq[NW] / rho; - f[TE] = phi * feq[TE] / rho; - f[BW] = phi * feq[BW] / rho; - f[BE] = phi * feq[BE] / rho; - f[TW] = phi * feq[TW] / rho; - f[TN] = phi * feq[TN] / rho; - f[BS] = phi * feq[BS] / rho; - f[BN] = phi * feq[BN] / rho; - f[TS] = phi * feq[TS] / rho; - f[TNE] = phi * feq[TNE] / rho; - f[TNW] = phi * feq[TNW] / rho; - f[TSE] = phi * feq[TSE] / rho; - f[TSW] = phi * feq[TSW] / rho; - f[BNE] = phi * feq[BNE] / rho; - f[BNW] = phi * feq[BNW] / rho; - f[BSE] = phi * feq[BSE] / rho; - f[BSW] = phi * feq[BSW] / rho; - f[REST] = phi * feq[REST] / rho; + f[DIR_P00] = phi * feq[DIR_P00] / rho; + f[DIR_M00] = phi * feq[DIR_M00] / rho; + f[DIR_0P0] = phi * feq[DIR_0P0] / rho; + f[DIR_0M0] = phi * feq[DIR_0M0] / rho; + f[DIR_00P] = phi * feq[DIR_00P] / rho; + f[DIR_00M] = phi * feq[DIR_00M] / rho; + f[DIR_PP0] = phi * feq[DIR_PP0] / rho; + f[DIR_MM0] = phi * feq[DIR_MM0] / rho; + f[DIR_PM0] = phi * feq[DIR_PM0] / rho; + f[DIR_MP0] = phi * feq[DIR_MP0] / rho; + f[DIR_P0P] = phi * feq[DIR_P0P] / rho; + f[DIR_M0M] = phi * feq[DIR_M0M] / rho; + f[DIR_P0M] = phi * feq[DIR_P0M] / rho; + f[DIR_M0P] = phi * feq[DIR_M0P] / rho; + f[DIR_0PP] = phi * feq[DIR_0PP] / rho; + f[DIR_0MM] = phi * feq[DIR_0MM] / rho; + f[DIR_0PM] = phi * feq[DIR_0PM] / rho; + f[DIR_0MP] = phi * feq[DIR_0MP] / rho; + f[DIR_PPP] = phi * feq[DIR_PPP] / rho; + f[DIR_MPP] = phi * feq[DIR_MPP] / rho; + f[DIR_PMP] = phi * feq[DIR_PMP] / rho; + f[DIR_MMP] = phi * feq[DIR_MMP] / rho; + f[DIR_PPM] = phi * feq[DIR_PPM] / rho; + f[DIR_MPM] = phi * feq[DIR_MPM] / rho; + f[DIR_PMM] = phi * feq[DIR_PMM] / rho; + f[DIR_MMM] = phi * feq[DIR_MMM] / rho; + f[DIR_000] = phi * feq[DIR_000] / rho; distributionsH->setDistribution(f, ix1, ix2, ix3); distributionsH->setDistributionInv(f, ix1, ix2, ix3); if (distributionsH2) { + + f[DIR_P00] = (1.-phi) * feq[DIR_P00] / rho; + f[DIR_M00] = (1.-phi) * feq[DIR_M00] / rho; + f[DIR_0P0] = (1.-phi) * feq[DIR_0P0] / rho; + f[DIR_0M0] = (1.-phi) * feq[DIR_0M0] / rho; + f[DIR_00P] = (1.-phi) * feq[DIR_00P] / rho; + f[DIR_00M] = (1.-phi) * feq[DIR_00M] / rho; + f[DIR_PP0] = (1.-phi) * feq[DIR_PP0] / rho; + f[DIR_MM0] = (1.-phi) * feq[DIR_MM0] / rho; + f[DIR_PM0] = (1.-phi) * feq[DIR_PM0] / rho; + f[DIR_MP0] = (1.-phi) * feq[DIR_MP0] / rho; + f[DIR_P0P] = (1.-phi) * feq[DIR_P0P] / rho; + f[DIR_M0M] = (1.-phi) * feq[DIR_M0M] / rho; + f[DIR_P0M] = (1.-phi) * feq[DIR_P0M] / rho; + f[DIR_M0P] = (1.-phi) * feq[DIR_M0P] / rho; + f[DIR_0PP] = (1.-phi) * feq[DIR_0PP] / rho; + f[DIR_0MM] = (1.-phi) * feq[DIR_0MM] / rho; + f[DIR_0PM] = (1.-phi) * feq[DIR_0PM] / rho; + f[DIR_0MP] = (1.-phi) * feq[DIR_0MP] / rho; + f[DIR_PPP] = (1.-phi) * feq[DIR_PPP] / rho; + f[DIR_MPP] = (1.-phi) * feq[DIR_MPP] / rho; + f[DIR_PMP] = (1.-phi) * feq[DIR_PMP] / rho; + f[DIR_MMP] = (1.-phi) * feq[DIR_MMP] / rho; + f[DIR_PPM] = (1.-phi) * feq[DIR_PPM] / rho; + f[DIR_MPM] = (1.-phi) * feq[DIR_MPM] / rho; + f[DIR_PMM] = (1.-phi) * feq[DIR_PMM] / rho; + f[DIR_MMM] = (1.-phi) * feq[DIR_MMM] / rho; + f[DIR_000] = (1.-phi) * feq[DIR_000] / rho; + distributionsH2->setDistribution(f, ix1, ix2, ix3); distributionsH2->setDistributionInv(f, ix1, ix2, ix3); } diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h index f94167040ad2f1f8b3cdb1f1e1d4f970d80c8877..6ff60387daeef966da6143ef459fa7b7d247fbd5 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h +++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseInitDistributionsBlockVisitor.h @@ -56,7 +56,7 @@ public: //! \param vx1 - velocity in x //! \param vx2 - velocity in y //! \param vx3 - velocity in z - MultiphaseInitDistributionsBlockVisitor( LBMReal densityRatio, LBMReal intThickness, LBMReal radius, LBMReal vx1=0.0, LBMReal vx2=0.0, LBMReal vx3=0.0); + MultiphaseInitDistributionsBlockVisitor( LBMReal densityRatio, LBMReal vx1=0.0, LBMReal vx2=0.0, LBMReal vx3=0.0, LBMReal rho=0.0); ////////////////////////////////////////////////////////////////////////// //automatic vars are: x1,x2, x3 //ussage example: setVx1("x1*0.01+x2*0.003") @@ -95,8 +95,6 @@ private: LBMReal nu; LBMReal densityRatio; - //LBMReal intThickness; - //LBMReal radius; }; #endif //D3Q27INITDISTRIBUTIONSPATCHVISITOR_H diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp index 733c7177dd7624ac78c6a8d30681f20cdedb456b..4990690e2d7d464cfbdc69f2966655568021e7d0 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.cpp @@ -1,17 +1,17 @@ #include "MultiphaseSetKernelBlockVisitor.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMSystem.h" #include "Block3D.h" #include "Grid3D.h" //SetKernelBlockVisitor::SetKernelBlockVisitor(LBMKernel3DPtr kernel, LBMReal nue) : -// Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(kernel), nue(nue) +// Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(kernel), nue(nue) //{ // //} ////////////////////////////////////////////////////////////////////////// //SetKernelBlockVisitor::SetKernelBlockVisitor( LBMKernel3DPtr kernel, LBMReal nue, double availMem, double needMem ) : -// Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(kernel), nue(nue) +// Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(kernel), nue(nue) //{ // if (needMem > availMem) // { @@ -19,9 +19,8 @@ // } //} ////////////////////////////////////////////////////////////////////////// -MultiphaseSetKernelBlockVisitor::MultiphaseSetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nuL, LBMReal nuG, LBMReal densityRatio, LBMReal beta, LBMReal kappa, - LBMReal contactAngle, double availMem, double needMem, MultiphaseSetKernelBlockVisitor::Action action /*= SetKernelBlockVisitor::New*/) : - Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(kernel), nuL(nuL), nuG(nuG), densityRatio(densityRatio), beta(beta), kappa(kappa), contactAngle(contactAngle), action(action), dataSetFlag(true) +MultiphaseSetKernelBlockVisitor::MultiphaseSetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nuL, LBMReal nuG, double availMem, double needMem, MultiphaseSetKernelBlockVisitor::Action action /*= SetKernelBlockVisitor::New*/) : + Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(kernel), nuL(nuL), nuG(nuG), action(action), dataSetFlag(true) { if (needMem > availMem) { @@ -35,11 +34,7 @@ void MultiphaseSetKernelBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> blo { LBMReal collFactorL = LBMSystem::calcCollisionFactor(nuL, block->getLevel()); LBMReal collFactorG = LBMSystem::calcCollisionFactor(nuG, block->getLevel()); - kernel->setCollisionFactorMultiphase(collFactorL, collFactorG); - kernel->setDensityRatio(densityRatio); - kernel->setMultiphaseModelParameters(beta, kappa); - kernel->setContactAngle(contactAngle); kernel->setIndex(block->getX1(), block->getX2(), block->getX3()); kernel->setDeltaT(LBMSystem::getDeltaT(block->getLevel())); diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h index 9f952e2dddaf67fed5fa10cd8874938e584b5114..24d2b35c3a85b80e793b94d61feceb58b607ff19 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h +++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseSetKernelBlockVisitor.h @@ -42,11 +42,7 @@ class MultiphaseSetKernelBlockVisitor : public Block3DVisitor public: enum Action { NewKernel, ChangeKernel, ChangeKernelWithData}; public: - //SetKernelBlockVisitor(LBMKernel3DPtr kernel, LBMReal nue); - - //SetKernelBlockVisitor(LBMKernel3DPtr kernel, LBMReal nue, double availMem, double needMem); - - MultiphaseSetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nuL, LBMReal nuG, LBMReal densityRatio, LBMReal beta, LBMReal kappa, LBMReal contactAngle, double availMem, double needMem, + MultiphaseSetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nuL, LBMReal nuG, double availMem, double needMem, MultiphaseSetKernelBlockVisitor::Action action = MultiphaseSetKernelBlockVisitor::NewKernel); virtual ~MultiphaseSetKernelBlockVisitor() {} @@ -59,10 +55,6 @@ private: SPtr<LBMKernel> kernel; LBMReal nuL; LBMReal nuG; - LBMReal densityRatio; - LBMReal beta; - LBMReal kappa; - LBMReal contactAngle; Action action; bool dataSetFlag; }; diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..28b035f71f7ab83f4ef33188e0d265588835d0eb --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp @@ -0,0 +1,377 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseVelocityFormInitDistributionsBlockVisitor.cpp +//! \ingroup Visitors +//! \author Hesameddin Safari +//======================================================================================= + +#include "MultiphaseVelocityFormInitDistributionsBlockVisitor.h" +#include "BCArray3D.h" +#include "BCProcessor.h" +#include "Block3D.h" +#include "DataSet3D.h" +#include "EsoTwist3D.h" +#include "Grid3D.h" +#include "D3Q27System.h" +#include "LBMKernel.h" + +MultiphaseVelocityFormInitDistributionsBlockVisitor::MultiphaseVelocityFormInitDistributionsBlockVisitor() + : Block3DVisitor(0, D3Q27System::MAXLEVEL) +{ + this->setVx1(0.0); + this->setVx2(0.0); + this->setVx3(0.0); + this->setRho(0.0); + this->setPressure(0.0); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx1( const mu::Parser& parser) +{ + this->checkFunction(parser); + this->muVx1 = parser; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx2( const mu::Parser& parser) +{ + this->checkFunction(parser); + this->muVx2 = parser; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx3( const mu::Parser& parser) +{ + this->checkFunction(parser); + this->muVx3 = parser; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setRho( const mu::Parser& parser) +{ + this->checkFunction(parser); + this->muRho = parser; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPhi( const mu::Parser& parser) +{ + this->checkFunction(parser); + this->muPhi = parser; +} +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPressure(const mu::Parser& parser) +{ + this->checkFunction(parser); + this->muPressure = parser; +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx1( const std::string& muParserString) +{ + this->muVx1.SetExpr(muParserString); + this->checkFunction(muVx1); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx2( const std::string& muParserString) +{ + this->muVx2.SetExpr(muParserString); + this->checkFunction(muVx2); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx3( const std::string& muParserString) +{ + this->muVx3.SetExpr(muParserString); + this->checkFunction(muVx3); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setRho( const std::string& muParserString) +{ + this->muRho.SetExpr(muParserString); + this->checkFunction(muRho); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPhi( const std::string& muParserString) +{ + this->muPhi.SetExpr(muParserString); + this->checkFunction(muPhi); +} +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPressure(const std::string& muParserString) +{ + this->muPressure.SetExpr(muParserString); + this->checkFunction(muPressure); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx1( LBMReal vx1 ) +{ + this->muVx1.SetExpr( UbSystem::toString(vx1,D3Q27RealLim::digits10) ); + this->checkFunction(muVx1); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx2( LBMReal vx2 ) +{ + this->muVx2.SetExpr( UbSystem::toString(vx2,D3Q27RealLim::digits10) ); + this->checkFunction(muVx2); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setVx3( LBMReal vx3 ) +{ + this->muVx3.SetExpr( UbSystem::toString(vx3,D3Q27RealLim::digits10) ); + this->checkFunction(muVx3); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setRho( LBMReal rho ) +{ + this->muRho.SetExpr( UbSystem::toString(rho,D3Q27RealLim::digits10) ); + this->checkFunction(muRho); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPhi( LBMReal phi ) +{ + this->muPhi.SetExpr( UbSystem::toString(phi,D3Q27RealLim::digits10) ); + this->checkFunction(muPhi); +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D> block) +{ + using namespace D3Q27System; + + if(!block) UB_THROW( UbException(UB_EXARGS,"block is not exist") ); + + //define vars for functions + mu::value_type x1,x2,x3; + this->muVx1.DefineVar("x1",&x1); this->muVx1.DefineVar("x2",&x2); this->muVx1.DefineVar("x3",&x3); + this->muVx2.DefineVar("x1",&x1); this->muVx2.DefineVar("x2",&x2); this->muVx2.DefineVar("x3",&x3); + this->muVx3.DefineVar("x1",&x1); this->muVx3.DefineVar("x2",&x2); this->muVx3.DefineVar("x3",&x3); + this->muRho.DefineVar("x1",&x1); this->muRho.DefineVar("x2",&x2); this->muRho.DefineVar("x3",&x3); + this->muPhi.DefineVar("x1",&x1); this->muPhi.DefineVar("x2",&x2); this->muPhi.DefineVar("x3",&x3); + this->muPressure.DefineVar("x1", &x1); this->muPressure.DefineVar("x2", &x2); this->muPressure.DefineVar("x3", &x3); + + + + int gridRank = grid->getRank(); + int blockRank = block->getRank(); + + if (blockRank == gridRank && block->isActive()) + { + SPtr<LBMKernel> kernel = dynamicPointerCast<LBMKernel>(block->getKernel()); + if (!kernel) + throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: "+block->toString()); + + SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + SPtr<EsoTwist3D> distributionsF = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getFdistributions()); + SPtr<EsoTwist3D> distributionsH = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getHdistributions()); + SPtr<EsoTwist3D> distributionsH2 = dynamicPointerCast<EsoTwist3D>(kernel->getDataSet()->getH2distributions()); + SPtr<PhaseFieldArray3D> pressure = dynamicPointerCast<PhaseFieldArray3D>(kernel->getDataSet()->getPressureField()); + + + //LBMReal phiL = kernel->getPhiL(); + //LBMReal phiH = kernel->getPhiH(); + + LBMReal f[D3Q27System::ENDF+1]; + + for(int ix3=0; ix3<(int)bcArray->getNX3(); ix3++) + for (int ix2 = 0; ix2 < (int)bcArray->getNX2(); ix2++) + for (int ix1 = 0; ix1 < (int)bcArray->getNX1(); ix1++) + { + Vector3D coords = grid->getNodeCoordinates(block, ix1, ix2, ix3); + x1 = coords[0]; + x2 = coords[1]; + x3 = coords[2]; + + LBMReal vx1 = 0, vx2 = 0, vx3 = 0, p1 = 0, phi = 0,pres=0; + //p1 = 0.0; + p1 = muRho.Eval(); + vx1 = muVx1.Eval(); + vx2 = muVx2.Eval(); + vx3 = muVx3.Eval(); + phi = muPhi.Eval(); + pres = muPressure.Eval(); + (*pressure)(ix1, ix2, ix3) = pres; + + + //rho = phi*1.0 + (1.0-phi)/densityRatio; + //LBMReal rhoH = 1.0; + //LBMReal rhoL = 1.0/densityRatio; + //LBMReal rho = rhoH + (rhoH - rhoL)*(phi - phiH)/(phiH - phiL); + + + LBMReal feq[27]; + LBMReal geq[27]; + + //calcFeqsFct(feq,rho,vx1,vx2,vx3); + LBMReal vx1Sq = vx1*vx1; + LBMReal vx2Sq = vx2*vx2; + LBMReal vx3Sq = vx3*vx3; + for (int dir = STARTF; dir < (ENDF+1); dir++) + { + LBMReal velProd = DX1[dir]*vx1 + DX2[dir]*vx2 + DX3[dir]*vx3; + LBMReal velSq1 = velProd*velProd; + LBMReal gamma = WEIGTH[dir]*(3*velProd + 4.5*velSq1 - 1.5*(vx1Sq+vx2Sq+vx3Sq)); + + //feq[dir] = rho*WEIGTH[dir]*(1 + 3*velProd + 4.5*velSq1 - 1.5*(vx1Sq+vx2Sq+vx3Sq)); + feq[dir] = WEIGTH[dir] * (1 + 3 * velProd + 4.5 * velSq1 - 1.5 * (vx1Sq + vx2Sq + vx3Sq)); + //geq[dir] = p1*WEIGTH1[dir] + gamma; + //geq[dir] = p1*WEIGTH[dir]/(rho*UbMath::c1o3) + gamma*rho; + geq[dir] = p1 * WEIGTH[dir] / ( UbMath::c1o3) + gamma ; + } + + + f[DIR_P00] = geq[DIR_P00] ; + f[DIR_00M] = geq[DIR_00M] ; + f[DIR_0P0] = geq[DIR_0P0] ; + f[DIR_0M0] = geq[DIR_0M0] ; + f[DIR_00P] = geq[DIR_00P] ; + f[DIR_00M] = geq[DIR_00M] ; + f[DIR_PP0] = geq[DIR_PP0] ; + f[DIR_MM0] = geq[DIR_MM0] ; + f[DIR_PM0] = geq[DIR_PM0] ; + f[DIR_MP0] = geq[DIR_MP0] ; + f[DIR_P0P] = geq[DIR_P0P] ; + f[DIR_M0M] = geq[DIR_M0M] ; + f[DIR_P0M] = geq[DIR_P0M] ; + f[DIR_M0P] = geq[DIR_M0P] ; + f[DIR_0PP] = geq[DIR_0PP] ; + f[DIR_0MM] = geq[DIR_0MM] ; + f[DIR_0PM] = geq[DIR_0PM] ; + f[DIR_0MP] = geq[DIR_0MP] ; + f[DIR_PPP] = geq[DIR_PPP] ; + f[DIR_MPP] = geq[DIR_MPP] ; + f[DIR_PMP] = geq[DIR_PMP] ; + f[DIR_MMP] = geq[DIR_MMP] ; + f[DIR_PPM] = geq[DIR_PPM] ; + f[DIR_MPM] = geq[DIR_MPM] ; + f[DIR_PMM] = geq[DIR_PMM] ; + f[DIR_MMM] = geq[DIR_MMM] ; + f[DIR_000] = geq[DIR_000] ; + + distributionsF->setDistribution(f, ix1, ix2, ix3); + distributionsF->setDistributionInv(f, ix1, ix2, ix3); + + f[DIR_000] = phi * feq[DIR_000]; // / rho; + f[DIR_P00] = phi * feq[DIR_P00] ;// / rho; + f[DIR_M00] = phi * feq[DIR_M00] ;// / rho; + f[DIR_0P0] = phi * feq[DIR_0P0] ;// / rho; + f[DIR_0M0] = phi * feq[DIR_0M0] ;// / rho; + f[DIR_00P] = phi * feq[DIR_00P] ;// / rho; + f[DIR_00M] = phi * feq[DIR_00M] ;// / rho; + f[DIR_PP0] = phi * feq[DIR_PP0] ;// / rho; + f[DIR_MM0] = phi * feq[DIR_MM0] ;// / rho; + f[DIR_PM0] = phi * feq[DIR_PM0] ;// / rho; + f[DIR_MP0] = phi * feq[DIR_MP0] ;// / rho; + f[DIR_P0P] = phi * feq[DIR_P0P] ;// / rho; + f[DIR_M0M] = phi * feq[DIR_M0M] ;// / rho; + f[DIR_P0M] = phi * feq[DIR_P0M] ;// / rho; + f[DIR_M0P] = phi * feq[DIR_M0P] ;// / rho; + f[DIR_0PP] = phi * feq[DIR_0PP] ;// / rho; + f[DIR_0MM] = phi * feq[DIR_0MM] ;// / rho; + f[DIR_0PM] = phi * feq[DIR_0PM] ;// / rho; + f[DIR_0MP] = phi * feq[DIR_0MP] ;// / rho; + f[DIR_PPP] = phi * feq[DIR_PPP] ;// / rho; + f[DIR_MPP] = phi * feq[DIR_MPP] ;// / rho; + f[DIR_PMP] = phi * feq[DIR_PMP] ;// / rho; + f[DIR_MMP] = phi * feq[DIR_MMP] ;// / rho; + f[DIR_PPM] = phi * feq[DIR_PPM] ;// / rho; + f[DIR_MPM] = phi * feq[DIR_MPM] ;// / rho; + f[DIR_PMM] = phi * feq[DIR_PMM] ;// / rho; + f[DIR_MMM] = phi * feq[DIR_MMM] ;// / rho; + + + distributionsH->setDistribution(f, ix1, ix2, ix3); + distributionsH->setDistributionInv(f, ix1, ix2, ix3); + + if (distributionsH2) { + + f[DIR_000] = 0;//(1. - phi) * feq[DIR_000]; // / rho; + f[DIR_P00] = 0;//(1.-phi) * feq[DIR_P00] ;// / rho; + f[DIR_M00] = 0;//(1.-phi) * feq[DIR_M00] ;// / rho; + f[DIR_0P0] = 0;//(1.-phi) * feq[DIR_0P0] ;// / rho; + f[DIR_0M0] = 0;//(1.-phi) * feq[DIR_0M0] ;// / rho; + f[DIR_00P] = 0;//(1.-phi) * feq[DIR_00P] ;// / rho; + f[DIR_00M] = 0;//(1.-phi) * feq[DIR_00M] ;// / rho; + f[DIR_PP0] = 0;//(1.-phi) * feq[DIR_PP0] ;// / rho; + f[DIR_MM0] = 0;//(1.-phi) * feq[DIR_MM0] ;// / rho; + f[DIR_PM0] = 0;//(1.-phi) * feq[DIR_PM0] ;// / rho; + f[DIR_MP0] = 0;//(1.-phi) * feq[DIR_MP0] ;// / rho; + f[DIR_P0P] = 0;//(1.-phi) * feq[DIR_P0P] ;// / rho; + f[DIR_M0M] = 0;//(1.-phi) * feq[DIR_M0M] ;// / rho; + f[DIR_P0M] = 0;//(1.-phi) * feq[DIR_P0M] ;// / rho; + f[DIR_M0P] = 0;//(1.-phi) * feq[DIR_M0P] ;// / rho; + f[DIR_0PP] = 0;//(1.-phi) * feq[DIR_0PP] ;// / rho; + f[DIR_0MM] = 0;//(1.-phi) * feq[DIR_0MM] ;// / rho; + f[DIR_0PM] = 0;//(1.-phi) * feq[DIR_0PM] ;// / rho; + f[DIR_0MP] = 0;//(1.-phi) * feq[DIR_0MP] ;// / rho; + f[DIR_PPP] = 0;//(1.-phi) * feq[DIR_PPP] ;// / rho; + f[DIR_MPP] = 0;//(1.-phi) * feq[DIR_MPP] ;// / rho; + f[DIR_PMP] = 0;//(1.-phi) * feq[DIR_PMP] ;// / rho; + f[DIR_MMP] = 0;//(1.-phi) * feq[DIR_MMP] ;// / rho; + f[DIR_PPM] = 0;//(1.-phi) * feq[DIR_PPM] ;// / rho; + f[DIR_MPM] = 0;//(1.-phi) * feq[DIR_MPM] ;// / rho; + f[DIR_PMM] = 0;//(1.-phi) * feq[DIR_PMM] ;// / rho; + f[DIR_MMM] = 0;//(1.-phi) * feq[DIR_MMM] ;// / rho; + + + distributionsH2->setDistribution(f, ix1, ix2, ix3); + distributionsH2->setDistributionInv(f, ix1, ix2, ix3); + } + } + } + + //variablen der functions loeschen, da die verwiesenen Objecte nach dem verlassen des scopes ungueltig sind! + this->muVx1.ClearVar(); + this->muVx2.ClearVar(); + this->muVx3.ClearVar(); + this->muRho.ClearVar(); + +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::checkFunction(mu::Parser fct) +{ + double x1=1.0,x2=1.0,x3=1.0; + fct.DefineVar("x1",&x1); + fct.DefineVar("x2",&x2); + fct.DefineVar("x3",&x3); + + try + { + fct.Eval(); + fct.ClearVar(); + } + catch(mu::ParserError& e) + { + throw UbException(UB_EXARGS,"function: "+e.GetExpr() + (std::string)"error: "+e.GetMsg() + +(std::string)", only x1,x2,x3 are allowed as variables" ); + } +} +////////////////////////////////////////////////////////////////////////// +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setNu( LBMReal nu ) +{ + this->nu = nu; +} + +void MultiphaseVelocityFormInitDistributionsBlockVisitor::setPressure(LBMReal pres) +{ + this->muPressure.SetExpr(UbSystem::toString(pres, D3Q27RealLim::digits10)); + this->checkFunction(muPressure); + +} + diff --git a/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h new file mode 100644 index 0000000000000000000000000000000000000000..553cfe75b6b881c96a0542f184bf50c88146babc --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Visitors/MultiphaseVelocityFormInitDistributionsBlockVisitor.h @@ -0,0 +1,102 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 MultiphaseVelocityFormInitDistributionsBlockVisitor.h +//! \ingroup Visitors +//! \author Hesameddin Safari, Martin Geier, Konstantin Kutscher +//======================================================================================= + +#ifndef MultiphaseVelocityFormInitDistributionsBlockVisitor_H +#define MultiphaseVelocityFormInitDistributionsBlockVisitor_H + +#include "Block3DVisitor.h" +#include "D3Q27System.h" +#include "Block3D.h" + +#include <muParser.h> + + + +class MultiphaseVelocityFormInitDistributionsBlockVisitor : public Block3DVisitor +{ +public: + typedef std::numeric_limits<LBMReal> D3Q27RealLim; + +public: + MultiphaseVelocityFormInitDistributionsBlockVisitor(); + //D3Q27ETInitDistributionsBlockVisitor(LBMReal rho, LBMReal vx1=0.0, LBMReal vx2=0.0, LBMReal vx3=0.0); + //! Constructor + //! \param nu - viscosity + //! \param rho - density + //! \param vx1 - velocity in x + //! \param vx2 - velocity in y + //! \param vx3 - velocity in z + ////////////////////////////////////////////////////////////////////////// + //automatic vars are: x1,x2, x3 + //ussage example: setVx1("x1*0.01+x2*0.003") + ////////////////////////////////////////////////////////////////////////// + void setVx1( const mu::Parser& parser); + void setVx2( const mu::Parser& parser); + void setVx3( const mu::Parser& parser); + void setRho( const mu::Parser& parser); + void setPhi( const mu::Parser& parser); + void setPressure(const mu::Parser& parser); + + void setVx1( const std::string& muParserString); + void setVx2( const std::string& muParserString); + void setVx3( const std::string& muParserString); + void setRho( const std::string& muParserString); + void setPhi( const std::string& muParserString); + void setPressure(const std::string& muParserString); + + ////////////////////////////////////////////////////////////////////////// + void setVx1( LBMReal vx1 ); + void setVx2( LBMReal vx2 ); + void setVx3( LBMReal vx3 ); + void setRho( LBMReal rho ); + void setPhi( LBMReal rho ); + void setNu( LBMReal nu ); + void setPressure(LBMReal pres); + + void visit(SPtr<Grid3D> grid, SPtr<Block3D> block); + +protected: + void checkFunction(mu::Parser fct); + +private: + mu::Parser muVx1; + mu::Parser muVx2; + mu::Parser muVx3; + mu::Parser muRho; + mu::Parser muPhi; + mu::Parser muPressure; + + LBMReal nu; +}; + +#endif //D3Q27INITDISTRIBUTIONSPATCHVISITOR_H diff --git a/src/cpu/VirtualFluidsCore/Visitors/OverlapBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/OverlapBlockVisitor.cpp index 338c6de90499db39836910c47a7b60f00ee7c675..54bbeda59663bf16173abcdb302f123a97b776ac 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/OverlapBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/OverlapBlockVisitor.cpp @@ -1,10 +1,10 @@ #include "OverlapBlockVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" OverlapBlockVisitor::OverlapBlockVisitor(int levelDepth /*shut be maxGridLevel*/, bool includeNotActiveBlocks) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks) { } ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/Visitors/RatioBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RatioBlockVisitor.cpp index bf25b8876f540c6ff5f678b32ad67ddd736c145d..137c737e6dd85853da328b0d0cc9ccf1bca1f878 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/RatioBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/RatioBlockVisitor.cpp @@ -1,10 +1,10 @@ #include "RatioBlockVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" RatioBlockVisitor::RatioBlockVisitor(int levelDepth, bool includeNotActiveBlocks) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), maxLevelRatio(1), expandBlocks(true), levelDepth(levelDepth), + : Block3DVisitor(0, D3Q27System::MAXLEVEL), maxLevelRatio(1), expandBlocks(true), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks) { } diff --git a/src/cpu/VirtualFluidsCore/Visitors/RatioSmoothBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RatioSmoothBlockVisitor.cpp index 3bcdd29299a8183a2cda60253101df89b681a51a..b48aee7cd8dcd3d3cc33c949e8a71281214c8f19 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/RatioSmoothBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/RatioSmoothBlockVisitor.cpp @@ -1,10 +1,10 @@ #include "RatioSmoothBlockVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" RatioSmoothBlockVisitor::RatioSmoothBlockVisitor(int levelDepth, bool includeNotActiveBlocks) - : Block3DVisitor(Grid3DSystem::MAXLEVEL, 0), maxLevelRatio(1), expandBlocks(true), levelDepth(levelDepth), + : Block3DVisitor(D3Q27System::MAXLEVEL, 0), maxLevelRatio(1), expandBlocks(true), levelDepth(levelDepth), includeNotActiveBlocks(includeNotActiveBlocks) { } diff --git a/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp b/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp index c151ac90492bc7545f7d498fdfd2b3f9efbc9ab6..b0b0cf7743fd195796ef2fb3276a9a3921adf465 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/RefineAroundGbObjectHelper.cpp @@ -38,7 +38,7 @@ void RefineAroundGbObjectHelper::refine() grid->accept(overlapVisitor); std::vector<int> dirs; - for (int i = D3Q27System::E; i <= D3Q27System::TS; i++) { + for (int i = D3Q27System::DIR_P00; i <= D3Q27System::DIR_0MP; i++) { dirs.push_back(i); } SetInterpolationDirsBlockVisitor interDirsVisitor(dirs); diff --git a/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp b/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp index 656457c0580739bd00783b3050fb2c460eaa5a14..3bb1546896ee40ecdb9acf69586251ad1f03bb62 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/RefineCrossAndInsideGbObjectHelper.cpp @@ -55,7 +55,7 @@ void RefineCrossAndInsideGbObjectHelper::refine() std::vector<int> dirs; - for (int i = D3Q27System::E; i < D3Q27System::ENDDIR; i++) { + for (int i = D3Q27System::STARTDIR; i <= D3Q27System::ENDDIR; i++) { dirs.push_back(i); } SetInterpolationDirsBlockVisitor interDirsVisitor(dirs); diff --git a/src/cpu/VirtualFluidsCore/Visitors/RenumberBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RenumberBlockVisitor.cpp index 538fd95118b0c07069ba854c2fbb8264713907d3..b2a4d9337ad49edc4e508555929a6ca64e6f9243 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/RenumberBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/RenumberBlockVisitor.cpp @@ -1,12 +1,12 @@ #include "RenumberBlockVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMSystem.h" int RenumberBlockVisitor::counter = 0; -RenumberBlockVisitor::RenumberBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) {} +RenumberBlockVisitor::RenumberBlockVisitor() : Block3DVisitor(0, D3Q27System::MAXLEVEL) {} ////////////////////////////////////////////////////////////////////////// void RenumberBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block) { diff --git a/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp index fc9c5c203c5d631ae7e125f75d72d70e8502890d..ed9a3ee59c87ab755416eecd5468a4cc763837e4 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/RenumberGridVisitor.cpp @@ -1,7 +1,7 @@ #include "RenumberGridVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" //#include <mpi.h> RenumberGridVisitor::RenumberGridVisitor(std::shared_ptr<vf::mpi::Communicator> com) : comm(com) {} diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetBcBlocksBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetBcBlocksBlockVisitor.cpp index bbccaa785583fdc810865337af46fca8a9872a65..de3924453dadb396a5eef4a8fb23e85f850d760f 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetBcBlocksBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetBcBlocksBlockVisitor.cpp @@ -35,11 +35,11 @@ #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "Interactor3D.h" SetBcBlocksBlockVisitor::SetBcBlocksBlockVisitor(SPtr<Interactor3D> interactor) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), interactor(interactor) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), interactor(interactor) { } diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h index bd28c23f9ec7bf43acbd37a532ce07652ae6ee93..7930219451088aaef222d06c1a5a72d159817798 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h +++ b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h @@ -38,7 +38,7 @@ #include "Block3DVisitor.h" #include "D3Q27System.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "Grid3D.h" #include "CreateTransmittersHelper.h" #include <mpi/Communicator.h> @@ -46,8 +46,12 @@ #include "OneDistributionFullVectorConnector.h" #include "TwoDistributionsFullDirectConnector.h" #include "TwoDistributionsFullVectorConnector.h" +#include "TwoDistributionsDoubleGhostLayerFullDirectConnector.h" +#include "TwoDistributionsDoubleGhostLayerFullVectorConnector.h" #include "ThreeDistributionsFullDirectConnector.h" #include "ThreeDistributionsFullVectorConnector.h" +#include "ThreeDistributionsDoubleGhostLayerFullDirectConnector.h" +#include "ThreeDistributionsDoubleGhostLayerFullVectorConnector.h" #include <basics/transmitter/TbTransmitterLocal.h> //! \brief A class sets connectors between blocks. @@ -66,13 +70,12 @@ protected: void setSameLevelConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block); void setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir); std::shared_ptr<vf::mpi::Communicator> comm; - int dirs; - int gridRank; + int gridRank{0}; }; template <class T1, class T2> SetConnectorsBlockVisitor<T1, T2>::SetConnectorsBlockVisitor(std::shared_ptr<vf::mpi::Communicator> comm) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), comm(comm) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), comm(comm) { } ////////////////////////////////////////////////////////////////////////// @@ -111,7 +114,7 @@ void SetConnectorsBlockVisitor<T1, T2>::setSameLevelConnectors(SPtr<Grid3D> grid int ix3 = block->getX3(); int level = block->getLevel(); - for (int dir = 0; dir < D3Q27System::ENDDIR; dir++) { + for (int dir = D3Q27System::STARTDIR; dir <= D3Q27System::ENDDIR; dir++) { SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level); if (neighBlock) { @@ -123,7 +126,7 @@ void SetConnectorsBlockVisitor<T1, T2>::setSameLevelConnectors(SPtr<Grid3D> grid } else if (blockRank != neighBlockRank && neighBlock->isActive()) { setRemoteConnectors(block, neighBlock, dir); - if (dir >= 0 && dir <= 5) { + if (dir >= D3Q27System::DIR_P00 && dir <= D3Q27System::DIR_00M) { int weight = block->getWeight(neighBlockRank); weight++; block->setWeight(neighBlockRank, weight); @@ -157,6 +160,8 @@ void SetConnectorsBlockVisitor<T1, T2>::setRemoteConnectors(SPtr<Block3D> sblock using OneDistributionSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<OneDistributionFullDirectConnector, OneDistributionFullVectorConnector>; using TwoDistributionsSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<TwoDistributionsFullDirectConnector, TwoDistributionsFullVectorConnector>; +using TwoDistributionsDoubleGhostLayerSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<TwoDistributionsDoubleGhostLayerFullDirectConnector, TwoDistributionsDoubleGhostLayerFullVectorConnector>; using ThreeDistributionsSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<ThreeDistributionsFullDirectConnector, ThreeDistributionsFullVectorConnector>; +using ThreeDistributionsDoubleGhostLayerSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<ThreeDistributionsDoubleGhostLayerFullDirectConnector, ThreeDistributionsDoubleGhostLayerFullVectorConnector>; #endif // SETCONNECTORSBLOCKVISITOR_H diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetForcingBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetForcingBlockVisitor.cpp index 679b63de44dd451f030aaf866bc259579efab8ef..abf828a06e0ec83b492ff9107be4a9a3c4445674 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetForcingBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetForcingBlockVisitor.cpp @@ -1,18 +1,18 @@ #include "SetForcingBlockVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMSystem.h" SetForcingBlockVisitor::SetForcingBlockVisitor(LBMReal forcingX1, LBMReal forcingX2, LBMReal forcingX3) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), forcingX1(forcingX1), forcingX2(forcingX2), forcingX3(forcingX3) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), forcingX1(forcingX1), forcingX2(forcingX2), forcingX3(forcingX3) { ftype = 0; } ////////////////////////////////////////////////////////////////////////// SetForcingBlockVisitor::SetForcingBlockVisitor(const mu::Parser &muForcingX1, const mu::Parser &muForcingX2, const mu::Parser &muForcingX3) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), muForcingX1(muForcingX1), muForcingX2(muForcingX2), + : Block3DVisitor(0, D3Q27System::MAXLEVEL), muForcingX1(muForcingX1), muForcingX2(muForcingX2), muForcingX3(muForcingX3) { @@ -21,7 +21,7 @@ SetForcingBlockVisitor::SetForcingBlockVisitor(const mu::Parser &muForcingX1, co ////////////////////////////////////////////////////////////////////////// SetForcingBlockVisitor::SetForcingBlockVisitor(const std::string &sForcingX1, const std::string &sForcingX2, const std::string &sForcingX3) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), sForcingX1(sForcingX1), sForcingX2(sForcingX2), sForcingX3(sForcingX3) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), sForcingX1(sForcingX1), sForcingX2(sForcingX2), sForcingX3(sForcingX3) { ftype = 2; diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp index 6a55ee5af55df96b4c1335976728ca7e08ee8ece..54f46c811d4c2d065bbda7232bd4e32f24559c22 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationConnectorsBlockVisitor.cpp @@ -36,14 +36,14 @@ #include "FineToCoarseVectorConnector.h" #include "TwoDistributionsFullDirectConnector.h" #include "TwoDistributionsFullVectorConnector.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include <basics/transmitter/TbTransmitterLocal.h> #include <mpi/Communicator.h> #include "InterpolationProcessor.h" SetInterpolationConnectorsBlockVisitor::SetInterpolationConnectorsBlockVisitor(std::shared_ptr<vf::mpi::Communicator> comm, LBMReal nue, SPtr<InterpolationProcessor> iProcessor) : -Block3DVisitor(0, Grid3DSystem::MAXLEVEL), +Block3DVisitor(0, D3Q27System::MAXLEVEL), comm(comm), nue(nue), iProcessor(iProcessor) @@ -82,110 +82,110 @@ void SetInterpolationConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Gri int fbx3 = block->getX3() << 1; int level = block->getLevel() + 1; - if( block->hasInterpolationFlagCF(D3Q27System::E)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_P00)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); SPtr<Block3D> fblockNW = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::E); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_P00); } - if( block->hasInterpolationFlagCF(D3Q27System::W)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_M00)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3,level); SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2,fbx3+1,level); SPtr<Block3D> fblockNE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::W); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_M00); } - if( block->hasInterpolationFlagCF(D3Q27System::N)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_0P0)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+1,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::N); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0P0); } - if( block->hasInterpolationFlagCF(D3Q27System::S)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_0M0)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level); SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2,fbx3+1,level); SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::S); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0M0); } - if( block->hasInterpolationFlagCF(D3Q27System::T)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_00P)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3+1,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::T); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_00P); } - if( block->hasInterpolationFlagCF(D3Q27System::B)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_00M)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level); SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3,level); SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::B); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_00M); } //////NE-NW-SE-SW - if( block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_P00)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+1,fbx3+0,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NE); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PP0); } - if( block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_MM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2,fbx3+1,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SW); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MM0); } - if( block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_PM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2,fbx3+0,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SE); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PM0); } - if( block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_MP0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_M00)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+1,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NW); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MP0); } /////////TE-BW-BE-TW 1-0 - if( block->hasInterpolationFlagCF(D3Q27System::TE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::T)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+0,fbx3+1,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+0, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TE); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_P0P); } - if( block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::B)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_M0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+0,fbx3,level); @@ -193,140 +193,140 @@ void SetInterpolationConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Gri SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+0, fbx3, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BW); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_M0M); } - if( block->hasInterpolationFlagCF(D3Q27System::BE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::B)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_P0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+0,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+0, fbx3, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BE); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_P0M); } - if( block->hasInterpolationFlagCF(D3Q27System::TW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::T)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_M0P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+0,fbx3+1,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+0, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TW); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_M0P); } //////TN-BS-BN-TS - if( block->hasInterpolationFlagCF(D3Q27System::TN)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::T)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2+1,fbx3+1,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TN); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0PP); } - if( block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::S) && !block->hasInterpolationFlagCF(D3Q27System::B)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_0MM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2, fbx3, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BS); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0MM); } - if( block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::B)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_0PM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2+1,fbx3,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2+1, fbx3, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BN); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0PM); } - if( block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::S) && !block->hasInterpolationFlagCF(D3Q27System::T)) + if( block->hasInterpolationFlagCF(D3Q27System::DIR_0MP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2,fbx3+1,level); SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TS); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_0MP); } //////corners - if (block->hasInterpolationFlagCF(D3Q27System::TNE)&&!block->hasInterpolationFlagCF(D3Q27System::TE)&&!block->hasInterpolationFlagCF(D3Q27System::TN)&&!block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::T)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E)) + if (block->hasInterpolationFlagCF(D3Q27System::DIR_PPP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_00P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_P00)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNE); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PPP); } - if (block->hasInterpolationFlagCF(D3Q27System::TSW)&&!block->hasInterpolationFlagCF(D3Q27System::TW)&&!block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S)) + if (block->hasInterpolationFlagCF(D3Q27System::DIR_MMP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_M0P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0MP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_MM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3+1, level); SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2, fbx3, level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSW); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MMP); } - if (block->hasInterpolationFlagCF(D3Q27System::TSE)&&!block->hasInterpolationFlagCF(D3Q27System::TE)&&!block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S)) + if (block->hasInterpolationFlagCF(D3Q27System::DIR_PMP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_P0P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0MP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_PM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2, fbx3+0, level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSE); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PMP); } - if (block->hasInterpolationFlagCF(D3Q27System::TNW)&&!block->hasInterpolationFlagCF(D3Q27System::TW)&&!block->hasInterpolationFlagCF(D3Q27System::TN)&& !block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W)) + if (block->hasInterpolationFlagCF(D3Q27System::DIR_MPP)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_M0P)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0PP)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_MP0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00P)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_M00)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNW); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MPP); } - if (block->hasInterpolationFlagCF(D3Q27System::BNE)&&!block->hasInterpolationFlagCF(D3Q27System::BE)&&!block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::B)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E)) + if (block->hasInterpolationFlagCF(D3Q27System::DIR_PPM)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_P0M)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0PM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_PP0)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_00M)&&!block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_P00)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level); SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNE); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PPM); } - if (block->hasInterpolationFlagCF(D3Q27System::BSW)&& !block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S)) + if (block->hasInterpolationFlagCF(D3Q27System::DIR_MMM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0MM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_MM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3+0, level); SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2, fbx3, level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSW); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MMM); } - if (block->hasInterpolationFlagCF(D3Q27System::BSE)&& !block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::BE)&& !block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S)) + if (block->hasInterpolationFlagCF(D3Q27System::DIR_PMM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0MM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_PM0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_P00) && !block->hasInterpolationFlagCF(D3Q27System::DIR_0M0)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2, fbx3, level); SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2, fbx3+0, level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSE); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_PMM); } - if (block->hasInterpolationFlagCF(D3Q27System::BNW)&& !block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W)) + if (block->hasInterpolationFlagCF(D3Q27System::DIR_MPM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0PM)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_M0M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_MP0)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_00M)&& !block->hasInterpolationFlagCF(D3Q27System::DIR_0P0) && !block->hasInterpolationFlagCF(D3Q27System::DIR_M00)) { SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2+1, fbx3+0, level); SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level); SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNW); + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::DIR_MPM); } } diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationDirsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationDirsBlockVisitor.cpp index bb1ae79620179f65abd51672bd9958f471c398c7..689d84d0754f74c2f680fd2b7aa22ec0c54008c1 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationDirsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetInterpolationDirsBlockVisitor.cpp @@ -1,11 +1,11 @@ #include "SetInterpolationDirsBlockVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include <D3Q27System.h> SetInterpolationDirsBlockVisitor::SetInterpolationDirsBlockVisitor(std::vector<int> &dirs) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), dirs(dirs) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), dirs(dirs) { } ////////////////////////////////////////////////////////////////////////// @@ -32,103 +32,103 @@ void SetInterpolationDirsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bl if (p_nblock) { bool flagDir; switch (dir) { - case NE: - checkFlagDir(grid, E, N, flagDir, ix1, ix2, ix3, level); + case DIR_PP0: + checkFlagDir(grid, DIR_P00, DIR_0P0, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case SW: - checkFlagDir(grid, W, S, flagDir, ix1, ix2, ix3, level); + case DIR_MM0: + checkFlagDir(grid, DIR_M00, DIR_0M0, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case SE: - checkFlagDir(grid, E, S, flagDir, ix1, ix2, ix3, level); + case DIR_PM0: + checkFlagDir(grid, DIR_P00, DIR_0M0, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case NW: - checkFlagDir(grid, W, N, flagDir, ix1, ix2, ix3, level); + case DIR_MP0: + checkFlagDir(grid, DIR_M00, DIR_0P0, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case TE: - checkFlagDir(grid, E, T, flagDir, ix1, ix2, ix3, level); + case DIR_P0P: + checkFlagDir(grid, DIR_P00, DIR_00P, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case BW: - checkFlagDir(grid, W, B, flagDir, ix1, ix2, ix3, level); + case DIR_M0M: + checkFlagDir(grid, DIR_M00, DIR_00M, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case BE: - checkFlagDir(grid, E, B, flagDir, ix1, ix2, ix3, level); + case DIR_P0M: + checkFlagDir(grid, DIR_P00, DIR_00M, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case TW: - checkFlagDir(grid, W, T, flagDir, ix1, ix2, ix3, level); + case DIR_M0P: + checkFlagDir(grid, DIR_M00, DIR_00P, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case TN: - checkFlagDir(grid, N, T, flagDir, ix1, ix2, ix3, level); + case DIR_0PP: + checkFlagDir(grid, DIR_0P0, DIR_00P, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case BS: - checkFlagDir(grid, S, B, flagDir, ix1, ix2, ix3, level); + case DIR_0MM: + checkFlagDir(grid, DIR_0M0, DIR_00M, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case BN: - checkFlagDir(grid, N, B, flagDir, ix1, ix2, ix3, level); + case DIR_0PM: + checkFlagDir(grid, DIR_0P0, DIR_00M, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case TS: - checkFlagDir(grid, S, T, flagDir, ix1, ix2, ix3, level); + case DIR_0MP: + checkFlagDir(grid, DIR_0M0, DIR_00P, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case TNE: - checkFlagDir(grid, E, N, T, flagDir, ix1, ix2, ix3, level); + case DIR_PPP: + checkFlagDir(grid, DIR_P00, DIR_0P0, DIR_00P, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case TSW: - checkFlagDir(grid, W, S, T, flagDir, ix1, ix2, ix3, level); + case DIR_MMP: + checkFlagDir(grid, DIR_M00, DIR_0M0, DIR_00P, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case TSE: - checkFlagDir(grid, E, S, T, flagDir, ix1, ix2, ix3, level); + case DIR_PMP: + checkFlagDir(grid, DIR_P00, DIR_0M0, DIR_00P, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case TNW: - checkFlagDir(grid, W, N, T, flagDir, ix1, ix2, ix3, level); + case DIR_MPP: + checkFlagDir(grid, DIR_M00, DIR_0P0, DIR_00P, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case BNE: - checkFlagDir(grid, E, N, B, flagDir, ix1, ix2, ix3, level); + case DIR_PPM: + checkFlagDir(grid, DIR_P00, DIR_0P0, DIR_00M, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case BSW: - checkFlagDir(grid, W, S, B, flagDir, ix1, ix2, ix3, level); + case DIR_MMM: + checkFlagDir(grid, DIR_M00, DIR_0M0, DIR_00M, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case BSE: - checkFlagDir(grid, E, S, B, flagDir, ix1, ix2, ix3, level); + case DIR_PMM: + checkFlagDir(grid, DIR_P00, DIR_0M0, DIR_00M, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; - case BNW: - checkFlagDir(grid, W, N, B, flagDir, ix1, ix2, ix3, level); + case DIR_MPM: + checkFlagDir(grid, DIR_M00, DIR_0P0, DIR_00M, flagDir, ix1, ix2, ix3, level); if (!flagDir) continue; break; diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp index 5c813d28951b24269735b0dbf1f84fdfb360cf31..354a577e701f9d017181e6006833ad40749eef60 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.cpp @@ -38,7 +38,7 @@ #include "Block3D.h" #include "DataSet3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMKernel.h" #include "LBMSystem.h" #include <utility> @@ -46,16 +46,16 @@ ////////////////////////////////////////////////////////////////////////// SetKernelBlockVisitor::SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, double availMem, double needMem, SetKernelBlockVisitor::Action action) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(std::move(kernel)), nue(nue), action(action), dataSetFlag(true) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(std::move(kernel)), nue(nue), action(action), dataSetFlag(true) { if (needMem > availMem) { throw UbException(UB_EXARGS, "SetKernelBlockVisitor: Not enough memory!!!"); } } -SetKernelBlockVisitor::SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, int &numberOfProcesses, +SetKernelBlockVisitor::SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, int numberOfProcesses, SetKernelBlockVisitor::Action action) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), kernel(std::move(kernel)), nue(nue), action(action), dataSetFlag(true), + : Block3DVisitor(0, D3Q27System::MAXLEVEL), kernel(std::move(kernel)), nue(nue), action(action), dataSetFlag(true), numberOfProcesses(numberOfProcesses) { } @@ -127,7 +127,7 @@ double SetKernelBlockVisitor::getRequiredPhysicalMemory(const SPtr<Grid3D> &grid unsigned long long numberOfNodesPerBlockWithGhostLayer; auto numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks(); auto blockNx = grid->getBlockNX(); - int ghostLayer = 3; + int ghostLayer = grid->getGhostLayerWidth() * 2 + 1; numberOfNodesPerBlockWithGhostLayer = numberOfBlocks * (val<1>(blockNx) + ghostLayer) * (val<2>(blockNx) + ghostLayer) * (val<3>(blockNx) + ghostLayer); diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h index 51cbc256cfeac03b2d51acf8ebe8fca12a3f33ed..1e0621f22379e52701aafa4ab06f858cb1247d7e 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h +++ b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h @@ -52,7 +52,7 @@ public: SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, double availMem, double needMem, SetKernelBlockVisitor::Action action = SetKernelBlockVisitor::NewKernel); - SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, int &numberOfProcesses, + SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, int numberOfProcesses, SetKernelBlockVisitor::Action action = SetKernelBlockVisitor::NewKernel); ~SetKernelBlockVisitor() override = default; diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetSolidBlocksBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetSolidBlocksBlockVisitor.cpp index 3354755f22f18df700523d795c8fced0d0f19628..e78300c5af6590da72bec3b28516143e4ec18a1d 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetSolidBlocksBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetSolidBlocksBlockVisitor.cpp @@ -37,11 +37,11 @@ #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "Interactor3D.h" SetSolidBlocksBlockVisitor::SetSolidBlocksBlockVisitor(SPtr<Interactor3D> interactor) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), interactor(std::move(interactor)) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), interactor(std::move(interactor)) { } diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetSpongeLayerBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetSpongeLayerBlockVisitor.cpp index 040f54b0fd645a206952ce2c992d4abeea3ace85..789b3e3dc932462155a897be1c2c998400adb7f3 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetSpongeLayerBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetSpongeLayerBlockVisitor.cpp @@ -1,5 +1,5 @@ #include "SetSpongeLayerBlockVisitor.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMSystem.h" #include "Block3D.h" @@ -7,7 +7,7 @@ #include "LBMKernel.h" SetSpongeLayerBlockVisitor::SetSpongeLayerBlockVisitor(const mu::Parser &spongeLayer) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), spongeLayer(spongeLayer) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), spongeLayer(spongeLayer) { } ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp index 15c8b82bae5c95f6783f73c7e7a70004f3c76574..3b9eb9493fe0fa66f05fdd3ea42505604836d218 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetUndefinedNodesBlockVisitor.cpp @@ -5,11 +5,11 @@ #include "BoundaryConditions.h" #include "D3Q27System.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "ILBMKernel.h" SetUndefinedNodesBlockVisitor::SetUndefinedNodesBlockVisitor(bool twoTypeOfConnectorsCheck) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), twoTypeOfConnectorsCheck(twoTypeOfConnectorsCheck) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), twoTypeOfConnectorsCheck(twoTypeOfConnectorsCheck) { } ////////////////////////////////////////////////////////////////////////// @@ -40,7 +40,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block // int offset = 2; int offset = 3; - if (block->hasInterpolationFlag(D3Q27System::E)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_P00)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -51,7 +51,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::W)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_M00)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -62,7 +62,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::N)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_0P0)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = maxX2; @@ -73,7 +73,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::S)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_0M0)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -84,7 +84,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::T)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_00P)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -95,7 +95,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::B)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_00M)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -106,7 +106,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block endix3 = endix3 + offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::NE)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_PP0)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -119,7 +119,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::SW)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_MM0)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -132,7 +132,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::SE)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_PM0)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -145,7 +145,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::NW)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_MP0)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -158,7 +158,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::TE)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_P0P)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -171,7 +171,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::BW)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_M0M)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -184,7 +184,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block endix3 = endix3 + offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::BE)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_P0M)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -197,7 +197,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block endix3 = endix3 + offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::TW)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_M0P)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -210,7 +210,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::TN)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_0PP)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = maxX2; @@ -223,7 +223,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::BS)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_0MM)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -236,7 +236,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block endix3 = endix3 + offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::BN)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_0PM)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = maxX2; @@ -249,7 +249,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block endix3 = endix3 + offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::TS)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_0MP)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -262,7 +262,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::TNE)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_PPP)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -277,7 +277,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::TNW)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_MPP)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -292,7 +292,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::TSE)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_PMP)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -307,7 +307,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::TSW)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_MMP)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -322,7 +322,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block startix3 = startix3 - offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::BNE)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_PPM)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -337,7 +337,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block endix3 = endix3 + offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::BNW)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_MPM)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -352,7 +352,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block endix3 = endix3 + offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::BSE)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_PMM)) { int startix1 = maxX1; int endix1 = maxX1; if (block->hasInterpolationFlagCF()) @@ -367,7 +367,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block endix3 = endix3 + offset; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlag(D3Q27System::BSW)) { + if (block->hasInterpolationFlag(D3Q27System::DIR_MMM)) { int startix1 = minX1; int endix1 = minX1; if (block->hasInterpolationFlagCF()) @@ -395,7 +395,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block maxX2 = static_cast<int>(bcMatrix->getNX2()) - 1 - ll; maxX3 = static_cast<int>(bcMatrix->getNX3()) - 1 - ll; - if (block->hasInterpolationFlagFC(D3Q27System::E)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_P00)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = minX2; @@ -404,7 +404,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::W)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_M00)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = minX2; @@ -413,7 +413,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::N)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_0P0)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = maxX2 - offset2; @@ -422,7 +422,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::S)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_0M0)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -431,7 +431,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::T)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_00P)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -440,7 +440,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::B)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_00M)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -449,7 +449,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = minX3 + offset2; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::NE)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_PP0)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = maxX2 - offset2; @@ -458,7 +458,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::SW)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_MM0)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = minX2; @@ -467,7 +467,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::SE)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_PM0)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = minX2; @@ -476,7 +476,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::NW)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_MP0)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = maxX2 - offset2; @@ -485,7 +485,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::TE)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_P0P)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = minX2; @@ -494,7 +494,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::BW)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_M0M)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = minX2; @@ -503,7 +503,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = minX3 + offset2; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::BE)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_P0M)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = minX2; @@ -512,7 +512,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = minX3 + offset2; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::TW)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_M0P)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = minX2; @@ -521,7 +521,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::TN)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_0PP)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = maxX2 - offset2; @@ -530,7 +530,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::BS)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_0MM)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -539,7 +539,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = minX3 + offset2; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::BN)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_0PM)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = maxX2 - offset2; @@ -548,7 +548,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = minX3 + offset2; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::TS)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_0MP)) { int startix1 = minX1; int endix1 = maxX1; int startix2 = minX2; @@ -557,7 +557,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::TNE)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_PPP)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = maxX2 - offset2; @@ -566,7 +566,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::TNW)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_MPP)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = maxX2 - offset2; @@ -575,7 +575,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::TSE)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_PMP)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = minX2; @@ -584,7 +584,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::TSW)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_MMP)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = minX2; @@ -593,7 +593,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = maxX3; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::BNE)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_PPM)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = maxX2 - offset2; @@ -602,7 +602,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = minX3 + offset2; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::BNW)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_MPM)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = maxX2 - offset2; @@ -611,7 +611,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = minX3 + offset2; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::BSE)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_PMM)) { int startix1 = maxX1 - offset2; int endix1 = maxX1; int startix2 = minX2; @@ -620,7 +620,7 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block int endix3 = minX3 + offset2; this->setNodesUndefined(startix1, endix1, startix2, endix2, startix3, endix3, bcMatrix); } - if (block->hasInterpolationFlagFC(D3Q27System::BSW)) { + if (block->hasInterpolationFlagFC(D3Q27System::DIR_MMM)) { int startix1 = minX1; int endix1 = minX1 + offset2; int startix2 = minX2; @@ -633,10 +633,10 @@ void SetUndefinedNodesBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block // invert scaleCF blocks if (block->hasInterpolationFlagCF()) { if (block->hasInterpolationFlagFC() && twoTypeOfConnectorsCheck) { - for (int i = D3Q27System::E; i <= D3Q27System::BSW; i++) { + for (int i = D3Q27System::DIR_P00; i <= D3Q27System::DIR_MMM; i++) { UBLOG(logINFO, "FC in dir=" << i << " " << block->hasInterpolationFlagFC(i)); } - for (int i = D3Q27System::E; i <= D3Q27System::BSW; i++) { + for (int i = D3Q27System::DIR_P00; i <= D3Q27System::DIR_MMM; i++) { UBLOG(logINFO, "CF in dir=" << i << " " << block->hasInterpolationFlagCF(i)); } throw UbException(UB_EXARGS, "block " + block->toString() + " has CF and FC"); diff --git a/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp index c9bbc78cdd575f115d86d3e470cefe50dd636ba6..1ef34e0e8bbf54625efbc946b141cf16f24c213d 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SpongeLayerBlockVisitor.cpp @@ -1,5 +1,5 @@ #include "SpongeLayerBlockVisitor.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "LBMSystem.h" #include "BCArray3D.h" @@ -15,7 +15,7 @@ using namespace std; SpongeLayerBlockVisitor::SpongeLayerBlockVisitor(SPtr<GbCuboid3D> boundingBox, SPtr<LBMKernel> kernel, double nue, int dir) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), boundingBox(boundingBox), kernel(kernel), nue(nue), dir(dir) + : Block3DVisitor(0, D3Q27System::MAXLEVEL), boundingBox(boundingBox), kernel(kernel), nue(nue), dir(dir) { } ////////////////////////////////////////////////////////////////////////// @@ -72,22 +72,22 @@ void SpongeLayerBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block) double newCollFactor; - if (dir == D3Q27System::E) { + if (dir == D3Q27System::DIR_P00) { int ibX1 = block->getX1(); int ibMax = val<1>(ixMax) - val<1>(ixMin) + 1; double index = (double)(ibX1 - val<1>(ixMin) + 1); newCollFactor = oldCollFactor - (oldCollFactor - 1.0) / (double)(ibMax)*index; - } else if (dir == D3Q27System::W) { + } else if (dir == D3Q27System::DIR_M00) { int ibX1 = block->getX1(); int ibMax = val<1>(ixMax) - val<1>(ixMin) + 1; double index = (double)(ibX1 - val<1>(ixMin) + 1); newCollFactor = (oldCollFactor - 1.0) / (double)(ibMax)*index; - } else if (dir == D3Q27System::T) { + } else if (dir == D3Q27System::DIR_00P) { int ibX3 = block->getX3(); int ibMax = val<3>(ixMax) - val<3>(ixMin) + 1; double index = (double)(ibX3 - val<3>(ixMin) + 1); newCollFactor = oldCollFactor - (oldCollFactor - 1.0) / (double)(ibMax)*index; - } else if (dir == D3Q27System::B) { + } else if (dir == D3Q27System::DIR_00M) { int ibX3 = block->getX3(); int ibMax = val<3>(ixMax) - val<3>(ixMin) + 1; double index = (double)(ibX3 - val<3>(ixMin) + 1); diff --git a/src/cpu/VirtualFluidsCore/Visitors/ViscosityBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/ViscosityBlockVisitor.cpp index 67d185d6ac401909d85b99b74ef1ede2d0054a6a..311a8bf19786198e85b00eb500f6e7c90d2d5106 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/ViscosityBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/ViscosityBlockVisitor.cpp @@ -1,11 +1,11 @@ #include "ViscosityBlockVisitor.h" #include "Block3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" +#include "D3Q27System.h" #include "ILBMKernel.h" #include "LBMSystem.h" -ViscosityBlockVisitor::ViscosityBlockVisitor(LBMReal nu) : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), nu(nu) {} +ViscosityBlockVisitor::ViscosityBlockVisitor(LBMReal nu) : Block3DVisitor(0, D3Q27System::MAXLEVEL), nu(nu) {} ////////////////////////////////////////////////////////////////////////// void ViscosityBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block) { diff --git a/src/cpu/simulationconfig/src/Simulation.cpp b/src/cpu/simulationconfig/src/Simulation.cpp index ab818f5280628e51648e6d478dbb827b2bcc78ed..1258df75b8440b468c942688c9dc3366e3e2a833 100644 --- a/src/cpu/simulationconfig/src/Simulation.cpp +++ b/src/cpu/simulationconfig/src/Simulation.cpp @@ -120,7 +120,7 @@ void Simulation::run() auto metisVisitor = std::make_shared<MetisPartitioningGridVisitor>(communicator, MetisPartitioningGridVisitor::LevelBased, - D3Q27System::B, MetisPartitioner::RECURSIVE); + D3Q27System::DIR_00M, MetisPartitioner::RECURSIVE); InteractorsHelper intHelper(grid, metisVisitor); for (auto const &interactor : interactors) diff --git a/src/gpu/GksGpu/BoundaryConditions/BoundaryCondition.h b/src/gpu/GksGpu/BoundaryConditions/BoundaryCondition.h index fe4078af95904fa5e1580b54f3aa2edbb006bd3d..9c3bac9c3e2795fa99f339461c6a7f2d16448696 100644 --- a/src/gpu/GksGpu/BoundaryConditions/BoundaryCondition.h +++ b/src/gpu/GksGpu/BoundaryConditions/BoundaryCondition.h @@ -47,13 +47,13 @@ struct GKSGPU_EXPORT BoundaryCondition : virtual public BoundaryConditionStruct, virtual bool isWall() = 0; virtual bool isFluxBC(); - + virtual bool isInsulated(); virtual bool secondCellsNeeded(); virtual void runBoundaryConditionKernel( const SPtr<DataBase> dataBase, - const Parameters parameters, + const Parameters parameters, const uint level ) = 0; BoundaryConditionStruct toStruct() diff --git a/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.cpp b/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.cpp index 30507493a40a9b6012d05b693d2622d1bddd1240..5f3c4ad492b16c09b26acd00a624a54ad65dffda 100644 --- a/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.cpp +++ b/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.cpp @@ -33,6 +33,7 @@ SPtr<TransientBCInputFileReader> createReaderForCollection(SPtr<FileCollection> return nullptr; } } + template<typename T> std::vector<T> readStringToVector(std::string s) { @@ -45,6 +46,7 @@ std::vector<T> readStringToVector(std::string s) } return out; } + std::string readElement(std::string line) { size_t elemStart = line.find("<")+1; @@ -154,7 +156,8 @@ void VTKFile::unloadFile() this->loaded = false; } -void VTKFile::getData(real* data, uint numberOfNodes, std::vector<uint> readIndeces, std::vector<uint> writeIndices, uint offsetRead, uint offsetWrite) +void VTKFile::getData(real *data, uint numberOfNodes, const std::vector<uint> &readIndices, + const std::vector<uint> &writeIndices, uint offsetRead, uint offsetWrite) { if(!this->loaded) loadFile(); @@ -165,7 +168,7 @@ void VTKFile::getData(real* data, uint numberOfNodes, std::vector<uint> readInde real* quant = &data[j*numberOfNodes]; for(size_t i=0; i<nPoints; i++) { - quant[offsetWrite+writeIndices[i]] = this->quantities[j].values[readIndeces[i]+offsetRead]; + quant[offsetWrite+writeIndices[i]] = this->quantities[j].values[readIndices[i]+offsetRead]; } } } @@ -223,20 +226,20 @@ void VTKFileCollection::findFiles() VF_LOG_CRITICAL("VTKFileCollection found no files!"); } -void TransientBCInputFileReader::getNeighbors(uint* neighborNT, uint* neighborNB, uint* neighborST, uint* neighborSB) +void TransientBCInputFileReader::getNeighbors(uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM) { - std::copy(planeNeighborNT.begin(), planeNeighborNT.end(), &neighborNT[writingOffset]); - std::copy(planeNeighborNB.begin(), planeNeighborNB.end(), &neighborNB[writingOffset]); - std::copy(planeNeighborST.begin(), planeNeighborST.end(), &neighborST[writingOffset]); - std::copy(planeNeighborSB.begin(), planeNeighborSB.end(), &neighborSB[writingOffset]); + std::copy(planeNeighbor0PP.begin(), planeNeighbor0PP.end(), &neighbor0PP[writingOffset]); + std::copy(planeNeighbor0PM.begin(), planeNeighbor0PM.end(), &neighbor0PM[writingOffset]); + std::copy(planeNeighbor0MP.begin(), planeNeighbor0MP.end(), &neighbor0MP[writingOffset]); + std::copy(planeNeighbor0MM.begin(), planeNeighbor0MM.end(), &neighbor0MM[writingOffset]); } -void TransientBCInputFileReader::getWeights(real* _weightsNT, real* _weightsNB, real* _weightsST, real* _weightsSB) +void TransientBCInputFileReader::getWeights(real* _weights0PP, real* _weights0PM, real* _weights0MP, real* _weights0MM) { - std::copy(weightsNT.begin(), weightsNT.end(), &_weightsNT[writingOffset]); - std::copy(weightsNB.begin(), weightsNB.end(), &_weightsNB[writingOffset]); - std::copy(weightsST.begin(), weightsST.end(), &_weightsST[writingOffset]); - std::copy(weightsSB.begin(), weightsSB.end(), &_weightsSB[writingOffset]); + std::copy(weights0PP.begin(), weights0PP.end(), &_weights0PP[writingOffset]); + std::copy(weights0PM.begin(), weights0PM.end(), &_weights0PM[writingOffset]); + std::copy(weights0MP.begin(), weights0MP.end(), &_weights0MP[writingOffset]); + std::copy(weights0MM.begin(), weights0MM.end(), &_weights0MM[writingOffset]); } @@ -261,22 +264,22 @@ void VTKReader::fillArrays(std::vector<real>& coordsY, std::vector<real>& coords real eps = 1e-7; // small number to avoid division by zero bool perfect_match = true; - this->weightsNT.reserve(this->nPoints); - this->weightsNB.reserve(this->nPoints); - this->weightsST.reserve(this->nPoints); - this->weightsSB.reserve(this->nPoints); + this->weights0PP.reserve(this->nPoints); + this->weights0PM.reserve(this->nPoints); + this->weights0MP.reserve(this->nPoints); + this->weights0MM.reserve(this->nPoints); - this->planeNeighborNT.reserve(this->nPoints); - this->planeNeighborNB.reserve(this->nPoints); - this->planeNeighborST.reserve(this->nPoints); - this->planeNeighborSB.reserve(this->nPoints); + this->planeNeighbor0PP.reserve(this->nPoints); + this->planeNeighbor0PM.reserve(this->nPoints); + this->planeNeighbor0MP.reserve(this->nPoints); + this->planeNeighbor0MM.reserve(this->nPoints); for(uint i=0; i<nPoints; i++) { real posY = coordsY[i]; real posZ = coordsZ[i]; - bool foundNT = false, foundNB = false, foundST = false, foundSB = false, foundAll = false; + bool found0PP = false, found0PM = false, found0MP = false, found0MM = false, foundAll = false; uint level = this->readLevel; @@ -287,80 +290,83 @@ void VTKReader::fillArrays(std::vector<real>& coordsY, std::vector<real>& coords // y in simulation is x in precursor/file, z in simulation is y in precursor/file // simulation -> file: N -> E, S -> W, T -> N, B -> S - int idx = file.findNeighborWSB(posY, posZ, 0.f); //!> index of nearest WSB neighbor on precursor file + int idx = file.findNeighborMMM(posY, posZ, 0.f); //!> index of nearest WSB neighbor on precursor file if(idx!=-1) { // Filter for exact matches if(abs(posY-file.getX(idx)) < max_diff && abs(posZ-file.getY(idx)) < max_diff) { - this->weightsNT.emplace_back(1e6f); - this->weightsNB.emplace_back(0.f); - this->weightsST.emplace_back(0.f); - this->weightsSB.emplace_back(0.f); + this->weights0PP.emplace_back(1e6f); + this->weights0PM.emplace_back(0.f); + this->weights0MP.emplace_back(0.f); + this->weights0MM.emplace_back(0.f); uint writeIdx = this->getWriteIndex(level, fileId, idx); //!> writeIdx: index on host/device array where precursor value will be written to after loading from file - this->planeNeighborNT.push_back(writeIdx); //!> neighbor lists mapping where BC kernel should read from on host/device array - this->planeNeighborNB.push_back(writeIdx); - this->planeNeighborST.push_back(writeIdx); - this->planeNeighborSB.push_back(writeIdx); - foundNT = true; foundNB = true; foundSB = true; foundST = true; + this->planeNeighbor0PP.push_back(writeIdx); //!> neighbor lists mapping where BC kernel should read from on host/device array + this->planeNeighbor0PM.push_back(writeIdx); + this->planeNeighbor0MP.push_back(writeIdx); + this->planeNeighbor0MM.push_back(writeIdx); + found0PP = true; + found0PM = true; + found0MM = true; + found0MP = true; } else { perfect_match = false; } - if(!foundSB) + if(!found0MM) { - foundSB = true; + found0MM = true; real dy = file.getX(idx)-posY; real dz = file.getY(idx)-posZ; - this->weightsSB.emplace_back(1.f/(dy*dy+dz*dz+eps)); - this->planeNeighborSB.emplace_back(getWriteIndex(level, fileId, idx)); + this->weights0MM.emplace_back(1.f/(dy*dy+dz*dz+eps)); + this->planeNeighbor0MM.emplace_back(getWriteIndex(level, fileId, idx)); } } - if(!foundNT) //NT in simulation is EN in precursor + if(!found0PP) //NT in simulation is EN in precursor { - int idx = file.findNeighborENB(posY, posZ, 0.f); - if(idx!=-1) + int index = file.findNeighborPPM(posY, posZ, 0.f); + if(index!=-1) { - foundNT = true; - real dy = file.getX(idx)-posY; - real dz = file.getY(idx)-posZ; - this->weightsNT.emplace_back(1.f/(dy*dy+dz*dz+eps)); - this->planeNeighborNT.emplace_back(getWriteIndex(level, fileId, idx)); + found0PP = true; + real dy = file.getX(index)-posY; + real dz = file.getY(index)-posZ; + this->weights0PP.emplace_back(1.f/(dy*dy+dz*dz+eps)); + this->planeNeighbor0PP.emplace_back(getWriteIndex(level, fileId, index)); } } - if(!foundNB) //NB in simulation is ES in precursor + if(!found0PM) //NB in simulation is ES in precursor { - int idx = file.findNeighborESB(posY, posZ, 0.f); - if(idx!=-1) + int index = file.findNeighborPMM(posY, posZ, 0.f); + if(index!=-1) { - foundNB = true; - real dy = file.getX(idx)-posY; - real dz = file.getY(idx)-posZ; - this->weightsNB.emplace_back(1.f/(dy*dy+dz*dz+eps)); - this->planeNeighborNT.emplace_back(getWriteIndex(level, fileId, idx)); + found0PM = true; + real dy = file.getX(index)-posY; + real dz = file.getY(index)-posZ; + this->weights0PM.emplace_back(1.f/(dy*dy+dz*dz+eps)); + this->planeNeighbor0PP.emplace_back(getWriteIndex(level, fileId, index)); } } - if(!foundST) //ST in simulation is WN in precursor + if(!found0MP) //ST in simulation is WN in precursor { - int idx = file.findNeighborWNB(posY, posZ, 0.f); - if(idx!=-1) + int index = file.findNeighborMPM(posY, posZ, 0.f); + if(index!=-1) { - foundST = true; - real dy = file.getX(idx)-posY; - real dz = file.getY(idx)-posZ; - this->weightsST.emplace_back(1.f/(dy*dy+dz*dz+eps)); - this->planeNeighborST.emplace_back(getWriteIndex(level, fileId, idx)); + found0MP = true; + real dy = file.getX(index)-posY; + real dz = file.getY(index)-posZ; + this->weights0MP.emplace_back(1.f/(dy*dy+dz*dz+eps)); + this->planeNeighbor0MP.emplace_back(getWriteIndex(level, fileId, index)); } } - foundAll = foundNT && foundNB && foundST && foundSB; + foundAll = found0PP && found0PM && found0MP && found0MM; if(foundAll) break; } @@ -404,35 +410,35 @@ void VTKReader::getNextData(real* data, uint numberOfNodes, real time) uint level = this->readLevel; for(size_t id=0; id<this->fileCollection->files[level].size(); id++) { - size_t nF = this->nFile[level][id]; + size_t numberOfFiles = this->nFile[level][id]; - if(!this->fileCollection->files[level][id][nF].inZBounds(time)) + if(!this->fileCollection->files[level][id][numberOfFiles].inZBounds(time)) { - nF++; + numberOfFiles++; - printf("switching to precursor file no. %zd\n", nF); - if(nF == this->fileCollection->files[level][id].size()) + printf("switching to precursor file no. %zu\n", numberOfFiles); + if(numberOfFiles == this->fileCollection->files[level][id].size()) throw std::runtime_error("Not enough Precursor Files to read"); - this->fileCollection->files[level][id][nF-1].unloadFile(); - if(nF+1<this->fileCollection->files[level][id].size()) + this->fileCollection->files[level][id][numberOfFiles-1].unloadFile(); + if(numberOfFiles+1<this->fileCollection->files[level][id].size()) { - VTKFile* nextFile = &this->fileCollection->files[level][id][nF+1]; + VTKFile* nextFile = &this->fileCollection->files[level][id][numberOfFiles+1]; if(! nextFile->isLoaded()) { read.wait(); - read = std::async(std::launch::async, [](VTKFile* file){ file->loadFile(); }, &this->fileCollection->files[level][id][nF+1]); + read = std::async(std::launch::async, [](VTKFile* file){ file->loadFile(); }, &this->fileCollection->files[level][id][numberOfFiles+1]); } } } - VTKFile* file = &this->fileCollection->files[level][id][nF]; + VTKFile* file = &this->fileCollection->files[level][id][numberOfFiles]; int off = file->getClosestIdxZ(time)*file->getNumberOfPointsInXYPlane(); file->getData(data, numberOfNodes, this->readIndices[level][id], this->writeIndices[level][id], off, this->writingOffset); - this->nFile[level][id] = nF; + this->nFile[level][id] = numberOfFiles; } // } -} \ No newline at end of file +} diff --git a/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h b/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h index 7b1145185fe0ea1d515127d46cbd66bdbad7f38d..1663a3ff37ba1bb062647847462d4e364baed93b 100644 --- a/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h +++ b/src/gpu/GridGenerator/TransientBCSetter/TransientBCSetter.h @@ -32,7 +32,7 @@ struct Quantity class VTKFile { public: - VTKFile(std::string _fileName): + explicit VTKFile(std::string _fileName): fileName(_fileName) { readHeader(); @@ -40,29 +40,29 @@ public: // printFileInfo(); }; - void getData(real* data, uint numberOfNodes, std::vector<uint> readIndeces, std::vector<uint> writeIndices, uint offsetRead, uint offsetWrite); + void getData(real* data, uint numberOfNodes, const std::vector<uint>& readIndices, const std::vector<uint>& writeIndices, uint offsetRead, uint offsetWrite); bool markNANs(std::vector<uint> readIndices); bool inBoundingBox(real posX, real posY, real posZ){return inXBounds(posX) && inYBounds(posY) && inZBounds(posZ); }; bool inXBounds(real posX){ return posX<=maxX && posX>=minX; }; bool inYBounds(real posY){ return posY<=maxY && posY>=minY; }; bool inZBounds(real posZ){ return posZ<=maxZ && posZ>=minZ; }; - int findNeighborWSB(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxWX(posX) , getIdxSY(posY) , getIdxBZ(posZ) ); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; - int findNeighborWST(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxWX(posX) , getIdxSY(posY) , getIdxBZ(posZ)+1); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; - int findNeighborWNB(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxWX(posX) , getIdxSY(posY)+1, getIdxBZ(posZ) ); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; - int findNeighborWNT(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxWX(posX) , getIdxSY(posY)+1, getIdxBZ(posZ)+1); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; - int findNeighborESB(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxWX(posX)+1, getIdxSY(posY) , getIdxBZ(posZ) ); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; - int findNeighborEST(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxWX(posX)+1, getIdxSY(posY) , getIdxBZ(posZ)+1); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; - int findNeighborENB(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxWX(posX)+1, getIdxSY(posY)+1, getIdxBZ(posZ) ); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; - int findNeighborENT(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxWX(posX)+1, getIdxSY(posY)+1, getIdxBZ(posZ)+1); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; + int findNeighborMMM(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxM00(posX) , getIdx0M0(posY) , getIdx00M(posZ) ); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; + int findNeighborMMP(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxM00(posX) , getIdx0M0(posY) , getIdx00M(posZ)+1); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; + int findNeighborMPM(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxM00(posX) , getIdx0M0(posY)+1, getIdx00M(posZ) ); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; + int findNeighborMPP(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxM00(posX) , getIdx0M0(posY)+1, getIdx00M(posZ)+1); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; + int findNeighborPMM(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxM00(posX)+1, getIdx0M0(posY) , getIdx00M(posZ) ); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; + int findNeighborPMP(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxM00(posX)+1, getIdx0M0(posY) , getIdx00M(posZ)+1); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; + int findNeighborPPM(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxM00(posX)+1, getIdx0M0(posY)+1, getIdx00M(posZ) ); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; + int findNeighborPPP(real posX, real posY, real posZ){ int idx = getLinearIndex(getIdxM00(posX)+1, getIdx0M0(posY)+1, getIdx00M(posZ)+1); return (idx>=0) && (idx<nx*ny*nz) ? idx : -1; }; int getIdxX(int linearIdx){ return linearIdx%nx;}; int getIdxY(int linearIdx){ return (linearIdx/nx)%ny;}; int getIdxZ(int linearIdx){ return linearIdx/(nx*ny); }; real getX(int linearIdx){ return getIdxX(linearIdx)*deltaX+minX; }; real getY(int linearIdx){ return getIdxY(linearIdx)*deltaY+minY; }; real getZ(int linearIdx){ return getIdxZ(linearIdx)*deltaZ+minZ; }; - int getIdxWX(real posX){ return (posX-minX)/deltaX; }; - int getIdxSY(real posY){ return (posY-minY)/deltaY; }; - int getIdxBZ(real posZ){ return (posZ-minZ)/deltaZ; }; + int getIdxM00(real posX){ return (posX-minX)/deltaX; }; + int getIdx0M0(real posY){ return (posY-minY)/deltaY; }; + int getIdx00M(real posZ){ return (posZ-minZ)/deltaZ; }; int getClosestIdxX(real posX){ int x = round((posX-minX)/deltaX); return x>nx ? nx : (x<0 ? 0 : x);}; int getClosestIdxY(real posY){ int y = round((posY-minY)/deltaY); return y>ny ? ny : (y<0 ? 0 : y);}; int getClosestIdxZ(real posZ){ int z = round((posZ-minZ)/deltaZ); return z>nz ? nz : (z<0 ? 0 : z);}; @@ -100,9 +100,9 @@ public: virtual ~FileCollection() = default; - virtual size_t getNumberOfQuantities()=0; + virtual size_t getNumberOfQuantities() = 0; - virtual FileType getFileType()=0; + virtual FileType getFileType() = 0; protected: std::string prefix; @@ -118,8 +118,8 @@ public: findFiles(); }; - FileType getFileType(){ return FileType::VTK; }; - size_t getNumberOfQuantities(){ return files[0][0][0].getNumberOfQuantities(); } + FileType getFileType() override{ return FileType::VTK; }; + size_t getNumberOfQuantities() override{ return files[0][0][0].getNumberOfQuantities(); } private: @@ -156,12 +156,12 @@ public: uint getNPointsRead(){return nPointsRead; }; size_t getNumberOfQuantities(){ return nQuantities; }; void setWritingOffset(uint offset){ this->writingOffset = offset; } - void getNeighbors(uint* neighborNT, uint* neighborNB, uint* neighborST, uint* neighborSN); - void getWeights(real* _weightsNT, real* _weightsNB, real* _weightsST, real* _weightsSB); + void getNeighbors(uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM); + void getWeights(real* _weights0PP, real* _weights0PM, real* _weights0MP, real* _weights0MM); public: - std::vector<uint> planeNeighborNT, planeNeighborNB, planeNeighborST, planeNeighborSB; - std::vector<real> weightsNT, weightsNB, weightsST, weightsSB; + std::vector<uint> planeNeighbor0PP, planeNeighbor0PM, planeNeighbor0MP, planeNeighbor0MM; + std::vector<real> weights0PP, weights0PM, weights0MP, weights0MM; protected: uint nPoints, nPointsRead, writingOffset; @@ -198,4 +198,4 @@ private: SPtr<FileCollection> createFileCollection(std::string prefix, FileType type); SPtr<TransientBCInputFileReader> createReaderForCollection(SPtr<FileCollection> fileCollection, uint readLevel); -#endif //TRANSIENTBCSETTER_H_ \ No newline at end of file +#endif //TRANSIENTBCSETTER_H_ diff --git a/src/gpu/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h b/src/gpu/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h index 12e1fb61c81948c88febed8960f0a3a9548fbfb4..22342aec9839afad9bb37b1b11812f6d1750ed7b 100644 --- a/src/gpu/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h +++ b/src/gpu/GridGenerator/grid/BoundaryConditions/BoundaryCondition.h @@ -337,9 +337,9 @@ public: class PrecursorBoundaryCondition : public gg::BoundaryCondition { public: - static SPtr<PrecursorBoundaryCondition> make(SPtr<TransientBCInputFileReader> reader, int nTRead, real velocityX, real velocityY, real velocityZ) + static SPtr<PrecursorBoundaryCondition> make(SPtr<TransientBCInputFileReader> reader, int timeStepsBetweenReads, real velocityX, real velocityY, real velocityZ) { - return SPtr<PrecursorBoundaryCondition>(new PrecursorBoundaryCondition(reader, nTRead, velocityX, velocityY, velocityZ)); + return SPtr<PrecursorBoundaryCondition>(new PrecursorBoundaryCondition(reader, timeStepsBetweenReads, velocityX, velocityY, velocityZ)); } SPtr<TransientBCInputFileReader> getReader(){ return reader; } @@ -348,13 +348,13 @@ public: real getVelocityZ() { return velocityZ; } private: - PrecursorBoundaryCondition(SPtr<TransientBCInputFileReader> _reader, uint _nTRead, real vx, real vy, real vz) : reader(_reader), nTRead(_nTRead), velocityX(vx), velocityY(vy), velocityZ(vz) { }; + PrecursorBoundaryCondition(SPtr<TransientBCInputFileReader> _reader, uint _timeStepsBetweenReads, real vx, real vy, real vz) : reader(_reader), timeStepsBetweenReads(_timeStepsBetweenReads), velocityX(vx), velocityY(vy), velocityZ(vz) { }; virtual char getType() const override { return vf::gpu::BC_VELOCITY; } public: - uint nTRead; //!> read data every nth timestep + uint timeStepsBetweenReads; //!> read data every nth timestep private: real velocityX = 0.0; diff --git a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp index 270aff9d8ff9639b8ae0c19451ca90990eba9c63..5b191ee4e3fcdc0ec71633111085f70c5dc43479 100644 --- a/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp +++ b/src/gpu/GridGenerator/grid/BoundaryConditions/Side.cpp @@ -1,28 +1,28 @@ //======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ // \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ // -// This file is part of VirtualFluids. VirtualFluids is free software: you can +// 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 +// 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 +// +// 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/>. // @@ -65,16 +65,15 @@ void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition || grid->getFieldEntry(index) == vf::gpu::FLUID_CFC || grid->getFieldEntry(index) == vf::gpu::FLUID_CFF || grid->getFieldEntry(index) == vf::gpu::FLUID_FCC - || grid->getFieldEntry(index) == vf::gpu::FLUID_FCF || grid->getFieldEntry(index) == vf::gpu::FLUID_FCF - + || grid->getFieldEntry(index) == vf::gpu::FLUID_FCF + //! Enforce overlap of BCs on edge nodes || grid->getFieldEntry(index) == vf::gpu::BC_PRESSURE - || grid->getFieldEntry(index) == vf::gpu::BC_VELOCITY - || grid->getFieldEntry(index) == vf::gpu::BC_NOSLIP - || grid->getFieldEntry(index) == vf::gpu::BC_SLIP - || grid->getFieldEntry(index) == vf::gpu::BC_STRESS ) - /*&& boundaryCondition->getType()!=vf::gpu::BC_STRESS*/ ) + || grid->getFieldEntry(index) == vf::gpu::BC_VELOCITY + || grid->getFieldEntry(index) == vf::gpu::BC_NOSLIP + || grid->getFieldEntry(index) == vf::gpu::BC_SLIP + || grid->getFieldEntry(index) == vf::gpu::BC_STRESS )) { grid->setFieldEntry(index, boundaryCondition->getType()); boundaryCondition->indices.push_back(index); @@ -85,25 +84,6 @@ void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition boundaryCondition->patches.push_back(0); } - // else if(boundaryCondition->getType()==vf::gpu::BC_STRESS && (index != INVALID_INDEX) && ( grid->getFieldEntry(index) == vf::gpu::FLUID - // || grid->getFieldEntry(index) == vf::gpu::FLUID_CFC - // || grid->getFieldEntry(index) == vf::gpu::FLUID_CFF - // || grid->getFieldEntry(index) == vf::gpu::FLUID_FCC - // || grid->getFieldEntry(index) == vf::gpu::FLUID_FCF - // || grid->getFieldEntry(index) == vf::gpu::FLUID_FCF - // || grid->getFieldEntry(index) == vf::gpu::BC_PRESSURE - // )) - // { - // grid->setFieldEntry(index, boundaryCondition->getType()); - // boundaryCondition->indices.push_back(index); - // setPressureNeighborIndices(boundaryCondition, grid, index); - // setStressSamplingIndices(boundaryCondition, grid, index); - - // setQs(grid, boundaryCondition, index); - - // boundaryCondition->patches.push_back(0); - // } - } } } @@ -195,13 +175,6 @@ void Side::setQs(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uin bool alignedWithNormal = (this->getNormal()[0]*grid->getDirection()[dir * DIMENSION + 0]+ this->getNormal()[1]*grid->getDirection()[dir * DIMENSION + 1]+ this->getNormal()[2]*grid->getDirection()[dir * DIMENSION + 2] ) > 0; - - // if(boundaryCondition->getType()==vf::gpu::BC_VELOCITY && z < 8.0 ) - // { - // alignedWithNormal = true; - // printf("XYZ: %f \t %f \t %f \n", x,y,z); - // printf("dir: %d \t %d \t %d \n\n", grid->getDirection()[dir * DIMENSION + 0], grid->getDirection()[dir * DIMENSION + 1], grid->getDirection()[dir * DIMENSION + 2]); - // } uint neighborIndex = grid->transCoordToIndex( neighborX, neighborY, neighborZ ); if((grid->getFieldEntry(neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID_BOUNDARY || @@ -212,7 +185,7 @@ void Side::setQs(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, uin else qNode[dir] = -1.0; } - + boundaryCondition->qs.push_back(qNode); } @@ -241,7 +214,7 @@ void Geometry::addIndices(std::vector<SPtr<Grid> > grids, uint level, SPtr<Bound for (int dir = 0; dir <= grids[level]->getEndDirection(); dir++) { - const real q = grids[level]->getQValue(index, dir); + const real q = grids[level]->getQValue(index, dir); qNode[dir] = q; @@ -311,7 +284,7 @@ void MY::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond real coordinateNormal = grid[level]->getStartY() + grid[level]->getDelta(); if( coordinateNormal > grid[0]->getStartY() + grid[0]->getDelta() ) return; - + Side::addIndices(grid[level], boundaryCondition, "y", coordinateNormal, startInner, endInner, startOuter, endOuter); } @@ -358,6 +331,6 @@ void PZ::addIndices(std::vector<SPtr<Grid> > grid, uint level, SPtr<BoundaryCond real coordinateNormal = grid[level]->getEndZ() - grid[level]->getDelta(); if( coordinateNormal < grid[0]->getEndZ() - grid[0]->getDelta() ) return; - + Side::addIndices(grid[level], boundaryCondition, "z", coordinateNormal, startInner, endInner, startOuter, endOuter); } diff --git a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h index c9aa7678b9d4391a47707880a2fcb9eb90547864..f3d850384816f6690e5ffc158bbdc5e1df0ab328 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/GridBuilder.h @@ -115,10 +115,10 @@ public: virtual void getPressureQs(real *qs[27], int level) const = 0; virtual uint getPrecursorSize(int level) const = 0; - virtual void getPrecursorValues(uint* neighborNT, uint* neighborNB, uint* neighborST, uint* neighborSB, - real* weightsNT, real* weightsNB, real* weightsST, real* weightsSB, + virtual void getPrecursorValues(uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM, + real* weights0PP, real* weights0PM, real* weights0MP, real* weights0MM, int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader, - int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& nTRead, + int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& timeStepsBetweenReads, real& velocityX, real& velocityY, real& velocityZ, int level) const = 0; virtual void getPrecursorQs(real* qs[27], int level) const = 0; @@ -147,20 +147,20 @@ public: virtual void findFluidNodes(bool splitDomain) = 0; - virtual void addFluidNodeIndicesMacroVars(std::vector<uint> fluidNodeIndicesMacroVars, uint level) = 0; - virtual void addFluidNodeIndicesApplyBodyForce(std::vector<uint> fluidNodeIndicesApplyBodyForce, uint level) = 0; - virtual void addFluidNodeIndicesAllFeatures(std::vector<uint> fluidNodeIndicesAllFeatures, uint level) = 0; + virtual void addFluidNodeIndicesMacroVars(const std::vector<uint>& fluidNodeIndicesMacroVars, uint level) = 0; + virtual void addFluidNodeIndicesApplyBodyForce(const std::vector<uint>& fluidNodeIndicesApplyBodyForce, uint level) = 0; + virtual void addFluidNodeIndicesAllFeatures(const std::vector<uint>& fluidNodeIndicesAllFeatures, uint level) = 0; virtual void sortFluidNodeIndicesMacroVars(uint level) = 0; virtual void sortFluidNodeIndicesApplyBodyForce(uint level) = 0; virtual void sortFluidNodeIndicesAllFeatures(uint level) = 0; - virtual uint getNumberOfFluidNodesMacroVars(unsigned int level) const = 0; - virtual void getFluidNodeIndicesMacroVars(uint *fluidNodeIndicesMacroVars, const int level) const = 0; - virtual uint getNumberOfFluidNodesApplyBodyForce(unsigned int level) const = 0; - virtual void getFluidNodeIndicesApplyBodyForce(uint *fluidNodeIndicesApplyBodyForce, const int level) const = 0; - virtual uint getNumberOfFluidNodesAllFeatures(unsigned int level) const = 0; - virtual void getFluidNodeIndicesAllFeatures(uint *fluidNodeIndicesAllFeatures, const int level) const = 0; + virtual uint getNumberOfFluidNodesMacroVars(uint level) const = 0; + virtual void getFluidNodeIndicesMacroVars(uint *fluidNodeIndicesMacroVars, int level) const = 0; + virtual uint getNumberOfFluidNodesApplyBodyForce(uint level) const = 0; + virtual void getFluidNodeIndicesApplyBodyForce(uint *fluidNodeIndicesApplyBodyForce, int level) const = 0; + virtual uint getNumberOfFluidNodesAllFeatures(uint level) const = 0; + virtual void getFluidNodeIndicesAllFeatures(uint *fluidNodeIndicesAllFeatures, int level) const = 0; }; -#endif \ No newline at end of file +#endif diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 267f03c5aefa809f68af6d9750cf4afbf3cfe3e2..003e6dcd223d2bf019c83f71349a9a7bec84efdc 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp @@ -1,28 +1,28 @@ //======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ // \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ // -// This file is part of VirtualFluids. VirtualFluids is free software: you can +// 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 +// 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 +// +// 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/>. // @@ -105,34 +105,33 @@ void LevelGridBuilder::setSlipGeometryBoundaryCondition(real normalX, real norma for (uint level = 0; level < getNumberOfGridLevels(); level++) { - if (boundaryConditions[level]->geometryBoundaryCondition != nullptr) - { - boundaryConditions[level]->geometryBoundaryCondition->normalX = normalX; - boundaryConditions[level]->geometryBoundaryCondition->normalY = normalY; - boundaryConditions[level]->geometryBoundaryCondition->normalZ = normalZ; - boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition); + if (boundaryConditions[level]->geometryBoundaryCondition != nullptr) + { + boundaryConditions[level]->geometryBoundaryCondition->normalX = normalX; + boundaryConditions[level]->geometryBoundaryCondition->normalY = normalY; + boundaryConditions[level]->geometryBoundaryCondition->normalZ = normalZ; + boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition); boundaryConditions[level]->geometryBoundaryCondition->fillSlipNormalLists(); *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Geometry Slip BC on level " << level << " with " << (int)boundaryConditions[level]->geometryBoundaryCondition->indices.size() <<"\n"; - } + } } } //======================================================================================= //! \brief Set stress boundary concdition using iMEM //! \param samplingOffset number of grid points above boundary where velocity for wall model is sampled -//! \param z0 roghness length [m] -//! \param dx dx of level 0 [m] +//! \param z0 roughness length [m] +//! \param dx dx of level 0 [m] //! -void LevelGridBuilder::setStressBoundaryCondition( SideType sideType, - real nomalX, real normalY, real normalZ, +void LevelGridBuilder::setStressBoundaryCondition( SideType sideType, + real nomalX, real normalY, real normalZ, uint samplingOffset, real z0, real dx) { for (uint level = 0; level < getNumberOfGridLevels(); level++) { - SPtr<StressBoundaryCondition> stressBoundaryCondition = StressBoundaryCondition::make(nomalX, normalY, normalZ, samplingOffset, z0/(dx*(level+1))); - + SPtr<StressBoundaryCondition> stressBoundaryCondition = StressBoundaryCondition::make(nomalX, normalY, normalZ, samplingOffset, z0*pow(2.0f,level)/dx); auto side = SideFactory::make(sideType); stressBoundaryCondition->side = side; @@ -179,17 +178,17 @@ void LevelGridBuilder::setVelocityGeometryBoundaryCondition(real vx, real vy, re for (uint level = 0; level < getNumberOfGridLevels(); level++) { - if (boundaryConditions[level]->geometryBoundaryCondition != nullptr) - { - boundaryConditions[level]->geometryBoundaryCondition->vx = vx; - boundaryConditions[level]->geometryBoundaryCondition->vy = vy; - boundaryConditions[level]->geometryBoundaryCondition->vz = vz; - boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition); + if (boundaryConditions[level]->geometryBoundaryCondition != nullptr) + { + boundaryConditions[level]->geometryBoundaryCondition->vx = vx; + boundaryConditions[level]->geometryBoundaryCondition->vy = vy; + boundaryConditions[level]->geometryBoundaryCondition->vz = vz; + boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition); boundaryConditions[level]->geometryBoundaryCondition->fillVelocityLists(); *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Geometry Velocity BC on level " << level << " with " << (int)boundaryConditions[level]->geometryBoundaryCondition->indices.size() <<"\n"; - } + } } } @@ -231,7 +230,7 @@ void LevelGridBuilder::setNoSlipBoundaryCondition(SideType sideType) noSlipBoundaryCondition->fillVelocityLists(); // now effectively just a wrapper for velocityBC with zero velocity. No distinction in Gridgenerator. - boundaryConditions[level]->velocityBoundaryConditions.push_back(noSlipBoundaryCondition); + boundaryConditions[level]->velocityBoundaryConditions.push_back(noSlipBoundaryCondition); } } } @@ -242,23 +241,23 @@ void LevelGridBuilder::setNoSlipGeometryBoundaryCondition() for (uint level = 0; level < getNumberOfGridLevels(); level++) { - if (boundaryConditions[level]->geometryBoundaryCondition != nullptr) - { - boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition); + if (boundaryConditions[level]->geometryBoundaryCondition != nullptr) + { + boundaryConditions[level]->geometryBoundaryCondition->side->addIndices(grids, level, boundaryConditions[level]->geometryBoundaryCondition); *logging::out << logging::Logger::INFO_INTERMEDIATE << "Set Geometry No-Slip BC on level " << level << " with " << (int)boundaryConditions[level]->geometryBoundaryCondition->indices.size() <<"\n"; - } + } } } -void LevelGridBuilder::setPrecursorBoundaryCondition(SideType sideType, SPtr<FileCollection> fileCollection, int nTRead, +void LevelGridBuilder::setPrecursorBoundaryCondition(SideType sideType, SPtr<FileCollection> fileCollection, int timeStepsBetweenReads, real velocityX, real velocityY, real velocityZ, std::vector<uint> fileLevelToGridLevelMap) { - if(fileLevelToGridLevelMap.empty()) + if(fileLevelToGridLevelMap.empty()) { *logging::out << logging::Logger::INFO_INTERMEDIATE << "Mapping precursor file levels to the corresponding grid levels" << "\n"; - for (uint level = 0; level < getNumberOfGridLevels(); level++) + for (uint level = 0; level < getNumberOfGridLevels(); level++) fileLevelToGridLevelMap.push_back(level); } else @@ -271,7 +270,7 @@ void LevelGridBuilder::setPrecursorBoundaryCondition(SideType sideType, SPtr<Fil for (uint level = 0; level < getNumberOfGridLevels(); level++) { auto reader = createReaderForCollection(fileCollection, fileLevelToGridLevelMap[level]); - SPtr<PrecursorBoundaryCondition> precursorBoundaryCondition = PrecursorBoundaryCondition::make( reader, nTRead, velocityX, velocityY, velocityZ); + SPtr<PrecursorBoundaryCondition> precursorBoundaryCondition = PrecursorBoundaryCondition::make( reader, timeStepsBetweenReads, velocityX, velocityY, velocityZ); auto side = SideFactory::make(sideType); @@ -414,9 +413,9 @@ std::shared_ptr<Grid> LevelGridBuilder::getGrid(int level, int box) void LevelGridBuilder::checkLevel(int level) { if (level >= (int)grids.size()) - { + { std::cout << "wrong level input... return to caller\n"; - return; + return; } } @@ -427,16 +426,16 @@ void LevelGridBuilder::getDimensions(int &nx, int &ny, int &nz, const int level) nz = grids[level]->getNumberOfNodesZ(); } -void LevelGridBuilder::getNodeValues(real *xCoords, real *yCoords, real *zCoords, - uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, +void LevelGridBuilder::getNodeValues(real *xCoords, real *yCoords, real *zCoords, + uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, uint *geo, const int level) const { grids[level]->getNodeValues(xCoords, yCoords, zCoords, neighborX, neighborY, neighborZ, neighborNegative, geo); } -GRIDGENERATOR_EXPORT void LevelGridBuilder::getFluidNodeIndices(uint *fluidNodeIndices, const int level) const -{ +GRIDGENERATOR_EXPORT void LevelGridBuilder::getFluidNodeIndices(uint *fluidNodeIndices, const int level) const +{ grids[level]->getFluidNodeIndices(fluidNodeIndices); } @@ -445,9 +444,9 @@ GRIDGENERATOR_EXPORT void LevelGridBuilder::getFluidNodeIndicesBorder(uint *flui grids[level]->getFluidNodeIndicesBorder(fluidNodeIndices); } -uint LevelGridBuilder::getNumberOfFluidNodes(unsigned int level) const +uint LevelGridBuilder::getNumberOfFluidNodes(unsigned int level) const { - return grids[level]->getNumberOfFluidNodes(); + return grids[level]->getNumberOfFluidNodes(); } GRIDGENERATOR_EXPORT uint LevelGridBuilder::getNumberOfFluidNodesBorder(unsigned int level) const @@ -473,7 +472,7 @@ void LevelGridBuilder::getSlipValues(real* normalX, real* normalY, real* normalZ for (uint index = 0; index < boundaryCondition->indices.size(); index++) { indices[allIndicesCounter] = grids[level]->getSparseIndex(boundaryCondition->indices[index]) + 1; - + normalX[allIndicesCounter] = boundaryCondition->getNormalx(index); normalY[allIndicesCounter] = boundaryCondition->getNormaly(index); normalZ[allIndicesCounter] = boundaryCondition->getNormalz(index); @@ -508,9 +507,9 @@ uint LevelGridBuilder::getStressSize(int level) const return size; } -void LevelGridBuilder::getStressValues( real* normalX, real* normalY, real* normalZ, - real* vx, real* vy, real* vz, - real* vx1, real* vy1, real* vz1, +void LevelGridBuilder::getStressValues( real* normalX, real* normalY, real* normalZ, + real* vx, real* vy, real* vz, + real* vx1, real* vy1, real* vz1, int* indices, int* samplingIndices, int* samplingOffset, real* z0, int level) const { @@ -566,7 +565,7 @@ void LevelGridBuilder::getVelocityValues(real* vx, real* vy, real* vz, int* indi { for (uint i = 0; i < (uint)boundaryCondition->indices.size(); i++) { - indices[allIndicesCounter] = grids[level]->getSparseIndex(boundaryCondition->indices[i]) +1; + indices[allIndicesCounter] = grids[level]->getSparseIndex(boundaryCondition->indices[i]) +1; vx[allIndicesCounter] = boundaryCondition->getVx(i); vy[allIndicesCounter] = boundaryCondition->getVy(i); @@ -645,23 +644,23 @@ uint LevelGridBuilder::getPrecursorSize(int level) const return size; } -void LevelGridBuilder::getPrecursorValues( uint* neighborNT, uint* neighborNB, uint* neighborST, uint* neighborSB, - real* weightsNT, real* weightsNB, real* weightsST, real* weightsSB, - int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader, - int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& nTRead, +void LevelGridBuilder::getPrecursorValues( uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM, + real* weights0PP, real* weights0PM, real* weights0MP, real* weights0MM, + int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader, + int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& timeStepsBetweenReads, real& velocityX, real& velocityY, real& velocityZ, int level) const { int allIndicesCounter = 0; int allNodesCounter = 0; - uint tmpNTRead = 0; - size_t tmpNQuantities = 0; - + uint tmpTimeStepsBetweenReads = 0; + size_t tmpNumberOfQuantities = 0; + for (auto boundaryCondition : boundaryConditions[level]->precursorBoundaryConditions) { - if( tmpNTRead == 0 ) - tmpNTRead = boundaryCondition->nTRead; - if( tmpNTRead != boundaryCondition->nTRead ) - throw std::runtime_error("All precursor boundary conditions must have the same NTRead value"); + if( tmpTimeStepsBetweenReads == 0 ) + tmpTimeStepsBetweenReads = boundaryCondition->timeStepsBetweenReads; + if( tmpTimeStepsBetweenReads != boundaryCondition->timeStepsBetweenReads ) + throw std::runtime_error("All precursor boundary conditions must have the same timeStepsBetweenReads value"); auto BCreader = boundaryCondition->getReader(); BCreader->setWritingOffset(allIndicesCounter); reader.push_back(BCreader); @@ -677,11 +676,11 @@ void LevelGridBuilder::getPrecursorValues( uint* neighborNT, uint* neighborNB, allIndicesCounter++; } BCreader->fillArrays(y, z); - BCreader->getNeighbors(neighborNT, neighborNB, neighborST, neighborSB); - BCreader->getWeights(weightsNT, weightsNB, weightsST, weightsSB); - if(tmpNQuantities == 0) - tmpNQuantities = BCreader->getNumberOfQuantities(); - if(tmpNQuantities != BCreader->getNumberOfQuantities()) + BCreader->getNeighbors(neighbor0PP, neighbor0PM, neighbor0MP, neighbor0MM); + BCreader->getWeights(weights0PP, weights0PM, weights0MP, weights0MM); + if(tmpNumberOfQuantities == 0) + tmpNumberOfQuantities = BCreader->getNumberOfQuantities(); + if(tmpNumberOfQuantities != BCreader->getNumberOfQuantities()) throw std::runtime_error("All precursor files must have the same quantities."); allNodesCounter += BCreader->getNPointsRead(); velocityX = boundaryCondition->getVelocityX(); @@ -690,13 +689,13 @@ void LevelGridBuilder::getPrecursorValues( uint* neighborNT, uint* neighborNB, } numberOfPrecursorNodes = allNodesCounter; - if (tmpNTRead == 0) - throw std::runtime_error("NTRead of precursor needs to be larger than 0."); - nTRead = tmpNTRead; - - if (tmpNQuantities == 0) + if (tmpTimeStepsBetweenReads == 0) + throw std::runtime_error("timeStepsBetweenReads of precursor needs to be larger than 0."); + timeStepsBetweenReads = tmpTimeStepsBetweenReads; + + if (tmpNumberOfQuantities == 0) throw std::runtime_error("Number of quantities in precursor needs to be larger than 0."); - numberOfQuantities = tmpNQuantities; + numberOfQuantities = tmpNumberOfQuantities; } void LevelGridBuilder::getPrecursorQs(real* qs[27], int level) const @@ -719,7 +718,7 @@ uint LevelGridBuilder::getGeometrySize(int level) const { if (boundaryConditions[level]->geometryBoundaryCondition) return (uint)boundaryConditions[level]->geometryBoundaryCondition->indices.size(); - + return 0; } @@ -740,9 +739,9 @@ void LevelGridBuilder::getGeometryValues(real* vx, real* vy, real* vz, int level { for (uint i = 0; i < boundaryConditions[level]->geometryBoundaryCondition->indices.size(); i++) { - vx[i] = boundaryConditions[level]->geometryBoundaryCondition->getVx(i); - vy[i] = boundaryConditions[level]->geometryBoundaryCondition->getVy(i); - vz[i] = boundaryConditions[level]->geometryBoundaryCondition->getVz(i); + vx[i] = boundaryConditions[level]->geometryBoundaryCondition->getVx(i); + vy[i] = boundaryConditions[level]->geometryBoundaryCondition->getVy(i); + vz[i] = boundaryConditions[level]->geometryBoundaryCondition->getVz(i); } } @@ -757,7 +756,7 @@ void LevelGridBuilder::getGeometryQs(real* qs[27], int level) const } } -void LevelGridBuilder::writeArrows(std::string fileName) const +void LevelGridBuilder::writeArrows(std::string fileName) const { QLineWriter::writeArrows(fileName, boundaryConditions[getNumberOfGridLevels() - 1]->geometryBoundaryCondition, grids[getNumberOfGridLevels() - 1]); } @@ -798,17 +797,17 @@ void LevelGridBuilder::findFluidNodes(bool splitDomain) } -void LevelGridBuilder::addFluidNodeIndicesMacroVars(std::vector<uint> fluidNodeIndicesMacroVars, uint level) +void LevelGridBuilder::addFluidNodeIndicesMacroVars(const std::vector<uint>& fluidNodeIndicesMacroVars, uint level) { grids[level]->addFluidNodeIndicesMacroVars(fluidNodeIndicesMacroVars); } -void LevelGridBuilder::addFluidNodeIndicesApplyBodyForce(std::vector<uint> fluidNodeIndicesApplyBodyForce, uint level) +void LevelGridBuilder::addFluidNodeIndicesApplyBodyForce(const std::vector<uint>& fluidNodeIndicesApplyBodyForce, uint level) { grids[level]->addFluidNodeIndicesApplyBodyForce(fluidNodeIndicesApplyBodyForce); } -void LevelGridBuilder::addFluidNodeIndicesAllFeatures(std::vector<uint> fluidNodeIndicesAllFeatures, uint level) +void LevelGridBuilder::addFluidNodeIndicesAllFeatures(const std::vector<uint>& fluidNodeIndicesAllFeatures, uint level) { grids[level]->addFluidNodeIndicesAllFeatures(fluidNodeIndicesAllFeatures); } @@ -828,17 +827,17 @@ void LevelGridBuilder::sortFluidNodeIndicesAllFeatures(uint level) grids[level]->sortFluidNodeIndicesAllFeatures(); } -uint LevelGridBuilder::getNumberOfFluidNodesMacroVars(unsigned int level) const +uint LevelGridBuilder::getNumberOfFluidNodesMacroVars(unsigned int level) const { return grids[level]->getNumberOfFluidNodeIndicesMacroVars(); } -void LevelGridBuilder::getFluidNodeIndicesMacroVars(uint *fluidNodeIndicesMacroVars, const int level) const +void LevelGridBuilder::getFluidNodeIndicesMacroVars(uint *fluidNodeIndicesMacroVars, const int level) const { grids[level]->getFluidNodeIndicesMacroVars(fluidNodeIndicesMacroVars); } -uint LevelGridBuilder::getNumberOfFluidNodesApplyBodyForce(unsigned int level) const +uint LevelGridBuilder::getNumberOfFluidNodesApplyBodyForce(unsigned int level) const { return grids[level]->getNumberOfFluidNodeIndicesApplyBodyForce(); } @@ -856,4 +855,4 @@ uint LevelGridBuilder::getNumberOfFluidNodesAllFeatures(unsigned int level) cons void LevelGridBuilder::getFluidNodeIndicesAllFeatures(uint *fluidNodeIndicesAllFeatures, const int level) const { grids[level]->getFluidNodeIndicesAllFeatures(fluidNodeIndicesAllFeatures); -} \ No newline at end of file +} diff --git a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h index cc6f31800c2e55ca604ff2f223475ba54d3afd56..2e0eaf13080c46260de2a0c845fbf784a2cc3e09 100644 --- a/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h +++ b/src/gpu/GridGenerator/grid/GridBuilder/LevelGridBuilder.h @@ -1,28 +1,28 @@ //======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ // \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ // -// This file is part of VirtualFluids. VirtualFluids is free software: you can +// 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 +// 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 +// +// 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/>. // @@ -38,6 +38,8 @@ #include <memory> #include <array> +#include <lbm/constants/NumericConstants.h> + #include "gpu/GridGenerator/global.h" #include "gpu/GridGenerator/grid/GridBuilder/GridBuilder.h" @@ -45,6 +47,8 @@ #include "gpu/GridGenerator/grid/GridInterface.h" #include "gpu/GridGenerator/grid/NodeValues.h" +using namespace vf::lbm::constant; + struct Vertex; class Grid; class Transformator; @@ -64,8 +68,6 @@ enum class SideType; class TransientBCInputFileReader; class FileCollection; - - class LevelGridBuilder : public GridBuilder { protected: @@ -84,8 +86,9 @@ public: GRIDGENERATOR_EXPORT void setPressureBoundaryCondition(SideType sideType, real rho); GRIDGENERATOR_EXPORT void setPeriodicBoundaryCondition(bool periodic_X, bool periodic_Y, bool periodic_Z); GRIDGENERATOR_EXPORT void setNoSlipBoundaryCondition(SideType sideType); - GRIDGENERATOR_EXPORT void setPrecursorBoundaryCondition(SideType sideType, SPtr<FileCollection> fileCollection, int nTRead, real velocityX=0.0f, real velocityY=0.0f, real velocityZ=0.0f, - std::vector<uint> fileLevelToGridLevelMap = {}); + GRIDGENERATOR_EXPORT void setPrecursorBoundaryCondition(SideType sideType, SPtr<FileCollection> fileCollection, int timeStepsBetweenReads, + real velocityX=c0o1, real velocityY=c0o1, real velocityZ=c0o1, + std::vector<uint> fileLevelToGridLevelMap = {}); GRIDGENERATOR_EXPORT void setEnableFixRefinementIntoTheWall(bool enableFixRefinementIntoTheWall); @@ -103,7 +106,7 @@ public: GRIDGENERATOR_EXPORT virtual void getFluidNodeIndicesBorder(uint *fluidNodeIndices, const int level) const override; GRIDGENERATOR_EXPORT virtual void getNodeValues(real *xCoords, real *yCoords, real *zCoords, - uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, + uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, uint *geo, const int level) const override; GRIDGENERATOR_EXPORT virtual void getDimensions(int &nx, int &ny, int &nz, const int level) const override; @@ -113,12 +116,12 @@ public: GRIDGENERATOR_EXPORT virtual void getSlipQs(real* qs[27], int level) const override; GRIDGENERATOR_EXPORT uint getStressSize(int level) const override; - GRIDGENERATOR_EXPORT virtual void getStressValues( real* normalX, real* normalY, real* normalZ, - real* vx, real* vy, real* vz, - real* vx1, real* vy1, real* vz1, + GRIDGENERATOR_EXPORT virtual void getStressValues( real* normalX, real* normalY, real* normalZ, + real* vx, real* vy, real* vz, + real* vx1, real* vy1, real* vz1, int* indices, int* samplingIndices, int* samplingOffsets, real* z0, int level) const override; GRIDGENERATOR_EXPORT virtual void getStressQs(real* qs[27], int level) const override; - + GRIDGENERATOR_EXPORT uint getVelocitySize(int level) const override; GRIDGENERATOR_EXPORT virtual void getVelocityValues(real* vx, real* vy, real* vz, int* indices, int level) const override; GRIDGENERATOR_EXPORT virtual void getVelocityQs(real* qs[27], int level) const override; @@ -128,10 +131,10 @@ public: GRIDGENERATOR_EXPORT virtual void getPressureQs(real* qs[27], int level) const override; GRIDGENERATOR_EXPORT uint getPrecursorSize(int level) const override; - GRIDGENERATOR_EXPORT void getPrecursorValues( uint* neighborNT, uint* neighborNB, uint* neighborST, uint* neighborSB, - real* weightsNT, real* weightsNB, real* weightsST, real* weightsSB, - int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader, - int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& nTRead, + GRIDGENERATOR_EXPORT void getPrecursorValues( uint* neighbor0PP, uint* neighbor0PM, uint* neighbor0MP, uint* neighbor0MM, + real* weights0PP, real* weights0PM, real* weights0MP, real* weights0MM, + int* indices, std::vector<SPtr<TransientBCInputFileReader>>& reader, + int& numberOfPrecursorNodes, size_t& numberOfQuantities, uint& timeStepsBetweenReads, real& velocityX, real& velocityY, real& velocityZ, int level) const override; GRIDGENERATOR_EXPORT virtual void getPrecursorQs(real* qs[27], int level) const override; @@ -147,11 +150,11 @@ public: GRIDGENERATOR_EXPORT SPtr<GeometryBoundaryCondition> getGeometryBoundaryCondition(uint level) const override; protected: - + struct BoundaryConditions { - BoundaryConditions() = default; + BoundaryConditions() = default; std::vector<SPtr<SlipBoundaryCondition>> slipBoundaryConditions; @@ -171,7 +174,7 @@ protected: std::vector<std::shared_ptr<Grid> > grids; std::vector<SPtr<BoundaryConditions> > boundaryConditions; - + std::array<uint, 6> communicationProcesses; void checkLevel(int level); @@ -211,10 +214,10 @@ public: // needed for CUDA Streams MultiGPU (Communication Hiding) void findFluidNodes(bool splitDomain) override; - void addFluidNodeIndicesMacroVars(std::vector<uint> fluidNodeIndicesMacroVars, uint level) override; - void addFluidNodeIndicesApplyBodyForce(std::vector<uint> fluidNodeIndicesApplyBodyForce, uint level) override; - void addFluidNodeIndicesAllFeatures(std::vector<uint> fluidNodeIndicesAllFeatures, uint level) override; - + void addFluidNodeIndicesMacroVars(const std::vector<uint>& fluidNodeIndicesMacroVars, uint level) override; + void addFluidNodeIndicesApplyBodyForce(const std::vector<uint>& fluidNodeIndicesApplyBodyForce, uint level) override; + void addFluidNodeIndicesAllFeatures(const std::vector<uint>& fluidNodeIndicesAllFeatures, uint level) override; + void sortFluidNodeIndicesMacroVars(uint level) override; void sortFluidNodeIndicesApplyBodyForce(uint level) override; void sortFluidNodeIndicesAllFeatures(uint level) override; @@ -228,4 +231,3 @@ public: }; #endif - diff --git a/src/gpu/GridGenerator/grid/GridImp.cpp b/src/gpu/GridGenerator/grid/GridImp.cpp index 24dd169e70288b9ae18a29c23dc0c74b14246e3f..05c684410166e329ba63bbe3bdbf0c09e3a881ab 100644 --- a/src/gpu/GridGenerator/grid/GridImp.cpp +++ b/src/gpu/GridGenerator/grid/GridImp.cpp @@ -1,28 +1,28 @@ //======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ // \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ // -// This file is part of VirtualFluids. VirtualFluids is free software: you can +// 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 +// 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 +// +// 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/>. // @@ -33,7 +33,6 @@ #include "GridImp.h" #include <iostream> -#include <omp.h> #include <sstream> # include <algorithm> #include <cmath> @@ -61,8 +60,8 @@ int DIRECTIONS[DIR_END_MAX][DIMENSION]; using namespace vf::gpu; -GridImp::GridImp(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, Distribution distribution, uint level) - : object(object), +GridImp::GridImp(Object* object, real startX, real startY, real startZ, real endX, real endY, real endZ, real delta, Distribution distribution, uint level) + : object(object), startX(startX), startY(startY), startZ(startZ), @@ -135,7 +134,7 @@ void GridImp::inital(const SPtr<Grid> fineGrid, uint numberOfLayers) #pragma omp parallel for for (int index = 0; index < (int)this->size; index++) this->initalNodeToOutOfGrid(index); - + if( this->innerRegionFromFinerGrid ){ *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start setInnerBasedOnFinerGrid()\n"; this->setInnerBasedOnFinerGrid(fineGrid); @@ -147,12 +146,12 @@ void GridImp::inital(const SPtr<Grid> fineGrid, uint numberOfLayers) *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start addOverlap()\n"; this->addOverlap(); - + *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start fixOddCells()\n"; #pragma omp parallel for for (int index = 0; index < (int)this->size; index++) this->fixOddCell(index); - + if( enableFixRefinementIntoTheWall ) { *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start fixRefinementIntoWall()\n"; @@ -180,12 +179,12 @@ void GridImp::inital(const SPtr<Grid> fineGrid, uint numberOfLayers) } } } - + *logging::out << logging::Logger::INFO_INTERMEDIATE << "Start findEndOfGridStopperNodes()\n"; #pragma omp parallel for for (int index = 0; index < (int)this->size; index++) this->findEndOfGridStopperNode(index); - + *logging::out << logging::Logger::INFO_INTERMEDIATE << "Grid created: " << "from (" << this->startX << ", " << this->startY << ", " << this->startZ << ") to (" << this->endX << ", " << this->endY << ", " << this->endZ << ")\n" << "nodes: " << this->nx << " x " << this->ny << " x " << this->nz << " = " << this->size << "\n"; @@ -209,9 +208,9 @@ void GridImp::freeMemory() if( this->neighborIndexZ != nullptr ) { delete[] this->neighborIndexZ; this->neighborIndexZ = nullptr; } if( this->neighborIndexNegative != nullptr ) { delete[] this->neighborIndexNegative; this->neighborIndexNegative = nullptr; } if( this->sparseIndices != nullptr ) { delete[] this->sparseIndices; this->sparseIndices = nullptr; } - if( this->qIndices != nullptr ) { delete[] this->qIndices; this->qIndices = nullptr; } - if( this->qValues != nullptr ) { delete[] this->qValues; this->qValues = nullptr; } - if( this->qPatches != nullptr ) { delete[] this->qPatches; this->qPatches = nullptr; } + if( this->qIndices != nullptr ) { delete[] this->qIndices; this->qIndices = nullptr; } + if( this->qValues != nullptr ) { delete[] this->qValues; this->qValues = nullptr; } + if( this->qPatches != nullptr ) { delete[] this->qPatches; this->qPatches = nullptr; } field.freeMemory(); } @@ -254,7 +253,7 @@ void GridImp::discretize(Object* solidObject, char innerType, char outerType) this->sparseIndices[index] = index; if( this->getFieldEntry(index) == innerType ) continue; - + real x, y, z; this->transIndexToCoords(index, x, y, z); @@ -279,7 +278,7 @@ bool GridImp::isInside(const Cell& cell) const // | +-----+-----+-----+ | +-----+-----+-----+ // +---------+ +---------+ // 0 1 2 0 1 2 -// even even even +// even even even // odd odd odd // Cell GridImp::getOddCellFromIndex(uint index) const @@ -349,7 +348,7 @@ void GridImp::addOverlap() void GridImp::setOverlapTmp( uint index ) { if( this->field.is( index, INVALID_OUT_OF_GRID ) ){ - + if( this->hasNeighborOfType(index, FLUID) ){ this->field.setFieldEntry( index, OVERLAP_TMP ); } @@ -380,7 +379,7 @@ void GridImp::fixRefinementIntoWall(uint xIndex, uint yIndex, uint zIndex, int d if( this->xOddStart && ( dir == 1 || dir == -1 ) && ( xIndex % 2 == 0 && xIndex != 0 ) ) return; if( this->yOddStart && ( dir == 2 || dir == -2 ) && ( yIndex % 2 == 0 && yIndex != 0 ) ) return; if( this->zOddStart && ( dir == 3 || dir == -3 ) && ( zIndex % 2 == 0 && zIndex != 0 ) ) return; - + ////////////////////////////////////////////////////////////////////////// real dx{ 0.0 }, dy{ 0.0 }, dz{ 0.0 }; @@ -433,31 +432,31 @@ void GridImp::findStopperNode(uint index) // deprecated void GridImp::findEndOfGridStopperNode(uint index) { - if (isValidEndOfGridStopper(index)){ + if (isValidEndOfGridStopper(index)){ if( this->level != 0 ) - this->field.setFieldEntryToStopperOutOfGrid(index); + this->field.setFieldEntryToStopperOutOfGrid(index); else this->field.setFieldEntryToStopperOutOfGridBoundary(index); } - - if (isValidEndOfGridBoundaryStopper(index)) - this->field.setFieldEntryToStopperOutOfGridBoundary(index); + + if (isValidEndOfGridBoundaryStopper(index)) + this->field.setFieldEntryToStopperOutOfGridBoundary(index); } void GridImp::findSolidStopperNode(uint index) { - if (isValidSolidStopper(index)) - this->field.setFieldEntry(index, STOPPER_SOLID); + if (isValidSolidStopper(index)) + this->field.setFieldEntry(index, STOPPER_SOLID); } void GridImp::findBoundarySolidNode(uint index) { - if (shouldBeBoundarySolidNode(index)) - { - this->field.setFieldEntry(index, BC_SOLID); - this->qIndices[index] = this->numberOfSolidBoundaryNodes++; - //grid->setNumberOfSolidBoundaryNodes(grid->getNumberOfSolidBoundaryNodes() + 1); - } + if (shouldBeBoundarySolidNode(index)) + { + this->field.setFieldEntry(index, BC_SOLID); + this->qIndices[index] = this->numberOfSolidBoundaryNodes++; + //grid->setNumberOfSolidBoundaryNodes(grid->getNumberOfSolidBoundaryNodes() + 1); + } } void GridImp::fixOddCell(uint index) @@ -483,9 +482,9 @@ bool GridImp::isOutSideOfGrid(Cell &cell) const bool GridImp::contains(Cell &cell, char type) const { for (const auto point : cell) { - uint index = transCoordToIndex(point.x, point.y, point.z); - if (index == INVALID_INDEX) - continue; + uint index = transCoordToIndex(point.x, point.y, point.z); + if (index == INVALID_INDEX) + continue; if (field.is(index, type)) return true; } @@ -495,8 +494,8 @@ bool GridImp::contains(Cell &cell, char type) const bool GridImp::cellContainsOnly(Cell &cell, char type) const { for (const auto point : cell) { - uint index = transCoordToIndex(point.x, point.y, point.z); - if (index == INVALID_INDEX) + uint index = transCoordToIndex(point.x, point.y, point.z); + if (index == INVALID_INDEX) return false; if (!field.is(index, type)) return false; @@ -507,8 +506,8 @@ bool GridImp::cellContainsOnly(Cell &cell, char type) const bool GridImp::cellContainsOnly(Cell &cell, char typeA, char typeB) const { for (const auto point : cell) { - uint index = transCoordToIndex(point.x, point.y, point.z); - if (index == INVALID_INDEX) + uint index = transCoordToIndex(point.x, point.y, point.z); + if (index == INVALID_INDEX) return false; if (!field.is(index, typeA) && !field.is(index, typeB)) return false; @@ -524,91 +523,91 @@ const Object * GridImp::getObject() const void GridImp::setNodeTo(Cell &cell, char type) { for (const auto point : cell) { - uint index = transCoordToIndex(point.x, point.y, point.z); - if (index == INVALID_INDEX) - continue; - field.setFieldEntry(index, type); + uint index = transCoordToIndex(point.x, point.y, point.z); + if (index == INVALID_INDEX) + continue; + field.setFieldEntry(index, type); } } void GridImp::setNodeTo(uint index, char type) { - if( index != INVALID_INDEX ) - field.setFieldEntry(index, type); + if( index != INVALID_INDEX ) + field.setFieldEntry(index, type); } bool GridImp::isNode(uint index, char type) const { if( index != INVALID_INDEX ) - return field.is(index, type); + return field.is(index, type); throw std::runtime_error("GridImp::isNode() -> index == INVALID_INDEX not supported."); } bool GridImp::isValidEndOfGridStopper(uint index) const { - // Lenz: also includes corner stopper nodes - if (!this->field.is(index, INVALID_OUT_OF_GRID)) - return false; + // Lenz: also includes corner stopper nodes + if (!this->field.is(index, INVALID_OUT_OF_GRID)) + return false; - return hasNeighborOfType(index, FLUID); + return hasNeighborOfType(index, FLUID); } bool GridImp::isValidEndOfGridBoundaryStopper(uint index) const { - // Lenz: also includes corner stopper nodes - if (!this->field.is(index, FLUID)) - return false; + // Lenz: also includes corner stopper nodes + if (!this->field.is(index, FLUID)) + return false; - return ! hasAllNeighbors(index); + return ! hasAllNeighbors(index); } bool GridImp::isValidSolidStopper(uint index) const { - // Lenz: also includes corner stopper nodes - if (!this->field.is(index, INVALID_SOLID)) - return false; + // Lenz: also includes corner stopper nodes + if (!this->field.is(index, INVALID_SOLID)) + return false; - return hasNeighborOfType(index, FLUID); + return hasNeighborOfType(index, FLUID); } bool GridImp::shouldBeBoundarySolidNode(uint index) const { - if (!this->field.is(index, FLUID)) - return false; + if (!this->field.is(index, FLUID)) + return false; - return hasNeighborOfType(index, STOPPER_SOLID); + return hasNeighborOfType(index, STOPPER_SOLID); } bool GridImp::hasAllNeighbors(uint index) const { - // new version by Lenz, utilizes the range based for loop for all directions - real x, y, z; - this->transIndexToCoords(index, x, y, z); - for (const auto dir : this->distribution) { - const uint neighborIndex = this->transCoordToIndex(x + dir[0] * this->getDelta(), y + dir[1] * this->getDelta(), z + dir[2] * this->getDelta()); + // new version by Lenz, utilizes the range based for loop for all directions + real x, y, z; + this->transIndexToCoords(index, x, y, z); + for (const auto dir : this->distribution) { + const uint neighborIndex = this->transCoordToIndex(x + dir[0] * this->getDelta(), y + dir[1] * this->getDelta(), z + dir[2] * this->getDelta()); - if (neighborIndex == INVALID_INDEX) return false; - } + if (neighborIndex == INVALID_INDEX) return false; + } - return true; + return true; } bool GridImp::hasNeighborOfType(uint index, char type) const { - // new version by Lenz, utilizes the range based for loop for all directions - real x, y, z; - this->transIndexToCoords(index, x, y, z); - for (const auto dir : this->distribution) { - const uint neighborIndex = this->transCoordToIndex(x + dir[0] * this->getDelta(), y + dir[1] * this->getDelta(), z + dir[2] * this->getDelta()); + // new version by Lenz, utilizes the range based for loop for all directions + real x, y, z; + this->transIndexToCoords(index, x, y, z); + for (const auto dir : this->distribution) { + const uint neighborIndex = this->transCoordToIndex(x + dir[0] * this->getDelta(), y + dir[1] * this->getDelta(), z + dir[2] * this->getDelta()); - if (neighborIndex == INVALID_INDEX) continue; + if (neighborIndex == INVALID_INDEX) continue; - if (this->field.is(neighborIndex, type)) - return true; - } + if (this->field.is(neighborIndex, type)) + return true; + } - return false; + return false; } bool GridImp::nodeInNextCellIs(int index, char type) const @@ -630,13 +629,13 @@ bool GridImp::nodeInNextCellIs(int index, char type) const const uint indexXYZ = transCoordToIndex(neighborX, neighborY, neighborZ); - const bool typeX = indexX == INVALID_INDEX ? false : this->field.is(indexX, type); - const bool typeY = indexY == INVALID_INDEX ? false : this->field.is(indexY, type); - const bool typeXY = indexXY == INVALID_INDEX ? false : this->field.is(indexXY, type); - const bool typeZ = indexZ == INVALID_INDEX ? false : this->field.is(indexZ, type); - const bool typeYZ = indexYZ == INVALID_INDEX ? false : this->field.is(indexYZ, type); - const bool typeXZ = indexXZ == INVALID_INDEX ? false : this->field.is(indexXZ, type); - const bool typeXYZ = indexXYZ == INVALID_INDEX ? false : this->field.is(indexXYZ, type); + const bool typeX = indexX == INVALID_INDEX ? false : this->field.is(indexX, type); + const bool typeY = indexY == INVALID_INDEX ? false : this->field.is(indexY, type); + const bool typeXY = indexXY == INVALID_INDEX ? false : this->field.is(indexXY, type); + const bool typeZ = indexZ == INVALID_INDEX ? false : this->field.is(indexZ, type); + const bool typeYZ = indexYZ == INVALID_INDEX ? false : this->field.is(indexYZ, type); + const bool typeXZ = indexXZ == INVALID_INDEX ? false : this->field.is(indexXZ, type); + const bool typeXYZ = indexXYZ == INVALID_INDEX ? false : this->field.is(indexXYZ, type); return typeX || typeY || typeXY || typeZ || typeYZ || typeXZ || typeXYZ; @@ -661,13 +660,13 @@ bool GridImp::nodeInPreviousCellIs(int index, char type) const const uint indexXYZ = transCoordToIndex(neighborX, neighborY, neighborZ); - const bool typeX = indexX == INVALID_INDEX ? false : this->field.is(indexX , type); - const bool typeY = indexY == INVALID_INDEX ? false : this->field.is(indexY , type); - const bool typeXY = indexXY == INVALID_INDEX ? false : this->field.is(indexXY , type); - const bool typeZ = indexZ == INVALID_INDEX ? false : this->field.is(indexZ , type); - const bool typeYZ = indexYZ == INVALID_INDEX ? false : this->field.is(indexYZ , type); - const bool typeXZ = indexXZ == INVALID_INDEX ? false : this->field.is(indexXZ , type); - const bool typeXYZ = indexXYZ == INVALID_INDEX ? false : this->field.is(indexXYZ, type); + const bool typeX = indexX == INVALID_INDEX ? false : this->field.is(indexX , type); + const bool typeY = indexY == INVALID_INDEX ? false : this->field.is(indexY , type); + const bool typeXY = indexXY == INVALID_INDEX ? false : this->field.is(indexXY , type); + const bool typeZ = indexZ == INVALID_INDEX ? false : this->field.is(indexZ , type); + const bool typeYZ = indexYZ == INVALID_INDEX ? false : this->field.is(indexYZ , type); + const bool typeXZ = indexXZ == INVALID_INDEX ? false : this->field.is(indexXZ , type); + const bool typeXYZ = indexXYZ == INVALID_INDEX ? false : this->field.is(indexXYZ, type); return typeX || typeY || typeXY || typeZ || typeYZ || typeXZ || typeXYZ; @@ -678,8 +677,8 @@ bool GridImp::nodeInCellIs(Cell& cell, char type) const for (const auto node : cell) { const uint index = transCoordToIndex(node.x, node.y, node.z); - if (index == INVALID_INDEX) - continue; + if (index == INVALID_INDEX) + continue; if (field.is(index, type)) return true; } @@ -696,9 +695,9 @@ void GridImp::setCellTo(uint index, char type) for (const auto node : cell) { const uint nodeIndex = transCoordToIndex(node.x, node.y, node.z); - if (nodeIndex == INVALID_INDEX) - continue; - this->field.setFieldEntry(nodeIndex, type); + if (nodeIndex == INVALID_INDEX) + continue; + this->field.setFieldEntry(nodeIndex, type); } } @@ -712,10 +711,10 @@ void GridImp::setNonStopperOutOfGridCellTo(uint index, char type) for (const auto node : cell) { const uint nodeIndex = transCoordToIndex(node.x, node.y, node.z); - if (nodeIndex == INVALID_INDEX) - continue; + if (nodeIndex == INVALID_INDEX) + continue; - if( this->getFieldEntry( nodeIndex ) != STOPPER_OUT_OF_GRID && + if( this->getFieldEntry( nodeIndex ) != STOPPER_OUT_OF_GRID && this->getFieldEntry( nodeIndex ) != STOPPER_OUT_OF_GRID_BOUNDARY ) this->field.setFieldEntry(nodeIndex, type); } @@ -770,7 +769,7 @@ uint GridImp::transCoordToIndex(const real &x, const real &y, const real &z) con const uint yIndex = getYIndex(y); const uint zIndex = getZIndex(z); - if (xIndex >= nx || yIndex >= ny || zIndex >= nz) + if (xIndex >= nx || yIndex >= ny || zIndex >= nz) return INVALID_INDEX; return xIndex + nx * (yIndex + ny * zIndex); @@ -819,20 +818,20 @@ TriangularMeshDiscretizationStrategy * GridImp::getTriangularMeshDiscretizationS uint GridImp::getNumberOfSolidBoundaryNodes() const { - return this->numberOfSolidBoundaryNodes; + return this->numberOfSolidBoundaryNodes; } void GridImp::setNumberOfSolidBoundaryNodes(uint numberOfSolidBoundaryNodes) { - if (numberOfSolidBoundaryNodes < INVALID_INDEX) - this->numberOfSolidBoundaryNodes = numberOfSolidBoundaryNodes; + if (numberOfSolidBoundaryNodes < INVALID_INDEX) + this->numberOfSolidBoundaryNodes = numberOfSolidBoundaryNodes; } real GridImp::getQValue(const uint index, const uint dir) const { - const int qIndex = dir * this->numberOfSolidBoundaryNodes + this->qIndices[index]; + const int qIndex = dir * this->numberOfSolidBoundaryNodes + this->qIndices[index]; - return this->qValues[qIndex]; + return this->qValues[qIndex]; } uint GridImp::getQPatch(const uint index) const @@ -858,7 +857,7 @@ void GridImp::findSparseIndices(SPtr<Grid> finerGrid) { *logging::out << logging::Logger::INFO_INTERMEDIATE << "Find sparse indices..."; auto fineGrid = std::static_pointer_cast<GridImp>(finerGrid); - + this->updateSparseIndices(); #pragma omp parallel for @@ -906,7 +905,7 @@ void GridImp::updateSparseIndices() sparseSize = size - removedNodes; } -void GridImp::findFluidNodeIndices(bool splitDomain) +void GridImp::findFluidNodeIndices(bool splitDomain) { // find sparse index of all fluid nodes this->fluidNodeIndices.clear(); @@ -935,7 +934,7 @@ void GridImp::findFluidNodeIndicesBorder() { // resize fluidNodeIndicesBorder (for better performance in copy operation) size_t newSize = 0; for (CommunicationIndices& ci : this->communicationIndices) - newSize += ci.sendIndices.size(); + newSize += ci.sendIndices.size(); this->fluidNodeIndicesBorder.reserve(newSize); // copy all send indices to fluidNodeIndicesBorder @@ -968,7 +967,7 @@ void GridImp::setNeighborIndices(uint index) this->setStopperNeighborCoords(index); return; } - + if (this->sparseIndices[index] == -1) return; @@ -1002,9 +1001,9 @@ void GridImp::setStopperNeighborCoords(uint index) if (vf::Math::lessEqual(z + delta, endZ + (0.5 * delta)) && !this->field.isInvalidOutOfGrid(this->transCoordToIndex(x, y, z + delta))) neighborIndexZ[index] = getSparseIndex(x, y, z + delta); - if (vf::Math::greaterEqual(x - delta, endX) && - vf::Math::greaterEqual(y - delta, endY) && - vf::Math::greaterEqual(z - delta, endZ) && + if (vf::Math::greaterEqual(x - delta, endX) && + vf::Math::greaterEqual(y - delta, endY) && + vf::Math::greaterEqual(z - delta, endZ) && !this->field.isInvalidOutOfGrid(this->transCoordToIndex(x - delta, y - delta, z - delta))) { neighborIndexNegative[index] = getSparseIndex(x - delta, y - delta, z - delta); @@ -1035,7 +1034,7 @@ real GridImp::getNeighborCoord(bool periodicity, real startCoord, real coords[3] return coords[direction] + delta; } - + return coords[direction] + delta; } @@ -1061,7 +1060,7 @@ real GridImp::getNegativeNeighborCoord(bool periodicity, real startCoord, real c return getLastFluidNode(coords, direction, startCoord); } - + return coords[direction] - delta; } @@ -1154,15 +1153,15 @@ void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox, LbmOrGks lbmOrGks // one layer for receive nodes and one for stoppers if( lbmOrGks == LBM ) tmpSubDomainBox.extend(this->delta); - - if (!tmpSubDomainBox.isInside(x, y, z) + + if (!tmpSubDomainBox.isInside(x, y, z) && ( this->getFieldEntry(index) == FLUID || this->getFieldEntry(index) == FLUID_CFC || this->getFieldEntry(index) == FLUID_CFF || this->getFieldEntry(index) == FLUID_FCC || this->getFieldEntry(index) == FLUID_FCF || this->getFieldEntry(index) == BC_SOLID ) ) - { + { this->setFieldEntry(index, STOPPER_OUT_OF_GRID_BOUNDARY); } } @@ -1184,13 +1183,13 @@ void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox, LbmOrGks lbmOrGks void GridImp::findGridInterfaceCF(uint index, GridImp& finerGrid, LbmOrGks lbmOrGks) { - if (lbmOrGks == LBM) - { - gridInterface->findInterfaceCF (index, this, &finerGrid); - gridInterface->findBoundaryGridInterfaceCF(index, this, &finerGrid); - } - else if (lbmOrGks == GKS) - gridInterface->findInterfaceCF_GKS(index, this, &finerGrid); + if (lbmOrGks == LBM) + { + gridInterface->findInterfaceCF (index, this, &finerGrid); + gridInterface->findBoundaryGridInterfaceCF(index, this, &finerGrid); + } + else if (lbmOrGks == GKS) + gridInterface->findInterfaceCF_GKS(index, this, &finerGrid); } void GridImp::findGridInterfaceFC(uint index, GridImp& finerGrid) @@ -1217,16 +1216,16 @@ void GridImp::mesh(Object* object) if (triangularMesh) triangularMeshDiscretizationStrategy->discretize(triangularMesh, this, INVALID_SOLID, FLUID); else - //new method for geometric primitives (not cell based) to be implemented + //new method for geometric primitives (not cell based) to be implemented this->discretize(object, INVALID_SOLID, FLUID); this->closeNeedleCells(); - #pragma omp parallel for + #pragma omp parallel for for (int index = 0; index < (int)this->size; index++) this->findSolidStopperNode(index); - //#pragma omp parallel for + //#pragma omp parallel for for (int index = 0; index < (int)this->size; index++) { this->findBoundarySolidNode(index); } @@ -1359,7 +1358,7 @@ void GridImp::findQs(Object* object) //TODO: enable qs for primitive objects findQsPrimitive(object); } -void GridImp::allocateQs() +void GridImp::allocateQs() { this->qPatches = new uint[this->getNumberOfSolidBoundaryNodes()]; @@ -1379,8 +1378,8 @@ void GridImp::findQs(TriangularMesh &triangularMesh) if( this->qComputationStage == qComputationStageType::ComputeQs ) allocateQs(); - - + + #pragma omp parallel for for (int i = 0; i < triangularMesh.size; i++) this->findQs(triangularMesh.triangles[i]); @@ -1406,15 +1405,15 @@ void GridImp::findQs(Triangle &triangle) //if (!field.isFluid(index)) // continue; - if( index == INVALID_INDEX ) continue; + if( index == INVALID_INDEX ) continue; const Vertex point(x, y, z); if( this->qComputationStage == qComputationStageType::ComputeQs ){ if(this->field.is(index, BC_SOLID)) { - calculateQs(index, point, triangle); - } + calculateQs(index, point, triangle); + } } else if( this->qComputationStage == qComputationStageType::FindSolidBoundaryNodes ) { @@ -1449,14 +1448,14 @@ void GridImp::findQsPrimitive(Object * object) real x,y,z; this->transIndexToCoords(index,x,y,z); - + const Vertex point(x, y, z); if( this->qComputationStage == qComputationStageType::ComputeQs ){ if(this->field.is(index, BC_SOLID)) { - calculateQs(index, point, object); - } + calculateQs(index, point, object); + } } else if( this->qComputationStage == qComputationStageType::FindSolidBoundaryNodes ) { @@ -1477,66 +1476,66 @@ void GridImp::calculateQs(const uint index, const Vertex &point, Object* object) { Vertex pointOnTriangle, direction; - real subdistance; - int error; - for (int i = distribution.dir_start; i <= distribution.dir_end; i++) - { - direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), + real subdistance; + int error; + for (int i = distribution.dir_start; i <= distribution.dir_end; i++) + { + direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), real(distribution.dirs[i * DIMENSION + 1]), - real(distribution.dirs[i * DIMENSION + 2]) ); + real(distribution.dirs[i * DIMENSION + 2]) ); - uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta, - point.y + direction.y * this->delta, - point.z + direction.z * this->delta); + uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta, + point.y + direction.y * this->delta, + point.z + direction.z * this->delta); - if (neighborIndex == INVALID_INDEX) continue; + if (neighborIndex == INVALID_INDEX) continue; - error = object->getIntersection(point, direction, pointOnTriangle, subdistance); + error = object->getIntersection(point, direction, pointOnTriangle, subdistance); - subdistance /= this->delta; + subdistance /= this->delta; - if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0)) - { - if ( -0.5 > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] || + if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0)) + { + if ( -0.5 > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] || subdistance < this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] ) - { + { + + this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance; - this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance; - this->qPatches[ this->qIndices[index] ] = 0; - } - } - } + } + } + } } bool GridImp::checkIfAtLeastOneValidQ(const uint index, const Vertex &point, Object* object) const { Vertex pointOnTriangle, direction; - real subdistance; - int error; - for (int i = distribution.dir_start; i <= distribution.dir_end; i++) - { - direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), + real subdistance; + int error; + for (int i = distribution.dir_start; i <= distribution.dir_end; i++) + { + direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), real(distribution.dirs[i * DIMENSION + 1]), - real(distribution.dirs[i * DIMENSION + 2]) ); + real(distribution.dirs[i * DIMENSION + 2]) ); - uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta, - point.y + direction.y * this->delta, - point.z + direction.z * this->delta); + uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta, + point.y + direction.y * this->delta, + point.z + direction.z * this->delta); - if (neighborIndex == INVALID_INDEX) continue; + if (neighborIndex == INVALID_INDEX) continue; - error = object->getIntersection(point, direction, pointOnTriangle, subdistance); + error = object->getIntersection(point, direction, pointOnTriangle, subdistance); - subdistance /= this->delta; + subdistance /= this->delta; - if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0)) - { - return true; - } - } + if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0)) + { + return true; + } + } return false; } @@ -1565,7 +1564,7 @@ void GridImp::calculateQs(const Vertex &point, const Triangle &triangle) const error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance); - subdistance /= this->delta; + subdistance /= this->delta; if (error == 0 && subdistance < 1.0 && subdistance > 0.0) { @@ -1577,71 +1576,71 @@ void GridImp::calculateQs(const Vertex &point, const Triangle &triangle) const void GridImp::calculateQs(const uint index, const Vertex &point, const Triangle &triangle) const { - Vertex pointOnTriangle, direction; - real subdistance; - int error; - for (int i = distribution.dir_start; i <= distribution.dir_end; i++) - { + Vertex pointOnTriangle, direction; + real subdistance; + int error; + for (int i = distribution.dir_start; i <= distribution.dir_end; i++) + { #if defined(__CUDA_ARCH__) - direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]); + direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]); #else - direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), + direction = Vertex( real(distribution.dirs[i * DIMENSION + 0]), real(distribution.dirs[i * DIMENSION + 1]), - real(distribution.dirs[i * DIMENSION + 2]) ); + real(distribution.dirs[i * DIMENSION + 2]) ); #endif - uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta, - point.y + direction.y * this->delta, - point.z + direction.z * this->delta); + uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta, + point.y + direction.y * this->delta, + point.z + direction.z * this->delta); - if (neighborIndex == INVALID_INDEX) continue; + if (neighborIndex == INVALID_INDEX) continue; - error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance); + error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance); - subdistance /= this->delta; + subdistance /= this->delta; - if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0)) - { - if ( -0.5 > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] || + if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0)) + { + if ( -0.5 > this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] || subdistance < this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] ) - { - this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance; + { + this->qValues[i*this->numberOfSolidBoundaryNodes + this->qIndices[index]] = subdistance; this->qPatches[ this->qIndices[index] ] = triangle.patchIndex; - } - } - } + } + } + } } bool GridImp::checkIfAtLeastOneValidQ(const uint index, const Vertex & point, const Triangle & triangle) const { - Vertex pointOnTriangle, direction; - real subdistance; - int error; - for (int i = distribution.dir_start; i <= distribution.dir_end; i++) - { + Vertex pointOnTriangle, direction; + real subdistance; + int error; + for (int i = distribution.dir_start; i <= distribution.dir_end; i++) + { #if defined(__CUDA_ARCH__) - direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]); + direction = Vertex(DIRECTIONS[i][0], DIRECTIONS[i][1], DIRECTIONS[i][2]); #else - direction = Vertex(real(distribution.dirs[i * DIMENSION + 0]), + direction = Vertex(real(distribution.dirs[i * DIMENSION + 0]), real(distribution.dirs[i * DIMENSION + 1]), - real(distribution.dirs[i * DIMENSION + 2])); + real(distribution.dirs[i * DIMENSION + 2])); #endif - uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta, - point.y + direction.y * this->delta, - point.z + direction.z * this->delta); - if (neighborIndex == INVALID_INDEX) continue; + uint neighborIndex = this->transCoordToIndex(point.x + direction.x * this->delta, + point.y + direction.y * this->delta, + point.z + direction.z * this->delta); + if (neighborIndex == INVALID_INDEX) continue; - error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance); + error = triangle.getTriangleIntersection(point, direction, pointOnTriangle, subdistance); - subdistance /= this->delta; + subdistance /= this->delta; - if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0)) - { - return true; - } - } + if (error == 0 && vf::Math::lessEqual(subdistance, 1.0) && vf::Math::greaterEqual(subdistance, 0.0)) + { + return true; + } + } return false; } @@ -1670,13 +1669,13 @@ void GridImp::findCommunicationIndices(int direction, SPtr<BoundingBox> subDomai void GridImp::findCommunicationIndex( uint index, real coordinate, real limit, int direction ){ // negative direction get a negative sign - real s = ( direction % 2 == 0 ) ? ( -1.0 ) : ( 1.0 ); + real s = ( direction % 2 == 0 ) ? ( -1.0 ) : ( 1.0 ); - if (std::abs(coordinate - (limit + s * 0.5 * this->delta)) < 0.1 * this->delta) - this->communicationIndices[direction].receiveIndices.push_back(index); + if (std::abs(coordinate - (limit + s * 0.5 * this->delta)) < 0.1 * this->delta) + this->communicationIndices[direction].receiveIndices.push_back(index); - if (std::abs(coordinate - (limit - s * 0.5 * this->delta)) < 0.1 * this->delta) - this->communicationIndices[direction].sendIndices.push_back(index); + if (std::abs(coordinate - (limit - s * 0.5 * this->delta)) < 0.1 * this->delta) + this->communicationIndices[direction].sendIndices.push_back(index); } bool GridImp::isSendNode(int index) const @@ -1722,14 +1721,14 @@ uint GridImp::getReceiveIndex(int direction, uint index) void GridImp::repairCommunicationIndices(int direction) { - this->communicationIndices[direction].sendIndices.insert( this->communicationIndices[direction].sendIndices.end(), - this->communicationIndices[direction+1].sendIndices.begin(), + this->communicationIndices[direction].sendIndices.insert( this->communicationIndices[direction].sendIndices.end(), + this->communicationIndices[direction+1].sendIndices.begin(), this->communicationIndices[direction+1].sendIndices.end() ); - this->communicationIndices[direction+1].receiveIndices.insert( this->communicationIndices[direction+1].receiveIndices.end(), - this->communicationIndices[direction].receiveIndices.begin(), + this->communicationIndices[direction+1].receiveIndices.insert( this->communicationIndices[direction+1].receiveIndices.end(), + this->communicationIndices[direction].receiveIndices.begin(), this->communicationIndices[direction].receiveIndices.end() ); this->communicationIndices[direction].receiveIndices = this->communicationIndices[direction+1].receiveIndices; @@ -1834,19 +1833,19 @@ real GridImp::getMaximumOnNodes(const real &maxExact, const real &decimalStart, return maxNode; } -uint GridImp::getXIndex(real x) const -{ - return std::lround((x - startX) / delta); +uint GridImp::getXIndex(real x) const +{ + return std::lround((x - startX) / delta); } uint GridImp::getYIndex(real y) const -{ - return std::lround((y - startY) / delta); +{ + return std::lround((y - startY) / delta); } uint GridImp::getZIndex(real z) const -{ - return std::lround((z - startZ) / delta); +{ + return std::lround((z - startZ) / delta); } real GridImp::getDelta() const @@ -1861,11 +1860,11 @@ uint GridImp::getSize() const uint GridImp::getSparseSize() const { - return this->sparseSize; + return this->sparseSize; } -uint GridImp::getNumberOfFluidNodes() const { - return (uint)this->fluidNodeIndices.size(); +uint GridImp::getNumberOfFluidNodes() const { + return (uint)this->fluidNodeIndices.size(); } Field GridImp::getField() const @@ -2058,18 +2057,18 @@ void GridImp::getNodeValues(real *xCoords, real *yCoords, real *zCoords, uint *n } } -void GridImp::getFluidNodeIndices(uint *fluidNodeIndices) const -{ +void GridImp::getFluidNodeIndices(uint *fluidNodeIndices) const +{ for (uint nodeNumber = 0; nodeNumber < (uint)this->fluidNodeIndices.size(); nodeNumber++) fluidNodeIndices[nodeNumber] = this->fluidNodeIndices[nodeNumber]; } -uint GridImp::getNumberOfFluidNodesBorder() const -{ - return (uint)this->fluidNodeIndicesBorder.size(); +uint GridImp::getNumberOfFluidNodesBorder() const +{ + return (uint)this->fluidNodeIndicesBorder.size(); } -void GridImp::getFluidNodeIndicesBorder(uint *fluidNodeIndicesBorder) const +void GridImp::getFluidNodeIndicesBorder(uint *fluidNodeIndicesBorder) const { for (uint nodeNumber = 0; nodeNumber < (uint)this->fluidNodeIndicesBorder.size(); nodeNumber++) fluidNodeIndicesBorder[nodeNumber] = this->fluidNodeIndicesBorder[nodeNumber]; @@ -2083,14 +2082,14 @@ void GridImp::addFluidNodeIndicesMacroVars(std::vector<uint> _fluidNodeIndicesMa } void GridImp::addFluidNodeIndicesApplyBodyForce(std::vector<uint> _fluidNodeIndicesApplyBodyForce) -{ - +{ + size_t newSize = this->fluidNodeIndicesApplyBodyForce.size()+_fluidNodeIndicesApplyBodyForce.size(); this->fluidNodeIndicesApplyBodyForce.reserve(newSize); std::copy(_fluidNodeIndicesApplyBodyForce.begin(), _fluidNodeIndicesApplyBodyForce.end(), std::back_inserter(this->fluidNodeIndicesApplyBodyForce)); } -void GridImp::addFluidNodeIndicesAllFeatures(std::vector<uint> _fluidNodeIndicesAllFeatures) +void GridImp::addFluidNodeIndicesAllFeatures(std::vector<uint> _fluidNodeIndicesAllFeatures) { size_t newSize = this->fluidNodeIndicesAllFeatures.size()+_fluidNodeIndicesAllFeatures.size(); @@ -2109,14 +2108,14 @@ void GridImp::sortFluidNodeIndicesMacroVars() // Remove indices of fluidNodeIndicesAllFeatures from fluidNodeIndicesMacroVars if(this->fluidNodeIndicesAllFeatures.size()>0) { - this->fluidNodeIndicesMacroVars.erase( std::remove_if( this->fluidNodeIndicesMacroVars.begin(), this->fluidNodeIndicesMacroVars.end(), + this->fluidNodeIndicesMacroVars.erase( std::remove_if( this->fluidNodeIndicesMacroVars.begin(), this->fluidNodeIndicesMacroVars.end(), [&](auto x){return binary_search(fluidNodeIndicesAllFeatures.begin(),fluidNodeIndicesAllFeatures.end(),x);} ), this->fluidNodeIndicesMacroVars.end() ); } // Remove indices of fluidNodeIndicesMacroVars from fluidNodeIndices - this->fluidNodeIndices.erase( std::remove_if( this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), + this->fluidNodeIndices.erase( std::remove_if( this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), [&](auto x){return binary_search(fluidNodeIndicesMacroVars.begin(),fluidNodeIndicesMacroVars.end(),x);} ), this->fluidNodeIndices.end() ); @@ -2134,14 +2133,14 @@ void GridImp::sortFluidNodeIndicesApplyBodyForce() // Remove indices of fluidNodeIndicesAllFeatures from fluidNodeIndicesMacroVars if(this->fluidNodeIndicesAllFeatures.size()>0) { - this->fluidNodeIndicesApplyBodyForce.erase( std::remove_if( this->fluidNodeIndicesApplyBodyForce.begin(), this->fluidNodeIndicesApplyBodyForce.end(), + this->fluidNodeIndicesApplyBodyForce.erase( std::remove_if( this->fluidNodeIndicesApplyBodyForce.begin(), this->fluidNodeIndicesApplyBodyForce.end(), [&](auto x){return binary_search(fluidNodeIndicesAllFeatures.begin(),fluidNodeIndicesAllFeatures.end(),x);} ), this->fluidNodeIndicesApplyBodyForce.end() ); } // Remove indices of fluidNodeIndicesMacroVars from fluidNodeIndices - this->fluidNodeIndices.erase( std::remove_if( this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), + this->fluidNodeIndices.erase( std::remove_if( this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), [&](auto x){return binary_search(fluidNodeIndicesApplyBodyForce.begin(),fluidNodeIndicesApplyBodyForce.end(),x);} ), this->fluidNodeIndices.end() ); @@ -2156,34 +2155,34 @@ void GridImp::sortFluidNodeIndicesAllFeatures() // Remove duplicates this->fluidNodeIndicesAllFeatures.erase( unique( this->fluidNodeIndicesAllFeatures.begin(), this->fluidNodeIndicesAllFeatures.end() ), this->fluidNodeIndicesAllFeatures.end() ); // Remove indices of fluidNodeIndicesMacroVars from fluidNodeIndices - this->fluidNodeIndices.erase( std::remove_if( this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), + this->fluidNodeIndices.erase( std::remove_if( this->fluidNodeIndices.begin(), this->fluidNodeIndices.end(), [&](auto x){return binary_search(fluidNodeIndicesAllFeatures.begin(),fluidNodeIndicesAllFeatures.end(),x);} ), this->fluidNodeIndices.end() ); } } -uint GridImp::getNumberOfFluidNodeIndicesMacroVars() const { - return (uint)this->fluidNodeIndicesMacroVars.size(); +uint GridImp::getNumberOfFluidNodeIndicesMacroVars() const { + return (uint)this->fluidNodeIndicesMacroVars.size(); } -uint GridImp::getNumberOfFluidNodeIndicesApplyBodyForce() const { - return (uint)this->fluidNodeIndicesApplyBodyForce.size(); +uint GridImp::getNumberOfFluidNodeIndicesApplyBodyForce() const { + return (uint)this->fluidNodeIndicesApplyBodyForce.size(); } -uint GridImp::getNumberOfFluidNodeIndicesAllFeatures() const { - return (uint)this->fluidNodeIndicesAllFeatures.size(); +uint GridImp::getNumberOfFluidNodeIndicesAllFeatures() const { + return (uint)this->fluidNodeIndicesAllFeatures.size(); } -void GridImp::getFluidNodeIndicesMacroVars(uint *_fluidNodeIndicesMacroVars) const +void GridImp::getFluidNodeIndicesMacroVars(uint *_fluidNodeIndicesMacroVars) const { - std::copy(fluidNodeIndicesMacroVars.begin(), fluidNodeIndicesMacroVars.end(), _fluidNodeIndicesMacroVars); + std::copy(fluidNodeIndicesMacroVars.begin(), fluidNodeIndicesMacroVars.end(), _fluidNodeIndicesMacroVars); } -void GridImp::getFluidNodeIndicesApplyBodyForce(uint *_fluidNodeIndicesApplyBodyForce) const +void GridImp::getFluidNodeIndicesApplyBodyForce(uint *_fluidNodeIndicesApplyBodyForce) const { std::copy(fluidNodeIndicesApplyBodyForce.begin(), fluidNodeIndicesApplyBodyForce.end(), _fluidNodeIndicesApplyBodyForce); } -void GridImp::getFluidNodeIndicesAllFeatures(uint *_fluidNodeIndicesAllFeatures) const +void GridImp::getFluidNodeIndicesAllFeatures(uint *_fluidNodeIndicesAllFeatures) const { std::copy(fluidNodeIndicesAllFeatures.begin(), fluidNodeIndicesAllFeatures.end(), _fluidNodeIndicesAllFeatures); } diff --git a/src/gpu/GridGenerator/grid/GridImp.h b/src/gpu/GridGenerator/grid/GridImp.h index 0a132b9d24e38a6709306d3834538cffbcf99ed4..d518868b6bf57d094b33596921d66fa7f87eb328 100644 --- a/src/gpu/GridGenerator/grid/GridImp.h +++ b/src/gpu/GridGenerator/grid/GridImp.h @@ -116,7 +116,7 @@ private: int *sparseIndices; std::vector<uint> fluidNodeIndices; // run on CollisionTemplate::Default - std::vector<uint> fluidNodeIndicesBorder; // run on border nodes + std::vector<uint> fluidNodeIndicesBorder; // run on subdomain border nodes (CollisionTemplate::SubDomainBorder) std::vector<uint> fluidNodeIndicesMacroVars; // run on CollisionTemplate::MacroVars std::vector<uint> fluidNodeIndicesApplyBodyForce; // run on CollisionTemplate::ApplyBodyForce std::vector<uint> fluidNodeIndicesAllFeatures; // run on CollisionTemplate::AllFeatures diff --git a/src/gpu/VirtualFluids_GPU/Calculation/CollisisionStrategy.cpp b/src/gpu/VirtualFluids_GPU/Calculation/CollisisionStrategy.cpp index 1c279ad523e8442bc68af079f1c789a1b130cd35..49543f37df7fb54290f4ab6c09edb8d10c0b67be 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/CollisisionStrategy.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/CollisisionStrategy.cpp @@ -72,16 +72,16 @@ void CollisionAndExchange_streams::operator()(UpdateGrid27 *updateGrid, Paramete //! 1. run collision for nodes which are at the border of the gpus/processes, running with WriteMacroVars in case probes sample on these nodes //! updateGrid->collisionUsingIndices( level, t, - para->getParD(level)->taggedFluidNodeIndices[CollisionTemplate::Border], - para->getParD(level)->numberOfTaggedFluidNodes[CollisionTemplate::Border], + para->getParD(level)->taggedFluidNodeIndices[CollisionTemplate::SubDomainBorder], + para->getParD(level)->numberOfTaggedFluidNodes[CollisionTemplate::SubDomainBorder], CollisionTemplate::WriteMacroVars, - CudaStreamIndex::Border); + CudaStreamIndex::SubDomainBorder); //! 2. prepare the exchange between gpus (collect the send nodes for communication in a buffer on the gpu) and trigger bulk kernel execution when finished //! - updateGrid->prepareExchangeMultiGPU(level, CudaStreamIndex::Border); + updateGrid->prepareExchangeMultiGPU(level, CudaStreamIndex::SubDomainBorder); if (para->getUseStreams()) - para->getStreamManager()->triggerStartBulkKernel(CudaStreamIndex::Border); + para->getStreamManager()->triggerStartBulkKernel(CudaStreamIndex::SubDomainBorder); //! 3. launch the collision kernel for bulk nodes. This includes nodes with \param tag Default, WriteMacroVars, ApplyBodyForce, //! or AllFeatures. All assigned tags are listed in \param allocatedBulkFluidNodeTags during initialization in Simulation::init @@ -97,5 +97,5 @@ void CollisionAndExchange_streams::operator()(UpdateGrid27 *updateGrid, Paramete CudaStreamIndex::Bulk); } //! 4. exchange information between GPUs - updateGrid->exchangeMultiGPU(level, CudaStreamIndex::Border); + updateGrid->exchangeMultiGPU(level, CudaStreamIndex::SubDomainBorder); } diff --git a/src/gpu/VirtualFluids_GPU/Calculation/RefinementStrategy.cpp b/src/gpu/VirtualFluids_GPU/Calculation/RefinementStrategy.cpp index fe7da04d4074a37321f4340f1d76f0606963b89e..b8ca4e9c2020e17cd0192267ac5d931b510afc3a 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/RefinementStrategy.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/RefinementStrategy.cpp @@ -42,27 +42,27 @@ void RefinementAndExchange_streams_exchangeInterface::operator()(UpdateGrid27 *u //! //! 1. Interpolation fine to coarse for nodes which are at the border of the gpus/processes //! - updateGrid->fineToCoarse(level, ¶->getParD(level)->intFCBorder, para->getParD(level)->offFC, CudaStreamIndex::Border); + updateGrid->fineToCoarse(level, ¶->getParD(level)->intFCBorder, para->getParD(level)->offFC, CudaStreamIndex::SubDomainBorder); //! 2. prepare the exchange between gpus (collect the send nodes for communication in a buffer on the gpu) and trigger bulk kernel execution when finished //! - updateGrid->prepareExchangeMultiGPUAfterFtoC(level, CudaStreamIndex::Border); + updateGrid->prepareExchangeMultiGPUAfterFtoC(level, CudaStreamIndex::SubDomainBorder); if (para->getUseStreams()) - para->getStreamManager()->triggerStartBulkKernel(CudaStreamIndex::Border); + para->getStreamManager()->triggerStartBulkKernel(CudaStreamIndex::SubDomainBorder); //! 3. launch the bulk kernels for both interpolation processes (fine to coarse and coarse to fine) //! para->getStreamManager()->waitOnStartBulkKernelEvent(CudaStreamIndex::Bulk); - updateGrid->fineToCoarse(level, ¶->getParD(level)->intFCBulk, para->getParD(level)->offFCBulk, CudaStreamIndex::Border); - updateGrid->coarseToFine(level, ¶->getParD(level)->intCFBulk, para->getParD(level)->offCFBulk, CudaStreamIndex::Border); + updateGrid->fineToCoarse(level, ¶->getParD(level)->intFCBulk, para->getParD(level)->offFCBulk, CudaStreamIndex::SubDomainBorder); + updateGrid->coarseToFine(level, ¶->getParD(level)->intCFBulk, para->getParD(level)->offCFBulk, CudaStreamIndex::SubDomainBorder); //! 4. exchange information between GPUs (only nodes which are part of the interpolation) //! - updateGrid->exchangeMultiGPUAfterFtoC(level, CudaStreamIndex::Border); + updateGrid->exchangeMultiGPUAfterFtoC(level, CudaStreamIndex::SubDomainBorder); // 5. interpolation fine to coarse for nodes which are at the border of the gpus/processes //! - updateGrid->coarseToFine(level, ¶->getParD(level)->intCFBorder, para->getParD(level)->offCF, CudaStreamIndex::Border); + updateGrid->coarseToFine(level, ¶->getParD(level)->intCFBorder, para->getParD(level)->offCF, CudaStreamIndex::SubDomainBorder); cudaDeviceSynchronize(); } @@ -73,27 +73,27 @@ void RefinementAndExchange_streams_exchangeAllNodes::operator()(UpdateGrid27 *up //! //! 1. interpolation fine to coarse for nodes which are at the border of the gpus/processes //! - updateGrid->fineToCoarse(level, ¶->getParD(level)->intFCBorder, para->getParD(level)->offFC, CudaStreamIndex::Border); + updateGrid->fineToCoarse(level, ¶->getParD(level)->intFCBorder, para->getParD(level)->offFC, CudaStreamIndex::SubDomainBorder); //! 2. prepare the exchange between gpus (collect the send nodes for communication in a buffer on the gpu) and trigger bulk kernel execution when finished //! - updateGrid->prepareExchangeMultiGPU(level, CudaStreamIndex::Border); + updateGrid->prepareExchangeMultiGPU(level, CudaStreamIndex::SubDomainBorder); if (para->getUseStreams()) - para->getStreamManager()->triggerStartBulkKernel(CudaStreamIndex::Border); + para->getStreamManager()->triggerStartBulkKernel(CudaStreamIndex::SubDomainBorder); //! 3. launch the bulk kernels for both interpolation processes (fine to coarse and coarse to fine) //! para->getStreamManager()->waitOnStartBulkKernelEvent(CudaStreamIndex::Bulk); - updateGrid->fineToCoarse(level, ¶->getParD(level)->intFCBulk, para->getParD(level)->offFCBulk, CudaStreamIndex::Border); - updateGrid->coarseToFine(level, ¶->getParD(level)->intCFBulk, para->getParD(level)->offCFBulk, CudaStreamIndex::Border); + updateGrid->fineToCoarse(level, ¶->getParD(level)->intFCBulk, para->getParD(level)->offFCBulk, CudaStreamIndex::SubDomainBorder); + updateGrid->coarseToFine(level, ¶->getParD(level)->intCFBulk, para->getParD(level)->offCFBulk, CudaStreamIndex::SubDomainBorder); //! 4. exchange information between GPUs (all nodes) //! - updateGrid->exchangeMultiGPU(level, CudaStreamIndex::Border); + updateGrid->exchangeMultiGPU(level, CudaStreamIndex::SubDomainBorder); // 5. interpolation fine to coarse for nodes which are at the border of the gpus/processes //! - updateGrid->coarseToFine(level, ¶->getParD(level)->intCFBorder, para->getParD(level)->offCF, CudaStreamIndex::Border); + updateGrid->coarseToFine(level, ¶->getParD(level)->intCFBorder, para->getParD(level)->offCF, CudaStreamIndex::SubDomainBorder); cudaDeviceSynchronize(); } diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp index 4136614dfbfc9e0d2fc1bf7f4b01624f94eabb6f..26632f18dec369f9b437d0c4549f15a97f15d2d6 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp @@ -13,8 +13,13 @@ #include "CollisionStrategy.h" #include "RefinementStrategy.h" +#include "Output/Timer.h" + void UpdateGrid27::updateGrid(int level, unsigned int t) { + + timer->startTimer(); + ////////////////////////////////////////////////////////////////////////// if (level != para->getFine()) { @@ -22,18 +27,27 @@ void UpdateGrid27::updateGrid(int level, unsigned int t) updateGrid(level + 1, t); } + ////////////////////////////////////////////////////////////////////////// + std::cout << "updateGrid: level = " << level << ", t = " << t << std::endl; + interactWithProbes(level, t); + std::cout << " interactWithProbes, " << timer->startStopGetElapsed() << std::endl; ////////////////////////////////////////////////////////////////////////// collision(this, para.get(), level, t); + std::cout << " collision, " << timer->startStopGetElapsed() << std::endl; + ////////////////////////////////////////////////////////////////////////// postCollisionBC(level, t); + std::cout << " postCollisionBC, " << timer->startStopGetElapsed() << std::endl; + + ////////////////////////////////////////////////////////////////////////// swapBetweenEvenAndOddTimestep(level); @@ -45,20 +59,35 @@ void UpdateGrid27::updateGrid(int level, unsigned int t) calcTurbulentViscosity(level); + + std::cout << " calcTurbulentViscosity, " << timer->startStopGetElapsed() << std::endl; + ////////////////////////////////////////////////////////////////////////// this->preCollisionBC(level, t); + std::cout << " preCollisionBC, " << timer->startStopGetElapsed() << std::endl; + + ////////////////////////////////////////////////////////////////////////// if( level != para->getFine() ) { refinement(this, para.get(), level); } + + std::cout << " refinement, " << timer->startStopGetElapsed() << std::endl; + ////////////////////////////////////////////////////////////////////////// interactWithActuators(level, t); + std::cout << " interactWithActuators, " << timer->startStopGetElapsed() << std::endl; + std::cout << "total time, " << timer->getTotalElapsedTime() << std::endl; + timer->resetTimer(); + + + } void UpdateGrid27::collisionAllNodes(int level, unsigned int t) @@ -391,4 +420,6 @@ UpdateGrid27::UpdateGrid27(SPtr<Parameter> para, vf::gpu::Communicator &comm, SP this->bcKernelManager = std::make_shared<BCKernelManager>(para, bcFactory); this->adKernelManager = std::make_shared<ADKernelManager>(para); this->gridScalingKernelManager = std::make_shared<GridScalingKernelManager>(para, scalingFactory); + timer = new Timer("ALM blade performance"); + timer->initTimer(); } diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h index 8ce2cf5bfd72f9f53cdb35bc92502ee9ca0d3ad8..da6d53c174c3178123a78ac59738bb390d0c036e 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h +++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h @@ -17,6 +17,8 @@ class BoundaryConditionFactory; class GridScalingFactory; class TurbulenceModelFactory; class UpdateGrid27; +class Timer; + using CollisionStrategy = std::function<void (UpdateGrid27* updateGrid, Parameter* para, int level, unsigned int t)>; using RefinementStrategy = std::function<void (UpdateGrid27* updateGrid, Parameter* para, int level)>; @@ -84,6 +86,8 @@ private: std::shared_ptr<GridScalingKernelManager> gridScalingKernelManager; //! \property tmFactory is a shared pointer to an object of TurbulenceModelFactory std::shared_ptr<TurbulenceModelFactory> tmFactory; + + Timer* timer = nullptr; }; #endif diff --git a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp index 44202b71686df31ba9d6e2dd6f6cf18453fd3408..00a7b45668e2050467f3d1122455dc74d0ad4f1c 100644 --- a/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp +++ b/src/gpu/VirtualFluids_GPU/Communication/ExchangeData27.cpp @@ -240,7 +240,7 @@ void exchangeCollDataYGPU27(Parameter *para, vf::gpu::Communicator &comm, CudaMe std::vector<ProcessNeighbor27> *sendProcessNeighborHost, std::vector<ProcessNeighbor27> *recvProcessNeighborHost) { - cudaStream_t stream = para->getStreamManager()->getStream(CudaStreamIndex::Border); + cudaStream_t stream = para->getStreamManager()->getStream(CudaStreamIndex::SubDomainBorder); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // copy Device to Host for (unsigned int i = 0; i < (unsigned int)(para->getNumberOfProcessNeighborsY(level, "send")); i++) diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h index 42ba7a464a6e76fd747cc6d11a01e3957c865765..4c50d458c60f04db14c247e16ef3dc44833cb8f7 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.h @@ -30,7 +30,7 @@ public: virtual void allocArrays_OffsetScale() = 0; virtual void allocArrays_taggedFluidNodes() = 0; - virtual void tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level) = 0; + virtual void tagFluidNodeIndices(const std::vector<uint>& taggedFluidNodeIndices, CollisionTemplate tag, uint level) = 0; virtual void sortFluidNodeTags() = 0; virtual void setDimensions() = 0; diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp index 793400869dd29fe12be357ffcf87c0238ea70eb9..66af0d1c4603353148c6201de15d13d6243b0612 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp @@ -74,11 +74,11 @@ void GridReader::allocArrays_CoordNeighborGeo() uint numberOfNodesGlobal = 0; std::cout << "Number of Nodes: " << std::endl; - for (uint level = 0; level <= maxLevel; level++) - { - int numberOfNodesPerLevel = coordX.getSize(level) + 1; - numberOfNodesGlobal += numberOfNodesPerLevel; - std::cout << "Level " << level << " = " << numberOfNodesPerLevel << " Nodes" << std::endl; + for (uint level = 0; level <= maxLevel; level++) + { + int numberOfNodesPerLevel = coordX.getSize(level) + 1; + numberOfNodesGlobal += numberOfNodesPerLevel; + std::cout << "Level " << level << " = " << numberOfNodesPerLevel << " Nodes" << std::endl; setNumberOfNodes(numberOfNodesPerLevel, level); @@ -130,9 +130,9 @@ void GridReader::allocArrays_BoundaryValues() for (uint i = 0; i < channelBoundaryConditions.size(); i++) { - if ( this->channelBoundaryConditions[i] == "velocity") { fillVelocityVectors(i); } - else if (this->channelBoundaryConditions[i] == "pressure") { setPressureValues(i); } - else if (this->channelBoundaryConditions[i] == "outflow") { setOutflowValues(i); } + if ( this->channelBoundaryConditions[i] == "velocity") { fillVelocityVectors(i); } + else if (this->channelBoundaryConditions[i] == "pressure") { setPressureValues(i); } + else if (this->channelBoundaryConditions[i] == "outflow") { setOutflowValues(i); } } setVelocityValues(); @@ -223,13 +223,13 @@ void GridReader::allocArrays_taggedFluidNodes() { // TODO } -void GridReader::tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level){ - std::cout << "GridReader::tagFluidNodeIndices not implemented" << std::endl; +void GridReader::tagFluidNodeIndices(const std::vector<uint>& taggedFluidNodeIndices, CollisionTemplate tag, uint level){ + std::cout << "GridReader::tagFluidNodeIndices not implemented" << std::endl; // TODO } void GridReader::sortFluidNodeTags(){ - std::cout << "GridReader::sortFluidNodeTags not implemented" << std::endl; + std::cout << "GridReader::sortFluidNodeTags not implemented" << std::endl; // TODO } @@ -285,23 +285,23 @@ void GridReader::fillVelocityVectors(int channelSide) delete[] veloX_ValuesPerSide; delete[] veloY_ValuesPerSide; delete[] veloZ_ValuesPerSide; - } - } + } + } } -void GridReader::setVelocityValues() { +void GridReader::setVelocityValues() { for (int level = 0; level < (int)(velocityX_BCvalues.size()); level++) { - - int sizePerLevel = (int) velocityX_BCvalues[level].size(); + + int sizePerLevel = (int) velocityX_BCvalues[level].size(); std::cout << "complete size velocity level " << level << " : " << sizePerLevel << std::endl; setVelocitySizePerLevel(level, sizePerLevel); - - if (sizePerLevel > 1) { + + if (sizePerLevel > 1) { cudaMemoryManager->cudaAllocVeloBC(level); setVelocity(level, sizePerLevel); - cudaMemoryManager->cudaCopyVeloBC(level); + cudaMemoryManager->cudaCopyVeloBC(level); } } } @@ -672,8 +672,8 @@ void GridReader::modifyQElement(std::shared_ptr<BoundaryQs> boundaryQ, unsigned /*------------------------------------------------------------------------------------------------*/ /*---------------------------------------private q methods----------------------------------------*/ /*------------------------------------------------------------------------------------------------*/ -void GridReader::initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index, - std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const +void GridReader::initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index, + std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const { boundaryQ->setValuesInVector(Qs, level); boundaryQ->setIndexInVector(index, level); @@ -689,7 +689,7 @@ void GridReader::copyVectorsToQStruct(std::vector<std::vector<real>> &Qs, for (int direction = 0; direction < para->getD3Qxx(); direction++) { for (size_t indexQ = 0; indexQ < sizeOfValues; indexQ++) { - qTemp.q27[direction][indexQ] = Qs[direction][indexQ]; + qTemp.q27[direction][indexQ] = Qs[direction][indexQ]; } } @@ -851,46 +851,46 @@ void GridReader::setBoundingBox() void GridReader::initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int> > > periodV, std::vector<std::vector<unsigned int> > periodIndex, std::string boundaryCondition) { - std::vector<unsigned int>neighVec; - std::vector<unsigned int>indexVec; - - int counter = 0; - - for(unsigned int i=0; i<neighX->getLevel();i++) { - if(boundaryCondition =="periodic_y"){ - neighVec = neighY->getVec(i); - } - else if(boundaryCondition =="periodic_x"){ - neighVec = neighX->getVec(i); - } - else if(boundaryCondition =="periodic_z"){ - neighVec = neighZ->getVec(i); - } - else { - std::cout << "wrong String in periodicValue" << std::endl; - exit(1); - } + std::vector<unsigned int>neighVec; + std::vector<unsigned int>indexVec; - for (std::vector<unsigned int>::iterator it = periodIndex[i].begin(); it != periodIndex[i].end(); it++) { - if(periodV[i][0][counter] != 0) { - neighVec[*it]=periodV[i][0][counter]; - } + int counter = 0; - counter++; - } + for(unsigned int i=0; i<neighX->getLevel();i++) { + if(boundaryCondition =="periodic_y"){ + neighVec = neighY->getVec(i); + } + else if(boundaryCondition =="periodic_x"){ + neighVec = neighX->getVec(i); + } + else if(boundaryCondition =="periodic_z"){ + neighVec = neighZ->getVec(i); + } + else { + std::cout << "wrong String in periodicValue" << std::endl; + exit(1); + } + for (std::vector<unsigned int>::iterator it = periodIndex[i].begin(); it != periodIndex[i].end(); it++) { + if(periodV[i][0][counter] != 0) { + neighVec[*it]=periodV[i][0][counter]; + } - if(boundaryCondition =="periodic_y"){ - neighY->setVec(i, neighVec); - } - else if(boundaryCondition =="periodic_x"){ - neighX->setVec(i, neighVec); - } - else if(boundaryCondition =="periodic_z"){ - neighZ->setVec(i, neighVec); - } + counter++; + } - } + + if(boundaryCondition =="periodic_y"){ + neighY->setVec(i, neighVec); + } + else if(boundaryCondition =="periodic_x"){ + neighX->setVec(i, neighVec); + } + else if(boundaryCondition =="periodic_z"){ + neighZ->setVec(i, neighVec); + } + + } } void GridReader::makeReader(std::shared_ptr<Parameter> para) @@ -921,9 +921,9 @@ void GridReader::makeReader(std::vector<std::shared_ptr<BoundaryQs> > &BC_Qs, st void GridReader::setChannelBoundaryCondition() { - for (std::size_t i = 0; i < channelDirections.size(); i++) - { - this->channelBoundaryConditions[i] = BC_Values[i]->getBoundaryCondition(); - std::cout << this->channelDirections[i] << " Boundary: " << channelBoundaryConditions[i] << std::endl; - } -} \ No newline at end of file + for (std::size_t i = 0; i < channelDirections.size(); i++) + { + this->channelBoundaryConditions[i] = BC_Values[i]->getBoundaryCondition(); + std::cout << this->channelDirections[i] << " Boundary: " << channelBoundaryConditions[i] << std::endl; + } +} diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h index 2c17c28022d88a65e922e23d1c89f5166f5a1716..041d2c3ce94592f792c5a850eebd14c07f4db1b4 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h @@ -3,9 +3,9 @@ #include "../GridProvider.h" -#include <vector> -#include <string> #include <memory> +#include <string> +#include <vector> #include "LBM/LB.h" @@ -16,15 +16,14 @@ class BoundaryValues; class BoundaryQs; class CoordNeighborGeoV; -class VIRTUALFLUIDS_GPU_EXPORT GridReader - : public GridProvider +class VIRTUALFLUIDS_GPU_EXPORT GridReader : public GridProvider { private: - bool binaer; - std::vector<std::string> channelDirections; - std::vector<std::string> channelBoundaryConditions; - std::shared_ptr<CoordNeighborGeoV> neighX, neighY, neighZ, neighWSB; - std::vector<std::shared_ptr<BoundaryValues> > BC_Values; + bool binaer; + std::vector<std::string> channelDirections; + std::vector<std::string> channelBoundaryConditions; + std::shared_ptr<CoordNeighborGeoV> neighX, neighY, neighZ, neighWSB; + std::vector<std::shared_ptr<BoundaryValues>> BC_Values; std::vector<std::vector<real>> velocityX_BCvalues, velocityY_BCvalues, velocityZ_BCvalues; std::vector<std::vector<std::vector<real>>> velocityQs; @@ -34,59 +33,62 @@ private: std::vector<std::vector<real>> outflowBCvalues; public: - GridReader(FILEFORMAT format, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager); - ~GridReader(); - void allocArrays_CoordNeighborGeo() override; - void allocArrays_BoundaryValues() override; + GridReader(FILEFORMAT format, std::shared_ptr<Parameter> para, + std::shared_ptr<CudaMemoryManager> cudaMemoryManager); + ~GridReader() override; + void allocArrays_CoordNeighborGeo() override; + void allocArrays_BoundaryValues() override; void allocArrays_OffsetScale() override; void allocArrays_taggedFluidNodes() override; - void tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level) override; - void sortFluidNodeTags() override; + void tagFluidNodeIndices(const std::vector<uint> &taggedFluidNodeIndices, CollisionTemplate tag, uint level) override; - void initalValuesDomainDecompostion(int level); + void sortFluidNodeTags() override; - void setChannelBoundaryCondition(); + void initalValuesDomainDecompostion(int level); - void allocArrays_BoundaryQs() override; - bool getBinaer(); - void setDimensions() override; - void setBoundingBox() override; - void initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int> > > periodV, std::vector<std::vector<unsigned int> > periodIndex, std::string way) override; + void setChannelBoundaryCondition(); + + void allocArrays_BoundaryQs() override; + bool getBinaer(); + void setDimensions() override; + void setBoundingBox() override; + void initPeriodicNeigh(std::vector<std::vector<std::vector<unsigned int>>> periodV, + std::vector<std::vector<unsigned int>> periodIndex, std::string way) override; private: - void makeReader(std::shared_ptr<Parameter> para); - void makeReader(std::vector<std::shared_ptr<BoundaryQs> > &BC_Qs, std::shared_ptr<Parameter> para); + void makeReader(std::shared_ptr<Parameter> para); + void makeReader(std::vector<std::shared_ptr<BoundaryQs>> &BC_Qs, std::shared_ptr<Parameter> para); - void setPressureValues(int channelSide) const; - void setPressRhoBC(int sizePerLevel, int level, int channelSide) const; + void setPressureValues(int channelSide) const; + void setPressRhoBC(int sizePerLevel, int level, int channelSide) const; - void fillVelocityVectors(int channelSide); + void fillVelocityVectors(int channelSide); void setVelocityValues(); - void setVelocity(int level, int sizePerLevel) const; - - void setOutflowValues(int channelSide) const; - void setOutflow(int level, int sizePerLevel, int channelSide) const; + void setVelocity(int level, int sizePerLevel) const; + void setOutflowValues(int channelSide) const; + void setOutflow(int level, int sizePerLevel, int channelSide) const; - //void fillVelocityQVectors(int channelSide); + // void fillVelocityQVectors(int channelSide); void setPressQs(std::shared_ptr<BoundaryQs> boundaryQ) const; - void setVelocityQs(std::shared_ptr<BoundaryQs> boundaryQ); - void setOutflowQs(std::shared_ptr<BoundaryQs> boundaryQ) const; - void setNoSlipQs(std::shared_ptr<BoundaryQs> boundaryQ) const; - void setGeoQs(std::shared_ptr<BoundaryQs> boundaryQ) const; - void modifyQElement(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; + void setVelocityQs(std::shared_ptr<BoundaryQs> boundaryQ); + void setOutflowQs(std::shared_ptr<BoundaryQs> boundaryQ) const; + void setNoSlipQs(std::shared_ptr<BoundaryQs> boundaryQ) const; + void setGeoQs(std::shared_ptr<BoundaryQs> boundaryQ) const; + void modifyQElement(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; - void initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index, + void initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; void copyVectorsToQStruct(std::vector<std::vector<real>> &Qs, std::vector<int> &index, QforBoundaryConditions &Q) const; void initalQStruct(QforBoundaryConditions &Q, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; - void printQSize(std::string bc, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; - void setSizeNoSlip(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; - void setSizeGeoQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; - void setQ27Size(QforBoundaryConditions &Q, real* QQ, unsigned int sizeQ) const; - bool hasQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; + void printQSize(std::string bc, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; + void setSizeNoSlip(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; + void setSizeGeoQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; + void setQ27Size(QforBoundaryConditions &Q, real *QQ, unsigned int sizeQ) const; + bool hasQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; + public: void initalGridInformations() override; }; diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp index a89b5a1ca821ce794263f77fcc6772d169879401..d14973be77ab6766dc04ec95213efe663db3b873 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp @@ -20,13 +20,15 @@ using namespace vf::lbm::dir; -GridGenerator::GridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::Communicator& communicator): - mpiProcessID(communicator.getPID()), builder(builder) +GridGenerator::GridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, + std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::gpu::Communicator &communicator) + : mpiProcessID(communicator.getPID()), builder(builder) { this->para = para; this->cudaMemoryManager = cudaMemoryManager; this->indexRearrangement = std::make_unique<IndexRearrangementForStreams>(para, builder, communicator); - this->interpolationGrouper = std::make_unique<InterpolationCellGrouper>(para->getParHallLevels(), para->getParDallLevels(), builder); + this->interpolationGrouper = + std::make_unique<InterpolationCellGrouper>(para->getParHallLevels(), para->getParDallLevels(), builder); } GridGenerator::~GridGenerator() = default; @@ -59,15 +61,15 @@ void GridGenerator::allocArrays_CoordNeighborGeo() std::cout << "Number of Level: " << numberOfLevels << std::endl; int numberOfNodesGlobal = 0; std::cout << "Number of Nodes: " << std::endl; - - for (uint level = 0; level < numberOfLevels; level++) + + for (uint level = 0; level < numberOfLevels; level++) { const int numberOfNodesPerLevel = builder->getNumberOfNodes(level) + 1; numberOfNodesGlobal += numberOfNodesPerLevel; std::cout << "Level " << level << " = " << numberOfNodesPerLevel << " Nodes" << std::endl; - + setNumberOfNodes(numberOfNodesPerLevel, level); - + cudaMemoryManager->cudaAllocCoord(level); cudaMemoryManager->cudaAllocSP(level); //cudaMemoryManager->cudaAllocF3SP(level); @@ -75,7 +77,7 @@ void GridGenerator::allocArrays_CoordNeighborGeo() if(para->getUseTurbulentViscosity()) cudaMemoryManager->cudaAllocTurbulentViscosity(level); - + if(para->getIsBodyForce()) cudaMemoryManager->cudaAllocBodyForce(level); @@ -106,7 +108,7 @@ void GridGenerator::allocArrays_CoordNeighborGeo() void GridGenerator::allocArrays_taggedFluidNodes() { - for (uint level = 0; level < builder->getNumberOfGridLevels(); level++) + for (uint level = 0; level < builder->getNumberOfGridLevels(); level++) { for ( CollisionTemplate tag: all_CollisionTemplate ) { //TODO: Need to add CollisionTemplate to GridBuilder to allow as argument and get rid of indivual get funtions for fluid node indices... and clean up this mess @@ -120,11 +122,11 @@ void GridGenerator::allocArrays_taggedFluidNodes() { if(para->getParH(level)->numberOfTaggedFluidNodes[tag]>0) para->getParH(level)->allocatedBulkFluidNodeTags.push_back(tag); break; - case CollisionTemplate::Border: - this->setNumberOfTaggedFluidNodes(builder->getNumberOfFluidNodesBorder(level), CollisionTemplate::Border, level); - cudaMemoryManager->cudaAllocTaggedFluidNodeIndices(CollisionTemplate::Border, level); - builder->getFluidNodeIndicesBorder(para->getParH(level)->taggedFluidNodeIndices[CollisionTemplate::Border], level); - cudaMemoryManager->cudaCopyTaggedFluidNodeIndices(CollisionTemplate::Border, level); + case CollisionTemplate::SubDomainBorder: + this->setNumberOfTaggedFluidNodes(builder->getNumberOfFluidNodesBorder(level), CollisionTemplate::SubDomainBorder, level); + cudaMemoryManager->cudaAllocTaggedFluidNodeIndices(CollisionTemplate::SubDomainBorder, level); + builder->getFluidNodeIndicesBorder(para->getParH(level)->taggedFluidNodeIndices[CollisionTemplate::SubDomainBorder], level); + cudaMemoryManager->cudaCopyTaggedFluidNodeIndices(CollisionTemplate::SubDomainBorder, level); break; case CollisionTemplate::WriteMacroVars: this->setNumberOfTaggedFluidNodes(builder->getNumberOfFluidNodesMacroVars(level), CollisionTemplate::WriteMacroVars, level); @@ -155,16 +157,16 @@ void GridGenerator::allocArrays_taggedFluidNodes() { } } VF_LOG_INFO("Number of tagged nodes on level {}:", level); - VF_LOG_INFO("Default: {}, Border: {}, WriteMacroVars: {}, ApplyBodyForce: {}, AllFeatures: {}", + VF_LOG_INFO("Default: {}, Border: {}, WriteMacroVars: {}, ApplyBodyForce: {}, AllFeatures: {}", para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::Default], - para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::Border], + para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::SubDomainBorder], para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::WriteMacroVars], para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::ApplyBodyForce], - para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::AllFeatures] ); + para->getParH(level)->numberOfTaggedFluidNodes[CollisionTemplate::AllFeatures] ); } } -void GridGenerator::tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level) { +void GridGenerator::tagFluidNodeIndices(const std::vector<uint>& taggedFluidNodeIndices, CollisionTemplate tag, uint level) { switch(tag) { case CollisionTemplate::WriteMacroVars: @@ -177,14 +179,14 @@ void GridGenerator::tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices builder->addFluidNodeIndicesAllFeatures( taggedFluidNodeIndices, level ); break; case CollisionTemplate::Default: - case CollisionTemplate::Border: - throw std::runtime_error("Cannot tag fluid nodes as Default or Border!"); + case CollisionTemplate::SubDomainBorder: + throw std::runtime_error("Cannot tag fluid nodes as Default or SubDomainBorder!"); default: throw std::runtime_error("Tagging fluid nodes with invald tag!"); break; } - + } void GridGenerator::sortFluidNodeTags() { @@ -201,7 +203,7 @@ void GridGenerator::sortFluidNodeTags() { void GridGenerator::allocArrays_BoundaryValues() { std::cout << "------read BoundaryValues------" << std::endl; - int blocks = 0; + int blocks; for (uint level = 0; level < builder->getNumberOfGridLevels(); level++) { const auto numberOfPressureValues = int(builder->getPressureSize(level)); @@ -229,12 +231,12 @@ void GridGenerator::allocArrays_BoundaryValues() //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// para->getParH(level)->slipBC.numberOfBCnodes = 0; - if (numberOfSlipValues > 1) - { + if (numberOfSlipValues > 1) { blocks = (numberOfSlipValues / para->getParH(level)->numberofthreads) + 1; para->getParH(level)->slipBC.numberOfBCnodes = blocks * para->getParH(level)->numberofthreads; cudaMemoryManager->cudaAllocSlipBC(level); - builder->getSlipValues(para->getParH(level)->slipBC.normalX, para->getParH(level)->slipBC.normalY, para->getParH(level)->slipBC.normalZ, para->getParH(level)->slipBC.k, level); + builder->getSlipValues(para->getParH(level)->slipBC.normalX, para->getParH(level)->slipBC.normalY, + para->getParH(level)->slipBC.normalZ, para->getParH(level)->slipBC.k, level); cudaMemoryManager->cudaCopySlipBC(level); } para->getParD(level)->slipBC.numberOfBCnodes = para->getParH(level)->slipBC.numberOfBCnodes; @@ -254,11 +256,11 @@ void GridGenerator::allocArrays_BoundaryValues() para->getParH(level)->stressBC.numberOfBCnodes = blocks * para->getParH(level)->numberofthreads; cudaMemoryManager->cudaAllocStressBC(level); cudaMemoryManager->cudaAllocWallModel(level, para->getHasWallModelMonitor()); - builder->getStressValues( para->getParH(level)->stressBC.normalX, para->getParH(level)->stressBC.normalY, para->getParH(level)->stressBC.normalZ, + builder->getStressValues( para->getParH(level)->stressBC.normalX, para->getParH(level)->stressBC.normalY, para->getParH(level)->stressBC.normalZ, para->getParH(level)->stressBC.Vx, para->getParH(level)->stressBC.Vy, para->getParH(level)->stressBC.Vz, para->getParH(level)->stressBC.Vx1, para->getParH(level)->stressBC.Vy1, para->getParH(level)->stressBC.Vz1, - para->getParH(level)->stressBC.k, para->getParH(level)->stressBC.kN, - para->getParH(level)->wallModel.samplingOffset, para->getParH(level)->wallModel.z0, + para->getParH(level)->stressBC.k, para->getParH(level)->stressBC.kN, + para->getParH(level)->wallModel.samplingOffset, para->getParH(level)->wallModel.z0, level); cudaMemoryManager->cudaCopyStressBC(level); @@ -268,7 +270,7 @@ void GridGenerator::allocArrays_BoundaryValues() para->getParH(level)->numberOfStressBCnodesRead = para->getParH(level)->stressBC.numberOfBCnodes * para->getD3Qxx(); para->getParD(level)->numberOfStressBCnodesRead = para->getParH(level)->stressBC.numberOfBCnodes * para->getD3Qxx(); } - + for (uint level = 0; level < builder->getNumberOfGridLevels(); level++) { const auto numberOfVelocityValues = int(builder->getVelocitySize(level)); @@ -285,7 +287,8 @@ void GridGenerator::allocArrays_BoundaryValues() cudaMemoryManager->cudaAllocVeloBC(level); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - builder->getVelocityValues(para->getParH(level)->velocityBC.Vx, para->getParH(level)->velocityBC.Vy, para->getParH(level)->velocityBC.Vz, para->getParH(level)->velocityBC.k, level); + builder->getVelocityValues(para->getParH(level)->velocityBC.Vx, para->getParH(level)->velocityBC.Vy, + para->getParH(level)->velocityBC.Vz, para->getParH(level)->velocityBC.k, level); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -327,7 +330,7 @@ void GridGenerator::allocArrays_BoundaryValues() const auto numberOfPrecursorValues = int(builder->getPrecursorSize(level)); *logging::out << logging::Logger::INFO_INTERMEDIATE << "size precursor level " << level << " : " << numberOfPrecursorValues << "\n"; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - int blocks = (numberOfPrecursorValues / para->getParH(level)->numberofthreads) + 1; + blocks = (numberOfPrecursorValues / para->getParH(level)->numberofthreads) + 1; para->getParH(level)->precursorBC.sizeQ = blocks * para->getParH(level)->numberofthreads; para->getParD(level)->precursorBC.sizeQ = para->getParH(level)->precursorBC.sizeQ; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -335,32 +338,34 @@ void GridGenerator::allocArrays_BoundaryValues() para->getParD(level)->precursorBC.numberOfBCnodes = numberOfPrecursorValues; para->getParH(level)->numberOfPrecursorBCnodesRead = numberOfPrecursorValues * para->getD3Qxx(); para->getParD(level)->numberOfPrecursorBCnodesRead = numberOfPrecursorValues * para->getD3Qxx(); - + if (numberOfPrecursorValues > 1) { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// cudaMemoryManager->cudaAllocPrecursorBC(level); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// builder->getPrecursorValues( - para->getParH(level)->precursorBC.planeNeighborNT, para->getParH(level)->precursorBC.planeNeighborNB, - para->getParH(level)->precursorBC.planeNeighborST, para->getParH(level)->precursorBC.planeNeighborSB, - para->getParH(level)->precursorBC.weightsNT, para->getParH(level)->precursorBC.weightsNB, - para->getParH(level)->precursorBC.weightsST, para->getParH(level)->precursorBC.weightsSB, - para->getParH(level)->precursorBC.k, para->getParH(level)->transientBCInputFileReader, para->getParH(level)->precursorBC.numberOfPrecursorNodes, - para->getParH(level)->precursorBC.numberOfQuantities, para->getParH(level)->precursorBC.nTRead, + para->getParH(level)->precursorBC.planeNeighbor0PP, para->getParH(level)->precursorBC.planeNeighbor0PM, + para->getParH(level)->precursorBC.planeNeighbor0MP, para->getParH(level)->precursorBC.planeNeighbor0MM, + para->getParH(level)->precursorBC.weights0PP, para->getParH(level)->precursorBC.weights0PM, + para->getParH(level)->precursorBC.weights0MP, para->getParH(level)->precursorBC.weights0MM, + para->getParH(level)->precursorBC.k, para->getParH(level)->transientBCInputFileReader, para->getParH(level)->precursorBC.numberOfPrecursorNodes, + para->getParH(level)->precursorBC.numberOfQuantities, para->getParH(level)->precursorBC.timeStepsBetweenReads, para->getParH(level)->precursorBC.velocityX, para->getParH(level)->precursorBC.velocityY, para->getParH(level)->precursorBC.velocityZ, level); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// para->getParD(level)->precursorBC.numberOfPrecursorNodes = para->getParH(level)->precursorBC.numberOfPrecursorNodes; para->getParD(level)->precursorBC.numberOfQuantities = para->getParH(level)->precursorBC.numberOfQuantities; - para->getParD(level)->precursorBC.nTRead = para->getParH(level)->precursorBC.nTRead; + para->getParD(level)->precursorBC.timeStepsBetweenReads = para->getParH(level)->precursorBC.timeStepsBetweenReads; para->getParD(level)->precursorBC.velocityX = para->getParH(level)->precursorBC.velocityX; para->getParD(level)->precursorBC.velocityY = para->getParH(level)->precursorBC.velocityY; para->getParD(level)->precursorBC.velocityZ = para->getParH(level)->precursorBC.velocityZ; for(auto reader : para->getParH(level)->transientBCInputFileReader) { - if(reader->getNumberOfQuantities() != para->getParD(level)->precursorBC.numberOfQuantities) throw std::runtime_error("Number of quantities in reader and number of quantities needed for precursor don't match!"); + if(reader->getNumberOfQuantities() != para->getParD(level)->precursorBC.numberOfQuantities) + throw std::runtime_error( + "Number of quantities in reader and number of quantities needed for precursor don't match!"); } cudaMemoryManager->cudaCopyPrecursorBC(level); @@ -368,7 +373,7 @@ void GridGenerator::allocArrays_BoundaryValues() // read first timestep of precursor into next and copy to next on device for(auto reader : para->getParH(level)->transientBCInputFileReader) - { + { reader->getNextData(para->getParH(level)->precursorBC.next, para->getParH(level)->precursorBC.numberOfPrecursorNodes, 0); } @@ -380,9 +385,9 @@ void GridGenerator::allocArrays_BoundaryValues() para->getParD(level)->precursorBC.next = tmp; //read second timestep of precursor into next and copy next to device - real nextTime = para->getParD(level)->precursorBC.nTRead*pow(2,-((real)level))*para->getTimeRatio(); + real nextTime = para->getParD(level)->precursorBC.timeStepsBetweenReads*pow(2,-((real)level))*para->getTimeRatio(); for(auto reader : para->getParH(level)->transientBCInputFileReader) - { + { reader->getNextData(para->getParH(level)->precursorBC.next, para->getParH(level)->precursorBC.numberOfPrecursorNodes, nextTime); } @@ -398,7 +403,7 @@ void GridGenerator::allocArrays_BoundaryValues() //start usual cycle of loading, i.e. read velocities of timestep after current and copy asynchronously to device for(auto reader : para->getParH(level)->transientBCInputFileReader) - { + { reader->getNextData(para->getParH(level)->precursorBC.next, para->getParH(level)->precursorBC.numberOfPrecursorNodes, 2*nextTime); } @@ -476,7 +481,7 @@ void GridGenerator::initalValuesDomainDecompostion() if (para->getNumprocs() < 2) return; if ((para->getNumprocs() > 1) /*&& (procNeighborsSendX.size() == procNeighborsRecvX.size())*/) { - + // direction has to be changed in case of periodic BCs and multiple sub domains std::vector<int> fillOrder = { 0, 1, 2, 3, 4, 5 }; @@ -556,7 +561,7 @@ void GridGenerator::initalValuesDomainDecompostion() builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborX[indexProcessNeighbor].index, direction, level); if (level != builder->getNumberOfGridLevels() - 1 && para->useReducedCommunicationAfterFtoC) - indexRearrangement->initCommunicationArraysForCommAfterFinetoCoarseX(level, indexProcessNeighbor, direction); + indexRearrangement->initCommunicationArraysForCommAfterFinetoCoarseX(level, indexProcessNeighbor, direction); //////////////////////////////////////////////////////////////////////////////////////// cudaMemoryManager->cudaCopyProcessNeighborXIndex(level, indexProcessNeighbor); //////////////////////////////////////////////////////////////////////////////////////// @@ -619,7 +624,7 @@ void GridGenerator::initalValuesDomainDecompostion() //////////////////////////////////////////////////////////////////////////////////////// // malloc on host and device cudaMemoryManager->cudaAllocProcessNeighborY(level, indexProcessNeighbor); - //////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////// // init index arrays builder->getSendIndices(para->getParH(level)->sendProcessNeighborY[indexProcessNeighbor].index, direction, level); builder->getReceiveIndices(para->getParH(level)->recvProcessNeighborY[indexProcessNeighbor].index, direction, @@ -638,7 +643,7 @@ void GridGenerator::initalValuesDomainDecompostion() if (tempSend > 0) { int indexProcessNeighbor = (int)para->getParH(level)->sendProcessNeighborZ.size(); - + para->getParH(level)->sendProcessNeighborZ.emplace_back(); para->getParD(level)->sendProcessNeighborZ.emplace_back(); para->getParH(level)->recvProcessNeighborZ.emplace_back(); @@ -930,7 +935,7 @@ void GridGenerator::allocArrays_BoundaryQs() unsigned int sizeQ = para->getParH(i)->pressureBC.numberOfBCnodes; QforBoundaryConditions Q; getPointersToBoundaryConditions(Q, QQ, sizeQ); - + builder->getPressureQs(Q.q27, i); @@ -977,7 +982,7 @@ void GridGenerator::allocArrays_BoundaryQs() unsigned int sizeQ = para->getParH(i)->slipBC.numberOfBCnodes; QforBoundaryConditions Q; getPointersToBoundaryConditions(Q, QQ, sizeQ); - + builder->getSlipQs(Q.q27, i); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// cudaMemoryManager->cudaCopySlipBC(i); @@ -997,7 +1002,7 @@ void GridGenerator::allocArrays_BoundaryQs() unsigned int sizeQ = para->getParH(i)->stressBC.numberOfBCnodes; QforBoundaryConditions Q; getPointersToBoundaryConditions(Q, QQ, sizeQ); - + builder->getStressQs(Q.q27, i); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// cudaMemoryManager->cudaCopyStressBC(i); @@ -1165,7 +1170,7 @@ void GridGenerator::allocArrays_BoundaryQs() void GridGenerator::allocArrays_OffsetScale() { - for (uint level = 0; level < builder->getNumberOfGridLevels() - 1; level++) + for (uint level = 0; level < builder->getNumberOfGridLevels() - 1; level++) { const uint numberOfNodesPerLevelCF = builder->getNumberOfNodesCF(level); const uint numberOfNodesPerLevelFC = builder->getNumberOfNodesFC(level); @@ -1204,7 +1209,7 @@ void GridGenerator::allocArrays_OffsetScale() builder->getOffsetCF(para->getParH(level)->offCF.xOffCF, para->getParH(level)->offCF.yOffCF, para->getParH(level)->offCF.zOffCF, level); builder->getOffsetFC(para->getParH(level)->offFC.xOffFC, para->getParH(level)->offFC.yOffFC, para->getParH(level)->offFC.zOffFC, level); builder->getGridInterfaceIndices(para->getParH(level)->intCF.ICellCFC, para->getParH(level)->intCF.ICellCFF, para->getParH(level)->intFC.ICellFCC, para->getParH(level)->intFC.ICellFCF, level); - + if (para->getUseStreams() || para->getNumprocs() > 1) { // split fine-to-coarse indices into border and bulk interpolationGrouper->splitFineToCoarseIntoBorderAndBulk(level); @@ -1307,7 +1312,7 @@ std::string GridGenerator::verifyNeighborIndex(int level, int index , int &inval //std::cout << para->getParH(level)->coordinateX[1] << ", " << para->getParH(level)->coordinateY[1] << ", " << para->getParH(level)->coordinateZ[1] << std::endl; //std::cout << para->getParH(level)->coordinateX[para->getParH(level)->numberOfNodes - 1] << ", " << para->getParH(level)->coordinateY[para->getParH(level)->numberOfNodes - 1] << ", " << para->getParH(level)->coordinateZ[para->getParH(level)->numberOfNodes - 1] << std::endl; - + real maxX = para->getParH(level)->coordinateX[para->getParH(level)->numberOfNodes - 1] - delta; real maxY = para->getParH(level)->coordinateY[para->getParH(level)->numberOfNodes - 1] - delta; real maxZ = para->getParH(level)->coordinateZ[para->getParH(level)->numberOfNodes - 1] - delta; @@ -1348,8 +1353,8 @@ std::string GridGenerator::checkNeighbor(int level, real x, real y, real z, int if (!neighborValid) { oss << "NeighborX invalid from: (" << x << ", " << y << ", " << z << "), index: " << index << ", " - << direction << " neighborIndex: " << neighborIndex << - ", actual neighborCoords : (" << neighborCoordX << ", " << neighborCoordY << ", " << neighborCoordZ << + << direction << " neighborIndex: " << neighborIndex << + ", actual neighborCoords : (" << neighborCoordX << ", " << neighborCoordY << ", " << neighborCoordZ << "), expected neighborCoords : (" << neighborX << ", " << neighborY << ", " << neighborZ << ")\n"; numberOfWrongNeihgbors++; } @@ -1384,4 +1389,4 @@ void GridGenerator::getPointersToBoundaryConditions(QforBoundaryConditions& boun boundaryConditionStruct.q27[DIR_MMM] = &subgridDistances[DIR_MMM * numberOfBCnodes]; boundaryConditionStruct.q27[DIR_PMM] = &subgridDistances[DIR_PMM * numberOfBCnodes]; boundaryConditionStruct.q27[DIR_MPM] = &subgridDistances[DIR_MPM * numberOfBCnodes]; -} \ No newline at end of file +} diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h index cee661a0c1092e7a3d334018133fd2f963ada991..c97ed02a64da1d5fafa18150c75d149f96484d44 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.h @@ -78,7 +78,7 @@ public: void allocArrays_OffsetScale() override; void allocArrays_taggedFluidNodes() override; - void tagFluidNodeIndices(std::vector<uint> taggedFluidNodeIndices, CollisionTemplate tag, uint level) override; + void tagFluidNodeIndices(const std::vector<uint>& taggedFluidNodeIndices, CollisionTemplate tag, uint level) override; void sortFluidNodeTags() override; virtual void setDimensions() override; diff --git a/src/gpu/VirtualFluids_GPU/Factories/BoundaryConditionFactory.h b/src/gpu/VirtualFluids_GPU/Factories/BoundaryConditionFactory.h index f7cd7cc1a0dd1fc941547b5d102719a82eef9ca2..c6877cbfeffe5b32c0c2d336e46b02d68cd946a3 100644 --- a/src/gpu/VirtualFluids_GPU/Factories/BoundaryConditionFactory.h +++ b/src/gpu/VirtualFluids_GPU/Factories/BoundaryConditionFactory.h @@ -48,7 +48,7 @@ class Parameter; using boundaryCondition = std::function<void(LBMSimulationParameter *, QforBoundaryConditions *)>; using boundaryConditionWithParameter = std::function<void(Parameter *, QforBoundaryConditions *, const int level)>; -using precursorBoundaryConditionFunc = std::function<void(LBMSimulationParameter *, QforPrecursorBoundaryConditions *, real tRatio, real velocityRatio)>; +using precursorBoundaryConditionFunc = std::function<void(LBMSimulationParameter *, QforPrecursorBoundaryConditions *, real timeRatio, real velocityRatio)>; class BoundaryConditionFactory { diff --git a/src/gpu/VirtualFluids_GPU/FindQ/FindQ.h b/src/gpu/VirtualFluids_GPU/FindQ/FindQ.h index d1e8a08a7c0b4bdc64da5f3ce74e098e8326fd0d..551205bd54d9685e9aa6ab8be47ac9e274546f40 100644 --- a/src/gpu/VirtualFluids_GPU/FindQ/FindQ.h +++ b/src/gpu/VirtualFluids_GPU/FindQ/FindQ.h @@ -5,7 +5,6 @@ #include "lbm/constants/D3Q27.h" #include "Parameter/Parameter.h" - void findQ(Parameter* para, int lev); void findKforQ(Parameter* para, int lev); diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp index 253960f96d13cde56caffcf803b8c9650880a001..f5908517491e252eae5078ec5ede4d5ba452bda7 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp +++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp @@ -530,7 +530,7 @@ void CudaMemoryManager::cudaCopyProcessNeighborXIndex(int lev, unsigned int proc void CudaMemoryManager::cudaCopyProcessNeighborXFsHD(int lev, unsigned int processNeighbor, const unsigned int &memsizeFsRecv) { - if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::Border)) + if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::SubDomainBorder)) checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->recvProcessNeighborX[processNeighbor].f[0], parameter->getParH(lev)->recvProcessNeighborX[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsRecv, @@ -540,12 +540,12 @@ void CudaMemoryManager::cudaCopyProcessNeighborXFsHD(int lev, unsigned int proce parameter->getParH(lev)->recvProcessNeighborX[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsRecv, cudaMemcpyHostToDevice, - parameter->getStreamManager()->getStream(CudaStreamIndex::Border))); + parameter->getStreamManager()->getStream(CudaStreamIndex::SubDomainBorder))); } void CudaMemoryManager::cudaCopyProcessNeighborXFsDH(int lev, unsigned int processNeighbor, const unsigned int &memsizeFsSend) { - if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::Border)) + if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::SubDomainBorder)) checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->sendProcessNeighborX[processNeighbor].f[0], parameter->getParD(lev)->sendProcessNeighborX[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsSend, @@ -555,7 +555,7 @@ void CudaMemoryManager::cudaCopyProcessNeighborXFsDH(int lev, unsigned int proce parameter->getParD(lev)->sendProcessNeighborX[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsSend, cudaMemcpyDeviceToHost, - parameter->getStreamManager()->getStream(CudaStreamIndex::Border))); + parameter->getStreamManager()->getStream(CudaStreamIndex::SubDomainBorder))); } void CudaMemoryManager::cudaFreeProcessNeighborX(int lev, unsigned int processNeighbor) { @@ -600,7 +600,7 @@ void CudaMemoryManager::cudaCopyProcessNeighborYIndex(int lev, unsigned int proc } void CudaMemoryManager::cudaCopyProcessNeighborYFsHD(int lev, unsigned int processNeighbor, const unsigned int &memsizeFsRecv) { - if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::Border)) + if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::SubDomainBorder)) checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->recvProcessNeighborY[processNeighbor].f[0], parameter->getParH(lev)->recvProcessNeighborY[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsRecv, @@ -610,11 +610,11 @@ void CudaMemoryManager::cudaCopyProcessNeighborYFsHD(int lev, unsigned int proce parameter->getParH(lev)->recvProcessNeighborY[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsRecv, cudaMemcpyHostToDevice, - parameter->getStreamManager()->getStream(CudaStreamIndex::Border))); + parameter->getStreamManager()->getStream(CudaStreamIndex::SubDomainBorder))); } void CudaMemoryManager::cudaCopyProcessNeighborYFsDH(int lev, unsigned int processNeighbor, const unsigned int &memsizeFsSend) { - if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::Border)) + if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::SubDomainBorder)) checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->sendProcessNeighborY[processNeighbor].f[0], parameter->getParD(lev)->sendProcessNeighborY[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsSend, @@ -624,7 +624,7 @@ void CudaMemoryManager::cudaCopyProcessNeighborYFsDH(int lev, unsigned int proce parameter->getParD(lev)->sendProcessNeighborY[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsSend, cudaMemcpyDeviceToHost, - parameter->getStreamManager()->getStream(CudaStreamIndex::Border))); + parameter->getStreamManager()->getStream(CudaStreamIndex::SubDomainBorder))); } void CudaMemoryManager::cudaFreeProcessNeighborY(int lev, unsigned int processNeighbor) { @@ -670,7 +670,7 @@ void CudaMemoryManager::cudaCopyProcessNeighborZIndex(int lev, unsigned int proc void CudaMemoryManager::cudaCopyProcessNeighborZFsHD(int lev, unsigned int processNeighbor, const unsigned int &memsizeFsRecv) { - if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::Border)) + if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::SubDomainBorder)) checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->recvProcessNeighborZ[processNeighbor].f[0], parameter->getParH(lev)->recvProcessNeighborZ[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsRecv, @@ -680,12 +680,12 @@ void CudaMemoryManager::cudaCopyProcessNeighborZFsHD(int lev, unsigned int proce parameter->getParH(lev)->recvProcessNeighborZ[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsRecv, cudaMemcpyHostToDevice, - parameter->getStreamManager()->getStream(CudaStreamIndex::Border))); + parameter->getStreamManager()->getStream(CudaStreamIndex::SubDomainBorder))); } void CudaMemoryManager::cudaCopyProcessNeighborZFsDH(int lev, unsigned int processNeighbor, const unsigned int &memsizeFsSend) { - if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::Border)) + if (!parameter->getStreamManager()->streamIsRegistered(CudaStreamIndex::SubDomainBorder)) checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->sendProcessNeighborZ[processNeighbor].f[0], parameter->getParD(lev)->sendProcessNeighborZ[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsSend, @@ -695,7 +695,7 @@ void CudaMemoryManager::cudaCopyProcessNeighborZFsDH(int lev, unsigned int proce parameter->getParD(lev)->sendProcessNeighborZ[processNeighbor].f[0], parameter->getD3Qxx() * memsizeFsSend, cudaMemcpyDeviceToHost, - parameter->getStreamManager()->getStream(CudaStreamIndex::Border))); + parameter->getStreamManager()->getStream(CudaStreamIndex::SubDomainBorder))); } void CudaMemoryManager::cudaFreeProcessNeighborZ(int lev, unsigned int processNeighbor) { @@ -1669,28 +1669,28 @@ void CudaMemoryManager::cudaAllocPrecursorBC(int lev) checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.q27[0], parameter->getD3Qxx()*memSizeQReal)); - checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.planeNeighborNT, memSizeQUint)); - checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.planeNeighborNB, memSizeQUint)); - checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.planeNeighborST, memSizeQUint)); - checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.planeNeighborSB, memSizeQUint)); + checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.planeNeighbor0PP, memSizeQUint)); + checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.planeNeighbor0PM, memSizeQUint)); + checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.planeNeighbor0MP, memSizeQUint)); + checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.planeNeighbor0MM, memSizeQUint)); - checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.weightsNT, memSizeQReal)); - checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.weightsNB, memSizeQReal)); - checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.weightsST, memSizeQReal)); - checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.weightsSB, memSizeQReal)); + checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.weights0PP, memSizeQReal)); + checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.weights0PM, memSizeQReal)); + checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.weights0MP, memSizeQReal)); + checkCudaErrors( cudaMallocHost((void**) ¶meter->getParH(lev)->precursorBC.weights0MM, memSizeQReal)); checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.k, memSizeQInt)); checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.q27[0], parameter->getD3Qxx()*memSizeQReal)); - checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.planeNeighborNT, memSizeQUint)); - checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.planeNeighborNB, memSizeQUint)); - checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.planeNeighborST, memSizeQUint)); - checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.planeNeighborSB, memSizeQUint)); + checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.planeNeighbor0PP, memSizeQUint)); + checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.planeNeighbor0PM, memSizeQUint)); + checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.planeNeighbor0MP, memSizeQUint)); + checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.planeNeighbor0MM, memSizeQUint)); - checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.weightsNT, memSizeQReal)); - checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.weightsNB, memSizeQReal)); - checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.weightsST, memSizeQReal)); - checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.weightsSB, memSizeQReal)); + checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.weights0PP, memSizeQReal)); + checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.weights0PM, memSizeQReal)); + checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.weights0MP, memSizeQReal)); + checkCudaErrors( cudaMalloc((void**) ¶meter->getParD(lev)->precursorBC.weights0MM, memSizeQReal)); real memSize = memSizeQInt+4*memSizeQUint+(4+parameter->getD3Qxx())*memSizeQReal; setMemsizeGPU(memSize, false); @@ -1723,15 +1723,15 @@ void CudaMemoryManager::cudaCopyPrecursorBC(int lev) checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.q27[0], parameter->getParH(lev)->precursorBC.q27[0], memSizeQReal*parameter->getD3Qxx(), cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.planeNeighborNT, parameter->getParH(lev)->precursorBC.planeNeighborNT, memSizeQUint, cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.planeNeighborNB, parameter->getParH(lev)->precursorBC.planeNeighborNB, memSizeQUint, cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.planeNeighborST, parameter->getParH(lev)->precursorBC.planeNeighborST, memSizeQUint, cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.planeNeighborSB, parameter->getParH(lev)->precursorBC.planeNeighborSB, memSizeQUint, cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.planeNeighbor0PP, parameter->getParH(lev)->precursorBC.planeNeighbor0PP, memSizeQUint, cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.planeNeighbor0PM, parameter->getParH(lev)->precursorBC.planeNeighbor0PM, memSizeQUint, cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.planeNeighbor0MP, parameter->getParH(lev)->precursorBC.planeNeighbor0MP, memSizeQUint, cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.planeNeighbor0MM, parameter->getParH(lev)->precursorBC.planeNeighbor0MM, memSizeQUint, cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.weightsNT, parameter->getParH(lev)->precursorBC.weightsNT, memSizeQReal, cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.weightsNB, parameter->getParH(lev)->precursorBC.weightsNB, memSizeQReal, cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.weightsST, parameter->getParH(lev)->precursorBC.weightsST, memSizeQReal, cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.weightsSB, parameter->getParH(lev)->precursorBC.weightsSB, memSizeQReal, cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.weights0PP, parameter->getParH(lev)->precursorBC.weights0PP, memSizeQReal, cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.weights0PM, parameter->getParH(lev)->precursorBC.weights0PM, memSizeQReal, cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.weights0MP, parameter->getParH(lev)->precursorBC.weights0MP, memSizeQReal, cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->precursorBC.weights0MM, parameter->getParH(lev)->precursorBC.weights0MM, memSizeQReal, cudaMemcpyHostToDevice)); } void CudaMemoryManager::cudaCopyPrecursorData(int lev) { @@ -1749,29 +1749,29 @@ void CudaMemoryManager::cudaFreePrecursorBC(int lev) checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.q27[0])); - checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.planeNeighborNT)); - checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.planeNeighborNB)); - checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.planeNeighborST)); - checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.planeNeighborSB)); + checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.planeNeighbor0PP)); + checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.planeNeighbor0PM)); + checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.planeNeighbor0MP)); + checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.planeNeighbor0MM)); - checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.weightsNT)); - checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.weightsNB)); - checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.weightsST)); - checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.weightsSB)); + checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.weights0PP)); + checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.weights0PM)); + checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.weights0MP)); + checkCudaErrors( cudaFreeHost( parameter->getParH(lev)->precursorBC.weights0MM)); checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.k)); checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.q27[0])); - checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.planeNeighborNT)); - checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.planeNeighborNB)); - checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.planeNeighborST)); - checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.planeNeighborSB)); + checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.planeNeighbor0PP)); + checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.planeNeighbor0PM)); + checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.planeNeighbor0MP)); + checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.planeNeighbor0MM)); - checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.weightsNT)); - checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.weightsNB)); - checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.weightsST)); - checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.weightsSB)); + checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.weights0PP)); + checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.weights0PM)); + checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.weights0MP)); + checkCudaErrors( cudaFree( parameter->getParD(lev)->precursorBC.weights0MM)); } void CudaMemoryManager::cudaFreePrecursorData(int lev) @@ -3172,40 +3172,40 @@ void CudaMemoryManager::cudaAllocBladeCoords(ActuatorFarm* actuatorFarm) checkCudaErrors( cudaMallocHost((void**) &actuatorFarm->bladeCoordsYH, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); checkCudaErrors( cudaMallocHost((void**) &actuatorFarm->bladeCoordsZH, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsXDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsYDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsZDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsXDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsYDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsZDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsXDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsYDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsZDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsXDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsYDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeCoordsZDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); setMemsizeGPU(6.f*actuatorFarm->getNumberOfNodes(), false); } void CudaMemoryManager::cudaCopyBladeCoordsHtoD(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsXDNew, actuatorFarm->bladeCoordsXH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsYDNew, actuatorFarm->bladeCoordsYH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsZDNew, actuatorFarm->bladeCoordsZH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsXDCurrentTimestep, actuatorFarm->bladeCoordsXH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsYDCurrentTimestep, actuatorFarm->bladeCoordsYH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsZDCurrentTimestep, actuatorFarm->bladeCoordsZH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); } void CudaMemoryManager::cudaCopyBladeCoordsDtoH(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsXH, actuatorFarm->bladeCoordsXDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsYH, actuatorFarm->bladeCoordsYDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsZH, actuatorFarm->bladeCoordsZDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsXH, actuatorFarm->bladeCoordsXDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsYH, actuatorFarm->bladeCoordsYDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeCoordsZH, actuatorFarm->bladeCoordsZDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); } void CudaMemoryManager::cudaFreeBladeCoords(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsXDNew) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsYDNew) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsZDNew) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsXDCurrentTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsYDCurrentTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsZDCurrentTimestep) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsXDOld) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsYDOld) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsZDOld) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsXDPreviousTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsYDPreviousTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeCoordsZDPreviousTimestep) ); checkCudaErrors( cudaFreeHost(actuatorFarm->bladeCoordsXH) ); checkCudaErrors( cudaFreeHost(actuatorFarm->bladeCoordsYH) ); @@ -3239,40 +3239,40 @@ void CudaMemoryManager::cudaAllocBladeVelocities(ActuatorFarm* actuatorFarm) checkCudaErrors( cudaMallocHost((void**) &actuatorFarm->bladeVelocitiesYH, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); checkCudaErrors( cudaMallocHost((void**) &actuatorFarm->bladeVelocitiesZH, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesXDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesYDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesZDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesXDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesYDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesZDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesXDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesYDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesZDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesXDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesYDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeVelocitiesZDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); setMemsizeGPU(3.*sizeof(real)*actuatorFarm->getNumberOfNodes(), false); } void CudaMemoryManager::cudaCopyBladeVelocitiesHtoD(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesXDNew, actuatorFarm->bladeVelocitiesXH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesYDNew, actuatorFarm->bladeVelocitiesYH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesZDNew, actuatorFarm->bladeVelocitiesZH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesXDCurrentTimestep, actuatorFarm->bladeVelocitiesXH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesYDCurrentTimestep, actuatorFarm->bladeVelocitiesYH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesZDCurrentTimestep, actuatorFarm->bladeVelocitiesZH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); } void CudaMemoryManager::cudaCopyBladeVelocitiesDtoH(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesXH, actuatorFarm->bladeVelocitiesXDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesYH, actuatorFarm->bladeVelocitiesYDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesZH, actuatorFarm->bladeVelocitiesZDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesXH, actuatorFarm->bladeVelocitiesXDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesYH, actuatorFarm->bladeVelocitiesYDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeVelocitiesZH, actuatorFarm->bladeVelocitiesZDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); } void CudaMemoryManager::cudaFreeBladeVelocities(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesXDNew) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesYDNew) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesZDNew) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesXDCurrentTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesYDCurrentTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesZDCurrentTimestep) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesXDOld) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesYDOld) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesZDOld) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesXDPreviousTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesYDPreviousTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeVelocitiesZDPreviousTimestep) ); checkCudaErrors( cudaFreeHost(actuatorFarm->bladeVelocitiesXH) ); checkCudaErrors( cudaFreeHost(actuatorFarm->bladeVelocitiesYH) ); @@ -3285,40 +3285,40 @@ void CudaMemoryManager::cudaAllocBladeForces(ActuatorFarm* actuatorFarm) checkCudaErrors( cudaMallocHost((void**) &actuatorFarm->bladeForcesYH, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); checkCudaErrors( cudaMallocHost((void**) &actuatorFarm->bladeForcesZH, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesXDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesYDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesZDNew, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesXDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesYDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesZDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesXDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesYDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); - checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesZDOld, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesXDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesYDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); + checkCudaErrors( cudaMalloc((void**) &actuatorFarm->bladeForcesZDPreviousTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes()) ); setMemsizeGPU(3.*sizeof(real)*actuatorFarm->getNumberOfNodes(), false); } void CudaMemoryManager::cudaCopyBladeForcesHtoD(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesXDNew, actuatorFarm->bladeForcesXH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesYDNew, actuatorFarm->bladeForcesYH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesZDNew, actuatorFarm->bladeForcesZH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesXDCurrentTimestep, actuatorFarm->bladeForcesXH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesYDCurrentTimestep, actuatorFarm->bladeForcesYH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesZDCurrentTimestep, actuatorFarm->bladeForcesZH, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyHostToDevice) ); } void CudaMemoryManager::cudaCopyBladeForcesDtoH(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesXH, actuatorFarm->bladeForcesXDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesYH, actuatorFarm->bladeForcesYDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); - checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesZH, actuatorFarm->bladeForcesZDNew, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesXH, actuatorFarm->bladeForcesXDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesYH, actuatorFarm->bladeForcesYDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); + checkCudaErrors( cudaMemcpy(actuatorFarm->bladeForcesZH, actuatorFarm->bladeForcesZDCurrentTimestep, sizeof(real)*actuatorFarm->getNumberOfNodes(), cudaMemcpyDeviceToHost) ); } void CudaMemoryManager::cudaFreeBladeForces(ActuatorFarm* actuatorFarm) { - checkCudaErrors( cudaFree(actuatorFarm->bladeForcesXDNew) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeForcesYDNew) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeForcesZDNew) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeForcesXDCurrentTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeForcesYDCurrentTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeForcesZDCurrentTimestep) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeForcesXDOld) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeForcesYDOld) ); - checkCudaErrors( cudaFree(actuatorFarm->bladeForcesZDOld) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeForcesXDPreviousTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeForcesYDPreviousTimestep) ); + checkCudaErrors( cudaFree(actuatorFarm->bladeForcesZDPreviousTimestep) ); checkCudaErrors( cudaFreeHost(actuatorFarm->bladeForcesXH) ); checkCudaErrors( cudaFreeHost(actuatorFarm->bladeForcesYH) ); @@ -3472,15 +3472,15 @@ void CudaMemoryManager::cudaFreeProbeQuantitiesAndOffsets(Probe* probe, int leve void CudaMemoryManager::cudaAllocPrecursorWriter(PrecursorWriter* writer, int level) { auto prec = writer->getPrecursorStruct(level); - size_t indSize = prec->nPoints*sizeof(uint); + size_t indSize = prec->numberOfPointsInBC*sizeof(uint); checkCudaErrors( cudaStreamCreate(&prec->stream) ); checkCudaErrors( cudaMallocHost((void**) &prec->indicesH, indSize)); checkCudaErrors( cudaMalloc((void**) &prec->indicesD, indSize)); - size_t dataSize = prec->nPoints*sizeof(real)*prec->nQuantities; - size_t dataSizeH = dataSize * prec->timestepsPerFile; + size_t dataSize = prec->numberOfPointsInBC*sizeof(real)*prec->numberOfQuantities; + size_t dataSizeH = dataSize * prec->numberOfTimestepsPerFile; checkCudaErrors( cudaMallocHost((void**) &prec->dataH, dataSizeH)); checkCudaErrors( cudaMallocHost((void**) &prec->bufferH, dataSizeH)); @@ -3492,16 +3492,16 @@ void CudaMemoryManager::cudaAllocPrecursorWriter(PrecursorWriter* writer, int le void CudaMemoryManager::cudaCopyPrecursorWriterIndicesHtoD(PrecursorWriter* writer, int level) { - checkCudaErrors( cudaMemcpy(writer->getPrecursorStruct(level)->indicesD, writer->getPrecursorStruct(level)->indicesH, writer->getPrecursorStruct(level)->nPoints*sizeof(uint), cudaMemcpyHostToDevice) ); + checkCudaErrors( cudaMemcpy(writer->getPrecursorStruct(level)->indicesD, writer->getPrecursorStruct(level)->indicesH, writer->getPrecursorStruct(level)->numberOfPointsInBC*sizeof(uint), cudaMemcpyHostToDevice) ); } void CudaMemoryManager::cudaCopyPrecursorWriterOutputVariablesDtoH(PrecursorWriter* writer, int level) { auto prec = writer->getPrecursorStruct(level); - int sizeTimestep = prec->nPoints*prec->nQuantities; + int sizeTimestep = prec->numberOfPointsInBC*prec->numberOfQuantities; checkCudaErrors( cudaStreamSynchronize(prec->stream) ); - checkCudaErrors( cudaMemcpyAsync( &prec->bufferH[prec->timestepsBuffered*sizeTimestep], prec->bufferD, sizeof(real)*sizeTimestep, cudaMemcpyDeviceToHost, prec->stream)); + checkCudaErrors( cudaMemcpyAsync( &prec->bufferH[prec->numberOfTimestepsBuffered*sizeTimestep], prec->bufferD, sizeof(real)*sizeTimestep, cudaMemcpyDeviceToHost, prec->stream)); } void CudaMemoryManager::cudaFreePrecursorWriter(PrecursorWriter* writer, int level) diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh index b35e01eb997723eb12f5645857bc230536fe97fe..567a4112e935e0a154288ec7beb1fc82d01c9d7a 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh +++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh @@ -53,130 +53,130 @@ __global__ void LB_Kernel_Casc_SP_MS_OHM_27( real s9, bool EvenOrOdd); __global__ void LB_Kernel_Kum_New_Comp_SRT_SP_27( - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd); + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd); __global__ void LB_Kernel_Cumulant_D3Q27All4(real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd); + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd); __global__ void LB_Kernel_Kum_AA2016_Comp_Bulk_SP_27(real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd); + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd); __global__ void LB_Kernel_Kum_1h_SP_27( real omega, - real deltaPhi, - real angularVelocity, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* coordX, - real* coordY, - real* coordZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd); + real deltaPhi, + real angularVelocity, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* coordX, + real* coordY, + real* coordZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd); __global__ void LB_Kernel_Cascade_SP_27( real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd); + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd); __global__ void LB_Kernel_Kum_New_SP_27( real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd); + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd); __global__ void LB_Kernel_Kum_IsoTest_SP_27( real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - real* dxxUx, - real* dyyUy, - real* dzzUz, - int size_Mat, - bool EvenOrOdd); + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + real* dxxUx, + real* dyyUy, + real* dzzUz, + int size_Mat, + bool EvenOrOdd); __global__ void LB_Kernel_Kum_Comp_SP_27(real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd); + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd); __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27( - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd); + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd); __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27( - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd); + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd); __global__ void Cumulant_One_chim_Comp_SP_27( - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd); + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd); inline __device__ void forwardChimeraWithK(real &mfa, real &mfb, real &mfc, real vv, real v2, real K); @@ -189,57 +189,57 @@ inline __device__ void backwardChimeraWithK(real &mfa, real &mfb, real &mfc, rea __global__ void LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27( - real omega_in, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - real* veloX, - real* veloY, - real* veloZ, - real* DDStart, - real* turbulentViscosity, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd); + real omega_in, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + real* veloX, + real* veloY, + real* veloZ, + real* DDStart, + real* turbulentViscosity, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd); __global__ void LB_Kernel_PM_Cum_One_Comp_SP_27( real omega, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - real porosity, - real darcy, - real forchheimer, - unsigned int sizeOfPorousMedia, - unsigned int* nodeIdsPorousMedia, - bool EvenOrOdd); + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + real porosity, + real darcy, + real forchheimer, + unsigned int sizeOfPorousMedia, + unsigned int* nodeIdsPorousMedia, + bool EvenOrOdd); __global__ void LB_Kernel_AD_Incomp_7( real diffusivity, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - real* DD7, - int size_Mat, - bool EvenOrOdd); + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + real* DD7, + int size_Mat, + bool EvenOrOdd); __global__ void LB_Kernel_AD_Incomp_27( real diffusivity, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - real* DD27, - int size_Mat, - bool EvenOrOdd); + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + real* DD27, + int size_Mat, + bool EvenOrOdd); __global__ void LBInit27( int myid, int numprocs, @@ -296,21 +296,21 @@ __global__ void InitAD27(unsigned int* neighborX, bool EvenOrOdd); __global__ void LB_PostProcessor_F3_2018_Fehlberg( - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* rhoOut, - real* vxOut, - real* vyOut, - real* vzOut, - real* DDStart, - real* G6, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd); + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* rhoOut, + real* vxOut, + real* vyOut, + real* vzOut, + real* DDStart, + real* G6, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd); __global__ void LBCalcMac27( real* vxD, real* vyD, @@ -338,17 +338,17 @@ __global__ void LBCalcMacSP27( real* vxD, bool isEvenTimestep); __global__ void LBCalcMacCompSP27( real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD, - bool isEvenTimestep); + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD, + bool isEvenTimestep); __global__ void CalcConc7( real* Conc, unsigned int* geoD, @@ -360,26 +360,26 @@ __global__ void CalcConc7( real* Conc, bool isEvenTimestep); __global__ void GetPlaneConc7(real* Conc, - int* kPC, - unsigned int numberOfPointskPC, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD7, - bool isEvenTimestep); + int* kPC, + unsigned int numberOfPointskPC, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD7, + bool isEvenTimestep); __global__ void GetPlaneConc27(real* Conc, - int* kPC, - unsigned int numberOfPointskPC, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD27, - bool isEvenTimestep); + int* kPC, + unsigned int numberOfPointskPC, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD27, + bool isEvenTimestep); __global__ void CalcConc27(real* Conc, unsigned int* geoD, @@ -404,33 +404,33 @@ __global__ void LBCalcMedSP27( real* vxD, bool isEvenTimestep); __global__ void LBCalcMedCompSP27( real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD, - bool isEvenTimestep); + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD, + bool isEvenTimestep); __global__ void LBCalcMedCompAD27( - real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - real* concD, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD, - real* DD_AD, - bool isEvenTimestep); + real* vxD, + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + real* concD, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD, + real* DD_AD, + bool isEvenTimestep); __global__ void LBCalcMacMedSP27( real* vxD, real* vyD, @@ -446,115 +446,115 @@ __global__ void LBCalcMacMedSP27( real* vxD, bool isEvenTimestep); __global__ void LBResetMedianValuesSP27( - real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - unsigned int size_Mat, - bool isEvenTimestep); + real* vxD, + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void LBResetMedianValuesAD27( - real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - real* concD, - unsigned int size_Mat, - bool isEvenTimestep); + real* vxD, + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + real* concD, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void LBCalc2ndMomentsIncompSP27( real* kxyFromfcNEQ, - real* kyzFromfcNEQ, - real* kxzFromfcNEQ, - real* kxxMyyFromfcNEQ, - real* kxxMzzFromfcNEQ, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD, - bool isEvenTimestep); + real* kyzFromfcNEQ, + real* kxzFromfcNEQ, + real* kxxMyyFromfcNEQ, + real* kxxMzzFromfcNEQ, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD, + bool isEvenTimestep); __global__ void LBCalc2ndMomentsCompSP27(real* kxyFromfcNEQ, - real* kyzFromfcNEQ, - real* kxzFromfcNEQ, - real* kxxMyyFromfcNEQ, - real* kxxMzzFromfcNEQ, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD, - bool isEvenTimestep); + real* kyzFromfcNEQ, + real* kxzFromfcNEQ, + real* kxxMyyFromfcNEQ, + real* kxxMzzFromfcNEQ, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD, + bool isEvenTimestep); __global__ void LBCalc3rdMomentsIncompSP27( real* CUMbbb, - real* CUMabc, - real* CUMbac, - real* CUMbca, - real* CUMcba, - real* CUMacb, - real* CUMcab, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd); + real* CUMabc, + real* CUMbac, + real* CUMbca, + real* CUMcba, + real* CUMacb, + real* CUMcab, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd); __global__ void LBCalc3rdMomentsCompSP27(real* CUMbbb, - real* CUMabc, - real* CUMbac, - real* CUMbca, - real* CUMcba, - real* CUMacb, - real* CUMcab, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd); + real* CUMabc, + real* CUMbac, + real* CUMbca, + real* CUMcba, + real* CUMacb, + real* CUMcab, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd); __global__ void LBCalcHigherMomentsIncompSP27( real* CUMcbb, - real* CUMbcb, - real* CUMbbc, - real* CUMcca, - real* CUMcac, - real* CUMacc, - real* CUMbcc, - real* CUMcbc, - real* CUMccb, - real* CUMccc, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd); + real* CUMbcb, + real* CUMbbc, + real* CUMcca, + real* CUMcac, + real* CUMacc, + real* CUMbcc, + real* CUMcbc, + real* CUMccb, + real* CUMccc, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd); __global__ void LBCalcHigherMomentsCompSP27( real* CUMcbb, - real* CUMbcb, - real* CUMbbc, - real* CUMcca, - real* CUMcac, - real* CUMacc, - real* CUMbcc, - real* CUMcbc, - real* CUMccb, - real* CUMccc, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd); + real* CUMbcb, + real* CUMbbc, + real* CUMcca, + real* CUMcac, + real* CUMacc, + real* CUMbcc, + real* CUMcbc, + real* CUMccb, + real* CUMccc, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd); __global__ void LBCalcMeasurePoints(real* vxMP, real* vyMP, @@ -612,60 +612,60 @@ __global__ void QDevice27(real* distributions, bool isEvenTimestep); __global__ void QDeviceComp27( - real* distributions, - int* subgridDistanceIndices, - real* subgridDistances, - unsigned int numberOfBCnodes, - real omega, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep); + real* distributions, + int* subgridDistanceIndices, + real* subgridDistances, + unsigned int numberOfBCnodes, + real omega, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep); __global__ void QDeviceCompThinWallsPartOne27(real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); - -__global__ void QDevice3rdMomentsComp27( real* distributions, - int* subgridDistanceIndices, - real* subgridDistances, - unsigned int numberOfBCnodes, - real omega, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep); + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); + +__global__ void QDevice3rdMomentsComp27( real* distributions, + int* subgridDistanceIndices, + real* subgridDistances, + unsigned int numberOfBCnodes, + real omega, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep); __global__ void QDeviceIncompHighNu27(real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep); + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep); __global__ void QDeviceCompHighNu27( real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); //Velocity BCs __global__ void QVelDevPlainBB27( @@ -683,39 +683,39 @@ __global__ void QVelDevPlainBB27( bool isEvenTimestep); __global__ void QVelDevCouette27(real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QVelDev1h27( int inx, - int iny, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - real Phi, - real angularVelocity, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* coordX, - real* coordY, - real* coordZ, - unsigned int size_Mat, - bool isEvenTimestep); + int iny, + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + real Phi, + real angularVelocity, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* coordX, + real* coordY, + real* coordZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QVelDevice27(int inx, int iny, @@ -734,107 +734,107 @@ __global__ void QVelDevice27(int inx, bool isEvenTimestep); __global__ void QVelDeviceCompPlusSlip27(real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QVelDeviceComp27(real* velocityX, - real* velocityY, - real* velocityZ, - real* distribution, - int* subgridDistanceIndices, - real* subgridDistances, - unsigned int numberOfBCnodes, - real omega, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep); + real* velocityY, + real* velocityZ, + real* distribution, + int* subgridDistanceIndices, + real* subgridDistances, + unsigned int numberOfBCnodes, + real omega, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep); __global__ void QVelDeviceCompThinWallsPartOne27( - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - uint numberOfBCnodes, - real om1, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - uint size_Mat, - bool isEvenTimestep); + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + uint numberOfBCnodes, + real om1, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + uint size_Mat, + bool isEvenTimestep); __global__ void QThinWallsPartTwo27( - real* DD, - int* k_Q, - real* QQ, - uint numberOfBCnodes, - uint* geom, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - uint* neighborWSB, - uint size_Mat, - bool isEvenTimestep); + real* DD, + int* k_Q, + real* QQ, + uint numberOfBCnodes, + uint* geom, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + uint* neighborWSB, + uint size_Mat, + bool isEvenTimestep); __global__ void QVelDeviceCompZeroPress27( - real* velocityX, - real* velocityY, - real* velocityZ, - real* distribution, - int* subgridDistanceIndices, - real* subgridDistances, - unsigned int numberOfBCnodes, - real omega, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep); + real* velocityX, + real* velocityY, + real* velocityZ, + real* distribution, + int* subgridDistanceIndices, + real* subgridDistances, + unsigned int numberOfBCnodes, + real omega, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep); __global__ void QVelDeviceIncompHighNu27(real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QVelDeviceCompHighNu27( real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QVeloDeviceEQ27(real* VeloX, - real* VeloY, - real* VeloZ, + real* VeloY, + real* VeloZ, real* DD, int* k_Q, int numberOfBCnodes, @@ -846,18 +846,18 @@ __global__ void QVeloDeviceEQ27(real* VeloX, bool isEvenTimestep); __global__ void QVeloStreetDeviceEQ27( - real* veloXfraction, - real* veloYfraction, - int* naschVelo, - real* DD, - int* naschIndex, - int numberOfStreetNodes, - real velocityRatio, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - uint size_Mat, - bool isEvenTimestep); + real* veloXfraction, + real* veloYfraction, + int* naschVelo, + real* DD, + int* naschIndex, + int numberOfStreetNodes, + real velocityRatio, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + uint size_Mat, + bool isEvenTimestep); //Slip BCs __global__ void QSlipDevice27(real* DD, @@ -872,135 +872,135 @@ __global__ void QSlipDevice27(real* DD, bool isEvenTimestep); __global__ void QSlipDeviceComp27(real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QSlipDeviceComp27TurbViscosity( - real* distributions, - int* subgridDistanceIndices, + real* distributions, + int* subgridDistanceIndices, real* subgridDistances, unsigned int numberOfBCnodes, - real omega, + real omega, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, real* turbViscosity, - unsigned int numberOfLBnodes, + unsigned int numberOfLBnodes, bool isEvenTimestep); __global__ void QSlipPressureDeviceComp27TurbViscosity( - real* distributions, - int* subgridDistanceIndices, + real* distributions, + int* subgridDistanceIndices, real* subgridDistances, unsigned int numberOfBCnodes, - real omega, + real omega, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, real* turbViscosity, - unsigned int numberOfLBnodes, + unsigned int numberOfLBnodes, bool isEvenTimestep); __global__ void QSlipGeomDeviceComp27(real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - real* NormalX, - real* NormalY, - real* NormalZ, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + real* NormalX, + real* NormalY, + real* NormalZ, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QSlipNormDeviceComp27(real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - real* NormalX, - real* NormalY, - real* NormalZ, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + real* NormalX, + real* NormalY, + real* NormalZ, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); // Stress BCs (wall model) __global__ void QStressDeviceComp27(real* DD, - int* k_Q, - int* k_N, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - real* turbViscosity, - real* vx, - real* vy, - real* vz, - real* normalX, - real* normalY, - real* normalZ, - real* vx_bc, - real* vy_bc, - real* vz_bc, - real* vx1, - real* vy1, - real* vz1, - int* samplingOffset, - real* z0, - bool hasWallModelMonitor, - real* u_star_monitor, - real* Fx_monitor, - real* Fy_monitor, - real* Fz_monitor, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + int* k_N, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + real* turbViscosity, + real* vx, + real* vy, + real* vz, + real* normalX, + real* normalY, + real* normalZ, + real* vx_bc, + real* vy_bc, + real* vz_bc, + real* vx1, + real* vy1, + real* vz1, + int* samplingOffset, + real* z0, + bool hasWallModelMonitor, + real* u_star_monitor, + real* Fx_monitor, + real* Fy_monitor, + real* Fz_monitor, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void BBStressDevice27( real* DD, - int* k_Q, - int* k_N, - real* QQ, - unsigned int numberOfBCnodes, - real* vx, - real* vy, - real* vz, - real* normalX, - real* normalY, - real* normalZ, - real* vx_bc, - real* vy_bc, - real* vz_bc, - real* vx1, - real* vy1, - real* vz1, - int* samplingOffset, - real* z0, - bool hasWallModelMonitor, - real* u_star_monitor, - real* Fx_monitor, - real* Fy_monitor, - real* Fz_monitor, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + int* k_N, + real* QQ, + unsigned int numberOfBCnodes, + real* vx, + real* vy, + real* vz, + real* normalX, + real* normalY, + real* normalZ, + real* vx_bc, + real* vy_bc, + real* vz_bc, + real* vx1, + real* vy1, + real* vz1, + int* samplingOffset, + real* z0, + bool hasWallModelMonitor, + real* u_star_monitor, + real* Fx_monitor, + real* Fy_monitor, + real* Fz_monitor, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void BBStressPressureDevice27( real* DD, - int* k_Q, + int* k_Q, int* k_N, real* QQ, unsigned int numberOfBCnodes, @@ -1043,19 +1043,19 @@ __global__ void QPressDevice27( real* rhoBC, bool isEvenTimestep); __global__ void QPressDeviceAntiBB27( real* rhoBC, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QPressDeviceFixBackflow27( real* rhoBC, real* DD, @@ -1080,43 +1080,43 @@ __global__ void QPressDeviceDirDepBot27( real* rhoBC, bool isEvenTimestep); __global__ void QPressNoRhoDevice27( real* rhoBC, - real* distributions, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep, - int direction); + real* distributions, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep, + int direction); __global__ void QPressZeroRhoOutflowDevice27( real* rhoBC, - real* distributions, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep, - int direction, - real densityCorrectionFactor); + real* distributions, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep, + int direction, + real densityCorrectionFactor); __global__ void QInflowScaleByPressDevice27( real* rhoBC, - real* DD, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QPressDeviceOld27(real* rhoBC, real* DD, @@ -1131,16 +1131,16 @@ __global__ void QPressDeviceOld27(real* rhoBC, bool isEvenTimestep); __global__ void QPressDeviceIncompNEQ27( real* rhoBC, - real* DD, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QPressDeviceNEQ27(real* rhoBC, real* distribution, @@ -1168,13 +1168,13 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, bool isEvenTimestep); __global__ void QPressDeviceZero27( real* DD, - int* k_Q, - unsigned int numberOfBCnodes, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + unsigned int numberOfBCnodes, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QPressDeviceFake27(real* rhoBC, real* DD, @@ -1199,16 +1199,16 @@ __global__ void BBDevice27(real* distributions, bool isEvenTimestep); __global__ void QPressDevice27_IntBB(real* rho, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); // TODO: https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/issues/29 //Schlaffer BCs @@ -1250,23 +1250,23 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, real omega, real* distributions, real* subgridDistances, - uint* neighborX, - uint* neighborY, + uint* neighborX, + uint* neighborY, uint* neighborZ, - uint* neighborsNT, + uint* neighborsNT, uint* neighborsNB, uint* neighborsST, uint* neighborsSB, - real* weightsNT, - real* weightsNB, - real* weightsST, - real* weightsSB, - real* vLast, + real* weights0PP, + real* weights0PM, + real* weights0MP, + real* weights0MM, + real* vLast, real* vCurrent, real velocityX, real velocityY, real velocityZ, - real tRatio, + real timeRatio, real velocityRatio, unsigned long long numberOfLBnodes, bool isEvenTimestep); @@ -1276,70 +1276,70 @@ __global__ void PrecursorDeviceEQ27( int* subgridDistanceIndices, int numberOfPrecursorNodes, real omega, real* distributions, - uint* neighborX, - uint* neighborY, + uint* neighborX, + uint* neighborY, uint* neighborZ, - uint* neighborsNT, + uint* neighborsNT, uint* neighborsNB, uint* neighborsST, uint* neighborsSB, - real* weightsNT, - real* weightsNB, - real* weightsST, - real* weightsSB, - real* vLast, + real* weights0PP, + real* weights0PM, + real* weights0MP, + real* weights0MM, + real* vLast, real* vCurrent, real velocityX, real velocityY, real velocityZ, - real tRatio, + real timeRatio, real velocityRatio, unsigned long long numberOfLBnodes, bool isEvenTimestep); __global__ void PrecursorDeviceDistributions( int* subgridDistanceIndices, - int numberOfBCNodes, - int numberOfPrecursorNodes, - real* distributions, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - uint* neighborsNT, - uint* neighborsNB, - uint* neighborsST, - uint* neighborsSB, - real* weightsNT, - real* weightsNB, - real* weightsST, - real* weightsSB, - real* fsLast, - real* fsNext, - real tRatio, - unsigned long long numberOfLBnodes, - bool isEvenTimestep); + int numberOfBCNodes, + int numberOfPrecursorNodes, + real* distributions, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + uint* neighborsNT, + uint* neighborsNB, + uint* neighborsST, + uint* neighborsSB, + real* weights0PP, + real* weights0PM, + real* weights0MP, + real* weights0MM, + real* fsLast, + real* fsNext, + real timeRatio, + unsigned long long numberOfLBnodes, + bool isEvenTimestep); __global__ void QPrecursorDeviceDistributions( int* subgridDistanceIndices, - real* subgridDistances, - int sizeQ, - int numberOfBCNodes, - int numberOfPrecursorNodes, - real* distributions, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - uint* neighborsNT, - uint* neighborsNB, - uint* neighborsST, - uint* neighborsSB, - real* weightsNT, - real* weightsNB, - real* weightsST, - real* weightsSB, - real* fsLast, - real* fsNext, - real tRatio, - unsigned long long numberOfLBnodes, - bool isEvenTimestep); - + real* subgridDistances, + int sizeQ, + int numberOfBCNodes, + int numberOfPrecursorNodes, + real* distributions, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + uint* neighborsNT, + uint* neighborsNB, + uint* neighborsST, + uint* neighborsSB, + real* weights0PP, + real* weights0PM, + real* weights0MP, + real* weights0MM, + real* fsLast, + real* fsNext, + real timeRatio, + unsigned long long numberOfLBnodes, + bool isEvenTimestep); + //Advection / Diffusion BCs __global__ void QAD7( real* DD, real* DD7, @@ -1358,62 +1358,62 @@ __global__ void QAD7( real* DD, ////////////////////////////////////////////////////////////////////////// //! \brief \ref Advection_Diffusion_Device_Kernel : Factorized central moments for Advection Diffusion Equation __global__ void Factorized_Central_Moments_Advection_Diffusion_Device_Kernel( - real omegaDiffusivity, - uint* typeOfGridNode, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - real* distributions, - real* distributionsAD, - int size_Mat, - real* forces, - bool isEvenTimestep); + real omegaDiffusivity, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + real* distributionsAD, + int size_Mat, + real* forces, + bool isEvenTimestep); ////////////////////////////////////////////////////////////////////////// //! \brief \ref AD_SlipVelDeviceComp : device function for the slip-AD boundary condition __global__ void AD_SlipVelDeviceComp( - real * normalX, - real * normalY, - real * normalZ, - real * distributions, - real * distributionsAD, - int* QindexArray, - real * Qarrays, - uint numberOfBCnodes, - real omegaDiffusivity, - uint * neighborX, - uint * neighborY, - uint * neighborZ, - uint size_Mat, - bool isEvenTimestep); + real * normalX, + real * normalY, + real * normalZ, + real * distributions, + real * distributionsAD, + int* QindexArray, + real * Qarrays, + uint numberOfBCnodes, + real omegaDiffusivity, + uint * neighborX, + uint * neighborY, + uint * neighborZ, + uint size_Mat, + bool isEvenTimestep); __global__ void QADDirichlet27( real* DD, - real* DD27, - real* temp, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD27, + real* temp, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QADBB27( real* DD, - real* DD27, - real* temp, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD27, + real* temp, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QADVel7( real* DD, real* DD7, @@ -1476,105 +1476,105 @@ __global__ void QADPress27( real* DD, bool isEvenTimestep); __global__ void QADPressNEQNeighbor27( - real* DD, - real* DD27, - int* k_Q, - int* k_N, - int numberOfBCnodes, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep - ); + real* DD, + real* DD27, + int* k_Q, + int* k_N, + int numberOfBCnodes, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep + ); __global__ void QNoSlipADincomp7( real* DD, - real* DD7, - real* temp, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD7, + real* temp, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QNoSlipADincomp27( real* DD, - real* DD27, - real* temp, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD27, + real* temp, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QADVeloIncomp7( real* DD, - real* DD7, - real* temp, - real* velo, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD7, + real* temp, + real* velo, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QADVeloIncomp27( real* DD, - real* DD27, - real* temp, - real* velo, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD27, + real* temp, + real* velo, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QADPressIncomp7(real* DD, - real* DD7, - real* temp, - real* velo, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD7, + real* temp, + real* velo, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void QADPressIncomp27( real* DD, - real* DD27, - real* temp, - real* velo, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* DD27, + real* temp, + real* velo, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); //Propeller BC __global__ void PropellerBC(unsigned int* neighborX, @@ -1585,7 +1585,7 @@ __global__ void PropellerBC(unsigned int* neighborX, real* uy, real* uz, int* k_Q, - unsigned int size_Prop, + unsigned int size_Prop, unsigned int size_Mat, unsigned int* bcMatD, real* DD, @@ -1602,19 +1602,19 @@ __global__ void scaleCF27(real* DC, unsigned int* neighborFX, unsigned int* neighborFY, unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, unsigned int* posCSWB, unsigned int* posFSWB, unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF); + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF); __global__ void scaleCFEff27(real* DC, real* DF, @@ -1624,18 +1624,18 @@ __global__ void scaleCFEff27(real* DC, unsigned int* neighborFX, unsigned int* neighborFY, unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, unsigned int* posCSWB, unsigned int* posFSWB, unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, unsigned int nyF, OffCF offCF); @@ -1709,233 +1709,233 @@ __global__ void scaleCF_Fix_27(real* DC, OffCF offCF); __global__ void scaleCF_Fix_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCF_0817_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCF_comp_D3Q27F3_2018( real* DC, - real* DF, - real* G6, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + real* G6, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCF_comp_D3Q27F3( real* DC, - real* DF, - real* G6, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + real* G6, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCF_staggered_time_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCF_RhoSq_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCF_compressible( - real* distributionsCoarse, - real* distributionsFine, + real* distributionsCoarse, + real* distributionsFine, unsigned int* neighborXcoarse, unsigned int* neighborYcoarse, unsigned int* neighborZcoarse, unsigned int* neighborXfine, unsigned int* neighborYfine, unsigned int* neighborZfine, - unsigned int numberOfLBnodesCoarse, - unsigned int numberOfLBnodesFine, + unsigned int numberOfLBnodesCoarse, + unsigned int numberOfLBnodesFine, bool isEvenTimestep, - unsigned int* indicesCoarseMMM, - unsigned int* indicesFineMMM, - unsigned int numberOfInterfaceNodes, - real omegaCoarse, - real omegaFine, + unsigned int* indicesCoarseMMM, + unsigned int* indicesFineMMM, + unsigned int numberOfInterfaceNodes, + real omegaCoarse, + real omegaFine, OffCF offsetCF); __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCF_AA2016_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCF_NSPress_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffCF offCF); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffCF offCF); __global__ void scaleCFThSMG7( real* DC, real* DF, @@ -1994,7 +1994,7 @@ __global__ void scaleCFThS27(real* DC, unsigned int kCF, real nu, real diffusivity_fine, - OffCF offCF); + OffCF offCF); //fine to coarse __global__ void scaleFC27(real* DC, @@ -2005,18 +2005,18 @@ __global__ void scaleFC27(real* DC, unsigned int* neighborFX, unsigned int* neighborFY, unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, unsigned int* posC, unsigned int* posFSWB, unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, unsigned int nyF); __global__ void scaleFCEff27(real* DC, @@ -2112,145 +2112,145 @@ __global__ void scaleFC_Fix_27( real* DC, OffFC offFC); __global__ void scaleFC_Fix_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFC_0817_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFC_comp_D3Q27F3_2018( real* DC, - real* DF, - real* G6, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + real* G6, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFC_comp_D3Q27F3( real* DC, - real* DF, - real* G6, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + real* G6, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFC_staggered_time_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFC_RhoSq_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFC_compressible( real *distributionsCoarse, @@ -2272,73 +2272,73 @@ __global__ void scaleFC_compressible( OffFC offsetFC); __global__ void scaleFC_RhoSq_3rdMom_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFC_AA2016_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFC_NSPress_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - OffFC offFC); + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + OffFC offFC); __global__ void scaleFCThSMG7( real* DC, real* DF, @@ -2397,47 +2397,47 @@ __global__ void scaleFCThS27( real* DC, unsigned int kFC, real nu, real diffusivity_coarse, - OffFC offFC); + OffFC offFC); __global__ void DragLiftPost27( real* DD, - int* k_Q, - real* QQ, - int numberOfBCnodes, - double *DragX, - double *DragY, - double *DragZ, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + real* QQ, + int numberOfBCnodes, + double *DragX, + double *DragY, + double *DragZ, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void DragLiftPre27( real* DD, - int* k_Q, - real* QQ, - int numberOfBCnodes, - double *DragX, - double *DragY, - double *DragZ, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* k_Q, + real* QQ, + int numberOfBCnodes, + double *DragX, + double *DragY, + double *DragZ, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void CalcCP27(real* DD, - int* cpIndex, - int nonCp, - double *cpPress, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* cpIndex, + int nonCp, + double *cpPress, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void getSendFsPre27(real* DD, - real* bufferFs, - int* sendIndex, + real* bufferFs, + int* sendIndex, int buffmax, unsigned int* neighborX, unsigned int* neighborY, @@ -2446,8 +2446,8 @@ __global__ void getSendFsPre27(real* DD, bool isEvenTimestep); __global__ void getSendFsPost27(real* DD, - real* bufferFs, - int* sendIndex, + real* bufferFs, + int* sendIndex, int buffmax, unsigned int* neighborX, unsigned int* neighborY, @@ -2456,8 +2456,8 @@ __global__ void getSendFsPost27(real* DD, bool isEvenTimestep); __global__ void setRecvFsPre27(real* DD, - real* bufferFs, - int* recvIndex, + real* bufferFs, + int* recvIndex, int buffmax, unsigned int* neighborX, unsigned int* neighborY, @@ -2466,8 +2466,8 @@ __global__ void setRecvFsPre27(real* DD, bool isEvenTimestep); __global__ void setRecvFsPost27(real* DD, - real* bufferFs, - int* recvIndex, + real* bufferFs, + int* recvIndex, int buffmax, unsigned int* neighborX, unsigned int* neighborY, @@ -2476,155 +2476,155 @@ __global__ void setRecvFsPost27(real* DD, bool isEvenTimestep); __global__ void getSendGsF3( - real* G6, - real* bufferGs, - int* sendIndex, - int buffmax, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* G6, + real* bufferGs, + int* sendIndex, + int buffmax, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void setRecvGsF3( - real* G6, - real* bufferGs, - int* recvIndex, - int buffmax, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* G6, + real* bufferGs, + int* recvIndex, + int buffmax, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void WallFunction27( real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void LBSetOutputWallVelocitySP27( real* vxD, - real* vyD, - real* vzD, - real* vxWall, - real* vyWall, - real* vzWall, - int numberOfWallNodes, - int* kWallNodes, - real* rhoD, - real* pressD, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD, - bool isEvenTimestep); + real* vyD, + real* vzD, + real* vxWall, + real* vyWall, + real* vzWall, + int numberOfWallNodes, + int* kWallNodes, + real* rhoD, + real* pressD, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD, + bool isEvenTimestep); __global__ void GetVeloforForcing27( real* DD, - int* bcIndex, - int nonAtBC, - real* Vx, - real* Vy, - real* Vz, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep); + int* bcIndex, + int nonAtBC, + real* Vx, + real* Vy, + real* Vz, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void InitParticles( real* coordX, - real* coordY, - real* coordZ, - real* coordParticleXlocal, - real* coordParticleYlocal, - real* coordParticleZlocal, - real* coordParticleXglobal, - real* coordParticleYglobal, - real* coordParticleZglobal, - real* veloParticleX, - real* veloParticleY, - real* veloParticleZ, - real* randArray, - unsigned int* particleID, - unsigned int* cellBaseID, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - int level, - unsigned int numberOfParticles, - unsigned int size_Mat); + real* coordY, + real* coordZ, + real* coordParticleXlocal, + real* coordParticleYlocal, + real* coordParticleZlocal, + real* coordParticleXglobal, + real* coordParticleYglobal, + real* coordParticleZglobal, + real* veloParticleX, + real* veloParticleY, + real* veloParticleZ, + real* randArray, + unsigned int* particleID, + unsigned int* cellBaseID, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + int level, + unsigned int numberOfParticles, + unsigned int size_Mat); __global__ void MoveParticles( real* coordX, - real* coordY, - real* coordZ, - real* coordParticleXlocal, - real* coordParticleYlocal, - real* coordParticleZlocal, - real* coordParticleXglobal, - real* coordParticleYglobal, - real* coordParticleZglobal, - real* veloParticleX, - real* veloParticleY, - real* veloParticleZ, - real* DD, - real omega, - unsigned int* particleID, - unsigned int* cellBaseID, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - int level, - unsigned int timestep, - unsigned int numberOfTimesteps, - unsigned int numberOfParticles, - unsigned int size_Mat, - bool isEvenTimestep); + real* coordY, + real* coordZ, + real* coordParticleXlocal, + real* coordParticleYlocal, + real* coordParticleZlocal, + real* coordParticleXglobal, + real* coordParticleYglobal, + real* coordParticleZglobal, + real* veloParticleX, + real* veloParticleY, + real* veloParticleZ, + real* DD, + real omega, + unsigned int* particleID, + unsigned int* cellBaseID, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + int level, + unsigned int timestep, + unsigned int numberOfTimesteps, + unsigned int numberOfParticles, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void MoveParticlesWithoutBCs( real* coordX, - real* coordY, - real* coordZ, - real* coordParticleXlocal, - real* coordParticleYlocal, - real* coordParticleZlocal, - real* coordParticleXglobal, - real* coordParticleYglobal, - real* coordParticleZglobal, - real* veloParticleX, - real* veloParticleY, - real* veloParticleZ, - real* DD, - real omega, - unsigned int* particleID, - unsigned int* cellBaseID, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - int level, - unsigned int timestep, - unsigned int numberOfTimesteps, - unsigned int numberOfParticles, - unsigned int size_Mat, - bool isEvenTimestep); + real* coordY, + real* coordZ, + real* coordParticleXlocal, + real* coordParticleYlocal, + real* coordParticleZlocal, + real* coordParticleXglobal, + real* coordParticleYglobal, + real* coordParticleZglobal, + real* veloParticleX, + real* veloParticleY, + real* veloParticleZ, + real* DD, + real omega, + unsigned int* particleID, + unsigned int* cellBaseID, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + int level, + unsigned int timestep, + unsigned int numberOfTimesteps, + unsigned int numberOfParticles, + unsigned int size_Mat, + bool isEvenTimestep); __global__ void initRandom(curandState* state); __global__ void generateRandomValues(curandState* state, - real* randArray); + real* randArray); __global__ void CalcTurbulenceIntensity( real* vxx, diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu index ae51ce98e449bd3251f6b4df2a3d430815892a8a..ebab2b3e8a38bc221017ffb604d6f1c142afe1d9 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu +++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu @@ -114,429 +114,429 @@ void KernelCasSPMSOHM27( unsigned int numberOfThreads, } ////////////////////////////////////////////////////////////////////////// void KernelKumCompSRTSP27( - unsigned int numberOfThreads, - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd) + unsigned int numberOfThreads, + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); LB_Kernel_Kum_New_Comp_SRT_SP_27 <<< grid.grid, grid.threads >>>( - omega, - bcMatD, - neighborX, - neighborY, - neighborZ, - DDStart, - size_Mat, - level, - forces, - EvenOrOdd); + omega, + bcMatD, + neighborX, + neighborY, + neighborZ, + DDStart, + size_Mat, + level, + forces, + EvenOrOdd); getLastCudaError("LB_Kernel_Kum_New_Comp_SRT_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelKum1hSP27( unsigned int numberOfThreads, - real omega, - real deltaPhi, - real angularVelocity, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* coordX, - real* coordY, - real* coordZ, - real* DDStart, - int size_Mat, - bool EvenOrOdd) + real omega, + real deltaPhi, + real angularVelocity, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* coordX, + real* coordY, + real* coordZ, + real* DDStart, + int size_Mat, + bool EvenOrOdd) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LB_Kernel_Kum_1h_SP_27<<< grid.grid, grid.threads >>>(omega, - deltaPhi, - angularVelocity, - bcMatD, - neighborX, - neighborY, - neighborZ, - coordX, - coordY, - coordZ, - DDStart, - size_Mat, - EvenOrOdd); - getLastCudaError("LB_Kernel_Kum_New_SP_27 execution failed"); + LB_Kernel_Kum_1h_SP_27<<< grid.grid, grid.threads >>>(omega, + deltaPhi, + angularVelocity, + bcMatD, + neighborX, + neighborY, + neighborZ, + coordX, + coordY, + coordZ, + DDStart, + size_Mat, + EvenOrOdd); + getLastCudaError("LB_Kernel_Kum_New_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelCascadeSP27( unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - int size_Mat, - bool EvenOrOdd) + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + int size_Mat, + bool EvenOrOdd) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LB_Kernel_Cascade_SP_27<<< grid.grid, grid.threads >>>(s9, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - EvenOrOdd); - getLastCudaError("LB_Kernel_Cascade_SP_27 execution failed"); + LB_Kernel_Cascade_SP_27<<< grid.grid, grid.threads >>>(s9, + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + EvenOrOdd); + getLastCudaError("LB_Kernel_Cascade_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelKumNewSP27( unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - int size_Mat, - bool EvenOrOdd) + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + int size_Mat, + bool EvenOrOdd) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LB_Kernel_Kum_New_SP_27<<< grid.grid, grid.threads >>>(s9, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - EvenOrOdd); - getLastCudaError("LB_Kernel_Kum_New_SP_27 execution failed"); + LB_Kernel_Kum_New_SP_27<<< grid.grid, grid.threads >>>(s9, + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + EvenOrOdd); + getLastCudaError("LB_Kernel_Kum_New_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelKumNewCompSP27(unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - int size_Mat, - int size_Array, - int level, - real* forces, - bool EvenOrOdd) -{ - //int Grid = size_Array / numberOfThreads; - //dim3 grid(Grid, 1, 1); - //dim3 threads(numberOfThreads, 1, 1 ); + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + int size_Mat, + int size_Array, + int level, + real* forces, + bool EvenOrOdd) +{ + //int Grid = size_Array / numberOfThreads; + //dim3 grid(Grid, 1, 1); + //dim3 threads(numberOfThreads, 1, 1 ); vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - //LB_Kernel_Kum_New_Comp_SP_27<<< grid.grid, grid.threads >>>( s9, - // bcMatD, - // neighborX, - // neighborY, - // neighborZ, - // DD, - // size_Mat, - // level, - // forces, - // EvenOrOdd); - //getLastCudaError("LB_Kernel_Kum_New_Comp_SP_27 execution failed"); + //LB_Kernel_Kum_New_Comp_SP_27<<< grid.grid, grid.threads >>>( s9, + // bcMatD, + // neighborX, + // neighborY, + // neighborZ, + // DD, + // size_Mat, + // level, + // forces, + // EvenOrOdd); + //getLastCudaError("LB_Kernel_Kum_New_Comp_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CumulantOnePreconditionedErrorDiffusionChimCompSP27(unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - int size_Mat, - int size_Array, - int level, - real* forces, - bool EvenOrOdd) -{ - //int Grid = size_Array / numberOfThreads; - //dim3 grid(Grid, 1, 1); - //dim3 threads(numberOfThreads, 1, 1 ); + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + int size_Mat, + int size_Array, + int level, + real* forces, + bool EvenOrOdd) +{ + //int Grid = size_Array / numberOfThreads; + //dim3 grid(Grid, 1, 1); + //dim3 threads(numberOfThreads, 1, 1 ); vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>( s9, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - level, - forces, - EvenOrOdd); - getLastCudaError("Cumulant_One_preconditioned_chim_Comp_SP_27 execution failed"); + Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>( s9, + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + level, + forces, + EvenOrOdd); + getLastCudaError("Cumulant_One_preconditioned_chim_Comp_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CumulantOnePreconditionedChimCompSP27( unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - int size_Mat, - int size_Array, - int level, - real* forces, - bool EvenOrOdd) -{ - //int Grid = size_Array / numberOfThreads; - //dim3 grid(Grid, 1, 1); - //dim3 threads(numberOfThreads, 1, 1 ); + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + int size_Mat, + int size_Array, + int level, + real* forces, + bool EvenOrOdd) +{ + //int Grid = size_Array / numberOfThreads; + //dim3 grid(Grid, 1, 1); + //dim3 threads(numberOfThreads, 1, 1 ); vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - Cumulant_One_preconditioned_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>( s9, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - level, - forces, - EvenOrOdd); - getLastCudaError("Cumulant_One_preconditioned_chim_Comp_SP_27 execution failed"); + Cumulant_One_preconditioned_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>( s9, + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + level, + forces, + EvenOrOdd); + getLastCudaError("Cumulant_One_preconditioned_chim_Comp_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CumulantOneChimCompSP27(unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - int size_Mat, - int size_Array, - int level, - real* forces, - bool EvenOrOdd) -{ - //int Grid = size_Array / numberOfThreads; - //dim3 grid(Grid, 1, 1); - //dim3 threads(numberOfThreads, 1, 1 ); + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + int size_Mat, + int size_Array, + int level, + real* forces, + bool EvenOrOdd) +{ + //int Grid = size_Array / numberOfThreads; + //dim3 grid(Grid, 1, 1); + //dim3 threads(numberOfThreads, 1, 1 ); vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - Cumulant_One_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>( s9, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - level, - forces, - EvenOrOdd); - getLastCudaError("Cumulant_One_chim_Comp_SP_27 execution failed"); + Cumulant_One_chim_Comp_SP_27 <<< grid.grid, grid.threads >>>( s9, + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + level, + forces, + EvenOrOdd); + getLastCudaError("Cumulant_One_chim_Comp_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelKumIsoTestSP27(unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - real* dxxUx, - real* dyyUy, - real* dzzUz, - int size_Mat, - bool EvenOrOdd) + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + real* dxxUx, + real* dyyUy, + real* dzzUz, + int size_Mat, + bool EvenOrOdd) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LB_Kernel_Kum_IsoTest_SP_27<<< grid.grid, grid.threads >>>(s9, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - dxxUx, - dyyUy, - dzzUz, - size_Mat, - EvenOrOdd); - getLastCudaError("LB_Kernel_Kum_IsoTest_SP_27 execution failed"); + LB_Kernel_Kum_IsoTest_SP_27<<< grid.grid, grid.threads >>>(s9, + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + dxxUx, + dyyUy, + dzzUz, + size_Mat, + EvenOrOdd); + getLastCudaError("LB_Kernel_Kum_IsoTest_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelKumCompSP27( unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - int size_Mat, - bool EvenOrOdd) + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + int size_Mat, + bool EvenOrOdd) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LB_Kernel_Kum_Comp_SP_27<<< grid.grid, grid.threads >>>(s9, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - EvenOrOdd); - getLastCudaError("LB_Kernel_Kum_Comp_SP_27 execution failed"); + LB_Kernel_Kum_Comp_SP_27<<< grid.grid, grid.threads >>>(s9, + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + EvenOrOdd); + getLastCudaError("LB_Kernel_Kum_Comp_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelPMCumOneCompSP27(unsigned int numberOfThreads, - real omega, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - int size_Mat, - int level, - real* forces, - real porosity, - real darcy, - real forchheimer, - unsigned int sizeOfPorousMedia, - unsigned int* nodeIdsPorousMedia, - bool EvenOrOdd) + real omega, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + int size_Mat, + int level, + real* forces, + real porosity, + real darcy, + real forchheimer, + unsigned int sizeOfPorousMedia, + unsigned int* nodeIdsPorousMedia, + bool EvenOrOdd) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LB_Kernel_PM_Cum_One_Comp_SP_27 <<< grid.grid, grid.threads >>>(omega, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - level, - forces, - porosity, - darcy, - forchheimer, - sizeOfPorousMedia, - nodeIdsPorousMedia, - EvenOrOdd); - getLastCudaError("LB_Kernel_PM_Cum_One_Comp_SP_27 execution failed"); + LB_Kernel_PM_Cum_One_Comp_SP_27 <<< grid.grid, grid.threads >>>(omega, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + level, + forces, + porosity, + darcy, + forchheimer, + sizeOfPorousMedia, + nodeIdsPorousMedia, + EvenOrOdd); + getLastCudaError("LB_Kernel_PM_Cum_One_Comp_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelWaleBySoniMalavCumAA2016CompSP27( - unsigned int numberOfThreads, - real s9, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - real* veloX, - real* veloY, - real* veloZ, - real* DD, - real* turbulentViscosity, - int size_Mat, - int size_Array, - int level, - real* forces, - bool EvenOrOdd) -{ - //int Grid = size_Array / numberOfThreads; - //dim3 grid(Grid, 1, 1); - //dim3 threads(numberOfThreads, 1, 1 ); + unsigned int numberOfThreads, + real s9, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + real* veloX, + real* veloY, + real* veloZ, + real* DD, + real* turbulentViscosity, + int size_Mat, + int size_Array, + int level, + real* forces, + bool EvenOrOdd) +{ + //int Grid = size_Array / numberOfThreads; + //dim3 grid(Grid, 1, 1); + //dim3 threads(numberOfThreads, 1, 1 ); vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27 << < grid.grid, grid.threads >> >( - s9, - bcMatD, - neighborX, - neighborY, - neighborZ, - neighborWSB, - veloX, - veloY, - veloZ, - DD, - turbulentViscosity, - size_Mat, - level, - forces, - EvenOrOdd); - getLastCudaError("LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27 execution failed"); + LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27 << < grid.grid, grid.threads >> >( + s9, + bcMatD, + neighborX, + neighborY, + neighborZ, + neighborWSB, + veloX, + veloY, + veloZ, + DD, + turbulentViscosity, + size_Mat, + level, + forces, + EvenOrOdd); + getLastCudaError("LB_Kernel_WaleBySoniMalav_Cum_AA2016_Comp_SP_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelADincomp7( unsigned int numberOfThreads, - real diffusivity, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - real* DD7, - int size_Mat, - bool EvenOrOdd) + real diffusivity, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + real* DD7, + int size_Mat, + bool EvenOrOdd) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); LB_Kernel_AD_Incomp_7<<< grid.grid, grid.threads >>>( diffusivity, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - DD7, - size_Mat, - EvenOrOdd); + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + DD7, + size_Mat, + EvenOrOdd); getLastCudaError("LB_Kernel_AD_Incomp_7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void KernelADincomp27( unsigned int numberOfThreads, - real diffusivity, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DD, - real* DD27, - int size_Mat, - bool EvenOrOdd) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LB_Kernel_AD_Incomp_27<<< grid.grid, grid.threads >>>( diffusivity, - bcMatD, - neighborX, - neighborY, - neighborZ, - DD, - DD27, - size_Mat, - EvenOrOdd); - getLastCudaError("LB_Kernel_AD_Incomp_27 execution failed"); + real diffusivity, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DD, + real* DD27, + int size_Mat, + bool EvenOrOdd) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LB_Kernel_AD_Incomp_27<<< grid.grid, grid.threads >>>( diffusivity, + bcMatD, + neighborX, + neighborY, + neighborZ, + DD, + DD27, + size_Mat, + EvenOrOdd); + getLastCudaError("LB_Kernel_AD_Incomp_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void Init27( int myid, @@ -558,7 +558,7 @@ void Init27( int myid, dim3 threads ( grid_nx, 1, 1 ); dim3 grid ( grid_ny, grid_nz ); // Gitter fuer Kollision und Propagation - LBInit27<<< grid, threads >>> ( myid, + LBInit27<<< grid, threads >>> ( myid, numprocs, u0, geoD, @@ -573,7 +573,7 @@ void Init27( int myid, DD, level, maxlevel); - getLastCudaError("LBInit27 execution failed"); + getLastCudaError("LBInit27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void InitNonEqPartSP27( unsigned int numberOfThreads, @@ -591,9 +591,9 @@ void InitNonEqPartSP27( unsigned int numberOfThreads, real omega, bool EvenOrOdd) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LBInitNonEqPartSP27<<< grid.grid, grid.threads >>>( neighborX, + LBInitNonEqPartSP27<<< grid.grid, grid.threads >>>( neighborX, neighborY, neighborZ, neighborWSB, @@ -606,7 +606,7 @@ void InitNonEqPartSP27( unsigned int numberOfThreads, DD, omega, EvenOrOdd); - getLastCudaError("LBInitNonEqPartSP27 execution failed"); + getLastCudaError("LBInitNonEqPartSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void InitThS7( unsigned int numberOfThreads, @@ -622,9 +622,9 @@ void InitThS7( unsigned int numberOfThreads, real* DD7, bool EvenOrOdd) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - InitAD7<<< grid.grid, grid.threads >>>( neighborX, + InitAD7<<< grid.grid, grid.threads >>>( neighborX, neighborY, neighborZ, geoD, @@ -635,7 +635,7 @@ void InitThS7( unsigned int numberOfThreads, size_Mat, DD7, EvenOrOdd); - getLastCudaError("InitAD7 execution failed"); + getLastCudaError("InitAD7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void InitADDev27( unsigned int numberOfThreads, @@ -651,9 +651,9 @@ void InitADDev27( unsigned int numberOfThreads, real* DD27, bool EvenOrOdd) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - InitAD27<<< grid.grid, grid.threads >>>(neighborX, + InitAD27<<< grid.grid, grid.threads >>>(neighborX, neighborY, neighborZ, geoD, @@ -664,45 +664,45 @@ void InitADDev27( unsigned int numberOfThreads, size_Mat, DD27, EvenOrOdd); - getLastCudaError("InitAD27 execution failed"); + getLastCudaError("InitAD27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void PostProcessorF3_2018Fehlberg( - unsigned int numberOfThreads, - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* rhoOut, - real* vxOut, - real* vyOut, - real* vzOut, - real* DDStart, - real* G6, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LB_PostProcessor_F3_2018_Fehlberg <<< grid.grid, grid.threads >>> ( omega, - bcMatD, - neighborX, - neighborY, - neighborZ, - rhoOut, - vxOut, - vyOut, - vzOut, - DDStart, - G6, - size_Mat, - level, - forces, - EvenOrOdd); - getLastCudaError("LB_PostProcessor_F3_2018_Fehlberg execution failed"); + unsigned int numberOfThreads, + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* rhoOut, + real* vxOut, + real* vyOut, + real* vzOut, + real* DDStart, + real* G6, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LB_PostProcessor_F3_2018_Fehlberg <<< grid.grid, grid.threads >>> ( omega, + bcMatD, + neighborX, + neighborY, + neighborZ, + rhoOut, + vxOut, + vyOut, + vzOut, + DDStart, + G6, + size_Mat, + level, + forces, + EvenOrOdd); + getLastCudaError("LB_PostProcessor_F3_2018_Fehlberg execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcMac27( real* vxD, @@ -723,7 +723,7 @@ void CalcMac27( real* vxD, dim3 threads ( grid_nx, 1, 1 ); dim3 grid ( grid_ny, grid_nz ); - LBCalcMac27<<< grid, threads >>> ( vxD, + LBCalcMac27<<< grid, threads >>> ( vxD, vyD, vzD, rhoD, @@ -734,7 +734,7 @@ void CalcMac27( real* vxD, size_Mat, DD, isEvenTimestep); - getLastCudaError("LBCalcMac27 execution failed"); + getLastCudaError("LBCalcMac27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcMacSP27( real* vxD, @@ -751,9 +751,9 @@ void CalcMacSP27( real* vxD, real* DD, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LBCalcMacSP27<<< grid.grid, grid.threads >>> ( vxD, + LBCalcMacSP27<<< grid.grid, grid.threads >>> ( vxD, vyD, vzD, rhoD, @@ -765,38 +765,38 @@ void CalcMacSP27( real* vxD, size_Mat, DD, isEvenTimestep); - getLastCudaError("LBCalcMacSP27 execution failed"); + getLastCudaError("LBCalcMacSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcMacCompSP27( real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalcMacCompSP27<<< grid.grid, grid.threads >>> ( vxD, - vyD, - vzD, - rhoD, - pressD, - geoD, - neighborX, - neighborY, - neighborZ, - size_Mat, - DD, - isEvenTimestep); - getLastCudaError("LBCalcMacSP27 execution failed"); + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalcMacCompSP27<<< grid.grid, grid.threads >>> ( vxD, + vyD, + vzD, + rhoD, + pressD, + geoD, + neighborX, + neighborY, + neighborZ, + size_Mat, + DD, + isEvenTimestep); + getLastCudaError("LBCalcMacSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcMacThS7( real* Conc, @@ -809,9 +809,9 @@ void CalcMacThS7( real* Conc, real* DD7, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - CalcConc7<<< grid.grid, grid.threads >>> (Conc, + CalcConc7<<< grid.grid, grid.threads >>> (Conc, geoD, neighborX, neighborY, @@ -819,61 +819,61 @@ void CalcMacThS7( real* Conc, size_Mat, DD7, isEvenTimestep); - getLastCudaError("CalcConc7 execution failed"); + getLastCudaError("CalcConc7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void PlaneConcThS7(real* Conc, - int* kPC, - unsigned int numberOfPointskPC, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, + int* kPC, + unsigned int numberOfPointskPC, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, unsigned int numberOfThreads, - real* DD7, - bool isEvenTimestep) + real* DD7, + bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskPC); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskPC); - GetPlaneConc7<<< grid.grid, grid.threads >>> ( Conc, - kPC, - numberOfPointskPC, - geoD, - neighborX, - neighborY, - neighborZ, - size_Mat, - DD7, - isEvenTimestep); - getLastCudaError("GetPlaneConc7 execution failed"); + GetPlaneConc7<<< grid.grid, grid.threads >>> ( Conc, + kPC, + numberOfPointskPC, + geoD, + neighborX, + neighborY, + neighborZ, + size_Mat, + DD7, + isEvenTimestep); + getLastCudaError("GetPlaneConc7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void PlaneConcThS27(real* Conc, - int* kPC, - unsigned int numberOfPointskPC, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, + int* kPC, + unsigned int numberOfPointskPC, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, unsigned int numberOfThreads, - real* DD27, - bool isEvenTimestep) + real* DD27, + bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskPC); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskPC); - GetPlaneConc27<<< grid.grid, grid.threads >>> ( Conc, - kPC, - numberOfPointskPC, - geoD, - neighborX, - neighborY, - neighborZ, - size_Mat, - DD27, - isEvenTimestep); - getLastCudaError("GetPlaneConc27 execution failed"); + GetPlaneConc27<<< grid.grid, grid.threads >>> ( Conc, + kPC, + numberOfPointskPC, + geoD, + neighborX, + neighborY, + neighborZ, + size_Mat, + DD27, + isEvenTimestep); + getLastCudaError("GetPlaneConc27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcConcentration27( unsigned int numberOfThreads, @@ -886,9 +886,9 @@ void CalcConcentration27( unsigned int numberOfThreads, real* DD27, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - CalcConc27<<< grid.grid, grid.threads >>> ( Conc, + CalcConc27<<< grid.grid, grid.threads >>> ( Conc, geoD, neighborX, neighborY, @@ -896,7 +896,7 @@ void CalcConcentration27( unsigned int numberOfThreads, size_Mat, DD27, isEvenTimestep); - getLastCudaError("CalcConc27 execution failed"); + getLastCudaError("CalcConc27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcMedSP27( real* vxD, @@ -913,9 +913,9 @@ void CalcMedSP27( real* vxD, real* DD, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LBCalcMedSP27<<< grid.grid, grid.threads >>> ( vxD, + LBCalcMedSP27<<< grid.grid, grid.threads >>> ( vxD, vyD, vzD, rhoD, @@ -927,75 +927,75 @@ void CalcMedSP27( real* vxD, size_Mat, DD, isEvenTimestep); - getLastCudaError("LBCalcMedSP27 execution failed"); + getLastCudaError("LBCalcMedSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcMedCompSP27( real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalcMedCompSP27<<< grid.grid, grid.threads >>> ( vxD, - vyD, - vzD, - rhoD, - pressD, - geoD, - neighborX, - neighborY, - neighborZ, - size_Mat, - DD, - isEvenTimestep); - getLastCudaError("LBCalcMedSP27 execution failed"); + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalcMedCompSP27<<< grid.grid, grid.threads >>> ( vxD, + vyD, + vzD, + rhoD, + pressD, + geoD, + neighborX, + neighborY, + neighborZ, + size_Mat, + DD, + isEvenTimestep); + getLastCudaError("LBCalcMedSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcMedCompAD27( - real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - real* concD, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - real* DD_AD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalcMedCompAD27 <<< grid.grid, grid.threads >>> ( - vxD, - vyD, - vzD, - rhoD, - pressD, - concD, - geoD, - neighborX, - neighborY, - neighborZ, - size_Mat, - DD, - DD_AD, - isEvenTimestep); - getLastCudaError("LBCalcMedAD27 execution failed"); + real* vxD, + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + real* concD, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + real* DD_AD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalcMedCompAD27 <<< grid.grid, grid.threads >>> ( + vxD, + vyD, + vzD, + rhoD, + pressD, + concD, + geoD, + neighborX, + neighborY, + neighborZ, + size_Mat, + DD, + DD_AD, + isEvenTimestep); + getLastCudaError("LBCalcMedAD27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcMacMedSP27( real* vxD, @@ -1012,9 +1012,9 @@ void CalcMacMedSP27( real* vxD, unsigned int numberOfThreads, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LBCalcMacMedSP27<<< grid.grid, grid.threads >>> ( vxD, + LBCalcMacMedSP27<<< grid.grid, grid.threads >>> ( vxD, vyD, vzD, rhoD, @@ -1026,270 +1026,270 @@ void CalcMacMedSP27( real* vxD, tdiff, size_Mat, isEvenTimestep); - getLastCudaError("LBCalcMacMedSP27 execution failed"); + getLastCudaError("LBCalcMacMedSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ResetMedianValuesSP27( - real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - unsigned int size_Mat, - unsigned int numberOfThreads, - bool isEvenTimestep) + real* vxD, + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + unsigned int size_Mat, + unsigned int numberOfThreads, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - LBResetMedianValuesSP27 << < grid.grid, grid.threads >> > ( - vxD, - vyD, - vzD, - rhoD, - pressD, - size_Mat, - isEvenTimestep); - getLastCudaError("LBResetMedianValuesSP27 execution failed"); + LBResetMedianValuesSP27 << < grid.grid, grid.threads >> > ( + vxD, + vyD, + vzD, + rhoD, + pressD, + size_Mat, + isEvenTimestep); + getLastCudaError("LBResetMedianValuesSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ResetMedianValuesAD27( - real* vxD, - real* vyD, - real* vzD, - real* rhoD, - real* pressD, - real* concD, - unsigned int size_Mat, - unsigned int numberOfThreads, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBResetMedianValuesAD27 << < grid.grid, grid.threads >> > ( - vxD, - vyD, - vzD, - rhoD, - pressD, - concD, - size_Mat, - isEvenTimestep); - getLastCudaError("LBResetMedianValuesAD27 execution failed"); + real* vxD, + real* vyD, + real* vzD, + real* rhoD, + real* pressD, + real* concD, + unsigned int size_Mat, + unsigned int numberOfThreads, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBResetMedianValuesAD27 << < grid.grid, grid.threads >> > ( + vxD, + vyD, + vzD, + rhoD, + pressD, + concD, + size_Mat, + isEvenTimestep); + getLastCudaError("LBResetMedianValuesAD27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void Calc2ndMomentsIncompSP27(real* kxyFromfcNEQ, - real* kyzFromfcNEQ, - real* kxzFromfcNEQ, - real* kxxMyyFromfcNEQ, - real* kxxMzzFromfcNEQ, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalc2ndMomentsIncompSP27<<< grid.grid, grid.threads >>> ( kxyFromfcNEQ, - kyzFromfcNEQ, - kxzFromfcNEQ, - kxxMyyFromfcNEQ, - kxxMzzFromfcNEQ, - geoD, - neighborX, - neighborY, - neighborZ, - size_Mat, - DD, - isEvenTimestep); - getLastCudaError("LBCalc2ndMomentsIncompSP27 execution failed"); + real* kyzFromfcNEQ, + real* kxzFromfcNEQ, + real* kxxMyyFromfcNEQ, + real* kxxMzzFromfcNEQ, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalc2ndMomentsIncompSP27<<< grid.grid, grid.threads >>> ( kxyFromfcNEQ, + kyzFromfcNEQ, + kxzFromfcNEQ, + kxxMyyFromfcNEQ, + kxxMzzFromfcNEQ, + geoD, + neighborX, + neighborY, + neighborZ, + size_Mat, + DD, + isEvenTimestep); + getLastCudaError("LBCalc2ndMomentsIncompSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void Calc2ndMomentsCompSP27( real* kxyFromfcNEQ, - real* kyzFromfcNEQ, - real* kxzFromfcNEQ, - real* kxxMyyFromfcNEQ, - real* kxxMzzFromfcNEQ, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalc2ndMomentsCompSP27<<< grid.grid, grid.threads >>> (kxyFromfcNEQ, - kyzFromfcNEQ, - kxzFromfcNEQ, - kxxMyyFromfcNEQ, - kxxMzzFromfcNEQ, - geoD, - neighborX, - neighborY, - neighborZ, - size_Mat, - DD, - isEvenTimestep); - getLastCudaError("LBCalc2ndMomentsCompSP27 execution failed"); + real* kyzFromfcNEQ, + real* kxzFromfcNEQ, + real* kxxMyyFromfcNEQ, + real* kxxMzzFromfcNEQ, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalc2ndMomentsCompSP27<<< grid.grid, grid.threads >>> (kxyFromfcNEQ, + kyzFromfcNEQ, + kxzFromfcNEQ, + kxxMyyFromfcNEQ, + kxxMzzFromfcNEQ, + geoD, + neighborX, + neighborY, + neighborZ, + size_Mat, + DD, + isEvenTimestep); + getLastCudaError("LBCalc2ndMomentsCompSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void Calc3rdMomentsIncompSP27(real* CUMbbb, - real* CUMabc, - real* CUMbac, - real* CUMbca, - real* CUMcba, - real* CUMacb, - real* CUMcab, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalc3rdMomentsIncompSP27<<< grid.grid, grid.threads >>> ( CUMbbb, - CUMabc, - CUMbac, - CUMbca, - CUMcba, - CUMacb, - CUMcab, - geoD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - isEvenTimestep); - getLastCudaError("LBCalc3rdMomentsIncompSP27 execution failed"); + real* CUMabc, + real* CUMbac, + real* CUMbca, + real* CUMcba, + real* CUMacb, + real* CUMcab, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalc3rdMomentsIncompSP27<<< grid.grid, grid.threads >>> ( CUMbbb, + CUMabc, + CUMbac, + CUMbca, + CUMcba, + CUMacb, + CUMcab, + geoD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + isEvenTimestep); + getLastCudaError("LBCalc3rdMomentsIncompSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void Calc3rdMomentsCompSP27( real* CUMbbb, - real* CUMabc, - real* CUMbac, - real* CUMbca, - real* CUMcba, - real* CUMacb, - real* CUMcab, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalc3rdMomentsCompSP27<<< grid.grid, grid.threads >>> (CUMbbb, - CUMabc, - CUMbac, - CUMbca, - CUMcba, - CUMacb, - CUMcab, - geoD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - isEvenTimestep); - getLastCudaError("LBCalc3rdMomentsCompSP27 execution failed"); + real* CUMabc, + real* CUMbac, + real* CUMbca, + real* CUMcba, + real* CUMacb, + real* CUMcab, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalc3rdMomentsCompSP27<<< grid.grid, grid.threads >>> (CUMbbb, + CUMabc, + CUMbac, + CUMbca, + CUMcba, + CUMacb, + CUMcab, + geoD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + isEvenTimestep); + getLastCudaError("LBCalc3rdMomentsCompSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcHigherMomentsIncompSP27(real* CUMcbb, - real* CUMbcb, - real* CUMbbc, - real* CUMcca, - real* CUMcac, - real* CUMacc, - real* CUMbcc, - real* CUMcbc, - real* CUMccb, - real* CUMccc, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalcHigherMomentsIncompSP27<<< grid.grid, grid.threads >>> (CUMcbb, - CUMbcb, - CUMbbc, - CUMcca, - CUMcac, - CUMacc, - CUMbcc, - CUMcbc, - CUMccb, - CUMccc, - geoD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - isEvenTimestep); - getLastCudaError("LBCalcHigherMomentsIncompSP27 execution failed"); + real* CUMbcb, + real* CUMbbc, + real* CUMcca, + real* CUMcac, + real* CUMacc, + real* CUMbcc, + real* CUMcbc, + real* CUMccb, + real* CUMccc, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalcHigherMomentsIncompSP27<<< grid.grid, grid.threads >>> (CUMcbb, + CUMbcb, + CUMbbc, + CUMcca, + CUMcac, + CUMacc, + CUMbcc, + CUMcbc, + CUMccb, + CUMccc, + geoD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + isEvenTimestep); + getLastCudaError("LBCalcHigherMomentsIncompSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcHigherMomentsCompSP27( real* CUMcbb, - real* CUMbcb, - real* CUMbbc, - real* CUMcca, - real* CUMcac, - real* CUMacc, - real* CUMbcc, - real* CUMcbc, - real* CUMccb, - real* CUMccc, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - unsigned int numberOfThreads, - real* DD, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); - - LBCalcHigherMomentsCompSP27<<< grid.grid, grid.threads >>> ( CUMcbb, - CUMbcb, - CUMbbc, - CUMcca, - CUMcac, - CUMacc, - CUMbcc, - CUMcbc, - CUMccb, - CUMccc, - geoD, - neighborX, - neighborY, - neighborZ, - DD, - size_Mat, - isEvenTimestep); - getLastCudaError("LBCalcHigherMomentsCompSP27 execution failed"); + real* CUMbcb, + real* CUMbbc, + real* CUMcca, + real* CUMcac, + real* CUMacc, + real* CUMbcc, + real* CUMcbc, + real* CUMccb, + real* CUMccc, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + unsigned int numberOfThreads, + real* DD, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); + + LBCalcHigherMomentsCompSP27<<< grid.grid, grid.threads >>> ( CUMcbb, + CUMbcb, + CUMbbc, + CUMcca, + CUMcac, + CUMacc, + CUMbcc, + CUMcbc, + CUMccb, + CUMccc, + geoD, + neighborX, + neighborY, + neighborZ, + DD, + size_Mat, + isEvenTimestep); + getLastCudaError("LBCalcHigherMomentsCompSP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void LBCalcMeasurePoints27(real* vxMP, @@ -1309,9 +1309,9 @@ void LBCalcMeasurePoints27(real* vxMP, unsigned int numberOfThreads, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskMP); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfPointskMP); - LBCalcMeasurePoints<<< grid.grid, grid.threads >>> (vxMP, + LBCalcMeasurePoints<<< grid.grid, grid.threads >>> (vxMP, vyMP, vzMP, rhoMP, @@ -1326,7 +1326,7 @@ void LBCalcMeasurePoints27(real* vxMP, size_Mat, DD, isEvenTimestep); - getLastCudaError("LBCalcMeasurePoints execution failed"); + getLastCudaError("LBCalcMeasurePoints execution failed"); } ////////////////////////////////////////////////////////////////////////// void BcPress27( int nx, @@ -1342,10 +1342,10 @@ void BcPress27( int nx, unsigned int size_Mat, bool isEvenTimestep) { - dim3 threads ( grid_nx, 1, 1 ); - dim3 grid ( grid_ny, 1 ); + dim3 threads ( grid_nx, 1, 1 ); + dim3 grid ( grid_ny, 1 ); - LB_BC_Press_East27<<< grid, threads >>> ( nx, + LB_BC_Press_East27<<< grid, threads >>> ( nx, ny, tz, bcMatD, @@ -1355,7 +1355,7 @@ void BcPress27( int nx, DD, size_Mat, isEvenTimestep); - getLastCudaError("LB_BC_Press_East27 execution failed"); + getLastCudaError("LB_BC_Press_East27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void BcVel27(int nx, @@ -1374,10 +1374,10 @@ void BcVel27(int nx, real u0x, real om) { - dim3 threads ( grid_nx, 1, 1 ); - dim3 grid ( grid_ny, 1 ); + dim3 threads ( grid_nx, 1, 1 ); + dim3 grid ( grid_ny, 1 ); - LB_BC_Vel_West_27<<< grid, threads >>> ( nx, + LB_BC_Vel_West_27<<< grid, threads >>> ( nx, ny, nz, itz, @@ -1392,7 +1392,7 @@ void BcVel27(int nx, grid_nx, grid_ny, om); - getLastCudaError("LB_BC_Vel_West_27 execution failed"); + getLastCudaError("LB_BC_Vel_West_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADPressDev7( unsigned int numberOfThreads, @@ -1411,7 +1411,7 @@ void QADPressDev7( unsigned int numberOfThreads, unsigned int size_Mat, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QADPress7<<< grid.grid, grid.threads >>>( DD, DD7, @@ -1427,7 +1427,7 @@ void QADPressDev7( unsigned int numberOfThreads, neighborZ, size_Mat, isEvenTimestep); - getLastCudaError("QADPress7 execution failed"); + getLastCudaError("QADPress7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADPressDev27(unsigned int numberOfThreads, @@ -1446,7 +1446,7 @@ void QADPressDev27(unsigned int numberOfThreads, unsigned int size_Mat, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QADPress27<<< grid.grid, grid.threads >>>( DD, DD27, @@ -1462,39 +1462,39 @@ void QADPressDev27(unsigned int numberOfThreads, neighborZ, size_Mat, isEvenTimestep); - getLastCudaError("QADPress27 execution failed"); + getLastCudaError("QADPress27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADPressNEQNeighborDev27( - unsigned int numberOfThreads, - real* DD, - real* DD27, - int* k_Q, - int* k_N, - int numberOfBCnodes, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep - ) -{ - - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); - - QADPressNEQNeighbor27<<< grid.grid, grid.threads >>>( - DD, - DD27, - k_Q, - k_N, - numberOfBCnodes, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep - ); - getLastCudaError("QADPressNEQNeighbor27 execution failed"); + unsigned int numberOfThreads, + real* DD, + real* DD27, + int* k_Q, + int* k_N, + int numberOfBCnodes, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep + ) +{ + + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); + + QADPressNEQNeighbor27<<< grid.grid, grid.threads >>>( + DD, + DD27, + k_Q, + k_N, + numberOfBCnodes, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep + ); + getLastCudaError("QADPressNEQNeighbor27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADVelDev7(unsigned int numberOfThreads, @@ -1513,9 +1513,9 @@ void QADVelDev7(unsigned int numberOfThreads, unsigned int size_Mat, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); - QADVel7<<< grid.grid, grid.threads >>> ( + QADVel7<<< grid.grid, grid.threads >>> ( DD, DD7, temp, @@ -1530,7 +1530,7 @@ void QADVelDev7(unsigned int numberOfThreads, neighborZ, size_Mat, isEvenTimestep); - getLastCudaError("QADVel7 execution failed"); + getLastCudaError("QADVel7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADVelDev27( unsigned int numberOfThreads, @@ -1583,7 +1583,7 @@ void QADDev7(unsigned int numberOfThreads, unsigned int size_Mat, bool isEvenTimestep) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QAD7<<< grid.grid, grid.threads >>> ( DD, DD7, @@ -1637,74 +1637,74 @@ void FactorizedCentralMomentsAdvectionDiffusionDeviceKernel( ////////////////////////////////////////////////////////////////////////// void ADSlipVelDevComp( - uint numberOfThreads, - real * normalX, - real * normalY, - real * normalZ, - real * distributions, - real * distributionsAD, - int* QindexArray, - real * Qarrays, - uint numberOfBCnodes, - real omegaDiffusivity, - uint * neighborX, - uint * neighborY, - uint * neighborZ, - uint size_Mat, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); - - AD_SlipVelDeviceComp << < grid.grid, grid.threads >> > ( - normalX, - normalY, - normalZ, - distributions, - distributionsAD, - QindexArray, - Qarrays, - numberOfBCnodes, - omegaDiffusivity, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("AD_SlipVelDeviceComp execution failed"); + uint numberOfThreads, + real * normalX, + real * normalY, + real * normalZ, + real * distributions, + real * distributionsAD, + int* QindexArray, + real * Qarrays, + uint numberOfBCnodes, + real omegaDiffusivity, + uint * neighborX, + uint * neighborY, + uint * neighborZ, + uint size_Mat, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); + + AD_SlipVelDeviceComp << < grid.grid, grid.threads >> > ( + normalX, + normalY, + normalZ, + distributions, + distributionsAD, + QindexArray, + Qarrays, + numberOfBCnodes, + omegaDiffusivity, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("AD_SlipVelDeviceComp execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADDirichletDev27( unsigned int numberOfThreads, - real* DD, - real* DD27, - real* temp, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); + real* DD, + real* DD27, + real* temp, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QADDirichlet27<<< grid.grid, grid.threads >>> ( - DD, - DD27, - temp, - diffusivity, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + DD, + DD27, + temp, + diffusivity, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QADDirichletDev27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -1742,212 +1742,212 @@ void QADBBDev27(unsigned int numberOfThreads, } ////////////////////////////////////////////////////////////////////////// void QNoSlipADincompDev7(unsigned int numberOfThreads, - real* DD, - real* DD7, - real* temp, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + real* DD7, + real* temp, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QNoSlipADincomp7<<< grid.grid, grid.threads >>> ( - DD, - DD7, - temp, - diffusivity, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + DD, + DD7, + temp, + diffusivity, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QNoSlipADincomp7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QNoSlipADincompDev27( unsigned int numberOfThreads, - real* DD, - real* DD27, - real* temp, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + real* DD27, + real* temp, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QNoSlipADincomp27<<< grid.grid, grid.threads >>> ( - DD, - DD27, - temp, - diffusivity, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + DD, + DD27, + temp, + diffusivity, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QNoSlipADincomp27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADVeloIncompDev7( unsigned int numberOfThreads, - real* DD, - real* DD7, - real* temp, - real* velo, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + real* DD7, + real* temp, + real* velo, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QADVeloIncomp7<<< grid.grid, grid.threads >>> ( DD, - DD7, - temp, - velo, - diffusivity, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + DD7, + temp, + velo, + diffusivity, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QADVeloIncomp7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADVeloIncompDev27( unsigned int numberOfThreads, - real* DD, - real* DD27, - real* temp, - real* velo, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + real* DD27, + real* temp, + real* velo, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QADVeloIncomp27<<< grid.grid, grid.threads >>> ( - DD, - DD27, - temp, - velo, - diffusivity, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + DD, + DD27, + temp, + velo, + diffusivity, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QADVeloIncomp27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADPressIncompDev7( unsigned int numberOfThreads, - real* DD, - real* DD7, - real* temp, - real* velo, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + real* DD7, + real* temp, + real* velo, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QADPressIncomp7<<< grid.grid, grid.threads >>>( - DD, - DD7, - temp, - velo, - diffusivity, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + DD, + DD7, + temp, + velo, + diffusivity, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QADPressIncomp7 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QADPressIncompDev27( unsigned int numberOfThreads, - real* DD, - real* DD27, - real* temp, - real* velo, - real diffusivity, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + real* DD27, + real* temp, + real* velo, + real diffusivity, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); - QADPressIncomp27<<< grid.grid, grid.threads >>>(DD, - DD27, - temp, - velo, - diffusivity, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + QADPressIncomp27<<< grid.grid, grid.threads >>>(DD, + DD27, + temp, + velo, + diffusivity, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QADPressIncomp27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -1991,44 +1991,44 @@ void QDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* } ////////////////////////////////////////////////////////////////////////// void QDevCompThinWalls27(unsigned int numberOfThreads, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* geom, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* geom, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QDeviceCompThinWallsPartOne27 <<< grid.grid, grid.threads >>> (DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QDeviceCompThinWallsPartOne27 execution failed"); QThinWallsPartTwo27 <<< grid.grid, grid.threads >>> ( DD, - k_Q, - QQ, - numberOfBCnodes, - geom, - neighborX, - neighborY, - neighborZ, - neighborWSB, - size_Mat, - isEvenTimestep); + k_Q, + QQ, + numberOfBCnodes, + geom, + neighborX, + neighborY, + neighborZ, + neighborWSB, + size_Mat, + isEvenTimestep); getLastCudaError("QThinWallsPartTwo27 execution failed"); } @@ -2053,58 +2053,58 @@ void QDev3rdMomentsComp27(LBMSimulationParameter* parameterDevice, QforBoundaryC } ////////////////////////////////////////////////////////////////////////// void QDevIncompHighNu27( unsigned int numberOfThreads, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QDeviceIncompHighNu27<<< grid.grid, grid.threads >>> ( - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QDeviceIncompHighNu27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QDevCompHighNu27( unsigned int numberOfThreads, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QDeviceCompHighNu27<<< grid.grid, grid.threads >>> ( - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QDevice27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -2130,59 +2130,59 @@ void QVelDevicePlainBB27(LBMSimulationParameter* parameterDevice, QforBoundaryCo } ////////////////////////////////////////////////////////////////////////// void QVelDeviceCouette27(unsigned int numberOfThreads, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QVelDevCouette27<<< grid.grid, grid.threads >>> ( vx, - vy, - vz, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + vy, + vz, + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QVelDevicePlainBB27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QVelDevice1h27( unsigned int numberOfThreads, - int nx, - int ny, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - real Phi, - real angularVelocity, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* coordX, - real* coordY, - real* coordZ, - unsigned int size_Mat, - bool isEvenTimestep) + int nx, + int ny, + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + real Phi, + real angularVelocity, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* coordX, + real* coordY, + real* coordZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); @@ -2196,14 +2196,14 @@ void QVelDevice1h27( unsigned int numberOfThreads, QQ, numberOfBCnodes, om1, - Phi, - angularVelocity, + Phi, + angularVelocity, neighborX, neighborY, neighborZ, - coordX, - coordY, - coordZ, + coordX, + coordY, + coordZ, size_Mat, isEvenTimestep); getLastCudaError("QVelDevice27 execution failed"); @@ -2234,36 +2234,36 @@ void QVelDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* } ////////////////////////////////////////////////////////////////////////// void QVelDevCompPlusSlip27(unsigned int numberOfThreads, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QVelDeviceCompPlusSlip27<<< grid.grid, grid.threads >>> ( - vx, - vy, - vz, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + vx, + vy, + vz, + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QVelDeviceCompPlusSlip27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -2277,7 +2277,7 @@ void QVelDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditio boundaryCondition->Vy, boundaryCondition->Vz, parameterDevice->distributions.f[0], - boundaryCondition->k, + boundaryCondition->k, boundaryCondition->q27[0], boundaryCondition->numberOfBCnodes, parameterDevice->omega, @@ -2290,40 +2290,40 @@ void QVelDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditio } ////////////////////////////////////////////////////////////////////////// void QVelDevCompThinWalls27(unsigned int numberOfThreads, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* geom, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - unsigned int size_Mat, - bool isEvenTimestep) + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* geom, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QVelDeviceCompThinWallsPartOne27<<< grid.grid, grid.threads >>> (vx, - vy, - vz, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + vy, + vz, + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QVelDeviceCompThinWallsPartOne27 execution failed"); - QThinWallsPartTwo27 <<< grid.grid, grid.threads >>> ( + QThinWallsPartTwo27 <<< grid.grid, grid.threads >>> ( DD, k_Q, QQ, @@ -2361,135 +2361,135 @@ void QVelDevCompZeroPress27(LBMSimulationParameter* parameterDevice, QforBoundar } ////////////////////////////////////////////////////////////////////////// void QVelDevIncompHighNu27(unsigned int numberOfThreads, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QVelDeviceIncompHighNu27<<< grid.grid, grid.threads >>> ( - vx, - vy, - vz, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + vx, + vy, + vz, + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QVelDeviceIncompHighNu27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QVelDevCompHighNu27( unsigned int numberOfThreads, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QVelDeviceCompHighNu27<<< grid.grid, grid.threads >>> ( - vx, - vy, - vz, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + vx, + vy, + vz, + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QVelDeviceComp27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QVeloDevEQ27(unsigned int numberOfThreads, - real* VeloX, - real* VeloY, - real* VeloZ, - real* DD, - int* k_Q, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* VeloX, + real* VeloY, + real* VeloZ, + real* DD, + int* k_Q, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QVeloDeviceEQ27<<< grid.grid, grid.threads >>> (VeloX, - VeloY, - VeloZ, - DD, - k_Q, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + VeloY, + VeloZ, + DD, + k_Q, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QVeloDeviceEQ27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QVeloStreetDevEQ27( - uint numberOfThreads, - real* veloXfraction, - real* veloYfraction, - int* naschVelo, - real* DD, - int* naschIndex, - int numberOfStreetNodes, - real velocityRatio, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - uint size_Mat, - bool isEvenTimestep) + uint numberOfThreads, + real* veloXfraction, + real* veloYfraction, + int* naschVelo, + real* DD, + int* naschIndex, + int numberOfStreetNodes, + real velocityRatio, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + uint size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfStreetNodes); - QVeloStreetDeviceEQ27 << < grid.grid, grid.threads >> > ( - veloXfraction, - veloYfraction, - naschVelo, - DD, - naschIndex, - numberOfStreetNodes, - velocityRatio, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("QVeloStreetDeviceEQ27 execution failed"); + QVeloStreetDeviceEQ27 << < grid.grid, grid.threads >> > ( + veloXfraction, + veloYfraction, + naschVelo, + DD, + naschIndex, + numberOfStreetNodes, + velocityRatio, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("QVeloStreetDeviceEQ27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QSlipDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition) @@ -2515,7 +2515,7 @@ void QSlipDevCompTurbulentViscosity27(LBMSimulationParameter* parameterDevice, Q { dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); dim3 threads(parameterDevice->numberofthreads, 1, 1 ); - + QSlipDeviceComp27TurbViscosity<<< grid, threads >>> ( parameterDevice->distributions.f[0], boundaryCondition->k, @@ -2555,7 +2555,7 @@ void QSlipDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditi { dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); dim3 threads(parameterDevice->numberofthreads, 1, 1 ); - + QSlipDeviceComp27<<< grid, threads >>> ( parameterDevice->distributions.f[0], boundaryCondition->k, @@ -2590,68 +2590,68 @@ void BBSlipDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryCondit } ////////////////////////////////////////////////////////////////////////// void QSlipGeomDevComp27(unsigned int numberOfThreads, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - real* NormalX, - real* NormalY, - real* NormalZ, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) -{ - vf::cuda::CudaGrid grid(numberOfThreads, numberOfBCnodes); + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + real* NormalX, + real* NormalY, + real* NormalZ, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) +{ + vf::cuda::CudaGrid grid(numberOfThreads, numberOfBCnodes); QSlipGeomDeviceComp27<<< grid.grid, grid.threads >>> (DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - NormalX, - NormalY, - NormalZ, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + k_Q, + QQ, + numberOfBCnodes, + om1, + NormalX, + NormalY, + NormalZ, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QSlipGeomDeviceComp27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void QSlipNormDevComp27(unsigned int numberOfThreads, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - real* NormalX, - real* NormalY, - real* NormalZ, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + real* NormalX, + real* NormalY, + real* NormalZ, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QSlipNormDeviceComp27<<< grid.grid, grid.threads >>> (DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - NormalX, - NormalY, - NormalZ, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + k_Q, + QQ, + numberOfBCnodes, + om1, + NormalX, + NormalY, + NormalZ, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QSlipGeomDeviceComp27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -2796,36 +2796,36 @@ void QPressDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions ////////////////////////////////////////////////////////////////////////// void QPressDevAntiBB27( unsigned int numberOfThreads, real* rhoBC, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); QPressDeviceAntiBB27<<< grid.grid, grid.threads >>>( rhoBC, - vx, - vy, - vz, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + vx, + vy, + vz, + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("QPressDeviceAntiBB27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -3108,32 +3108,32 @@ void BBDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* bo } ////////////////////////////////////////////////////////////////////////// void QPressDev27_IntBB( unsigned int numberOfThreads, - real* rho, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* rho, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); - QPressDevice27_IntBB<<< grid.grid, grid.threads >>> (rho, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("QPressDevice27_IntBB execution failed"); + QPressDevice27_IntBB<<< grid.grid, grid.threads >>> (rho, + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("QPressDevice27_IntBB execution failed"); } // TODO: https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/issues/29 ////////////////////////////////////////////////////////////////////////// @@ -3208,67 +3208,146 @@ void VelSchlaffer27( unsigned int numberOfThreads, getLastCudaError("VelSchlaff27 execution failed"); } ////////////////////////////////////////////////////////////////////////// -void QPrecursorDevCompZeroPress(LBMSimulationParameter* parameterDevice, QforPrecursorBoundaryConditions* boundaryCondition, real tRatio, real velocityRatio) -{ - - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); - - QPrecursorDeviceCompZeroPress<<< grid.grid, grid.threads >>>(boundaryCondition->k, boundaryCondition->numberOfBCnodes, boundaryCondition->numberOfPrecursorNodes, boundaryCondition->sizeQ, parameterDevice->omega, - parameterDevice->distributions.f[0], boundaryCondition->q27[0], - parameterDevice->neighborX, parameterDevice->neighborY, parameterDevice->neighborZ, - boundaryCondition->planeNeighborNT, boundaryCondition->planeNeighborNB, boundaryCondition->planeNeighborST, boundaryCondition->planeNeighborSB, - boundaryCondition->weightsNT, boundaryCondition->weightsNB, boundaryCondition->weightsST, boundaryCondition->weightsSB, - boundaryCondition->last, boundaryCondition->current, - boundaryCondition->velocityX, boundaryCondition->velocityY, boundaryCondition->velocityZ, - tRatio, velocityRatio, parameterDevice->numberOfNodes, parameterDevice->isEvenTimestep); - getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); - -} -////////////////////////////////////////////////////////////////////////// -void PrecursorDevEQ27( LBMSimulationParameter* parameterDevice, QforPrecursorBoundaryConditions* boundaryCondition, real tRatio, real velocityRatio) -{ - - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); - - PrecursorDeviceEQ27<<< grid.grid, grid.threads >>>(boundaryCondition->k, boundaryCondition->numberOfBCnodes, boundaryCondition->numberOfPrecursorNodes, parameterDevice->omega, parameterDevice->distributions.f[0], - parameterDevice->neighborX, parameterDevice->neighborX, parameterDevice->neighborX, - boundaryCondition->planeNeighborNT, boundaryCondition->planeNeighborNB, boundaryCondition->planeNeighborST, boundaryCondition->planeNeighborSB, - boundaryCondition->weightsNT, boundaryCondition->weightsNB, boundaryCondition->weightsST, boundaryCondition->weightsSB, - boundaryCondition->last, boundaryCondition->current, - boundaryCondition->velocityX, boundaryCondition->velocityY, boundaryCondition->velocityZ, - tRatio, velocityRatio, parameterDevice->numberOfNodes, parameterDevice->isEvenTimestep); - getLastCudaError("PrecursorDeviceEQ27 execution failed"); - -} -////////////////////////////////////////////////////////////////////////// -void PrecursorDevDistributions( LBMSimulationParameter* parameterDevice, QforPrecursorBoundaryConditions* boundaryCondition, real tRatio, real velocityRatio) -{ - - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); - - PrecursorDeviceDistributions<<< grid.grid, grid.threads >>>(boundaryCondition->k, boundaryCondition->numberOfBCnodes, boundaryCondition->numberOfPrecursorNodes, parameterDevice->distributions.f[0], - parameterDevice->neighborX, parameterDevice->neighborY, parameterDevice->neighborZ, - boundaryCondition->planeNeighborNT, boundaryCondition->planeNeighborNB, boundaryCondition->planeNeighborST, boundaryCondition->planeNeighborSB, - boundaryCondition->weightsNT, boundaryCondition->weightsNB, boundaryCondition->weightsST, boundaryCondition->weightsSB, - boundaryCondition->last, boundaryCondition->current, - tRatio, parameterDevice->numberOfNodes, parameterDevice->isEvenTimestep); - getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); - -} - -////////////////////////////////////////////////////////////////////////// -void QPrecursorDevDistributions( LBMSimulationParameter* parameterDevice, QforPrecursorBoundaryConditions* boundaryCondition, real tRatio, real velocityRatio) -{ - - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); - - QPrecursorDeviceDistributions<<< grid.grid, grid.threads >>>(boundaryCondition->k, boundaryCondition->q27[0], boundaryCondition->sizeQ, boundaryCondition->numberOfBCnodes, boundaryCondition->numberOfPrecursorNodes, parameterDevice->distributions.f[0], - parameterDevice->neighborX, parameterDevice->neighborY, parameterDevice->neighborZ, - boundaryCondition->planeNeighborNT, boundaryCondition->planeNeighborNB, boundaryCondition->planeNeighborST, boundaryCondition->planeNeighborSB, - boundaryCondition->weightsNT, boundaryCondition->weightsNB, boundaryCondition->weightsST, boundaryCondition->weightsSB, - boundaryCondition->last, boundaryCondition->current, - tRatio, parameterDevice->numberOfNodes, parameterDevice->isEvenTimestep); - getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); +void QPrecursorDevCompZeroPress(LBMSimulationParameter* parameterDevice, + QforPrecursorBoundaryConditions* boundaryCondition, + real timeRatio, + real velocityRatio) +{ + + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); + + QPrecursorDeviceCompZeroPress<<< grid.grid, grid.threads >>>(boundaryCondition->k, + boundaryCondition->numberOfBCnodes, + boundaryCondition->numberOfPrecursorNodes, + boundaryCondition->sizeQ, + parameterDevice->omega, + parameterDevice->distributions.f[0], + boundaryCondition->q27[0], + parameterDevice->neighborX, + parameterDevice->neighborY, + parameterDevice->neighborZ, + boundaryCondition->planeNeighbor0PP, + boundaryCondition->planeNeighbor0PM, + boundaryCondition->planeNeighbor0MP, + boundaryCondition->planeNeighbor0MM, + boundaryCondition->weights0PP, + boundaryCondition->weights0PM, + boundaryCondition->weights0MP, + boundaryCondition->weights0MM, + boundaryCondition->last, + boundaryCondition->current, + boundaryCondition->velocityX, + boundaryCondition->velocityY, + boundaryCondition->velocityZ, + timeRatio, + velocityRatio, + parameterDevice->numberOfNodes, + parameterDevice->isEvenTimestep); + getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); + +} +////////////////////////////////////////////////////////////////////////// +void PrecursorDevEQ27( LBMSimulationParameter* parameterDevice, + QforPrecursorBoundaryConditions* boundaryCondition, + real timeRatio, + real velocityRatio) +{ + + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); + + PrecursorDeviceEQ27<<< grid.grid, grid.threads >>>(boundaryCondition->k, + boundaryCondition->numberOfBCnodes, + boundaryCondition->numberOfPrecursorNodes, + parameterDevice->omega, + parameterDevice->distributions.f[0], + parameterDevice->neighborX, + parameterDevice->neighborX, + parameterDevice->neighborX, + boundaryCondition->planeNeighbor0PP, + boundaryCondition->planeNeighbor0PM, + boundaryCondition->planeNeighbor0MP, + boundaryCondition->planeNeighbor0MM, + boundaryCondition->weights0PP, + boundaryCondition->weights0PM, + boundaryCondition->weights0MP, + boundaryCondition->weights0MM, + boundaryCondition->last, + boundaryCondition->current, + boundaryCondition->velocityX, + boundaryCondition->velocityY, + boundaryCondition->velocityZ, + timeRatio, + velocityRatio, + parameterDevice->numberOfNodes, + parameterDevice->isEvenTimestep); + getLastCudaError("PrecursorDeviceEQ27 execution failed"); + +} +////////////////////////////////////////////////////////////////////////// +void PrecursorDevDistributions( LBMSimulationParameter* parameterDevice, + QforPrecursorBoundaryConditions* boundaryCondition, + real timeRatio, + real velocityRatio) +{ + + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); + + PrecursorDeviceDistributions<<< grid.grid, grid.threads >>>(boundaryCondition->k, + boundaryCondition->numberOfBCnodes, + boundaryCondition->numberOfPrecursorNodes, + parameterDevice->distributions.f[0], + parameterDevice->neighborX, + parameterDevice->neighborY, + parameterDevice->neighborZ, + boundaryCondition->planeNeighbor0PP, + boundaryCondition->planeNeighbor0PM, + boundaryCondition->planeNeighbor0MP, + boundaryCondition->planeNeighbor0MM, + boundaryCondition->weights0PP, + boundaryCondition->weights0PM, + boundaryCondition->weights0MP, + boundaryCondition->weights0MM, + boundaryCondition->last, + boundaryCondition->current, + timeRatio, + parameterDevice->numberOfNodes, + parameterDevice->isEvenTimestep); + getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); + +} + +////////////////////////////////////////////////////////////////////////// +void QPrecursorDevDistributions( LBMSimulationParameter* parameterDevice, + QforPrecursorBoundaryConditions* boundaryCondition, + real timeRatio, + real velocityRatio) +{ + + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes); + + QPrecursorDeviceDistributions<<< grid.grid, grid.threads >>>(boundaryCondition->k, + boundaryCondition->q27[0], + boundaryCondition->sizeQ, + boundaryCondition->numberOfBCnodes, + boundaryCondition->numberOfPrecursorNodes, + parameterDevice->distributions.f[0], + parameterDevice->neighborX, + parameterDevice->neighborY, + parameterDevice->neighborZ, + boundaryCondition->planeNeighbor0PP, + boundaryCondition->planeNeighbor0PM, + boundaryCondition->planeNeighbor0MP, + boundaryCondition->planeNeighbor0MM, + boundaryCondition->weights0PP, + boundaryCondition->weights0PM, + boundaryCondition->weights0MP, + boundaryCondition->weights0MM, + boundaryCondition->last, + boundaryCondition->current, + timeRatio, + parameterDevice->numberOfNodes, + parameterDevice->isEvenTimestep); + getLastCudaError("QPrecursorDeviceCompZeroPress execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -3281,7 +3360,7 @@ extern "C" void PropVelo( unsigned int numberOfThreads, real* uy, real* uz, int* k_Q, - unsigned int size_Prop, + unsigned int size_Prop, unsigned int size_Mat, unsigned int* bcMatD, real* DD, @@ -3296,10 +3375,10 @@ extern "C" void PropVelo( unsigned int numberOfThreads, ux, uy, uz, - k_Q, - size_Prop, + k_Q, + size_Prop, size_Mat, - bcMatD, + bcMatD, DD, EvenOrOdd); getLastCudaError("PropellerBC execution failed"); @@ -3329,7 +3408,7 @@ void ScaleCF27( real* DC, unsigned int numberOfThreads) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); - + scaleCF27<<< grid.grid, grid.threads >>> ( DC, DF, neighborCX, @@ -3559,263 +3638,263 @@ void ScaleCF_Fix_27( real* DC, } ////////////////////////////////////////////////////////////////////////// void ScaleCF_Fix_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffCF offCF) + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffCF offCF) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); scaleCF_Fix_comp_27<<< grid.grid, grid.threads >>>( DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posCSWB, - posFSWB, - kCF, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offCF); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posCSWB, + posFSWB, + kCF, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offCF); getLastCudaError("scaleCF_Fix_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleCF_0817_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffCF offCF, + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffCF offCF, CUstream_st *stream) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); scaleCF_0817_comp_27<<< grid.grid, grid.threads, 0, stream >>>( DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posCSWB, - posFSWB, - kCF, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offCF); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posCSWB, + posFSWB, + kCF, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offCF); getLastCudaError("scaleCF_0817_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleCF_comp_D3Q27F3_2018(real* DC, - real* DF, - real* G6, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffCF offCF) + real* DF, + real* G6, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffCF offCF) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); scaleCF_comp_D3Q27F3_2018 <<< grid.grid, grid.threads >>>(DC, - DF, - G6, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posCSWB, - posFSWB, - kCF, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offCF); + DF, + G6, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posCSWB, + posFSWB, + kCF, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offCF); getLastCudaError("scaleCF_comp_D3Q27F3_2018 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleCF_comp_D3Q27F3(real* DC, - real* DF, - real* G6, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffCF offCF, + real* DF, + real* G6, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffCF offCF, CUstream_st *stream) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); scaleCF_comp_D3Q27F3 <<< grid.grid, grid.threads, 0, stream >>>( DC, - DF, - G6, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posCSWB, - posFSWB, - kCF, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offCF); + DF, + G6, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posCSWB, + posFSWB, + kCF, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offCF); getLastCudaError("scaleCF_comp_D3Q27F3 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleCF_staggered_time_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffCF offCF) + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffCF offCF) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); scaleCF_staggered_time_comp_27<<< grid.grid, grid.threads >>>( DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posCSWB, - posFSWB, - kCF, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offCF); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posCSWB, + posFSWB, + kCF, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offCF); getLastCudaError("scaleCF_Fix_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -3879,157 +3958,157 @@ void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulati ////////////////////////////////////////////////////////////////////////// void ScaleCF_RhoSq_3rdMom_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffCF offCF, + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffCF offCF, CUstream_st *stream) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); scaleCF_RhoSq_3rdMom_comp_27<<< grid.grid, grid.threads, 0, stream >>>( DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posCSWB, - posFSWB, - kCF, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offCF); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posCSWB, + posFSWB, + kCF, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offCF); getLastCudaError("scaleCF_RhoSq_3rdMom_comp_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleCF_AA2016_comp_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffCF offCF, + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffCF offCF, CUstream_st *stream) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); scaleCF_AA2016_comp_27<<< grid.grid, grid.threads, 0, stream >>>(DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posCSWB, - posFSWB, - kCF, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offCF); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posCSWB, + posFSWB, + kCF, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offCF); getLastCudaError("scaleCF_AA2016_comp_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleCF_NSPress_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posCSWB, - unsigned int* posFSWB, - unsigned int kCF, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffCF offCF) + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posCSWB, + unsigned int* posFSWB, + unsigned int kCF, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffCF offCF) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); scaleCF_NSPress_27<<< grid.grid, grid.threads >>>(DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posCSWB, - posFSWB, - kCF, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offCF); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posCSWB, + posFSWB, + kCF, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offCF); getLastCudaError("scaleCF_Fix_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -4140,7 +4219,7 @@ void ScaleCFThS27( real* DC, real nu, real diffusivity_fine, unsigned int numberOfThreads, - OffCF offCF) + OffCF offCF) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kCF); @@ -4162,7 +4241,7 @@ void ScaleCFThS27( real* DC, kCF, nu, diffusivity_fine, - offCF); + offCF); getLastCudaError("scaleCFThS27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -4189,7 +4268,7 @@ void ScaleFC27( real* DC, unsigned int nyF, unsigned int numberOfThreads) { - + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC27<<< grid.grid, grid.threads >>> ( DC, @@ -4421,263 +4500,263 @@ void ScaleFC_Fix_27(real* DC, } ////////////////////////////////////////////////////////////////////////// void ScaleFC_Fix_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffFC offFC) + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffFC offFC) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC_Fix_comp_27<<< grid.grid, grid.threads >>> ( DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posC, - posFSWB, - kFC, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offFC); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posC, + posFSWB, + kFC, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offFC); getLastCudaError("scaleFC_Fix_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleFC_0817_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffFC offFC, + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffFC offFC, CUstream_st *stream) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC_0817_comp_27<<< grid.grid, grid.threads, 0, stream >>> (DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posC, - posFSWB, - kFC, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offFC); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posC, + posFSWB, + kFC, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offFC); getLastCudaError("scaleFC_0817_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleFC_comp_D3Q27F3_2018( real* DC, - real* DF, - real* G6, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffFC offFC) + real* DF, + real* G6, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffFC offFC) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC_comp_D3Q27F3_2018 <<< grid.grid, grid.threads >>> (DC, - DF, - G6, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posC, - posFSWB, - kFC, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offFC); + DF, + G6, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posC, + posFSWB, + kFC, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offFC); getLastCudaError("scaleFC_comp_D3Q27F3_2018 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleFC_comp_D3Q27F3( real* DC, - real* DF, - real* G6, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffFC offFC, + real* DF, + real* G6, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffFC offFC, CUstream_st *stream) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC_comp_D3Q27F3 <<< grid.grid, grid.threads, 0, stream >>> (DC, - DF, - G6, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posC, - posFSWB, - kFC, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offFC); + DF, + G6, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posC, + posFSWB, + kFC, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offFC); getLastCudaError("scaleFC_0817_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleFC_staggered_time_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffFC offFC) + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffFC offFC) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC_staggered_time_comp_27<<< grid.grid, grid.threads >>> ( DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posC, - posFSWB, - kFC, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offFC); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posC, + posFSWB, + kFC, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offFC); getLastCudaError("scaleFC_Fix_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -4739,157 +4818,157 @@ void ScaleFC_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulati } ////////////////////////////////////////////////////////////////////////// void ScaleFC_RhoSq_3rdMom_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffFC offFC, + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffFC offFC, CUstream_st *stream) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC_RhoSq_3rdMom_comp_27<<< grid.grid, grid.threads, 0, stream >>>(DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posC, - posFSWB, - kFC, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offFC); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posC, + posFSWB, + kFC, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offFC); getLastCudaError("scaleFC_RhoSq_3rdMom_comp_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleFC_AA2016_comp_27( real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffFC offFC, + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffFC offFC, CUstream_st *stream) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC_AA2016_comp_27<<< grid.grid, grid.threads, 0, stream >>>(DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posC, - posFSWB, - kFC, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offFC); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posC, + posFSWB, + kFC, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offFC); getLastCudaError("scaleFC_AA2016_comp_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void ScaleFC_NSPress_27(real* DC, - real* DF, - unsigned int* neighborCX, - unsigned int* neighborCY, - unsigned int* neighborCZ, - unsigned int* neighborFX, - unsigned int* neighborFY, - unsigned int* neighborFZ, - unsigned int size_MatC, - unsigned int size_MatF, - bool isEvenTimestep, - unsigned int* posC, - unsigned int* posFSWB, - unsigned int kFC, - real omCoarse, - real omFine, - real nu, - unsigned int nxC, - unsigned int nyC, - unsigned int nxF, - unsigned int nyF, - unsigned int numberOfThreads, - OffFC offFC) + real* DF, + unsigned int* neighborCX, + unsigned int* neighborCY, + unsigned int* neighborCZ, + unsigned int* neighborFX, + unsigned int* neighborFY, + unsigned int* neighborFZ, + unsigned int size_MatC, + unsigned int size_MatF, + bool isEvenTimestep, + unsigned int* posC, + unsigned int* posFSWB, + unsigned int kFC, + real omCoarse, + real omFine, + real nu, + unsigned int nxC, + unsigned int nyC, + unsigned int nxF, + unsigned int nyF, + unsigned int numberOfThreads, + OffFC offFC) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); scaleFC_NSPress_27<<< grid.grid, grid.threads >>> ( DC, - DF, - neighborCX, - neighborCY, - neighborCZ, - neighborFX, - neighborFY, - neighborFZ, - size_MatC, - size_MatF, - isEvenTimestep, - posC, - posFSWB, - kFC, - omCoarse, - omFine, - nu, - nxC, - nyC, - nxF, - nyF, - offFC); + DF, + neighborCX, + neighborCY, + neighborCZ, + neighborFX, + neighborFY, + neighborFZ, + size_MatC, + size_MatF, + isEvenTimestep, + posC, + posFSWB, + kFC, + omCoarse, + omFine, + nu, + nxC, + nyC, + nxF, + nyF, + offFC); getLastCudaError("scaleFC_Fix_27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -5000,7 +5079,7 @@ void ScaleFCThS27( real* DC, real nu, real diffusivity_coarse, unsigned int numberOfThreads, - OffFC offFC) + OffFC offFC) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, kFC); @@ -5022,501 +5101,501 @@ void ScaleFCThS27( real* DC, kFC, nu, diffusivity_coarse, - offFC); + offFC); getLastCudaError("scaleFCThS27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void DragLiftPostD27(real* DD, - int* k_Q, - real* QQ, - int numberOfBCnodes, - double *DragX, - double *DragY, - double *DragZ, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads) + int* k_Q, + real* QQ, + int numberOfBCnodes, + double *DragX, + double *DragY, + double *DragZ, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); - DragLiftPost27<<< grid.grid, grid.threads >>>(DD, - k_Q, - QQ, - numberOfBCnodes, - DragX, - DragY, - DragZ, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("DragLift27 execution failed"); + DragLiftPost27<<< grid.grid, grid.threads >>>(DD, + k_Q, + QQ, + numberOfBCnodes, + DragX, + DragY, + DragZ, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("DragLift27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void DragLiftPreD27( real* DD, - int* k_Q, - real* QQ, - int numberOfBCnodes, - double *DragX, - double *DragY, - double *DragZ, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); - - DragLiftPre27<<< grid.grid, grid.threads >>>( DD, - k_Q, - QQ, - numberOfBCnodes, - DragX, - DragY, - DragZ, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("DragLift27 execution failed"); + int* k_Q, + real* QQ, + int numberOfBCnodes, + double *DragX, + double *DragY, + double *DragZ, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); + + DragLiftPre27<<< grid.grid, grid.threads >>>( DD, + k_Q, + QQ, + numberOfBCnodes, + DragX, + DragY, + DragZ, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("DragLift27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcCPtop27(real* DD, - int* cpIndex, - int nonCp, - double *cpPress, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonCp); - - CalcCP27<<< grid.grid, grid.threads >>>(DD, - cpIndex, - nonCp, - cpPress, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("CalcCP27 execution failed"); + int* cpIndex, + int nonCp, + double *cpPress, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonCp); + + CalcCP27<<< grid.grid, grid.threads >>>(DD, + cpIndex, + nonCp, + cpPress, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("CalcCP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void CalcCPbottom27( real* DD, - int* cpIndex, - int nonCp, - double *cpPress, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonCp); - - CalcCP27<<< grid.grid, grid.threads >>>(DD, - cpIndex, - nonCp, - cpPress, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("CalcCP27 execution failed"); + int* cpIndex, + int nonCp, + double *cpPress, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonCp); + + CalcCP27<<< grid.grid, grid.threads >>>(DD, + cpIndex, + nonCp, + cpPress, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("CalcCP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void GetSendFsPreDev27(real* DD, - real* bufferFs, - int* sendIndex, - int buffmax, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads, - cudaStream_t stream) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); - - getSendFsPre27<<< grid.grid, grid.threads, 0, stream >>>(DD, - bufferFs, - sendIndex, - buffmax, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("getSendFsPre27 execution failed"); + real* bufferFs, + int* sendIndex, + int buffmax, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads, + cudaStream_t stream) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); + + getSendFsPre27<<< grid.grid, grid.threads, 0, stream >>>(DD, + bufferFs, + sendIndex, + buffmax, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("getSendFsPre27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void GetSendFsPostDev27(real* DD, - real* bufferFs, - int* sendIndex, - int buffmax, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads, - cudaStream_t stream) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); - - getSendFsPost27<<< grid.grid, grid.threads, 0, stream >>>(DD, - bufferFs, - sendIndex, - buffmax, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("getSendFsPost27 execution failed"); + real* bufferFs, + int* sendIndex, + int buffmax, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads, + cudaStream_t stream) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); + + getSendFsPost27<<< grid.grid, grid.threads, 0, stream >>>(DD, + bufferFs, + sendIndex, + buffmax, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("getSendFsPost27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void SetRecvFsPreDev27(real* DD, - real* bufferFs, - int* recvIndex, - int buffmax, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads, - cudaStream_t stream) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); - - setRecvFsPre27<<< grid.grid, grid.threads, 0, stream >>>(DD, - bufferFs, - recvIndex, - buffmax, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("setRecvFsPre27 execution failed"); + real* bufferFs, + int* recvIndex, + int buffmax, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads, + cudaStream_t stream) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); + + setRecvFsPre27<<< grid.grid, grid.threads, 0, stream >>>(DD, + bufferFs, + recvIndex, + buffmax, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("setRecvFsPre27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void SetRecvFsPostDev27(real* DD, - real* bufferFs, - int* recvIndex, - int buffmax, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads, - cudaStream_t stream) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); - - setRecvFsPost27<<< grid.grid, grid.threads, 0, stream >>>(DD, - bufferFs, - recvIndex, - buffmax, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("setRecvFsPost27 execution failed"); + real* bufferFs, + int* recvIndex, + int buffmax, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads, + cudaStream_t stream) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); + + setRecvFsPost27<<< grid.grid, grid.threads, 0, stream >>>(DD, + bufferFs, + recvIndex, + buffmax, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("setRecvFsPost27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void getSendGsDevF3( - real* G6, - real* bufferGs, - int* sendIndex, - int buffmax, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); - - getSendGsF3 <<< grid.grid, grid.threads >>> ( - G6, - bufferGs, - sendIndex, - buffmax, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("getSendGsF3 execution failed"); + real* G6, + real* bufferGs, + int* sendIndex, + int buffmax, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); + + getSendGsF3 <<< grid.grid, grid.threads >>> ( + G6, + bufferGs, + sendIndex, + buffmax, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("getSendGsF3 execution failed"); } ////////////////////////////////////////////////////////////////////////// void setRecvGsDevF3( - real* G6, - real* bufferGs, - int* recvIndex, - int buffmax, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep, - unsigned int numberOfThreads) -{ - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); - - setRecvGsF3 <<< grid.grid, grid.threads >>> ( - G6, - bufferGs, - recvIndex, - buffmax, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); - getLastCudaError("setRecvGsF3 execution failed"); + real* G6, + real* bufferGs, + int* recvIndex, + int buffmax, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep, + unsigned int numberOfThreads) +{ + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, buffmax); + + setRecvGsF3 <<< grid.grid, grid.threads >>> ( + G6, + bufferGs, + recvIndex, + buffmax, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); + getLastCudaError("setRecvGsF3 execution failed"); } ////////////////////////////////////////////////////////////////////////// void WallFuncDev27(unsigned int numberOfThreads, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes); WallFunction27<<< grid.grid, grid.threads >>> ( - vx, - vy, - vz, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + vx, + vy, + vz, + DD, + k_Q, + QQ, + numberOfBCnodes, + om1, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("WallFunction27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void SetOutputWallVelocitySP27(unsigned int numberOfThreads, - real* vxD, - real* vyD, - real* vzD, - real* vxWall, - real* vyWall, - real* vzWall, - int numberOfWallNodes, - int* kWallNodes, - real* rhoD, - real* pressD, - unsigned int* geoD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - real* DD, - bool isEvenTimestep) + real* vxD, + real* vyD, + real* vzD, + real* vxWall, + real* vyWall, + real* vzWall, + int numberOfWallNodes, + int* kWallNodes, + real* rhoD, + real* pressD, + unsigned int* geoD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + real* DD, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfWallNodes); LBSetOutputWallVelocitySP27<<< grid.grid, grid.threads >>> ( vxD, - vyD, - vzD, - vxWall, - vyWall, - vzWall, - numberOfWallNodes, - kWallNodes, - rhoD, - pressD, - geoD, - neighborX, - neighborY, - neighborZ, - size_Mat, - DD, - isEvenTimestep); + vyD, + vzD, + vxWall, + vyWall, + vzWall, + numberOfWallNodes, + kWallNodes, + rhoD, + pressD, + geoD, + neighborX, + neighborY, + neighborZ, + size_Mat, + DD, + isEvenTimestep); getLastCudaError("LBSetOutputWallVelocitySP27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void GetVelotoForce27(unsigned int numberOfThreads, - real* DD, - int* bcIndex, - int nonAtBC, - real* Vx, - real* Vy, - real* Vz, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* bcIndex, + int nonAtBC, + real* Vx, + real* Vy, + real* Vz, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, nonAtBC); GetVeloforForcing27<<< grid.grid, grid.threads >>> (DD, - bcIndex, - nonAtBC, - Vx, - Vy, - Vz, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + bcIndex, + nonAtBC, + Vx, + Vy, + Vz, + neighborX, + neighborY, + neighborZ, + size_Mat, + isEvenTimestep); getLastCudaError("GetVeloforForcing27 execution failed"); } ////////////////////////////////////////////////////////////////////////// void InitParticlesDevice(real* coordX, - real* coordY, - real* coordZ, - real* coordParticleXlocal, - real* coordParticleYlocal, - real* coordParticleZlocal, - real* coordParticleXglobal, - real* coordParticleYglobal, - real* coordParticleZglobal, - real* veloParticleX, - real* veloParticleY, - real* veloParticleZ, - real* randArray, - unsigned int* particleID, - unsigned int* cellBaseID, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - int level, - unsigned int numberOfParticles, - unsigned int size_Mat, - unsigned int numberOfThreads) + real* coordY, + real* coordZ, + real* coordParticleXlocal, + real* coordParticleYlocal, + real* coordParticleZlocal, + real* coordParticleXglobal, + real* coordParticleYglobal, + real* coordParticleZglobal, + real* veloParticleX, + real* veloParticleY, + real* veloParticleZ, + real* randArray, + unsigned int* particleID, + unsigned int* cellBaseID, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + int level, + unsigned int numberOfParticles, + unsigned int size_Mat, + unsigned int numberOfThreads) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfParticles); InitParticles<<< grid.grid, grid.threads >>> (coordX, - coordY, - coordZ, - coordParticleXlocal, - coordParticleYlocal, - coordParticleZlocal, - coordParticleXglobal, - coordParticleYglobal, - coordParticleZglobal, - veloParticleX, - veloParticleY, - veloParticleZ, - randArray, - particleID, - cellBaseID, - bcMatD, - neighborX, - neighborY, - neighborZ, - neighborWSB, - level, - numberOfParticles, - size_Mat); + coordY, + coordZ, + coordParticleXlocal, + coordParticleYlocal, + coordParticleZlocal, + coordParticleXglobal, + coordParticleYglobal, + coordParticleZglobal, + veloParticleX, + veloParticleY, + veloParticleZ, + randArray, + particleID, + cellBaseID, + bcMatD, + neighborX, + neighborY, + neighborZ, + neighborWSB, + level, + numberOfParticles, + size_Mat); getLastCudaError("InitParticles execution failed"); } ////////////////////////////////////////////////////////////////////////// void MoveParticlesDevice(real* coordX, - real* coordY, - real* coordZ, - real* coordParticleXlocal, - real* coordParticleYlocal, - real* coordParticleZlocal, - real* coordParticleXglobal, - real* coordParticleYglobal, - real* coordParticleZglobal, - real* veloParticleX, - real* veloParticleY, - real* veloParticleZ, - real* DD, - real omega, - unsigned int* particleID, - unsigned int* cellBaseID, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int* neighborWSB, - int level, - unsigned int timestep, - unsigned int numberOfTimesteps, - unsigned int numberOfParticles, - unsigned int size_Mat, - unsigned int numberOfThreads, - bool isEvenTimestep) + real* coordY, + real* coordZ, + real* coordParticleXlocal, + real* coordParticleYlocal, + real* coordParticleZlocal, + real* coordParticleXglobal, + real* coordParticleYglobal, + real* coordParticleZglobal, + real* veloParticleX, + real* veloParticleY, + real* veloParticleZ, + real* DD, + real omega, + unsigned int* particleID, + unsigned int* cellBaseID, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int* neighborWSB, + int level, + unsigned int timestep, + unsigned int numberOfTimesteps, + unsigned int numberOfParticles, + unsigned int size_Mat, + unsigned int numberOfThreads, + bool isEvenTimestep) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfParticles); MoveParticles<<< grid.grid, grid.threads >>> (coordX, - coordY, - coordZ, - coordParticleXlocal, - coordParticleYlocal, - coordParticleZlocal, - coordParticleXglobal, - coordParticleYglobal, - coordParticleZglobal, - veloParticleX, - veloParticleY, - veloParticleZ, - DD, - omega, - particleID, - cellBaseID, - bcMatD, - neighborX, - neighborY, - neighborZ, - neighborWSB, - level, - timestep, - numberOfTimesteps, - numberOfParticles, - size_Mat, - isEvenTimestep); + coordY, + coordZ, + coordParticleXlocal, + coordParticleYlocal, + coordParticleZlocal, + coordParticleXglobal, + coordParticleYglobal, + coordParticleZglobal, + veloParticleX, + veloParticleY, + veloParticleZ, + DD, + omega, + particleID, + cellBaseID, + bcMatD, + neighborX, + neighborY, + neighborZ, + neighborWSB, + level, + timestep, + numberOfTimesteps, + numberOfParticles, + size_Mat, + isEvenTimestep); getLastCudaError("MoveParticles execution failed"); } ////////////////////////////////////////////////////////////////////////// void initRandomDevice(curandState* state, - unsigned int size_Mat, - unsigned int numberOfThreads) + unsigned int size_Mat, + unsigned int numberOfThreads) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); initRandom<<< grid.grid, grid.threads >>> (state); @@ -5524,9 +5603,9 @@ void initRandomDevice(curandState* state, } ////////////////////////////////////////////////////////////////////////// void generateRandomValuesDevice( curandState* state, - unsigned int size_Mat, - real* randArray, - unsigned int numberOfThreads) + unsigned int size_Mat, + real* randArray, + unsigned int numberOfThreads) { vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, size_Mat); generateRandomValues<<< grid.grid, grid.threads >>> (state,randArray); @@ -5557,7 +5636,7 @@ void CalcTurbulenceIntensityDevice( vxx, vyy, vzz, - vxy, + vxy, vxz, vyz, vx_mean, @@ -5573,16 +5652,3 @@ void CalcTurbulenceIntensityDevice( getLastCudaError("CalcTurbulenceIntensity execution failed"); } - - - - - - - - - - - - - diff --git a/src/gpu/VirtualFluids_GPU/GPU/PrecursorBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/PrecursorBCs27.cu index 9c7958cdc6bc783ba8aadcd0e19877f491fad085..b17ffefd13a8a3a6048dde69ffb1db6c5def23e1 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/PrecursorBCs27.cu +++ b/src/gpu/VirtualFluids_GPU/GPU/PrecursorBCs27.cu @@ -1,4 +1,4 @@ -#include "LBM/LB.h" +#include "LBM/LB.h" #include <lbm/constants/NumericConstants.h> #include <lbm/constants/D3Q27.h> #include <lbm/MacroscopicQuantities.h> @@ -16,23 +16,23 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, real omega, real* distributions, real* subgridDistances, - uint* neighborX, - uint* neighborY, + uint* neighborX, + uint* neighborY, uint* neighborZ, - uint* neighborsNT, - uint* neighborsNB, - uint* neighborsST, - uint* neighborsSB, - real* weightsNT, - real* weightsNB, - real* weightsST, - real* weightsSB, - real* vLast, + uint* neighbors0PP, + uint* neighbors0PM, + uint* neighbors0MP, + uint* neighbors0MM, + real* weights0PP, + real* weights0PM, + real* weights0MP, + real* weights0MM, + real* vLast, real* vCurrent, real velocityX, real velocityY, real velocityZ, - real tRatio, + real timeRatio, real velocityRatio, unsigned long long numberOfLBnodes, bool isEvenTimestep) @@ -43,11 +43,11 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, //////////////////////////////////////////////////////////////////////////////// // interpolation of velocity - real vxLastInterpd, vyLastInterpd, vzLastInterpd; - real vxNextInterpd, vyNextInterpd, vzNextInterpd; + real vxLastInterpd, vyLastInterpd, vzLastInterpd; + real vxNextInterpd, vyNextInterpd, vzNextInterpd; - uint kNT = neighborsNT[k]; - real dNT = weightsNT[k]; + uint kNeighbor0PP = neighbors0PP[k]; + real d0PP = weights0PP[k]; real* vxLast = vLast; real* vyLast = &vLast[numberOfPrecursorNodes]; @@ -57,41 +57,41 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, real* vyCurrent = &vCurrent[numberOfPrecursorNodes]; real* vzCurrent = &vCurrent[2*numberOfPrecursorNodes]; - if(dNT < 1e6) + if(d0PP < 1e6) { - uint kNB = neighborsNB[k]; - uint kST = neighborsST[k]; - uint kSB = neighborsSB[k]; + uint kNeighbor0PM = neighbors0PM[k]; + uint kNeighbor0MP = neighbors0MP[k]; + uint kNeighbor0MM = neighbors0MM[k]; - real dNB = weightsNB[k]; - real dST = weightsST[k]; - real dSB = weightsSB[k]; + real d0PM = weights0PM[k]; + real d0MP = weights0MP[k]; + real d0MM = weights0MM[k]; - real invWeightSum = 1.f/(dNT+dNB+dST+dSB); + real invWeightSum = 1.f/(d0PP+d0PM+d0MP+d0MM); - vxLastInterpd = (vxLast[kNT]*dNT + vxLast[kNB]*dNB + vxLast[kST]*dST + vxLast[kSB]*dSB)*invWeightSum; - vyLastInterpd = (vyLast[kNT]*dNT + vyLast[kNB]*dNB + vyLast[kST]*dST + vyLast[kSB]*dSB)*invWeightSum; - vzLastInterpd = (vzLast[kNT]*dNT + vzLast[kNB]*dNB + vzLast[kST]*dST + vzLast[kSB]*dSB)*invWeightSum; + vxLastInterpd = (vxLast[kNeighbor0PP]*d0PP + vxLast[kNeighbor0PM]*d0PM + vxLast[kNeighbor0MP]*d0MP + vxLast[kNeighbor0MM]*d0MM)*invWeightSum; + vyLastInterpd = (vyLast[kNeighbor0PP]*d0PP + vyLast[kNeighbor0PM]*d0PM + vyLast[kNeighbor0MP]*d0MP + vyLast[kNeighbor0MM]*d0MM)*invWeightSum; + vzLastInterpd = (vzLast[kNeighbor0PP]*d0PP + vzLast[kNeighbor0PM]*d0PM + vzLast[kNeighbor0MP]*d0MP + vzLast[kNeighbor0MM]*d0MM)*invWeightSum; - vxNextInterpd = (vxCurrent[kNT]*dNT + vxCurrent[kNB]*dNB + vxCurrent[kST]*dST + vxCurrent[kSB]*dSB)*invWeightSum; - vyNextInterpd = (vyCurrent[kNT]*dNT + vyCurrent[kNB]*dNB + vyCurrent[kST]*dST + vyCurrent[kSB]*dSB)*invWeightSum; - vzNextInterpd = (vzCurrent[kNT]*dNT + vzCurrent[kNB]*dNB + vzCurrent[kST]*dST + vzCurrent[kSB]*dSB)*invWeightSum; + vxNextInterpd = (vxCurrent[kNeighbor0PP]*d0PP + vxCurrent[kNeighbor0PM]*d0PM + vxCurrent[kNeighbor0MP]*d0MP + vxCurrent[kNeighbor0MM]*d0MM)*invWeightSum; + vyNextInterpd = (vyCurrent[kNeighbor0PP]*d0PP + vyCurrent[kNeighbor0PM]*d0PM + vyCurrent[kNeighbor0MP]*d0MP + vyCurrent[kNeighbor0MM]*d0MM)*invWeightSum; + vzNextInterpd = (vzCurrent[kNeighbor0PP]*d0PP + vzCurrent[kNeighbor0PM]*d0PM + vzCurrent[kNeighbor0MP]*d0MP + vzCurrent[kNeighbor0MM]*d0MM)*invWeightSum; } else { - vxLastInterpd = vxLast[kNT]; - vyLastInterpd = vyLast[kNT]; - vzLastInterpd = vzLast[kNT]; + vxLastInterpd = vxLast[kNeighbor0PP]; + vyLastInterpd = vyLast[kNeighbor0PP]; + vzLastInterpd = vzLast[kNeighbor0PP]; - vxNextInterpd = vxCurrent[kNT]; - vyNextInterpd = vyCurrent[kNT]; - vzNextInterpd = vzCurrent[kNT]; + vxNextInterpd = vxCurrent[kNeighbor0PP]; + vyNextInterpd = vyCurrent[kNeighbor0PP]; + vzNextInterpd = vzCurrent[kNeighbor0PP]; } // if(k==16300)s printf("%f %f %f\n", vxLastInterpd, vyLastInterpd, vzLastInterpd); - real VeloX = (velocityX + (1.f-tRatio)*vxLastInterpd + tRatio*vxNextInterpd)/velocityRatio; - real VeloY = (velocityY + (1.f-tRatio)*vyLastInterpd + tRatio*vyNextInterpd)/velocityRatio; - real VeloZ = (velocityZ + (1.f-tRatio)*vzLastInterpd + tRatio*vzNextInterpd)/velocityRatio; + real VeloX = (velocityX + (1.f-timeRatio)*vxLastInterpd + timeRatio*vxNextInterpd)/velocityRatio; + real VeloY = (velocityY + (1.f-timeRatio)*vyLastInterpd + timeRatio*vyNextInterpd)/velocityRatio; + real VeloZ = (velocityZ + (1.f-timeRatio)*vzLastInterpd + timeRatio*vzNextInterpd)/velocityRatio; // From here on just a copy of QVelDeviceCompZeroPress //////////////////////////////////////////////////////////////////////////////// @@ -99,86 +99,86 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep); unsigned int KQK = subgridDistanceIndices[k]; - unsigned int kzero= KQK; - unsigned int ke = KQK; - unsigned int kw = neighborX[KQK]; - unsigned int kn = KQK; - unsigned int ks = neighborY[KQK]; - unsigned int kt = KQK; - unsigned int kb = neighborZ[KQK]; - unsigned int ksw = neighborY[kw]; - unsigned int kne = KQK; - unsigned int kse = ks; - unsigned int knw = kw; - unsigned int kbw = neighborZ[kw]; - unsigned int kte = KQK; - unsigned int kbe = kb; - unsigned int ktw = kw; - unsigned int kbs = neighborZ[ks]; - unsigned int ktn = KQK; - unsigned int kbn = kb; - unsigned int kts = ks; - unsigned int ktse = ks; - unsigned int kbnw = kbw; - unsigned int ktnw = kw; - unsigned int kbse = kbs; - unsigned int ktsw = ksw; - unsigned int kbne = kb; - unsigned int ktne = KQK; - unsigned int kbsw = neighborZ[ksw]; + unsigned int k000= KQK; + unsigned int kP00 = KQK; + unsigned int kM00 = neighborX[KQK]; + unsigned int k0P0 = KQK; + unsigned int k0M0 = neighborY[KQK]; + unsigned int k00P = KQK; + unsigned int k00M = neighborZ[KQK]; + unsigned int kMM0 = neighborY[kM00]; + unsigned int kPP0 = KQK; + unsigned int kPM0 = k0M0; + unsigned int kMP0 = kM00; + unsigned int kM0M = neighborZ[kM00]; + unsigned int kP0P = KQK; + unsigned int kP0M = k00M; + unsigned int kM0P = kM00; + unsigned int k0PP = KQK; + unsigned int k0MM = neighborZ[k0M0]; + unsigned int k0PM = k00M; + unsigned int k0MP = k0M0; + unsigned int kPMP = k0M0; + unsigned int kMPM = kM0M; + unsigned int kMPP = kM00; + unsigned int kPMM = k0MM; + unsigned int kMMP = kMM0; + unsigned int kPPM = k00M; + unsigned int kPPP = KQK; + unsigned int kMMM = neighborZ[kMM0]; //////////////////////////////////////////////////////////////////////////////// //! - Set local distributions //! - real f_W = (dist.f[DIR_P00 ])[ke ]; - real f_E = (dist.f[DIR_M00 ])[kw ]; - real f_S = (dist.f[DIR_0P0 ])[kn ]; - real f_N = (dist.f[DIR_0M0 ])[ks ]; - real f_B = (dist.f[DIR_00P ])[kt ]; - real f_T = (dist.f[DIR_00M ])[kb ]; - real f_SW = (dist.f[DIR_PP0 ])[kne ]; - real f_NE = (dist.f[DIR_MM0 ])[ksw ]; - real f_NW = (dist.f[DIR_PM0 ])[kse ]; - real f_SE = (dist.f[DIR_MP0 ])[knw ]; - real f_BW = (dist.f[DIR_P0P ])[kte ]; - real f_TE = (dist.f[DIR_M0M ])[kbw ]; - real f_TW = (dist.f[DIR_P0M ])[kbe ]; - real f_BE = (dist.f[DIR_M0P ])[ktw ]; - real f_BS = (dist.f[DIR_0PP ])[ktn ]; - real f_TN = (dist.f[DIR_0MM ])[kbs ]; - real f_TS = (dist.f[DIR_0PM ])[kbn ]; - real f_BN = (dist.f[DIR_0MP ])[kts ]; - real f_BSW = (dist.f[DIR_PPP ])[ktne ]; - real f_BNE = (dist.f[DIR_MMP ])[ktsw ]; - real f_BNW = (dist.f[DIR_PMP ])[ktse ]; - real f_BSE = (dist.f[DIR_MPP ])[ktnw ]; - real f_TSW = (dist.f[DIR_PPM ])[kbne ]; - real f_TNE = (dist.f[DIR_MMM ])[kbsw ]; - real f_TNW = (dist.f[DIR_PMM ])[kbse ]; - real f_TSE = (dist.f[DIR_MPM ])[kbnw ]; - + real f_M00 = (dist.f[DIR_P00])[kP00]; + real f_P00 = (dist.f[DIR_M00])[kM00]; + real f_0M0 = (dist.f[DIR_0P0])[k0P0]; + real f_0P0 = (dist.f[DIR_0M0])[k0M0]; + real f_00M = (dist.f[DIR_00P])[k00P]; + real f_00P = (dist.f[DIR_00M])[k00M]; + real f_MM0 = (dist.f[DIR_PP0])[kPP0]; + real f_PP0 = (dist.f[DIR_MM0])[kMM0]; + real f_MP0 = (dist.f[DIR_PM0])[kPM0]; + real f_PM0 = (dist.f[DIR_MP0])[kMP0]; + real f_M0M = (dist.f[DIR_P0P])[kP0P]; + real f_P0P = (dist.f[DIR_M0M])[kM0M]; + real f_M0P = (dist.f[DIR_P0M])[kP0M]; + real f_P0M = (dist.f[DIR_M0P])[kM0P]; + real f_0MM = (dist.f[DIR_0PP])[k0PP]; + real f_0PP = (dist.f[DIR_0MM])[k0MM]; + real f_0MP = (dist.f[DIR_0PM])[k0PM]; + real f_0PM = (dist.f[DIR_0MP])[k0MP]; + real f_MMM = (dist.f[DIR_PPP])[kPPP]; + real f_PPM = (dist.f[DIR_MMP])[kMMP]; + real f_MPM = (dist.f[DIR_PMP])[kPMP]; + real f_PMM = (dist.f[DIR_MPP])[kMPP]; + real f_MMP = (dist.f[DIR_PPM])[kPPM]; + real f_PPP = (dist.f[DIR_MMM])[kMMM]; + real f_MPP = (dist.f[DIR_PMM])[kPMM]; + real f_PMP = (dist.f[DIR_MPM])[kMPM]; + SubgridDistances27 subgridD; getPointersToSubgridDistances(subgridD, subgridDistances, numberOfBCnodes); - + //////////////////////////////////////////////////////////////////////////////// - real drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW + - f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + - f_T + f_B + f_N + f_S + f_E + f_W + ((dist.f[DIR_000])[kzero]); + real drho = f_PMP + f_MPP + f_PPP + f_MMP + f_PMM + f_MPM + f_PPM + f_MMM + + f_0PM + f_0PP + f_0MP + f_0MM + f_P0M + f_M0P + f_P0P + f_M0M + f_PM0 + f_MP0 + f_PP0 + f_MM0 + + f_00P + f_00M + f_0P0 + f_0M0 + f_P00 + f_M00 + ((dist.f[DIR_000])[k000]); + + real vx1 = (((f_PMP - f_MPM) - (f_MPP - f_PMM)) + ((f_PPP - f_MMM) - (f_MMP - f_PPM)) + + ((f_P0M - f_M0P) + (f_P0P - f_M0M)) + ((f_PM0 - f_MP0) + (f_PP0 - f_MM0)) + + (f_P00 - f_M00)) / (c1o1 + drho); - real vx1 = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + - ((f_BE - f_TW) + (f_TE - f_BW)) + ((f_SE - f_NW) + (f_NE - f_SW)) + - (f_E - f_W)) / (c1o1 + drho); - - real vx2 = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + - ((f_BN - f_TS) + (f_TN - f_BS)) + (-(f_SE - f_NW) + (f_NE - f_SW)) + - (f_N - f_S)) / (c1o1 + drho); + real vx2 = ((-(f_PMP - f_MPM) + (f_MPP - f_PMM)) + ((f_PPP - f_MMM) - (f_MMP - f_PPM)) + + ((f_0PM - f_0MP) + (f_0PP - f_0MM)) + (-(f_PM0 - f_MP0) + (f_PP0 - f_MM0)) + + (f_0P0 - f_0M0)) / (c1o1 + drho); + + real vx3 = (((f_PMP - f_MPM) + (f_MPP - f_PMM)) + ((f_PPP - f_MMM) + (f_MMP - f_PPM)) + + (-(f_0PM - f_0MP) + (f_0PP - f_0MM)) + ((f_P0P - f_M0M) - (f_P0M - f_M0P)) + + (f_00P - f_00M)) / (c1o1 + drho); - real vx3 = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) + - (-(f_BN - f_TS) + (f_TN - f_BS)) + ((f_TE - f_BW) - (f_BE - f_TW)) + - (f_T - f_B)) / (c1o1 + drho); - // if(k==16383 || k==0) printf("k %d kQ %d drho = %f u %f v %f w %f\n",k, KQK, drho, vx1, vx2, vx3); real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3) * (c1o1 + drho); ////////////////////////////////////////////////////////////////////////// @@ -193,7 +193,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = VeloX; - (dist.f[DIR_M00])[kw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_E, f_W, feq, omega, drho, velocityBC, c2o27); + (dist.f[DIR_M00])[kM00] = getInterpolatedDistributionForVeloWithPressureBC(q, f_P00, f_M00, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_M00])[k]; @@ -202,7 +202,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = -VeloX; - (dist.f[DIR_P00])[ke] = getInterpolatedDistributionForVeloWithPressureBC(q, f_W, f_E, feq, omega, drho, velocityBC, c2o27); + (dist.f[DIR_P00])[kP00] = getInterpolatedDistributionForVeloWithPressureBC(q, f_M00, f_P00, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_0P0])[k]; @@ -211,7 +211,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = VeloY; - (dist.f[DIR_0M0])[DIR_0M0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_N, f_S, feq, omega, drho, velocityBC, c2o27); + (dist.f[DIR_0M0])[DIR_0M0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0P0, f_0M0, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_0M0])[k]; @@ -220,7 +220,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = -VeloY; - (dist.f[DIR_0P0])[kn] = getInterpolatedDistributionForVeloWithPressureBC(q, f_S, f_N, feq, omega, drho, velocityBC, c2o27); + (dist.f[DIR_0P0])[k0P0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0M0, f_0P0, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_00P])[k]; @@ -229,7 +229,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = VeloZ; - (dist.f[DIR_00M])[kb] = getInterpolatedDistributionForVeloWithPressureBC(q, f_T, f_B, feq, omega, drho, velocityBC, c2o27); + (dist.f[DIR_00M])[k00M] = getInterpolatedDistributionForVeloWithPressureBC(q, f_00P, f_00M, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_00M])[k]; @@ -238,7 +238,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = -VeloZ; - (dist.f[DIR_00P])[kt] = getInterpolatedDistributionForVeloWithPressureBC(q, f_B, f_T, feq, omega, drho, velocityBC, c2o27); + (dist.f[DIR_00P])[k00P] = getInterpolatedDistributionForVeloWithPressureBC(q, f_00M, f_00P, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_PP0])[k]; @@ -247,7 +247,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1 + vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloX + VeloY; - (dist.f[DIR_MM0])[ksw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_NE, f_SW, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_MM0])[kMM0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PP0, f_MM0, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_MM0])[k]; @@ -256,7 +256,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1 - vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloX - VeloY; - (dist.f[DIR_PP0])[kne] = getInterpolatedDistributionForVeloWithPressureBC(q, f_SW, f_NE, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_PP0])[kPP0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MM0, f_PP0, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_PM0])[k]; @@ -265,7 +265,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1 - vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloX - VeloY; - (dist.f[DIR_MP0])[knw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_SE, f_NW, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_MP0])[kMP0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PM0, f_MP0, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_MP0])[k]; @@ -274,7 +274,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1 + vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloX + VeloY; - (dist.f[DIR_PM0])[kse] = getInterpolatedDistributionForVeloWithPressureBC(q, f_NW, f_SE, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_PM0])[kPM0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MP0, f_PM0, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_P0P])[k]; @@ -283,7 +283,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloX + VeloZ; - (dist.f[DIR_M0M])[kbw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TE, f_BW, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_M0M])[kM0M] = getInterpolatedDistributionForVeloWithPressureBC(q, f_P0P, f_M0M, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_M0M])[k]; @@ -292,7 +292,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloX - VeloZ; - (dist.f[DIR_P0P])[kte] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BW, f_TE, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_P0P])[kP0P] = getInterpolatedDistributionForVeloWithPressureBC(q, f_M0M, f_P0P, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_P0M])[k]; @@ -301,7 +301,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloX - VeloZ; - (dist.f[DIR_M0P])[ktw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BE, f_TW, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_M0P])[kM0P] = getInterpolatedDistributionForVeloWithPressureBC(q, f_P0M, f_M0P, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_M0P])[k]; @@ -310,7 +310,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloX + VeloZ; - (dist.f[DIR_P0M])[kbe] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TW, f_BE, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_P0M])[kP0M] = getInterpolatedDistributionForVeloWithPressureBC(q, f_M0P, f_P0M, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_0PP])[k]; @@ -319,7 +319,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloY + VeloZ; - (dist.f[DIR_0MM])[kbs] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TN, f_BS, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_0MM])[k0MM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0PP, f_0MM, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_0MM])[k]; @@ -328,7 +328,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloY - VeloZ; - (dist.f[DIR_0PP])[ktn] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BS, f_TN, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_0PP])[k0PP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0MM, f_0PP, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_0PM])[k]; @@ -337,7 +337,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloY - VeloZ; - (dist.f[DIR_0MP])[kts] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BN, f_TS, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_0MP])[k0MP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0PM, f_0PP, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_0MP])[k]; @@ -346,7 +346,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloY + VeloZ; - (dist.f[DIR_0PM])[kbn] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TS, f_BN, feq, omega, drho, velocityBC, c1o54); + (dist.f[DIR_0PM])[k0PM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0PP, f_0PM, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_PPP])[k]; @@ -355,7 +355,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1 + vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = VeloX + VeloY + VeloZ; - (dist.f[DIR_MMM])[kbsw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TNE, f_BSW, feq, omega, drho, velocityBC, c1o216); + (dist.f[DIR_MMM])[kMMM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PPP, f_MMM, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_MMM])[k]; @@ -364,7 +364,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1 - vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = -VeloX - VeloY - VeloZ; - (dist.f[DIR_PPP])[ktne] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BSW, f_TNE, feq, omega, drho, velocityBC, c1o216); + (dist.f[DIR_PPP])[kPPP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MMM, f_PPP, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_PPM])[k]; @@ -373,7 +373,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1 + vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = VeloX + VeloY - VeloZ; - (dist.f[DIR_MMP])[ktsw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BNE, f_TSW, feq, omega, drho, velocityBC, c1o216); + (dist.f[DIR_MMP])[kMMP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PPM, f_MMP, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_MMP])[k]; @@ -382,7 +382,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1 - vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = -VeloX - VeloY + VeloZ; - (dist.f[DIR_PPM])[kbne] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TSW, f_BNE, feq, omega, drho, velocityBC, c1o216); + (dist.f[DIR_PPM])[kPPM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MMP, f_PPM, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_PMP])[k]; @@ -391,7 +391,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1 - vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = VeloX - VeloY + VeloZ; - (dist.f[DIR_MPM])[kbnw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TSE, f_BNW, feq, omega, drho, velocityBC, c1o216); + (dist.f[DIR_MPM])[kMPM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PMP, f_MPM, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_MPM])[k]; @@ -400,7 +400,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1 + vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = -VeloX + VeloY - VeloZ; - (dist.f[DIR_PMP])[ktse] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BNW, f_TSE, feq, omega, drho, velocityBC, c1o216); + (dist.f[DIR_PMP])[kPMP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MPM, f_PMP, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_PMM])[k]; @@ -409,7 +409,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = vx1 - vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = VeloX - VeloY - VeloZ; - (dist.f[DIR_MPP])[ktnw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BSE, f_TNW, feq, omega, drho, velocityBC, c1o216); + (dist.f[DIR_MPP])[kMPP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PMM, f_MPP, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_MPP])[k]; @@ -418,7 +418,7 @@ __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, velocityLB = -vx1 + vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = -VeloX + VeloY + VeloZ; - (dist.f[DIR_PMM])[kbse] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TNW, f_BSE, feq, omega, drho, velocityBC, c1o216); + (dist.f[DIR_PMM])[kPMM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MPP, f_PMM, feq, omega, drho, velocityBC, c1o216); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -429,23 +429,23 @@ __global__ void PrecursorDeviceEQ27( int* subgridDistanceIndices, int numberOfPrecursorNodes, real omega, real* distributions, - uint* neighborX, - uint* neighborY, + uint* neighborX, + uint* neighborY, uint* neighborZ, - uint* neighborsNT, - uint* neighborsNB, - uint* neighborsST, - uint* neighborsSB, - real* weightsNT, - real* weightsNB, - real* weightsST, - real* weightsSB, - real* vLast, + uint* neighbors0PP, + uint* neighbors0PM, + uint* neighbors0MP, + uint* neighbors0MM, + real* weights0PP, + real* weights0PM, + real* weights0MP, + real* weights0MM, + real* vLast, real* vCurrent, real velocityX, real velocityY, real velocityZ, - real tRatio, + real timeRatio, real velocityRatio, unsigned long long numberOfLBnodes, bool isEvenTimestep) @@ -456,11 +456,11 @@ __global__ void PrecursorDeviceEQ27( int* subgridDistanceIndices, //////////////////////////////////////////////////////////////////////////////// // interpolation of velocity - real vxLastInterpd, vyLastInterpd, vzLastInterpd; - real vxNextInterpd, vyNextInterpd, vzNextInterpd; + real vxLastInterpd, vyLastInterpd, vzLastInterpd; + real vxNextInterpd, vyNextInterpd, vzNextInterpd; - uint kNT = neighborsNT[k]; - real dNT = weightsNT[k]; + uint kNeighbor0PP = neighbors0PP[k]; + real d0PP = weights0PP[k]; real* vxLast = vLast; real* vyLast = &vLast[numberOfPrecursorNodes]; @@ -470,212 +470,212 @@ __global__ void PrecursorDeviceEQ27( int* subgridDistanceIndices, real* vyCurrent = &vCurrent[numberOfPrecursorNodes]; real* vzCurrent = &vCurrent[2*numberOfPrecursorNodes]; - if(dNT < 1e6) + if(d0PP < 1e6) { - uint kNB = neighborsNB[k]; - uint kST = neighborsST[k]; - uint kSB = neighborsSB[k]; + uint kNeighbor0PM = neighbors0PM[k]; + uint kNeighbor0MP = neighbors0MP[k]; + uint kNeighbor0MM = neighbors0MM[k]; - real dNB = weightsNB[k]; - real dST = weightsST[k]; - real dSB = weightsSB[k]; + real d0PM = weights0PM[k]; + real d0MP = weights0MP[k]; + real d0MM = weights0MM[k]; - real invWeightSum = 1.f/(dNT+dNB+dST+dSB); + real invWeightSum = 1.f/(d0PP+d0PM+d0MP+d0MM); - vxLastInterpd = (vxLast[kNT]*dNT + vxLast[kNB]*dNB + vxLast[kST]*dST + vxLast[kSB]*dSB)*invWeightSum; - vyLastInterpd = (vyLast[kNT]*dNT + vyLast[kNB]*dNB + vyLast[kST]*dST + vyLast[kSB]*dSB)*invWeightSum; - vzLastInterpd = (vzLast[kNT]*dNT + vzLast[kNB]*dNB + vzLast[kST]*dST + vzLast[kSB]*dSB)*invWeightSum; + vxLastInterpd = (vxLast[kNeighbor0PP]*d0PP + vxLast[kNeighbor0PM]*d0PM + vxLast[kNeighbor0MP]*d0MP + vxLast[kNeighbor0MM]*d0MM)*invWeightSum; + vyLastInterpd = (vyLast[kNeighbor0PP]*d0PP + vyLast[kNeighbor0PM]*d0PM + vyLast[kNeighbor0MP]*d0MP + vyLast[kNeighbor0MM]*d0MM)*invWeightSum; + vzLastInterpd = (vzLast[kNeighbor0PP]*d0PP + vzLast[kNeighbor0PM]*d0PM + vzLast[kNeighbor0MP]*d0MP + vzLast[kNeighbor0MM]*d0MM)*invWeightSum; - vxNextInterpd = (vxCurrent[kNT]*dNT + vxCurrent[kNB]*dNB + vxCurrent[kST]*dST + vxCurrent[kSB]*dSB)*invWeightSum; - vyNextInterpd = (vyCurrent[kNT]*dNT + vyCurrent[kNB]*dNB + vyCurrent[kST]*dST + vyCurrent[kSB]*dSB)*invWeightSum; - vzNextInterpd = (vzCurrent[kNT]*dNT + vzCurrent[kNB]*dNB + vzCurrent[kST]*dST + vzCurrent[kSB]*dSB)*invWeightSum; + vxNextInterpd = (vxCurrent[kNeighbor0PP]*d0PP + vxCurrent[kNeighbor0PM]*d0PM + vxCurrent[kNeighbor0MP]*d0MP + vxCurrent[kNeighbor0MM]*d0MM)*invWeightSum; + vyNextInterpd = (vyCurrent[kNeighbor0PP]*d0PP + vyCurrent[kNeighbor0PM]*d0PM + vyCurrent[kNeighbor0MP]*d0MP + vyCurrent[kNeighbor0MM]*d0MM)*invWeightSum; + vzNextInterpd = (vzCurrent[kNeighbor0PP]*d0PP + vzCurrent[kNeighbor0PM]*d0PM + vzCurrent[kNeighbor0MP]*d0MP + vzCurrent[kNeighbor0MM]*d0MM)*invWeightSum; } else { - vxLastInterpd = vxLast[kNT]; - vyLastInterpd = vyLast[kNT]; - vzLastInterpd = vzLast[kNT]; + vxLastInterpd = vxLast[kNeighbor0PP]; + vyLastInterpd = vyLast[kNeighbor0PP]; + vzLastInterpd = vzLast[kNeighbor0PP]; - vxNextInterpd = vxCurrent[kNT]; - vyNextInterpd = vyCurrent[kNT]; - vzNextInterpd = vzCurrent[kNT]; + vxNextInterpd = vxCurrent[kNeighbor0PP]; + vyNextInterpd = vyCurrent[kNeighbor0PP]; + vzNextInterpd = vzCurrent[kNeighbor0PP]; } // if(k==16300) printf("%f %f %f\n", vxLastInterpd, vyLastInterpd, vzLastInterpd); - real VeloX = (velocityX + (1.f-tRatio)*vxLastInterpd + tRatio*vxNextInterpd)/velocityRatio; - real VeloY = (velocityY + (1.f-tRatio)*vyLastInterpd + tRatio*vyNextInterpd)/velocityRatio; - real VeloZ = (velocityZ + (1.f-tRatio)*vzLastInterpd + tRatio*vzNextInterpd)/velocityRatio; + real VeloX = (velocityX + (1.f-timeRatio)*vxLastInterpd + timeRatio*vxNextInterpd)/velocityRatio; + real VeloY = (velocityY + (1.f-timeRatio)*vyLastInterpd + timeRatio*vyNextInterpd)/velocityRatio; + real VeloZ = (velocityZ + (1.f-timeRatio)*vzLastInterpd + timeRatio*vzNextInterpd)/velocityRatio; // From here on just a copy of QVelDeviceCompZeroPress //////////////////////////////////////////////////////////////////////////////// Distributions27 dist; getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep); - unsigned int KQK = subgridDistanceIndices[k]; - unsigned int kzero= KQK; - unsigned int ke = KQK; - unsigned int kw = neighborX[KQK]; - unsigned int kn = KQK; - unsigned int ks = neighborY[KQK]; - unsigned int kt = KQK; - unsigned int kb = neighborZ[KQK]; - unsigned int ksw = neighborY[kw]; - unsigned int kne = KQK; - unsigned int kse = ks; - unsigned int knw = kw; - unsigned int kbw = neighborZ[kw]; - unsigned int kte = KQK; - unsigned int kbe = kb; - unsigned int ktw = kw; - unsigned int kbs = neighborZ[ks]; - unsigned int ktn = KQK; - unsigned int kbn = kb; - unsigned int kts = ks; - unsigned int ktse = ks; - unsigned int kbnw = kbw; - unsigned int ktnw = kw; - unsigned int kbse = kbs; - unsigned int ktsw = ksw; - unsigned int kbne = kb; - unsigned int ktne = KQK; - unsigned int kbsw = neighborZ[ksw]; + unsigned int KQK = subgridDistanceIndices[k]; //QK + unsigned int k000 = KQK; //000 + unsigned int kP00 = KQK; //P00 + unsigned int kM00 = neighborX[KQK]; //M00 + unsigned int k0P0 = KQK; //n + unsigned int k0M0 = neighborY[KQK]; //s + unsigned int k00P = KQK; //t + unsigned int k00M = neighborZ[KQK]; //b + unsigned int kMM0 = neighborY[kM00]; //sw + unsigned int kPP0 = KQK; //ne + unsigned int kPM0 = k0M0; //se + unsigned int kMP0 = kM00; //nw + unsigned int kM0M = neighborZ[kM00]; //bw + unsigned int kP0P = KQK; //te + unsigned int kP0M = k00M; //be + unsigned int k0PP = KQK; //tn + unsigned int k0MM = neighborZ[k0M0]; //bs + unsigned int kM0P = kM00; //tw + unsigned int k0PM = k00M; //bn + unsigned int k0MP = k0M0; //ts + unsigned int kPMP = k0M0; //tse + unsigned int kMPM = kM0M; //bnw + unsigned int kMPP = kM00; //tnw + unsigned int kPMM = k0MM; //bse + unsigned int kMMP = kMM0; //tsw + unsigned int kPPM = k00M; //bne + unsigned int kPPP = KQK; //tne + unsigned int kMMM = neighborZ[kMM0]; //bsw ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // based on BGK Plus Comp ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - real f_W = (dist.f[DIR_P00])[ke ]; - real f_E = (dist.f[DIR_M00])[kw ]; - real f_S = (dist.f[DIR_0P0])[kn ]; - real f_N = (dist.f[DIR_0M0])[ks ]; - real f_B = (dist.f[DIR_00P])[kt ]; - real f_T = (dist.f[DIR_00M])[kb ]; - real f_SW = (dist.f[DIR_PP0])[kne ]; - real f_NE = (dist.f[DIR_MM0])[ksw ]; - real f_NW = (dist.f[DIR_PM0])[kse ]; - real f_SE = (dist.f[DIR_MP0])[knw ]; - real f_BW = (dist.f[DIR_P0P])[kte ]; - real f_TE = (dist.f[DIR_M0M])[kbw ]; - real f_TW = (dist.f[DIR_P0M])[kbe ]; - real f_BE = (dist.f[DIR_M0P])[ktw ]; - real f_BS = (dist.f[DIR_0PP])[ktn ]; - real f_TN = (dist.f[DIR_0MM])[kbs ]; - real f_TS = (dist.f[DIR_0PM])[kbn ]; - real f_BN = (dist.f[DIR_0MP])[kts ]; - real f_ZERO = (dist.f[DIR_000])[kzero]; - real f_BSW = (dist.f[DIR_PPP])[ktne ]; - real f_BNE = (dist.f[DIR_MMP])[ktsw ]; - real f_BNW = (dist.f[DIR_PMP])[ktse ]; - real f_BSE = (dist.f[DIR_MPP])[ktnw ]; - real f_TSW = (dist.f[DIR_PPM])[kbne ]; - real f_TNE = (dist.f[DIR_MMM])[kbsw ]; - real f_TNW = (dist.f[DIR_PMM])[kbse ]; - real f_TSE = (dist.f[DIR_MPM])[kbnw ]; + real f_M00 = (dist.f[DIR_P00])[kP00]; + real f_P00 = (dist.f[DIR_M00])[kM00]; + real f_0M0 = (dist.f[DIR_0P0])[k0P0]; + real f_0P0 = (dist.f[DIR_0M0])[k0M0]; + real f_00M = (dist.f[DIR_00P])[k00P]; + real f_00P = (dist.f[DIR_00M])[k00M]; + real f_MM0 = (dist.f[DIR_PP0])[kPP0]; + real f_PP0 = (dist.f[DIR_MM0])[kMM0]; + real f_MP0 = (dist.f[DIR_PM0])[kPM0]; + real f_PM0 = (dist.f[DIR_MP0])[kMP0]; + real f_M0M = (dist.f[DIR_P0P])[kP0P]; + real f_P0P = (dist.f[DIR_M0M])[kM0M]; + real f_M0P = (dist.f[DIR_P0M])[kP0M]; + real f_P0M = (dist.f[DIR_M0P])[kM0P]; + real f_0MM = (dist.f[DIR_0PP])[k0PP]; + real f_0PP = (dist.f[DIR_0MM])[k0MM]; + real f_0PM = (dist.f[DIR_0MP])[k0MP]; + real f_0MP = (dist.f[DIR_0PM])[k0PM]; + real f_000 = (dist.f[DIR_000])[k000]; + real f_MMM = (dist.f[DIR_PPP])[kPPP]; + real f_PPM = (dist.f[DIR_MMP])[kMMP]; + real f_MPM = (dist.f[DIR_PMP])[kPMP]; + real f_PMM = (dist.f[DIR_MPP])[kMPP]; + real f_MMP = (dist.f[DIR_PPM])[kPPM]; + real f_PPP = (dist.f[DIR_MMM])[kMMM]; + real f_MPP = (dist.f[DIR_PMM])[kPMM]; + real f_PMP = (dist.f[DIR_MPM])[kMPM]; //////////////////////////////////////////////////////////////////////////////// //! - Set macroscopic quantities //! real drho = c0o1; - real vx1 = VeloX; + real vx1 = VeloX; - real vx2 = VeloY; + real vx2 = VeloY; - real vx3 = VeloZ; + real vx3 = VeloZ; real cusq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); //////////////////////////////////////////////////////////////////////////////// - f_ZERO = c8o27* (drho-(drho+c1o1)*cusq); - f_E = c2o27* (drho+(drho+c1o1)*(c3o1*( vx1 )+c9o2*( vx1 )*( vx1 )-cusq)); - f_W = c2o27* (drho+(drho+c1o1)*(c3o1*(-vx1 )+c9o2*(-vx1 )*(-vx1 )-cusq)); - f_N = c2o27* (drho+(drho+c1o1)*(c3o1*( vx2 )+c9o2*( vx2 )*( vx2 )-cusq)); - f_S = c2o27* (drho+(drho+c1o1)*(c3o1*( -vx2 )+c9o2*( -vx2 )*( -vx2 )-cusq)); - f_T = c2o27* (drho+(drho+c1o1)*(c3o1*( vx3)+c9o2*( vx3)*( vx3)-cusq)); - f_B = c2o27* (drho+(drho+c1o1)*(c3o1*( -vx3)+c9o2*( -vx3)*( -vx3)-cusq)); - f_NE = c1o54* (drho+(drho+c1o1)*(c3o1*( vx1+vx2 )+c9o2*( vx1+vx2 )*( vx1+vx2 )-cusq)); - f_SW = c1o54* (drho+(drho+c1o1)*(c3o1*(-vx1-vx2 )+c9o2*(-vx1-vx2 )*(-vx1-vx2 )-cusq)); - f_SE = c1o54* (drho+(drho+c1o1)*(c3o1*( vx1-vx2 )+c9o2*( vx1-vx2 )*( vx1-vx2 )-cusq)); - f_NW = c1o54* (drho+(drho+c1o1)*(c3o1*(-vx1+vx2 )+c9o2*(-vx1+vx2 )*(-vx1+vx2 )-cusq)); - f_TE = c1o54* (drho+(drho+c1o1)*(c3o1*( vx1 +vx3)+c9o2*( vx1 +vx3)*( vx1 +vx3)-cusq)); - f_BW = c1o54* (drho+(drho+c1o1)*(c3o1*(-vx1 -vx3)+c9o2*(-vx1 -vx3)*(-vx1 -vx3)-cusq)); - f_BE = c1o54* (drho+(drho+c1o1)*(c3o1*( vx1 -vx3)+c9o2*( vx1 -vx3)*( vx1 -vx3)-cusq)); - f_TW = c1o54* (drho+(drho+c1o1)*(c3o1*(-vx1 +vx3)+c9o2*(-vx1 +vx3)*(-vx1 +vx3)-cusq)); - f_TN = c1o54* (drho+(drho+c1o1)*(c3o1*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cusq)); - f_BS = c1o54* (drho+(drho+c1o1)*(c3o1*( -vx2-vx3)+c9o2*( -vx2-vx3)*( -vx2-vx3)-cusq)); - f_BN = c1o54* (drho+(drho+c1o1)*(c3o1*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cusq)); - f_TS = c1o54* (drho+(drho+c1o1)*(c3o1*( -vx2+vx3)+c9o2*( -vx2+vx3)*( -vx2+vx3)-cusq)); - f_TNE = c1o216*(drho+(drho+c1o1)*(c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cusq)); - f_BSW = c1o216*(drho+(drho+c1o1)*(c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cusq)); - f_BNE = c1o216*(drho+(drho+c1o1)*(c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cusq)); - f_TSW = c1o216*(drho+(drho+c1o1)*(c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cusq)); - f_TSE = c1o216*(drho+(drho+c1o1)*(c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cusq)); - f_BNW = c1o216*(drho+(drho+c1o1)*(c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cusq)); - f_BSE = c1o216*(drho+(drho+c1o1)*(c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq)); - f_TNW = c1o216*(drho+(drho+c1o1)*(c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq)); + f_000 = c8o27* (drho-(drho+c1o1)*cusq); + f_P00 = c2o27* (drho+(drho+c1o1)*(c3o1*( vx1 )+c9o2*( vx1 )*( vx1 )-cusq)); + f_M00 = c2o27* (drho+(drho+c1o1)*(c3o1*(-vx1 )+c9o2*(-vx1 )*(-vx1 )-cusq)); + f_0P0 = c2o27* (drho+(drho+c1o1)*(c3o1*( vx2 )+c9o2*( vx2 )*( vx2 )-cusq)); + f_0M0 = c2o27* (drho+(drho+c1o1)*(c3o1*( -vx2 )+c9o2*( -vx2 )*( -vx2 )-cusq)); + f_00P = c2o27* (drho+(drho+c1o1)*(c3o1*( vx3)+c9o2*( vx3)*( vx3)-cusq)); + f_00M = c2o27* (drho+(drho+c1o1)*(c3o1*( -vx3)+c9o2*( -vx3)*( -vx3)-cusq)); + f_PP0 = c1o54* (drho+(drho+c1o1)*(c3o1*( vx1+vx2 )+c9o2*( vx1+vx2 )*( vx1+vx2 )-cusq)); + f_MM0 = c1o54* (drho+(drho+c1o1)*(c3o1*(-vx1-vx2 )+c9o2*(-vx1-vx2 )*(-vx1-vx2 )-cusq)); + f_PM0 = c1o54* (drho+(drho+c1o1)*(c3o1*( vx1-vx2 )+c9o2*( vx1-vx2 )*( vx1-vx2 )-cusq)); + f_MP0 = c1o54* (drho+(drho+c1o1)*(c3o1*(-vx1+vx2 )+c9o2*(-vx1+vx2 )*(-vx1+vx2 )-cusq)); + f_P0P = c1o54* (drho+(drho+c1o1)*(c3o1*( vx1 +vx3)+c9o2*( vx1 +vx3)*( vx1 +vx3)-cusq)); + f_M0M = c1o54* (drho+(drho+c1o1)*(c3o1*(-vx1 -vx3)+c9o2*(-vx1 -vx3)*(-vx1 -vx3)-cusq)); + f_P0M = c1o54* (drho+(drho+c1o1)*(c3o1*( vx1 -vx3)+c9o2*( vx1 -vx3)*( vx1 -vx3)-cusq)); + f_M0P = c1o54* (drho+(drho+c1o1)*(c3o1*(-vx1 +vx3)+c9o2*(-vx1 +vx3)*(-vx1 +vx3)-cusq)); + f_0PP = c1o54* (drho+(drho+c1o1)*(c3o1*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cusq)); + f_0MM = c1o54* (drho+(drho+c1o1)*(c3o1*( -vx2-vx3)+c9o2*( -vx2-vx3)*( -vx2-vx3)-cusq)); + f_0PM = c1o54* (drho+(drho+c1o1)*(c3o1*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cusq)); + f_0MP = c1o54* (drho+(drho+c1o1)*(c3o1*( -vx2+vx3)+c9o2*( -vx2+vx3)*( -vx2+vx3)-cusq)); + f_PPP = c1o216*(drho+(drho+c1o1)*(c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cusq)); + f_MMM = c1o216*(drho+(drho+c1o1)*(c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cusq)); + f_PPM = c1o216*(drho+(drho+c1o1)*(c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cusq)); + f_MMP = c1o216*(drho+(drho+c1o1)*(c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cusq)); + f_PMP = c1o216*(drho+(drho+c1o1)*(c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cusq)); + f_MPM = c1o216*(drho+(drho+c1o1)*(c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cusq)); + f_PMM = c1o216*(drho+(drho+c1o1)*(c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq)); + f_MPP = c1o216*(drho+(drho+c1o1)*(c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq)); //////////////////////////////////////////////////////////////////////////////// //! write the new distributions to the bc nodes //! - (dist.f[DIR_P00 ])[ke ] = f_W ; - (dist.f[DIR_PP0 ])[kne ] = f_SW ; - (dist.f[DIR_P0M ])[kbe ] = f_TW ; - (dist.f[DIR_PM0 ])[kse ] = f_NW ; - (dist.f[DIR_PMP ])[ktse ] = f_BNW ; - (dist.f[DIR_P0P ])[kte ] = f_BW ; - (dist.f[DIR_PPM ])[kbne ] = f_TSW ; - (dist.f[DIR_PPP ])[ktne ] = f_BSW ; - (dist.f[DIR_PMM ])[kbse ] = f_TNW ; - - (dist.f[DIR_M00 ])[kw ] = f_E ; - (dist.f[DIR_MM0 ])[ksw ] = f_NE ; - (dist.f[DIR_M0M ])[kbw ] = f_TE ; - (dist.f[DIR_MP0 ])[knw ] = f_SE ; - (dist.f[DIR_M0P ])[ktw ] = f_BE ; - (dist.f[DIR_MMM ])[kbsw ] = f_TNE ; - (dist.f[DIR_MMP ])[ktsw ] = f_BNE ; - (dist.f[DIR_MPP ])[ktnw ] = f_BSE ; - (dist.f[DIR_MPM ])[kbnw ] = f_TSE ; - - (dist.f[DIR_0P0 ])[kn ] = f_S ; - (dist.f[DIR_0M0 ])[ks ] = f_N ; - (dist.f[DIR_00P ])[kt ] = f_B ; - (dist.f[DIR_00M ])[kb ] = f_T ; - (dist.f[DIR_0PP ])[ktn ] = f_BS ; - (dist.f[DIR_0MM ])[kbs ] = f_TN ; - (dist.f[DIR_0PM ])[kbn ] = f_TS ; - (dist.f[DIR_0MP ])[kts ] = f_BN ; - (dist.f[DIR_000])[kzero] = f_ZERO; + (dist.f[DIR_P00])[kP00] = f_M00; + (dist.f[DIR_PP0])[kPP0] = f_MM0; + (dist.f[DIR_P0M])[kP0M] = f_M0P; + (dist.f[DIR_PM0])[kPM0] = f_MP0; + (dist.f[DIR_PMP])[kPMP] = f_MPM; + (dist.f[DIR_P0P])[kP0P] = f_M0M; + (dist.f[DIR_PPM])[kPPM] = f_MMP; + (dist.f[DIR_PPP])[kPPP] = f_MMM; + (dist.f[DIR_PMM])[kPMM] = f_MPP; + + (dist.f[DIR_M00])[kM00] = f_P00; + (dist.f[DIR_MM0])[kMM0] = f_PP0; + (dist.f[DIR_M0M])[kM0M] = f_P0P; + (dist.f[DIR_MP0])[kMP0] = f_PM0; + (dist.f[DIR_M0P])[kM0P] = f_P0M; + (dist.f[DIR_MMM])[kMMM] = f_PPP; + (dist.f[DIR_MMP])[kMMP] = f_PPM; + (dist.f[DIR_MPP])[kMPP] = f_PMM; + (dist.f[DIR_MPM])[kMPM] = f_PMP; + + (dist.f[DIR_0P0])[k0P0] = f_0M0; + (dist.f[DIR_0M0])[k0M0] = f_0P0; + (dist.f[DIR_00P])[k00P] = f_00M; + (dist.f[DIR_00M])[k00M] = f_00P; + (dist.f[DIR_0PP])[k0PP] = f_0MM; + (dist.f[DIR_0MM])[k0MM] = f_0PP; + (dist.f[DIR_0PM])[k0PM] = f_0MP; + (dist.f[DIR_0MP])[k0MP] = f_0PM; + (dist.f[DIR_000])[k000] = f_000; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void PrecursorDeviceDistributions( int* subgridDistanceIndices, - int numberOfBCnodes, + int numberOfBCnodes, int numberOfPrecursorNodes, - real* distributions, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - uint* neighborsNT, - uint* neighborsNB, - uint* neighborsST, - uint* neighborsSB, - real* weightsNT, - real* weightsNB, - real* weightsST, - real* weightsSB, - real* fsLast, - real* fsNext, - real tRatio, - unsigned long long numberOfLBnodes, - bool isEvenTimestep) + real* distributions, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + uint* neighbors0PP, + uint* neighbors0PM, + uint* neighbors0MP, + uint* neighbors0MM, + real* weights0PP, + real* weights0PM, + real* weights0MP, + real* weights0MM, + real* fsLast, + real* fsNext, + real timeRatio, + unsigned long long numberOfLBnodes, + bool isEvenTimestep) { const unsigned k = vf::gpu::getNodeIndex(); if(k>=numberOfBCnodes) return; - uint kNT = neighborsNT[k]; - real dNT = weightsNT[k]; + uint kNeighbor0PP = neighbors0PP[k]; + real d0PP = weights0PP[k]; real f0LastInterp, f1LastInterp, f2LastInterp, f3LastInterp, f4LastInterp, f5LastInterp, f6LastInterp, f7LastInterp, f8LastInterp; real f0NextInterp, f1NextInterp, f2NextInterp, f3NextInterp, f4NextInterp, f5NextInterp, f6NextInterp, f7NextInterp, f8NextInterp; @@ -701,107 +701,106 @@ __global__ void PrecursorDeviceDistributions( int* subgridDistanceIndices, real* f8Next = &fsNext[8*numberOfPrecursorNodes]; - if(dNT<1e6) - { - uint kNB = neighborsNB[k]; - uint kST = neighborsST[k]; - uint kSB = neighborsSB[k]; - - real dNB = weightsNB[k]; - real dST = weightsST[k]; - real dSB = weightsSB[k]; - - real invWeightSum = 1.f/(dNT+dNB+dST+dSB); - - f0LastInterp = (f0Last[kNT]*dNT + f0Last[kNB]*dNB + f0Last[kST]*dST + f0Last[kSB]*dSB)*invWeightSum; - f0NextInterp = (f0Next[kNT]*dNT + f0Next[kNB]*dNB + f0Next[kST]*dST + f0Next[kSB]*dSB)*invWeightSum; - - f1LastInterp = (f1Last[kNT]*dNT + f1Last[kNB]*dNB + f1Last[kST]*dST + f1Last[kSB]*dSB)*invWeightSum; - f1NextInterp = (f1Next[kNT]*dNT + f1Next[kNB]*dNB + f1Next[kST]*dST + f1Next[kSB]*dSB)*invWeightSum; - - f2LastInterp = (f2Last[kNT]*dNT + f2Last[kNB]*dNB + f2Last[kST]*dST + f2Last[kSB]*dSB)*invWeightSum; - f2NextInterp = (f2Next[kNT]*dNT + f2Next[kNB]*dNB + f2Next[kST]*dST + f2Next[kSB]*dSB)*invWeightSum; - - f3LastInterp = (f3Last[kNT]*dNT + f3Last[kNB]*dNB + f3Last[kST]*dST + f3Last[kSB]*dSB)*invWeightSum; - f3NextInterp = (f3Next[kNT]*dNT + f3Next[kNB]*dNB + f3Next[kST]*dST + f3Next[kSB]*dSB)*invWeightSum; - - f4LastInterp = (f4Last[kNT]*dNT + f4Last[kNB]*dNB + f4Last[kST]*dST + f4Last[kSB]*dSB)*invWeightSum; - f4NextInterp = (f4Next[kNT]*dNT + f4Next[kNB]*dNB + f4Next[kST]*dST + f4Next[kSB]*dSB)*invWeightSum; - - f5LastInterp = (f5Last[kNT]*dNT + f5Last[kNB]*dNB + f5Last[kST]*dST + f5Last[kSB]*dSB)*invWeightSum; - f5NextInterp = (f5Next[kNT]*dNT + f5Next[kNB]*dNB + f5Next[kST]*dST + f5Next[kSB]*dSB)*invWeightSum; - - f6LastInterp = (f6Last[kNT]*dNT + f6Last[kNB]*dNB + f6Last[kST]*dST + f6Last[kSB]*dSB)*invWeightSum; - f6NextInterp = (f6Next[kNT]*dNT + f6Next[kNB]*dNB + f6Next[kST]*dST + f6Next[kSB]*dSB)*invWeightSum; - - f7LastInterp = (f7Last[kNT]*dNT + f7Last[kNB]*dNB + f7Last[kST]*dST + f7Last[kSB]*dSB)*invWeightSum; - f7NextInterp = (f7Next[kNT]*dNT + f7Next[kNB]*dNB + f7Next[kST]*dST + f7Next[kSB]*dSB)*invWeightSum; - - f8LastInterp = (f8Last[kNT]*dNT + f8Last[kNB]*dNB + f8Last[kST]*dST + f8Last[kSB]*dSB)*invWeightSum; - f8NextInterp = (f8Next[kNT]*dNT + f8Next[kNB]*dNB + f8Next[kST]*dST + f8Next[kSB]*dSB)*invWeightSum; - + if(d0PP<1e6) + { + uint kNeighbor0PM = neighbors0PM[k]; + uint kNeighbor0MP = neighbors0MP[k]; + uint kNeighbor0MM = neighbors0MM[k]; + + real d0PM = weights0PM[k]; + real d0MP = weights0MP[k]; + real d0MM = weights0MM[k]; + + real invWeightSum = 1.f/(d0PP+d0PM+d0MP+d0MM); + + f0LastInterp = (f0Last[kNeighbor0PP]*d0PP + f0Last[kNeighbor0PM]*d0PM + f0Last[kNeighbor0MP]*d0MP + f0Last[kNeighbor0MM]*d0MM)*invWeightSum; + f0NextInterp = (f0Next[kNeighbor0PP]*d0PP + f0Next[kNeighbor0PM]*d0PM + f0Next[kNeighbor0MP]*d0MP + f0Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f1LastInterp = (f1Last[kNeighbor0PP]*d0PP + f1Last[kNeighbor0PM]*d0PM + f1Last[kNeighbor0MP]*d0MP + f1Last[kNeighbor0MM]*d0MM)*invWeightSum; + f1NextInterp = (f1Next[kNeighbor0PP]*d0PP + f1Next[kNeighbor0PM]*d0PM + f1Next[kNeighbor0MP]*d0MP + f1Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f2LastInterp = (f2Last[kNeighbor0PP]*d0PP + f2Last[kNeighbor0PM]*d0PM + f2Last[kNeighbor0MP]*d0MP + f2Last[kNeighbor0MM]*d0MM)*invWeightSum; + f2NextInterp = (f2Next[kNeighbor0PP]*d0PP + f2Next[kNeighbor0PM]*d0PM + f2Next[kNeighbor0MP]*d0MP + f2Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f3LastInterp = (f3Last[kNeighbor0PP]*d0PP + f3Last[kNeighbor0PM]*d0PM + f3Last[kNeighbor0MP]*d0MP + f3Last[kNeighbor0MM]*d0MM)*invWeightSum; + f3NextInterp = (f3Next[kNeighbor0PP]*d0PP + f3Next[kNeighbor0PM]*d0PM + f3Next[kNeighbor0MP]*d0MP + f3Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f4LastInterp = (f4Last[kNeighbor0PP]*d0PP + f4Last[kNeighbor0PM]*d0PM + f4Last[kNeighbor0MP]*d0MP + f4Last[kNeighbor0MM]*d0MM)*invWeightSum; + f4NextInterp = (f4Next[kNeighbor0PP]*d0PP + f4Next[kNeighbor0PM]*d0PM + f4Next[kNeighbor0MP]*d0MP + f4Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f5LastInterp = (f5Last[kNeighbor0PP]*d0PP + f5Last[kNeighbor0PM]*d0PM + f5Last[kNeighbor0MP]*d0MP + f5Last[kNeighbor0MM]*d0MM)*invWeightSum; + f5NextInterp = (f5Next[kNeighbor0PP]*d0PP + f5Next[kNeighbor0PM]*d0PM + f5Next[kNeighbor0MP]*d0MP + f5Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f6LastInterp = (f6Last[kNeighbor0PP]*d0PP + f6Last[kNeighbor0PM]*d0PM + f6Last[kNeighbor0MP]*d0MP + f6Last[kNeighbor0MM]*d0MM)*invWeightSum; + f6NextInterp = (f6Next[kNeighbor0PP]*d0PP + f6Next[kNeighbor0PM]*d0PM + f6Next[kNeighbor0MP]*d0MP + f6Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f7LastInterp = (f7Last[kNeighbor0PP]*d0PP + f7Last[kNeighbor0PM]*d0PM + f7Last[kNeighbor0MP]*d0MP + f7Last[kNeighbor0MM]*d0MM)*invWeightSum; + f7NextInterp = (f7Next[kNeighbor0PP]*d0PP + f7Next[kNeighbor0PM]*d0PM + f7Next[kNeighbor0MP]*d0MP + f7Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f8LastInterp = (f8Last[kNeighbor0PP]*d0PP + f8Last[kNeighbor0PM]*d0PM + f8Last[kNeighbor0MP]*d0MP + f8Last[kNeighbor0MM]*d0MM)*invWeightSum; + f8NextInterp = (f8Next[kNeighbor0PP]*d0PP + f8Next[kNeighbor0PM]*d0PM + f8Next[kNeighbor0MP]*d0MP + f8Next[kNeighbor0MM]*d0MM)*invWeightSum; + } else { - f0LastInterp = f0Last[kNT]; - f1LastInterp = f1Last[kNT]; - f2LastInterp = f2Last[kNT]; - f3LastInterp = f3Last[kNT]; - f4LastInterp = f4Last[kNT]; - f5LastInterp = f5Last[kNT]; - f6LastInterp = f6Last[kNT]; - f7LastInterp = f7Last[kNT]; - f8LastInterp = f8Last[kNT]; - - f0NextInterp = f0Next[kNT]; - f1NextInterp = f1Next[kNT]; - f2NextInterp = f2Next[kNT]; - f3NextInterp = f3Next[kNT]; - f4NextInterp = f4Next[kNT]; - f5NextInterp = f5Next[kNT]; - f6NextInterp = f6Next[kNT]; - f7NextInterp = f7Next[kNT]; - f8NextInterp = f8Next[kNT]; + f0LastInterp = f0Last[kNeighbor0PP]; + f1LastInterp = f1Last[kNeighbor0PP]; + f2LastInterp = f2Last[kNeighbor0PP]; + f3LastInterp = f3Last[kNeighbor0PP]; + f4LastInterp = f4Last[kNeighbor0PP]; + f5LastInterp = f5Last[kNeighbor0PP]; + f6LastInterp = f6Last[kNeighbor0PP]; + f7LastInterp = f7Last[kNeighbor0PP]; + f8LastInterp = f8Last[kNeighbor0PP]; + + f0NextInterp = f0Next[kNeighbor0PP]; + f1NextInterp = f1Next[kNeighbor0PP]; + f2NextInterp = f2Next[kNeighbor0PP]; + f3NextInterp = f3Next[kNeighbor0PP]; + f4NextInterp = f4Next[kNeighbor0PP]; + f5NextInterp = f5Next[kNeighbor0PP]; + f6NextInterp = f6Next[kNeighbor0PP]; + f7NextInterp = f7Next[kNeighbor0PP]; + f8NextInterp = f8Next[kNeighbor0PP]; } Distributions27 dist; getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep); unsigned int KQK = subgridDistanceIndices[k]; - // unsigned int kzero= KQK; - unsigned int ke = KQK; - // unsigned int kw = neighborX[KQK]; - // unsigned int kn = KQK; - unsigned int ks = neighborY[KQK]; - // unsigned int kt = KQK; - unsigned int kb = neighborZ[KQK]; - // unsigned int ksw = neighborY[kw]; - unsigned int kne = KQK; - unsigned int kse = ks; - // unsigned int knw = kw; - // unsigned int kbw = neighborZ[kw]; - unsigned int kte = KQK; - unsigned int kbe = kb; - // unsigned int ktw = kw; - unsigned int kbs = neighborZ[ks]; - // unsigned int ktn = KQK; - // unsigned int kbn = kb; - // unsigned int kts = ks; - unsigned int ktse = ks; - // unsigned int kbnw = kbw; - // unsigned int ktnw = kw; - unsigned int kbse = kbs; - // unsigned int ktsw = ksw; - unsigned int kbne = kb; - unsigned int ktne = KQK; - // unsigned int kbsw = neighborZ[ksw]; - - dist.f[DIR_P00][ke] = f0LastInterp*(1.f-tRatio) + f0NextInterp*tRatio; - dist.f[DIR_PP0][kne] = f1LastInterp*(1.f-tRatio) + f1NextInterp*tRatio; - dist.f[DIR_PM0][kse] = f2LastInterp*(1.f-tRatio) + f2NextInterp*tRatio; - dist.f[DIR_P0P][kte] = f3LastInterp*(1.f-tRatio) + f3NextInterp*tRatio; - dist.f[DIR_P0M][kbe] = f4LastInterp*(1.f-tRatio) + f4NextInterp*tRatio; - dist.f[DIR_PPP][ktne] = f5LastInterp*(1.f-tRatio) + f5NextInterp*tRatio; - dist.f[DIR_PMP][ktse] = f6LastInterp*(1.f-tRatio) + f6NextInterp*tRatio; - dist.f[DIR_PPM][kbne] = f7LastInterp*(1.f-tRatio) + f7NextInterp*tRatio; - dist.f[DIR_PMM][kbse] = f8LastInterp*(1.f-tRatio) + f8NextInterp*tRatio; + // unsigned int k000= KQK; + unsigned int kP00 = KQK; + // unsigned int kM00 = neighborX[KQK]; + // unsigned int k0P0 = KQK; + unsigned int k0M0 = neighborY[KQK]; + // unsigned int k00P = KQK; + unsigned int k00M = neighborZ[KQK]; + // unsigned int kMM0 = neighborY[kM00]; + unsigned int kPP0 = KQK; + unsigned int kPM0 = k0M0; + // unsigned int kMP0 = kM00; + // unsigned int kM0M = neighborZ[kM00]; + unsigned int kP0P = KQK; + unsigned int kP0M = k00M; + // unsigned int kM0P = kM00; + unsigned int k0MM = neighborZ[k0M0]; + // unsigned int k0PM = k00M; + // unsigned int k0MP = k0M0; + unsigned int kPMP = k0M0; + // unsigned int kMPM = kM0M; + // unsigned int kMPP = kM00; + unsigned int kPMM = k0MM; + // unsigned int kMMP = kMM0; + unsigned int kPPM = k00M; + unsigned int kPPP = KQK; + // unsigned int kMMM = neighborZ[kMM0]; + + dist.f[DIR_P00][kP00] = f0LastInterp*(1.f-timeRatio) + f0NextInterp*timeRatio; + dist.f[DIR_PP0][kPP0] = f1LastInterp*(1.f-timeRatio) + f1NextInterp*timeRatio; + dist.f[DIR_PM0][kPM0] = f2LastInterp*(1.f-timeRatio) + f2NextInterp*timeRatio; + dist.f[DIR_P0P][kP0P] = f3LastInterp*(1.f-timeRatio) + f3NextInterp*timeRatio; + dist.f[DIR_P0M][kP0M] = f4LastInterp*(1.f-timeRatio) + f4NextInterp*timeRatio; + dist.f[DIR_PPP][kPPP] = f5LastInterp*(1.f-timeRatio) + f5NextInterp*timeRatio; + dist.f[DIR_PMP][kPMP] = f6LastInterp*(1.f-timeRatio) + f6NextInterp*timeRatio; + dist.f[DIR_PPM][kPPM] = f7LastInterp*(1.f-timeRatio) + f7NextInterp*timeRatio; + dist.f[DIR_PMM][kPMM] = f8LastInterp*(1.f-timeRatio) + f8NextInterp*timeRatio; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -809,32 +808,32 @@ __global__ void PrecursorDeviceDistributions( int* subgridDistanceIndices, __global__ void QPrecursorDeviceDistributions( int* subgridDistanceIndices, real* subgridDistances, int sizeQ, - int numberOfBCnodes, + int numberOfBCnodes, int numberOfPrecursorNodes, - real* distributions, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - uint* neighborsNT, - uint* neighborsNB, - uint* neighborsST, - uint* neighborsSB, - real* weightsNT, - real* weightsNB, - real* weightsST, - real* weightsSB, - real* fsLast, - real* fsNext, - real tRatio, - unsigned long long numberOfLBnodes, - bool isEvenTimestep) + real* distributions, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + uint* neighbors0PP, + uint* neighbors0PM, + uint* neighbors0MP, + uint* neighbors0MM, + real* weights0PP, + real* weights0PM, + real* weights0MP, + real* weights0MM, + real* fsLast, + real* fsNext, + real timeRatio, + unsigned long long numberOfLBnodes, + bool isEvenTimestep) { const unsigned k = vf::gpu::getNodeIndex(); if(k>=numberOfBCnodes) return; - uint kNT = neighborsNT[k]; - real dNT = weightsNT[k]; + uint kNeighbor0PP = neighbors0PP[k]; + real d0PP = weights0PP[k]; real f0LastInterp, f1LastInterp, f2LastInterp, f3LastInterp, f4LastInterp, f5LastInterp, f6LastInterp, f7LastInterp, f8LastInterp; real f0NextInterp, f1NextInterp, f2NextInterp, f3NextInterp, f4NextInterp, f5NextInterp, f6NextInterp, f7NextInterp, f8NextInterp; @@ -860,110 +859,109 @@ __global__ void QPrecursorDeviceDistributions( int* subgridDistanceIndices, real* f8Next = &fsNext[8*numberOfPrecursorNodes]; - if(dNT<1e6) - { - uint kNB = neighborsNB[k]; - uint kST = neighborsST[k]; - uint kSB = neighborsSB[k]; - - real dNB = weightsNB[k]; - real dST = weightsST[k]; - real dSB = weightsSB[k]; - - real invWeightSum = 1.f/(dNT+dNB+dST+dSB); - - f0LastInterp = (f0Last[kNT]*dNT + f0Last[kNB]*dNB + f0Last[kST]*dST + f0Last[kSB]*dSB)*invWeightSum; - f0NextInterp = (f0Next[kNT]*dNT + f0Next[kNB]*dNB + f0Next[kST]*dST + f0Next[kSB]*dSB)*invWeightSum; - - f1LastInterp = (f1Last[kNT]*dNT + f1Last[kNB]*dNB + f1Last[kST]*dST + f1Last[kSB]*dSB)*invWeightSum; - f1NextInterp = (f1Next[kNT]*dNT + f1Next[kNB]*dNB + f1Next[kST]*dST + f1Next[kSB]*dSB)*invWeightSum; - - f2LastInterp = (f2Last[kNT]*dNT + f2Last[kNB]*dNB + f2Last[kST]*dST + f2Last[kSB]*dSB)*invWeightSum; - f2NextInterp = (f2Next[kNT]*dNT + f2Next[kNB]*dNB + f2Next[kST]*dST + f2Next[kSB]*dSB)*invWeightSum; - - f3LastInterp = (f3Last[kNT]*dNT + f3Last[kNB]*dNB + f3Last[kST]*dST + f3Last[kSB]*dSB)*invWeightSum; - f3NextInterp = (f3Next[kNT]*dNT + f3Next[kNB]*dNB + f3Next[kST]*dST + f3Next[kSB]*dSB)*invWeightSum; - - f4LastInterp = (f4Last[kNT]*dNT + f4Last[kNB]*dNB + f4Last[kST]*dST + f4Last[kSB]*dSB)*invWeightSum; - f4NextInterp = (f4Next[kNT]*dNT + f4Next[kNB]*dNB + f4Next[kST]*dST + f4Next[kSB]*dSB)*invWeightSum; - - f5LastInterp = (f5Last[kNT]*dNT + f5Last[kNB]*dNB + f5Last[kST]*dST + f5Last[kSB]*dSB)*invWeightSum; - f5NextInterp = (f5Next[kNT]*dNT + f5Next[kNB]*dNB + f5Next[kST]*dST + f5Next[kSB]*dSB)*invWeightSum; - - f6LastInterp = (f6Last[kNT]*dNT + f6Last[kNB]*dNB + f6Last[kST]*dST + f6Last[kSB]*dSB)*invWeightSum; - f6NextInterp = (f6Next[kNT]*dNT + f6Next[kNB]*dNB + f6Next[kST]*dST + f6Next[kSB]*dSB)*invWeightSum; - - f7LastInterp = (f7Last[kNT]*dNT + f7Last[kNB]*dNB + f7Last[kST]*dST + f7Last[kSB]*dSB)*invWeightSum; - f7NextInterp = (f7Next[kNT]*dNT + f7Next[kNB]*dNB + f7Next[kST]*dST + f7Next[kSB]*dSB)*invWeightSum; - - f8LastInterp = (f8Last[kNT]*dNT + f8Last[kNB]*dNB + f8Last[kST]*dST + f8Last[kSB]*dSB)*invWeightSum; - f8NextInterp = (f8Next[kNT]*dNT + f8Next[kNB]*dNB + f8Next[kST]*dST + f8Next[kSB]*dSB)*invWeightSum; - + if(d0PP<1e6) + { + uint kNeighbor0PM = neighbors0PM[k]; + uint kNeighbor0MP = neighbors0MP[k]; + uint kNeighbor0MM = neighbors0MM[k]; + + real d0PM = weights0PM[k]; + real d0MP = weights0MP[k]; + real d0MM = weights0MM[k]; + + real invWeightSum = 1.f/(d0PP+d0PM+d0MP+d0MM); + + f0LastInterp = (f0Last[kNeighbor0PP]*d0PP + f0Last[kNeighbor0PM]*d0PM + f0Last[kNeighbor0MP]*d0MP + f0Last[kNeighbor0MM]*d0MM)*invWeightSum; + f0NextInterp = (f0Next[kNeighbor0PP]*d0PP + f0Next[kNeighbor0PM]*d0PM + f0Next[kNeighbor0MP]*d0MP + f0Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f1LastInterp = (f1Last[kNeighbor0PP]*d0PP + f1Last[kNeighbor0PM]*d0PM + f1Last[kNeighbor0MP]*d0MP + f1Last[kNeighbor0MM]*d0MM)*invWeightSum; + f1NextInterp = (f1Next[kNeighbor0PP]*d0PP + f1Next[kNeighbor0PM]*d0PM + f1Next[kNeighbor0MP]*d0MP + f1Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f2LastInterp = (f2Last[kNeighbor0PP]*d0PP + f2Last[kNeighbor0PM]*d0PM + f2Last[kNeighbor0MP]*d0MP + f2Last[kNeighbor0MM]*d0MM)*invWeightSum; + f2NextInterp = (f2Next[kNeighbor0PP]*d0PP + f2Next[kNeighbor0PM]*d0PM + f2Next[kNeighbor0MP]*d0MP + f2Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f3LastInterp = (f3Last[kNeighbor0PP]*d0PP + f3Last[kNeighbor0PM]*d0PM + f3Last[kNeighbor0MP]*d0MP + f3Last[kNeighbor0MM]*d0MM)*invWeightSum; + f3NextInterp = (f3Next[kNeighbor0PP]*d0PP + f3Next[kNeighbor0PM]*d0PM + f3Next[kNeighbor0MP]*d0MP + f3Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f4LastInterp = (f4Last[kNeighbor0PP]*d0PP + f4Last[kNeighbor0PM]*d0PM + f4Last[kNeighbor0MP]*d0MP + f4Last[kNeighbor0MM]*d0MM)*invWeightSum; + f4NextInterp = (f4Next[kNeighbor0PP]*d0PP + f4Next[kNeighbor0PM]*d0PM + f4Next[kNeighbor0MP]*d0MP + f4Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f5LastInterp = (f5Last[kNeighbor0PP]*d0PP + f5Last[kNeighbor0PM]*d0PM + f5Last[kNeighbor0MP]*d0MP + f5Last[kNeighbor0MM]*d0MM)*invWeightSum; + f5NextInterp = (f5Next[kNeighbor0PP]*d0PP + f5Next[kNeighbor0PM]*d0PM + f5Next[kNeighbor0MP]*d0MP + f5Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f6LastInterp = (f6Last[kNeighbor0PP]*d0PP + f6Last[kNeighbor0PM]*d0PM + f6Last[kNeighbor0MP]*d0MP + f6Last[kNeighbor0MM]*d0MM)*invWeightSum; + f6NextInterp = (f6Next[kNeighbor0PP]*d0PP + f6Next[kNeighbor0PM]*d0PM + f6Next[kNeighbor0MP]*d0MP + f6Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f7LastInterp = (f7Last[kNeighbor0PP]*d0PP + f7Last[kNeighbor0PM]*d0PM + f7Last[kNeighbor0MP]*d0MP + f7Last[kNeighbor0MM]*d0MM)*invWeightSum; + f7NextInterp = (f7Next[kNeighbor0PP]*d0PP + f7Next[kNeighbor0PM]*d0PM + f7Next[kNeighbor0MP]*d0MP + f7Next[kNeighbor0MM]*d0MM)*invWeightSum; + + f8LastInterp = (f8Last[kNeighbor0PP]*d0PP + f8Last[kNeighbor0PM]*d0PM + f8Last[kNeighbor0MP]*d0MP + f8Last[kNeighbor0MM]*d0MM)*invWeightSum; + f8NextInterp = (f8Next[kNeighbor0PP]*d0PP + f8Next[kNeighbor0PM]*d0PM + f8Next[kNeighbor0MP]*d0MP + f8Next[kNeighbor0MM]*d0MM)*invWeightSum; + } else { - f0LastInterp = f0Last[kNT]; - f1LastInterp = f1Last[kNT]; - f2LastInterp = f2Last[kNT]; - f3LastInterp = f3Last[kNT]; - f4LastInterp = f4Last[kNT]; - f5LastInterp = f5Last[kNT]; - f6LastInterp = f6Last[kNT]; - f7LastInterp = f7Last[kNT]; - f8LastInterp = f8Last[kNT]; - - f0NextInterp = f0Next[kNT]; - f1NextInterp = f1Next[kNT]; - f2NextInterp = f2Next[kNT]; - f3NextInterp = f3Next[kNT]; - f4NextInterp = f4Next[kNT]; - f5NextInterp = f5Next[kNT]; - f6NextInterp = f6Next[kNT]; - f7NextInterp = f7Next[kNT]; - f8NextInterp = f8Next[kNT]; + f0LastInterp = f0Last[kNeighbor0PP]; + f1LastInterp = f1Last[kNeighbor0PP]; + f2LastInterp = f2Last[kNeighbor0PP]; + f3LastInterp = f3Last[kNeighbor0PP]; + f4LastInterp = f4Last[kNeighbor0PP]; + f5LastInterp = f5Last[kNeighbor0PP]; + f6LastInterp = f6Last[kNeighbor0PP]; + f7LastInterp = f7Last[kNeighbor0PP]; + f8LastInterp = f8Last[kNeighbor0PP]; + + f0NextInterp = f0Next[kNeighbor0PP]; + f1NextInterp = f1Next[kNeighbor0PP]; + f2NextInterp = f2Next[kNeighbor0PP]; + f3NextInterp = f3Next[kNeighbor0PP]; + f4NextInterp = f4Next[kNeighbor0PP]; + f5NextInterp = f5Next[kNeighbor0PP]; + f6NextInterp = f6Next[kNeighbor0PP]; + f7NextInterp = f7Next[kNeighbor0PP]; + f8NextInterp = f8Next[kNeighbor0PP]; } Distributions27 dist; getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep); unsigned int KQK = subgridDistanceIndices[k]; - // unsigned int kzero= KQK; - unsigned int ke = KQK; - // unsigned int kw = neighborX[KQK]; - // unsigned int kn = KQK; - unsigned int ks = neighborY[KQK]; - // unsigned int kt = KQK; - unsigned int kb = neighborZ[KQK]; - // unsigned int ksw = neighborY[kw]; - unsigned int kne = KQK; - unsigned int kse = ks; - // unsigned int knw = kw; - // unsigned int kbw = neighborZ[kw]; - unsigned int kte = KQK; - unsigned int kbe = kb; - // unsigned int ktw = kw; - unsigned int kbs = neighborZ[ks]; - // unsigned int ktn = KQK; - // unsigned int kbn = kb; - // unsigned int kts = ks; - unsigned int ktse = ks; - // unsigned int kbnw = kbw; - // unsigned int ktnw = kw; - unsigned int kbse = kbs; - // unsigned int ktsw = ksw; - unsigned int kbne = kb; - unsigned int ktne = KQK; - // unsigned int kbsw = neighborZ[ksw]; + // unsigned int k000= KQK; + unsigned int kP00 = KQK; + // unsigned int kM00 = neighborX[KQK]; + // unsigned int k0P0 = KQK; + unsigned int k0M0 = neighborY[KQK]; + // unsigned int k00P = KQK; + unsigned int k00M = neighborZ[KQK]; + // unsigned int kMM0 = neighborY[kM00]; + unsigned int kPP0 = KQK; + unsigned int kPM0 = k0M0; + // unsigned int kMP0 = kM00; + // unsigned int kM0M = neighborZ[kM00]; + unsigned int kP0P = KQK; + unsigned int kP0M = k00M; + // unsigned int kM0P = kM00; + unsigned int k0MM = neighborZ[k0M0]; + // unsigned int k0PM = k00M; + // unsigned int k0MP = k0M0; + unsigned int kPMP = k0M0; + // unsigned int kMPM = kM0M; + // unsigned int kMPP = kM00; + unsigned int kPMM = k0MM; + // unsigned int kMMP = kMM0; + unsigned int kPPM = k00M; + unsigned int kPPP = KQK; + // unsigned int kMMM = neighborZ[kMM0]; SubgridDistances27 qs; getPointersToSubgridDistances(qs, subgridDistances, sizeQ); real q; - q = qs.q[DIR_P00][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_P00][ke] = f0LastInterp*(1.f-tRatio) + f0NextInterp*tRatio; - q = qs.q[DIR_PP0][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PP0][kne] = f1LastInterp*(1.f-tRatio) + f1NextInterp*tRatio; - q = qs.q[DIR_PM0][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PM0][kse] = f2LastInterp*(1.f-tRatio) + f2NextInterp*tRatio; - q = qs.q[DIR_P0P][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_P0P][kte] = f3LastInterp*(1.f-tRatio) + f3NextInterp*tRatio; - q = qs.q[DIR_P0M][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_P0M][kbe] = f4LastInterp*(1.f-tRatio) + f4NextInterp*tRatio; - q = qs.q[DIR_PPP][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PPP][ktne] = f5LastInterp*(1.f-tRatio) + f5NextInterp*tRatio; - q = qs.q[DIR_PMP][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PMP][ktse] = f6LastInterp*(1.f-tRatio) + f6NextInterp*tRatio; - q = qs.q[DIR_PPM][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PPM][kbne] = f7LastInterp*(1.f-tRatio) + f7NextInterp*tRatio; - q = qs.q[DIR_PMM][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PMM][kbse] = f8LastInterp*(1.f-tRatio) + f8NextInterp*tRatio; + q = qs.q[DIR_P00][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_P00][kP00] = f0LastInterp*(1.f-timeRatio) + f0NextInterp*timeRatio; + q = qs.q[DIR_PP0][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PP0][kPP0] = f1LastInterp*(1.f-timeRatio) + f1NextInterp*timeRatio; + q = qs.q[DIR_PM0][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PM0][kPM0] = f2LastInterp*(1.f-timeRatio) + f2NextInterp*timeRatio; + q = qs.q[DIR_P0P][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_P0P][kP0P] = f3LastInterp*(1.f-timeRatio) + f3NextInterp*timeRatio; + q = qs.q[DIR_P0M][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_P0M][kP0M] = f4LastInterp*(1.f-timeRatio) + f4NextInterp*timeRatio; + q = qs.q[DIR_PPP][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PPP][kPPP] = f5LastInterp*(1.f-timeRatio) + f5NextInterp*timeRatio; + q = qs.q[DIR_PMP][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PMP][kPMP] = f6LastInterp*(1.f-timeRatio) + f6NextInterp*timeRatio; + q = qs.q[DIR_PPM][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PPM][kPPM] = f7LastInterp*(1.f-timeRatio) + f7NextInterp*timeRatio; + q = qs.q[DIR_PMM][k]; if(q>= c0o1 && q <= c1o1) dist.f[DIR_PMM][kPMM] = f8LastInterp*(1.f-timeRatio) + f8NextInterp*timeRatio; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/VirtualFluids_GPU/GPU/PressBCs27.cu b/src/gpu/VirtualFluids_GPU/GPU/PressBCs27.cu index 29e82196bdc2a22f03306b97a1ffd1bb6d5bc8a4..a72ebb1a385d16850554dad916aab7708235980b 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/PressBCs27.cu +++ b/src/gpu/VirtualFluids_GPU/GPU/PressBCs27.cu @@ -1,5 +1,5 @@ /* Device code */ -#include "LBM/LB.h" +#include "LBM/LB.h" #include "lbm/constants/D3Q27.h" #include "lbm/constants/NumericConstants.h" #include "lbm/MacroscopicQuantities.h" @@ -12,21 +12,21 @@ using namespace vf::lbm::dir; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void QInflowScaleByPressDevice27( real* rhoBC, - real* DD, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -127,7 +127,7 @@ __global__ void QInflowScaleByPressDevice27( real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -218,23 +218,23 @@ __global__ void QInflowScaleByPressDevice27( real* rhoBC, // real vx1, vx2, vx3; real drho, drho1; ////////////////////////////////////////////////////////////////////////// - //Dichte + //Dichte drho1 = f1_TSE + f1_TNW + f1_TNE + f1_TSW + f1_BSE + f1_BNW + f1_BNE + f1_BSW + - f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW + - f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((D.f[DIR_000])[k1zero]); + f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW + + f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((D.f[DIR_000])[k1zero]); drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW + - f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + - f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[DIR_000])[kzero]); + f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + + f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[DIR_000])[kzero]); ////////////////////////////////////////////////////////////////////////// - //Schallgeschwindigkeit - real cs = c1o1 / sqrtf(c3o1); + //Schallgeschwindigkeit + real cs = c1o1 / sqrtf(c3o1); ////////////////////////////////////////////////////////////////////////// - real rhoInterpol = drho1 * cs + (c1o1 - cs) * drho; - //real diffRho = (rhoBC[k] + one) / (rhoInterpol + one); - real diffRhoToAdd = rhoBC[k] - rhoInterpol; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //no velocity - ////////////////////////////////////////// + real rhoInterpol = drho1 * cs + (c1o1 - cs) * drho; + //real diffRho = (rhoBC[k] + one) / (rhoInterpol + one); + real diffRhoToAdd = rhoBC[k] - rhoInterpol; + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //no velocity + ////////////////////////////////////////// f_E = f1_E * cs + (c1o1 - cs) * f_E ; f_W = f1_W * cs + (c1o1 - cs) * f_W ; f_N = f1_N * cs + (c1o1 - cs) * f_N ; @@ -261,16 +261,16 @@ __global__ void QInflowScaleByPressDevice27( real* rhoBC, f_BSW = f1_BSW * cs + (c1o1 - cs) * f_BSW ; f_BSE = f1_BSE * cs + (c1o1 - cs) * f_BSE ; f_BNW = f1_BNW * cs + (c1o1 - cs) * f_BNW ; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //scale by press - ////////////////////////////////////////// - //f_E = (f_E + c2over27 ) * diffRho - c2over27 ; + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //scale by press + ////////////////////////////////////////// + //f_E = (f_E + c2over27 ) * diffRho - c2over27 ; // f_W = (f_W + c2over27 ) * diffRho - c2over27 ; // f_N = (f_N + c2over27 ) * diffRho - c2over27 ; // f_S = (f_S + c2over27 ) * diffRho - c2over27 ; // f_T = (f_T + c2over27 ) * diffRho - c2over27 ; // f_B = (f_B + c2over27 ) * diffRho - c2over27 ; - //f_NE = (f_NE + c1over54 ) * diffRho - c1over54 ; + //f_NE = (f_NE + c1over54 ) * diffRho - c1over54 ; // f_SW = (f_SW + c1over54 ) * diffRho - c1over54 ; // f_SE = (f_SE + c1over54 ) * diffRho - c1over54 ; // f_NW = (f_NW + c1over54 ) * diffRho - c1over54 ; @@ -290,16 +290,16 @@ __global__ void QInflowScaleByPressDevice27( real* rhoBC, // f_BSW = (f_BSW + c1over216) * diffRho - c1over216; // f_BSE = (f_BSE + c1over216) * diffRho - c1over216; // f_BNW = (f_BNW + c1over216) * diffRho - c1over216; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // add press - ////////////////////////////////////////// - f_E = (f_E + c2o27 * diffRhoToAdd); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // add press + ////////////////////////////////////////// + f_E = (f_E + c2o27 * diffRhoToAdd); f_W = (f_W + c2o27 * diffRhoToAdd); f_N = (f_N + c2o27 * diffRhoToAdd); f_S = (f_S + c2o27 * diffRhoToAdd); f_T = (f_T + c2o27 * diffRhoToAdd); f_B = (f_B + c2o27 * diffRhoToAdd); - f_NE = (f_NE + c1o54 * diffRhoToAdd); + f_NE = (f_NE + c1o54 * diffRhoToAdd); f_SW = (f_SW + c1o54 * diffRhoToAdd); f_SE = (f_SE + c1o54 * diffRhoToAdd); f_NW = (f_NW + c1o54 * diffRhoToAdd); @@ -319,9 +319,9 @@ __global__ void QInflowScaleByPressDevice27( real* rhoBC, f_BSW = (f_BSW + c1o216 * diffRhoToAdd); f_BSE = (f_BSE + c1o216 * diffRhoToAdd); f_BNW = (f_BNW + c1o216 * diffRhoToAdd); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// if (isEvenTimestep==false) { D.f[DIR_P00 ] = &DD[DIR_P00 *size_Mat]; @@ -351,7 +351,7 @@ __global__ void QInflowScaleByPressDevice27( real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -384,46 +384,46 @@ __global__ void QInflowScaleByPressDevice27( real* rhoBC, } ////////////////////////////////////////////////////////////////////////// //__syncthreads(); - // -X - //(D.f[DIR_P00 ])[ke ] = f_E ; - //(D.f[DIR_PM0 ])[kse ] = f_SE ; - //(D.f[DIR_PP0 ])[kne ] = f_NE ; - //(D.f[DIR_P0M ])[kbe ] = f_BE ; - //(D.f[DIR_P0P ])[kte ] = f_TE ; - //(D.f[DIR_PMP ])[ktse ] = f_TSE ; - //(D.f[DIR_PPP ])[ktne ] = f_TNE ; - //(D.f[DIR_PMM ])[kbse ] = f_BSE ; - //(D.f[DIR_PPM ])[kbne ] = f_BNE ; - // X - (D.f[DIR_M00 ])[kw ] = f_W ; - (D.f[DIR_MM0 ])[ksw ] = f_SW ; - (D.f[DIR_MP0 ])[knw ] = f_NW ; - (D.f[DIR_M0M ])[kbw ] = f_BW ; - (D.f[DIR_M0P ])[ktw ] = f_TW ; - (D.f[DIR_MMP ])[ktsw ] = f_TSW ; - (D.f[DIR_MPP ])[ktnw ] = f_TNW ; - (D.f[DIR_MMM ])[kbsw ] = f_BSW ; - (D.f[DIR_MPM ])[kbnw ] = f_BNW ; - // Y - //(D.f[DIR_0M0 ])[ks ] = f_S ; - //(D.f[DIR_PM0 ])[kse ] = f_SE ; - //(D.f[DIR_MM0 ])[ksw ] = f_SW ; - //(D.f[DIR_0MP ])[kts ] = f_TS ; - //(D.f[DIR_0MM ])[kbs ] = f_BS ; - //(D.f[DIR_PMP ])[ktse ] = f_TSE ; - //(D.f[DIR_MMP ])[ktsw ] = f_TSW ; - //(D.f[DIR_PMM ])[kbse ] = f_BSE ; - //(D.f[DIR_MMM ])[kbsw ] = f_BSW ; - // Z - //(D.f[DIR_00M ])[kb ] = f_B ; - //(D.f[DIR_P0M ])[kbe ] = f_BE ; - //(D.f[DIR_M0M ])[kbw ] = f_BW ; - //(D.f[DIR_0PM ])[kbn ] = f_BN ; - //(D.f[DIR_0MM ])[kbs ] = f_BS ; - //(D.f[DIR_PPM ])[kbne ] = f_BNE ; - //(D.f[DIR_MPM ])[kbnw ] = f_BNW ; - //(D.f[DIR_PMM ])[kbse ] = f_BSE ; - //(D.f[DIR_MMM ])[kbsw ] = f_BSW ; + // -X + //(D.f[DIR_P00 ])[ke ] = f_E ; + //(D.f[DIR_PM0 ])[kse ] = f_SE ; + //(D.f[DIR_PP0 ])[kne ] = f_NE ; + //(D.f[DIR_P0M ])[kbe ] = f_BE ; + //(D.f[DIR_P0P ])[kte ] = f_TE ; + //(D.f[DIR_PMP ])[ktse ] = f_TSE ; + //(D.f[DIR_PPP ])[ktne ] = f_TNE ; + //(D.f[DIR_PMM ])[kbse ] = f_BSE ; + //(D.f[DIR_PPM ])[kbne ] = f_BNE ; + // X + (D.f[DIR_M00 ])[kw ] = f_W ; + (D.f[DIR_MM0 ])[ksw ] = f_SW ; + (D.f[DIR_MP0 ])[knw ] = f_NW ; + (D.f[DIR_M0M ])[kbw ] = f_BW ; + (D.f[DIR_M0P ])[ktw ] = f_TW ; + (D.f[DIR_MMP ])[ktsw ] = f_TSW ; + (D.f[DIR_MPP ])[ktnw ] = f_TNW ; + (D.f[DIR_MMM ])[kbsw ] = f_BSW ; + (D.f[DIR_MPM ])[kbnw ] = f_BNW ; + // Y + //(D.f[DIR_0M0 ])[ks ] = f_S ; + //(D.f[DIR_PM0 ])[kse ] = f_SE ; + //(D.f[DIR_MM0 ])[ksw ] = f_SW ; + //(D.f[DIR_0MP ])[kts ] = f_TS ; + //(D.f[DIR_0MM ])[kbs ] = f_BS ; + //(D.f[DIR_PMP ])[ktse ] = f_TSE ; + //(D.f[DIR_MMP ])[ktsw ] = f_TSW ; + //(D.f[DIR_PMM ])[kbse ] = f_BSE ; + //(D.f[DIR_MMM ])[kbsw ] = f_BSW ; + // Z + //(D.f[DIR_00M ])[kb ] = f_B ; + //(D.f[DIR_P0M ])[kbe ] = f_BE ; + //(D.f[DIR_M0M ])[kbw ] = f_BW ; + //(D.f[DIR_0PM ])[kbn ] = f_BN ; + //(D.f[DIR_0MM ])[kbs ] = f_BS ; + //(D.f[DIR_PPM ])[kbne ] = f_BNE ; + //(D.f[DIR_MPM ])[kbnw ] = f_BNW ; + //(D.f[DIR_PMM ])[kbse ] = f_BSE ; + //(D.f[DIR_MMM ])[kbsw ] = f_BSW ; ////////////////////////////////////////////////////////////////////////// } } @@ -469,21 +469,21 @@ __global__ void QInflowScaleByPressDevice27( real* rhoBC, //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void QPressDeviceIncompNEQ27( real* rhoBC, - real* DD, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -584,7 +584,7 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -652,17 +652,17 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC, f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW; real vx1 = ((f1_TSE - f1_BNW) - (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) + - ((f1_BE - f1_TW) + (f1_TE - f1_BW)) + ((f1_SE - f1_NW) + (f1_NE - f1_SW)) + - (f1_E - f1_W); + ((f1_BE - f1_TW) + (f1_TE - f1_BW)) + ((f1_SE - f1_NW) + (f1_NE - f1_SW)) + + (f1_E - f1_W); real vx2 = (-(f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) + - ((f1_BN - f1_TS) + (f1_TN - f1_BS)) + (-(f1_SE - f1_NW) + (f1_NE - f1_SW)) + - (f1_N - f1_S); + ((f1_BN - f1_TS) + (f1_TN - f1_BS)) + (-(f1_SE - f1_NW) + (f1_NE - f1_SW)) + + (f1_N - f1_S); real vx3 = ((f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) + (f1_TSW - f1_BNE)) + - (-(f1_BN - f1_TS) + (f1_TN - f1_BS)) + ((f1_TE - f1_BW) - (f1_BE - f1_TW)) + - (f1_T - f1_B); + (-(f1_BN - f1_TS) + (f1_TN - f1_BS)) + ((f1_TE - f1_BW) - (f1_BE - f1_TW)) + + (f1_T - f1_B); real cusq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); @@ -693,15 +693,15 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC, f1_BNW -= c1o216*(drho1+(drho1+c1o1)*(c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cusq)); f1_BSE -= c1o216*(drho1+(drho1+c1o1)*(c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq)); f1_TNW -= c1o216*(drho1+(drho1+c1o1)*(c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq)); - - drho1 = rhoBC[k]; - //if(vx1 < zero){ - // vx1 *= 0.9; - //} - //if(vx2 < zero){ - // vx2 *= c1o10;//0.9; - //} + drho1 = rhoBC[k]; + + //if(vx1 < zero){ + // vx1 *= 0.9; + //} + //if(vx2 < zero){ + // vx2 *= c1o10;//0.9; + //} f1_ZERO += c8o27* (drho1-(drho1+c1o1)*cusq); f1_E += c2o27* (drho1+(drho1+c1o1)*(c3o1*( vx1 )+c9o2*( vx1 )*( vx1 )-cusq)); @@ -731,39 +731,39 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC, f1_BSE += c1o216*(drho1+(drho1+c1o1)*(c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq)); f1_TNW += c1o216*(drho1+(drho1+c1o1)*(c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq)); - //drho1 = (drho1 + rhoBC[k])/2.f; - //drho1 = drho1 - rhoBC[k]; + //drho1 = (drho1 + rhoBC[k])/2.f; + //drho1 = drho1 - rhoBC[k]; ////////////////////////////////////////////////////////////////////////// __syncthreads(); - (D.f[DIR_P00 ])[ke ] = f1_W ; - (D.f[DIR_M00 ])[kw ] = f1_E ; - (D.f[DIR_0P0 ])[kn ] = f1_S ; - (D.f[DIR_0M0 ])[ks ] = f1_N ; - (D.f[DIR_00P ])[kt ] = f1_B ; - (D.f[DIR_00M ])[kb ] = f1_T ; - (D.f[DIR_PP0 ])[kne ] = f1_SW ; - (D.f[DIR_MM0 ])[ksw ] = f1_NE ; - (D.f[DIR_PM0 ])[kse ] = f1_NW ; - (D.f[DIR_MP0 ])[knw ] = f1_SE ; - (D.f[DIR_P0P ])[kte ] = f1_BW ; - (D.f[DIR_M0M ])[kbw ] = f1_TE ; - (D.f[DIR_P0M ])[kbe ] = f1_TW ; - (D.f[DIR_M0P ])[ktw ] = f1_BE ; - (D.f[DIR_0PP ])[ktn ] = f1_BS ; - (D.f[DIR_0MM ])[kbs ] = f1_TN ; - (D.f[DIR_0PM ])[kbn ] = f1_TS ; - (D.f[DIR_0MP ])[kts ] = f1_BN ; - (D.f[DIR_000])[kzero] = f1_ZERO; - (D.f[DIR_PPP ])[ktne ] = f1_BSW ; - (D.f[DIR_MMP ])[ktsw ] = f1_BNE ; - (D.f[DIR_PMP ])[ktse ] = f1_BNW ; - (D.f[DIR_MPP ])[ktnw ] = f1_BSE ; - (D.f[DIR_PPM ])[kbne ] = f1_TSW ; - (D.f[DIR_MMM ])[kbsw ] = f1_TNE ; - (D.f[DIR_PMM ])[kbse ] = f1_TNW ; - (D.f[DIR_MPM ])[kbnw ] = f1_TSE ; + (D.f[DIR_P00 ])[ke ] = f1_W ; + (D.f[DIR_M00 ])[kw ] = f1_E ; + (D.f[DIR_0P0 ])[kn ] = f1_S ; + (D.f[DIR_0M0 ])[ks ] = f1_N ; + (D.f[DIR_00P ])[kt ] = f1_B ; + (D.f[DIR_00M ])[kb ] = f1_T ; + (D.f[DIR_PP0 ])[kne ] = f1_SW ; + (D.f[DIR_MM0 ])[ksw ] = f1_NE ; + (D.f[DIR_PM0 ])[kse ] = f1_NW ; + (D.f[DIR_MP0 ])[knw ] = f1_SE ; + (D.f[DIR_P0P ])[kte ] = f1_BW ; + (D.f[DIR_M0M ])[kbw ] = f1_TE ; + (D.f[DIR_P0M ])[kbe ] = f1_TW ; + (D.f[DIR_M0P ])[ktw ] = f1_BE ; + (D.f[DIR_0PP ])[ktn ] = f1_BS ; + (D.f[DIR_0MM ])[kbs ] = f1_TN ; + (D.f[DIR_0PM ])[kbn ] = f1_TS ; + (D.f[DIR_0MP ])[kts ] = f1_BN ; + (D.f[DIR_000])[kzero] = f1_ZERO; + (D.f[DIR_PPP ])[ktne ] = f1_BSW ; + (D.f[DIR_MMP ])[ktsw ] = f1_BNE ; + (D.f[DIR_PMP ])[ktse ] = f1_BNW ; + (D.f[DIR_MPP ])[ktnw ] = f1_BSE ; + (D.f[DIR_PPM ])[kbne ] = f1_TSW ; + (D.f[DIR_MMM ])[kbsw ] = f1_TNE ; + (D.f[DIR_PMM ])[kbse ] = f1_TNW ; + (D.f[DIR_MPM ])[kbnw ] = f1_TSE ; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -808,26 +808,26 @@ __global__ void QPressDeviceIncompNEQ27( real* rhoBC, //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void QPressDeviceNEQ27(real* rhoBC, - real* distribution, + real* distribution, int* bcNodeIndices, int* bcNeighborIndices, int numberOfBCnodes, - real omega1, + real omega1, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, - unsigned int numberOfLBnodes, + unsigned int numberOfLBnodes, bool isEvenTimestep) { ////////////////////////////////////////////////////////////////////////// - //! The pressure boundary condition is executed in the following steps - //! - //////////////////////////////////////////////////////////////////////////////// - //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim. - //! - const unsigned x = threadIdx.x; // global x-index - const unsigned y = blockIdx.x; // global y-index - const unsigned z = blockIdx.y; // global z-index + //! The pressure boundary condition is executed in the following steps + //! + //////////////////////////////////////////////////////////////////////////////// + //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim. + //! + const unsigned x = threadIdx.x; // global x-index + const unsigned y = blockIdx.x; // global y-index + const unsigned z = blockIdx.y; // global z-index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -949,20 +949,20 @@ __global__ void QPressDeviceNEQ27(real* rhoBC, //! - Calculate macroscopic quantities (for neighboring node) //! real drho1 = f1_TSE + f1_TNW + f1_TNE + f1_TSW + f1_BSE + f1_BNW + f1_BNE + f1_BSW + - f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW + - f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((dist.f[DIR_000])[kzero]); + f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW + + f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((dist.f[DIR_000])[kzero]); real vx1 = (((f1_TSE - f1_BNW) - (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) + ((f1_BE - f1_TW) + (f1_TE - f1_BW)) + ((f1_SE - f1_NW) + (f1_NE - f1_SW)) + - (f1_E - f1_W)) / (c1o1 + drho1); + (f1_E - f1_W)) / (c1o1 + drho1); real vx2 = ((-(f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) + ((f1_BN - f1_TS) + (f1_TN - f1_BS)) + (-(f1_SE - f1_NW) + (f1_NE - f1_SW)) + - (f1_N - f1_S)) / (c1o1 + drho1); + (f1_N - f1_S)) / (c1o1 + drho1); real vx3 = (((f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) + (f1_TSW - f1_BNE)) + (-(f1_BN - f1_TS) + (f1_TN - f1_BS)) + ((f1_TE - f1_BW) - (f1_BE - f1_TW)) + - (f1_T - f1_B)) / (c1o1 + drho1); + (f1_T - f1_B)) / (c1o1 + drho1); real cusq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); @@ -1110,16 +1110,16 @@ __global__ void QPressDeviceNEQ27(real* rhoBC, //////////////////////////////////////////////////////////////////////////////// -__global__ void LB_BC_Press_East27( int nx, - int ny, - int tz, - unsigned int* bcMatD, +__global__ void LB_BC_Press_East27( int nx, + int ny, + int tz, + unsigned int* bcMatD, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, - real* DD, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + unsigned int size_Mat, + bool isEvenTimestep) { //thread-index int ty = blockIdx.x; @@ -1127,9 +1127,9 @@ __global__ void LB_BC_Press_East27( int nx, int k, k1, nxny; // Zugriff auf arrays im device - int x = tx + STARTOFFX; // Globaler x-Index - int y = ty + STARTOFFY; // Globaler y-Index - int z = tz + STARTOFFZ; // Globaler z-Index + int x = tx + STARTOFFX; // Globaler x-Index + int y = ty + STARTOFFY; // Globaler y-Index + int z = tz + STARTOFFZ; // Globaler z-Index k = nx*(ny*z + y) + x; nxny = nx*ny; @@ -1167,7 +1167,7 @@ __global__ void LB_BC_Press_East27( int nx, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -1374,10 +1374,10 @@ __global__ void LB_BC_Press_East27( int nx, (D.f[DIR_PPM ])[kbne ] = f1_TSW -c1o216*drho1; (D.f[DIR_MMM ])[kbsw ] = f1_TNE -c1o216*drho1; (D.f[DIR_PMM ])[kbse ] = f1_TNW -c1o216*drho1; - (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1; + (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1; } __syncthreads(); -} +} ////////////////////////////////////////////////////////////////////////////// @@ -1420,15 +1420,15 @@ __global__ void LB_BC_Press_East27( int nx, ////////////////////////////////////////////////////////////////////////////// __global__ void QPressDevice27(real* rhoBC, - real* DD, - int* k_Q, + real* DD, + int* k_Q, real* QQ, - unsigned int numberOfBCnodes, - real om1, + unsigned int numberOfBCnodes, + real om1, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, - unsigned int size_Mat, + unsigned int size_Mat, bool isEvenTimestep) { Distributions27 D; @@ -1461,7 +1461,7 @@ __global__ void QPressDevice27(real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -1493,9 +1493,9 @@ __global__ void QPressDevice27(real* rhoBC, D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat]; } //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -1505,11 +1505,11 @@ __global__ void QPressDevice27(real* rhoBC, if(k<numberOfBCnodes) { - real *q_dirE, *q_dirW, *q_dirN, *q_dirS, *q_dirT, *q_dirB, + real *q_dirE, *q_dirW, *q_dirN, *q_dirS, *q_dirT, *q_dirB, *q_dirNE, *q_dirSW, *q_dirSE, *q_dirNW, *q_dirTE, *q_dirBW, *q_dirBE, *q_dirTW, *q_dirTN, *q_dirBS, *q_dirBN, *q_dirTS, *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW, - *q_dirBSE, *q_dirBNW; + *q_dirBSE, *q_dirBNW; q_dirE = &QQ[DIR_P00 * numberOfBCnodes]; q_dirW = &QQ[DIR_M00 * numberOfBCnodes]; q_dirN = &QQ[DIR_0P0 * numberOfBCnodes]; @@ -1600,16 +1600,16 @@ __global__ void QPressDevice27(real* rhoBC, real q, vx1, vx2, vx3, drho; vx1 = ((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + ((f_BE - f_TW) + (f_TE - f_BW)) + ((f_SE - f_NW) + (f_NE - f_SW)) + - (f_E - f_W); + (f_E - f_W); vx2 = (-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + ((f_BN - f_TS) + (f_TN - f_BS)) + (-(f_SE - f_NW) + (f_NE - f_SW)) + - (f_N - f_S); + (f_N - f_S); vx3 = ((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) + (-(f_BN - f_TS) + (f_TN - f_BS)) + ((f_TE - f_BW) - (f_BE - f_TW)) + - (f_T - f_B); + (f_T - f_B); real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); ////////////////////////////////////////////////////////////////////////// @@ -1646,7 +1646,7 @@ __global__ void QPressDevice27(real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -1681,183 +1681,183 @@ __global__ void QPressDevice27(real* rhoBC, q = q_dirE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_M00])[kw]=c2o27* (drho+c3o1*(-vx1 )+c9o2*(-vx1 )*(-vx1 )-cu_sq); - //(D.f[DIR_P00])[ke]=c2over27* (drho+three*( vx1 )+c9over2*( vx1 )*( vx1 )-cu_sq); + (D.f[DIR_M00])[kw]=c2o27* (drho+c3o1*(-vx1 )+c9o2*(-vx1 )*(-vx1 )-cu_sq); + //(D.f[DIR_P00])[ke]=c2over27* (drho+three*( vx1 )+c9over2*( vx1 )*( vx1 )-cu_sq); } q = q_dirW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_P00])[ke]=c2o27* (drho+c3o1*( vx1 )+c9o2*( vx1 )*( vx1 )-cu_sq); - //(D.f[DIR_M00])[kw]=c2over27* (drho+three*(-vx1 )+c9over2*(-vx1 )*(-vx1 )-cu_sq); + (D.f[DIR_P00])[ke]=c2o27* (drho+c3o1*( vx1 )+c9o2*( vx1 )*( vx1 )-cu_sq); + //(D.f[DIR_M00])[kw]=c2over27* (drho+three*(-vx1 )+c9over2*(-vx1 )*(-vx1 )-cu_sq); } q = q_dirN[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_0M0])[ks]=c2o27* (drho+c3o1*( -vx2 )+c9o2*( -vx2 )*( -vx2 )-cu_sq); - //(D.f[DIR_0P0])[kn]=c2over27* (drho+three*( vx2 )+c9over2*( vx2 )*( vx2 )-cu_sq); + (D.f[DIR_0M0])[ks]=c2o27* (drho+c3o1*( -vx2 )+c9o2*( -vx2 )*( -vx2 )-cu_sq); + //(D.f[DIR_0P0])[kn]=c2over27* (drho+three*( vx2 )+c9over2*( vx2 )*( vx2 )-cu_sq); } q = q_dirS[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_0P0])[kn]=c2o27* (drho+c3o1*( vx2 )+c9o2*( vx2 )*( vx2 )-cu_sq); - //(D.f[DIR_0M0])[ks]=c2over27* (drho+three*( -vx2 )+c9over2*( -vx2 )*( -vx2 )-cu_sq); + (D.f[DIR_0P0])[kn]=c2o27* (drho+c3o1*( vx2 )+c9o2*( vx2 )*( vx2 )-cu_sq); + //(D.f[DIR_0M0])[ks]=c2over27* (drho+three*( -vx2 )+c9over2*( -vx2 )*( -vx2 )-cu_sq); } q = q_dirT[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_00M])[kb]=c2o27* (drho+c3o1*( -vx3)+c9o2*( -vx3)*( -vx3)-cu_sq); - //(D.f[DIR_00P])[kt]=c2over27* (drho+three*( vx3)+c9over2*( vx3)*( vx3)-cu_sq); + (D.f[DIR_00M])[kb]=c2o27* (drho+c3o1*( -vx3)+c9o2*( -vx3)*( -vx3)-cu_sq); + //(D.f[DIR_00P])[kt]=c2over27* (drho+three*( vx3)+c9over2*( vx3)*( vx3)-cu_sq); } q = q_dirB[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_00P])[kt]=c2o27* (drho+c3o1*( vx3)+c9o2*( vx3)*( vx3)-cu_sq); - //(D.f[DIR_00M])[kb]=c2over27* (drho+three*( -vx3)+c9over2*( -vx3)*( -vx3)-cu_sq); + (D.f[DIR_00P])[kt]=c2o27* (drho+c3o1*( vx3)+c9o2*( vx3)*( vx3)-cu_sq); + //(D.f[DIR_00M])[kb]=c2over27* (drho+three*( -vx3)+c9over2*( -vx3)*( -vx3)-cu_sq); } q = q_dirNE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_MM0])[ksw]=c1o54* (drho+c3o1*(-vx1-vx2 )+c9o2*(-vx1-vx2 )*(-vx1-vx2 )-cu_sq); - //(D.f[DIR_PP0])[kne]=c1over54* (drho+three*( vx1+vx2 )+c9over2*( vx1+vx2 )*( vx1+vx2 )-cu_sq); + (D.f[DIR_MM0])[ksw]=c1o54* (drho+c3o1*(-vx1-vx2 )+c9o2*(-vx1-vx2 )*(-vx1-vx2 )-cu_sq); + //(D.f[DIR_PP0])[kne]=c1over54* (drho+three*( vx1+vx2 )+c9over2*( vx1+vx2 )*( vx1+vx2 )-cu_sq); } q = q_dirSW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_PP0])[kne]=c1o54* (drho+c3o1*( vx1+vx2 )+c9o2*( vx1+vx2 )*( vx1+vx2 )-cu_sq); - //(D.f[DIR_MM0])[ksw]=c1over54* (drho+three*(-vx1-vx2 )+c9over2*(-vx1-vx2 )*(-vx1-vx2 )-cu_sq); + (D.f[DIR_PP0])[kne]=c1o54* (drho+c3o1*( vx1+vx2 )+c9o2*( vx1+vx2 )*( vx1+vx2 )-cu_sq); + //(D.f[DIR_MM0])[ksw]=c1over54* (drho+three*(-vx1-vx2 )+c9over2*(-vx1-vx2 )*(-vx1-vx2 )-cu_sq); } q = q_dirSE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_MP0])[knw]=c1o54* (drho+c3o1*(-vx1+vx2 )+c9o2*(-vx1+vx2 )*(-vx1+vx2 )-cu_sq); - //(D.f[DIR_PM0])[kse]=c1over54* (drho+three*( vx1-vx2 )+c9over2*( vx1-vx2 )*( vx1-vx2 )-cu_sq); + (D.f[DIR_MP0])[knw]=c1o54* (drho+c3o1*(-vx1+vx2 )+c9o2*(-vx1+vx2 )*(-vx1+vx2 )-cu_sq); + //(D.f[DIR_PM0])[kse]=c1over54* (drho+three*( vx1-vx2 )+c9over2*( vx1-vx2 )*( vx1-vx2 )-cu_sq); } q = q_dirNW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_PM0])[kse]=c1o54* (drho+c3o1*( vx1-vx2 )+c9o2*( vx1-vx2 )*( vx1-vx2 )-cu_sq); - //(D.f[DIR_MP0])[knw]=c1over54* (drho+three*(-vx1+vx2 )+c9over2*(-vx1+vx2 )*(-vx1+vx2 )-cu_sq); + (D.f[DIR_PM0])[kse]=c1o54* (drho+c3o1*( vx1-vx2 )+c9o2*( vx1-vx2 )*( vx1-vx2 )-cu_sq); + //(D.f[DIR_MP0])[knw]=c1over54* (drho+three*(-vx1+vx2 )+c9over2*(-vx1+vx2 )*(-vx1+vx2 )-cu_sq); } q = q_dirTE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_M0M])[kbw]=c1o54* (drho+c3o1*(-vx1 -vx3)+c9o2*(-vx1 -vx3)*(-vx1 -vx3)-cu_sq); - //(D.f[DIR_P0P])[kte]=c1over54* (drho+three*( vx1 +vx3)+c9over2*( vx1 +vx3)*( vx1 +vx3)-cu_sq); + (D.f[DIR_M0M])[kbw]=c1o54* (drho+c3o1*(-vx1 -vx3)+c9o2*(-vx1 -vx3)*(-vx1 -vx3)-cu_sq); + //(D.f[DIR_P0P])[kte]=c1over54* (drho+three*( vx1 +vx3)+c9over2*( vx1 +vx3)*( vx1 +vx3)-cu_sq); } q = q_dirBW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_P0P])[kte]=c1o54* (drho+c3o1*( vx1 +vx3)+c9o2*( vx1 +vx3)*( vx1 +vx3)-cu_sq); - //(D.f[DIR_M0M])[kbw]=c1over54* (drho+three*(-vx1 -vx3)+c9over2*(-vx1 -vx3)*(-vx1 -vx3)-cu_sq); + (D.f[DIR_P0P])[kte]=c1o54* (drho+c3o1*( vx1 +vx3)+c9o2*( vx1 +vx3)*( vx1 +vx3)-cu_sq); + //(D.f[DIR_M0M])[kbw]=c1over54* (drho+three*(-vx1 -vx3)+c9over2*(-vx1 -vx3)*(-vx1 -vx3)-cu_sq); } q = q_dirBE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_M0P])[ktw]=c1o54* (drho+c3o1*(-vx1 +vx3)+c9o2*(-vx1 +vx3)*(-vx1 +vx3)-cu_sq); - //(D.f[DIR_P0M])[kbe]=c1over54* (drho+three*( vx1 -vx3)+c9over2*( vx1 -vx3)*( vx1 -vx3)-cu_sq); + (D.f[DIR_M0P])[ktw]=c1o54* (drho+c3o1*(-vx1 +vx3)+c9o2*(-vx1 +vx3)*(-vx1 +vx3)-cu_sq); + //(D.f[DIR_P0M])[kbe]=c1over54* (drho+three*( vx1 -vx3)+c9over2*( vx1 -vx3)*( vx1 -vx3)-cu_sq); } q = q_dirTW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_P0M])[kbe]=c1o54* (drho+c3o1*( vx1 -vx3)+c9o2*( vx1 -vx3)*( vx1 -vx3)-cu_sq); - //(D.f[DIR_M0P])[ktw]=c1over54* (drho+three*(-vx1 +vx3)+c9over2*(-vx1 +vx3)*(-vx1 +vx3)-cu_sq); + (D.f[DIR_P0M])[kbe]=c1o54* (drho+c3o1*( vx1 -vx3)+c9o2*( vx1 -vx3)*( vx1 -vx3)-cu_sq); + //(D.f[DIR_M0P])[ktw]=c1over54* (drho+three*(-vx1 +vx3)+c9over2*(-vx1 +vx3)*(-vx1 +vx3)-cu_sq); } q = q_dirTN[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_0MM])[kbs]=c1o54* (drho+c3o1*( -vx2-vx3)+c9o2*( -vx2-vx3)*( -vx2-vx3)-cu_sq); - //(D.f[DIR_0PP])[ktn]=c1over54* (drho+three*( vx2+vx3)+c9over2*( vx2+vx3)*( vx2+vx3)-cu_sq); + (D.f[DIR_0MM])[kbs]=c1o54* (drho+c3o1*( -vx2-vx3)+c9o2*( -vx2-vx3)*( -vx2-vx3)-cu_sq); + //(D.f[DIR_0PP])[ktn]=c1over54* (drho+three*( vx2+vx3)+c9over2*( vx2+vx3)*( vx2+vx3)-cu_sq); } q = q_dirBS[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_0PP])[ktn]=c1o54* (drho+c3o1*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); - //(D.f[DIR_0MM])[kbs]=c1over54* (drho+three*( -vx2-vx3)+c9over2*( -vx2-vx3)*( -vx2-vx3)-cu_sq); + (D.f[DIR_0PP])[ktn]=c1o54* (drho+c3o1*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); + //(D.f[DIR_0MM])[kbs]=c1over54* (drho+three*( -vx2-vx3)+c9over2*( -vx2-vx3)*( -vx2-vx3)-cu_sq); } q = q_dirBN[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_0MP])[kts]=c1o54* (drho+c3o1*( -vx2+vx3)+c9o2*( -vx2+vx3)*( -vx2+vx3)-cu_sq); - //(D.f[DIR_0PM])[kbn]=c1over54* (drho+three*( vx2-vx3)+c9over2*( vx2-vx3)*( vx2-vx3)-cu_sq); + (D.f[DIR_0MP])[kts]=c1o54* (drho+c3o1*( -vx2+vx3)+c9o2*( -vx2+vx3)*( -vx2+vx3)-cu_sq); + //(D.f[DIR_0PM])[kbn]=c1over54* (drho+three*( vx2-vx3)+c9over2*( vx2-vx3)*( vx2-vx3)-cu_sq); } q = q_dirTS[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_0PM])[kbn]=c1o54* (drho+c3o1*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); - //(D.f[DIR_0MP])[kts]=c1over54* (drho+three*( -vx2+vx3)+c9over2*( -vx2+vx3)*( -vx2+vx3)-cu_sq); + (D.f[DIR_0PM])[kbn]=c1o54* (drho+c3o1*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); + //(D.f[DIR_0MP])[kts]=c1over54* (drho+three*( -vx2+vx3)+c9over2*( -vx2+vx3)*( -vx2+vx3)-cu_sq); } q = q_dirTNE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_MMM])[kbsw]=c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); - //(D.f[DIR_PPP])[ktne]=c1over216*(drho+three*( vx1+vx2+vx3)+c9over2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); + (D.f[DIR_MMM])[kbsw]=c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); + //(D.f[DIR_PPP])[ktne]=c1over216*(drho+three*( vx1+vx2+vx3)+c9over2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); } q = q_dirBSW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_PPP])[ktne]=c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); - //(D.f[DIR_MMM])[kbsw]=c1over216*(drho+three*(-vx1-vx2-vx3)+c9over2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); + (D.f[DIR_PPP])[ktne]=c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); + //(D.f[DIR_MMM])[kbsw]=c1over216*(drho+three*(-vx1-vx2-vx3)+c9over2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); } q = q_dirBNE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_MMP])[ktsw]=c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); - //(D.f[DIR_PPM])[kbne]=c1over216*(drho+three*( vx1+vx2-vx3)+c9over2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); + (D.f[DIR_MMP])[ktsw]=c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); + //(D.f[DIR_PPM])[kbne]=c1over216*(drho+three*( vx1+vx2-vx3)+c9over2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); } q = q_dirTSW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_PPM])[kbne]=c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); - //(D.f[DIR_MMP])[ktsw]=c1over216*(drho+three*(-vx1-vx2+vx3)+c9over2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); + (D.f[DIR_PPM])[kbne]=c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); + //(D.f[DIR_MMP])[ktsw]=c1over216*(drho+three*(-vx1-vx2+vx3)+c9over2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); } q = q_dirTSE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_MPM])[kbnw]=c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); - //(D.f[DIR_PMP])[ktse]=c1over216*(drho+three*( vx1-vx2+vx3)+c9over2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); + (D.f[DIR_MPM])[kbnw]=c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); + //(D.f[DIR_PMP])[ktse]=c1over216*(drho+three*( vx1-vx2+vx3)+c9over2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); } q = q_dirBNW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_PMP])[ktse]=c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); - //(D.f[DIR_MPM])[kbnw]=c1over216*(drho+three*(-vx1+vx2-vx3)+c9over2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); + (D.f[DIR_PMP])[ktse]=c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); + //(D.f[DIR_MPM])[kbnw]=c1over216*(drho+three*(-vx1+vx2-vx3)+c9over2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); } q = q_dirBSE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_MPP])[ktnw]=c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); - //(D.f[DIR_PMM])[kbse]=c1over216*(drho+three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); + (D.f[DIR_MPP])[ktnw]=c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); + //(D.f[DIR_PMM])[kbse]=c1over216*(drho+three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); } q = q_dirTNW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_PMM])[kbse]=c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); - //(D.f[DIR_MPP])[ktnw]=c1over216*(drho+three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); + (D.f[DIR_PMM])[kbse]=c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); + //(D.f[DIR_MPP])[ktnw]=c1over216*(drho+three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); } } } @@ -1903,19 +1903,19 @@ __global__ void QPressDevice27(real* rhoBC, ////////////////////////////////////////////////////////////////////////////// __global__ void QPressDeviceAntiBB27( real* rhoBC, - real* vx, - real* vy, - real* vz, - real* DD, - int* k_Q, - real* QQ, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* vx, + real* vy, + real* vz, + real* DD, + int* k_Q, + real* QQ, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { Distributions27 D; if (isEvenTimestep==true) @@ -1947,7 +1947,7 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -1979,9 +1979,9 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat]; } //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -1991,11 +1991,11 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, if(k<numberOfBCnodes) { - real *q_dirE, *q_dirW, *q_dirN, *q_dirS, *q_dirT, *q_dirB, + real *q_dirE, *q_dirW, *q_dirN, *q_dirS, *q_dirT, *q_dirB, *q_dirNE, *q_dirSW, *q_dirSE, *q_dirNW, *q_dirTE, *q_dirBW, *q_dirBE, *q_dirTW, *q_dirTN, *q_dirBS, *q_dirBN, *q_dirTS, *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW, - *q_dirBSE, *q_dirBNW; + *q_dirBSE, *q_dirBNW; q_dirE = &QQ[DIR_P00 *numberOfBCnodes]; q_dirW = &QQ[DIR_M00 *numberOfBCnodes]; q_dirN = &QQ[DIR_0P0 *numberOfBCnodes]; @@ -2087,25 +2087,25 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, //real vx1, vx2, vx3, drho; //vx1 = ((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + // ((f_BE - f_TW) + (f_TE - f_BW)) + ((f_SE - f_NW) + (f_NE - f_SW)) + - // (f_E - f_W); + // (f_E - f_W); //vx2 = (-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + // ((f_BN - f_TS) + (f_TN - f_BS)) + (-(f_SE - f_NW) + (f_NE - f_SW)) + - // (f_N - f_S); + // (f_N - f_S); //vx3 = ((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) + // (-(f_BN - f_TS) + (f_TN - f_BS)) + ((f_TE - f_BW) - (f_BE - f_TW)) + - // (f_T - f_B); + // (f_T - f_B); //real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); ////////////////////////////////////////////////////////////////////////// real drho = f_ZERO+f_E+f_W+f_N+f_S+f_T+f_B+f_NE+f_SW+f_SE+f_NW+f_TE+f_BW+f_BE+f_TW+f_TN+f_BS+f_BN+f_TS+ - f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW; + f_TNE+f_TSW+f_TSE+f_TNW+f_BNE+f_BSW+f_BSE+f_BNW; drho = drho - rhoBC[k]; - drho *= 0.01f; + drho *= 0.01f; //////////////////////////////////////////////////////////////////////////////// - real q; + real q; //deltaRho = (rhoBC[k] + one) / (deltaRho + one); //////////////////////////////////////////////////////////////////////////////// if (isEvenTimestep==false) @@ -2137,7 +2137,7 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -2172,7 +2172,7 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, q = q_dirE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_M00])[kw]=f_W-c2o27*drho; + (D.f[DIR_M00])[kw]=f_W-c2o27*drho; } q = q_dirW[k]; @@ -2184,19 +2184,19 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, q = q_dirN[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_0M0])[ks]=f_S-c2o27*drho; + (D.f[DIR_0M0])[ks]=f_S-c2o27*drho; } q = q_dirS[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_0P0])[kn]=f_N-c2o27*drho; + (D.f[DIR_0P0])[kn]=f_N-c2o27*drho; } q = q_dirT[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_00M])[kb]=f_B-c2o27*drho; + (D.f[DIR_00M])[kb]=f_B-c2o27*drho; } q = q_dirB[k]; @@ -2232,13 +2232,13 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, q = q_dirTE[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_M0M])[kbw]=f_BW-c1o54*drho; + (D.f[DIR_M0M])[kbw]=f_BW-c1o54*drho; } q = q_dirBW[k]; if (q>=c0o1 && q<=c1o1) { - (D.f[DIR_P0P])[kte]=f_TE-c1o54*drho; + (D.f[DIR_P0P])[kte]=f_TE-c1o54*drho; } q = q_dirBE[k]; @@ -2368,20 +2368,20 @@ __global__ void QPressDeviceAntiBB27( real* rhoBC, ////////////////////////////////////////////////////////////////////////////// __global__ void QPressDeviceFixBackflow27( real* rhoBC, - real* DD, - int* k_Q, - int numberOfBCnodes, - real om1, + real* DD, + int* k_Q, + int numberOfBCnodes, + real om1, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, - unsigned int size_Mat, + unsigned int size_Mat, bool isEvenTimestep) { //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -2456,7 +2456,7 @@ __global__ void QPressDeviceFixBackflow27( real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -2559,20 +2559,20 @@ __global__ void QPressDeviceFixBackflow27( real* rhoBC, ////////////////////////////////////////////////////////////////////////////// __global__ void QPressDeviceDirDepBot27( real* rhoBC, - real* DD, - int* k_Q, - int numberOfBCnodes, - real om1, + real* DD, + int* k_Q, + int numberOfBCnodes, + real om1, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, - unsigned int size_Mat, + unsigned int size_Mat, bool isEvenTimestep) { //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -2647,7 +2647,7 @@ __global__ void QPressDeviceDirDepBot27( real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -2803,16 +2803,16 @@ __host__ __device__ real computeOutflowDistribution(const real* const &f, const //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void QPressNoRhoDevice27( real* rhoBC, - real* distributions, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep, + real* distributions, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep, int direction) { //////////////////////////////////////////////////////////////////////////////// @@ -2885,8 +2885,8 @@ __global__ void QPressNoRhoDevice27( real* rhoBC, unsigned int k1bsw = neighborZ[k1sw]; //////////////////////////////////////////////////////////////////////////////// Distributions27 dist; - getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep); - real f[27], f1[27]; + getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep); + real f[27], f1[27]; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// f1[DIR_P00] = (dist.f[DIR_P00])[k1e ]; f1[DIR_M00] = (dist.f[DIR_M00])[k1w ]; @@ -2945,135 +2945,6 @@ __global__ void QPressNoRhoDevice27( real* rhoBC, f[DIR_MPM] = (dist.f[DIR_MPM])[kbnw ]; ////////////////////////////////////////////////////////////////////////// - //real vx1, vx2, vx3, drho; - //real vx1, vx2, vx3, drho, drho1; - ////////////////////////////////////////////////////////////////////////// - ////Dichte - // drho1 = f1_TSE + f1_TNW + f1_TNE + f1_TSW + f1_BSE + f1_BNW + f1_BNE + f1_BSW + - // f1_BN + f1_TS + f1_TN + f1_BS + f1_BE + f1_TW + f1_TE + f1_BW + f1_SE + f1_NW + f1_NE + f1_SW + - // f1_T + f1_B + f1_N + f1_S + f1_E + f1_W + ((D.f[DIR_000])[k1zero]); - // drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW + - // f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + - // f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[DIR_000])[kzero]); - - ////////////////////////////////////////////////////////////////////////// - ////Ux - - //vx1 = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + - // ((f_BE - f_TW) + (f_TE - f_BW)) + ((f_SE - f_NW) + (f_NE - f_SW)) + - // (f_E - f_W)) /(one + drho); - - - //vx2 = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + - // ((f_BN - f_TS) + (f_TN - f_BS)) + (-(f_SE - f_NW) + (f_NE - f_SW)) + - // (f_N - f_S)) /(one + drho); - - //vx3 = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) + - // (-(f_BN - f_TS) + (f_TN - f_BS)) + ((f_TE - f_BW) - (f_BE - f_TW)) + - // (f_T - f_B)) /(one + drho); - - - //real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); - - ////////////////////////////////////////////////////////////////////////// - ////real omega = om1; - // real cusq = c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); - // ////////////////////////////////////////////////////////////////////////// - ////T�st MK - ////if(vx1 < zero) vx1 = zero; - // ////////////////////////////////////////////////////////////////////////// - // real fZERO = c8over27* (drho1-(one + drho1)*(cusq)) ; - // real fE = c2over27* (drho1+(one + drho1)*(three*( vx1 )+c9over2*( vx1 )*( vx1 )-cusq)); - // real fW = c2over27* (drho1+(one + drho1)*(three*(-vx1 )+c9over2*(-vx1 )*(-vx1 )-cusq)); - // real fN = c2over27* (drho1+(one + drho1)*(three*( vx2 )+c9over2*( vx2 )*( vx2 )-cusq)); - // real fS = c2over27* (drho1+(one + drho1)*(three*( -vx2 )+c9over2*( -vx2 )*( -vx2 )-cusq)); - // real fT = c2over27* (drho1+(one + drho1)*(three*( vx3)+c9over2*( vx3)*( vx3)-cusq)); - // real fB = c2over27* (drho1+(one + drho1)*(three*( -vx3)+c9over2*( -vx3)*( -vx3)-cusq)); - // real fNE = c1over54* (drho1+(one + drho1)*(three*( vx1+vx2 )+c9over2*( vx1+vx2 )*( vx1+vx2 )-cusq)); - // real fSW = c1over54* (drho1+(one + drho1)*(three*(-vx1-vx2 )+c9over2*(-vx1-vx2 )*(-vx1-vx2 )-cusq)); - // real fSE = c1over54* (drho1+(one + drho1)*(three*( vx1-vx2 )+c9over2*( vx1-vx2 )*( vx1-vx2 )-cusq)); - // real fNW = c1over54* (drho1+(one + drho1)*(three*(-vx1+vx2 )+c9over2*(-vx1+vx2 )*(-vx1+vx2 )-cusq)); - // real fTE ///////////////////////////////////////////////////////////// - //with velocity - //if(true){//vx1 >= zero){ - // real csMvx = one / sqrtf(three) - vx1; - // //real csMvy = one / sqrtf(three) - vx2; - // /////////////////////////////////////////// - // // X - // f_W = f1_W * csMvx + (one - csMvx) * f_W ;//- c2over27 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // f_NW = f1_NW * csMvx + (one - csMvx) * f_NW ;//- c1over54 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // f_SW = f1_SW * csMvx + (one - csMvx) * f_SW ;//- c1over54 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // f_TW = f1_TW * csMvx + (one - csMvx) * f_TW ;//- c1over54 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // f_BW = f1_BW * csMvx + (one - csMvx) * f_BW ;//- c1over54 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // f_TNW = f1_TNW * csMvx + (one - csMvx) * f_TNW ;//- c1over216 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // f_TSW = f1_TSW * csMvx + (one - csMvx) * f_TSW ;//- c1over216 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // f_BNW = f1_BNW * csMvx + (one - csMvx) * f_BNW ;//- c1over216 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // f_BSW = f1_BSW * csMvx + (one - csMvx) * f_BSW ;//- c1over216 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx1); - // /////////////////////////////////////////// - // // Y - // //f_S = f1_S * csMvy + (one - csMvy) * f_S ;//- c2over27 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_SE = f1_SE * csMvy + (one - csMvy) * f_SE ;//- c1over54 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_SW = f1_SW * csMvy + (one - csMvy) * f_SW ;//- c1over54 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_TS = f1_TS * csMvy + (one - csMvy) * f_TS ;//- c1over54 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_BS = f1_BS * csMvy + (one - csMvy) * f_BS ;//- c1over54 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_TSE = f1_TSE * csMvy + (one - csMvy) * f_TSE ;//- c1over216 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_TSW = f1_TSW * csMvy + (one - csMvy) * f_TSW ;//- c1over216 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_BSE = f1_BSE * csMvy + (one - csMvy) * f_BSE ;//- c1over216 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_BSW = f1_BSW * csMvy + (one - csMvy) * f_BSW ;//- c1over216 * ((drho + drho1)*c1o2-((drho + drho1)*c1o2 )*three*vx2); - // //f_S = f1_S * csMvy + (one - csMvy) * f_S; - // //f_SE = f1_SE * csMvy + (one - csMvy) * f_SE; - // //f_SW = f1_SW * csMvy + (one - csMvy) * f_SW; - // //f_TS = f1_TS * csMvy + (one - csMvy) * f_TS; - // //f_BS = f1_BS * csMvy + (one - csMvy) * f_BS; - // //f_TSE = f1_TSE * csMvy + (one - csMvy) * f_TSE; - // //f_TSW = f1_TSW * csMvy + (one - csMvy) * f_TSW; - // //f_BSE = f1_BSE * csMvy + (one - csMvy) * f_BSE; - // //f_BSW = f1_BSW * csMvy + (one - csMvy) * f_BSW; - // ////////////////////////////////////////////////////////////////////////// - //} - //else - //{ - // /////////////////////////////////////////// - // // X - // vx1 = vx1 * 0.9; - // f_W = f_E - six * c2over27 * ( vx1 ); - // f_NW = f_SE - six * c1over54 * ( vx1-vx2 ); - // f_SW = f_NE - six * c1over54 * ( vx1+vx2 ); - // f_TW = f_BE - six * c1over54 * ( vx1 -vx3); - // f_BW = f_TE - six * c1over54 * ( vx1 +vx3); - // f_TNW = f_BSE - six * c1over216 * ( vx1-vx2-vx3); - // f_TSW = f_BNE - six * c1over216 * ( vx1+vx2-vx3); - // f_BNW = f_TSE - six * c1over216 * ( vx1-vx2+vx3); - // f_BSW = f_TNE - six * c1over216 * ( vx1+vx2+vx3); - // /////////////////////////////////////////// - // // Y - // //vx2 = vx2 * 0.9; - // //f_S = f_N - six * c2over27 * ( vx2 ); - // //f_SE = f_NW - six * c1over54 * (-vx1+vx2 ); - // //f_SW = f_NE - six * c1over54 * ( vx1+vx2 ); - // //f_TS = f_BN - six * c1over54 * ( vx2-vx3); - // //f_BS = f_TN - six * c1over54 * ( vx2+vx3); - // //f_TSE = f_BNW - six * c1over216 * (-vx1+vx2-vx3); - // //f_TSW = f_BNE - six * c1over216 * ( vx1+vx2-vx3); - // //f_BSE = f_TNW - six * c1over216 * (-vx1+vx2+vx3); - // //f_BSW = f_TNE - six * c1over216 * ( vx1+vx2+vx3); - // /////////////////////////////////////////// - //} - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - // = c1over54* (drho1+(one + drho1)*(three*(-vx1 +vx3)+c9over2*(-vx1 +vx3)*(-vx1 +vx3)-cusq)); - // real fTN = c1over54* (drho1+(one + drho1)*(three*( vx2+vx3)+c9over2*( vx2+vx3)*( vx2+vx3)-cusq)); - // real fBS = c1over54* (drho1+(one + drho1)*(three*( -vx2-vx3)+c9over2*( -vx2-vx3)*( -vx2-vx3)-cusq)); - // real fBN = c1over54* (drho1+(one + drho1)*(three*( vx2-vx3)+c9over2*( vx2-vx3)*( vx2-vx3)-cusq)); - // real fTS = c1over54* (drho1+(one + drho1)*(three*( -vx2+vx3)+c9over2*( -vx2+vx3)*( -vx2+vx3)-cusq)); - // real fTNE = c1over216* (drho1+(one + drho1)*(three*( vx1+vx2+vx3)+c9over2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cusq)); - // real fBSW = c1over216* (drho1+(one + drho1)*(three*(-vx1-vx2-vx3)+c9over2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cusq)); - // real fBNE = c1over216* (drho1+(one + drho1)*(three*( vx1+vx2-vx3)+c9over2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cusq)); - // real fTSW = c1over216* (drho1+(one + drho1)*(three*(-vx1-vx2+vx3)+c9over2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cusq)); - // real fTSE = c1over216* (drho1+(one + drho1)*(three*( vx1-vx2+vx3)+c9over2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cusq)); - // real fBNW = c1over216* (drho1+(one + drho1)*(three*(-vx1+vx2-vx3)+c9over2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cusq)); - // real fBSE = c1over216* (drho1+(one + drho1)*(three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq)); - // real fTNW = c1over216* (drho1+(one + drho1)*(three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq)); real cs = c1o1 / sqrtf(c3o1); @@ -3115,9 +2986,9 @@ __global__ void QPressNoRhoDevice27( real* rhoBC, (dist.f[DIR_MPP])[ktnw ] = computeOutflowDistribution(f, f1, DIR_MPP, cs); (dist.f[DIR_PPM])[kbne ] = computeOutflowDistribution(f, f1, DIR_PPM, cs); (dist.f[DIR_MPM])[kbnw ] = computeOutflowDistribution(f, f1, DIR_MPM, cs); - break; + break; - case ZPZ: + case ZPZ: (dist.f[DIR_0M0])[ks ] = computeOutflowDistribution(f, f1, DIR_0M0, cs); (dist.f[DIR_PM0])[kse ] = computeOutflowDistribution(f, f1, DIR_PM0, cs); (dist.f[DIR_MM0])[ksw ] = computeOutflowDistribution(f, f1, DIR_MM0, cs); @@ -3138,7 +3009,7 @@ __global__ void QPressNoRhoDevice27( real* rhoBC, (dist.f[DIR_PPP])[ktne ] = computeOutflowDistribution(f, f1, DIR_PPP, cs); (dist.f[DIR_MPP])[ktnw ] = computeOutflowDistribution(f, f1, DIR_MPP, cs); (dist.f[DIR_PMP])[ktse ] = computeOutflowDistribution(f, f1, DIR_PMP, cs); - (dist.f[DIR_MMP])[ktsw ] = computeOutflowDistribution(f, f1, DIR_MMP, cs); + (dist.f[DIR_MMP])[ktsw ] = computeOutflowDistribution(f, f1, DIR_MMP, cs); break; case ZZP: @@ -3150,7 +3021,7 @@ __global__ void QPressNoRhoDevice27( real* rhoBC, (dist.f[DIR_PPM])[kbne ] = computeOutflowDistribution(f, f1, DIR_PPM, cs); (dist.f[DIR_MPM])[kbnw ] = computeOutflowDistribution(f, f1, DIR_MPM, cs); (dist.f[DIR_PMM])[kbse ] = computeOutflowDistribution(f, f1, DIR_PMM, cs); - (dist.f[DIR_MMM])[kbsw ] = computeOutflowDistribution(f, f1, DIR_MMM, cs); + (dist.f[DIR_MMM])[kbsw ] = computeOutflowDistribution(f, f1, DIR_MMM, cs); break; default: break; @@ -3165,150 +3036,112 @@ __host__ __device__ real computeOutflowDistribution(const real* const &f, const } __global__ void QPressZeroRhoOutflowDevice27( real* rhoBC, - real* distributions, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep, + real* distributions, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int numberOfLBnodes, + bool isEvenTimestep, int direction, real densityCorrectionFactor) { //////////////////////////////////////////////////////////////////////////////// const unsigned k = vf::gpu::getNodeIndex(); - + ////////////////////////////////////////////////////////////////////////// if(k>=numberOfBCnodes) return; //////////////////////////////////////////////////////////////////////////////// //index - unsigned int KQK = k_Q[k]; - unsigned int kzero= KQK; - unsigned int ke = KQK; - unsigned int kw = neighborX[KQK]; - unsigned int kn = KQK; - unsigned int ks = neighborY[KQK]; - unsigned int kt = KQK; - unsigned int kb = neighborZ[KQK]; - unsigned int ksw = neighborY[kw]; - unsigned int kne = KQK; - unsigned int kse = ks; - unsigned int knw = kw; - unsigned int kbw = neighborZ[kw]; - unsigned int kte = KQK; - unsigned int kbe = kb; - unsigned int ktw = kw; - unsigned int kbs = neighborZ[ks]; - unsigned int ktn = KQK; - unsigned int kbn = kb; - unsigned int kts = ks; - unsigned int ktse = ks; - unsigned int kbnw = kbw; - unsigned int ktnw = kw; - unsigned int kbse = kbs; - unsigned int ktsw = ksw; - unsigned int kbne = kb; - unsigned int ktne = KQK; - unsigned int kbsw = neighborZ[ksw]; + + uint k_000 = k_Q[k]; + uint k_M00 = neighborX[k_000]; + uint k_0M0 = neighborY[k_000]; + uint k_00M = neighborZ[k_000]; + uint k_MM0 = neighborY[k_M00]; + uint k_M0M = neighborZ[k_M00]; + uint k_0MM = neighborZ[k_0M0]; + uint k_MMM = neighborZ[k_MM0]; + //////////////////////////////////////////////////////////////////////////////// - //index1 - unsigned int K1QK = k_N[k]; - // unsigned int k1zero= K1QK; - unsigned int k1e = K1QK; - unsigned int k1w = neighborX[K1QK]; - unsigned int k1n = K1QK; - unsigned int k1s = neighborY[K1QK]; - unsigned int k1t = K1QK; - unsigned int k1b = neighborZ[K1QK]; - unsigned int k1sw = neighborY[k1w]; - unsigned int k1ne = K1QK; - unsigned int k1se = k1s; - unsigned int k1nw = k1w; - unsigned int k1bw = neighborZ[k1w]; - unsigned int k1te = K1QK; - unsigned int k1be = k1b; - unsigned int k1tw = k1w; - unsigned int k1bs = neighborZ[k1s]; - unsigned int k1tn = K1QK; - unsigned int k1bn = k1b; - unsigned int k1ts = k1s; - unsigned int k1tse = k1s; - unsigned int k1bnw = k1bw; - unsigned int k1tnw = k1w; - unsigned int k1bse = k1bs; - unsigned int k1tsw = k1sw; - unsigned int k1bne = k1b; - unsigned int k1tne = K1QK; - unsigned int k1bsw = neighborZ[k1sw]; + //index of neighbor + uint kN_000 = k_N[k]; + uint kN_M00 = neighborX[k_000]; + uint kN_0M0 = neighborY[k_000]; + uint kN_00M = neighborZ[k_000]; + uint kN_MM0 = neighborY[k_M00]; + uint kN_M0M = neighborZ[k_M00]; + uint kN_0MM = neighborZ[k_0M0]; + uint kN_MMM = neighborZ[k_MM0]; //////////////////////////////////////////////////////////////////////////////// Distributions27 dist; - getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep); - real f1[27], f[27]; + getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep); + real f[27], fN[27]; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - f1[DIR_P00] = (dist.f[DIR_P00])[k1e ]; - f1[DIR_M00] = (dist.f[DIR_M00])[k1w ]; - f1[DIR_0P0] = (dist.f[DIR_0P0])[k1n ]; - f1[DIR_0M0] = (dist.f[DIR_0M0])[k1s ]; - f1[DIR_00P] = (dist.f[DIR_00P])[k1t ]; - f1[DIR_00M] = (dist.f[DIR_00M])[k1b ]; - f1[DIR_PP0] = (dist.f[DIR_PP0])[k1ne ]; - f1[DIR_MM0] = (dist.f[DIR_MM0])[k1sw ]; - f1[DIR_PM0] = (dist.f[DIR_PM0])[k1se ]; - f1[DIR_MP0] = (dist.f[DIR_MP0])[k1nw ]; - f1[DIR_P0P] = (dist.f[DIR_P0P])[k1te ]; - f1[DIR_M0M] = (dist.f[DIR_M0M])[k1bw ]; - f1[DIR_P0M] = (dist.f[DIR_P0M])[k1be ]; - f1[DIR_M0P] = (dist.f[DIR_M0P])[k1tw ]; - f1[DIR_0PP] = (dist.f[DIR_0PP])[k1tn ]; - f1[DIR_0MM] = (dist.f[DIR_0MM])[k1bs ]; - f1[DIR_0PM] = (dist.f[DIR_0PM])[k1bn ]; - f1[DIR_0MP] = (dist.f[DIR_0MP])[k1ts ]; - // f1[DIR_000] = (dist.f[DIR_000])[k1zero]; - f1[DIR_PPP] = (dist.f[DIR_PPP])[k1tne ]; - f1[DIR_MMP] = (dist.f[DIR_MMP])[k1tsw ]; - f1[DIR_PMP] = (dist.f[DIR_PMP])[k1tse ]; - f1[DIR_MPP] = (dist.f[DIR_MPP])[k1tnw ]; - f1[DIR_PPM] = (dist.f[DIR_PPM])[k1bne ]; - f1[DIR_MMM] = (dist.f[DIR_MMM])[k1bsw ]; - f1[DIR_PMM] = (dist.f[DIR_PMM])[k1bse ]; - f1[DIR_MPM] = (dist.f[DIR_MPM])[k1bnw ]; + f[DIR_000] = (dist.f[DIR_000])[k_000]; + f[DIR_P00] = (dist.f[DIR_P00])[k_000]; + f[DIR_M00] = (dist.f[DIR_M00])[k_M00]; + f[DIR_0P0] = (dist.f[DIR_0P0])[k_000]; + f[DIR_0M0] = (dist.f[DIR_0M0])[k_0M0]; + f[DIR_00P] = (dist.f[DIR_00P])[k_000]; + f[DIR_00M] = (dist.f[DIR_00M])[k_00M]; + f[DIR_PP0] = (dist.f[DIR_PP0])[k_000]; + f[DIR_MM0] = (dist.f[DIR_MM0])[k_MM0]; + f[DIR_PM0] = (dist.f[DIR_PM0])[k_0M0]; + f[DIR_MP0] = (dist.f[DIR_MP0])[k_M00]; + f[DIR_P0P] = (dist.f[DIR_P0P])[k_000]; + f[DIR_M0M] = (dist.f[DIR_M0M])[k_M0M]; + f[DIR_P0M] = (dist.f[DIR_P0M])[k_00M]; + f[DIR_M0P] = (dist.f[DIR_M0P])[k_M00]; + f[DIR_0PP] = (dist.f[DIR_0PP])[k_000]; + f[DIR_0MM] = (dist.f[DIR_0MM])[k_0MM]; + f[DIR_0PM] = (dist.f[DIR_0PM])[k_00M]; + f[DIR_0MP] = (dist.f[DIR_0MP])[k_0M0]; + f[DIR_PPP] = (dist.f[DIR_PPP])[k_000]; + f[DIR_MPP] = (dist.f[DIR_MPP])[k_M00]; + f[DIR_PMP] = (dist.f[DIR_PMP])[k_0M0]; + f[DIR_MMP] = (dist.f[DIR_MMP])[k_MM0]; + f[DIR_PPM] = (dist.f[DIR_PPM])[k_00M]; + f[DIR_MPM] = (dist.f[DIR_MPM])[k_M0M]; + f[DIR_PMM] = (dist.f[DIR_PMM])[k_0MM]; + f[DIR_MMM] = (dist.f[DIR_MMM])[k_MMM]; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - f[DIR_P00] = (dist.f[DIR_P00])[ke ]; - f[DIR_M00] = (dist.f[DIR_M00])[kw ]; - f[DIR_0P0] = (dist.f[DIR_0P0])[kn ]; - f[DIR_0M0] = (dist.f[DIR_0M0])[ks ]; - f[DIR_00P] = (dist.f[DIR_00P])[kt ]; - f[DIR_00M] = (dist.f[DIR_00M])[kb ]; - f[DIR_PP0] = (dist.f[DIR_PP0])[kne ]; - f[DIR_MM0] = (dist.f[DIR_MM0])[ksw ]; - f[DIR_PM0] = (dist.f[DIR_PM0])[kse ]; - f[DIR_MP0] = (dist.f[DIR_MP0])[knw ]; - f[DIR_P0P] = (dist.f[DIR_P0P])[kte ]; - f[DIR_M0M] = (dist.f[DIR_M0M])[kbw ]; - f[DIR_P0M] = (dist.f[DIR_P0M])[kbe ]; - f[DIR_M0P] = (dist.f[DIR_M0P])[ktw ]; - f[DIR_0PP] = (dist.f[DIR_0PP])[ktn ]; - f[DIR_0MM] = (dist.f[DIR_0MM])[kbs ]; - f[DIR_0PM] = (dist.f[DIR_0PM])[kbn ]; - f[DIR_0MP] = (dist.f[DIR_0MP])[kts ]; - f[DIR_000] = (dist.f[DIR_000])[kzero]; - f[DIR_PPP] = (dist.f[DIR_PPP])[ktne ]; - f[DIR_MMP] = (dist.f[DIR_MMP])[ktsw ]; - f[DIR_PMP] = (dist.f[DIR_PMP])[ktse ]; - f[DIR_MPP] = (dist.f[DIR_MPP])[ktnw ]; - f[DIR_PPM] = (dist.f[DIR_PPM])[kbne ]; - f[DIR_MMM] = (dist.f[DIR_MMM])[kbsw ]; - f[DIR_PMM] = (dist.f[DIR_PMM])[kbse ]; - f[DIR_MPM] = (dist.f[DIR_MPM])[kbnw ]; + fN[DIR_000] = (dist.f[DIR_000])[kN_000]; + fN[DIR_P00] = (dist.f[DIR_P00])[kN_000]; + fN[DIR_M00] = (dist.f[DIR_M00])[kN_M00]; + fN[DIR_0P0] = (dist.f[DIR_0P0])[kN_000]; + fN[DIR_0M0] = (dist.f[DIR_0M0])[kN_0M0]; + fN[DIR_00P] = (dist.f[DIR_00P])[kN_000]; + fN[DIR_00M] = (dist.f[DIR_00M])[kN_00M]; + fN[DIR_PP0] = (dist.f[DIR_PP0])[kN_000]; + fN[DIR_MM0] = (dist.f[DIR_MM0])[kN_MM0]; + fN[DIR_PM0] = (dist.f[DIR_PM0])[kN_0M0]; + fN[DIR_MP0] = (dist.f[DIR_MP0])[kN_M00]; + fN[DIR_P0P] = (dist.f[DIR_P0P])[kN_000]; + fN[DIR_M0M] = (dist.f[DIR_M0M])[kN_M0M]; + fN[DIR_P0M] = (dist.f[DIR_P0M])[kN_00M]; + fN[DIR_M0P] = (dist.f[DIR_M0P])[kN_M00]; + fN[DIR_0PP] = (dist.f[DIR_0PP])[kN_000]; + fN[DIR_0MM] = (dist.f[DIR_0MM])[kN_0MM]; + fN[DIR_0PM] = (dist.f[DIR_0PM])[kN_00M]; + fN[DIR_0MP] = (dist.f[DIR_0MP])[kN_0M0]; + fN[DIR_PPP] = (dist.f[DIR_PPP])[kN_000]; + fN[DIR_MPP] = (dist.f[DIR_MPP])[kN_M00]; + fN[DIR_PMP] = (dist.f[DIR_PMP])[kN_0M0]; + fN[DIR_MMP] = (dist.f[DIR_MMP])[kN_MM0]; + fN[DIR_PPM] = (dist.f[DIR_PPM])[kN_00M]; + fN[DIR_MPM] = (dist.f[DIR_MPM])[kN_M0M]; + fN[DIR_PMM] = (dist.f[DIR_PMM])[kN_0MM]; + fN[DIR_MMM] = (dist.f[DIR_MMM])[kN_MMM]; ////////////////////////////////////////////////////////////////////////// real drho = vf::lbm::getDensity(f); - + real rhoCorrection = densityCorrectionFactor*drho; - + real cs = c1o1 / sqrtf(c3o1); getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep); @@ -3316,75 +3149,75 @@ __global__ void QPressZeroRhoOutflowDevice27( real* rhoBC, switch(direction) { case MZZ: - (dist.f[DIR_P00])[ke ] = computeOutflowDistribution(f, f1, DIR_P00 , rhoCorrection, cs, c2o27); - (dist.f[DIR_PM0])[kse ] = computeOutflowDistribution(f, f1, DIR_PM0, rhoCorrection, cs, c1o54); - (dist.f[DIR_PP0])[kne ] = computeOutflowDistribution(f, f1, DIR_PP0, rhoCorrection, cs, c1o54); - (dist.f[DIR_P0M])[kbe ] = computeOutflowDistribution(f, f1, DIR_P0M, rhoCorrection, cs, c1o54); - (dist.f[DIR_P0P])[kte ] = computeOutflowDistribution(f, f1, DIR_P0P, rhoCorrection, cs, c1o54); - (dist.f[DIR_PMP])[ktse ] = computeOutflowDistribution(f, f1, DIR_PMP, rhoCorrection, cs, c1o216); - (dist.f[DIR_PPP])[ktne ] = computeOutflowDistribution(f, f1, DIR_PPP, rhoCorrection, cs, c1o216); - (dist.f[DIR_PMM])[kbse ] = computeOutflowDistribution(f, f1, DIR_PMM, rhoCorrection, cs, c1o216); - (dist.f[DIR_PPM])[kbne ] = computeOutflowDistribution(f, f1, DIR_PPM, rhoCorrection, cs, c1o216); + (dist.f[DIR_P00])[k_000] = computeOutflowDistribution(f, fN, DIR_P00 , rhoCorrection, cs, c2o27); + (dist.f[DIR_PM0])[k_0M0] = computeOutflowDistribution(f, fN, DIR_PM0, rhoCorrection, cs, c1o54); + (dist.f[DIR_PP0])[k_000] = computeOutflowDistribution(f, fN, DIR_PP0, rhoCorrection, cs, c1o54); + (dist.f[DIR_P0M])[k_00M] = computeOutflowDistribution(f, fN, DIR_P0M, rhoCorrection, cs, c1o54); + (dist.f[DIR_P0P])[k_000] = computeOutflowDistribution(f, fN, DIR_P0P, rhoCorrection, cs, c1o54); + (dist.f[DIR_PMP])[k_0M0] = computeOutflowDistribution(f, fN, DIR_PMP, rhoCorrection, cs, c1o216); + (dist.f[DIR_PPP])[k_000] = computeOutflowDistribution(f, fN, DIR_PPP, rhoCorrection, cs, c1o216); + (dist.f[DIR_PMM])[k_0MM] = computeOutflowDistribution(f, fN, DIR_PMM, rhoCorrection, cs, c1o216); + (dist.f[DIR_PPM])[k_00M] = computeOutflowDistribution(f, fN, DIR_PPM, rhoCorrection, cs, c1o216); break; case PZZ: - (dist.f[DIR_M00])[kw ] = computeOutflowDistribution(f, f1, DIR_M00, rhoCorrection, cs, c2o27); - (dist.f[DIR_MM0])[ksw ] = computeOutflowDistribution(f, f1, DIR_MM0, rhoCorrection, cs, c1o54); - (dist.f[DIR_MP0])[knw ] = computeOutflowDistribution(f, f1, DIR_MP0, rhoCorrection, cs, c1o54); - (dist.f[DIR_M0M])[kbw ] = computeOutflowDistribution(f, f1, DIR_M0M, rhoCorrection, cs, c1o54); - (dist.f[DIR_M0P])[ktw ] = computeOutflowDistribution(f, f1, DIR_M0P, rhoCorrection, cs, c1o54); - (dist.f[DIR_MMP])[ktsw ] = computeOutflowDistribution(f, f1, DIR_MMP, rhoCorrection, cs, c1o216); - (dist.f[DIR_MPP])[ktnw ] = computeOutflowDistribution(f, f1, DIR_MPP, rhoCorrection, cs, c1o216); - (dist.f[DIR_MMM])[kbsw ] = computeOutflowDistribution(f, f1, DIR_MMM, rhoCorrection, cs, c1o216); - (dist.f[DIR_MPM])[kbnw ] = computeOutflowDistribution(f, f1, DIR_MPM, rhoCorrection, cs, c1o216); + (dist.f[DIR_M00])[k_M00] = computeOutflowDistribution(f, fN, DIR_M00, rhoCorrection, cs, c2o27); + (dist.f[DIR_MM0])[k_MM0] = computeOutflowDistribution(f, fN, DIR_MM0, rhoCorrection, cs, c1o54); + (dist.f[DIR_MP0])[k_M00] = computeOutflowDistribution(f, fN, DIR_MP0, rhoCorrection, cs, c1o54); + (dist.f[DIR_M0M])[k_M0M] = computeOutflowDistribution(f, fN, DIR_M0M, rhoCorrection, cs, c1o54); + (dist.f[DIR_M0P])[k_M00] = computeOutflowDistribution(f, fN, DIR_M0P, rhoCorrection, cs, c1o54); + (dist.f[DIR_MMP])[k_MM0] = computeOutflowDistribution(f, fN, DIR_MMP, rhoCorrection, cs, c1o216); + (dist.f[DIR_MPP])[k_M00] = computeOutflowDistribution(f, fN, DIR_MPP, rhoCorrection, cs, c1o216); + (dist.f[DIR_MMM])[k_MMM] = computeOutflowDistribution(f, fN, DIR_MMM, rhoCorrection, cs, c1o216); + (dist.f[DIR_MPM])[k_M0M] = computeOutflowDistribution(f, fN, DIR_MPM, rhoCorrection, cs, c1o216); break; case ZMZ: - (dist.f[DIR_0P0])[kn ] = computeOutflowDistribution(f, f1, DIR_0P0, rhoCorrection, cs, c2o27); - (dist.f[DIR_PP0])[kne ] = computeOutflowDistribution(f, f1, DIR_PP0, rhoCorrection, cs, c1o54); - (dist.f[DIR_MP0])[knw ] = computeOutflowDistribution(f, f1, DIR_MP0, rhoCorrection, cs, c1o54); - (dist.f[DIR_0PP])[ktn ] = computeOutflowDistribution(f, f1, DIR_0PP, rhoCorrection, cs, c1o54); - (dist.f[DIR_0PM])[kbn ] = computeOutflowDistribution(f, f1, DIR_0PM, rhoCorrection, cs, c1o54); - (dist.f[DIR_PPP])[ktne ] = computeOutflowDistribution(f, f1, DIR_PPP, rhoCorrection, cs, c1o216); - (dist.f[DIR_MPP])[ktnw ] = computeOutflowDistribution(f, f1, DIR_MPP, rhoCorrection, cs, c1o216); - (dist.f[DIR_PPM])[kbne ] = computeOutflowDistribution(f, f1, DIR_PPM, rhoCorrection, cs, c1o216); - (dist.f[DIR_MPM])[kbnw ] = computeOutflowDistribution(f, f1, DIR_MPM, rhoCorrection, cs, c1o216); - break; - - case ZPZ: - (dist.f[DIR_0M0])[ks ] =computeOutflowDistribution(f, f1, DIR_0M0, rhoCorrection, cs, c2o27); - (dist.f[DIR_PM0])[kse ] =computeOutflowDistribution(f, f1, DIR_PM0, rhoCorrection, cs, c1o54); - (dist.f[DIR_MM0])[ksw ] =computeOutflowDistribution(f, f1, DIR_MM0, rhoCorrection, cs, c1o54); - (dist.f[DIR_0MP])[kts ] =computeOutflowDistribution(f, f1, DIR_0MP, rhoCorrection, cs, c1o54); - (dist.f[DIR_0MM])[kbs ] =computeOutflowDistribution(f, f1, DIR_0MM, rhoCorrection, cs, c1o54); - (dist.f[DIR_PMP])[ktse ] =computeOutflowDistribution(f, f1, DIR_PMP, rhoCorrection, cs, c1o216); - (dist.f[DIR_MMP])[ktsw ] =computeOutflowDistribution(f, f1, DIR_MMP, rhoCorrection, cs, c1o216); - (dist.f[DIR_PMM])[kbse ] =computeOutflowDistribution(f, f1, DIR_PMM, rhoCorrection, cs, c1o216); - (dist.f[DIR_MMM])[kbsw ] =computeOutflowDistribution(f, f1, DIR_MMM, rhoCorrection, cs, c1o216); + (dist.f[DIR_0P0])[k_000] = computeOutflowDistribution(f, fN, DIR_0P0, rhoCorrection, cs, c2o27); + (dist.f[DIR_PP0])[k_000] = computeOutflowDistribution(f, fN, DIR_PP0, rhoCorrection, cs, c1o54); + (dist.f[DIR_MP0])[k_M00] = computeOutflowDistribution(f, fN, DIR_MP0, rhoCorrection, cs, c1o54); + (dist.f[DIR_0PP])[k_000] = computeOutflowDistribution(f, fN, DIR_0PP, rhoCorrection, cs, c1o54); + (dist.f[DIR_0PM])[k_00M] = computeOutflowDistribution(f, fN, DIR_0PM, rhoCorrection, cs, c1o54); + (dist.f[DIR_PPP])[k_000] = computeOutflowDistribution(f, fN, DIR_PPP, rhoCorrection, cs, c1o216); + (dist.f[DIR_MPP])[k_M00] = computeOutflowDistribution(f, fN, DIR_MPP, rhoCorrection, cs, c1o216); + (dist.f[DIR_PPM])[k_00M] = computeOutflowDistribution(f, fN, DIR_PPM, rhoCorrection, cs, c1o216); + (dist.f[DIR_MPM])[k_M0M] = computeOutflowDistribution(f, fN, DIR_MPM, rhoCorrection, cs, c1o216); + break; + + case ZPZ: + (dist.f[DIR_0M0])[k_0M0] =computeOutflowDistribution(f, fN, DIR_0M0, rhoCorrection, cs, c2o27); + (dist.f[DIR_PM0])[k_0M0] =computeOutflowDistribution(f, fN, DIR_PM0, rhoCorrection, cs, c1o54); + (dist.f[DIR_MM0])[k_MM0] =computeOutflowDistribution(f, fN, DIR_MM0, rhoCorrection, cs, c1o54); + (dist.f[DIR_0MP])[k_0M0] =computeOutflowDistribution(f, fN, DIR_0MP, rhoCorrection, cs, c1o54); + (dist.f[DIR_0MM])[k_0MM] =computeOutflowDistribution(f, fN, DIR_0MM, rhoCorrection, cs, c1o54); + (dist.f[DIR_PMP])[k_0M0] =computeOutflowDistribution(f, fN, DIR_PMP, rhoCorrection, cs, c1o216); + (dist.f[DIR_MMP])[k_MM0] =computeOutflowDistribution(f, fN, DIR_MMP, rhoCorrection, cs, c1o216); + (dist.f[DIR_PMM])[k_0MM] =computeOutflowDistribution(f, fN, DIR_PMM, rhoCorrection, cs, c1o216); + (dist.f[DIR_MMM])[k_MMM] =computeOutflowDistribution(f, fN, DIR_MMM, rhoCorrection, cs, c1o216); break; case ZZM: - (dist.f[DIR_00P])[kt ] = computeOutflowDistribution(f, f1, DIR_00P, rhoCorrection, cs, c2o27); - (dist.f[DIR_P0P])[kte ] = computeOutflowDistribution(f, f1, DIR_P0P, rhoCorrection, cs, c1o54); - (dist.f[DIR_M0P])[ktw ] = computeOutflowDistribution(f, f1, DIR_M0P, rhoCorrection, cs, c1o54); - (dist.f[DIR_0PP])[ktn ] = computeOutflowDistribution(f, f1, DIR_0PP, rhoCorrection, cs, c1o54); - (dist.f[DIR_0MP])[kts ] = computeOutflowDistribution(f, f1, DIR_0MP, rhoCorrection, cs, c1o54); - (dist.f[DIR_PPP])[ktne ] = computeOutflowDistribution(f, f1, DIR_PPP, rhoCorrection, cs, c1o216); - (dist.f[DIR_MPP])[ktnw ] = computeOutflowDistribution(f, f1, DIR_MPP, rhoCorrection, cs, c1o216); - (dist.f[DIR_PMP])[ktse ] = computeOutflowDistribution(f, f1, DIR_PMP, rhoCorrection, cs, c1o216); - (dist.f[DIR_MMP])[ktsw ] = computeOutflowDistribution(f, f1, DIR_MMP, rhoCorrection, cs, c1o216); + (dist.f[DIR_00P])[k_000] = computeOutflowDistribution(f, fN, DIR_00P, rhoCorrection, cs, c2o27); + (dist.f[DIR_P0P])[k_000] = computeOutflowDistribution(f, fN, DIR_P0P, rhoCorrection, cs, c1o54); + (dist.f[DIR_M0P])[k_M00] = computeOutflowDistribution(f, fN, DIR_M0P, rhoCorrection, cs, c1o54); + (dist.f[DIR_0PP])[k_000] = computeOutflowDistribution(f, fN, DIR_0PP, rhoCorrection, cs, c1o54); + (dist.f[DIR_0MP])[k_0M0] = computeOutflowDistribution(f, fN, DIR_0MP, rhoCorrection, cs, c1o54); + (dist.f[DIR_PPP])[k_000] = computeOutflowDistribution(f, fN, DIR_PPP, rhoCorrection, cs, c1o216); + (dist.f[DIR_MPP])[k_M00] = computeOutflowDistribution(f, fN, DIR_MPP, rhoCorrection, cs, c1o216); + (dist.f[DIR_PMP])[k_0M0] = computeOutflowDistribution(f, fN, DIR_PMP, rhoCorrection, cs, c1o216); + (dist.f[DIR_MMP])[k_MM0] = computeOutflowDistribution(f, fN, DIR_MMP, rhoCorrection, cs, c1o216); break; case ZZP: - (dist.f[DIR_00M])[kb ] = computeOutflowDistribution(f, f1, DIR_00M, rhoCorrection, cs, c2o27); - (dist.f[DIR_P0M])[kbe ] = computeOutflowDistribution(f, f1, DIR_P0M, rhoCorrection, cs, c1o54); - (dist.f[DIR_M0M])[kbw ] = computeOutflowDistribution(f, f1, DIR_M0M, rhoCorrection, cs, c1o54); - (dist.f[DIR_0PM])[kbn ] = computeOutflowDistribution(f, f1, DIR_0PM, rhoCorrection, cs, c1o54); - (dist.f[DIR_0MM])[kbs ] = computeOutflowDistribution(f, f1, DIR_0MM, rhoCorrection, cs, c1o54); - (dist.f[DIR_PPM])[kbne ] = computeOutflowDistribution(f, f1, DIR_PPM, rhoCorrection, cs, c1o216); - (dist.f[DIR_MPM])[kbnw ] = computeOutflowDistribution(f, f1, DIR_MPM, rhoCorrection, cs, c1o216); - (dist.f[DIR_PMM])[kbse ] = computeOutflowDistribution(f, f1, DIR_PMM, rhoCorrection, cs, c1o216); - (dist.f[DIR_MMM])[kbsw ] = computeOutflowDistribution(f, f1, DIR_MMM, rhoCorrection, cs, c1o216); + (dist.f[DIR_00M])[k_00M] = computeOutflowDistribution(f, fN, DIR_00M, rhoCorrection, cs, c2o27); + (dist.f[DIR_P0M])[k_00M] = computeOutflowDistribution(f, fN, DIR_P0M, rhoCorrection, cs, c1o54); + (dist.f[DIR_M0M])[k_M0M] = computeOutflowDistribution(f, fN, DIR_M0M, rhoCorrection, cs, c1o54); + (dist.f[DIR_0PM])[k_00M] = computeOutflowDistribution(f, fN, DIR_0PM, rhoCorrection, cs, c1o54); + (dist.f[DIR_0MM])[k_0MM] = computeOutflowDistribution(f, fN, DIR_0MM, rhoCorrection, cs, c1o54); + (dist.f[DIR_PPM])[k_00M] = computeOutflowDistribution(f, fN, DIR_PPM, rhoCorrection, cs, c1o216); + (dist.f[DIR_MPM])[k_M0M] = computeOutflowDistribution(f, fN, DIR_MPM, rhoCorrection, cs, c1o216); + (dist.f[DIR_PMM])[k_0MM] = computeOutflowDistribution(f, fN, DIR_PMM, rhoCorrection, cs, c1o216); + (dist.f[DIR_MMM])[k_MMM] = computeOutflowDistribution(f, fN, DIR_MMM, rhoCorrection, cs, c1o216); break; default: break; @@ -3423,21 +3256,21 @@ __global__ void QPressZeroRhoOutflowDevice27( real* rhoBC, //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void QPressDeviceOld27(real* rhoBC, - real* DD, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, + real* DD, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, - unsigned int size_Mat, + unsigned int size_Mat, bool isEvenTimestep) { //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -3538,7 +3371,7 @@ __global__ void QPressDeviceOld27(real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -3605,8 +3438,8 @@ __global__ void QPressDeviceOld27(real* rhoBC, real drho1 = f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+ f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW; - //drho1 = (drho1 + rhoBC[k])/2.f; - drho1 = drho1 - rhoBC[k]; + //drho1 = (drho1 + rhoBC[k])/2.f; + drho1 = drho1 - rhoBC[k]; ////////////////////////////////////////////////////////////////////////// __syncthreads(); @@ -3637,7 +3470,7 @@ __global__ void QPressDeviceOld27(real* rhoBC, (D.f[DIR_PPM ])[kbne ] = f1_TSW -c1o216*drho1; // c1o100; // zero; // (D.f[DIR_MMM ])[kbsw ] = f1_TNE -c1o216*drho1; // c1o100; // zero; // (D.f[DIR_PMM ])[kbse ] = f1_TNW -c1o216*drho1; // c1o100; // zero; // - (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1; // c1o100; // zero; // + (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1; // c1o100; // zero; // } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -3682,22 +3515,22 @@ __global__ void QPressDeviceOld27(real* rhoBC, //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void QPressDeviceEQZ27(real* rhoBC, - real* DD, - int* k_Q, + real* DD, + int* k_Q, int* k_N, - real* kTestRE, - int numberOfBCnodes, - real om1, + real* kTestRE, + int numberOfBCnodes, + real om1, unsigned int* neighborX, unsigned int* neighborY, unsigned int* neighborZ, - unsigned int size_Mat, + unsigned int size_Mat, bool isEvenTimestep) { //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -3798,7 +3631,7 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -3922,17 +3755,17 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, // ////////////////////////////////////////////////////////////////////////// // real drho1 = f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+ f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW; - //real vx1 = (((f1_TNE-f1_BSW)+(f1_BSE-f1_TNW)+(f1_BNE-f1_TSW)+(f1_TSE-f1_BNW)) + (((f1_NE-f1_SW)+(f1_TE-f1_BW))+((f1_SE-f1_NW)+(f1_BE-f1_TW))) + (f1_E-f1_W)) / (one + drho1); - //real vx2 = (((f1_TNE-f1_BSW)+(f1_TNW-f1_BSE)+(f1_BNE-f1_TSW)+(f1_BNW-f1_TSE)) + (((f1_NE-f1_SW)+(f1_TN-f1_BS))+((f1_BN-f1_TS)+(f1_NW-f1_SE))) + (f1_N-f1_S)) / (one + drho1); - //real vx3 = (((f1_TNE-f1_BSW)+(f1_TNW-f1_BSE)+(f1_TSW-f1_BNE)+(f1_TSE-f1_BNW)) + (((f1_TE-f1_BW)+(f1_TN-f1_BS))+((f1_TW-f1_BE)+(f1_TS-f1_BN))) + (f1_T-f1_B)) / (one + drho1); + //real vx1 = (((f1_TNE-f1_BSW)+(f1_BSE-f1_TNW)+(f1_BNE-f1_TSW)+(f1_TSE-f1_BNW)) + (((f1_NE-f1_SW)+(f1_TE-f1_BW))+((f1_SE-f1_NW)+(f1_BE-f1_TW))) + (f1_E-f1_W)) / (one + drho1); + //real vx2 = (((f1_TNE-f1_BSW)+(f1_TNW-f1_BSE)+(f1_BNE-f1_TSW)+(f1_BNW-f1_TSE)) + (((f1_NE-f1_SW)+(f1_TN-f1_BS))+((f1_BN-f1_TS)+(f1_NW-f1_SE))) + (f1_N-f1_S)) / (one + drho1); + //real vx3 = (((f1_TNE-f1_BSW)+(f1_TNW-f1_BSE)+(f1_TSW-f1_BNE)+(f1_TSE-f1_BNW)) + (((f1_TE-f1_BW)+(f1_TN-f1_BS))+((f1_TW-f1_BE)+(f1_TS-f1_BN))) + (f1_T-f1_B)) / (one + drho1); // ////////////////////////////////////////////////////////////////////////// - ////real omega = om1; + ////real omega = om1; // real cusq = c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); // ////////////////////////////////////////////////////////////////////////// - ////T�st MK - ////if(vx1 < zero) vx1 = zero; + ////T�st MK + ////if(vx1 < zero) vx1 = zero; // ////////////////////////////////////////////////////////////////////////// - ////becomes higher with neighbor source and lower with local source + ////becomes higher with neighbor source and lower with local source // //real fZERO = c8over27* (rhoBC[k]-(one + rhoBC[k])*(cusq)) ; // //real fE = c2over27* (rhoBC[k]+(one + rhoBC[k])*(three*( vx1 )+c9over2*( vx1 )*( vx1 )-cusq)); // //real fW = c2over27* (rhoBC[k]+(one + rhoBC[k])*(three*(-vx1 )+c9over2*(-vx1 )*(-vx1 )-cusq)); @@ -3961,7 +3794,7 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, // //real fBSE = c1over216* (rhoBC[k]+(one + rhoBC[k])*(three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cusq)); // //real fTNW = c1over216* (rhoBC[k]+(one + rhoBC[k])*(three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cusq)); // ////////////////////////////////////////////////////////////////////////// - //// based on VirtualFluids (kucher + fard) + //// based on VirtualFluids (kucher + fard) // real fZERO = c8over27 * rhoBC[k] * (one - cusq); // real fE = c2over27 * rhoBC[k] * (one + three * ( vx1 ) + c9over2 * ( vx1 ) * ( vx1 ) - cusq); // real fW = c2over27 * rhoBC[k] * (one + three * (-vx1 ) + c9over2 * (-vx1 ) * (-vx1 ) - cusq); @@ -3990,7 +3823,7 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, // real fBSE = c1over216 * rhoBC[k] * (one + three * ( vx1-vx2-vx3) + c9over2 * ( vx1-vx2-vx3) * ( vx1-vx2-vx3) - cusq); // real fTNW = c1over216 * rhoBC[k] * (one + three * (-vx1+vx2+vx3) + c9over2 * (-vx1+vx2+vx3) * (-vx1+vx2+vx3) - cusq); //// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //////test + //////test //// real fZERO = c8over27 * ((drho1 + rhoBC[k]) / two) * (one - cusq); //// real fE = c2over27 * ((drho1 + rhoBC[k]) / two) * (one + three * ( vx1 ) + c9over2 * ( vx1 ) * ( vx1 ) - cusq); //// real fW = c2over27 * ((drho1 + rhoBC[k]) / two) * (one + three * (-vx1 ) + c9over2 * (-vx1 ) * (-vx1 ) - cusq); @@ -4019,190 +3852,190 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, //// real fBSE = c1over216 * ((drho1 + rhoBC[k]) / two) * (one + three * ( vx1-vx2-vx3) + c9over2 * ( vx1-vx2-vx3) * ( vx1-vx2-vx3) - cusq); //// real fTNW = c1over216 * ((drho1 + rhoBC[k]) / two) * (one + three * (-vx1+vx2+vx3) + c9over2 * (-vx1+vx2+vx3) * (-vx1+vx2+vx3) - cusq); - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // based on BGK Plus Comp - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //double mfabb = (D.f[DIR_P00 ])[k1e ]; - //double mfcbb = (D.f[DIR_M00 ])[k1w ]; - //double mfbab = (D.f[DIR_0P0 ])[k1n ]; - //double mfbcb = (D.f[DIR_0M0 ])[k1s ]; - //double mfbba = (D.f[DIR_00P ])[k1t ]; - //double mfbbc = (D.f[DIR_00M ])[k1b ]; - //double mfaab = (D.f[DIR_PP0 ])[k1ne ]; - //double mfccb = (D.f[DIR_MM0 ])[k1sw ]; - //double mfacb = (D.f[DIR_PM0 ])[k1se ]; - //double mfcab = (D.f[DIR_MP0 ])[k1nw ]; - //double mfaba = (D.f[DIR_P0P ])[k1te ]; - //double mfcbc = (D.f[DIR_M0M ])[k1bw ]; - //double mfabc = (D.f[DIR_P0M ])[k1be ]; - //double mfcba = (D.f[DIR_M0P ])[k1tw ]; - //double mfbaa = (D.f[DIR_0PP ])[k1tn ]; - //double mfbcc = (D.f[DIR_0MM ])[k1bs ]; - //double mfbac = (D.f[DIR_0PM ])[k1bn ]; - //double mfbca = (D.f[DIR_0MP ])[k1ts ]; - //double mfbbb = (D.f[DIR_000])[k1zero]; - //double mfaaa = (D.f[DIR_PPP ])[k1tne ]; - //double mfcca = (D.f[DIR_MMP ])[k1tsw ]; - //double mfaca = (D.f[DIR_PMP ])[k1tse ]; - //double mfcaa = (D.f[DIR_MPP ])[k1tnw ]; - //double mfaac = (D.f[DIR_PPM ])[k1bne ]; - //double mfccc = (D.f[DIR_MMM ])[k1bsw ]; - //double mfacc = (D.f[DIR_PMM ])[k1bse ]; - //double mfcac = (D.f[DIR_MPM ])[k1bnw ]; - real mfabb = (D.f[DIR_P00 ])[k1e ]; - real mfcbb = (D.f[DIR_M00 ])[k1w ]; - real mfbab = (D.f[DIR_0P0 ])[k1n ]; - real mfbcb = (D.f[DIR_0M0 ])[k1s ]; - real mfbba = (D.f[DIR_00P ])[k1t ]; - real mfbbc = (D.f[DIR_00M ])[k1b ]; - real mfaab = (D.f[DIR_PP0 ])[k1ne ]; - real mfccb = (D.f[DIR_MM0 ])[k1sw ]; - real mfacb = (D.f[DIR_PM0 ])[k1se ]; - real mfcab = (D.f[DIR_MP0 ])[k1nw ]; - real mfaba = (D.f[DIR_P0P ])[k1te ]; - real mfcbc = (D.f[DIR_M0M ])[k1bw ]; - real mfabc = (D.f[DIR_P0M ])[k1be ]; - real mfcba = (D.f[DIR_M0P ])[k1tw ]; - real mfbaa = (D.f[DIR_0PP ])[k1tn ]; - real mfbcc = (D.f[DIR_0MM ])[k1bs ]; - real mfbac = (D.f[DIR_0PM ])[k1bn ]; - real mfbca = (D.f[DIR_0MP ])[k1ts ]; - real mfbbb = (D.f[DIR_000])[k1zero]; - real mfaaa = (D.f[DIR_PPP ])[k1tne ]; - real mfcca = (D.f[DIR_MMP ])[k1tsw ]; - real mfaca = (D.f[DIR_PMP ])[k1tse ]; - real mfcaa = (D.f[DIR_MPP ])[k1tnw ]; - real mfaac = (D.f[DIR_PPM ])[k1bne ]; - real mfccc = (D.f[DIR_MMM ])[k1bsw ]; - real mfacc = (D.f[DIR_PMM ])[k1bse ]; - real mfcac = (D.f[DIR_MPM ])[k1bnw ]; - - //real mfcbb = (D.f[DIR_P00 ])[ke ]; - //real mfabb = (D.f[DIR_M00 ])[kw ]; - //real mfbcb = (D.f[DIR_0P0 ])[kn ]; - //real mfbab = (D.f[DIR_0M0 ])[ks ]; - //real mfbbc = (D.f[DIR_00P ])[kt ]; - //real mfbba = (D.f[DIR_00M ])[kb ]; - //real mfccb = (D.f[DIR_PP0 ])[kne ]; - //real mfaab = (D.f[DIR_MM0 ])[ksw ]; - //real mfcab = (D.f[DIR_PM0 ])[kse ]; - //real mfacb = (D.f[DIR_MP0 ])[knw ]; - //real mfcbc = (D.f[DIR_P0P ])[kte ]; - //real mfaba = (D.f[DIR_M0M ])[kbw ]; - //real mfcba = (D.f[DIR_P0M ])[kbe ]; - //real mfabc = (D.f[DIR_M0P ])[ktw ]; - //real mfbcc = (D.f[DIR_0PP ])[ktn ]; - //real mfbaa = (D.f[DIR_0MM ])[kbs ]; - //real mfbca = (D.f[DIR_0PM ])[kbn ]; - //real mfbac = (D.f[DIR_0MP ])[kts ]; - //real mfbbb = (D.f[DIR_000])[kzero]; - //real mfccc = (D.f[DIR_PPP ])[ktne ]; - //real mfaac = (D.f[DIR_MMP ])[ktsw ]; - //real mfcac = (D.f[DIR_PMP ])[ktse ]; - //real mfacc = (D.f[DIR_MPP ])[ktnw ]; - //real mfcca = (D.f[DIR_PPM ])[kbne ]; - //real mfaaa = (D.f[DIR_MMM ])[kbsw ]; - //real mfcaa = (D.f[DIR_PMM ])[kbse ]; - //real mfaca = (D.f[DIR_MPM ])[kbnw ]; - //////////////////////////////////////////////////////////////////////////////////// - //real rho = (((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + - // (((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) + - // ((mfabb+mfcbb) + (mfbab+mfbcb)) + (mfbba+mfbbc)) + mfbbb) + one;//!!!!Achtung + one - //////////////////////////////////////////////////////////////////////////////////// - real rho = rhoBC[k]; - //////////////////////////////////////////////////////////////////////////////////// - real OoRho = c1o1 / (rho * 1.5f); - //////////////////////////////////////////////////////////////////////////////////// - real vvx = ((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfcaa-mfacc) + (mfcca-mfaac))) + - (((mfcba-mfabc) + (mfcbc-mfaba)) + ((mfcab-mfacb) + (mfccb-mfaab))) + - (mfcbb-mfabb)) * OoRho; - real vvy =((((mfccc-mfaaa) + (mfaca-mfcac)) + ((mfacc-mfcaa) + (mfcca-mfaac))) + - (((mfbca-mfbac) + (mfbcc-mfbaa)) + ((mfacb-mfcab) + (mfccb-mfaab))) + - (mfbcb-mfbab)) * OoRho; - real vvz =((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfacc-mfcaa) + (mfaac-mfcca))) + - (((mfbac-mfbca) + (mfbcc-mfbaa)) + ((mfabc-mfcba) + (mfcbc-mfaba))) + - (mfbbc-mfbba)) * OoRho; - ///////////////////////// - //Test Values - //double vvx = 0.016; - //double vvy = zero; - //double vvz = zero; - //////////////////////////////////////////////////////////////////////////////////////// - ////round off error test - //if(vvx!=zero){ - // (kDistTest.f[DIR_P00 ])[k] = mfabb; - // (kDistTest.f[DIR_M00 ])[k] = mfcbb; - // (kDistTest.f[DIR_0P0 ])[k] = mfbab; - // (kDistTest.f[DIR_0M0 ])[k] = mfbcb; - // (kDistTest.f[DIR_00P ])[k] = mfbba; - // (kDistTest.f[DIR_00M ])[k] = mfbbc; - // (kDistTest.f[DIR_PP0 ])[k] = mfaab; - // (kDistTest.f[DIR_MM0 ])[k] = mfccb; - // (kDistTest.f[DIR_PM0 ])[k] = mfacb; - // (kDistTest.f[DIR_MP0 ])[k] = mfcab; - // (kDistTest.f[DIR_P0P ])[k] = mfaba; - // (kDistTest.f[DIR_M0M ])[k] = mfcbc; - // (kDistTest.f[DIR_P0M ])[k] = mfabc; - // (kDistTest.f[DIR_M0P ])[k] = mfcba; - // (kDistTest.f[DIR_0PP ])[k] = mfbaa; - // (kDistTest.f[DIR_0MM ])[k] = mfbcc; - // (kDistTest.f[DIR_0PM ])[k] = mfbac; - // (kDistTest.f[DIR_0MP ])[k] = mfbca; - // (kDistTest.f[DIR_000])[k] = KQK; - // (kDistTest.f[DIR_PPP ])[k] = mfaaa; - // (kDistTest.f[DIR_MMP ])[k] = mfcca; - // (kDistTest.f[DIR_PMP ])[k] = mfaca; - // (kDistTest.f[DIR_MPP ])[k] = mfcaa; - // (kDistTest.f[DIR_PPM ])[k] = mfaac; - // (kDistTest.f[DIR_MMM ])[k] = mfccc; - // (kDistTest.f[DIR_PMM ])[k] = mfacc; - // (kDistTest.f[DIR_MPM ])[k] = mfcac; - //}else{ - // (kDistTest.f[DIR_P00 ])[k] = zero; - // (kDistTest.f[DIR_M00 ])[k] = zero; - // (kDistTest.f[DIR_0P0 ])[k] = zero; - // (kDistTest.f[DIR_0M0 ])[k] = zero; - // (kDistTest.f[DIR_00P ])[k] = zero; - // (kDistTest.f[DIR_00M ])[k] = zero; - // (kDistTest.f[DIR_PP0 ])[k] = zero; - // (kDistTest.f[DIR_MM0 ])[k] = zero; - // (kDistTest.f[DIR_PM0 ])[k] = zero; - // (kDistTest.f[DIR_MP0 ])[k] = zero; - // (kDistTest.f[DIR_P0P ])[k] = zero; - // (kDistTest.f[DIR_M0M ])[k] = zero; - // (kDistTest.f[DIR_P0M ])[k] = zero; - // (kDistTest.f[DIR_M0P ])[k] = zero; - // (kDistTest.f[DIR_0PP ])[k] = zero; - // (kDistTest.f[DIR_0MM ])[k] = zero; - // (kDistTest.f[DIR_0PM ])[k] = zero; - // (kDistTest.f[DIR_0MP ])[k] = zero; - // (kDistTest.f[DIR_000])[k] = zero; - // (kDistTest.f[DIR_PPP ])[k] = zero; - // (kDistTest.f[DIR_MMP ])[k] = zero; - // (kDistTest.f[DIR_PMP ])[k] = zero; - // (kDistTest.f[DIR_MPP ])[k] = zero; - // (kDistTest.f[DIR_PPM ])[k] = zero; - // (kDistTest.f[DIR_MMM ])[k] = zero; - // (kDistTest.f[DIR_PMM ])[k] = zero; - // (kDistTest.f[DIR_MPM ])[k] = zero; - //} - - ////////////////////////////////////////////////////////////////////////////////////// - //// first bad fix for negative x velocity - ////if(vvx > zero) vvx = zero; - ////////////////////////////////////////////////////////////////////////////////////// - ////// second bad fix for negative x velocity - ////if(vvx > zero){ - //// vvx = -vvx; - //// vvy = -vvy; - //// vvz = -vvz; - ////} - //////////////////////////////////////////////////////////////////////////////////// - double vx2 = vvx * vvx; - double vy2 = vvy * vvy; - double vz2 = vvz * vvz; - ////////////////////////////////////////////////////////////////////////////////// - //original + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //double mfabb = (D.f[DIR_P00 ])[k1e ]; + //double mfcbb = (D.f[DIR_M00 ])[k1w ]; + //double mfbab = (D.f[DIR_0P0 ])[k1n ]; + //double mfbcb = (D.f[DIR_0M0 ])[k1s ]; + //double mfbba = (D.f[DIR_00P ])[k1t ]; + //double mfbbc = (D.f[DIR_00M ])[k1b ]; + //double mfaab = (D.f[DIR_PP0 ])[k1ne ]; + //double mfccb = (D.f[DIR_MM0 ])[k1sw ]; + //double mfacb = (D.f[DIR_PM0 ])[k1se ]; + //double mfcab = (D.f[DIR_MP0 ])[k1nw ]; + //double mfaba = (D.f[DIR_P0P ])[k1te ]; + //double mfcbc = (D.f[DIR_M0M ])[k1bw ]; + //double mfabc = (D.f[DIR_P0M ])[k1be ]; + //double mfcba = (D.f[DIR_M0P ])[k1tw ]; + //double mfbaa = (D.f[DIR_0PP ])[k1tn ]; + //double mfbcc = (D.f[DIR_0MM ])[k1bs ]; + //double mfbac = (D.f[DIR_0PM ])[k1bn ]; + //double mfbca = (D.f[DIR_0MP ])[k1ts ]; + //double mfbbb = (D.f[DIR_000])[k1zero]; + //double mfaaa = (D.f[DIR_PPP ])[k1tne ]; + //double mfcca = (D.f[DIR_MMP ])[k1tsw ]; + //double mfaca = (D.f[DIR_PMP ])[k1tse ]; + //double mfcaa = (D.f[DIR_MPP ])[k1tnw ]; + //double mfaac = (D.f[DIR_PPM ])[k1bne ]; + //double mfccc = (D.f[DIR_MMM ])[k1bsw ]; + //double mfacc = (D.f[DIR_PMM ])[k1bse ]; + //double mfcac = (D.f[DIR_MPM ])[k1bnw ]; + real mfabb = (D.f[DIR_P00 ])[k1e ]; + real mfcbb = (D.f[DIR_M00 ])[k1w ]; + real mfbab = (D.f[DIR_0P0 ])[k1n ]; + real mfbcb = (D.f[DIR_0M0 ])[k1s ]; + real mfbba = (D.f[DIR_00P ])[k1t ]; + real mfbbc = (D.f[DIR_00M ])[k1b ]; + real mfaab = (D.f[DIR_PP0 ])[k1ne ]; + real mfccb = (D.f[DIR_MM0 ])[k1sw ]; + real mfacb = (D.f[DIR_PM0 ])[k1se ]; + real mfcab = (D.f[DIR_MP0 ])[k1nw ]; + real mfaba = (D.f[DIR_P0P ])[k1te ]; + real mfcbc = (D.f[DIR_M0M ])[k1bw ]; + real mfabc = (D.f[DIR_P0M ])[k1be ]; + real mfcba = (D.f[DIR_M0P ])[k1tw ]; + real mfbaa = (D.f[DIR_0PP ])[k1tn ]; + real mfbcc = (D.f[DIR_0MM ])[k1bs ]; + real mfbac = (D.f[DIR_0PM ])[k1bn ]; + real mfbca = (D.f[DIR_0MP ])[k1ts ]; + real mfbbb = (D.f[DIR_000])[k1zero]; + real mfaaa = (D.f[DIR_PPP ])[k1tne ]; + real mfcca = (D.f[DIR_MMP ])[k1tsw ]; + real mfaca = (D.f[DIR_PMP ])[k1tse ]; + real mfcaa = (D.f[DIR_MPP ])[k1tnw ]; + real mfaac = (D.f[DIR_PPM ])[k1bne ]; + real mfccc = (D.f[DIR_MMM ])[k1bsw ]; + real mfacc = (D.f[DIR_PMM ])[k1bse ]; + real mfcac = (D.f[DIR_MPM ])[k1bnw ]; + + //real mfcbb = (D.f[DIR_P00 ])[ke ]; + //real mfabb = (D.f[DIR_M00 ])[kw ]; + //real mfbcb = (D.f[DIR_0P0 ])[kn ]; + //real mfbab = (D.f[DIR_0M0 ])[ks ]; + //real mfbbc = (D.f[DIR_00P ])[kt ]; + //real mfbba = (D.f[DIR_00M ])[kb ]; + //real mfccb = (D.f[DIR_PP0 ])[kne ]; + //real mfaab = (D.f[DIR_MM0 ])[ksw ]; + //real mfcab = (D.f[DIR_PM0 ])[kse ]; + //real mfacb = (D.f[DIR_MP0 ])[knw ]; + //real mfcbc = (D.f[DIR_P0P ])[kte ]; + //real mfaba = (D.f[DIR_M0M ])[kbw ]; + //real mfcba = (D.f[DIR_P0M ])[kbe ]; + //real mfabc = (D.f[DIR_M0P ])[ktw ]; + //real mfbcc = (D.f[DIR_0PP ])[ktn ]; + //real mfbaa = (D.f[DIR_0MM ])[kbs ]; + //real mfbca = (D.f[DIR_0PM ])[kbn ]; + //real mfbac = (D.f[DIR_0MP ])[kts ]; + //real mfbbb = (D.f[DIR_000])[kzero]; + //real mfccc = (D.f[DIR_PPP ])[ktne ]; + //real mfaac = (D.f[DIR_MMP ])[ktsw ]; + //real mfcac = (D.f[DIR_PMP ])[ktse ]; + //real mfacc = (D.f[DIR_MPP ])[ktnw ]; + //real mfcca = (D.f[DIR_PPM ])[kbne ]; + //real mfaaa = (D.f[DIR_MMM ])[kbsw ]; + //real mfcaa = (D.f[DIR_PMM ])[kbse ]; + //real mfaca = (D.f[DIR_MPM ])[kbnw ]; + //////////////////////////////////////////////////////////////////////////////////// + //real rho = (((((mfccc+mfaaa) + (mfaca+mfcac)) + ((mfacc+mfcaa) + (mfaac+mfcca))) + + // (((mfbac+mfbca) + (mfbaa+mfbcc)) + ((mfabc+mfcba) + (mfaba+mfcbc)) + ((mfacb+mfcab) + (mfaab+mfccb))) + + // ((mfabb+mfcbb) + (mfbab+mfbcb)) + (mfbba+mfbbc)) + mfbbb) + one;//!!!!Achtung + one + //////////////////////////////////////////////////////////////////////////////////// + real rho = rhoBC[k]; + //////////////////////////////////////////////////////////////////////////////////// + real OoRho = c1o1 / (rho * 1.5f); + //////////////////////////////////////////////////////////////////////////////////// + real vvx = ((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfcaa-mfacc) + (mfcca-mfaac))) + + (((mfcba-mfabc) + (mfcbc-mfaba)) + ((mfcab-mfacb) + (mfccb-mfaab))) + + (mfcbb-mfabb)) * OoRho; + real vvy =((((mfccc-mfaaa) + (mfaca-mfcac)) + ((mfacc-mfcaa) + (mfcca-mfaac))) + + (((mfbca-mfbac) + (mfbcc-mfbaa)) + ((mfacb-mfcab) + (mfccb-mfaab))) + + (mfbcb-mfbab)) * OoRho; + real vvz =((((mfccc-mfaaa) + (mfcac-mfaca)) + ((mfacc-mfcaa) + (mfaac-mfcca))) + + (((mfbac-mfbca) + (mfbcc-mfbaa)) + ((mfabc-mfcba) + (mfcbc-mfaba))) + + (mfbbc-mfbba)) * OoRho; + ///////////////////////// + //Test Values + //double vvx = 0.016; + //double vvy = zero; + //double vvz = zero; + //////////////////////////////////////////////////////////////////////////////////////// + ////round off error test + //if(vvx!=zero){ + // (kDistTest.f[DIR_P00 ])[k] = mfabb; + // (kDistTest.f[DIR_M00 ])[k] = mfcbb; + // (kDistTest.f[DIR_0P0 ])[k] = mfbab; + // (kDistTest.f[DIR_0M0 ])[k] = mfbcb; + // (kDistTest.f[DIR_00P ])[k] = mfbba; + // (kDistTest.f[DIR_00M ])[k] = mfbbc; + // (kDistTest.f[DIR_PP0 ])[k] = mfaab; + // (kDistTest.f[DIR_MM0 ])[k] = mfccb; + // (kDistTest.f[DIR_PM0 ])[k] = mfacb; + // (kDistTest.f[DIR_MP0 ])[k] = mfcab; + // (kDistTest.f[DIR_P0P ])[k] = mfaba; + // (kDistTest.f[DIR_M0M ])[k] = mfcbc; + // (kDistTest.f[DIR_P0M ])[k] = mfabc; + // (kDistTest.f[DIR_M0P ])[k] = mfcba; + // (kDistTest.f[DIR_0PP ])[k] = mfbaa; + // (kDistTest.f[DIR_0MM ])[k] = mfbcc; + // (kDistTest.f[DIR_0PM ])[k] = mfbac; + // (kDistTest.f[DIR_0MP ])[k] = mfbca; + // (kDistTest.f[DIR_000])[k] = KQK; + // (kDistTest.f[DIR_PPP ])[k] = mfaaa; + // (kDistTest.f[DIR_MMP ])[k] = mfcca; + // (kDistTest.f[DIR_PMP ])[k] = mfaca; + // (kDistTest.f[DIR_MPP ])[k] = mfcaa; + // (kDistTest.f[DIR_PPM ])[k] = mfaac; + // (kDistTest.f[DIR_MMM ])[k] = mfccc; + // (kDistTest.f[DIR_PMM ])[k] = mfacc; + // (kDistTest.f[DIR_MPM ])[k] = mfcac; + //}else{ + // (kDistTest.f[DIR_P00 ])[k] = zero; + // (kDistTest.f[DIR_M00 ])[k] = zero; + // (kDistTest.f[DIR_0P0 ])[k] = zero; + // (kDistTest.f[DIR_0M0 ])[k] = zero; + // (kDistTest.f[DIR_00P ])[k] = zero; + // (kDistTest.f[DIR_00M ])[k] = zero; + // (kDistTest.f[DIR_PP0 ])[k] = zero; + // (kDistTest.f[DIR_MM0 ])[k] = zero; + // (kDistTest.f[DIR_PM0 ])[k] = zero; + // (kDistTest.f[DIR_MP0 ])[k] = zero; + // (kDistTest.f[DIR_P0P ])[k] = zero; + // (kDistTest.f[DIR_M0M ])[k] = zero; + // (kDistTest.f[DIR_P0M ])[k] = zero; + // (kDistTest.f[DIR_M0P ])[k] = zero; + // (kDistTest.f[DIR_0PP ])[k] = zero; + // (kDistTest.f[DIR_0MM ])[k] = zero; + // (kDistTest.f[DIR_0PM ])[k] = zero; + // (kDistTest.f[DIR_0MP ])[k] = zero; + // (kDistTest.f[DIR_000])[k] = zero; + // (kDistTest.f[DIR_PPP ])[k] = zero; + // (kDistTest.f[DIR_MMP ])[k] = zero; + // (kDistTest.f[DIR_PMP ])[k] = zero; + // (kDistTest.f[DIR_MPP ])[k] = zero; + // (kDistTest.f[DIR_PPM ])[k] = zero; + // (kDistTest.f[DIR_MMM ])[k] = zero; + // (kDistTest.f[DIR_PMM ])[k] = zero; + // (kDistTest.f[DIR_MPM ])[k] = zero; + //} + + ////////////////////////////////////////////////////////////////////////////////////// + //// first bad fix for negative x velocity + ////if(vvx > zero) vvx = zero; + ////////////////////////////////////////////////////////////////////////////////////// + ////// second bad fix for negative x velocity + ////if(vvx > zero){ + //// vvx = -vvx; + //// vvy = -vvy; + //// vvz = -vvz; + ////} + //////////////////////////////////////////////////////////////////////////////////// + double vx2 = vvx * vvx; + double vy2 = vvy * vvy; + double vz2 = vvz * vvz; + ////////////////////////////////////////////////////////////////////////////////// + //original real XXb = -c2o3 + vx2; real XXc = -c1o2 * (XXb + c1o1 + vvx); real XXa = XXc + vvx; @@ -4212,66 +4045,66 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, real ZZb = -c2o3 + vz2; real ZZc = -c1o2 * (ZZb + c1o1 + vvz); real ZZa = ZZc + vvz; - ////////////////////////////////////////////////////////////////////////////////// - //unkonditioniert - mfcbb = -(rhoBC[k] + c1o1) * XXc * YYb * ZZb - c2o27; - mfabb = -(rhoBC[k] + c1o1) * XXa * YYb * ZZb - c2o27; - mfbcb = -(rhoBC[k] + c1o1) * XXb * YYc * ZZb - c2o27; - mfbab = -(rhoBC[k] + c1o1) * XXb * YYa * ZZb - c2o27; - mfbbc = -(rhoBC[k] + c1o1) * XXb * YYb * ZZc - c2o27; - mfbba = -(rhoBC[k] + c1o1) * XXb * YYb * ZZa - c2o27; - mfccb = -(rhoBC[k] + c1o1) * XXc * YYc * ZZb - c1o54; - mfaab = -(rhoBC[k] + c1o1) * XXa * YYa * ZZb - c1o54; - mfcab = -(rhoBC[k] + c1o1) * XXc * YYa * ZZb - c1o54; - mfacb = -(rhoBC[k] + c1o1) * XXa * YYc * ZZb - c1o54; - mfcbc = -(rhoBC[k] + c1o1) * XXc * YYb * ZZc - c1o54; - mfaba = -(rhoBC[k] + c1o1) * XXa * YYb * ZZa - c1o54; - mfcba = -(rhoBC[k] + c1o1) * XXc * YYb * ZZa - c1o54; - mfabc = -(rhoBC[k] + c1o1) * XXa * YYb * ZZc - c1o54; - mfbcc = -(rhoBC[k] + c1o1) * XXb * YYc * ZZc - c1o54; - mfbaa = -(rhoBC[k] + c1o1) * XXb * YYa * ZZa - c1o54; - mfbca = -(rhoBC[k] + c1o1) * XXb * YYc * ZZa - c1o54; - mfbac = -(rhoBC[k] + c1o1) * XXb * YYa * ZZc - c1o54; - mfbbb = -(rhoBC[k] + c1o1) * XXb * YYb * ZZb - c8o27; - mfccc = -(rhoBC[k] + c1o1) * XXc * YYc * ZZc - c1o216; - mfaac = -(rhoBC[k] + c1o1) * XXa * YYa * ZZc - c1o216; - mfcac = -(rhoBC[k] + c1o1) * XXc * YYa * ZZc - c1o216; - mfacc = -(rhoBC[k] + c1o1) * XXa * YYc * ZZc - c1o216; - mfcca = -(rhoBC[k] + c1o1) * XXc * YYc * ZZa - c1o216; - mfaaa = -(rhoBC[k] + c1o1) * XXa * YYa * ZZa - c1o216; - mfcaa = -(rhoBC[k] + c1o1) * XXc * YYa * ZZa - c1o216; - mfaca = -(rhoBC[k] + c1o1) * XXa * YYc * ZZa - c1o216; - ////////////////////////////////////////////////////////// - ////konditioniert - //double OneOver216RhoPlusOne = c1over216*(rhoBC[k]+one); - //double OnoOver216Rho = c1over216*rhoBC[k]; - //mfcbb = OnoOver216Rho*sixteen + OneOver216RhoPlusOne*twelve*(-(two*vy2) - two*vz2 + three*vy2*vz2 + vvx*(-two + three*vy2)*(-two + three*vz2) + vx2*(-two + three*vy2)*(-two + three*vz2)); - //mfabb = OnoOver216Rho*sixteen - OneOver216RhoPlusOne*twelve*(two*vy2 + two*vz2 - three*vy2*vz2 + vvx*(-two + three*vy2)*(-two + three*vz2) + vx2*(-four + six*vy2 + six*vz2 - nine*vy2*vz2)); - //mfbcb = four*(-(four*OneOver216RhoPlusOne) + four*OnoOver216Rho + OneOver216RhoPlusOne*(-two + three*vx2)*(one + three*vvy + three*vy2)*(-two + three*vz2)); - //mfbab = four*(four*OnoOver216Rho - OneOver216RhoPlusOne*three*(vvy*(-two + three*vx2)*(-two + three*vz2) - one*vx2*(one + three*vy2)*(-two + three*vz2) + two*(-(two*vy2) + vz2 + three*vy2*vz2))); - //mfbbc = four*(-(four*OneOver216RhoPlusOne) + four*OnoOver216Rho + OneOver216RhoPlusOne*(-two + three*vx2)*(-two + three*vy2)*(one + three*vvz + three*vz2)); - //mfbba = four*(four*OnoOver216Rho - OneOver216RhoPlusOne*three*(vvz*(-two + three*vx2)*(-two + three*vy2) - one*vx2*(-two + three*vy2)*(one + three*vz2) + two*(vy2 - two*vz2 + three*vy2*vz2))); - //mfccb = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) - two*vy2 - six*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(one + three*vvy + three*vy2)*(-two + three*vz2)))); - //mfaab = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) - two*vy2 - six*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-two + three*vz2)))); - //mfcab = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 + two*vy2 + six*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-two + three*vz2))); - //mfacb = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 + two*vy2 + six*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(one + three*vvy + three*vy2)*(-two + three*vz2))); - //mfcbc = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) + vy2 + three*vx2*vy2 + vvz*(one + three*vx2)*(-two + three*vy2) - two*vz2 - six*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(one + three*vvz + three*vz2)))); - //mfaba = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) + vy2 + three*vx2*vy2 - one*vvz*(one + three*vx2)*(-two + three*vy2) - two*vz2 - six*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(-one + three*vvz - three*vz2)))); - //mfcba = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 - one*vy2 - three*vx2*vy2 + vvz*(one + three*vx2)*(-two + three*vy2) + two*vz2 + six*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(-one + three*vvz - three*vz2))); - //mfabc = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 - one*vy2 - three*vx2*vy2 - one*vvz*(one + three*vx2)*(-two + three*vy2) + two*vz2 + six*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(one + three*vvz + three*vz2))); - //mfbcc = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(vx2 - two*vy2 + three*vx2*vy2 + vvz*(-two + three*vx2)*(one + three*vy2) - two*vz2 + three*vx2*vz2 - six*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(one + three*vvz + three*vz2)))); - //mfbaa = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(vx2 - two*vy2 + three*vx2*vy2 - one*vvz*(-two + three*vx2)*(one + three*vy2) - two*vz2 + three*vx2*vz2 - six*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(-one + three*vvz - three*vz2)))); - //mfbca = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(-(one*vx2) + two*vy2 - three*vx2*vy2 + vvz*(-two + three*vx2)*(one + three*vy2) + two*vz2 - three*vx2*vz2 + six*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(-one + three*vvz - three*vz2))); - //mfbac = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(-(one*vx2) + two*vy2 - three*vx2*vy2 - one*vvz*(-two + three*vx2)*(one + three*vy2) + two*vz2 - three*vx2*vz2 + six*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(one + three*vvz + three*vz2))); - //mfbbb = eight*(eight*OnoOver216Rho + OneOver216RhoPlusOne*three*(four*vy2 + four*vz2 - six*vy2*vz2 + vx2*(-two + three*vy2)*(-two + three*vz2))); - //mfccc = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(one + three*vvz + three*vz2) + vvx*(one + three*vvy + three*vy2)*(one + three*vvz + three*vz2)); - //mfaac = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(one + three*vvz + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(one + three*vvz + three*vz2)); - //mfcac = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(one + three*vvz + three*vz2) - one*vvx*(-one + three*vvy - three*vy2)*(one + three*vvz + three*vz2)); - //mfacc = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(one + three*vvz + three*vz2) - one*vvx*(one + three*vvy + three*vy2)*(one + three*vvz + three*vz2)); - //mfcca = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) - one*vvx*(one + three*vvy + three*vy2)*(-one + three*vvz - three*vz2)); - //mfaaa = OnoOver216Rho - OneOver216RhoPlusOne*three*(vvz - one*vx2 + three*vvz*vx2 - one*vy2 + three*vvz*vy2 - three*vx2*vy2 + nine*vvz*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-one + three*vvz - three*vz2)); - //mfcaa = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-one + three*vvz - three*vz2)); - //mfaca = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(one + three*vvy + three*vy2)*(-one + three*vvz - three*vz2)); + ////////////////////////////////////////////////////////////////////////////////// + //unkonditioniert + mfcbb = -(rhoBC[k] + c1o1) * XXc * YYb * ZZb - c2o27; + mfabb = -(rhoBC[k] + c1o1) * XXa * YYb * ZZb - c2o27; + mfbcb = -(rhoBC[k] + c1o1) * XXb * YYc * ZZb - c2o27; + mfbab = -(rhoBC[k] + c1o1) * XXb * YYa * ZZb - c2o27; + mfbbc = -(rhoBC[k] + c1o1) * XXb * YYb * ZZc - c2o27; + mfbba = -(rhoBC[k] + c1o1) * XXb * YYb * ZZa - c2o27; + mfccb = -(rhoBC[k] + c1o1) * XXc * YYc * ZZb - c1o54; + mfaab = -(rhoBC[k] + c1o1) * XXa * YYa * ZZb - c1o54; + mfcab = -(rhoBC[k] + c1o1) * XXc * YYa * ZZb - c1o54; + mfacb = -(rhoBC[k] + c1o1) * XXa * YYc * ZZb - c1o54; + mfcbc = -(rhoBC[k] + c1o1) * XXc * YYb * ZZc - c1o54; + mfaba = -(rhoBC[k] + c1o1) * XXa * YYb * ZZa - c1o54; + mfcba = -(rhoBC[k] + c1o1) * XXc * YYb * ZZa - c1o54; + mfabc = -(rhoBC[k] + c1o1) * XXa * YYb * ZZc - c1o54; + mfbcc = -(rhoBC[k] + c1o1) * XXb * YYc * ZZc - c1o54; + mfbaa = -(rhoBC[k] + c1o1) * XXb * YYa * ZZa - c1o54; + mfbca = -(rhoBC[k] + c1o1) * XXb * YYc * ZZa - c1o54; + mfbac = -(rhoBC[k] + c1o1) * XXb * YYa * ZZc - c1o54; + mfbbb = -(rhoBC[k] + c1o1) * XXb * YYb * ZZb - c8o27; + mfccc = -(rhoBC[k] + c1o1) * XXc * YYc * ZZc - c1o216; + mfaac = -(rhoBC[k] + c1o1) * XXa * YYa * ZZc - c1o216; + mfcac = -(rhoBC[k] + c1o1) * XXc * YYa * ZZc - c1o216; + mfacc = -(rhoBC[k] + c1o1) * XXa * YYc * ZZc - c1o216; + mfcca = -(rhoBC[k] + c1o1) * XXc * YYc * ZZa - c1o216; + mfaaa = -(rhoBC[k] + c1o1) * XXa * YYa * ZZa - c1o216; + mfcaa = -(rhoBC[k] + c1o1) * XXc * YYa * ZZa - c1o216; + mfaca = -(rhoBC[k] + c1o1) * XXa * YYc * ZZa - c1o216; + ////////////////////////////////////////////////////////// + ////konditioniert + //double OneOver216RhoPlusOne = c1over216*(rhoBC[k]+one); + //double OnoOver216Rho = c1over216*rhoBC[k]; + //mfcbb = OnoOver216Rho*sixteen + OneOver216RhoPlusOne*twelve*(-(two*vy2) - two*vz2 + three*vy2*vz2 + vvx*(-two + three*vy2)*(-two + three*vz2) + vx2*(-two + three*vy2)*(-two + three*vz2)); + //mfabb = OnoOver216Rho*sixteen - OneOver216RhoPlusOne*twelve*(two*vy2 + two*vz2 - three*vy2*vz2 + vvx*(-two + three*vy2)*(-two + three*vz2) + vx2*(-four + six*vy2 + six*vz2 - nine*vy2*vz2)); + //mfbcb = four*(-(four*OneOver216RhoPlusOne) + four*OnoOver216Rho + OneOver216RhoPlusOne*(-two + three*vx2)*(one + three*vvy + three*vy2)*(-two + three*vz2)); + //mfbab = four*(four*OnoOver216Rho - OneOver216RhoPlusOne*three*(vvy*(-two + three*vx2)*(-two + three*vz2) - one*vx2*(one + three*vy2)*(-two + three*vz2) + two*(-(two*vy2) + vz2 + three*vy2*vz2))); + //mfbbc = four*(-(four*OneOver216RhoPlusOne) + four*OnoOver216Rho + OneOver216RhoPlusOne*(-two + three*vx2)*(-two + three*vy2)*(one + three*vvz + three*vz2)); + //mfbba = four*(four*OnoOver216Rho - OneOver216RhoPlusOne*three*(vvz*(-two + three*vx2)*(-two + three*vy2) - one*vx2*(-two + three*vy2)*(one + three*vz2) + two*(vy2 - two*vz2 + three*vy2*vz2))); + //mfccb = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) - two*vy2 - six*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(one + three*vvy + three*vy2)*(-two + three*vz2)))); + //mfaab = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) - two*vy2 - six*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-two + three*vz2)))); + //mfcab = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 + two*vy2 + six*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-two + three*vz2))); + //mfacb = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 + two*vy2 + six*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-two + three*vz2) + vvx*(one + three*vvy + three*vy2)*(-two + three*vz2))); + //mfcbc = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) + vy2 + three*vx2*vy2 + vvz*(one + three*vx2)*(-two + three*vy2) - two*vz2 - six*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(one + three*vvz + three*vz2)))); + //mfaba = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(-(two*vx2) + vy2 + three*vx2*vy2 - one*vvz*(one + three*vx2)*(-two + three*vy2) - two*vz2 - six*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(-one + three*vvz - three*vz2)))); + //mfcba = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 - one*vy2 - three*vx2*vy2 + vvz*(one + three*vx2)*(-two + three*vy2) + two*vz2 + six*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(-one + three*vvz - three*vz2))); + //mfabc = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(two*vx2 - one*vy2 - three*vx2*vy2 - one*vvz*(one + three*vx2)*(-two + three*vy2) + two*vz2 + six*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 + vvx*(-two + three*vy2)*(one + three*vvz + three*vz2))); + //mfbcc = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(vx2 - two*vy2 + three*vx2*vy2 + vvz*(-two + three*vx2)*(one + three*vy2) - two*vz2 + three*vx2*vz2 - six*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(one + three*vvz + three*vz2)))); + //mfbaa = -(two*(-(OnoOver216Rho*two) + OneOver216RhoPlusOne*three*(vx2 - two*vy2 + three*vx2*vy2 - one*vvz*(-two + three*vx2)*(one + three*vy2) - two*vz2 + three*vx2*vz2 - six*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(-one + three*vvz - three*vz2)))); + //mfbca = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(-(one*vx2) + two*vy2 - three*vx2*vy2 + vvz*(-two + three*vx2)*(one + three*vy2) + two*vz2 - three*vx2*vz2 + six*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(-one + three*vvz - three*vz2))); + //mfbac = two*(OnoOver216Rho*two + OneOver216RhoPlusOne*three*(-(one*vx2) + two*vy2 - three*vx2*vy2 - one*vvz*(-two + three*vx2)*(one + three*vy2) + two*vz2 - three*vx2*vz2 + six*vy2*vz2 - nine*vx2*vy2*vz2 + vvy*(-two + three*vx2)*(one + three*vvz + three*vz2))); + //mfbbb = eight*(eight*OnoOver216Rho + OneOver216RhoPlusOne*three*(four*vy2 + four*vz2 - six*vy2*vz2 + vx2*(-two + three*vy2)*(-two + three*vz2))); + //mfccc = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(one + three*vvz + three*vz2) + vvx*(one + three*vvy + three*vy2)*(one + three*vvz + three*vz2)); + //mfaac = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(one + three*vvz + three*vz2) + vvx*(-one + three*vvy - three*vy2)*(one + three*vvz + three*vz2)); + //mfcac = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(one + three*vvz + three*vz2) - one*vvx*(-one + three*vvy - three*vy2)*(one + three*vvz + three*vz2)); + //mfacc = OnoOver216Rho + OneOver216RhoPlusOne*three*(vvz + vx2 + three*vvz*vx2 + vy2 + three*vvz*vy2 + three*vx2*vy2 + nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(one + three*vvz + three*vz2) - one*vvx*(one + three*vvy + three*vy2)*(one + three*vvz + three*vz2)); + //mfcca = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) - one*vvx*(one + three*vvy + three*vy2)*(-one + three*vvz - three*vz2)); + //mfaaa = OnoOver216Rho - OneOver216RhoPlusOne*three*(vvz - one*vx2 + three*vvz*vx2 - one*vy2 + three*vvz*vy2 - three*vx2*vy2 + nine*vvz*vx2*vy2 - one*vz2 - three*vx2*vz2 - three*vy2*vz2 - nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-one + three*vvz - three*vz2)); + //mfcaa = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 + vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(-one + three*vvy - three*vy2)*(-one + three*vvz - three*vz2)); + //mfaca = OnoOver216Rho + OneOver216RhoPlusOne*three*(-(one*vvz) + vx2 - three*vvz*vx2 + vy2 - three*vvz*vy2 + three*vx2*vy2 - nine*vvz*vx2*vy2 + vz2 + three*vx2*vz2 + three*vy2*vz2 + nine*vx2*vy2*vz2 - one*vvy*(one + three*vx2)*(-one + three*vvz - three*vz2) + vvx*(one + three*vvy + three*vy2)*(-one + three*vvz - three*vz2)); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //if (isEvenTimestep==true) @@ -4303,7 +4136,7 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, // D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; // D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; // D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - //} + //} //else //{ // D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -4337,88 +4170,88 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //__syncthreads(); - (D.f[DIR_P00 ])[ke ] = mfabb;//mfcbb; - (D.f[DIR_M00 ])[kw ] = mfcbb;//mfabb; - (D.f[DIR_0P0 ])[kn ] = mfbab;//mfbcb; - (D.f[DIR_0M0 ])[ks ] = mfbcb;//mfbab; - (D.f[DIR_00P ])[kt ] = mfbba;//mfbbc; - (D.f[DIR_00M ])[kb ] = mfbbc;//mfbba; - (D.f[DIR_PP0 ])[kne ] = mfaab;//mfccb; - (D.f[DIR_MM0 ])[ksw ] = mfccb;//mfaab; - (D.f[DIR_PM0 ])[kse ] = mfacb;//mfcab; - (D.f[DIR_MP0 ])[knw ] = mfcab;//mfacb; - (D.f[DIR_P0P ])[kte ] = mfaba;//mfcbc; - (D.f[DIR_M0M ])[kbw ] = mfcbc;//mfaba; - (D.f[DIR_P0M ])[kbe ] = mfabc;//mfcba; - (D.f[DIR_M0P ])[ktw ] = mfcba;//mfabc; - (D.f[DIR_0PP ])[ktn ] = mfbaa;//mfbcc; - (D.f[DIR_0MM ])[kbs ] = mfbcc;//mfbaa; - (D.f[DIR_0PM ])[kbn ] = mfbac;//mfbca; - (D.f[DIR_0MP ])[kts ] = mfbca;//mfbac; - (D.f[DIR_000])[kzero] = mfbbb;//mfbbb; - (D.f[DIR_PPP ])[ktne ] = mfaaa;//mfccc; - (D.f[DIR_MMP ])[ktsw ] = mfcca;//mfaac; - (D.f[DIR_PMP ])[ktse ] = mfaca;//mfcac; - (D.f[DIR_MPP ])[ktnw ] = mfcaa;//mfacc; - (D.f[DIR_PPM ])[kbne ] = mfaac;//mfcca; - (D.f[DIR_MMM ])[kbsw ] = mfccc;//mfaaa; - (D.f[DIR_PMM ])[kbse ] = mfacc;//mfcaa; - (D.f[DIR_MPM ])[kbnw ] = mfcac;//mfaca; - //(D.f[DIR_P00 ])[ke ] = mfcbb; - //(D.f[DIR_M00 ])[kw ] = mfabb; - //(D.f[DIR_0P0 ])[kn ] = mfbcb; - //(D.f[DIR_0M0 ])[ks ] = mfbab; - //(D.f[DIR_00P ])[kt ] = mfbbc; - //(D.f[DIR_00M ])[kb ] = mfbba; - //(D.f[DIR_PP0 ])[kne ] = mfccb; - //(D.f[DIR_MM0 ])[ksw ] = mfaab; - //(D.f[DIR_PM0 ])[kse ] = mfcab; - //(D.f[DIR_MP0 ])[knw ] = mfacb; - //(D.f[DIR_P0P ])[kte ] = mfcbc; - //(D.f[DIR_M0M ])[kbw ] = mfaba; - //(D.f[DIR_P0M ])[kbe ] = mfcba; - //(D.f[DIR_M0P ])[ktw ] = mfabc; - //(D.f[DIR_0PP ])[ktn ] = mfbcc; - //(D.f[DIR_0MM ])[kbs ] = mfbaa; - //(D.f[DIR_0PM ])[kbn ] = mfbca; - //(D.f[DIR_0MP ])[kts ] = mfbac; - //(D.f[DIR_000])[kzero] = mfbbb; - //(D.f[DIR_PPP ])[ktne ] = mfccc; - //(D.f[DIR_MMP ])[ktsw ] = mfaac; - //(D.f[DIR_PMP ])[ktse ] = mfcac; - //(D.f[DIR_MPP ])[ktnw ] = mfacc; - //(D.f[DIR_PPM ])[kbne ] = mfcca; - //(D.f[DIR_MMM ])[kbsw ] = mfaaa; - //(D.f[DIR_PMM ])[kbse ] = mfcaa; - //(D.f[DIR_MPM ])[kbnw ] = mfaca; - - //(D.f[DIR_P00 ])[ke ] = fE ; //f1_E ; //fW; //fE ; - //(D.f[DIR_M00 ])[kw ] = fW ; //f1_W ; //fE; //fW ; - //(D.f[DIR_0P0 ])[kn ] = fN ; //f1_N ; //fS; //fN ; - //(D.f[DIR_0M0 ])[ks ] = fS ; //f1_S ; //fN; //fS ; - //(D.f[DIR_00P ])[kt ] = fT ; //f1_T ; //fB; //fT ; - //(D.f[DIR_00M ])[kb ] = fB ; //f1_B ; //fT; //fB ; - //(D.f[DIR_PP0 ])[kne ] = fNE; //f1_NE; //fSW; //fNE; - //(D.f[DIR_MM0 ])[ksw ] = fSW; //f1_SW; //fNE; //fSW; - //(D.f[DIR_PM0 ])[kse ] = fSE; //f1_SE; //fNW; //fSE; - //(D.f[DIR_MP0 ])[knw ] = fNW; //f1_NW; //fSE; //fNW; - //(D.f[DIR_P0P ])[kte ] = fTE; //f1_TE; //fBW; //fTE; - //(D.f[DIR_M0M ])[kbw ] = fBW; //f1_BW; //fTE; //fBW; - //(D.f[DIR_P0M ])[kbe ] = fBE; //f1_BE; //fTW; //fBE; - //(D.f[DIR_M0P ])[ktw ] = fTW; //f1_TW; //fBE; //fTW; - //(D.f[DIR_0PP ])[ktn ] = fTN; //f1_TN; //fBS; //fTN; - //(D.f[DIR_0MM ])[kbs ] = fBS; //f1_BS; //fTN; //fBS; - //(D.f[DIR_0PM ])[kbn ] = fBN; //f1_BN; //fTS; //fBN; - //(D.f[DIR_0MP ])[kts ] = fTS; //f1_TS; //fBN; //fTS; + (D.f[DIR_P00 ])[ke ] = mfabb;//mfcbb; + (D.f[DIR_M00 ])[kw ] = mfcbb;//mfabb; + (D.f[DIR_0P0 ])[kn ] = mfbab;//mfbcb; + (D.f[DIR_0M0 ])[ks ] = mfbcb;//mfbab; + (D.f[DIR_00P ])[kt ] = mfbba;//mfbbc; + (D.f[DIR_00M ])[kb ] = mfbbc;//mfbba; + (D.f[DIR_PP0 ])[kne ] = mfaab;//mfccb; + (D.f[DIR_MM0 ])[ksw ] = mfccb;//mfaab; + (D.f[DIR_PM0 ])[kse ] = mfacb;//mfcab; + (D.f[DIR_MP0 ])[knw ] = mfcab;//mfacb; + (D.f[DIR_P0P ])[kte ] = mfaba;//mfcbc; + (D.f[DIR_M0M ])[kbw ] = mfcbc;//mfaba; + (D.f[DIR_P0M ])[kbe ] = mfabc;//mfcba; + (D.f[DIR_M0P ])[ktw ] = mfcba;//mfabc; + (D.f[DIR_0PP ])[ktn ] = mfbaa;//mfbcc; + (D.f[DIR_0MM ])[kbs ] = mfbcc;//mfbaa; + (D.f[DIR_0PM ])[kbn ] = mfbac;//mfbca; + (D.f[DIR_0MP ])[kts ] = mfbca;//mfbac; + (D.f[DIR_000])[kzero] = mfbbb;//mfbbb; + (D.f[DIR_PPP ])[ktne ] = mfaaa;//mfccc; + (D.f[DIR_MMP ])[ktsw ] = mfcca;//mfaac; + (D.f[DIR_PMP ])[ktse ] = mfaca;//mfcac; + (D.f[DIR_MPP ])[ktnw ] = mfcaa;//mfacc; + (D.f[DIR_PPM ])[kbne ] = mfaac;//mfcca; + (D.f[DIR_MMM ])[kbsw ] = mfccc;//mfaaa; + (D.f[DIR_PMM ])[kbse ] = mfacc;//mfcaa; + (D.f[DIR_MPM ])[kbnw ] = mfcac;//mfaca; + //(D.f[DIR_P00 ])[ke ] = mfcbb; + //(D.f[DIR_M00 ])[kw ] = mfabb; + //(D.f[DIR_0P0 ])[kn ] = mfbcb; + //(D.f[DIR_0M0 ])[ks ] = mfbab; + //(D.f[DIR_00P ])[kt ] = mfbbc; + //(D.f[DIR_00M ])[kb ] = mfbba; + //(D.f[DIR_PP0 ])[kne ] = mfccb; + //(D.f[DIR_MM0 ])[ksw ] = mfaab; + //(D.f[DIR_PM0 ])[kse ] = mfcab; + //(D.f[DIR_MP0 ])[knw ] = mfacb; + //(D.f[DIR_P0P ])[kte ] = mfcbc; + //(D.f[DIR_M0M ])[kbw ] = mfaba; + //(D.f[DIR_P0M ])[kbe ] = mfcba; + //(D.f[DIR_M0P ])[ktw ] = mfabc; + //(D.f[DIR_0PP ])[ktn ] = mfbcc; + //(D.f[DIR_0MM ])[kbs ] = mfbaa; + //(D.f[DIR_0PM ])[kbn ] = mfbca; + //(D.f[DIR_0MP ])[kts ] = mfbac; + //(D.f[DIR_000])[kzero] = mfbbb; + //(D.f[DIR_PPP ])[ktne ] = mfccc; + //(D.f[DIR_MMP ])[ktsw ] = mfaac; + //(D.f[DIR_PMP ])[ktse ] = mfcac; + //(D.f[DIR_MPP ])[ktnw ] = mfacc; + //(D.f[DIR_PPM ])[kbne ] = mfcca; + //(D.f[DIR_MMM ])[kbsw ] = mfaaa; + //(D.f[DIR_PMM ])[kbse ] = mfcaa; + //(D.f[DIR_MPM ])[kbnw ] = mfaca; + + //(D.f[DIR_P00 ])[ke ] = fE ; //f1_E ; //fW; //fE ; + //(D.f[DIR_M00 ])[kw ] = fW ; //f1_W ; //fE; //fW ; + //(D.f[DIR_0P0 ])[kn ] = fN ; //f1_N ; //fS; //fN ; + //(D.f[DIR_0M0 ])[ks ] = fS ; //f1_S ; //fN; //fS ; + //(D.f[DIR_00P ])[kt ] = fT ; //f1_T ; //fB; //fT ; + //(D.f[DIR_00M ])[kb ] = fB ; //f1_B ; //fT; //fB ; + //(D.f[DIR_PP0 ])[kne ] = fNE; //f1_NE; //fSW; //fNE; + //(D.f[DIR_MM0 ])[ksw ] = fSW; //f1_SW; //fNE; //fSW; + //(D.f[DIR_PM0 ])[kse ] = fSE; //f1_SE; //fNW; //fSE; + //(D.f[DIR_MP0 ])[knw ] = fNW; //f1_NW; //fSE; //fNW; + //(D.f[DIR_P0P ])[kte ] = fTE; //f1_TE; //fBW; //fTE; + //(D.f[DIR_M0M ])[kbw ] = fBW; //f1_BW; //fTE; //fBW; + //(D.f[DIR_P0M ])[kbe ] = fBE; //f1_BE; //fTW; //fBE; + //(D.f[DIR_M0P ])[ktw ] = fTW; //f1_TW; //fBE; //fTW; + //(D.f[DIR_0PP ])[ktn ] = fTN; //f1_TN; //fBS; //fTN; + //(D.f[DIR_0MM ])[kbs ] = fBS; //f1_BS; //fTN; //fBS; + //(D.f[DIR_0PM ])[kbn ] = fBN; //f1_BN; //fTS; //fBN; + //(D.f[DIR_0MP ])[kts ] = fTS; //f1_TS; //fBN; //fTS; //(D.f[DIR_000])[kzero] = fZERO;//f1_ZERO; //fZERO; //fZERO; - //(D.f[DIR_PPP ])[ktne ] = fTNE; //f1_TNE; //fBSW; //fTNE; - //(D.f[DIR_MMM ])[kbsw ] = fBSW; //f1_BSW; //fTNE; //fBSW; - //(D.f[DIR_PPM ])[kbne ] = fBNE; //f1_BNE; //fTSW; //fBNE; - //(D.f[DIR_MMP ])[ktsw ] = fTSW; //f1_TSW; //fBNE; //fTSW; - //(D.f[DIR_PMP ])[ktse ] = fTSE; //f1_TSE; //fBNW; //fTSE; - //(D.f[DIR_MPM ])[kbnw ] = fBNW; //f1_BNW; //fTSE; //fBNW; - //(D.f[DIR_PMM ])[kbse ] = fBSE; //f1_BSE; //fTNW; //fBSE; - //(D.f[DIR_MPP ])[ktnw ] = fTNW; //f1_TNW; //fBSE; //fTNW; + //(D.f[DIR_PPP ])[ktne ] = fTNE; //f1_TNE; //fBSW; //fTNE; + //(D.f[DIR_MMM ])[kbsw ] = fBSW; //f1_BSW; //fTNE; //fBSW; + //(D.f[DIR_PPM ])[kbne ] = fBNE; //f1_BNE; //fTSW; //fBNE; + //(D.f[DIR_MMP ])[ktsw ] = fTSW; //f1_TSW; //fBNE; //fTSW; + //(D.f[DIR_PMP ])[ktse ] = fTSE; //f1_TSE; //fBNW; //fTSE; + //(D.f[DIR_MPM ])[kbnw ] = fBNW; //f1_BNW; //fTSE; //fBNW; + //(D.f[DIR_PMM ])[kbse ] = fBSE; //f1_BSE; //fTNW; //fBSE; + //(D.f[DIR_MPP ])[ktnw ] = fTNW; //f1_TNW; //fBSE; //fTNW; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -4462,19 +4295,19 @@ __global__ void QPressDeviceEQZ27(real* rhoBC, //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -__global__ void QPressDeviceZero27( real* DD, - int* k_Q, - unsigned int numberOfBCnodes, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) +__global__ void QPressDeviceZero27( real* DD, + int* k_Q, + unsigned int numberOfBCnodes, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -4545,7 +4378,7 @@ __global__ void QPressDeviceZero27( real* DD, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -4578,7 +4411,7 @@ __global__ void QPressDeviceZero27( real* DD, } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //__syncthreads(); - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// (D.f[DIR_P00 ])[ke ] =c0o1; (D.f[DIR_M00 ])[kw ] =c0o1; (D.f[DIR_0P0 ])[kn ] =c0o1; @@ -4650,21 +4483,21 @@ __global__ void QPressDeviceZero27( real* DD, //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void QPressDeviceFake27( real* rhoBC, - real* DD, - int* k_Q, - int* k_N, - int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* k_Q, + int* k_N, + int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index const unsigned nx = blockDim.x; const unsigned ny = gridDim.x; @@ -4765,7 +4598,7 @@ __global__ void QPressDeviceFake27( real* rhoBC, D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } + } else { D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; @@ -4832,24 +4665,24 @@ __global__ void QPressDeviceFake27( real* rhoBC, real vx1, vx2, vx3; vx1 = ((f1_TSE - f1_BNW) - (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) + ((f1_BE - f1_TW) + (f1_TE - f1_BW)) + ((f1_SE - f1_NW) + (f1_NE - f1_SW)) + - (f1_E - f1_W); + (f1_E - f1_W); vx2 = (-(f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) - (f1_TSW - f1_BNE)) + ((f1_BN - f1_TS) + (f1_TN - f1_BS)) + (-(f1_SE - f1_NW) + (f1_NE - f1_SW)) + - (f1_N - f1_S); + (f1_N - f1_S); vx3 = ((f1_TSE - f1_BNW) + (f1_TNW - f1_BSE)) + ((f1_TNE - f1_BSW) + (f1_TSW - f1_BNE)) + (-(f1_BN - f1_TS) + (f1_TN - f1_BS)) + ((f1_TE - f1_BW) - (f1_BE - f1_TW)) + - (f1_T - f1_B); + (f1_T - f1_B); real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); ////////////////////////////////////////////////////////////////////////// real drho1 = f1_ZERO+f1_E+f1_W+f1_N+f1_S+f1_T+f1_B+f1_NE+f1_SW+f1_SE+f1_NW+f1_TE+f1_BW+f1_BE+f1_TW+f1_TN+f1_BS+f1_BN+f1_TS+ f1_TNE+f1_TSW+f1_TSE+f1_TNW+f1_BNE+f1_BSW+f1_BSE+f1_BNW; - //drho1 = (drho1 + rhoBC[k])/2.f; - drho1 = drho1 - rhoBC[k]; + //drho1 = (drho1 + rhoBC[k])/2.f; + drho1 = drho1 - rhoBC[k]; __syncthreads(); @@ -4879,7 +4712,7 @@ __global__ void QPressDeviceFake27( real* rhoBC, (D.f[DIR_PPM ])[kbne ] = f1_TSW -c1o216*drho1; // c1o100; // zero; // (D.f[DIR_MMM ])[kbsw ] = f1_TNE -c1o216*drho1; // c1o100; // zero; // (D.f[DIR_PMM ])[kbse ] = f1_TNW -c1o216*drho1; // c1o100; // zero; // - (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1; // c1o100; // zero; // + (D.f[DIR_MPM ])[kbnw ] = f1_TSE -c1o216*drho1; // c1o100; // zero; // } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -4924,460 +4757,460 @@ __global__ void QPressDeviceFake27( real* rhoBC, ////////////////////////////////////////////////////////////////////////// __global__ void QPressDevice27_IntBB(real* rho, - real* DD, - int* k_Q, - real* QQ, - unsigned int numberOfBCnodes, - real om1, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int size_Mat, - bool isEvenTimestep) + real* DD, + int* k_Q, + real* QQ, + unsigned int numberOfBCnodes, + real om1, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + unsigned int size_Mat, + bool isEvenTimestep) { - Distributions27 D; - if (isEvenTimestep==true) - { - D.f[DIR_P00 ] = &DD[DIR_P00 *size_Mat]; - D.f[DIR_M00 ] = &DD[DIR_M00 *size_Mat]; - D.f[DIR_0P0 ] = &DD[DIR_0P0 *size_Mat]; - D.f[DIR_0M0 ] = &DD[DIR_0M0 *size_Mat]; - D.f[DIR_00P ] = &DD[DIR_00P *size_Mat]; - D.f[DIR_00M ] = &DD[DIR_00M *size_Mat]; - D.f[DIR_PP0 ] = &DD[DIR_PP0 *size_Mat]; - D.f[DIR_MM0 ] = &DD[DIR_MM0 *size_Mat]; - D.f[DIR_PM0 ] = &DD[DIR_PM0 *size_Mat]; - D.f[DIR_MP0 ] = &DD[DIR_MP0 *size_Mat]; - D.f[DIR_P0P ] = &DD[DIR_P0P *size_Mat]; - D.f[DIR_M0M ] = &DD[DIR_M0M *size_Mat]; - D.f[DIR_P0M ] = &DD[DIR_P0M *size_Mat]; - D.f[DIR_M0P ] = &DD[DIR_M0P *size_Mat]; - D.f[DIR_0PP ] = &DD[DIR_0PP *size_Mat]; - D.f[DIR_0MM ] = &DD[DIR_0MM *size_Mat]; - D.f[DIR_0PM ] = &DD[DIR_0PM *size_Mat]; - D.f[DIR_0MP ] = &DD[DIR_0MP *size_Mat]; - D.f[DIR_000] = &DD[DIR_000*size_Mat]; - D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat]; - D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat]; - D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat]; - D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat]; - D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat]; - D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; - D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; - D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } - else - { - D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; - D.f[DIR_P00 ] = &DD[DIR_M00 *size_Mat]; - D.f[DIR_0M0 ] = &DD[DIR_0P0 *size_Mat]; - D.f[DIR_0P0 ] = &DD[DIR_0M0 *size_Mat]; - D.f[DIR_00M ] = &DD[DIR_00P *size_Mat]; - D.f[DIR_00P ] = &DD[DIR_00M *size_Mat]; - D.f[DIR_MM0 ] = &DD[DIR_PP0 *size_Mat]; - D.f[DIR_PP0 ] = &DD[DIR_MM0 *size_Mat]; - D.f[DIR_MP0 ] = &DD[DIR_PM0 *size_Mat]; - D.f[DIR_PM0 ] = &DD[DIR_MP0 *size_Mat]; - D.f[DIR_M0M ] = &DD[DIR_P0P *size_Mat]; - D.f[DIR_P0P ] = &DD[DIR_M0M *size_Mat]; - D.f[DIR_M0P ] = &DD[DIR_P0M *size_Mat]; - D.f[DIR_P0M ] = &DD[DIR_M0P *size_Mat]; - D.f[DIR_0MM ] = &DD[DIR_0PP *size_Mat]; - D.f[DIR_0PP ] = &DD[DIR_0MM *size_Mat]; - D.f[DIR_0MP ] = &DD[DIR_0PM *size_Mat]; - D.f[DIR_0PM ] = &DD[DIR_0MP *size_Mat]; - D.f[DIR_000] = &DD[DIR_000*size_Mat]; - D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat]; - D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat]; - D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat]; - D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat]; - D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat]; - D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat]; - D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat]; - D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat]; - } - //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index - - const unsigned nx = blockDim.x; - const unsigned ny = gridDim.x; - - const unsigned k = nx*(ny*z + y) + x; - ////////////////////////////////////////////////////////////////////////// - - if(k < numberOfBCnodes) - { - //////////////////////////////////////////////////////////////////////////////// - //real VeloX = vx[k]; - //real VeloY = vy[k]; - //real VeloZ = vz[k]; //(16.0*(u0*2.0)*bbx*bby*(grid_nx-bbx)*(grid_ny-bby))/(grid_nx*grid_nx*grid_ny*grid_ny) - //////////////////////////////////////////////////////////////////////////////// - real *q_dirE, *q_dirW, *q_dirN, *q_dirS, *q_dirT, *q_dirB, - *q_dirNE, *q_dirSW, *q_dirSE, *q_dirNW, *q_dirTE, *q_dirBW, - *q_dirBE, *q_dirTW, *q_dirTN, *q_dirBS, *q_dirBN, *q_dirTS, - *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW, - *q_dirBSE, *q_dirBNW; - q_dirE = &QQ[DIR_P00 * numberOfBCnodes]; - q_dirW = &QQ[DIR_M00 * numberOfBCnodes]; - q_dirN = &QQ[DIR_0P0 * numberOfBCnodes]; - q_dirS = &QQ[DIR_0M0 * numberOfBCnodes]; - q_dirT = &QQ[DIR_00P * numberOfBCnodes]; - q_dirB = &QQ[DIR_00M * numberOfBCnodes]; - q_dirNE = &QQ[DIR_PP0 * numberOfBCnodes]; - q_dirSW = &QQ[DIR_MM0 * numberOfBCnodes]; - q_dirSE = &QQ[DIR_PM0 * numberOfBCnodes]; - q_dirNW = &QQ[DIR_MP0 * numberOfBCnodes]; - q_dirTE = &QQ[DIR_P0P * numberOfBCnodes]; - q_dirBW = &QQ[DIR_M0M * numberOfBCnodes]; - q_dirBE = &QQ[DIR_P0M * numberOfBCnodes]; - q_dirTW = &QQ[DIR_M0P * numberOfBCnodes]; - q_dirTN = &QQ[DIR_0PP * numberOfBCnodes]; - q_dirBS = &QQ[DIR_0MM * numberOfBCnodes]; - q_dirBN = &QQ[DIR_0PM * numberOfBCnodes]; - q_dirTS = &QQ[DIR_0MP * numberOfBCnodes]; - q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes]; - q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes]; - q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes]; - q_dirTNW = &QQ[DIR_MPP * numberOfBCnodes]; - q_dirBNE = &QQ[DIR_PPM * numberOfBCnodes]; - q_dirBSW = &QQ[DIR_MMM * numberOfBCnodes]; - q_dirBSE = &QQ[DIR_PMM * numberOfBCnodes]; - q_dirBNW = &QQ[DIR_MPM * numberOfBCnodes]; - //////////////////////////////////////////////////////////////////////////////// - //index - unsigned int KQK = k_Q[k]; - unsigned int kzero= KQK; - unsigned int ke = KQK; - unsigned int kw = neighborX[KQK]; - unsigned int kn = KQK; - unsigned int ks = neighborY[KQK]; - unsigned int kt = KQK; - unsigned int kb = neighborZ[KQK]; - unsigned int ksw = neighborY[kw]; - unsigned int kne = KQK; - unsigned int kse = ks; - unsigned int knw = kw; - unsigned int kbw = neighborZ[kw]; - unsigned int kte = KQK; - unsigned int kbe = kb; - unsigned int ktw = kw; - unsigned int kbs = neighborZ[ks]; - unsigned int ktn = KQK; - unsigned int kbn = kb; - unsigned int kts = ks; - unsigned int ktse = ks; - unsigned int kbnw = kbw; - unsigned int ktnw = kw; - unsigned int kbse = kbs; - unsigned int ktsw = ksw; - unsigned int kbne = kb; - unsigned int ktne = KQK; - unsigned int kbsw = neighborZ[ksw]; - //////////////////////////////////////////////////////////////////////////////// - real f_E, f_W, f_N, f_S, f_T, f_B, f_NE, f_SW, f_SE, f_NW, f_TE, f_BW, f_BE, - f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW; - - f_W = (D.f[DIR_P00 ])[ke ]; - f_E = (D.f[DIR_M00 ])[kw ]; - f_S = (D.f[DIR_0P0 ])[kn ]; - f_N = (D.f[DIR_0M0 ])[ks ]; - f_B = (D.f[DIR_00P ])[kt ]; - f_T = (D.f[DIR_00M ])[kb ]; - f_SW = (D.f[DIR_PP0 ])[kne ]; - f_NE = (D.f[DIR_MM0 ])[ksw ]; - f_NW = (D.f[DIR_PM0 ])[kse ]; - f_SE = (D.f[DIR_MP0 ])[knw ]; - f_BW = (D.f[DIR_P0P ])[kte ]; - f_TE = (D.f[DIR_M0M ])[kbw ]; - f_TW = (D.f[DIR_P0M ])[kbe ]; - f_BE = (D.f[DIR_M0P ])[ktw ]; - f_BS = (D.f[DIR_0PP ])[ktn ]; - f_TN = (D.f[DIR_0MM ])[kbs ]; - f_TS = (D.f[DIR_0PM ])[kbn ]; - f_BN = (D.f[DIR_0MP ])[kts ]; - f_BSW = (D.f[DIR_PPP ])[ktne ]; - f_BNE = (D.f[DIR_MMP ])[ktsw ]; - f_BNW = (D.f[DIR_PMP ])[ktse ]; - f_BSE = (D.f[DIR_MPP ])[ktnw ]; - f_TSW = (D.f[DIR_PPM ])[kbne ]; - f_TNE = (D.f[DIR_MMM ])[kbsw ]; - f_TNW = (D.f[DIR_PMM ])[kbse ]; - f_TSE = (D.f[DIR_MPM ])[kbnw ]; - //////////////////////////////////////////////////////////////////////////////// - real vx1, vx2, vx3, drho, feq, q; - drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW + - f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + - f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[DIR_000])[kzero]); - - vx1 = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + - ((f_BE - f_TW) + (f_TE - f_BW)) + ((f_SE - f_NW) + (f_NE - f_SW)) + - (f_E - f_W))/(c1o1+drho); - - - vx2 = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + - ((f_BN - f_TS) + (f_TN - f_BS)) + (-(f_SE - f_NW) + (f_NE - f_SW)) + - (f_N - f_S))/(c1o1+drho); - - vx3 = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) + - (-(f_BN - f_TS) + (f_TN - f_BS)) + ((f_TE - f_BW) - (f_BE - f_TW)) + - (f_T - f_B))/(c1o1+drho); - - real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); - - ////////////////////////////////////////////////////////////////////////// - if (isEvenTimestep==false) - { - D.f[DIR_P00 ] = &DD[DIR_P00 *size_Mat]; - D.f[DIR_M00 ] = &DD[DIR_M00 *size_Mat]; - D.f[DIR_0P0 ] = &DD[DIR_0P0 *size_Mat]; - D.f[DIR_0M0 ] = &DD[DIR_0M0 *size_Mat]; - D.f[DIR_00P ] = &DD[DIR_00P *size_Mat]; - D.f[DIR_00M ] = &DD[DIR_00M *size_Mat]; - D.f[DIR_PP0 ] = &DD[DIR_PP0 *size_Mat]; - D.f[DIR_MM0 ] = &DD[DIR_MM0 *size_Mat]; - D.f[DIR_PM0 ] = &DD[DIR_PM0 *size_Mat]; - D.f[DIR_MP0 ] = &DD[DIR_MP0 *size_Mat]; - D.f[DIR_P0P ] = &DD[DIR_P0P *size_Mat]; - D.f[DIR_M0M ] = &DD[DIR_M0M *size_Mat]; - D.f[DIR_P0M ] = &DD[DIR_P0M *size_Mat]; - D.f[DIR_M0P ] = &DD[DIR_M0P *size_Mat]; - D.f[DIR_0PP ] = &DD[DIR_0PP *size_Mat]; - D.f[DIR_0MM ] = &DD[DIR_0MM *size_Mat]; - D.f[DIR_0PM ] = &DD[DIR_0PM *size_Mat]; - D.f[DIR_0MP ] = &DD[DIR_0MP *size_Mat]; - D.f[DIR_000] = &DD[DIR_000*size_Mat]; - D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat]; - D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat]; - D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat]; - D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat]; - D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat]; - D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; - D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; - D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; - } - else - { - D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; - D.f[DIR_P00 ] = &DD[DIR_M00 *size_Mat]; - D.f[DIR_0M0 ] = &DD[DIR_0P0 *size_Mat]; - D.f[DIR_0P0 ] = &DD[DIR_0M0 *size_Mat]; - D.f[DIR_00M ] = &DD[DIR_00P *size_Mat]; - D.f[DIR_00P ] = &DD[DIR_00M *size_Mat]; - D.f[DIR_MM0 ] = &DD[DIR_PP0 *size_Mat]; - D.f[DIR_PP0 ] = &DD[DIR_MM0 *size_Mat]; - D.f[DIR_MP0 ] = &DD[DIR_PM0 *size_Mat]; - D.f[DIR_PM0 ] = &DD[DIR_MP0 *size_Mat]; - D.f[DIR_M0M ] = &DD[DIR_P0P *size_Mat]; - D.f[DIR_P0P ] = &DD[DIR_M0M *size_Mat]; - D.f[DIR_M0P ] = &DD[DIR_P0M *size_Mat]; - D.f[DIR_P0M ] = &DD[DIR_M0P *size_Mat]; - D.f[DIR_0MM ] = &DD[DIR_0PP *size_Mat]; - D.f[DIR_0PP ] = &DD[DIR_0MM *size_Mat]; - D.f[DIR_0MP ] = &DD[DIR_0PM *size_Mat]; - D.f[DIR_0PM ] = &DD[DIR_0MP *size_Mat]; - D.f[DIR_000] = &DD[DIR_000*size_Mat]; - D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat]; - D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat]; - D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat]; - D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat]; - D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat]; - D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat]; - D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat]; - D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat]; - } - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //Test - //(D.f[DIR_000])[k]=c1o10; - real rhoDiff = drho - rho[k]; - real VeloX = vx1; - real VeloY = vx2; - real VeloZ = vx3; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - q = q_dirE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c2o27* (drho+c9o2*( vx1 )*( vx1 )-cu_sq); - (D.f[DIR_M00])[kw]=(c1o1-q)/(c1o1+q)*(f_E-f_W+(f_E+f_W-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_E+f_W)-c2o27*(rhoDiff + c6o1*( VeloX )))/(c1o1+q); - } - - q = q_dirW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c2o27* (drho+c9o2*(-vx1 )*(-vx1 )-cu_sq); - (D.f[DIR_P00])[ke]=(c1o1-q)/(c1o1+q)*(f_W-f_E+(f_W+f_E-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_W+f_E)-c2o27*(rhoDiff + c6o1*(-VeloX )))/(c1o1+q); - } - - q = q_dirN[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c2o27* (drho+c9o2*( vx2 )*( vx2 )-cu_sq); - (D.f[DIR_0M0])[ks]=(c1o1-q)/(c1o1+q)*(f_N-f_S+(f_N+f_S-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_N+f_S)-c2o27*(rhoDiff + c6o1*( VeloY )))/(c1o1+q); - } - - q = q_dirS[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c2o27* (drho+c9o2*( -vx2 )*( -vx2 )-cu_sq); - (D.f[DIR_0P0])[kn]=(c1o1-q)/(c1o1+q)*(f_S-f_N+(f_S+f_N-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_S+f_N)-c2o27*(rhoDiff + c6o1*(-VeloY )))/(c1o1+q); - } - - q = q_dirT[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c2o27* (drho+c9o2*( vx3)*( vx3)-cu_sq); - (D.f[DIR_00M])[kb]=(c1o1-q)/(c1o1+q)*(f_T-f_B+(f_T+f_B-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_T+f_B)-c2o27*(rhoDiff + c6o1*( VeloZ )))/(c1o1+q); - } - - q = q_dirB[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c2o27* (drho+c9o2*( -vx3)*( -vx3)-cu_sq); - (D.f[DIR_00P])[kt]=(c1o1-q)/(c1o1+q)*(f_B-f_T+(f_B+f_T-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_B+f_T)-c2o27*(rhoDiff + c6o1*(-VeloZ )))/(c1o1+q); - } - - q = q_dirNE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*( vx1+vx2 )*( vx1+vx2 )-cu_sq); - (D.f[DIR_MM0])[ksw]=(c1o1-q)/(c1o1+q)*(f_NE-f_SW+(f_NE+f_SW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NE+f_SW)-c1o54*(rhoDiff + c6o1*(VeloX+VeloY)))/(c1o1+q); - } - - q = q_dirSW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*(-vx1-vx2 )*(-vx1-vx2 )-cu_sq); - (D.f[DIR_PP0])[kne]=(c1o1-q)/(c1o1+q)*(f_SW-f_NE+(f_SW+f_NE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SW+f_NE)-c1o54*(rhoDiff + c6o1*(-VeloX-VeloY)))/(c1o1+q); - } - - q = q_dirSE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*( vx1-vx2 )*( vx1-vx2 )-cu_sq); - (D.f[DIR_MP0])[knw]=(c1o1-q)/(c1o1+q)*(f_SE-f_NW+(f_SE+f_NW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SE+f_NW)-c1o54*(rhoDiff + c6o1*( VeloX-VeloY)))/(c1o1+q); - } - - q = q_dirNW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*(-vx1+vx2 )*(-vx1+vx2 )-cu_sq); - (D.f[DIR_PM0])[kse]=(c1o1-q)/(c1o1+q)*(f_NW-f_SE+(f_NW+f_SE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NW+f_SE)-c1o54*(rhoDiff + c6o1*(-VeloX+VeloY)))/(c1o1+q); - } - - q = q_dirTE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*( vx1 +vx3)*( vx1 +vx3)-cu_sq); - (D.f[DIR_M0M])[kbw]=(c1o1-q)/(c1o1+q)*(f_TE-f_BW+(f_TE+f_BW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TE+f_BW)-c1o54*(rhoDiff + c6o1*( VeloX+VeloZ)))/(c1o1+q); - } - - q = q_dirBW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*(-vx1 -vx3)*(-vx1 -vx3)-cu_sq); - (D.f[DIR_P0P])[kte]=(c1o1-q)/(c1o1+q)*(f_BW-f_TE+(f_BW+f_TE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BW+f_TE)-c1o54*(rhoDiff + c6o1*(-VeloX-VeloZ)))/(c1o1+q); - } - - q = q_dirBE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*( vx1 -vx3)*( vx1 -vx3)-cu_sq); - (D.f[DIR_M0P])[ktw]=(c1o1-q)/(c1o1+q)*(f_BE-f_TW+(f_BE+f_TW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BE+f_TW)-c1o54*(rhoDiff + c6o1*( VeloX-VeloZ)))/(c1o1+q); - } - - q = q_dirTW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*(-vx1 +vx3)*(-vx1 +vx3)-cu_sq); - (D.f[DIR_P0M])[kbe]=(c1o1-q)/(c1o1+q)*(f_TW-f_BE+(f_TW+f_BE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TW+f_BE)-c1o54*(rhoDiff + c6o1*(-VeloX+VeloZ)))/(c1o1+q); - } - - q = q_dirTN[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); - (D.f[DIR_0MM])[kbs]=(c1o1-q)/(c1o1+q)*(f_TN-f_BS+(f_TN+f_BS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TN+f_BS)-c1o54*(rhoDiff + c6o1*( VeloY+VeloZ)))/(c1o1+q); - } - - q = q_dirBS[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*( -vx2-vx3)*( -vx2-vx3)-cu_sq); - (D.f[DIR_0PP])[ktn]=(c1o1-q)/(c1o1+q)*(f_BS-f_TN+(f_BS+f_TN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BS+f_TN)-c1o54*(rhoDiff + c6o1*( -VeloY-VeloZ)))/(c1o1+q); - } - - q = q_dirBN[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); - (D.f[DIR_0MP])[kts]=(c1o1-q)/(c1o1+q)*(f_BN-f_TS+(f_BN+f_TS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BN+f_TS)-c1o54*(rhoDiff + c6o1*( VeloY-VeloZ)))/(c1o1+q); - } - - q = q_dirTS[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o54* (drho+c9o2*( -vx2+vx3)*( -vx2+vx3)-cu_sq); - (D.f[DIR_0PM])[kbn]=(c1o1-q)/(c1o1+q)*(f_TS-f_BN+(f_TS+f_BN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TS+f_BN)-c1o54*(rhoDiff + c6o1*( -VeloY+VeloZ)))/(c1o1+q); - } - - q = q_dirTNE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o216*(drho+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); - (D.f[DIR_MMM])[kbsw]=(c1o1-q)/(c1o1+q)*(f_TNE-f_BSW+(f_TNE+f_BSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNE+f_BSW)-c1o216*(rhoDiff + c6o1*( VeloX+VeloY+VeloZ)))/(c1o1+q); - } - - q = q_dirBSW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o216*(drho+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); - (D.f[DIR_PPP])[ktne]=(c1o1-q)/(c1o1+q)*(f_BSW-f_TNE+(f_BSW+f_TNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSW+f_TNE)-c1o216*(rhoDiff + c6o1*(-VeloX-VeloY-VeloZ)))/(c1o1+q); - } - - q = q_dirBNE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o216*(drho+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); - (D.f[DIR_MMP])[ktsw]=(c1o1-q)/(c1o1+q)*(f_BNE-f_TSW+(f_BNE+f_TSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNE+f_TSW)-c1o216*(rhoDiff + c6o1*( VeloX+VeloY-VeloZ)))/(c1o1+q); - } - - q = q_dirTSW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o216*(drho+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); - (D.f[DIR_PPM])[kbne]=(c1o1-q)/(c1o1+q)*(f_TSW-f_BNE+(f_TSW+f_BNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSW+f_BNE)-c1o216*(rhoDiff + c6o1*(-VeloX-VeloY+VeloZ)))/(c1o1+q); - } - - q = q_dirTSE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o216*(drho+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); - (D.f[DIR_MPM])[kbnw]=(c1o1-q)/(c1o1+q)*(f_TSE-f_BNW+(f_TSE+f_BNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSE+f_BNW)-c1o216*(rhoDiff + c6o1*( VeloX-VeloY+VeloZ)))/(c1o1+q); - } - - q = q_dirBNW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o216*(drho+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); - (D.f[DIR_PMP])[ktse]=(c1o1-q)/(c1o1+q)*(f_BNW-f_TSE+(f_BNW+f_TSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNW+f_TSE)-c1o216*(rhoDiff + c6o1*(-VeloX+VeloY-VeloZ)))/(c1o1+q); - } - - q = q_dirBSE[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o216*(drho+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); - (D.f[DIR_MPP])[ktnw]=(c1o1-q)/(c1o1+q)*(f_BSE-f_TNW+(f_BSE+f_TNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSE+f_TNW)-c1o216*(rhoDiff + c6o1*( VeloX-VeloY-VeloZ)))/(c1o1+q); - } - - q = q_dirTNW[k]; - if (q>=c0o1 && q<=c1o1) - { - feq=c1o216*(drho+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); - (D.f[DIR_PMM])[kbse]=(c1o1-q)/(c1o1+q)*(f_TNW-f_BSE+(f_TNW+f_BSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNW+f_BSE)-c1o216*(rhoDiff + c6o1*(-VeloX+VeloY+VeloZ)))/(c1o1+q); - } - } + Distributions27 D; + if (isEvenTimestep==true) + { + D.f[DIR_P00 ] = &DD[DIR_P00 *size_Mat]; + D.f[DIR_M00 ] = &DD[DIR_M00 *size_Mat]; + D.f[DIR_0P0 ] = &DD[DIR_0P0 *size_Mat]; + D.f[DIR_0M0 ] = &DD[DIR_0M0 *size_Mat]; + D.f[DIR_00P ] = &DD[DIR_00P *size_Mat]; + D.f[DIR_00M ] = &DD[DIR_00M *size_Mat]; + D.f[DIR_PP0 ] = &DD[DIR_PP0 *size_Mat]; + D.f[DIR_MM0 ] = &DD[DIR_MM0 *size_Mat]; + D.f[DIR_PM0 ] = &DD[DIR_PM0 *size_Mat]; + D.f[DIR_MP0 ] = &DD[DIR_MP0 *size_Mat]; + D.f[DIR_P0P ] = &DD[DIR_P0P *size_Mat]; + D.f[DIR_M0M ] = &DD[DIR_M0M *size_Mat]; + D.f[DIR_P0M ] = &DD[DIR_P0M *size_Mat]; + D.f[DIR_M0P ] = &DD[DIR_M0P *size_Mat]; + D.f[DIR_0PP ] = &DD[DIR_0PP *size_Mat]; + D.f[DIR_0MM ] = &DD[DIR_0MM *size_Mat]; + D.f[DIR_0PM ] = &DD[DIR_0PM *size_Mat]; + D.f[DIR_0MP ] = &DD[DIR_0MP *size_Mat]; + D.f[DIR_000] = &DD[DIR_000*size_Mat]; + D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat]; + D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat]; + D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat]; + D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat]; + D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat]; + D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; + D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; + D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; + } + else + { + D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; + D.f[DIR_P00 ] = &DD[DIR_M00 *size_Mat]; + D.f[DIR_0M0 ] = &DD[DIR_0P0 *size_Mat]; + D.f[DIR_0P0 ] = &DD[DIR_0M0 *size_Mat]; + D.f[DIR_00M ] = &DD[DIR_00P *size_Mat]; + D.f[DIR_00P ] = &DD[DIR_00M *size_Mat]; + D.f[DIR_MM0 ] = &DD[DIR_PP0 *size_Mat]; + D.f[DIR_PP0 ] = &DD[DIR_MM0 *size_Mat]; + D.f[DIR_MP0 ] = &DD[DIR_PM0 *size_Mat]; + D.f[DIR_PM0 ] = &DD[DIR_MP0 *size_Mat]; + D.f[DIR_M0M ] = &DD[DIR_P0P *size_Mat]; + D.f[DIR_P0P ] = &DD[DIR_M0M *size_Mat]; + D.f[DIR_M0P ] = &DD[DIR_P0M *size_Mat]; + D.f[DIR_P0M ] = &DD[DIR_M0P *size_Mat]; + D.f[DIR_0MM ] = &DD[DIR_0PP *size_Mat]; + D.f[DIR_0PP ] = &DD[DIR_0MM *size_Mat]; + D.f[DIR_0MP ] = &DD[DIR_0PM *size_Mat]; + D.f[DIR_0PM ] = &DD[DIR_0MP *size_Mat]; + D.f[DIR_000] = &DD[DIR_000*size_Mat]; + D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat]; + D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat]; + D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat]; + D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat]; + D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat]; + D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat]; + D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat]; + D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat]; + } + //////////////////////////////////////////////////////////////////////////////// + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index + + const unsigned nx = blockDim.x; + const unsigned ny = gridDim.x; + + const unsigned k = nx*(ny*z + y) + x; + ////////////////////////////////////////////////////////////////////////// + + if(k < numberOfBCnodes) + { + //////////////////////////////////////////////////////////////////////////////// + //real VeloX = vx[k]; + //real VeloY = vy[k]; + //real VeloZ = vz[k]; //(16.0*(u0*2.0)*bbx*bby*(grid_nx-bbx)*(grid_ny-bby))/(grid_nx*grid_nx*grid_ny*grid_ny) + //////////////////////////////////////////////////////////////////////////////// + real *q_dirE, *q_dirW, *q_dirN, *q_dirS, *q_dirT, *q_dirB, + *q_dirNE, *q_dirSW, *q_dirSE, *q_dirNW, *q_dirTE, *q_dirBW, + *q_dirBE, *q_dirTW, *q_dirTN, *q_dirBS, *q_dirBN, *q_dirTS, + *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW, + *q_dirBSE, *q_dirBNW; + q_dirE = &QQ[DIR_P00 * numberOfBCnodes]; + q_dirW = &QQ[DIR_M00 * numberOfBCnodes]; + q_dirN = &QQ[DIR_0P0 * numberOfBCnodes]; + q_dirS = &QQ[DIR_0M0 * numberOfBCnodes]; + q_dirT = &QQ[DIR_00P * numberOfBCnodes]; + q_dirB = &QQ[DIR_00M * numberOfBCnodes]; + q_dirNE = &QQ[DIR_PP0 * numberOfBCnodes]; + q_dirSW = &QQ[DIR_MM0 * numberOfBCnodes]; + q_dirSE = &QQ[DIR_PM0 * numberOfBCnodes]; + q_dirNW = &QQ[DIR_MP0 * numberOfBCnodes]; + q_dirTE = &QQ[DIR_P0P * numberOfBCnodes]; + q_dirBW = &QQ[DIR_M0M * numberOfBCnodes]; + q_dirBE = &QQ[DIR_P0M * numberOfBCnodes]; + q_dirTW = &QQ[DIR_M0P * numberOfBCnodes]; + q_dirTN = &QQ[DIR_0PP * numberOfBCnodes]; + q_dirBS = &QQ[DIR_0MM * numberOfBCnodes]; + q_dirBN = &QQ[DIR_0PM * numberOfBCnodes]; + q_dirTS = &QQ[DIR_0MP * numberOfBCnodes]; + q_dirTNE = &QQ[DIR_PPP * numberOfBCnodes]; + q_dirTSW = &QQ[DIR_MMP * numberOfBCnodes]; + q_dirTSE = &QQ[DIR_PMP * numberOfBCnodes]; + q_dirTNW = &QQ[DIR_MPP * numberOfBCnodes]; + q_dirBNE = &QQ[DIR_PPM * numberOfBCnodes]; + q_dirBSW = &QQ[DIR_MMM * numberOfBCnodes]; + q_dirBSE = &QQ[DIR_PMM * numberOfBCnodes]; + q_dirBNW = &QQ[DIR_MPM * numberOfBCnodes]; + //////////////////////////////////////////////////////////////////////////////// + //index + unsigned int KQK = k_Q[k]; + unsigned int kzero= KQK; + unsigned int ke = KQK; + unsigned int kw = neighborX[KQK]; + unsigned int kn = KQK; + unsigned int ks = neighborY[KQK]; + unsigned int kt = KQK; + unsigned int kb = neighborZ[KQK]; + unsigned int ksw = neighborY[kw]; + unsigned int kne = KQK; + unsigned int kse = ks; + unsigned int knw = kw; + unsigned int kbw = neighborZ[kw]; + unsigned int kte = KQK; + unsigned int kbe = kb; + unsigned int ktw = kw; + unsigned int kbs = neighborZ[ks]; + unsigned int ktn = KQK; + unsigned int kbn = kb; + unsigned int kts = ks; + unsigned int ktse = ks; + unsigned int kbnw = kbw; + unsigned int ktnw = kw; + unsigned int kbse = kbs; + unsigned int ktsw = ksw; + unsigned int kbne = kb; + unsigned int ktne = KQK; + unsigned int kbsw = neighborZ[ksw]; + //////////////////////////////////////////////////////////////////////////////// + real f_E, f_W, f_N, f_S, f_T, f_B, f_NE, f_SW, f_SE, f_NW, f_TE, f_BW, f_BE, + f_TW, f_TN, f_BS, f_BN, f_TS, f_TNE, f_TSW, f_TSE, f_TNW, f_BNE, f_BSW, f_BSE, f_BNW; + + f_W = (D.f[DIR_P00 ])[ke ]; + f_E = (D.f[DIR_M00 ])[kw ]; + f_S = (D.f[DIR_0P0 ])[kn ]; + f_N = (D.f[DIR_0M0 ])[ks ]; + f_B = (D.f[DIR_00P ])[kt ]; + f_T = (D.f[DIR_00M ])[kb ]; + f_SW = (D.f[DIR_PP0 ])[kne ]; + f_NE = (D.f[DIR_MM0 ])[ksw ]; + f_NW = (D.f[DIR_PM0 ])[kse ]; + f_SE = (D.f[DIR_MP0 ])[knw ]; + f_BW = (D.f[DIR_P0P ])[kte ]; + f_TE = (D.f[DIR_M0M ])[kbw ]; + f_TW = (D.f[DIR_P0M ])[kbe ]; + f_BE = (D.f[DIR_M0P ])[ktw ]; + f_BS = (D.f[DIR_0PP ])[ktn ]; + f_TN = (D.f[DIR_0MM ])[kbs ]; + f_TS = (D.f[DIR_0PM ])[kbn ]; + f_BN = (D.f[DIR_0MP ])[kts ]; + f_BSW = (D.f[DIR_PPP ])[ktne ]; + f_BNE = (D.f[DIR_MMP ])[ktsw ]; + f_BNW = (D.f[DIR_PMP ])[ktse ]; + f_BSE = (D.f[DIR_MPP ])[ktnw ]; + f_TSW = (D.f[DIR_PPM ])[kbne ]; + f_TNE = (D.f[DIR_MMM ])[kbsw ]; + f_TNW = (D.f[DIR_PMM ])[kbse ]; + f_TSE = (D.f[DIR_MPM ])[kbnw ]; + //////////////////////////////////////////////////////////////////////////////// + real vx1, vx2, vx3, drho, feq, q; + drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW + + f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + + f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[DIR_000])[kzero]); + + vx1 = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + + ((f_BE - f_TW) + (f_TE - f_BW)) + ((f_SE - f_NW) + (f_NE - f_SW)) + + (f_E - f_W))/(c1o1+drho); + + + vx2 = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) + + ((f_BN - f_TS) + (f_TN - f_BS)) + (-(f_SE - f_NW) + (f_NE - f_SW)) + + (f_N - f_S))/(c1o1+drho); + + vx3 = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) + + (-(f_BN - f_TS) + (f_TN - f_BS)) + ((f_TE - f_BW) - (f_BE - f_TW)) + + (f_T - f_B))/(c1o1+drho); + + real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3); + + ////////////////////////////////////////////////////////////////////////// + if (isEvenTimestep==false) + { + D.f[DIR_P00 ] = &DD[DIR_P00 *size_Mat]; + D.f[DIR_M00 ] = &DD[DIR_M00 *size_Mat]; + D.f[DIR_0P0 ] = &DD[DIR_0P0 *size_Mat]; + D.f[DIR_0M0 ] = &DD[DIR_0M0 *size_Mat]; + D.f[DIR_00P ] = &DD[DIR_00P *size_Mat]; + D.f[DIR_00M ] = &DD[DIR_00M *size_Mat]; + D.f[DIR_PP0 ] = &DD[DIR_PP0 *size_Mat]; + D.f[DIR_MM0 ] = &DD[DIR_MM0 *size_Mat]; + D.f[DIR_PM0 ] = &DD[DIR_PM0 *size_Mat]; + D.f[DIR_MP0 ] = &DD[DIR_MP0 *size_Mat]; + D.f[DIR_P0P ] = &DD[DIR_P0P *size_Mat]; + D.f[DIR_M0M ] = &DD[DIR_M0M *size_Mat]; + D.f[DIR_P0M ] = &DD[DIR_P0M *size_Mat]; + D.f[DIR_M0P ] = &DD[DIR_M0P *size_Mat]; + D.f[DIR_0PP ] = &DD[DIR_0PP *size_Mat]; + D.f[DIR_0MM ] = &DD[DIR_0MM *size_Mat]; + D.f[DIR_0PM ] = &DD[DIR_0PM *size_Mat]; + D.f[DIR_0MP ] = &DD[DIR_0MP *size_Mat]; + D.f[DIR_000] = &DD[DIR_000*size_Mat]; + D.f[DIR_PPP ] = &DD[DIR_PPP *size_Mat]; + D.f[DIR_MMP ] = &DD[DIR_MMP *size_Mat]; + D.f[DIR_PMP ] = &DD[DIR_PMP *size_Mat]; + D.f[DIR_MPP ] = &DD[DIR_MPP *size_Mat]; + D.f[DIR_PPM ] = &DD[DIR_PPM *size_Mat]; + D.f[DIR_MMM ] = &DD[DIR_MMM *size_Mat]; + D.f[DIR_PMM ] = &DD[DIR_PMM *size_Mat]; + D.f[DIR_MPM ] = &DD[DIR_MPM *size_Mat]; + } + else + { + D.f[DIR_M00 ] = &DD[DIR_P00 *size_Mat]; + D.f[DIR_P00 ] = &DD[DIR_M00 *size_Mat]; + D.f[DIR_0M0 ] = &DD[DIR_0P0 *size_Mat]; + D.f[DIR_0P0 ] = &DD[DIR_0M0 *size_Mat]; + D.f[DIR_00M ] = &DD[DIR_00P *size_Mat]; + D.f[DIR_00P ] = &DD[DIR_00M *size_Mat]; + D.f[DIR_MM0 ] = &DD[DIR_PP0 *size_Mat]; + D.f[DIR_PP0 ] = &DD[DIR_MM0 *size_Mat]; + D.f[DIR_MP0 ] = &DD[DIR_PM0 *size_Mat]; + D.f[DIR_PM0 ] = &DD[DIR_MP0 *size_Mat]; + D.f[DIR_M0M ] = &DD[DIR_P0P *size_Mat]; + D.f[DIR_P0P ] = &DD[DIR_M0M *size_Mat]; + D.f[DIR_M0P ] = &DD[DIR_P0M *size_Mat]; + D.f[DIR_P0M ] = &DD[DIR_M0P *size_Mat]; + D.f[DIR_0MM ] = &DD[DIR_0PP *size_Mat]; + D.f[DIR_0PP ] = &DD[DIR_0MM *size_Mat]; + D.f[DIR_0MP ] = &DD[DIR_0PM *size_Mat]; + D.f[DIR_0PM ] = &DD[DIR_0MP *size_Mat]; + D.f[DIR_000] = &DD[DIR_000*size_Mat]; + D.f[DIR_PPP ] = &DD[DIR_MMM *size_Mat]; + D.f[DIR_MMP ] = &DD[DIR_PPM *size_Mat]; + D.f[DIR_PMP ] = &DD[DIR_MPM *size_Mat]; + D.f[DIR_MPP ] = &DD[DIR_PMM *size_Mat]; + D.f[DIR_PPM ] = &DD[DIR_MMP *size_Mat]; + D.f[DIR_MMM ] = &DD[DIR_PPP *size_Mat]; + D.f[DIR_PMM ] = &DD[DIR_MPP *size_Mat]; + D.f[DIR_MPM ] = &DD[DIR_PMP *size_Mat]; + } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //Test + //(D.f[DIR_000])[k]=c1o10; + real rhoDiff = drho - rho[k]; + real VeloX = vx1; + real VeloY = vx2; + real VeloZ = vx3; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + q = q_dirE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c2o27* (drho+c9o2*( vx1 )*( vx1 )-cu_sq); + (D.f[DIR_M00])[kw]=(c1o1-q)/(c1o1+q)*(f_E-f_W+(f_E+f_W-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_E+f_W)-c2o27*(rhoDiff + c6o1*( VeloX )))/(c1o1+q); + } + + q = q_dirW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c2o27* (drho+c9o2*(-vx1 )*(-vx1 )-cu_sq); + (D.f[DIR_P00])[ke]=(c1o1-q)/(c1o1+q)*(f_W-f_E+(f_W+f_E-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_W+f_E)-c2o27*(rhoDiff + c6o1*(-VeloX )))/(c1o1+q); + } + + q = q_dirN[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c2o27* (drho+c9o2*( vx2 )*( vx2 )-cu_sq); + (D.f[DIR_0M0])[ks]=(c1o1-q)/(c1o1+q)*(f_N-f_S+(f_N+f_S-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_N+f_S)-c2o27*(rhoDiff + c6o1*( VeloY )))/(c1o1+q); + } + + q = q_dirS[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c2o27* (drho+c9o2*( -vx2 )*( -vx2 )-cu_sq); + (D.f[DIR_0P0])[kn]=(c1o1-q)/(c1o1+q)*(f_S-f_N+(f_S+f_N-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_S+f_N)-c2o27*(rhoDiff + c6o1*(-VeloY )))/(c1o1+q); + } + + q = q_dirT[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c2o27* (drho+c9o2*( vx3)*( vx3)-cu_sq); + (D.f[DIR_00M])[kb]=(c1o1-q)/(c1o1+q)*(f_T-f_B+(f_T+f_B-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_T+f_B)-c2o27*(rhoDiff + c6o1*( VeloZ )))/(c1o1+q); + } + + q = q_dirB[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c2o27* (drho+c9o2*( -vx3)*( -vx3)-cu_sq); + (D.f[DIR_00P])[kt]=(c1o1-q)/(c1o1+q)*(f_B-f_T+(f_B+f_T-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_B+f_T)-c2o27*(rhoDiff + c6o1*(-VeloZ )))/(c1o1+q); + } + + q = q_dirNE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*( vx1+vx2 )*( vx1+vx2 )-cu_sq); + (D.f[DIR_MM0])[ksw]=(c1o1-q)/(c1o1+q)*(f_NE-f_SW+(f_NE+f_SW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NE+f_SW)-c1o54*(rhoDiff + c6o1*(VeloX+VeloY)))/(c1o1+q); + } + + q = q_dirSW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*(-vx1-vx2 )*(-vx1-vx2 )-cu_sq); + (D.f[DIR_PP0])[kne]=(c1o1-q)/(c1o1+q)*(f_SW-f_NE+(f_SW+f_NE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SW+f_NE)-c1o54*(rhoDiff + c6o1*(-VeloX-VeloY)))/(c1o1+q); + } + + q = q_dirSE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*( vx1-vx2 )*( vx1-vx2 )-cu_sq); + (D.f[DIR_MP0])[knw]=(c1o1-q)/(c1o1+q)*(f_SE-f_NW+(f_SE+f_NW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SE+f_NW)-c1o54*(rhoDiff + c6o1*( VeloX-VeloY)))/(c1o1+q); + } + + q = q_dirNW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*(-vx1+vx2 )*(-vx1+vx2 )-cu_sq); + (D.f[DIR_PM0])[kse]=(c1o1-q)/(c1o1+q)*(f_NW-f_SE+(f_NW+f_SE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NW+f_SE)-c1o54*(rhoDiff + c6o1*(-VeloX+VeloY)))/(c1o1+q); + } + + q = q_dirTE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*( vx1 +vx3)*( vx1 +vx3)-cu_sq); + (D.f[DIR_M0M])[kbw]=(c1o1-q)/(c1o1+q)*(f_TE-f_BW+(f_TE+f_BW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TE+f_BW)-c1o54*(rhoDiff + c6o1*( VeloX+VeloZ)))/(c1o1+q); + } + + q = q_dirBW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*(-vx1 -vx3)*(-vx1 -vx3)-cu_sq); + (D.f[DIR_P0P])[kte]=(c1o1-q)/(c1o1+q)*(f_BW-f_TE+(f_BW+f_TE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BW+f_TE)-c1o54*(rhoDiff + c6o1*(-VeloX-VeloZ)))/(c1o1+q); + } + + q = q_dirBE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*( vx1 -vx3)*( vx1 -vx3)-cu_sq); + (D.f[DIR_M0P])[ktw]=(c1o1-q)/(c1o1+q)*(f_BE-f_TW+(f_BE+f_TW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BE+f_TW)-c1o54*(rhoDiff + c6o1*( VeloX-VeloZ)))/(c1o1+q); + } + + q = q_dirTW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*(-vx1 +vx3)*(-vx1 +vx3)-cu_sq); + (D.f[DIR_P0M])[kbe]=(c1o1-q)/(c1o1+q)*(f_TW-f_BE+(f_TW+f_BE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TW+f_BE)-c1o54*(rhoDiff + c6o1*(-VeloX+VeloZ)))/(c1o1+q); + } + + q = q_dirTN[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); + (D.f[DIR_0MM])[kbs]=(c1o1-q)/(c1o1+q)*(f_TN-f_BS+(f_TN+f_BS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TN+f_BS)-c1o54*(rhoDiff + c6o1*( VeloY+VeloZ)))/(c1o1+q); + } + + q = q_dirBS[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*( -vx2-vx3)*( -vx2-vx3)-cu_sq); + (D.f[DIR_0PP])[ktn]=(c1o1-q)/(c1o1+q)*(f_BS-f_TN+(f_BS+f_TN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BS+f_TN)-c1o54*(rhoDiff + c6o1*( -VeloY-VeloZ)))/(c1o1+q); + } + + q = q_dirBN[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); + (D.f[DIR_0MP])[kts]=(c1o1-q)/(c1o1+q)*(f_BN-f_TS+(f_BN+f_TS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BN+f_TS)-c1o54*(rhoDiff + c6o1*( VeloY-VeloZ)))/(c1o1+q); + } + + q = q_dirTS[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o54* (drho+c9o2*( -vx2+vx3)*( -vx2+vx3)-cu_sq); + (D.f[DIR_0PM])[kbn]=(c1o1-q)/(c1o1+q)*(f_TS-f_BN+(f_TS+f_BN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TS+f_BN)-c1o54*(rhoDiff + c6o1*( -VeloY+VeloZ)))/(c1o1+q); + } + + q = q_dirTNE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o216*(drho+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); + (D.f[DIR_MMM])[kbsw]=(c1o1-q)/(c1o1+q)*(f_TNE-f_BSW+(f_TNE+f_BSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNE+f_BSW)-c1o216*(rhoDiff + c6o1*( VeloX+VeloY+VeloZ)))/(c1o1+q); + } + + q = q_dirBSW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o216*(drho+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); + (D.f[DIR_PPP])[ktne]=(c1o1-q)/(c1o1+q)*(f_BSW-f_TNE+(f_BSW+f_TNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSW+f_TNE)-c1o216*(rhoDiff + c6o1*(-VeloX-VeloY-VeloZ)))/(c1o1+q); + } + + q = q_dirBNE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o216*(drho+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); + (D.f[DIR_MMP])[ktsw]=(c1o1-q)/(c1o1+q)*(f_BNE-f_TSW+(f_BNE+f_TSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNE+f_TSW)-c1o216*(rhoDiff + c6o1*( VeloX+VeloY-VeloZ)))/(c1o1+q); + } + + q = q_dirTSW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o216*(drho+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); + (D.f[DIR_PPM])[kbne]=(c1o1-q)/(c1o1+q)*(f_TSW-f_BNE+(f_TSW+f_BNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSW+f_BNE)-c1o216*(rhoDiff + c6o1*(-VeloX-VeloY+VeloZ)))/(c1o1+q); + } + + q = q_dirTSE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o216*(drho+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); + (D.f[DIR_MPM])[kbnw]=(c1o1-q)/(c1o1+q)*(f_TSE-f_BNW+(f_TSE+f_BNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSE+f_BNW)-c1o216*(rhoDiff + c6o1*( VeloX-VeloY+VeloZ)))/(c1o1+q); + } + + q = q_dirBNW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o216*(drho+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); + (D.f[DIR_PMP])[ktse]=(c1o1-q)/(c1o1+q)*(f_BNW-f_TSE+(f_BNW+f_TSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNW+f_TSE)-c1o216*(rhoDiff + c6o1*(-VeloX+VeloY-VeloZ)))/(c1o1+q); + } + + q = q_dirBSE[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o216*(drho+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); + (D.f[DIR_MPP])[ktnw]=(c1o1-q)/(c1o1+q)*(f_BSE-f_TNW+(f_BSE+f_TNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSE+f_TNW)-c1o216*(rhoDiff + c6o1*( VeloX-VeloY-VeloZ)))/(c1o1+q); + } + + q = q_dirTNW[k]; + if (q>=c0o1 && q<=c1o1) + { + feq=c1o216*(drho+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); + (D.f[DIR_PMM])[kbse]=(c1o1-q)/(c1o1+q)*(f_TNW-f_BSE+(f_TNW+f_BSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNW+f_BSE)-c1o216*(rhoDiff + c6o1*(-VeloX+VeloY+VeloZ)))/(c1o1+q); + } + } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernel.h b/src/gpu/VirtualFluids_GPU/Kernel/Kernel.h index 7eaf0050b41a0aa67de0a4e592b8a123d9ef3e9f..50b4460d774010ea7d7b98cfa6fa505cdfeb88c2 100644 --- a/src/gpu/VirtualFluids_GPU/Kernel/Kernel.h +++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernel.h @@ -16,7 +16,7 @@ class Kernel public: virtual ~Kernel() = default; virtual void run() = 0; - virtual void runOnIndices(const unsigned int *indices, unsigned int size_indices, CollisionTemplate collisionTemplate, CudaStreamIndex streamIdx=CudaStreamIndex::Legacy) = 0; //if stream == -1: run on default stream + virtual void runOnIndices(const unsigned int *indices, unsigned int size_indices, CollisionTemplate collisionTemplate, CudaStreamIndex streamIdx=CudaStreamIndex::Legacy) = 0; virtual bool checkParameter() = 0; virtual std::vector<PreProcessorType> getPreProcessorTypes() = 0; diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu index 54dd11142d9c16063d58330cfe7351394bdfe51c..477539348706de7410319045fa075a6cdf31d01c 100644 --- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu +++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17.cu @@ -6,148 +6,132 @@ #include <cuda.h> -template<TurbulenceModel turbulenceModel> +template<TurbulenceModel turbulenceModel> std::shared_ptr< CumulantK17<turbulenceModel> > CumulantK17<turbulenceModel>::getNewInstance(std::shared_ptr<Parameter> para, int level) { - return std::shared_ptr<CumulantK17<turbulenceModel> >(new CumulantK17<turbulenceModel>(para,level)); + return std::shared_ptr<CumulantK17<turbulenceModel> >(new CumulantK17<turbulenceModel>(para,level)); } template<TurbulenceModel turbulenceModel> void CumulantK17<turbulenceModel>::run() { - LB_Kernel_CumulantK17 < turbulenceModel, false, false > <<< cudaGrid.grid, cudaGrid.threads >>>( para->getParD(level)->omega, - para->getParD(level)->typeOfGridNode, - para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, - para->getParD(level)->distributions.f[0], - para->getParD(level)->rho, - para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, - para->getParD(level)->turbViscosity, - para->getSGSConstant(), - (unsigned long)para->getParD(level)->numberOfNodes, - level, - para->getIsBodyForce(), - para->getForcesDev(), - para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, - para->getQuadricLimitersDev(), - para->getParD(level)->isEvenTimestep, - para->getParD(level)->taggedFluidNodeIndices[CollisionTemplate::Default], - para->getParD(level)->numberOfTaggedFluidNodes[CollisionTemplate::Default]); + LB_Kernel_CumulantK17 < turbulenceModel, false, false > <<< cudaGrid.grid, cudaGrid.threads >>>( para->getParD(level)->omega, + para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, + para->getParD(level)->distributions.f[0], + para->getParD(level)->rho, + para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, + para->getParD(level)->turbViscosity, + para->getSGSConstant(), + (unsigned long)para->getParD(level)->numberOfNodes, + level, + para->getForcesDev(), + para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, + para->getQuadricLimitersDev(), + para->getParD(level)->isEvenTimestep, + para->getParD(level)->taggedFluidNodeIndices[CollisionTemplate::Default], + para->getParD(level)->numberOfTaggedFluidNodes[CollisionTemplate::Default]); - getLastCudaError("LB_Kernel_CumulantK17 execution failed"); + getLastCudaError("LB_Kernel_CumulantK17 execution failed"); } template<TurbulenceModel turbulenceModel> void CumulantK17<turbulenceModel>::runOnIndices( const unsigned int *indices, unsigned int size_indices, CollisionTemplate collisionTemplate, CudaStreamIndex streamIndex ) { - cudaStream_t stream = para->getStreamManager()->getStream(streamIndex); - - switch (collisionTemplate) - { - case CollisionTemplate::Default: - LB_Kernel_CumulantK17 < turbulenceModel, false, false > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( - para->getParD(level)->omega, - para->getParD(level)->typeOfGridNode, - para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, - para->getParD(level)->distributions.f[0], - para->getParD(level)->rho, - para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, - para->getParD(level)->turbViscosity, - para->getSGSConstant(), - (unsigned long)para->getParD(level)->numberOfNodes, - level, - para->getIsBodyForce(), - para->getForcesDev(), - para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, - para->getQuadricLimitersDev(), - para->getParD(level)->isEvenTimestep, - indices, - size_indices); - break; - - case CollisionTemplate::WriteMacroVars: - LB_Kernel_CumulantK17 < turbulenceModel, true, false > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( - para->getParD(level)->omega, - para->getParD(level)->typeOfGridNode, - para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, - para->getParD(level)->distributions.f[0], - para->getParD(level)->rho, - para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, - para->getParD(level)->turbViscosity, - para->getSGSConstant(), - (unsigned long)para->getParD(level)->numberOfNodes, - level, - para->getIsBodyForce(), - para->getForcesDev(), - para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, - para->getQuadricLimitersDev(), - para->getParD(level)->isEvenTimestep, - indices, - size_indices); - break; - - case CollisionTemplate::Border: - case CollisionTemplate::AllFeatures: - LB_Kernel_CumulantK17 < turbulenceModel, true, true > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( - para->getParD(level)->omega, - para->getParD(level)->typeOfGridNode, - para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, - para->getParD(level)->distributions.f[0], - para->getParD(level)->rho, - para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, - para->getParD(level)->turbViscosity, - para->getSGSConstant(), - (unsigned long)para->getParD(level)->numberOfNodes, - level, - para->getIsBodyForce(), - para->getForcesDev(), - para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, - para->getQuadricLimitersDev(), - para->getParD(level)->isEvenTimestep, - indices, - size_indices); - break; - case CollisionTemplate::ApplyBodyForce: - LB_Kernel_CumulantK17 < turbulenceModel, false, true > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( - para->getParD(level)->omega, - para->getParD(level)->typeOfGridNode, - para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, - para->getParD(level)->distributions.f[0], - para->getParD(level)->rho, - para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, - para->getParD(level)->turbViscosity, - para->getSGSConstant(), - (unsigned long)para->getParD(level)->numberOfNodes, - level, - para->getIsBodyForce(), - para->getForcesDev(), - para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, - para->getQuadricLimitersDev(), - para->getParD(level)->isEvenTimestep, - indices, - size_indices); - break; - default: - throw std::runtime_error("Invalid CollisionTemplate in CumulantK17::runOnIndices()"); - break; - } + cudaStream_t stream = para->getStreamManager()->getStream(streamIndex); + + switch (collisionTemplate) + { + case CollisionTemplate::Default: + LB_Kernel_CumulantK17 < turbulenceModel, false, false > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>(para->getParD(level)->omega, + para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, + para->getParD(level)->distributions.f[0], + para->getParD(level)->rho, + para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, + para->getParD(level)->turbViscosity, + para->getSGSConstant(), + (unsigned long)para->getParD(level)->numberOfNodes, + level, + para->getForcesDev(), + para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, + para->getQuadricLimitersDev(), + para->getParD(level)->isEvenTimestep, + indices, + size_indices); + break; + + case CollisionTemplate::WriteMacroVars: + LB_Kernel_CumulantK17 < turbulenceModel, true, false > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega, + para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, + para->getParD(level)->distributions.f[0], + para->getParD(level)->rho, + para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, + para->getParD(level)->turbViscosity, + para->getSGSConstant(), + (unsigned long)para->getParD(level)->numberOfNodes, + level, + para->getForcesDev(), + para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, + para->getQuadricLimitersDev(), + para->getParD(level)->isEvenTimestep, + indices, + size_indices); + break; - getLastCudaError("LB_Kernel_CumulantK17 execution failed"); + case CollisionTemplate::SubDomainBorder: + case CollisionTemplate::AllFeatures: + LB_Kernel_CumulantK17 < turbulenceModel, true, true > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega, + para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, + para->getParD(level)->distributions.f[0], + para->getParD(level)->rho, + para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, + para->getParD(level)->turbViscosity, + para->getSGSConstant(), + (unsigned long)para->getParD(level)->numberOfNodes, + level, + para->getForcesDev(), + para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, + para->getQuadricLimitersDev(), + para->getParD(level)->isEvenTimestep, + indices, + size_indices); + break; case CollisionTemplate::ApplyBodyForce: + LB_Kernel_CumulantK17 < turbulenceModel, false, true > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega, + para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, + para->getParD(level)->distributions.f[0], + para->getParD(level)->rho, + para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, + para->getParD(level)->turbViscosity, + para->getSGSConstant(), + (unsigned long)para->getParD(level)->numberOfNodes, + level, + para->getForcesDev(), + para->getParD(level)->forceX_SP, para->getParD(level)->forceY_SP, para->getParD(level)->forceZ_SP, + para->getQuadricLimitersDev(), + para->getParD(level)->isEvenTimestep, + indices, + size_indices); + break; default: + throw std::runtime_error("Invalid CollisionTemplate in CumulantK17::runOnIndices()"); + break; + } + + getLastCudaError("LB_Kernel_CumulantK17 execution failed"); } template<TurbulenceModel turbulenceModel> CumulantK17<turbulenceModel>::CumulantK17(std::shared_ptr<Parameter> para, int level) { - this->para = para; - this->level = level; + this->para = para; + this->level = level; + + myPreProcessorTypes.push_back(InitCompSP27); - myPreProcessorTypes.push_back(InitCompSP27); + myKernelGroup = BasicKernel; - myKernelGroup = BasicKernel; + this->cudaGrid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes); + this->kernelUsesFluidNodeIndices = true; - this->cudaGrid = vf::cuda::CudaGrid(para->getParD(level)->numberofthreads, para->getParD(level)->numberOfNodes); - this->kernelUsesFluidNodeIndices = true; - - VF_LOG_INFO("Using turbulence model: {}", turbulenceModel); + VF_LOG_INFO("Using turbulence model: {}", turbulenceModel); } template class CumulantK17<TurbulenceModel::AMD>; diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu index d2b679395a673b5b1d74e3f499a1d53b154d4b89..77e5172dae7b0ff6b51ed79a0a4356c7461801c5 100644 --- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu +++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cu @@ -1,28 +1,28 @@ -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ // \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ // -// This file is part of VirtualFluids. VirtualFluids is free software: you can +// 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 +// 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 +// +// 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/>. // @@ -32,17 +32,17 @@ //! \brief Kernel for CumulantK17 including different turbulence models and options for local body forces and writing macroscopic variables //! //! CumulantK17 kernel using chimera transformations and quartic limiters as present in Geier et al. (2017). Additional options are three different -//! eddy-viscosity turbulence models (Smagorinsky, AMD, QR) that can be set via the template parameter turbulenceModel (with default -//! TurbulenceModel::None). +//! eddy-viscosity turbulence models (Smagorinsky, AMD, QR) that can be set via the template parameter turbulenceModel (with default +//! TurbulenceModel::None). //! The kernel is executed separately for each subset of fluid node indices with a different tag CollisionTemplate. For each subset, only the locally -//! required options are switched on ( \param writeMacroscopicVariables and/or \param applyBodyForce) in order to minimize memory accesses. The default -//! refers to the plain cumlant kernel (CollisionTemplate::Default). -//! Nodes are added to subsets (taggedFluidNodes) in Simulation::init using a corresponding tag with different values of CollisionTemplate. These subsets +//! required options are switched on ( \param writeMacroscopicVariables and/or \param applyBodyForce) in order to minimize memory accesses. The default +//! refers to the plain cumlant kernel (CollisionTemplate::Default). +//! Nodes are added to subsets (taggedFluidNodes) in Simulation::init using a corresponding tag with different values of CollisionTemplate. These subsets //! are provided by the utilized PostCollisionInteractiors depending on they specifc requirements (e.g. writeMacroscopicVariables for probes). //======================================================================================= /* Device code */ -#include "LBM/LB.h" +#include "LBM/LB.h" #include "lbm/constants/D3Q27.h" #include <lbm/constants/NumericConstants.h> #include "Kernel/Utilities/DistributionHelper.cuh" @@ -57,27 +57,25 @@ using namespace vf::lbm::dir; //////////////////////////////////////////////////////////////////////////////// template<TurbulenceModel turbulenceModel, bool writeMacroscopicVariables, bool applyBodyForce> __global__ void LB_Kernel_CumulantK17( - real omega_in, - uint* typeOfGridNode, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - real* distributions, + real omega_in, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, - unsigned long numberOfLBnodes, - int level, - bool bodyForce, - real* forces, + unsigned long numberOfLBnodes, + int level, + real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, - real* quadricLimiters, - bool isEvenTimestep, + real* quadricLimiters, + bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes) { @@ -93,10 +91,10 @@ __global__ void LB_Kernel_CumulantK17( //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim. //! const unsigned kThread = vf::gpu::getNodeIndex(); - + ////////////////////////////////////////////////////////////////////////// // run for all indices in size_Mat and fluid nodes - if (kThread >= numberOfFluidNodes) + if (kThread >= numberOfFluidNodes) return; //////////////////////////////////////////////////////////////////////////////// //! - Get the node index from the array containing all indices of fluid nodes @@ -204,7 +202,7 @@ __global__ void LB_Kernel_CumulantK17( real vvz = ((((f_PPP - f_MMM) + (f_PMP - f_MPM)) + ((f_MPP - f_PMM) + (f_MMP - f_PPM))) + (((f_0MP - f_0PM) + (f_0PP - f_0MM)) + ((f_M0P - f_P0M) + (f_P0P - f_M0M))) + (f_00P - f_00M)) * oneOverRho; - + //////////////////////////////////////////////////////////////////////////////////// //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), @@ -214,13 +212,13 @@ __global__ void LB_Kernel_CumulantK17( for (size_t i = 1; i <= level; i++) { factor *= c2o1; } - + real fx = forces[0]; real fy = forces[1]; real fz = forces[2]; if( applyBodyForce ){ - fx += bodyForceX[k_000]; + fx += bodyForceX[k_000]; fy += bodyForceY[k_000]; fz += bodyForceZ[k_000]; @@ -234,7 +232,7 @@ __global__ void LB_Kernel_CumulantK17( vvx += acc_x; vvy += acc_y; vvz += acc_z; - + // Reset body force. To be used when not using round-off correction. bodyForceX[k_000] = 0.0f; bodyForceY[k_000] = 0.0f; @@ -245,9 +243,9 @@ __global__ void LB_Kernel_CumulantK17( //! //!> Similar to Kahan summation algorithm (https://en.wikipedia.org/wiki/Kahan_summation_algorithm) //!> Essentially computes the round-off error of the applied force and adds it in the next time step as a compensation. - //!> Seems to be necesseary at very high Re boundary layers, where the forcing and velocity can + //!> Seems to be necesseary at very high Re boundary layers, where the forcing and velocity can //!> differ by several orders of magnitude. - //!> \note 16/05/2022: Testing, still ongoing! + //!> \note 16/05/2022: Testing, still ongoing! //! // bodyForceX[k_000] = (acc_x-(vvx-vx))*factor*c2o1; // bodyForceY[k_000] = (acc_y-(vvy-vy))*factor*c2o1; @@ -258,7 +256,7 @@ __global__ void LB_Kernel_CumulantK17( vvy += fy * c1o2 / factor; vvz += fz * c1o2 / factor; } - + //////////////////////////////////////////////////////////////////////////////////// // calculate the square of velocities for this lattice node @@ -695,34 +693,34 @@ __global__ void LB_Kernel_CumulantK17( (dist.f[DIR_MMM])[k_MMM] = f_PPP; } -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, true > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, true > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, true > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, true > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, false > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, false > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, false > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, false > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, true, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, true > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, true > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, true > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, true > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, true > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, false > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::AMD, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, false > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::Smagorinsky, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, false > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::QR, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); -template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, false > ( real omega_in, uint* typeOfGridNode, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, bool bodyForce, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); \ No newline at end of file +template __global__ void LB_Kernel_CumulantK17 < TurbulenceModel::None, false, false > ( real omega_in, uint* neighborX, uint* neighborY, uint* neighborZ, real* distributions, real* rho, real* vx, real* vy, real* vz, real* turbulentViscosity, real SGSconstant, unsigned long size_Mat, int level, real* forces, real* bodyForceX, real* bodyForceY, real* bodyForceZ, real* quadricLimiters, bool isEvenTimestep, const uint *fluidNodeIndices, uint numberOfFluidNodes); diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh index 9d56098f5053cc765b12eab0244a890d18209b1b..55c22def9c43ab2678fc808043859f43021270a5 100644 --- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh +++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17/CumulantK17_Device.cuh @@ -5,27 +5,25 @@ #include <curand.h> template< TurbulenceModel turbulenceModel, bool writeMacroscopicVariables, bool applyBodyForce > __global__ void LB_Kernel_CumulantK17( - real omega_in, - uint* typeOfGridNode, - uint* neighborX, - uint* neighborY, - uint* neighborZ, - real* distributions, - real* rho, - real* vx, + real omega_in, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + real* rho, + real* vx, real* vy, real* vz, - real* turbulentViscosity, - real SGSconstant, - unsigned long numberOfLBnodes, - int level, - bool bodyForce, - real* forces, - real* bodyForceX, - real* bodyForceY, - real* bodyForceZ, - real* quadricLimiters, - bool isEvenTimestep, - const uint *fluidNodeIndices, + real* turbulentViscosity, + real SGSconstant, + unsigned long numberOfLBnodes, + int level, + real* forces, + real* bodyForceX, + real* bodyForceY, + real* bodyForceZ, + real* quadricLimiters, + bool isEvenTimestep, + const uint *fluidNodeIndices, uint numberOfFluidNodes); #endif diff --git a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Sponge/CumulantK17Sponge.cu b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Sponge/CumulantK17Sponge.cu index 2788cda23db44e27f47b78dd45efcb18519b7406..b6b6b78f5f2957c787f1cce1fabd7039f07f0dac 100644 --- a/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Sponge/CumulantK17Sponge.cu +++ b/src/gpu/VirtualFluids_GPU/Kernel/Kernels/BasicKernels/FluidFlow/Compressible/CumulantK17Sponge/CumulantK17Sponge.cu @@ -83,7 +83,7 @@ void CumulantK17Sponge<turbulenceModel>::runOnIndices( const unsigned int *indic size_indices); break; - case CollisionTemplate::Border: + case CollisionTemplate::SubDomainBorder: case CollisionTemplate::AllFeatures: LB_Kernel_CumulantK17Sponge < turbulenceModel, true, true > <<< cudaGrid.grid, cudaGrid.threads, 0, stream >>>( para->getParD(level)->omega, diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/BCKernelManager.cpp b/src/gpu/VirtualFluids_GPU/KernelManager/BCKernelManager.cpp index 29341d2430ec6eff46065b10c1167f9e871edab8..e8fc3f318c920be36be7861a28659124a7b1e977 100644 --- a/src/gpu/VirtualFluids_GPU/KernelManager/BCKernelManager.cpp +++ b/src/gpu/VirtualFluids_GPU/KernelManager/BCKernelManager.cpp @@ -398,16 +398,16 @@ void BCKernelManager::runPrecursorBCKernelPost(int level, uint t, CudaMemoryMana uint t_level = para->getTimeStep(level, t, true); - uint lastTime = (para->getParD(level)->precursorBC.nPrecursorReads-2)*para->getParD(level)->precursorBC.nTRead; // timestep currently loaded into last arrays - uint currentTime = (para->getParD(level)->precursorBC.nPrecursorReads-1)*para->getParD(level)->precursorBC.nTRead; // timestep currently loaded into current arrays - uint nextTime = para->getParD(level)->precursorBC.nPrecursorReads *para->getParD(level)->precursorBC.nTRead; // timestep currently loaded into next arrays + uint lastTime = (para->getParD(level)->precursorBC.nPrecursorReads-2)*para->getParD(level)->precursorBC.timeStepsBetweenReads; // timestep currently loaded into last arrays + uint currentTime = (para->getParD(level)->precursorBC.nPrecursorReads-1)*para->getParD(level)->precursorBC.timeStepsBetweenReads; // timestep currently loaded into current arrays + uint nextTime = para->getParD(level)->precursorBC.nPrecursorReads *para->getParD(level)->precursorBC.timeStepsBetweenReads; // timestep currently loaded into next arrays if(t_level>=currentTime) { //cycle time lastTime = currentTime; currentTime = nextTime; - nextTime += para->getParD(level)->precursorBC.nTRead; + nextTime += para->getParD(level)->precursorBC.timeStepsBetweenReads; //cycle pointers real* tmp = para->getParD(level)->precursorBC.last; @@ -426,6 +426,6 @@ void BCKernelManager::runPrecursorBCKernelPost(int level, uint t, CudaMemoryMana para->getParH(level)->precursorBC.nPrecursorReads++; } - real tRatio = real(t_level-lastTime)/para->getParD(level)->precursorBC.nTRead; + real tRatio = real(t_level-lastTime)/para->getParD(level)->precursorBC.timeStepsBetweenReads; precursorBoundaryConditionPost(para->getParD(level).get(), ¶->getParD(level)->precursorBC, tRatio, para->getVelocityRatio()); -} \ No newline at end of file +} diff --git a/src/gpu/VirtualFluids_GPU/LBM/LB.h b/src/gpu/VirtualFluids_GPU/LBM/LB.h index 904471123a895d65f33c8d91e6c5e5ed0296a9f6..cfdbbbae040a13f94e97d40d702b93d5a1e19c86 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/LB.h +++ b/src/gpu/VirtualFluids_GPU/LBM/LB.h @@ -15,9 +15,9 @@ ////////////////////////// //porous media -#define GEO_PM_0 5 -#define GEO_PM_1 6 -#define GEO_PM_2 7 +#define GEO_PM_0 5 +#define GEO_PM_1 6 +#define GEO_PM_2 7 ////////////////////////// #define GEO_SOLID 15 @@ -75,9 +75,9 @@ enum class CollisionTemplate { //! - AllFeatures: collision \w write out macroscopic variables AND read and apply body force AllFeatures, //! - Border: collision on border nodes - Border + SubDomainBorder }; -constexpr std::initializer_list<CollisionTemplate> all_CollisionTemplate = { CollisionTemplate::Default, CollisionTemplate::WriteMacroVars, CollisionTemplate::ApplyBodyForce, CollisionTemplate::AllFeatures, CollisionTemplate::Border}; +constexpr std::initializer_list<CollisionTemplate> all_CollisionTemplate = { CollisionTemplate::Default, CollisionTemplate::WriteMacroVars, CollisionTemplate::ApplyBodyForce, CollisionTemplate::AllFeatures, CollisionTemplate::SubDomainBorder}; constexpr std::initializer_list<CollisionTemplate> bulk_CollisionTemplate = { CollisionTemplate::Default, CollisionTemplate::WriteMacroVars, CollisionTemplate::ApplyBodyForce, CollisionTemplate::AllFeatures}; struct InitCondition @@ -191,7 +191,7 @@ typedef struct OffFC{ // Distribution functions g 6 typedef struct Distri6 { - real* g[6]; + real* g[6]; } Distributions6; // Distribution functions f 7 @@ -237,11 +237,11 @@ typedef struct QforPrecursorBC{ int sizeQ; int numberOfPrecursorNodes=0; uint nPrecursorReads=0; - uint nTRead; + uint timeStepsBetweenReads; size_t numberOfQuantities; real* q27[27]; - uint* planeNeighborNT, *planeNeighborNB, *planeNeighborST, *planeNeighborSB; - real* weightsNT, *weightsNB, *weightsST, *weightsSB; + uint* planeNeighbor0PP, *planeNeighbor0PM, *planeNeighbor0MP, *planeNeighbor0MM; + real* weights0PP, *weights0PM, *weights0MP, *weights0MM; real* last, *current, *next; real velocityX, velocityY, velocityZ; }QforPrecursorBoundaryConditions; @@ -284,55 +284,53 @@ typedef struct WMparas{ //measurePoints typedef struct MeasP{ - std::string name; - uint k; - std::vector<real> Vx; - std::vector<real> Vy; - std::vector<real> Vz; - std::vector<real> Rho; - //real* Vx; - //real* Vy; - //real* Vz; - //real* Rho; + std::string name; + uint k; + std::vector<real> Vx; + std::vector<real> Vy; + std::vector<real> Vz; + std::vector<real> Rho; + //real* Vx; + //real* Vy; + //real* Vz; + //real* Rho; }MeasurePoints; //Process Neighbors typedef struct PN27{ - real* f[27]; - uint memsizeFs; - int* index; - uint memsizeIndex; - uint rankNeighbor; - int numberOfNodes; - int numberOfFs; + real* f[27]; + uint memsizeFs; + int* index; + uint memsizeIndex; + uint rankNeighbor; + int numberOfNodes; + int numberOfFs; }ProcessNeighbor27; typedef struct PN_F3 { - real* g[6]; - uint memsizeGs; - int* index; - uint memsizeIndex; - uint rankNeighbor; - int numberOfNodes; - int numberOfGs; + real* g[6]; + uint memsizeGs; + int* index; + uint memsizeIndex; + uint rankNeighbor; + int numberOfNodes; + int numberOfGs; }ProcessNeighborF3; //path line particles typedef struct PLP{ - bool *stuck, *hot; - real *coordXabsolut, *coordYabsolut, *coordZabsolut; - real *coordXlocal, *coordYlocal, *coordZlocal; - real *veloX, *veloY, *veloZ; - real *randomLocationInit; - uint *timestep; - uint *ID; - uint *cellBaseID; - uint numberOfParticles, numberOfTimestepsParticles; - uint memSizeID, memSizeTimestep, memSizerealAll, memSizereal, memSizeBool, memSizeBoolBC; + bool *stuck, *hot; + real *coordXabsolut, *coordYabsolut, *coordZabsolut; + real *coordXlocal, *coordYlocal, *coordZlocal; + real *veloX, *veloY, *veloZ; + real *randomLocationInit; + uint *timestep; + uint *ID; + uint *cellBaseID; + uint numberOfParticles, numberOfTimestepsParticles; + uint memSizeID, memSizeTimestep, memSizerealAll, memSizereal, memSizeBool, memSizeBoolBC; }PathLineParticles; - - ////////////////////////////////////////////////////////////////////////// inline int vectorPosition(int i, int j, int k, int Lx, int Ly ) { @@ -341,7 +339,4 @@ inline int vectorPosition(int i, int j, int k, int Lx, int Ly ) } ////////////////////////////////////////////////////////////////////////// - #endif - - diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp index db2d4a177374e4a24beb8f6d6dfc6d5bb0ea6a6f..83f39ee8248f3fc84bf45aa6c95f796ea6f85a61 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp +++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp @@ -139,7 +139,7 @@ void Simulation::init(GridProvider &gridProvider, BoundaryConditionFactory *bcFa ////////////////////////////////////////////////////////////////////////// // CUDA streams if (para->getUseStreams()) { - para->getStreamManager()->registerStream(CudaStreamIndex::Border); + para->getStreamManager()->registerStream(CudaStreamIndex::SubDomainBorder); para->getStreamManager()->registerStream(CudaStreamIndex::Bulk); para->getStreamManager()->launchStreams(); para->getStreamManager()->createCudaEvents(); diff --git a/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.h b/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.h index 73c6b9fa21999d577349401b31a6183e7b6d7f3b..95fea46d4eba0c2f2ff0846d22ee5da4f6c357ea 100644 --- a/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.h +++ b/src/gpu/VirtualFluids_GPU/Output/DistributionDebugInspector.h @@ -1,5 +1,43 @@ -#ifndef FILE_WRITER_H -#define FILE_WRITER_H +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 DistributionDebugInspector.h +//! \author Henrik Asmuth +//! \date 13/012/2022 +//! \brief Basic debugging class to print out f's in a certain area of the domain +//! +//! Basic debugging class. Needs to be directly added in UpdateGrid (could potentially also be added as a proper Probe in the future) +//! How to use: Define a part of the domain via min/max x, y, and z. The DistributionDebugInspector will print out all f's in that area. +//! +//======================================================================================= + +#ifndef DISTRIBUTION_INSPECTOR_H +#define DISTRIBUTION_INSPECTOR_H #include "Parameter/Parameter.h" @@ -7,7 +45,7 @@ class DistributionDebugInspector { public: - DistributionDebugInspector(uint _inspectionLevel, real _minX, real _maxX, real _minY, real _maxY, real _minZ, real _maxZ, std::string _tag): + DistributionDebugInspector(uint _inspectionLevel, real _minX, real _maxX, real _minY, real _maxY, real _minZ, real _maxZ, std::string _tag): inspectionLevel(_inspectionLevel), minX(_minX), maxX(_maxX), @@ -17,8 +55,8 @@ public: maxZ(_maxZ), tag(_tag) {}; - - ~DistributionDebugInspector(){} + + ~DistributionDebugInspector() = default; void inspect(std::shared_ptr<Parameter> para, uint level, uint t); @@ -35,4 +73,4 @@ std::string tag; }; -#endif \ No newline at end of file +#endif diff --git a/src/gpu/VirtualFluids_GPU/Output/Timer.cpp b/src/gpu/VirtualFluids_GPU/Output/Timer.cpp index 74a706165489a86cace40047beb09996aa0aa8db..b9ec5d9ba90a4beac5bc3d5201133cdee2e6ff23 100644 --- a/src/gpu/VirtualFluids_GPU/Output/Timer.cpp +++ b/src/gpu/VirtualFluids_GPU/Output/Timer.cpp @@ -25,6 +25,13 @@ void Timer::stopTimer() this->totalElapsedTime += this->elapsedTime; } +float Timer::startStopGetElapsed() +{ + this->stopTimer(); + this->startTimer(); + return this->elapsedTime; +} + void Timer::resetTimer() { this->elapsedTime = 0.0; diff --git a/src/gpu/VirtualFluids_GPU/Output/Timer.h b/src/gpu/VirtualFluids_GPU/Output/Timer.h index d035cbb6cef7ea9f8edabbd2894671a868c37eec..f6b6bad3cf29e31fb32ce998cd5591352919c487 100644 --- a/src/gpu/VirtualFluids_GPU/Output/Timer.h +++ b/src/gpu/VirtualFluids_GPU/Output/Timer.h @@ -34,6 +34,8 @@ class Timer float getElapsedTime(){ return this->elapsedTime; } float getTotalElapsedTime(){ return this->totalElapsedTime; } + float startStopGetElapsed(); + private: cudaEvent_t start_t, stop_t; diff --git a/src/gpu/VirtualFluids_GPU/Parameter/CudaStreamManager.cpp b/src/gpu/VirtualFluids_GPU/Parameter/CudaStreamManager.cpp index abe780470f660410ca0e63dff2b3d0f300e7dbda..3cc771e413134e90b0d09d8eeb6dfee791f8a1e2 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/CudaStreamManager.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/CudaStreamManager.cpp @@ -29,8 +29,6 @@ //======================================================================================= #include "CudaStreamManager.h" #include <helper_cuda.h> -#include <cuda_runtime.h> -#include <cuda.h> #include <iostream> void CudaStreamManager::registerStream(CudaStreamIndex streamIndex) diff --git a/src/gpu/VirtualFluids_GPU/Parameter/CudaStreamManager.h b/src/gpu/VirtualFluids_GPU/Parameter/CudaStreamManager.h index 06fc5624771e2b2b713ae84c24116ac4c622ec9f..5c59bcd3a5e6178d6e70a63f803caf8e29f32604 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/CudaStreamManager.h +++ b/src/gpu/VirtualFluids_GPU/Parameter/CudaStreamManager.h @@ -39,7 +39,7 @@ enum class CudaStreamIndex { Legacy, Bulk, - Border, + SubDomainBorder, Precursor, ActuatorFarm }; diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp index df53a0d9300ead34ad96b5257b1c8b5debad3a70..d1568932d9802d1060e37d26ed37fa48de1abb05 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp @@ -861,6 +861,10 @@ real Parameter::getScaledForceRatio(int level) { return this->getForceRatio()*(level+1); } +real Parameter::getScaledStressRatio(int level) +{ + return this->getVelocityRatio()*this->getVelocityRatio(); +} void Parameter::setRealX(real RealX) { ic.RealX = RealX; diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h index cf71b20bb22f35948f567b5501c066f1732efdbf..86b7bc2a058d69ba878d4445953a4dc56e524027 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h @@ -372,12 +372,12 @@ struct LBMSimulationParameter { /////////////////////////////////////////////////////// std::map<CollisionTemplate, uint*> taggedFluidNodeIndices = {{CollisionTemplate::Default, nullptr}, - {CollisionTemplate::Border, nullptr}, + {CollisionTemplate::SubDomainBorder,nullptr}, {CollisionTemplate::WriteMacroVars, nullptr}, {CollisionTemplate::ApplyBodyForce, nullptr}, {CollisionTemplate::AllFeatures, nullptr}}; std::map<CollisionTemplate, uint > numberOfTaggedFluidNodes = {{CollisionTemplate::Default, 0}, - {CollisionTemplate::Border, 0}, + {CollisionTemplate::SubDomainBorder,0}, {CollisionTemplate::WriteMacroVars, 0}, {CollisionTemplate::ApplyBodyForce, 0}, {CollisionTemplate::AllFeatures, 0}}; @@ -778,6 +778,8 @@ public: real getScaledDensityRatio(int level); //! \returns the pressure ratio in SI/LB units scaled to the respective level real getScaledPressureRatio(int level); + //! \returns the stress ratio in SI/LB units scaled to the respective level + real getScaledStressRatio(int level); //! \returns the time ratio in SI/LB units scaled to the respective level real getScaledTimeRatio(int level); //! \returns the length ratio in SI/LB units scaled to the respective level diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu index 431f40f2939b0c2c1e480f3fe589b09106e3ce10..72d349ff50e62fa8d3c1cd6cab59a66769adeba0 100644 --- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu +++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu @@ -14,6 +14,9 @@ #include "GPU/CudaMemoryManager.h" #include <lbm/constants/NumericConstants.h> #include <logger/Logger.h> +#include <ostream> + +#include "Output/Timer.h" using namespace vf::lbm::constant; @@ -267,63 +270,102 @@ void ActuatorFarm::addTurbine(real posX, real posY, real posZ, real diameter, re void ActuatorFarm::init(Parameter* para, GridProvider* gridProvider, CudaMemoryManager* cudaMemoryManager) { - if(!para->getIsBodyForce()) throw std::runtime_error("try to allocate ActuatorFarm but BodyForce is not set in Parameter."); + if (!para->getIsBodyForce()) + throw std::runtime_error("try to allocate ActuatorFarm but BodyForce is not set in Parameter."); this->forceRatio = para->getForceRatio(); this->initTurbineGeometries(cudaMemoryManager); - this->initBladeCoords(cudaMemoryManager); + this->initBladeCoords(cudaMemoryManager); this->initBladeIndices(para, cudaMemoryManager); this->initBladeVelocities(cudaMemoryManager); - this->initBladeForces(cudaMemoryManager); - this->initBoundingSpheres(para, cudaMemoryManager); + this->initBladeForces(cudaMemoryManager); + this->initBoundingSpheres(para, cudaMemoryManager); this->streamIndex = 0; + + bladeTimer = new Timer("ALM blade performance"); + bladeTimer->initTimer(); } -void ActuatorFarm::interact(Parameter* para, CudaMemoryManager* cudaMemoryManager, int level, unsigned int t) +void ActuatorFarm::interact(Parameter* para, CudaMemoryManager* cudaMemoryManager, int currentLevel, unsigned int t) { - if (level != this->level) return; + if (currentLevel != this->level) return; + bool useTimer = false; cudaStream_t stream = para->getStreamManager()->getStream(CudaStreamIndex::ActuatorFarm, this->streamIndex); + if (useTimer) + std::cout << "ActuatorFarm::interact: level = " << currentLevel << ", t = " << t << " useHostArrays = " << useHostArrays <<std::endl; + bladeTimer->startTimer(); + if(useHostArrays) cudaMemoryManager->cudaCopyBladeCoordsHtoD(this); - vf::cuda::CudaGrid bladeGrid = vf::cuda::CudaGrid(para->getParH(level)->numberofthreads, this->numberOfNodes); + vf::cuda::CudaGrid bladeGrid = vf::cuda::CudaGrid(para->getParH(currentLevel)->numberofthreads, this->numberOfNodes); + + if (useTimer) + std::cout << " cudaCopyBladeCoordsHtoD, " << bladeTimer->startStopGetElapsed() << std::endl; interpolateVelocities<<< bladeGrid.grid, bladeGrid.threads, 0, stream >>>( para->getParD(this->level)->coordinateX, para->getParD(this->level)->coordinateY, para->getParD(this->level)->coordinateZ, para->getParD(this->level)->neighborX, para->getParD(this->level)->neighborY, para->getParD(this->level)->neighborZ, para->getParD(this->level)->neighborInverse, para->getParD(this->level)->velocityX, para->getParD(this->level)->velocityY, para->getParD(this->level)->velocityZ, - this->bladeCoordsXDNew, this->bladeCoordsYDNew, this->bladeCoordsZDNew, - this->bladeVelocitiesXDNew, this->bladeVelocitiesYDNew, this->bladeVelocitiesZDNew, + this->bladeCoordsXDCurrentTimestep, this->bladeCoordsYDCurrentTimestep, this->bladeCoordsZDCurrentTimestep, + this->bladeVelocitiesXDCurrentTimestep, this->bladeVelocitiesYDCurrentTimestep, this->bladeVelocitiesZDCurrentTimestep, this->numberOfTurbines, this->numberOfBlades, this->numberOfBladeNodes, this->azimuthsD, this->yawsD, this->omegasD, this->turbinePosXD, this->turbinePosYD, this->turbinePosZD, this->bladeIndicesD, para->getVelocityRatio(), this->invDeltaX); + if (useTimer) + std::cout << " interpolateVelocities, " << bladeTimer->startStopGetElapsed() << std::endl; + cudaStreamSynchronize(stream); if(useHostArrays) cudaMemoryManager->cudaCopyBladeVelocitiesDtoH(this); + + if (useTimer) + std::cout << " cudaCopyBladeVelocitiesDtoH, " << bladeTimer->startStopGetElapsed() << std::endl; + this->calcBladeForces(); + + if (useTimer) + std::cout << " calcBladeForces, " << bladeTimer->startStopGetElapsed() << std::endl; + this->swapDeviceArrays(); if(useHostArrays) cudaMemoryManager->cudaCopyBladeForcesHtoD(this); - vf::cuda::CudaGrid sphereGrid = vf::cuda::CudaGrid(para->getParH(level)->numberofthreads, this->numberOfIndices); + if (useTimer) + std::cout << " cudaCopyBladeForcesHtoD, " << bladeTimer->startStopGetElapsed() << std::endl; + + vf::cuda::CudaGrid sphereGrid = vf::cuda::CudaGrid(para->getParH(currentLevel)->numberofthreads, this->numberOfIndices); applyBodyForces<<<sphereGrid.grid, sphereGrid.threads, 0, stream>>>( para->getParD(this->level)->coordinateX, para->getParD(this->level)->coordinateY, para->getParD(this->level)->coordinateZ, para->getParD(this->level)->forceX_SP, para->getParD(this->level)->forceY_SP, para->getParD(this->level)->forceZ_SP, - this->bladeCoordsXDNew, this->bladeCoordsYDNew, this->bladeCoordsZDNew, - this->bladeForcesXDNew, this->bladeForcesYDNew, this->bladeForcesZDNew, + this->bladeCoordsXDCurrentTimestep, this->bladeCoordsYDCurrentTimestep, this->bladeCoordsZDCurrentTimestep, + this->bladeForcesXDCurrentTimestep, this->bladeForcesYDCurrentTimestep, this->bladeForcesZDCurrentTimestep, this->numberOfTurbines, this->numberOfBlades, this->numberOfBladeNodes, this->azimuthsD, this->yawsD, this->diametersD, this->turbinePosXD, this->turbinePosYD, this->turbinePosZD, this->boundingSphereIndicesD, this->numberOfIndices, this->invEpsilonSqrd, this->factorGaussian); + + if (useTimer) + std::cout << " applyBodyForces, " << bladeTimer->startStopGetElapsed() << std::endl; + cudaMemoryManager->cudaCopyBladeOrientationsHtoD(this); + + if (useTimer) + std::cout << " cudaCopyBladeOrientationsHtoD, " << bladeTimer->startStopGetElapsed() << std::endl; + if (useTimer) + std::cout << "total time, " << bladeTimer->getTotalElapsedTime() << std::endl; + bladeTimer->resetTimer(); + cudaStreamSynchronize(stream); + + } -void ActuatorFarm::free(Parameter* para, CudaMemoryManager* cudaMemoryManager) +void ActuatorFarm::free(Parameter* /*para*/, CudaMemoryManager* cudaMemoryManager) { cudaMemoryManager->cudaFreeBladeGeometries(this); cudaMemoryManager->cudaFreeBladeOrientations(this); @@ -434,9 +476,9 @@ void ActuatorFarm::initBladeCoords(CudaMemoryManager* cudaMemoryManager) } } cudaMemoryManager->cudaCopyBladeCoordsHtoD(this); - swapArrays(this->bladeCoordsXDNew, this->bladeCoordsXDOld); - swapArrays(this->bladeCoordsYDNew, this->bladeCoordsYDOld); - swapArrays(this->bladeCoordsZDNew, this->bladeCoordsZDOld); + swapArrays(this->bladeCoordsXDCurrentTimestep, this->bladeCoordsXDPreviousTimestep); + swapArrays(this->bladeCoordsYDCurrentTimestep, this->bladeCoordsYDPreviousTimestep); + swapArrays(this->bladeCoordsZDCurrentTimestep, this->bladeCoordsZDPreviousTimestep); cudaMemoryManager->cudaCopyBladeCoordsHtoD(this); } @@ -449,9 +491,9 @@ void ActuatorFarm::initBladeVelocities(CudaMemoryManager* cudaMemoryManager) std::fill_n(this->bladeVelocitiesZH, this->numberOfNodes, c0o1); cudaMemoryManager->cudaCopyBladeVelocitiesHtoD(this); - swapArrays(this->bladeVelocitiesXDNew, this->bladeVelocitiesXDOld); - swapArrays(this->bladeVelocitiesYDNew, this->bladeVelocitiesYDOld); - swapArrays(this->bladeVelocitiesZDNew, this->bladeVelocitiesZDOld); + swapArrays(this->bladeVelocitiesXDCurrentTimestep, this->bladeVelocitiesXDPreviousTimestep); + swapArrays(this->bladeVelocitiesYDCurrentTimestep, this->bladeVelocitiesYDPreviousTimestep); + swapArrays(this->bladeVelocitiesZDCurrentTimestep, this->bladeVelocitiesZDPreviousTimestep); cudaMemoryManager->cudaCopyBladeVelocitiesHtoD(this); } @@ -464,9 +506,9 @@ void ActuatorFarm::initBladeForces(CudaMemoryManager* cudaMemoryManager) std::fill_n(this->bladeForcesZH, this->numberOfNodes, c0o1); cudaMemoryManager->cudaCopyBladeForcesHtoD(this); - swapArrays(this->bladeForcesXDNew, this->bladeForcesXDOld); - swapArrays(this->bladeForcesYDNew, this->bladeForcesYDOld); - swapArrays(this->bladeForcesZDNew, this->bladeForcesZDOld); + swapArrays(this->bladeForcesXDCurrentTimestep, this->bladeForcesXDPreviousTimestep); + swapArrays(this->bladeForcesYDCurrentTimestep, this->bladeForcesYDPreviousTimestep); + swapArrays(this->bladeForcesZDCurrentTimestep, this->bladeForcesZDPreviousTimestep); cudaMemoryManager->cudaCopyBladeForcesHtoD(this); } @@ -580,15 +622,15 @@ void ActuatorFarm::setTurbineBladeForces(uint turbine, real* _bladeForcesX, real void ActuatorFarm::swapDeviceArrays() { - swapArrays(this->bladeCoordsXDOld, this->bladeCoordsXDNew); - swapArrays(this->bladeCoordsYDOld, this->bladeCoordsYDNew); - swapArrays(this->bladeCoordsZDOld, this->bladeCoordsZDNew); + swapArrays(this->bladeCoordsXDPreviousTimestep, this->bladeCoordsXDCurrentTimestep); + swapArrays(this->bladeCoordsYDPreviousTimestep, this->bladeCoordsYDCurrentTimestep); + swapArrays(this->bladeCoordsZDPreviousTimestep, this->bladeCoordsZDCurrentTimestep); - swapArrays(this->bladeVelocitiesXDOld, this->bladeVelocitiesXDNew); - swapArrays(this->bladeVelocitiesYDOld, this->bladeVelocitiesYDNew); - swapArrays(this->bladeVelocitiesZDOld, this->bladeVelocitiesZDNew); + swapArrays(this->bladeVelocitiesXDPreviousTimestep, this->bladeVelocitiesXDCurrentTimestep); + swapArrays(this->bladeVelocitiesYDPreviousTimestep, this->bladeVelocitiesYDCurrentTimestep); + swapArrays(this->bladeVelocitiesZDPreviousTimestep, this->bladeVelocitiesZDCurrentTimestep); - swapArrays(this->bladeForcesXDOld, this->bladeForcesXDNew); - swapArrays(this->bladeForcesYDOld, this->bladeForcesYDNew); - swapArrays(this->bladeForcesZDOld, this->bladeForcesZDNew); + swapArrays(this->bladeForcesXDPreviousTimestep, this->bladeForcesXDCurrentTimestep); + swapArrays(this->bladeForcesYDPreviousTimestep, this->bladeForcesYDCurrentTimestep); + swapArrays(this->bladeForcesZDPreviousTimestep, this->bladeForcesZDCurrentTimestep); } \ No newline at end of file diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h index c1dd1add5f508cd1dac29cd9a8672ceb47e86c6d..e6066e28620581324cf105e384b939c8deda075b 100644 --- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h +++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h @@ -10,6 +10,7 @@ using namespace vf::lbm::constant; class Parameter; class GridProvider; +class Timer; using namespace vf::lbm::constant; class ActuatorFarm : public PreCollisionInteractor @@ -44,10 +45,7 @@ public: throw std::runtime_error("ActuatorFarm::ActuatorFarm: epsilon needs to be larger than dx!"); } - virtual ~ActuatorFarm() - { - - } + ~ActuatorFarm() override = default; void addTurbine(real turbinePosX, real turbinePosY, real turbinePosZ, real diameter, real omega, real azimuth, real yaw, std::vector<real> bladeRadii); void init(Parameter* para, GridProvider* gridProvider, CudaMemoryManager* cudaManager) override; void interact(Parameter* para, CudaMemoryManager* cudaManager, int level, uint t) override; @@ -106,26 +104,26 @@ public: real* getTurbineBladeForcesZ(uint turbine){ return &this->bladeForcesZH[turbine*numberOfBladeNodes*numberOfBlades]; }; real* getAllBladeRadiiDevice(){ return this->bladeRadiiD; }; - real* getAllBladeCoordsXDevice(){ return this->bladeCoordsXDNew; }; - real* getAllBladeCoordsYDevice(){ return this->bladeCoordsYDNew; }; - real* getAllBladeCoordsZDevice(){ return this->bladeCoordsZDNew; }; - real* getAllBladeVelocitiesXDevice(){ return this->bladeVelocitiesXDNew; }; - real* getAllBladeVelocitiesYDevice(){ return this->bladeVelocitiesYDNew; }; - real* getAllBladeVelocitiesZDevice(){ return this->bladeVelocitiesZDNew; }; - real* getAllBladeForcesXDevice(){ return this->bladeForcesXDNew; }; - real* getAllBladeForcesYDevice(){ return this->bladeForcesYDNew; }; - real* getAllBladeForcesZDevice(){ return this->bladeForcesZDNew; }; + real* getAllBladeCoordsXDevice(){ return this->bladeCoordsXDCurrentTimestep; }; + real* getAllBladeCoordsYDevice(){ return this->bladeCoordsYDCurrentTimestep; }; + real* getAllBladeCoordsZDevice(){ return this->bladeCoordsZDCurrentTimestep; }; + real* getAllBladeVelocitiesXDevice(){ return this->bladeVelocitiesXDCurrentTimestep; }; + real* getAllBladeVelocitiesYDevice(){ return this->bladeVelocitiesYDCurrentTimestep; }; + real* getAllBladeVelocitiesZDevice(){ return this->bladeVelocitiesZDCurrentTimestep; }; + real* getAllBladeForcesXDevice(){ return this->bladeForcesXDCurrentTimestep; }; + real* getAllBladeForcesYDevice(){ return this->bladeForcesYDCurrentTimestep; }; + real* getAllBladeForcesZDevice(){ return this->bladeForcesZDCurrentTimestep; }; real* getTurbineBladeRadiiDevice(uint turbine){ return &this->bladeRadiiD[turbine*numberOfBladeNodes]; }; - real* getTurbineBladeCoordsXDevice(uint turbine){ return &this->bladeCoordsXDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; - real* getTurbineBladeCoordsYDevice(uint turbine){ return &this->bladeCoordsYDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; - real* getTurbineBladeCoordsZDevice(uint turbine){ return &this->bladeCoordsZDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; - real* getTurbineBladeVelocitiesXDevice(uint turbine){ return &this->bladeVelocitiesXDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; - real* getTurbineBladeVelocitiesYDevice(uint turbine){ return &this->bladeVelocitiesYDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; - real* getTurbineBladeVelocitiesZDevice(uint turbine){ return &this->bladeVelocitiesZDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; - real* getTurbineBladeForcesXDevice(uint turbine){ return &this->bladeForcesXDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; - real* getTurbineBladeForcesYDevice(uint turbine){ return &this->bladeForcesYDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; - real* getTurbineBladeForcesZDevice(uint turbine){ return &this->bladeForcesZDNew[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeCoordsXDevice(uint turbine){ return &this->bladeCoordsXDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeCoordsYDevice(uint turbine){ return &this->bladeCoordsYDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeCoordsZDevice(uint turbine){ return &this->bladeCoordsZDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeVelocitiesXDevice(uint turbine){ return &this->bladeVelocitiesXDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeVelocitiesYDevice(uint turbine){ return &this->bladeVelocitiesYDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeVelocitiesZDevice(uint turbine){ return &this->bladeVelocitiesZDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeForcesXDevice(uint turbine){ return &this->bladeForcesXDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeForcesYDevice(uint turbine){ return &this->bladeForcesYDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; + real* getTurbineBladeForcesZDevice(uint turbine){ return &this->bladeForcesZDCurrentTimestep[turbine*numberOfBladeNodes*numberOfBlades]; }; void setAllAzimuths(real* _azimuth); void setAllOmegas(real* _omegas); @@ -166,14 +164,14 @@ public: real* bladeRadiiH; real* bladeRadiiD; real* bladeCoordsXH, * bladeCoordsYH, * bladeCoordsZH; - real* bladeCoordsXDNew, * bladeCoordsYDNew, * bladeCoordsZDNew; - real* bladeCoordsXDOld, * bladeCoordsYDOld, * bladeCoordsZDOld; + real* bladeCoordsXDPreviousTimestep, * bladeCoordsYDPreviousTimestep, * bladeCoordsZDPreviousTimestep; + real* bladeCoordsXDCurrentTimestep, * bladeCoordsYDCurrentTimestep, * bladeCoordsZDCurrentTimestep; real* bladeVelocitiesXH, * bladeVelocitiesYH, * bladeVelocitiesZH; - real* bladeVelocitiesXDOld, * bladeVelocitiesYDOld, * bladeVelocitiesZDOld; - real* bladeVelocitiesXDNew, * bladeVelocitiesYDNew, * bladeVelocitiesZDNew; + real* bladeVelocitiesXDPreviousTimestep, * bladeVelocitiesYDPreviousTimestep, * bladeVelocitiesZDPreviousTimestep; + real* bladeVelocitiesXDCurrentTimestep, * bladeVelocitiesYDCurrentTimestep, * bladeVelocitiesZDCurrentTimestep; real* bladeForcesXH, * bladeForcesYH, * bladeForcesZH; - real* bladeForcesXDOld, * bladeForcesYDOld, * bladeForcesZDOld; - real* bladeForcesXDNew, * bladeForcesYDNew, * bladeForcesZDNew; + real* bladeForcesXDPreviousTimestep, * bladeForcesYDPreviousTimestep, * bladeForcesZDPreviousTimestep; + real* bladeForcesXDCurrentTimestep, * bladeForcesYDCurrentTimestep, * bladeForcesZDCurrentTimestep; uint* bladeIndicesH; uint* bladeIndicesD; uint* boundingSphereIndicesH; @@ -195,6 +193,8 @@ private: uint numberOfNodes; real forceRatio, factorGaussian, invEpsilonSqrd, invDeltaX; int streamIndex; + + Timer* bladeTimer = nullptr; }; -#endif \ No newline at end of file +#endif diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu index 875d3f2a0d36bef575900082efd0bd51edb0b263..aacb1721ad90e9178b3c2ccf49a2aa9ec79d5504 100644 --- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu +++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.cu @@ -30,19 +30,19 @@ void index2d(int idx, int& y, int& z, int ny, int nz) y = idx-ny*z; } -__inline__ __host__ __device__ uint lIndex(const uint component, const uint node, const uint timestep, const uint nComponents, const uint nNodes) +__inline__ __host__ __device__ uint linearIdx(const uint component, const uint node, const uint timestep, const uint numberOfComponents, const uint numberOfNodes) { - return node+nNodes*(component+timestep*nComponents); + return node+numberOfNodes*(component+numberOfComponents*timestep); } -__inline__ __host__ __device__ uint lIndex(const uint component, const uint node, const uint nNodes) +__inline__ __host__ __device__ uint linearIdx(const uint component, const uint node, const uint numberOfNodes) { - return node+component*nNodes; + return node+component*numberOfNodes; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -__global__ void fillArrayVelocities(const uint nNodes, +__global__ void fillArrayVelocities(const uint numberOfPrecursorNodes, uint* indices, real *precursorData, real *vx, @@ -54,16 +54,17 @@ __global__ void fillArrayVelocities(const uint nNodes, { const uint node = vf::gpu::getNodeIndex(); - if(node>=nNodes) return; + if(node>=numberOfPrecursorNodes) return; - precursorData[lIndex(0u, node, nNodes)] = vx[indices[node]]*velocityRatio; - precursorData[lIndex(1u, node, nNodes)] = vy[indices[node]]*velocityRatio; - precursorData[lIndex(2u, node, nNodes)] = vz[indices[node]]*velocityRatio; + precursorData[linearIdx(0u, node, numberOfPrecursorNodes)] = vx[indices[node]]*velocityRatio; + precursorData[linearIdx(1u, node, numberOfPrecursorNodes)] = vy[indices[node]]*velocityRatio; + precursorData[linearIdx(2u, node, numberOfPrecursorNodes)] = vz[indices[node]]*velocityRatio; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -__global__ void fillArrayDistributions( uint nNodes, uint* indices, +__global__ void fillArrayDistributions( uint numberOfPrecursorNodes, + uint* indices, real* precursorData, real* distributions, uint* neighborX, uint* neighborY, uint* neighborZ, @@ -72,7 +73,7 @@ __global__ void fillArrayDistributions( uint nNodes, uint* indices, { const uint node = vf::gpu::getNodeIndex(); - if(node>=nNodes) return; + if(node>=numberOfPrecursorNodes) return; Distributions27 dist = vf::gpu::getDistributionReferences27(distributions, numberOfLBnodes, isEvenTimestep); @@ -90,15 +91,15 @@ __global__ void fillArrayDistributions( uint nNodes, uint* indices, //////////////////////////////////////////////////////////////////////////////////// //! - Get local distributions in PX directions //! - precursorData[lIndex(PrecP00, node, nNodes)] = (dist.f[DIR_P00])[k_000]; - precursorData[lIndex(PrecPP0, node, nNodes)] = (dist.f[DIR_PP0])[k_000]; - precursorData[lIndex(PrecPM0, node, nNodes)] = (dist.f[DIR_PM0])[k_0M0]; - precursorData[lIndex(PrecP0P, node, nNodes)] = (dist.f[DIR_P0P])[k_000]; - precursorData[lIndex(PrecP0M, node, nNodes)] = (dist.f[DIR_P0M])[k_00M]; - precursorData[lIndex(PrecPPP, node, nNodes)] = (dist.f[DIR_PPP])[k_000]; - precursorData[lIndex(PrecPMP, node, nNodes)] = (dist.f[DIR_PMP])[k_0M0]; - precursorData[lIndex(PrecPPM, node, nNodes)] = (dist.f[DIR_PPM])[k_00M]; - precursorData[lIndex(PrecPMM, node, nNodes)] = (dist.f[DIR_PMM])[k_0MM]; + precursorData[linearIdx(PrecP00, node, numberOfPrecursorNodes)] = (dist.f[DIR_P00])[k_000]; + precursorData[linearIdx(PrecPP0, node, numberOfPrecursorNodes)] = (dist.f[DIR_PP0])[k_000]; + precursorData[linearIdx(PrecPM0, node, numberOfPrecursorNodes)] = (dist.f[DIR_PM0])[k_0M0]; + precursorData[linearIdx(PrecP0P, node, numberOfPrecursorNodes)] = (dist.f[DIR_P0P])[k_000]; + precursorData[linearIdx(PrecP0M, node, numberOfPrecursorNodes)] = (dist.f[DIR_P0M])[k_00M]; + precursorData[linearIdx(PrecPPP, node, numberOfPrecursorNodes)] = (dist.f[DIR_PPP])[k_000]; + precursorData[linearIdx(PrecPMP, node, numberOfPrecursorNodes)] = (dist.f[DIR_PMP])[k_0M0]; + precursorData[linearIdx(PrecPPM, node, numberOfPrecursorNodes)] = (dist.f[DIR_PPM])[k_00M]; + precursorData[linearIdx(PrecPMM, node, numberOfPrecursorNodes)] = (dist.f[DIR_PMM])[k_0MM]; } @@ -163,23 +164,23 @@ void PrecursorWriter::init(Parameter* para, GridProvider* gridProvider, CudaMemo } precursorStructs[level] = SPtr<PrecursorStruct>(new PrecursorStruct); - precursorStructs[level]->nPoints = (uint)indicesOnGrid.size(); - precursorStructs[level]->indicesOnPlane = (int*) malloc(precursorStructs[level]->nPoints*sizeof(int)); + precursorStructs[level]->numberOfPointsInBC = (uint)indicesOnGrid.size(); + precursorStructs[level]->indicesOnPlane = (int*) malloc(precursorStructs[level]->numberOfPointsInBC*sizeof(int)); precursorStructs[level]->spacing = makeUbTuple(dx, dx, tSave*para->getTimeRatio()*pow(2,-level)); precursorStructs[level]->origin = makeUbTuple(lowestY, lowestZ); precursorStructs[level]->extent = makeUbTuple(0, ny-1, 0, nz-1); - precursorStructs[level]->nPointsInPlane = ny*nz; - precursorStructs[level]->timestepsPerFile = min(para->getlimitOfNodesForVTK()/(ny*nz), maxtimestepsPerFile); - precursorStructs[level]->filesWritten = 0; - precursorStructs[level]->timestepsBuffered = 0; + precursorStructs[level]->numberOfPointsInData = ny*nz; + precursorStructs[level]->numberOfTimestepsPerFile = min(para->getlimitOfNodesForVTK()/(ny*nz), maxtimestepsPerFile); + precursorStructs[level]->numberOfFilesWritten = 0; + precursorStructs[level]->numberOfTimestepsBuffered = 0; switch (outputVariable) { case OutputVariable::Velocities: - precursorStructs[level]->nQuantities = 3; + precursorStructs[level]->numberOfQuantities = 3; break; case OutputVariable::Distributions: - precursorStructs[level]->nQuantities = 9; + precursorStructs[level]->numberOfQuantities = 9; break; default: @@ -193,7 +194,7 @@ void PrecursorWriter::init(Parameter* para, GridProvider* gridProvider, CudaMemo cudaManager->cudaCopyPrecursorWriterIndicesHtoD(this, level); - VF_LOG_INFO("Found {} points in precursor plane on level {}", precursorStructs[level]->nPoints, level); + VF_LOG_INFO("Found {} points in precursor plane on level {}", precursorStructs[level]->numberOfPointsInBC, level); } VF_LOG_INFO("PrecursorWriter: Done initializing."); } @@ -207,11 +208,11 @@ void PrecursorWriter::interact(Parameter* para, CudaMemoryManager* cudaManager, if(t_level>tStartOut_level && ((t_level-tStartOut_level) % tSave)==0) { - vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParH(level)->numberofthreads, precursorStructs[level]->nPoints); + vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(para->getParH(level)->numberofthreads, precursorStructs[level]->numberOfPointsInBC); if(this->outputVariable==OutputVariable::Velocities) { - fillArrayVelocities<<<grid.grid, grid.threads>>>( precursorStructs[level]->nPoints, precursorStructs[level]->indicesD, + fillArrayVelocities<<<grid.grid, grid.threads>>>( precursorStructs[level]->numberOfPointsInBC, precursorStructs[level]->indicesD, precursorStructs[level]->bufferD, para->getParD(level)->velocityX, para->getParD(level)->velocityY, para->getParD(level)->velocityZ, para->getVelocityRatio()); @@ -219,7 +220,7 @@ void PrecursorWriter::interact(Parameter* para, CudaMemoryManager* cudaManager, } else if(this->outputVariable==OutputVariable::Distributions) { - fillArrayDistributions<<<grid.grid, grid.threads>>>(precursorStructs[level]->nPoints, precursorStructs[level]->indicesD, + fillArrayDistributions<<<grid.grid, grid.threads>>>(precursorStructs[level]->numberOfPointsInBC, precursorStructs[level]->indicesD, precursorStructs[level]->bufferD, para->getParD(level)->distributions.f[0], para->getParD(level)->neighborX, para->getParD(level)->neighborY, para->getParD(level)->neighborZ, @@ -233,9 +234,9 @@ void PrecursorWriter::interact(Parameter* para, CudaMemoryManager* cudaManager, precursorStructs[level]->bufferD = precursorStructs[level]->dataD; precursorStructs[level]->dataD = tmp; - precursorStructs[level]->timestepsBuffered++; + precursorStructs[level]->numberOfTimestepsBuffered++; - if(precursorStructs[level]->timestepsBuffered >= precursorStructs[level]->timestepsPerFile || t == para->getTimestepEnd()) + if(precursorStructs[level]->numberOfTimestepsBuffered >= precursorStructs[level]->numberOfTimestepsPerFile || t == para->getTimestepEnd()) { // switch host buffer and data pointer so precursor data is copied in buffer and written from data @@ -244,8 +245,8 @@ void PrecursorWriter::interact(Parameter* para, CudaMemoryManager* cudaManager, precursorStructs[level]->dataH = tmp; writeFuture.wait(); - writeFuture = std::async(std::launch::async, [this](Parameter* para, uint level, uint timesteps){ this->write(para, level, timesteps); }, para, level, precursorStructs[level]->timestepsBuffered); - precursorStructs[level]->timestepsBuffered = 0; + writeFuture = std::async(std::launch::async, [this](Parameter* para, uint level, uint timesteps){ this->write(para, level, timesteps); }, para, level, precursorStructs[level]->numberOfTimestepsBuffered); + precursorStructs[level]->numberOfTimestepsBuffered = 0; } } } @@ -256,40 +257,40 @@ void PrecursorWriter::free(Parameter* para, CudaMemoryManager* cudaManager) writeFuture.wait(); for(int level=0; level<=para->getMaxLevel(); level++) { - if(getPrecursorStruct(level)->timestepsBuffered>0) - write(para, level, getPrecursorStruct(level)->timestepsBuffered); + if(getPrecursorStruct(level)->numberOfTimestepsBuffered>0) + write(para, level, getPrecursorStruct(level)->numberOfTimestepsBuffered); cudaManager->cudaFreePrecursorWriter(this, level); } } -void PrecursorWriter::write(Parameter* para, int level, uint timestepsBuffered) +void PrecursorWriter::write(Parameter* para, int level, uint numberOfTimestepsBuffered) { - std::string fname = this->makeFileName(fileName, level, para->getMyProcessID(), precursorStructs[level]->filesWritten) + getWriter()->getFileExtension(); + std::string fname = this->makeFileName(fileName, level, para->getMyProcessID(), precursorStructs[level]->numberOfFilesWritten) + getWriter()->getFileExtension(); std::string wholeName = outputPath + "/" + fname; - uint nPointsInPlane = precursorStructs[level]->nPointsInPlane; + uint numberOfPointsInData = precursorStructs[level]->numberOfPointsInData; - int startTime = precursorStructs[level]->filesWritten*precursorStructs[level]->timestepsPerFile; + int startTime = precursorStructs[level]->numberOfFilesWritten*precursorStructs[level]->numberOfTimestepsPerFile; UbTupleInt6 extent = makeUbTuple( val<1>(precursorStructs[level]->extent), val<2>(precursorStructs[level]->extent), val<3>(precursorStructs[level]->extent), val<4>(precursorStructs[level]->extent), - startTime, startTime+(int)timestepsBuffered-1); + startTime, startTime+(int)numberOfTimestepsBuffered-1); UbTupleFloat3 origin = makeUbTuple( val<1>(precursorStructs[level]->origin), val<2>(precursorStructs[level]->origin), 0.f); std::vector<std::vector<double>> nodedata; - for(uint quant=0; quant<precursorStructs[level]->nQuantities; quant++) + for(uint quant=0; quant<precursorStructs[level]->numberOfQuantities; quant++) { - std::vector<double> doubleArr(nPointsInPlane*timestepsBuffered, NAN); - for( uint timestep=0; timestep<timestepsBuffered; timestep++) + std::vector<double> doubleArr(numberOfPointsInData*numberOfTimestepsBuffered, NAN); + for( uint timestep=0; timestep<numberOfTimestepsBuffered; timestep++) { - for (uint pos=0; pos < precursorStructs[level]->nPoints; pos++) + for (uint pos=0; pos < precursorStructs[level]->numberOfPointsInBC; pos++) { - int indexOnPlane = precursorStructs[level]->indicesOnPlane[pos]+timestep*nPointsInPlane; - doubleArr[indexOnPlane] = double(precursorStructs[level]->dataH[lIndex(quant, pos, timestep, precursorStructs[level]->nQuantities, precursorStructs[level]->nPoints)]); + int indexOnPlane = precursorStructs[level]->indicesOnPlane[pos]+timestep*numberOfPointsInData; + doubleArr[indexOnPlane] = double(precursorStructs[level]->dataH[linearIdx(quant, pos, timestep, precursorStructs[level]->numberOfQuantities, precursorStructs[level]->numberOfPointsInBC)]); } } nodedata.push_back(doubleArr); @@ -297,14 +298,14 @@ void PrecursorWriter::write(Parameter* para, int level, uint timestepsBuffered) std::vector<std::vector<double>> celldata; getWriter()->writeData(wholeName, nodedatanames, celldatanames, nodedata, celldata, extent, origin, precursorStructs[level]->spacing, extent, this->writePrecision); - precursorStructs[level]->filesWritten++; + precursorStructs[level]->numberOfFilesWritten++; } -std::string PrecursorWriter::makeFileName(std::string fileName, int level, int id, uint filesWritten) +std::string PrecursorWriter::makeFileName(std::string fileName, int level, int id, uint numberOfFilesWritten) { return fileName + "_lev_" + StringUtil::toString<int>(level) + "_ID_" + StringUtil::toString<int>(id) - + "_File_" + StringUtil::toString<int>(filesWritten); + + "_File_" + StringUtil::toString<int>(numberOfFilesWritten); } void PrecursorWriter::getTaggedFluidNodes(Parameter *para, GridProvider* gridProvider) @@ -313,7 +314,7 @@ void PrecursorWriter::getTaggedFluidNodes(Parameter *para, GridProvider* gridPro { if(outputVariable==OutputVariable::Velocities) { - std::vector<uint> indices(precursorStructs[level]->indicesH, precursorStructs[level]->indicesH+precursorStructs[level]->nPoints); + std::vector<uint> indices(precursorStructs[level]->indicesH, precursorStructs[level]->indicesH+precursorStructs[level]->numberOfPointsInBC); gridProvider->tagFluidNodeIndices(indices, CollisionTemplate::WriteMacroVars, level); } } diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.h b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.h index 8dc8e36fe57713513c58ed76637ab3fdc34a251f..3bae63a339255f3f72196e20096f6019cdd7748d 100644 --- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.h +++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/PrecursorWriter.h @@ -71,11 +71,11 @@ static constexpr uint PrecPMM = 8; struct PrecursorStruct { - uint nPoints, nPointsInPlane, timestepsPerFile, filesWritten, timestepsBuffered; + uint numberOfPointsInBC, numberOfPointsInData, numberOfTimestepsPerFile, numberOfFilesWritten, numberOfTimestepsBuffered; uint *indicesH, *indicesD; real *dataH, *dataD; real *bufferH, *bufferD; - uint nQuantities; + uint numberOfQuantities; UbTupleInt4 extent; UbTupleFloat2 origin; UbTupleFloat3 spacing; @@ -127,7 +127,7 @@ public: private: WbWriterVtkXmlImageBinary* getWriter(){ return WbWriterVtkXmlImageBinary::getInstance(); }; - void write(Parameter* para, int level, uint timestepsBuffered); + void write(Parameter* para, int level, uint numberOfTimestepsBuffered); std::vector<std::string> determineNodeDataNames() { @@ -158,4 +158,4 @@ private: uint writePrecision = 8; }; -#endif //PRECURSORPROBE_H_ \ No newline at end of file +#endif //PRECURSORPROBE_H_ diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.cu index 3bde6e8d80d947b2870935c967a00385f6ecfb24..03c18f5a9a2133bec244053113209abc70469a2a 100644 --- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.cu +++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.cu @@ -187,7 +187,7 @@ void Probe::init(Parameter* para, GridProvider* gridProvider, CudaMemoryManager* this->velocityRatio = std::bind(&Parameter::getScaledVelocityRatio, para, _1); this->densityRatio = std::bind(&Parameter::getScaledDensityRatio, para, _1); this->forceRatio = std::bind(&Parameter::getScaledForceRatio, para, _1); - this->stressRatio = std::bind(&Parameter::getScaledPressureRatio, para, _1); + this->stressRatio = std::bind(&Parameter::getScaledStressRatio, para, _1); this->viscosityRatio = std::bind(&Parameter::getScaledViscosityRatio, para, _1); this->nondimensional = std::bind(&Probe::getNondimensionalConversionFactor, this, _1); @@ -379,9 +379,10 @@ void Probe::writeParallelFile(Parameter* para, int t) int t_write = this->fileNameLU ? t: t/this->tOut; std::string filename = this->outputPath + "/" + this->makeParallelFileName(para->getMyProcessID(), t_write); + std::vector<std::string> nodedatanames = this->getVarNames(); std::vector<std::string> cellNames; - getWriter()->writeParallelFile(filename, fileNamesForCollectionFile, varNames, cellNames); + getWriter()->writeParallelFile(filename, fileNamesForCollectionFile, nodedatanames, cellNames); this->fileNamesForCollectionFile.clear(); } diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h index cc67a5535f76bba4be5c32604a684087b96725fb..aaf294e87d23c64707a16692b9337d6e9ff9c896 100644 --- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h +++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.h @@ -208,7 +208,6 @@ protected: bool hasDeviceQuantityArray; //!> flag initiating memCopy in Point and PlaneProbe. Other probes are only based on thrust reduce functions and therefore dont need explict memCopy in interact() bool outputTimeSeries; //!> flag initiating overwrite of output vtk files, skipping collection files and limiting the length of the written data to the current time step (currently only used for WallModelProbe) std::vector<std::string> fileNamesForCollectionFile; - std::vector<std::string> varNames; bool fileNameLU = true; //!> if true, written file name contains time step in LU, else is the number of the written probe files diff --git a/src/lbm/constants/D3Q27.h b/src/lbm/constants/D3Q27.h index 6a198e926477eff4534108686793400de3a7e042..b9c9d34f7004d1be2f90b6115f005fb2c8d0cbac 100644 --- a/src/lbm/constants/D3Q27.h +++ b/src/lbm/constants/D3Q27.h @@ -11,35 +11,87 @@ static constexpr int STARTDIR = 0; static constexpr int ENDDIR = 26; // used in the CPU and the GPU version -static constexpr int DIR_000 = 0; // REST -static constexpr int DIR_P00 = 1; // E -static constexpr int DIR_M00 = 2; // W -static constexpr int DIR_0P0 = 3; // N -static constexpr int DIR_0M0 = 4; // S -static constexpr int DIR_00P = 5; // T -static constexpr int DIR_00M = 6; // B - -static constexpr int DIR_PP0 = 7; // NE -static constexpr int DIR_MM0 = 8; // SW -static constexpr int DIR_PM0 = 9; // SE -static constexpr int DIR_MP0 = 10; // NW -static constexpr int DIR_P0P = 11; // TE -static constexpr int DIR_M0M = 12; // BW -static constexpr int DIR_P0M = 13; // BE -static constexpr int DIR_M0P = 14; // TW -static constexpr int DIR_0PP = 15; // TN -static constexpr int DIR_0MM = 16; // BS -static constexpr int DIR_0PM = 17; // BN -static constexpr int DIR_0MP = 18; // TS - -static constexpr int DIR_PPP = 19; // TNE -static constexpr int DIR_MPP = 20; // TNW -static constexpr int DIR_PMP = 21; // TSE -static constexpr int DIR_MMP = 22; // TSW -static constexpr int DIR_PPM = 23; // BNE -static constexpr int DIR_MPM = 24; // BNW -static constexpr int DIR_PMM = 25; // BSE -static constexpr int DIR_MMM = 26; // BSW +static constexpr int DIR_000 = 0; +static constexpr int DIR_P00 = 1; +static constexpr int DIR_M00 = 2; +static constexpr int DIR_0P0 = 3; +static constexpr int DIR_0M0 = 4; +static constexpr int DIR_00P = 5; +static constexpr int DIR_00M = 6; +static constexpr int DIR_PP0 = 7; +static constexpr int DIR_MM0 = 8; +static constexpr int DIR_PM0 = 9; +static constexpr int DIR_MP0 = 10; +static constexpr int DIR_P0P = 11; +static constexpr int DIR_M0M = 12; +static constexpr int DIR_P0M = 13; +static constexpr int DIR_M0P = 14; +static constexpr int DIR_0PP = 15; +static constexpr int DIR_0MM = 16; +static constexpr int DIR_0PM = 17; +static constexpr int DIR_0MP = 18; +static constexpr int DIR_PPP = 19; +static constexpr int DIR_MPP = 20; +static constexpr int DIR_PMP = 21; +static constexpr int DIR_MMP = 22; +static constexpr int DIR_PPM = 23; +static constexpr int DIR_MPM = 24; +static constexpr int DIR_PMM = 25; +static constexpr int DIR_MMM = 26; + +static constexpr int INV_P00 = DIR_M00; +static constexpr int INV_M00 = DIR_P00; +static constexpr int INV_0P0 = DIR_0M0; +static constexpr int INV_0M0 = DIR_0P0; +static constexpr int INV_00P = DIR_00M; +static constexpr int INV_00M = DIR_00P; +static constexpr int INV_PP0 = DIR_MM0; +static constexpr int INV_MM0 = DIR_PP0; +static constexpr int INV_PM0 = DIR_MP0; +static constexpr int INV_MP0 = DIR_PM0; +static constexpr int INV_P0P = DIR_M0M; +static constexpr int INV_M0M = DIR_P0P; +static constexpr int INV_P0M = DIR_M0P; +static constexpr int INV_M0P = DIR_P0M; +static constexpr int INV_0PP = DIR_0MM; +static constexpr int INV_0MM = DIR_0PP; +static constexpr int INV_0PM = DIR_0MP; +static constexpr int INV_0MP = DIR_0PM; +static constexpr int INV_PPP = DIR_MMM; +static constexpr int INV_MPP = DIR_PMM; +static constexpr int INV_PMP = DIR_MPM; +static constexpr int INV_MMP = DIR_PPM; +static constexpr int INV_PPM = DIR_MMP; +static constexpr int INV_MPM = DIR_PMP; +static constexpr int INV_PMM = DIR_MPP; +static constexpr int INV_MMM = DIR_PPP; + +static constexpr int SGD_P00 = 0; +static constexpr int SGD_M00 = 1; +static constexpr int SGD_0P0 = 2; +static constexpr int SGD_0M0 = 3; +static constexpr int SGD_00P = 4; +static constexpr int SGD_00M = 5; +static constexpr int SGD_PP0 = 6; +static constexpr int SGD_MM0 = 7; +static constexpr int SGD_PM0 = 8; +static constexpr int SGD_MP0 = 9; +static constexpr int SGD_P0P = 10; +static constexpr int SGD_M0M = 11; +static constexpr int SGD_P0M = 12; +static constexpr int SGD_M0P = 13; +static constexpr int SGD_0PP = 14; +static constexpr int SGD_0MM = 15; +static constexpr int SGD_0PM = 16; +static constexpr int SGD_0MP = 17; +static constexpr int SGD_PPP = 18; +static constexpr int SGD_MPP = 19; +static constexpr int SGD_PMP = 20; +static constexpr int SGD_MMP = 21; +static constexpr int SGD_PPM = 22; +static constexpr int SGD_MPM = 23; +static constexpr int SGD_PMM = 24; +static constexpr int SGD_MMM = 25; struct countersForPointerChasing{ uint counterInverse; diff --git a/src/mpi/MPICommunicator.h b/src/mpi/MPICommunicator.h index 96d7e3593acb6d94706c9842f176e96c7a0e8969..941bdac8f03d64184c17966ada27111193bbfa2d 100644 --- a/src/mpi/MPICommunicator.h +++ b/src/mpi/MPICommunicator.h @@ -142,16 +142,23 @@ void MPICommunicator::allGather(std::vector<T> &svalues, std::vector<T> &rvalues rvalues.resize(displs[numprocs - 1] + rcounts[numprocs - 1]); - if (rvalues.size() == 0) { - rvalues.resize(1); - rvalues[0] = 999; + T* sval = NULL; + T* rval = NULL; + + if (svalues.size() > 0) { + //svalues.resize(1); + //svalues[0] = 999; + sval = &svalues[0]; } - if (scount == 0) { - svalues.resize(1); - svalues[0] = 999; + + if (rvalues.size() > 0) { + //rvalues.resize(1); + //rvalues[0] = 999; + rval = &rvalues[0]; } - MPI_Allgatherv(&svalues[0], scount, mpiDataType, &rvalues[0], &rcounts[0], &displs[0], mpiDataType, comm); + //MPI_Allgatherv(&svalues[0], scount, mpiDataType, &rvalues[0], &rcounts[0], &displs[0], mpiDataType, comm); + MPI_Allgatherv(sval, scount, mpiDataType, rval, &rcounts[0], &displs[0], mpiDataType, comm); } ////////////////////////////////////////////////////////////////////////// template <class T> diff --git a/utilities/DirRename.py b/utilities/DirRename.py new file mode 100644 index 0000000000000000000000000000000000000000..3f01e630a931ec98454c9ac620c3f18d92d7e59a --- /dev/null +++ b/utilities/DirRename.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue Dec 6 13:21:27 2022 + +@author: kutscher +""" + +filename = "d:/temp/MultiphaseNonReflectingOutflowBCAlgorithm.cpp" + +#read input file +fin = open(filename, "rt") +#read file contents to string +data = fin.read() +#replace all occurrences of the required string +data = data.replace('[REST]','[DIR_000]') +data = data.replace('[TNE]', '[DIR_PPP]') +data = data.replace('[TNW]', '[DIR_MPP]') +data = data.replace('[TSE]', '[DIR_PMP]') +data = data.replace('[TSW]', '[DIR_MMP]') +data = data.replace('[BNE]', '[DIR_PPM]') +data = data.replace('[BNW]', '[DIR_MPM]') +data = data.replace('[BSE]', '[DIR_PMM]') +data = data.replace('[BSW]', '[DIR_MMM]') +data = data.replace('[NE]', '[DIR_PP0]') +data = data.replace('[SW]', '[DIR_MM0]') +data = data.replace('[SE]', '[DIR_PM0]') +data = data.replace('[NW]', '[DIR_MP0]') +data = data.replace('[TE]', '[DIR_P0P]') +data = data.replace('[BW]', '[DIR_M0M]') +data = data.replace('[BE]', '[DIR_P0M]') +data = data.replace('[TW]', '[DIR_M0P]') +data = data.replace('[TN]', '[DIR_0PP]') +data = data.replace('[BS]', '[DIR_0MM]') +data = data.replace('[BN]', '[DIR_0PM]') +data = data.replace('[TS]', '[DIR_0MP]') +data = data.replace('[NE ]', '[DIR_PP0]') +data = data.replace('[SW ]', '[DIR_MM0]') +data = data.replace('[SE ]', '[DIR_PM0]') +data = data.replace('[NW ]', '[DIR_MP0]') +data = data.replace('[TE ]', '[DIR_P0P]') +data = data.replace('[BW ]', '[DIR_M0M]') +data = data.replace('[BE ]', '[DIR_P0M]') +data = data.replace('[TW ]', '[DIR_M0P]') +data = data.replace('[TN ]', '[DIR_0PP]') +data = data.replace('[BS ]', '[DIR_0MM]') +data = data.replace('[BN ]', '[DIR_0PM]') +data = data.replace('[TS ]', '[DIR_0MP]') +data = data.replace('[E]', '[DIR_P00]') +data = data.replace('[W]', '[DIR_M00]') +data = data.replace('[N]', '[DIR_0P0]') +data = data.replace('[S]', '[DIR_0M0]') +data = data.replace('[T]', '[DIR_00P]') +data = data.replace('[B]', '[DIR_00M]') + +# data = data.replace('[REST]','[DIR_000]') +# data = data.replace('[E ]', '[DIR_P00]') +# data = data.replace('[W ]', '[DIR_M00]') +# data = data.replace('[N ]', '[DIR_0P0]') +# data = data.replace('[S ]', '[DIR_0M0]') +# data = data.replace('[T ]', '[DIR_00P]') +# data = data.replace('[B ]', '[DIR_00M]') +# data = data.replace('[NE ]', '[DIR_PP0]') +# data = data.replace('[SW ]', '[DIR_MM0]') +# data = data.replace('[SE ]', '[DIR_PM0]') +# data = data.replace('[NW ]', '[DIR_MP0]') +# data = data.replace('[TE ]', '[DIR_P0P]') +# data = data.replace('[BW ]', '[DIR_M0M]') +# data = data.replace('[BE ]', '[DIR_P0M]') +# data = data.replace('[TW ]', '[DIR_M0P]') +# data = data.replace('[TN ]', '[DIR_0PP]') +# data = data.replace('[BS ]', '[DIR_0MM]') +# data = data.replace('[BN ]', '[DIR_0PM]') +# data = data.replace('[TS ]', '[DIR_0MP]') +# data = data.replace('[TNE]', '[DIR_PPP]') +# data = data.replace('[TNW]', '[DIR_MPP]') +# data = data.replace('[TSE]', '[DIR_PMP]') +# data = data.replace('[TSW]', '[DIR_MMP]') +# data = data.replace('[BNE]', '[DIR_PPM]') +# data = data.replace('[BNW]', '[DIR_MPM]') +# data = data.replace('[BSE]', '[DIR_PMM]') +# data = data.replace('[BSW]', '[DIR_MMM]') + +# data = data.replace('D3Q27System::REST','[DIR_000]') +# data = data.replace('D3Q27System::E', '[DIR_P00]') +# data = data.replace('D3Q27System::W', '[DIR_M00]') +# data = data.replace('D3Q27System::N', '[DIR_0P0]') +# data = data.replace('D3Q27System::S', '[DIR_0M0]') +# data = data.replace('D3Q27System::T', '[DIR_00P]') +# data = data.replace('D3Q27System::B', '[DIR_00M]') +# data = data.replace('D3Q27System::NE', '[DIR_PP0]') +# data = data.replace('D3Q27System::SW', '[DIR_MM0]') +# data = data.replace('D3Q27System::SE', '[DIR_PM0]') +# data = data.replace('D3Q27System::NW', '[DIR_MP0]') +# data = data.replace('D3Q27System::TE', '[DIR_P0P]') +# data = data.replace('D3Q27System::BW', '[DIR_M0M]') +# data = data.replace('D3Q27System::BE', '[DIR_P0M]') +# data = data.replace('D3Q27System::TW', '[DIR_M0P]') +# data = data.replace('D3Q27System::TN', '[DIR_0PP]') +# data = data.replace('D3Q27System::BS', '[DIR_0MM]') +# data = data.replace('D3Q27System::BN', '[DIR_0PM]') +# data = data.replace('D3Q27System::TS', '[DIR_0MP]') +# data = data.replace('D3Q27System::TNE', '[DIR_PPP]') +# data = data.replace('D3Q27System::TNW', '[DIR_MPP]') +# data = data.replace('D3Q27System::TSE', '[DIR_PMP]') +# data = data.replace('D3Q27System::TSW', '[DIR_MMP]') +# data = data.replace('D3Q27System::BNE', '[DIR_PPM]') +# data = data.replace('D3Q27System::BNW', '[DIR_MPM]') +# data = data.replace('D3Q27System::BSE', '[DIR_PMM]') +# data = data.replace('D3Q27System::BSW', '[DIR_MMM]') + +data = data.replace('REST)','DIR_000)') +data = data.replace('TNE)', 'DIR_PPP)') +data = data.replace('TNW)', 'DIR_MPP)') +data = data.replace('TSE)', 'DIR_PMP)') +data = data.replace('TSW)', 'DIR_MMP)') +data = data.replace('BNE)', 'DIR_PPM)') +data = data.replace('BNW)', 'DIR_MPM)') +data = data.replace('BSE)', 'DIR_PMM)') +data = data.replace('BSW)', 'DIR_MMM)') +data = data.replace('NE)', 'DIR_PP0)') +data = data.replace('SW)', 'DIR_MM0)') +data = data.replace('SE)', 'DIR_PM0)') +data = data.replace('NW)', 'DIR_MP0)') +data = data.replace('TE)', 'DIR_P0P)') +data = data.replace('BW)', 'DIR_M0M)') +data = data.replace('BE)', 'DIR_P0M)') +data = data.replace('TW)', 'DIR_M0P)') +data = data.replace('TN)', 'DIR_0PP)') +data = data.replace('BS)', 'DIR_0MM)') +data = data.replace('BN)', 'DIR_0PM)') +data = data.replace('TS)', 'DIR_0MP)') +data = data.replace('E)', 'DIR_P00)') +data = data.replace('W)', 'DIR_M00)') +data = data.replace('N)', 'DIR_0P0)') +data = data.replace('S)', 'DIR_0M0)') +data = data.replace('T)', 'DIR_00P)') +data = data.replace('B)', 'DIR_00M)') + +# data = data.replace('REST','DIR_000') +# data = data.replace('TNE', 'DIR_PPP') +# data = data.replace('TNW', 'DIR_MPP') +# data = data.replace('TSE', 'DIR_PMP') +# data = data.replace('TSW', 'DIR_MMP') +# data = data.replace('BNE', 'DIR_PPM') +# data = data.replace('BNW', 'DIR_MPM') +# data = data.replace('BSE', 'DIR_PMM') +# data = data.replace('BSW', 'DIR_MMM') +# data = data.replace('NE', 'DIR_PP0') +# data = data.replace('SW', 'DIR_MM0') +# data = data.replace('SE', 'DIR_PM0') +# data = data.replace('NW', 'DIR_MP0') +# data = data.replace('TE', 'DIR_P0P') +# data = data.replace('BW', 'DIR_M0M') +# data = data.replace('BE', 'DIR_P0M') +# data = data.replace('TW', 'DIR_M0P') +# data = data.replace('TN', 'DIR_0PP') +# data = data.replace('BS', 'DIR_0MM') +# data = data.replace('BN', 'DIR_0PM') +# data = data.replace('TS', 'DIR_0MP') +# data = data.replace('E', 'DIR_P00') +# data = data.replace('W', 'DIR_M00') +# data = data.replace('N', 'DIR_0P0') +# data = data.replace('S', 'DIR_0M0') +# data = data.replace('T', 'DIR_00P') +# data = data.replace('B', 'DIR_00M') + +# text = 'bat::ball' + +# # replace b with c +# replaced_text = text.replace('b', 'c') +# print(replaced_text) + + +#close the input file +fin.close() +#open the input file in write mode +fin = open(filename, "wt") +#overrite the input file with the resulting data +fin.write(data) +#close the file +fin.close() \ No newline at end of file