From ebe605ce8e01ce28d51cdda4a289f44028acd4ba Mon Sep 17 00:00:00 2001
From: Paul <paul.dechamps@student.uliege.be>
Date: Mon, 11 Jul 2022 03:55:02 +0200
Subject: [PATCH] Half loop 3D

---
 vii/models/n0012_3_visc.geo |  14 +--
 vii/pyVII/vData.py          | 166 +++++++++++++++++++++++++++++++++
 vii/pyVII/vInterpolator.py  | 177 +++++++++++++++++++++---------------
 vii/tests/bli3.py           |   6 +-
 4 files changed, 281 insertions(+), 82 deletions(-)
 create mode 100644 vii/pyVII/vData.py

diff --git a/vii/models/n0012_3_visc.geo b/vii/models/n0012_3_visc.geo
index b449ddc..5b4e93d 100644
--- a/vii/models/n0012_3_visc.geo
+++ b/vii/models/n0012_3_visc.geo
@@ -348,23 +348,23 @@ Surface(51) = {51};
 
 //// MESHING ALGORITHM
 //+
-nElmSpan = 50;
+nElmSpan = 40;
 Transfinite Curve {65, 63, 62, 66, 61, 64, 241} = nElmSpan Using Progression 1;
-nElmChrodwise_wake = 20;
+nElmChrodwise_wake = 40;
 //+
-Transfinite Curve {222, 221} = nElmChrodwise_wake Using Progression 1.01;
+Transfinite Curve {222, 221} = nElmChrodwise_wake Using Progression 1.05;
 Transfinite Surface {51};
 
 nChordwise_midWing = 40;
 //+
-Transfinite Curve {8, 11, 5, 2, 122} = nChordwise_midWing Using Progression 1.01;
+Transfinite Curve {8, 11, 5, 2, 122} = nChordwise_midWing Using Progression 1;
 //+
 nChordwise_Le = 40;
-Transfinite Curve {9, 9, 10, 3, 4} = nChordwise_Le Using Progression 0.95;
+Transfinite Curve {-9, 10, -3, 4} = nChordwise_Le Using Progression 1.07;
 
 //+
 nChordwise_Te = 20;
-Transfinite Curve {7, 121, 12, 1, 6} = nChordwise_Te Using Progression 1.01;
+Transfinite Curve {7, 121, 12, 1, 6} = nChordwise_Te Using Progression 1;
 
 Transfinite Surface {3};
 Transfinite Surface {4};
@@ -394,4 +394,4 @@ Physical Surface("wing") = {1,2,3,11,12,13};
 Physical Surface("wing_") = {4,5,6,14,15,16};
 
 // Wake:
