[cig-commits] r5681 - in long/3D/Gale/trunk/src/StgFEM: . SLE/LinearAlgebra/src

walter at geodynamics.org walter at geodynamics.org
Fri Jan 5 11:37:42 PST 2007


Author: walter
Date: 2007-01-05 11:37:40 -0800 (Fri, 05 Jan 2007)
New Revision: 5681

Added:
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.c
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.h
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.meta
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.c
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.h
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.meta
Modified:
   long/3D/Gale/trunk/src/StgFEM/
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/Init.c
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/LinearAlgebra.h
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MatrixSolver.c
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MatrixSolver.h
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MultigridSolver.c
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MultigridSolver.h
   long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/types.h
Log:
 r913 at earth (orig r693):  LukeHodkinson | 2007-01-03 22:49:30 -0800
 Adding the new interface for generating multigrid 
 restriction and prolongation operators.
 
 



Property changes on: long/3D/Gale/trunk/src/StgFEM
___________________________________________________________________
Name: svk:merge
   - 38867592-cf10-0410-9e16-a142ea72ac34:/cig:880
db209038-57f2-0310-97fa-b160e0ae9d04:/branches/decomp3d:692
db209038-57f2-0310-97fa-b160e0ae9d04:/trunk:669
   + 38867592-cf10-0410-9e16-a142ea72ac34:/cig:880
db209038-57f2-0310-97fa-b160e0ae9d04:/branches/decomp3d:693
db209038-57f2-0310-97fa-b160e0ae9d04:/trunk:669

Modified: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/Init.c
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/Init.c	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/Init.c	2007-01-05 19:37:40 UTC (rev 5681)
@@ -50,12 +50,18 @@
 	Stream_SetPrintingRank( Journal_Register( InfoStream_Type, "Context" ), tmp );
 
 	Stg_ComponentRegister_Add( Stg_ComponentRegister_Get_ComponentRegister(), 
-				   MultigridSolver_Type, "0", (Stg_Component_DefaultConstructorFunction*)MultigridSolver_New );
+				   MultigridSolver_Type, "0", 
+				   (Stg_Component_DefaultConstructorFunction*)MultigridSolver_New );
+	Stg_ComponentRegister_Add( Stg_ComponentRegister_Get_ComponentRegister(), 
+				   SROpGenerator_Type, "0", 
+				   (Stg_Component_DefaultConstructorFunction*)SROpGenerator_New );
 
 	RegisterParent( Vector_Type, Stg_Component_Type );
 	RegisterParent( Matrix_Type, Stg_Component_Type );
 	RegisterParent( MatrixSolver_Type, Stg_Component_Type );
 	RegisterParent( MultigridSolver_Type, MatrixSolver_Type );
