Skip to content

Commit c66a290

Browse files
committed
adding rad2vol to aero_data with tests
1 parent 1f5ec7d commit c66a290

File tree

4 files changed

+74
-17
lines changed

4 files changed

+74
-17
lines changed

src/aero_data.F90

+12
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,16 @@ subroutine f_aero_data_get_prime_radius(ptr_c, prime_radius) bind(C)
125125

126126
end subroutine
127127

128+
subroutine f_aero_data_rad2vol(ptr_c, radius, vol) bind(C)
129+
type(aero_data_t), pointer :: ptr_f => null()
130+
type(c_ptr), intent(in) :: ptr_c
131+
real(c_double), intent(in) :: radius
132+
real(c_double), intent(out) :: vol
133+
134+
call c_f_pointer(ptr_c, ptr_f)
135+
136+
vol = aero_data_rad2vol(ptr_f, radius)
137+
138+
end subroutine
139+
128140
end module

src/aero_data.hpp

+7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ extern "C" void f_aero_data_set_vol_fill_factor(void *ptr, const double*) noexce
2020
extern "C" void f_aero_data_get_vol_fill_factor(const void *ptr, double*) noexcept;
2121
extern "C" void f_aero_data_set_prime_radius(void *ptr, const double*) noexcept;
2222
extern "C" void f_aero_data_get_prime_radius(const void *ptr, double*) noexcept;
23+
extern "C" void f_aero_data_rad2vol(const void *ptr, const double*, double*) noexcept;
2324
struct AeroData {
2425
PMCResource ptr;
2526

@@ -74,5 +75,11 @@ struct AeroData {
7475
f_aero_data_get_vol_fill_factor(&self.ptr, &value);
7576
return value;
7677
}
78+
79+
static double rad2vol(const AeroData &self, const double radius) {
80+
double vol;
81+
f_aero_data_rad2vol(&self.ptr, &radius, &vol);
82+
return vol;
83+
}
7784
};
7885

src/pypartmc.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ PYBIND11_MODULE(_PyPartMC, m) {
7171
.def_property("frac_dim", &AeroData::get_frac_dim, &AeroData::set_frac_dim)
7272
.def_property("vol_fill_factor", &AeroData::get_vol_fill_factor, &AeroData::set_vol_fill_factor)
7373
.def_property("prime_radius", &AeroData::get_prime_radius, &AeroData::set_prime_radius)
74+
.def("rad2vol", AeroData::rad2vol,
75+
"Convert geometric radius to mass-equivalent volume")
7476
;
7577

7678
py::class_<AeroParticle>(m, "AeroParticle",

tests/test_aero_data.py

+53-17
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
# Authors: https://github.com/open-atmos/PyPartMC/graphs/contributors #
55
####################################################################################################
66

7+
import numpy as np
8+
import pytest
79
import PyPartMC as ppmc
810
from PyPartMC import si
911

@@ -25,21 +27,21 @@ def test_ctor():
2527

2628
@staticmethod
2729
def test_spec_by_name_found():
28-
#arrange
30+
# arrange
2931
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
3032

31-
#act
33+
# act
3234
value = sut.spec_by_name("H2O")
3335

34-
#assert
36+
# assert
3537
assert value == 0
3638

3739
@staticmethod
3840
def test_spec_by_name_not_found():
39-
#arrange
41+
# arrange
4042
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
4143

42-
#act and assert
44+
# act and assert
4345
try:
4446
_ = sut.spec_by_name("XXX")
4547
assert False
@@ -48,47 +50,81 @@ def test_spec_by_name_not_found():
4850

4951
@staticmethod
5052
def test_len():
51-
#arrange
53+
# arrange
5254
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
5355

54-
#act
56+
# act
5557
value = len(sut)
5658

57-
#assert
59+
# assert
5860
assert value == len(AERO_DATA_CTOR_ARG_MINIMAL)
5961

6062
@staticmethod
6163
def test_frac_dim():
62-
#arrange
64+
# arrange
6365
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
6466
value = 3
6567

66-
#act
68+
# act
6769
sut.frac_dim = value
6870

69-
#assert
71+
# assert
7072
assert value == sut.frac_dim
7173

7274
@staticmethod
7375
def test_vol_fill_factor():
74-
#arrange
76+
# arrange
7577
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
7678
value = 1
7779

78-
#act
80+
# act
7981
sut.vol_fill_factor = value
8082

81-
#assert
83+
# assert
8284
assert value == sut.vol_fill_factor
8385

8486
@staticmethod
8587
def test_prime_radius():
86-
#arrange
88+
# arrange
8789
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
8890
value = 44
8991

90-
#act
92+
# act
9193
sut.prime_radius = value
9294

93-
#assert
95+
# assert
9496
assert value == sut.prime_radius
97+
98+
@staticmethod
99+
def test_rad2vol_sphere():
100+
# arrange
101+
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
102+
radius = 1e-6
103+
sut.frac_dim = 3.0
104+
sut.vol_fill_factor = 1.0
105+
sut.prime_radius = 1e-8
106+
107+
# act
108+
value = sut.rad2vol(radius)
109+
110+
# assert
111+
np.testing.assert_almost_equal(value,(4/3)*np.pi*(radius)**3)
112+
113+
@staticmethod
114+
@pytest.mark.parametrize("aero_data_params", (
115+
{"frac_dim": 2.4, "vol_fill_factor": 1.2, 'prime_radius': 1e-7},
116+
{"frac_dim": 2.5, "vol_fill_factor": 1.1, "prime_radius": 1e-8},
117+
{"frac_dim": 2.2, "vol_fill_factor": 1.3, 'prime_radius': 1e-6}))
118+
def test_rad2vol_fractal(aero_data_params:dict):
119+
# arrange
120+
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
121+
radius = 1e-6
122+
for key,value in aero_data_params.items():
123+
setattr(sut, key, value)
124+
125+
# act
126+
value = sut.rad2vol(radius)
127+
128+
# assert
129+
np.testing.assert_almost_equal(value, (4/3)*np.pi*(sut.prime_radius)**3 *
130+
(radius/sut.prime_radius)**sut.frac_dim / sut.vol_fill_factor)

0 commit comments

Comments
 (0)