diff --git a/dart/src/wKuttaResidual.cpp b/dart/src/wKuttaResidual.cpp index 6d0b9e3b806bd3ca058e16499b9adc56284465db..8884b5f7b7aa76db48ada9e9107c9df13935f608 100644 --- a/dart/src/wKuttaResidual.cpp +++ b/dart/src/wKuttaResidual.cpp @@ -42,13 +42,16 @@ Eigen::MatrixXd KuttaResidual::buildFixed(KuttaElement const &ke, std::vector<do size_t nRow = ke.nRow; size_t nDim = ke.nDim; - // Stabilization - Eigen::MatrixXd dSf(nRow, nDim); - for (size_t i = 0; i < nRow; ++i) - for (size_t j = 0; j < nDim; ++j) - dSf(i, j) = dSfV(j, ke.vsMap.at(ke.teN[i].first)); - Eigen::VectorXd dSfp(nRow); - dSfp = 0.5 * sqrt(ke.surE->getVol()) * dSf * iJ.transpose() * Eigen::Vector3d(1, 0, 0).middleRows(0, nDim); + // Stabilization (disabled in 2D) + Eigen::VectorXd dSfp = Eigen::VectorXd::Zero(nRow); + if (nDim == 3) + { + Eigen::MatrixXd dSf(nRow, nDim); + for (size_t i = 0; i < nRow; ++i) + for (size_t j = 0; j < nDim; ++j) + dSf(i, j) = dSfV(j, ke.vsMap.at(ke.teN[i].first)); + dSfp = 0.5 * sqrt(ke.surE->getVol()) * dSf * iJ.transpose() * Eigen::Vector3d(1, 0, 0).middleRows(0, nDim); + } // Velocity Eigen::RowVectorXd Aup = 1 / ke.surE->getVol() * ke.volE->computeGradient(phi, 0).transpose() * iJ * dSfV; @@ -85,13 +88,16 @@ Eigen::VectorXd KuttaResidual::build(KuttaElement const &ke, std::vector<double> size_t nRow = ke.nRow; size_t nDim = ke.nDim; - // Stabilization - Eigen::MatrixXd dSf(nRow, nDim); - for (size_t i = 0; i < nRow; ++i) - for (size_t j = 0; j < nDim; ++j) - dSf(i, j) = dSfV(j, ke.vsMap.at(ke.teN[i].first)); - Eigen::VectorXd dSfp(nRow); - dSfp = 0.5 * sqrt(ke.surE->getVol()) * dSf * iJ.transpose() * Eigen::Vector3d(1, 0, 0).middleRows(0, nDim); + // Stabilization (disabled in 2D) + Eigen::VectorXd dSfp = Eigen::VectorXd::Zero(nRow); + if (nDim == 3) + { + Eigen::MatrixXd dSf(nRow, nDim); + for (size_t i = 0; i < nRow; ++i) + for (size_t j = 0; j < nDim; ++j) + dSf(i, j) = dSfV(j, ke.vsMap.at(ke.teN[i].first)); + dSfp = 0.5 * sqrt(ke.surE->getVol()) * dSf * iJ.transpose() * Eigen::Vector3d(1, 0, 0).middleRows(0, nDim); + } // Velocity double dPhi2 = 1 / ke.surE->getVol() * ke.volE->computeGradient(phi, 0).squaredNorm(); @@ -151,31 +157,37 @@ std::tuple<Eigen::MatrixXd, Eigen::MatrixXd> KuttaResidual::buildGradientMesh(Ku size_t nCol = ke.nCol; size_t nSur = ke.surE->nodes.size(); - // Stabilization term - Eigen::VectorXd vi = Eigen::Vector3d(1, 0, 0).middleRows(0, nDim); - double sqSurf = sqrt(surf); - Eigen::MatrixXd dSf(nRow, nDim); - for (size_t i = 0; i < nRow; ++i) - for (size_t m = 0; m < nDim; ++m) - dSf(i, m) = dSfV(m, ke.vsMap.at(ke.teN[i].first)); - Eigen::VectorXd gradSfp = 0.5 * sqSurf * dSf * iJ.transpose() * vi; - // Gradient of stabilization term (volume and surface) - std::vector<Eigen::VectorXd> dGradSfV(nDim * nCol); - for (size_t i = 0; i < nCol; ++i) + // Stabilization (disabled in 2D) + Eigen::VectorXd gradSfp = Eigen::VectorXd::Zero(nRow); + std::vector<Eigen::VectorXd> dGradSfV(nDim * nCol, Eigen::VectorXd::Zero(nRow)); + std::vector<Eigen::VectorXd> dGradSfS(nDim * nSur, Eigen::VectorXd::Zero(nRow)); + if (nDim == 3) { - for (size_t m = 0; m < nDim; ++m) + // term + Eigen::VectorXd vi = Eigen::Vector3d(1, 0, 0).middleRows(0, nDim); + double sqSurf = sqrt(surf); + Eigen::MatrixXd dSf(nRow, nDim); + for (size_t i = 0; i < nRow; ++i) + for (size_t m = 0; m < nDim; ++m) + dSf(i, m) = dSfV(m, ke.vsMap.at(ke.teN[i].first)); + gradSfp = 0.5 * sqSurf * dSf * iJ.transpose() * vi; + // volume gradient + for (size_t i = 0; i < nCol; ++i) { - size_t idx = i * nDim + m; - dGradSfV[idx] = 0.5 * sqSurf * dSf * (-iJ * dJ[idx] * iJ).transpose() * vi; // S * dgrad_psi + for (size_t m = 0; m < nDim; ++m) + { + size_t idx = i * nDim + m; + dGradSfV[idx] = 0.5 * sqSurf * dSf * (-iJ * dJ[idx] * iJ).transpose() * vi; // S * dgrad_psi + } } - } - std::vector<Eigen::VectorXd> dGradSfS(nDim * nSur); - for (size_t i = 0; i < nSur; ++i) - { - for (size_t m = 0; m < nDim; ++m) + // surface gradient + for (size_t i = 0; i < nSur; ++i) { - size_t idx = i * nDim + m; - dGradSfS[idx] = 0.5 * 0.5 / sqSurf * dSurf[idx] * dSf * iJ.transpose() * vi; // dS * grad_psi + for (size_t m = 0; m < nDim; ++m) + { + size_t idx = i * nDim + m; + dGradSfS[idx] = 0.5 * 0.5 / sqSurf * dSurf[idx] * dSf * iJ.transpose() * vi; // dS * grad_psi + } } } // Velocity and normalization diff --git a/dart/tests/adjoint.py b/dart/tests/adjoint.py index 6d35b848abe2b85bef09d01625878dbfce1115f8..5788fe27441057128a222cd330e4d421add55673 100644 --- a/dart/tests/adjoint.py +++ b/dart/tests/adjoint.py @@ -114,17 +114,17 @@ def main(): if M_inf == 0. and alpha == 0*np.pi/180: tests.add(CTest('dCl_dAoA', adjoint.dClAoa, 6.9, 1e-2)) tests.add(CTest('dCd_dAoA', adjoint.dCdAoa, 0.0, 1e-3)) - tests.add(CTest('dCl_dMsh', dClX, 55.1, 1e-2)) + tests.add(CTest('dCl_dMsh', dClX, 36.9, 1e-2)) tests.add(CTest('dCd_dMsh', dCdX, 0.482, 1e-2)) - tests.add(CTest('dCl_dAoA (msh)', dClAoA, 7.1, 1e-2)) # FD 7.1364 (step = 1e-6) + tests.add(CTest('dCl_dAoA (msh)', dClAoA, 6.9, 1e-2)) tests.add(CTest('dCd_dAoA (msh)', dCdAoA, 0.0, 1e-3)) elif M_inf == 0.7 and alpha == 2*np.pi/180: tests.add(CTest('dCl_dAoA', adjoint.dClAoa, 11.8, 1e-2)) # FD 11.835 (step = 1e-5) tests.add(CTest('dCd_dAoA', adjoint.dCdAoa, 0.127, 1e-2)) # 0.12692 (step = 1e-5) - tests.add(CTest('dCl_dMsh', dClX, 83.6, 1e-2)) - tests.add(CTest('dCd_dMsh', dCdX, 0.904, 1e-2)) - tests.add(CTest('dCl_dAoA (msh)', dClAoA, 12.1, 1e-2)) # FD 12.1443 (step = 1e-6) - tests.add(CTest('dCd_dAoA (msh)', dCdAoA, 0.129, 1e-2)) # FD 0.1289 (step = 1e-6) + tests.add(CTest('dCl_dMsh', dClX, 61.2, 1e-2)) + tests.add(CTest('dCd_dMsh', dCdX, 0.830, 1e-2)) + tests.add(CTest('dCl_dAoA (msh)', dClAoA, 11.8, 1e-2)) + tests.add(CTest('dCd_dAoA (msh)', dCdAoA, 0.127, 1e-2)) else: raise Exception('Test not defined for this flow') tests.run() diff --git a/dart/tests/bli.py b/dart/tests/bli.py index 9014bcc0ab9feac43ed1dcb451d597950fd2cf60..ae4d0c9ec5ce1d7ce9888b47678003cde07d046c 100644 --- a/dart/tests/bli.py +++ b/dart/tests/bli.py @@ -39,7 +39,6 @@ import dart.utils as floU import dart.default as floD import dart.viscous.solver as floVS import dart.viscous.coupler as floVC -import tbox import tbox.utils as tboxU import fwk from fwk.testing import * @@ -53,11 +52,10 @@ def main(): # define flow variables Re = 1e7 alpha = 5*math.pi/180 - U_inf = [math.cos(alpha), math.sin(alpha)] # norm should be 1 M_inf = 0.5 c_ref = 1 dim = 2 - tol = 1e-3 # tolerance for the VII (usually one drag count) #TODO tolerance has been decreased with new Kutta, hopefully will increase with Paul's dev + tol = 2e-3 # tolerance for the VII (usually one drag count) #TODO tolerance has been decreased with new Kutta, hopefully will increase with Paul's dev # mesh the geometry print(ccolors.ANSI_BLUE + 'PyMeshing...' + ccolors.ANSI_RESET) diff --git a/dart/viscous/coupler.py b/dart/viscous/coupler.py index 269348dad08f5fb9362d2f2e05a7ce0c355e5585..6c339cfa5595818379c30cd17cfda7b66b593e4d 100644 --- a/dart/viscous/coupler.py +++ b/dart/viscous/coupler.py @@ -44,7 +44,7 @@ class Coupler: # run inviscid solver self.isolver.run() print('--- Viscous solver parameters ---') - print('Tolerance (drag count):', self.tol * 1000) + print('Tolerance (drag count):', self.tol * 1e4) print('--- Viscous problem definition ---') print('Reynolds number:', self.vsolver.Re) print('')