348 {
350 T tmp{};
351 constexpr int N = FML::PARTICLE::GetNDIM(tmp);
352 std::cout << "\n";
353 std::cout << "#=====================================================\n";
354 std::cout << "#\n";
355 std::cout << "# .___ _____ \n";
356 std::cout << "# | | _____/ ____\\____ \n";
357 std::cout << "# | |/ \\ __\\/ _ \\ \n";
358 std::cout << "# | | | \\ | ( <_> ) \n";
359 std::cout << "# |___|___| /__| \\____/ \n";
360 std::cout << "# \\/ \n";
361 std::cout << "#\n";
362 std::cout << "# Information about (an empty) particle of the given type:\n";
363 std::cout << "# Below we only show info about methods we have implemented support for\n";
364
365 if constexpr (FML::PARTICLE::has_append_to_buffer<T>())
366 std::cout << "# Particle has custom communication append_to_buffer method\n";
367 else
368 std::cout << "# Particle uses fiducial communication append_to_buffer method (assumes no dynamic "
369 "alloc inside class)\n";
370
371 if constexpr (FML::PARTICLE::has_assign_from_buffer<T>())
372 std::cout << "# Particle has custom communication assign_from_buffer method\n";
373 else
374 std::cout << "# Particle uses fiducial communication assign_from_buffer method (assumes no dynamic "
375 "alloc inside class)\n";
376
377 if constexpr (FML::PARTICLE::has_get_particle_byte_size<T>())
378 std::cout << "# Particle has custom size method. Size of an empty particle is "
379 << FML::PARTICLE::GetSize(tmp) << " bytes\n";
380 else
381 std::cout << "# Particle uses fiducial size method. Size of particle is "
382 << FML::PARTICLE::GetSize(tmp) << " bytes\n";
383 std::cout << "# Dimension is " << N << "\n";
384
385 if constexpr (FML::PARTICLE::has_get_pos<T>())
387 << " bytes)\n";
388
389 if constexpr (FML::PARTICLE::has_get_vel<T>())
391 << " bytes)\n";
392
393 if constexpr (FML::PARTICLE::has_set_mass<T>())
395
396 if constexpr (FML::PARTICLE::has_set_id<T>())
398
399 if constexpr (FML::PARTICLE::has_set_volume<T>())
401
402
403 if constexpr (FML::PARTICLE::has_set_tag<T>())
405 if constexpr (FML::PARTICLE::has_set_family<T>())
407 if constexpr (FML::PARTICLE::has_set_level<T>())
409
410
411 if constexpr (FML::PARTICLE::has_set_RA<T>())
413 if constexpr (FML::PARTICLE::has_set_DEC<T>())
415 if constexpr (FML::PARTICLE::has_set_z<T>())
417 << " bytes)\n";
418 if constexpr (FML::PARTICLE::has_set_weight<T>())
420
421
422 if constexpr (FML::PARTICLE::has_get_D_1LPT<T>())
423 std::cout << "# Particle has [1LPT Displacement field] ("
424 << sizeof(FML::PARTICLE::GetD_1LPT(tmp)[0]) * N << " bytes)\n";
425 if constexpr (FML::PARTICLE::has_get_dDdloga_1LPT<T>())
426 std::cout << "# Particle has [1LPT Displacement field derivative] ("
428 if constexpr (FML::PARTICLE::has_get_D_2LPT<T>())
429 std::cout << "# Particle has [2LPT Displacement field] ("
430 << sizeof(FML::PARTICLE::GetD_1LPT(tmp)[0]) * N << " bytes)\n";
431 if constexpr (FML::PARTICLE::has_get_dDdloga_2LPT<T>())
432 std::cout << "# Particle has [2LPT Displacement field derivative] ("
434 if constexpr (FML::PARTICLE::has_get_D_3LPTa<T>())
435 std::cout << "# Particle has [3LPTa Displacement field] ("
437 if constexpr (FML::PARTICLE::has_get_D_3LPTb<T>())
438 std::cout << "# Particle has [3LPTb Displacement field] ("
440 if constexpr (FML::PARTICLE::has_get_q<T>())
441 std::cout << "# Particle has [Lagrangian position] ("
443 if constexpr (FML::PARTICLE::has_get_D_1LPT<T>() and
FML::PARTICLE::has_get_D_2LPT<T>() and
444 FML::PARTICLE::has_get_D_3LPTa<T>() and
FML::PARTICLE::has_get_D_3LPTb<T>()) {
445 std::cout << "# Particle compatible with 3LPT COLA\n";
446
447 } else if (FML::PARTICLE::has_get_D_1LPT<T>() and FML::PARTICLE::has_get_D_2LPT<T>()) {
448 std::cout << "# Particle compatible with 2LPT COLA\n";
449 } else if (FML::PARTICLE::has_get_D_1LPT<T>()) {
450 std::cout << "# Particle compatible with 1LPT COLA\n";
451 } else {
452 std::cout << "# Particle is not compatible with COLA\n";
453 }
454 if constexpr (FML::PARTICLE::has_get_q<T>() and
FML::PARTICLE::has_get_D_1LPT<T>() and
455 FML::PARTICLE::has_get_dDdloga_1LPT<T>()) {
456 std::cout << "# Particle compatible with 1LPT scaledependent COLA\n";
457 }
else if constexpr (FML::PARTICLE::has_get_q<T>() and
FML::PARTICLE::has_get_D_1LPT<T>() and
458 FML::PARTICLE::has_get_D_2LPT<T>()) {
459 std::cout << "# Particle compatible with 2+ LPT scaledependent COLA\n";
460 } else {
461 std::cout << "# Particle is not compatible with scaledependent COLA\n";
462 }
463
464 std::cout << "#\n";
465 std::cout << "#=====================================================\n";
466 std::cout << "\n";
467 }
468 }
get_vel constexpr double * GetPos(...)
constexpr double GetDEC(...)
set_volume constexpr double GetVolume(Args &... args)
constexpr double * GetLagrangianPos(...)
constexpr double * GetD_3LPTa(...)
constexpr double * GetdDdloga_2LPT(...)
set_family set_tag set_level constexpr char GetFamily(...)
constexpr double * GetdDdloga_1LPT(...)
set_id constexpr int GetID(...)
constexpr double * GetVel(...)
set_RA set_DEC set_z set_weight constexpr double GetRA(...)
constexpr double * GetD_3LPTb(...)
constexpr double GetRedshift(...)
set_mass constexpr double GetMass(Args &... args)
constexpr double GetWeight(Args &... args)
constexpr int GetLevel(...)
constexpr char GetTag(...)
int ThisTask
The MPI task number.