[cig-commits] r4935 - in long/3D/Gale/trunk/src/Underworld: . Rheology/src Rheology/tests

walter at geodynamics.org walter at geodynamics.org
Wed Oct 11 13:54:19 PDT 2006


Author: walter
Date: 2006-10-11 13:54:18 -0700 (Wed, 11 Oct 2006)
New Revision: 4935

Added:
   long/3D/Gale/trunk/src/Underworld/Rheology/tests/testDirectorPerMaterial2.xml
Modified:
   long/3D/Gale/trunk/src/Underworld/
   long/3D/Gale/trunk/src/Underworld/Rheology/src/Director.c
Log:
 r595 at earth:  boo | 2006-10-11 13:52:10 -0700
  r557 at earth (orig r334):  KathleenHumble | 1970-01-01 16:40:04 -0800
  altered Director.c
  to allow for random materials per material.
  if the tag initialDirectorType = perMaterial
  then on each material, the code will search for a 
  flag, 
  randomInitialDirection, if this is set to True,
  then that material will be set as random,
  and a randomInitialDirectionSeed can be specified for that 
  material.
  If set to false, or absent, it works exactly the same way
  as the original perMaterial type.
  
  
  
 



Property changes on: long/3D/Gale/trunk/src/Underworld
___________________________________________________________________
Name: svk:merge
   - 9570c393-cf10-0410-b476-9a651db1e55a:/cig:594
c24a034b-ab11-0410-afe6-cfe714e2959e:/trunk:333
   + 9570c393-cf10-0410-b476-9a651db1e55a:/cig:595
c24a034b-ab11-0410-afe6-cfe714e2959e:/trunk:334

Modified: long/3D/Gale/trunk/src/Underworld/Rheology/src/Director.c
===================================================================
--- long/3D/Gale/trunk/src/Underworld/Rheology/src/Director.c	2006-10-11 20:54:16 UTC (rev 4934)
+++ long/3D/Gale/trunk/src/Underworld/Rheology/src/Director.c	2006-10-11 20:54:18 UTC (rev 4935)
@@ -299,43 +299,98 @@
 			}	
 		}
 		else if (self->initialDirectionType == INIT_DIR_PER_MAT) {
-			/* Assign initial direction based on material */
+			/* Assign initial direction based on material
+			  and check first is material is defined as random.*/
 			Material_Index       materialsCount = Materials_Register_GetCount( self->materialPointsSwarm->materials_Register);
-			XYZ*              materialDirectionVectors;
+			XYZ*                 materialDirectionVectors;
 			int 				 material_I;
 			Material*            material;
+			Bool*                randomInitialDirections;
+			int*                 randomInitialDirectionSeeds;
+			int                  materialOfParticle;
 			
+			
 			materialDirectionVectors = Memory_Alloc_Array(XYZ, materialsCount, "materialDirectionVectors");
+			randomInitialDirectionSeeds = Memory_Alloc_Array(int, materialsCount,
+			"randomInitialDirectionSeeds");
+			randomInitialDirections = Memory_Alloc_Array(Bool, materialsCount,
+			"randomInitialDirections");
 
 			/* Loop over materials and get material properties from dictionary */
 			for ( material_I = 0 ; material_I < materialsCount ; material_I++ ) {
-				material = Materials_Register_GetByIndex( self->materialPointsSwarm->materials_Register, material_I );
-				materialDirectionVectors[ material_I ][0] = 
-					Dictionary_GetDouble_WithDefault( material->dictionary, 
-						"initialDirectionX", DIRECTOR_DEFAULT_DIR_X );
+				material = Materials_Register_GetByIndex( 
+						self->materialPointsSwarm->materials_Register, 
+						material_I );
+				randomInitialDirections[material_I] = Dictionary_GetBool_WithDefault(
+						material->dictionary,
+						"randomInitialDirection", 
+						False);
+				/* If no value is set, use default value from this file,
+				and not the (not-used) global value */ 
+				if ( randomInitialDirections[material_I] == False) {
+					materialDirectionVectors[ material_I ][0] = 
+						Dictionary_GetDouble_WithDefault( 
+							material->dictionary, 
+							"initialDirectionX", 
+							DIRECTOR_DEFAULT_DIR_X );
 				
-				materialDirectionVectors[ material_I ][1] = 
-					Dictionary_GetDouble_WithDefault( material->dictionary, 
-						"initialDirectionY", DIRECTOR_DEFAULT_DIR_Y );				   		
+					materialDirectionVectors[ material_I ][1] = 
+						Dictionary_GetDouble_WithDefault( 
+							material->dictionary, 
+							"initialDirectionY", 
+							DIRECTOR_DEFAULT_DIR_Y );				   		
 				
-				materialDirectionVectors[ material_I ][2] = 
-					Dictionary_GetDouble_WithDefault( material->dictionary, 
-						"initialDirectionZ", DIRECTOR_DEFAULT_DIR_Z );
+					materialDirectionVectors[ material_I ][2] = 
+						Dictionary_GetDouble_WithDefault( 
+							material->dictionary, 
+							"initialDirectionZ", 
+							DIRECTOR_DEFAULT_DIR_Z );
+				}
+				else {
+					/* If no random seed set, then use global value ( which if 
+					not set will go to default value) */
+					randomInitialDirectionSeeds[material_I] = Dictionary_GetUnsignedInt_WithDefault(
+							material->dictionary,
+							"randomInitialDirectionSeed", 
+							self->randomInitialDirectionSeed);
+				}
 			}
+			/* Assign value to particle */
 			
-			/* Assign value to particle */
+			/* If material is random, set the local srand, 
+			locate all random particles, and set their director */
+			for (material_I = 0; material_I < materialsCount; material_I++) {
+				if (randomInitialDirections[material_I] == True) {
+					srand(randomInitialDirectionSeeds[material_I]);
+					for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ){
+					materialOfParticle = MaterialPointsSwarm_GetMaterialIndexAt(
+						self->materialPointsSwarm, 
+						lParticle_I );
+						if (materialOfParticle == material_I){
+							normal = Variable_GetPtrDouble( self->variable, lParticle_I );
+							for ( dim_I = 0; dim_I < self->materialPointsSwarm->dim; dim_I++ ) {
+								normal[dim_I] = ( (float) rand() - RAND_MAX/2 ) / RAND_MAX;
+							}	
+							/* Normalising the direction vector */
+							StGermain_VectorNormalise( normal, self->materialPointsSwarm->dim );						}
+					}
+				}
+			}
+		    /* For each non-random particle, set the initial direction */
 			for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) {
 				/* Initialise the norm of each director */
-				normal = Variable_GetPtrDouble(self->variable,lParticle_I);
 				material_I = MaterialPointsSwarm_GetMaterialIndexAt(
 						self->materialPointsSwarm, 
 						lParticle_I );
-	
-				memcpy(normal, materialDirectionVectors[material_I], sizeof(XYZ));
-				StGermain_VectorNormalise( normal, self->materialPointsSwarm->dim );			
+				if (randomInitialDirections[material_I] == False) {
+					normal = Variable_GetPtrDouble(self->variable,lParticle_I);
+					memcpy(normal, materialDirectionVectors[material_I], sizeof(XYZ));
+					StGermain_VectorNormalise( normal, self->materialPointsSwarm->dim );			
+				}
 			}	
 			Memory_Free(materialDirectionVectors);		
