CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (http://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   Matrix and Varialbe Definition (http://www.cfd-online.com/Forums/openfoam-programming-development/104569-matrix-varialbe-definition.html)

treima July 12, 2012 03:51

Matrix and Varialbe Definition
 
Hello,

is it possible to define a 5x5 matrix in OpenFoam? If yes, how?

The same question is, if there is a possibility to define a vector with 5 components? But Iīve to make this definition in "createFields.H"

I would like to solve the equation

\frac{d}{dt} v + A \frac{d}{dx} v + B \frac{d}{dy} v + C \frac{d}{dz} v = 0

where A,B,C are 5x5 matrices and v a 5x1 vector.


Best regards

treima

kathrin_kissling July 13, 2012 03:27

Is it just the equation or are you going to solve that on a finite-volume grid?

In Version 1.6-ext there is support for NxN matrices. You might want to check this out!

Best

Kathrin

treima July 13, 2012 03:49

Thanks.

Iīd like to solve that one the grid for v, yes. Iīve tried to divied this into three equations like the density, momentum and energy equation like the "normal" way, but they are coupled.

Have you ever tried this with OpenFoam 2.1.0, too? Or have you any experience if there is support, too?

And the last question ;). Do you know how it is done in 1.6-ext?


Best

treima

treima August 10, 2012 04:23

Hello,

I didnīt work on this for a while, but now Iīve found some possiblities and, of course, new problems.

Here ist my partial differential equation system, which i like to solve:

\frac{\partial}{\partial t} \begin{pmatrix} \Lambda_1 \\ \Lambda_2 \\ \Lambda_3 \\ \Lambda_ 4 \\ \Lambda_5 \end{pmatrix} +
\begin{pmatrix} 0 & a_{21} & a_{31} & a_{41} & a_{51} \\ 1 & a_{22} & a_{32} & a_{42} & a_{52} \\ 
    0 & a_{23} & a_{33} & 0 & a_{53} \\ 0 & a_{24} & 0 & a_{44} & a_{54} \\ 0 & a_{25} & 0 & 0 & a_{55} \end{pmatrix} \frac{\partial}{\partial x}  \begin{pmatrix} \Lambda_1 \\ \Lambda_2 \\ \Lambda_3 \\ \Lambda_ 4 \\ \Lambda_5 \end{pmatrix} +
+ \begin{pmatrix} 0 & b_{21} & b_{31} & b_{41} & b_{51} \\ 0 & b_{22} & b_{32} & 0 & b_{52} \\
      1 & b_{23} & b_{33} & b_{43} & b_{53} \\ 0 & 0 & b_{34} & b_{44} & b_{54} \\
      0 & 0 & b_{35} & 0 & b_{55} \end{pmatrix} \frac{\partial}{\partial y} \begin{pmatrix} \Lambda_1 \\ \Lambda_2 \\ \Lambda_3 \\ \Lambda_4 \\ \Lambda_5 \end{pmatrix} +
+
\begin{pmatrix} 0 & c_{21} & c_{31} & c_{41} & c_{51} \\ 0 & c_{22} & 0 & c_{42} & c_{52} \\
      0 & 0 & c_{33} & c_{43} & c_{53} \\ 1 & c_{24} & c_{34} & c_{44} & c_{54} \\
      0 & 0 & 0 & c_{45} & c_{55} \end{pmatrix} \frac{\partial}{\partial z}
\begin{pmatrix} \Lambda_1 \\ \Lambda_2 \\ \Lambda_3 \\ \Lambda_4 \\ \Lambda_5 \end{pmatrix} = 0 \,.

Iīve defined the matrices via
Matrix<volScalarField,scalarField> jacobi_f(5,5), jacobi_g(5,5), jacobi_h(5,5);
and assigned the elements via
jacobi_f[i][j] = functions;
and so on.

My problem is now, how to deal with vectors of dimension five. Itīs not possible to define a five-dimensional volVectorField and to combine this with my matrices.
Is it possible to solve the five dimensional coupled system with OpenFoam? If yes, how can this be done? Do you have any ideas?


