Skip to content

Commit 4ab4e62

Browse files
committed
Added 1/2/3-d int arrays
1 parent 80229b6 commit 4ab4e62

5 files changed

Lines changed: 327 additions & 19 deletions

File tree

src/example_fgen_basic/result/result_gen.f90

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ module m_result_gen
88
private
99

1010
integer, parameter, public :: T_NONE = 0, T_CLAIM = -1, &
11-
T_INT = 1, T_DP = 2, T_ERR = 3
11+
T_INT = 1, T_DP = 2, T_ARR_INT = 3, &
12+
T_ERR = 99
1213

1314
type, public :: ResultGen
1415

@@ -17,11 +18,15 @@ module m_result_gen
1718

1819
integer(kind=i8) :: data_int
1920
real(kind=dp) :: data_dp
21+
integer(kind=i8), allocatable :: data_array_int_1d(:), &
22+
data_array_int_2d(:,:), &
23+
data_array_int_3d(:,:,:)
2024
contains
2125
procedure :: is_free => is_none
2226
procedure :: is_error
2327
procedure :: is_int
2428
procedure :: is_dp
29+
procedure :: is_arr_int
2530
procedure :: build
2631
procedure :: finalise
2732
final :: finalise_auto
@@ -33,19 +38,20 @@ module m_result_gen
3338

3439
contains
3540
! ------------------ Constructor -------------------------
36-
function constructor(tag,data_int,data_dp,error_v) result(self)
41+
function constructor(tag,data_int,data_dp,data_arr_int,error_v) result(self)
3742

3843
type(ResultGen) :: self
3944
type(ResultGen) :: res_check
4045

4146
integer(kind=i8), optional, intent(in) :: data_int
4247
real(kind=dp), optional, intent(in) :: data_dp
48+
integer(kind=i8), optional, intent(in) :: data_arr_int(..)
4349
type(ErrorV), optional, intent(in) :: error_v
4450

4551
integer, intent(in) :: tag
4652
integer :: cause
4753