-Physical Surface("wake") = {51};
+Physical Surface("wake") = {51};
\ No newline at end of file
diff --git a/vii/pyVII/vData.py b/vii/pyVII/vData.py
new file mode 100644
index 0000000..0b44bf6
--- /dev/null
+++ b/vii/pyVII/vData.py
@@ -0,0 +1,166 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+# Copyright 2020 University of Liège
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+## VII Coupler
+# Paul Dechamps
+
+import fwk
+from fwk.coloring import ccolors
+
+from math import pi as M_PI
+import numpy as np
+
+class Data:
+    def __init__(self, msh,  visc=0, PosSections= None):
+
+        self.Points, self.Cg = self.GetMesh(msh)
+
+        if visc:
+            self.Xp, self.Yp, self.Zp, self.sortedRows, self.Xc, self.Yc, self.Zc, self.sortedElems = self.SortMesh(self.Points, self.Cg)
+
+            # Creating sections
+            self.Sections = self.CreateSections(PosSections)
+
+            print(self.Sections)
+
+
+    def GetMesh(self, msh):
+
+        data = [np.zeros((0,4)) for _ in range(2)]
+        cg = [np.zeros((0,4)) for _ in range(2)]
+
+        alreadysaid = ['']
+        for e in msh.elems:
+            if e.ptag.name not in alreadysaid:
+                alreadysaid.append(e.ptag.name)
+
+        for e in msh.elems:
+            # Compute cg position
+            cg_pt = np.zeros(3)
+            for n in e.nodes:
+                cg_pt += [n.pos[0], n.pos[1], n.pos[2]]
+            cg_pt/=e.nodes.size()
+            cg_pt = np.hstack((cg_pt, e.no))
+
+            if e.ptag.name == "wake":
+                for nw in e.nodes:
+                    if nw.row not in data[1][:,3]:
+                        data[1] = np.vstack((data[1], [nw.pos[0], nw.pos[1], nw.pos[2], nw.row]))
+                cg[1] = np.vstack((cg[1], cg_pt))
+            elif e.ptag.name == 'wing':
+                for nw in e.nodes:
+                    if nw.row not in data[0][:,3]:
+                        data[0] = np.vstack((data[0], [nw.pos[0], nw.pos[1], nw.pos[2], nw.row]))
+                cg[0] = np.vstack((cg[0], cg_pt))
+            elif e.ptag.name == 'wing_':
+                for nw in e.nodes:
+                    if nw.row not in data[0][:,3]:
+                        data[0] = np.vstack((data[0], [-nw.pos[0], nw.pos[1], nw.pos[2], nw.row]))
+                cg_pt[0] = -cg_pt[0]
+                cg[0] = np.vstack((cg[0], cg_pt))
+        
+        return data, cg
+
+    def SortMesh(self, data, cg):
+
+        data = data.copy()
+
+        data[0] = data[0][data[0][:,1]<=1, :]
+
+        cg = data.copy()
+
+        cg[0] = cg[0][cg[0][:,1]<=1, :]
+
+        sections = data[0][:,1]
+        for i in range(len(sections)):
+            sections[i] = round(sections[i], 3)
+        sections = np.unique(sections)
+
+        nChord = [len(data[i][abs(data[i][:,1]-sections[0])<1e-3, 0]) for i in range(len(data))]
+
+        sortedRows = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+        Xp = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+        Yp = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+        Zp = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+
+        Xc = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+        Yc = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+        Zc = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+
+        for iReg, reg in enumerate(data):
+
+            for iy, y in enumerate(sections):
+
+                # Find nearest value in the mesh
+
+                idx = (np.abs(reg[:,1]-y).argmin())
+                sections[iy] = reg[idx,1]
+
+                sort = reg[abs(reg[:,1]-sections[iy])<1e-3, :]
+                sort = sort[sort[:,0].argsort()]
+
+                sortedRows[iReg] = np.column_stack((sortedRows[iReg], sort[:,3]))
+                Xp[iReg] = np.column_stack((Xp[iReg], sort[:,0]))
+                Yp[iReg] = np.column_stack((Yp[iReg], sort[:,1]))
+                Zp[iReg] = np.column_stack((Zp[iReg], sort[:,2]))
+
+        sections_cg = cg[0][:,1]
+        for i in range(len(sections_cg)):
+            sections_cg[i] = round(sections_cg[i], 3)
+        sections_cg = np.unique(sections)
+
+        nChord_cg = [len(cg[i][abs(cg[i][:,1]-sections[0])<1e-3, 0]) for i in range(len(cg))]
+
+        sortedElems = [np.zeros((nChord_cg[i], 0)) for i in range(len(cg))]
+        
+        for iReg, reg in enumerate(cg):
+
+            for iy, y in enumerate(sections_cg):
+
+                # Find nearest value in the mesh
+
+                idx = (np.abs(reg[:,1]-y).argmin())
+                sections_cg[iy] = reg[idx,1]
+
+                sort = reg[abs(reg[:,1]-sections_cg[iy])<1e-3, :]
+                sort = sort[sort[:,0].argsort()]
+                
+                sortedElems[iReg] = np.column_stack((sortedElems[iReg], sort[:,3]))
+                Xc[iReg] = np.column_stack((Xc[iReg], sort[:,0]))
+                Yc[iReg] = np.column_stack((Yc[iReg], sort[:,1]))
+                Zc[iReg] = np.column_stack((Zc[iReg], sort[:,2]))
+
+        return Xp, Yp, Zp, sortedRows, Xc, Yc, Zc, sortedElems
+
+    def CreateSections(self, PosSections):
+        Sections = [[np.zeros((len(self.Xp[iReg]), 4)) for iReg in range(2)] for _ in range(len(PosSections))]
+
+        for iSec, y in enumerate(PosSections):
+            for iReg in range(2):
+                print(self.Yp[iReg][0,:])
+                print(np.where(self.Yp[iReg][0,:]==y)[0])
+                Sections[iSec][iReg][:,0] = self.Xp[iReg][:,np.where(self.Yp[iReg][0,:]==y)[0][0]]
+                Sections[iSec][iReg][:,1] = self.Yp[iReg][:,np.where(self.Yp[iReg][0,:]==y)[0][0]]
+                Sections[iSec][iReg][:,2] = self.Zp[iReg][:,np.where(self.Yp[iReg][0,:]==y)[0][0]]
+                Sections[iSec][iReg][:,3] = self.sortedRows[iReg][:,np.where(self.Yp[iReg][0,:]==y)[0][0]]
+
+        print(Sections[0][0])
+        return Sections
+
+
+        
\ No newline at end of file
diff --git a/vii/pyVII/vInterpolator.py b/vii/pyVII/vInterpolator.py
index 573cc10..8f7210e 100644
--- a/vii/pyVII/vInterpolator.py
+++ b/vii/pyVII/vInterpolator.py
@@ -12,6 +12,8 @@ from scipy.interpolate import interp1d
 
 from scipy.interpolate import RBFInterpolator
 
