1 | !**************************************************************************************** |
---|
2 | SUBROUTINE decomp_def(id_paral,id_size,id_im,id_jm,id_rank,id_npes,id_unit) |
---|
3 | |
---|
4 | IMPLICIT NONE |
---|
5 | INTEGER, DIMENSION(id_size), INTENT(out) :: id_paral(id_size) |
---|
6 | INTEGER, INTENT(in) :: id_size |
---|
7 | INTEGER, INTENT(in) :: id_im ! Grid dimension in i |
---|
8 | INTEGER, INTENT(in) :: id_jm ! Grid dimension in j |
---|
9 | INTEGER, INTENT(in) :: id_rank ! Rank of process |
---|
10 | INTEGER, INTENT(in) :: id_npes ! Number of processes involved in the coupling |
---|
11 | INTEGER, INTENT(in) :: id_unit ! Unit of log file |
---|
12 | INTEGER :: il_imjm, il_partj, il_parti, il_partij, npes2 |
---|
13 | |
---|
14 | if (id_rank < 0 .or. id_rank > id_npes) then |
---|
15 | write(*,*) 'decomp_def ABORT invalid rank',id_rank,id_npes |
---|
16 | stop |
---|
17 | endif |
---|
18 | |
---|
19 | il_imjm = id_im*id_jm |
---|
20 | il_partj = id_jm/id_npes ! Nbr of latitude circles in the partition |
---|
21 | il_parti = id_im/id_npes ! Nbr of lon in partition |
---|
22 | il_partij = il_imjm/id_npes |
---|
23 | id_paral(:) = 0 |
---|
24 | |
---|
25 | if (id_size == 3) then ! APPLE (this is simple 1d decomp) |
---|
26 | id_paral (1) = 1 |
---|
27 | id_paral (2) = id_rank*(il_partij) |
---|
28 | IF (id_rank .LT. (id_npes-1)) THEN |
---|
29 | id_paral (3) = il_partij |
---|
30 | ELSE |
---|
31 | id_paral (3) = il_imjm - ((id_npes-1)*(il_partij)) |
---|
32 | ENDIF |
---|
33 | |
---|
34 | elseif (id_size == 4) then ! GRAPE (this is doing a decomp in y) |
---|
35 | id_paral (1) = 1 |
---|
36 | id_paral (2) = id_rank*(il_partj * id_im) |
---|
37 | IF (id_rank .LT. (id_npes-1)) THEN |
---|
38 | id_paral (3) = il_partj * id_im |
---|
39 | ELSE |
---|
40 | id_paral (3) = il_imjm-(id_rank*(il_partj * id_im)) |
---|
41 | ENDIF |
---|
42 | |
---|
43 | elseif (id_size == 5) then ! BOX |
---|
44 | id_paral (1) = 2 |
---|
45 | id_paral (5) = id_im |
---|
46 | |
---|
47 | ! full X boxes |
---|
48 | ! id_paral (2) = id_rank*il_partj*id_im |
---|
49 | ! id_paral (3) = id_im |
---|
50 | ! IF (id_rank .LT. (id_npes-1)) THEN |
---|
51 | ! id_paral (4) = il_partj |
---|
52 | ! ELSE |
---|
53 | ! id_paral (4) = id_jm-(id_rank*il_partj) |
---|
54 | ! ENDIF |
---|
55 | |
---|
56 | ! full Y boxes |
---|
57 | id_paral (2) = id_rank*il_parti |
---|
58 | id_paral (4) = id_jm |
---|
59 | IF (id_rank .LT. (id_npes-1)) THEN |
---|
60 | id_paral (3) = il_parti |
---|
61 | ELSE |
---|
62 | id_paral (3) = id_im-(id_rank*il_parti) |
---|
63 | ENDIF |
---|
64 | |
---|
65 | else |
---|
66 | write(*,*) 'decomp_def ABORT unknown decomp' |
---|
67 | stop |
---|
68 | endif |
---|
69 | |
---|
70 | END SUBROUTINE decomp_def |
---|
71 | |
---|