Changeset 3900
- Timestamp:
- 2013-05-03T11:51:52+02:00 (11 years ago)
- Location:
- branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY
- Files:
-
- 1 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_oce.F90
r3651 r3900 29 29 REAL , POINTER, DIMENSION(:,:) :: nbw 30 30 REAL , POINTER, DIMENSION(:,:) :: nbd 31 REAL , POINTER, DIMENSION(:) :: flagu 32 REAL , POINTER, DIMENSION(:) :: flagv 31 REAL , POINTER, DIMENSION(:,:) :: nbdout 32 REAL , POINTER, DIMENSION(:,:) :: flagu 33 REAL , POINTER, DIMENSION(:,:) :: flagv 33 34 END TYPE OBC_INDEX 34 35 … … 63 64 INTEGER :: nn_volctl !: = 0 the total volume will have the variability of the surface Flux E-P 64 65 ! ! = 1 the volume will be constant during all the integration. 65 INTEGER, DIMENSION(jp_bdy) :: nn_dyn2d! Choice of boundary condition for barotropic variables (U,V,SSH)66 INTEGER, DIMENSION(jp_bdy) :: nn_dyn2d_dta!: = 0 use the initial state as bdy dta ;66 CHARACTER(len=20), DIMENSION(jp_bdy) :: cn_dyn2d ! Choice of boundary condition for barotropic variables (U,V,SSH) 67 INTEGER, DIMENSION(jp_bdy) :: nn_dyn2d_dta !: = 0 use the initial state as bdy dta ; 67 68 !: = 1 read it in a NetCDF file 68 69 !: = 2 read tidal harmonic forcing from a NetCDF file 69 70 !: = 3 read external data AND tidal harmonic forcing from NetCDF files 70 INTEGER, DIMENSION(jp_bdy) :: nn_dyn3d! Choice of boundary condition for baroclinic velocities71 INTEGER, DIMENSION(jp_bdy) :: nn_dyn3d_dta!: = 0 use the initial state as bdy dta ;71 CHARACTER(len=20), DIMENSION(jp_bdy) :: cn_dyn3d ! Choice of boundary condition for baroclinic velocities 72 INTEGER, DIMENSION(jp_bdy) :: nn_dyn3d_dta !: = 0 use the initial state as bdy dta ; 72 73 !: = 1 read it in a NetCDF file 73 INTEGER, DIMENSION(jp_bdy) :: nn_tra! Choice of boundary condition for active tracers (T and S)74 INTEGER, DIMENSION(jp_bdy) :: nn_tra_dta!: = 0 use the initial state as bdy dta ;74 CHARACTER(len=20), DIMENSION(jp_bdy) :: cn_tra ! Choice of boundary condition for active tracers (T and S) 75 INTEGER, DIMENSION(jp_bdy) :: nn_tra_dta !: = 0 use the initial state as bdy dta ; 75 76 !: = 1 read it in a NetCDF file 76 77 LOGICAL, DIMENSION(jp_bdy) :: ln_tra_dmp !: =T Tracer damping 77 78 LOGICAL, DIMENSION(jp_bdy) :: ln_dyn3d_dmp !: =T Baroclinic velocity damping 78 79 REAL, DIMENSION(jp_bdy) :: rn_time_dmp !: Damping time scale in days 80 REAL, DIMENSION(jp_bdy) :: rn_time_dmp_out !: Damping time scale in days at radiation outflow points 79 81 80 82 #if defined key_lim2 81 INTEGER, DIMENSION(jp_bdy) :: nn_ice_lim2! Choice of boundary condition for sea ice variables82 INTEGER, DIMENSION(jp_bdy) :: nn_ice_lim2_dta!: = 0 use the initial state as bdy dta ;83 !: = 1 read it in a NetCDF file83 CHARACTER(len=20), DIMENSION(jp_bdy) :: nn_ice_lim2 ! Choice of boundary condition for sea ice variables 84 INTEGER, DIMENSION(jp_bdy) :: nn_ice_lim2_dta !: = 0 use the initial state as bdy dta ; 85 !: = 1 read it in a NetCDF file 84 86 #endif 85 87 ! … … 94 96 REAL(wp) :: bdysurftot !: Lateral surface of unstructured open boundary 95 97 96 REAL(wp), POINTER, DIMENSION(:,:) :: pssh !:97 REAL(wp), POINTER, DIMENSION(:,:) :: phur !:98 REAL(wp), POINTER, DIMENSION(:,:) :: phvr !: Pointers for barotropic fields99 REAL(wp), POINTER, DIMENSION(:,:) :: pu 2d!:100 REAL(wp), POINTER, DIMENSION(:,:) :: pv 2d!:98 REAL(wp), POINTER, DIMENSION(:,:) :: pssh !: 99 REAL(wp), POINTER, DIMENSION(:,:) :: phur !: 100 REAL(wp), POINTER, DIMENSION(:,:) :: phvr !: Pointers for barotropic fields 101 REAL(wp), POINTER, DIMENSION(:,:) :: pub2d, pua2d !: 102 REAL(wp), POINTER, DIMENSION(:,:) :: pvb2d, pva2d !: 101 103 102 104 !!---------------------------------------------------------------------- -
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_par.F90
r3294 r3900 26 26 INTEGER, PUBLIC, PARAMETER :: jpbgrd = 3 !: Number of horizontal grid types used (T, U, V) 27 27 28 !! Flags for choice of schemes29 INTEGER, PUBLIC, PARAMETER :: jp_none = 0 !: Flag for no open boundary condition30 INTEGER, PUBLIC, PARAMETER :: jp_frs = 1 !: Flag for Flow Relaxation Scheme31 INTEGER, PUBLIC, PARAMETER :: jp_flather = 2 !: Flag for Flather32 28 #else 33 29 !!---------------------------------------------------------------------- -
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90
r3851 r3900 108 108 nblenrim => idx_bdy(ib_bdy)%nblenrim 109 109 110 IF( nn_dyn2d(ib_bdy) .gt. 0.and. nn_dyn2d_dta(ib_bdy) .eq. 0 ) THEN110 IF( cn_dyn2d(ib_bdy) /= 'none' .and. nn_dyn2d_dta(ib_bdy) .eq. 0 ) THEN 111 111 ilen1(:) = nblen(:) 112 112 igrd = 1 … … 130 130 ENDIF 131 131 132 IF( nn_dyn3d(ib_bdy) .gt. 0.and. nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN132 IF( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN 133 133 ilen1(:) = nblen(:) 134 134 igrd = 2 … … 150 150 ENDIF 151 151 152 IF( nn_tra(ib_bdy) .gt. 0.and. nn_tra_dta(ib_bdy) .eq. 0 ) THEN152 IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) .eq. 0 ) THEN 153 153 ilen1(:) = nblen(:) 154 154 igrd = 1 ! Everything is at T-points here … … 193 193 ! Update barotropic boundary conditions only 194 194 ! jit is optional argument for fld_read and bdytide_update 195 IF( nn_dyn2d(ib_bdy) .gt. 0) THEN195 IF( cn_dyn2d(ib_bdy) /= 'none' ) THEN 196 196 IF( nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 197 197 dta_bdy(ib_bdy)%ssh(:) = 0.0 … … 199 199 dta_bdy(ib_bdy)%v2d(:) = 0.0 200 200 ENDIF 201 IF ( nn_tra(ib_bdy).ne.4) THEN201 IF (cn_tra(ib_bdy) /= 'runoff') THEN 202 202 IF( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR. & 203 203 & (ln_full_vel_array(ib_bdy) .AND. nn_dyn3d_dta(ib_bdy).eq.1) )THEN … … 205 205 ! For the runoff case, no need to update the forcing (already done in the baroclinic part) 206 206 jend = nb_bdy_fld(ib_bdy) 207 IF ( nn_tra(ib_bdy) .GT. 0.AND. nn_tra_dta(ib_bdy) .GE. 1 ) jend = jend - 2207 IF ( cn_tra(ib_bdy) /= 'none' .AND. nn_tra_dta(ib_bdy) .GE. 1 ) jend = jend - 2 208 208 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend), & 209 & kit=jit, kt_offset=time_offset )210 IF ( nn_tra(ib_bdy) .GT. 0.AND. nn_tra_dta(ib_bdy) .GE. 1 ) jend = jend + 2209 & jit=jit, time_offset=time_offset ) 210 IF ( cn_tra(ib_bdy) /= 'none' .AND. nn_tra_dta(ib_bdy) .GE. 1 ) jend = jend + 2 211 211 212 212 ! If full velocities in boundary data then split into barotropic and baroclinic data … … 252 252 ENDIF 253 253 ELSE 254 IF ( nn_tra(ib_bdy).eq.4) then ! runoff condition254 IF (cn_tra(ib_bdy) == 'runoff') then ! runoff condition 255 255 jend = nb_bdy_fld(ib_bdy) 256 256 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 257 & map=nbmap_ptr(jstart:jend), kt_offset=time_offset )257 & map=nbmap_ptr(jstart:jend), time_offset=time_offset ) 258 258 ! 259 259 igrd = 2 ! zonal velocity … … 271 271 END DO 272 272 ELSE 273 IF( nn_dyn2d(ib_bdy) .gt. 0.and. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays273 IF( cn_dyn2d(ib_bdy) /= 'none' .and. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 274 274 dta_bdy(ib_bdy)%ssh(:) = 0.0 275 275 dta_bdy(ib_bdy)%u2d(:) = 0.0 … … 279 279 jend = nb_bdy_fld(ib_bdy) 280 280 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 281 & map=nbmap_ptr(jstart:jend), kt_offset=time_offset )281 & map=nbmap_ptr(jstart:jend), time_offset=time_offset ) 282 282 ENDIF 283 283 ! If full velocities in boundary data then split into barotropic and baroclinic data … … 314 314 END DO 315 315 ENDIF 316 IF( nn_dyn2d(ib_bdy) .gt. 0.and. nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing316 IF( cn_dyn2d(ib_bdy) /= 'none' .and. nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 317 317 CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), & 318 318 & td=tides(ib_bdy), time_offset=time_offset ) … … 326 326 IF ( ln_apr_obc ) THEN 327 327 DO ib_bdy = 1, nb_bdy 328 IF ( nn_tra(ib_bdy).NE.4)THEN328 IF (cn_tra(ib_bdy) /= 'runoff')THEN 329 329 igrd = 1 ! meridional velocity 330 330 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) … … 403 403 nb_bdy_fld(:) = 0 404 404 DO ib_bdy = 1, nb_bdy 405 IF( nn_dyn2d(ib_bdy) .gt. 0.and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN405 IF( cn_dyn2d(ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN 406 406 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 407 407 ENDIF 408 IF( nn_dyn3d(ib_bdy) .gt. 0.and. nn_dyn3d_dta(ib_bdy) .eq. 1 ) THEN408 IF( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) .eq. 1 ) THEN 409 409 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 410 410 ENDIF 411 IF( nn_tra(ib_bdy) .gt. 0.and. nn_tra_dta(ib_bdy) .eq. 1 ) THEN411 IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) .eq. 1 ) THEN 412 412 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 413 413 ENDIF … … 474 474 ! Only read in necessary fields for this set. 475 475 ! Important that barotropic variables come first. 476 IF( nn_dyn2d(ib_bdy) .gt. 0.and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN477 478 IF( nn_tra(ib_bdy) .ne. 4) THEN ! runoff condition : no ssh reading476 IF( cn_dyn2d(ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN 477 478 IF( cn_tra(ib_bdy) /= 'runoff' ) THEN ! runoff condition : no ssh reading 479 479 jfld = jfld + 1 480 480 blf_i(jfld) = bn_ssh … … 504 504 505 505 ! baroclinic velocities 506 IF( ( nn_dyn3d(ib_bdy) .gt. 0.and. nn_dyn3d_dta(ib_bdy) .eq. 1 ) .or. &507 & ( ln_full_vel_array(ib_bdy) .and. nn_dyn2d(ib_bdy) .gt. 0.and. &506 IF( ( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) .eq. 1 ) .or. & 507 & ( ln_full_vel_array(ib_bdy) .and. cn_dyn2d(ib_bdy) /= 'none' .and. & 508 508 & ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) ) THEN 509 509 … … 525 525 526 526 ! temperature and salinity 527 IF( nn_tra(ib_bdy) .gt. 0.and. nn_tra_dta(ib_bdy) .eq. 1 ) THEN527 IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) .eq. 1 ) THEN 528 528 529 529 jfld = jfld + 1 … … 611 611 nblenrim => idx_bdy(ib_bdy)%nblenrim 612 612 613 IF ( nn_dyn2d(ib_bdy) .gt. 0) THEN613 IF (cn_dyn2d(ib_bdy) /= 'none') THEN 614 614 IF( nn_dyn2d_dta(ib_bdy) .eq. 0 .or. nn_dyn2d_dta(ib_bdy) .eq. 2 .or. ln_full_vel_array(ib_bdy) ) THEN 615 615 ilen0(1:3) = nblen(1:3) … … 623 623 ENDIF 624 624 ELSE 625 IF( nn_dyn2d(ib_bdy) .ne. jp_frs) THEN625 IF( cn_dyn2d(ib_bdy) /= 'frs' ) THEN 626 626 jfld = jfld + 1 627 627 dta_bdy(ib_bdy)%ssh => bf(jfld)%fnow(:,1,1) … … 634 634 ENDIF 635 635 636 IF ( nn_dyn3d(ib_bdy) .gt. 0.and. nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN636 IF ( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN 637 637 ilen0(1:3) = nblen(1:3) 638 638 ALLOCATE( dta_bdy(ib_bdy)%u3d(ilen0(2),jpk) ) 639 639 ALLOCATE( dta_bdy(ib_bdy)%v3d(ilen0(3),jpk) ) 640 640 ENDIF 641 IF ( ( nn_dyn3d(ib_bdy) .gt. 0.and. nn_dyn3d_dta(ib_bdy) .eq. 1 ).or. &642 & ( ln_full_vel_array(ib_bdy) .and. nn_dyn2d(ib_bdy) .gt. 0.and. &641 IF ( ( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) .eq. 1 ).or. & 642 & ( ln_full_vel_array(ib_bdy) .and. cn_dyn2d(ib_bdy) /= 'none' .and. & 643 643 & ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) ) THEN 644 644 jfld = jfld + 1 … … 648 648 ENDIF 649 649 650 IF ( nn_tra(ib_bdy) .gt. 0) THEN650 IF (cn_tra(ib_bdy) /= 'none') THEN 651 651 IF( nn_tra_dta(ib_bdy) .eq. 0 ) THEN 652 652 ilen0(1:3) = nblen(1:3) -
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn.F90
r3294 r3900 76 76 phur => hur 77 77 phvr => hvr 78 CALL wrk_alloc(jpi,jpj,pu2d,pv2d) 78 CALL wrk_alloc(jpi,jpj,pua2d,pva2d) 79 IF ( nn_dyn2d == 3 .or. nn_dyn3d == 3 ) CALL wrk_alloc(jpi,jpj,pub2d,pvb2d) 79 80 80 81 !------------------------------------------------------- … … 82 83 !------------------------------------------------------- 83 84 84 pu2d(:,:) = 0.e0 85 pv2d(:,:) = 0.e0 85 ! "After" velocities: 86 87 pua2d(:,:) = 0.e0 88 pva2d(:,:) = 0.e0 86 89 DO jk = 1, jpkm1 !! Vertically integrated momentum trends 87 pu 2d(:,:) = pu2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk)88 pv 2d(:,:) = pv2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk)90 pua2d(:,:) = pua2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 91 pva2d(:,:) = pva2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 89 92 END DO 90 pu 2d(:,:) = pu2d(:,:) * phur(:,:)91 pv 2d(:,:) = pv2d(:,:) * phvr(:,:)93 pua2d(:,:) = pua2d(:,:) * phur(:,:) 94 pva2d(:,:) = pva2d(:,:) * phvr(:,:) 92 95 DO jk = 1 , jpkm1 93 ua(:,:,jk) = ua(:,:,jk) - pu 2d(:,:)94 va(:,:,jk) = va(:,:,jk) - pv 2d(:,:)96 ua(:,:,jk) = ua(:,:,jk) - pua2d(:,:) 97 va(:,:,jk) = va(:,:,jk) - pva2d(:,:) 95 98 END DO 99 100 ! "Before" velocities (required for Orlanski condition): 101 102 IF ( nn_dyn2d == 3 .or. nn_dyn3d == 3 ) THEN 103 pub2d(:,:) = 0.e0 104 pvb2d(:,:) = 0.e0 105 DO jk = 1, jpkm1 !! Vertically integrated momentum trends 106 pub2d(:,:) = pub2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ub(:,:,jk) 107 pvb2d(:,:) = pvb2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * vb(:,:,jk) 108 END DO 109 pub2d(:,:) = pub2d(:,:) * phur(:,:) 110 pvb2d(:,:) = pvb2d(:,:) * phvr(:,:) 111 DO jk = 1 , jpkm1 112 ub(:,:,jk) = ub(:,:,jk) - pub2d(:,:) 113 vb(:,:,jk) = vb(:,:,jk) - pvb2d(:,:) 114 END DO 115 END IF 96 116 97 117 !------------------------------------------------------- … … 109 129 110 130 DO jk = 1 , jpkm1 111 ua(:,:,jk) = ( ua(:,:,jk) + pu 2d(:,:) ) * umask(:,:,jk)112 va(:,:,jk) = ( va(:,:,jk) + pv 2d(:,:) ) * vmask(:,:,jk)131 ua(:,:,jk) = ( ua(:,:,jk) + pua2d(:,:) ) * umask(:,:,jk) 132 va(:,:,jk) = ( va(:,:,jk) + pva2d(:,:) ) * vmask(:,:,jk) 113 133 END DO 134 135 IF ( nn_dyn2d == 3 .or. nn_dyn3d == 3 ) THEN 136 DO jk = 1 , jpkm1 137 ub(:,:,jk) = ( ub(:,:,jk) + pub2d(:,:) ) * umask(:,:,jk) 138 vb(:,:,jk) = ( vb(:,:,jk) + pvb2d(:,:) ) * vmask(:,:,jk) 139 END DO 140 END IF 114 141 115 142 CALL wrk_dealloc(jpi,jpj,pu2d,pv2d) -
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90
r3680 r3900 18 18 USE dom_oce ! ocean space and time domain 19 19 USE bdy_oce ! ocean open boundary conditions 20 USE bdylib ! BDY library routines 20 21 USE dynspg_oce ! for barotropic variables 21 22 USE phycst ! physical constants … … 48 49 DO ib_bdy=1, nb_bdy 49 50 50 SELECT CASE( nn_dyn2d(ib_bdy) )51 CASE( jp_none)51 SELECT CASE( cn_dyn2d(ib_bdy) ) 52 CASE('none') 52 53 CYCLE 53 CASE( jp_frs)54 CASE('frs') 54 55 CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 55 CASE( jp_flather)56 CASE('flather') 56 57 CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 58 CASE('orlanski') 59 CALL bdy_dyn2d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 57 60 CASE DEFAULT 58 61 CALL ctl_stop( 'bdy_dyn2d : unrecognised option for open boundaries for barotropic variables' ) … … 186 189 ! 187 190 END SUBROUTINE bdy_dyn2d_fla 191 192 193 SUBROUTINE bdy_dyn2d_orlanski( idx, dta, ib_bdy ) 194 !!---------------------------------------------------------------------- 195 !! *** SUBROUTINE bdy_dyn2d_orlanski *** 196 !! 197 !! - Apply Orlanski radiation condition adaptively: 198 !! - radiation plus weak nudging at outflow points 199 !! - no radiation and strong nudging at inflow points 200 !! 201 !! 202 !! References: Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001) 203 !!---------------------------------------------------------------------- 204 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 205 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 206 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 207 208 INTEGER :: jb, igrd ! dummy loop indices 209 !!---------------------------------------------------------------------- 210 211 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn2d_orlanski') 212 ! 213 igrd = 2 ! Orlanski bc on u-velocity; 214 ! 215 CALL bdy_orlanski_2d( idx, igrd, pub2d, pua2d, dta%u2d ) 216 217 igrd = 3 ! Orlanski bc on v-velocity 218 ! 219 CALL bdy_orlanski_2d( idx, igrd, pvb2d, pva2d, dta%v2d ) 220 ! 221 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_orlanski') 222 ! 223 224 END SUBROUTINE bdy_dyn2d_orlanski 225 226 188 227 #else 189 228 !!---------------------------------------------------------------------- -
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90
r3703 r3900 52 52 DO ib_bdy=1, nb_bdy 53 53 54 !!$ IF ( using Orlanski radiation conditions ) THEN 55 !!$ CALL bdy_rad( kt, bdyidx(ib_bdy) ) 56 !!$ ENDIF 57 58 SELECT CASE( nn_dyn3d(ib_bdy) ) 59 CASE(jp_none) 54 SELECT CASE( cn_dyn3d(ib_bdy) ) 55 CASE('none') 60 56 CYCLE 61 CASE( jp_frs)57 CASE('frs') 62 58 CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 63 CASE( 2)59 CASE('specified') 64 60 CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 65 CASE( 3)61 CASE('zero') 66 62 CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 67 63 CASE DEFAULT -
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdyice_lim2.F90
r3680 r3900 50 50 DO ib_bdy=1, nb_bdy 51 51 52 SELECT CASE( nn_ice_lim2(ib_bdy) )53 CASE( jp_none)52 SELECT CASE( cn_ice_lim2(ib_bdy) ) 53 CASE('none') 54 54 CYCLE 55 CASE( jp_frs)55 CASE('frs') 56 56 CALL bdy_ice_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 57 57 CASE DEFAULT -
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90
r3703 r3900 80 80 INTEGER :: ib_bdy1, ib_bdy2, ib1, ib2 ! - - 81 81 INTEGER, POINTER :: nbi, nbj, nbr ! short cuts 82 REAL , POINTER :: flagu, flagv ! - - 82 REAL(wp), POINTER :: flagu, flagv ! - - 83 REAL(wp), POINTER, DIMENSION(:,:) :: mask ! pointer to 2D mask fields 83 84 REAL(wp) :: zefl, zwfl, znfl, zsfl ! local scalars 84 85 INTEGER, DIMENSION (2) :: kdimsz … … 93 94 !! 94 95 NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file, & 95 & ln_mask_file, cn_mask_file, nn_dyn2d, nn_dyn2d_dta, &96 & nn_dyn3d, nn_dyn3d_dta, nn_tra, nn_tra_dta, &96 & ln_mask_file, cn_mask_file, cn_dyn2d, nn_dyn2d_dta, & 97 & cn_dyn3d, nn_dyn3d_dta, cn_tra, nn_tra_dta, & 97 98 & ln_tra_dmp, ln_dyn3d_dmp, rn_time_dmp, & 98 99 #if defined key_lim2 99 & nn_ice_lim2, nn_ice_lim2_dta, &100 & cn_ice_lim2, nn_ice_lim2_dta, & 100 101 #endif 101 102 & ln_vol, nn_volctl, nn_rimwidth … … 128 129 ln_mask_file = .false. 129 130 cn_mask_file(:) = '' 130 nn_dyn2d(:) = 0131 cn_dyn2d(:) = '' 131 132 nn_dyn2d_dta(:) = -1 ! uninitialised flag 132 nn_dyn3d(:) = 0133 cn_dyn3d(:) = '' 133 134 nn_dyn3d_dta(:) = -1 ! uninitialised flag 134 nn_tra(:) = 0135 cn_tra(:) = '' 135 136 nn_tra_dta(:) = -1 ! uninitialised flag 136 137 ln_tra_dmp(:) = .false. … … 138 139 rn_time_dmp(:) = 1. 139 140 #if defined key_lim2 140 nn_ice_lim2(:) = 0141 cn_ice_lim2(:) = '' 141 142 nn_ice_lim2_dta(:)= -1 ! uninitialised flag 142 143 #endif … … 172 173 173 174 IF(lwp) WRITE(numout,*) 'Boundary conditions for barotropic solution: ' 174 SELECT CASE( nn_dyn2d(ib_bdy) ) 175 CASE(jp_none) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 176 CASE(jp_frs) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 177 CASE(jp_flather) ; IF(lwp) WRITE(numout,*) ' Flather radiation condition' 178 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_dyn2d' ) 175 SELECT CASE( cn_dyn2d(ib_bdy) ) 176 CASE('none') ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 177 CASE('frs') ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 178 CASE('flather') ; IF(lwp) WRITE(numout,*) ' Flather radiation condition' 179 CASE('orlanski') ; IF(lwp) WRITE(numout,*) ' NPO Orlanski radiation condition with adaptive nudging' 180 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for cn_dyn2d' ) 179 181 END SELECT 180 IF( nn_dyn2d(ib_bdy) .gt. 0) THEN182 IF( cn_dyn2d(ib_bdy) /= 'none' ) THEN 181 183 SELECT CASE( nn_dyn2d_dta(ib_bdy) ) ! 182 184 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' initial state used for bdy data' … … 193 195 194 196 IF(lwp) WRITE(numout,*) 'Boundary conditions for baroclinic velocities: ' 195 SELECT CASE( nn_dyn3d(ib_bdy) ) 196 CASE(jp_none) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 197 CASE(jp_frs) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 198 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Specified value' 199 CASE( 3 ) ; IF(lwp) WRITE(numout,*) ' Zero baroclinic velocities (runoff case)' 200 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_dyn3d' ) 197 SELECT CASE( cn_dyn3d(ib_bdy) ) 198 CASE('none') ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 199 CASE('frs') ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 200 CASE('specified') ; IF(lwp) WRITE(numout,*) ' Specified value' 201 CASE('zero') ; IF(lwp) WRITE(numout,*) ' Zero baroclinic velocities (runoff case)' 202 CASE('orlanski') ; IF(lwp) WRITE(numout,*) ' NPO Orlanski radiation condition with adaptive nudging' 203 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for cn_dyn3d' ) 201 204 END SELECT 202 IF( nn_dyn3d(ib_bdy) .gt. 0) THEN205 IF( cn_dyn3d(ib_bdy) /= 'none' ) THEN 203 206 SELECT CASE( nn_dyn3d_dta(ib_bdy) ) ! 204 207 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' initial state used for bdy data' … … 209 212 210 213 IF ( ln_dyn3d_dmp(ib_bdy) ) THEN 211 IF ( nn_dyn3d(ib_bdy).EQ.0) THEN214 IF ( cn_dyn3d(ib_bdy) == 'none' ) THEN 212 215 IF(lwp) WRITE(numout,*) 'No open boundary condition for baroclinic velocities: ln_dyn3d_dmp is set to .false.' 213 216 ln_dyn3d_dmp(ib_bdy)=.false. 214 ELSEIF ( nn_dyn3d(ib_bdy).EQ.1) THEN217 ELSEIF ( cn_dyn3d(ib_bdy) == 'frs' ) THEN 215 218 CALL ctl_stop( 'Use FRS OR relaxation' ) 216 219 ELSE … … 225 228 226 229 IF(lwp) WRITE(numout,*) 'Boundary conditions for temperature and salinity: ' 227 SELECT CASE( nn_tra(ib_bdy) ) 228 CASE(jp_none) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 229 CASE(jp_frs) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 230 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Specified value' 231 CASE( 3 ) ; IF(lwp) WRITE(numout,*) ' Neumann conditions' 232 CASE( 4 ) ; IF(lwp) WRITE(numout,*) ' Runoff conditions : Neumann for T and specified to 0.1 for salinity' 233 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_tra' ) 230 SELECT CASE( cn_tra(ib_bdy) ) 231 CASE('none') ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 232 CASE('frs') ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 233 CASE('specified') ; IF(lwp) WRITE(numout,*) ' Specified value' 234 CASE('neumann') ; IF(lwp) WRITE(numout,*) ' Neumann conditions' 235 CASE('runoff') ; IF(lwp) WRITE(numout,*) ' Runoff conditions : Neumann for T and specified to 0.1 for salinity' 236 CASE('orlanski') ; IF(lwp) WRITE(numout,*) ' NPO Orlanski radiation condition with adaptive nudging' 237 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for cn_tra' ) 234 238 END SELECT 235 IF( nn_tra(ib_bdy) .gt. 0) THEN239 IF( cn_tra(ib_bdy) /= 'none' ) THEN 236 240 SELECT CASE( nn_tra_dta(ib_bdy) ) ! 237 241 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' initial state used for bdy data' … … 242 246 243 247 IF ( ln_tra_dmp(ib_bdy) ) THEN 244 IF ( nn_tra(ib_bdy).EQ.0) THEN248 IF ( cn_tra(ib_bdy) == 'none' ) THEN 245 249 IF(lwp) WRITE(numout,*) 'No open boundary condition for tracers: ln_tra_dmp is set to .false.' 246 250 ln_tra_dmp(ib_bdy)=.false. 247 ELSEIF ( nn_tra(ib_bdy).EQ.1) THEN251 ELSEIF ( cn_tra(ib_bdy) == 'frs' ) THEN 248 252 CALL ctl_stop( 'Use FRS OR relaxation' ) 249 253 ELSE … … 259 263 #if defined key_lim2 260 264 IF(lwp) WRITE(numout,*) 'Boundary conditions for sea ice: ' 261 SELECT CASE( nn_ice_lim2(ib_bdy) )262 CASE( 0 ); IF(lwp) WRITE(numout,*) ' no open boundary condition'263 CASE( 1 ); IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme'264 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_tra' )265 SELECT CASE( cn_ice_lim2(ib_bdy) ) 266 CASE('none') ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 267 CASE('frs') ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 268 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for cn_ice_lim2' ) 265 269 END SELECT 266 IF( nn_ice_lim2(ib_bdy) .gt. 0) THEN270 IF( cn_ice_lim2(ib_bdy) /= 'none' ) THEN 267 271 SELECT CASE( nn_ice_lim2_dta(ib_bdy) ) ! 268 272 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' initial state used for bdy data' … … 772 776 ALLOCATE( idx_bdy(ib_bdy)%nbmap(ilen1,jpbgrd) ) 773 777 ALLOCATE( idx_bdy(ib_bdy)%nbw(ilen1,jpbgrd) ) 774 ALLOCATE( idx_bdy(ib_bdy)%flagu(ilen1 ) )775 ALLOCATE( idx_bdy(ib_bdy)%flagv(ilen1 ) )778 ALLOCATE( idx_bdy(ib_bdy)%flagu(ilen1,jpbgrd) ) 779 ALLOCATE( idx_bdy(ib_bdy)%flagv(ilen1,jpbgrd) ) 776 780 777 781 ! Dispatch mapping indices and discrete distances on each processor … … 995 999 idx_bdy(ib_bdy)%nbd(ib,igrd) = 1. / ( rn_time_dmp(ib_bdy) * rday ) & 996 1000 & *(FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2. ! quadratic 1001 idx_bdy(ib_bdy)%nbdout(ib,igrd) = 1. / ( rn_time_dmp_out(ib_bdy) * rday ) & 1002 & *(FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2. ! quadratic 997 1003 END DO 998 1004 END DO … … 1053 1059 1054 1060 bdytmask(:,:) = tmask(:,:,1) 1061 bdyumask(:,:) = umask(:,:,1) 1062 bdyvmask(:,:) = vmask(:,:,1) 1055 1063 1056 1064 ! bdy masks and bmask are now set to zero on boundary points: … … 1089 1097 DO ib_bdy = 1, nb_bdy ! Indices and directions of rim velocity components 1090 1098 1091 idx_bdy(ib_bdy)%flagu(: ) = 0.e01092 idx_bdy(ib_bdy)%flagv(: ) = 0.e01099 idx_bdy(ib_bdy)%flagu(:,:) = 0.e0 1100 idx_bdy(ib_bdy)%flagv(:,:) = 0.e0 1093 1101 icount = 0 1094 1102 1095 !flagu = -1 : u component is normal to the dynamical boundary but its direction is outward 1096 !flagu = 0 : u is tangential 1097 !flagu = 1 : u is normal to the boundary and is direction is inward 1103 ! Calculate relationship of U direction to the local orientation of the boundary 1104 ! flagu = -1 : u component is normal to the dynamical boundary but its direction is outward 1105 ! flagu = 0 : u is tangential 1106 ! flagu = 1 : u is normal to the boundary and is direction is inward 1098 1107 1099 igrd = 2 ! u-component 1100 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1101 nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 1102 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1103 zefl = bdytmask(nbi ,nbj) 1104 zwfl = bdytmask(nbi+1,nbj) 1105 IF( zefl + zwfl == 2 ) THEN 1106 icount = icount + 1 1107 ELSE 1108 idx_bdy(ib_bdy)%flagu(ib)=-zefl+zwfl 1109 ENDIF 1108 DO igrd = 1,jpbgrd 1109 SELECT CASE( igrd ) 1110 CASE( 1 ) ; mask => umask 1111 CASE( 2 ) ; mask => bdytmask 1112 CASE( 3 ) ; mask => fmask 1113 END SELECT 1114 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1115 nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 1116 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1117 zefl = mask(nbi ,nbj) 1118 zwfl = mask(nbi+1,nbj) 1119 IF( zefl + zwfl == 2 ) THEN 1120 icount = icount + 1 1121 ELSE 1122 idx_bdy(ib_bdy)%flagu(ib,igrd)=-zefl+zwfl 1123 ENDIF 1124 END DO 1110 1125 END DO 1111 1126 1112 !flagv = -1 : u component is normal to the dynamical boundary but its direction is outward 1113 !flagv = 0 : u is tangential 1114 !flagv = 1 : u is normal to the boundary and is direction is inward 1115 1116 igrd = 3 ! v-component 1117 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1118 nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 1119 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1120 znfl = bdytmask(nbi,nbj ) 1121 zsfl = bdytmask(nbi,nbj+1) 1122 IF( znfl + zsfl == 2 ) THEN 1123 icount = icount + 1 1124 ELSE 1125 idx_bdy(ib_bdy)%flagv(ib) = -znfl + zsfl 1126 END IF 1127 ! Calculate relationship of V direction to the local orientation of the boundary 1128 ! flagv = -1 : u component is normal to the dynamical boundary but its direction is outward 1129 ! flagv = 0 : u is tangential 1130 ! flagv = 1 : u is normal to the boundary and is direction is inward 1131 1132 DO igrd = 1,jpbgrd 1133 SELECT CASE( igrd ) 1134 CASE( 1 ) ; mask => vmask 1135 CASE( 2 ) ; mask => bdytmask 1136 CASE( 3 ) ; mask => fmask 1137 END SELECT 1138 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1139 nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 1140 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1141 znfl = bdytmask(nbi,nbj ) 1142 zsfl = bdytmask(nbi,nbj+1) 1143 IF( znfl + zsfl == 2 ) THEN 1144 icount = icount + 1 1145 ELSE 1146 idx_bdy(ib_bdy)%flagv(ib) = -znfl + zsfl 1147 END IF 1148 END DO 1127 1149 END DO 1128 1150 … … 1571 1593 itest = 0 1572 1594 1573 IF ( nn_dyn2d(ib1)/=nn_dyn2d(ib2)) itest = itest + 11574 IF ( nn_dyn3d(ib1)/=nn_dyn3d(ib2)) itest = itest + 11575 IF ( nn_tra(ib1)/=nn_tra(ib2)) itest = itest + 11595 IF (cn_dyn2d(ib1)/=cn_dyn2d(ib2)) itest = itest + 1 1596 IF (cn_dyn3d(ib1)/=cn_dyn3d(ib2)) itest = itest + 1 1597 IF (cn_tra(ib1)/=cn_tra(ib2)) itest = itest + 1 1576 1598 ! 1577 1599 IF (nn_dyn2d_dta(ib1)/=nn_dyn2d_dta(ib2)) itest = itest + 1 -
branches/2013/dev_r3891_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdytra.F90
r3777 r3900 51 51 DO ib_bdy=1, nb_bdy 52 52 53 SELECT CASE( nn_tra(ib_bdy) )54 CASE( jp_none)53 SELECT CASE( cn_tra(ib_bdy) ) 54 CASE('none') 55 55 CYCLE 56 CASE( jp_frs)56 CASE('frs') 57 57 CALL bdy_tra_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 58 CASE( 2)58 CASE('specified') 59 59 CALL bdy_tra_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 60 CASE( 3)60 CASE('neumann') 61 61 CALL bdy_tra_nmn( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 62 CASE( 4)62 CASE('runoff') 63 63 CALL bdy_tra_rnf( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 64 64 CASE DEFAULT
Note: See TracChangeset
for help on using the changeset viewer.