Transform between virtual process rows/columns and actual process rows/columns and images therein.
Shifting (L)eft and (R)ight shifting are "shifts from", (l)eft and (r)ight are "shifts to". A caller (or the my* specifications) would use L/R to see which data he has (i.e., from where his data was shifted). To see where the caller's data goes to, use l/r.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_imagedistribution_obj), | intent(in) | :: | image_dist | |||
integer, | intent(out), | optional | :: | prow | ||
integer, | intent(out), | optional | :: | rowi | ||
integer, | intent(out), | optional | :: | pcol | ||
integer, | intent(out), | optional | :: | coli | ||
integer, | intent(out), | optional | :: | vprow | ||
integer, | intent(out), | optional | :: | vpcol | ||
integer, | intent(in), | optional | :: | myprow | ||
integer, | intent(in), | optional | :: | mypcol | ||
integer, | intent(in), | optional | :: | myrowi | ||
integer, | intent(in), | optional | :: | mycoli | ||
integer, | intent(in), | optional | :: | myvprow | ||
integer, | intent(in), | optional | :: | myvpcol | ||
integer, | intent(in), | optional | :: | vprow_shift | ||
integer, | intent(in), | optional | :: | vpcol_shift | ||
character(len=1), | intent(in), | optional | :: | shifting |
SUBROUTINE image_calculator(image_dist, & prow, rowi, pcol, coli, vprow, vpcol, & myprow, mypcol, myrowi, mycoli, myvprow, myvpcol, & vprow_shift, vpcol_shift, & shifting) !! Transform between virtual process rows/columns and actual process rows/columns and images therein. !! !! Shifting !! (L)eft and (R)ight shifting are "shifts from", (l)eft and (r)ight !! are "shifts to". A caller (or the my* specifications) would use !! L/R to see which data he has (i.e., from where his data was !! shifted). To see where the caller's data goes to, use l/r. TYPE(dbcsr_imagedistribution_obj), INTENT(IN) :: image_dist INTEGER, INTENT(OUT), OPTIONAL :: prow, rowi, pcol, coli, vprow, vpcol INTEGER, INTENT(IN), OPTIONAL :: myprow, mypcol, myrowi, mycoli, myvprow, & myvpcol, vprow_shift, vpcol_shift CHARACTER, INTENT(IN), OPTIONAL :: shifting INTEGER :: col_mult, my_pcol, my_prow, ncol_images, & npcols, nprows, nrow_images, nvpcols, & nvprows, row_mult, vcol, vrow TYPE(dbcsr_mp_obj) :: mp ! --------------------------------------------------------------------------- IF (careful_mod .AND. .NOT. PRESENT(myvprow) .AND. .NOT. PRESENT(mycoli)) THEN CALL dbcsr_abort(__LOCATION__, & "Must specify either (process row and row image) or (virtual process row)") END IF IF (careful_mod .AND. .NOT. PRESENT(myvpcol) .AND. .NOT. PRESENT(mycoli)) THEN CALL dbcsr_abort(__LOCATION__, & "Must specify either (process col and col image) or (virtual process col)") END IF ! mp = image_dist%i%main%d%mp_env nprows = SIZE(mp%mp%pgrid, 1) npcols = SIZE(mp%mp%pgrid, 2) nrow_images = image_dist%i%row_decimation ncol_images = image_dist%i%col_decimation row_mult = image_dist%i%row_multiplicity col_mult = image_dist%i%col_multiplicity nvprows = nprows*nrow_images nvpcols = npcols*ncol_images ! IF (PRESENT(myprow)) THEN my_prow = myprow ELSE my_prow = mp%mp%myprow END IF IF (PRESENT(mypcol)) THEN my_pcol = mypcol ELSE my_pcol = mp%mp%mypcol END IF ! IF (.NOT. PRESENT(myvprow)) THEN vrow = my_prow*nrow_images + myrowi - 1 ELSE vrow = myvprow END IF IF (.NOT. PRESENT(myvpcol)) THEN vcol = my_pcol*ncol_images + mycoli - 1 ELSE vcol = myvpcol END IF ! IF (PRESENT(vprow_shift)) vrow = vrow + vprow_shift IF (PRESENT(vpcol_shift)) vcol = vcol + vpcol_shift IF (PRESENT(shifting)) THEN SELECT CASE (shifting) CASE ('R') vrow = vrow + my_pcol*row_mult CASE ('L') vcol = vcol + my_prow*col_mult CASE ('r') vrow = vrow - my_pcol*row_mult CASE ('l') vcol = vcol - my_prow*col_mult END SELECT END IF vrow = MODULO(vrow, nvprows) vcol = MODULO(vcol, nvpcols) IF (PRESENT(prow)) prow = vrow/nrow_images IF (PRESENT(rowi)) rowi = MODULO(vrow, nrow_images) + 1 IF (PRESENT(pcol)) pcol = vcol/ncol_images IF (PRESENT(coli)) coli = MODULO(vcol, ncol_images) + 1 IF (PRESENT(vprow)) vprow = vrow IF (PRESENT(vpcol)) vpcol = vcol END SUBROUTINE image_calculator