if (is_edip_c_) {
    switch (GetComputeIndex(is_compute_energy,
                            is_compute_forces, is_compute_particle_energy,
                            is_compute_virial, is_compute_particle_virial)) {
      case 0:
        ier = EDIPCCompute<false, false, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 1:
        ier = EDIPCCompute<false, false, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 2:
        ier = EDIPCCompute<false, false, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 3:
        ier = EDIPCCompute<false, false, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 4:
        ier = EDIPCCompute<false, false, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 5:
        ier = EDIPCCompute<false, false, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 6:
        ier = EDIPCCompute<false, false, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 7:
        ier = EDIPCCompute<false, false, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 8:
        ier = EDIPCCompute<false, true, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 9:
        ier = EDIPCCompute<false, true, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 10:
        ier = EDIPCCompute<false, true, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 11:
        ier = EDIPCCompute<false, true, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 12:
        ier = EDIPCCompute<false, true, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 13:
        ier = EDIPCCompute<false, true, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 14:
        ier = EDIPCCompute<false, true, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 15:
        ier = EDIPCCompute<false, true, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 16:
        ier = EDIPCCompute<true, false, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 17:
        ier = EDIPCCompute<true, false, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 18:
        ier = EDIPCCompute<true, false, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 19:
        ier = EDIPCCompute<true, false, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 20:
        ier = EDIPCCompute<true, false, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 21:
        ier = EDIPCCompute<true, false, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 22:
        ier = EDIPCCompute<true, false, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 23:
        ier = EDIPCCompute<true, false, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 24:
        ier = EDIPCCompute<true, true, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 25:
        ier = EDIPCCompute<true, true, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 26:
        ier = EDIPCCompute<true, true, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 27:
        ier = EDIPCCompute<true, true, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 28:
        ier = EDIPCCompute<true, true, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 29:
        ier = EDIPCCompute<true, true, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 30:
        ier = EDIPCCompute<true, true, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 31:
        ier = EDIPCCompute<true, true, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      default:
        HELPER_LOG_ERROR("Unknown compute function index.");
        ier = true;
        break;
    }
  } else if (is_edip_single_) {
    switch (GetComputeIndex(is_compute_energy,
                            is_compute_forces, is_compute_particle_energy,
                            is_compute_virial, is_compute_particle_virial)) {
      case 0:
        ier = EDIPSingleCompute<false, false, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 1:
        ier = EDIPSingleCompute<false, false, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 2:
        ier = EDIPSingleCompute<false, false, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 3:
        ier = EDIPSingleCompute<false, false, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 4:
        ier = EDIPSingleCompute<false, false, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 5:
        ier = EDIPSingleCompute<false, false, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 6:
        ier = EDIPSingleCompute<false, false, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 7:
        ier = EDIPSingleCompute<false, false, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 8:
        ier = EDIPSingleCompute<false, true, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 9:
        ier = EDIPSingleCompute<false, true, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 10:
        ier = EDIPSingleCompute<false, true, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 11:
        ier = EDIPSingleCompute<false, true, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 12:
        ier = EDIPSingleCompute<false, true, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 13:
        ier = EDIPSingleCompute<false, true, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 14:
        ier = EDIPSingleCompute<false, true, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 15:
        ier = EDIPSingleCompute<false, true, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 16:
        ier = EDIPSingleCompute<true, false, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 17:
        ier = EDIPSingleCompute<true, false, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 18:
        ier = EDIPSingleCompute<true, false, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 19:
        ier = EDIPSingleCompute<true, false, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 20:
        ier = EDIPSingleCompute<true, false, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 21:
        ier = EDIPSingleCompute<true, false, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 22:
        ier = EDIPSingleCompute<true, false, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 23:
        ier = EDIPSingleCompute<true, false, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 24:
        ier = EDIPSingleCompute<true, true, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 25:
        ier = EDIPSingleCompute<true, true, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 26:
        ier = EDIPSingleCompute<true, true, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 27:
        ier = EDIPSingleCompute<true, true, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 28:
        ier = EDIPSingleCompute<true, true, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 29:
        ier = EDIPSingleCompute<true, true, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 30:
        ier = EDIPSingleCompute<true, true, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 31:
        ier = EDIPSingleCompute<true, true, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      default:
        HELPER_LOG_ERROR("Unknown compute function index.");
        ier = true;
        break;
    }
  } else if (is_edip_multi_) {
    switch (GetComputeIndex(is_compute_energy,
                            is_compute_forces, is_compute_particle_energy,
                            is_compute_virial, is_compute_particle_virial)) {
      case 0:
        ier = EDIPMultiCompute<false, false, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 1:
        ier = EDIPMultiCompute<false, false, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 2:
        ier = EDIPMultiCompute<false, false, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 3:
        ier = EDIPMultiCompute<false, false, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 4:
        ier = EDIPMultiCompute<false, false, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 5:
        ier = EDIPMultiCompute<false, false, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 6:
        ier = EDIPMultiCompute<false, false, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 7:
        ier = EDIPMultiCompute<false, false, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 8:
        ier = EDIPMultiCompute<false, true, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 9:
        ier = EDIPMultiCompute<false, true, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 10:
        ier = EDIPMultiCompute<false, true, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 11:
        ier = EDIPMultiCompute<false, true, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 12:
        ier = EDIPMultiCompute<false, true, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 13:
        ier = EDIPMultiCompute<false, true, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 14:
        ier = EDIPMultiCompute<false, true, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 15:
        ier = EDIPMultiCompute<false, true, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 16:
        ier = EDIPMultiCompute<true, false, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 17:
        ier = EDIPMultiCompute<true, false, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 18:
        ier = EDIPMultiCompute<true, false, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 19:
        ier = EDIPMultiCompute<true, false, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 20:
        ier = EDIPMultiCompute<true, false, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 21:
        ier = EDIPMultiCompute<true, false, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 22:
        ier = EDIPMultiCompute<true, false, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 23:
        ier = EDIPMultiCompute<true, false, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 24:
        ier = EDIPMultiCompute<true, true, false, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 25:
        ier = EDIPMultiCompute<true, true, false, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 26:
        ier = EDIPMultiCompute<true, true, false, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 27:
        ier = EDIPMultiCompute<true, true, false, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 28:
        ier = EDIPMultiCompute<true, true, true, false, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 29:
        ier = EDIPMultiCompute<true, true, true, false, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 30:
        ier = EDIPMultiCompute<true, true, true, true, false>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      case 31:
        ier = EDIPMultiCompute<true, true, true, true, true>(
            model_compute, model_compute_arguments, particle_species_codes,
            particle_contributing, coordinates, energy, forces, particle_energy,
            *virial, particle_virial);
        break;
      default:
        HELPER_LOG_ERROR("Unknown compute function index.");
        ier = true;
        break;
    }
  }