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

walter at geodynamics.org walter at geodynamics.org
Tue Aug 1 01:56:04 PDT 2006


Author: walter
Date: 2006-08-01 01:56:02 -0700 (Tue, 01 Aug 2006)
New Revision: 4180

Modified:
   long/3D/Gale/trunk/src/Underworld/
   long/3D/Gale/trunk/src/Underworld/Rheology/src/Director.c
   long/3D/Gale/trunk/src/Underworld/Rheology/src/DruckerPrager.c
   long/3D/Gale/trunk/src/Underworld/Rheology/src/MohrCoulomb.c
   long/3D/Gale/trunk/src/Underworld/Rheology/src/StrainWeakening.c
Log:
 r429 at earth:  boo | 2006-08-01 01:53:43 -0700
  r409 at earth (orig r280):  PatrickSunter | 2006-07-25 19:56:24 -0700
  Checkpointing related fixes in Underworld:
    * Director, StrainWeakening, DruckerPrager and
    MohrCoulomb classes are all now aware of 
    the possibility of restarting from checkpoint,
    and don't set their ICs if so (since their variables
    are all on the swarm, when the swarm binaries
    are reloaded exactly as they were, all these 
    properties will automatically be set).
  
 



Property changes on: long/3D/Gale/trunk/src/Underworld
___________________________________________________________________
Name: svk:merge
   - 9570c393-cf10-0410-b476-9a651db1e55a:/cig:428
c24a034b-ab11-0410-afe6-cfe714e2959e:/trunk:279
   + 9570c393-cf10-0410-b476-9a651db1e55a:/cig:429
c24a034b-ab11-0410-afe6-cfe714e2959e:/trunk:280

Modified: long/3D/Gale/trunk/src/Underworld/Rheology/src/Director.c
===================================================================
--- long/3D/Gale/trunk/src/Underworld/Rheology/src/Director.c	2006-08-01 08:55:59 UTC (rev 4179)
+++ long/3D/Gale/trunk/src/Underworld/Rheology/src/Director.c	2006-08-01 08:56:02 UTC (rev 4180)
@@ -231,6 +231,7 @@
 	Particle_Index                  particleLocalCount = self->variable->arraySize;
 	double*                         normal;
 	Dimension_Index                 dim_I;
+	AbstractContext*                context = (AbstractContext*)data;
 	
 	/* Initialise Parent */
 	_TimeIntegratee_Initialise( self, data );
@@ -244,21 +245,28 @@
 
 	/* Update variables */
 	Variable_Update( self->variable );
-	particleLocalCount = self->variable->arraySize;
-	for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) {
-		/* Initialise the norm of each director */
-		normal = Variable_GetPtrDouble( self->variable, lParticle_I );
+
+	/* We should only set initial directors if in regular non-restart mode. If in restart mode, then
+	the directors will be set correcty when we re-load the Swarm. */
+	if ( !(context && (True == context->loadFromCheckPoint)) ) {
+		particleLocalCount = self->variable->arraySize;
 		if ( False == self->randomInitialDirection ) {
-			memcpy( normal, self->initialDirection, sizeof(XYZ) );
+			for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) {
+				/* Initialise the norm of each director */
+				normal = Variable_GetPtrDouble( self->variable, lParticle_I );
+				if ( False == self->randomInitialDirection ) {
+					memcpy( normal, self->initialDirection, sizeof(XYZ) );
+				}
+			}	
 		}
 		else {
-			for ( dim_I = 0; dim_I < self->materialPointsSwarm->dim; dim_I++ ) {
-				normal[dim_I] = ( (float) rand() - RAND_MAX/2 ) / RAND_MAX;
+			for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) {
+				for ( dim_I = 0; dim_I < self->materialPointsSwarm->dim; dim_I++ ) {
+					normal[dim_I] = ( (float) rand() - RAND_MAX/2 ) / RAND_MAX;
+				}	
+				StGermain_VectorNormalise( normal, self->materialPointsSwarm->dim );
 			}	
-
-			StGermain_VectorNormalise( normal, self->materialPointsSwarm->dim );
 		}
-
 		/* We don't need to initialise the 'dontUpdate' flag on the particle because
 		 * all the memory is initialised to zero when the particles are allocated */
 	}