48-
call self % build (tag = tag, data_int = data_int, data_dp = data_dp,&
54+
call self % build (tag = tag, data_int = data_int, data_dp = data_dp, data_arr_int=data_arr_int, &
4955
error_v = error_v, res=res_check)
5056

5157
if (res_check % is_error()) then
@@ -67,24 +73,29 @@ function constructor(tag,data_int,data_dp,error_v) result(self)
6773
end function constructor
6874

6975
! ------------------ Setter -------------------------
70-
subroutine build(self,tag,data_int,data_dp,error_v,res)
76+
subroutine build(self,tag,data_int,data_dp,data_arr_int,error_v,res)
7177

7278
class(ResultGen),intent(out) :: self
7379
type(ResultGen),intent(out), optional :: res
7480

7581
type(ErrorV), intent(in), optional :: error_v
7682
real(kind=dp), intent(in), optional :: data_dp
7783
integer(kind=i8), intent(in), optional :: data_int
84+
integer(kind=i8), intent(in), optional :: data_arr_int(..)
7885
integer, intent(in) :: tag
7986

8087
self % tag = tag
8188

8289
if (tag == T_CLAIM) then
90+
! MZ: makes sense?
8391
return
8492
else if (present(data_int) .and. tag == T_INT) then
8593
self % data_int = data_int
8694
else if (present(data_dp) .and. tag == T_DP)then
8795
self % data_dp = data_dp
96+
else if (present(data_arr_int) .and. tag == T_ARR_INT)then
97+
call ship_to_int_array(self, data_arr_int)
98+
self % tag = tag
8899
else if (present(error_v) .and. tag == T_ERR)then
89100
allocate(self % error_v, source = error_v)
90101
else
@@ -95,13 +106,44 @@ subroutine build(self,tag,data_int,data_dp,error_v,res)
95106

96107
end subroutine build
97108

109+
subroutine ship_to_int_array(self, data_arr_int)
110+
111+
class(ResultGen), intent(inout) :: self
112+
integer(kind=i8), intent(in) :: data_arr_int(..)
113+
114+
select rank(data_arr_int)
115+
rank (1)
116+
allocate(self % data_array_int_1d(size(data_arr_int, 1)), &
117+
source = data_arr_int &
118+
)
119+
120+
rank (2)
121+
allocate(self % data_array_int_2d(size(data_arr_int, 1), size(data_arr_int, 2)), &
122+
source = data_arr_int &
123+
)
124+
125+
rank (3)
126+
allocate(self % data_array_int_3d(size(data_arr_int, 1), size(data_arr_int, 2), size(data_arr_int, 3)), &
127+
source = data_arr_int &
128+
)
129+
130+
rank default
131+
print *, "ERRRORORORORO"
132+
end select
133+
134+
end subroutine ship_to_int_array
135+
98136
! ------------------ Destructor -------------------------
99137

100138
subroutine finalise(self)
101139

102140
class(ResultGen),intent(inout) :: self
103141

104142
self%tag = T_NONE
143+
if (allocated(self % data_array_int_1d)) deallocate(self%data_array_int_1d)
144+
if (allocated(self % data_array_int_2d)) deallocate(self%data_array_int_2d)
145+
if (allocated(self % data_array_int_3d)) deallocate(self%data_array_int_3d)
146+
105147
if (allocated(self % error_v)) deallocate(self % error_v)
106148

107149
end subroutine finalise
@@ -152,6 +194,13 @@ pure logical function is_dp(self)
152194

153195
end function is_dp
154196

197+
pure logical function is_arr_int(self)
198+
199+
class(ResultGen), intent(in) :: self
200+
201+
is_arr_int = (self % tag == T_ARR_INT)
202+
203+
end function is_arr_int
155204
! ------------------ Getter -------------------------
156205
!
157206
! pure function get_int(self) result(data_int)

src/example_fgen_basic/result/result_gen.py

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
from __future__ import annotations
66

7+
import numpy as np
78
from attrs import define
9+
from numpy.typing import NDArray
810

911
from example_fgen_basic.error_v import ErrorV
1012
from example_fgen_basic.pyfgen_runtime.exceptions import CompiledExtensionNotFoundError
@@ -23,14 +25,15 @@ class ResultGen:
2325
Result type that can hold values
2426
"""
2527

26-
data_v: int | float | None
28+
data_v: int | float | NDArray[np.int_] | None
2729
""" Data"""
2830

2931
error_v: ErrorV | None
3032
"""Error"""
3133

3234
__fs_int = m_result_w.s_int
3335
__fs_dp = m_result_w.s_dp
36+
__farr_int = m_result_w.arr_int
3437
__fs_err = m_result_w.s_err
3538

3639
@classmethod
@@ -65,6 +68,33 @@ def from_instance_index(cls, instance_index: int) -> ResultGen:
6568
error_v = None
6669
res = cls(data_v=data_v_float, error_v=error_v)
6770

71+
elif tag == cls.__farr_int:
72+
data_v_arr_int: NDArray[np.int_]
73+
data_shape: NDArray[np.int_] = m_result_w.get_data_dims(instance_index)
74+
ndims = (data_shape > 0).sum()
75+
76+
DIM1D = 1
77+
if ndims == DIM1D:
78+
data_v_arr_int = m_result_w.get_data_arr_int_1d(
79+
instance_index, d1=data_shape[0]
80+
)
81+
error_v = None
82+
elif ndims == DIM1D + 1:
83+
data_v_arr_int = m_result_w.get_data_arr_int_2d(
84+
instance_index, d1=data_shape[0], d2=data_shape[1]
85+
)
86+
error_v = None
87+
elif ndims == DIM1D + 2:
88+
data_v_arr_int = m_result_w.get_data_arr_int_3d(
89+
instance_index, d1=data_shape[0], d2=data_shape[1], d3=data_shape[2]
90+
)
91+
error_v = None
92+
else:
93+
msg = "Getter ERROR: Null array dimensions"
94+
raise ValueError(msg)
95+
96+
res = cls(data_v=data_v_arr_int, error_v=error_v)
97+
6898
elif tag == cls.__fs_err:
6999
data_v_err = None
70100
code, message = m_result_w.get_error(instance_index)
@@ -109,8 +139,24 @@ def build_fortran_instance(self) -> int:
109139
instance_index = m_result_w.build_instance_int(self.data_v)
110140
elif isinstance(self.data_v, float):
111141
instance_index = m_result_w.build_instance_dp(self.data_v)
142+
elif isinstance(self.data_v, np.ndarray) and np.issubdtype(
143+
self.data_v.dtype, np.integer
144+
):
145+
DIM1D = 1
146+
ndarray = np.array(self.data_v)
147+
if ndarray.ndim == DIM1D:
148+
instance_index = m_result_w.build_instance_arr_int_1d(self.data_v)
149+
elif ndarray.ndim == DIM1D + 1:
150+
instance_index = m_result_w.build_instance_arr_int_2d(self.data_v)
151+
elif ndarray.ndim == DIM1D + 2:
152+
instance_index = m_result_w.build_instance_arr_int_3d(self.data_v)
112153
else:
113-
msg = f"data_v={self.data_v}, error_v={self.error_v}"
114-
raise KeyError(msg)
154+
msg = f"Unexpected data_v={self.data_v}, error_v={self.error_v}"
155+
if isinstance(self.data_v, np.ndarray) and not np.issubdtype(
156+
self.data_v.dtype, np.integer
157+
):
158+
msg = f"Unexpected data_v={self.data_v} does not contain all integers"
159+
160+
raise ValueError(msg)
115161

116162
return instance_index

src/example_fgen_basic/result/result_manager.f90

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module m_result_manager
33
use kind_parameters, only: dp,i8
44
use m_error_v, only: ErrorV
55
use m_error_v_manager, only: error_v_manager_build_instance => build_instance
6-
use m_result_gen, only: ResultGen, T_CLAIM, T_NONE, T_INT, T_DP, T_ERR
6+
use m_result_gen, only: ResultGen, T_CLAIM, T_NONE, T_INT, T_DP, T_ARR_INT, T_ERR
77

88
implicit none
99
private
@@ -17,15 +17,16 @@ module m_result_manager
1717

1818
contains
1919

20-
subroutine build_instance(tag, data_int, data_dp, error_v, instance_index, res_check)
20+
subroutine build_instance(tag, data_int, data_dp, data_arr_int, error_v, instance_index, res_check)
2121

2222
integer, intent(in) :: tag
2323
integer(kind=i8), optional, intent(in) :: data_int
2424
real(kind=dp), optional, intent(in) :: data_dp
25+
integer(kind=i8), optional, intent(in) :: data_arr_int(..)
2526
type(ErrorV), optional, intent(in) :: error_v
2627

2728
integer, intent(out) :: instance_index
28-
type(ResultGen),optional, intent(out) :: res_check
29+
type(ResultGen), optional, intent(out) :: res_check
2930
integer :: cause
3031

3132
call ensure_array_capacity_for_instances(1)
@@ -39,7 +40,7 @@ subroutine build_instance(tag, data_int, data_dp, error_v, instance_index, res_c
3940

4041
! CHECK whether the instance_array(instance_index) % tag = T_CLAIM ?
4142
call instance_array(instance_index) % &
42-
build(tag=tag,data_int=data_int,data_dp=data_dp,&
43+
build(tag=tag,data_int=data_int,data_dp=data_dp,data_arr_int=data_arr_int,&
4344
error_v=error_v,res=res_check)
4445

4546
if (.not. res_check % is_error()) then
@@ -104,18 +105,20 @@ function finalise_instance(instance_index) result(state_index)
104105

105106
end function finalise_instance
106107

107-
subroutine set_instance_index_to(instance_index, data_int, data_dp, error_v, res_check)
108+
subroutine set_instance_index_to(instance_index, data_int, data_dp, data_arr_int, error_v, res_check)
108109

109110
integer, intent(in) :: instance_index
110111
integer(kind=i8),optional, intent(in) :: data_int
111112
real(kind=dp),optional, intent(in) :: data_dp
113+
integer(kind=i8), optional, intent(in) :: data_arr_int(..)
112114
type(ErrorV),optional, intent(in) :: error_v
113115

114116
type(ResultGen), intent(out) :: res_check
115117

116118
integer :: input_check
117119

118-
input_check = merge(1,0,present(data_int)) + merge(1,0,present(data_dp)) + merge(1,0,present(error_v))
120+
input_check = merge(1,0,present(data_int)) + merge(1,0,present(data_dp)) + &
121+
merge(1,0,present(data_arr_int)) + merge(1,0,present(error_v))
119122

120123
if (input_check == 0) then
121124

@@ -133,6 +136,8 @@ subroutine set_instance_index_to(instance_index, data_int, data_dp, error_v, res
133136
call instance_array(instance_index) % build (tag = T_INT,data_int=data_int)
134137
else if(present(data_dp)) then
135138
call instance_array(instance_index) % build (tag = T_DP,data_dp=data_dp)
139+
else if(present(data_arr_int)) then
140+
call instance_array(instance_index) % build (tag = T_ARR_INT,data_arr_int=data_arr_int)
136141
else if(present(error_v)) then
137142
call instance_array(instance_index) % build (tag = T_ERR,error_v = error_v)
138143
end if

0 commit comments

Comments
 (0)