CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)

 gunnar2 August 8, 2011 13:45

Hello,
I have asked in "Running / Solving / CFD (http://www.cfd-online.com/Forums/ope...-k-grad-u.html)" before, but now this seems to be a programming question.

How can I treat implicitly?

- scalar field (known diffusivity)
- scalar field (known mass fraction)
- scalar field (unknown)

fvm::laplacian(k,alpha*u) generates a compiler error.

I think a possible solution is to right-multiply the fvMatrix fvm::laplacian(k,u) with a diagonal matrix made up of the values of on it's diagonal.

But how do I write this in C++?

Thank you
Gunnar

 gunnar2 August 9, 2011 14:22

Is it really not possible to build a diagonal matrix?

Another possibility can be first to construct

fvMatrix M=fvm::laplacian(k,u)

In the next step I would have to multiply each row i of the matrix M with alpha[i]. However I don't understand the storage format of fvMatrix. May I ask if somebody would share a few lines of code, how to multiply one row of a fvMatrix with a scalar value?

Thank you
Gunnar

 gunnar2 August 11, 2011 16:40

anybody any idea?

or at least a reason, why there cannot be an implicit scheme for

Thank you
Gunnar

 marupio August 12, 2011 08:52

Can you use the chain rule to seperate alpha and u?

 jakobh August 12, 2011 11:41

Hi Gunnar!
You can use this function:

Code:

namespace Foam{ namespace fvm{   template<class Type, class GType>   tmp<fvMatrix<Type> >   laplacian   (     const GeometricField<GType, fvPatchField, volMesh>& gamma,     GeometricField<Type, fvPatchField, volMesh>& vf,     GeometricField<Type, fvPatchField, volMesh>& alpha   )   {     tmp<fvMatrix<Type> > Laplacian=fvm::laplacian(gamma,vf);     Laplacian()*=alpha;     return Laplacian;   } } }