[cig-commits] commit: Actually use the material's diffusivity. Requires information from materials, so the testStgFEM binary can no longer be build.

Mercurial hg at geodynamics.org
Sun Nov 7 18:12:12 PST 2010


changeset:   772:e0cceb47d2ea
user:        Walter Landry <wlandry at caltech.edu>
date:        Sat Nov 06 11:14:31 2010 -0700
files:       SConscript SLE/ProvidedSystems/AdvectionDiffusion/src/Residual.c SLE/ProvidedSystems/AdvectionDiffusion/src/Residual.h SLE/ProvidedSystems/AdvectionDiffusion/src/UpwindParameter.c
description:
Actually use the material's diffusivity.  Requires information from materials, so the testStgFEM binary can no longer be build.


diff -r 8339d83da82d -r e0cceb47d2ea SConscript
--- a/SConscript	Thu Oct 21 16:45:32 2010 -0700
+++ b/SConscript	Sat Nov 06 11:14:31 2010 -0700
@@ -248,21 +248,21 @@ if env['static_libs']:
 # Test runner program.
 #
 
-env.PCUTest('tests/testStgFEM', suites,
-            PCU_LIBHEADERS="#include <StGermain/StGermain.h>\n#include <StgDomain/StgDomain.h>\n" \
-                "#include <StgFEM/StgFEM.h>",
-            PCU_SETUP="StGermain_Init(&argc, &argv);\nStgDomain_Init(&argc, &argv);\n" \
-                "StgFEM_Init(&argc, &argv);\n\n" \
-                "#ifdef NOSHARED\n" \
-                "   stgfem_register_static_modules();\n" \
-                "   stgdomain_register_static_modules();\n" \
-                "#endif",
-            PCU_TEARDOWN="StgFEM_Finalise();\nStgDomain_Finalise();\n" \
-                "StGermain_Finalise();",
-            LIBS=libs,
-            PCU_EXP=tst_exp,
-            PCU_INPUT=tst_input,
-            PROJECT="StgFEM")
+# env.PCUTest('tests/testStgFEM', suites,
+#             PCU_LIBHEADERS="#include <StGermain/StGermain.h>\n#include <StgDomain/StgDomain.h>\n" \
+#                 "#include <StgFEM/StgFEM.h>",
+#             PCU_SETUP="StGermain_Init(&argc, &argv);\nStgDomain_Init(&argc, &argv);\n" \
+#                 "StgFEM_Init(&argc, &argv);\n\n" \
+#                 "#ifdef NOSHARED\n" \
+#                 "   stgfem_register_static_modules();\n" \
+#                 "   stgdomain_register_static_modules();\n" \
+#                 "#endif",
+#             PCU_TEARDOWN="StgFEM_Finalise();\nStgDomain_Finalise();\n" \
+#                 "StGermain_Finalise();",
+#             LIBS=libs,
+#             PCU_EXP=tst_exp,
+#             PCU_INPUT=tst_input,
+#             PROJECT="StgFEM")
 
 #
 # Install XML input files.
diff -r 8339d83da82d -r e0cceb47d2ea SLE/ProvidedSystems/AdvectionDiffusion/src/Residual.c
--- a/SLE/ProvidedSystems/AdvectionDiffusion/src/Residual.c	Thu Oct 21 16:45:32 2010 -0700
+++ b/SLE/ProvidedSystems/AdvectionDiffusion/src/Residual.c	Sat Nov 06 11:14:31 2010 -0700
@@ -45,6 +45,8 @@
 #include <StgDomain/StgDomain.h>
 #include <StgFEM/Discretisation/Discretisation.h>
 #include <StgFEM/SLE/SystemSetup/SystemSetup.h>
+#include <PICellerator/PICellerator.h>
+#include <Underworld/Underworld.h>
 
 #include "types.h"
 #include "AdvectionDiffusionSLE.h"
@@ -64,15 +66,18 @@ AdvDiffResidualForceTerm* AdvDiffResidua
 	Swarm*						integrationSwarm,
 	Stg_Component*				sle, 
 	FeVariable*					velocityField,
-	Variable*					diffusivityVariable,
 	double						defaultDiffusivity,
