Specialized dotInterpolate for the efficient calculation of flux fields
e.g. (fvc::interpolate(HbyA) & mesh.Sf()) -> fvc::flux(HbyA) This removes the need to create an intermediate face-vector field when computing fluxes which is more efficient, reduces the peak storage and improved cache coherency in addition to providing a simpler and cleaner API.
This commit is contained in:
@ -15,7 +15,7 @@
|
||||
surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU));
|
||||
volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p));
|
||||
|
||||
phi = (fvc::interpolate(HbyA) & mesh.Sf())
|
||||
phi = fvc::flux(HbyA)
|
||||
+ rhorAUf*fvc::ddtCorr(U, Uf);
|
||||
fvc::makeRelative(phi, U);
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU));
|
||||
volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p));
|
||||
|
||||
phi = (fvc::interpolate(HbyA) & mesh.Sf())
|
||||
phi = fvc::flux(HbyA)
|
||||
+ rhorAUf*fvc::ddtCorr(U, phi);
|
||||
|
||||
surfaceScalarField phiGradp(rhorAUf*mesh.magSf()*fvc::snGrad(p));
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, Uf)
|
||||
);
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)
|
||||
);
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)
|
||||
);
|
||||
|
||||
|
||||
@ -11,10 +11,7 @@
|
||||
dimensionedScalar("0", phi.dimensions(), 0)
|
||||
);
|
||||
|
||||
surfaceScalarField phir
|
||||
(
|
||||
mesh.Sf() & fvc::interpolate(UdmModel.Udm())
|
||||
);
|
||||
surfaceScalarField phir(fvc::flux(UdmModel.Udm()));
|
||||
|
||||
if (nAlphaSubCycles > 1)
|
||||
{
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)
|
||||
);
|
||||
MRF.makeRelative(phiHbyA);
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, Uf)
|
||||
);
|
||||
MRF.makeRelative(phiHbyA);
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)
|
||||
);
|
||||
MRF.makeRelative(phiHbyA);
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, Uf)
|
||||
);
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)
|
||||
);
|
||||
adjustPhi(phiHbyA, U, p_rgh);
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -29,6 +29,7 @@ License
|
||||
#include "slipFvPatchFields.H"
|
||||
#include "partialSlipFvPatchFields.H"
|
||||
#include "surfaceInterpolate.H"
|
||||
#include "fvcFlux.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
@ -177,7 +178,7 @@ Foam::phaseModel::phaseModel
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
fvc::interpolate(U_) & mesh.Sf(),
|
||||
fvc::flux(U_),
|
||||
phiTypes
|
||||
)
|
||||
);
|
||||
|
||||
@ -97,7 +97,7 @@
|
||||
|
||||
phiHbyAs[phasei] =
|
||||
(
|
||||
(fvc::interpolate(HbyAs[phasei]) & mesh.Sf())
|
||||
fvc::flux(HbyAs[phasei])
|
||||
+ rAlphaAUfs[phasei]*fvc::ddtCorr(phase.U(), phase.phi())
|
||||
);
|
||||
MRF.makeRelative(phiHbyAs[phasei]);
|
||||
|
||||
@ -10,7 +10,7 @@ if (pimple.nCorrPISO() <= 1)
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ rAUf*fvc::ddtCorr(U, phi)
|
||||
);
|
||||
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ rAUf*fvc::ddtCorr(U, Uf)
|
||||
);
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2015 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -26,6 +26,7 @@ License
|
||||
#include "liftModel.H"
|
||||
#include "phasePair.H"
|
||||
#include "fvcCurl.H"
|
||||
#include "fvcFlux.H"
|
||||
#include "surfaceInterpolate.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
@ -78,11 +79,7 @@ Foam::tmp<Foam::volVectorField> Foam::liftModel::F() const
|
||||
|
||||
Foam::tmp<Foam::surfaceScalarField> Foam::liftModel::Ff() const
|
||||
{
|
||||
const fvMesh& mesh(this->pair_.phase1().mesh());
|
||||
|
||||
return
|
||||
fvc::interpolate(pair_.dispersed())
|
||||
*(fvc::interpolate(Fi()) & mesh.Sf());
|
||||
return fvc::interpolate(pair_.dispersed())*fvc::flux(Fi());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@ License
|
||||
|
||||
#include "wallLubricationModel.H"
|
||||
#include "phasePair.H"
|
||||
#include "fvcFlux.H"
|
||||
#include "surfaceInterpolate.H"
|
||||
#include "wallFvPatch.H"
|
||||
|
||||
@ -91,11 +92,7 @@ Foam::tmp<Foam::volVectorField> Foam::wallLubricationModel::F() const
|
||||
|
||||
Foam::tmp<Foam::surfaceScalarField> Foam::wallLubricationModel::Ff() const
|
||||
{
|
||||
const fvMesh& mesh(this->pair_.phase1().mesh());
|
||||
|
||||
return
|
||||
fvc::interpolate(pair_.dispersed())
|
||||
*(fvc::interpolate(Fi()) & mesh.Sf());
|
||||
return fvc::interpolate(pair_.dispersed())*fvc::flux(Fi());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2015 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2015-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -35,6 +35,7 @@ License
|
||||
#include "fvmSup.H"
|
||||
#include "fvcDdt.H"
|
||||
#include "fvcDiv.H"
|
||||
#include "fvcFlux.H"
|
||||
#include "surfaceInterpolate.H"
|
||||
#include "fvMatrix.H"
|
||||
|
||||
@ -109,7 +110,7 @@ Foam::MovingPhaseModel<BasePhaseModel>::phi(const volVectorField& U) const
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
fvc::interpolate(U) & U.mesh().Sf(),
|
||||
fvc::flux(U),
|
||||
phiTypes
|
||||
)
|
||||
);
|
||||
|
||||
@ -51,7 +51,7 @@ PtrList<surfaceScalarField> phiFs(phases.size());
|
||||
new surfaceScalarField
|
||||
(
|
||||
IOobject::groupName("phiF", phase.name()),
|
||||
(fvc::interpolate(rAUs[phasei]*Fs()[phasei]) & mesh.Sf())
|
||||
fvc::flux(rAUs[phasei]*Fs()[phasei])
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -201,7 +201,7 @@ while (pimple.correct())
|
||||
new surfaceScalarField
|
||||
(
|
||||
IOobject::groupName("phiHbyA", phase.name()),
|
||||
(fvc::interpolate(HbyAs[phasei]) & mesh.Sf())
|
||||
fvc::flux(HbyAs[phasei])
|
||||
+ phiCorrCoeff
|
||||
*fvc::interpolate
|
||||
(
|
||||
@ -209,7 +209,7 @@ while (pimple.correct())
|
||||
)
|
||||
*(
|
||||
MRF.absolute(phase.phi().oldTime())
|
||||
- (fvc::interpolate(phase.U().oldTime()) & mesh.Sf())
|
||||
- fvc::flux(phase.U().oldTime())
|
||||
)/runTime.deltaT()
|
||||
- phigFs[phasei]
|
||||
)
|
||||
|
||||
@ -65,18 +65,10 @@ tmp<surfaceScalarField> phiF2;
|
||||
surfaceScalarField snGradAlpha1(fvc::snGrad(alpha1)*mesh.magSf());
|
||||
|
||||
// Phase-1 dispersion, lift and wall-lubrication flux
|
||||
phiF1 =
|
||||
(
|
||||
DbyA1()*snGradAlpha1
|
||||
+ (fvc::interpolate(rAU1*F) & mesh.Sf())
|
||||
);
|
||||
phiF1 = DbyA1()*snGradAlpha1 + fvc::flux(rAU1*F);
|
||||
|
||||
// Phase-2 dispersion, lift and wall-lubrication flux
|
||||
phiF2 =
|
||||
(
|
||||
- DbyA2()*snGradAlpha1
|
||||
- (fvc::interpolate(rAU2*F) & mesh.Sf())
|
||||
);
|
||||
phiF2 = - DbyA2()*snGradAlpha1 - fvc::flux(rAU2*F);
|
||||
|
||||
// Cache the phase diffusivities for implicit treatment in the
|
||||
// phase-fraction equation
|
||||
@ -175,11 +167,11 @@ while (pimple.correct())
|
||||
surfaceScalarField phiHbyA1
|
||||
(
|
||||
IOobject::groupName("phiHbyA", phase1.name()),
|
||||
(fvc::interpolate(HbyA1) & mesh.Sf())
|
||||
fvc::flux(HbyA1)
|
||||
+ phiCorrCoeff1*fvc::interpolate(alpha1.oldTime()*rho1.oldTime()*rAU1)
|
||||
*(
|
||||
MRF.absolute(phi1.oldTime())
|
||||
- (fvc::interpolate(U1.oldTime()) & mesh.Sf())
|
||||
- fvc::flux(U1.oldTime())
|
||||
)/runTime.deltaT()
|
||||
- phiF1()
|
||||
- phig1
|
||||
@ -189,11 +181,11 @@ while (pimple.correct())
|
||||
surfaceScalarField phiHbyA2
|
||||
(
|
||||
IOobject::groupName("phiHbyA", phase2.name()),
|
||||
(fvc::interpolate(HbyA2) & mesh.Sf())
|
||||
fvc::flux(HbyA2)
|
||||
+ phiCorrCoeff2*fvc::interpolate(alpha2.oldTime()*rho2.oldTime()*rAU2)
|
||||
*(
|
||||
MRF.absolute(phi2.oldTime())
|
||||
- (fvc::interpolate(U2.oldTime()) & mesh.Sf())
|
||||
- fvc::flux(U2.oldTime())
|
||||
)/runTime.deltaT()
|
||||
- phiF2()
|
||||
- phig2
|
||||
|
||||
@ -157,7 +157,7 @@ while (pimple.correct())
|
||||
*(
|
||||
(alphaRhof10 + Vmf)
|
||||
*MRF.absolute(phi1.oldTime())/runTime.deltaT()
|
||||
+ (fvc::interpolate(U1Eqn.H()) & mesh.Sf())
|
||||
+ fvc::flux(U1Eqn.H())
|
||||
+ Vmf*ddtPhi2
|
||||
+ Kdf*MRF.absolute(phi2)
|
||||
- Ff1()
|
||||
@ -175,7 +175,7 @@ while (pimple.correct())
|
||||
*(
|
||||
(alphaRhof20 + Vmf)
|
||||
*MRF.absolute(phi2.oldTime())/runTime.deltaT()
|
||||
+ (fvc::interpolate(U2Eqn.H()) & mesh.Sf())
|
||||
+ fvc::flux(U2Eqn.H())
|
||||
+ Vmf*ddtPhi1
|
||||
+ Kdf*MRF.absolute(phi1)
|
||||
- Ff2()
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
surfaceScalarField phiHbyA
|
||||
(
|
||||
"phiHbyA",
|
||||
(fvc::interpolate(HbyA) & mesh.Sf())
|
||||
fvc::flux(HbyA)
|
||||
+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)
|
||||
);
|
||||
adjustPhi(phiHbyA, U, p_rgh);
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2015 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -26,6 +26,7 @@ License
|
||||
#include "liftModel.H"
|
||||
#include "phasePair.H"
|
||||
#include "fvcCurl.H"
|
||||
#include "fvcFlux.H"
|
||||
#include "surfaceInterpolate.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
@ -78,11 +79,7 @@ Foam::tmp<Foam::volVectorField> Foam::liftModel::F() const
|
||||
|
||||
Foam::tmp<Foam::surfaceScalarField> Foam::liftModel::Ff() const
|
||||
{
|
||||
const fvMesh& mesh(this->pair_.phase1().mesh());
|
||||
|
||||
return
|
||||
fvc::interpolate(pair_.dispersed())
|
||||
*(fvc::interpolate(Fi()) & mesh.Sf());
|
||||
return fvc::interpolate(pair_.dispersed())*fvc::flux(Fi());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2014-2015 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -25,6 +25,7 @@ License
|
||||
|
||||
#include "wallLubricationModel.H"
|
||||
#include "phasePair.H"
|
||||
#include "fvcFlux.H"
|
||||
#include "surfaceInterpolate.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
@ -67,11 +68,7 @@ Foam::tmp<Foam::volVectorField> Foam::wallLubricationModel::F() const
|
||||
|
||||
Foam::tmp<Foam::surfaceScalarField> Foam::wallLubricationModel::Ff() const
|
||||
{
|
||||
const fvMesh& mesh(this->pair_.phase1().mesh());
|
||||
|
||||
return
|
||||
fvc::interpolate(pair_.dispersed())
|
||||
*(fvc::interpolate(Fi()) & mesh.Sf());
|
||||
return fvc::interpolate(pair_.dispersed())*fvc::flux(Fi());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -70,18 +70,10 @@ tmp<surfaceScalarField> phiF2;
|
||||
surfaceScalarField snGradAlpha1(fvc::snGrad(alpha1)*mesh.magSf());
|
||||
|
||||
// Phase-1 dispersion, lift and wall-lubrication flux
|
||||
phiF1 =
|
||||
(
|
||||
Df1*snGradAlpha1
|
||||
+ (fvc::interpolate(rAU1*F) & mesh.Sf())
|
||||
);
|
||||
phiF1 = Df1*snGradAlpha1 + fvc::flux(rAU1*F);
|
||||
|
||||
// Phase-1 dispersion, lift and wall-lubrication flux
|
||||
phiF2 =
|
||||
(
|
||||
- Df2*snGradAlpha1
|
||||
- (fvc::interpolate(rAU2*F) & mesh.Sf())
|
||||
);
|
||||
phiF2 = - Df2*snGradAlpha1 - fvc::flux(rAU2*F);
|
||||
}
|
||||
|
||||
|
||||
@ -172,11 +164,11 @@ while (pimple.correct())
|
||||
surfaceScalarField phiHbyA1
|
||||
(
|
||||
IOobject::groupName("phiHbyA", phase1.name()),
|
||||
(fvc::interpolate(HbyA1) & mesh.Sf())
|
||||
fvc::flux(HbyA1)
|
||||
+ phiCorrCoeff1*fvc::interpolate(alpha1.oldTime()*rho1.oldTime()*rAU1)
|
||||
*(
|
||||
MRF.absolute(phi1.oldTime())
|
||||
- (fvc::interpolate(U1.oldTime()) & mesh.Sf())
|
||||
- fvc::flux(U1.oldTime())
|
||||
)/runTime.deltaT()
|
||||
- phiF1()
|
||||
- phig1
|
||||
@ -186,11 +178,11 @@ while (pimple.correct())
|
||||
surfaceScalarField phiHbyA2
|
||||
(
|
||||
IOobject::groupName("phiHbyA", phase2.name()),
|
||||
(fvc::interpolate(HbyA2) & mesh.Sf())
|
||||
fvc::flux(HbyA2)
|
||||
+ phiCorrCoeff2*fvc::interpolate(alpha2.oldTime()*rho2.oldTime()*rAU2)
|
||||
*(
|
||||
MRF.absolute(phi2.oldTime())
|
||||
- (fvc::interpolate(U2.oldTime()) & mesh.Sf())
|
||||
- fvc::flux(U2.oldTime())
|
||||
)/runTime.deltaT()
|
||||
- phiF2()
|
||||
- phig2
|
||||
|
||||
@ -156,7 +156,7 @@ while (pimple.correct())
|
||||
*(
|
||||
(alphaRhof10 + Vmf)
|
||||
*MRF.absolute(phi1.oldTime())/runTime.deltaT()
|
||||
+ (fvc::interpolate(U1Eqn.H()) & mesh.Sf())
|
||||
+ fvc::flux(U1Eqn.H())
|
||||
+ Vmf*ddtPhi2
|
||||
+ Kdf*MRF.absolute(phi2)
|
||||
- Ff1()
|
||||
@ -174,7 +174,7 @@ while (pimple.correct())
|
||||
*(
|
||||
(alphaRhof20 + Vmf)
|
||||
*MRF.absolute(phi2.oldTime())/runTime.deltaT()
|
||||
+ (fvc::interpolate(U2Eqn.H()) & mesh.Sf())
|
||||
+ fvc::flux(U2Eqn.H())
|
||||
+ Vmf*ddtPhi1
|
||||
+ Kdf*MRF.absolute(phi1)
|
||||
- Ff2()
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -34,6 +34,7 @@ License
|
||||
#include "fixedValueFvPatchFields.H"
|
||||
#include "slipFvPatchFields.H"
|
||||
#include "partialSlipFvPatchFields.H"
|
||||
#include "fvcFlux.H"
|
||||
#include "surfaceInterpolate.H"
|
||||
|
||||
|
||||
@ -175,7 +176,7 @@ Foam::phaseModel::phaseModel
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
fvc::interpolate(U_) & fluid_.mesh().Sf(),
|
||||
fvc::flux(U_),
|
||||
phiTypes
|
||||
)
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user