+from scipy.interpolate import interp2d
+
 import fwk
 
 
@@ -25,7 +27,7 @@ class Interpolator:
         self.tms['Mesh sort'].start()
         self.idata, self.icg = self.GetMesh(_imsh)
         self.vdata, self.vcg = self.GetMesh(_vmsh)
-        self.sortedRows, self.sortedElems = self.SortMesh(self.vdata, self.vcg)
+        self.Xp, self.Yp, self.Zp, self.sortedRows, self.Xc, self.Yc, self.Zc, self.sortedElems = self.SortMesh(self.vdata, self.vcg)
 
         self.tms['Mesh sort'].stop()
         print(self.tms)
@@ -61,22 +63,16 @@ class Interpolator:
 
         # Create data structures for interpolation
         self.tms = fwk.Timers()
-        self.tms['GetWing'].start()
-        """if _cfg['nDim'] == 2:
-            self.__GetAirfoil(_blw, _cfg)
-        elif _cfg['nDim'] == 3:
-            self.__GetWing(_blw, _cfg)"""
-        self.tms['GetWing'].stop()
-
-        # self.cfg = _cfg
+
         print(self.tms)
 
-        self.stgPt=np.zeros(self.cfg['nSections'], dtype=int)
+        self.stgPt=np.zeros(len(self.cfg['Sections']), dtype=int)
 
-        self.xxPrev = [[np.zeros(0) for iReg in range(3)] for iSec in range(self.cfg['nSections'])]
+        self.xxPrev = [[np.zeros(0) for iReg in range(3)] for iSec in range(len(self.cfg['Sections']))]
         #self.uePrev = [[np.zeros(len(self.viscStruct[iSec][iReg][:,0])) for iReg in range(3)] for iSec in range(len(self.viscStruct))]
-        self.DeltaStarPrev = [[np.zeros(0) for iReg in range(3)] for iSec in range(self.cfg['nSections'])]
+        self.DeltaStarPrev = [[np.zeros(0) for iReg in range(3)] for iSec in range(len(self.cfg['Sections']))]
 
+        self.Cg_Sec = [[np.zeros((len(self.Xc[iReg])-1, 3)) for iReg in range(2)] for _ in range(len(self.cfg['Sections']))]
 
     def GetInvBC(self, vSolver, couplIter):
         self.tms['InvToVisc'].start()
