From 910a4104f4810da2a7a45c208a6ab8371a22d6d3 Mon Sep 17 00:00:00 2001 From: witNie Date: Mon, 28 Sep 2026 20:27:36 +0200 Subject: [PATCH 1/8] added mass stopping power function with MeV energy units --- include/AT_StoppingPower.h | 7 +++++++ src/AT_StoppingPower.c | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/AT_StoppingPower.h b/include/AT_StoppingPower.h index 2b3b7b11..11cdb8dd 100644 --- a/include/AT_StoppingPower.h +++ b/include/AT_StoppingPower.h @@ -132,6 +132,13 @@ int AT_Mass_Stopping_Power_with_no( const long stopping_power_source_no, const long material_no, double stopping_power_MeV_cm2_g[]); +int AT_Mass_Stopping_Power_E_MeV_with_no( const long stopping_power_source_no, + const long n, + const double E_MeV[], + const long particle_no[], + const long material_no, + double stopping_power_MeV_cm2_g[]); + /** * Retrieves the electronic stopping power in keV/um for * the requested energies and particles for a specified diff --git a/src/AT_StoppingPower.c b/src/AT_StoppingPower.c index 988cdf3e..a0f3d545 100644 --- a/src/AT_StoppingPower.c +++ b/src/AT_StoppingPower.c @@ -125,6 +125,28 @@ int AT_Mass_Stopping_Power_with_no( const long stopping_power_source_no, return result; } +int AT_Mass_Stopping_Power_E_MeV_with_no( const long stopping_power_source_no, + const long n, + const double E_MeV[], + const long particle_no[], + const long material_no, + double stopping_power_MeV_cm2_g[]){ + + double *E_MeV_u = malloc((size_t)n * sizeof(*E_MeV_u)); + for (long i = 0; i < n; i++) { + E_MeV_u[i] = AT_E_MeV_u_from_E_MeV(E_MeV[i], particle_no[i]); + } + int result = AT_Mass_Stopping_Power_with_no(stopping_power_source_no, + n, + E_MeV_u, + particle_no, + material_no, + stopping_power_MeV_cm2_g); + + free(E_MeV_u); + return result; +} + int AT_Stopping_Power_with_no( const long stopping_power_source_no, const long n, const double E_MeV_u[], From 90a5b6c2fb621253e6e31d8a0797ebfca1c4957c Mon Sep 17 00:00:00 2001 From: witNie Date: Mon, 28 Sep 2026 20:36:12 +0200 Subject: [PATCH 2/8] Add function for calculating stopping power with MeV energy input --- include/AT_StoppingPower.h | 8 ++++++++ src/AT_StoppingPower.c | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/AT_StoppingPower.h b/include/AT_StoppingPower.h index 11cdb8dd..9d476877 100644 --- a/include/AT_StoppingPower.h +++ b/include/AT_StoppingPower.h @@ -161,6 +161,14 @@ int AT_Stopping_Power_with_no( const long stopping_power_source_no, const long particle_no[], const long material_no, double stopping_power_keV_um[]); + +int AT_Stopping_Power_E_MeV_with_no( const long stopping_power_source_no, + const long n, + const double E_MeV[], + const long particle_no[], + const long material_no, + double stopping_power_keV_um[]); + /** * TODO * @param[in] stopping_power_source_no diff --git a/src/AT_StoppingPower.c b/src/AT_StoppingPower.c index a0f3d545..a29d1a7a 100644 --- a/src/AT_StoppingPower.c +++ b/src/AT_StoppingPower.c @@ -170,7 +170,27 @@ int AT_Stopping_Power_with_no( const long stopping_power_source_no, return result; } +int AT_Stopping_Power_E_MeV_with_no( const long stopping_power_source_no, + const long n, + const double E_MeV[], + const long particle_no[], + const long material_no, + double stopping_power_keV_um[]){ + + double *E_MeV_u = malloc((size_t)n * sizeof(*E_MeV_u)); + for (long i = 0; i < n; i++) { + E_MeV_u[i] = AT_E_MeV_u_from_E_MeV(E_MeV[i], particle_no[i]); + } + int result = AT_Stopping_Power_with_no(stopping_power_source_no, + n, + E_MeV_u, + particle_no, + material_no, + stopping_power_keV_um); + free(E_MeV_u); + return result; +} double AT_Energy_MeV_u_from_Stopping_Power_single( const long stopping_power_source_no, const double Stopping_Power_MeV_cm2_g, From 1b8af43d4d4c351184b3f12f81e6b1373ae36199 Mon Sep 17 00:00:00 2001 From: witNie Date: Wed, 30 Sep 2026 21:32:57 +0200 Subject: [PATCH 3/8] added scalar functions for stopping power --- include/AT_StoppingPower.h | 44 ++++++++++++++++++++++++++++++++++ src/AT_StoppingPower.c | 49 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/include/AT_StoppingPower.h b/include/AT_StoppingPower.h index 9d476877..2d9a6206 100644 --- a/include/AT_StoppingPower.h +++ b/include/AT_StoppingPower.h @@ -132,6 +132,21 @@ int AT_Mass_Stopping_Power_with_no( const long stopping_power_source_no, const long material_no, double stopping_power_MeV_cm2_g[]); +/** + * Retrieves the electronic mass stopping power in MeV*cm2/g + * for total kinetic energies given in MeV. + * + * Each E_MeV[i] value is converted to MeV/u using particle_no[i] + * before the stopping power is calculated. + * + * @param[in] stopping_power_source_no id of the data source + * @param[in] n number of energies / particles + * @param[in] E_MeV total kinetic energies in MeV (array of size n) + * @param[in] particle_no particle numbers (array of size n) + * @param[in] material_no material number + * @param[out] stopping_power_MeV_cm2_g stopping powers (array of size n) + * @return status + */ int AT_Mass_Stopping_Power_E_MeV_with_no( const long stopping_power_source_no, const long n, const double E_MeV[], @@ -162,6 +177,21 @@ int AT_Stopping_Power_with_no( const long stopping_power_source_no, const long material_no, double stopping_power_keV_um[]); +/** + * Retrieves the electronic stopping power in keV/um + * for total kinetic energies given in MeV. + * + * Each E_MeV[i] value is converted to MeV/u using particle_no[i] + * before the stopping power is calculated. + * + * @param[in] stopping_power_source_no id of the data source + * @param[in] n number of energies / particles + * @param[in] E_MeV total kinetic energies in MeV (array of size n) + * @param[in] particle_no particle numbers (array of size n) + * @param[in] material_no material number + * @param[out] stopping_power_keV_um stopping powers (array of size n) + * @return status + */ int AT_Stopping_Power_E_MeV_with_no( const long stopping_power_source_no, const long n, const double E_MeV[], @@ -181,6 +211,20 @@ double AT_Energy_MeV_u_from_Stopping_Power_single( const long stopping_power_sou const double Stopping_Power_MeV_cm2_g, const long particle_no, const long material_no); +int AT_Stopping_Power_E_MeV_single( const long stopping_power_source_no, + const double E_MeV, const long particle_no, + const long material_no, double *stopping_power_keV_um); + +int AT_Mass_Stopping_Power_E_MeV_single( const long stopping_power_source_no, + const double E_MeV, const long particle_no, + const long material_no, double *stopping_power_MeV_cm2_g); + +int AT_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, + const double E_MeV_u, const long particle_no, + const long material_no, double *stopping_power_keV_um); +int AT_Mass_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, + const double E_MeV_u, const long particle_no, + const long material_no, double *stopping_power_MeV_cm2_g); #endif /* AT_STOPPINGPOWER_H_ */ diff --git a/src/AT_StoppingPower.c b/src/AT_StoppingPower.c index a29d1a7a..86bad4b2 100644 --- a/src/AT_StoppingPower.c +++ b/src/AT_StoppingPower.c @@ -253,5 +253,54 @@ double AT_Energy_MeV_u_from_Stopping_Power_single( const long stopping_power_sou return -1; } +int AT_Stopping_Power_E_MeV_single( const long stopping_power_source_no, + const double E_MeV, const long particle_no, + const long material_no, double *stopping_power_keV_um){ + + return AT_Stopping_Power_E_MeV_with_no(stopping_power_source_no, + 1, + &E_MeV, + &particle_no, + material_no, + stopping_power_keV_um); +} + +int AT_Mass_Stopping_Power_E_MeV_single( const long stopping_power_source_no, + const double E_MeV, const long particle_no, + const long material_no, double *stopping_power_MeV_cm2_g){ + + return AT_Mass_Stopping_Power_E_MeV_with_no(stopping_power_source_no, + 1, + &E_MeV, + &particle_no, + material_no, + stopping_power_MeV_cm2_g); +} + +int AT_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, + const double E_MeV_u, const long particle_no, + const long material_no, double *stopping_power_keV_um){ + + return AT_Stopping_Power_with_no(stopping_power_source_no, + 1, + &E_MeV_u, + &particle_no, + material_no, + stopping_power_keV_um); +} + +int AT_Mass_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, + const double E_MeV_u, const long particle_no, + const long material_no, double *stopping_power_MeV_cm2_g){ + + return AT_Mass_Stopping_Power_E_MeV_with_no(stopping_power_source_no, + 1, + &E_MeV_u, + &particle_no, + material_no, + stopping_power_MeV_cm2_g); +} + + From 3ad9edcd69cd6f04f0286483e3101f8f9327fcfc Mon Sep 17 00:00:00 2001 From: witNie Date: Wed, 30 Sep 2026 21:59:23 +0200 Subject: [PATCH 4/8] added doxyget --- include/AT_StoppingPower.h | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/include/AT_StoppingPower.h b/include/AT_StoppingPower.h index 2d9a6206..2fd3d042 100644 --- a/include/AT_StoppingPower.h +++ b/include/AT_StoppingPower.h @@ -211,18 +211,68 @@ double AT_Energy_MeV_u_from_Stopping_Power_single( const long stopping_power_sou const double Stopping_Power_MeV_cm2_g, const long particle_no, const long material_no); +/** + * Retrieves the stopping power in keV/um for a + * single particle with total kinetic energy given in MeV. + * + * The total kinetic energy is converted to MeV/u using particle_no + * before the stopping power is calculated. + * + * @param[in] stopping_power_source_no id of the data source + * @param[in] E_MeV total kinetic energy in MeV + * @param[in] particle_no particle number + * @param[in] material_no material number + * @param[out] stopping_power_keV_um stopping power in keV/um + * @return status + */ int AT_Stopping_Power_E_MeV_single( const long stopping_power_source_no, const double E_MeV, const long particle_no, const long material_no, double *stopping_power_keV_um); +/** + * Retrieves the mass stopping power in MeV*cm2/g + * for a single particle with total kinetic energy given in MeV. + * + * The total kinetic energy is converted to MeV/u using particle_no + * before the stopping power is calculated. + * + * @param[in] stopping_power_source_no id of the data source + * @param[in] E_MeV total kinetic energy in MeV + * @param[in] particle_no particle number + * @param[in] material_no material number + * @param[out] stopping_power_MeV_cm2_g mass stopping power in MeV*cm2/g + * @return status + */ int AT_Mass_Stopping_Power_E_MeV_single( const long stopping_power_source_no, const double E_MeV, const long particle_no, const long material_no, double *stopping_power_MeV_cm2_g); +/** + * Retrieves the stopping power in keV/um for a + * single particle with kinetic energy given in MeV/u. + * + * @param[in] stopping_power_source_no id of the data source + * @param[in] E_MeV_u kinetic energy in MeV/u + * @param[in] particle_no particle number + * @param[in] material_no material number + * @param[out] stopping_power_keV_um stopping power in keV/um + * @return status + */ int AT_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, const double E_MeV_u, const long particle_no, const long material_no, double *stopping_power_keV_um); +/** + * Retrieves the mass stopping power in MeV*cm2/g + * for a single particle with kinetic energy given in MeV/u. + * + * @param[in] stopping_power_source_no id of the data source + * @param[in] E_MeV_u kinetic energy in MeV/u + * @param[in] particle_no particle number + * @param[in] material_no material number + * @param[out] stopping_power_MeV_cm2_g mass stopping power in MeV*cm2/g + * @return status + */ int AT_Mass_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, const double E_MeV_u, const long particle_no, const long material_no, double *stopping_power_MeV_cm2_g); From 1b8dfe9a332bffc3e739d3089f4d8d2282989709 Mon Sep 17 00:00:00 2001 From: witNie Date: Wed, 30 Sep 2026 22:31:31 +0200 Subject: [PATCH 5/8] stopping power bugfix --- src/AT_StoppingPower.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AT_StoppingPower.c b/src/AT_StoppingPower.c index 86bad4b2..3c4d516c 100644 --- a/src/AT_StoppingPower.c +++ b/src/AT_StoppingPower.c @@ -293,7 +293,7 @@ int AT_Mass_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, const double E_MeV_u, const long particle_no, const long material_no, double *stopping_power_MeV_cm2_g){ - return AT_Mass_Stopping_Power_E_MeV_with_no(stopping_power_source_no, + return AT_Mass_Stopping_Power_with_no(stopping_power_source_no, 1, &E_MeV_u, &particle_no, From 6183c48de1b904e4516fbccb165d077bdd1e508a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Nie=C4=87?= Date: Thu, 1 Oct 2026 19:57:56 +0200 Subject: [PATCH 6/8] cosmetic doxygen improvements Co-authored-by: Leszek Grzanka --- include/AT_StoppingPower.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/AT_StoppingPower.h b/include/AT_StoppingPower.h index 2fd3d042..d7f85521 100644 --- a/include/AT_StoppingPower.h +++ b/include/AT_StoppingPower.h @@ -136,7 +136,7 @@ int AT_Mass_Stopping_Power_with_no( const long stopping_power_source_no, * Retrieves the electronic mass stopping power in MeV*cm2/g * for total kinetic energies given in MeV. * - * Each E_MeV[i] value is converted to MeV/u using particle_no[i] + * Each E_MeV[i] value is converted internally to MeV/u using particle_no[i] * before the stopping power is calculated. * * @param[in] stopping_power_source_no id of the data source @@ -181,7 +181,7 @@ int AT_Stopping_Power_with_no( const long stopping_power_source_no, * Retrieves the electronic stopping power in keV/um * for total kinetic energies given in MeV. * - * Each E_MeV[i] value is converted to MeV/u using particle_no[i] + * Each E_MeV[i] value is converted internally to MeV/u using particle_no[i] * before the stopping power is calculated. * * @param[in] stopping_power_source_no id of the data source From 28096661b7cf4574a38efc34d55ec9f81c2ad337 Mon Sep 17 00:00:00 2001 From: witNie Date: Thu, 1 Oct 2026 20:07:39 +0200 Subject: [PATCH 7/8] fixed the return type of scalar functions --- include/AT_StoppingPower.h | 28 +++++++++++------------- src/AT_StoppingPower.c | 44 +++++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/include/AT_StoppingPower.h b/include/AT_StoppingPower.h index d7f85521..d1fe5bf7 100644 --- a/include/AT_StoppingPower.h +++ b/include/AT_StoppingPower.h @@ -222,12 +222,11 @@ double AT_Energy_MeV_u_from_Stopping_Power_single( const long stopping_power_sou * @param[in] E_MeV total kinetic energy in MeV * @param[in] particle_no particle number * @param[in] material_no material number - * @param[out] stopping_power_keV_um stopping power in keV/um - * @return status + * @return stopping power in keV/um */ -int AT_Stopping_Power_E_MeV_single( const long stopping_power_source_no, +double AT_Stopping_Power_E_MeV_single( const long stopping_power_source_no, const double E_MeV, const long particle_no, - const long material_no, double *stopping_power_keV_um); + const long material_no); /** * Retrieves the mass stopping power in MeV*cm2/g @@ -240,12 +239,11 @@ int AT_Stopping_Power_E_MeV_single( const long stopping_power_source_no, * @param[in] E_MeV total kinetic energy in MeV * @param[in] particle_no particle number * @param[in] material_no material number - * @param[out] stopping_power_MeV_cm2_g mass stopping power in MeV*cm2/g - * @return status + * @return mass stopping power in MeV*cm2/g */ -int AT_Mass_Stopping_Power_E_MeV_single( const long stopping_power_source_no, +double AT_Mass_Stopping_Power_E_MeV_single( const long stopping_power_source_no, const double E_MeV, const long particle_no, - const long material_no, double *stopping_power_MeV_cm2_g); + const long material_no); /** * Retrieves the stopping power in keV/um for a @@ -255,12 +253,11 @@ int AT_Mass_Stopping_Power_E_MeV_single( const long stopping_power_source_no, * @param[in] E_MeV_u kinetic energy in MeV/u * @param[in] particle_no particle number * @param[in] material_no material number - * @param[out] stopping_power_keV_um stopping power in keV/um - * @return status + * @return stopping power in keV/um */ -int AT_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, +double AT_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, const double E_MeV_u, const long particle_no, - const long material_no, double *stopping_power_keV_um); + const long material_no); /** * Retrieves the mass stopping power in MeV*cm2/g @@ -270,11 +267,10 @@ int AT_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, * @param[in] E_MeV_u kinetic energy in MeV/u * @param[in] particle_no particle number * @param[in] material_no material number - * @param[out] stopping_power_MeV_cm2_g mass stopping power in MeV*cm2/g - * @return status + * @return mass stopping power in MeV*cm2/g */ -int AT_Mass_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, +double AT_Mass_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, const double E_MeV_u, const long particle_no, - const long material_no, double *stopping_power_MeV_cm2_g); + const long material_no); #endif /* AT_STOPPINGPOWER_H_ */ diff --git a/src/AT_StoppingPower.c b/src/AT_StoppingPower.c index 3c4d516c..c1e4a7c6 100644 --- a/src/AT_StoppingPower.c +++ b/src/AT_StoppingPower.c @@ -253,54 +253,58 @@ double AT_Energy_MeV_u_from_Stopping_Power_single( const long stopping_power_sou return -1; } -int AT_Stopping_Power_E_MeV_single( const long stopping_power_source_no, +double AT_Stopping_Power_E_MeV_single( const long stopping_power_source_no, const double E_MeV, const long particle_no, - const long material_no, double *stopping_power_keV_um){ + const long material_no){ - return AT_Stopping_Power_E_MeV_with_no(stopping_power_source_no, + double stopping_power_keV_um; + AT_Stopping_Power_E_MeV_with_no(stopping_power_source_no, 1, &E_MeV, &particle_no, material_no, - stopping_power_keV_um); + &stopping_power_keV_um); + return stopping_power_keV_um; } -int AT_Mass_Stopping_Power_E_MeV_single( const long stopping_power_source_no, +double AT_Mass_Stopping_Power_E_MeV_single( const long stopping_power_source_no, const double E_MeV, const long particle_no, - const long material_no, double *stopping_power_MeV_cm2_g){ + const long material_no){ - return AT_Mass_Stopping_Power_E_MeV_with_no(stopping_power_source_no, + double stopping_power_MeV_cm2_g; + AT_Mass_Stopping_Power_E_MeV_with_no(stopping_power_source_no, 1, &E_MeV, &particle_no, material_no, - stopping_power_MeV_cm2_g); + &stopping_power_MeV_cm2_g); + return stopping_power_MeV_cm2_g; } -int AT_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, +double AT_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, const double E_MeV_u, const long particle_no, - const long material_no, double *stopping_power_keV_um){ + const long material_no){ - return AT_Stopping_Power_with_no(stopping_power_source_no, + double stopping_power_keV_um; + AT_Stopping_Power_with_no(stopping_power_source_no, 1, &E_MeV_u, &particle_no, material_no, - stopping_power_keV_um); + &stopping_power_keV_um); + return stopping_power_keV_um; } -int AT_Mass_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, +double AT_Mass_Stopping_Power_E_MeV_u_single( const long stopping_power_source_no, const double E_MeV_u, const long particle_no, - const long material_no, double *stopping_power_MeV_cm2_g){ + const long material_no){ - return AT_Mass_Stopping_Power_with_no(stopping_power_source_no, + double stopping_power_MeV_cm2_g; + AT_Mass_Stopping_Power_with_no(stopping_power_source_no, 1, &E_MeV_u, &particle_no, material_no, - stopping_power_MeV_cm2_g); + &stopping_power_MeV_cm2_g); + return stopping_power_MeV_cm2_g; } - - - - From 7d0682b200510c1df01e0eba0cf38d0a65e78047 Mon Sep 17 00:00:00 2001 From: witNie Date: Thu, 1 Oct 2026 20:16:23 +0200 Subject: [PATCH 8/8] added error handling for memory allocation in stopping power functions (copilot comment) --- src/AT_StoppingPower.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/AT_StoppingPower.c b/src/AT_StoppingPower.c index c1e4a7c6..7f8c8a0a 100644 --- a/src/AT_StoppingPower.c +++ b/src/AT_StoppingPower.c @@ -133,6 +133,11 @@ int AT_Mass_Stopping_Power_E_MeV_with_no( const long stopping_power_source_no, double stopping_power_MeV_cm2_g[]){ double *E_MeV_u = malloc((size_t)n * sizeof(*E_MeV_u)); + if (E_MeV_u == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + for (long i = 0; i < n; i++) { E_MeV_u[i] = AT_E_MeV_u_from_E_MeV(E_MeV[i], particle_no[i]); } @@ -178,6 +183,11 @@ int AT_Stopping_Power_E_MeV_with_no( const long stopping_power_source_no, double stopping_power_keV_um[]){ double *E_MeV_u = malloc((size_t)n * sizeof(*E_MeV_u)); + if (E_MeV_u == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + for (long i = 0; i < n; i++) { E_MeV_u[i] = AT_E_MeV_u_from_E_MeV(E_MeV[i], particle_no[i]); }