void VariableSuite_Setup( VariableSuiteData* data ) {
    Particle                tmpParticle;
    Name                    pNames[] = { "mass", "force", "info" };
    SizeT                   pOffsets[] = { 0, 0, 0 };   /* Init later... */
    Variable_DataType       pDataTypes[] = {
        Variable_DataType_Int,
        Variable_DataType_Float,
        Variable_DataType_Pointer,
    };
    Index                   pDtCounts[] = { 1, 3, 1 };
    static SizeT            pSize = sizeof(Particle);

    data->aSize[0] = 16;
    data->aSize[1] = 16;
    data->aSize[2] = 16;

    pOffsets[0] = (ArithPointer)&tmpParticle.mass - (ArithPointer)&tmpParticle;
    pOffsets[1] = (ArithPointer)&tmpParticle.force - (ArithPointer)&tmpParticle;
    pOffsets[2] = (ArithPointer)&tmpParticle.info - (ArithPointer)&tmpParticle;

    /* Construction phase --------------------------------------------------------------------------------------------*/
    data->vr = Variable_Register_New();
    Variable_NewScalar( "temperature", NULL, Variable_DataType_Double, &data->aSize[0], NULL, (void**)&data->temperature, data->vr );
    Variable_NewVector( "velocity", NULL, Variable_DataType_Double, 3, &data->aSize[1], NULL, (void**)&data->velocity, data->vr, "vx", "vy", "vz" );
    Variable_New( "particle", NULL, 3, pOffsets, pDataTypes, pDtCounts, pNames, &pSize, &data->aSize[2], NULL, (void**)&data->particle, data->vr );

    /* Build phase ---------------------------------------------------------------------------------------------------*/
    data->temperature = Memory_Alloc_Array( double, data->aSize[0], "temperature" );
    data->velocity = Memory_Alloc_Array( VectorD, data->aSize[1], "velocity" );
    data->particle = Memory_Alloc_Array( Particle, data->aSize[2], "array" );

    Variable_Register_BuildAll( data->vr );
}
Variable* Variable_NewFromOld( Variable* oldVariable, Name name, Bool copyValues ) {
	Variable*         self;
	Index             array_I;
	SizeT             dataOffsets[] = { 0 };
	void*             myPtr;
	void*             oldPtr;

	Variable_Update( oldVariable );

	self = Variable_New(  
		name,
		self->context,
		1,
		dataOffsets,
		oldVariable->dataTypes,
		oldVariable->dataTypeCounts,
		NULL,
		0,
		oldVariable->arraySizePtr,
		oldVariable->arraySizeFunc,
		NULL,
		NULL );

	self->allocateSelf = True;
	self->arrayPtrPtr = &self->arrayPtr;
	if ( oldVariable->isBuilt )
		Stg_Component_Build( self, NULL, True );
	if ( oldVariable->isInitialised )
		Stg_Component_Initialise( self, NULL, True );

	assert(self->offsetCount == 1);

	if ( copyValues ) {
		for ( array_I = 0 ; array_I < self->arraySize ; array_I++ ) {
			myPtr = Variable_GetStructPtr( self, array_I );
			oldPtr = Variable_GetStructPtr( oldVariable, array_I );
			memcpy( myPtr, oldPtr, self->dataSizes[0] ); 
		}
	}

	return self;
}
Example #3
0
void _SnacViscoPlastic_ConstructExtensions( void* _context, void* data ) {
	Snac_Context*				context = (Snac_Context*)_context;
	SnacViscoPlastic_Context*			contextExt = ExtensionManager_Get(
																		  context->extensionMgr,
																		  context,
																		  SnacViscoPlastic_ContextHandle );
	Snac_Element                            tmpElement;
	SnacViscoPlastic_Element*               tmpElementExt = ExtensionManager_Get(
																				 context->mesh->elementExtensionMgr,
																				 &tmpElement,
																				 SnacViscoPlastic_ElementHandle );
	char					tmpBuf[PATH_MAX];
	/* Because plastic strain is not an array by itself, we must the "complex" constructor for Variable... the info needs to be
	 * wrapped this generic way... */
	Index                                   viscoplasticOffsetCount = 1;
	SizeT                                   viscoplasticOffsets[] = { 
		(SizeT)((char*)&tmpElementExt->aps - (char*)&tmpElement) };
	Variable_DataType                       viscoplasticDataTypes[] = { Variable_DataType_Double };
	Index                                   viscoplasticDataTypeCounts[] = { 1 };

	//	#if DEBUG
	if( context->rank == 0 )		printf( "In %s()\n", __func__ );
	//	#endif
	/* Create the StGermain variable aps, which is stored on an element extension */
	Variable_New(
				 "plStrain",
				 viscoplasticOffsetCount,
				 viscoplasticOffsets,
				 viscoplasticDataTypes,
				 viscoplasticDataTypeCounts,
				 0,
				 &ExtensionManager_GetFinalSize( context->mesh->elementExtensionMgr ),
				 &context->mesh->layout->decomp->elementDomainCount,
				 (void**)&context->mesh->element,
				 context->variable_Register );
	int element_lI;        
	for( element_lI = 0; element_lI < context->mesh->elementLocalCount; element_lI++ ) {
		Snac_Element*           element = Snac_Element_At( context, element_lI );
		SnacViscoPlastic_Element*       viscoplasticElement = ExtensionManager_Get( context->mesh->elementExtensionMgr, element,
																					SnacViscoPlastic_ElementHandle );
		viscoplasticElement->aps = 0.0f;
	}//for


	/* Prepare the dump file */
	sprintf( tmpBuf, "%s/plStrain.%u", context->outputPath, context->rank );
	if( (contextExt->plStrainOut = fopen( tmpBuf, "w+" )) == NULL ) {
		assert( contextExt->plStrainOut /* failed to open file for writing */ );
		abort();
	}
	sprintf( tmpBuf, "%s/plStrainCP.%u", context->outputPath, context->rank );
	if( (contextExt->plStrainCheckpoint = fopen( tmpBuf, "w+" )) == NULL ) {
		assert( contextExt->plStrainCheckpoint /* failed to open file for writing */ );
		abort();
	}
	sprintf( tmpBuf, "%s/avgPlStrainCP.%u", context->outputPath, context->rank );
	if( (contextExt->avgPlStrainCheckpoint = fopen( tmpBuf, "w+" )) == NULL ) {
		assert( contextExt->avgPlStrainCheckpoint /* failed to open file for writing */ );
		abort();
	}
	sprintf( tmpBuf, "%s/viscosity.%u", context->outputPath, context->rank );
	if( (contextExt->viscOut = fopen( tmpBuf, "w+" )) == NULL ) {
		assert( contextExt->viscOut /* failed to open file for writing */ );
		abort();
	}
	sprintf( tmpBuf, "%s/viscosityCP.%u", context->outputPath, context->rank );
	if( (contextExt->viscCheckpoint = fopen( tmpBuf, "w+" )) == NULL ) {
		assert( contextExt->viscCheckpoint /* failed to open file for writing */ );
		abort();
	}
}
Example #4
0
void _SnacTemperature_ConstructExtensions( void* _context, void* data ) {
	Snac_Context*				context = (Snac_Context*)_context;
	SnacTemperature_Context*		contextExt = ExtensionManager_Get(
							context->extensionMgr,
							context,
							SnacTemperature_ContextHandle );
	Snac_Node				tmpNode;
	SnacTemperature_Node*			tmpNodeExt = ExtensionManager_Get(
							context->mesh->nodeExtensionMgr,
							&tmpNode,
							SnacTemperature_NodeHandle );
	Dictionary*				temperatureBCsDict;
	char					tmpBuf[PATH_MAX];
	
	/* Because temperature is not an array by itself, we must the "complex" constructor for Variable... the info needs to be
	 * wrapped this generic way... */
	Index					temperatureOffsetCount = 1;
	SizeT					temperatureOffsets[] = { /*GetOffsetOfMember( *tmpNodeExt, temperature ) };*/
		(SizeT)((char*)&tmpNodeExt->temperature - (char*)&tmpNode) };
	Variable_DataType			temperatureDataTypes[] = { Variable_DataType_Double };
	Index					temperatureDataTypeCounts[] = { 1 };
	
		
	#if DEBUG
		printf( "In %s()\n", __func__ );
	#endif

	/* Create the StGermain variable temperature, which is stored on a node extension */
	Variable_New( 
		"temperature", 
		temperatureOffsetCount, 
		temperatureOffsets, 
		temperatureDataTypes, 
		temperatureDataTypeCounts, 
		0, 
		&ExtensionManager_GetFinalSize( context->mesh->nodeExtensionMgr ),
		&context->mesh->layout->decomp->nodeDomainCount,
		(void**)&context->mesh->node,
		context->variable_Register );

	/* Register these functions for use in VCs */
	ConditionFunction_Register_Add(
		context->condFunc_Register,
		ConditionFunction_New( _SnacTemperature_Top2BottomSweep, "SnacTemperature_Top2BottomSweep" ) );
	ConditionFunction_Register_Add(
		context->condFunc_Register,
		ConditionFunction_New( _SnacTemperature_Top2BottomSweep_Spherical, "SnacTemperature_Top2BottomSweep_Spherical" ) );
	ConditionFunction_Register_Add(
		context->condFunc_Register,
		ConditionFunction_New( _SnacTemperature_Citcom_Compatible, "SnacTemperature_Citcom_Compatible" ) );

	/* Temperature variables */
	contextExt->topTemp = Dictionary_Entry_Value_AsDouble(
		Dictionary_GetDefault( context->dictionary, "topTemp", Dictionary_Entry_Value_FromDouble( 0.0f ) ) );

	contextExt->bottomTemp = Dictionary_Entry_Value_AsDouble(
		Dictionary_GetDefault( context->dictionary, "bottomTemp", Dictionary_Entry_Value_FromDouble( 1300.0f ) ) );

	/* Build the temperature IC and BC managers */
	temperatureBCsDict = Dictionary_Entry_Value_AsDictionary( Dictionary_Get( context->dictionary, "temperatureBCs" ) );
	contextExt->temperatureBCs = CompositeVC_New("tempBC",
		context->variable_Register,
		context->condFunc_Register,
		temperatureBCsDict,
		context->mesh );

	/* Prepare the dump and checkpoint file */
	sprintf( tmpBuf, "%s/temperature.%u", context->outputPath, context->rank );
	if( (contextExt->temperatureOut = fopen( tmpBuf, "w+" )) == NULL ) {
		assert( contextExt->temperatureOut /* failed to open file for writing */ );
		abort();
	}
	sprintf( tmpBuf, "%s/temperatureCP.%u", context->outputPath, context->rank );
	if( (contextExt->temperatureCheckpoint = fopen( tmpBuf, "w+" )) == NULL ) {
		assert( contextExt->temperatureCheckpoint /* failed to open file for writing */ );
		abort();
	}
}