Line data Source code
1 : !{\src2tex{textfont=tt}}
2 : !!****f* ABINIT/xmpi_isum
3 : !! NAME
4 : !! xmpi_isum
5 : !!
6 : !! FUNCTION
7 : !! This module contains functions that calls MPI routine,
8 : !! if we compile the code using the MPI CPP flags.
9 : !! xmpi_isum is the generic function.
10 : !!
11 : !! COPYRIGHT
12 : !! Copyright (C) 2001-2026 ABINIT group (MG)
13 : !! This file is distributed under the terms of the
14 : !! GNU General Public License, see ~ABINIT/COPYING
15 : !! or http://www.gnu.org/copyleft/gpl.txt .
16 : !!
17 : !! NOTES
18 : !! MPI_IALLREDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, REQUEST, IERROR)
19 : !! <type> SENDBUF(*), RECVBUF(*)
20 : !! INTEGER COUNT, DATATYPE, OP, COMM, REQUEST, IERROR
21 : !!
22 : !! SOURCE
23 :
24 : !!***
25 :
26 : !!****f* ABINIT/xmpi_isum_int0d
27 : !! NAME
28 : !! xmpi_isum_int0d
29 : !!
30 : !! FUNCTION
31 : !! Combines values from all processes and distribute the result back to all processes.
32 : !! Target: scalar integers. Non-blocking version.
33 : !!
34 : !! INPUTS
35 : !!
36 : !! OUTPUT
37 : !!
38 : !! SOURCE
39 :
40 16 : subroutine xmpi_isum_int0d(xval, xsum, comm, request, ierr)
41 :
42 : !Arguments-------------------------
43 : integer ABI_ASYNC, intent(in), target :: xval
44 : integer ABI_ASYNC, intent(out), target :: xsum
45 : integer,intent(in) :: comm
46 : integer,intent(out) :: ierr, request
47 :
48 : !Local variables-------------------
49 : integer :: itmp
50 : #ifdef HAVE_MPI_IALLREDUCE
51 16 : integer, pointer :: arr_xval(:),arr_xsum(:)
52 : type(c_ptr) :: cptr
53 : #endif
54 :
55 : ! *************************************************************************
56 :
57 : #ifdef HAVE_MPI_IALLREDUCE
58 16 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
59 32 : cptr=c_loc(xval) ; call c_f_pointer(cptr,arr_xval,[1])
60 32 : cptr=c_loc(xsum) ; call c_f_pointer(cptr,arr_xsum,[1])
61 16 : call MPI_IALLREDUCE(arr_xval, arr_xsum, 1, MPI_INTEGER, MPI_SUM, comm, request, ierr)
62 16 : xmpi_count_requests = xmpi_count_requests + 1
63 16 : return
64 : end if
65 0 : xsum = xval; request = xmpi_request_null
66 0 : return
67 : #endif
68 :
69 : ! Call the blocking version and return null request.
70 : !write(std_out,*)"will block here and return fake request"
71 : itmp = xval
72 : call xmpi_sum(itmp, comm, ierr)
73 : xsum = itmp; request = xmpi_request_null
74 :
75 16 : end subroutine xmpi_isum_int0d
76 : !!***
77 :
78 : !!****f* ABINIT/xmpi_isum_ip_dp2d
79 : !! NAME
80 : !! xmpi_isum_ip_dp2d
81 : !!
82 : !! FUNCTION
83 : !! Combines values from all processes and distribute the result back to all processes.
84 : !! Target: scalar integers. Non-blocking INPLACE version.
85 : !!
86 : !! INPUTS
87 : !!
88 : !! OUTPUT
89 : !!
90 : !! SOURCE
91 :
92 0 : subroutine xmpi_isum_ip_dp2d(xval, comm, request, ierr)
93 :
94 : !Arguments-------------------------
95 : real(dp) ABI_ASYNC, intent(inout) :: xval(:,:)
96 : integer,intent(in) :: comm
97 : integer,intent(out) :: ierr, request
98 : #if !defined HAVE_MPI2_INPLACE
99 : integer :: n1,n2
100 : real(dp) ABI_ASYNC, allocatable :: xsum(:,:)
101 : #endif
102 :
103 : ! *************************************************************************
104 :
105 : #ifdef HAVE_MPI_IALLREDUCE
106 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
107 : #if defined HAVE_MPI2_INPLACE
108 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_DOUBLE_PRECISION, MPI_SUM, comm, request, ierr)
109 : #else
110 : n1 = size(xval,1) ; n2 = size(xval,2)
111 : ABI_STAT_MALLOC(xsum,(n1,n2), ierr)
112 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_dp2d')
113 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_DOUBLE_PRECISION, MPI_SUM, comm, request, ierr)
114 : xval (:,:) = xsum(:,:)
115 : ABI_FREE(xsum)
116 : #endif
117 0 : xmpi_count_requests = xmpi_count_requests + 1
118 0 : return
119 : end if
120 0 : request = xmpi_request_null
121 0 : return
122 : #endif
123 :
124 : ! Call the blocking version and return null request.
125 : call xmpi_sum(xval, comm, ierr)
126 : request = xmpi_request_null
127 :
128 : end subroutine xmpi_isum_ip_dp2d
129 : !!***
130 :
131 : !!****f* ABINIT/xmpi_isum_ip_dp3d
132 : !! NAME
133 : !! xmpi_isum_ip_dp3d
134 : !!
135 : !! FUNCTION
136 : !! Combines values from all processes and distribute the result back to all processes.
137 : !! Target: scalar integers. Non-blocking INPLACE version.
138 : !!
139 : !! INPUTS
140 : !!
141 : !! OUTPUT
142 : !!
143 : !! SOURCE
144 :
145 0 : subroutine xmpi_isum_ip_dp3d(xval, comm, request, ierr)
146 :
147 : !Arguments-------------------------
148 : real(dp) ABI_ASYNC, intent(inout) :: xval(:,:,:)
149 : integer,intent(in) :: comm
150 : integer,intent(out) :: ierr, request
151 : #if !defined HAVE_MPI2_INPLACE
152 : integer :: n1,n2,n3
153 : real(dp) ABI_ASYNC, allocatable :: xsum(:,:,:)
154 : #endif
155 :
156 : ! *************************************************************************
157 :
158 : #ifdef HAVE_MPI_IALLREDUCE
159 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
160 : #if defined HAVE_MPI2_INPLACE
161 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_DOUBLE_PRECISION, MPI_SUM, comm, request, ierr)
162 : #else
163 : n1 = size(xval,1) ; n2 = size(xval,2) ; n3 = size(xval,3)
164 : ABI_STAT_MALLOC(xsum,(n1,n2,n3), ierr)
165 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_dp3d')
166 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_DOUBLE_PRECISION, MPI_SUM, comm, request, ierr)
167 : xval (:,:,:) = xsum(:,:,:)
168 : ABI_FREE(xsum)
169 : #endif
170 0 : xmpi_count_requests = xmpi_count_requests + 1
171 0 : return
172 : end if
173 0 : request = xmpi_request_null
174 0 : return
175 : #endif
176 :
177 : ! Call the blocking version and return null request.
178 : call xmpi_sum(xval, comm, ierr)
179 : request = xmpi_request_null
180 :
181 : end subroutine xmpi_isum_ip_dp3d
182 : !!***
183 :
184 : !!****f* ABINIT/xmpi_isum_ip_dp4d
185 : !! NAME
186 : !! xmpi_isum_ip_dp4d
187 : !!
188 : !! FUNCTION
189 : !! Combines values from all processes and distribute the result back to all processes.
190 : !! Target: scalar integers. Non-blocking INPLACE version.
191 : !!
192 : !! INPUTS
193 : !!
194 : !! OUTPUT
195 : !!
196 : !! SOURCE
197 :
198 0 : subroutine xmpi_isum_ip_dp4d(xval, comm, request, ierr)
199 :
200 : !Arguments-------------------------
201 : real(dp) ABI_ASYNC, intent(inout) :: xval(:,:,:,:)
202 : integer,intent(in) :: comm
203 : integer,intent(out) :: ierr, request
204 : #if !defined HAVE_MPI2_INPLACE
205 : integer :: n1,n2,n3,n4
206 : real(dp) ABI_ASYNC, allocatable :: xsum(:,:,:,:)
207 : #endif
208 :
209 : ! *************************************************************************
210 :
211 : #ifdef HAVE_MPI_IALLREDUCE
212 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
213 : #if defined HAVE_MPI2_INPLACE
214 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_DOUBLE_PRECISION, MPI_SUM, comm, request, ierr)
215 : #else
216 : n1 = size(xval,1) ; n2 = size(xval,2) ; n3 = size(xval,3) ; n4 = size(xval,4)
217 : ABI_STAT_MALLOC(xsum,(n1,n2,n3,n4), ierr)
218 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_dp4d')
219 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_DOUBLE_PRECISION, MPI_SUM, comm, request, ierr)
220 : xval (:,:,:,:) = xsum(:,:,:,:)
221 : ABI_FREE(xsum)
222 : #endif
223 0 : xmpi_count_requests = xmpi_count_requests + 1
224 0 : return
225 : end if
226 0 : request = xmpi_request_null
227 0 : return
228 : #endif
229 :
230 : ! Call the blocking version and return null request.
231 : call xmpi_sum(xval, comm, ierr)
232 : request = xmpi_request_null
233 :
234 : end subroutine xmpi_isum_ip_dp4d
235 : !!***
236 :
237 : !!****f* ABINIT/xmpi_isum_ip_spc1d
238 : !! NAME
239 : !! xmpi_isum_ip_spc1d
240 : !!
241 : !! FUNCTION
242 : !! Combines values from all processes and distribute the result back to all processes.
243 : !! Target: 1d single precision complex arrays. Non-blocking INPLACE version.
244 : !!
245 : !! INPUTS
246 : !!
247 : !! OUTPUT
248 : !!
249 : !! SOURCE
250 :
251 0 : subroutine xmpi_isum_ip_spc1d(xval, comm, request, ierr)
252 :
253 : !Arguments-------------------------
254 : complex(sp) ABI_ASYNC, intent(inout) :: xval(:)
255 : integer,intent(in) :: comm
256 : integer,intent(out) :: ierr, request
257 : #if !defined HAVE_MPI2_INPLACE
258 : integer :: n1
259 : complex(sp) ABI_ASYNC, allocatable :: xsum(:)
260 : #endif
261 :
262 : ! *************************************************************************
263 :
264 : #ifdef HAVE_MPI_IALLREDUCE
265 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
266 : #if defined HAVE_MPI2_INPLACE
267 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_COMPLEX, MPI_SUM, comm, request, ierr)
268 : #else
269 : n1 = size(xval,1)
270 : ABI_STAT_MALLOC(xsum,(n1), ierr)
271 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_spc1d')
272 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_COMPLEX, MPI_SUM, comm, request, ierr)
273 : xval (:) = xsum(:)
274 : ABI_FREE(xsum)
275 : #endif
276 0 : xmpi_count_requests = xmpi_count_requests + 1
277 0 : return
278 : end if
279 0 : request = xmpi_request_null
280 0 : return
281 : #endif
282 :
283 : ! Call the blocking version and return null request.
284 : call xmpi_sum(xval, comm, ierr)
285 : request = xmpi_request_null
286 :
287 : end subroutine xmpi_isum_ip_spc1d
288 : !!***
289 :
290 : !!****f* ABINIT/xmpi_isum_ip_dpc1d
291 : !! NAME
292 : !! xmpi_isum_ip_dpc1d
293 : !!
294 : !! FUNCTION
295 : !! Combines values from all processes and distribute the result back to all processes.
296 : !! Target: 1d double precision complex arrays. Non-blocking INPLACE version.
297 : !!
298 : !! INPUTS
299 : !!
300 : !! OUTPUT
301 : !!
302 : !! SOURCE
303 :
304 0 : subroutine xmpi_isum_ip_dpc1d(xval, comm, request, ierr)
305 :
306 : !Arguments-------------------------
307 : complex(dp) ABI_ASYNC, intent(inout) :: xval(:)
308 : integer,intent(in) :: comm
309 : integer,intent(out) :: ierr, request
310 : #if !defined HAVE_MPI2_INPLACE
311 : integer :: n1
312 : complex(dp) ABI_ASYNC, allocatable :: xsum(:)
313 : #endif
314 :
315 : ! *************************************************************************
316 :
317 : #ifdef HAVE_MPI_IALLREDUCE
318 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
319 : #if defined HAVE_MPI2_INPLACE
320 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_DOUBLE_COMPLEX, MPI_SUM, comm, request, ierr)
321 : #else
322 : n1 = size(xval,1)
323 : ABI_STAT_MALLOC(xsum,(n1), ierr)
324 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_dpc1d')
325 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_DOUBLE_COMPLEX, MPI_SUM, comm, request, ierr)
326 : xval (:) = xsum(:)
327 : ABI_FREE(xsum)
328 : #endif
329 0 : xmpi_count_requests = xmpi_count_requests + 1
330 0 : return
331 : end if
332 0 : request = xmpi_request_null
333 0 : return
334 : #endif
335 :
336 : ! Call the blocking version and return null request.
337 : call xmpi_sum(xval, comm, ierr)
338 : request = xmpi_request_null
339 :
340 : end subroutine xmpi_isum_ip_dpc1d
341 : !!***
342 :
343 : !!****f* ABINIT/xmpi_isum_ip_spc2d
344 : !! NAME
345 : !! xmpi_isum_ip_spc2d
346 : !!
347 : !! FUNCTION
348 : !! Combines values from all processes and distribute the result back to all processes.
349 : !! Target: 2d single precision complex arrays. Non-blocking INPLACE version.
350 : !!
351 : !! INPUTS
352 : !!
353 : !! OUTPUT
354 : !!
355 : !! SOURCE
356 :
357 0 : subroutine xmpi_isum_ip_spc2d(xval, comm, request, ierr)
358 :
359 : !Arguments-------------------------
360 : complex(sp) ABI_ASYNC, intent(inout) :: xval(:,:)
361 : integer,intent(in) :: comm
362 : integer,intent(out) :: ierr, request
363 : #if !defined HAVE_MPI2_INPLACE
364 : integer :: n1,n2
365 : complex(sp) ABI_ASYNC, allocatable :: xsum(:,:)
366 : #endif
367 :
368 : ! *************************************************************************
369 :
370 : #ifdef HAVE_MPI_IALLREDUCE
371 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
372 : #if defined HAVE_MPI2_INPLACE
373 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_COMPLEX, MPI_SUM, comm, request, ierr)
374 : #else
375 : n1 = size(xval,1) ; n2 = size(xval,2)
376 : ABI_STAT_MALLOC(xsum,(n1,n2), ierr)
377 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_spc2d')
378 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_DOUBLE_COMPLEX, MPI_SUM, comm, request, ierr)
379 : xval (:,:) = xsum(:,:)
380 : ABI_FREE(xsum)
381 : #endif
382 0 : xmpi_count_requests = xmpi_count_requests + 1
383 0 : return
384 : end if
385 0 : request = xmpi_request_null
386 0 : return
387 : #endif
388 :
389 : ! Call the blocking version and return null request.
390 : call xmpi_sum(xval, comm, ierr)
391 : request = xmpi_request_null
392 :
393 : end subroutine xmpi_isum_ip_spc2d
394 : !!***
395 :
396 : !!****f* ABINIT/xmpi_isum_ip_dpc2d
397 : !! NAME
398 : !! xmpi_isum_ip_dpc2d
399 : !!
400 : !! FUNCTION
401 : !! Combines values from all processes and distribute the result back to all processes.
402 : !! Target: 2d double precision complex arrays. Non-blocking INPLACE version.
403 : !!
404 : !! INPUTS
405 : !!
406 : !! OUTPUT
407 : !!
408 : !! SOURCE
409 :
410 0 : subroutine xmpi_isum_ip_dpc2d(xval, comm, request, ierr)
411 :
412 : !Arguments-------------------------
413 : complex(dp) ABI_ASYNC, intent(inout) :: xval(:,:)
414 : integer,intent(in) :: comm
415 : integer,intent(out) :: ierr, request
416 : #if !defined HAVE_MPI2_INPLACE
417 : integer :: n1,n2
418 : complex(dp) ABI_ASYNC, allocatable :: xsum(:,:)
419 : #endif
420 :
421 : ! *************************************************************************
422 :
423 : #ifdef HAVE_MPI_IALLREDUCE
424 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
425 : #if defined HAVE_MPI2_INPLACE
426 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_DOUBLE_COMPLEX, MPI_SUM, comm, request, ierr)
427 : #else
428 : n1 = size(xval,1) ; n2 = size(xval,2)
429 : ABI_STAT_MALLOC(xsum,(n1,n2), ierr)
430 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_spc2d')
431 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_DOUBLE_COMPLEX, MPI_SUM, comm, request, ierr)
432 : xval (:,:) = xsum(:,:)
433 : ABI_FREE(xsum)
434 : #endif
435 0 : xmpi_count_requests = xmpi_count_requests + 1
436 0 : return
437 : end if
438 0 : request = xmpi_request_null
439 0 : return
440 : #endif
441 :
442 : ! Call the blocking version and return null request.
443 : call xmpi_sum(xval, comm, ierr)
444 : request = xmpi_request_null
445 :
446 : end subroutine xmpi_isum_ip_dpc2d
447 : !!***
448 :
449 : !!****f* ABINIT/xmpi_isum_ip_spc3d
450 : !! NAME
451 : !! xmpi_isum_ip_spc3d
452 : !!
453 : !! FUNCTION
454 : !! Combines values from all processes and distribute the result back to all processes.
455 : !! Target: 3d single precision complex arrays. Non-blocking INPLACE version.
456 : !!
457 : !! INPUTS
458 : !!
459 : !! OUTPUT
460 : !!
461 : !! SOURCE
462 :
463 0 : subroutine xmpi_isum_ip_spc3d(xval, comm, request, ierr)
464 :
465 : !Arguments-------------------------
466 : complex(sp) ABI_ASYNC, intent(inout) :: xval(:,:,:)
467 : integer,intent(in) :: comm
468 : integer,intent(out) :: ierr, request
469 : #if !defined HAVE_MPI2_INPLACE
470 : integer :: n1,n2,n3
471 : complex(sp) ABI_ASYNC, allocatable :: xsum(:,:,:)
472 : #endif
473 :
474 : ! *************************************************************************
475 :
476 : #ifdef HAVE_MPI_IALLREDUCE
477 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
478 : #if defined HAVE_MPI2_INPLACE
479 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_COMPLEX, MPI_SUM, comm, request, ierr)
480 : #else
481 : n1 = size(xval,1) ; n2 = size(xval,2) ; n3 = size(xval,3)
482 : ABI_STAT_MALLOC(xsum,(n1,n2,3), ierr)
483 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_spc3d')
484 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_DOUBLE_COMPLEX, MPI_SUM, comm, request, ierr)
485 : xval (:,:,:) = xsum(:,:,:)
486 : ABI_FREE(xsum)
487 : #endif
488 0 : xmpi_count_requests = xmpi_count_requests + 1
489 0 : return
490 : end if
491 0 : request = xmpi_request_null
492 0 : return
493 : #endif
494 :
495 : ! Call the blocking version and return null request.
496 : call xmpi_sum(xval, comm, ierr)
497 : request = xmpi_request_null
498 :
499 : end subroutine xmpi_isum_ip_spc3d
500 : !!***
501 :
502 : !!****f* ABINIT/xmpi_isum_ip_dpc3d
503 : !! NAME
504 : !! xmpi_isum_ip_dpc3d
505 : !!
506 : !! FUNCTION
507 : !! Combines values from all processes and distribute the result back to all processes.
508 : !! Target: 3d double precision complex arrays. Non-blocking INPLACE version.
509 : !!
510 : !! INPUTS
511 : !!
512 : !! OUTPUT
513 : !!
514 : !! SOURCE
515 :
516 0 : subroutine xmpi_isum_ip_dpc3d(xval, comm, request, ierr)
517 :
518 : !Arguments-------------------------
519 : complex(dp) ABI_ASYNC, intent(inout) :: xval(:,:,:)
520 : integer,intent(in) :: comm
521 : integer,intent(out) :: ierr, request
522 : #if !defined HAVE_MPI2_INPLACE
523 : integer :: n1,n2,n3
524 : complex(sp) ABI_ASYNC, allocatable :: xsum(:,:,:)
525 : #endif
526 :
527 : ! *************************************************************************
528 :
529 : #ifdef HAVE_MPI_IALLREDUCE
530 0 : if (comm /= MPI_COMM_SELF .and. comm /= MPI_COMM_NULL) then
531 : #if defined HAVE_MPI2_INPLACE
532 0 : call MPI_IALLREDUCE(MPI_IN_PLACE, xval, product(shape(xval)), MPI_DOUBLE_COMPLEX, MPI_SUM, comm, request, ierr)
533 : #else
534 : n1 = size(xval,1) ; n2 = size(xval,2) ; n3 = size(xval,3)
535 : ABI_STAT_MALLOC(xsum,(n1,n2,3), ierr)
536 : if (ierr/= 0) call xmpi_abort(msg='error allocating xsum in xmpi_isum_ip_dpc3d')
537 : call MPI_IALLREDUCE(xsum, xval, product(shape(xval)), MPI_DOUBLE_COMPLEX, MPI_SUM, comm, request, ierr)
538 : xval (:,:,:) = xsum(:,:,:)
539 : ABI_FREE(xsum)
540 : #endif
541 0 : xmpi_count_requests = xmpi_count_requests + 1
542 0 : return
543 : end if
544 0 : request = xmpi_request_null
545 0 : return
546 : #endif
547 :
548 : ! Call the blocking version and return null request.
549 : call xmpi_sum(xval, comm, ierr)
550 : request = xmpi_request_null
551 :
552 : end subroutine xmpi_isum_ip_dpc3d
553 : !!***
|