@@ -100,10 +96,6 @@ class Interpolator:
                 M[iReg][iNode] = self.iSolver.M[row]
                 Rho[iReg][iNode] = self.iSolver.rho[row]
         
-            """if self.cfg['nDim'] == 3:
-                U[iReg][:,[1,2]] = U[iReg][:,[2,1]]"""
-        
-        # Find stagnation point
         nD = self.cfg['nDim']
         Ux = [self.__RbfToSections(self.idata[0][:,:nD], U[0][:,0], self.vdata[0][:,:nD]), self.__RbfToSections(self.idata[1][:, [0,2] if nD==3 else 0], U[1][:,0], self.vdata[1][:,[0,2] if nD==3 else 0])]
         Uy = [self.__RbfToSections(self.idata[0][:,:nD], U[0][:,1], self.vdata[0][:,:nD]), self.__RbfToSections(self.idata[1][:, [0,2] if nD==3 else 0], U[1][:,1], self.vdata[1][:,[0,2] if nD==3 else 0])]
@@ -111,60 +103,88 @@ class Interpolator:
         Me = [self.__RbfToSections(self.idata[0][:,:nD], M[0], self.vdata[0][:,:nD]), self.__RbfToSections(self.idata[1][:, [0,2] if nD==3 else 0], M[1], self.vdata[1][:,[0,2] if nD==3 else 0])]
         Rhoe = [self.__RbfToSections(self.idata[0][:,:nD], Rho[0], self.vdata[0][:,:nD]), self.__RbfToSections(self.idata[1][:, [0,2] if nD==3 else 0], Rho[1], self.vdata[1][:,[0,2] if nD==3 else 0])]
         
-        print('yeeeeah')
-        quit()
-        if couplIter == 0:
-            self.stgPt[iSec] = np.argmin(Ux[0]**2+Uy[0]**2)
-        
-            xUp, xLw = self.__Remesh(self.viscStruct[iSec][0][:,0], self.stgPt[iSec])
-            yUp, yLw = self.__Remesh(self.viscStruct[iSec][0][:,1], self.stgPt[iSec])
-            zUp, zLw = self.__Remesh(self.viscStruct[iSec][0][:,2], self.stgPt[iSec])
-
-            vSolver.SetGlobMesh(iSec, 0, xUp, yUp, zUp)
-            vSolver.SetGlobMesh(iSec, 1, xLw, yLw, zLw)
-            vSolver.SetGlobMesh(iSec, 2, self.viscStruct[iSec][1][:,0],
-                                        self.viscStruct[iSec][1][:,1],
-                                        self.viscStruct[iSec][1][:,2])
-
-            self.DeltaStarPrev[iSec][0] = np.zeros(len(xUp))
-            self.DeltaStarPrev[iSec][1] = np.zeros(len(xLw))
-            self.DeltaStarPrev[iSec][2] = np.zeros(len(self.viscStruct[iSec][1][:,0]))
-            
-            self.xxPrev[iSec][0] = np.zeros(len(xUp))
-            self.xxPrev[iSec][1] = np.zeros(len(xLw))
-            self.xxPrev[iSec][2] = np.zeros(len(self.viscStruct[iSec][1][:,0]))
-
-        UxUp, UxLw = self.__Remesh(Ux[0], self.stgPt[iSec])
-        UyUp, UyLw = self.__Remesh(Uy[0], self.stgPt[iSec])
-        UzUp, UzLw = self.__Remesh(Uz[0], self.stgPt[iSec])
-
-        plt.plot(xUp, UxUp)
-        plt.plot(xLw, UxLw)
-        plt.xlabel('$x/c$')
-        plt.ylabel('$U_x$')
-        plt.show()
+        for iSec, y in enumerate(self.cfg['Sections']):
 
