CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   lagrangian cloud::SU() returns different (https://www.cfd-online.com/Forums/openfoam-programming-development/241814-lagrangian-cloud-su-returns-different.html)

mrishi March 21, 2022 10:30

lagrangian cloud::SU() returns different
 
Hi all,I noticed the following when coupling lagrangian cloud with eulerian continuum. In the momentum source calculator function, MomentumCloud::SU() (for OF8+, otherwise it would probably be KinematicCloud::SU()), we see the following code:


Code:

if (solution_.semiImplicit("U"))
        {
            const volScalarField::Internal
                Vdt(this->mesh().V()*this->db().time().deltaT());

            return UTrans()/Vdt - fvm::Sp(UCoeff()/Vdt, U) + UCoeff()/Vdt*U;
        }


Where UCoeff and UTrans are the self-explanatory fields, derived by adding up the interaction from all member particles of the cloud. The returned object is an fvVectorMatrix, with the first and last are explicit components, and the middle term, the coefficient term.



Now, if there is no "semi-implicit" flag, ie the source is purely an explicit term,
the code returns:


Code:

else
        {
            tmp<fvVectorMatrix> tfvm(new fvVectorMatrix(U, dimForce));
            fvVectorMatrix& fvm = tfvm.ref();

            fvm.source() = -UTrans()/(this->db().time().deltaT());

            return tfvm;
        }


Which is quite analogous to the explicit part of semi-implicit source above, but it does not have a division by cell volume.

It appears to me that in general, we supply fvVectorMatrix terms on a per unit volume basis. What is then the reason behind difference in the divisor in the two cases. Is the second formulation correct? If it is, can someone help me understand why it is so?



I would expect that the two should not even run with the same solver/case, based on dimensional considerations, but they do. However, I cannot find any other point in lagrangian libraries, where the semi-implicit flag is used to change the way in which UTrans is calculated differently depending of the flag.



I would appreciate any help in enlightening me about this.


Thanks

dscian March 21, 2022 15:21

In the explicit formulation, it doesn't construct fvMatrix but assigns the field to the source of the fvMatrix, hence no division by volume.

mrishi March 22, 2022 01:24

Hey,
Thank you for your answer! :)
You say that

Quote:

Originally Posted by dscian (Post 824483)
In the explicit formulation, it doesn't construct fvMatrix but assigns the field to the source of the fvMatrix, hence no division by volume.


but, in the explicit case's code above doesn't

Code:

tmp<fvVectorMatrix> tfvm(new fvVectorMatrix(U, dimForce));
fvVectorMatrix& fvm = tfvm.ref();

'construct' a matrix, which is eventually added to the UEqn matrix, similar to the semi-implicit case above it? It isn't clear to me why one is considered construction and the other isnt. Once we have created a tmp and then ref'd to its memory location, don't we have a proper fvMatrix?



Thanks again.

snak March 23, 2022 06:37

Hi,

There is the section (3.4.9, P-43) about the source terms in Programmer's Guide.
https://sourceforge.net/projects/openfoam/files/v2112/

With the implicit method, the term will be integrated over a control volume. This explanation is about a flow field, not about a lagrangian cloud. However, there may be some relations with your question.


All times are GMT -4. The time now is 08:26.