From ca4412674ce40e794b1867d3c5bf51e679e6178d Mon Sep 17 00:00:00 2001
From: Konstantin Kutscher <kutscher@irmb.tu-bs.de>
Date: Fri, 4 May 2018 18:52:45 +0200
Subject: [PATCH] grid sub distance (q) calculation in D3Q27Interactor is
 corrected

---
 source/Applications/DLR-F16-Solid/f16.cpp     | 100 ++----------------
 .../Interactors/D3Q27Interactor.cpp           |  26 +++--
 source/VirtualFluidsCore/LBM/D3Q27System.cpp  |  18 ++--
 source/VirtualFluidsCore/LBM/D3Q27System.h    |  33 ++++++
 4 files changed, 67 insertions(+), 110 deletions(-)

diff --git a/source/Applications/DLR-F16-Solid/f16.cpp b/source/Applications/DLR-F16-Solid/f16.cpp
index ce6c22202..06681a118 100644
--- a/source/Applications/DLR-F16-Solid/f16.cpp
+++ b/source/Applications/DLR-F16-Solid/f16.cpp
@@ -126,6 +126,9 @@ void run(string configname)
 
       const int baseLevel = 0;
 
+      //SPtr<GbObject3D> mic6(new GbCuboid3D(0.3, 0.015, -0.46+4.25*deltaXcoarse, 0.3+deltaXcoarse, 0.015+deltaXcoarse, -0.46+5.25*deltaXcoarse));
+      //if (myid==0) GbSystem3D::writeGeoObject(mic6.get(), pathOut+"/geo/mic6", WbWriterVtkXmlBinary::getInstance());
+
       ////////////////////////////////////////////////////////////////////////
       //Grid
       //////////////////////////////////////////////////////////////////////////
@@ -707,10 +710,14 @@ void run(string configname)
       if (myid==0) GbSystem3D::writeGeoObject(mic4->getBoundingBox().get(), pathOut+"/geo/mic4", WbWriterVtkXmlBinary::getInstance());
       SPtr<TimeseriesCoProcessor> tsp4(new TimeseriesCoProcessor(grid, stepMV, mic4, pathOut+"/mic/mic4", comm));
 
-      SPtr<IntegrateValuesHelper> mic5(new IntegrateValuesHelper(grid, comm,0.3+deltaXfine, 0.015, 0.000517+0.00037+7.0*deltaXfine, 0.3+2.0*deltaXfine, 0.015+deltaXfine, 0.000517+0.00037+8.0*deltaXfine));
+      SPtr<IntegrateValuesHelper> mic5(new IntegrateValuesHelper(grid, comm, 0.3+deltaXfine, 0.015, 0.000517+0.00037+7.0*deltaXfine, 0.3+2.0*deltaXfine, 0.015+deltaXfine, 0.000517+0.00037+8.0*deltaXfine));
       if (myid==0) GbSystem3D::writeGeoObject(mic5->getBoundingBox().get(), pathOut+"/geo/mic5", WbWriterVtkXmlBinary::getInstance());
       SPtr<TimeseriesCoProcessor> tsp5(new TimeseriesCoProcessor(grid, stepMV, mic5, pathOut+"/mic/mic5", comm));
 
+      SPtr<IntegrateValuesHelper> mic6(new IntegrateValuesHelper(grid, comm, 0.3, 0.015,  -0.46+4.25*deltaXcoarse, 0.3+deltaXcoarse, 0.015+deltaXcoarse, -0.46+5.25*deltaXcoarse));
+      if (myid==0) GbSystem3D::writeGeoObject(mic6->getBoundingBox().get(), pathOut+"/geo/mic6", WbWriterVtkXmlBinary::getInstance());
+      SPtr<TimeseriesCoProcessor> tsp6(new TimeseriesCoProcessor(grid, stepMV, mic6, pathOut+"/mic/mic6", comm));
+
       omp_set_num_threads(numOfThreads);
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(100));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
@@ -723,6 +730,7 @@ void run(string configname)
       calculator->addCoProcessor(tsp3);
       calculator->addCoProcessor(tsp4);
       calculator->addCoProcessor(tsp5);