-        vSolver.SetVelocities(iSec, 0, UxUp, UyUp, UzUp)
-        vSolver.SetVelocities(iSec, 1, UxLw, UyLw, UzLw)
-        vSolver.SetVelocities(iSec, 2, Ux[1], Uy[1], Uz[1])
+            for iReg in range(2):
+                
+                # Y Z inverted
+                x_pos = self.Xp[iReg][:,(abs(self.Yp[iReg][0,:]-y)).argmin()]
+                y_pos = self.Zp[iReg][:,(abs(self.Yp[iReg][0,:]-y)).argmin()]
+                z_pos = self.Yp[iReg][:,(abs(self.Yp[iReg][0,:]-y)).argmin()]
+                goodRows = self.sortedRows[iReg][:,(abs(self.Yp[iReg][0,:]-y)).argmin()]
+
+                ux = np.zeros(0)
+                uy = np.zeros(0)
+                uz = np.zeros(0)
+                me = np.zeros(0)
+                rhoe = np.zeros(0)
+                xxx = np.zeros(0)
+
+                for i in range(len(x_pos)):
+                    # Y Z inverted 
+                    row = np.where(self.vdata[iReg][:,3]==goodRows[i])[0]
+                    xxx = np.append(xxx, self.vdata[iReg][row,0])
+                    ux = np.append(ux, Ux[iReg][row])
+                    uy = np.append(uy, Uz[iReg][row])
+                    uz = np.append(uz, Uy[iReg][row])
+                    me = np.append(me, Me[iReg][row])
+                    rhoe = np.append(rhoe, Rhoe[iReg][row])
+
+                if couplIter == 0:
+
+                    if iReg == 0:
+                        self.stgPt[iSec] = np.argmin(ux**2+uy**2)
+                        xUp, xLw = self.__Remesh(abs(x_pos), self.stgPt[iSec])
+                        yUp, yLw = self.__Remesh(y_pos, self.stgPt[iSec])
+                        zUp, zLw = self.__Remesh(z_pos, self.stgPt[iSec])
+
+                        vSolver.SetGlobMesh(iSec, 0, xUp, yUp, zUp)
+                        vSolver.SetGlobMesh(iSec, 1, xLw, yLw, zLw)
+
+                        self.DeltaStarPrev[iSec][0] = np.zeros(len(xUp))
+                        self.DeltaStarPrev[iSec][1] = np.zeros(len(xLw))
+
+                        self.xxPrev[iSec][0] = np.zeros(len(xUp))
+                        self.xxPrev[iSec][1] = np.zeros(len(xLw))
+                    else:
+                        vSolver.SetGlobMesh(iSec, 2, x_pos, y_pos, z_pos)
+                        self.DeltaStarPrev[iSec][2] = np.zeros(len(x_pos))   
+                        self.xxPrev[iSec][2] = np.zeros(len(x_pos))
+                    
+                    for i in range(len(x_pos)-1):
+                        self.Cg_Sec[iSec][iReg][i,0] = x_pos[i+1] + x_pos[i]
+                        self.Cg_Sec[iSec][iReg][i,1] = y_pos[i+1] + y_pos[i]
+                        self.Cg_Sec[iSec][iReg][i,2] = z_pos[i+1] + z_pos[i]
+                    self.Cg_Sec[iSec][iReg]/=2
+
+                    plt.plot(x_pos, y_pos, 'x-')
+                    plt.plot(self.Cg_Sec[iSec][iReg][:,0], self.Cg_Sec[iSec][iReg][:,1], 'o')
+                    plt.show()
+                
+                if iReg == 0:
+                    UxUp, UxLw = self.__Remesh(ux, self.stgPt[iSec])
+                    UyUp, UyLw = self.__Remesh(uy, self.stgPt[iSec])
+                    UzUp, UzLw = self.__Remesh(uz, self.stgPt[iSec])
 
-        MeUp, MeLw = self.__Remesh(Me[0], self.stgPt[iSec])
+                    vSolver.SetVelocities(iSec, 0, UxUp, UyUp, UzUp)
+                    vSolver.SetVelocities(iSec, 1, UxLw, UyLw, UzLw)
 
