Register Blogs Members List Search Today's Posts Mark Forums Read

April 7, 2014, 17:39
#1
Senior Member

Join Date: Jan 2012
Posts: 159
Rep Power: 5
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]

Last edited by maybee; April 7, 2014 at 19:10.

 April 7, 2014, 22:20 #2 Member   Christian Butcher Join Date: Jul 2013 Location: Japan Posts: 84 Rep Power: 4 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. Last edited by chrisb2244; April 8, 2014 at 21:14. Reason: Turns out this isn't defined for matrices, only vectors

April 8, 2014, 06:00
#3
Senior Member

Join Date: Jan 2012
Posts: 159
Rep Power: 5
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::T() const [with Form = Foam::Field, 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

Last edited by maybee; April 8, 2014 at 17:12.

 April 8, 2014, 21:25 #4 Member   Christian Butcher Join Date: Jul 2013 Location: Japan Posts: 84 Rep Power: 4 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 and , 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, double> D(2,1) Does that fail in a way that Code: Matrix D(2,1) does not? I ask because GeometricField (== 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 sharonyue likes this.

April 9, 2014, 04:58
#5
Senior Member

Join Date: Jan 2012
Posts: 159
Rep Power: 5
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:

Defining a Matrix in OpenFOAM-1.6-ext

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, double> D(2,1) Does that fail in a way that Code: Matrix D(2,1) does not? I ask because GeometricField (== 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

 April 9, 2014, 10:33 #6 Senior Member   Joachim Herb Join Date: Sep 2010 Posts: 291 Rep Power: 9 I guess this might help: http://www.foamcfd.org/Nabla/guides/...sGuidese4.html maybee likes this.

 April 9, 2014, 11:41 #7 Senior Member   Join Date: Jan 2012 Posts: 159 Rep Power: 5 nice, but still I ll use armadillo since I am working with matrices and not tensors.

April 9, 2014, 12:00
#8
Senior Member

Laurence R. McGlashan
Join Date: Mar 2009
Posts: 370
Rep Power: 14
Of course the Matrix class works. It's not there for nothing.

Quote:
 Originally Posted by maybee hi, I m currently have to make some matrix calculations and therefore created a matrix like Code: Matrix 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.
__________________
Laurence R. McGlashan :: Website

April 9, 2014, 12:13
#9
Senior Member

Join Date: Jan 2012
Posts: 159
Rep Power: 5
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.

 Thread Tools Display Modes Linear Mode

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are On Forum Rules

 Similar Threads Thread Thread Starter Forum Replies Last Post maybee OpenFOAM Programming & Development 0 December 7, 2013 13:40 yhaomin2007 OpenFOAM 1 September 6, 2012 08:33 colopolo CFX 13 October 4, 2011 22:03 lakeat OpenFOAM Running, Solving & CFD 42 August 26, 2009 21:47 marziolettich OpenFOAM Running, Solving & CFD 2 February 19, 2008 06:04

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