From 4d0afde25d5a9e4ad84cbe0f6e77b5269c5bf6ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20Gl=C3=A4ser?= <dennis.glaeser@iws.uni-stuttgart.de> Date: Tue, 11 Dec 2018 09:25:16 +0100 Subject: [PATCH] [facet][mpfa] remove headers --- .../facet/cellcentered/mpfa/localassembler.hh | 292 ------------------ 1 file changed, 292 deletions(-) delete mode 100644 dumux/multidomain/facet/cellcentered/mpfa/localassembler.hh diff --git a/dumux/multidomain/facet/cellcentered/mpfa/localassembler.hh b/dumux/multidomain/facet/cellcentered/mpfa/localassembler.hh deleted file mode 100644 index 370e6e656f..0000000000 --- a/dumux/multidomain/facet/cellcentered/mpfa/localassembler.hh +++ /dev/null @@ -1,292 +0,0 @@ -// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -// vi: set et ts=4 sw=4 sts=4: -/***************************************************************************** - * See the file COPYING for full copying permissions. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see <http://www.gnu.org/licenses/>. * - *****************************************************************************/ -/*! - * \file - * \ingroup CCMpfaDiscretization - * \brief Class for the assembly of the local systems of equations - * involved in the transmissibility computaion in the mpfa-o - * scheme with domain coupling across the element facets. - */ -#ifndef DUMUX_DISCRETIZATION_CC_MPFA_O_FACET_COUPLING_LOCAL_ASSEMBLER_HH -#define DUMUX_DISCRETIZATION_CC_MPFA_O_FACET_COUPLING_LOCAL_ASSEMBLER_HH - -#include <dumux/common/math.hh> -#include <dumux/common/matrixvectorhelper.hh> - -#include <dumux/discretization/cellcentered/mpfa/methods.hh> -#include <dumux/discretization/cellcentered/mpfa/localassembler.hh> -#include <dumux/discretization/cellcentered/mpfa/computetransmissibility.hh> - -namespace Dumux -{ - -/*! - * \ingroup CCMpfaDiscretization - * \brief Specialization of the interaction volume-local - * assembler class for the schemes using an mpfa-o type assembly. - * - * \tparam P The problem type - * \tparam EG The element finite volume geometry - * \tparam EV The element volume variables type - */ -template< class P, class EG, class EV > -class InteractionVolumeAssemblerImpl< P, EG, EV, MpfaMethods::oMethodFacetCoupling > - : public InteractionVolumeAssemblerBase< P, EG, EV > -{ - using ParentType = InteractionVolumeAssemblerBase< P, EG, EV >; - -public: - //! Use the constructor of the base class - using ParentType::ParentType; - - /*! - * \brief Assembles the transmissibility matrix within an - * interaction volume of the mpfa-o scheme in the - * context of . - * - * \tparam IV The interaction volume type implementation - * \tparam TensorFunc Lambda to obtain the tensor w.r.t. - * which the local system is to be solved - * - * \param T The transmissibility matrix to be assembled - * \param iv The interaction volume - * \param getT Lambda to evaluate the scv-wise tensors - */ - template< class IV, class TensorFunc > - void assemble(typename IV::Traits::MatVecTraits::TMatrix& T, IV& iv, const TensorFunc& getT) - { - // assemble D into T directly - assembleLocalMatrices_(iv.A(), iv.B(), iv.C(), T, iv, getT); - - // maybe solve the local system - if (iv.numUnknowns() > 0) - { - // T = C*A^-1*B + D - iv.A().invert(); - iv.C().rightmultiply(iv.A()); - T += multiplyMatrices(iv.C(), iv.B()); - } - } - - /*! - * \brief Assembles the vector of primary (cell) unknowns and (maybe) - * Dirichlet boundary conditions within an interaction volume. - * - * \tparam IV The interaction volume type implementation - * \tparam GetU Lambda to obtain the cell unknowns from grid indices - * - * \param u The vector to be filled with the cell unknowns - * \param iv The mpfa-o interaction volume - * \param getU Lambda to obtain the desired cell/Dirichlet value from grid index - */ - template< class IV, class GetU > - void assemble(typename IV::Traits::MatVecTraits::CellVector& u, const IV& iv, const GetU& getU) - { - // put the cell pressures first - using LocalIndexType = typename IV::Traits::IndexSet::LocalIndexType; - for (LocalIndexType i = 0; i < iv.numScvs(); ++i) - u[i] = getU( iv.localScv(i).globalScvIndex() ); - - // Dirichlet BCs come afterwards - LocalIndexType i = iv.numScvs(); - for (const auto& data : iv.dirichletData()) - u[i++] = getU( data.volVarIndex() ); - } - -private: - /*! - * \brief Assemble the matrices involved in the flux expressions - * across the scvfs inside an interaction volume as well as those involved - * in the interaction volume-local system of equations resulting from flux - * and solution continuity across the scvfs. - * - * Flux expressions: \f$\mathbf{f} = \mathbf{C} \bar{\mathbf{u}} + \mathbf{D} \mathbf{u}\f$. - * - * Continuity equations: \f$\mathbf{A} \, \bar{\mathbf{u}} = \mathbf{B} \, \mathbf{u}\f$. - * - * \note The matrices are expected to have been resized beforehand. - * - * \tparam IV The interaction volume type implementation - * \tparam TensorFunc Lambda to obtain the tensor w.r.t. - * which the local system is to be solved - * - * \param A The A matrix of the iv-local equation system - * \param B The B matrix of the iv-local equation system - * \param C The C matrix of the iv-local flux expressions - * \param D The D matrix of the iv-local flux expressions - * \param iv The mpfa-o interaction volume - * \param getT Lambda to evaluate the scv-wise tensors - */ - template< class IV, class TensorFunc > - void assembleLocalMatrices_(typename IV::Traits::MatVecTraits::AMatrix& A, - typename IV::Traits::MatVecTraits::BMatrix& B, - typename IV::Traits::MatVecTraits::CMatrix& C, - typename IV::Traits::MatVecTraits::DMatrix& D, - IV& iv, const TensorFunc& getT) - { - using LocalIndexType = typename IV::Traits::IndexSet::LocalIndexType; - static constexpr int dim = IV::Traits::GridView::dimension; - static constexpr int dimWorld = IV::Traits::GridView::dimensionworld; - - // Matrix D is assumed to have the right size already - assert(D.rows() == iv.numFaces() && D.cols() == iv.numKnowns()); - - // if only Dirichlet faces are present in the iv, - // the matrices A, B & C are undefined and D = T - if (iv.numUnknowns() == 0) - { - // reset matrix beforehand - D = 0.0; - - // Loop over all the faces, in this case these are all dirichlet boundaries - for (LocalIndexType faceIdx = 0; faceIdx < iv.numFaces(); ++faceIdx) - { - const auto& curLocalScvf = iv.localScvf(faceIdx); - const auto& curGlobalScvf = this->fvGeometry().scvf(curLocalScvf.globalScvfIndex()); - const auto& neighborScvIndices = curLocalScvf.neighboringLocalScvIndices(); - - // get tensor in "positive" sub volume - const auto& posLocalScv = iv.localScv(neighborScvIndices[0]); - const auto& posGlobalScv = this->fvGeometry().scv(posLocalScv.globalScvIndex()); - const auto& posVolVars = this->elemVolVars()[posGlobalScv]; - const auto& posElement = iv.element(neighborScvIndices[0]); - const auto tensor = getT(this->problem(), posElement, posVolVars, this->fvGeometry(), posGlobalScv); - - // the omega factors of the "positive" sub volume - const auto wijk = computeMpfaTransmissibility(posLocalScv, curGlobalScvf, tensor, posVolVars.extrusionFactor()); - - const auto posScvLocalDofIdx = posLocalScv.localDofIndex(); - for (LocalIndexType localDir = 0; localDir < dim; localDir++) - { - const auto& otherLocalScvf = iv.localScvf( posLocalScv.scvfIdxLocal(localDir) ); - const auto otherLocalDofIdx = otherLocalScvf.localDofIndex(); - D[faceIdx][otherLocalDofIdx] -= wijk[localDir]; - D[faceIdx][posScvLocalDofIdx] += wijk[localDir]; - } - } - } - else - { - // we require the matrices A,B,C to have the correct size already - assert(A.rows() == iv.numUnknowns() && A.cols() == iv.numUnknowns()); - assert(B.rows() == iv.numUnknowns() && B.cols() == iv.numKnowns()); - assert(C.rows() == iv.numFaces() && C.cols() == iv.numUnknowns()); - - // reset matrices - A = 0.0; - B = 0.0; - C = 0.0; - D = 0.0; - - auto& wijk = iv.omegas(); - for (LocalIndexType faceIdx = 0; faceIdx < iv.numFaces(); ++faceIdx) - { - const auto& curLocalScvf = iv.localScvf(faceIdx); - const auto& curGlobalScvf = this->fvGeometry().scvf(curLocalScvf.globalScvfIndex()); - const auto curIsDirichlet = curLocalScvf.isDirichlet(); - const auto curLocalDofIdx = curLocalScvf.localDofIndex(); - - // get tensor in "positive" sub volume - const auto& neighborScvIndices = curLocalScvf.neighboringLocalScvIndices(); - const auto& posLocalScv = iv.localScv(neighborScvIndices[0]); - const auto& posGlobalScv = this->fvGeometry().scv(posLocalScv.globalScvIndex()); - const auto& posVolVars = this->elemVolVars()[posGlobalScv]; - const auto& posElement = iv.element(neighborScvIndices[0]); - const auto tensor = getT(this->problem(), posElement, posVolVars, this->fvGeometry(), posGlobalScv); - - // the omega factors of the "positive" sub volume - wijk[faceIdx][0] = computeMpfaTransmissibility(posLocalScv, curGlobalScvf, tensor, posVolVars.extrusionFactor()); - - // go over the coordinate directions in the positive sub volume - for (unsigned int localDir = 0; localDir < dim; localDir++) - { - const auto& otherLocalScvf = iv.localScvf( posLocalScv.scvfIdxLocal(localDir) ); - const auto otherLocalDofIdx = otherLocalScvf.localDofIndex(); - - // if we are not on a Dirichlet face, add entries associated with unknown face pressures - // i.e. in matrix C and maybe A (if current face is not a Dirichlet face) - if (!otherLocalScvf.isDirichlet()) - { - C[faceIdx][otherLocalDofIdx] -= wijk[faceIdx][0][localDir]; - if (!curIsDirichlet) - A[curLocalDofIdx][otherLocalDofIdx] -= wijk[faceIdx][0][localDir]; - } - // the current face is a Dirichlet face and creates entries in D & maybe B - else - { - D[faceIdx][otherLocalDofIdx] -= wijk[faceIdx][0][localDir]; - if (!curIsDirichlet) - B[curLocalDofIdx][otherLocalDofIdx] += wijk[faceIdx][0][localDir]; - } - - // add entries related to pressures at the scv centers (dofs) - const auto posScvLocalDofIdx = posLocalScv.localDofIndex(); - D[faceIdx][posScvLocalDofIdx] += wijk[faceIdx][0][localDir]; - - if (!curIsDirichlet) - B[curLocalDofIdx][posScvLocalDofIdx] -= wijk[faceIdx][0][localDir]; - } - - // If we are on an interior face, add values from negative sub volume - if (!curGlobalScvf.boundary()) - { - // loop over all the outside neighbors of this face and add entries - for (unsigned int idxInOutside = 0; idxInOutside < curGlobalScvf.numOutsideScvs(); ++idxInOutside) - { - const auto idxOnScvf = idxInOutside+1; - const auto& negLocalScv = iv.localScv( neighborScvIndices[idxOnScvf] ); - const auto& negGlobalScv = this->fvGeometry().scv(negLocalScv.globalScvIndex()); - const auto& negVolVars = this->elemVolVars()[negGlobalScv]; - const auto& negElement = iv.element( neighborScvIndices[idxOnScvf] ); - const auto negTensor = getT(this->problem(), negElement, negVolVars, this->fvGeometry(), negGlobalScv); - - // On surface grids, use outside face for "negative" transmissibility calculation - const auto& scvf = dim < dimWorld ? this->fvGeometry().flipScvf(curGlobalScvf.index(), idxInOutside) - : curGlobalScvf; - wijk[faceIdx][idxOnScvf] = computeMpfaTransmissibility(negLocalScv, scvf, negTensor, negVolVars.extrusionFactor()); - - // flip sign on surface grids (since we used the "outside" normal) - if (dim < dimWorld) - wijk[faceIdx][idxOnScvf] *= -1.0; - - // go over the coordinate directions in the positive sub volume - for (int localDir = 0; localDir < dim; localDir++) - { - const auto otherLocalScvfIdx = negLocalScv.scvfIdxLocal(localDir); - const auto& otherLocalScvf = iv.localScvf(otherLocalScvfIdx); - const auto otherLocalDofIdx = otherLocalScvf.localDofIndex(); - - if (!otherLocalScvf.isDirichlet()) - A[curLocalDofIdx][otherLocalDofIdx] += wijk[faceIdx][idxOnScvf][localDir]; - else - B[curLocalDofIdx][otherLocalDofIdx] -= wijk[faceIdx][idxOnScvf][localDir]; - - // add entries to matrix B - B[curLocalDofIdx][negLocalScv.localDofIndex()] += wijk[faceIdx][idxOnScvf][localDir]; - } - } - } - } - } - } -}; - -} // end namespace - -#endif -- GitLab