From 005f8f24b14a6e9bf2dbe140847fd35854ce459d Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Tue, 29 Aug 2023 12:37:54 +0200 Subject: [PATCH] ASMuxDmx: restructure basis establishment make it (almost) similar to code in structured ASMs --- src/ASM/LR/ASMu2Dmx.C | 39 +++++++++++++++------------------------ src/ASM/LR/ASMu3Dmx.C | 37 +++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/src/ASM/LR/ASMu2Dmx.C b/src/ASM/LR/ASMu2Dmx.C index 35f6e3c0..690ee45e 100644 --- a/src/ASM/LR/ASMu2Dmx.C +++ b/src/ASM/LR/ASMu2Dmx.C @@ -220,34 +220,25 @@ bool ASMu2Dmx::generateFEMTopology () for (size_t b = 0; b < svec.size(); b++) m_basis.push_back(createLR(*svec[b])); - // we need to project on something that is not one of our bases - if (ASMmxBase::Type == ASMmxBase::REDUCED_CONT_RAISE_BASIS1 || - ASMmxBase::Type == ASMmxBase::REDUCED_CONT_RAISE_BASIS2 || - ASMmxBase::Type == ASMmxBase::DIV_COMPATIBLE || - ASMmxBase::Type == ASMmxBase::SUBGRID) { - Go::SplineSurface* otherBasis = nullptr; - if (!projB) - otherBasis = ASMmxBase::raiseBasis(tensorspline); + std::unique_ptr otherBasis(ASMmxBase::raiseBasis(tensorspline)); - if (ASMmxBase::Type == ASMmxBase::SUBGRID) { - refB = createLR(*otherBasis); - if (!projB) - projB = m_basis.front(); - projB2 = refB; - } - else { - if (!projB) - projB = createLR(*otherBasis); - refB = projB; - } - delete otherBasis; - } - else { - if (!projB) + // we need to project on something that is not one of our bases + if (!projB) { + if (ASMmxBase::Type == ASMmxBase::REDUCED_CONT_RAISE_BASIS1 || + ASMmxBase::Type == ASMmxBase::REDUCED_CONT_RAISE_BASIS2 || + ASMmxBase::Type == ASMmxBase::DIV_COMPATIBLE) + projB = createLR(*otherBasis); + else if (ASMmxBase::Type == ASMmxBase::SUBGRID) + projB = m_basis.front(); + else // FULL_CONT_RAISE_BASISx projB = m_basis[2-ASMmxBase::geoBasis]; - refB = projB; } + if (ASMmxBase::Type == ASMmxBase::SUBGRID) + projB2 = refB = createLR(*otherBasis); + else + refB = projB; + is_rational = tensorspline->rational(); delete tensorspline; tensorspline = nullptr; diff --git a/src/ASM/LR/ASMu3Dmx.C b/src/ASM/LR/ASMu3Dmx.C index 9483d60a..925558be 100644 --- a/src/ASM/LR/ASMu3Dmx.C +++ b/src/ASM/LR/ASMu3Dmx.C @@ -208,29 +208,30 @@ bool ASMu3Dmx::generateFEMTopology () for (size_t b = 0; b < vvec.size(); b++) m_basis.push_back(std::make_shared(vvec[b].get())); + // make a backup as establishBases resets it + int geoB = ASMmxBase::geoBasis; + std::shared_ptr otherBasis = + ASMmxBase::establishBases(tensorspline, + ASMmxBase::FULL_CONT_RAISE_BASIS1).front(); + geoBasis = geoB; + // we need to project on something that is not one of our bases - if (ASMmxBase::Type == ASMmxBase::REDUCED_CONT_RAISE_BASIS1 || - ASMmxBase::Type == ASMmxBase::DIV_COMPATIBLE || - ASMmxBase::Type == ASMmxBase::SUBGRID) { - // make a backup as establishBases resets it - int geoB = ASMmxBase::geoBasis; - std::shared_ptr otherBasis = - ASMmxBase::establishBases(tensorspline, - ASMmxBase::FULL_CONT_RAISE_BASIS1).front(); - geoBasis = geoB; - if (ASMmxBase::Type == ASMmxBase::SUBGRID) { - refB = std::make_shared(otherBasis.get()); + if (!projB) { + if (ASMmxBase::Type == ASMmxBase::REDUCED_CONT_RAISE_BASIS1 || + ASMmxBase::Type == ASMmxBase::REDUCED_CONT_RAISE_BASIS2 || + ASMmxBase::Type == ASMmxBase::DIV_COMPATIBLE) + projB = std::make_shared(otherBasis.get()); + else if (ASMmxBase::Type == ASMmxBase::SUBGRID) projB = m_basis.front(); - refB->generateIDs(); - projB2 = refB; - } else - refB = projB = std::make_shared(otherBasis.get()); - } else { - if (!projB) + else // FULL_CONT_RAISE_BASISx projB = m_basis[2-ASMmxBase::geoBasis]; - refB = projB; } + if (ASMmxBase::Type == ASMmxBase::SUBGRID) + projB2 = refB = std::make_shared(otherBasis.get()); + else + refB = projB; + delete tensorspline; tensorspline = nullptr; }