Modified: long/3D/Gale/trunk/src/Underworld/Rheology/src/DruckerPrager.c
===================================================================
--- long/3D/Gale/trunk/src/Underworld/Rheology/src/DruckerPrager.c	2006-08-01 08:55:59 UTC (rev 4179)
+++ long/3D/Gale/trunk/src/Underworld/Rheology/src/DruckerPrager.c	2006-08-01 08:56:02 UTC (rev 4180)
@@ -222,6 +222,7 @@
 	DruckerPrager*                  self                  = (DruckerPrager*) rheology;
 	Particle_Index                  lParticle_I;
 	Particle_Index                  particleLocalCount;
+	AbstractContext*                context = (AbstractContext*)data;
 
 	_YieldRheology_Initialise( self, data );
 
@@ -231,18 +232,22 @@
 	Stg_Component_Initialise( self->opacity, data, False );
 	Stg_Component_Initialise( self->diameter, data, False );
 
-	/* We don't need to Initialise hasYieldedVariable because it's a parent variable and _YieldRheology_Initialise
-	 * has already been called */
-	particleLocalCount = self->hasYieldedVariable->variable->arraySize;
+	/* We should only set initial conditions if in regular non-restart mode. If in restart mode, then
+	the particle-based variables will be set correcty when we re-load the Swarm. */
+	if ( !(context && (True == context->loadFromCheckPoint)) ) {
+		/* We don't need to Initialise hasYieldedVariable because it's a parent variable and _YieldRheology_Initialise
+		 * has already been called */
+		particleLocalCount = self->hasYieldedVariable->variable->arraySize;
 
-	for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) { 
-	
-		Variable_SetValueFloat( self->brightness->variable, lParticle_I, 0.0 );
-		Variable_SetValueFloat( self->opacity->variable,    lParticle_I, 0.0 );
-		Variable_SetValueFloat( self->diameter->variable,   lParticle_I, 0.0 );
-	
-		Variable_SetValueChar( self->hasYieldedVariable->variable, lParticle_I, False );
-	}
+		for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) { 
+		
+			Variable_SetValueFloat( self->brightness->variable, lParticle_I, 0.0 );
+			Variable_SetValueFloat( self->opacity->variable,    lParticle_I, 0.0 );
+			Variable_SetValueFloat( self->diameter->variable,   lParticle_I, 0.0 );
+		
+			Variable_SetValueChar( self->hasYieldedVariable->variable, lParticle_I, False );
+		}
+	}	
 }
 
 double _DruckerPrager_GetYieldCriterion( 
@@ -297,7 +302,7 @@
 	dpFrictionCoefficient = 6.0 * sinphi * oneOverDenominator;
 	dpCohesion = 6.0 * effectiveCohesion * cos(phi) * oneOverDenominator;
 		
-	frictionalStrength = dpFrictionCoefficient * pressure + dpCohesion ;
+	frictionalStrength = dpFrictionCoefficient * fabs(pressure) + dpCohesion ;
 							 
 	if ( frictionalStrength < minimumYieldStress) 
 		frictionalStrength = minimumYieldStress;

Modified: long/3D/Gale/trunk/src/Underworld/Rheology/src/MohrCoulomb.c
===================================================================
--- long/3D/Gale/trunk/src/Underworld/Rheology/src/MohrCoulomb.c	2006-08-01 08:55:59 UTC (rev 4179)
+++ long/3D/Gale/trunk/src/Underworld/Rheology/src/MohrCoulomb.c	2006-08-01 08:56:02 UTC (rev 4180)
@@ -302,6 +302,7 @@
 	MaterialPoint*                  materialPoint;
 	Index                           dof_I;
 	Dimension_Index                 dim                   = self->materialPointsSwarm->dim;
+	AbstractContext*                context = (AbstractContext*)data;
 
 	_YieldRheology_Initialise( self, data );
 	
@@ -324,50 +325,53 @@
 	 * has already been called */
 	particleLocalCount = self->hasYieldedVariable->variable->arraySize;
 
-	for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) { 
-		Variable_SetValueChar( self->hasYieldedVariable->variable, lParticle_I, False );
+	/* If restarting from checkpoint, don't change the parameters on the particles */
+	if ( !(context && (True == context->loadFromCheckPoint) ) ) {
+		for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) { 
+			Variable_SetValueChar( self->hasYieldedVariable->variable, lParticle_I, False );
 
-		Variable_SetValueDouble( self->slipRate->variable, lParticle_I, 0.0 );
+			Variable_SetValueDouble( self->slipRate->variable, lParticle_I, 0.0 );
+			
+			ptr = Variable_GetPtrDouble( self->slip->variable, lParticle_I );
+			
+			materialPoint = (MaterialPoint*)Swarm_ParticleAt( self->materialPointsSwarm, lParticle_I );
+			
+			normalDirector = Director_GetNormalPtr( self->director, materialPoint);
+			
+			initialDamageFraction = StrainWeakening_GetInitialDamageFraction( self->strainWeakening, materialPoint );
 		
-		ptr = Variable_GetPtrDouble( self->slip->variable, lParticle_I );
-		
-		materialPoint = (MaterialPoint*)Swarm_ParticleAt( self->materialPointsSwarm, lParticle_I );
-		
-		normalDirector = Director_GetNormalPtr( self->director, materialPoint);
-		
-		initialDamageFraction = StrainWeakening_GetInitialDamageFraction( self->strainWeakening, materialPoint );
-	
-		if (drand48() < initialDamageFraction) {
-			normalLength2 = 0.0;
-			
-			for( dof_I=0; dof_I < dim ; dof_I++) {
+			if (drand48() < initialDamageFraction) {
+				normalLength2 = 0.0;
 				
-				normal[dof_I] = 1.0 - 2.0 * drand48(); 
-				normalLength2 += normal[dof_I] * normal[dof_I];
+				for( dof_I=0; dof_I < dim ; dof_I++) {
+					
+					normal[dof_I] = 1.0 - 2.0 * drand48(); 
+					normalLength2 += normal[dof_I] * normal[dof_I];
+				}
+				
+				invNormalLength = 1.0/sqrt(normalLength2);
+				
+				for( dof_I=0; dof_I < dim ; dof_I++){
+					normal[dof_I] *= invNormalLength; 
+				}
+				
+				/*TODO : improve this initialisation (is it really needed ?)*/
+				slip[0] = - normal[1];
+				slip[1] =   normal[0];
+				slip[2] =   0.0;
+
 			}
 			
-			invNormalLength = 1.0/sqrt(normalLength2);
+			memcpy( normalDirector, normal, sizeof(Coord) );
+			memcpy( ptr, slip, sizeof(Coord) );
 			
-			for( dof_I=0; dof_I < dim ; dof_I++){
-				normal[dof_I] *= invNormalLength; 
-			}
-			
-			/*TODO : improve this initialisation (is it really needed ?)*/
-			slip[0] = - normal[1];
-			slip[1] =   normal[0];
-			slip[2] =   0.0;
+			Variable_SetValueDouble( self->slipRate->variable,     lParticle_I, 0.0 );
 
+			Variable_SetValueFloat( self->opacity->variable,      lParticle_I, 0.0 );
+			Variable_SetValueFloat( self->length->variable,       lParticle_I, 0.0 );
+			Variable_SetValueFloat( self->thickness->variable,    lParticle_I, 0.0 );
+			Variable_SetValueChar( self->tensileFailure->variable,lParticle_I, False );
 		}
-		
-		memcpy( normalDirector, normal, sizeof(Coord) );
-		memcpy( ptr, slip, sizeof(Coord) );
-		
-		Variable_SetValueDouble( self->slipRate->variable,     lParticle_I, 0.0 );
-
-		Variable_SetValueFloat( self->opacity->variable,      lParticle_I, 0.0 );
-		Variable_SetValueFloat( self->length->variable,       lParticle_I, 0.0 );
-		Variable_SetValueFloat( self->thickness->variable,    lParticle_I, 0.0 );
-		Variable_SetValueChar( self->tensileFailure->variable,lParticle_I, False );
 	}
 }
 	

Modified: long/3D/Gale/trunk/src/Underworld/Rheology/src/StrainWeakening.c
===================================================================
--- long/3D/Gale/trunk/src/Underworld/Rheology/src/StrainWeakening.c	2006-08-01 08:55:59 UTC (rev 4179)
+++ long/3D/Gale/trunk/src/Underworld/Rheology/src/StrainWeakening.c	2006-08-01 08:56:02 UTC (rev 4180)
@@ -251,6 +251,7 @@
 	Variable*                              positionVariable   = self->swarm->particleCoordVariable->variable;
 	double                                 postFailureWeakening;
 	double*                                coord;
+	AbstractContext*                       context = (AbstractContext*)data;
 	
 	/* Initialise Parent */
 	_TimeIntegratee_Initialise( self, data );
@@ -265,30 +266,34 @@
 
 	particleLocalCount = self->variable->arraySize;
 
-	/* Initialise random number generator */
- 	srand48( self->randomSeed );
-		
-	for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) {
-		/* Initialise Increment to Zero */
-		Variable_SetValueDouble( self->postFailureWeakeningIncrement->variable, lParticle_I, 0.0 );
+	/* We should only set initial conditions if in regular non-restart mode. If in restart mode, then
+	the particle-based variables will be set correcty when we re-load the Swarm. */
+	if ( !(context && (True == context->loadFromCheckPoint)) ) {
+		/* Initialise random number generator */
+		srand48( self->randomSeed );
+			
+		for ( lParticle_I = 0 ; lParticle_I < particleLocalCount ; lParticle_I++ ) {
+			/* Initialise Increment to Zero */
+			Variable_SetValueDouble( self->postFailureWeakeningIncrement->variable, lParticle_I, 0.0 );
 
-		/* Set initial damage parameter
-		 * There is a certain fraction of the number of particles which are given initial strain */
-		postFailureWeakening = 0.0;
-		
-		if ( drand48() < self->initialDamageFraction ) {
+			/* Set initial damage parameter
+			 * There is a certain fraction of the number of particles which are given initial strain */
+			postFailureWeakening = 0.0;
 			
-			postFailureWeakening = self->initialDamageFactor * drand48() * self->softeningStrain;
+			if ( drand48() < self->initialDamageFraction ) {
+				
+				postFailureWeakening = self->initialDamageFactor * drand48() * self->softeningStrain;
 
-			if ( self->initialDamageWavenumber > 0.0 ) {				
-				coord = Variable_GetPtrDouble( positionVariable, lParticle_I );
+				if ( self->initialDamageWavenumber > 0.0 ) {				
+					coord = Variable_GetPtrDouble( positionVariable, lParticle_I );
 
-				postFailureWeakening *= pow(sin(M_PI * coord[ I_AXIS ] * self->initialDamageWavenumber),2.0);
+					postFailureWeakening *= pow(sin(M_PI * coord[ I_AXIS ] * self->initialDamageWavenumber),2.0);
+				}
 			}
+		
+			Variable_SetValueDouble( self->variable, lParticle_I, postFailureWeakening );
 		}
-	
-		Variable_SetValueDouble( self->variable, lParticle_I, postFailureWeakening );
-	}
+	}	
 }
 
 Bool _StrainWeakening_TimeDerivative( void* strainWeakening, Index lParticle_I, double* timeDeriv ) {



More information about the cig-commits mailing list