-			
+			Memory_Free(randomInitialDirections);
+			Memory_Free(randomInitialDirectionSeeds);
 		}
 		else {
 			Journal_Firewall(False, Journal_Register(Error_Type, "Director" ), 

Added: long/3D/Gale/trunk/src/Underworld/Rheology/tests/testDirectorPerMaterial2.xml
===================================================================
--- long/3D/Gale/trunk/src/Underworld/Rheology/tests/testDirectorPerMaterial2.xml	2006-10-11 20:54:16 UTC (rev 4934)
+++ long/3D/Gale/trunk/src/Underworld/Rheology/tests/testDirectorPerMaterial2.xml	2006-10-11 20:54:18 UTC (rev 4935)
@@ -0,0 +1,167 @@
+<?xml version="1.0"?>
+<!DOCTYPE StGermainData SYSTEM "stgermain.dtd">
+
+<StGermainData xmlns="http://www.vpac.org/StGermain/XML_IO_Handler/Jun2003">
+	
+	<!-- Component Stuff -->
+	<searchPath>../../InputFiles/</searchPath>
+	<include>./StgFEM_Components/LinearMesh.xml             </include>
+	<include>./StgFEM_Components/ElementLayout.xml          </include>
+	<include>./StgFEM_Components/VelocityField.xml          </include>
+	<include>./StgFEM_Components/TimeIntegrator.xml         </include>
+	<include>./PIC_Components/MaterialPointSwarm.xml        </include>
+	
+	<list name="plugins" mergeType="merge">
+		<param>StG_FEM_StandardConditionFunctions</param>
+		<!-- testDirector plugin has to be here to standardise dt calculations -->
+		<param>Underworld_testDirectorPerMaterial</param>
+	</list>
+
+	<!-- Rheology Components -->
+	<struct name="components" mergeType="merge">
+		<!-- Periodic boundary conditions -->
+		<struct name="periodicBCsManager">
+			<param name="Type">PeriodicBoundariesManager</param>
+			<param name="Geometry">geometry</param>
+			<param name="Swarm">materialSwarm</param>
+			<param name="TimeIntegrator">timeIntegrator</param>
+			
+			<list name="PeriodicBoundaries">
+				<param>I_AXIS</param>
+			</list>	
+		</struct>
+
+		<!-- Create Alignment Swarm Variable - for the sake of plotting -->
+		<struct name="director">
+			<param name="Type">Director</param>
+			<param name="MaterialPointsSwarm">materialSwarm</param>
+			<param name="TimeIntegrator">timeIntegrator</param>
+			<param name="VelocityGradientsField">VelocityGradientsField</param>
+			<param name="initialDirectionType">perMaterial</param>
+		</struct>	
+		<struct name="alignment">
+			<param name="Type">AlignmentSwarmVariable</param>
+			<param name="Swarm">materialSwarm</param>
+			<param name="Director">director</param>
+			<param name="VelocityField">VelocityField</param>
+		</struct>	
+	</struct>
+	
+	<!-- Create different materials -->
+	<struct name="components" mergeType="merge">
+		<struct name="backgroundViscosity">
+			<param name="Type">MaterialViscosity</param>
+			<param name="eta0">1.0</param>
+		</struct>
+		<struct name="backgroundShape">
+			<param name="Type">Everywhere</param>
+		</struct>	
+		<struct name="background">
+			<param name="Type">Material</param>
+			<param name="Shape">backgroundShape</param>
+			<param name="initialDirectionX">1.0</param>
+			<param name="initialDirectionY">0.0</param>
+			<param name="initialDirectionZ">0.0</param>
+		</struct>
+
+		<struct name="ballShape1">
+			<param name="Type">Sphere</param>
+			<param name="CentreX">0.5</param>
+			<param name="CentreY">0.7</param>
+			<param name="CentreZ">0.1</param>
+			<param name="radius"> 0.10 </param>
+		</struct>
+		<struct name="ballShape2">
+			<param name="Type">Sphere</param>
+			<param name="CentreX">0.2</param>
+			<param name="CentreY">0.5</param>
+			<param name="CentreZ">0.5</param>
+			<param name="radius"> 0.10 </param>
+		</struct>		
+		<struct name="ball1">
+			<param name="Type">Material</param>
+			<param name="Shape">ballShape1</param>
+			<param name="randomInitialDirection">True</param>
+			<param name="randomInitialDirectionSeed">3</param>
+			
+		</struct>
+		<struct name="ball2">
+			<param name="Type">Material</param>
+			<param name="Shape">ballShape2</param>
+			<param name="initialDirectionX">1.0</param>
+			<param name="initialDirectionY">1.0</param>
+			<param name="initialDirectionZ">0.0</param>
+			
+		</struct>		
+	</struct>
+	<!-- Simulation control -->
+	<param name="maxTimeSteps"> 1      </param>
+	<param name="outputPath">./output</param>
+	<param name="dumpEvery"> 1 </param>	
+
+	<param name="particlesPerCell">  2    </param>
+	<param name="SimpleShearFactor">  2    </param>
+
+	<!-- Journal Control -->
+	<param name="journal.info.Context-verbose">True</param>
+	<param name="journal-level.info.Stg_ComponentFactory">2</param>
+	<param name="journal.debug">f</param>
+	<param name="journal-enable-branch.debug.StG_FEM">t</param>
+	<param name="journal-level-branch.debug.StG_FEM"> 1 </param>	
+	
+	<!-- Geometry & Mesh setup -->
+	<param name="dim">        2 </param>
+	<param name="elementResI">10 </param>
+	<param name="elementResJ">10 </param>
+	<param name="elementResK">1 </param>
+	<param name="shadowDepth">1 </param>
+	<param name="minX">       0.0 </param>
+	<param name="minY">       0.0 </param>
+	<param name="minZ">       0.0 </param>
+	<param name="maxX">       1.0 </param>
+	<param name="maxY">       1.0 </param>
+	<param name="maxZ">       1.0 </param>
+	<param name="allowUnbalancing"> True </param>
+
+	<!-- Set up BCs and ICs -->
+	<include> VariableConditions/velocityBCs.simpleShear.xml </include>
+	<include> VariableConditions/velocityICs.simpleShear.xml </include>
+
+	<!-- Integration Scheme configuration -->
+	<param name="gaussParticlesX"> 2 </param>
+	<param name="gaussParticlesY"> 2 </param>
+	<param name="gaussParticlesZ"> 2 </param>
+
+
+	<include> Viewports/StrainRateInvariantVP.xml </include>
+	<include> Viewports/VelocityMagnitudeVP.xml </include>
+	<include> window.xml </include>
+	<struct name="components" mergeType="merge">
+		<struct name="alignmentColourMap">
+			<param name="Type">lucColourMap</param>
+			<param name="colours">Orange Red Black</param>
+		</struct>
+		<struct name="alignmentDrawingObject">
+			<param name="Type">lucSwarmVectors</param>
+			<param name="Swarm">materialSwarm</param>
+			<param name="ColourVariable">alignment</param>
+			<param name="ColourMap"> alignmentColourMap</param>
+			<param name="DirectionVariable">materialSwarm-Director</param>
+			<param name="arrowHeadSize">0.2</param>
+			<param name="length">0.05</param>
+		</struct>	
+		<struct name="AlignmentVP">
+			<param name="Type">lucViewport</param>
+			<param name="Camera">camera</param>
+			<list name="DrawingObject">
+				<param>alignmentDrawingObject</param>
+				<param>border</param>
+			</list>
+		</struct>		
+		<struct name="window" mergeType="merge">
+			<param name="Viewport">VelocityMagnitudeVP AlignmentVP </param>
+		</struct>
+	</struct>
+
+ 
+</StGermainData>



More information about the cig-commits mailing list