+        Swarm*						picSwarm,
+	void*		materials_Register,
 	AdvDiffResidualForceTerm_UpwindParamFuncType upwindFuncType )
 {
 	AdvDiffResidualForceTerm* self = (AdvDiffResidualForceTerm*) _AdvDiffResidualForceTerm_DefaultNew( name );
 
 	self->isConstructed = True;
 	_ForceTerm_Init( self, context, forceVector, integrationSwarm, sle );
-	_AdvDiffResidualForceTerm_Init( self, velocityField, diffusivityVariable, defaultDiffusivity, upwindFuncType );
+	_AdvDiffResidualForceTerm_Init( self, velocityField, defaultDiffusivity,
+                                        picSwarm,
+                                        materials_Register, upwindFuncType );
 
 	return self;
 }
@@ -164,17 +169,19 @@ void __AdvDiffResidualForceTerm_FreeLoca
 }
 
 void _AdvDiffResidualForceTerm_Init(
-	void*														residual,
-	FeVariable*												velocityField,
-	Variable*												diffusivityVariable,
-	double													defaultDiffusivity,
+	void*			residual,
+	FeVariable*		velocityField,
+	double			defaultDiffusivity,
+        Swarm*			picSwarm,
+	void*	                materials_Register,
 	AdvDiffResidualForceTerm_UpwindParamFuncType	upwindFuncType ) //WHY IS THIS LINE HERE???
 {
 	AdvDiffResidualForceTerm* self = (AdvDiffResidualForceTerm*)residual;
 
 	self->velocityField = velocityField;
-	self->diffusivityVariable = diffusivityVariable;
 	self->defaultDiffusivity = defaultDiffusivity;
+        self->picSwarm = picSwarm;
+	self->materials_Register  = materials_Register;
 	self->upwindParamType = upwindFuncType;
 }
 
