Bool Mesh_HasExtension( void* mesh, const char* name ) { Mesh* self = (Mesh*)mesh; assert( self ); return (ExtensionManager_GetHandle( self->info, (Name)name ) != -1 ) ? True : False; }
void _DruckerPrager_Init( DruckerPrager* self, int pressure_id, int velocityGradients_id, double minimumYieldStress, double frictionCoefficient, double frictionCoefficientAfterSoftening ) { MaterialPointsSwarm* materialPointsSwarm; DruckerPrager_Particle* particleExt; StandardParticle materialPoint; Dimension_Index dim = 0; /* Assign Pointers */ self->frictionCoefficient = frictionCoefficient; self->minimumYieldStress = minimumYieldStress; self->pressureTag = pressure_id; self->velocityGradientsTag = velocityGradients_id; materialPointsSwarm = self->mgr->materialSwarm; dim = materialPointsSwarm->dim; /* Strain softening of Friction - (linear weakening is assumed ) */ /* needs a softening factor between +0 and 1 and a reference strain > 0 */ self->frictionCoefficientAfterSoftening = frictionCoefficientAfterSoftening; /* get the particle extension */ self->particleExtHandle = ExtensionManager_GetHandle( materialPointsSwarm->particleExtensionMgr, (Name)DruckerPrager_Type ); if( self->particleExtHandle == (unsigned)-1 ) { /* if no particles extension add it and add Update hook */ self->particleExtHandle = ExtensionManager_Add( materialPointsSwarm->particleExtensionMgr, (Name)DruckerPrager_Type, sizeof(DruckerPrager_Particle) ); particleExt = (double*)ExtensionManager_Get( materialPointsSwarm->particleExtensionMgr, &materialPoint, self->particleExtHandle ); /* The tensileFailure variable allows to check whether a materialPoint has failed in tensile mode or not */ self->tensileFailure = Swarm_NewScalarVariable( materialPointsSwarm, (Name)"DruckerPragerTensileFailure", (ArithPointer) &particleExt->tensileFailure - (ArithPointer) &materialPoint, Variable_DataType_Char ); LiveComponentRegister_Add( LiveComponentRegister_GetLiveComponentRegister(), (Stg_Component*)self->tensileFailure->variable ); LiveComponentRegister_Add( LiveComponentRegister_GetLiveComponentRegister(), (Stg_Component*)self->tensileFailure ); } else { /* get references to all swarm variables */ Name var_name = Stg_Object_AppendSuffix( materialPointsSwarm, (Name)"DruckerPragerTensileFailure" ); self->tensileFailure = SwarmVariable_Register_GetByName( materialPointsSwarm->swarmVariable_Register, var_name ); Memory_Free( var_name ); } self->curFrictionCoef = 0.0; }
void _RateFieldTimeIntegrator_Build( void* rateFieldTimeIntegrator, void* data ) { RateFieldTimeIntegrator* self = (RateFieldTimeIntegrator*) rateFieldTimeIntegrator; ExtensionInfo_Index handle; Stg_Component_Build( self->swarm, data, False ); Stg_Component_Build( self->rateField, data, False ); handle = ExtensionManager_GetHandle( self->swarm->particleExtensionMgr, (Name)self->name ); if ( handle == (ExtensionInfo_Index) -1 ) { ArithPointer offset; handle = ExtensionManager_Add( self->swarm->particleExtensionMgr, (Name)RateFieldTimeIntegrator_Type, self->rateField->fieldComponentCount*sizeof(double) ); /* Adding required increment variable */ offset = (ArithPointer ) ExtensionManager_Get( self->swarm->particleExtensionMgr, NULL, handle ); /* Add variables for vizualization / analysis purposes */ self->particleTimeIntegral = Swarm_NewVectorVariable( self->swarm, self->name, offset, Variable_DataType_Double, self->rateField->fieldComponentCount, "STG_AUTONAME" ); LiveComponentRegister_Add( LiveComponentRegister_GetLiveComponentRegister(), (Stg_Component*)self->particleTimeIntegral->variable ); LiveComponentRegister_Add( LiveComponentRegister_GetLiveComponentRegister(), (Stg_Component*)self->particleTimeIntegral ); /* The RateFieldTimeIntegrator class inherits from the TimeIntegrand class - this class needs a 'Variable' to * integrate through time. */ self->variable = self->particleTimeIntegral->variable; } else Journal_Firewall(False, Journal_Register( Error_Type, (Name)"RateFieldTimeIntegrator" ), "\n\nError in '%s' - Extension with name %s should not already exists.\n" "An error has occurred. Please contact developers.", __func__, self->name); /* Build parent. Note that this needs to go last because it assumes that a variable has been set, which only just happens above */ /* Another example where the build/init/etc phases don't work */ _TimeIntegrand_Build( self, data ); Stg_Component_Build( self->particleTimeIntegral, data, False ); }
void SurfaceAdaptor_Generate( void* adaptor, void* _mesh ) { SurfaceAdaptor* self = (SurfaceAdaptor*)adaptor; Mesh* mesh = (Mesh*)_mesh; SurfaceAdaptor_DeformFunc* deformFunc; unsigned* gSize; Grid* grid; unsigned* inds; unsigned d_i, n_i; /* Build base mesh, which is assumed to be cartesian. */ MeshGenerator_Generate( self->generator, mesh ); /* If we're not 2D or 3D, forget about it. */ if( mesh->topo->nDims != 2 && mesh->topo->nDims != 3 ) return; /* What kind of surface do we want? */ switch( self->surfaceType ) { case SurfaceAdaptor_SurfaceType_Wedge: deformFunc = SurfaceAdaptor_Wedge; break; case SurfaceAdaptor_SurfaceType_Sine: deformFunc = SurfaceAdaptor_Sine; break; case SurfaceAdaptor_SurfaceType_Cosine: deformFunc = SurfaceAdaptor_Cosine; break; default: break; }; /* Extract the cartesian information. */ gSize = (unsigned*)ExtensionManager_Get( mesh->info, mesh, ExtensionManager_GetHandle( mesh->info, "cartesianGlobalSize" ) ); /* Build grid and space for indices. */ grid = Grid_New(); Grid_SetNDims( grid, mesh->topo->nDims ); for( d_i = 0; d_i < mesh->topo->nDims; d_i++ ) gSize[d_i]++; Grid_SetSizes( grid, gSize ); for( d_i = 0; d_i < mesh->topo->nDims; d_i++ ) gSize[d_i]--; inds = Memory_Alloc_Array_Unnamed( unsigned, mesh->topo->nDims ); /* Loop over domain nodes. */ for( n_i = 0; n_i < MeshTopology_GetDomainSize( mesh->topo, MT_VERTEX ); n_i++ ) { unsigned gNode; double height; gNode = MeshTopology_DomainToGlobal( mesh->topo, MT_VERTEX, n_i ); Grid_Lift( grid, gNode, inds ); /* Calculate a height percentage. */ height = (double)inds[1] / (double)(gSize[1] - 1); /* Deform this node. */ mesh->nodeCoord[n_i][1] += height * deformFunc( self, mesh, gSize, n_i, inds ); } /* Free resources. */ FreeArray( inds ); FreeObject( grid ); }