[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