@@ -200,27 +207,21 @@ void _AdvDiffResidualForceTerm_Print( vo
 	/* General info */
 	Journal_PrintPointer( stream, self->velocityField );
 	Journal_PrintDouble( stream, self->defaultDiffusivity );
-	Journal_Printf( stream, "self->diffusivityVariable = ");
-
-	if ( self->diffusivityVariable )
-		Journal_Printf( stream, "%s\n", self->diffusivityVariable->name );
-	else
-		Journal_Printf( stream, "<Unused>\n");
 }
 
 void _AdvDiffResidualForceTerm_AssignFromXML( void* residual, Stg_ComponentFactory* cf, void* data ) {
 	AdvDiffResidualForceTerm*							self = (AdvDiffResidualForceTerm*)residual;
 	FeVariable*												velocityField;
-	Variable*												diffusivityVariable;
 	Name														upwindParamFuncName;
 	double													defaultDiffusivity;
+	Materials_Register*		materials_Register;
 	AdvDiffResidualForceTerm_UpwindParamFuncType	upwindFuncType = 0;
+        Swarm *picSwarm;
 
 	/* Construct Parent */
 	_ForceTerm_AssignFromXML( self, cf, data );
 
 	velocityField = Stg_ComponentFactory_ConstructByKey( cf, self->name, (Dictionary_Entry_Key)"VelocityField", FeVariable, True, data  );
-	diffusivityVariable = Stg_ComponentFactory_ConstructByKey( cf, self->name, (Dictionary_Entry_Key)"DiffusivityVariable", Variable, False, data  );
 	upwindParamFuncName = Stg_ComponentFactory_GetString( cf, self->name, (Dictionary_Entry_Key)"UpwindXiFunction", "Exact"  );
 
 	if ( strcasecmp( upwindParamFuncName, "DoublyAsymptoticAssumption" ) == 0 )
@@ -233,30 +234,78 @@ void _AdvDiffResidualForceTerm_AssignFro
 		Journal_Firewall( False, Journal_Register( Error_Type, (Name)self->type  ), "Cannot understand '%s'\n", upwindParamFuncName );
 
 	defaultDiffusivity = Stg_ComponentFactory_GetDouble( cf, self->name, (Dictionary_Entry_Key)"defaultDiffusivity", 1.0  );
+	picSwarm       = Stg_ComponentFactory_ConstructByKey( cf, self->name, (Dictionary_Entry_Key)"picSwarm", Swarm, True, data  ) ;
+	materials_Register = ((PICelleratorContext*)(self->context))->materials_Register;
 
-	_AdvDiffResidualForceTerm_Init( self, velocityField, diffusivityVariable, defaultDiffusivity, upwindFuncType );
+	_AdvDiffResidualForceTerm_Init( self, velocityField, defaultDiffusivity,
+                                        picSwarm, materials_Register,
+                                        upwindFuncType );
 }
 
 void _AdvDiffResidualForceTerm_Build( void* residual, void* data ) {
 	AdvDiffResidualForceTerm* self = (AdvDiffResidualForceTerm*)residual;
+	AdvDiffResidualForceTerm_MaterialExt*   materialExt;
+	Material_Index                   material_I;
+	Material*                        material;
+	Materials_Register*              materials_Register = self->materials_Register;
+	IntegrationPointsSwarm*          swarm              = (IntegrationPointsSwarm*)self->picSwarm;
+	MaterialPointsSwarm**            materialSwarms;
+	Index                            materialSwarm_I;
+	Stg_ComponentFactory*            cf;
+	Name                             name;
+
+	cf = self->context->CF;
 
 	_ForceTerm_Build( self, data );
 
 	Stg_Component_Build( self->velocityField, data, False );
 
-	if ( self->diffusivityVariable )
-		Stg_Component_Build( self->diffusivityVariable, data, False );
+	/* Sort out material extension stuff */
+	self->materialExtHandle = Materials_Register_AddMaterialExtension( 
+			self->materials_Register, 
+			self->type, 
+			sizeof(AdvDiffResidualForceTerm_MaterialExt) );
+	for ( material_I = 0 ; material_I < Materials_Register_GetCount( materials_Register ) ; material_I++) {
+		material = Materials_Register_GetByIndex( materials_Register, material_I );
+		materialExt = ExtensionManager_GetFunc( material->extensionMgr, material, self->materialExtHandle );
+
+		materialExt->diffusivity = Stg_ComponentFactory_GetDouble( cf, material->name,
+                                                                           (Dictionary_Entry_Key)"diffusivity",
+                                                                           self->defaultDiffusivity );
+	}
+	
+	/* Create Swarm Variables of each material swarm this ip swarm is mapped against */
+	materialSwarms = IntegrationPointMapper_GetMaterialPointsSwarms( swarm->mapper, &(self->materialSwarmCount) );
+	self->diffusivitySwarmVariables = Memory_Alloc_Array( MaterialSwarmVariable*, self->materialSwarmCount, "DiffusivityVariables" );
+	
+	for ( materialSwarm_I = 0; materialSwarm_I < self->materialSwarmCount; ++materialSwarm_I ) {
+		name = Stg_Object_AppendSuffix( materialSwarms[materialSwarm_I], (Name)"Diffusivity"  );
+		self->diffusivitySwarmVariables[materialSwarm_I] = MaterialSwarmVariable_New( 
+				name,
+				(AbstractContext*)self->context,
+				materialSwarms[materialSwarm_I], 
+				1, 
+				self->materials_Register, 
+				self->materialExtHandle, 
+				GetOffsetOfMember( *materialExt, diffusivity ) );
+		Memory_Free( name );
+
+		/* Build new Swarm Variables */
+		Stg_Component_Build( self->diffusivitySwarmVariables[materialSwarm_I], data, False );
+	}
 }
 
 void _AdvDiffResidualForceTerm_Initialise( void* residual, void* data ) {
 	AdvDiffResidualForceTerm* self = (AdvDiffResidualForceTerm*)residual;
+	Index                          i;
 
 	_ForceTerm_Initialise( self, data );
 
 	Stg_Component_Initialise( self->velocityField, data, False );
 
-	if ( self->diffusivityVariable )
-		Stg_Component_Initialise( self->diffusivityVariable, data, False );
+	for ( i = 0; i < self->materialSwarmCount; ++i ) {
+		Stg_Component_Initialise( self->diffusivitySwarmVariables[i], data, False );
+	}
 }
 
 void _AdvDiffResidualForceTerm_Execute( void* residual, void* data ) {
@@ -267,6 +316,12 @@ void _AdvDiffResidualForceTerm_Execute( 
 
 void _AdvDiffResidualForceTerm_Destroy( void* residual, void* data ) {
 	AdvDiffResidualForceTerm* self = (AdvDiffResidualForceTerm*)residual;
+	Index                          i;
+
+	for ( i = 0; i < self->materialSwarmCount; ++i ) {
+		_Stg_Component_Delete( self->diffusivitySwarmVariables[i] );
+	}
+	Memory_Free( self->diffusivitySwarmVariables );
 
 	_ForceTerm_Destroy( self, data );
 }
@@ -274,7 +329,7 @@ void _AdvDiffResidualForceTerm_AssembleE
 void _AdvDiffResidualForceTerm_AssembleElement( void* forceTerm, ForceVector* forceVector, Element_LocalIndex lElement_I, double* elementResidual ) {
 	AdvDiffResidualForceTerm*  self               = Stg_CheckType( forceTerm, AdvDiffResidualForceTerm );
 	AdvectionDiffusionSLE*     sle                = Stg_CheckType( self->extraInfo, AdvectionDiffusionSLE );
-	Swarm*                     swarm              = self->integrationSwarm;
+	Swarm*                     swarm              = self->picSwarm;
 	Particle_Index             lParticle_I;
 	Particle_Index             cParticle_I;
 	Particle_Index             cellParticleCount;
@@ -288,7 +343,6 @@ void _AdvDiffResidualForceTerm_AssembleE
 	double*                    xi;
 	double                     totalDerivative, diffusionTerm;
 	double                     diffusivity         = self->defaultDiffusivity;
-	Variable*                  diffusivityVariable = self->diffusivityVariable;
 	ElementType*               elementType         = FeMesh_GetElementType( phiField->feMesh, lElement_I );
 	Node_Index                 elementNodeCount    = elementType->nodeCount;
 	Node_Index                 node_I;
@@ -301,6 +355,7 @@ void _AdvDiffResidualForceTerm_AssembleE
 	double                     supgfactor;
 	double                     udotu, perturbation;
 	double                     upwindDiffusivity;
+
 	GNx     = self->GNx;
 	phiGrad = self->phiGrad;
 	Ni = self->Ni;
@@ -365,12 +420,8 @@ void _AdvDiffResidualForceTerm_AssembleE
 		totalDerivative = phiDot + StGermain_VectorDotProduct( velocity, phiGrad, dim );
 
 		/* Get Diffusivity */
-		/* diffusivityVariable will only be NOT NULL if:
-		 * 1) The MaterialDiffusivityPlugin is used. It's in Underworld/Plugins
-		 * 2) A special user defined DiffusivityVariable is given during the Construction phase
-		 */  
-		if ( diffusivityVariable != NULL )
-			diffusivity = self->_getDiffusivityFromIntPoint( self, particle );
+		diffusivity = IntegrationPointMapper_GetDoubleFromMaterial(((IntegrationPointsSwarm *)swarm)->mapper, particle, self->materialExtHandle,
+		    offsetof(AdvDiffResidualForceTerm_MaterialExt, diffusivity));
 
 		/* Add to element residual */
 		factor = particle->weight * detJac;
diff -r 8339d83da82d -r e0cceb47d2ea SLE/ProvidedSystems/AdvectionDiffusion/src/Residual.h
--- a/SLE/ProvidedSystems/AdvectionDiffusion/src/Residual.h	Thu Oct 21 16:45:32 2010 -0700
+++ b/SLE/ProvidedSystems/AdvectionDiffusion/src/Residual.h	Sat Nov 06 11:14:31 2010 -0700
@@ -50,6 +50,10 @@
 	/** Textual name of this class */
 	extern const Type AdvDiffResidualForceTerm_Type;
 
+        typedef struct {
+          double diffusivity;
+        } AdvDiffResidualForceTerm_MaterialExt;
+
 	/** AdvDiffResidualForceTerm class contents */
 	#define __AdvDiffResidualForceTerm \
 		/* General info */ \
@@ -64,10 +68,14 @@
 		double*																SUPGNi; \
 		IArray																*incarray; \
 		\
+		void*				materials_Register; \
+		ExtensionInfo_Index				materialExtHandle; \
+		Swarm*						picSwarm; \
+		void**				diffusivitySwarmVariables; \
+		Index												materialSwarmCount;\
 		/* AdvDiffResidualForceTerm info */ \
 		FeVariable*															velocityField; \
 		double																defaultDiffusivity; \
-		Variable*															diffusivityVariable; \
 		AdvDiffResidualForceTerm_UpwindParamFuncType				upwindParamType;
 
 	struct AdvDiffResidualForceTerm { __AdvDiffResidualForceTerm };	
@@ -83,8 +91,9 @@
 		Swarm*														integrationSwarm,
 		Stg_Component*												sle, 
 		FeVariable*													velocityField,
-		Variable*													diffusivityVariable,
 		double														defaultDiffusivity,
+		Swarm*						picSwarm,
+		void*		materials_Register,
 		AdvDiffResidualForceTerm_UpwindParamFuncType		upwindFuncType );
 
 	
@@ -105,8 +114,9 @@
 	void _AdvDiffResidualForceTerm_Init(
    	void*                                        residual,
    	FeVariable*                                  velocityField,
-   	Variable*                                    diffusivityVariable,
    	double                                       defaultDiffusivity,
+        Swarm*						picSwarm,
+        void*  materials_Register,
    	AdvDiffResidualForceTerm_UpwindParamFuncType upwindFuncType );
 	
 	void _AdvDiffResidualForceTerm_Delete( void* residual );
diff -r 8339d83da82d -r e0cceb47d2ea SLE/ProvidedSystems/AdvectionDiffusion/src/UpwindParameter.c
--- a/SLE/ProvidedSystems/AdvectionDiffusion/src/UpwindParameter.c	Thu Oct 21 16:45:32 2010 -0700
+++ b/SLE/ProvidedSystems/AdvectionDiffusion/src/UpwindParameter.c	Sat Nov 06 11:14:31 2010 -0700
@@ -47,6 +47,8 @@
 #include <StgDomain/StgDomain.h>
 #include "StgFEM/Discretisation/Discretisation.h"
 #include "StgFEM/SLE/SystemSetup/SystemSetup.h"
+#include <PICellerator/PICellerator.h>
+#include <Underworld/Underworld.h>
 
 #include "types.h"
 #include "AdvectionDiffusionSLE.h"
@@ -81,31 +83,27 @@ double AdvDiffResidualForceTerm_UpwindDi
 	
 	Cell_Index                 cell_I;
 	IntegrationPoint*          particle;
-	Variable*                  diffusivityVariable = self->diffusivityVariable;
 	Particle_Index             lParticle_I;
 	double                     averageDiffusivity;
 	Particle_InCellIndex       cParticle_I;
 	Particle_InCellIndex       particleCount;
-
 	
 	/* Compute the average diffusivity */
 	/* Find Number of Particles in Element */
-	cell_I = CellLayout_MapElementIdToCellId( swarm->cellLayout, lElement_I );
-	particleCount = swarm->cellParticleCountTbl[ cell_I ];
+	cell_I = CellLayout_MapElementIdToCellId( self->picSwarm->cellLayout, lElement_I );
+	particleCount = self->picSwarm->cellParticleCountTbl[ cell_I ];
 
 	/* Average diffusivity for element */
-	if ( diffusivityVariable ) {
-		averageDiffusivity = 0.0;
-		for ( cParticle_I = 0 ; cParticle_I < particleCount ; cParticle_I++ ) {
-			lParticle_I = swarm->cellParticleTbl[lElement_I][cParticle_I];
-			particle    = (IntegrationPoint*)Swarm_ParticleInCellAt( swarm, cell_I, cParticle_I );
-			averageDiffusivity += self->_getDiffusivityFromIntPoint( self, particle );
-		}
-		averageDiffusivity /= (double)particleCount;
-	}
-	else {
-		averageDiffusivity = self->defaultDiffusivity;
-	}
+        averageDiffusivity = 0.0;
+        for ( cParticle_I = 0 ; cParticle_I < particleCount ; cParticle_I++ ) {
+          lParticle_I = self->picSwarm->cellParticleTbl[cell_I][cParticle_I];
+          particle = (IntegrationPoint*) Swarm_ParticleAt( self->picSwarm, lParticle_I );
+
+          averageDiffusivity +=
+            IntegrationPointMapper_GetDoubleFromMaterial(((IntegrationPointsSwarm *)self->picSwarm)->mapper, particle, self->materialExtHandle,
+		    offsetof(AdvDiffResidualForceTerm_MaterialExt, diffusivity));
+        }
+        averageDiffusivity /= (double)particleCount;
 	
 	if (sle->maxDiffusivity < averageDiffusivity)
 		sle->maxDiffusivity = averageDiffusivity;



More information about the CIG-COMMITS mailing list