[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