Skip to content

Commit 8737aed

Browse files
committed
adding python binding for aero_data_spec_by_name
1 parent e6add5e commit 8737aed

File tree

4 files changed

+47
-3
lines changed

4 files changed

+47
-3
lines changed

src/aero_data.F90

+15
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,19 @@ subroutine f_aero_data_from_json(ptr_c) bind(C)
3535
call spec_file_read_aero_data(file, ptr_f)
3636
end subroutine
3737

38+
subroutine f_aero_data_spec_by_name(ptr_c, value, name_data, name_size) bind(C)
39+
type(aero_data_t), pointer :: ptr_f => null()
40+
type(c_ptr), intent(in) :: ptr_c
41+
character(kind=c_char), dimension(*), intent(in) :: name_data
42+
integer(c_int), intent(out) :: value
43+
integer(c_int), intent(in) :: name_size
44+
character(len=name_size) :: name
45+
integer :: i
46+
call c_f_pointer(ptr_c, ptr_f)
47+
do i=1, name_size
48+
name(i:i) = name_data(i)
49+
end do
50+
value = aero_data_spec_by_name(ptr_f, name)
51+
end subroutine
52+
3853
end module

src/aero_data.hpp

+9
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
extern "C" void f_aero_data_ctor(void *ptr) noexcept;
1313
extern "C" void f_aero_data_dtor(void *ptr) noexcept;
1414
extern "C" void f_aero_data_from_json(const void *ptr) noexcept;
15+
extern "C" void f_aero_data_spec_by_name(const void *ptr, int *value, const char *name_data, const int *name_size) noexcept;
1516

1617
struct AeroData {
1718
PMCResource ptr;
@@ -23,5 +24,13 @@ struct AeroData {
2324
f_aero_data_from_json(this->ptr.f_arg());
2425
gimmick_ptr().reset(); // TODO: guard
2526
}
27+
28+
static int spec_by_name(const AeroData &self, const std::string &name) {
29+
int value;
30+
const int name_size = name.size();
31+
f_aero_data_spec_by_name(self.ptr.f_arg(), &value, name.c_str(), &name_size);
32+
if (value==0) throw std::runtime_error("Element not found.");
33+
return value-1;
34+
}
2635
};
2736

src/pypartmc.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ PYBIND11_MODULE(PyPartMC, m) {
6363
)pbdoc"
6464
)
6565
.def(py::init<const nlohmann::json&>())
66+
.def("spec_by_name", AeroData::spec_by_name)
6667
;
6768

6869
py::class_<AeroState>(m, "AeroState",

tests/test_aero_data.py

+22-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from PyPartMC import si
99

1010
AERO_DATA_CTOR_ARG_MINIMAL = (
11-
{"H20": [1000 * si.kg / si.m**3, 1, 18e-3 * si.kg / si.mol, 0]},
11+
{"H2O": [1000 * si.kg / si.m**3, 1, 18e-3 * si.kg / si.mol, 0]},
1212
)
1313

1414

@@ -24,5 +24,24 @@ def test_ctor():
2424
assert sut is not None
2525

2626
@staticmethod
27-
def test_std():
28-
pass # TODO
27+
def test_spec_by_name_found():
28+
#arrange
29+
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
30+
31+
#act
32+
value = sut.spec_by_name("H2O")
33+
34+
#assert
35+
assert value == 0
36+
37+
@staticmethod
38+
def test_spec_by_name_not_found():
39+
#arrange
40+
sut = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
41+
42+
#act and assert
43+
try:
44+
value = sut.spec_by_name("XXX")
45+
assert False
46+
except RuntimeError as e:
47+
assert str(e) == "Element not found."

0 commit comments

Comments
 (0)