static PyObject * py_get_reducible_collision_matrix(PyObject *self, PyObject *args) { PyArrayObject* collision_matrix_py; PyArrayObject* fc3_normal_squared_py; PyArrayObject* frequencies_py; PyArrayObject* triplets_py; PyArrayObject* triplets_map_py; PyArrayObject* stabilized_gp_map_py; PyArrayObject* g_py; double temperature, unit_conversion_factor, cutoff_frequency; if (!PyArg_ParseTuple(args, "OOOOOOOddd", &collision_matrix_py, &fc3_normal_squared_py, &frequencies_py, &g_py, &triplets_py, &triplets_map_py, &stabilized_gp_map_py, &temperature, &unit_conversion_factor, &cutoff_frequency)) { return NULL; } Darray* fc3_normal_squared = convert_to_darray(fc3_normal_squared_py); double* collision_matrix = (double*)collision_matrix_py->data; const double* g = (double*)g_py->data; const double* frequencies = (double*)frequencies_py->data; const int* triplets = (int*)triplets_py->data; Iarray* triplets_map = convert_to_iarray(triplets_map_py); const int* stabilized_gp_map = (int*)stabilized_gp_map_py->data; get_reducible_collision_matrix(collision_matrix, fc3_normal_squared, frequencies, triplets, triplets_map, stabilized_gp_map, g, temperature, unit_conversion_factor, cutoff_frequency); free(fc3_normal_squared); free(triplets_map); Py_RETURN_NONE; }
static PyObject * py_get_frequency_shift_at_bands(PyObject *self, PyObject *args) { PyArrayObject* shift_py; PyArrayObject* fc3_normal_squared_py; PyArrayObject* frequencies_py; PyArrayObject* grid_point_triplets_py; PyArrayObject* triplet_weights_py; PyArrayObject* band_indices_py; double epsilon, unit_conversion_factor, cutoff_frequency, temperature; if (!PyArg_ParseTuple(args, "OOOOOOdddd", &shift_py, &fc3_normal_squared_py, &grid_point_triplets_py, &triplet_weights_py, &frequencies_py, &band_indices_py, &temperature, &epsilon, &unit_conversion_factor, &cutoff_frequency)) { return NULL; } Darray* fc3_normal_squared = convert_to_darray(fc3_normal_squared_py); double* shift = (double*)shift_py->data; const double* frequencies = (double*)frequencies_py->data; const int* band_indices = (int*)band_indices_py->data; const int* grid_point_triplets = (int*)grid_point_triplets_py->data; const int* triplet_weights = (int*)triplet_weights_py->data; get_frequency_shift_at_bands(shift, fc3_normal_squared, band_indices, frequencies, grid_point_triplets, triplet_weights, epsilon, temperature, unit_conversion_factor, cutoff_frequency); free(fc3_normal_squared); Py_RETURN_NONE; }
static PyObject * py_get_fc4_frequency_shifts(PyObject *self, PyObject *args) { PyArrayObject* frequency_shifts_py; PyArrayObject* fc4_normal_py; PyArrayObject* frequencies_py; PyArrayObject* grid_points1_py; PyArrayObject* temperatures_py; PyArrayObject* band_indicies_py; double unit_conversion_factor; if (!PyArg_ParseTuple(args, "OOOOOOd", &frequency_shifts_py, &fc4_normal_py, &frequencies_py, &grid_points1_py, &temperatures_py, &band_indicies_py, &unit_conversion_factor)) { return NULL; } double* freq_shifts = (double*)frequency_shifts_py->data; double* fc4_normal = (double*)fc4_normal_py->data; double* freqs = (double*)frequencies_py->data; Iarray* grid_points1 = convert_to_iarray(grid_points1_py); Darray* temperatures = convert_to_darray(temperatures_py); int* band_indicies = (int*)band_indicies_py->data; const int num_band0 = (int)band_indicies_py->dimensions[0]; const int num_band = (int)frequencies_py->dimensions[1]; get_fc4_frequency_shifts(freq_shifts, fc4_normal, freqs, grid_points1, temperatures, band_indicies, num_band0, num_band, unit_conversion_factor); free(grid_points1); free(temperatures); Py_RETURN_NONE; }
static PyObject * py_get_imag_self_energy(PyObject *self, PyObject *args) { PyArrayObject* gamma_py; PyArrayObject* fc3_normal_squared_py; PyArrayObject* frequencies_py; PyArrayObject* grid_point_triplets_py; PyArrayObject* triplet_weights_py; double sigma, unit_conversion_factor, cutoff_frequency, temperature, fpoint; if (!PyArg_ParseTuple(args, "OOOOOddddd", &gamma_py, &fc3_normal_squared_py, &grid_point_triplets_py, &triplet_weights_py, &frequencies_py, &fpoint, &temperature, &sigma, &unit_conversion_factor, &cutoff_frequency)) { return NULL; } Darray* fc3_normal_squared = convert_to_darray(fc3_normal_squared_py); double* gamma = (double*)gamma_py->data; const double* frequencies = (double*)frequencies_py->data; const int* grid_point_triplets = (int*)grid_point_triplets_py->data; const int* triplet_weights = (int*)triplet_weights_py->data; get_imag_self_energy(gamma, fc3_normal_squared, fpoint, frequencies, grid_point_triplets, triplet_weights, sigma, temperature, unit_conversion_factor, cutoff_frequency); free(fc3_normal_squared); Py_RETURN_NONE; }
static PyObject * py_real_to_reciprocal4(PyObject *self, PyObject *args) { PyArrayObject* fc4_py; PyArrayObject* fc4_reciprocal_py; PyArrayObject* q_py; PyArrayObject* shortest_vectors; PyArrayObject* multiplicity; PyArrayObject* p2s_map; PyArrayObject* s2p_map; if (!PyArg_ParseTuple(args, "OOOOOOO", &fc4_reciprocal_py, &fc4_py, &q_py, &shortest_vectors, &multiplicity, &p2s_map, &s2p_map)) { return NULL; } double* fc4 = (double*)fc4_py->data; lapack_complex_double* fc4_reciprocal = (lapack_complex_double*)fc4_reciprocal_py->data; Darray* svecs = convert_to_darray(shortest_vectors); Iarray* multi = convert_to_iarray(multiplicity); const int* p2s = (int*)p2s_map->data; const int* s2p = (int*)s2p_map->data; const double* q = (double*)q_py->data; real_to_reciprocal4(fc4_reciprocal, q, fc4, svecs, multi, p2s, s2p); free(svecs); free(multi); Py_RETURN_NONE; }
static PyObject * py_get_fc4_normal_for_frequency_shift(PyObject *self, PyObject *args) { PyArrayObject* fc4_normal_py; PyArrayObject* frequencies_py; PyArrayObject* eigenvectors_py; PyArrayObject* grid_points1_py; PyArrayObject* grid_address_py; PyArrayObject* mesh_py; PyArrayObject* fc4_py; PyArrayObject* shortest_vectors_py; PyArrayObject* multiplicity_py; PyArrayObject* masses_py; PyArrayObject* p2s_map_py; PyArrayObject* s2p_map_py; PyArrayObject* band_indicies_py; double cutoff_frequency; int grid_point0; if (!PyArg_ParseTuple(args, "OOOiOOOOOOOOOOd", &fc4_normal_py, &frequencies_py, &eigenvectors_py, &grid_point0, &grid_points1_py, &grid_address_py, &mesh_py, &fc4_py, &shortest_vectors_py, &multiplicity_py, &masses_py, &p2s_map_py, &s2p_map_py, &band_indicies_py, &cutoff_frequency)) { return NULL; } double* fc4_normal = (double*)fc4_normal_py->data; double* freqs = (double*)frequencies_py->data; /* npy_cdouble and lapack_complex_double may not be compatible. */ /* So eigenvectors should not be used in Python side */ lapack_complex_double* eigvecs = (lapack_complex_double*)eigenvectors_py->data; Iarray* grid_points1 = convert_to_iarray(grid_points1_py); const int* grid_address = (int*)grid_address_py->data; const int* mesh = (int*)mesh_py->data; double* fc4 = (double*)fc4_py->data; Darray* svecs = convert_to_darray(shortest_vectors_py); Iarray* multi = convert_to_iarray(multiplicity_py); const double* masses = (double*)masses_py->data; const int* p2s = (int*)p2s_map_py->data; const int* s2p = (int*)s2p_map_py->data; Iarray* band_indicies = convert_to_iarray(band_indicies_py); get_fc4_normal_for_frequency_shift(fc4_normal, freqs, eigvecs, grid_point0, grid_points1, grid_address, mesh, fc4, svecs, multi, masses, p2s, s2p, band_indicies, cutoff_frequency); free(grid_points1); free(svecs); free(multi); free(band_indicies); Py_RETURN_NONE; }
static PyObject * py_set_phonons_grid_points(PyObject *self, PyObject *args) { PyArrayObject* frequencies; PyArrayObject* eigenvectors; PyArrayObject* phonon_done_py; PyArrayObject* grid_points_py; PyArrayObject* grid_address_py; PyArrayObject* mesh_py; PyArrayObject* shortest_vectors_fc2; PyArrayObject* multiplicity_fc2; PyArrayObject* fc2_py; PyArrayObject* atomic_masses_fc2; PyArrayObject* p2s_map_fc2; PyArrayObject* s2p_map_fc2; PyArrayObject* reciprocal_lattice; PyArrayObject* born_effective_charge; PyArrayObject* q_direction; PyArrayObject* dielectric_constant; double nac_factor, unit_conversion_factor; char uplo; if (!PyArg_ParseTuple(args, "OOOOOOOOOOOOdOOOOdc", &frequencies, &eigenvectors, &phonon_done_py, &grid_points_py, &grid_address_py, &mesh_py, &fc2_py, &shortest_vectors_fc2, &multiplicity_fc2, &atomic_masses_fc2, &p2s_map_fc2, &s2p_map_fc2, &unit_conversion_factor, &born_effective_charge, &dielectric_constant, &reciprocal_lattice, &q_direction, &nac_factor, &uplo)) { return NULL; } double* born; double* dielectric; double *q_dir; Darray* freqs = convert_to_darray(frequencies); /* npy_cdouble and lapack_complex_double may not be compatible. */ /* So eigenvectors should not be used in Python side */ Carray* eigvecs = convert_to_carray(eigenvectors); char* phonon_done = (char*)phonon_done_py->data; Iarray* grid_points = convert_to_iarray(grid_points_py); const int* grid_address = (int*)grid_address_py->data; const int* mesh = (int*)mesh_py->data; Darray* fc2 = convert_to_darray(fc2_py); Darray* svecs_fc2 = convert_to_darray(shortest_vectors_fc2); Iarray* multi_fc2 = convert_to_iarray(multiplicity_fc2); const double* masses_fc2 = (double*)atomic_masses_fc2->data; const int* p2s_fc2 = (int*)p2s_map_fc2->data; const int* s2p_fc2 = (int*)s2p_map_fc2->data; const double* rec_lat = (double*)reciprocal_lattice->data; if ((PyObject*)born_effective_charge == Py_None) { born = NULL; } else { born = (double*)born_effective_charge->data; } if ((PyObject*)dielectric_constant == Py_None) { dielectric = NULL; } else { dielectric = (double*)dielectric_constant->data; } if ((PyObject*)q_direction == Py_None) { q_dir = NULL; } else { q_dir = (double*)q_direction->data; } set_phonons_for_frequency_shift(freqs, eigvecs, phonon_done, grid_points, grid_address, mesh, fc2, svecs_fc2, multi_fc2, masses_fc2, p2s_fc2, s2p_fc2, unit_conversion_factor, born, dielectric, rec_lat, q_dir, nac_factor, uplo); free(freqs); free(eigvecs); free(grid_points); free(fc2); free(svecs_fc2); free(multi_fc2); Py_RETURN_NONE; }
static PyObject * py_get_interaction(PyObject *self, PyObject *args) { PyArrayObject* fc3_normal_squared_py; PyArrayObject* frequencies; PyArrayObject* eigenvectors; PyArrayObject* grid_point_triplets; PyArrayObject* grid_address_py; PyArrayObject* mesh_py; PyArrayObject* shortest_vectors; PyArrayObject* multiplicity; PyArrayObject* fc3_py; PyArrayObject* atomic_masses; PyArrayObject* p2s_map; PyArrayObject* s2p_map; PyArrayObject* band_indicies_py; double cutoff_frequency; int symmetrize_fc3_q; if (!PyArg_ParseTuple(args, "OOOOOOOOOOOOOid", &fc3_normal_squared_py, &frequencies, &eigenvectors, &grid_point_triplets, &grid_address_py, &mesh_py, &fc3_py, &shortest_vectors, &multiplicity, &atomic_masses, &p2s_map, &s2p_map, &band_indicies_py, &symmetrize_fc3_q, &cutoff_frequency)) { return NULL; } Darray* fc3_normal_squared = convert_to_darray(fc3_normal_squared_py); Darray* freqs = convert_to_darray(frequencies); /* npy_cdouble and lapack_complex_double may not be compatible. */ /* So eigenvectors should not be used in Python side */ Carray* eigvecs = convert_to_carray(eigenvectors); Iarray* triplets = convert_to_iarray(grid_point_triplets); const int* grid_address = (int*)grid_address_py->data; const int* mesh = (int*)mesh_py->data; Darray* fc3 = convert_to_darray(fc3_py); Darray* svecs = convert_to_darray(shortest_vectors); Iarray* multi = convert_to_iarray(multiplicity); const double* masses = (double*)atomic_masses->data; const int* p2s = (int*)p2s_map->data; const int* s2p = (int*)s2p_map->data; const int* band_indicies = (int*)band_indicies_py->data; get_interaction(fc3_normal_squared, freqs, eigvecs, triplets, grid_address, mesh, fc3, svecs, multi, masses, p2s, s2p, band_indicies, symmetrize_fc3_q, cutoff_frequency); free(fc3_normal_squared); free(freqs); free(eigvecs); free(triplets); free(fc3); free(svecs); free(multi); Py_RETURN_NONE; }
static PyObject * py_get_phonon(PyObject *self, PyObject *args) { PyArrayObject* frequencies_py; PyArrayObject* eigenvectors_py; PyArrayObject* q_py; PyArrayObject* shortest_vectors_py; PyArrayObject* multiplicity_py; PyArrayObject* fc2_py; PyArrayObject* atomic_masses_py; PyArrayObject* p2s_map_py; PyArrayObject* s2p_map_py; PyArrayObject* reciprocal_lattice_py; PyArrayObject* born_effective_charge_py; PyArrayObject* q_direction_py; PyArrayObject* dielectric_constant_py; double nac_factor, unit_conversion_factor; char uplo; if (!PyArg_ParseTuple(args, "OOOOOOOOOdOOOOdc", &frequencies_py, &eigenvectors_py, &q_py, &fc2_py, &shortest_vectors_py, &multiplicity_py, &atomic_masses_py, &p2s_map_py, &s2p_map_py, &unit_conversion_factor, &born_effective_charge_py, &dielectric_constant_py, &reciprocal_lattice_py, &q_direction_py, &nac_factor, &uplo)) { return NULL; } double* born; double* dielectric; double *q_dir; double* freqs = (double*)frequencies_py->data; /* npy_cdouble and lapack_complex_double may not be compatible. */ /* So eigenvectors should not be used in Python side */ lapack_complex_double* eigvecs = (lapack_complex_double*)eigenvectors_py->data; const double* q = (double*) q_py->data; Darray* fc2 = convert_to_darray(fc2_py); Darray* svecs = convert_to_darray(shortest_vectors_py); Iarray* multi = convert_to_iarray(multiplicity_py); const double* masses = (double*)atomic_masses_py->data; const int* p2s = (int*)p2s_map_py->data; const int* s2p = (int*)s2p_map_py->data; const double* rec_lat = (double*)reciprocal_lattice_py->data; if ((PyObject*)born_effective_charge_py == Py_None) { born = NULL; } else { born = (double*)born_effective_charge_py->data; } if ((PyObject*)dielectric_constant_py == Py_None) { dielectric = NULL; } else { dielectric = (double*)dielectric_constant_py->data; } if ((PyObject*)q_direction_py == Py_None) { q_dir = NULL; } else { q_dir = (double*)q_direction_py->data; } get_phonons(eigvecs, freqs, q, fc2, masses, p2s, s2p, multi, svecs, born, dielectric, rec_lat, q_dir, nac_factor, unit_conversion_factor, uplo); free(fc2); free(svecs); free(multi); Py_RETURN_NONE; }