diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C index 486c0959dddfb299e64c1c7747ebc2ff3f98a62f..7fc3cf863634c4167d4fc3dc88fd087f5ba1ad4c 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C @@ -42,7 +42,7 @@ template<class ParcelType> void Foam::KinematicCloud<ParcelType>::preEvolve() { this->dispersion().cacheFields(true); - forces_.cacheFields(true); + forces_.cacheFields(true, interpolationSchemes_); } @@ -152,7 +152,7 @@ void Foam::KinematicCloud<ParcelType>::postEvolve() } this->dispersion().cacheFields(false); - forces_.cacheFields(false); + forces_.cacheFields(false, interpolationSchemes_); this->postProcessing().post(); } diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index 31c274ea38d9fd0372992665f3b7edd61d975890..fc34e3b1614498aa2c19a7f3559d23bfbaf4d943 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -162,6 +162,7 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity // Momentum source due to particle forces const vector FCoupled = mass*td.cloud().forces().calcCoupled ( + this->position(), cellI, dt, rhoc_, @@ -173,6 +174,7 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity const vector FNonCoupled = mass*td.cloud().forces().calcNonCoupled ( + this->position(), cellI, dt, rhoc_, diff --git a/src/lagrangian/intermediate/particleForces/particleForces.C b/src/lagrangian/intermediate/particleForces/particleForces.C index 5d446037fe6b79a31eb33e8cd47ba965d7f68fe6..31db9460f1b98e485d6dfb6e3b58e8392c85546f 100644 --- a/src/lagrangian/intermediate/particleForces/particleForces.C +++ b/src/lagrangian/intermediate/particleForces/particleForces.C @@ -30,6 +30,24 @@ License #include "mathematicalConstants.H" #include "electromagneticConstants.H" +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::particleForces::deleteFields() +{ + if (gradUPtr_) + { + delete gradUPtr_; + gradUPtr_ = NULL; + } + + if (HdotGradHInterPtr_) + { + delete HdotGradHInterPtr_; + HdotGradHInterPtr_ = NULL; + } +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::particleForces::particleForces @@ -85,7 +103,7 @@ Foam::particleForces::particleForces(const particleForces& f) Foam::particleForces::~particleForces() { - cacheFields(false); + deleteFields(); } @@ -151,26 +169,46 @@ const Foam::word& Foam::particleForces::HdotGradHName() const } -void Foam::particleForces::cacheFields(const bool store) +void Foam::particleForces::cacheFields +( + const bool store, + const dictionary& interpolationSchemes +) { - if (store && pressureGradient_) + if (store) { - const volVectorField& U = mesh_.lookupObject<volVectorField>(UName_); - gradUPtr_ = fvc::grad(U).ptr(); + if (pressureGradient_) + { + const volVectorField& U = + mesh_.lookupObject<volVectorField>(UName_); + + gradUPtr_ = fvc::grad(U).ptr(); + } + + if (paramagnetic_) + { + const volVectorField& HdotGradH = mesh_.lookupObject<volVectorField> + ( + HdotGradHName_ + ); + + HdotGradHInterPtr_ = interpolation<vector>::New + ( + interpolationSchemes, + HdotGradH + ).ptr(); + } } else { - if (gradUPtr_) - { - delete gradUPtr_; - gradUPtr_ = NULL; - } + deleteFields(); } } Foam::vector Foam::particleForces::calcCoupled ( + const vector& position, const label cellI, const scalar dt, const scalar rhoc, @@ -205,6 +243,7 @@ Foam::vector Foam::particleForces::calcCoupled Foam::vector Foam::particleForces::calcNonCoupled ( + const vector& position, const label cellI, const scalar dt, const scalar rhoc, @@ -226,15 +265,12 @@ Foam::vector Foam::particleForces::calcNonCoupled if (paramagnetic_) { - const volVectorField& HdotGradH = mesh_.lookupObject<volVectorField> - ( - HdotGradHName_ - ); + const interpolation<vector>& HdotGradHInter = *HdotGradHInterPtr_; accelTot += 3.0*constant::electromagnetic::mu0.value()/rho *magneticSusceptibility_/(magneticSusceptibility_ + 3) - *HdotGradH[cellI]; + *HdotGradHInter.interpolate(position, cellI); // force is: diff --git a/src/lagrangian/intermediate/particleForces/particleForces.H b/src/lagrangian/intermediate/particleForces/particleForces.H index 90c5ecafa43101deb433ddee8a3389fa04e9e41a..8c76b1f773dfbba1d90f146878e649468b36abcd 100644 --- a/src/lagrangian/intermediate/particleForces/particleForces.H +++ b/src/lagrangian/intermediate/particleForces/particleForces.H @@ -40,6 +40,7 @@ SourceFiles #include "Switch.H" #include "vector.H" #include "volFieldsFwd.H" +#include "interpolation.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -69,6 +70,9 @@ class particleForces //- Velocity gradient field const volTensorField* gradUPtr_; + //- HdotGradH interpolator + const interpolation<vector>* HdotGradHInterPtr_; + // Forces to include in particle motion evaluation @@ -101,6 +105,12 @@ class particleForces const word HdotGradHName_; + // Private Member Functions + + //- Delete cached carrier fields + void deleteFields(); + + public: // Constructors @@ -159,11 +169,16 @@ public: // Evaluation //- Cache carrier fields - void cacheFields(const bool store); + void cacheFields + ( + const bool store, + const dictionary& interpolationSchemes + ); //- Calculate action/reaction forces between carrier and particles vector calcCoupled ( + const vector& position, const label cellI, const scalar dt, const scalar rhoc, @@ -176,6 +191,7 @@ public: //- Calculate external forces applied to the particles vector calcNonCoupled ( + const vector& position, const label cellI, const scalar dt, const scalar rhoc,