976 REAL(kind=
dp),
DIMENSION(4),
INTENT(in) :: weights_1d
977 REAL(kind=
dp),
INTENT(in) :: w_border0
978 REAL(kind=
dp),
DIMENSION(3),
INTENT(in) :: w_border1
979 LOGICAL,
INTENT(in) :: pbc
980 LOGICAL,
INTENT(in),
OPTIONAL :: safe_computation
982 CHARACTER(len=*),
PARAMETER :: routinen =
'add_coarse2fine'
984 INTEGER :: coarse_slice_size, f_shift(3), fi, fi_lb, fi_ub, fj, fk, handle, handle2, i, ii, &
985 ij, ik, ip, j, k, my_lb, my_ub, n_procs, p, p_lb, p_old, p_ub, rcv_tot_size, rest_b, &
986 s(3), send_tot_size, sf, shift, ss, x, x_att, xx
987 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: rcv_offset, rcv_size, real_rcv_size, &
988 send_offset, send_size, sent_size
989 INTEGER,
DIMENSION(2, 3) :: coarse_bo, coarse_gbo, fine_bo, &
990 fine_gbo, my_coarse_bo
991 INTEGER,
DIMENSION(:),
POINTER :: pos_of_x
992 LOGICAL :: has_i_lbound, has_i_ubound, is_split, &
994 REAL(kind=
dp) :: v0, v1, v2, v3, wi, wj, wk
995 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: rcv_buf, send_buf
996 REAL(kind=
dp),
DIMENSION(3) :: w_0, ww0
997 REAL(kind=
dp),
DIMENSION(4) :: w_1, ww1
998 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: coarse_coeffs, fine_values
1000 CALL timeset(routinen, handle)
1003 IF (
PRESENT(safe_computation)) safe_calc = safe_computation
1004 ii = coarse_coeffs_pw%pw_grid%para%group%compare(fine_values_pw%pw_grid%para%group)
1006 my_coarse_bo = coarse_coeffs_pw%pw_grid%bounds_local
1007 coarse_gbo = coarse_coeffs_pw%pw_grid%bounds
1008 fine_bo = fine_values_pw%pw_grid%bounds_local
1009 fine_gbo = fine_values_pw%pw_grid%bounds
1010 f_shift = fine_gbo(1, :) - 2*coarse_gbo(1, :)
1013 coarse_bo(i, j) = floor((fine_bo(i, j) - f_shift(j))/2.)
1016 IF (fine_bo(1, 1) <= fine_bo(2, 1))
THEN
1017 coarse_bo(1, 1) = floor((fine_bo(1, 1) - 2 - f_shift(1))/2.)
1018 coarse_bo(2, 1) = floor((fine_bo(2, 1) + 3 - f_shift(1))/2.)
1020 coarse_bo(1, 1) = coarse_gbo(2, 1)
1021 coarse_bo(2, 1) = coarse_gbo(2, 1) - 1
1023 is_split = any(coarse_gbo(:, 1) /= my_coarse_bo(:, 1))
1024 IF (.NOT. is_split .OR. .NOT. pbc)
THEN
1025 coarse_bo(1, 1) = max(coarse_gbo(1, 1), coarse_bo(1, 1))
1026 coarse_bo(2, 1) = min(coarse_gbo(2, 1), coarse_bo(2, 1))
1028 has_i_ubound = (fine_gbo(2, 1) /= fine_bo(2, 1)) .OR. pbc .AND. is_split
1029 has_i_lbound = (fine_gbo(1, 1) /= fine_bo(1, 1)) .OR. pbc .AND. is_split
1032 cpassert(all(fine_gbo(1, :) == 2*coarse_gbo(1, :) + f_shift))
1033 cpassert(all(fine_gbo(2, :) == 2*coarse_gbo(2, :) + 1 + f_shift))
1035 cpassert(all(fine_gbo(2, :) == 2*coarse_gbo(2, :) + f_shift))
1036 cpassert(all(fine_gbo(1, :) == 2*coarse_gbo(1, :) + f_shift))
1039 coarse_coeffs => coarse_coeffs_pw%array
1041 s(i) = coarse_gbo(2, i) - coarse_gbo(1, i) + 1
1046 CALL timeset(routinen//
"_comm", handle2)
1047 coarse_slice_size = (coarse_bo(2, 2) - coarse_bo(1, 2) + 1)* &
1048 (coarse_bo(2, 3) - coarse_bo(1, 3) + 1)
1049 n_procs = coarse_coeffs_pw%pw_grid%para%group%num_pe
1050 ALLOCATE (send_size(0:n_procs - 1), send_offset(0:n_procs - 1), &
1051 sent_size(0:n_procs - 1), rcv_size(0:n_procs - 1), &
1052 rcv_offset(0:n_procs - 1), real_rcv_size(0:n_procs - 1))
1056 pos_of_x => coarse_coeffs_pw%pw_grid%para%pos_of_x
1057 p_old = pos_of_x(coarse_gbo(1, 1) &
1058 +
modulo(coarse_bo(1, 1) - coarse_gbo(1, 1), s(1)))
1060 DO x = coarse_bo(1, 1), coarse_bo(2, 1)
1061 p = pos_of_x(coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1)))
1062 rcv_size(p) = rcv_size(p) + coarse_slice_size
1067 pos_of_x => fine_values_pw%pw_grid%para%pos_of_x
1068 sf = fine_gbo(2, 1) - fine_gbo(1, 1) + 1
1069 fi_lb = 2*my_coarse_bo(1, 1) - 3 + f_shift(1)
1070 fi_ub = 2*my_coarse_bo(2, 1) + 3 + f_shift(1)
1072 fi_lb = max(fi_lb, fine_gbo(1, 1))
1073 fi_ub = min(fi_ub, fine_gbo(2, 1))
1075 fi_ub = min(fi_ub, fi_lb + sf - 1)
1077 p_old = pos_of_x(fine_gbo(1, 1) +
modulo(fi_lb - fine_gbo(1, 1), sf))
1078 p_lb = floor((fi_lb - 2 - f_shift(1))/2.)
1081 p = pos_of_x(fine_gbo(1, 1) +
modulo(x - fine_gbo(1, 1), sf))
1082 IF (p /= p_old)
THEN
1083 p_ub = floor((x - 1 + 3 - f_shift(1))/2.)
1085 send_size(p_old) = send_size(p_old) + (min(p_ub, my_coarse_bo(2, 1)) &
1086 - max(p_lb, my_coarse_bo(1, 1)) + 1)*coarse_slice_size
1089 DO xx = p_lb, coarse_gbo(1, 1) - 1
1090 x_att = coarse_gbo(1, 1) +
modulo(xx - coarse_gbo(1, 1), s(1))
1091 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
1092 send_size(p_old) = send_size(p_old) + coarse_slice_size
1095 DO xx = coarse_gbo(2, 1) + 1, p_ub
1096 x_att = coarse_gbo(1, 1) +
modulo(xx - coarse_gbo(1, 1), s(1))
1097 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
1098 send_size(p_old) = send_size(p_old) + coarse_slice_size
1104 p_lb = floor((x - 2 - f_shift(1))/2.)
1107 p_ub = floor((fi_ub + 3 - f_shift(1))/2.)
1109 send_size(p_old) = send_size(p_old) + (min(p_ub, my_coarse_bo(2, 1)) &
1110 - max(p_lb, my_coarse_bo(1, 1)) + 1)*coarse_slice_size
1113 DO xx = p_lb, coarse_gbo(1, 1) - 1
1114 x_att = coarse_gbo(1, 1) +
modulo(xx - coarse_gbo(1, 1), s(1))
1115 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
1116 send_size(p_old) = send_size(p_old) + coarse_slice_size
1119 DO xx = coarse_gbo(2, 1) + 1, p_ub
1120 x_att = coarse_gbo(1, 1) +
modulo(xx - coarse_gbo(1, 1), s(1))
1121 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
1122 send_size(p_old) = send_size(p_old) + coarse_slice_size
1129 DO ip = 0, n_procs - 1
1130 send_offset(ip) = send_tot_size
1131 send_tot_size = send_tot_size + send_size(ip)
1133 ALLOCATE (send_buf(0:send_tot_size - 1))
1136 DO ip = 0, n_procs - 1
1137 rcv_offset(ip) = rcv_tot_size
1138 rcv_tot_size = rcv_tot_size + rcv_size(ip)
1140 IF (.NOT. rcv_tot_size == (coarse_bo(2, 1) - coarse_bo(1, 1) + 1)*coarse_slice_size)
THEN
1141 cpabort(
"Error calculating rcv_tot_size ")
1143 ALLOCATE (rcv_buf(0:rcv_tot_size - 1))
1147 p_old = pos_of_x(fine_gbo(1, 1) +
modulo(fi_lb - fine_gbo(1, 1), sf))
1148 p_lb = floor((fi_lb - 2 - f_shift(1))/2.)
1149 sent_size(:) = send_offset
1150 ss = my_coarse_bo(2, 1) - my_coarse_bo(1, 1) + 1
1152 p = pos_of_x(fine_gbo(1, 1) +
modulo(x - fine_gbo(1, 1), sf))
1153 IF (p /= p_old)
THEN
1154 shift = floor((fine_gbo(1, 1) +
modulo(x - 1 - fine_gbo(1, 1), sf) - f_shift(1))/2._dp) - &
1155 floor((x - 1 - f_shift(1))/2._dp)
1156 p_ub = floor((x - 1 + 3 - f_shift(1))/2._dp)
1159 DO xx = p_lb + shift, coarse_gbo(1, 1) - 1
1160 x_att = coarse_gbo(1, 1) +
modulo(xx - coarse_gbo(1, 1), sf)
1161 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
1162 CALL dcopy(coarse_slice_size, &
1163 coarse_coeffs(x_att, my_coarse_bo(1, 2), &
1164 my_coarse_bo(1, 3)), ss, send_buf(sent_size(p_old)), 1)
1165 sent_size(p_old) = sent_size(p_old) + coarse_slice_size
1170 ii = sent_size(p_old)
1171 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
1172 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
1173 DO i = max(p_lb + shift, my_coarse_bo(1, 1)), min(p_ub + shift, my_coarse_bo(2, 1))
1174 send_buf(ii) = coarse_coeffs(i, j, k)
1179 sent_size(p_old) = ii
1182 DO xx = coarse_gbo(2, 1) + 1, p_ub + shift
1183 x_att = coarse_gbo(1, 1) +
modulo(xx - coarse_gbo(1, 1), s(1))
1184 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
1185 CALL dcopy(coarse_slice_size, &
1186 coarse_coeffs(x_att, my_coarse_bo(1, 2), &
1187 my_coarse_bo(1, 3)), ss, &
1188 send_buf(sent_size(p_old)), 1)
1189 sent_size(p_old) = sent_size(p_old) + coarse_slice_size
1195 p_lb = floor((x - 2 - f_shift(1))/2.)
1198 shift = floor((fine_gbo(1, 1) +
modulo(x - 1 - fine_gbo(1, 1), sf) - f_shift(1))/2._dp) - &
1199 floor((x - 1 - f_shift(1))/2._dp)
1200 p_ub = floor((fi_ub + 3 - f_shift(1))/2.)
1203 DO xx = p_lb + shift, coarse_gbo(1, 1) - 1
1204 x_att = coarse_gbo(1, 1) +
modulo(xx - coarse_gbo(1, 1), s(1))
1205 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
1206 CALL dcopy(coarse_slice_size, &
1207 coarse_coeffs(x_att, my_coarse_bo(1, 2), &
1208 my_coarse_bo(1, 3)), ss, send_buf(sent_size(p_old)), 1)
1209 sent_size(p_old) = sent_size(p_old) + coarse_slice_size
1214 ii = sent_size(p_old)
1215 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
1216 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
1217 DO i = max(p_lb + shift, my_coarse_bo(1, 1)), min(p_ub + shift, my_coarse_bo(2, 1))
1218 send_buf(ii) = coarse_coeffs(i, j, k)
1223 sent_size(p_old) = ii
1226 DO xx = coarse_gbo(2, 1) + 1, p_ub + shift
1227 x_att = coarse_gbo(1, 1) +
modulo(xx - coarse_gbo(1, 1), s(1))
1228 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
1229 CALL dcopy(coarse_slice_size, &
1230 coarse_coeffs(x_att, my_coarse_bo(1, 2), &
1231 my_coarse_bo(1, 3)), ss, send_buf(sent_size(p_old)), 1)
1232 sent_size(p_old) = sent_size(p_old) + coarse_slice_size
1237 cpassert(all(sent_size(:n_procs - 2) == send_offset(1:)))
1238 cpassert(sent_size(n_procs - 1) == send_tot_size)
1240 CALL coarse_coeffs_pw%pw_grid%para%group%alltoall(send_size, real_rcv_size, 1)
1241 cpassert(all(real_rcv_size == rcv_size))
1243 CALL coarse_coeffs_pw%pw_grid%para%group%alltoall(sb=send_buf, scount=send_size, sdispl=send_offset, &
1244 rb=rcv_buf, rcount=rcv_size, rdispl=rcv_offset)
1249 ALLOCATE (coarse_coeffs(coarse_bo(1, 1):coarse_bo(2, 1), &
1250 coarse_bo(1, 2):coarse_bo(2, 2), &
1251 coarse_bo(1, 3):coarse_bo(2, 3)))
1253 my_lb = max(coarse_gbo(1, 1), coarse_bo(1, 1))
1254 my_ub = min(coarse_gbo(2, 1), coarse_bo(2, 1))
1255 pos_of_x => coarse_coeffs_pw%pw_grid%para%pos_of_x
1256 sent_size(:) = rcv_offset
1257 ss = coarse_bo(2, 1) - coarse_bo(1, 1) + 1
1258 DO x = my_ub + 1, coarse_bo(2, 1)
1259 p_old = pos_of_x(coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1)))
1260 CALL dcopy(coarse_slice_size, &
1261 rcv_buf(sent_size(p_old)), 1, &
1262 coarse_coeffs(x, coarse_bo(1, 2), &
1263 coarse_bo(1, 3)), ss)
1264 sent_size(p_old) = sent_size(p_old) + coarse_slice_size
1266 p_old = pos_of_x(coarse_gbo(1, 1) &
1267 +
modulo(my_lb - coarse_gbo(1, 1), s(1)))
1270 p = pos_of_x(coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1)))
1271 IF (p /= p_old)
THEN
1274 ii = sent_size(p_old)
1275 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
1276 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
1278 coarse_coeffs(i, j, k) = rcv_buf(ii)
1283 sent_size(p_old) = ii
1288 rcv_size(p) = rcv_size(p) + coarse_slice_size
1291 ii = sent_size(p_old)
1292 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
1293 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
1295 coarse_coeffs(i, j, k) = rcv_buf(ii)
1300 sent_size(p_old) = ii
1301 DO x = coarse_bo(1, 1), my_lb - 1
1302 p_old = pos_of_x(coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1)))
1303 CALL dcopy(coarse_slice_size, &
1304 rcv_buf(sent_size(p_old)), 1, &
1305 coarse_coeffs(x, coarse_bo(1, 2), &
1306 coarse_bo(1, 3)), ss)
1307 sent_size(p_old) = sent_size(p_old) + coarse_slice_size
1310 cpassert(all(sent_size(0:n_procs - 2) == rcv_offset(1:)))
1311 cpassert(sent_size(n_procs - 1) == rcv_tot_size)
1314 DEALLOCATE (send_size, send_offset, rcv_size, rcv_offset)
1315 DEALLOCATE (send_buf, rcv_buf, real_rcv_size)
1316 CALL timestop(handle2)
1319 fine_values => fine_values_pw%array
1320 w_0 = [weights_1d(3), weights_1d(1), weights_1d(3)]
1321 w_1 = [weights_1d(4), weights_1d(2), weights_1d(2), weights_1d(4)]
1323 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
1326 wk = weights_1d(abs(ik) + 1)
1327 fk = fine_gbo(1, 3) +
modulo(2*k + ik - fine_gbo(1, 3) + f_shift(3), 2*s(3))
1329 fk = 2*k + ik + f_shift(3)
1330 IF (fk <= fine_bo(1, 3) + 1 .OR. fk >= fine_bo(2, 3) - 1)
THEN
1331 IF (fk < fine_bo(1, 3) .OR. fk > fine_bo(2, 3)) cycle
1332 IF (fk == fine_bo(1, 3) .OR. fk == fine_bo(2, 3))
THEN
1335 ELSE IF (fk == 2*coarse_bo(1, 3) + 1 + f_shift(3))
THEN
1344 cpabort(
"Only 1, -1, -3 are supported as the value of ik")
1356 cpabort(
"Only 3, 1, -1 are supported as the value of ik")
1361 wk = weights_1d(abs(ik) + 1)
1364 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
1367 wj = weights_1d(abs(ij) + 1)*wk
1368 fj = fine_gbo(1, 2) +
modulo(2*j + ij - fine_gbo(1, 2) + f_shift(2), 2*s(2))
1370 fj = 2*j + ij + f_shift(2)
1371 IF (fj <= fine_bo(1, 2) + 1 .OR. fj >= fine_bo(2, 2) - 1)
THEN
1372 IF (fj < fine_bo(1, 2) .OR. fj > fine_bo(2, 2)) cycle
1373 IF (fj == fine_bo(1, 2) .OR. fj == fine_bo(2, 2))
THEN
1376 ELSE IF (fj == 2*coarse_bo(1, 2) + 1 + f_shift(2))
THEN
1379 wj = w_border1(1)*wk
1381 wj = w_border1(2)*wk
1383 wj = w_border1(3)*wk
1390 wj = w_border1(1)*wk
1392 wj = w_border1(2)*wk
1394 wj = w_border1(3)*wk
1400 wj = weights_1d(abs(ij) + 1)*wk
1404 IF (fine_bo(2, 1) - fine_bo(1, 1) < 7 .OR. safe_calc)
THEN
1406 DO i = coarse_bo(1, 1), coarse_bo(2, 1)
1408 IF (pbc .AND. .NOT. is_split)
THEN
1409 wi = weights_1d(abs(ii) + 1)*wj
1410 fi = fine_gbo(1, 1) +
modulo(2*i + ii - fine_gbo(1, 1) + f_shift(1), 2*s(1))
1412 fi = 2*i + ii + f_shift(1)
1413 IF (fi < fine_bo(1, 1) .OR. fi > fine_bo(2, 1)) cycle
1414 IF (.NOT. pbc .AND. (fi <= fine_gbo(1, 1) + 1 .OR. &
1415 fi >= fine_gbo(2, 1) - 1))
THEN
1416 IF (fi == fine_gbo(1, 1) .OR. fi == fine_gbo(2, 1))
THEN
1419 ELSE IF (fi == fine_gbo(1, 1) + 1)
THEN
1422 wi = w_border1(1)*wj
1424 wi = w_border1(2)*wj
1426 wi = w_border1(3)*wj
1433 wi = w_border1(1)*wj
1435 wi = w_border1(2)*wj
1437 wi = w_border1(3)*wj
1443 wi = weights_1d(abs(ii) + 1)*wj
1446 fine_values(fi, fj, fk) = &
1447 fine_values(fi, fj, fk) + &
1448 wi*coarse_coeffs(i, j, k)
1456 IF (pbc .AND. .NOT. is_split)
THEN
1457 v3 = coarse_coeffs(coarse_bo(2, 1), j, k)
1459 fi = 2*i + f_shift(1)
1460 v0 = coarse_coeffs(i, j, k)
1461 v1 = coarse_coeffs(i + 1, j, k)
1462 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1463 ww0(1)*v3 + ww0(2)*v0 + ww0(3)*v1
1464 v2 = coarse_coeffs(i + 2, j, k)
1466 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1467 ww1(1)*v3 + ww1(2)*v0 + ww1(3)*v1 + ww1(4)*v2
1468 ELSE IF (.NOT. has_i_lbound)
THEN
1470 fi = 2*i + f_shift(1)
1471 v0 = coarse_coeffs(i, j, k)
1472 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1474 v1 = coarse_coeffs(i + 1, j, k)
1475 v2 = coarse_coeffs(i + 2, j, k)
1477 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1478 wj*(w_border1(1)*v0 + w_border1(2)*v1 + &
1482 v0 = coarse_coeffs(i, j, k)
1483 v1 = coarse_coeffs(i + 1, j, k)
1484 v2 = coarse_coeffs(i + 2, j, k)
1485 fi = 2*i + f_shift(1) + 1
1486 IF (.NOT. (fi + 1 == fine_bo(1, 1) .OR. &
1487 fi + 2 == fine_bo(1, 1)))
THEN
1488 CALL cp_abort(__location__, &
1489 "unexpected start index "// &
1495 IF (fi >= fine_bo(1, 1))
THEN
1496 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1497 ww0(1)*v0 + ww0(2)*v1 + &
1500 cpassert(fi + 1 == fine_bo(1, 1))
1504 DO i = coarse_bo(1, 1) + 3, floor((fine_bo(2, 1) - f_shift(1))/2.) - 3, 4
1505 v3 = coarse_coeffs(i, j, k)
1507 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1508 (ww1(1)*v0 + ww1(2)*v1 + &
1509 ww1(3)*v2 + ww1(4)*v3)
1511 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1512 (ww0(1)*v1 + ww0(2)*v2 + &
1514 v0 = coarse_coeffs(i + 1, j, k)
1516 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1517 (ww1(4)*v0 + ww1(1)*v1 + &
1518 ww1(2)*v2 + ww1(3)*v3)
1520 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1521 (ww0(1)*v2 + ww0(2)*v3 + &
1523 v1 = coarse_coeffs(i + 2, j, k)
1525 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1526 (ww1(3)*v0 + ww1(4)*v1 + &
1527 ww1(1)*v2 + ww1(2)*v3)
1529 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1530 (ww0(1)*v3 + ww0(2)*v0 + &
1532 v2 = coarse_coeffs(i + 3, j, k)
1534 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1535 (ww1(2)*v0 + ww1(3)*v1 + &
1536 ww1(4)*v2 + ww1(1)*v3)
1538 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1539 (ww0(1)*v0 + ww0(2)*v1 + &
1544 rest_b =
modulo(floor((fine_bo(2, 1) - f_shift(1))/2.) - coarse_bo(1, 1) - 3 + 1, 4)
1545 IF (rest_b > 0)
THEN
1546 i = floor((fine_bo(2, 1) - f_shift(1))/2.) - rest_b + 1
1547 v3 = coarse_coeffs(i, j, k)
1549 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1550 (ww1(1)*v0 + ww1(2)*v1 + &
1551 ww1(3)*v2 + ww1(4)*v3)
1553 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1554 (ww0(1)*v1 + ww0(2)*v2 + &
1556 IF (rest_b > 1)
THEN
1557 v0 = coarse_coeffs(i + 1, j, k)
1559 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1560 (ww1(4)*v0 + ww1(1)*v1 + &
1561 ww1(2)*v2 + ww1(3)*v3)
1563 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1564 (ww0(1)*v2 + ww0(2)*v3 + &
1566 IF (rest_b > 2)
THEN
1567 v1 = coarse_coeffs(i + 2, j, k)
1569 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1570 (ww1(3)*v0 + ww1(4)*v1 + &
1571 ww1(1)*v2 + ww1(2)*v3)
1573 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1574 (ww0(1)*v3 + ww0(2)*v0 + &
1576 IF (pbc .AND. .NOT. is_split)
THEN
1577 v2 = coarse_coeffs(coarse_bo(1, 1), j, k)
1579 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1580 ww1(1)*v3 + ww1(2)*v0 + ww1(3)*v1 + ww1(4)*v2
1582 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1583 ww0(1)*v0 + ww0(2)*v1 + ww0(3)*v2
1584 v3 = coarse_coeffs(coarse_bo(1, 1) + 1, j, k)
1586 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1587 ww1(1)*v0 + ww1(2)*v1 + ww1(3)*v2 + ww1(4)*v3
1588 ELSE IF (has_i_ubound)
THEN
1589 v2 = coarse_coeffs(i + 3, j, k)
1591 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1592 ww1(1)*v3 + ww1(2)*v0 + ww1(3)*v1 + ww1(4)*v2
1594 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1595 ww0(1)*v0 + ww0(2)*v1 + ww0(3)*v2
1596 IF (fi + 1 == fine_bo(2, 1))
THEN
1597 v3 = coarse_coeffs(i + 4, j, k)
1599 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1600 ww1(1)*v0 + ww1(2)*v1 + ww1(3)*v2 + ww1(4)*v3
1604 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1605 wj*(w_border1(3)*v3 + w_border1(2)*v0 + &
1608 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1611 ELSE IF (pbc .AND. .NOT. is_split)
THEN
1612 v1 = coarse_coeffs(coarse_bo(1, 1), j, k)
1614 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1615 ww1(1)*v2 + ww1(2)*v3 + ww1(3)*v0 + ww1(4)*v1
1617 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1618 ww0(1)*v3 + ww0(2)*v0 + ww0(3)*v1
1619 v2 = coarse_coeffs(coarse_bo(1, 1) + 1, j, k)
1621 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1622 ww1(1)*v3 + ww1(2)*v0 + ww1(3)*v1 + ww1(4)*v2
1623 ELSE IF (has_i_ubound)
THEN
1624 v1 = coarse_coeffs(i + 2, j, k)
1626 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1627 ww1(1)*v2 + ww1(2)*v3 + ww1(3)*v0 + ww1(4)*v1
1629 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1630 ww0(1)*v3 + ww0(2)*v0 + ww0(3)*v1
1631 IF (fi + 1 == fine_bo(2, 1))
THEN
1632 v2 = coarse_coeffs(i + 3, j, k)
1634 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1635 ww1(1)*v3 + ww1(2)*v0 + ww1(3)*v1 + ww1(4)*v2
1639 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1640 wj*(w_border1(3)*v2 + w_border1(2)*v3 + &
1643 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1646 ELSE IF (pbc .AND. .NOT. is_split)
THEN
1647 v0 = coarse_coeffs(coarse_bo(1, 1), j, k)
1649 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1650 ww1(1)*v1 + ww1(2)*v2 + ww1(3)*v3 + ww1(4)*v0
1652 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1653 ww0(1)*v2 + ww0(2)*v3 + ww0(3)*v0
1654 v1 = coarse_coeffs(coarse_bo(1, 1) + 1, j, k)
1656 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1657 ww1(1)*v2 + ww1(2)*v3 + ww1(3)*v0 + ww1(4)*v1
1658 ELSE IF (has_i_ubound)
THEN
1659 v0 = coarse_coeffs(i + 1, j, k)
1661 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1662 ww1(1)*v1 + ww1(2)*v2 + ww1(3)*v3 + ww1(4)*v0
1664 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1665 ww0(1)*v2 + ww0(2)*v3 + ww0(3)*v0
1666 IF (fi + 1 == fine_bo(2, 1))
THEN
1667 v1 = coarse_coeffs(i + 2, j, k)
1669 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1670 ww1(1)*v2 + ww1(2)*v3 + ww1(3)*v0 + ww1(4)*v1
1674 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1675 wj*(w_border1(3)*v1 + w_border1(2)*v2 + &
1678 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1681 ELSE IF (pbc .AND. .NOT. is_split)
THEN
1682 v3 = coarse_coeffs(coarse_bo(1, 1), j, k)
1684 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1685 ww1(1)*v0 + ww1(2)*v1 + ww1(3)*v2 + ww1(4)*v3
1687 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1688 ww0(1)*v1 + ww0(2)*v2 + ww0(3)*v3
1689 v0 = coarse_coeffs(coarse_bo(1, 1) + 1, j, k)
1691 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1692 ww1(1)*v1 + ww1(2)*v2 + ww1(3)*v3 + ww1(4)*v0
1693 ELSE IF (has_i_ubound)
THEN
1694 v3 = coarse_coeffs(i, j, k)
1696 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1697 ww1(1)*v0 + ww1(2)*v1 + ww1(3)*v2 + ww1(4)*v3
1699 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1700 ww0(1)*v1 + ww0(2)*v2 + ww0(3)*v3
1701 IF (fi + 1 == fine_bo(2, 1))
THEN
1702 v0 = coarse_coeffs(i + 1, j, k)
1704 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1705 ww1(1)*v1 + ww1(2)*v2 + ww1(3)*v3 + ww1(4)*v0
1709 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1710 wj*(w_border1(3)*v0 + w_border1(2)*v1 + &
1713 fine_values(fi, fj, fk) = fine_values(fi, fj, fk) + &
1716 cpassert(fi == fine_bo(2, 1))
1725 DEALLOCATE (coarse_coeffs)
1727 CALL timestop(handle)
1769 REAL(kind=
dp),
DIMENSION(4),
INTENT(in) :: weights_1d
1770 REAL(kind=
dp),
INTENT(in) :: w_border0
1771 REAL(kind=
dp),
DIMENSION(3),
INTENT(in) :: w_border1
1772 LOGICAL,
INTENT(in) :: pbc
1773 LOGICAL,
INTENT(in),
OPTIONAL :: safe_computation
1775 CHARACTER(len=*),
PARAMETER :: routinen =
'add_fine2coarse'
1777 INTEGER :: coarse_slice_size, f_shift(3), fi, fj, fk, handle, handle2, i, ii, ij, ik, ip, j, &
1778 k, n_procs, p, p_old, rcv_tot_size, rest_b, s(3), send_tot_size, ss, x, x_att
1779 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: pp_lb, pp_ub, rcv_offset, rcv_size, &
1780 real_rcv_size, send_offset, send_size, &
1782 INTEGER,
DIMENSION(2, 3) :: coarse_bo, coarse_gbo, fine_bo, &
1783 fine_gbo, my_coarse_bo
1784 INTEGER,
DIMENSION(:),
POINTER :: pos_of_x
1785 LOGICAL :: has_i_lbound, has_i_ubound, is_split, &
1786 local_data, safe_calc
1787 REAL(kind=
dp) :: vv0, vv1, vv2, vv3, vv4, vv5, vv6, vv7, &
1789 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: rcv_buf, send_buf
1790 REAL(kind=
dp),
DIMENSION(3) :: w_0, ww0
1791 REAL(kind=
dp),
DIMENSION(4) :: w_1, ww1
1792 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: coarse_coeffs, fine_values
1794 CALL timeset(routinen, handle)
1797 IF (
PRESENT(safe_computation)) safe_calc = safe_computation
1799 my_coarse_bo = coarse_coeffs_pw%pw_grid%bounds_local
1800 coarse_gbo = coarse_coeffs_pw%pw_grid%bounds
1801 fine_bo = fine_values_pw%pw_grid%bounds_local
1802 fine_gbo = fine_values_pw%pw_grid%bounds
1803 f_shift = fine_gbo(1, :) - 2*coarse_gbo(1, :)
1804 is_split = any(coarse_gbo(:, 1) /= my_coarse_bo(:, 1))
1805 coarse_bo = my_coarse_bo
1806 IF (fine_bo(1, 1) <= fine_bo(2, 1))
THEN
1807 coarse_bo(1, 1) = floor(real(fine_bo(1, 1) - f_shift(1),
dp)/2._dp) - 1
1808 coarse_bo(2, 1) = floor(real(fine_bo(2, 1) + 1 - f_shift(1),
dp)/2._dp) + 1
1810 coarse_bo(1, 1) = coarse_gbo(2, 1)
1811 coarse_bo(2, 1) = coarse_gbo(2, 1) - 1
1813 IF (.NOT. is_split .OR. .NOT. pbc)
THEN
1814 coarse_bo(1, 1) = max(coarse_gbo(1, 1), coarse_bo(1, 1))
1815 coarse_bo(2, 1) = min(coarse_gbo(2, 1), coarse_bo(2, 1))
1817 has_i_ubound = (fine_gbo(2, 1) /= fine_bo(2, 1)) .OR. pbc .AND. is_split
1818 has_i_lbound = (fine_gbo(1, 1) /= fine_bo(1, 1)) .OR. pbc .AND. is_split
1821 cpassert(all(fine_gbo(1, :) == 2*coarse_gbo(1, :) + f_shift))
1822 cpassert(all(fine_gbo(2, :) == 2*coarse_gbo(2, :) + f_shift + 1))
1824 cpassert(all(fine_gbo(2, :) == 2*coarse_gbo(2, :) + f_shift))
1825 cpassert(all(fine_gbo(1, :) == 2*coarse_gbo(1, :) + f_shift))
1827 cpassert(coarse_gbo(2, 1) - coarse_gbo(1, 2) > 1)
1828 local_data = is_split
1829 IF (local_data)
THEN
1830 ALLOCATE (coarse_coeffs(coarse_bo(1, 1):coarse_bo(2, 1), &
1831 coarse_bo(1, 2):coarse_bo(2, 2), &
1832 coarse_bo(1, 3):coarse_bo(2, 3)))
1833 coarse_coeffs = 0._dp
1835 coarse_coeffs => coarse_coeffs_pw%array
1838 fine_values => fine_values_pw%array
1839 w_0 = [weights_1d(3), weights_1d(1), weights_1d(3)]
1840 w_1 = [weights_1d(4), weights_1d(2), weights_1d(2), weights_1d(4)]
1843 s(i) = coarse_gbo(2, i) - coarse_gbo(1, i) + 1
1845 IF (any(s < 1))
RETURN
1847 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
1850 wk = weights_1d(abs(ik) + 1)
1851 fk = fine_gbo(1, 3) +
modulo(2*k + ik - fine_gbo(1, 3) + f_shift(3), 2*s(3))
1853 fk = 2*k + ik + f_shift(3)
1854 IF (fk <= fine_bo(1, 3) + 1 .OR. fk >= fine_bo(2, 3) - 1)
THEN
1855 IF (fk < fine_bo(1, 3) .OR. fk > fine_bo(2, 3)) cycle
1856 IF (fk == fine_bo(1, 3) .OR. fk == fine_bo(2, 3))
THEN
1859 ELSE IF (fk == fine_bo(1, 3) + 1)
THEN
1868 cpabort(
"Only 1, -1, -3 are supported as the value of ik")
1880 cpabort(
"Only 3, 1, -1 are supported as the value of ik")
1885 wk = weights_1d(abs(ik) + 1)
1888 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
1891 fj = fine_gbo(1, 2) +
modulo(2*j + ij - fine_gbo(1, 2) + f_shift(2), &
1893 wj = weights_1d(abs(ij) + 1)*wk
1895 fj = 2*j + ij + f_shift(2)
1896 IF (fj <= fine_bo(1, 2) + 1 .OR. fj >= fine_bo(2, 2) - 1)
THEN
1897 IF (fj < fine_bo(1, 2) .OR. fj > fine_bo(2, 2)) cycle
1898 IF (fj == fine_bo(1, 2) .OR. fj == fine_bo(2, 2))
THEN
1901 ELSE IF (fj == fine_bo(1, 2) + 1)
THEN
1904 wj = w_border1(1)*wk
1906 wj = w_border1(2)*wk
1908 wj = w_border1(3)*wk
1910 cpabort(
"Only 1, -1, -3 are supported as the value of ij")
1916 wj = w_border1(1)*wk
1918 wj = w_border1(2)*wk
1920 wj = w_border1(3)*wk
1922 cpabort(
"Only -1, 1, 3 are supported as the value of ij")
1927 wj = weights_1d(abs(ij) + 1)*wk
1931 IF (coarse_bo(2, 1) - coarse_bo(1, 1) < 7 .OR. safe_calc)
THEN
1932 DO i = coarse_bo(1, 1), coarse_bo(2, 1)
1934 IF (pbc .AND. .NOT. is_split)
THEN
1935 wi = weights_1d(abs(ii) + 1)*wj
1936 fi = fine_gbo(1, 1) +
modulo(2*i + ii - fine_gbo(1, 1) + f_shift(1), 2*s(1))
1938 fi = 2*i + ii + f_shift(1)
1939 IF (fi < fine_bo(1, 1) .OR. fi > fine_bo(2, 1)) cycle
1940 IF (((.NOT. pbc) .AND. fi <= fine_gbo(1, 1) + 1) .OR. &
1941 ((.NOT. pbc) .AND. fi >= fine_gbo(2, 1) - 1))
THEN
1942 IF (fi == fine_gbo(1, 1) .OR. fi == fine_gbo(2, 1))
THEN
1945 ELSE IF (fi == fine_gbo(1, 1) + 1)
THEN
1948 wi = w_border1(1)*wj
1950 wi = w_border1(2)*wj
1952 wi = w_border1(3)*wj
1959 wi = w_border1(1)*wj
1961 wi = w_border1(2)*wj
1963 wi = w_border1(3)*wj
1969 wi = weights_1d(abs(ii) + 1)*wj
1972 coarse_coeffs(i, j, k) = &
1973 coarse_coeffs(i, j, k) + &
1974 wi*fine_values(fi, fj, fk)
1980 IF (pbc .AND. .NOT. is_split)
THEN
1981 i = coarse_bo(1, 1) - 1
1982 vv2 = fine_values(fine_bo(2, 1) - 2, fj, fk)
1983 vv3 = fine_values(fine_bo(2, 1) - 1, fj, fk)
1984 vv4 = fine_values(fine_bo(2, 1), fj, fk)
1986 vv5 = fine_values(fi, fj, fk)
1988 vv6 = fine_values(fi, fj, fk)
1990 vv7 = fine_values(fi, fj, fk)
1991 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
1992 + ww1(4)*vv2 + ww0(3)*vv3 + ww1(3)*vv4 + ww0(2)*vv5 + ww1(2)*vv6 + ww0(1)*vv7
1993 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) &
1994 + ww1(4)*vv4 + ww0(3)*vv5 + ww1(3)*vv6 + ww0(2)*vv7
1995 coarse_coeffs(i + 3, j, k) = coarse_coeffs(i + 3, j, k) &
1996 + ww1(4)*vv6 + ww0(3)*vv7
1997 ELSE IF (has_i_lbound)
THEN
1999 fi = fine_bo(1, 1) - 1
2000 IF (i + 1 == floor((fine_bo(1, 1) + 1 - f_shift(1))/2._dp))
THEN
2002 vv0 = fine_values(fi, fj, fk)
2003 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) + &
2005 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) + &
2007 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) + &
2012 fi = 2*i + f_shift(1)
2013 vv0 = fine_values(fi, fj, fk)
2015 vv1 = fine_values(fi, fj, fk)
2017 vv2 = fine_values(fi, fj, fk)
2018 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) + &
2019 (vv0*w_border0 + vv1*w_border1(1))*wj + vv2*ww0(1)
2020 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) + &
2021 wj*w_border1(2)*vv1 + ww0(2)*vv2
2022 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) + &
2023 wj*w_border1(3)*vv1 + ww0(3)*vv2
2025 DO i = coarse_bo(1, 1) + 3, floor((fine_bo(2, 1) - f_shift(1))/2._dp) - 3, 4
2027 vv0 = fine_values(fi, fj, fk)
2029 vv1 = fine_values(fi, fj, fk)
2031 vv2 = fine_values(fi, fj, fk)
2033 vv3 = fine_values(fi, fj, fk)
2035 vv4 = fine_values(fi, fj, fk)
2037 vv5 = fine_values(fi, fj, fk)
2039 vv6 = fine_values(fi, fj, fk)
2041 vv7 = fine_values(fi, fj, fk)
2042 coarse_coeffs(i - 3, j, k) = coarse_coeffs(i - 3, j, k) &
2044 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2045 + ww1(2)*vv0 + ww0(1)*vv1 + ww1(1)*vv2
2046 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2047 + ww1(3)*vv0 + ww0(2)*vv1 + ww1(2)*vv2 + ww0(1)*vv3 + ww1(1)*vv4
2048 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2049 + ww1(4)*vv0 + ww0(3)*vv1 + ww1(3)*vv2 + ww0(2)*vv3 + ww1(2)*vv4 + ww0(1)*vv5 + ww1(1)*vv6
2050 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2051 + ww1(4)*vv2 + ww0(3)*vv3 + ww1(3)*vv4 + ww0(2)*vv5 + ww1(2)*vv6 + ww0(1)*vv7
2052 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) &
2053 + ww1(4)*vv4 + ww0(3)*vv5 + ww1(3)*vv6 + ww0(2)*vv7
2054 coarse_coeffs(i + 3, j, k) = coarse_coeffs(i + 3, j, k) &
2055 + ww1(4)*vv6 + ww0(3)*vv7
2057 IF (.NOT. floor((fine_bo(2, 1) - f_shift(1))/2._dp) - coarse_bo(1, 1) >= 4)
THEN
2058 cpabort(
"FLOOR((fine_bo(2,1)-f_shift(1))/2._dp)-coarse_bo(1,1)>=4")
2060 rest_b =
modulo(floor((fine_bo(2, 1) - f_shift(1))/2._dp) - coarse_bo(1, 1) - 6, 4)
2061 i = floor((fine_bo(2, 1) - f_shift(1))/2._dp) - 3 - rest_b + 4
2062 cpassert(fi == (i - 2)*2 + f_shift(1))
2063 IF (rest_b > 0)
THEN
2065 vv0 = fine_values(fi, fj, fk)
2067 vv1 = fine_values(fi, fj, fk)
2068 coarse_coeffs(i - 3, j, k) = coarse_coeffs(i - 3, j, k) &
2070 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2071 + ww1(2)*vv0 + ww0(1)*vv1
2072 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2073 + ww1(3)*vv0 + ww0(2)*vv1
2074 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2075 + ww1(4)*vv0 + ww0(3)*vv1
2076 IF (rest_b > 1)
THEN
2078 vv2 = fine_values(fi, fj, fk)
2080 vv3 = fine_values(fi, fj, fk)
2081 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2083 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2084 + ww1(2)*vv2 + ww0(1)*vv3
2085 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2086 + ww1(3)*vv2 + ww0(2)*vv3
2087 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2088 + ww1(4)*vv2 + ww0(3)*vv3
2089 IF (rest_b > 2)
THEN
2091 vv4 = fine_values(fi, fj, fk)
2093 vv5 = fine_values(fi, fj, fk)
2095 vv6 = fine_values(fi, fj, fk)
2097 vv7 = fine_values(fi, fj, fk)
2098 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2100 IF (has_i_ubound)
THEN
2101 IF (coarse_bo(2, 1) - 2 == floor((fine_bo(2, 1) - f_shift(1))/2._dp))
THEN
2103 vv0 = fine_values(fi, fj, fk)
2104 coarse_coeffs(i + 4, j, k) = coarse_coeffs(i + 4, j, k) &
2109 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2110 + ww1(2)*vv4 + ww0(1)*vv5 + ww1(1)*vv6
2111 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2112 + ww1(3)*vv4 + ww0(2)*vv5 + ww1(2)*vv6 + ww0(1)*vv7 + vv0*ww1(1)
2113 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) &
2114 + ww1(4)*vv4 + ww0(3)*vv5 + ww1(3)*vv6 + ww0(2)*vv7 + vv0*ww1(2)
2115 coarse_coeffs(i + 3, j, k) = coarse_coeffs(i + 3, j, k) &
2116 + ww1(4)*vv6 + ww0(3)*vv7 + vv0*ww1(3)
2117 ELSE IF (pbc .AND. .NOT. is_split)
THEN
2119 vv0 = fine_values(fi, fj, fk)
2120 vv1 = fine_values(fine_bo(1, 1), fj, fk)
2121 vv2 = fine_values(fine_bo(1, 1) + 1, fj, fk)
2122 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2123 + ww1(2)*vv4 + ww0(1)*vv5 + ww1(1)*vv6
2124 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2125 + ww1(3)*vv4 + ww0(2)*vv5 + ww1(2)*vv6 + ww0(1)*vv7 + vv0*ww1(1)
2126 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) &
2127 + ww1(4)*vv4 + ww0(3)*vv5 + ww1(3)*vv6 + ww0(2)*vv7 + vv0*ww1(2) &
2128 + vv1*ww0(1) + vv2*ww1(1)
2130 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2131 + ww1(2)*vv4 + ww0(1)*vv5 + wj*w_border1(3)*vv6
2132 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2133 + ww1(3)*vv4 + ww0(2)*vv5 + wj*w_border1(2)*vv6
2134 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) &
2135 + ww1(4)*vv4 + ww0(3)*vv5 + wj*w_border1(1)*vv6 + w_border0*wj*vv7
2139 vv4 = fine_values(fi, fj, fk)
2141 vv5 = fine_values(fi, fj, fk)
2142 IF (has_i_ubound)
THEN
2143 IF (coarse_bo(2, 1) - 2 == floor((fine_bo(2, 1) - f_shift(1))/2._dp))
THEN
2145 vv6 = fine_values(fi, fj, fk)
2146 coarse_coeffs(i + 3, j, k) = coarse_coeffs(i + 3, j, k) &
2151 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2153 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2154 + ww1(2)*vv4 + ww0(1)*vv5 + ww1(1)*vv6
2155 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2156 + ww1(3)*vv4 + ww0(2)*vv5 + ww1(2)*vv6
2157 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) &
2158 + ww1(4)*vv4 + ww0(3)*vv5 + ww1(3)*vv6
2159 ELSE IF (pbc .AND. .NOT. is_split)
THEN
2161 vv6 = fine_values(fi, fj, fk)
2162 vv7 = fine_values(fine_bo(1, 1), fj, fk)
2163 vv0 = fine_values(fine_bo(1, 1) + 1, fj, fk)
2164 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2166 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2167 + ww1(4)*vv0 + ww0(3)*vv1 + ww1(3)*vv2 + ww0(2)*vv3 + &
2168 ww1(2)*vv4 + ww0(1)*vv5 + ww1(1)*vv6
2169 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2170 + ww1(4)*vv2 + ww0(3)*vv3 + ww1(3)*vv4 + ww0(2)*vv5 + ww1(2)*vv6 &
2171 + ww0(1)*vv7 + ww1(1)*vv0
2173 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2174 + wj*w_border1(3)*vv4
2175 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2176 + wj*w_border1(2)*vv4
2177 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2178 + wj*(w_border1(1)*vv4 + w_border0*vv5)
2183 vv2 = fine_values(fi, fj, fk)
2185 vv3 = fine_values(fi, fj, fk)
2186 IF (has_i_ubound)
THEN
2187 IF (coarse_bo(2, 1) - 2 == floor((fine_bo(2, 1) - f_shift(1))/2._dp))
THEN
2189 vv4 = fine_values(fi, fj, fk)
2190 coarse_coeffs(i + 2, j, k) = coarse_coeffs(i + 2, j, k) &
2195 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2197 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2198 + ww1(2)*vv2 + ww0(1)*vv3 + ww1(1)*vv4
2199 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2200 + ww1(3)*vv2 + ww0(2)*vv3 + ww1(2)*vv4
2201 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2202 + ww1(4)*vv2 + ww0(3)*vv3 + ww1(3)*vv4
2203 ELSE IF (pbc .AND. .NOT. is_split)
THEN
2205 vv4 = fine_values(fi, fj, fk)
2206 vv5 = fine_values(fine_bo(1, 1), fj, fk)
2207 vv6 = fine_values(fine_bo(1, 1) + 1, fj, fk)
2208 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2210 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2211 + ww1(2)*vv2 + ww0(1)*vv3 + ww1(1)*vv4
2212 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2213 + ww1(3)*vv2 + ww0(2)*vv3 + ww1(2)*vv4 + vv5*ww0(1) + ww1(1)*vv6
2215 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2216 + wj*w_border1(3)*vv2
2217 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2218 + wj*w_border1(2)*vv2
2219 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2220 + wj*(w_border1(1)*vv2 + w_border0*vv3)
2225 vv0 = fine_values(fi, fj, fk)
2227 vv1 = fine_values(fi, fj, fk)
2228 IF (has_i_ubound)
THEN
2229 IF (coarse_bo(2, 1) - 2 == floor((fine_bo(2, 1) - f_shift(1))/2._dp))
THEN
2231 vv2 = fine_values(fi, fj, fk)
2232 coarse_coeffs(i + 1, j, k) = coarse_coeffs(i + 1, j, k) &
2237 coarse_coeffs(i - 3, j, k) = coarse_coeffs(i - 3, j, k) &
2239 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2240 + ww1(2)*vv0 + ww0(1)*vv1 + ww1(1)*vv2
2241 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2242 + ww1(3)*vv0 + ww0(2)*vv1 + ww1(2)*vv2
2243 coarse_coeffs(i, j, k) = coarse_coeffs(i, j, k) &
2244 + ww1(4)*vv0 + ww0(3)*vv1 + ww1(3)*vv2
2245 ELSE IF (pbc .AND. .NOT. is_split)
THEN
2247 vv2 = fine_values(fi, fj, fk)
2248 vv3 = fine_values(fine_bo(1, 1), fk, fk)
2249 vv4 = fine_values(fine_bo(1, 1) + 1, fk, fk)
2250 coarse_coeffs(i - 3, j, k) = coarse_coeffs(i - 3, j, k) &
2252 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2253 + ww1(2)*vv0 + ww0(1)*vv1 + ww1(1)*vv2
2254 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2255 + ww1(3)*vv0 + ww0(2)*vv1 + ww1(2)*vv2 + ww0(1)*vv3 + ww1(1)*vv4
2257 coarse_coeffs(i - 3, j, k) = coarse_coeffs(i - 3, j, k) &
2258 + wj*w_border1(3)*vv0
2259 coarse_coeffs(i - 2, j, k) = coarse_coeffs(i - 2, j, k) &
2260 + wj*w_border1(2)*vv0
2261 coarse_coeffs(i - 1, j, k) = coarse_coeffs(i - 1, j, k) &
2262 + wj*(w_border1(1)*vv0 + w_border0*vv1)
2265 cpassert(fi == fine_bo(2, 1))
2274 CALL timeset(routinen//
"_comm", handle2)
2275 coarse_slice_size = (coarse_bo(2, 2) - coarse_bo(1, 2) + 1)* &
2276 (coarse_bo(2, 3) - coarse_bo(1, 3) + 1)
2277 n_procs = coarse_coeffs_pw%pw_grid%para%group%num_pe
2278 ALLOCATE (send_size(0:n_procs - 1), send_offset(0:n_procs - 1), &
2279 sent_size(0:n_procs - 1), rcv_size(0:n_procs - 1), &
2280 rcv_offset(0:n_procs - 1), pp_lb(0:n_procs - 1), &
2281 pp_ub(0:n_procs - 1), real_rcv_size(0:n_procs - 1))
2285 pos_of_x => coarse_coeffs_pw%pw_grid%para%pos_of_x
2287 DO x = coarse_bo(1, 1), coarse_bo(2, 1)
2288 p = pos_of_x(coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1)))
2289 send_size(p) = send_size(p) + coarse_slice_size
2294 pos_of_x => fine_values_pw%pw_grid%para%pos_of_x
2295 p_old = pos_of_x(fine_gbo(1, 1))
2296 pp_lb = fine_gbo(2, 1)
2297 pp_ub = fine_gbo(2, 1) - 1
2298 pp_lb(p_old) = fine_gbo(1, 1)
2299 DO x = fine_gbo(1, 1), fine_gbo(2, 1)
2301 IF (p /= p_old)
THEN
2302 pp_ub(p_old) = x - 1
2307 pp_ub(p_old) = fine_gbo(2, 1)
2309 DO ip = 0, n_procs - 1
2310 IF (pp_lb(ip) <= pp_ub(ip))
THEN
2311 pp_lb(ip) = floor(real(pp_lb(ip) - f_shift(1),
dp)/2._dp) - 1
2312 pp_ub(ip) = floor(real(pp_ub(ip) + 1 - f_shift(1),
dp)/2._dp) + 1
2314 pp_lb(ip) = coarse_gbo(2, 1)
2315 pp_ub(ip) = coarse_gbo(2, 1) - 1
2317 IF (.NOT. is_split .OR. .NOT. pbc)
THEN
2318 pp_lb(ip) = max(pp_lb(ip), coarse_gbo(1, 1))
2319 pp_ub(ip) = min(pp_ub(ip), coarse_gbo(2, 1))
2324 DO ip = 0, n_procs - 1
2325 DO x = pp_lb(ip), coarse_gbo(1, 1) - 1
2326 x_att = coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1))
2327 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
2328 rcv_size(ip) = rcv_size(ip) + coarse_slice_size
2331 rcv_size(ip) = rcv_size(ip) + coarse_slice_size* &
2333 min(pp_ub(ip), my_coarse_bo(2, 1)) - max(pp_lb(ip), my_coarse_bo(1, 1)) + 1)
2334 DO x = coarse_gbo(2, 1) + 1, pp_ub(ip)
2335 x_att = coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1))
2336 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
2337 rcv_size(ip) = rcv_size(ip) + coarse_slice_size
2345 DO ip = 0, n_procs - 1
2346 send_offset(ip) = send_tot_size
2347 send_tot_size = send_tot_size + send_size(ip)
2349 IF (send_tot_size /= (coarse_bo(2, 1) - coarse_bo(1, 1) + 1)*coarse_slice_size)
THEN
2350 cpabort(
"Error calculating send_tot_size")
2352 ALLOCATE (send_buf(0:send_tot_size - 1))
2355 DO ip = 0, n_procs - 1
2356 rcv_offset(ip) = rcv_tot_size
2357 rcv_tot_size = rcv_tot_size + rcv_size(ip)
2359 ALLOCATE (rcv_buf(0:rcv_tot_size - 1))
2363 pos_of_x => coarse_coeffs_pw%pw_grid%para%pos_of_x
2364 p_old = pos_of_x(coarse_gbo(1, 1) &
2365 +
modulo(coarse_bo(1, 1) - coarse_gbo(1, 1), s(1)))
2366 sent_size(:) = send_offset
2367 ss = coarse_bo(2, 1) - coarse_bo(1, 1) + 1
2368 DO x = coarse_bo(1, 1), coarse_bo(2, 1)
2369 p = pos_of_x(coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1)))
2370 CALL dcopy(coarse_slice_size, &
2371 coarse_coeffs(x, coarse_bo(1, 2), &
2372 coarse_bo(1, 3)), ss, send_buf(sent_size(p)), 1)
2373 sent_size(p) = sent_size(p) + coarse_slice_size
2376 IF (any(sent_size(0:n_procs - 2) /= send_offset(1:n_procs - 1)))
THEN
2377 cpabort(
"error 1 filling send buffer")
2379 IF (sent_size(n_procs - 1) /= send_tot_size)
THEN
2380 cpabort(
"error 2 filling send buffer")
2383 IF (local_data)
THEN
2384 DEALLOCATE (coarse_coeffs)
2386 NULLIFY (coarse_coeffs)
2389 cpassert(all(sent_size(:n_procs - 2) == send_offset(1:)))
2390 cpassert(sent_size(n_procs - 1) == send_tot_size)
2392 CALL coarse_coeffs_pw%pw_grid%para%group%alltoall(send_size, real_rcv_size, 1)
2394 cpassert(all(real_rcv_size == rcv_size))
2396 CALL coarse_coeffs_pw%pw_grid%para%group%alltoall(sb=send_buf, scount=send_size, sdispl=send_offset, &
2397 rb=rcv_buf, rcount=rcv_size, rdispl=rcv_offset)
2401 sent_size(:) = rcv_offset
2402 DO ip = 0, n_procs - 1
2404 DO x = pp_lb(ip), coarse_gbo(1, 1) - 1
2405 x_att = coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1))
2406 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
2408 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
2409 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
2410 coarse_coeffs_pw%array(x_att, j, k) = coarse_coeffs_pw%array(x_att, j, k) + rcv_buf(ii)
2419 DO x_att = max(pp_lb(ip), my_coarse_bo(1, 1)), min(pp_ub(ip), my_coarse_bo(2, 1))
2420 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
2421 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
2422 coarse_coeffs_pw%array(x_att, j, k) = coarse_coeffs_pw%array(x_att, j, k) + rcv_buf(ii)
2429 DO x = coarse_gbo(2, 1) + 1, pp_ub(ip)
2430 x_att = coarse_gbo(1, 1) +
modulo(x - coarse_gbo(1, 1), s(1))
2431 IF (x_att >= my_coarse_bo(1, 1) .AND. x_att <= my_coarse_bo(2, 1))
THEN
2433 DO k = coarse_bo(1, 3), coarse_bo(2, 3)
2434 DO j = coarse_bo(1, 2), coarse_bo(2, 2)
2435 coarse_coeffs_pw%array(x_att, j, k) = coarse_coeffs_pw%array(x_att, j, k) + rcv_buf(ii)
2445 IF (any(sent_size(0:n_procs - 2) /= rcv_offset(1:n_procs - 1)))
THEN
2446 cpabort(
"error 1 handling the rcv buffer")
2448 IF (sent_size(n_procs - 1) /= rcv_tot_size)
THEN
2449 cpabort(
"error 2 handling the rcv buffer")
2453 DEALLOCATE (send_size, send_offset, rcv_size, rcv_offset)
2454 DEALLOCATE (send_buf, rcv_buf, real_rcv_size)
2455 DEALLOCATE (pp_ub, pp_lb)
2456 CALL timestop(handle2)
2458 cpassert(.NOT. local_data)
2461 CALL timestop(handle)
3153 TYPE(pw_r3d_rs_type),
INTENT(IN) :: pw
3154 REAL(kind=
dp) :: val
3156 INTEGER :: i, ivec(3), j, k, npts(3)
3157 INTEGER,
DIMENSION(2, 3) :: bo, bo_l
3158 INTEGER,
DIMENSION(4) :: ii, ij, ik
3160 REAL(kind=
dp) :: a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3, dr1, dr2, dr3, e1, e2, e3, &
3161 f1, f2, f3, g1, g2, g3, h1, h2, h3, p1, p2, p3, q1, q2, q3, r1, r2, r3, s1, s2, s3, s4, &
3162 t1, t2, t3, t4, u1, u2, u3, v1, v2, v3, v4, xd1, xd2, xd3
3163 REAL(kind=
dp),
DIMENSION(4, 4, 4) :: box
3164 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: grid
3168 npts = pw%pw_grid%npts
3169 ivec = floor(vec/pw%pw_grid%dr)
3170 dr1 = pw%pw_grid%dr(1)
3171 dr2 = pw%pw_grid%dr(2)
3172 dr3 = pw%pw_grid%dr(3)
3174 xd1 = (vec(1)/dr1) - real(ivec(1), kind=
dp)
3175 xd2 = (vec(2)/dr2) - real(ivec(2), kind=
dp)
3176 xd3 = (vec(3)/dr3) - real(ivec(3), kind=
dp)
3177 grid => pw%array(:, :, :)
3178 bo = pw%pw_grid%bounds
3179 bo_l = pw%pw_grid%bounds_local
3181 ik(1) =
modulo(ivec(3) - 1, npts(3)) + bo(1, 3)
3182 ik(2) =
modulo(ivec(3), npts(3)) + bo(1, 3)
3183 ik(3) =
modulo(ivec(3) + 1, npts(3)) + bo(1, 3)
3184 ik(4) =
modulo(ivec(3) + 2, npts(3)) + bo(1, 3)
3186 ij(1) =
modulo(ivec(2) - 1, npts(2)) + bo(1, 2)
3187 ij(2) =
modulo(ivec(2), npts(2)) + bo(1, 2)
3188 ij(3) =
modulo(ivec(2) + 1, npts(2)) + bo(1, 2)
3189 ij(4) =
modulo(ivec(2) + 2, npts(2)) + bo(1, 2)
3191 ii(1) =
modulo(ivec(1) - 1, npts(1)) + bo(1, 1)
3192 ii(2) =
modulo(ivec(1), npts(1)) + bo(1, 1)
3193 ii(3) =
modulo(ivec(1) + 1, npts(1)) + bo(1, 1)
3194 ii(4) =
modulo(ivec(1) + 2, npts(1)) + bo(1, 1)
3200 ii(i) >= bo_l(1, 1) .AND. &
3201 ii(i) <= bo_l(2, 1) .AND. &
3202 ij(j) >= bo_l(1, 2) .AND. &
3203 ij(j) <= bo_l(2, 2) .AND. &
3204 ik(k) >= bo_l(1, 3) .AND. &
3205 ik(k) <= bo_l(2, 3) &
3207 box(i, j, k) = grid(ii(i) + 1 - bo_l(1, 1), &
3208 ij(j) + 1 - bo_l(1, 2), &
3209 ik(k) + 1 - bo_l(1, 3))
3211 box(i, j, k) = 0.0_dp
3254 t1 = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*a1 + 12.0_dp*a2 - a3)
3255 t2 = -22.0_dp/3.0_dp + 10.0_dp*b1 - 4.0_dp*b2 + 0.5_dp*b3
3256 t3 = 2.0_dp/3.0_dp - 2.0_dp*c1 + 2.0_dp*c2 - 0.5_dp*c3
3257 t4 = 1.0_dp/6.0_dp*d3
3258 s1 = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*e1 + 12.0_dp*e2 - e3)
3259 s2 = -22.0_dp/3.0_dp + 10.0_dp*f1 - 4.0_dp*f2 + 0.5_dp*f3
3260 s3 = 2.0_dp/3.0_dp - 2.0_dp*g1 + 2.0_dp*g2 - 0.5_dp*g3
3261 s4 = 1.0_dp/6.0_dp*h3
3262 v1 = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*p1 + 12.0_dp*p2 - p3)
3263 v2 = -22.0_dp/3.0_dp + 10.0_dp*q1 - 4.0_dp*q2 + 0.5_dp*q3
3264 v3 = 2.0_dp/3.0_dp - 2.0_dp*r1 + 2.0_dp*r2 - 0.5_dp*r3
3265 v4 = 1.0_dp/6.0_dp*u3
3267 val = ((box(1, 1, 1)*t1 + box(2, 1, 1)*t2 + box(3, 1, 1)*t3 + box(4, 1, 1)*t4)*s1 + &
3268 (box(1, 2, 1)*t1 + box(2, 2, 1)*t2 + box(3, 2, 1)*t3 + box(4, 2, 1)*t4)*s2 + &
3269 (box(1, 3, 1)*t1 + box(2, 3, 1)*t2 + box(3, 3, 1)*t3 + box(4, 3, 1)*t4)*s3 + &
3270 (box(1, 4, 1)*t1 + box(2, 4, 1)*t2 + box(3, 4, 1)*t3 + box(4, 4, 1)*t4)*s4)*v1 + &
3271 ((box(1, 1, 2)*t1 + box(2, 1, 2)*t2 + box(3, 1, 2)*t3 + box(4, 1, 2)*t4)*s1 + &
3272 (box(1, 2, 2)*t1 + box(2, 2, 2)*t2 + box(3, 2, 2)*t3 + box(4, 2, 2)*t4)*s2 + &
3273 (box(1, 3, 2)*t1 + box(2, 3, 2)*t2 + box(3, 3, 2)*t3 + box(4, 3, 2)*t4)*s3 + &
3274 (box(1, 4, 2)*t1 + box(2, 4, 2)*t2 + box(3, 4, 2)*t3 + box(4, 4, 2)*t4)*s4)*v2 + &
3275 ((box(1, 1, 3)*t1 + box(2, 1, 3)*t2 + box(3, 1, 3)*t3 + box(4, 1, 3)*t4)*s1 + &
3276 (box(1, 2, 3)*t1 + box(2, 2, 3)*t2 + box(3, 2, 3)*t3 + box(4, 2, 3)*t4)*s2 + &
3277 (box(1, 3, 3)*t1 + box(2, 3, 3)*t2 + box(3, 3, 3)*t3 + box(4, 3, 3)*t4)*s3 + &
3278 (box(1, 4, 3)*t1 + box(2, 4, 3)*t2 + box(3, 4, 3)*t3 + box(4, 4, 3)*t4)*s4)*v3 + &
3279 ((box(1, 1, 4)*t1 + box(2, 1, 4)*t2 + box(3, 1, 4)*t3 + box(4, 1, 4)*t4)*s1 + &
3280 (box(1, 2, 4)*t1 + box(2, 2, 4)*t2 + box(3, 2, 4)*t3 + box(4, 2, 4)*t4)*s2 + &
3281 (box(1, 3, 4)*t1 + box(2, 3, 4)*t2 + box(3, 3, 4)*t3 + box(4, 3, 4)*t4)*s3 + &
3282 (box(1, 4, 4)*t1 + box(2, 4, 4)*t2 + box(3, 4, 4)*t3 + box(4, 4, 4)*t4)*s4)*v4
3284 IF (my_mpsum)
CALL pw%pw_grid%para%group%sum(val)
3302 TYPE(pw_r3d_rs_type),
INTENT(IN) :: pw
3303 REAL(kind=
dp) :: val(3)
3305 INTEGER :: i, ivec(3), j, k, npts(3)
3306 INTEGER,
DIMENSION(2, 3) :: bo, bo_l
3307 INTEGER,
DIMENSION(4) :: ii, ij, ik
3309 REAL(kind=
dp) :: a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3, dr1, dr1i, dr2, dr2i, dr3, &
3310 dr3i, e1, e2, e3, f1, f2, f3, g1, g2, g3, h1, h2, h3, p1, p2, p3, q1, q2, q3, r1, r2, r3, &
3311 s1, s1d, s1o, s2, s2d, s2o, s3, s3d, s3o, s4, s4d, s4o, t1, t1d, t1o, t2, t2d, t2o, t3, &
3312 t3d, t3o, t4, t4d, t4o, u1, u2, u3, v1, v1d, v1o, v2, v2d, v2o, v3, v3d, v3o, v4, v4d, &
3314 REAL(kind=
dp),
DIMENSION(4, 4, 4) :: box
3315 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: grid
3319 npts = pw%pw_grid%npts
3320 ivec = floor(vec/pw%pw_grid%dr)
3321 dr1 = pw%pw_grid%dr(1)
3322 dr2 = pw%pw_grid%dr(2)
3323 dr3 = pw%pw_grid%dr(3)
3327 xd1 = (vec(1)/dr1) - real(ivec(1), kind=
dp)
3328 xd2 = (vec(2)/dr2) - real(ivec(2), kind=
dp)
3329 xd3 = (vec(3)/dr3) - real(ivec(3), kind=
dp)
3330 grid => pw%array(:, :, :)
3331 bo = pw%pw_grid%bounds
3332 bo_l = pw%pw_grid%bounds_local
3334 ik(1) =
modulo(ivec(3) - 1, npts(3)) + bo(1, 3)
3335 ik(2) =
modulo(ivec(3), npts(3)) + bo(1, 3)
3336 ik(3) =
modulo(ivec(3) + 1, npts(3)) + bo(1, 3)
3337 ik(4) =
modulo(ivec(3) + 2, npts(3)) + bo(1, 3)
3339 ij(1) =
modulo(ivec(2) - 1, npts(2)) + bo(1, 2)
3340 ij(2) =
modulo(ivec(2), npts(2)) + bo(1, 2)
3341 ij(3) =
modulo(ivec(2) + 1, npts(2)) + bo(1, 2)
3342 ij(4) =
modulo(ivec(2) + 2, npts(2)) + bo(1, 2)
3344 ii(1) =
modulo(ivec(1) - 1, npts(1)) + bo(1, 1)
3345 ii(2) =
modulo(ivec(1), npts(1)) + bo(1, 1)
3346 ii(3) =
modulo(ivec(1) + 1, npts(1)) + bo(1, 1)
3347 ii(4) =
modulo(ivec(1) + 2, npts(1)) + bo(1, 1)
3353 ii(i) >= bo_l(1, 1) .AND. &
3354 ii(i) <= bo_l(2, 1) .AND. &
3355 ij(j) >= bo_l(1, 2) .AND. &
3356 ij(j) <= bo_l(2, 2) .AND. &
3357 ik(k) >= bo_l(1, 3) .AND. &
3358 ik(k) <= bo_l(2, 3) &
3360 box(i, j, k) = grid(ii(i) + 1 - bo_l(1, 1), &
3361 ij(j) + 1 - bo_l(1, 2), &
3362 ik(k) + 1 - bo_l(1, 3))
3364 box(i, j, k) = 0.0_dp
3407 t1o = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*a1 + 12.0_dp*a2 - a3)
3408 t2o = -22.0_dp/3.0_dp + 10.0_dp*b1 - 4.0_dp*b2 + 0.5_dp*b3
3409 t3o = 2.0_dp/3.0_dp - 2.0_dp*c1 + 2.0_dp*c2 - 0.5_dp*c3
3410 t4o = 1.0_dp/6.0_dp*d3
3411 s1o = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*e1 + 12.0_dp*e2 - e3)
3412 s2o = -22.0_dp/3.0_dp + 10.0_dp*f1 - 4.0_dp*f2 + 0.5_dp*f3
3413 s3o = 2.0_dp/3.0_dp - 2.0_dp*g1 + 2.0_dp*g2 - 0.5_dp*g3
3414 s4o = 1.0_dp/6.0_dp*h3
3415 v1o = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*p1 + 12.0_dp*p2 - p3)
3416 v2o = -22.0_dp/3.0_dp + 10.0_dp*q1 - 4.0_dp*q2 + 0.5_dp*q3
3417 v3o = 2.0_dp/3.0_dp - 2.0_dp*r1 + 2.0_dp*r2 - 0.5_dp*r3
3418 v4o = 1.0_dp/6.0_dp*u3
3420 t1d = -8.0_dp + 4.0_dp*a1 - 0.5_dp*a2
3421 t2d = 10.0_dp - 8.0_dp*b1 + 1.5_dp*b2
3422 t3d = -2.0_dp + 4.0_dp*c1 - 1.5_dp*c2
3424 s1d = -8.0_dp + 4.0_dp*e1 - 0.5_dp*e2
3425 s2d = 10.0_dp - 8.0_dp*f1 + 1.5_dp*f2
3426 s3d = -2.0_dp + 4.0_dp*g1 - 1.5_dp*g2
3428 v1d = -8.0_dp + 4.0_dp*p1 - 0.5_dp*p2
3429 v2d = 10.0_dp - 8.0_dp*q1 + 1.5_dp*q2
3430 v3d = -2.0_dp + 4.0_dp*r1 - 1.5_dp*r2
3445 val(1) = ((box(1, 1, 1)*t1 + box(2, 1, 1)*t2 + box(3, 1, 1)*t3 + box(4, 1, 1)*t4)*s1 + &
3446 (box(1, 2, 1)*t1 + box(2, 2, 1)*t2 + box(3, 2, 1)*t3 + box(4, 2, 1)*t4)*s2 + &
3447 (box(1, 3, 1)*t1 + box(2, 3, 1)*t2 + box(3, 3, 1)*t3 + box(4, 3, 1)*t4)*s3 + &
3448 (box(1, 4, 1)*t1 + box(2, 4, 1)*t2 + box(3, 4, 1)*t3 + box(4, 4, 1)*t4)*s4)*v1 + &
3449 ((box(1, 1, 2)*t1 + box(2, 1, 2)*t2 + box(3, 1, 2)*t3 + box(4, 1, 2)*t4)*s1 + &
3450 (box(1, 2, 2)*t1 + box(2, 2, 2)*t2 + box(3, 2, 2)*t3 + box(4, 2, 2)*t4)*s2 + &
3451 (box(1, 3, 2)*t1 + box(2, 3, 2)*t2 + box(3, 3, 2)*t3 + box(4, 3, 2)*t4)*s3 + &
3452 (box(1, 4, 2)*t1 + box(2, 4, 2)*t2 + box(3, 4, 2)*t3 + box(4, 4, 2)*t4)*s4)*v2 + &
3453 ((box(1, 1, 3)*t1 + box(2, 1, 3)*t2 + box(3, 1, 3)*t3 + box(4, 1, 3)*t4)*s1 + &
3454 (box(1, 2, 3)*t1 + box(2, 2, 3)*t2 + box(3, 2, 3)*t3 + box(4, 2, 3)*t4)*s2 + &
3455 (box(1, 3, 3)*t1 + box(2, 3, 3)*t2 + box(3, 3, 3)*t3 + box(4, 3, 3)*t4)*s3 + &
3456 (box(1, 4, 3)*t1 + box(2, 4, 3)*t2 + box(3, 4, 3)*t3 + box(4, 4, 3)*t4)*s4)*v3 + &
3457 ((box(1, 1, 4)*t1 + box(2, 1, 4)*t2 + box(3, 1, 4)*t3 + box(4, 1, 4)*t4)*s1 + &
3458 (box(1, 2, 4)*t1 + box(2, 2, 4)*t2 + box(3, 2, 4)*t3 + box(4, 2, 4)*t4)*s2 + &
3459 (box(1, 3, 4)*t1 + box(2, 3, 4)*t2 + box(3, 3, 4)*t3 + box(4, 3, 4)*t4)*s3 + &
3460 (box(1, 4, 4)*t1 + box(2, 4, 4)*t2 + box(3, 4, 4)*t3 + box(4, 4, 4)*t4)*s4)*v4
3474 val(2) = ((box(1, 1, 1)*t1 + box(2, 1, 1)*t2 + box(3, 1, 1)*t3 + box(4, 1, 1)*t4)*s1 + &
3475 (box(1, 2, 1)*t1 + box(2, 2, 1)*t2 + box(3, 2, 1)*t3 + box(4, 2, 1)*t4)*s2 + &
3476 (box(1, 3, 1)*t1 + box(2, 3, 1)*t2 + box(3, 3, 1)*t3 + box(4, 3, 1)*t4)*s3 + &
3477 (box(1, 4, 1)*t1 + box(2, 4, 1)*t2 + box(3, 4, 1)*t3 + box(4, 4, 1)*t4)*s4)*v1 + &
3478 ((box(1, 1, 2)*t1 + box(2, 1, 2)*t2 + box(3, 1, 2)*t3 + box(4, 1, 2)*t4)*s1 + &
3479 (box(1, 2, 2)*t1 + box(2, 2, 2)*t2 + box(3, 2, 2)*t3 + box(4, 2, 2)*t4)*s2 + &
3480 (box(1, 3, 2)*t1 + box(2, 3, 2)*t2 + box(3, 3, 2)*t3 + box(4, 3, 2)*t4)*s3 + &
3481 (box(1, 4, 2)*t1 + box(2, 4, 2)*t2 + box(3, 4, 2)*t3 + box(4, 4, 2)*t4)*s4)*v2 + &
3482 ((box(1, 1, 3)*t1 + box(2, 1, 3)*t2 + box(3, 1, 3)*t3 + box(4, 1, 3)*t4)*s1 + &
3483 (box(1, 2, 3)*t1 + box(2, 2, 3)*t2 + box(3, 2, 3)*t3 + box(4, 2, 3)*t4)*s2 + &
3484 (box(1, 3, 3)*t1 + box(2, 3, 3)*t2 + box(3, 3, 3)*t3 + box(4, 3, 3)*t4)*s3 + &
3485 (box(1, 4, 3)*t1 + box(2, 4, 3)*t2 + box(3, 4, 3)*t3 + box(4, 4, 3)*t4)*s4)*v3 + &
3486 ((box(1, 1, 4)*t1 + box(2, 1, 4)*t2 + box(3, 1, 4)*t3 + box(4, 1, 4)*t4)*s1 + &
3487 (box(1, 2, 4)*t1 + box(2, 2, 4)*t2 + box(3, 2, 4)*t3 + box(4, 2, 4)*t4)*s2 + &
3488 (box(1, 3, 4)*t1 + box(2, 3, 4)*t2 + box(3, 3, 4)*t3 + box(4, 3, 4)*t4)*s3 + &
3489 (box(1, 4, 4)*t1 + box(2, 4, 4)*t2 + box(3, 4, 4)*t3 + box(4, 4, 4)*t4)*s4)*v4
3503 val(3) = ((box(1, 1, 1)*t1 + box(2, 1, 1)*t2 + box(3, 1, 1)*t3 + box(4, 1, 1)*t4)*s1 + &
3504 (box(1, 2, 1)*t1 + box(2, 2, 1)*t2 + box(3, 2, 1)*t3 + box(4, 2, 1)*t4)*s2 + &
3505 (box(1, 3, 1)*t1 + box(2, 3, 1)*t2 + box(3, 3, 1)*t3 + box(4, 3, 1)*t4)*s3 + &
3506 (box(1, 4, 1)*t1 + box(2, 4, 1)*t2 + box(3, 4, 1)*t3 + box(4, 4, 1)*t4)*s4)*v1 + &
3507 ((box(1, 1, 2)*t1 + box(2, 1, 2)*t2 + box(3, 1, 2)*t3 + box(4, 1, 2)*t4)*s1 + &
3508 (box(1, 2, 2)*t1 + box(2, 2, 2)*t2 + box(3, 2, 2)*t3 + box(4, 2, 2)*t4)*s2 + &
3509 (box(1, 3, 2)*t1 + box(2, 3, 2)*t2 + box(3, 3, 2)*t3 + box(4, 3, 2)*t4)*s3 + &
3510 (box(1, 4, 2)*t1 + box(2, 4, 2)*t2 + box(3, 4, 2)*t3 + box(4, 4, 2)*t4)*s4)*v2 + &
3511 ((box(1, 1, 3)*t1 + box(2, 1, 3)*t2 + box(3, 1, 3)*t3 + box(4, 1, 3)*t4)*s1 + &
3512 (box(1, 2, 3)*t1 + box(2, 2, 3)*t2 + box(3, 2, 3)*t3 + box(4, 2, 3)*t4)*s2 + &
3513 (box(1, 3, 3)*t1 + box(2, 3, 3)*t2 + box(3, 3, 3)*t3 + box(4, 3, 3)*t4)*s3 + &
3514 (box(1, 4, 3)*t1 + box(2, 4, 3)*t2 + box(3, 4, 3)*t3 + box(4, 4, 3)*t4)*s4)*v3 + &
3515 ((box(1, 1, 4)*t1 + box(2, 1, 4)*t2 + box(3, 1, 4)*t3 + box(4, 1, 4)*t4)*s1 + &
3516 (box(1, 2, 4)*t1 + box(2, 2, 4)*t2 + box(3, 2, 4)*t3 + box(4, 2, 4)*t4)*s2 + &
3517 (box(1, 3, 4)*t1 + box(2, 3, 4)*t2 + box(3, 3, 4)*t3 + box(4, 3, 4)*t4)*s3 + &
3518 (box(1, 4, 4)*t1 + box(2, 4, 4)*t2 + box(3, 4, 4)*t3 + box(4, 4, 4)*t4)*s4)*v4
3520 IF (my_mpsum)
CALL pw%pw_grid%para%group%sum(val)