regards,
treima

kathrin_kissling August 10, 2012 04:32

Check out the VectorN class in 1.6-ext.

There is no such thing in the vanilla version.

Sorry

Best

Kathrin

treima August 10, 2012 06:05

Thanks a lot for this quick reply!

Iīve to make some changes in my solver for using it with 1.6-ext.

But do you know an existing solver where VectorN is used?

kathrin_kissling August 10, 2012 06:14

Hey treima,

in 1.6-ext there is blockCoupledScalarTransportFoam

documentation and application of the tecnique can be found in Ivor Cliffords work (6th OFW training material) and in my work (see this years OFW presentation slides)

Best

Kathrin

Hisham August 11, 2012 08:36

Hello

I think you can go around your problem in OF 2.x by dividing your equation into 5 scalar equations and solve each separately.

I mean the interaction-terms can be treated explicitly and you iterate to converge (the segregated way)

Regards,
Hisham

treima August 14, 2012 03:30

Hello,

Iīve thought about this, too. But the five equations are coupled with each other, so that it isnīt possible to extract parts with less then four variables and I think. In OpenFOAM you canīt solve equations with more than one variable, right? Perhaps I didnīt understand this solution, but at the moment I canīt see your point ;)

Thanks Kathrin for hints, Iīll have a closer look at the blockCoupled-solver and try to extend this one for five equations!


Regards
treima

treima August 24, 2012 10:34

Hello,

Iīve tried to sperate these equations, like Hisham suggested, in scalar equations. Now Iīm solving this problem (for demonstration, I take the first row)

\frac{\partial}{\partial t} \Lambda_1 + a_{21} \frac{\partial}{\partial x} \Lambda_2 + a_{31} \frac{\partial}{\partial x} \Lambda_3 + a_{41} \frac{\partial}{\partial x} \Lambda_4 + a_{51} \frac{\partial}{\partial x} +
b_{21} \frac{\partial}{\partial y} \Lambda_2 + b_{31}  \frac{\partial}{\partial y} \Lambda_3 + b_{41} \frac{\partial}{\partial y} \Lambda_4 + b_{51} \frac{\partial}{\partial y} +
c_{21} \frac{\partial}{\partial z} \Lambda_2 + c_{31}  \frac{\partial}{\partial z} \Lambda_3 + c_{41} \frac{\partial}{\partial z} \Lambda_4 + c_{51} \frac{\partial}{\partial z} = 0

+ the four other equations.

In OpenFOAM Iīve Implemented this:

solve
(
fvm::ddt(Lambda_1) + a21*gradXLambda2 + 1./tcoeff*a31*gradXLambda3 +
1./tcoeff*a41*gradXLambda4 + 1./pow(tcoeff,2)*a51*gradXLambda5 +
1./tcoeff*b21*gradYLambda2 + 1./tcoeff*b31*gradYLambda3 +
1./tcoeff*b41*gradYLambda4 + 1./pow(tcoeff,2)*b51*gradYLambda5 +
1./tcoeff*c21*gradZLambda2 + 1./tcoeff*c31*gradZLambda3 +
1./tcoeff*c41*gradZLambda4 + 1./pow(tcoeff,2)*c51*gradZLambda5
);

solve
(
equation2
);

solve
(
equation3
);

solve
(
equation4
);

solve
(
equation5
);

where tcoeff is a cofactor to get the right dimensions (at the end, dimensions doesnīt matter) and gradXLambda2, gradXLambda3 are defined as followed:

volScalarField gradXLambda2 (unitVector_x & fvc::grad(Lambda_2));

Is this the right way to do this? The results are a little bit confusing. Perhaps the mistake is in my implementation, in my derivation of the equations, in my boundary conditions or somewhere else.

Do anyone have any experience or suggestions concerning my problem?

Thanks,
treima


All times are GMT -4. The time now is 01:37.