void Mesh_CentroidType_SetElementMesh( void* centroidType, void* mesh ) {
	Mesh_CentroidType*	self = (Mesh_CentroidType*)centroidType;

	assert( self && Stg_CheckType( self, Mesh_CentroidType ) );
	assert( !mesh || Stg_CheckType( mesh, Mesh ) );

	self->elMesh = mesh;
}
Exemple #2
0
void SROpGenerator_SetFineVariable( void* srOpGenerator, void* _variable ) {
	SROpGenerator*	self = (SROpGenerator*)srOpGenerator;
	FeVariable*	variable = (FeVariable*)_variable;

	assert( self && Stg_CheckType( self, SROpGenerator ) );
	assert( !variable || Stg_CheckType( variable, FeVariable ) );

	SROpGenerator_DestructMeshes( self );
	self->fineVar = variable;
}
void C0SphericalGenerator_Generate( void* generator, void* _mesh ) {
	C0SphericalGenerator*	self = (C0SphericalGenerator*)generator;
	FeMesh*		mesh = (FeMesh*)_mesh;

	assert( self && Stg_CheckType( self, C0SphericalGenerator ) );
	assert( mesh && Stg_CheckType( mesh, FeMesh ) );

	C0Generator_BuildTopology( (C0Generator*)self, mesh );
	C0Generator_BuildGeometry( (C0Generator*) self, mesh );
	C0Generator_BuildElementTypes( (C0Generator*) self, mesh );

	mesh->elementMesh = True; // ie this mesh defines the elements, not the nodes
}
void Mesh_SetAlgorithms( void* mesh, void* algorithms ) {
	Mesh*	self = (Mesh*)mesh;

	assert( self && Stg_CheckType( self, Mesh ) );

	FreeObject( self->algorithms );
	if( algorithms ) {
		assert( Stg_CheckType( algorithms, Mesh_Algorithms ) );
		self->algorithms = algorithms;
	}
	else
		self->algorithms = Mesh_Algorithms_New( "", NULL );

	Mesh_Algorithms_SetMesh( self->algorithms, self );
}
void MultigridSolver_UpdateOps( MultigridSolver* self ) {
	MultigridSolver_Level*	level;
	//Matrix			**pOps, **rOps;
	Mat			*pOps, *rOps;
	unsigned		l_i;

	assert( self && Stg_CheckType( self, MultigridSolver ) );

	MGOpGenerator_Generate( self->opGen, &pOps, &rOps );
	for( l_i = 1; l_i < self->nLevels; l_i++ ) {
		level = self->levels + l_i;

		//if( !level->P ) {
		if( level->P == PETSC_NULL ) {
			level->P = pOps[l_i];
			//Stg_Class_AddRef( level->P );
		}
		else
			Stg_MatDestroy(&pOps[l_i] );
			//Stg_Class_RemoveRef( pOps[l_i] );


		//if( !level->R ) {
		if( level->R == PETSC_NULL ) {
			level->R = rOps[l_i];
			//Stg_Class_AddRef( level->R );
		}
		else
			Stg_MatDestroy(&rOps[l_i] );
			//Stg_Class_RemoveRef( rOps[l_i] );
	}

	FreeArray( pOps );
	FreeArray( rOps );
}
unsigned MultigridSolver_GetNumLevels( void* matrixSolver ) {
	MultigridSolver*	self = (MultigridSolver*)matrixSolver;

	assert( self && Stg_CheckType( self, MultigridSolver ) );

	return self->nLevels;
}
void MultigridSolver_SetLevelDownSolver( void* matrixSolver, unsigned levelInd, void* solver ) {
	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
	MultigridSolver_Level*	level;

	assert( self && Stg_CheckType( self, MultigridSolver ) );
	assert( levelInd < self->nLevels );
	//assert( !solver || Stg_CheckType( solver, MatrixSolver ) );

	level = self->levels + levelInd;
	if( level->downSolver != solver )
		self->solversChanged = True;
	if( level->downSolver ) {
	//	Stg_Class_RemoveRef( level->downSolver );
		if( level->downSolver->ksp != PETSC_NULL )         Stg_KSPDestroy(&level->downSolver->ksp );
		if( level->downSolver->matrix != PETSC_NULL )      Stg_MatDestroy(&level->downSolver->matrix );
		if( level->downSolver->inversion != PETSC_NULL )   Stg_MatDestroy(&level->downSolver->inversion );
		if( level->downSolver->residual != PETSC_NULL )    Stg_VecDestroy(&level->downSolver->residual );
		if( level->downSolver->curRHS != PETSC_NULL )      Stg_VecDestroy(&level->downSolver->curRHS );
		if( level->downSolver->curSolution != PETSC_NULL ) Stg_VecDestroy(&level->downSolver->curSolution );
		free( level->downSolver );
	}
	level->downSolver = solver;
	//if( solver )
	//	Stg_Class_AddRef( solver );
}
void MultigridSolver_SetLevels( void* matrixSolver, unsigned nLevels ) {
	MultigridSolver*	self = (MultigridSolver*)matrixSolver;
	unsigned		nProcs;
	unsigned		l_i;

	assert( self && Stg_CheckType( self, MultigridSolver ) );

	MultigridSolver_DestructLevels( self );

	self->nLevels = nLevels;
	self->levels = AllocArray( MultigridSolver_Level, nLevels );
	//MPI_Comm_size( self->comm, (int*)&nProcs );
	MPI_Comm_size( self->mgData->comm, (int*)&nProcs );

	for( l_i = 0; l_i < nLevels; l_i++ ) {
		MultigridSolver_Level*	level = self->levels + l_i;

		//level->downSolver = NULL;
		level->downSolver = malloc( sizeof( MGSolver_PETScData ) );
		level->nDownIts = 1;
		//level->upSolver = NULL;
		level->upSolver = malloc( sizeof( MGSolver_PETScData ) );
		level->nUpIts = l_i ? 1 : 0;
		level->nCycles = 1;

		level->A = NULL;
		level->R = NULL;
		level->P = NULL;

		level->workRHS = NULL;
		level->workSol = NULL;
	}
}
double MultigridSolver_GetResidualNorm( void* matrixSolver ) {
	MultigridSolver*	self = (MultigridSolver*)matrixSolver;

	assert( self && Stg_CheckType( self, MultigridSolver ) );

	return _GetResidualNorm( self->outerSolver );
}
unsigned MultigridSolver_GetMaxIterations( void* matrixSolver ) {
	MultigridSolver*	self = (MultigridSolver*)matrixSolver;

	assert( self && Stg_CheckType( self, MultigridSolver ) );

	return self->maxIts;
}
void MultigridSolver_SetUseInitialSolution( void* matrixSolver, Bool state ) {
	MultigridSolver*	self = (MultigridSolver*)matrixSolver;

	assert( self && Stg_CheckType( self, MultigridSolver ) );

	self->useInitial = state;
}
void MultigridSolver_SetMaxIterations( void* matrixSolver, unsigned nIterations ) {
	MultigridSolver*	self = (MultigridSolver*)matrixSolver;

	assert( self && Stg_CheckType( self, MultigridSolver ) );

	self->maxIts = nIterations;
}
void _LaplacianStiffnessMatrixTerm_AssembleElement( 
		void*                                              matrixTerm,
		StiffnessMatrix*                                   stiffnessMatrix, 
		Element_LocalIndex                                 lElement_I, 
		SystemLinearEquations*                             sle,
		FiniteElementContext*                              context,
		double**                                           elStiffMat ) 
{
	LaplacianStiffnessMatrixTerm*       self         = Stg_CheckType( matrixTerm, LaplacianStiffnessMatrixTerm );
	Swarm*                              swarm        = self->integrationSwarm;
	FeVariable*                         variable1    = stiffnessMatrix->rowVariable;
	Dimension_Index                     dim          = stiffnessMatrix->dim;
	IntegrationPoint*                   currIntegrationPoint;
	double*                             xi;
	double                              weight;
	Particle_InCellIndex                cParticle_I, cellParticleCount;
	Index                               nodesPerEl;
	Index                               i,j;
	Dimension_Index                     dim_I;
	double**                            GNx;
	double                              detJac;
	
	Cell_Index                          cell_I;
	ElementType*                        elementType;
	
	/* Set the element type */
	elementType = FeMesh_GetElementType( variable1->feMesh, lElement_I );
	nodesPerEl = elementType->nodeCount;
	
	if( nodesPerEl > self->max_nElNodes ) {
		/* reallocate */
		self->GNx = ReallocArray2D( self->GNx, double, dim, nodesPerEl );
		self->max_nElNodes = nodesPerEl;
	}
Bool Mesh_Search( void* mesh, double* point, MeshTopology_Dim* topodim, unsigned* ind ) {
	Mesh*	self = (Mesh*)mesh;

	assert( self && Stg_CheckType( self, Mesh ) );

	return Mesh_Algorithms_Search( self->algorithms, point, topodim, ind );
}
void _VectorAssemblyTerm_NA__Fn_AssembleElement( void* forceTerm, ForceVector* forceVector, Element_LocalIndex lElement_I, double* elForceVec ) {
   VectorAssemblyTerm_NA__Fn* self = Stg_CheckType( forceTerm, VectorAssemblyTerm_NA__Fn );
   IntegrationPointsSwarm*    swarm = (IntegrationPointsSwarm*)self->integrationSwarm;
   Dimension_Index            dim = forceVector->dim;
   IntegrationPoint*          particle;
   FeMesh*                    mesh;
   double*                    xi;
   Particle_InCellIndex       cParticle_I;
   Particle_InCellIndex       cellParticleCount;
   Element_NodeIndex          nodesPerEl;
   Node_ElementLocalIndex     A;
   ElementType*               elementType;
   Dof_Index                  dofsPerNode, i;
   Cell_Index                 cell_I;
   double                     detJac;
   double                     factor;
   double                     N[27];

   /* Since we are integrating over the velocity mesh - we want the velocity mesh here and not the temperature mesh */
   mesh = forceVector->feVariable->feMesh;

   VectorAssemblyTerm_NA__Fn_cppdata* cppdata = (VectorAssemblyTerm_NA__Fn_cppdata*)self->cppdata;
    
   debug_dynamic_cast<ParticleInCellCoordinate*>(cppdata->input->localCoord())->index() = lElement_I;  // set the elementId as the owning cell for the particleCoord
   cppdata->input->index()   = lElement_I;  // set the elementId for the fem coordinate

   /* Set the element type */
   elementType = FeMesh_GetElementType( mesh, lElement_I );
   nodesPerEl  = elementType->nodeCount;
   

   /* assumes constant number of dofs per element */
   dofsPerNode = forceVector->feVariable->fieldComponentCount;

   cell_I = CellLayout_MapElementIdToCellId( swarm->cellLayout, lElement_I );
   cellParticleCount = swarm->cellParticleCountTbl[ cell_I ];

   for ( cParticle_I = 0 ; cParticle_I < cellParticleCount ; cParticle_I++ ) {
      debug_dynamic_cast<ParticleInCellCoordinate*>(cppdata->input->localCoord())->particle_cellId(cParticle_I);  // set the particleCoord cellId
      particle = (IntegrationPoint*) Swarm_ParticleInCellAt( swarm, cell_I, cParticle_I );
      xi       = particle->xi;

      /* Calculate Determinant of Jacobian and Shape Functions */
      if (self->geometryMesh)
         detJac = ElementType_JacobianDeterminant( FeMesh_GetElementType( self->geometryMesh, lElement_I ), self->geometryMesh, lElement_I, xi, dim );
      else
         detJac = ElementType_JacobianDeterminant( elementType, mesh, lElement_I, xi, dim );

      ElementType_EvaluateShapeFunctionsAt( elementType, xi, N );

      /* evaluate function */
      const FunctionIO* funcout = debug_dynamic_cast<const FunctionIO*>(cppdata->func(cppdata->input.get()));

      factor = detJac * particle->weight;
      for( A = 0 ; A < nodesPerEl ; A++ )
         for( i = 0 ; i < dofsPerNode ; i++ )
            elForceVec[A * dofsPerNode + i ] += factor * funcout->at<double>(i) * N[A] ;

   }
}
void PETScMGSolver_DestructLevels( PETScMGSolver* self ) {
	unsigned	l_i;

	assert( self && Stg_CheckType( self, PETScMGSolver ) );

	for( l_i = 0; l_i < self->nLevels; l_i++ ) {
		PETScMGSolver_Level*	level = self->levels + l_i;

        if(level->R == level->P){
          if( level->R != PETSC_NULL ){
            Stg_MatDestroy(&level->R );
            level->P =  PETSC_NULL;
          }
        }else{/* not same so test individually */
          if( level->R != PETSC_NULL ) Stg_MatDestroy(&level->R );
          if( level->P != PETSC_NULL ) Stg_MatDestroy(&level->P );
        }

        if( level->workRes )
          Stg_VecDestroy(&level->workRes );
        if( level->workSol )
          Stg_VecDestroy(&level->workSol );
        if( level->workRHS )
          Stg_VecDestroy(&level->workRHS );
	}

	KillArray( self->levels );
	self->nLevels = 0;
	self->solversChanged = True;
	self->opsChanged = True;
}
void RegularTrilinear_ConvertGlobalCoordToElLocal( void* elementType, void* mesh, unsigned element, 
						   const double* globalCoord, double* localCoord )
{
	RegularTrilinear*	self = (RegularTrilinear*)elementType;
	unsigned		nInc, *inc;
	double*			vert[2];
	double			w;

	assert( self && Stg_CheckType( self, RegularTrilinear ) );

	Mesh_GetIncidence( mesh, MT_VOLUME, element, MT_VERTEX, self->inc );
	nInc = IArray_GetSize( self->inc );
	inc = IArray_GetSize( self->inc );

	vert[0] = Mesh_GetVertex( mesh, inc[0] );
	vert[1] = Mesh_GetVertex( mesh, inc[7] );
	w = vert[1][0] - vert[0][0];
	localCoord[0] = 2.0 * (globalCoord[0] - vert[0][0]) / w - 1.0;
	w = vert[1][1] - vert[0][1];
	localCoord[1] = 2.0 * (globalCoord[1] - vert[0][1]) / w - 1.0;
	w = vert[1][2] - vert[0][2];
	localCoord[2] = 2.0 * (globalCoord[2] - vert[0][2]) / w - 1.0;

	assert( Num_InRange( localCoord[0], -1.0, 1.0 ) );
	assert( Num_InRange( localCoord[1], -1.0, 1.0 ) );
	assert( Num_InRange( localCoord[2], -1.0, 1.0 ) );
}
unsigned PETScMGSolver_GetNumLevels( void* matrixSolver ) {
	PETScMGSolver*	self = (PETScMGSolver*)matrixSolver;

	assert( self && Stg_CheckType( self, PETScMGSolver ) );

	return self->nLevels;
}
void PETScMGSolver_UpdateOps( PETScMGSolver* self ) {
	PC		pc;
	Mat		*pOps, *rOps;
	PetscErrorCode	ec;
	unsigned	l_i;

	assert( self && Stg_CheckType( self, PETScMGSolver ) );

	ec = KSPGetPC( self->mgData->ksp, &pc );
	CheckPETScError( ec );

	MGOpGenerator_Generate( self->opGen, (Mat**)&pOps, (Mat**)&rOps );

	for( l_i = 1; l_i < self->nLevels; l_i++ ) {
		//assert( Stg_CheckType( pOps[l_i], PETScMatrix ) );
		//assert( Stg_CheckType( rOps[l_i], PETScMatrix ) );

		PETScMGSolver_SetProlongation( self, l_i, pOps[l_i] );
#if( ((PETSC_VERSION_MAJOR==2) && (PETSC_VERSION_MINOR==3) && (PETSC_VERSION_SUBMINOR==3)) || (PETSC_VERSION_MAJOR==3) )
			ec = PCMGSetInterpolation( pc, l_i, pOps[l_i] );
#else
			ec = PCMGSetInterpolate( pc, l_i, pOps[l_i] );
#endif
		CheckPETScError( ec );

		PETScMGSolver_SetRestriction( self, l_i, rOps[l_i] );
		ec = PCMGSetRestriction( pc, l_i, rOps[l_i] );
		CheckPETScError( ec );
	}

	FreeArray( pOps );
	FreeArray( rOps );
}
void _PETScMGSolver_AssignFromXML( void* matrixSolver, Stg_ComponentFactory* cf, void* data ) {
	PETScMGSolver*	self = (PETScMGSolver*)matrixSolver;
	Bool		pure;
	unsigned	nLevels;
	unsigned	nCycles;
	unsigned	nDownIts, nUpIts;

	assert( self && Stg_CheckType( self, PETScMGSolver ) );
	assert( cf );

	//_PETScMatrixSolver_AssignFromXML( self, cf, data );

	pure = Stg_ComponentFactory_GetBool( cf, self->name, (Dictionary_Entry_Key)"pure", False  );
	nLevels = Stg_ComponentFactory_GetUnsignedInt( cf, self->name, (Dictionary_Entry_Key)"levels", 1  );
	nCycles = Stg_ComponentFactory_GetUnsignedInt( cf, self->name, (Dictionary_Entry_Key)"cycles", 1  );
	nDownIts = Stg_ComponentFactory_GetUnsignedInt( cf, self->name, (Dictionary_Entry_Key)"downIterations", 1  );
	nUpIts = Stg_ComponentFactory_GetUnsignedInt( cf, self->name, (Dictionary_Entry_Key)"upIterations", 1  );
   
   Journal_Firewall( nLevels>1, NULL, "In func %s: Multigrid required mgLevels>1", __func__ );

	self->pure = pure;
	PETScMGSolver_SetLevels( self, nLevels );
	PETScMGSolver_SetLevelCycles( self, nLevels - 1, nCycles );
	PETScMGSolver_SetAllDownIterations( self, nDownIts );
	PETScMGSolver_SetAllUpIterations( self, nUpIts );

	self->opGen = Stg_ComponentFactory_ConstructByKey( cf, self->name, (Dictionary_Entry_Key)"opGenerator", MGOpGenerator, True, data  );
	MGOpGenerator_SetMatrixSolver( self->opGen, self );
	MGOpGenerator_SetNumLevels( self->opGen, nLevels );
}
void _SphericalGenerator_GenElementTypes( void* meshGenerator, Mesh* mesh )
{
   SphericalGenerator*	self = (SphericalGenerator*)meshGenerator;
   Stream*			stream;
   unsigned		nDomainEls;
   unsigned		e_i;

   assert( self && Stg_CheckType( self, SphericalGenerator ) );

   stream = Journal_Register( Info_Type, (Name)self->type  );
   Journal_Printf( stream, "Generating element types...\n" );
   Stream_Indent( stream );

   mesh->nElTypes = 1;
   mesh->elTypes = Memory_Alloc_Array( Mesh_ElementType*, mesh->nElTypes, "Mesh::elTypes" );
   mesh->elTypes[0] = (Mesh_ElementType*)Mesh_HexType_New();
   Mesh_ElementType_SetMesh( mesh->elTypes[0], mesh );
   nDomainEls = Mesh_GetDomainSize( mesh, Mesh_GetDimSize( mesh ) );
   mesh->elTypeMap = Memory_Alloc_Array( unsigned, nDomainEls, "Mesh::elTypeMap" );
   for( e_i = 0; e_i < nDomainEls; e_i++ )
      mesh->elTypeMap[e_i] = 0;

   Mesh_SetAlgorithms( mesh, Mesh_SphericalAlgorithms_New( "", NULL ) );

   MPI_Barrier( self->mpiComm );
   Journal_Printf( stream, "... element types are '%s',\n", mesh->elTypes[0]->type );
   Journal_Printf( stream, "... mesh algorithm type is '%s',\n", mesh->algorithms->type );
   Journal_Printf( stream, "... done.\n" );
   Stream_UnIndent( stream );
}
void _PETScMGSolver_Init( PETScMGSolver* self ) {
	assert( self && Stg_CheckType( self, PETScMGSolver ) );

	self->mgData = malloc( sizeof( MGSolver_PETScData ) );

	/* from the depreciated MatrixSolver_Init func */
	self->mgData->comm = MPI_COMM_WORLD;
	KSPCreate( MPI_COMM_WORLD, &self->mgData->ksp );
	self->mgData->matrix = PETSC_NULL;
	self->mgData->inversion = PETSC_NULL;
	self->mgData->residual = PETSC_NULL;
	self->mgData->expiredResidual = True;
	self->mgData->matrixChanged = True;
        self->mgData->optionsReady = False;

	self->mgData->curRHS = PETSC_NULL;
	self->mgData->curSolution = PETSC_NULL;
	/* end of MatrixSolver_Init stuff */

	self->nLevels = 0;
	self->levels = NULL;
	self->opGen = NULL;
	self->solversChanged = True;
	self->opsChanged = True;
}
Exemple #23
0
void SROpGenerator_GenMeshes( SROpGenerator* self ) {
	unsigned	nLevels;
	unsigned	l_i;

	assert( self && Stg_CheckType( self, SROpGenerator ) );

	nLevels = self->nLevels;
	self->meshes = AllocArray( Mesh*, nLevels );
	memset( self->meshes, 0, nLevels * sizeof(Mesh*) );
	self->topMaps = AllocArray( unsigned*, nLevels );
	memset( self->topMaps, 0, nLevels * sizeof(unsigned*) );
	self->eqNums = AllocArray( unsigned**, nLevels );
	memset( self->eqNums, 0, nLevels * sizeof(unsigned**) );
	self->nLocalEqNums = AllocArray( unsigned, nLevels );
	memset( self->nLocalEqNums, 0, nLevels * sizeof(unsigned) );
	self->eqNumBases = AllocArray( unsigned, nLevels );
	memset( self->eqNumBases, 0, nLevels * sizeof(unsigned) );

	self->meshes[nLevels - 1] = (Mesh*)self->fineEqNum->feMesh;
	self->eqNumBases[nLevels - 1] = self->fineEqNum->firstOwnedEqNum;
	for( l_i = nLevels - 2; l_i < nLevels; l_i-- ) {
		SROpGenerator_GenLevelMesh( self, l_i );
		SROpGenerator_GenLevelTopMap( self, l_i );
		SROpGenerator_GenLevelEqNums( self, l_i );
	}
}
Exemple #24
0
Bool SROpGenerator_HasExpired( void* srOpGenerator ) {
	SROpGenerator*	self = (SROpGenerator*)srOpGenerator;

	assert( self && Stg_CheckType( self, SROpGenerator ) );

	return False;
}
void _MeshGenerator_SetDimSize( void* meshGenerator, unsigned nDims ) {
	MeshGenerator*	self = (MeshGenerator*)meshGenerator;
	unsigned	d_i, d_j;

	assert( self && Stg_CheckType( self, MeshGenerator ) );

	self->nDims = nDims;
	self->enabledDims = ReallocArray( self->enabledDims, Bool, nDims + 1 );
	self->enabledInc = ReallocArray2D( self->enabledInc, Bool, nDims + 1, nDims + 1 );
	for( d_i = 0; d_i <= nDims; d_i++ ) {
		if( d_i == 0 || d_i == nDims )
			self->enabledDims[d_i] = True;
		else
			self->enabledDims[d_i] = False;
		for( d_j = 0; d_j <= nDims; d_j++ ) {
			if( (d_i == 0 || d_i == nDims) && (d_j == 0 || d_j == nDims) ) {
				if( d_i == d_j && d_j == nDims )
					self->enabledInc[d_i][d_j] = False;
				else
					self->enabledInc[d_i][d_j] = True;
			}
			else
				self->enabledInc[d_i][d_j] = False;
		}
	}
}
void MultigridSolver_DestructLevels( MultigridSolver* self ) {
	unsigned	l_i;

	assert( self && Stg_CheckType( self, MultigridSolver ) );

	for( l_i = 0; l_i < self->nLevels; l_i++ ) {
		MultigridSolver_Level*	level = self->levels + l_i;

		if( level->downSolver ) {
			//Stg_Class_RemoveRef( MatrixSolver_GetMatrix( level->downSolver ) );
			//Stg_Class_RemoveRef( level->downSolver );
			if( level->downSolver->ksp != PETSC_NULL )         Stg_KSPDestroy(&level->downSolver->ksp );
			if( level->downSolver->matrix != PETSC_NULL )      Stg_MatDestroy(&level->downSolver->matrix );
			if( level->downSolver->inversion != PETSC_NULL )   Stg_MatDestroy(&level->downSolver->inversion );
			if( level->downSolver->residual != PETSC_NULL )    Stg_VecDestroy(&level->downSolver->residual );
			if( level->downSolver->curRHS != PETSC_NULL )      Stg_VecDestroy(&level->downSolver->curRHS );
			if( level->downSolver->curSolution != PETSC_NULL ) Stg_VecDestroy(&level->downSolver->curSolution );
			free( level->downSolver );
		}
		if( level->upSolver ) {
			//Stg_Class_RemoveRef( MatrixSolver_GetMatrix( level->upSolver ) );
			//Stg_Class_RemoveRef( level->upSolver );
			if( level->upSolver->ksp != PETSC_NULL )         Stg_KSPDestroy(&level->upSolver->ksp );
			if( level->upSolver->matrix != PETSC_NULL )      Stg_MatDestroy(&level->upSolver->matrix );
			if( level->upSolver->inversion != PETSC_NULL )   Stg_MatDestroy(&level->upSolver->inversion );
			if( level->upSolver->residual != PETSC_NULL )    Stg_VecDestroy(&level->upSolver->residual );
			if( level->upSolver->curRHS != PETSC_NULL )      Stg_VecDestroy(&level->upSolver->curRHS );
			if( level->upSolver->curSolution != PETSC_NULL ) Stg_VecDestroy(&level->upSolver->curSolution );
			free( level->upSolver );
		}
		if( level->R != PETSC_NULL )
			//Stg_Class_RemoveRef( level->R );
			Stg_MatDestroy(&level->R );
		if( level->P != PETSC_NULL )
			//Stg_Class_RemoveRef( level->P );
			Stg_MatDestroy(&level->P );
		if( level->workRHS != PETSC_NULL )
			//Stg_Class_RemoveRef( level->workRHS );
			Stg_VecDestroy(&level->workRHS );
		if( level->workSol != PETSC_NULL )
			//Stg_Class_RemoveRef( level->workSol );
			Stg_VecDestroy(&level->workSol );
	}

	KillArray( self->levels );
	self->nLevels = 0;
	self->solversChanged = True;
	self->opsChanged = True;

	/* Temporary. */
	//KillObject( self->outerSolver );
	if( self->outerSolver->ksp )         Stg_KSPDestroy(&self->outerSolver->ksp );
	if( self->outerSolver->matrix )      Stg_MatDestroy(&self->outerSolver->matrix );
	if( self->outerSolver->inversion )   Stg_MatDestroy(&self->outerSolver->inversion );
	if( self->outerSolver->residual )    Stg_VecDestroy(&self->outerSolver->residual );
	if( self->outerSolver->curRHS )      Stg_VecDestroy(&self->outerSolver->curRHS );
	if( self->outerSolver->curSolution ) Stg_VecDestroy(&self->outerSolver->curSolution );
	free( self->outerSolver );
}
Exemple #27
0
void _SwarmDump_Execute( void* swarmDump, void* data ) {
	SwarmDump*	      self                = (SwarmDump*)     swarmDump;
	AbstractContext*  context             = Stg_CheckType( data, AbstractContext );
	Stream*           stream              = Journal_Register( MPIStream_Type, Swarm_Type );
	Particle_Index    particleLocalCount;
	SizeT             particleSize;
	Name              filename;
	Index             swarm_I;
	Swarm*            swarm;
	Stream*           info = Journal_Register( Info_Type, self->type );
	Processor_Index   rank_I;

	Journal_DPrintf( info, "Proc %d: beginning Swarm binary checkpoint in %s():\n", self->swarmList[0]->myRank, __func__ );
	Stream_Indent( info );
	
	for ( swarm_I = 0 ; swarm_I < self->swarmCount ; swarm_I++ ) {
		swarm = self->swarmList[ swarm_I ];
		particleLocalCount = swarm->particleLocalCount;
		particleSize = (SizeT) swarm->particleExtensionMgr->finalSize;

		if ( self->newFileEachTime ) {
			if ( strlen(context->checkPointPrefixString) > 0 ) {
				Stg_asprintf( &filename, "%s/%s.%s.%05d.dat", context->outputPath,
					context->checkPointPrefixString, swarm->name, context->timeStep );
			}
			else {
				Stg_asprintf( &filename, "%s/%s.%05d.dat", context->outputPath,
					swarm->name, context->timeStep );
			}
		}	
		else { 
			if ( strlen(context->checkPointPrefixString) > 0 ) {
				Stg_asprintf( &filename, "%s/%s.%s.dat", context->outputPath,
					context->checkPointPrefixString, swarm->name );
			}
			else {
				Stg_asprintf( &filename, "%s/%s.dat", context->outputPath, swarm->name );
			}
		}	

		for ( rank_I = 0; rank_I < swarm->nProc; rank_I++ ) {
			if ( swarm->myRank == rank_I ) {
				Journal_DPrintf( info, "Proc %d: for swarm \"%s\", dumping its %u particles of size %u bytes "
					"each (= %g bytes total) to file %s\n", swarm->myRank, swarm->name, particleLocalCount,
					particleSize, (float)(particleLocalCount * particleSize), filename );
			}	
			MPI_Barrier( swarm->comm );
		}

		Stream_RedirectFile( stream, filename );

		MPIStream_WriteAllProcessors( stream, swarm->particles, particleSize, (SizeT) particleLocalCount, swarm->comm );

		Stream_CloseFile( stream );
		Memory_Free( filename );
	}
	Stream_UnIndent( info );
	Journal_DPrintf( info, "Proc %d: finished Swarm binary checkpoint.\n", self->swarmList[0]->myRank );
}
void _PETScMGSolver_Initialise( void* matrixSolver, void* data ) {
	PETScMGSolver*	self = (PETScMGSolver*)matrixSolver;

	assert( self && Stg_CheckType( self, PETScMGSolver ) );

	if( self->opGen )
		Stg_Component_Initialise( self->opGen, data, False );
}
Exemple #29
0
void _SROpGenerator_Delete( void* srOpGenerator ) {
	SROpGenerator*	self = (SROpGenerator*)srOpGenerator;

	assert( self && Stg_CheckType( self, SROpGenerator ) );

	/* Delete the parent. */
	_MGOpGenerator_Delete( self );
}
void _MaterialFeVariable_Init( MaterialFeVariable* self, Material* material ) {
   IntegrationPointsSwarm* swarm;

   /* Assign Pointers */
   swarm = Stg_CheckType( self->assemblyTerm->integrationSwarm, IntegrationPointsSwarm );
   self->picIntegrationPoints = swarm;
   self->material = material;
}