[cig-commits] r4363 - in long/3D/Gale/trunk/src/StGermain: .
Discretisation/Geometry/src Discretisation/Geometry/tests
walter at geodynamics.org
walter at geodynamics.org
Thu Aug 17 17:18:28 PDT 2006
Author: walter
Date: 2006-08-17 17:18:26 -0700 (Thu, 17 Aug 2006)
New Revision: 4363
Modified:
long/3D/Gale/trunk/src/StGermain/
long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/TensorMultMath.c
long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/TensorMultMath.h
long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testTensorMultMath.0of1.expected
long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testTensorMultMath.c
Log:
r2727 at earth: boo | 2006-08-17 17:14:30 -0700
r2681 at earth (orig r3762): KathleenHumble | 2006-08-16 22:01:44 -0700
Added in 3 new functions to TensorMultMath:
NonSquareMatrix_MultiplicationByNonSquareMatrix
NonSquareMatrix_Transpose
Journal_PrintNonSquareMatrix
NonSquareMatrix is assumed to be a 2D matrix of doubles, size: n x m
see doxygen or *.h file for more detailed comments on using or implementing
functions
Property changes on: long/3D/Gale/trunk/src/StGermain
___________________________________________________________________
Name: svk:merge
- 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2726
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3761
+ 1ef209d2-b310-0410-a72d-e20c9eb0015c:/cig:2727
afb6c753-b9d0-0310-b4e7-dbd8d91cdd35:/trunk/StGermain:3762
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/TensorMultMath.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/TensorMultMath.c 2006-08-18 00:18:24 UTC (rev 4362)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/TensorMultMath.c 2006-08-18 00:18:26 UTC (rev 4363)
@@ -494,3 +494,80 @@
return contraction;
}
+
+/** This function calculates the transpose of a non-square nxm 2D matrix
+ It requires the row and column dimensions, and assumes an answer matrix
+ that is the correct size, ie mxn */
+void NonSquareMatrix_Transpose( double** originalMatrix, Dimension_Index rowDimOrig,
+ Dimension_Index colDimOrig, double** newMatrix ) {
+ Dimension_Index row_I, col_I;
+ if ((rowDimOrig <=0) || (colDimOrig <=0)) {
+ Stream* error = Journal_Register( ErrorStream_Type, "TensorMultMath" );
+
+ Journal_Firewall( False, error,
+ "In func '%s' don't understand rows = %u or cols = %u\n",
+ __func__, rowDimOrig, colDimOrig );
+ }
+ for( row_I = 0 ; row_I < rowDimOrig ; row_I++ ) {
+ for( col_I = 0 ; col_I < colDimOrig ; col_I++ ) {
+ newMatrix[ col_I ][ row_I ] = originalMatrix[ row_I ][ col_I ];
+ }
+ }
+ return;
+}
+/** This function multiplies 2 non square matrices. It requires the row and column
+ dimensions for each matrix. Columns In Matrix A = Rows In Matrix B
+ resultMatrix_ik = AMatrix_ij x BMatrix_jk */
+void NonSquareMatrix_MultiplicationByNonSquareMatrix( double **AMatrix, int rowDimA, int colDimA,
+ double **BMatrix, int rowDimB, int colDimB,
+ double** resultMatrix ) {
+
+ int row_I, col_I; // location with resultMatrix
+ int counter; // counter which facilitates the multiplication of AMatrix and BMatrix
+ Stream* error = Journal_Register( ErrorStream_Type, "TensorMultMath" );
+
+ if (colDimA != rowDimB) {
+ Journal_Firewall( False, error,
+ "In func '%s' row dimension B, %u != column dimension A, %u\n",
+ __func__, rowDimB, colDimA );
+ }
+ if ((AMatrix == NULL) || (BMatrix == NULL) || (resultMatrix == NULL) ) {
+ Journal_Firewall( False, error,
+ "In func '%s', Input matrices: %s %s, or Output matrix: %s is NULL \n",
+ __func__, AMatrix, BMatrix, resultMatrix);
+ }
+ /* calculate result matrix */
+ for( row_I = 0 ; row_I < rowDimA ; row_I++ ) {
+ for( col_I = 0 ; col_I < colDimB ; col_I++ ) {
+ /* resultMatrix[ row_I ][ col_I] = AMatrix_ij x BMatrix_jk */
+ for( counter = 0 ; counter < colDimA ; counter++ ) {
+ resultMatrix[ row_I ][ col_I ] += ( AMatrix[row_I][counter] * BMatrix[counter][col_I] );
+ }
+ }
+ }
+}
+
+/** Prints out a non square matrix if given the row and col dimension */
+void Journal_PrintNonSquareMatrix_Unnamed( Stream* stream, double** NonSquareMatrix,
+ Dimension_Index rowDim, Dimension_Index colDim )
+{
+ Dimension_Index row_I, col_I;
+
+ /* For efficency - Check if stream is enabled */
+ if (!Stream_IsEnable(stream)) return;
+
+ /* Check that dimensions are at least positive */
+ if ((rowDim < 0 ) || ( colDim < 0)) {
+ Journal_Firewall( False, Journal_Register( ErrorStream_Type, "TensorMultMath" ),
+ "In func '%s', do not understand dimension(s) %d and /or %d \n",
+ __func__, rowDim, colDim);
+ }
+
+ for ( row_I = 0 ; row_I < rowDim ; row_I++ ) {
+ for ( col_I = 0 ; col_I < colDim ; col_I++ ) {
+ Journal_Printf( stream, "%7.5g ", NonSquareMatrix[row_I][col_I] );
+ }
+ Journal_Printf( stream, "\n" );
+ }
+
+}
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/TensorMultMath.h
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/TensorMultMath.h 2006-08-18 00:18:24 UTC (rev 4362)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/src/TensorMultMath.h 2006-08-18 00:18:26 UTC (rev 4363)
@@ -75,6 +75,25 @@
/* Useful operations in Solid Mechanics */
double TensorArray_DoubleContraction(TensorArray tensorArrayA,TensorArray tensorArrayB, Dimension_Index dim);
double SymmetricTensor_DoubleContraction(SymmetricTensor tensorA, SymmetricTensor tensorB, Dimension_Index dim);
+/* Non-square matrix operations */
+void NonSquareMatrix_Transpose( double** originalMatrix, Dimension_Index rowDimOrig,
+ Dimension_Index colDimOrig, double** newMatrix );
+void NonSquareMatrix_MultiplicationByNonSquareMatrix( double **AMatrix, int rowsInA, int colsInA,
+ double **BMatrix, int rowsInB, int colsInB,
+ double** resultMatrix );
+/** Print a named NonSquareMatrix */
+#define Journal_PrintNonSquareMatrix(stream, matrix, rowDim, colDim) \
+ do { \
+ Journal_Printf( stream, #matrix " - \n" ); \
+ Journal_PrintNonSquareMatrix_Unnamed( stream, matrix, rowDim, colDim ); \
+ } while(0)
+
+void Journal_PrintNonSquareMatrix_Unnamed( Stream* stream, double** NonSquareMatrix,
+ Dimension_Index rowDim, Dimension_Index colDim ) ;
+
+
+
+
#endif /* __Discretisation_Geometry_TensorMultMath_h__ */
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testTensorMultMath.0of1.expected
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testTensorMultMath.0of1.expected 2006-08-18 00:18:24 UTC (rev 4362)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testTensorMultMath.0of1.expected 2006-08-18 00:18:26 UTC (rev 4363)
@@ -1,4 +1,4 @@
-StGermain Framework revision 3716. Copyright (C) 2003-2005 VPAC.
+StGermain Framework revision 3761. Copyright (C) 2003-2005 VPAC.
1e-14
/******************* Test 1 ************************/
Test TensorArray Identity
@@ -346,3 +346,46 @@
30 50 60
Double Contraction =
result = 1290
+
+/******************* Test 17 ************************/
+Test function Journal_PrintNonSquareMatrix
+
+nonSquareMatrixA -
+ 0 1 2 3
+ 4 5 6 7
+ 8 9 10 11
+nonSquareMatrixB -
+ 0 1
+ 2 3
+ 4 5
+ 6 7
+
+/******************* Test 18 ************************/
+Test function NonSquareMatrix_Transpose
+
+nonSquareMatrixA -
+ 0 1 2 3
+ 4 5 6 7
+ 8 9 10 11
+nonSquareMatrixAT -
+ 0 4 8
+ 1 5 9
+ 2 6 10
+ 3 7 11
+
+/******************* Test 18 ************************/
+Test function NonSquareMatrix_MultiplicationByNonSquareMatrix
+
+nonSquareMatrixA -
+ 0 1 2 3
+ 4 5 6 7
+ 8 9 10 11
+nonSquareMatrixB -
+ 0 1
+ 2 3
+ 4 5
+ 6 7
+nonSquareMatrixResult -
+ 28 34
+ 76 98
+ 124 162
Modified: long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testTensorMultMath.c
===================================================================
--- long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testTensorMultMath.c 2006-08-18 00:18:24 UTC (rev 4362)
+++ long/3D/Gale/trunk/src/StGermain/Discretisation/Geometry/tests/testTensorMultMath.c 2006-08-18 00:18:26 UTC (rev 4363)
@@ -725,90 +725,63 @@
Journal_Printf( stream, "Double Contraction = \n");
Journal_PrintValue( stream, result);
-// Journal_Printf(stream, "\n/******************* Test 17 ************************/\n");
-/* Journal_Printf( stream, "Test function SymmetricTensor_PullbackTrace \n\n");
+ Journal_Printf(stream, "\n/******************* Test 17 ************************/\n");
+ Journal_Printf( stream, "Test function Journal_PrintNonSquareMatrix \n\n");
+ double **nonSquareMatrixA, **nonSquareMatrixB;
+ double **nonSquareMatrixResult, **nonSquareMatrixAT;
- Journal_Printf( stream, "2-D\n");
- tensorArray[FT2D_00] = 1;
- tensorArray[FT2D_01] = 2;
- tensorArray[FT2D_10] = 3;
- tensorArray[FT2D_11] = 4;
+ nonSquareMatrixA = Memory_Alloc_2DArray(double, 3, 4, "NonSquareMatrixA" );
+ nonSquareMatrixB = Memory_Alloc_2DArray(double, 4, 2, "NonSquareMatrixB" );
+ nonSquareMatrixAT = Memory_Alloc_2DArray(double, 4, 3, "NonSquareMatrixAT" );
+ nonSquareMatrixResult = Memory_Alloc_2DArray(double, 3, 2, "NonSquareMatrixResult" );
+ //Matrix A
+ nonSquareMatrixA[0][0] = 0; nonSquareMatrixA[1][0] = 4;
+ nonSquareMatrixA[0][1] = 1; nonSquareMatrixA[1][1] = 5;
+ nonSquareMatrixA[0][2] = 2; nonSquareMatrixA[1][2] = 6;
+ nonSquareMatrixA[0][3] = 3; nonSquareMatrixA[1][3] = 7;
+
+ nonSquareMatrixA[2][0] = 8;
+ nonSquareMatrixA[2][1] = 9;
+ nonSquareMatrixA[2][2] = 10;
+ nonSquareMatrixA[2][3] = 11;
+ //Matrix B
+ nonSquareMatrixB[0][0] = 0; nonSquareMatrixB[1][0] = 2;
+ nonSquareMatrixB[0][1] = 1; nonSquareMatrixB[1][1] = 3;
+
+ nonSquareMatrixB[2][0] = 4; nonSquareMatrixB[3][0] = 6;
+ nonSquareMatrixB[2][1] = 5; nonSquareMatrixB[3][1] = 7;
+
+
+ Journal_PrintNonSquareMatrix(stream, nonSquareMatrixA, 3, 4);
+ Journal_PrintNonSquareMatrix(stream, nonSquareMatrixB, 4, 2);
- symmTensor[ST2D_00] = 5;
- symmTensor[ST2D_01] = 6;
- symmTensor[ST2D_11] = 7;
+ Journal_Printf(stream, "\n/******************* Test 18 ************************/\n");
+ Journal_Printf( stream, "Test function NonSquareMatrix_Transpose \n\n");
- Journal_PrintTensorArray( stream, tensorArray, 2);
- Journal_Printf( stream, "Right Cauchy Green SymmetricTensor =\n");
- Journal_PrintSymmetricTensor( stream, symmTensor, 2);
- result = SymmetricTensor_PullbackTrace(tensorArray, symmTensor, 2);
- Journal_PrintValue(stream, result);
-
- Journal_Printf( stream, "3-D\n");
- tensorArray[FT3D_00] = 1;
- tensorArray[FT3D_01] = 2;
- tensorArray[FT3D_02] = 3;
- tensorArray[FT3D_10] = 4;
- tensorArray[FT3D_11] = 5;
- tensorArray[FT3D_12] = 6;
- tensorArray[FT3D_20] = 7;
- tensorArray[FT3D_21] = 8;
- tensorArray[FT3D_22] = 9;
+ Journal_PrintNonSquareMatrix(stream, nonSquareMatrixA, 3, 4);
- symmTensor[ST3D_00] = 10;
- symmTensor[ST3D_01] = 20;
- symmTensor[ST3D_02] = 30;
- symmTensor[ST3D_11] = 40;
- symmTensor[ST3D_12] = 50;
- symmTensor[ST3D_22] = 60;
+ NonSquareMatrix_Transpose( nonSquareMatrixA, 3, 4, nonSquareMatrixAT);
+
+ Journal_PrintNonSquareMatrix(stream, nonSquareMatrixAT, 4, 3);
- Journal_PrintTensorArray( stream, tensorArray, 3);
- Journal_Printf( stream, "Right Cauchy Green SymmetricTensor =\n");
- Journal_PrintSymmetricTensor( stream, symmTensor, 3);
- result = SymmetricTensor_PullbackTrace(tensorArray, symmTensor, 3);
- Journal_PrintValue(stream, result);
-*/
-// Journal_Printf(stream, "\n/******************* Test 18 ************************/\n");
-/* Journal_Printf( stream, "Test function SymmetricTensor_PullbackDeviator \n\n");
+ Journal_Printf(stream, "\n/******************* Test 18 ************************/\n");
+ Journal_Printf( stream, "Test function NonSquareMatrix_MultiplicationByNonSquareMatrix \n\n");
- Journal_Printf( stream, "2-D\n");
- symmTensor[ST2D_00] = 5;
- symmTensor[ST2D_01] = 6;
- symmTensor[ST2D_11] = 7;
-
- symmTensor2[ST2D_00] = 1;
- symmTensor2[ST2D_01] = 2;
- symmTensor2[ST2D_11] = 3;
-
- Journal_PrintSymmetricTensor( stream, symmTensor, 2);
- Journal_Printf( stream, "Right Cauchy Green SymmetricTensor =\n");
- Journal_PrintSymmetricTensor( stream, symmTensor2, 2);
- SymmetricTensor_PullbackDeviator(symmTensor, symmTensor2, 2, symmTensorResult);
- Journal_Printf( stream, "SymmetricTensor_PullbackDeviator = \n");
- Journal_PrintSymmetricTensor( stream, symmTensorResult, 2);
+ Journal_PrintNonSquareMatrix(stream, nonSquareMatrixA, 3, 4);
+ Journal_PrintNonSquareMatrix(stream, nonSquareMatrixB, 4, 2);
- Journal_Printf( stream, "3-D\n");
- symmTensor[ST3D_00] = 1;
- symmTensor[ST3D_01] = 2;
- symmTensor[ST3D_02] = 3;
- symmTensor[ST3D_11] = 4;
- symmTensor[ST3D_12] = 5;
- symmTensor[ST3D_22] = 6;
+ NonSquareMatrix_MultiplicationByNonSquareMatrix(nonSquareMatrixA, 3, 4,
+ nonSquareMatrixB, 4,2, nonSquareMatrixResult );
- symmTensor2[ST3D_00] = 20;
- symmTensor2[ST3D_01] = 30;
- symmTensor2[ST3D_02] = 40;
- symmTensor2[ST3D_11] = 50;
- symmTensor2[ST3D_12] = 60;
- symmTensor2[ST3D_22] = 70;
+ Journal_PrintNonSquareMatrix(stream, nonSquareMatrixResult, 3, 2);
- Journal_PrintSymmetricTensor( stream, symmTensor, 3);
- Journal_Printf( stream, "Right Cauchy Green SymmetricTensor =\n");
- Journal_PrintSymmetricTensor( stream, symmTensor2, 3);
- SymmetricTensor_PullbackDeviator( symmTensor, symmTensor2, 3, symmTensorResult);
- Journal_Printf( stream, "SymmetricTensor_PullbackDeviator = \n");
- Journal_PrintSymmetricTensor( stream, symmTensorResult, 3);
-*/
+ Memory_Free(nonSquareMatrixA);
+ Memory_Free(nonSquareMatrixB);
+ Memory_Free(nonSquareMatrixAT);
+ Memory_Free(nonSquareMatrixResult);
+
+
+
}
DiscretisationGeometry_Finalise();
More information about the cig-commits
mailing list