224 const unsigned char*
const cellid_transpose,
228 Realf* blockDatas[VLASOV_STENCIL_WIDTH * 2 + 1];
229 for (
int b = -VLASOV_STENCIL_WIDTH; b <= VLASOV_STENCIL_WIDTH; ++b) {
230 const SpatialCell* srcCell = source_neighbors[b + VLASOV_STENCIL_WIDTH];
233 blockDatas[b + VLASOV_STENCIL_WIDTH] = srcCell->
get_data(blockLID,popID);
235 _mm_prefetch((
char *)(blockDatas[b + VLASOV_STENCIL_WIDTH]), _MM_HINT_T0);
236 _mm_prefetch((
char *)(blockDatas[b + VLASOV_STENCIL_WIDTH]) + 64, _MM_HINT_T0);
237 _mm_prefetch((
char *)(blockDatas[b + VLASOV_STENCIL_WIDTH]) + 128, _MM_HINT_T0);
238 _mm_prefetch((
char *)(blockDatas[b + VLASOV_STENCIL_WIDTH]) + 192, _MM_HINT_T0);
241 _mm_prefetch((
char *)(blockDatas[b + VLASOV_STENCIL_WIDTH]) + 256, _MM_HINT_T0);
242 _mm_prefetch((
char *)(blockDatas[b + VLASOV_STENCIL_WIDTH]) + 320, _MM_HINT_T0);
243 _mm_prefetch((
char *)(blockDatas[b + VLASOV_STENCIL_WIDTH]) + 384, _MM_HINT_T0);
244 _mm_prefetch((
char *)(blockDatas[b + VLASOV_STENCIL_WIDTH]) + 448, _MM_HINT_T0);
248 blockDatas[b + VLASOV_STENCIL_WIDTH] = NULL;
253 for (
int b = -VLASOV_STENCIL_WIDTH; b <= VLASOV_STENCIL_WIDTH; ++b) {
254 if(blockDatas[b + VLASOV_STENCIL_WIDTH] != NULL) {
255 Realv blockValues[
WID3];
256 const Realf* block_data = blockDatas[b + VLASOV_STENCIL_WIDTH];
264 blockValues[
i] = block_data[cellid_transpose[
i]];
269 for (uint
k=0;
k<
WID; ++
k) {
270 for(uint planeVector = 0; planeVector < VEC_PER_PLANE; planeVector++){
278 for (uint
k=0;
k<
WID; ++
k) {
279 for(uint planeVector = 0; planeVector < VEC_PER_PLANE; planeVector++) {
296bool trans_map_1d(
const dccrg::Dccrg<SpatialCell,dccrg::Cartesian_Geometry>& mpiGrid,
297 const vector<CellID>& localPropagatedCells,
298 const vector<CellID>& remoteTargetCells,
299 const uint dimension,
305 uint cell_indices_to_id[3];
306 unsigned char cellid_transpose[
WID3];
308 if(localPropagatedCells.size() == 0)
311 vector<CellID> allCells(localPropagatedCells);
312 allCells.insert(allCells.end(), remoteTargetCells.begin(), remoteTargetCells.end());
314 const uint nSourceNeighborsPerCell = 1 + 2 * VLASOV_STENCIL_WIDTH;
315 std::vector<SpatialCell*> allCellsPointer(allCells.size());
316 std::vector<SpatialCell*> sourceNeighbors(localPropagatedCells.size() * nSourceNeighborsPerCell);
317 std::vector<SpatialCell*> targetNeighbors(3 * localPropagatedCells.size() );
319 #pragma omp parallel for
320 for(uint celli = 0; celli < allCells.size(); celli++){
321 allCellsPointer[celli] = mpiGrid[allCells[celli]];
325 #pragma omp parallel for
326 for(uint celli = 0; celli < localPropagatedCells.size(); celli++){
345 for(uint celli = 0; celli < allCellsPointer.size(); celli++) {
361 const uint8_t REFLEVEL=0;
364 dvz =
vmesh.getCellSize(REFLEVEL)[dimension];
371 cell_indices_to_id[0]=
WID2;
372 cell_indices_to_id[1]=
WID;
373 cell_indices_to_id[2]=1;
379 cell_indices_to_id[0]=1;
380 cell_indices_to_id[1]=
WID2;
381 cell_indices_to_id[2]=
WID;
387 cell_indices_to_id[0]=1;
388 cell_indices_to_id[1]=
WID;
389 cell_indices_to_id[2]=
WID2;
392 cerr << __FILE__ <<
":"<< __LINE__ <<
" Wrong dimension, abort"<<endl;
398 for (uint
k=0;
k<
WID; ++
k) {
399 for (uint
j=0;
j<
WID; ++
j) {
400 for (uint
i=0;
i<
WID; ++
i) {
402 i * cell_indices_to_id[0] +
403 j * cell_indices_to_id[1] +
404 k * cell_indices_to_id[2];
405 cellid_transpose[
i +
j *
WID +
k *
WID2] = cell;
410 const Realv i_dz=1.0/dz;
412 int mapping_id {phiprof::initializeTimer(
"mapping")};
413 int store_id {phiprof::initializeTimer(
"store")};
417 std::vector<Realf> targetBlockData(3 * localPropagatedCells.size() *
WID3);
418 std::vector<bool> targetsValid(localPropagatedCells.size());
419 std::vector<vmesh::LocalID> allCellsBlockLocalID(allCells.size());
423 #pragma omp for schedule(guided)
424 for(uint blocki = 0; blocki <
unionOfBlocks.size(); blocki++){
426 phiprof::Timer mappingTimer {mapping_id};
428 for(uint celli = 0; celli < allCellsPointer.size(); celli++){
429 allCellsBlockLocalID[celli] = allCellsPointer[celli]->get_velocity_block_local_id(blockGID, popID);
433 for(uint celli = 0; celli < localPropagatedCells.size(); celli++){
435 const CellID cellID = localPropagatedCells[celli];
440 targetsValid[celli] =
false;
452 Vec targetVecValues[3 *
WID3 / VECL];
454 for (uint
i = 0;
i< 3 *
WID3 / VECL; ++
i) {
455 targetVecValues[
i] = Vec(0.0);
459 Vec values[(1 + 2 * VLASOV_STENCIL_WIDTH) *
WID3 / VECL];
460 copy_trans_block_data(sourceNeighbors.data() + celli * nSourceNeighborsPerCell, blockGID, values, cellid_transpose, popID);
463 vmesh.getIndices(blockGID,refLevel, block_indices[0], block_indices[1], block_indices[2]);
469 for (uint
k=0;
k<
WID; ++
k) {
470 const Realv cell_vz = (block_indices[dimension] *
WID +
k + 0.5) *
dvz +
vz_min;
471 const Realv z_translation = cell_vz *
dt * i_dz;
472 const int target_scell_index = (z_translation > 0) ? 1: -1;
479 if ( z_translation < 0 ) {
481 z_2 = -z_translation;
483 z_1 = 1.0 - z_translation;
487 for (uint planeVector = 0; planeVector < VEC_PER_PLANE; planeVector++) {
489#ifdef TRANS_SEMILAG_PLM
493#ifdef TRANS_SEMILAG_PPM
498#ifdef TRANS_SEMILAG_PQM
504#ifdef TRANS_SEMILAG_PLM
505 const Vec ngbr_target_density =
506 z_2 * ( a[0] + z_2 * a[1] ) -
507 z_1 * ( a[0] + z_1 * a[1] );
509#ifdef TRANS_SEMILAG_PPM
510 const Vec ngbr_target_density =
511 z_2 * ( a[0] + z_2 * ( a[1] + z_2 * a[2] ) ) -
512 z_1 * ( a[0] + z_1 * ( a[1] + z_1 * a[2] ) );
514#ifdef TRANS_SEMILAG_PQM
515 const Vec ngbr_target_density =
516 z_2 * ( a[0] + z_2 * ( a[1] + z_2 * ( a[2] + z_2 * ( a[3] + z_2 * a[4] ) ) ) ) -
517 z_1 * ( a[0] + z_1 * ( a[1] + z_1 * ( a[2] + z_1 * ( a[3] + z_1 * a[4] ) ) ) );
519 targetVecValues[
i_trans_pt_blockv(planeVector,
k, target_scell_index)] += ngbr_target_density;
527 targetsValid[celli] =
true;
528 for (
int b = -1; b< 2 ; ++b) {
530 for (uint
k=0;
k<
WID; ++
k) {
531 for(uint planeVector = 0; planeVector < VEC_PER_PLANE; planeVector++){
534 for(uint
i = 0;
i< VECL;
i++){
539 targetBlockData[(celli * 3 + b + 1) *
WID3 + cellid_transpose[
i + planeVector * VECL +
k *
WID2]] =
548 phiprof::Timer storeTimer {store_id};
551 for(uint celli = 0; celli < allCellsPointer.size(); celli++){
557 for(
int i = 0;
i <
WID3;
i++) {
565 for(uint celli = 0; celli < localPropagatedCells.size(); celli++){
566 if(targetsValid[celli]) {
567 for(uint
ti = 0;
ti < 3;
ti++) {
583 for(
int i = 0;
i <
WID3 ;
i++) {
584 blockData[
i] += targetBlockData[(celli * 3 +
ti) *
WID3 +
i];
610 dccrg::Dccrg<SpatialCell,dccrg::Cartesian_Geometry>& mpiGrid,
611 const uint dimension,
617 vector<CellID> receive_cells;
618 vector<CellID> send_cells;
619 vector<Realf*> receiveBuffers;
629 if(direction > 0) direction = 1;
630 if(direction < 0) direction = -1;
631 for (
size_t c=0;
c<remote_cells.size(); ++
c) {
645 for (
size_t c = 0;
c < local_cells.size(); ++
c) {
660 for (
const auto& [neighbor, dir] : mpiGrid.get_face_neighbors_of(local_cells[
c])) {
661 if(dir == ((
int)dimension + 1) * direction) {
664 if(dir == -1 * ((
int)dimension + 1) * direction) {
673 if (mpiGrid.is_local(p_ngbr) && mpiGrid.is_local(m_ngbr))
continue;
677 pcell = mpiGrid[p_ngbr];
681 mcell = mpiGrid[m_ngbr];
694 if(isnan( pcell->
get_data(popID)[cell] ) || isinf( pcell->
get_data(popID)[cell])) {
695 fprintf(stderr,
"NaN sent at cell %li, vel cell %i",receive_cells[
c], cell);
703 send_cells.push_back(p_ngbr);
706 !mpiGrid.is_local(m_ngbr) &&
715 receive_cells.push_back(local_cells[
c]);
742 for (
size_t c=0;
c < receive_cells.size(); ++
c) {
747 for(
unsigned int cell = 0; cell<VELOCITY_BLOCK_LENGTH *
spatial_cell->get_number_of_velocity_blocks(popID); ++cell) {
748 blockData[cell] += receiveBuffers[
c][cell];
755 for (
size_t c=0;
c<send_cells.size(); ++
c) {
759 #pragma omp for nowait
760 for(
unsigned int cell = 0; cell< VELOCITY_BLOCK_LENGTH *
spatial_cell->get_number_of_velocity_blocks(popID); ++cell) {
768 for (
size_t c=0;
c < receiveBuffers.size(); ++
c) {