[cig-commits] r4796 - in long/3D/Gale/trunk: . src/PICellerator/PopulationControl/src

walter at geodynamics.org walter at geodynamics.org
Wed Oct 11 13:21:03 PDT 2006


Author: walter
Date: 2006-10-11 13:21:02 -0700 (Wed, 11 Oct 2006)
New Revision: 4796

Modified:
   long/3D/Gale/trunk/
   long/3D/Gale/trunk/src/PICellerator/PopulationControl/src/SplittingRoutine.c
   long/3D/Gale/trunk/src/PICellerator/PopulationControl/src/SplittingRoutine.h
Log:
 r716 at earth:  boo | 2006-10-11 13:19:46 -0700
 Add an originalParticleShape to SplittingRoutine and use it when making new particles.  New particles in the originalParticleShape will be created with the original particle properties.



Property changes on: long/3D/Gale/trunk
___________________________________________________________________
Name: svk:merge
   - 3a629746-de10-0410-b17b-fd6ecaaa963e:/cig:715
   + 3a629746-de10-0410-b17b-fd6ecaaa963e:/cig:716

Modified: long/3D/Gale/trunk/src/PICellerator/PopulationControl/src/SplittingRoutine.c
===================================================================
--- long/3D/Gale/trunk/src/PICellerator/PopulationControl/src/SplittingRoutine.c	2006-10-11 20:21:00 UTC (rev 4795)
+++ long/3D/Gale/trunk/src/PICellerator/PopulationControl/src/SplittingRoutine.c	2006-10-11 20:21:02 UTC (rev 4796)
@@ -48,6 +48,11 @@
 
 #include "types.h"
 #include "SplittingRoutine.h"
+#include "PICellerator/MaterialPoints/types.h"
+#include "PICellerator/MaterialPoints/Material.h"
+#include "PICellerator/MaterialPoints/MaterialPoint.h"
+#include "PICellerator/MaterialPoints/MaterialPointsSwarm.h"
+#include "PICellerator/MaterialPoints/Materials_Register.h"
 
 #include <assert.h>
 #include <string.h>
@@ -106,12 +111,14 @@
 		SplittingRoutine*                                  self, 
 		Dimension_Index                                    dim, 
 		Particle_InCellIndex                               idealParticleCount,
-		Particle_InCellIndex                               minParticlesPerCell )
+		Particle_InCellIndex                               minParticlesPerCell,
+                Stg_Shape*                                         originalParticleShape)
 {
 	self->isConstructed          = True;
 	self->dim                    = dim;
 	self->idealParticleCount     = idealParticleCount;
 	self->minParticlesPerCell    = minParticlesPerCell;
+        self->originalParticleShape  = originalParticleShape;
 
 	self->debug = Journal_Register( Debug_Type, SplittingRoutine_Type ); /* TODO Register Child */
 }
@@ -150,13 +157,15 @@
 	Dimension_Index      dim;
 	Particle_InCellIndex idealParticleCount;
 	Particle_InCellIndex minParticlesPerCell;
+        Stg_Shape* originalParticleShape=NULL;
 
 	dim = Stg_ComponentFactory_GetRootDictUnsignedInt( cf, "dim", 0 );
 
 	idealParticleCount  = Stg_ComponentFactory_GetUnsignedInt( cf, self->name, "idealParticleCount",  0 );
 	minParticlesPerCell = Stg_ComponentFactory_GetUnsignedInt( cf, self->name, "minParticlesPerCell", idealParticleCount );
+	originalParticleShape =  Stg_ComponentFactory_ConstructByKey(  cf,  self->name,  "originalParticleShape", Stg_Shape,  False  ) ;
 	
-	_SplittingRoutine_Init( self, dim, idealParticleCount, minParticlesPerCell );
+	_SplittingRoutine_Init( self, dim, idealParticleCount, minParticlesPerCell, originalParticleShape );
 }
 
 void _SplittingRoutine_Build( void* splittingRoutine, void* data ) {
@@ -194,17 +203,43 @@
 
 void SplittingRoutine_SplitParticle( void* splittingRoutine, void* _swarm, Cell_LocalIndex lCell_I, Particle_InCellIndex cParticle_I, Coord newCoord ) 
 {
-	Swarm*               swarm            = (Swarm*)            _swarm;
+        SplittingRoutine*    self = (SplittingRoutine*) splittingRoutine;
+	MaterialPointsSwarm* swarm = (MaterialPointsSwarm*)            _swarm;
 	Particle_Index       newParticle_I;
-	GlobalParticle*      newParticle;
-	GlobalParticle*      particleToSplit;
+	MaterialPoint*       newParticle;
+	MaterialPoint*       particleToSplit;
 
+        Stg_Shape*           originalParticleShape=
+          (Stg_Shape*)self->originalParticleShape;
+
+        Material_Index       material_I;
+        Material*            material;
+
 	/* Add new particle to end of swarm */
-	newParticle     = (GlobalParticle*) Swarm_CreateNewParticle( swarm, &newParticle_I );
+	newParticle     = (MaterialPoint*) Swarm_CreateNewParticle( swarm, &newParticle_I );
 	
 	/* Copy particle information */
-	particleToSplit = (GlobalParticle*) Swarm_ParticleInCellAt( swarm, lCell_I, cParticle_I );
+
+	particleToSplit = (MaterialPoint*) Swarm_ParticleInCellAt( swarm, lCell_I, cParticle_I );
 	memcpy( newParticle, particleToSplit, swarm->particleExtensionMgr->finalSize );
+
+        /* If the particle is in the region that always uses the
+           original particle properties, then set the material
+           properties accordingly. */
+        if(originalParticleShape!=NULL && Stg_Shape_IsCoordInside(originalParticleShape,newCoord)) {
+          for(material_I=0; material_I < Materials_Register_GetCount( swarm->materials_Register ) ;
+              material_I++) {
+            material = Materials_Register_GetByIndex( swarm->materials_Register, material_I );
+            if(Stg_Shape_IsCoordInside(material->shape,newCoord))
+              {
+                newParticle->materialIndex=material->index;
+		Variable_Register_SetAllVariablesFromDictionary
+                  ( swarm->swarmVariable_Register->variable_Register,
+                    newParticle_I, material->dictionary );
+              }
+          }
+        }
+
 	Swarm_AddParticleToCell( swarm, lCell_I, newParticle_I );
 
 	/* Copy new position */

Modified: long/3D/Gale/trunk/src/PICellerator/PopulationControl/src/SplittingRoutine.h
===================================================================
--- long/3D/Gale/trunk/src/PICellerator/PopulationControl/src/SplittingRoutine.h	2006-10-11 20:21:00 UTC (rev 4795)
+++ long/3D/Gale/trunk/src/PICellerator/PopulationControl/src/SplittingRoutine.h	2006-10-11 20:21:02 UTC (rev 4796)
@@ -69,6 +69,7 @@
 		Dimension_Index                            dim;                      \
 		Particle_InCellIndex                       idealParticleCount;       \
 		Particle_InCellIndex                       minParticlesPerCell;      \
+		Stg_Shape*                                 originalParticleShape;    \
 
 	struct SplittingRoutine { __SplittingRoutine };
 



More information about the cig-commits mailing list