+      calculator->addCoProcessor(tsp6);
       //calculator->addCoProcessor(tav);
 
 
@@ -751,96 +759,6 @@ void run(string configname)
 
 }
 
-//void test_run()
-//{
-//   try
-//   {
-//
-//      SPtr<Communicator> comm = MPICommunicator::getInstance();.
-//      int myid = comm->getProcessID();
-//
-//      if (myid==0)
-//      {
-//         UBLOG(logINFO, "PID = "<<myid<<" Point 1");
-//         UBLOG(logINFO, "PID = "<<myid<<" Total Physical Memory (RAM): "<<Utilities::getTotalPhysMem());
-//         UBLOG(logINFO, "PID = "<<myid<<" Physical Memory currently used: "<<Utilities::getPhysMemUsed());
-//         UBLOG(logINFO, "PID = "<<myid<<" Physical Memory currently used by current process: "<<Utilities::getPhysMemUsedByMe()/1073741824.0<<" GB");
-//      }
-//
-//      double g_minX1 = 0;
-//      double g_minX2 = 0;
-//      double g_minX3 = 0;
-//
-//      double g_maxX1 = 5;
-//      double g_maxX2 = 5;
-//      double g_maxX3 = 5;
-//
-//      int blockNx[3] ={ 5, 5, 5 };
-//
-//      string pathOut = "d:/temp/DLR-F16-Solid-test";
-//
-//      double deltaX = 1;
-//      double rhoLB = 0.0;
-//      double uLB = 0.0866025;
-//      double nuLB = 0.001; //4.33013e-06;
-//      SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter());
-//      ////////////////////////////////////////////////////////////////////////
-//      //Grid
-//      //////////////////////////////////////////////////////////////////////////
-//      SPtr<Grid3D> grid(new Grid3D(comm));
-//      grid->setDeltaX(deltaX);
-//      grid->setBlockNX(blockNx[0], blockNx[1], blockNx[2]);
-//      grid->setPeriodicX1(false);
-//      grid->setPeriodicX2(false);
-//      grid->setPeriodicX3(false);
-//
-//      SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3));
-//      if (myid==0) GbSystem3D::writeGeoObject(gridCube.get(), pathOut+"/geo/gridCube", WbWriterVtkXmlASCII::getInstance());
-//      GenBlocksGridVisitor genBlocks(gridCube);
-//      grid->accept(genBlocks);
-//
-//      WriteBlocksCoProcessor ppblocks(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathOut, WbWriterVtkXmlBinary::getInstance(), comm);
-//      ppblocks.process(0);
-//
-//      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel());
-//      kernel->setNX(std::array<int, 3>{ {blockNx[0], blockNx[1], blockNx[2]}});
-//      SPtr<BCProcessor> bcProc;
-//      bcProc = SPtr<BCProcessor>(new BCProcessor());
-//      kernel->setBCProcessor(bcProc);
-//
-//      SetKernelBlockVisitor kernelVisitor(kernel, nuLB, 1e9, 12);
-//      grid->accept(kernelVisitor);
-//
-//      //initialization of distributions
-//      InitDistributionsBlockVisitor initVisitor1;
-//      initVisitor1.setVx1(0.001);
-//      grid->accept(initVisitor1);
-//
-//      SPtr<UbScheduler> stepSch(new UbScheduler(1));
-//      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, stepSch, pathOut, WbWriterVtkXmlBinary::getInstance(), conv, comm));
-//
-//      //omp_set_num_threads(numOfThreads);
-//      SPtr<Calculator> calculator(new BasicCalculator(grid, stepSch, 2));
-//      calculator->addCoProcessor(writeMQCoProcessor);
-//
-//
-//      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[])
 {
diff --git a/source/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp b/source/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
index ea0f08e11..820324c72 100644
--- a/source/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
+++ b/source/VirtualFluidsCore/Interactors/D3Q27Interactor.cpp
@@ -59,7 +59,9 @@ D3Q27Interactor::~D3Q27Interactor()
 //////////////////////////////////////////////////////////////////////////
 void D3Q27Interactor::initRayVectors()
 {
-   int fdir; double c1oS2 = UbMath::one_over_sqrt2;
+   int fdir; 
+   double c1oS2 = UbMath::one_over_sqrt2;
+   double c1oS3 = UbMath::one_over_sqrt3;
    fdir = D3Q27System::E;  rayX1[fdir] =  1.0;   rayX2[fdir] =  0.0;   rayX3[fdir] =  0.0;
    fdir = D3Q27System::W;  rayX1[fdir] = -1.0;   rayX2[fdir] =  0.0;   rayX3[fdir] =  0.0;
    fdir = D3Q27System::N;  rayX1[fdir] =  0.0;   rayX2[fdir] =  1.0;   rayX3[fdir] =  0.0;
@@ -79,14 +81,14 @@ void D3Q27Interactor::initRayVectors()
    fdir = D3Q27System::BN; rayX1[fdir] =  0.0;   rayX2[fdir] = c1oS2;  rayX3[fdir] = -c1oS2;
    fdir = D3Q27System::TS; rayX1[fdir] =  0.0;   rayX2[fdir] =-c1oS2;  rayX3[fdir] =  c1oS2;
 
-   fdir = D3Q27System::TNW; rayX1[fdir] = -c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] =  c1oS2;;
-   fdir = D3Q27System::TNE; rayX1[fdir] =  c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] =  c1oS2;
-   fdir = D3Q27System::TSW; rayX1[fdir] = -c1oS2; rayX2[fdir] =-c1oS2; rayX3[fdir] =  c1oS2;
-   fdir = D3Q27System::TSE; rayX1[fdir] =  c1oS2; rayX2[fdir] =-c1oS2; rayX3[fdir] =  c1oS2;
-   fdir = D3Q27System::BNW; rayX1[fdir] = -c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] =  -c1oS2;
-   fdir = D3Q27System::BNE; rayX1[fdir] =  c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] =  -c1oS2;
-   fdir = D3Q27System::BSW; rayX1[fdir] = -c1oS2; rayX2[fdir] =-c1oS2; rayX3[fdir] =  -c1oS2;
-   fdir = D3Q27System::BSE; rayX1[fdir] =  c1oS2; rayX2[fdir] =-c1oS2; rayX3[fdir] =  -c1oS2;
+   fdir = D3Q27System::TNW; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] =   c1oS3;
+   fdir = D3Q27System::TNE; rayX1[fdir] =  c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] =   c1oS3;
+   fdir = D3Q27System::TSW; rayX1[fdir] = -c1oS3; rayX2[fdir] =-c1oS3; rayX3[fdir] =   c1oS3;
+   fdir = D3Q27System::TSE; rayX1[fdir] =  c1oS3; rayX2[fdir] =-c1oS3; rayX3[fdir] =   c1oS3;
+   fdir = D3Q27System::BNW; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] =  -c1oS3;
+   fdir = D3Q27System::BNE; rayX1[fdir] =  c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] =  -c1oS3;
+   fdir = D3Q27System::BSW; rayX1[fdir] = -c1oS3; rayX2[fdir] =-c1oS3; rayX3[fdir] =  -c1oS3;
+   fdir = D3Q27System::BSE; rayX1[fdir] =  c1oS3; rayX2[fdir] =-c1oS3; rayX3[fdir] =  -c1oS3;
 }
 //////////////////////////////////////////////////////////////////////////
 void D3Q27Interactor::initInteractor(const double& timeStep)