-        vSolver.SetMe(iSec, 0, MeUp)
-        vSolver.SetMe(iSec, 1, MeLw)
-        vSolver.SetMe(iSec, 2, Me[1])
+                    MeUp, MeLw = self.__Remesh(me, self.stgPt[iSec])
+                    vSolver.SetMe(iSec, 0, MeUp)
+                    vSolver.SetMe(iSec, 1, MeLw)
 
-        RhoUp, RhoLw = self.__Remesh(Rhoe[0], self.stgPt[iSec])
+                    RhoUp, RhoLw = self.__Remesh(rhoe, self.stgPt[iSec])
+                    vSolver.SetRhoe(iSec, 0, RhoUp)
+                    vSolver.SetRhoe(iSec, 1, RhoLw)
+                else:
 
-        vSolver.SetRhoe(iSec, 0, RhoUp)
-        vSolver.SetRhoe(iSec, 1, RhoLw)
-        vSolver.SetRhoe(iSec, 2, Rhoe[1])
+                    vSolver.SetVelocities(iSec, 2, ux, uy, uz)
+                    vSolver.SetMe(iSec, 2, me)    
+                    vSolver.SetRhoe(iSec, 2, rhoe)
 
-        for iReg in range(3):
-            vSolver.SetDeltaStarExt(iSec, iReg, self.DeltaStarPrev[iSec][iReg])
-            vSolver.SetxxExt(iSec, iReg, self.xxPrev[iSec][iReg])
-            
-            
+            for iReg in range(3):
+                vSolver.SetDeltaStarExt(iSec, iReg, self.DeltaStarPrev[iSec][iReg])
+                vSolver.SetxxExt(iSec, iReg, self.xxPrev[iSec][iReg])
 
     def SetBlowingVel(self, vSolver, couplIter):
 
@@ -173,20 +193,19 @@ class Interpolator:
                 self.DeltaStarPrev[iSec][iReg] = vSolver.ExtractDeltaStar(iSec, iReg)
                 self.xxPrev[iSec][iReg] = vSolver.Extractxx(iSec, iReg)
 
-        x = [np.zeros((0,3)) for _ in range(2)]
         blw = [np.zeros(0) for _ in range(2)]
 
         for iSec in range(len(self.viscStruct)):
             for iReg in range(2):
                 if iReg == 0:
-                    x[iReg] = np.vstack((x[iReg], self.viscCg_tr[iSec][iReg][:,:3]))
                     blwUp = vSolver.ExtractBlowingVel(iSec, 0)
                     blwLw = vSolver.ExtractBlowingVel(iSec, 1)
                     blw[iReg] = np.concatenate((blw[iReg], blwUp[::-1] , blwLw))
                 elif iReg == 1:
-                    x[iReg] = np.vstack((x[iReg], self.viscCg_tr[iSec][iReg][:,:3]))
                     blw[iReg] = np.concatenate((blw[iReg], vSolver.ExtractBlowingVel(iSec, 2)))
         
+        blwAll = interp2d(self.Cg_Sec[0])
+        
         fig = plt.figure()
         ax = fig.add_subplot(projection='3d')
         ax.scatter(x[0][:,0], x[0][:,2], blw[0], color = 'red')
@@ -590,9 +609,7 @@ class Interpolator:
         alreadysaid = ['']
         for e in msh.elems:
             if e.ptag.name not in alreadysaid:
-                print(e.ptag.name)
                 alreadysaid.append(e.ptag.name)
-        print('')
 
         for e in msh.elems:
             # Compute cg position
@@ -619,6 +636,9 @@ class Interpolator:
                 cg_pt[0] = -cg_pt[0]
                 cg[0] = np.vstack((cg[0], cg_pt))
         
+        print(msh.elems.size())
+        print(np.shape(cg[0]))
+        print(np.shape(data[0]))
         return data, cg
 
     def SortMesh(self, data, cg):
