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/)
-   -   Matrix addressing (https://www.cfd-online.com/Forums/openfoam-programming-development/132902-matrix-addressing.html)

maybee April 7, 2014 17:39

Matrix addressing
 
hi,

I m currently have to make some matrix calculations and therefore created a matrix like

Code:

Matrix<scalarField,scalar> D(2,1);
D[1][1] = pow(phase.Size()[celli],0); //addressing of first row first element?


The code compiles, but I don t think I am addressing the first element in the first row.

Simple question: How can I address the different elements of the matrix? I ve already searched the forum, but could not find the answer.

Additionally: How can I do a element/element multiplication with two matrices? Example:

Quote:

[A1 A2 A3] * [B1 B2 B3] = [A1B1 A2B2 A3B3]

chrisb2244 April 7, 2014 22:20

To answer the second question, what you have there is the dot product, right?

Openfoam implements the dot product of two vectors using

Code:

VectorA & VectorB
In terms of your first question, I imagine what you want is D [0] [0] but I haven't tried explicitly using matrices in OF, so give me a minute to find relevant documentation.

However, your `pow' call is going to return 1 every time - you have x^0.

maybee April 8, 2014 06:00

hi,

first of all thx. I really need to know which mathematical operations are available for objects of class "matrix" . Is there anywhere an overview? I already installed "armadillo", because I could not do

Code:

Term[celli]= -(D*Prod.T()).value();
where "D" and "Prod" are "Matrix<Field<double>,double>" and "T()" should return the transpose of "Prod".

and got:

Quote:

/home/USER/SolverNEW/NEW/NEW_TransportEqns.H:141: error:
no match for ‘operator*’ in ‘D * Foam::Matrix<Form, Type>::T() const [with Form = Foam::Field<double>, Type = double]()’
I really need to know which matrice methods OpenFoam provides otherwise I ll have to use armadillo.

EDIT: I know about the pow returning always 1 - I implemented several similar functions which differ in the exponent - I ll probably change this one later for saving a little bit time when running the program.

EDIT2: I also tried now

Code:

Prod = SF & w;
where Prod,SF and w are of type "Matrix<Field<double>,double>"

only getting:

Quote:

/home/USER/SolverNEW/NEW/NEW_TransportEqns.H:137: error: no match for ‘operator&’ in ‘SF & w’
greetings maybee

chrisb2244 April 8, 2014 21:25

Dear Maybee,

Firstly, sorry for the problems you're having with multiplication - I have checked the documentation more closely and noticed that the dot product is (unsurprisingly) not defined for matrices - only vectors. Hence
Code:

A & B
will work for A = \vec{A_1 A_2 A_3} and B = \vec{B_1 B_2 B_3}, as you asked, but not for matrices more generally. I have edited my answer earlier to reflect that.

The documentation for OpenFOAM is available online at
http://www.openfoam.org/docs/cpp/

There you will see a search bar in the top right - you can use this to search for functions, or classes, etc. In your case, you would want the class Matrix. (Classes are displayed in the dropdown list as eg
Code:

Matrix Foam.
)

I'm unsure what acceptable "Form" is for a matrix - if you or someone else can give a link to documentation explaining this, or alternatively, explain this, that'd be really useful I imagine. My initial guess is that Form describes eg SquareMatrix, SymmetricSquareMatrix, RectangularMatrix etc.

As a result of this, part of me feels like you're getting undefined operators because your template substitution is messing you up. If you type

Code:

Matrix<Banana<double>, double> D(2,1)
Does that fail in a way that
Code:

Matrix<scalarField, scalar> D(2,1)
does not?

I ask because GeometricField<scalar> (== scalarField via typeDef) is not listed as a Form as far as I can see, so I'm wondering if that is because I can't find a suitable list of "Form"s, or if it is not a valid construction.

Best,
Christian

maybee April 9, 2014 04:58

Hi,

I ve already used the FOAM Docs to search for the matrix class:

http://www.openfoam.org/docs/cpp/

But there is not much documentation about mathematical methods that can be used on matrices!

I also could not find any list for valid "Forms", only:

http://www.cfd-online.com/Forums/ope...m-1-6-ext.html

Quote:


I'm unsure what acceptable "Form" is for a matrix - if you or someone else can give a link to documentation explaining this, or alternatively, explain this, that'd be really useful I imagine. My initial guess is that Form describes eg SquareMatrix, SymmetricSquareMatrix, RectangularMatrix etc.

As a result of this, part of me feels like you're getting undefined operators because your template substitution is messing you up. If you type

Code:
Matrix<Banana<double>, double> D(2,1)
Does that fail in a way that
Code:
Matrix<scalarField, scalar> D(2,1)
does not?

I ask because GeometricField<scalar> (== scalarField via typeDef) is not listed as a Form as far as I can see, so I'm wondering if that is because I can't find a suitable list of "Form"s, or if it is not a valid construction.
Same over here :). Initially I had the same thoughts. I also tried "int" for the "Form" which does compile fine.
I ll use armadillo now, perhaps OpenFOAM s Matrix class is not finished yet (?)....

greetings maybee

jherb April 9, 2014 10:33

I guess this might help:
http://www.foamcfd.org/Nabla/guides/...sGuidese4.html

maybee April 9, 2014 11:41

nice, but still I ll use armadillo since I am working with matrices and not tensors.

l_r_mcglashan April 9, 2014 12:00

Of course the Matrix class works. It's not there for nothing.

Quote:

Originally Posted by maybee (Post 484498)
hi,

I m currently have to make some matrix calculations and therefore created a matrix like

Code:

Matrix<scalarField,scalar> D(2,1);
D[1][1] = pow(phase.Size()[celli],0); //addressing of first row first element?


What do you expect to happen with the first template parameter as 'scalarField'?

What is the form of you matrix? Rectangular/Square/Diagonal/Symmetric? You would then do:

Matrix<RectangularMatrix<scalar>, scalar> D(2,1);

or shorthand (see scalarMatrices.H):

scalarRectangularMatrix D(2,1);

Most standard matrix operations are available.

maybee April 9, 2014 12:13

Ok,

I missread the translation of "rectangular" when translating it :/ .
Is there anywhere a list/reference of the matrix operations in OpenFOAM?

Furthermore is there defined a method for this operation

Quote:

A * B = AB
[A1 A2 A3] * [B1 B2 B3] = [A1B1 A2B2 A3B3]
Note, that I just used * here for the unknown method/operator.

purnp2 May 25, 2019 13:22

for future help...
For [A1 A2 A3] * [B1 B2 B3] = [A1B1 A2B2 A3B3], use scale(A,B).
See reference in:
http://foam.sourceforge.net/docs/Gui...mmersGuide.pdf

mrishi August 1, 2020 07:55

Quote:

Originally Posted by purnp2 (Post 734770)
for future help...
For [A1 A2 A3] * [B1 B2 B3] = [A1B1 A2B2 A3B3], use scale(A,B).
See reference in:
http://foam.sourceforge.net/docs/Gui...mmersGuide.pdf


For future reference,

The scale(a,b) function has been replaced by cmptMultiply(a,b).

See here:
https://www.cfd-online.com/Forums/op...-function.html


All times are GMT -4. The time now is 10:35.