70 TYPE(
dbt_type),
INTENT(INOUT) :: tensor_in
71 TYPE(
dbt_type),
INTENT(OUT) :: tensor_out
72 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: blk_size_1, blk_size_2, blk_size_3, blk_size_4
73 LOGICAL,
INTENT(IN),
OPTIONAL :: nodata
77 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nd_dist_split_1, nd_dist_split_2, nd_dist_split_3, nd_dist_split_4
78 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nd_blk_size_split_1, nd_blk_size_split_2, nd_blk_size_split_3,&
80 INTEGER,
DIMENSION(:),
ALLOCATABLE :: index_split_offset_1, index_split_offset_2, index_split_offset_3,&
81 & index_split_offset_4
82 INTEGER,
DIMENSION(:),
ALLOCATABLE :: inblock_offset_1, inblock_offset_2, inblock_offset_3, inblock_offset_4
83 INTEGER,
DIMENSION(:),
ALLOCATABLE :: blk_nsplit_1, blk_nsplit_2, blk_nsplit_3, blk_nsplit_4
84 INTEGER :: split_blk_1, split_blk_2, split_blk_3, split_blk_4
85 INTEGER :: idim, i, isplit_sum, nsplit, handle, splitsum, bcount
86 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: blks_to_allocate
87 INTEGER,
DIMENSION(:),
ALLOCATABLE :: dist_d, blk_size_d, blk_size_split_d, dist_split_d
88 INTEGER,
DIMENSION(ndims_matrix_row(tensor_in)) :: map1_2d
89 INTEGER,
DIMENSION(ndims_matrix_column(tensor_in)) :: map2_2d
90 INTEGER,
DIMENSION(ndims_tensor(tensor_in)) :: blk_index, blk_size, blk_offset, &
92 INTEGER,
DIMENSION(4) :: bi_split, inblock_offset
95 REAL(
dp),
DIMENSION(:,:),
ALLOCATABLE :: block_2d
96 REAL(
dp),
DIMENSION(:,:,:),
ALLOCATABLE :: block_3d
97 REAL(
dp),
DIMENSION(:,:,:,:),
ALLOCATABLE :: block_4d
98 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dbt_split_blocks_generic'
100 CALL timeset(routinen, handle)
110 ALLOCATE (index_split_offset_1(
SIZE(dist_d)))
112 ALLOCATE (blk_nsplit_1(
SIZE(dist_d)))
114 ALLOCATE (inblock_offset_1(
SIZE(blk_size_1)))
115 ALLOCATE (blk_size_split_d, source=blk_size_1)
119 ALLOCATE (index_split_offset_2(
SIZE(dist_d)))
121 ALLOCATE (blk_nsplit_2(
SIZE(dist_d)))
123 ALLOCATE (inblock_offset_2(
SIZE(blk_size_2)))
124 ALLOCATE (blk_size_split_d, source=blk_size_2)
128 ALLOCATE (index_split_offset_3(
SIZE(dist_d)))
130 ALLOCATE (blk_nsplit_3(
SIZE(dist_d)))
132 ALLOCATE (inblock_offset_3(
SIZE(blk_size_3)))
133 ALLOCATE (blk_size_split_d, source=blk_size_3)
137 ALLOCATE (index_split_offset_4(
SIZE(dist_d)))
139 ALLOCATE (blk_nsplit_4(
SIZE(dist_d)))
141 ALLOCATE (inblock_offset_4(
SIZE(blk_size_4)))
142 ALLOCATE (blk_size_split_d, source=blk_size_4)
146 ALLOCATE (dist_split_d(
SIZE(blk_size_split_d)))
149 DO i = 1,
SIZE(blk_size_d)
152 DO WHILE (splitsum < blk_size_d(i))
154 isplit_sum = isplit_sum + 1
155 IF (idim == 1) inblock_offset_1(isplit_sum) = splitsum
156 IF (idim == 2) inblock_offset_2(isplit_sum) = splitsum
157 IF (idim == 3) inblock_offset_3(isplit_sum) = splitsum
158 IF (idim == 4) inblock_offset_4(isplit_sum) = splitsum
159 dist_split_d(isplit_sum) = dist_d(i)
160 splitsum = splitsum + blk_size_split_d(isplit_sum)
162 cpassert(splitsum == blk_size_d(i))
164 blk_nsplit_1(i) = nsplit
165 index_split_offset_1(i) = isplit_sum - nsplit
168 blk_nsplit_2(i) = nsplit
169 index_split_offset_2(i) = isplit_sum - nsplit
172 blk_nsplit_3(i) = nsplit
173 index_split_offset_3(i) = isplit_sum - nsplit
176 blk_nsplit_4(i) = nsplit
177 index_split_offset_4(i) = isplit_sum - nsplit
182 ALLOCATE (nd_dist_split_1, source=dist_split_d)
183 ALLOCATE (nd_blk_size_split_1, source=blk_size_split_d)
186 ALLOCATE (nd_dist_split_2, source=dist_split_d)
187 ALLOCATE (nd_blk_size_split_2, source=blk_size_split_d)
190 ALLOCATE (nd_dist_split_3, source=dist_split_d)
191 ALLOCATE (nd_blk_size_split_3, source=blk_size_split_d)
194 ALLOCATE (nd_dist_split_4, source=dist_split_d)
195 ALLOCATE (nd_blk_size_split_4, source=blk_size_split_d)
197 DEALLOCATE (dist_split_d)
198 DEALLOCATE (blk_size_split_d)
206 nd_dist_split_1, nd_dist_split_2)
207 CALL dbt_create(tensor_out, tensor_in%name, dist_split, map1_2d, map2_2d, &
208 nd_blk_size_split_1, nd_blk_size_split_2)
212 nd_dist_split_1, nd_dist_split_2, nd_dist_split_3)
213 CALL dbt_create(tensor_out, tensor_in%name, dist_split, map1_2d, map2_2d, &
214 nd_blk_size_split_1, nd_blk_size_split_2, nd_blk_size_split_3)
218 nd_dist_split_1, nd_dist_split_2, nd_dist_split_3, nd_dist_split_4)
219 CALL dbt_create(tensor_out, tensor_in%name, dist_split, map1_2d, map2_2d, &
220 nd_blk_size_split_1, nd_blk_size_split_2, nd_blk_size_split_3, nd_blk_size_split_4)
225 IF (
PRESENT(nodata))
THEN
227 CALL timestop(handle)
247 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
248 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
254 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
255 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
256 DO split_blk_3 = 1, blk_nsplit_3(blk_index(3))
263 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
264 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
265 DO split_blk_3 = 1, blk_nsplit_3(blk_index(3))
266 DO split_blk_4 = 1, blk_nsplit_4(blk_index(4))
276 ALLOCATE (blks_to_allocate(bcount,
ndims_tensor(tensor_in)))
285 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
286 bi_split(1) = index_split_offset_1(blk_index(1)) + split_blk_1
287 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
288 bi_split(2) = index_split_offset_2(blk_index(2)) + split_blk_2
290 blks_to_allocate(bcount, :) = bi_split(1:
ndims_tensor(tensor_in))
295 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
296 bi_split(1) = index_split_offset_1(blk_index(1)) + split_blk_1
297 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
298 bi_split(2) = index_split_offset_2(blk_index(2)) + split_blk_2
299 DO split_blk_3 = 1, blk_nsplit_3(blk_index(3))
300 bi_split(3) = index_split_offset_3(blk_index(3)) + split_blk_3
302 blks_to_allocate(bcount, :) = bi_split(1:
ndims_tensor(tensor_in))
308 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
309 bi_split(1) = index_split_offset_1(blk_index(1)) + split_blk_1
310 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
311 bi_split(2) = index_split_offset_2(blk_index(2)) + split_blk_2
312 DO split_blk_3 = 1, blk_nsplit_3(blk_index(3))
313 bi_split(3) = index_split_offset_3(blk_index(3)) + split_blk_3
314 DO split_blk_4 = 1, blk_nsplit_4(blk_index(4))
315 bi_split(4) = index_split_offset_4(blk_index(4)) + split_blk_4
317 blks_to_allocate(bcount, :) = bi_split(1:
ndims_tensor(tensor_in))
346 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
348 bi_split(1) = index_split_offset_1(blk_index(1)) + split_blk_1
349 blk_shape(1) = blk_size_1(bi_split(1))
350 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
352 bi_split(2) = index_split_offset_2(blk_index(2)) + split_blk_2
353 blk_shape(2) = blk_size_2(bi_split(2))
355 inblock_offset(1) = inblock_offset_1(bi_split(1))
356 inblock_offset(2) = inblock_offset_2(bi_split(2))
360 inblock_offset(1) + 1:inblock_offset(1) + blk_shape(1), inblock_offset(2) +&
361 & 1:inblock_offset(2) + blk_shape(2)))
366 DEALLOCATE (block_2d)
369 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
371 bi_split(1) = index_split_offset_1(blk_index(1)) + split_blk_1
372 blk_shape(1) = blk_size_1(bi_split(1))
373 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
375 bi_split(2) = index_split_offset_2(blk_index(2)) + split_blk_2
376 blk_shape(2) = blk_size_2(bi_split(2))
377 DO split_blk_3 = 1, blk_nsplit_3(blk_index(3))
379 bi_split(3) = index_split_offset_3(blk_index(3)) + split_blk_3
380 blk_shape(3) = blk_size_3(bi_split(3))
382 inblock_offset(1) = inblock_offset_1(bi_split(1))
383 inblock_offset(2) = inblock_offset_2(bi_split(2))
384 inblock_offset(3) = inblock_offset_3(bi_split(3))
388 inblock_offset(1) + 1:inblock_offset(1) + blk_shape(1), inblock_offset(2) +&
389 & 1:inblock_offset(2) + blk_shape(2), inblock_offset(3) + 1:inblock_offset(3) +&
396 DEALLOCATE (block_3d)
399 DO split_blk_1 = 1, blk_nsplit_1(blk_index(1))
401 bi_split(1) = index_split_offset_1(blk_index(1)) + split_blk_1
402 blk_shape(1) = blk_size_1(bi_split(1))
403 DO split_blk_2 = 1, blk_nsplit_2(blk_index(2))
405 bi_split(2) = index_split_offset_2(blk_index(2)) + split_blk_2
406 blk_shape(2) = blk_size_2(bi_split(2))
407 DO split_blk_3 = 1, blk_nsplit_3(blk_index(3))
409 bi_split(3) = index_split_offset_3(blk_index(3)) + split_blk_3
410 blk_shape(3) = blk_size_3(bi_split(3))
411 DO split_blk_4 = 1, blk_nsplit_4(blk_index(4))
413 bi_split(4) = index_split_offset_4(blk_index(4)) + split_blk_4
414 blk_shape(4) = blk_size_4(bi_split(4))
416 inblock_offset(1) = inblock_offset_1(bi_split(1))
417 inblock_offset(2) = inblock_offset_2(bi_split(2))
418 inblock_offset(3) = inblock_offset_3(bi_split(3))
419 inblock_offset(4) = inblock_offset_4(bi_split(4))
423 inblock_offset(1) + 1:inblock_offset(1) + blk_shape(1), inblock_offset(2) +&
424 & 1:inblock_offset(2) + blk_shape(2), inblock_offset(3) + 1:inblock_offset(3) +&
425 & blk_shape(3), inblock_offset(4) + 1:inblock_offset(4) + blk_shape(4)))
432 DEALLOCATE (block_4d)
443 CALL timestop(handle)
528 TYPE(
dbt_type),
INTENT(INOUT) :: tensor_split_in
529 TYPE(
dbt_type),
INTENT(INOUT) :: tensor_out
530 LOGICAL,
INTENT(IN),
OPTIONAL :: summation
531 INTEGER,
DIMENSION(:),
ALLOCATABLE :: first_split_d, last_split_d
532 INTEGER,
DIMENSION(:),
ALLOCATABLE :: blk_size_split_d, blk_size_d
533 INTEGER,
DIMENSION(:),
ALLOCATABLE :: last_split_1, last_split_2, last_split_3, last_split_4, &
534 first_split_1, first_split_2, first_split_3,&
536 split_1, split_2, split_3, split_4
537 INTEGER,
DIMENSION(:),
ALLOCATABLE :: inblock_offset_1, inblock_offset_2, inblock_offset_3,&
538 & inblock_offset_4, blk_size_split_1, blk_size_split_2, blk_size_split_3, blk_size_split_4
539 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: blks_to_allocate
540 INTEGER :: idim, iblk, bcount
541 INTEGER :: iblk_1, iblk_2, iblk_3, iblk_4, isplit_sum, splitsum
543 INTEGER,
DIMENSION(ndims_tensor(tensor_out)) :: blk_index, blk_size, blk_offset, blk_shape, blk_index_n
546 INTEGER,
DIMENSION(4) :: inblock_offset
548 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dbt_split_copyback'
549 REAL(
dp),
DIMENSION(:,:),
ALLOCATABLE :: block_2d
550 REAL(
dp),
DIMENSION(:,:),
ALLOCATABLE :: block_split_2d
551 REAL(
dp),
DIMENSION(:,:,:),
ALLOCATABLE :: block_3d
552 REAL(
dp),
DIMENSION(:,:,:),
ALLOCATABLE :: block_split_3d
553 REAL(
dp),
DIMENSION(:,:,:,:),
ALLOCATABLE :: block_4d
554 REAL(
dp),
DIMENSION(:,:,:,:),
ALLOCATABLE :: block_split_4d
556 CALL timeset(routinen, handle)
557 cpassert(tensor_out%valid)
558 IF (
PRESENT(summation))
THEN
559 IF (.NOT. summation)
CALL dbt_clear(tensor_out)
565 CALL get_ith_array(tensor_split_in%blk_sizes, idim, blk_size_split_d)
570 ALLOCATE (inblock_offset_1(
SIZE(blk_size_split_d)))
572 ALLOCATE (split_1(
SIZE(blk_size_split_d)))
576 ALLOCATE (inblock_offset_2(
SIZE(blk_size_split_d)))
578 ALLOCATE (split_2(
SIZE(blk_size_split_d)))
582 ALLOCATE (inblock_offset_3(
SIZE(blk_size_split_d)))
584 ALLOCATE (split_3(
SIZE(blk_size_split_d)))
588 ALLOCATE (inblock_offset_4(
SIZE(blk_size_split_d)))
590 ALLOCATE (split_4(
SIZE(blk_size_split_d)))
593 ALLOCATE (last_split_d(
SIZE(blk_size_d)))
594 ALLOCATE (first_split_d(
SIZE(blk_size_d)))
597 DO iblk = 1,
SIZE(blk_size_d)
599 IF (iblk > 1) first_split_d(iblk) = last_split_d(iblk - 1) + 1
600 DO WHILE (splitsum < blk_size_d(iblk))
601 isplit_sum = isplit_sum + 1
603 inblock_offset_1(isplit_sum) = splitsum
604 split_1(isplit_sum) = iblk
607 inblock_offset_2(isplit_sum) = splitsum
608 split_2(isplit_sum) = iblk
611 inblock_offset_3(isplit_sum) = splitsum
612 split_3(isplit_sum) = iblk
615 inblock_offset_4(isplit_sum) = splitsum
616 split_4(isplit_sum) = iblk
618 splitsum = splitsum + blk_size_split_d(isplit_sum)
620 cpassert(splitsum == blk_size_d(iblk))
621 last_split_d(iblk) = isplit_sum
624 ALLOCATE (first_split_1, source=first_split_d)
625 ALLOCATE (last_split_1, source=last_split_d)
626 ALLOCATE (blk_size_split_1, source=blk_size_split_d)
629 ALLOCATE (first_split_2, source=first_split_d)
630 ALLOCATE (last_split_2, source=last_split_d)
631 ALLOCATE (blk_size_split_2, source=blk_size_split_d)
634 ALLOCATE (first_split_3, source=first_split_d)
635 ALLOCATE (last_split_3, source=last_split_d)
636 ALLOCATE (blk_size_split_3, source=blk_size_split_d)
639 ALLOCATE (first_split_4, source=first_split_d)
640 ALLOCATE (last_split_4, source=last_split_d)
641 ALLOCATE (blk_size_split_4, source=blk_size_split_d)
643 DEALLOCATE (first_split_d, last_split_d)
644 DEALLOCATE (blk_size_split_d, blk_size_d)
662 blk_index_n(1) = split_1(blk_index(1))
663 blk_index_n(2) = split_2(blk_index(2))
666 blk_index_n(1) = split_1(blk_index(1))
667 blk_index_n(2) = split_2(blk_index(2))
668 blk_index_n(3) = split_3(blk_index(3))
671 blk_index_n(1) = split_1(blk_index(1))
672 blk_index_n(2) = split_2(blk_index(2))
673 blk_index_n(3) = split_3(blk_index(3))
674 blk_index_n(4) = split_4(blk_index(4))
676 blks_to_allocate(bcount + 1, :) = blk_index_n
689 DO iblk_1 = first_split_1(blk_index(1)), last_split_1(blk_index(1))
690 DO iblk_2 = first_split_2(blk_index(2)), last_split_2(blk_index(2))
691 inblock_offset(1) = inblock_offset_1(iblk_1)
692 inblock_offset(2) = inblock_offset_2(iblk_2)
695 block_split_2d, found)
697 blk_shape(1:2) = shape(block_split_2d)
699 inblock_offset(1) + 1:inblock_offset(1) + blk_shape(1), inblock_offset(2) + 1:inblock_offset(2) +&
706 CALL dbt_put_block(tensor_out, blk_index, blk_size, block_2d, summation=summation)
707 DEALLOCATE (block_2d)
712 DO iblk_1 = first_split_1(blk_index(1)), last_split_1(blk_index(1))
713 DO iblk_2 = first_split_2(blk_index(2)), last_split_2(blk_index(2))
714 DO iblk_3 = first_split_3(blk_index(3)), last_split_3(blk_index(3))
715 inblock_offset(1) = inblock_offset_1(iblk_1)
716 inblock_offset(2) = inblock_offset_2(iblk_2)
717 inblock_offset(3) = inblock_offset_3(iblk_3)
719 CALL dbt_get_block(tensor_split_in, [iblk_1, iblk_2, iblk_3], &
720 block_split_3d, found)
722 blk_shape(1:3) = shape(block_split_3d)
724 inblock_offset(1) + 1:inblock_offset(1) + blk_shape(1), inblock_offset(2) + 1:inblock_offset(2) +&
725 & blk_shape(2), inblock_offset(3) + 1:inblock_offset(3) + blk_shape(3)) = &
732 CALL dbt_put_block(tensor_out, blk_index, blk_size, block_3d, summation=summation)
733 DEALLOCATE (block_3d)
738 DO iblk_1 = first_split_1(blk_index(1)), last_split_1(blk_index(1))
739 DO iblk_2 = first_split_2(blk_index(2)), last_split_2(blk_index(2))
740 DO iblk_3 = first_split_3(blk_index(3)), last_split_3(blk_index(3))
741 DO iblk_4 = first_split_4(blk_index(4)), last_split_4(blk_index(4))
742 inblock_offset(1) = inblock_offset_1(iblk_1)
743 inblock_offset(2) = inblock_offset_2(iblk_2)
744 inblock_offset(3) = inblock_offset_3(iblk_3)
745 inblock_offset(4) = inblock_offset_4(iblk_4)
747 CALL dbt_get_block(tensor_split_in, [iblk_1, iblk_2, iblk_3, iblk_4], &
748 block_split_4d, found)
750 blk_shape(1:4) = shape(block_split_4d)
752 inblock_offset(1) + 1:inblock_offset(1) + blk_shape(1), inblock_offset(2) + 1:inblock_offset(2) +&
753 & blk_shape(2), inblock_offset(3) + 1:inblock_offset(3) + blk_shape(3), inblock_offset(4) +&
754 & 1:inblock_offset(4) + blk_shape(4)) = &
762 CALL dbt_put_block(tensor_out, blk_index, blk_size, block_4d, summation=summation)
763 DEALLOCATE (block_4d)
769 CALL timestop(handle)
788 order, nodata1, nodata2, move_data)
789 TYPE(
dbt_type),
INTENT(INOUT) :: tensor1, tensor2
790 TYPE(
dbt_type),
INTENT(OUT) :: tensor1_split, tensor2_split
791 INTEGER,
DIMENSION(ndims_tensor(tensor1)), &
792 INTENT(IN),
OPTIONAL :: order
793 LOGICAL,
INTENT(IN),
OPTIONAL :: nodata1, nodata2, move_data
794 INTEGER,
DIMENSION(:),
ALLOCATABLE :: blk_size_split_1_1, blk_size_split_1_2, blk_size_split_1_3,&
795 & blk_size_split_1_4, &
796 blk_size_split_2_1, blk_size_split_2_2, blk_size_split_2_3,&
797 & blk_size_split_2_4, &
798 blk_size_d_1, blk_size_d_2, blk_size_d_split
799 INTEGER :: size_sum_1, size_sum_2, size_sum, bind_1, bind_2, isplit, bs, idim, i
800 LOGICAL :: move_prv, nodata1_prv, nodata2_prv
801 INTEGER,
DIMENSION(ndims_tensor(tensor1)) :: order_prv
803 IF (
PRESENT(move_data))
THEN
809 IF (
PRESENT(nodata1))
THEN
810 nodata1_prv = nodata1
812 nodata1_prv = .false.
814 IF (
PRESENT(nodata2))
THEN
815 nodata2_prv = nodata2
817 nodata2_prv = .false.
820 IF (
PRESENT(order))
THEN
827 CALL get_ith_array(tensor1%blk_sizes, order_prv(idim), blk_size_d_1)
829 ALLOCATE (blk_size_d_split(
SIZE(blk_size_d_1) +
SIZE(blk_size_d_2)))
837 DO WHILE (bind_1 <
SIZE(blk_size_d_1) .AND. bind_2 <
SIZE(blk_size_d_2))
838 IF (blk_size_d_1(bind_1 + 1) < blk_size_d_2(bind_2 + 1))
THEN
840 bs = blk_size_d_1(bind_1)
841 blk_size_d_2(bind_2 + 1) = blk_size_d_2(bind_2 + 1) - bs
842 size_sum = size_sum + bs
844 blk_size_d_split(isplit) = bs
845 ELSE IF (blk_size_d_1(bind_1 + 1) > blk_size_d_2(bind_2 + 1))
THEN
847 bs = blk_size_d_2(bind_2)
848 blk_size_d_1(bind_1 + 1) = blk_size_d_1(bind_1 + 1) - bs
849 size_sum = size_sum + bs
851 blk_size_d_split(isplit) = bs
855 bs = blk_size_d_1(bind_1)
856 size_sum = size_sum + bs
858 blk_size_d_split(isplit) = bs
862 IF (bind_1 <
SIZE(blk_size_d_1))
THEN
864 bs = blk_size_d_1(bind_1)
865 size_sum = size_sum + bs
867 blk_size_d_split(isplit) = bs
870 IF (bind_2 <
SIZE(blk_size_d_2))
THEN
872 bs = blk_size_d_2(bind_2)
873 size_sum = size_sum + bs
875 blk_size_d_split(isplit) = bs
878 IF (order_prv(idim) == 1)
THEN
879 ALLOCATE (blk_size_split_1_1, source=blk_size_d_split(:isplit))
881 IF (order_prv(idim) == 2)
THEN
882 ALLOCATE (blk_size_split_1_2, source=blk_size_d_split(:isplit))
884 IF (order_prv(idim) == 3)
THEN
885 ALLOCATE (blk_size_split_1_3, source=blk_size_d_split(:isplit))
887 IF (order_prv(idim) == 4)
THEN
888 ALLOCATE (blk_size_split_1_4, source=blk_size_d_split(:isplit))
892 ALLOCATE (blk_size_split_2_1, source=blk_size_d_split(:isplit))
895 ALLOCATE (blk_size_split_2_2, source=blk_size_d_split(:isplit))
898 ALLOCATE (blk_size_split_2_3, source=blk_size_d_split(:isplit))
901 ALLOCATE (blk_size_split_2_4, source=blk_size_d_split(:isplit))
904 DEALLOCATE (blk_size_d_split, blk_size_d_1, blk_size_d_2)
909 IF (move_prv .AND. .NOT. nodata1_prv)
CALL dbt_clear(tensor1)
911 IF (move_prv .AND. .NOT. nodata2_prv)
CALL dbt_clear(tensor2)
915 & blk_size_split_1_3, nodata=nodata1)
916 IF (move_prv .AND. .NOT. nodata1_prv)
CALL dbt_clear(tensor1)
918 & blk_size_split_2_3, nodata=nodata2)
919 IF (move_prv .AND. .NOT. nodata2_prv)
CALL dbt_clear(tensor2)
923 & blk_size_split_1_3, blk_size_split_1_4, nodata=nodata1)
924 IF (move_prv .AND. .NOT. nodata1_prv)
CALL dbt_clear(tensor1)
926 & blk_size_split_2_3, blk_size_split_2_4, nodata=nodata2)
927 IF (move_prv .AND. .NOT. nodata2_prv)
CALL dbt_clear(tensor2)
935 SUBROUTINE dbt_crop(tensor_in, tensor_out, bounds, move_data)
936 TYPE(
dbt_type),
INTENT(INOUT) :: tensor_in
937 TYPE(
dbt_type),
INTENT(OUT) :: tensor_out
938 INTEGER,
DIMENSION(2, ndims_tensor(tensor_in)),
INTENT(IN) :: bounds
939 LOGICAL,
INTENT(IN),
OPTIONAL :: move_data
941 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dbt_crop'
943 INTEGER,
DIMENSION(2, ndims_tensor(tensor_in)) :: blk_bounds
945 INTEGER,
DIMENSION(ndims_tensor(tensor_in)) :: blk_index, blk_size, blk_offset
946 LOGICAL :: found, move_data_prv
947 INTEGER :: handle, idim, iblk_out
948 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: blk_ind_out
949 REAL(
dp),
DIMENSION(:,:),
ALLOCATABLE :: block_2d, block_put_2d
950 REAL(
dp),
DIMENSION(:,:,:),
ALLOCATABLE :: block_3d, block_put_3d
951 REAL(
dp),
DIMENSION(:,:,:,:),
ALLOCATABLE :: block_4d, block_put_4d
953 CALL timeset(routinen, handle)
955 IF (
PRESENT(move_data))
THEN
956 move_data_prv = move_data
958 move_data_prv = .false.
970 blk_ind_out(:, :) = 0
975 IF (bounds(1, idim) > blk_offset(idim) - 1 + blk_size(idim)) cycle blk_loop
976 IF (bounds(2, idim) < blk_offset(idim)) cycle blk_loop
978 iblk_out = iblk_out + 1
979 blk_ind_out(iblk_out, :) = blk_index
984 DEALLOCATE (blk_ind_out)
992 blk_bounds(1, idim) = max(bounds(1, idim) - blk_offset(idim) + 1, 1)
993 blk_bounds(2, idim) = min(bounds(2, idim) - blk_offset(idim) + 1, blk_size(idim))
997 IF (all(blk_bounds(1, :) == 1) .AND. all(blk_bounds(2, :) == blk_size))
THEN
1005 ALLOCATE (block_put_2d(blk_size(1), blk_size(2)))
1006 block_put_2d = 0.0_dp
1007 block_put_2d(blk_bounds(1, 1):blk_bounds(2,1), blk_bounds(1, 2):blk_bounds(2,2)) = &
1008 block_2d(blk_bounds(1, 1):blk_bounds(2,1), blk_bounds(1, 2):blk_bounds(2,2))
1009 CALL dbt_put_block(tensor_out, blk_index, blk_size, block_put_2d)
1010 DEALLOCATE (block_2d)
1011 DEALLOCATE (block_put_2d)
1016 ALLOCATE (block_put_3d(blk_size(1), blk_size(2), blk_size(3)))
1017 block_put_3d = 0.0_dp
1018 block_put_3d(blk_bounds(1, 1):blk_bounds(2,1), blk_bounds(1, 2):blk_bounds(2,2), blk_bounds(1, 3):blk_bounds(2,3)) = &
1019 block_3d(blk_bounds(1, 1):blk_bounds(2,1), blk_bounds(1, 2):blk_bounds(2,2), blk_bounds(1, 3):blk_bounds(2,3))
1020 CALL dbt_put_block(tensor_out, blk_index, blk_size, block_put_3d)
1021 DEALLOCATE (block_3d)
1022 DEALLOCATE (block_put_3d)
1027 ALLOCATE (block_put_4d(blk_size(1), blk_size(2), blk_size(3), blk_size(4)))
1028 block_put_4d = 0.0_dp
1029 block_put_4d(blk_bounds(1, 1):blk_bounds(2,1), blk_bounds(1, 2):blk_bounds(2,2), blk_bounds(1, 3):blk_bounds(2,3),&
1030 & blk_bounds(1, 4):blk_bounds(2,4)) = &
1031 block_4d(blk_bounds(1, 1):blk_bounds(2,1), blk_bounds(1, 2):blk_bounds(2,2), blk_bounds(1, 3):blk_bounds(2,3),&
1032 & blk_bounds(1, 4):blk_bounds(2,4))
1033 CALL dbt_put_block(tensor_out, blk_index, blk_size, block_put_4d)
1034 DEALLOCATE (block_4d)
1035 DEALLOCATE (block_put_4d)
1042 IF (move_data_prv)
CALL dbt_clear(tensor_in)
1047 CALL timestop(handle)