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 ); } }
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]; } } } }