Changeset 4007 for branches/2013/dev_r3987_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdylib.F90
- Timestamp:
- 2013-08-28T10:10:35+02:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2013/dev_r3987_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdylib.F90
r3994 r4007 34 34 CONTAINS 35 35 36 SUBROUTINE bdy_orlanski_2d( idx, igrd, phib, phia, phi_ext, mask,ll_npo )36 SUBROUTINE bdy_orlanski_2d( idx, igrd, phib, phia, phi_ext, ll_npo ) 37 37 !!---------------------------------------------------------------------- 38 38 !! *** SUBROUTINE bdy_orlanski_2d *** … … 50 50 REAL(wp), DIMENSION(:,:), INTENT(inout) :: phia ! model after 2D field (to be updated) 51 51 REAL(wp), DIMENSION(:), INTENT(in) :: phi_ext ! external forcing data 52 REAL(wp), DIMENSION(:,:), INTENT(in) :: mask ! land/sea mask53 52 LOGICAL, INTENT(in) :: ll_npo ! switch for NPO version 54 53 … … 57 56 INTEGER :: iijm1, iijp1, ijjm1, ijjp1 ! 2D addresses 58 57 INTEGER :: iibm1jp1, iibm1jm1, ijbm1jp1, ijbm1jm1 ! 2D addresses 58 INTEGER :: ii_offset, ij_offset ! offsets for mask indices 59 59 INTEGER :: flagu, flagv ! short cuts 60 60 REAL(wp) :: zdt, zdx, zdy, znor2, zcx, zcy ! intermediate calculations 61 REAL(wp) :: zout, zwgt, zdy_centred, zsign_ups 61 REAL(wp) :: zout, zwgt, zdy_centred 62 REAL(wp) :: zdy_left, zdy_right, zsign_ups 63 REAL(wp), POINTER, DIMENSION(:,:) :: pmask ! land/sea mask for field 64 REAL(wp), POINTER, DIMENSION(:,:) :: pmask_xdiv ! land/sea mask for x-derivatives 65 REAL(wp), POINTER, DIMENSION(:,:) :: pmask_ydiv ! land/sea mask for y-derivatives 62 66 !!---------------------------------------------------------------------- 63 67 … … 68 72 ! ----------------------------------! 69 73 74 SELECT CASE(igrd) 75 CASE(1) 76 pmask => tmask(:,:,1) 77 pmask_xdiv => umask(:,:,1) 78 ii_offset = 0 79 pmask_ydiv => vmask(:,:,1) 80 ij_offset = 0 81 CASE(2) 82 pmask => umask(:,:,1) 83 pmask_xdiv => tmask(:,:,1) 84 ii_offset = 1 85 pmask_ydiv => fmask(:,:,1) 86 ij_offset = 0 87 CASE(3) 88 pmask => vmask(:,:,1) 89 pmask_xdiv => fmask(:,:,1) 90 ii_offset = 0 91 pmask_ydiv => tmask(:,:,1) 92 ij_offset = 1 93 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for igrd in bdy_orlanksi_2d' ) 94 END SELECT 70 95 ! 71 96 DO jb = 1, idx%nblenrim(igrd) … … 86 111 ijbm1jm1 = ij + flagv - abs(flagu) ; ijbm1jp1 = ij + flagv + abs(flagu) 87 112 ! 88 ! calculate normal (zcx) and tangential (zcy) components of radiation velocities: 113 ! Calculate normal (zcx) and tangential (zcy) components of radiation velocities. 114 ! Mask derivatives to ensure correct land boundary conditions for each variable. 115 ! Centred derivative is calculated as average of "left" and "right" derivatives for 116 ! this reason. 89 117 zdt = phia(iibm1,ijbm1) - phib(iibm1,ijbm1) 90 zdx = phia(iibm1,ijbm1) - phia(iibm2,ijbm2) 91 zdy_centred = phib(iibm1jp1,ijbm1jp1) - phib(iibm1jm1,ijbm1jm1) 118 zdx = ( phia(iibm1,ijbm1) - phia(iibm2,ijbm2) ) & 119 & * ( abs(iibm1-iibm2) * pmask_xdiv(iibm2+ii_offset,ijbm2 ) & 120 & + abs(ijbm1-ijbm2) * pmask_ydiv(iibm2 ,ijbm2+ij_offset) ) 121 zdy_left = phib(iibm1 ,ijbm1 ) - phib(iibm1jm1,ijbm1jm1) & 122 & * ( (iibm1-iibm1jm1) * pmask_xdiv(iibm1jm1+ii_offset,ijbm1jm1 ) & 123 & + (ijbm1-ijbm1jm1) * pmask_ydiv(iibm1jm1 ,ijbm1jm1+ij_offset) ) 124 zdy_right = phib(iibm1jp1,ijbm1jp1) - phib(iibm1 ,ijbm1) & 125 & * ( (iibm1jp1-iibm1) * pmask_xdiv(iibm1+ii_offset,ijbm1) & 126 & + (ijbm1jp1-ijbm1) * pmask_ydiv(iibm1 ,ijbm1+ij_offset) ) 127 zdy_centred = 0.5 * ( zdy_left + zdy_right ) 128 !!$ zdy_centred = phib(iibm1jp1,ijbm1jp1) - phib(iibm1jm1,ijbm1jm1) 92 129 ! upstream differencing for tangential derivatives 93 130 zsign_ups = sign( 1., zdt * zdy_centred ) 94 131 zsign_ups = 0.5*( zsign_ups + abs(zsign_ups) ) 95 zdy = zsign_ups * ( phib(iibm1 ,ijbm1 ) - phib(iibm1jm1,ijbm1jm1) ) & 96 & + (1. - zsign_ups) * ( phib(iibm1jp1,ijbm1jp1) - phib(iibm1 ,ijbm1 ) ) 132 zdy = zsign_ups * zdy_left + (1. - zsign_ups) * zdy_right 97 133 znor2 = zdx * zdx + zdy * zdy 98 134 znor2 = max(znor2,rsmall) … … 106 142 ! only apply radiation on outflow points 107 143 if( ll_npo ) then !! NPO version !! 108 phia(ii,ij) = (1.-zout) * phi a(ii,ij) &144 phia(ii,ij) = (1.-zout) * phib(ii,ij) & 109 145 & + zout * ( phib(ii,ij) + zcx*phia(iibm1,ijbm1) ) / ( 1. + zcx ) 110 146 else !! full oblique radiation !! 111 147 zsign_ups = sign( 1., zcy ) 112 148 zsign_ups = 0.5*( zsign_ups + abs(zsign_ups) ) 113 phia(ii,ij) = (1.-zout) * phi a(ii,ij) &149 phia(ii,ij) = (1.-zout) * phib(ii,ij) & 114 150 & + zout * ( phib(ii,ij) + zcx*phia(iibm1,ijbm1) & 115 151 & - zsign_ups * zcy * ( phib(ii ,ij ) - phib(iijm1,ijjm1 ) ) & 116 152 & - (1.-zsign_ups) * zcy * ( phib(iijp1,ijjp1) - phib(ii ,ij ) ) ) / ( 1. + zcx ) 117 153 end if 118 phia(ii,ij) = phia(ii,ij) + zwgt * ( phi_ext(jb) - phia(ii,ij) )119 phia(ii,ij) = phia(ii,ij) * mask(ii,ij)154 !!$ phia(ii,ij) = phia(ii,ij) + zwgt * ( phi_ext(jb) - phib(ii,ij) ) 155 phia(ii,ij) = phia(ii,ij) * pmask(ii,ij) 120 156 END DO 121 157 ! … … 125 161 126 162 127 SUBROUTINE bdy_orlanski_3d( idx, igrd, phib, phia, phi_ext, mask,ll_npo )163 SUBROUTINE bdy_orlanski_3d( idx, igrd, phib, phia, phi_ext, ll_npo ) 128 164 !!---------------------------------------------------------------------- 129 165 !! *** SUBROUTINE bdy_orlanski_3d *** … … 141 177 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: phia ! model after 3D field (to be updated) 142 178 REAL(wp), DIMENSION(:,:), INTENT(in) :: phi_ext ! external forcing data 143 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: mask ! land/sea mask144 179 LOGICAL, INTENT(in) :: ll_npo ! switch for NPO version 145 180 … … 148 183 INTEGER :: iijm1, iijp1, ijjm1, ijjp1 ! 2D addresses 149 184 INTEGER :: iibm1jp1, iibm1jm1, ijbm1jp1, ijbm1jm1 ! 2D addresses 185 INTEGER :: ii_offset, ij_offset ! offsets for mask indices 150 186 INTEGER :: flagu, flagv ! short cuts 151 187 REAL(wp) :: zdt, zdx, zdy, znor2, zcx, zcy ! intermediate calculations 152 REAL(wp) :: zout, zwgt, zdy_centred, zsign_ups 188 REAL(wp) :: zout, zwgt, zdy_centred 189 REAL(wp) :: zdy_left, zdy_right, zsign_ups 190 REAL(wp), POINTER, DIMENSION(:,:,:) :: pmask ! land/sea mask for field 191 REAL(wp), POINTER, DIMENSION(:,:,:) :: pmask_xdiv ! land/sea mask for x-derivatives 192 REAL(wp), POINTER, DIMENSION(:,:,:) :: pmask_ydiv ! land/sea mask for y-derivatives 153 193 !!---------------------------------------------------------------------- 154 194 … … 159 199 ! ----------------------------------! 160 200 201 SELECT CASE(igrd) 202 CASE(1) 203 pmask => tmask(:,:,:) 204 pmask_xdiv => umask(:,:,:) 205 ii_offset = 0 206 pmask_ydiv => vmask(:,:,:) 207 ij_offset = 0 208 CASE(2) 209 pmask => umask(:,:,:) 210 pmask_xdiv => tmask(:,:,:) 211 ii_offset = 1 212 pmask_ydiv => fmask(:,:,:) 213 ij_offset = 0 214 CASE(3) 215 pmask => vmask(:,:,:) 216 pmask_xdiv => fmask(:,:,:) 217 ii_offset = 0 218 pmask_ydiv => tmask(:,:,:) 219 ij_offset = 1 220 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for igrd in bdy_orlanksi_2d' ) 221 END SELECT 222 161 223 DO jk = 1, jpk 162 224 ! … … 178 240 ijbm1jm1 = ij + flagv - abs(flagu) ; ijbm1jp1 = ij + flagv + abs(flagu) 179 241 ! 180 ! calculate normal (zcx) and tangential (zcy) components of radiation velocities: 242 ! Calculate normal (zcx) and tangential (zcy) components of radiation velocities. 243 ! Mask derivatives to ensure correct land boundary conditions for each variable. 244 ! Centred derivative is calculated as average of "left" and "right" derivatives for 245 ! this reason. 181 246 zdt = phia(iibm1,ijbm1,jk) - phib(iibm1,ijbm1,jk) 182 zdx = phia(iibm1,ijbm1,jk) - phia(iibm2,ijbm2,jk) 183 zdy_centred = phib(iibm1jp1,ijbm1jp1,jk) - phib(iibm1jm1,ijbm1jm1,jk) 247 zdx = phia(iibm1,ijbm1,jk) - phia(iibm2,ijbm2,jk) & 248 & * ( (iibm1-iibm2) * pmask_xdiv(iibm2+ii_offset,ijbm2 ,jk) & 249 & + (ijbm1-ijbm2) * pmask_ydiv(iibm2 ,ijbm2+ij_offset,jk) ) 250 zdy_left = phib(iibm1 ,ijbm1 ,jk) - phib(iibm1jm1,ijbm1jm1,jk) & 251 & * ( (iibm1-iibm1jm1) * pmask_xdiv(iibm1jm1+ii_offset,ijbm1jm1 ,jk) & 252 & + (ijbm1-ijbm1jm1) * pmask_ydiv(iibm1jm1 ,ijbm1jm1+ij_offset,jk) ) 253 zdy_right = phib(iibm1jp1,ijbm1jp1,jk) - phib(iibm1 ,ijbm1 ,jk) & 254 & * ( (iibm1jp1-iibm1) * pmask_xdiv(iibm1+ii_offset,ijbm1 ,jk) & 255 & + (ijbm1jp1-ijbm1) * pmask_ydiv(iibm1 ,ijbm1+ij_offset,jk) ) 256 zdy_centred = 0.5 * ( zdy_left + zdy_right ) 257 !!$ zdy_centred = phib(iibm1jp1,ijbm1jp1,jk) - phib(iibm1jm1,ijbm1jm1,jk) 184 258 ! upstream differencing for tangential derivatives 185 259 zsign_ups = sign( 1., zdt * zdy_centred ) 186 260 zsign_ups = 0.5*( zsign_ups + abs(zsign_ups) ) 187 zdy = zsign_ups * ( phib(iibm1 ,ijbm1 ,jk) - phib(iibm1jm1,ijbm1jm1,jk) ) & 188 & + (1. - zsign_ups) * ( phib(iibm1jp1,ijbm1jp1,jk) - phib(iibm1 ,ijbm1 ,jk) ) 261 zdy = zsign_ups * zdy_left + (1. - zsign_ups) * zdy_right 189 262 znor2 = zdx * zdx + zdy * zdy 190 263 znor2 = max(znor2,rsmall) … … 198 271 ! only apply radiation on outflow points 199 272 if( ll_npo ) then !! NPO version !! 200 phia(ii,ij,jk) = (1.-zout) * phi a(ii,ij,jk) &273 phia(ii,ij,jk) = (1.-zout) * phib(ii,ij,jk) & 201 274 & + zout * ( phib(ii,ij,jk) + zcx*phia(iibm1,ijbm1,jk) ) / ( 1. + zcx ) 202 275 else !! full oblique radiation !! 203 276 zsign_ups = sign( 1., zcy ) 204 277 zsign_ups = 0.5*( zsign_ups + abs(zsign_ups) ) 205 phia(ii,ij,jk) = (1.-zout) * phi a(ii,ij,jk) &278 phia(ii,ij,jk) = (1.-zout) * phib(ii,ij,jk) & 206 279 & + zout * ( phib(ii,ij,jk) + zcx*phia(iibm1,ijbm1,jk) & 207 280 & - zsign_ups * zcy * ( phib(ii ,ij ,jk) - phib(iijm1,ijjm1,jk ) ) & 208 281 & - (1.-zsign_ups) * zcy * ( phib(iijp1,ijjp1,jk) - phib(ii ,ij ,jk ) ) ) / ( 1. + zcx ) 209 282 end if 210 phia(ii,ij,jk) = phia(ii,ij,jk) + zwgt * ( phi_ext(jb,jk) - phia(ii,ij,jk) )211 phia(ii,ij,jk) = phia(ii,ij,jk) * mask(ii,ij,jk)283 !!$ phia(ii,ij,jk) = phia(ii,ij,jk) + zwgt * ( phi_ext(jb,jk) - phib(ii,ij,jk) ) 284 phia(ii,ij,jk) = phia(ii,ij,jk) * pmask(ii,ij,jk) 212 285 END DO 213 286 !
Note: See TracChangeset
for help on using the changeset viewer.