#include "LBM/LB.h" #include <lbm/constants/NumericConstants.h> #include <lbm/constants/D3Q27.h> #include <lbm/MacroscopicQuantities.h> #include "VirtualFluids_GPU/Kernel/Utilities/DistributionHelper.cuh" #include "VirtualFluids_GPU/GPU/KernelUtilities.h" using namespace vf::lbm::constant; using namespace vf::lbm::dir; __global__ void QPrecursorDeviceCompZeroPress( int* subgridDistanceIndices, int numberOfBCnodes, int numberOfPrecursorNodes, int sizeQ, real omega, real* distributions, real* subgridDistances, uint* neighborX, uint* neighborY, uint* neighborZ, 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 timeRatio, real velocityRatio, unsigned long long numberOfLBnodes, bool isEvenTimestep) { const unsigned k = vf::gpu::getNodeIndex(); if(k>=numberOfBCnodes) return; //////////////////////////////////////////////////////////////////////////////// // interpolation of velocity real vxLastInterpd, vyLastInterpd, vzLastInterpd; real vxNextInterpd, vyNextInterpd, vzNextInterpd; uint kNeighbor0PP = neighbors0PP[k]; real d0PP = weights0PP[k]; real* vxLast = vLast; real* vyLast = &vLast[numberOfPrecursorNodes]; real* vzLast = &vLast[2*numberOfPrecursorNodes]; real* vxCurrent = vCurrent; real* vyCurrent = &vCurrent[numberOfPrecursorNodes]; real* vzCurrent = &vCurrent[2*numberOfPrecursorNodes]; 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); 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[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[kNeighbor0PP]; vyLastInterpd = vyLast[kNeighbor0PP]; vzLastInterpd = vzLast[kNeighbor0PP]; 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-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 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_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_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 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); // 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); ////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //! - Update distributions with subgrid distance (q) between zero and one real feq, q, velocityLB, velocityBC; q = (subgridD.q[DIR_P00])[k]; if (q>=c0o1 && q<=c1o1) // only update distribution for q between zero and one { velocityLB = vx1; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = VeloX; (dist.f[DIR_M00])[kM00] = getInterpolatedDistributionForVeloWithPressureBC(q, f_P00, f_M00, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_M00])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = -VeloX; (dist.f[DIR_P00])[kP00] = getInterpolatedDistributionForVeloWithPressureBC(q, f_M00, f_P00, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_0P0])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = VeloY; (dist.f[DIR_0M0])[DIR_0M0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0P0, f_0M0, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_0M0])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = -VeloY; (dist.f[DIR_0P0])[k0P0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0M0, f_0P0, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_00P])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = VeloZ; (dist.f[DIR_00M])[k00M] = getInterpolatedDistributionForVeloWithPressureBC(q, f_00P, f_00M, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_00M])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27); velocityBC = -VeloZ; (dist.f[DIR_00P])[k00P] = getInterpolatedDistributionForVeloWithPressureBC(q, f_00M, f_00P, feq, omega, drho, velocityBC, c2o27); } q = (subgridD.q[DIR_PP0])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx1 + vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloX + VeloY; (dist.f[DIR_MM0])[kMM0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PP0, f_MM0, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_MM0])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1 - vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloX - VeloY; (dist.f[DIR_PP0])[kPP0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MM0, f_PP0, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_PM0])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx1 - vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloX - VeloY; (dist.f[DIR_MP0])[kMP0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PM0, f_MP0, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_MP0])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1 + vx2; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloX + VeloY; (dist.f[DIR_PM0])[kPM0] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MP0, f_PM0, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_P0P])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx1 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloX + VeloZ; (dist.f[DIR_M0M])[kM0M] = getInterpolatedDistributionForVeloWithPressureBC(q, f_P0P, f_M0M, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_M0M])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloX - VeloZ; (dist.f[DIR_P0P])[kP0P] = getInterpolatedDistributionForVeloWithPressureBC(q, f_M0M, f_P0P, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_P0M])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx1 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloX - VeloZ; (dist.f[DIR_M0P])[kM0P] = getInterpolatedDistributionForVeloWithPressureBC(q, f_P0M, f_M0P, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_M0P])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloX + VeloZ; (dist.f[DIR_P0M])[kP0M] = getInterpolatedDistributionForVeloWithPressureBC(q, f_M0P, f_P0M, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_0PP])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloY + VeloZ; (dist.f[DIR_0MM])[k0MM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0PP, f_0MM, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_0MM])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloY - VeloZ; (dist.f[DIR_0PP])[k0PP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0MM, f_0PP, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_0PM])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = VeloY - VeloZ; (dist.f[DIR_0MP])[k0MP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0PM, f_0PP, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_0MP])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54); velocityBC = -VeloY + VeloZ; (dist.f[DIR_0PM])[k0PM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_0PP, f_0PM, feq, omega, drho, velocityBC, c1o54); } q = (subgridD.q[DIR_PPP])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx1 + vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = VeloX + VeloY + VeloZ; (dist.f[DIR_MMM])[kMMM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PPP, f_MMM, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_MMM])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1 - vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = -VeloX - VeloY - VeloZ; (dist.f[DIR_PPP])[kPPP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MMM, f_PPP, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_PPM])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx1 + vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = VeloX + VeloY - VeloZ; (dist.f[DIR_MMP])[kMMP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PPM, f_MMP, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_MMP])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1 - vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = -VeloX - VeloY + VeloZ; (dist.f[DIR_PPM])[kPPM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MMP, f_PPM, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_PMP])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx1 - vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = VeloX - VeloY + VeloZ; (dist.f[DIR_MPM])[kMPM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PMP, f_MPM, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_MPM])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1 + vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = -VeloX + VeloY - VeloZ; (dist.f[DIR_PMP])[kPMP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MPM, f_PMP, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_PMM])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = vx1 - vx2 - vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = VeloX - VeloY - VeloZ; (dist.f[DIR_MPP])[kMPP] = getInterpolatedDistributionForVeloWithPressureBC(q, f_PMM, f_MPP, feq, omega, drho, velocityBC, c1o216); } q = (subgridD.q[DIR_MPP])[k]; if (q>=c0o1 && q<=c1o1) { velocityLB = -vx1 + vx2 + vx3; feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216); velocityBC = -VeloX + VeloY + VeloZ; (dist.f[DIR_PMM])[kPMM] = getInterpolatedDistributionForVeloWithPressureBC(q, f_MPP, f_PMM, feq, omega, drho, velocityBC, c1o216); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// __global__ void PrecursorDeviceEQ27( int* subgridDistanceIndices, int numberOfBCnodes, int numberOfPrecursorNodes, real omega, 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* vLast, real* vCurrent, real velocityX, real velocityY, real velocityZ, real timeRatio, real velocityRatio, unsigned long long numberOfLBnodes, bool isEvenTimestep) { const unsigned k = vf::gpu::getNodeIndex(); if(k>=numberOfBCnodes) return; //////////////////////////////////////////////////////////////////////////////// // interpolation of velocity real vxLastInterpd, vyLastInterpd, vzLastInterpd; real vxNextInterpd, vyNextInterpd, vzNextInterpd; uint kNeighbor0PP = neighbors0PP[k]; real d0PP = weights0PP[k]; real* vxLast = vLast; real* vyLast = &vLast[numberOfPrecursorNodes]; real* vzLast = &vLast[2*numberOfPrecursorNodes]; real* vxCurrent = vCurrent; real* vyCurrent = &vCurrent[numberOfPrecursorNodes]; real* vzCurrent = &vCurrent[2*numberOfPrecursorNodes]; 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); 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[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[kNeighbor0PP]; vyLastInterpd = vyLast[kNeighbor0PP]; vzLastInterpd = vzLast[kNeighbor0PP]; 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-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]; //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_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 vx2 = VeloY; real vx3 = VeloZ; real cusq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); //////////////////////////////////////////////////////////////////////////////// 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])[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 numberOfPrecursorNodes, 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 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; real* f0Last = fsLast; real* f1Last = &fsLast[ numberOfPrecursorNodes]; real* f2Last = &fsLast[2*numberOfPrecursorNodes]; real* f3Last = &fsLast[3*numberOfPrecursorNodes]; real* f4Last = &fsLast[4*numberOfPrecursorNodes]; real* f5Last = &fsLast[5*numberOfPrecursorNodes]; real* f6Last = &fsLast[6*numberOfPrecursorNodes]; real* f7Last = &fsLast[7*numberOfPrecursorNodes]; real* f8Last = &fsLast[8*numberOfPrecursorNodes]; real* f0Next = fsNext; real* f1Next = &fsNext[ numberOfPrecursorNodes]; real* f2Next = &fsNext[2*numberOfPrecursorNodes]; real* f3Next = &fsNext[3*numberOfPrecursorNodes]; real* f4Next = &fsNext[4*numberOfPrecursorNodes]; real* f5Next = &fsNext[5*numberOfPrecursorNodes]; real* f6Next = &fsNext[6*numberOfPrecursorNodes]; real* f7Next = &fsNext[7*numberOfPrecursorNodes]; real* f8Next = &fsNext[8*numberOfPrecursorNodes]; 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[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 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; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //NOTE: Has not been tested after bug fix! __global__ void QPrecursorDeviceDistributions( int* subgridDistanceIndices, real* subgridDistances, int sizeQ, int numberOfBCnodes, int numberOfPrecursorNodes, 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 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; real* f0Last = fsLast; real* f1Last = &fsLast[ numberOfPrecursorNodes]; real* f2Last = &fsLast[2*numberOfPrecursorNodes]; real* f3Last = &fsLast[3*numberOfPrecursorNodes]; real* f4Last = &fsLast[4*numberOfPrecursorNodes]; real* f5Last = &fsLast[5*numberOfPrecursorNodes]; real* f6Last = &fsLast[6*numberOfPrecursorNodes]; real* f7Last = &fsLast[7*numberOfPrecursorNodes]; real* f8Last = &fsLast[8*numberOfPrecursorNodes]; real* f0Next = fsNext; real* f1Next = &fsNext[ numberOfPrecursorNodes]; real* f2Next = &fsNext[2*numberOfPrecursorNodes]; real* f3Next = &fsNext[3*numberOfPrecursorNodes]; real* f4Next = &fsNext[4*numberOfPrecursorNodes]; real* f5Next = &fsNext[5*numberOfPrecursorNodes]; real* f6Next = &fsNext[6*numberOfPrecursorNodes]; real* f7Next = &fsNext[7*numberOfPrecursorNodes]; real* f8Next = &fsNext[8*numberOfPrecursorNodes]; 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[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 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][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; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////