|
1 | 1 | module subdomain_m |
2 | | - use assert_m, only : assert |
3 | 2 | implicit none |
4 | 3 |
|
5 | 4 | private |
6 | 5 | public :: subdomain_t |
7 | | - public :: operator(.laplacian.) |
8 | | - public :: step |
9 | 6 |
|
10 | 7 | type subdomain_t |
11 | 8 | private |
12 | 9 | real, allocatable :: s_(:,:,:) |
13 | 10 | contains |
14 | 11 | procedure, pass(self) :: define |
15 | | - procedure, pass(rhs) :: multiply |
16 | | - generic :: operator(*) => multiply |
17 | | - generic :: operator(+) => add |
18 | | - generic :: assignment(=) => assign_ |
19 | 12 | procedure dx |
20 | 13 | procedure dy |
21 | 14 | procedure dz |
22 | 15 | procedure values |
| 16 | + generic :: operator(*) => multiply |
| 17 | + generic :: operator(+) => add |
| 18 | + generic :: operator(.laplacian.) => laplacian |
| 19 | + generic :: assignment(=) => assign_ |
| 20 | + procedure, private, pass(rhs) :: multiply |
| 21 | + procedure, private :: laplacian |
23 | 22 | procedure, private :: add |
24 | 23 | procedure, private :: assign_ |
25 | 24 | end type |
26 | 25 |
|
27 | | - interface operator(.laplacian.) |
28 | | - |
29 | | - module procedure laplacian |
30 | | - !pure module function laplacian(rhs) result(laplacian_rhs) |
31 | | - ! implicit none |
32 | | - ! type(subdomain_t), intent(in) :: rhs[*] |
33 | | - ! type(subdomain_t) laplacian_rhs |
34 | | - !end function |
35 | | - |
36 | | - end interface |
37 | | - |
38 | 26 | interface |
39 | 27 |
|
| 28 | + pure module function laplacian(rhs) result(laplacian_rhs) |
| 29 | + implicit none |
| 30 | + class(subdomain_t), intent(in) :: rhs[*] |
| 31 | + type(subdomain_t) laplacian_rhs |
| 32 | + end function |
| 33 | + |
40 | 34 | module subroutine define(side, boundary_val, internal_val, n, self) |
41 | 35 | implicit none |
42 | 36 | real, intent(in) :: side, boundary_val, internal_val |
@@ -96,62 +90,4 @@ module subroutine assign_(lhs, rhs) |
96 | 90 |
|
97 | 91 | end interface |
98 | 92 |
|
99 | | - real dx_, dy_, dz_ |
100 | | - integer my_nx, nx, ny, nz, me, num_subdomains, my_internal_west, my_internal_east |
101 | | - |
102 | | -contains |
103 | | - |
104 | | - pure module function laplacian(rhs) result(laplacian_rhs) |
105 | | - type(subdomain_t), intent(in) :: rhs[*] |
106 | | - type(subdomain_t) laplacian_rhs |
107 | | - |
108 | | - integer i, j, k |
109 | | - real, allocatable :: halo_west(:,:), halo_east(:,:) |
110 | | - |
111 | | - call assert(allocated(rhs%s_), "subdomain_t%laplacian: allocated(rhs%s_)") |
112 | | - |
113 | | - allocate(laplacian_rhs%s_, mold=rhs%s_) |
114 | | - |
115 | | - if (me==1) then |
116 | | - halo_west = rhs%s_(1,:,:) |
117 | | - else |
118 | | - halo_west = rhs[me-1]%s_(ubound(rhs[me-1]%s_,1),:,:) |
119 | | - end if |
120 | | - i = my_internal_west |
121 | | - call assert(i+1<=my_nx,"laplacian: westernmost subdomain too small") |
122 | | - do concurrent(j=2:ny-1, k=2:nz-1) |
123 | | - laplacian_rhs%s_(i,j,k) = ( halo_west(j,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i+1,j ,k ))/dx_**2 + & |
124 | | - (rhs%s_(i,j-1,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j+1,k ))/dy_**2 + & |
125 | | - (rhs%s_(i,j ,k-1) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j ,k+1))/dz_**2 |
126 | | - end do |
127 | | - |
128 | | - do concurrent(i=my_internal_west+1:my_internal_east-1, j=2:ny-1, k=2:nz-1) |
129 | | - laplacian_rhs%s_(i,j,k) = (rhs%s_(i-1,j ,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i+1,j ,k ))/dx_**2 + & |
130 | | - (rhs%s_(i ,j-1,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j+1,k ))/dy_**2 + & |
131 | | - (rhs%s_(i ,j ,k-1) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j ,k+1))/dz_**2 |
132 | | - end do |
133 | | - |
134 | | - if (me==1) then |
135 | | - halo_east = rhs%s_(1,:,:) |
136 | | - else |
137 | | - halo_east = rhs[me+1]%s_(lbound(rhs[me+1]%s_,1),:,:) |
138 | | - end if |
139 | | - i = my_internal_east |
140 | | - call assert(i-1>0,"laplacian: easternmost subdomain too small") |
141 | | - do concurrent(j=2:ny-1, k=2:nz-1) |
142 | | - laplacian_rhs%s_(i,j,k) = (rhs%s_(i-1,j ,k ) - 2*rhs%s_(i,j,k) + halo_east(j ,k ))/dx_**2 + & |
143 | | - (rhs%s_(i ,j-1,k ) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j+1,k ))/dy_**2 + & |
144 | | - (rhs%s_(i ,j ,k-1) - 2*rhs%s_(i,j,k) + rhs%s_(i ,j ,k+1))/dz_**2 |
145 | | - end do |
146 | | - |
147 | | - laplacian_rhs%s_(:, 1,:) = 0. |
148 | | - laplacian_rhs%s_(:,ny,:) = 0. |
149 | | - laplacian_rhs%s_(:,:, 1) = 0. |
150 | | - laplacian_rhs%s_(:,:,nz) = 0. |
151 | | - if (me==1) laplacian_rhs%s_(1,:,:) = 0. |
152 | | - if (me==num_subdomains) laplacian_rhs%s_(my_nx,:,:) = 0. |
153 | | - |
154 | | - end function |
155 | | - |
156 | | - |
157 | 93 | end module |
0 commit comments