@@ -639,6 +659,9 @@ class Interpolator:
         nChord = [len(data[i][abs(data[i][:,1]-sections[0])<1e-3, 0]) for i in range(len(data))]
 
         sortedRows = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+        Xp = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+        Yp = [np.zeros((nChord[i], 0)) for i in range(len(data))]
+        Zp = [np.zeros((nChord[i], 0)) for i in range(len(data))]
 
         for iReg, reg in enumerate(data):
 
@@ -650,8 +673,12 @@ class Interpolator:
                 sections[iy] = reg[idx,1]
 
                 sort = reg[abs(reg[:,1]-sections[iy])<1e-3, :]
+                sort = sort[sort[:,0].argsort()]
 
                 sortedRows[iReg] = np.column_stack((sortedRows[iReg], sort[:,3]))
+                Xp[iReg] = np.column_stack((Xp[iReg], sort[:,0]))
+                Yp[iReg] = np.column_stack((Yp[iReg], sort[:,1]))
+                Zp[iReg] = np.column_stack((Zp[iReg], sort[:,2]))
 
         sections_cg = cg[0][:,1]
         for i in range(len(sections_cg)):
@@ -660,6 +687,10 @@ class Interpolator:
 
         nChord_cg = [len(cg[i][abs(cg[i][:,1]-sections[0])<1e-3, 0]) for i in range(len(cg))]
 
+        Xc = [np.zeros((nChord_cg[i], 0)) for i in range(len(data))]
+        Yc = [np.zeros((nChord_cg[i], 0)) for i in range(len(data))]
+        Zc = [np.zeros((nChord_cg[i], 0)) for i in range(len(data))]
+
         sortedElems = [np.zeros((nChord_cg[i], 0)) for i in range(len(cg))]
         
         for iReg, reg in enumerate(cg):
@@ -672,10 +703,14 @@ class Interpolator:
                 sections_cg[iy] = reg[idx,1]
 
                 sort = reg[abs(reg[:,1]-sections_cg[iy])<1e-3, :]
-
+                sort = sort[sort[:,0].argsort()]
+                
                 sortedElems[iReg] = np.column_stack((sortedElems[iReg], sort[:,3]))
+                Xc[iReg] = np.column_stack((Xc[iReg], sort[:,0]))
+                Yc[iReg] = np.column_stack((Yc[iReg], sort[:,1]))
+                Zc[iReg] = np.column_stack((Zc[iReg], sort[:,2]))
 
-        return sortedRows, sortedElems
+        return Xp, Yp, Zp, sortedRows, Xc, Yc, Zc, sortedElems
 
         
 
diff --git a/vii/tests/bli3.py b/vii/tests/bli3.py
index 29c99f8..139f34e 100644
--- a/vii/tests/bli3.py
+++ b/vii/tests/bli3.py
@@ -52,8 +52,6 @@ def main():
     dim = 3
     CFL0 = 1
 
-    nSections = 50
-
     # define dimension and mesh size
     spn = 1.0 # wing span
     lgt = 3.0 # channel half length
@@ -80,9 +78,9 @@ def main():
     tms['pre'].stop()
 
     # solve problem
-    config = {'nDim': dim, 'nSections':nSections, 'span':spn, 'nPoints':[100, 25], 'eps':0.02, 'rbftype': 'linear', 'smoothing': 1e-6, 'degree': 0, 'neighbors': 50}
+    config = {'nDim': dim, 'Sections':[0.02, 0.041], 'span':spn, 'rbftype': 'linear', 'smoothing': 1e-8, 'degree': 0, 'neighbors': 5}
     iSolverAPI = vInterpol.Interpolator(floD.newton(pbl), blw, imsh, vmsh, config)
-    vSolver = viscU.initBL(Re, M_inf, CFL0, nSections, 2)
+    vSolver = viscU.initBL(Re, M_inf, CFL0, len(config['Sections']), 2)
     #iSolverAPI = viscAPI.dartAPI(floD.newton(pbl), bnd, wk, nSections, vInterp)
     coupler = viscC.Coupler(iSolverAPI, vSolver)
 
-- 
GitLab