Changeset 4862
- Timestamp:
- 2014-11-18T13:35:02+01:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90
r4789 r4862 80 80 INTEGER :: ji,jj,jk 81 81 INTEGER :: ispongearea, ilci, ilcj 82 REAL(wp) :: z1spongearea 83 REAL(wp), POINTER, DIMENSION(:,:) :: zlocalviscsponge 82 LOGICAL :: ll_spdone 83 REAL(wp) :: z1spongearea, zramp 84 REAL(wp), POINTER, DIMENSION(:,:) :: ztabramp 84 85 85 86 #if defined SPONGE || defined SPONGE_TOP 86 87 CALL wrk_alloc( jpi, jpj, zlocalviscsponge ) 88 89 ispongearea = 2 + 2 * Agrif_irhox() 90 ilci = nlci - ispongearea 91 ilcj = nlcj - ispongearea 92 z1spongearea = 1._wp / REAL( ispongearea - 2 ) 93 spbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 87 ll_spdone=.TRUE. 88 IF (( .NOT. spongedoneT ).OR.( .NOT. spongedoneU )) THEN 89 ! Define ramp from boundaries towards domain interior 90 ! at T-points 91 ! Store it in ztabramp 92 ll_spdone=.FALSE. 93 94 CALL wrk_alloc( jpi, jpj, ztabramp ) 95 96 ispongearea = 2 + 2 * Agrif_irhox() 97 ilci = nlci - ispongearea 98 ilcj = nlcj - ispongearea 99 z1spongearea = 1._wp / REAL( ispongearea - 2 ) 100 spbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 101 102 ztabramp(:,:) = 0. 103 104 IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 105 DO jj = 1, jpj 106 IF ( umask(2,jj,1) == 1._wp ) THEN 107 DO ji = 2, ispongearea 108 ztabramp(ji,jj) = ( ispongearea-ji ) * z1spongearea 109 END DO 110 ENDIF 111 ENDDO 112 ENDIF 113 114 IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 115 DO jj = 1, jpj 116 IF ( umask(nlci-2,jj,1) == 1._wp ) THEN 117 DO ji = ilci+1,nlci-1 118 zramp = (ji - (ilci+1) ) * z1spongearea 119 ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 120 ENDDO 121 ENDIF 122 ENDDO 123 ENDIF 124 125 IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 126 DO ji = 1, jpi 127 IF ( vmask(ji,2,1) == 1._wp ) THEN 128 DO jj = 2, ispongearea 129 zramp = ( ispongearea-jj ) * z1spongearea 130 ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 131 END DO 132 ENDIF 133 ENDDO 134 ENDIF 135 136 IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 137 DO ji = 1, jpi 138 IF ( vmask(ji,nlcj-2,1) == 1._wp ) THEN 139 DO jj = ilcj+1,nlcj-1 140 zramp = (jj - (ilcj+1) ) * z1spongearea 141 ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 142 END DO 143 ENDIF 144 ENDDO 145 ENDIF 146 147 ENDIF 94 148 95 149 ! Tracers 96 150 IF( .NOT. spongedoneT ) THEN 97 zlocalviscsponge(:,:) = 0.98 151 spe1ur(:,:) = 0. 99 152 spe2vr(:,:) = 0. 100 153 101 154 IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 102 DO ji = 2, ispongearea103 zlocalviscsponge(ji,:) = visc_tra * ( ispongearea-ji ) * z1spongearea104 ENDDO105 spe1ur(2:ispongearea-1,: ) = 0.5 * ( zlocalviscsponge(2:ispongearea-1,: ) &106 & + zlocalviscsponge(3:ispongearea ,: ) ) & 107 & * e2u(2:ispongearea-1,: ) / e1u(2:ispongearea-1,: )108 spe2vr(2:ispongearea ,1:jpjm1) = 0.5 * ( zlocalviscsponge(2:ispongearea ,1:jpjm1) &109 & + zlocalviscsponge(2:ispongearea,2 :jpj ) ) &110 & * e1v(2:ispongearea ,1:jpjm1) / e2v(2:ispongearea,1:jpjm1)155 spe1ur(2:ispongearea-1,: ) = visc_tra & 156 & * 0.5 * ( ztabramp(2:ispongearea-1,: ) & 157 & + ztabramp(3:ispongearea ,: ) ) & 158 & * e2u(2:ispongearea-1,:) / e1u(2:ispongearea-1,:) 159 160 spe2vr(2:ispongearea ,1:jpjm1 ) = visc_tra & 161 & * 0.5 * ( ztabramp(2:ispongearea ,1:jpjm1) & 162 & + ztabramp(2:ispongearea,2 :jpj ) ) & 163 & * e1v(2:ispongearea,1:jpjm1) / e2v(2:ispongearea,1:jpjm1) 111 164 ENDIF 112 165 113 166 IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 114 DO ji = ilci+1,nlci-1 115 zlocalviscsponge(ji,:) = visc_tra * (ji - (ilci+1) ) * z1spongearea 116 ENDDO 117 118 spe1ur(ilci+1:nlci-2,: ) = 0.5 * ( zlocalviscsponge(ilci+1:nlci-2,:) & 119 & + zlocalviscsponge(ilci+2:nlci-1,:) ) & 120 & * e2u(ilci+1:nlci-2,:) / e1u(ilci+1:nlci-2,:) 121 122 spe2vr(ilci+1:nlci-1,1:jpjm1) = 0.5 * ( zlocalviscsponge(ilci+1:nlci-1,1:jpjm1) & 123 & + zlocalviscsponge(ilci+1:nlci-1,2:jpj ) ) & 124 & * e1v(ilci+1:nlci-1,1:jpjm1) / e2v(ilci+1:nlci-1,1:jpjm1) 167 spe1ur(ilci+1:nlci-2,: ) = visc_tra & 168 & * 0.5 * ( ztabramp(ilci+1:nlci-2,: ) & 169 & + ztabramp(ilci+2:nlci-1,: ) ) & 170 & * e2u(ilci+1:nlci-2,:) / e1u(ilci+1:nlci-2,:) 171 172 spe2vr(ilci+1:nlci-1,1:jpjm1 ) = visc_tra & 173 & * 0.5 * ( ztabramp(ilci+1:nlci-1,1:jpjm1) & 174 & + ztabramp(ilci+1:nlci-1,2:jpj ) ) & 175 & * e1v(ilci+1:nlci-1,1:jpjm1) / e2v(ilci+1:nlci-1,1:jpjm1) 125 176 ENDIF 126 177 127 178 IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 128 DO jj = 2, ispongearea 129 zlocalviscsponge(:,jj) = visc_tra * ( ispongearea-jj ) * z1spongearea 130 ENDDO 131 spe1ur(1:jpim1,2:ispongearea ) = 0.5 * ( zlocalviscsponge(1:jpim1,2:ispongearea ) & 132 & + zlocalviscsponge(2:jpi ,2:ispongearea) ) & 133 & * e2u(1:jpim1,2:ispongearea) / e1u(1:jpim1,2:ispongearea) 134 135 spe2vr(: ,2:ispongearea-1) = 0.5 * ( zlocalviscsponge(:,2:ispongearea-1) & 136 & + zlocalviscsponge(:,3:ispongearea ) ) & 137 & * e1v(:,2:ispongearea-1) / e2v(:,2:ispongearea-1) 179 spe1ur(1:jpim1,2:ispongearea ) = visc_tra & 180 & * 0.5 * ( ztabramp(1:jpim1,2:ispongearea ) & 181 & + ztabramp(2:jpi ,2:ispongearea ) ) & 182 & * e2u(1:jpim1,2:ispongearea) / e1u(1:jpim1,2:ispongearea) 183 184 spe2vr(: ,2:ispongearea-1) = visc_tra & 185 & * 0.5 * ( ztabramp(: ,2:ispongearea-1) & 186 & + ztabramp(: ,3:ispongearea ) ) & 187 & * e1v(:,2:ispongearea-1) / e2v(:,2:ispongearea-1) 138 188 ENDIF 139 189 140 190 IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 141 DO jj = ilcj+1,nlcj-1142 zlocalviscsponge(:,jj) = visc_tra * (jj - (ilcj+1) ) * z1spongearea143 ENDDO144 spe1ur(1:jpim1,ilcj+1:nlcj-1) = 0.5 * ( zlocalviscsponge(1:jpim1,ilcj+1:nlcj-1) &145 & + zlocalviscsponge(2:jpi ,ilcj+1:nlcj-1) ) & 146 & * e2u(1:jpim1,ilcj+1:nlcj-1) / e1u(1:jpim1,ilcj+1:nlcj-1)147 spe2vr(: ,ilcj+1:nlcj-2) = 0.5 * ( zlocalviscsponge(:,ilcj+1:nlcj-2) &148 & + zlocalviscsponge(:,ilcj+2:nlcj-1) )&149 191 spe1ur(1:jpim1,ilcj+1:nlcj-1) = visc_tra & 192 & * 0.5 * ( ztabramp(1:jpim1,ilcj+1:nlcj-1) & 193 & + ztabramp(2:jpi ,ilcj+1:nlcj-1) ) & 194 & * e2u(1:jpim1,ilcj+1:nlcj-1) / e1u(1:jpim1,ilcj+1:nlcj-1) 195 196 spe2vr(: ,ilcj+1:nlcj-2) = visc_tra & 197 & * 0.5 * ( ztabramp(: ,ilcj+1:nlcj-2) & 198 & + ztabramp(: ,ilcj+2:nlcj-1) ) & 199 & * e1v(:,ilcj+1:nlcj-2) / e2v(:,ilcj+1:nlcj-2) 150 200 ENDIF 151 201 spongedoneT = .TRUE. … … 154 204 ! Dynamics 155 205 IF( .NOT. spongedoneU ) THEN 156 zlocalviscsponge(:,:) = 0.157 206 spe1ur2(:,:) = 0. 158 207 spe2vr2(:,:) = 0. 159 208 160 209 IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 161 DO ji = 2, ispongearea 162 zlocalviscsponge(ji,:) = visc_dyn * ( ispongearea-ji ) * z1spongearea 163 ENDDO 164 spe1ur2(2:ispongearea-1,: ) = 0.5 * ( zlocalviscsponge(2:ispongearea-1,: ) & 165 & + zlocalviscsponge(3:ispongearea,: ) ) 166 spe2vr2(2:ispongearea ,1:jpjm1) = 0.5 * ( zlocalviscsponge(2:ispongearea ,1:jpjm1) & 167 & + zlocalviscsponge(2:ispongearea,2:jpj) ) 210 spe1ur2(2:ispongearea-1,: ) = visc_dyn & 211 & * 0.5 * ( ztabramp(2:ispongearea-1,: ) & 212 & + ztabramp(3:ispongearea ,: ) ) 213 spe2vr2(2:ispongearea ,1:jpjm1) = visc_dyn & 214 & * 0.5 * ( ztabramp(2:ispongearea ,1:jpjm1) & 215 & + ztabramp(2:ispongearea ,2:jpj ) ) 168 216 ENDIF 169 217 170 218 IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 171 DO ji = ilci+1,nlci-1 172 zlocalviscsponge(ji,:) = visc_dyn * (ji - (ilci+1) ) * z1spongearea 173 ENDDO 174 spe1ur2(ilci+1:nlci-2,: ) = 0.5 * ( zlocalviscsponge(ilci+1:nlci-2,:) & 175 & + zlocalviscsponge(ilci+2:nlci-1,:) ) 176 spe2vr2(ilci+1:nlci-1,1:jpjm1) = 0.5 * ( zlocalviscsponge(ilci+1:nlci-1,1:jpjm1) & 177 & + zlocalviscsponge(ilci+1:nlci-1,2:jpj ) ) 219 spe1ur2(ilci+1:nlci-2 ,: ) = visc_dyn & 220 & * 0.5 * ( ztabramp(ilci+1:nlci-2, : ) & 221 & + ztabramp(ilci+2:nlci-1, : ) ) 222 spe2vr2(ilci+1:nlci-1 ,1:jpjm1) = visc_dyn & 223 & * 0.5 * ( ztabramp(ilci+1:nlci-1,1:jpjm1 ) & 224 & + ztabramp(ilci+1:nlci-1,2:jpj ) ) 178 225 ENDIF 179 226 180 227 IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 181 DO jj = 2, ispongearea 182 zlocalviscsponge(:,jj) = visc_dyn * ( ispongearea-jj ) * z1spongearea 183 ENDDO 184 spe1ur2(1:jpim1,2:ispongearea ) = 0.5 * ( zlocalviscsponge(1:jpim1,2:ispongearea) & 185 & + zlocalviscsponge(2:jpi,2:ispongearea) ) 186 spe2vr2(: ,2:ispongearea-1) = 0.5 * ( zlocalviscsponge(:,2:ispongearea-1) & 187 & + zlocalviscsponge(:,3:ispongearea) ) 228 spe1ur2(1:jpim1,2:ispongearea ) = visc_dyn & 229 & * 0.5 * ( ztabramp(1:jpim1,2:ispongearea ) & 230 & + ztabramp(2:jpi ,2:ispongearea ) ) 231 spe2vr2(: ,2:ispongearea-1) = visc_dyn & 232 & * 0.5 * ( ztabramp(: ,2:ispongearea-1) & 233 & + ztabramp(: ,3:ispongearea ) ) 188 234 ENDIF 189 235 190 236 IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 191 DO jj = ilcj+1,nlcj-1 192 zlocalviscsponge(:,jj) = visc_dyn * (jj - (ilcj+1) ) * z1spongearea 193 ENDDO 194 spe1ur2(1:jpim1,ilcj+1:nlcj-1) = 0.5 * ( zlocalviscsponge(1:jpim1,ilcj+1:nlcj-1) & 195 & + zlocalviscsponge(2:jpi,ilcj+1:nlcj-1) ) 196 spe2vr2(: ,ilcj+1:nlcj-2) = 0.5 * ( zlocalviscsponge(:,ilcj+1:nlcj-2 ) & 197 & + zlocalviscsponge(:,ilcj+2:nlcj-1) ) 237 spe1ur2(1:jpim1,ilcj+1:nlcj-1 ) = visc_dyn & 238 & * 0.5 * ( ztabramp(1:jpim1,ilcj+1:nlcj-1 ) & 239 & + ztabramp(2:jpi ,ilcj+1:nlcj-1 ) ) 240 spe2vr2(: ,ilcj+1:nlcj-2 ) = visc_dyn & 241 & * 0.5 * ( ztabramp(: ,ilcj+1:nlcj-2 ) & 242 & + ztabramp(: ,ilcj+2:nlcj-1 ) ) 198 243 ENDIF 199 244 spongedoneU = .TRUE. … … 201 246 ENDIF 202 247 ! 203 CALL wrk_dealloc( jpi, jpj, zlocalviscsponge)248 IF (.NOT.ll_spdone) CALL wrk_dealloc( jpi, jpj, ztabramp ) 204 249 ! 205 250 #endif 206 207 251 END SUBROUTINE Agrif_Sponge 208 252
Note: See TracChangeset
for help on using the changeset viewer.