99 local_rows_ptr, n_local_rows, &
100 local_cols_ptr, row_distribution_ptr, col_distribution_ptr, &
101 n_local_cols, n_row_distribution, n_col_distribution)
105 POINTER :: local_rows_ptr
106 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: n_local_rows
108 POINTER :: local_cols_ptr
109 INTEGER,
DIMENSION(:, :),
OPTIONAL,
POINTER :: row_distribution_ptr, &
111 INTEGER,
DIMENSION(:),
INTENT(in),
OPTIONAL :: n_local_cols
112 INTEGER,
INTENT(in),
OPTIONAL :: n_row_distribution, n_col_distribution
116 cpassert(
ASSOCIATED(blacs_env))
117 cpassert(.NOT.
ASSOCIATED(distribution_2d))
119 ALLOCATE (distribution_2d)
120 distribution_2d%ref_count = 1
122 NULLIFY (distribution_2d%col_distribution, distribution_2d%row_distribution, &
123 distribution_2d%local_rows, distribution_2d%local_cols, &
124 distribution_2d%blacs_env, distribution_2d%n_local_cols, &
125 distribution_2d%n_local_rows, distribution_2d%flat_local_rows, &
126 distribution_2d%flat_local_cols)
128 distribution_2d%n_col_distribution = -huge(0)
129 IF (
PRESENT(col_distribution_ptr))
THEN
130 distribution_2d%col_distribution => col_distribution_ptr
131 distribution_2d%n_col_distribution =
SIZE(distribution_2d%col_distribution, 1)
133 IF (
PRESENT(n_col_distribution))
THEN
134 IF (
ASSOCIATED(distribution_2d%col_distribution))
THEN
135 IF (n_col_distribution > distribution_2d%n_col_distribution)
THEN
136 cpabort(
"n_col_distribution<=distribution_2d%n_col_distribution")
140 distribution_2d%n_col_distribution = n_col_distribution
142 distribution_2d%n_row_distribution = -huge(0)
143 IF (
PRESENT(row_distribution_ptr))
THEN
144 distribution_2d%row_distribution => row_distribution_ptr
145 distribution_2d%n_row_distribution =
SIZE(distribution_2d%row_distribution, 1)
147 IF (
PRESENT(n_row_distribution))
THEN
148 IF (
ASSOCIATED(distribution_2d%row_distribution))
THEN
149 IF (n_row_distribution > distribution_2d%n_row_distribution)
THEN
150 cpabort(
"n_row_distribution<=distribution_2d%n_row_distribution")
154 distribution_2d%n_row_distribution = n_row_distribution
157 IF (
PRESENT(local_rows_ptr))
THEN
158 distribution_2d%local_rows => local_rows_ptr
160 IF (.NOT.
ASSOCIATED(distribution_2d%local_rows))
THEN
161 cpassert(
PRESENT(n_local_rows))
162 ALLOCATE (distribution_2d%local_rows(
SIZE(n_local_rows)))
163 DO i = 1,
SIZE(distribution_2d%local_rows)
164 ALLOCATE (distribution_2d%local_rows(i)%array(n_local_rows(i)))
165 distribution_2d%local_rows(i)%array = -huge(0)
168 ALLOCATE (distribution_2d%n_local_rows(
SIZE(distribution_2d%local_rows)))
169 IF (
PRESENT(n_local_rows))
THEN
170 IF (
SIZE(distribution_2d%n_local_rows) /=
SIZE(n_local_rows))
THEN
171 cpabort(
"SIZE(distribution_2d%n_local_rows)==SIZE(n_local_rows)")
173 DO i = 1,
SIZE(distribution_2d%n_local_rows)
174 IF (
SIZE(distribution_2d%local_rows(i)%array) < n_local_rows(i))
THEN
175 cpabort(
"SIZE(distribution_2d%local_rows(i)%array)>=n_local_rows(i)")
177 distribution_2d%n_local_rows(i) = n_local_rows(i)
180 DO i = 1,
SIZE(distribution_2d%n_local_rows)
181 distribution_2d%n_local_rows(i) = &
182 SIZE(distribution_2d%local_rows(i)%array)
186 IF (
PRESENT(local_cols_ptr))
THEN
187 distribution_2d%local_cols => local_cols_ptr
189 IF (.NOT.
ASSOCIATED(distribution_2d%local_cols))
THEN
190 cpassert(
PRESENT(n_local_cols))
191 ALLOCATE (distribution_2d%local_cols(
SIZE(n_local_cols)))
192 DO i = 1,
SIZE(distribution_2d%local_cols)
193 ALLOCATE (distribution_2d%local_cols(i)%array(n_local_cols(i)))
194 distribution_2d%local_cols(i)%array = -huge(0)
197 ALLOCATE (distribution_2d%n_local_cols(
SIZE(distribution_2d%local_cols)))
198 IF (
PRESENT(n_local_cols))
THEN
199 IF (
SIZE(distribution_2d%n_local_cols) /=
SIZE(n_local_cols))
THEN
200 cpabort(
"SIZE(distribution_2d%n_local_cols)==SIZE(n_local_cols)")
202 DO i = 1,
SIZE(distribution_2d%n_local_cols)
203 IF (
SIZE(distribution_2d%local_cols(i)%array) < n_local_cols(i))
THEN
204 cpabort(
"SIZE(distribution_2d%local_cols(i)%array)>=n_local_cols(i)")
206 distribution_2d%n_local_cols(i) = n_local_cols(i)
209 DO i = 1,
SIZE(distribution_2d%n_local_cols)
210 distribution_2d%n_local_cols(i) = &
211 SIZE(distribution_2d%local_cols(i)%array)
215 distribution_2d%blacs_env => blacs_env
216 CALL distribution_2d%blacs_env%retain()
242 IF (
ASSOCIATED(distribution_2d))
THEN
243 cpassert(distribution_2d%ref_count > 0)
244 distribution_2d%ref_count = distribution_2d%ref_count - 1
245 IF (distribution_2d%ref_count == 0)
THEN
247 IF (
ASSOCIATED(distribution_2d%col_distribution))
THEN
248 DEALLOCATE (distribution_2d%col_distribution)
250 IF (
ASSOCIATED(distribution_2d%row_distribution))
THEN
251 DEALLOCATE (distribution_2d%row_distribution)
253 DO i = 1,
SIZE(distribution_2d%local_rows)
254 DEALLOCATE (distribution_2d%local_rows(i)%array)
256 DEALLOCATE (distribution_2d%local_rows)
257 DO i = 1,
SIZE(distribution_2d%local_cols)
258 DEALLOCATE (distribution_2d%local_cols(i)%array)
260 DEALLOCATE (distribution_2d%local_cols)
261 IF (
ASSOCIATED(distribution_2d%flat_local_rows))
THEN
262 DEALLOCATE (distribution_2d%flat_local_rows)
264 IF (
ASSOCIATED(distribution_2d%flat_local_cols))
THEN
265 DEALLOCATE (distribution_2d%flat_local_cols)
267 IF (
ASSOCIATED(distribution_2d%n_local_rows))
THEN
268 DEALLOCATE (distribution_2d%n_local_rows)
270 IF (
ASSOCIATED(distribution_2d%n_local_cols))
THEN
271 DEALLOCATE (distribution_2d%n_local_cols)
273 DEALLOCATE (distribution_2d)
276 NULLIFY (distribution_2d)
297 INTEGER,
INTENT(in) :: unit_nr
298 LOGICAL,
INTENT(in),
OPTIONAL :: local, long_description
301 LOGICAL :: my_local, my_long_description
306 my_long_description = .false.
307 IF (
PRESENT(long_description)) my_long_description = long_description
309 IF (
PRESENT(local)) my_local = local
310 IF (.NOT. my_local) my_local = logger%para_env%is_source()
312 IF (
ASSOCIATED(distribution_2d))
THEN
314 WRITE (unit=unit_nr, &
315 fmt=
"(/,' <distribution_2d> { ref_count=',i10,',')") &
316 distribution_2d%ref_count
318 WRITE (unit=unit_nr, fmt=
"(' n_row_distribution=',i15,',')") &
319 distribution_2d%n_row_distribution
320 IF (
ASSOCIATED(distribution_2d%row_distribution))
THEN
321 IF (my_long_description)
THEN
322 WRITE (unit=unit_nr, fmt=
"(' row_distribution= (')", advance=
"no")
323 DO i = 1,
SIZE(distribution_2d%row_distribution, 1)
324 WRITE (unit=unit_nr, fmt=
"(i6,',')", advance=
"no") distribution_2d%row_distribution(i, 1)
326 IF (
modulo(i, 8) == 0 .AND. i /=
SIZE(distribution_2d%row_distribution, 1))
THEN
327 WRITE (unit=unit_nr, fmt=
'()')
330 WRITE (unit=unit_nr, fmt=
"('),')")
332 WRITE (unit=unit_nr, fmt=
"(' row_distribution= array(',i6,':',i6,'),')") &
333 lbound(distribution_2d%row_distribution(:, 1)), &
334 ubound(distribution_2d%row_distribution(:, 1))
337 WRITE (unit=unit_nr, fmt=
"(' row_distribution=*null*,')")
340 WRITE (unit=unit_nr, fmt=
"(' n_col_distribution=',i15,',')") &
341 distribution_2d%n_col_distribution
342 IF (
ASSOCIATED(distribution_2d%col_distribution))
THEN
343 IF (my_long_description)
THEN
344 WRITE (unit=unit_nr, fmt=
"(' col_distribution= (')", advance=
"no")
345 DO i = 1,
SIZE(distribution_2d%col_distribution, 1)
346 WRITE (unit=unit_nr, fmt=
"(i6,',')", advance=
"no") distribution_2d%col_distribution(i, 1)
348 IF (
modulo(i, 8) == 0 .AND. i /=
SIZE(distribution_2d%col_distribution, 1))
THEN
349 WRITE (unit=unit_nr, fmt=
'()')
352 WRITE (unit=unit_nr, fmt=
"('),')")
354 WRITE (unit=unit_nr, fmt=
"(' col_distribution= array(',i6,':',i6,'),')") &
355 lbound(distribution_2d%col_distribution(:, 1)), &
356 ubound(distribution_2d%col_distribution(:, 1))
359 WRITE (unit=unit_nr, fmt=
"(' col_distribution=*null*,')")
362 IF (
ASSOCIATED(distribution_2d%n_local_rows))
THEN
363 IF (my_long_description)
THEN
364 WRITE (unit=unit_nr, fmt=
"(' n_local_rows= (')", advance=
"no")
365 DO i = 1,
SIZE(distribution_2d%n_local_rows)
366 WRITE (unit=unit_nr, fmt=
"(i6,',')", advance=
"no") distribution_2d%n_local_rows(i)
368 IF (
modulo(i, 10) == 0 .AND. i /=
SIZE(distribution_2d%n_local_rows))
THEN
369 WRITE (unit=unit_nr, fmt=
'()')
372 WRITE (unit=unit_nr, fmt=
"('),')")
374 WRITE (unit=unit_nr, fmt=
"(' n_local_rows= array(',i6,':',i6,'),')") &
375 lbound(distribution_2d%n_local_rows), &
376 ubound(distribution_2d%n_local_rows)
379 WRITE (unit=unit_nr, fmt=
"(' n_local_rows=*null*,')")
382 IF (
ASSOCIATED(distribution_2d%local_rows))
THEN
383 WRITE (unit=unit_nr, fmt=
"(' local_rows=(')")
384 DO i = 1,
SIZE(distribution_2d%local_rows)
385 IF (
ASSOCIATED(distribution_2d%local_rows(i)%array))
THEN
386 IF (my_long_description)
THEN
387 CALL cp_1d_i_write(array=distribution_2d%local_rows(i)%array, &
390 WRITE (unit=unit_nr, fmt=
"(' array(',i6,':',i6,'),')") &
391 lbound(distribution_2d%local_rows(i)%array), &
392 ubound(distribution_2d%local_rows(i)%array)
395 WRITE (unit=unit_nr, fmt=
"('*null*')")
398 WRITE (unit=unit_nr, fmt=
"(' ),')")
400 WRITE (unit=unit_nr, fmt=
"(' local_rows=*null*,')")
403 IF (
ASSOCIATED(distribution_2d%n_local_cols))
THEN
404 IF (my_long_description)
THEN
405 WRITE (unit=unit_nr, fmt=
"(' n_local_cols= (')", advance=
"no")
406 DO i = 1,
SIZE(distribution_2d%n_local_cols)
407 WRITE (unit=unit_nr, fmt=
"(i6,',')", advance=
"no") distribution_2d%n_local_cols(i)
409 IF (
modulo(i, 10) == 0 .AND. i /=
SIZE(distribution_2d%n_local_cols))
THEN
410 WRITE (unit=unit_nr, fmt=
'()')
413 WRITE (unit=unit_nr, fmt=
"('),')")
415 WRITE (unit=unit_nr, fmt=
"(' n_local_cols= array(',i6,':',i6,'),')") &
416 lbound(distribution_2d%n_local_cols), &
417 ubound(distribution_2d%n_local_cols)
420 WRITE (unit=unit_nr, fmt=
"(' n_local_cols=*null*,')")
423 IF (
ASSOCIATED(distribution_2d%local_cols))
THEN
424 WRITE (unit=unit_nr, fmt=
"(' local_cols=(')")
425 DO i = 1,
SIZE(distribution_2d%local_cols)
426 IF (
ASSOCIATED(distribution_2d%local_cols(i)%array))
THEN
427 IF (my_long_description)
THEN
428 CALL cp_1d_i_write(array=distribution_2d%local_cols(i)%array, &
431 WRITE (unit=unit_nr, fmt=
"(' array(',i6,':',i6,'),')") &
432 lbound(distribution_2d%local_cols(i)%array), &
433 ubound(distribution_2d%local_cols(i)%array)
436 WRITE (unit=unit_nr, fmt=
"('*null*')")
439 WRITE (unit=unit_nr, fmt=
"(' ),')")
441 WRITE (unit=unit_nr, fmt=
"(' local_cols=*null*,')")
444 IF (
ASSOCIATED(distribution_2d%blacs_env))
THEN
445 IF (my_long_description)
THEN
446 WRITE (unit=unit_nr, fmt=
"(' blacs_env=')", advance=
"no")
447 CALL distribution_2d%blacs_env%write(unit_nr)
449 WRITE (unit=unit_nr, fmt=
"(' blacs_env=<blacs_env id=',i6,'>')") &
450 distribution_2d%blacs_env%get_handle()
453 WRITE (unit=unit_nr, fmt=
"(' blacs_env=*null*')")
456 WRITE (unit=unit_nr, fmt=
"(' }')")
459 ELSE IF (my_local)
THEN
460 WRITE (unit=unit_nr, &
461 fmt=
"(' <distribution_2d *null*>')")
489 col_distribution, n_row_distribution, n_col_distribution, &
490 n_local_rows, n_local_cols, local_rows, local_cols, &
491 flat_local_rows, flat_local_cols, n_flat_local_rows, n_flat_local_cols, &
494 INTEGER,
DIMENSION(:, :),
OPTIONAL,
POINTER :: row_distribution, col_distribution
495 INTEGER,
INTENT(out),
OPTIONAL :: n_row_distribution, n_col_distribution
496 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: n_local_rows, n_local_cols
498 POINTER :: local_rows, local_cols
499 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: flat_local_rows, flat_local_cols
500 INTEGER,
INTENT(out),
OPTIONAL :: n_flat_local_rows, n_flat_local_cols
503 INTEGER :: iblock_atomic, iblock_min, ikind, &
505 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: multiindex
507 cpassert(
ASSOCIATED(distribution_2d))
508 cpassert(distribution_2d%ref_count > 0)
509 IF (
PRESENT(row_distribution)) row_distribution => distribution_2d%row_distribution
510 IF (
PRESENT(col_distribution)) col_distribution => distribution_2d%col_distribution
511 IF (
PRESENT(n_row_distribution)) n_row_distribution = distribution_2d%n_row_distribution
512 IF (
PRESENT(n_col_distribution)) n_col_distribution = distribution_2d%n_col_distribution
513 IF (
PRESENT(n_local_rows)) n_local_rows => distribution_2d%n_local_rows
514 IF (
PRESENT(n_local_cols)) n_local_cols => distribution_2d%n_local_cols
515 IF (
PRESENT(local_rows)) local_rows => distribution_2d%local_rows
516 IF (
PRESENT(local_cols)) local_cols => distribution_2d%local_cols
517 IF (
PRESENT(flat_local_rows))
THEN
518 IF (.NOT.
ASSOCIATED(distribution_2d%flat_local_rows))
THEN
519 ALLOCATE (multiindex(
SIZE(distribution_2d%local_rows)), &
520 distribution_2d%flat_local_rows(sum(distribution_2d%n_local_rows)))
522 DO iblock_atomic = 1,
SIZE(distribution_2d%flat_local_rows)
525 DO ikind = 1,
SIZE(distribution_2d%local_rows)
526 IF (multiindex(ikind) <= distribution_2d%n_local_rows(ikind))
THEN
527 IF (distribution_2d%local_rows(ikind)%array(multiindex(ikind)) < &
529 iblock_min = distribution_2d%local_rows(ikind)%array(multiindex(ikind))
534 cpassert(ikind_min > 0)
535 distribution_2d%flat_local_rows(iblock_atomic) = &
536 distribution_2d%local_rows(ikind_min)%array(multiindex(ikind_min))
537 multiindex(ikind_min) = multiindex(ikind_min) + 1
539 DEALLOCATE (multiindex)
541 flat_local_rows => distribution_2d%flat_local_rows
543 IF (
PRESENT(flat_local_cols))
THEN
544 IF (.NOT.
ASSOCIATED(distribution_2d%flat_local_cols))
THEN
545 ALLOCATE (multiindex(
SIZE(distribution_2d%local_cols)), &
546 distribution_2d%flat_local_cols(sum(distribution_2d%n_local_cols)))
548 DO iblock_atomic = 1,
SIZE(distribution_2d%flat_local_cols)
551 DO ikind = 1,
SIZE(distribution_2d%local_cols)
552 IF (multiindex(ikind) <= distribution_2d%n_local_cols(ikind))
THEN
553 IF (distribution_2d%local_cols(ikind)%array(multiindex(ikind)) < &
555 iblock_min = distribution_2d%local_cols(ikind)%array(multiindex(ikind))
560 cpassert(ikind_min > 0)
561 distribution_2d%flat_local_cols(iblock_atomic) = &
562 distribution_2d%local_cols(ikind_min)%array(multiindex(ikind_min))
563 multiindex(ikind_min) = multiindex(ikind_min) + 1
565 DEALLOCATE (multiindex)
567 flat_local_cols => distribution_2d%flat_local_cols
569 IF (
PRESENT(n_flat_local_rows)) n_flat_local_rows = sum(distribution_2d%n_local_rows)
570 IF (
PRESENT(n_flat_local_cols)) n_flat_local_cols = sum(distribution_2d%n_local_cols)
571 IF (
PRESENT(blacs_env)) blacs_env => distribution_2d%blacs_env
subroutine, public distribution_2d_get(distribution_2d, row_distribution, col_distribution, n_row_distribution, n_col_distribution, n_local_rows, n_local_cols, local_rows, local_cols, flat_local_rows, flat_local_cols, n_flat_local_rows, n_flat_local_cols, blacs_env)
returns various attributes about the distribution_2d