void _MeshParticleLayout_InitialiseParticlesOfCell( void* meshParticleLayout, void* _swarm, Cell_Index cell_I ) {
	MeshParticleLayout*	self = (MeshParticleLayout*)meshParticleLayout;
	Swarm*                      	swarm   		= (Swarm*)_swarm;
	Particle_InCellIndex		particlesThisCell 	= swarm->cellParticleCountTbl[cell_I];
	Particle_InCellIndex		cParticle_I 		= 0;
	GlobalParticle*	        	particle 		= NULL;
	double				        lCoord[3];
	unsigned		         	dim_i;
    unsigned	         	    nDims = Mesh_GetDimSize( self->mesh );


	for( cParticle_I = 0; cParticle_I < particlesThisCell; cParticle_I++ ) {	
		particle = (GlobalParticle*)Swarm_ParticleInCellAt( swarm, cell_I, cParticle_I );
		particle->owningCell = cell_I;

        if (self->filltype == 0 ) {
            for( dim_i = 0; dim_i < nDims; dim_i++ )
                lCoord[dim_i] = SobolGenerator_GetNextNumber_WithMinMax( self->sobolGenerator[dim_i], -1.0, +1.0 );
        } else if (self->filltype == 1){
            for( dim_i = 0; dim_i < nDims; dim_i++ )
                lCoord[dim_i] = Swarm_Random_Random_WithMinMax( -1.0, +1.0 );
        } else
            Journal_Firewall(
				NULL,
				NULL,
				"In func %s: Invalid fill type setting.  Must be 0 (space filler), or 1 (random).",
				__func__ );


		FeMesh_CoordLocalToGlobal( self->mesh, cell_I, lCoord, particle->coord );
	}
}
Ejemplo n.º 2
0
void _MeshParticleLayout_InitialiseParticlesOfCell( void* meshParticleLayout, void* _swarm, Cell_Index cell_I ) {
	MeshParticleLayout*	self = (MeshParticleLayout*)meshParticleLayout;
	Swarm*              	swarm = (Swarm*)_swarm;
	Coord               	min = {-1.0, -1.0, -1.0};
	Coord               	max = {1.0, 1.0, 1.0};
	Coord			localCoord;
	double			basis[8];
	unsigned		nDims = self->mesh->nSpaceDims;
	Coord*			nodeCoords = self->mesh->nodeCoord;
	unsigned		nNodes, *incNodes;
	Particle_InCellIndex	particlesThisCell = swarm->cellParticleCountTbl[cell_I];
	Particle_InCellIndex	cParticle_I = 0;
	GlobalParticle*	        particle = NULL;
	unsigned		d_i, n_i;

	assert( nDims == 2 || nDims == 3 );

	nNodes = self->mesh->elementNodeCountTbl[cell_I];
	incNodes = self->mesh->elementNodeTbl[cell_I];

	for ( cParticle_I = 0; cParticle_I < particlesThisCell; cParticle_I++ ) {	
		particle = (GlobalParticle*)Swarm_ParticleInCellAt( swarm, cell_I, cParticle_I );
		particle->owningCell = cell_I;
		
		for ( d_i = 0; d_i < nDims; d_i++ ) {
			localCoord[d_i] = Swarm_Random_Random_WithMinMax( min[d_i], max[d_i] );
		}

		/* Convert the coordinate to global. Assumes quad or hex mesh. */
		if( nDims == 2 ) {
			basis[0] = 0.25 * (1.0 - localCoord[0]) * (1.0 - localCoord[1]);
			basis[1] = 0.25 * (1.0 + localCoord[0]) * (1.0 - localCoord[1]);
			basis[3] = 0.25 * (1.0 - localCoord[0]) * (1.0 + localCoord[1]);
			basis[2] = 0.25 * (1.0 + localCoord[0]) * (1.0 + localCoord[1]);
		}
		else {
			basis[0] = 0.125 * (1.0 - localCoord[0]) * (1.0 - localCoord[1]) * (1.0 - localCoord[2]);
			basis[1] = 0.125 * (1.0 + localCoord[0]) * (1.0 - localCoord[1]) * (1.0 - localCoord[2]);
			basis[3] = 0.125 * (1.0 - localCoord[0]) * (1.0 + localCoord[1]) * (1.0 - localCoord[2]);
			basis[2] = 0.125 * (1.0 + localCoord[0]) * (1.0 + localCoord[1]) * (1.0 - localCoord[2]);
			basis[4] = 0.125 * (1.0 - localCoord[0]) * (1.0 - localCoord[1]) * (1.0 + localCoord[2]);
			basis[5] = 0.125 * (1.0 + localCoord[0]) * (1.0 - localCoord[1]) * (1.0 + localCoord[2]);
			basis[7] = 0.125 * (1.0 - localCoord[0]) * (1.0 + localCoord[1]) * (1.0 + localCoord[2]);
			basis[6] = 0.125 * (1.0 + localCoord[0]) * (1.0 + localCoord[1]) * (1.0 + localCoord[2]);
		}

		memset( particle->coord, 0, sizeof(double) * nDims );
		for( d_i = 0; d_i < nDims; d_i++ ) {
			for( n_i = 0; n_i < nNodes; n_i++ ) {
				particle->coord[d_i] += basis[n_i] * nodeCoords[incNodes[n_i]][d_i];
			}
		}
	}
}