Skip to content

Commit 3c212ab

Browse files
committed
Deploying to stdlib-fpm from @ fba31e0 🚀
1 parent f27f635 commit 3c212ab

File tree

3 files changed

+131
-0
lines changed

3 files changed

+131
-0
lines changed

example/example_cross_product.f90

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
program demo_cross_product
2+
use stdlib_linalg, only: cross_product
3+
implicit none
4+
real :: a(3), b(3), c(3)
5+
a = [1., 0., 0.]
6+
b = [0., 1., 0.]
7+
c = cross_product(a, b)
8+
!c = [0., 0., 1.]
9+
end program demo_cross_product

src/stdlib_linalg.f90

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module stdlib_linalg
1212
public :: eye
1313
public :: trace
1414
public :: outer_product
15+
public :: cross_product
1516
public :: is_square
1617
public :: is_diagonal
1718
public :: is_symmetric
@@ -240,6 +241,47 @@ end function outer_product_iint64
240241
end interface outer_product
241242

242243

244+
! Cross product (of two vectors)
245+
interface cross_product
246+
!! version: experimental
247+
!!
248+
!! Computes the cross product of two vectors, returning a rank-1 and size-3 array
249+
!! ([Specification](../page/specs/stdlib_linalg.html#cross_product-computes-the-cross-product-of-two-3-d-vectors))
250+
pure module function cross_product_rsp(a, b) result(res)
251+
real(sp), intent(in) :: a(3), b(3)
252+
real(sp) :: res(3)
253+
end function cross_product_rsp
254+
pure module function cross_product_rdp(a, b) result(res)
255+
real(dp), intent(in) :: a(3), b(3)
256+
real(dp) :: res(3)
257+
end function cross_product_rdp
258+
pure module function cross_product_csp(a, b) result(res)
259+
complex(sp), intent(in) :: a(3), b(3)
260+
complex(sp) :: res(3)
261+
end function cross_product_csp
262+
pure module function cross_product_cdp(a, b) result(res)
263+
complex(dp), intent(in) :: a(3), b(3)
264+
complex(dp) :: res(3)
265+
end function cross_product_cdp
266+
pure module function cross_product_iint8(a, b) result(res)
267+
integer(int8), intent(in) :: a(3), b(3)
268+
integer(int8) :: res(3)
269+
end function cross_product_iint8
270+
pure module function cross_product_iint16(a, b) result(res)
271+
integer(int16), intent(in) :: a(3), b(3)
272+
integer(int16) :: res(3)
273+
end function cross_product_iint16
274+
pure module function cross_product_iint32(a, b) result(res)
275+
integer(int32), intent(in) :: a(3), b(3)
276+
integer(int32) :: res(3)
277+
end function cross_product_iint32
278+
pure module function cross_product_iint64(a, b) result(res)
279+
integer(int64), intent(in) :: a(3), b(3)
280+
integer(int64) :: res(3)
281+
end function cross_product_iint64
282+
end interface cross_product
283+
284+
243285
! Check for squareness
244286
interface is_square
245287
!! version: experimental

src/stdlib_linalg_cross_product.f90

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
submodule (stdlib_linalg) stdlib_linalg_cross_product
2+
3+
implicit none
4+
5+
contains
6+
7+
pure module function cross_product_rsp(a, b) result(res)
8+
real(sp), intent(in) :: a(3), b(3)
9+
real(sp) :: res(3)
10+
11+
res(1) = a(2) * b(3) - a(3) * b(2)
12+
res(2) = a(3) * b(1) - a(1) * b(3)
13+
res(3) = a(1) * b(2) - a(2) * b(1)
14+
15+
end function cross_product_rsp
16+
pure module function cross_product_rdp(a, b) result(res)
17+
real(dp), intent(in) :: a(3), b(3)
18+
real(dp) :: res(3)
19+
20+
res(1) = a(2) * b(3) - a(3) * b(2)
21+
res(2) = a(3) * b(1) - a(1) * b(3)
22+
res(3) = a(1) * b(2) - a(2) * b(1)
23+
24+
end function cross_product_rdp
25+
pure module function cross_product_csp(a, b) result(res)
26+
complex(sp), intent(in) :: a(3), b(3)
27+
complex(sp) :: res(3)
28+
29+
res(1) = a(2) * b(3) - a(3) * b(2)
30+
res(2) = a(3) * b(1) - a(1) * b(3)
31+
res(3) = a(1) * b(2) - a(2) * b(1)
32+
33+
end function cross_product_csp
34+
pure module function cross_product_cdp(a, b) result(res)
35+
complex(dp), intent(in) :: a(3), b(3)
36+
complex(dp) :: res(3)
37+
38+
res(1) = a(2) * b(3) - a(3) * b(2)
39+
res(2) = a(3) * b(1) - a(1) * b(3)
40+
res(3) = a(1) * b(2) - a(2) * b(1)
41+
42+
end function cross_product_cdp
43+
pure module function cross_product_iint8(a, b) result(res)
44+
integer(int8), intent(in) :: a(3), b(3)
45+
integer(int8) :: res(3)
46+
47+
res(1) = a(2) * b(3) - a(3) * b(2)
48+
res(2) = a(3) * b(1) - a(1) * b(3)
49+
res(3) = a(1) * b(2) - a(2) * b(1)
50+
51+
end function cross_product_iint8
52+
pure module function cross_product_iint16(a, b) result(res)
53+
integer(int16), intent(in) :: a(3), b(3)
54+
integer(int16) :: res(3)
55+
56+
res(1) = a(2) * b(3) - a(3) * b(2)
57+
res(2) = a(3) * b(1) - a(1) * b(3)
58+
res(3) = a(1) * b(2) - a(2) * b(1)
59+
60+
end function cross_product_iint16
61+
pure module function cross_product_iint32(a, b) result(res)
62+
integer(int32), intent(in) :: a(3), b(3)
63+
integer(int32) :: res(3)
64+
65+
res(1) = a(2) * b(3) - a(3) * b(2)
66+
res(2) = a(3) * b(1) - a(1) * b(3)
67+
res(3) = a(1) * b(2) - a(2) * b(1)
68+
69+
end function cross_product_iint32
70+
pure module function cross_product_iint64(a, b) result(res)
71+
integer(int64), intent(in) :: a(3), b(3)
72+
integer(int64) :: res(3)
73+
74+
res(1) = a(2) * b(3) - a(3) * b(2)
75+
res(2) = a(3) * b(1) - a(1) * b(3)
76+
res(3) = a(1) * b(2) - a(2) * b(1)
77+
78+
end function cross_product_iint64
79+
80+
end submodule

0 commit comments

Comments
 (0)