From a4e9c14a7bdc3fd400a8a4d83a55dd196c13069d Mon Sep 17 00:00:00 2001
From: HenrikAsmuth <henrik.asmuth@geo.uu.se>
Date: Mon, 5 Sep 2022 14:25:33 +0200
Subject: [PATCH] fix refinement-related  bug in WallModelProbe

---
 apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp           |  7 +++----
 .../PreCollisionInteractor/Probes/Probe.cu             |  2 +-
 .../PreCollisionInteractor/Probes/WallModelProbe.cu    | 10 +++++-----
 3 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp
index c397092e0..6b6bf1931 100644
--- a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp
+++ b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp
@@ -184,11 +184,10 @@ void multipleLevel(const std::string& configPath)
 
     gridBuilder->addCoarseGrid(0.0, 0.0, 0.0,
                                 L_x,  L_y,  L_z, dx);
-    // gridBuilder->setNumberOfLayers(12, 8);
+    gridBuilder->setNumberOfLayers(12, 8);
 
-    // gridBuilder->addGrid( new Cuboid( 0.0, 0.0, 0.0, L_x,  L_y,  0.2*L_z) , 1 );
-    // gridBuilder->addGrid( new Cuboid( 0.0, 0.0, 0.0, L_x,  L_y,  0.1*L_z) , 2 );
-    // para->setMaxLevel(3);
+    gridBuilder->addGrid( new Cuboid( 0.0, 0.0, 0.0, L_x,  L_y,  0.3*L_z) , 1 );
+    para->setMaxLevel(2);
 
     gridBuilder->setPeriodicBoundaryCondition(true, true, false);
 
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.cu
index e13f41127..0c56e557c 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/Probe.cu
@@ -441,7 +441,7 @@ void Probe::writeGridFiles(Parameter* para, int level, std::vector<std::string>&
 
                 uint arrOff = probeStruct->arrayOffsetsH[var];
                 uint arrLen = probeStruct->nPoints;
-
+                
                 for(uint arr=0; arr<n_arrs; arr++)
                 {
                     coeff = postProcessingVariables[arr].conversionFactor;
diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
index da50219b1..06039e323 100644
--- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
+++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.cu
@@ -155,7 +155,6 @@ void WallModelProbe::findPoints(Parameter* para, GridProvider* gridProvider, std
                             std::vector<real>& pointCoordsX_level, std::vector<real>& pointCoordsY_level, std::vector<real>& pointCoordsZ_level,
                             int level)
 {
-    if ( para->getParD(level)->stressBC.numberOfBCnodes < 1) throw std::runtime_error("WallModelProbe::findPoints(): stressBC.numberOfBCnodes < 1 !");
     if ( !para->getHasWallModelMonitor())                    throw std::runtime_error("WallModelProbe::findPoints(): !para->getHasWallModelMonitor() !");
 
     real dt = para->getTimeRatio();
@@ -187,6 +186,10 @@ void WallModelProbe::findPoints(Parameter* para, GridProvider* gridProvider, std
 void WallModelProbe::calculateQuantities(SPtr<ProbeStruct> probeStruct, Parameter* para, uint t, int level)
 {   
     bool doTmpAveraging = (t>this->getTStartTmpAveraging());
+    real N = para->getParD(level)->stressBC.numberOfBCnodes;
+    if(N<1) return; //Skipping levels without StressBC
+    real n = (real)probeStruct->vals;
+    int nPoints = probeStruct->nPoints;
 
     // Pointer casts to use device arrays in thrust reductions
     thrust::device_ptr<real> u_el_thrust    = thrust::device_pointer_cast(para->getParD(level)->stressBC.Vx);
@@ -213,10 +216,6 @@ void WallModelProbe::calculateQuantities(SPtr<ProbeStruct> probeStruct, Paramete
     thrust::permutation_iterator<valIterator, indIterator> dpdz_iter_begin(dpdz_thrust, indices_thrust);
     thrust::permutation_iterator<valIterator, indIterator> dpdz_iter_end  (dpdz_thrust, indices_thrust+probeStruct->nIndices);
 
-    real N = para->getParD(level)->stressBC.numberOfBCnodes;
-    real n = (real)probeStruct->vals;
-    int nPoints = probeStruct->nPoints;
-
     if(probeStruct->quantitiesH[int(Statistic::SpatialMeans)])
     {
         // Compute the instantaneous spatial means of the velocity moments 
@@ -293,6 +292,7 @@ void WallModelProbe::calculateQuantities(SPtr<ProbeStruct> probeStruct, Paramete
             }
         }    
     }
+        
 
     this->tProbe += 1;
     getLastCudaError("WallModelProbe::calculateQuantities execution failed");
-- 
GitLab