From 832686a36a2d996bf696be701a3e3e350e761edf Mon Sep 17 00:00:00 2001 From: Bernd Flemisch <bernd@iws.uni-stuttgart.de> Date: Thu, 30 Jul 2015 09:48:31 +0000 Subject: [PATCH] [stokes] remove unnecessary loops over coordinate index Several explicit loops over the coordinate index can be replaced by using the corresponding FieldVector functionality. This implements FS#271. Reviewed by fetzer. git-svn-id: svn://svn.iws.uni-stuttgart.de/DUMUX/dumux/trunk@15194 2fb0f335-1f38-0410-981e-8018bf24f1b0 --- dumux/freeflow/stokes/stokesfluxvariables.hh | 45 ++++----- dumux/freeflow/stokes/stokeslocalresidual.hh | 4 +- .../stokesnc/stokesncfluxvariables.hh | 93 +++++++++---------- .../stokesnc/stokesnclocalresidual.hh | 51 +++++----- .../stokesncni/stokesncnifluxvariables.hh | 32 +++---- .../stokesncni/stokesncnilocalresidual.hh | 56 +++++------ dumux/freeflow/zeroeq/zeroeqfluxvariables.hh | 8 +- 7 files changed, 127 insertions(+), 162 deletions(-) diff --git a/dumux/freeflow/stokes/stokesfluxvariables.hh b/dumux/freeflow/stokes/stokesfluxvariables.hh index 31648f9eb6..1d118d17f8 100644 --- a/dumux/freeflow/stokes/stokesfluxvariables.hh +++ b/dumux/freeflow/stokes/stokesfluxvariables.hh @@ -91,28 +91,27 @@ protected: velocity_ = Scalar(0); pressureGrad_ = Scalar(0); velocityGrad_ = Scalar(0); -// velocityDiv_ = Scalar(0); - for (int idx = 0; - idx < fvGeometry_.numScv; - idx++) // loop over adjacent vertices + for (int scvIdx = 0; + scvIdx < fvGeometry_.numScv; + scvIdx++) // loop over adjacent vertices { // phase density and viscosity at IP - density_ += elemVolVars[idx].density() * - face().shapeValue[idx]; - dynamicViscosity_ += elemVolVars[idx].dynamicViscosity() * - face().shapeValue[idx]; - pressure_ += elemVolVars[idx].pressure() * - face().shapeValue[idx]; + density_ += elemVolVars[scvIdx].density() * + face().shapeValue[scvIdx]; + dynamicViscosity_ += elemVolVars[scvIdx].dynamicViscosity() * + face().shapeValue[scvIdx]; + pressure_ += elemVolVars[scvIdx].pressure() * + face().shapeValue[scvIdx]; // velocity at the IP (fluxes) - DimVector velocityTimesShapeValue = elemVolVars[idx].velocity(); - velocityTimesShapeValue *= face().shapeValue[idx]; + DimVector velocityTimesShapeValue = elemVolVars[scvIdx].velocity(); + velocityTimesShapeValue *= face().shapeValue[scvIdx]; velocity_ += velocityTimesShapeValue; // the pressure gradient - tmp = face().grad[idx]; - tmp *= elemVolVars[idx].pressure(); + tmp = face().grad[scvIdx]; + tmp *= elemVolVars[scvIdx].pressure(); pressureGrad_ += tmp; // take gravity into account tmp = problem.gravity(); @@ -121,13 +120,11 @@ protected: pressureGrad_ -= tmp; // the velocity gradients and divergence - for (int dimIdx = 0; dimIdx<dim; ++dimIdx) + for (int dimIdx = 0; dimIdx < dim; ++dimIdx) { - tmp = face().grad[idx]; - tmp *= elemVolVars[idx].velocity()[dimIdx]; + tmp = face().grad[scvIdx]; + tmp *= elemVolVars[scvIdx].velocity()[dimIdx]; velocityGrad_[dimIdx] += tmp; - -// velocityDiv_ += face().grad[idx][dimIdx]*elemVolVars[idx].velocity()[dimIdx]; } } @@ -139,7 +136,6 @@ protected: Valgrind::CheckDefined(velocity_); Valgrind::CheckDefined(pressureGrad_); Valgrind::CheckDefined(velocityGrad_); -// Valgrind::CheckDefined(velocityDiv_); } void determineUpwindDirection_(const ElementVolumeVariables &elemVolVars) @@ -244,14 +240,6 @@ public: const Scalar kinematicEddyViscosity() const { return 0; } - -// /*! -// * \brief Return the divergence of the normal velocity at the -// * integration point. -// */ -// Scalar velocityDiv() const -// { return velocityDiv_; } - /*! * \brief Return the local index of the upstream sub-control volume. */ @@ -280,7 +268,6 @@ protected: Scalar dynamicViscosity_; Scalar pressure_; Scalar normalvelocity_; -// Scalar velocityDiv_; DimVector velocity_; // gradients at the IPs diff --git a/dumux/freeflow/stokes/stokeslocalresidual.hh b/dumux/freeflow/stokes/stokeslocalresidual.hh index ff855415c4..6f1beddf5e 100644 --- a/dumux/freeflow/stokes/stokeslocalresidual.hh +++ b/dumux/freeflow/stokes/stokeslocalresidual.hh @@ -324,7 +324,7 @@ protected: // add the component of the pressure gradient to the respective part // of the momentum equation and take the gravity term into account // signs are inverted, since q is subtracted - for (int dimIdx=0; dimIdx<dim; ++dimIdx) + for (int dimIdx = 0; dimIdx < dim; ++dimIdx) { source[momentumXIdx + dimIdx] -= pressureGradAtSCVCenter[dimIdx]; source[momentumXIdx + dimIdx] += volVars.density()*this->problem_().gravity()[dimIdx]; @@ -413,7 +413,7 @@ protected: for (unsigned int i=0; i < this->residual_.size(); i++) Valgrind::CheckDefined(this->residual_[i]); - for (int dimIdx=0; dimIdx < dim; ++dimIdx) + for (int dimIdx = 0; dimIdx < dim; ++dimIdx) momentumResidual[dimIdx] = this->residual_[scvIdx][momentumXIdx+dimIdx]; //Sign is right!!!: boundary flux: -mu grad v n diff --git a/dumux/freeflow/stokesnc/stokesncfluxvariables.hh b/dumux/freeflow/stokesnc/stokesncfluxvariables.hh index ac9ad61f7c..def0d9efe3 100644 --- a/dumux/freeflow/stokesnc/stokesncfluxvariables.hh +++ b/dumux/freeflow/stokesnc/stokesncfluxvariables.hh @@ -57,33 +57,33 @@ class StokesncFluxVariables : public StokesFluxVariables<TypeTag> typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices; //dimensions - enum { dim = GridView::dimension }; + enum { dim = GridView::dimension }; //phase indices - enum { phaseIdx = Indices::phaseIdx }; + enum { phaseIdx = Indices::phaseIdx }; //component indices - enum { phaseCompIdx = Indices::phaseCompIdx, - transportCompIdx = Indices::transportCompIdx }; + enum { phaseCompIdx = Indices::phaseCompIdx, + transportCompIdx = Indices::transportCompIdx }; //number of components - enum { numComponents = Indices::numComponents }; + enum { numComponents = Indices::numComponents }; - typedef typename GridView::template Codim<0>::Entity Element; + typedef typename GridView::template Codim<0>::Entity Element; typedef Dune::FieldVector<Scalar, dim> DimVector; - typedef Dune::FieldMatrix<Scalar, dim, dim> DimMatrix; + typedef Dune::FieldMatrix<Scalar, dim, dim> DimMatrix; public: - //Constrcutor calls ParentType function - StokesncFluxVariables(const Problem &problem, + //Constructor calls ParentType function + StokesncFluxVariables(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const int fIdx, const ElementVolumeVariables &elemVolVars, const bool onBoundary = false) - : ParentType(problem, element, fvGeometry, fIdx, elemVolVars, onBoundary) + : ParentType(problem, element, fvGeometry, fIdx, elemVolVars, onBoundary) { calculateValues_(problem, element, elemVolVars); } - /*! + /*! * \brief Return the molar density \f$ \mathrm{[mol/m^3]} \f$ at the integration point. */ const Scalar molarDensity() const @@ -113,7 +113,7 @@ public: const DimVector &moleFractionGrad(int compIdx) const { return moleFractionGrad_[compIdx]; } - /*! + /*! * \brief Return the eddy diffusivity (if implemented). */ const Scalar eddyDiffusivity() const @@ -125,51 +125,48 @@ protected: const ElementVolumeVariables &elemVolVars) { - // loop over all components - for (int compIdx=0; compIdx<numComponents; compIdx++){ + // loop over all components + for (int compIdx=0; compIdx<numComponents; compIdx++){ massFraction_[compIdx] = Scalar(0.0); moleFraction_[compIdx] = Scalar(0.0); diffusionCoeff_[compIdx] = Scalar(0.0); moleFractionGrad_[compIdx] = Scalar(0.0); - if (phaseCompIdx!=compIdx) //no transport equation parameters needed for the mass balance - { + if (phaseCompIdx!=compIdx) //no transport equation parameters needed for the mass balance + { molarDensity_ = Scalar(0.0); - // calculate gradients and secondary variables at IPs - for (int scvIdx = 0; - scvIdx < this->fvGeometry_.numScv; - scvIdx++) // loop over vertices of the element - { - - molarDensity_ += elemVolVars[scvIdx].molarDensity()* - this->face().shapeValue[scvIdx]; - massFraction_[compIdx] += elemVolVars[scvIdx].massFraction(compIdx) * - this->face().shapeValue[scvIdx]; - moleFraction_[compIdx] += elemVolVars[scvIdx].moleFraction(compIdx) * - this->face().shapeValue[scvIdx]; - diffusionCoeff_[compIdx] += elemVolVars[scvIdx].diffusionCoeff(compIdx) * - this->face().shapeValue[scvIdx]; - - // the gradient of the mole fraction at the IP - for (int dimIdx=0; dimIdx<dim; ++dimIdx) - { - moleFractionGrad_[compIdx][dimIdx] += - this->face().grad[scvIdx][dimIdx] * - elemVolVars[scvIdx].moleFraction(compIdx); - } - } - - Valgrind::CheckDefined(molarDensity_); - Valgrind::CheckDefined(massFraction_[compIdx]); - Valgrind::CheckDefined(moleFraction_[compIdx]); - Valgrind::CheckDefined(diffusionCoeff_[compIdx]); - Valgrind::CheckDefined(moleFractionGrad_[compIdx]); - } - } + // calculate gradients and secondary variables at IPs + for (int scvIdx = 0; + scvIdx < this->fvGeometry_.numScv; + scvIdx++) // loop over vertices of the element + { + + molarDensity_ += elemVolVars[scvIdx].molarDensity()* + this->face().shapeValue[scvIdx]; + massFraction_[compIdx] += elemVolVars[scvIdx].massFraction(compIdx) * + this->face().shapeValue[scvIdx]; + moleFraction_[compIdx] += elemVolVars[scvIdx].moleFraction(compIdx) * + this->face().shapeValue[scvIdx]; + diffusionCoeff_[compIdx] += elemVolVars[scvIdx].diffusionCoeff(compIdx) * + this->face().shapeValue[scvIdx]; + + // the gradient of the mole fraction at the IP + DimVector grad = this->face().grad[scvIdx]; + grad *= elemVolVars[scvIdx].moleFraction(compIdx); + moleFractionGrad_[compIdx] += grad; + } + + Valgrind::CheckDefined(molarDensity_); + Valgrind::CheckDefined(massFraction_[compIdx]); + Valgrind::CheckDefined(moleFraction_[compIdx]); + Valgrind::CheckDefined(diffusionCoeff_[compIdx]); + Valgrind::CheckDefined(moleFractionGrad_[compIdx]); + } + } } - Scalar molarDensity_; + Scalar molarDensity_; Scalar massFraction_[numComponents]; Scalar moleFraction_[numComponents]; Scalar diffusionCoeff_[numComponents]; diff --git a/dumux/freeflow/stokesnc/stokesnclocalresidual.hh b/dumux/freeflow/stokesnc/stokesnclocalresidual.hh index 0843d8510e..5376704c63 100644 --- a/dumux/freeflow/stokesnc/stokesnclocalresidual.hh +++ b/dumux/freeflow/stokesnc/stokesnclocalresidual.hh @@ -201,36 +201,31 @@ public: void computeDiffusiveFlux(PrimaryVariables &flux, const FluxVariables &fluxVars) const { - // diffusive component flux - for (int dimIdx = 0; dimIdx < dim; ++dimIdx) + // diffusive component flux + if(!useMoles) { - if(!useMoles) - { - flux[transportEqIdx] -= fluxVars.moleFractionGrad(transportCompIdx)[dimIdx] - * fluxVars.face().normal[dimIdx] - *(fluxVars.diffusionCoeff(transportCompIdx) + fluxVars.eddyDiffusivity()) - * fluxVars.molarDensity() - * FluidSystem::molarMass(transportCompIdx);// Multiplied by molarMass [kg/mol] to convert form [mol/m^3 s] to [kg/m^3 s] - Valgrind::CheckDefined(flux[transportEqIdx]); - } - else - { - //loop over secondary components - for (int compIdx=0; compIdx<numComponents; compIdx++) - { - if (conti0EqIdx+compIdx != massBalanceIdx) - { - flux[conti0EqIdx+compIdx] -= fluxVars.moleFractionGrad(compIdx)[dimIdx] - * fluxVars.face().normal[dimIdx] - *(fluxVars.diffusionCoeff(compIdx) + fluxVars.eddyDiffusivity()) - * fluxVars.molarDensity(); - Valgrind::CheckDefined(flux[conti0EqIdx+compIdx]); - } - } - + flux[transportEqIdx] -= fluxVars.moleFractionGrad(transportCompIdx) + * fluxVars.face().normal + * (fluxVars.diffusionCoeff(transportCompIdx) + fluxVars.eddyDiffusivity()) + * fluxVars.molarDensity() + * FluidSystem::molarMass(transportCompIdx);// Multiplied by molarMass [kg/mol] to convert form [mol/m^3 s] to [kg/m^3 s] + Valgrind::CheckDefined(flux[transportEqIdx]); + } + else + { + //loop over secondary components + for (int compIdx=0; compIdx<numComponents; compIdx++) + { + if (conti0EqIdx+compIdx != massBalanceIdx) + { + flux[conti0EqIdx+compIdx] -= fluxVars.moleFractionGrad(compIdx) + * fluxVars.face().normal + * (fluxVars.diffusionCoeff(compIdx) + fluxVars.eddyDiffusivity()) + * fluxVars.molarDensity(); + Valgrind::CheckDefined(flux[conti0EqIdx+compIdx]); + } } - - } + } } }; diff --git a/dumux/freeflow/stokesncni/stokesncnifluxvariables.hh b/dumux/freeflow/stokesncni/stokesncnifluxvariables.hh index b58cdfd135..75ee28d252 100644 --- a/dumux/freeflow/stokesncni/stokesncnifluxvariables.hh +++ b/dumux/freeflow/stokesncni/stokesncnifluxvariables.hh @@ -126,25 +126,23 @@ protected: temperatureGrad_ = Scalar(0); // calculate gradients and secondary variables at IPs - DimVector tmp(0.0); - for (int idx = 0; - idx < this->fvGeometry_.numScv; - idx++) // loop over vertices of the element + for (int scvIdx = 0; + scvIdx < this->fvGeometry_.numScv; + scvIdx++) // loop over vertices of the element { - temperature_ += elemVolVars[idx].temperature() * - this->face().shapeValue[idx]; + temperature_ += elemVolVars[scvIdx].temperature() * + this->face().shapeValue[scvIdx]; - thermalConductivity_ += elemVolVars[idx].thermalConductivity() * - this->face().shapeValue[idx]; + thermalConductivity_ += elemVolVars[scvIdx].thermalConductivity() * + this->face().shapeValue[scvIdx]; - heatCapacity_ += elemVolVars[idx].heatCapacity() * - this->face().shapeValue[idx]; + heatCapacity_ += elemVolVars[scvIdx].heatCapacity() * + this->face().shapeValue[scvIdx]; // the gradient of the temperature at the IP - for (int dimIdx=0; dimIdx<dim; ++dimIdx) - temperatureGrad_[dimIdx] += - this->face().grad[idx][dimIdx]* - elemVolVars[idx].temperature(); + DimVector grad = this->face().grad[scvIdx]; + grad *= elemVolVars[scvIdx].temperature(); + temperatureGrad_ += grad; } Valgrind::CheckDefined(temperature_); Valgrind::CheckDefined(thermalConductivity_); @@ -154,10 +152,10 @@ protected: for (unsigned int i = 0; i < numComponents; ++i) { componentEnthalpy_[i] = Scalar(0.0); - for (int idx = 0; idx < this->fvGeometry_.numScv; idx++) // loop over vertices of the element + for (int scvIdx = 0; scvIdx < this->fvGeometry_.numScv; scvIdx++) // loop over vertices of the element { - componentEnthalpy_[i] += elemVolVars[idx].componentEnthalpy(i) - * this->face().shapeValue[idx]; + componentEnthalpy_[i] += elemVolVars[scvIdx].componentEnthalpy(i) + * this->face().shapeValue[scvIdx]; } Valgrind::CheckDefined(componentEnthalpy_[i]); } diff --git a/dumux/freeflow/stokesncni/stokesncnilocalresidual.hh b/dumux/freeflow/stokesncni/stokesncnilocalresidual.hh index a2913e289d..9a8d49d49e 100644 --- a/dumux/freeflow/stokesncni/stokesncnilocalresidual.hh +++ b/dumux/freeflow/stokesncni/stokesncnilocalresidual.hh @@ -133,34 +133,32 @@ public: computeConductiveFlux(flux, fluxVars); // diffusive component energy flux - for (int dimIdx = 0; dimIdx < dim; ++dimIdx) + Scalar sumDiffusiveFluxes = 0; + for (int compIdx=0; compIdx<numComponents; compIdx++) { - Scalar sumDiffusiveFluxes = 0; - for (int compIdx=0; compIdx<numComponents; compIdx++) + if (compIdx != phaseCompIdx) { - if (compIdx != phaseCompIdx) - { - Valgrind::CheckDefined(fluxVars.moleFractionGrad(compIdx)[dimIdx]); - Valgrind::CheckDefined(fluxVars.face().normal[dimIdx]); - Valgrind::CheckDefined(fluxVars.diffusionCoeff(compIdx)); - Valgrind::CheckDefined(fluxVars.eddyDiffusivity()); - Valgrind::CheckDefined(fluxVars.molarDensity()); - Valgrind::CheckDefined(FluidSystem::molarMass(compIdx)); - Valgrind::CheckDefined(fluxVars.componentEnthalpy(compIdx)); - Scalar diffusiveFlux = fluxVars.moleFractionGrad(compIdx)[dimIdx] - * fluxVars.face().normal[dimIdx] - *(fluxVars.diffusionCoeff(compIdx) + fluxVars.eddyDiffusivity()) - * fluxVars.molarDensity(); - sumDiffusiveFluxes += diffusiveFlux; - flux[energyEqIdx] -= diffusiveFlux * fluxVars.componentEnthalpy(compIdx) - * FluidSystem::molarMass(compIdx); // Multiplied by molarMass [kg/mol] to convert from [mol/m^3 s] to [kg/m^3 s]; - } + Valgrind::CheckDefined(fluxVars.moleFractionGrad(compIdx)); + Valgrind::CheckDefined(fluxVars.face().normal); + Valgrind::CheckDefined(fluxVars.diffusionCoeff(compIdx)); + Valgrind::CheckDefined(fluxVars.eddyDiffusivity()); + Valgrind::CheckDefined(fluxVars.molarDensity()); + Valgrind::CheckDefined(FluidSystem::molarMass(compIdx)); + Valgrind::CheckDefined(fluxVars.componentEnthalpy(compIdx)); + Scalar diffusiveFlux = fluxVars.moleFractionGrad(compIdx) + * fluxVars.face().normal + * (fluxVars.diffusionCoeff(compIdx) + fluxVars.eddyDiffusivity()) + * fluxVars.molarDensity(); + sumDiffusiveFluxes += diffusiveFlux; + flux[energyEqIdx] -= diffusiveFlux * fluxVars.componentEnthalpy(compIdx) + * FluidSystem::molarMass(compIdx); // Multiplied by molarMass [kg/mol] to convert from [mol/m^3 s] to [kg/m^3 s]; } - - // the diffusive flux of the phase component is the negative of the sum of the component fluxes - flux[energyEqIdx] += sumDiffusiveFluxes * fluxVars.componentEnthalpy(phaseCompIdx) - * FluidSystem::molarMass(phaseCompIdx); // Multiplied by molarMass [kg/mol] to convert from [mol/m^3 s] to [kg/m^3 s]; } + + // the diffusive flux of the phase component is the negative of the sum of the component fluxes + flux[energyEqIdx] += sumDiffusiveFluxes * fluxVars.componentEnthalpy(phaseCompIdx) + * FluidSystem::molarMass(phaseCompIdx); // Multiplied by molarMass [kg/mol] to convert from [mol/m^3 s] to [kg/m^3 s]; + Valgrind::CheckDefined(flux[energyEqIdx]); } @@ -175,13 +173,9 @@ public: const FluxVariables &fluxVars) const { // diffusive heat flux - for (int dimIdx = 0; dimIdx < dim; ++dimIdx) - { - flux[energyEqIdx] -= - fluxVars.temperatureGrad()[dimIdx] * - fluxVars.face().normal[dimIdx] * - (fluxVars.thermalConductivity() + fluxVars.thermalEddyConductivity()); - } + flux[energyEqIdx] -= + fluxVars.temperatureGrad() * fluxVars.face().normal + * (fluxVars.thermalConductivity() + fluxVars.thermalEddyConductivity()); Valgrind::CheckDefined(flux[energyEqIdx]); } }; diff --git a/dumux/freeflow/zeroeq/zeroeqfluxvariables.hh b/dumux/freeflow/zeroeq/zeroeqfluxvariables.hh index 98029292e1..0e93c587db 100644 --- a/dumux/freeflow/zeroeq/zeroeqfluxvariables.hh +++ b/dumux/freeflow/zeroeq/zeroeqfluxvariables.hh @@ -170,13 +170,7 @@ protected: fz_ = distanceToWallRough_ * omega * (1.0 - std::exp(-yPlusRough_ / aPlus )); Scalar fMax = problem.model().wall[wallIdx_].fMax[posIdx_]; Scalar yMax = std::abs(problem.model().wall[wallIdx_].yMax[posIdx_]); - Scalar temp[2] = {0.0, 0.0}; - for (int dimIdx = 0; dimIdx < dim; ++dimIdx) - { - temp[0] += maxVelocity_[dimIdx] * maxVelocity_[dimIdx]; - temp[1] += minVelocity_[dimIdx] * minVelocity_[dimIdx]; - } - Scalar uDiff = std::sqrt(temp[0]) - std::sqrt(temp[1]); + Scalar uDiff = maxVelocity_.two_norm() - minVelocity_.two_norm(); Scalar f1 = yMax * fMax; Scalar f2 = cWK * yMax * uDiff * uDiff / fMax; -- GitLab