*IF DEF,MPP MPPOCSIZ.2 *IF DEF,OCEAN MPPOCSIZ.3 C *****************************COPYRIGHT****************************** MPPOCSIZ.4 C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved. MPPOCSIZ.5 C MPPOCSIZ.6 C Use, duplication or disclosure of this code is subject to the MPPOCSIZ.7 C restrictions as set forth in the contract. MPPOCSIZ.8 C MPPOCSIZ.9 C Meteorological Office MPPOCSIZ.10 C London Road MPPOCSIZ.11 C BRACKNELL MPPOCSIZ.12 C Berkshire UK MPPOCSIZ.13 C RG12 2SZ MPPOCSIZ.14 C MPPOCSIZ.15 C If no contract has been raised with this copy of the code, the use, MPPOCSIZ.16 C duplication or disclosure of it is strictly prohibited. Permission MPPOCSIZ.17 C to do so must first be obtained in writing from the Head of Numerical MPPOCSIZ.18 C Modelling at the above address. MPPOCSIZ.19 C ******************************COPYRIGHT****************************** MPPOCSIZ.20 ! SUBROUTINE: OCEAN_SIZES MPPOCSIZ.21 ! MPPOCSIZ.22 ! Description: MPPOCSIZ.23 ! MPPOCSIZ.24 ! Subroutine to work out start and end indices GJC0F405.65 ! for each process in the MPP ocean model. MPPOCSIZ.26 ! MPPOCSIZ.27 ! Typically, arrays will be dimensioned as JMT MPPOCSIZ.28 ! which is a local value to each processor including MPPOCSIZ.29 ! halos. MPPOCSIZ.30 ! MPPOCSIZ.31 ! Within this array, we must set indices so as to MPPOCSIZ.32 ! work only on non halo points. Say for a halo size MPPOCSIZ.33 ! of 1, we must set the start index to be 2 and the MPPOCSIZ.34 ! end index to be JMT - 1. MPPOCSIZ.35 ! *** Remember: JMT is a local value *** MPPOCSIZ.36 ! MPPOCSIZ.37 ! Author: R. Hill MPPOCSIZ.38 ! MPPOCSIZ.39 ! Date: August 1996 MPPOCSIZ.40 ! MPPOCSIZ.41 ! Modification History: MPPOCSIZ.42 ! MPPOCSIZ.43 !----------------------------------------------------------------------- MPPOCSIZ.44SUBROUTINE OCEAN_SIZES(JMT) 1MPPOCSIZ.45 MPPOCSIZ.46 IMPLICIT NONE MPPOCSIZ.47 MPPOCSIZ.48 INTEGER JMT ! IN Local value of JMT MPPOCSIZ.49 MPPOCSIZ.50 *CALL PARVARS
MPPOCSIZ.51 *CALL COCNINDX
MPPOCSIZ.52 MPPOCSIZ.53 ! Set ocean NPROC value. This may appear undesirable MPPOCSIZ.54 ! since it is duplication of an existing variable MPPOCSIZ.55 ! but in fact it allows NPROC to be communicated to ocean MPPOCSIZ.56 ! routines without having to carry a lot of CONTROL/ATMOS MPPOCSIZ.57 ! "baggage" through ocean argument lists. MPPOCSIZ.58 O_NPROC = NPROC MPPOCSIZ.59 MPPOCSIZ.60 ! Set up global values of data sizes MPPOCSIZ.61 JMT_GLOBAL = glsize(2) MPPOCSIZ.62 JMTP1_GLOBAL = JMT_GLOBAL + 1 MPPOCSIZ.63 JMTM1_GLOBAL = JMT_GLOBAL - 1 MPPOCSIZ.64 JMTM2_GLOBAL = JMT_GLOBAL - 2 MPPOCSIZ.65 MPPOCSIZ.66 ! First row this process (global pointer) MPPOCSIZ.67 JST = datastart(2) MPPOCSIZ.68 ! Last row this process (global pointer) MPPOCSIZ.69 JFIN = JST + JMT - (2*OFFy) - 1 MPPOCSIZ.70 MPPOCSIZ.71 J_OFFSET = JST - OFFy - 1 MPPOCSIZ.72 MPPOCSIZ.73 MPPOCSIZ.74 ! Start indices for ocean row-wise loop controls within MPPOCSIZ.75 ! the array of locally defined data - exclude halos. MPPOCSIZ.76 J_1 = 1 + OFFy MPPOCSIZ.77 MPPOCSIZ.78 ! Where loops previously started at row 2, we need a start MPPOCSIZ.79 ! index which excludes row 1 from the calculation. MPPOCSIZ.80 IF (JST.GE.2) THEN MPPOCSIZ.81 J_2 = J_1 MPPOCSIZ.82 ELSE MPPOCSIZ.83 J_2 = 2 + OFFy MPPOCSIZ.84 ENDIF MPPOCSIZ.85 MPPOCSIZ.86 ! Where loops previously started at row 3, we need a start MPPOCSIZ.87 ! index which excludes rows 1 and 2 from the calculation. MPPOCSIZ.88 IF (JST.GE.3) THEN MPPOCSIZ.89 J_3 = J_1 MPPOCSIZ.90 ELSE MPPOCSIZ.91 J_3 = 3 + OFFy MPPOCSIZ.92 ENDIF MPPOCSIZ.93 MPPOCSIZ.94 ! End indices for ocean row-wise loop controls excluding halos MPPOCSIZ.95 ! subsequent values of J_JMT* are based on this calculation. MPPOCSIZ.96 J_JMT = lasize(2) - OFFY MPPOCSIZ.97 MPPOCSIZ.98 MPPOCSIZ.99 ! Where loops previously ended at row JMT - 1, we need an end MPPOCSIZ.100 ! index which excludes row JMT. MPPOCSIZ.101 IF (JFIN.LE.JMTM1_GLOBAL) THEN MPPOCSIZ.102 J_JMTM1 = J_JMT MPPOCSIZ.103 ELSE MPPOCSIZ.104 J_JMTM1 = J_JMT - 1 MPPOCSIZ.105 ENDIF MPPOCSIZ.106 MPPOCSIZ.107 ! Where loops previously ended at row JMT - 2, we need an end MPPOCSIZ.108 ! index which excludes rows JMT and JMT - 1. MPPOCSIZ.109 IF (JFIN.LE.JMTM2_GLOBAL) THEN MPPOCSIZ.110 J_JMTM2 = J_JMT MPPOCSIZ.111 ELSE MPPOCSIZ.112 IF (JFIN.EQ.JMT_GLOBAL) THEN MPPOCSIZ.113 J_JMTM2 = J_JMT - 2 MPPOCSIZ.114 ENDIF MPPOCSIZ.115 IF (JFIN.EQ.JMTM1_GLOBAL) THEN MPPOCSIZ.116 J_JMTM2 = J_JMT - 1 MPPOCSIZ.117 ENDIF MPPOCSIZ.118 ENDIF MPPOCSIZ.119 MPPOCSIZ.120 ! Where loops previously ended at row JMT + 1, we need an end MPPOCSIZ.121 ! index which includes row JMT + 1 on the final processor. MPPOCSIZ.122 IF (JFIN.LT.JMT_GLOBAL) THEN MPPOCSIZ.123 J_JMTP1 = J_JMT MPPOCSIZ.124 ELSE MPPOCSIZ.125 J_JMTP1 = J_JMT + 1 MPPOCSIZ.126 ENDIF MPPOCSIZ.127 MPPOCSIZ.128 ! Set PE no for use in ocean argument lists MPPOCSIZ.129 O_MYPE = MYPE MPPOCSIZ.130 MPPOCSIZ.131 O_EW_HALO = OFFx MPPOCSIZ.132 O_NS_HALO = OFFy MPPOCSIZ.133 MPPOCSIZ.134 MPPOCSIZ.135 RETURN MPPOCSIZ.136 END MPPOCSIZ.137 *ENDIF MPPOCSIZ.138 *ENDIF MPPOCSIZ.139