@@ -259,7 +261,11 @@ bool D3Q27Interactor::setDifferencesToGbObject3D(const SPtr<Block3D> block/*,con
       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;
       double q;
       bool pointOnBoundary = false;
 
diff --git a/source/VirtualFluidsCore/LBM/D3Q27System.cpp b/source/VirtualFluidsCore/LBM/D3Q27System.cpp
index ef96b2dc9..c56164ab3 100644
--- a/source/VirtualFluidsCore/LBM/D3Q27System.cpp
+++ b/source/VirtualFluidsCore/LBM/D3Q27System.cpp
@@ -47,9 +47,9 @@ namespace D3Q27System
                            INV_BSW };
 
 
-    // The x,y,z component for each normalized direction
-    const double cNorm[3][ENDDIR] = {
-        {
+    // The x,y,z component for each normalized direction
+    const double cNorm[3][ENDDIR] = {
+        {
             double(DX1[0]), double(DX1[1]),
             double(DX1[2]), double(DX1[3]),
             double(DX1[4]), double(DX1[5]),
@@ -62,8 +62,8 @@ namespace D3Q27System
             double(DX1[18]) / std::sqrt(double(3)), double(DX1[19]) / std::sqrt(double(3)),
             double(DX1[20]) / std::sqrt(double(3)), double(DX1[21]) / std::sqrt(double(3)),
             double(DX1[22]) / std::sqrt(double(3)), double(DX1[23]) / std::sqrt(double(3)),
-            double(DX1[24]) / std::sqrt(double(3)), double(DX1[25]) / std::sqrt(double(3))
-        },{
+            double(DX1[24]) / std::sqrt(double(3)), double(DX1[25]) / std::sqrt(double(3))
+        },{
             double(DX2[0]), double(DX2[1]),
             double(DX2[2]), double(DX2[3]),
             double(DX2[4]), double(DX2[5]),
@@ -76,8 +76,8 @@ namespace D3Q27System
             double(DX2[18]) / std::sqrt(double(3)), double(DX2[19]) / std::sqrt(double(3)),
             double(DX2[20]) / std::sqrt(double(3)), double(DX2[21]) / std::sqrt(double(3)),
             double(DX2[22]) / std::sqrt(double(3)), double(DX2[23]) / std::sqrt(double(3)),
-            double(DX2[24]) / std::sqrt(double(3)), double(DX2[25]) / std::sqrt(double(3))
-        },{
+            double(DX2[24]) / std::sqrt(double(3)), double(DX2[25]) / std::sqrt(double(3))
+        },{
             double(DX3[0]), double(DX3[1]),
             double(DX3[2]), double(DX3[3]),
             double(DX3[4]), double(DX3[5]),
@@ -90,8 +90,8 @@ namespace D3Q27System
             double(DX3[18]) / std::sqrt(double(3)), double(DX3[19]) / std::sqrt(double(3)),
             double(DX3[20]) / std::sqrt(double(3)), double(DX3[21]) / std::sqrt(double(3)),
             double(DX3[22]) / std::sqrt(double(3)), double(DX3[23]) / std::sqrt(double(3)),
-            double(DX3[24]) / std::sqrt(double(3)), double(DX3[25]) / std::sqrt(double(3))
-        }
+            double(DX3[24]) / std::sqrt(double(3)), double(DX3[25]) / std::sqrt(double(3))
+        }
     };
 
 }
diff --git a/source/VirtualFluidsCore/LBM/D3Q27System.h b/source/VirtualFluidsCore/LBM/D3Q27System.h
index 7e0d8f4f5..6ae3bf70e 100644
--- a/source/VirtualFluidsCore/LBM/D3Q27System.h
+++ b/source/VirtualFluidsCore/LBM/D3Q27System.h
@@ -729,6 +729,39 @@ namespace D3Q27System
       distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = sqrt(deltaX1*deltaX1+deltaX2*deltaX2+deltaX3*deltaX3);
       distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = sqrt(deltaX1*deltaX1+deltaX2*deltaX2+deltaX3*deltaX3);
    }
+//////////////////////////////////////////////////////////////////////////
+   static inline void initRayVectors(double* const& rayX1, double* const& rayX2, double* const&  rayX3)
+   {
+      int fdir;
+      double c1oS2 = UbMath::one_over_sqrt2;
+      double c1oS3 = UbMath::one_over_sqrt3;
+      fdir = E;  rayX1[fdir] =  1.0;   rayX2[fdir] =  0.0;   rayX3[fdir] =  0.0;
+      fdir = W;  rayX1[fdir] = -1.0;   rayX2[fdir] =  0.0;   rayX3[fdir] =  0.0;
+      fdir = N;  rayX1[fdir] =  0.0;   rayX2[fdir] =  1.0;   rayX3[fdir] =  0.0;
+      fdir = S;  rayX1[fdir] =  0.0;   rayX2[fdir] = -1.0;   rayX3[fdir] =  0.0;
+      fdir = T;  rayX1[fdir] =  0.0;   rayX2[fdir] =  0.0;   rayX3[fdir] =  1.0;
+      fdir = B;  rayX1[fdir] =  0.0;   rayX2[fdir] =  0.0;   rayX3[fdir] = -1.0;
+      fdir = NE; rayX1[fdir] =  c1oS2; rayX2[fdir] =  c1oS2; rayX3[fdir] =  0.0;
+      fdir = SW; rayX1[fdir] = -c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] =  0.0;
+      fdir = SE; rayX1[fdir] =  c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] =  0.0;
+      fdir = NW; rayX1[fdir] = -c1oS2; rayX2[fdir] =  c1oS2; rayX3[fdir] =  0.0;
+      fdir = TE; rayX1[fdir] =  c1oS2; rayX2[fdir] = 0.0;    rayX3[fdir] =  c1oS2;
+      fdir = BW; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0;    rayX3[fdir] = -c1oS2;
+      fdir = BE; rayX1[fdir] =  c1oS2; rayX2[fdir] = 0.0;    rayX3[fdir] = -c1oS2;
+      fdir = TW; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0;    rayX3[fdir] =  c1oS2;
+      fdir = TN; rayX1[fdir] =  0.0;   rayX2[fdir] = c1oS2;  rayX3[fdir] =  c1oS2;
+      fdir = BS; rayX1[fdir] =  0.0;   rayX2[fdir] =-c1oS2;  rayX3[fdir] = -c1oS2;
+      fdir = BN; rayX1[fdir] =  0.0;   rayX2[fdir] = c1oS2;  rayX3[fdir] = -c1oS2;
+      fdir = TS; rayX1[fdir] =  0.0;   rayX2[fdir] =-c1oS2;  rayX3[fdir] =  c1oS2;
+      fdir = TNE; rayX1[fdir] =  c1oS3; rayX2[fdir] =  c1oS3; rayX3[fdir] =  c1oS3;
+      fdir = TNW; rayX1[fdir] = -c1oS3; rayX2[fdir] =  c1oS3; rayX3[fdir] =  c1oS3;
+      fdir = TSE; rayX1[fdir] =  c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] =  c1oS3;
+      fdir = TSW; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] =  c1oS3;
+      fdir = BNE; rayX1[fdir] =  c1oS3; rayX2[fdir] =  c1oS3; rayX3[fdir] = -c1oS3;
+      fdir = BNW; rayX1[fdir] = -c1oS3; rayX2[fdir] =  c1oS3; rayX3[fdir] = -c1oS3;
+      fdir = BSE; rayX1[fdir] =  c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3;
+      fdir = BSW; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3;
+   }
 //////////////////////////////////////////////////////////////////////////
    static inline LBMReal calcPress(const LBMReal* const f, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3)
    {
-- 
GitLab