Skip to content

Commit 58d128a

Browse files
committed
feat(scalar_1D_t): type-bound division operator
This commit adds 1. operator(/) for an integer denominator and 2. a corresponding unit test.
1 parent 78833ac commit 58d128a

4 files changed

Lines changed: 45 additions & 5 deletions

File tree

‎example/burgers-1D.F90‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ program burgers_1D
6464
double precision dt
6565
dt = 1D0
6666
!associate(dt_du22_dx => dt * .d_dx. ((u**2)/2))
67-
associate(dt_du22_dx => u**2)
67+
associate(dt_du22_dx => (u**2)/2)
6868
end associate
6969
end block
7070

‎src/formal/scalar_1D_s.F90‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ pure function cell_center_locations(x_min, x_max, cells) result(x)
6565

6666
#endif
6767

68+
module procedure divide_by_integer
69+
ratio%tensor_1D_t = tensor_1D_t( &
70+
values = self%values_/2, x_min = self%x_min_, x_max = self%x_max_, cells = self%cells_, order = self%order_ &
71+
)
72+
ratio%gradient_operator_1D_ = gradient_operator_1D_t( &
73+
k = self%order_, dx = (self%x_max_ - self%x_min_)/self%cells_, cells = self%cells_ &
74+
)
75+
end procedure
76+
6877
module procedure exponentiate
6978
power%tensor_1D_t = tensor_1D_t( &
7079
values = self%values_**2, x_min = self%x_min_, x_max = self%x_max_, cells = self%cells_, order = self%order_ &

‎src/formal/tensors_1D_m.F90‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,18 @@ pure module function construct_1D_tensor_from_components(values, x_min, x_max, c
8181
private
8282
type(gradient_operator_1D_t) gradient_operator_1D_
8383
contains
84+
generic :: grid => scalar_1D_grid
85+
generic :: values => scalar_1D_values
86+
generic :: operator(/) => divide_by_integer
8487
generic :: operator(**) => exponentiate
8588
generic :: operator(.grad.) => grad
8689
generic :: operator(.laplacian.) => laplacian
87-
generic :: grid => scalar_1D_grid
88-
generic :: values => scalar_1D_values
90+
procedure, non_overridable, private :: scalar_1D_values
91+
procedure, non_overridable, private :: scalar_1D_grid
92+
procedure, non_overridable, private :: divide_by_integer
8993
procedure, non_overridable, private :: exponentiate
9094
procedure, non_overridable, private :: grad
9195
procedure, non_overridable, private :: laplacian
92-
procedure, non_overridable, private :: scalar_1D_values
93-
procedure, non_overridable, private :: scalar_1D_grid
9496
end type
9597

9698
interface scalar_1D_t
@@ -334,6 +336,14 @@ pure module function exponentiate(self, exponent) result(power)
334336
type(scalar_1D_t) power
335337
end function
336338

339+
pure module function divide_by_integer(self, denominator) result(ratio)
340+
!! Result is scalar_1D_t "self" divided by the integer denominator
341+
implicit none
342+
class(scalar_1D_t), intent(in) :: self
343+
integer, intent(in) :: denominator
344+
type(scalar_1D_t) ratio
345+
end function
346+
337347
pure module function laplacian(self) result(laplacian_1D)
338348
!! Result is mimetic Laplacian of the scalar_1D_t "self"
339349
implicit none

‎test/scalar_1D_test_m.F90‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ function results() result(test_results)
4141

4242
test_results = scalar_1D_test%run([ &
4343
test_description_t('raising a 1D scalar field to a power', usher(check_exponentiation)) &
44+
,test_description_t('dividing a 1D scalar field by a constant', usher(check_divison_operator)) &
4445
])
4546
end function
4647

@@ -70,4 +71,24 @@ function check_exponentiation() result(test_diagnosis)
7071

7172
end function
7273

74+
function check_divison_operator() result(test_diagnosis)
75+
type(test_diagnosis_t) test_diagnosis
76+
procedure(scalar_1D_initializer_i), pointer :: scalar_1D_initializer => null()
77+
integer order
78+
79+
scalar_1D_initializer => line
80+
test_diagnosis = passing_test()
81+
82+
do order = 2, 4, 2
83+
associate(scalar_1D => scalar_1D_t(scalar_1D_initializer, order=order, cells=10, x_min=0D0, x_max=10D0) )
84+
associate( scalar_1D_squared => scalar_1D/2 )
85+
test_diagnosis = test_diagnosis .also. .all. &
86+
(scalar_1D_squared%values() .approximates. scalar_1D%values()/2 .within. tolerance) &
87+
// string_t(" for order ") // string_t(order)
88+
end associate
89+
end associate
90+
end do
91+
92+
end function
93+
7394
end module scalar_1D_test_m

0 commit comments

Comments
 (0)