Changeset 7298
- Timestamp:
- 2016-11-22T12:19:43+01:00 (7 years ago)
- Location:
- branches/2016/dev_CMCC_2016
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2016/dev_CMCC_2016/DOC/TexFiles/Chapters/Chap_MISC.tex
r6997 r7298 243 243 b \qquad \ &= sum_2 \\ 244 244 \end{align*} 245 This feature can be found in \mdl{lib\_fortran} module and is effective when \key{mpp\_rep}.246 I n that case, all calls toglob\_sum function (summation over the entire basin excluding245 An example of this feature can be found in \mdl{lib\_fortran} module. 246 It is systematicallt used in glob\_sum function (summation over the entire basin excluding 247 247 duplicated rows and columns due to cyclic or north fold boundary condition as well as 248 overlap MPP areas). 249 Note this implementation may be sensitive to the optimization level. 248 overlap MPP areas). The self-compensated summation method should be used in all summation 249 in i- and/or j-direction. See closea.F90 module for an example. 250 Note also that this implementation may be sensitive to the optimization level. 250 251 251 252 \subsection{MPP scalability} -
branches/2016/dev_CMCC_2016/NEMOGCM/NEMO/LIM_SRC_2/limdyn_2.F90
r5123 r7298 87 87 ! --------------------------------------------------- 88 88 89 IF( lk_mpp .OR. lk_mpp_rep) THEN ! mpp: compute over the whole domain89 IF( lk_mpp ) THEN ! mpp: compute over the whole domain 90 90 i_j1 = 1 91 91 i_jpj = jpj -
branches/2016/dev_CMCC_2016/NEMOGCM/NEMO/LIM_SRC_3/limdyn.F90
r5836 r7298 94 94 ! --------------------------------------------------- 95 95 96 IF( lk_mpp .OR. lk_mpp_rep) THEN ! mpp: compute over the whole domain96 IF( lk_mpp ) THEN ! mpp: compute over the whole domain 97 97 i_j1 = 1 98 98 i_jpj = jpj -
branches/2016/dev_CMCC_2016/NEMOGCM/NEMO/OPA_SRC/DIA/diahsb.F90
r6140 r7298 372 372 373 373 IF( .NOT. ln_diahsb ) RETURN 374 ! IF( .NOT. lk_mpp_rep ) &375 ! CALL ctl_stop (' Your global mpp_sum if performed in single precision - 64 bits -', &376 ! & ' whereas the global sum to be precise must be done in double precision ',&377 ! & ' please add key_mpp_rep')378 374 379 375 ! ------------------- ! -
branches/2016/dev_CMCC_2016/NEMOGCM/NEMO/OPA_SRC/DOM/closea.F90
r5836 r7298 220 220 ! 221 221 ! ! surface of closed seas 222 IF( lk_mpp_rep ) THEN ! MPP reproductible calculation 223 DO jc = 1, jpncs 224 ctmp = CMPLX( 0.e0, 0.e0, wp ) 225 DO jj = ncsj1(jc), ncsj2(jc) 226 DO ji = ncsi1(jc), ncsi2(jc) 227 ztmp = e1e2t(ji,jj) * tmask_i(ji,jj) 228 CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 229 END DO 230 END DO 231 IF( lk_mpp ) CALL mpp_sum( ctmp ) 232 surf(jc) = REAL(ctmp,wp) 233 END DO 234 ELSE ! Standard calculation 235 DO jc = 1, jpncs 236 DO jj = ncsj1(jc), ncsj2(jc) 237 DO ji = ncsi1(jc), ncsi2(jc) 238 surf(jc) = surf(jc) + e1e2t(ji,jj) * tmask_i(ji,jj) ! surface of closed seas 239 END DO 222 DO jc = 1, jpncs 223 ctmp = CMPLX( 0.e0, 0.e0, wp ) 224 DO jj = ncsj1(jc), ncsj2(jc) 225 DO ji = ncsi1(jc), ncsi2(jc) 226 ztmp = e1e2t(ji,jj) * tmask_i(ji,jj) 227 CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 240 228 END DO 241 229 END DO 242 IF( lk_mpp ) CALL mpp_sum ( surf, jpncs ) ! mpp: sum over all the global domain 243 ENDIF 230 IF( lk_mpp ) CALL mpp_sum( ctmp ) 231 surf(jc) = REAL(ctmp,wp) 232 END DO 244 233 245 234 IF(lwp) WRITE(numout,*)' Closed sea surfaces' … … 257 246 ! ! update emp ! 258 247 zfwf = 0.e0_wp !--------------------! 259 IF( lk_mpp_rep ) THEN ! MPP reproductible calculation 260 DO jc = 1, jpncs 261 ctmp = CMPLX( 0.e0, 0.e0, wp ) 262 DO jj = ncsj1(jc), ncsj2(jc) 263 DO ji = ncsi1(jc), ncsi2(jc) 264 ztmp = e1e2t(ji,jj) * ( emp(ji,jj)-rnf(ji,jj) ) * tmask_i(ji,jj) 265 CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 266 END DO 267 END DO 268 IF( lk_mpp ) CALL mpp_sum( ctmp ) 269 zfwf(jc) = REAL(ctmp,wp) 270 END DO 271 ELSE ! Standard calculation 272 DO jc = 1, jpncs 273 DO jj = ncsj1(jc), ncsj2(jc) 274 DO ji = ncsi1(jc), ncsi2(jc) 275 zfwf(jc) = zfwf(jc) + e1e2t(ji,jj) * ( emp(ji,jj)-rnf(ji,jj) ) * tmask_i(ji,jj) 276 END DO 277 END DO 278 END DO 279 IF( lk_mpp ) CALL mpp_sum ( zfwf(:) , jpncs ) ! mpp: sum over all the global domain 280 ENDIF 248 DO jc = 1, jpncs 249 ctmp = CMPLX( 0.e0, 0.e0, wp ) 250 DO jj = ncsj1(jc), ncsj2(jc) 251 DO ji = ncsi1(jc), ncsi2(jc) 252 ztmp = e1e2t(ji,jj) * ( emp(ji,jj)-rnf(ji,jj) ) * tmask_i(ji,jj) 253 CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 254 END DO 255 END DO 256 IF( lk_mpp ) CALL mpp_sum( ctmp ) 257 zfwf(jc) = REAL(ctmp,wp) 258 END DO 281 259 282 260 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN ! Black Sea case for ORCA_R2 configuration -
branches/2016/dev_CMCC_2016/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90
r6140 r7298 270 270 271 271 !!---------------------------------------------------------------------- 272 !! mpp reproducibility273 !!----------------------------------------------------------------------274 #if defined key_mpp_rep275 LOGICAL, PUBLIC, PARAMETER :: lk_mpp_rep = .TRUE. !: agrif flag276 #else277 LOGICAL, PUBLIC, PARAMETER :: lk_mpp_rep = .FALSE. !: agrif flag278 #endif279 280 !!----------------------------------------------------------------------281 272 !! agrif domain 282 273 !!---------------------------------------------------------------------- -
branches/2016/dev_CMCC_2016/NEMOGCM/NEMO/OPA_SRC/lib_fortran.F90
r6140 r7298 7 7 !! 3.4 ! 2013-06 (C. Rousset) add glob_min, glob_max 8 8 !! + 3d dim. of input is fexible (jpk, jpl...) 9 !! 4.0 ! 2016-06 (T. Lovato) double precision global sum by default 9 10 !!---------------------------------------------------------------------- 10 11 … … 61 62 CONTAINS 62 63 63 #if ! defined key_mpp_rep64 ! --- SUM ---65 66 FUNCTION glob_sum_1d( ptab, kdim )67 !!-----------------------------------------------------------------------68 !! *** FUNCTION glob_sum_1D ***69 !!70 !! ** Purpose : perform a masked sum on the inner global domain of a 1D array71 !!-----------------------------------------------------------------------72 INTEGER :: kdim73 REAL(wp), INTENT(in), DIMENSION(kdim) :: ptab ! input 1D array74 REAL(wp) :: glob_sum_1d ! global sum75 !!-----------------------------------------------------------------------76 !77 glob_sum_1d = SUM( ptab(:) )78 IF( lk_mpp ) CALL mpp_sum( glob_sum_1d )79 !80 END FUNCTION glob_sum_1d81 82 FUNCTION glob_sum_2d( ptab )83 !!-----------------------------------------------------------------------84 !! *** FUNCTION glob_sum_2D ***85 !!86 !! ** Purpose : perform a masked sum on the inner global domain of a 2D array87 !!-----------------------------------------------------------------------88 REAL(wp), INTENT(in), DIMENSION(:,:) :: ptab ! input 2D array89 REAL(wp) :: glob_sum_2d ! global masked sum90 !!-----------------------------------------------------------------------91 !92 glob_sum_2d = SUM( ptab(:,:)*tmask_i(:,:) )93 IF( lk_mpp ) CALL mpp_sum( glob_sum_2d )94 !95 END FUNCTION glob_sum_2d96 97 98 FUNCTION glob_sum_3d( ptab )99 !!-----------------------------------------------------------------------100 !! *** FUNCTION glob_sum_3D ***101 !!102 !! ** Purpose : perform a masked sum on the inner global domain of a 3D array103 !!-----------------------------------------------------------------------104 REAL(wp), INTENT(in), DIMENSION(:,:,:) :: ptab ! input 3D array105 REAL(wp) :: glob_sum_3d ! global masked sum106 !!107 INTEGER :: jk108 INTEGER :: ijpk ! local variable: size of the 3d dimension of ptab109 !!-----------------------------------------------------------------------110 !111 ijpk = SIZE(ptab,3)112 !113 glob_sum_3d = 0.e0114 DO jk = 1, ijpk115 glob_sum_3d = glob_sum_3d + SUM( ptab(:,:,jk)*tmask_i(:,:) )116 END DO117 IF( lk_mpp ) CALL mpp_sum( glob_sum_3d )118 !119 END FUNCTION glob_sum_3d120 121 122 FUNCTION glob_sum_2d_a( ptab1, ptab2 )123 !!-----------------------------------------------------------------------124 !! *** FUNCTION glob_sum_2D _a ***125 !!126 !! ** Purpose : perform a masked sum on the inner global domain of two 2D array127 !!-----------------------------------------------------------------------128 REAL(wp), INTENT(in), DIMENSION(:,:) :: ptab1, ptab2 ! input 2D array129 REAL(wp) , DIMENSION(2) :: glob_sum_2d_a ! global masked sum130 !!-----------------------------------------------------------------------131 !132 glob_sum_2d_a(1) = SUM( ptab1(:,:)*tmask_i(:,:) )133 glob_sum_2d_a(2) = SUM( ptab2(:,:)*tmask_i(:,:) )134 IF( lk_mpp ) CALL mpp_sum( glob_sum_2d_a, 2 )135 !136 END FUNCTION glob_sum_2d_a137 138 139 FUNCTION glob_sum_3d_a( ptab1, ptab2 )140 !!-----------------------------------------------------------------------141 !! *** FUNCTION glob_sum_3D_a ***142 !!143 !! ** Purpose : perform a masked sum on the inner global domain of two 3D array144 !!-----------------------------------------------------------------------145 REAL(wp), INTENT(in), DIMENSION(:,:,:) :: ptab1, ptab2 ! input 3D array146 REAL(wp) , DIMENSION(2) :: glob_sum_3d_a ! global masked sum147 !!148 INTEGER :: jk149 INTEGER :: ijpk ! local variable: size of the 3d dimension of ptab150 !!-----------------------------------------------------------------------151 !152 ijpk = SIZE(ptab1,3)153 !154 glob_sum_3d_a(:) = 0.e0155 DO jk = 1, ijpk156 glob_sum_3d_a(1) = glob_sum_3d_a(1) + SUM( ptab1(:,:,jk)*tmask_i(:,:) )157 glob_sum_3d_a(2) = glob_sum_3d_a(2) + SUM( ptab2(:,:,jk)*tmask_i(:,:) )158 END DO159 IF( lk_mpp ) CALL mpp_sum( glob_sum_3d_a, 2 )160 !161 END FUNCTION glob_sum_3d_a162 163 FUNCTION glob_sum_full_2d( ptab )164 !!----------------------------------------------------------------------165 !! *** FUNCTION glob_sum_full_2d ***166 !!167 !! ** Purpose : perform a sum in calling DDPDD routine (nomask)168 !!----------------------------------------------------------------------169 REAL(wp), INTENT(in), DIMENSION(:,:) :: ptab170 REAL(wp) :: glob_sum_full_2d ! global sum171 !!172 !!-----------------------------------------------------------------------173 !174 glob_sum_full_2d = SUM( ptab(:,:) * tmask_h(:,:) )175 IF( lk_mpp ) CALL mpp_sum( glob_sum_full_2d )176 !177 END FUNCTION glob_sum_full_2d178 179 FUNCTION glob_sum_full_3d( ptab )180 !!----------------------------------------------------------------------181 !! *** FUNCTION glob_sum_full_3d ***182 !!183 !! ** Purpose : perform a sum on a 3D array in calling DDPDD routine (nomask)184 !!----------------------------------------------------------------------185 REAL(wp), INTENT(in), DIMENSION(:,:,:) :: ptab186 REAL(wp) :: glob_sum_full_3d ! global sum187 !!188 INTEGER :: ji, jj, jk ! dummy loop indices189 INTEGER :: ijpk ! local variables: size of ptab190 !!-----------------------------------------------------------------------191 !192 ijpk = SIZE(ptab,3)193 !194 glob_sum_full_3d = 0.e0195 DO jk = 1, ijpk196 glob_sum_full_3d = glob_sum_full_3d + SUM( ptab(:,:,jk) * tmask_h(:,:) )197 END DO198 IF( lk_mpp ) CALL mpp_sum( glob_sum_full_3d )199 !200 END FUNCTION glob_sum_full_3d201 202 203 #else204 !!----------------------------------------------------------------------205 !! 'key_mpp_rep' MPP reproducibility206 !!----------------------------------------------------------------------207 208 64 ! --- SUM --- 209 65 FUNCTION glob_sum_1d( ptab, kdim ) … … 417 273 END FUNCTION glob_sum_full_3d 418 274 419 420 421 #endif422 423 275 ! --- MIN --- 424 276 FUNCTION glob_min_2d( ptab ) -
branches/2016/dev_CMCC_2016/NEMOGCM/SETTE/README
r3635 r7298 21 21 -n : config name (in examples config_name_nproci_nprocj), see ./makenemo -n help 22 22 -r : reference configuration (if you don't give it you have to choise directories to install) 23 add_key : to add list of keys (for example to test reproductibility: add_key mpp_rep)23 add_key : to add list of keys 24 24 del_key : to del list of keys 25 25 and for more details and options of makenemo see ./makenemo -h -
branches/2016/dev_CMCC_2016/NEMOGCM/SETTE/sette.sh
r6460 r7298 222 222 export TEST_NAME="REPRO_1_4" 223 223 cd ${CONFIG_DIR} 224 . ./makenemo -m ${CMP_NAM} -n GYRE_4 -r GYRE -j 8 add_key "key_mpp_rep"del_key ${DEL_KEYS}224 . ./makenemo -m ${CMP_NAM} -n GYRE_4 -r GYRE -j 8 del_key ${DEL_KEYS} 225 225 cd ${SETTE_DIR} 226 226 . ./param.cfg … … 381 381 export TEST_NAME="REPRO_4_4" 382 382 cd ${CONFIG_DIR} 383 . ./makenemo -m ${CMP_NAM} -n ORCA2LIMPIS_16 -r ORCA2_LIM_PISCES -j 8 add_key "key_mpp_rep"del_key ${DEL_KEYS}383 . ./makenemo -m ${CMP_NAM} -n ORCA2LIMPIS_16 -r ORCA2_LIM_PISCES -j 8 del_key ${DEL_KEYS} 384 384 cd ${SETTE_DIR} 385 385 . ./param.cfg … … 468 468 export TEST_NAME="LONG" 469 469 cd ${CONFIG_DIR} 470 . ./makenemo -m ${CMP_NAM} -n ORCA2OFFPIS_LONG -r ORCA2_OFF_PISCES -j 8 add_key "key_mpp_rep"del_key ${DEL_KEYS}470 . ./makenemo -m ${CMP_NAM} -n ORCA2OFFPIS_LONG -r ORCA2_OFF_PISCES -j 8 del_key ${DEL_KEYS} 471 471 cd ${SETTE_DIR} 472 472 . ./param.cfg … … 555 555 export TEST_NAME="REPRO_4_4" 556 556 cd ${CONFIG_DIR} 557 . ./makenemo -m ${CMP_NAM} -n ORCA2OFFPIS_16 -r ORCA2_OFF_PISCES -j 8 add_key "key_mpp_rep"del_key ${DEL_KEYS}557 . ./makenemo -m ${CMP_NAM} -n ORCA2OFFPIS_16 -r ORCA2_OFF_PISCES -j 8 del_key ${DEL_KEYS} 558 558 cd ${SETTE_DIR} 559 559 . ./param.cfg … … 706 706 export TEST_NAME="REPRO_4_4" 707 707 cd ${CONFIG_DIR} 708 . ./makenemo -m ${CMP_NAM} -n ORCA2LIM3_16 -r ORCA2_LIM3 -j 8 add_key "key_mpp_rep"del_key ${DEL_KEYS}708 . ./makenemo -m ${CMP_NAM} -n ORCA2LIM3_16 -r ORCA2_LIM3 -j 8 del_key ${DEL_KEYS} 709 709 cd ${SETTE_DIR} 710 710 . ./param.cfg … … 829 829 export TEST_NAME="REPRO_8_4" 830 830 cd ${CONFIG_DIR} 831 . ./makenemo -m ${CMP_NAM} -n AMM12_32 -r AMM12 -j 8 add_key "key_ mpp_rep key_tide" del_key ${DEL_KEYS}831 . ./makenemo -m ${CMP_NAM} -n AMM12_32 -r AMM12 -j 8 add_key "key_tide" del_key ${DEL_KEYS} 832 832 cd ${SETTE_DIR} 833 833 . ./param.cfg … … 887 887 export TEST_NAME="LONG" 888 888 cd ${CONFIG_DIR} 889 . ./makenemo -m ${CMP_NAM} -n SAS_LONG -r ORCA2_SAS_LIM -j 8 add_key "key_mpp_rep"del_key ${DEL_KEYS}889 . ./makenemo -m ${CMP_NAM} -n SAS_LONG -r ORCA2_SAS_LIM -j 8 del_key ${DEL_KEYS} 890 890 cd ${SETTE_DIR} 891 891 . ./param.cfg … … 949 949 export TEST_NAME="REPRO_8_4" 950 950 cd ${CONFIG_DIR} 951 . ./makenemo -m ${CMP_NAM} -n SAS_32 -r ORCA2_SAS_LIM -j 8 add_key "key_mpp_rep"del_key ${DEL_KEYS}951 . ./makenemo -m ${CMP_NAM} -n SAS_32 -r ORCA2_SAS_LIM -j 8 add_key del_key ${DEL_KEYS} 952 952 cd ${SETTE_DIR} 953 953 . ./param.cfg … … 1072 1072 export TEST_NAME="REPRO_1_4" 1073 1073 cd ${CONFIG_DIR} 1074 . ./makenemo -m ${CMP_NAM} -n ISOMIP_4 -u ISOMIP -j 8 add_key "key_mpp_rep"del_key ${DEL_KEYS}1074 . ./makenemo -m ${CMP_NAM} -n ISOMIP_4 -u ISOMIP -j 8 del_key ${DEL_KEYS} 1075 1075 cd ${SETTE_DIR} 1076 1076 . ./param.cfg … … 1137 1137 export TEST_NAME="REPRO_4_4" 1138 1138 cd ${CONFIG_DIR} 1139 . ./makenemo -m ${CMP_NAM} -n ORCA2_LIM_OBS -r ORCA2_LIM -j 8 add_key "key_ mpp_rep key_asminc" del_key ${DEL_KEYS}1139 . ./makenemo -m ${CMP_NAM} -n ORCA2_LIM_OBS -r ORCA2_LIM -j 8 add_key "key_asminc" del_key ${DEL_KEYS} 1140 1140 cd ${SETTE_DIR} 1141 1141 . ./param.cfg … … 1218 1218 export TEST_NAME="SHORT" 1219 1219 cd ${CONFIG_DIR} 1220 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_1_2 -r ORCA2_LIM -j 8 add_key "key_ mpp_rep key_agrif" del_key "key_zdftmx" del_key ${DEL_KEYS}1220 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_1_2 -r ORCA2_LIM -j 8 add_key "key_agrif" del_key "key_zdftmx" del_key ${DEL_KEYS} 1221 1221 cd ${SETTE_DIR} 1222 1222 . ./param.cfg … … 1258 1258 export TEST_NAME="SHORT_NOZOOM" 1259 1259 cd ${CONFIG_DIR} 1260 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_2_2 -r ORCA2_LIM -j 8 add_key "key_ mpp_rep key_agrif" del_key "key_zdftmx" del_key ${DEL_KEYS}1260 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_2_2 -r ORCA2_LIM -j 8 add_key "key_agrif" del_key "key_zdftmx" del_key ${DEL_KEYS} 1261 1261 cd ${SETTE_DIR} 1262 1262 . ./param.cfg … … 1291 1291 export TEST_NAME="SHORT_NOAGRIF" 1292 1292 cd ${CONFIG_DIR} 1293 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_2_2_NAG -r ORCA2_LIM -j 8 add_key "key_mpp_rep"del_key "key_zdftmx" del_key ${DEL_KEYS}1293 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_2_2_NAG -r ORCA2_LIM -j 8 del_key "key_zdftmx" del_key ${DEL_KEYS} 1294 1294 cd ${SETTE_DIR} 1295 1295 . ./param.cfg … … 1325 1325 export TEST_NAME="LONG" 1326 1326 cd ${CONFIG_DIR} 1327 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_LONG -r ORCA2_LIM -j 8 add_key "key_ mpp_rep key_agrif" del_key "key_zdftmx" del_key ${DEL_KEYS}1327 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_LONG -r ORCA2_LIM -j 8 add_key "key_agrif" del_key "key_zdftmx" del_key ${DEL_KEYS} 1328 1328 cd ${SETTE_DIR} 1329 1329 . ./param.cfg … … 1411 1411 export TEST_NAME="REPRO_4_4" 1412 1412 cd ${CONFIG_DIR} 1413 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_16 -r ORCA2_LIM -j 8 add_key "key_ mpp_rep key_agrif" del_key "key_zdftmx" del_key ${DEL_KEYS}1413 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_16 -r ORCA2_LIM -j 8 add_key "key_agrif" del_key "key_zdftmx" del_key ${DEL_KEYS} 1414 1414 cd ${SETTE_DIR} 1415 1415 . ./param.cfg
Note: See TracChangeset
for help on using the changeset viewer.