+	RegisterParent( MGOpGenerator_Type, Stg_Component_Type );
+	RegisterParent( SROpGenerator_Type, MGOpGenerator_Type );
 
 #ifdef HAVE_PETSC
 	Stg_ComponentRegister_Add( Stg_ComponentRegister_Get_ComponentRegister(), 

Modified: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/LinearAlgebra.h
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/LinearAlgebra.h	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/LinearAlgebra.h	2007-01-05 19:37:40 UTC (rev 5681)
@@ -58,6 +58,8 @@
 	#include "Matrix.h"
 	#include "MatrixSolver.h"
 	#include "MultigridSolver.h"
+	#include "MGOpGenerator.h"
+	#include "SROpGenerator.h"
 
 #ifdef HAVE_PETSC
 	#include <petsc.h>

Added: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.c
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.c	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.c	2007-01-05 19:37:40 UTC (rev 5681)
@@ -0,0 +1,145 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**
+** Copyright (C), 2003, Victorian Partnership for Advanced Computing (VPAC) Ltd, 110 Victoria Street, Melbourne, 3053, Australia.
+**
+** Authors:
+**	Stevan M. Quenette, Senior Software Engineer, VPAC. (steve at vpac.org)
+**	Patrick D. Sunter, Software Engineer, VPAC. (pds at vpac.org)
+**	Luke J. Hodkinson, Computational Engineer, VPAC. (lhodkins at vpac.org)
+**	Siew-Ching Tan, Software Engineer, VPAC. (siew at vpac.org)
+**	Alan H. Lo, Computational Engineer, VPAC. (alan at vpac.org)
+**	Raquibul Hassan, Computational Engineer, VPAC. (raq at vpac.org)
+**
+**  This library is free software; you can redistribute it and/or
+**  modify it under the terms of the GNU Lesser General Public
+**  License as published by the Free Software Foundation; either
+**  version 2.1 of the License, or (at your option) any later version.
+**
+**  This library is distributed in the hope that it will be useful,
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+**  Lesser General Public License for more details.
+**
+**  You should have received a copy of the GNU Lesser General Public
+**  License along with this library; if not, write to the Free Software
+**  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+**
+** $Id: MGOpGenerator.c 3584 2006-05-16 11:11:07Z PatrickSunter $
+**
+**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <mpi.h>
+#include "StGermain/StGermain.h"
+#include "LinearAlgebra.h"
+
+
+/* Textual name of this class */
+const Type MGOpGenerator_Type = "MGOpGenerator";
+
+
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Constructors
+*/
+
+MGOpGenerator* _MGOpGenerator_New( MGOPGENERATOR_DEFARGS ) {
+	MGOpGenerator*	self;
+
+	/* Allocate memory */
+	assert( sizeOfSelf >= sizeof(MGOpGenerator) );
+	self = (MGOpGenerator*)_Stg_Component_New( STG_COMPONENT_PASSARGS );
+
+	/* Virtual info */
+	self->setMultigridSolverFunc = setMultigridSolverFunc;
+	self->generateFunc = generateFunc;
+
+	/* MGOpGenerator info */
+	_MGOpGenerator_Init( self );
+
+	return self;
+}
+
+void _MGOpGenerator_Init( MGOpGenerator* self ) {
+	assert( self && Stg_CheckType( self, MGOpGenerator ) );
+
+	self->solver = NULL;
+}
+
+
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Virtual functions
+*/
+
+void _MGOpGenerator_Delete( void* mgOpGenerator ) {
+	MGOpGenerator*	self = (MGOpGenerator*)mgOpGenerator;
+
+	assert( self && Stg_CheckType( self, MGOpGenerator ) );
+
+	/* Delete the parent. */
+	_Stg_Component_Delete( self );
+}
+
+void _MGOpGenerator_Print( void* mgOpGenerator, Stream* stream ) {
+	MGOpGenerator*	self = (MGOpGenerator*)mgOpGenerator;
+	
+	/* Set the Journal for printing informations */
+	Stream* mgOpGeneratorStream;
+	mgOpGeneratorStream = Journal_Register( InfoStream_Type, "MGOpGeneratorStream" );
+
+	assert( self && Stg_CheckType( self, MGOpGenerator ) );
+
+	/* Print parent */
+	Journal_Printf( stream, "MGOpGenerator (ptr): (%p)\n", self );
+	_Stg_Component_Print( self, stream );
+}
+
+void _MGOpGenerator_Construct( void* mgOpGenerator, Stg_ComponentFactory* cf, void* data ) {
+	MGOpGenerator*		self = (MGOpGenerator*)mgOpGenerator;
+
+	assert( self && Stg_CheckType( self, MGOpGenerator ) );
+	assert( cf );
+}
+
+void _MGOpGenerator_Build( void* mgOpGenerator, void* data ) {
+}
+
+void _MGOpGenerator_Initialise( void* mgOpGenerator, void* data ) {
+}
+
+void _MGOpGenerator_Execute( void* mgOpGenerator, void* data ) {
+}
+
+void _MGOpGenerator_Destroy( void* mgOpGenerator, void* data ) {
+}
+
+void _MGOpGenerator_SetMultigridSolver( void* mgOpGenerator, void* _multigridSolver ) {
+	MGOpGenerator*		self = (MGOpGenerator*)mgOpGenerator;
+	MultigridSolver*	multigridSolver = (MultigridSolver*)_multigridSolver;
+
+	assert( self && Stg_CheckType( self, MGOpGenerator ) );
+	assert( !multigridSolver || Stg_CheckType( multigridSolver, MultigridSolver ) );
+
+	self->solver = multigridSolver;
+}
+
+
+/*--------------------------------------------------------------------------------------------------------------------------
+** Public Functions
+*/
+
+MultigridSolver* MGOpGenerator_GetMultigridSolver( void* mgOpGenerator ) {
+	MGOpGenerator*		self = (MGOpGenerator*)mgOpGenerator;
+
+	assert( self && Stg_CheckType( self, MGOpGenerator ) );
+
+	return self->solver;
+}
+
+
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Private Functions
+*/

Added: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.h
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.h	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.h	2007-01-05 19:37:40 UTC (rev 5681)
@@ -0,0 +1,121 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**
+** Copyright (C), 2003, Victorian Partnership for Advanced Computing (VPAC) Ltd, 110 Victoria Street, Melbourne, 3053, Australia.
+**
+** Authors:
+**	Stevan M. Quenette, Senior Software Engineer, VPAC. (steve at vpac.org)
+**	Patrick D. Sunter, Software Engineer, VPAC. (pds at vpac.org)
+**	Luke J. Hodkinson, Computational Engineer, VPAC. (lhodkins at vpac.org)
+**	Siew-Ching Tan, Software Engineer, VPAC. (siew at vpac.org)
+**	Alan H. Lo, Computational Engineer, VPAC. (alan at vpac.org)
+**	Raquibul Hassan, Computational Engineer, VPAC. (raq at vpac.org)
+**
+**  This library is free software; you can redistribute it and/or
+**  modify it under the terms of the GNU Lesser General Public
+**  License as published by the Free Software Foundation; either
+**  version 2.1 of the License, or (at your option) any later version.
+**
+**  This library is distributed in the hope that it will be useful,
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+**  Lesser General Public License for more details.
+**
+**  You should have received a copy of the GNU Lesser General Public
+**  License along with this library; if not, write to the Free Software
+**  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+**
+*/
+/** \file
+**  Role:
+**
+** Assumptions:
+**
+** Invariants:
+**
+** Comments:
+**
+** $Id: MGOpGenerator.h 675 2006-12-22 01:43:03Z LukeHodkinson $
+**
+**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#ifndef __StgFEM_SLE_LinearAlgebra_MGOpGenerator_h__
+#define __StgFEM_SLE_LinearAlgebra_MGOpGenerator_h__
+
+	/** Textual name of this class */
+	extern const Type MGOpGenerator_Type;
+
+	/** Virtual function types */
+	typedef void (MGOpGenerator_SetMultigridSolverFunc)( void* mgOpGenerator, void* multigridSolver );
+	typedef Bool (MGOpGenerator_HasExpiredFunc)( void* mgOpGenerator );
+	typedef void (MGOpGenerator_GenerateFunc)( void* mgOpGenerator );
+
+	/** MGOpGenerator class contents */
+	#define __MGOpGenerator								\
+		/* General info */							\
+		__Stg_Component								\
+											\
+		/* Virtual info */							\
+		MGOpGenerator_SetMultigridSolverFunc*	setMultigridSolverFunc;		\
+		MGOpGenerator_HasExpiredFunc*		hasExpiredFunc;			\
+		MGOpGenerator_GenerateFunc*		generateFunc;			\
+											\
+		/* MGOpGenerator info */						\
+		MultigridSolver*		solver;
+
+	struct MGOpGenerator { __MGOpGenerator };
+
+	/*--------------------------------------------------------------------------------------------------------------------------
+	** Constructors
+	*/
+
+	#define MGOPGENERATOR_DEFARGS							\
+		STG_COMPONENT_DEFARGS,							\
+		MGOpGenerator_SetMultigridSolverFunc*	setMultigridSolverFunc,		\
+		MGOpGenerator_HasExpiredFunc*		hasExpiredFunc,			\
+		MGOpGenerator_GenerateFunc*		generateFunc
+
+
+	#define MGOPGENERATOR_PASSARGS		\
+		STG_COMPONENT_PASSARGS,		\
+		setMultigridSolverFunc,		\
+		hasExpiredFunc,			\
+		generateFunc
+
+
+	MGOpGenerator* _MGOpGenerator_New( MGOPGENERATOR_DEFARGS );
+	void _MGOpGenerator_Init( MGOpGenerator* self );
+
+	/*--------------------------------------------------------------------------------------------------------------------------
+	** Virtual functions
+	*/
+
+	void _MGOpGenerator_Delete( void* mgOpGenerator );
+	void _MGOpGenerator_Print( void* mgOpGenerator, Stream* stream );
+	void _MGOpGenerator_Construct( void* mgOpGenerator, Stg_ComponentFactory* cf, void* data );
+	void _MGOpGenerator_Build( void* mgOpGenerator, void* data );
+	void _MGOpGenerator_Initialise( void* mgOpGenerator, void* data );
+	void _MGOpGenerator_Execute( void* mgOpGenerator, void* data );
+	void _MGOpGenerator_Destroy( void* mgOpGenerator, void* data );
+
+	void _MGOpGenerator_SetMultigridSolver( void* mgOpGenerator, void* multigridSolver );
+
+	#define MGOpGenerator_SetMultigridSolver( self, multigridSolver )		\
+		VirtualCall( self, setMultigridSolverFunc, self, multigridSolver )
+
+	#define MGOpGenerator_HasExpired( self )					\
+		VirtualCall( self, hasExpiredFunc, self )
+
+	#define MGOpGenerator_Generate( self )						\
+		VirtualCall( self, generateFunc, self )
+
+	/*--------------------------------------------------------------------------------------------------------------------------
+	** Public functions
+	*/
+
+	MultigridSolver* MGOpGenerator_GetMultigridSolver( void* mgOpGenerator );
+
+	/*--------------------------------------------------------------------------------------------------------------------------
+	** Private Member functions
+	*/
+
+#endif /* __StgFEM_SLE_LinearAlgebra_MGOpGenerator_h__ */

Added: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.meta
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.meta	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MGOpGenerator.meta	2007-01-05 19:37:40 UTC (rev 5681)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE StGermainData SYSTEM "stgermain.dtd">
+<StGermainData xmlns="http://www.vpac.org/StGermain/XML_IO_Handler/Jun2003">
+
+<param name="Name">MGOpGenerator</param>
+<param name="Organisation">VPAC</param>
+<param name="Project">StgFEM</param>
+<param name="Location">StgFEM/SLE/LinearAlgebra/src/</param>
+<param name="Project Web">https://csd.vpac.org/twiki/bin/view/StgFEM/WebHome</param>
+<param name="Copyright">StGermain Framework. Copyright (C) 2003-2005 VPAC.</param>
+<param name="License">The Gnu Lesser General Public License http://www.gnu.org/licenses/lgpl.html</param>
+<param name="Parent"></param>
+<param name="Description">...</param>
+
+</StGermainData>

Modified: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MatrixSolver.c
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MatrixSolver.c	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MatrixSolver.c	2007-01-05 19:37:40 UTC (rev 5681)
@@ -158,7 +158,7 @@
 ** Public Functions
 */
 
-void MatrixSolver_GetComm( void* matrixSolver, MPI_Comm comm ) {
+MPI_Comm MatrixSolver_GetComm( void* matrixSolver ) {
 	MatrixSolver*	self = (MatrixSolver*)matrixSolver;
 
 	assert( self && Stg_CheckType( self, MatrixSolver ) );

Modified: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MatrixSolver.h
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MatrixSolver.h	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MatrixSolver.h	2007-01-05 19:37:40 UTC (rev 5681)
@@ -182,7 +182,7 @@
 	** Public functions
 	*/
 
-	void MatrixSolver_GetComm( void* matrixSolver, MPI_Comm comm );
+	MPI_Comm MatrixSolver_GetComm( void* matrixSolver );
 	Matrix* MatrixSolver_GetMatrix( void* matrixSolver );
 	Vector* MatrixSolver_GetResidual( void* matrixSolver );
 

Modified: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MultigridSolver.c
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MultigridSolver.c	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MultigridSolver.c	2007-01-05 19:37:40 UTC (rev 5681)
@@ -93,6 +93,7 @@
 
 	self->nLevels = 0;
 	self->levels = NULL;
+	self->opGen = NULL;
 	self->ready = False;
 
 #ifdef HAVE_PETSC
@@ -144,9 +145,21 @@
 }
 
 void _MultigridSolver_Build( void* matrixSolver, void* data ) {
+	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
+
+	assert( self && Stg_CheckType( self, MultigridSolver ) );
+
+	if( self->opGen )
+		Build( self->opGen, data, False );
 }
 
 void _MultigridSolver_Initialise( void* matrixSolver, void* data ) {
+	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
+
+	assert( self && Stg_CheckType( self, MultigridSolver ) );
+
+	if( self->opGen )
+		Initialise( self->opGen, data, False );
 }
 
 void _MultigridSolver_Execute( void* matrixSolver, void* data ) {
@@ -212,6 +225,7 @@
 	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
 	Vector*			rhs = (Vector*)_rhs;
 	Vector*			solution = (Vector*)_solution;
+	Bool			rebuildOps;
 	unsigned		l_i;
 
 	assert( self && Stg_CheckType( self, MultigridSolver ) );
@@ -220,9 +234,16 @@
 
 	MatrixSolver_Setup( self, rhs, solution );
 
-	if( self->ready )
+	if( self->opGen )
+		rebuildOps = MGOpGenerator_HasExpired( self->opGen );
+	else
+		rebuildOps = False;
+	if( self->ready && !rebuildOps )
 		return;
 
+	if( !self->ready || rebuildOps )
+		MGOpGenerator_Generate( self->opGen );
+
 	for( l_i = self->nLevels - 1; l_i < self->nLevels; l_i-- ) {
 		MultigridSolver_Level*	level = self->levels + l_i;
 
@@ -313,7 +334,7 @@
 
 	assert( self && Stg_CheckType( self, MultigridSolver ) );
 
-	MultigridSolver_Destruct( self );
+	MultigridSolver_DestructLevels( self );
 	self->nLevels = nLevels;
 	self->levels = AllocArray( MultigridSolver_Level, nLevels );
 	for( l_i = 0; l_i < nLevels; l_i++ ) {
@@ -344,6 +365,38 @@
 	}
 }
 
+void MultigridSolver_SetRestriction( void* matrixSolver, unsigned level, void* _R ) {
+	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
+	Matrix*			R = (Matrix*)_R;
+
+	assert( self && Stg_CheckType( self, MultigridSolver ) );
+	assert( level < self->nLevels && level > 0 );
+	assert( !R || Stg_CheckType( R, Matrix ) );
+
+	if( self->levels[level].R != R )
+		self->ready = False;
+	Stg_Class_RemoveRef( self->levels[level].R );
+	self->levels[level].R = R;
+	if( R )
+		Stg_Class_AddRef( R );
+}
+
+void MultigridSolver_SetProlongation( void* matrixSolver, unsigned level, void* _P ) {
+	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
+	Matrix*			P = (Matrix*)_P;
+
+	assert( self && Stg_CheckType( self, MultigridSolver ) );
+	assert( level < self->nLevels && level > 0 );
+	assert( !P || Stg_CheckType( P, Matrix ) );
+
+	if( self->levels[level].P != P )
+		self->ready = False;
+	Stg_Class_RemoveRef( self->levels[level].P );
+	self->levels[level].P = P;
+	if( P )
+		Stg_Class_AddRef( P );
+}
+
 void MultigridSolver_SetLevelDownSolver( void* matrixSolver, unsigned level, MatrixSolver* solver ) {
 	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
 	MatrixSolver*		curSolver;
@@ -468,41 +521,7 @@
 	MultigridSolver_SetLevelDownSolver( self, 0, solver );
 }
 
-void MultigridSolver_SetRestriction( void* matrixSolver, unsigned level, Matrix* matrix ) {
-	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
-	Matrix*			curMat;
 
-	assert( self );
-	assert( level < self->nLevels && level > 0 );
-
-	curMat = self->levels[level].R;
-	self->levels[level].R = matrix;
-	if( matrix )
-		Stg_Class_AddRef( matrix );
-	if( curMat )
-		Stg_Class_RemoveRef( curMat );
-
-	self->ready = False;
-}
-
-void MultigridSolver_SetProlongation( void* matrixSolver, unsigned level, Matrix* matrix ) {
-	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
-	Matrix*			curMat;
-
-	assert( self );
-	assert( level < self->nLevels && level > 0 );
-
-	curMat = self->levels[level].P;
-	self->levels[level].P = matrix;
-	if( matrix )
-		Stg_Class_AddRef( matrix );
-	if( curMat )
-		Stg_Class_RemoveRef( curMat );
-
-	self->ready = False;
-}
-
-
 /*----------------------------------------------------------------------------------------------------------------------------------
 ** Private Functions
 */
@@ -548,9 +567,16 @@
 }
 
 void MultigridSolver_Destruct( MultigridSolver* self ) {
+	assert( self && Stg_CheckType( self, MultigridSolver ) );
+
+	MultigridSolver_DestructLevels( self );
+	KillObject( self->opGen );
+}
+
+void MultigridSolver_DestructLevels( MultigridSolver* self ) {
 	unsigned	l_i;
 
-	assert( self );
+	assert( self && Stg_CheckType( self, MultigridSolver ) );
 
 	for( l_i = 0; l_i < self->nLevels; l_i++ ) {
 		MultigridSolver_Level*	level = self->levels + l_i;

Modified: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MultigridSolver.h
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MultigridSolver.h	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/MultigridSolver.h	2007-01-05 19:37:40 UTC (rev 5681)
@@ -71,6 +71,7 @@
 		/* MultigridSolver info */		\
 		unsigned		nLevels;	\
 		MultigridSolver_Level*	levels;		\
+		MGOpGenerator*		opGen;		\
 		Bool			ready;		\
 							\
 		unsigned		curIt;		\
@@ -123,6 +124,8 @@
 	*/
 
 	void MultigridSolver_SetLevels( void* matrixSolver, unsigned nLevels );
+	void MultigridSolver_SetRestriction( void* matrixSolver, unsigned level, void* R );
+	void MultigridSolver_SetProlongation( void* matrixSolver, unsigned level, void* P );
 	void MultigridSolver_SetLevelDownSolver( void* matrixSolver, unsigned level, MatrixSolver* solver );
 	void MultigridSolver_SetLevelDownIterations( void* matrixSolver, unsigned level, unsigned nIts );
 	void MultigridSolver_SetLevelUpSolver( void* matrixSolver, unsigned level, MatrixSolver* solver );
@@ -142,6 +145,8 @@
 	void MultigridSolver_RestrictMatrix( MultigridSolver* self, MultigridSolver_Level* level, Matrix* dstMatrix );
 	void MultigridSolver_LevelCycle( MultigridSolver* self, unsigned levelInd, Vector* rhs, Vector* solution );
 	void MultigridSolver_CalcResidual( MultigridSolver* self, Vector* solution, Vector* residual );
+
 	void MultigridSolver_Destruct( MultigridSolver* self );
+	void MultigridSolver_DestructLevels( MultigridSolver* self );
 
 #endif /* __StgFEM_SLE_LinearAlgebra_MultigridSolver_h__ */

Added: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.c
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.c	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.c	2007-01-05 19:37:40 UTC (rev 5681)
@@ -0,0 +1,206 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**
+** Copyright (C), 2003, Victorian Partnership for Advanced Computing (VPAC) Ltd, 110 Victoria Street, Melbourne, 3053, Australia.
+**
+** Authors:
+**	Stevan M. Quenette, Senior Software Engineer, VPAC. (steve at vpac.org)
+**	Patrick D. Sunter, Software Engineer, VPAC. (pds at vpac.org)
+**	Luke J. Hodkinson, Computational Engineer, VPAC. (lhodkins at vpac.org)
+**	Siew-Ching Tan, Software Engineer, VPAC. (siew at vpac.org)
+**	Alan H. Lo, Computational Engineer, VPAC. (alan at vpac.org)
+**	Raquibul Hassan, Computational Engineer, VPAC. (raq at vpac.org)
+**
+**  This library is free software; you can redistribute it and/or
+**  modify it under the terms of the GNU Lesser General Public
+**  License as published by the Free Software Foundation; either
+**  version 2.1 of the License, or (at your option) any later version.
+**
+**  This library is distributed in the hope that it will be useful,
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+**  Lesser General Public License for more details.
+**
+**  You should have received a copy of the GNU Lesser General Public
+**  License along with this library; if not, write to the Free Software
+**  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+**
+** $Id: SROpGenerator.c 3584 2006-05-16 11:11:07Z PatrickSunter $
+**
+**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <mpi.h>
+#include "StGermain/StGermain.h"
+#include "LinearAlgebra.h"
+
+
+/* Textual name of this class */
+const Type SROpGenerator_Type = "SROpGenerator";
+
+
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Constructors
+*/
+
+SROpGenerator* SROpGenerator_New( Name name ) {
+	return _SROpGenerator_New( sizeof(SROpGenerator), 
+				   SROpGenerator_Type, 
+				   _SROpGenerator_Delete, 
+				   _SROpGenerator_Print, 
+				   NULL, 
+				   (void* (*)(Name))SROpGenerator_New, 
+				   _SROpGenerator_Construct, 
+				   _SROpGenerator_Build, 
+				   _SROpGenerator_Initialise, 
+				   _SROpGenerator_Execute, 
+				   _SROpGenerator_Destroy, 
+				   name, 
+				   NON_GLOBAL, 
+				   _MGOpGenerator_SetMultigridSolver, 
+				   SROpGenerator_HasExpired, 
+				   SROpGenerator_Generate );
+}
+
+SROpGenerator* _SROpGenerator_New( SROPGENERATOR_DEFARGS ) {
+	SROpGenerator*	self;
+
+	/* Allocate memory */
+	assert( sizeOfSelf >= sizeof(SROpGenerator) );
+	self = (SROpGenerator*)_MGOpGenerator_New( MGOPGENERATOR_PASSARGS );
+
+	/* Virtual info */
+
+	/* SROpGenerator info */
+	_SROpGenerator_Init( self );
+
+	return self;
+}
+
+void _SROpGenerator_Init( SROpGenerator* self ) {
+	assert( self && Stg_CheckType( self, SROpGenerator ) );
+}
+
+
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Virtual functions
+*/
+
+void _SROpGenerator_Delete( void* srOpGenerator ) {
+	SROpGenerator*	self = (SROpGenerator*)srOpGenerator;
+
+	assert( self && Stg_CheckType( self, SROpGenerator ) );
+
+	/* Delete the parent. */
+	_MGOpGenerator_Delete( self );
+}
+
+void _SROpGenerator_Print( void* srOpGenerator, Stream* stream ) {
+	SROpGenerator*	self = (SROpGenerator*)srOpGenerator;
+	
+	/* Set the Journal for printing informations */
+	Stream* srOpGeneratorStream;
+	srOpGeneratorStream = Journal_Register( InfoStream_Type, "SROpGeneratorStream" );
+
+	assert( self && Stg_CheckType( self, SROpGenerator ) );
+
+	/* Print parent */
+	Journal_Printf( stream, "SROpGenerator (ptr): (%p)\n", self );
+	_MGOpGenerator_Print( self, stream );
+}
+
+void _SROpGenerator_Construct( void* srOpGenerator, Stg_ComponentFactory* cf, void* data ) {
+	SROpGenerator*		self = (SROpGenerator*)srOpGenerator;
+
+	assert( self && Stg_CheckType( self, SROpGenerator ) );
+	assert( cf );
+}
+
+void _SROpGenerator_Build( void* srOpGenerator, void* data ) {
+}
+
+void _SROpGenerator_Initialise( void* srOpGenerator, void* data ) {
+}
+
+void _SROpGenerator_Execute( void* srOpGenerator, void* data ) {
+}
+
+void _SROpGenerator_Destroy( void* srOpGenerator, void* data ) {
+}
+
+Bool SROpGenerator_HasExpired( void* srOpGenerator ) {
+	SROpGenerator*	self = (SROpGenerator*)srOpGenerator;
+
+	assert( self && Stg_CheckType( self, SROpGenerator ) );
+
+	return False;
+}
+
+void SROpGenerator_Generate( void* srOpGenerator ) {
+	SROpGenerator*	self = (SROpGenerator*)srOpGenerator;
+
+	assert( self && Stg_CheckType( self, SROpGenerator ) );
+#if 0
+	assert( ExtensionManager_GetHandle( self->feMesh->info, "vertexGrid" ) != -1 );
+
+	eqNum = self->eqNum;
+	feMesh = eqNum->feMesh;
+	dofLayout = eqNum->dofLayout;
+	nDims = Mesh_GetDimSize( feMesh );
+	nLocalNodes = FeMesh_GetNodeLocalSize( feMesh );
+	nodeGrid = *(Grid**)ExtensionManager_Get( self->feMesh->info, self->feMesh, 
+						  ExtensionManager_GetHandle( self->feMesh->info, "vertexGrid" ) );
+	globalInds = AllocArray( unsigned, nDims );
+
+	for( n_i = 0; n_i < nLocalNodes; n_i++ ) {
+		insist( FeMesh_NodeDomainToGlobal( feMesh, n_i, &globalNode ) );
+		Grid_Lift( nodeGrid, globalNode, globalInds );
+
+		for( l_i = nLevels - 1; l_i < nLevels; l_i-- )
+			SROpGenerator_ProcessLevel( self, l_i, globalNode, globalInds );
+	}
+
+	FreeArray( globalInds );
+#endif
+}
+
+
+/*--------------------------------------------------------------------------------------------------------------------------
+** Public Functions
+*/
+
+
+/*----------------------------------------------------------------------------------------------------------------------------------
+** Private Functions
+*/
+
+#if 0
+void SROpGenerator_ProcessLevel( SROpGenerator* self, unsigned level, unsigned*  ) {
+	SROpGenerator*	self = (SROpGenerator*)srOpGenerator;
+
+	assert( self && Stg_CheckType( self, SROpGenerator ) );
+	assert( ExtensionManager_GetHandle( self->feMesh->info, "vertexGrid" ) != -1 );
+
+	eqNum = self->eqNum;
+	feMesh = eqNum->feMesh;
+	dofLayout = eqNum->dofLayout;
+	nDims = Mesh_GetDimSize( feMesh );
+	nLocalNodes = FeMesh_GetNodeLocalSize( feMesh );
+	nodeGrid = *(Grid**)ExtensionManager_Get( self->feMesh->info, self->feMesh, 
+						  ExtensionManager_GetHandle( self->feMesh->info, "vertexGrid" ) );
+	globalInds = AllocArray( unsigned, nDims );
+
+	for( n_i = 0; n_i < nLocalNodes; n_i++ ) {
+		insist( FeMesh_NodeDomainToGlobal( feMesh, n_i, &globalNode ) );
+		Grid_Lift( nodeGrid, globalNode, globalInds );
+
+		for( l_i = nLevels - 1; l_i < nLevels; l_i-- )
+			SROpGenerator_ProcessLevel( self, l_i, globalNode, globalInds );
+	}
+
+	FreeArray( globalInds );
+}
+#endif

Added: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.h
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.h	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.h	2007-01-05 19:37:40 UTC (rev 5681)
@@ -0,0 +1,97 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**
+** Copyright (C), 2003, Victorian Partnership for Advanced Computing (VPAC) Ltd, 110 Victoria Street, Melbourne, 3053, Australia.
+**
+** Authors:
+**	Stevan M. Quenette, Senior Software Engineer, VPAC. (steve at vpac.org)
+**	Patrick D. Sunter, Software Engineer, VPAC. (pds at vpac.org)
+**	Luke J. Hodkinson, Computational Engineer, VPAC. (lhodkins at vpac.org)
+**	Siew-Ching Tan, Software Engineer, VPAC. (siew at vpac.org)
+**	Alan H. Lo, Computational Engineer, VPAC. (alan at vpac.org)
+**	Raquibul Hassan, Computational Engineer, VPAC. (raq at vpac.org)
+**
+**  This library is free software; you can redistribute it and/or
+**  modify it under the terms of the GNU Lesser General Public
+**  License as published by the Free Software Foundation; either
+**  version 2.1 of the License, or (at your option) any later version.
+**
+**  This library is distributed in the hope that it will be useful,
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+**  Lesser General Public License for more details.
+**
+**  You should have received a copy of the GNU Lesser General Public
+**  License along with this library; if not, write to the Free Software
+**  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+**
+*/
+/** \file
+**  Role:
+**
+** Assumptions:
+**
+** Invariants:
+**
+** Comments:
+**
+** $Id: SROpGenerator.h 672 2006-12-14 00:58:36Z LukeHodkinson $
+**
+**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+#ifndef __StgFEM_SLE_LinearAlgebra_SROpGenerator_h__
+#define __StgFEM_SLE_LinearAlgebra_SROpGenerator_h__
+
+	/** Textual name of this class */
+	extern const Type SROpGenerator_Type;
+
+	/** Virtual function types */
+
+	/** SROpGenerator class contents */
+	#define __SROpGenerator		\
+		/* General info */		\
+		__MGOpGenerator			\
+						\
+		/* Virtual info */		\
+						\
+		/* SROpGenerator info */
+
+	struct SROpGenerator { __SROpGenerator };
+
+	/*--------------------------------------------------------------------------------------------------------------------------
+	** Constructors
+	*/
+
+	#define SROPGENERATOR_DEFARGS \
+		MGOPGENERATOR_DEFARGS
+
+	#define SROPGENERATOR_PASSARGS \
+		MGOPGENERATOR_PASSARGS
+
+	SROpGenerator* SROpGenerator_New( Name name );
+	SROpGenerator* _SROpGenerator_New( SROPGENERATOR_DEFARGS );
+	void _SROpGenerator_Init( SROpGenerator* self );
+
+	/*--------------------------------------------------------------------------------------------------------------------------
+	** Virtual functions
+	*/
+
+	void _SROpGenerator_Delete( void* srOpGenerator );
+	void _SROpGenerator_Print( void* srOpGenerator, Stream* stream );
+	void _SROpGenerator_Construct( void* srOpGenerator, Stg_ComponentFactory* cf, void* data );
+	void _SROpGenerator_Build( void* srOpGenerator, void* data );
+	void _SROpGenerator_Initialise( void* srOpGenerator, void* data );
+	void _SROpGenerator_Execute( void* srOpGenerator, void* data );
+	void _SROpGenerator_Destroy( void* srOpGenerator, void* data );
+
+	Bool SROpGenerator_HasExpired( void* srOpGenerator );
+	void SROpGenerator_Generate( void* srOpGenerator );
+
+	/*--------------------------------------------------------------------------------------------------------------------------
+	** Public functions
+	*/
+
+	/*--------------------------------------------------------------------------------------------------------------------------
+	** Private Member functions
+	*/
+
+#endif /* __StgFEM_SLE_LinearAlgebra_SROpGenerator_h__ */

Added: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.meta
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.meta	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/SROpGenerator.meta	2007-01-05 19:37:40 UTC (rev 5681)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE StGermainData SYSTEM "stgermain.dtd">
+<StGermainData xmlns="http://www.vpac.org/StGermain/XML_IO_Handler/Jun2003">
+
+<param name="Name">SROpGenerator</param>
+<param name="Organisation">VPAC</param>
+<param name="Project">StgFEM</param>
+<param name="Location">StgFEM/SLE/LinearAlgebra/src/</param>
+<param name="Project Web">https://csd.vpac.org/twiki/bin/view/StgFEM/WebHome</param>
+<param name="Copyright">StGermain Framework. Copyright (C) 2003-2005 VPAC.</param>
+<param name="License">The Gnu Lesser General Public License http://www.gnu.org/licenses/lgpl.html</param>
+<param name="Parent"></param>
+<param name="Description">...</param>
+
+</StGermainData>

Modified: long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/types.h
===================================================================
--- long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/types.h	2007-01-05 19:37:38 UTC (rev 5680)
+++ long/3D/Gale/trunk/src/StgFEM/SLE/LinearAlgebra/src/types.h	2007-01-05 19:37:40 UTC (rev 5681)
@@ -55,6 +55,8 @@
 	typedef struct Matrix			Matrix;
 	typedef struct MatrixSolver		MatrixSolver;
 	typedef struct MultigridSolver		MultigridSolver;
+	typedef struct MGOpGenerator		MGOpGenerator;
+	typedef struct SROpGenerator		SROpGenerator;
 #ifdef HAVE_PETSC
 	typedef struct PETScVector		PETScVector;
 	typedef struct PETScMatrix		PETScMatrix;



More information about the cig-commits mailing list