*IF DEF,C96_1A,OR,DEF,C96_1B GPB3F403.290 *IF DEF,MPP GPB3F403.291 C *****************************COPYRIGHT****************************** CHDCMP1A.3 C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved. CHDCMP1A.4 C CHDCMP1A.5 C Use, duplication or disclosure of this code is subject to the CHDCMP1A.6 C restrictions as set forth in the contract. CHDCMP1A.7 C CHDCMP1A.8 C Meteorological Office CHDCMP1A.9 C London Road CHDCMP1A.10 C BRACKNELL CHDCMP1A.11 C Berkshire UK CHDCMP1A.12 C RG12 2SZ CHDCMP1A.13 C CHDCMP1A.14 C If no contract has been raised with this copy of the code, the use, CHDCMP1A.15 C duplication or disclosure of it is strictly prohibited. Permission CHDCMP1A.16 C to do so must first be obtained in writing from the Head of Numerical CHDCMP1A.17 C Modelling at the above address. CHDCMP1A.18 C ******************************COPYRIGHT****************************** CHDCMP1A.19 !+ Parallel UM: Select a new decomposition CHDCMP1A.20 ! CHDCMP1A.21 ! Subroutine Interface: CHDCMP1A.22SUBROUTINE CHANGE_DECOMPOSITION(new_decomp,icode) 35CHDCMP1A.23 CHDCMP1A.24 IMPLICIT NONE CHDCMP1A.25 CHDCMP1A.26 ! CHDCMP1A.27 ! Description: CHDCMP1A.28 ! Sets up the PARVARS common blocks with the correct information for CHDCMP1A.29 ! decomposition new_decomp CHDCMP1A.30 ! CHDCMP1A.31 ! Method: CHDCMP1A.32 ! If new_decomp is already the current decomposition, exit and do CHDCMP1A.33 ! nothing. CHDCMP1A.34 ! If decomposition new_decomp has not been initialised, print a CHDCMP1A.35 ! message and exit, with icode=-1. CHDCMP1A.36 ! Otherwise, copy the information from the decomp_db arrays in the CHDCMP1A.37 ! DECOMPDB comdeck into the PARVARS comdecks arrays. CHDCMP1A.38 ! CHDCMP1A.39 ! Current Code Owner : Paul Burton CHDCMP1A.40 ! CHDCMP1A.41 ! History: CHDCMP1A.42 ! Model Date Modification history from model version 4.2 CHDCMP1A.43 ! version CHDCMP1A.44 ! 4.2 22/8/96 New deck created for MPP code. P.Burton CHDCMP1A.45 ! 4.3 17/02/97 Changed ICODE to a positive error no. P.Burton GPB3F403.77 ! CHDCMP1A.46 ! Subroutine arguments: CHDCMP1A.47 CHDCMP1A.48 INTEGER CHDCMP1A.49 & new_decomp ! IN : new decomposition to use CHDCMP1A.50 &, icode ! OUT: return code (-1 is failure) CHDCMP1A.51 CHDCMP1A.52 ! Parameters and Common blocks CHDCMP1A.53 CHDCMP1A.54 *CALL PARVARS
CHDCMP1A.55 *CALL DECOMPTP
CHDCMP1A.56 *CALL DECOMPDB
CHDCMP1A.57 CHDCMP1A.58 ! Local variables CHDCMP1A.59 INTEGER ineb,idim,iproc CHDCMP1A.60 CHDCMP1A.61 CHDCMP1A.62 ! ------------------------------------------------------------------ CHDCMP1A.63 CHDCMP1A.64 CHDCMP1A.66 ! Check that the new_decomp argument is sensible CHDCMP1A.67 IF ((new_decomp .GT. max_decomps) .OR. CHDCMP1A.68 & ((new_decomp .LT. 1) .AND. (new_decomp .NE. decomp_unset))) CHDCMP1A.69 & THEN CHDCMP1A.70 IF (mype .EQ. 0) THEN CHDCMP1A.71 WRITE(6,*) 'Error: Cannot change to decomposition ', CHDCMP1A.72 & new_decomp CHDCMP1A.73 WRITE(6,*) 'This decomposition does not exist' CHDCMP1A.74 WRITE(6,*) 'Exiting.' CHDCMP1A.75 ENDIF CHDCMP1A.76 icode=1 GPB3F403.78 GOTO 999 CHDCMP1A.78 ENDIF CHDCMP1A.79 CHDCMP1A.80 ! Check if this is already the current decomposition CHDCMP1A.81 CHDCMP1A.82 IF (new_decomp .EQ. current_decomp_type) GOTO 999 CHDCMP1A.83 CHDCMP1A.84 ! Check to see if setting decomposition to unset CHDCMP1A.85 CHDCMP1A.86 IF (new_decomp .EQ. decomp_unset) THEN CHDCMP1A.87 current_decomp_type = decomp_unset CHDCMP1A.88 GOTO 999 CHDCMP1A.89 ENDIF CHDCMP1A.90 CHDCMP1A.91 ! Check if this decomposition has been initialised CHDCMP1A.92 CHDCMP1A.93 IF ( .NOT. decomp_db_set(new_decomp) ) THEN CHDCMP1A.94 IF (mype .EQ. 0) THEN CHDCMP1A.95 WRITE(6,*) 'Error : Attempt to select uninitialised ', CHDCMP1A.96 & 'decomposition ',new_decomp CHDCMP1A.97 WRITE(6,*) 'Exiting.' CHDCMP1A.98 ENDIF CHDCMP1A.99 icode=1 GPB3F403.79 GOTO 999 CHDCMP1A.101 ENDIF CHDCMP1A.102 CHDCMP1A.103 ! Now we can copy the information into PARVARS CHDCMP1A.104 CHDCMP1A.105 first_comp_pe=decomp_db_first_comp_pe(new_decomp) CHDCMP1A.106 last_comp_pe=decomp_db_last_comp_pe(new_decomp) CHDCMP1A.107 CHDCMP1A.108 nproc=decomp_db_nproc(new_decomp) CHDCMP1A.109 nproc_x=decomp_db_gridsize(1,new_decomp) CHDCMP1A.110 nproc_y=decomp_db_gridsize(2,new_decomp) CHDCMP1A.111 CHDCMP1A.112 Offx=decomp_db_halosize(1,new_decomp) CHDCMP1A.113 Offy=decomp_db_halosize(2,new_decomp) CHDCMP1A.114 CHDCMP1A.115 gc_proc_row_group=decomp_db_gc_proc_row_group(new_decomp) CHDCMP1A.116 gc_proc_col_group=decomp_db_gc_proc_col_group(new_decomp) CHDCMP1A.117 gc_all_proc_group=decomp_db_gc_all_proc_group(new_decomp) CHDCMP1A.118 CHDCMP1A.119 DO ineb=1,4 CHDCMP1A.120 neighbour(ineb)=decomp_db_neighbour(ineb,new_decomp) CHDCMP1A.121 ENDDO CHDCMP1A.122 CHDCMP1A.123 DO idim=1,Ndim_max CHDCMP1A.124 bound(idim)=decomp_db_bound(idim,new_decomp) CHDCMP1A.125 glsize(idim)=decomp_db_glsize(idim,new_decomp) CHDCMP1A.126 gridsize(idim)=decomp_db_gridsize(idim,new_decomp) CHDCMP1A.127 CHDCMP1A.128 ENDDO CHDCMP1A.129 CHDCMP1A.130 DO iproc=first_comp_pe,last_comp_pe CHDCMP1A.131 DO idim=1,Ndim_max CHDCMP1A.132 g_lasize(idim,iproc)= CHDCMP1A.133 & decomp_db_g_lasize(idim,iproc,new_decomp) CHDCMP1A.134 g_blsizep(idim,iproc)= CHDCMP1A.135 & decomp_db_g_blsizep(idim,iproc,new_decomp) CHDCMP1A.136 g_blsizeu(idim,iproc)= CHDCMP1A.137 & decomp_db_g_blsizeu(idim,iproc,new_decomp) CHDCMP1A.138 g_datastart(idim,iproc)= CHDCMP1A.139 & decomp_db_g_datastart(idim,iproc,new_decomp) CHDCMP1A.140 g_gridpos(idim,iproc)= CHDCMP1A.141 & decomp_db_g_gridpos(idim,iproc,new_decomp) CHDCMP1A.142 ENDDO CHDCMP1A.143 ENDDO CHDCMP1A.144 CHDCMP1A.145 DO idim=1,Ndim_max CHDCMP1A.146 lasize(idim)=g_lasize(idim,mype) CHDCMP1A.147 blsizep(idim)=g_blsizep(idim,mype) CHDCMP1A.148 blsizeu(idim)=g_blsizeu(idim,mype) CHDCMP1A.149 datastart(idim)=g_datastart(idim,mype) CHDCMP1A.150 gridpos(idim)=g_gridpos(idim,mype) CHDCMP1A.151 ENDDO CHDCMP1A.152 CHDCMP1A.153 atbase = ( gridpos(2) .EQ. (gridsize(2)-1)) CHDCMP1A.154 attop = ( gridpos(2) .EQ. 0) CHDCMP1A.155 atleft = (gridpos(1) .EQ. 0) CHDCMP1A.156 atright = ( gridpos(1) .EQ. (gridsize(1)-1)) CHDCMP1A.157 CHDCMP1A.158 current_decomp_type=new_decomp CHDCMP1A.159 CHDCMP1A.160 999 CONTINUE CHDCMP1A.161 CHDCMP1A.162 RETURN CHDCMP1A.163 END CHDCMP1A.164 CHDCMP1A.165 *ENDIF CHDCMP1A.166 *ENDIF GPB3F403.292