Changeset 10473 for branches/UKMO/AMM15_v3_6_STABLE_package_collate_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
- Timestamp:
- 2019-01-08T18:02:36+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/AMM15_v3_6_STABLE_package_collate_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
r10396 r10473 23 23 USE sbcapr 24 24 USE sbcdcy ! surface boundary condition: diurnal cycle 25 USE sbcwave ! surface boundary condition: waves 25 26 USE phycst ! physical constants 26 27 #if defined key_lim3 … … 108 109 INTEGER, PARAMETER :: jpr_e3t1st = 41 ! first T level thickness 109 110 INTEGER, PARAMETER :: jpr_fraqsr = 42 ! fraction of solar net radiation absorbed in the first ocean level 110 INTEGER, PARAMETER :: jprcv = 42 ! total number of fields received 111 INTEGER, PARAMETER :: jpr_mslp = 43 ! mean sea level pressure 112 INTEGER, PARAMETER :: jpr_hsig = 44 ! Hsig 113 INTEGER, PARAMETER :: jpr_phioc = 45 ! Wave=>ocean energy flux 114 INTEGER, PARAMETER :: jpr_sdrftx = 46 ! Stokes drift on grid 1 115 INTEGER, PARAMETER :: jpr_sdrfty = 47 ! Stokes drift on grid 2 116 INTEGER, PARAMETER :: jpr_wper = 48 ! Mean wave period 117 INTEGER, PARAMETER :: jpr_wnum = 49 ! Mean wavenumber 118 INTEGER, PARAMETER :: jpr_wstrf = 50 ! Stress fraction adsorbed by waves 119 INTEGER, PARAMETER :: jpr_wdrag = 51 ! Neutral surface drag coefficient 120 INTEGER, PARAMETER :: jprcv = 51 ! total number of fields received 111 121 112 122 INTEGER, PARAMETER :: jps_fice = 1 ! ice fraction sent to the atmosphere … … 138 148 INTEGER, PARAMETER :: jps_e3t1st = 27 ! first level depth (vvl) 139 149 INTEGER, PARAMETER :: jps_fraqsr = 28 ! fraction of solar net radiation absorbed in the first ocean level 140 INTEGER, PARAMETER :: jpsnd = 28 ! total number of fields sended 150 INTEGER, PARAMETER :: jps_ficet = 29 ! total ice fraction 151 INTEGER, PARAMETER :: jps_ocxw = 30 ! currents on grid 1 152 INTEGER, PARAMETER :: jps_ocyw = 31 ! currents on grid 2 153 INTEGER, PARAMETER :: jps_wlev = 32 ! water level 154 INTEGER, PARAMETER :: jpsnd = 32 ! total number of fields sent 141 155 142 156 ! !!** namelist namsbc_cpl ** … … 152 166 ! Received from the atmosphere ! 153 167 TYPE(FLD_C) :: sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr, sn_rcv_qns, sn_rcv_emp, sn_rcv_rnf 154 TYPE(FLD_C) :: sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2 168 TYPE(FLD_C) :: sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp 169 ! Send to waves 170 TYPE(FLD_C) :: sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev 171 ! Received from waves 172 TYPE(FLD_C) :: sn_rcv_hsig,sn_rcv_phioc,sn_rcv_sdrfx,sn_rcv_sdrfy,sn_rcv_wper,sn_rcv_wnum,sn_rcv_wstrf,sn_rcv_wdrag 155 173 ! Other namelist parameters ! 156 174 INTEGER :: nn_cplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data … … 164 182 165 183 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: albedo_oce_mix ! ocean albedo sent to atmosphere (mix clear/overcast sky) 184 185 REAL(wp) :: rpref = 101000._wp ! reference atmospheric pressure[N/m2] 186 REAL(wp) :: r1_grau ! = 1.e0 / (grav * rau0 166 187 167 188 INTEGER , ALLOCATABLE, SAVE, DIMENSION( :) :: nrcvinfo ! OASIS info argument … … 182 203 !! *** FUNCTION sbc_cpl_alloc *** 183 204 !!---------------------------------------------------------------------- 184 INTEGER :: ierr( 3)205 INTEGER :: ierr(4) 185 206 !!---------------------------------------------------------------------- 186 207 ierr(:) = 0 … … 195 216 ALLOCATE( xcplmask(jpi,jpj,0:3) , STAT=ierr(3) ) 196 217 ! 218 IF( .NOT. ln_apr_dyn ) ALLOCATE( ssh_ib(jpi,jpj), ssh_ibb(jpi,jpj), apr(jpi, jpj), STAT=ierr(4) ) 219 197 220 sbc_cpl_alloc = MAXVAL( ierr ) 198 221 IF( lk_mpp ) CALL mpp_sum ( sbc_cpl_alloc ) … … 221 244 REAL(wp), POINTER, DIMENSION(:,:) :: zacs, zaos 222 245 !! 223 NAMELIST/namsbc_cpl/ sn_snd_temp, sn_snd_alb , sn_snd_thick, sn_snd_crt , sn_snd_co2, & 224 & sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau , sn_rcv_dqnsdt, sn_rcv_qsr, & 225 & sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal , sn_rcv_iceflx, & 226 & sn_rcv_co2 , nn_cplmodel , ln_usecplmask 246 NAMELIST/namsbc_cpl/ sn_snd_temp , sn_snd_alb , sn_snd_thick , sn_snd_crt , sn_snd_co2, & 247 & sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau , sn_rcv_dqnsdt, sn_rcv_qsr, & 248 & sn_snd_ifrac, sn_snd_crtw , sn_snd_wlev , sn_rcv_hsig , sn_rcv_phioc , & 249 & sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper , sn_rcv_wnum , sn_rcv_wstrf , & 250 & sn_rcv_wdrag, sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal , & 251 & sn_rcv_iceflx,sn_rcv_co2 , nn_cplmodel , ln_usecplmask, sn_rcv_mslp 227 252 !!--------------------------------------------------------------------- 228 253 ! … … 265 290 WRITE(numout,*)' sea ice heat fluxes = ', TRIM(sn_rcv_iceflx%cldes), ' (', TRIM(sn_rcv_iceflx%clcat), ')' 266 291 WRITE(numout,*)' atm co2 = ', TRIM(sn_rcv_co2%cldes ), ' (', TRIM(sn_rcv_co2%clcat ), ')' 292 WRITE(numout,*)' significant wave heigth = ', TRIM(sn_rcv_hsig%cldes ), ' (', TRIM(sn_rcv_hsig%clcat ), ')' 293 WRITE(numout,*)' wave to oce energy flux = ', TRIM(sn_rcv_phioc%cldes ), ' (', TRIM(sn_rcv_phioc%clcat ), ')' 294 WRITE(numout,*)' Surface Stokes drift grid u = ', TRIM(sn_rcv_sdrfx%cldes ), ' (', TRIM(sn_rcv_sdrfx%clcat ), ')' 295 WRITE(numout,*)' Surface Stokes drift grid v = ', TRIM(sn_rcv_sdrfy%cldes ), ' (', TRIM(sn_rcv_sdrfy%clcat ), ')' 296 WRITE(numout,*)' Mean wave period = ', TRIM(sn_rcv_wper%cldes ), ' (', TRIM(sn_rcv_wper%clcat ), ')' 297 WRITE(numout,*)' Mean wave number = ', TRIM(sn_rcv_wnum%cldes ), ' (', TRIM(sn_rcv_wnum%clcat ), ')' 298 WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')' 299 WRITE(numout,*)' Neutral surf drag coefficient = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')' 267 300 WRITE(numout,*)' sent fields (multiple ice categories)' 268 301 WRITE(numout,*)' surface temperature = ', TRIM(sn_snd_temp%cldes ), ' (', TRIM(sn_snd_temp%clcat ), ')' 269 302 WRITE(numout,*)' albedo = ', TRIM(sn_snd_alb%cldes ), ' (', TRIM(sn_snd_alb%clcat ), ')' 270 303 WRITE(numout,*)' ice/snow thickness = ', TRIM(sn_snd_thick%cldes ), ' (', TRIM(sn_snd_thick%clcat ), ')' 304 WRITE(numout,*)' total ice fraction = ', TRIM(sn_snd_ifrac%cldes ), ' (', TRIM(sn_snd_ifrac%clcat ), ')' 271 305 WRITE(numout,*)' surface current = ', TRIM(sn_snd_crt%cldes ), ' (', TRIM(sn_snd_crt%clcat ), ')' 272 306 WRITE(numout,*)' - referential = ', sn_snd_crt%clvref … … 274 308 WRITE(numout,*)' - mesh = ', sn_snd_crt%clvgrd 275 309 WRITE(numout,*)' oce co2 flux = ', TRIM(sn_snd_co2%cldes ), ' (', TRIM(sn_snd_co2%clcat ), ')' 310 WRITE(numout,*)' water level = ', TRIM(sn_snd_wlev%cldes ), ' (', TRIM(sn_snd_wlev%clcat ), ')' 311 WRITE(numout,*)' mean sea level pressure = ', TRIM(sn_rcv_mslp%cldes ), ' (', TRIM(sn_rcv_mslp%clcat ), ')' 312 WRITE(numout,*)' surface current to waves = ', TRIM(sn_snd_crtw%cldes ), ' (', TRIM(sn_snd_crtw%clcat ), ')' 313 WRITE(numout,*)' - referential = ', sn_snd_crtw%clvref 314 WRITE(numout,*)' - orientation = ', sn_snd_crtw%clvor 315 WRITE(numout,*)' - mesh = ', sn_snd_crtw%clvgrd 276 316 WRITE(numout,*)' nn_cplmodel = ', nn_cplmodel 277 317 WRITE(numout,*)' ln_usecplmask = ', ln_usecplmask … … 312 352 ! 313 353 ! Vectors: change of sign at north fold ONLY if on the local grid 354 IF( TRIM( sn_rcv_tau%cldes ) == 'oce only' .OR. TRIM(sn_rcv_tau%cldes ) == 'oce and ice') THEN ! avoid working with the atmospheric fields if they are not coupled 314 355 IF( TRIM( sn_rcv_tau%clvor ) == 'local grid' ) srcv(jpr_otx1:jpr_itz2)%nsgn = -1. 315 356 … … 383 424 srcv(jpr_ity1)%clgrid = 'V' ! i.e. it is always at U- & V-points for i- & j-comp. resp. 384 425 ENDIF 426 ENDIF 385 427 386 428 ! ! ------------------------- ! … … 479 521 ! ! ------------------------- ! 480 522 srcv(jpr_co2 )%clname = 'O_AtmCO2' ; IF( TRIM(sn_rcv_co2%cldes ) == 'coupled' ) srcv(jpr_co2 )%laction = .TRUE. 523 524 ! ! ------------------------- ! 525 ! ! Mean Sea Level Pressure ! 526 ! ! ------------------------- ! 527 srcv(jpr_mslp)%clname = 'O_MSLP' ; IF( TRIM(sn_rcv_mslp%cldes ) == 'coupled' ) srcv(jpr_mslp)%laction = .TRUE. 528 481 529 ! ! ------------------------- ! 482 530 ! ! topmelt and botmelt ! … … 492 540 srcv(jpr_topm:jpr_botm)%laction = .TRUE. 493 541 ENDIF 542 ! ! ------------------------- ! 543 ! ! Wave breaking ! 544 ! ! ------------------------- ! 545 srcv(jpr_hsig)%clname = 'O_Hsigwa' ! significant wave height 546 IF( TRIM(sn_rcv_hsig%cldes ) == 'coupled' ) THEN 547 srcv(jpr_hsig)%laction = .TRUE. 548 cpl_hsig = .TRUE. 549 ENDIF 550 srcv(jpr_phioc)%clname = 'O_PhiOce' ! wave to ocean energy 551 IF( TRIM(sn_rcv_phioc%cldes ) == 'coupled' ) THEN 552 srcv(jpr_phioc)%laction = .TRUE. 553 cpl_phioc = .TRUE. 554 ENDIF 555 srcv(jpr_sdrftx)%clname = 'O_Sdrfx' ! Stokes drift in the u direction 556 IF( TRIM(sn_rcv_sdrfx%cldes ) == 'coupled' ) THEN 557 srcv(jpr_sdrftx)%laction = .TRUE. 558 cpl_sdrftx = .TRUE. 559 ENDIF 560 srcv(jpr_sdrfty)%clname = 'O_Sdrfy' ! Stokes drift in the v direction 561 IF( TRIM(sn_rcv_sdrfy%cldes ) == 'coupled' ) THEN 562 srcv(jpr_sdrfty)%laction = .TRUE. 563 cpl_sdrfty = .TRUE. 564 ENDIF 565 srcv(jpr_wper)%clname = 'O_WPer' ! mean wave period 566 IF( TRIM(sn_rcv_wper%cldes ) == 'coupled' ) THEN 567 srcv(jpr_wper)%laction = .TRUE. 568 cpl_wper = .TRUE. 569 ENDIF 570 srcv(jpr_wnum)%clname = 'O_WNum' ! mean wave number 571 IF( TRIM(sn_rcv_wnum%cldes ) == 'coupled' ) THEN 572 srcv(jpr_wnum)%laction = .TRUE. 573 cpl_wnum = .TRUE. 574 ENDIF 575 srcv(jpr_wstrf)%clname = 'O_WStrf' ! stress fraction adsorbed by the wave 576 IF( TRIM(sn_rcv_wstrf%cldes ) == 'coupled' ) THEN 577 srcv(jpr_wstrf)%laction = .TRUE. 578 cpl_wstrf = .TRUE. 579 ENDIF 580 srcv(jpr_wdrag)%clname = 'O_WDrag' ! neutral surface drag coefficient 581 IF( TRIM(sn_rcv_wdrag%cldes ) == 'coupled' ) THEN 582 srcv(jpr_wdrag)%laction = .TRUE. 583 cpl_wdrag = .TRUE. 584 ENDIF 585 ! 494 586 ! ! ------------------------------- ! 495 587 ! ! OPA-SAS coupling - rcv by opa ! … … 646 738 ! ! ------------------------- ! 647 739 ssnd(jps_fice)%clname = 'OIceFrc' 740 ssnd(jps_ficet)%clname = 'OIceFrcT' 648 741 ssnd(jps_hice)%clname = 'OIceTck' 649 742 ssnd(jps_hsnw)%clname = 'OSnwTck' … … 654 747 ENDIF 655 748 749 IF (TRIM( sn_snd_ifrac%cldes ) == 'coupled') ssnd(jps_ficet)%laction = .TRUE. 750 656 751 SELECT CASE ( TRIM( sn_snd_thick%cldes ) ) 657 752 CASE( 'none' ) ! nothing to do … … 674 769 ssnd(jps_ocy1)%clname = 'O_OCury1' ; ssnd(jps_ivy1)%clname = 'O_IVely1' 675 770 ssnd(jps_ocz1)%clname = 'O_OCurz1' ; ssnd(jps_ivz1)%clname = 'O_IVelz1' 771 ssnd(jps_ocxw)%clname = 'O_OCurxw' 772 ssnd(jps_ocyw)%clname = 'O_OCuryw' 676 773 ! 677 774 ssnd(jps_ocx1:jps_ivz1)%nsgn = -1. ! vectors: change of the sign at the north fold … … 694 791 END SELECT 695 792 793 ssnd(jps_ocxw:jps_ocyw)%nsgn = -1. ! vectors: change of the sign at the north fold 794 795 IF( sn_snd_crtw%clvgrd == 'U,V' ) THEN 796 ssnd(jps_ocxw)%clgrid = 'U' ; ssnd(jps_ocyw)%clgrid = 'V' 797 ELSE IF( sn_snd_crtw%clvgrd /= 'T' ) THEN 798 CALL ctl_stop( 'sn_snd_crtw%clvgrd must be equal to T' ) 799 ENDIF 800 IF( TRIM( sn_snd_crtw%clvor ) == 'eastward-northward' ) ssnd(jps_ocxw:jps_ocyw)%nsgn = 1. 801 SELECT CASE( TRIM( sn_snd_crtw%cldes ) ) 802 CASE( 'none' ) ; ssnd(jps_ocxw:jps_ocyw)%laction = .FALSE. 803 CASE( 'oce only' ) ; ssnd(jps_ocxw:jps_ocyw)%laction = .TRUE. 804 CASE( 'weighted oce and ice' ) ! nothing to do 805 CASE( 'mixed oce-ice' ) ; ssnd(jps_ivx1:jps_ivz1)%laction = .FALSE. 806 CASE default ; CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_crtw%cldes' ) 807 END SELECT 808 696 809 ! ! ------------------------- ! 697 810 ! ! CO2 flux ! 698 811 ! ! ------------------------- ! 699 812 ssnd(jps_co2)%clname = 'O_CO2FLX' ; IF( TRIM(sn_snd_co2%cldes) == 'coupled' ) ssnd(jps_co2 )%laction = .TRUE. 813 814 ! ! ------------------------- ! 815 ! ! Sea surface height ! 816 ! ! ------------------------- ! 817 ssnd(jps_wlev)%clname = 'O_Wlevel' ; IF( TRIM(sn_snd_wlev%cldes) == 'coupled' ) ssnd(jps_wlev)%laction = .TRUE. 700 818 701 819 ! ! ------------------------------- ! … … 792 910 IF( ln_dm2dc .AND. ln_cpl .AND. ncpl_qsr_freq /= 86400 ) & 793 911 & CALL ctl_stop( 'sbc_cpl_init: diurnal cycle reconstruction (ln_dm2dc) needs daily couping for solar radiation' ) 794 ncpl_qsr_freq = 86400 / ncpl_qsr_freq912 IF( ln_dm2dc .AND. ln_cpl ) ncpl_qsr_freq = 86400 / ncpl_qsr_freq 795 913 796 914 CALL wrk_dealloc( jpi,jpj, zacs, zaos ) … … 846 964 !! emp upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 847 965 !!---------------------------------------------------------------------- 966 USE zdf_oce, ONLY : ln_zdfqiao 967 848 968 INTEGER, INTENT(in) :: kt ! ocean model time step index 849 969 INTEGER, INTENT(in) :: k_fsbc ! frequency of sbc (-> ice model) computation … … 1028 1148 IF( srcv(jpr_co2)%laction ) atm_co2(:,:) = frcv(jpr_co2)%z3(:,:,1) 1029 1149 #endif 1150 ! 1151 ! ! ========================= ! 1152 ! ! Mean Sea Level Pressure ! (taum) 1153 ! ! ========================= ! 1154 ! 1155 IF( srcv(jpr_mslp)%laction ) THEN ! UKMO SHELF effect of atmospheric pressure on SSH 1156 IF( kt /= nit000 ) ssh_ibb(:,:) = ssh_ib(:,:) !* Swap of ssh_ib fields 1157 1158 r1_grau = 1.e0 / (grav * rau0) !* constant for optimization 1159 ssh_ib(:,:) = - ( frcv(jpr_mslp)%z3(:,:,1) - rpref ) * r1_grau ! equivalent ssh (inverse barometer) 1160 apr (:,:) = frcv(jpr_mslp)%z3(:,:,1) !atmospheric pressure 1161 1162 IF( kt == nit000 ) ssh_ibb(:,:) = ssh_ib(:,:) ! correct this later (read from restart if possible) 1163 END IF 1164 ! 1165 IF( ln_sdw ) THEN ! Stokes Drift correction activated 1166 ! ! ========================= ! 1167 ! ! Stokes drift u ! 1168 ! ! ========================= ! 1169 IF( srcv(jpr_sdrftx)%laction ) ut0sd(:,:) = frcv(jpr_sdrftx)%z3(:,:,1) 1170 ! 1171 ! ! ========================= ! 1172 ! ! Stokes drift v ! 1173 ! ! ========================= ! 1174 IF( srcv(jpr_sdrfty)%laction ) vt0sd(:,:) = frcv(jpr_sdrfty)%z3(:,:,1) 1175 ! 1176 ! ! ========================= ! 1177 ! ! Wave mean period ! 1178 ! ! ========================= ! 1179 IF( srcv(jpr_wper)%laction ) wmp(:,:) = frcv(jpr_wper)%z3(:,:,1) 1180 ! 1181 ! ! ========================= ! 1182 ! ! Significant wave height ! 1183 ! ! ========================= ! 1184 IF( srcv(jpr_hsig)%laction ) hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1) 1185 ! 1186 ! ! ========================= ! 1187 ! ! Vertical mixing Qiao ! 1188 ! ! ========================= ! 1189 IF( srcv(jpr_wnum)%laction .AND. ln_zdfqiao ) wnum(:,:) = frcv(jpr_wnum)%z3(:,:,1) 1190 1191 ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode 1192 IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. srcv(jpr_wper)%laction & 1193 .OR. srcv(jpr_hsig)%laction ) & 1194 CALL sbc_stokes() 1195 ENDIF 1196 ! ! ========================= ! 1197 ! ! Stress adsorbed by waves ! 1198 ! ! ========================= ! 1199 IF( srcv(jpr_wstrf)%laction .AND. ln_tauoc ) tauoc_wave(:,:) = frcv(jpr_wstrf)%z3(:,:,1) 1200 1201 ! ! ========================= ! 1202 ! ! Wave drag coefficient ! 1203 ! ! ========================= ! 1204 IF( srcv(jpr_wdrag)%laction .AND. ln_cdgw ) cdn_wave(:,:) = frcv(jpr_wdrag)%z3(:,:,1) 1030 1205 1031 1206 ! Fields received by SAS when OASIS coupling … … 2101 2276 ENDIF 2102 2277 ! 2278 ! ! ------------------------- ! 2279 ! ! Surface current to waves ! 2280 ! ! ------------------------- ! 2281 IF( ssnd(jps_ocxw)%laction .OR. ssnd(jps_ocyw)%laction ) THEN 2282 ! 2283 ! j+1 j -----V---F 2284 ! surface velocity always sent from T point ! | 2285 ! j | T U 2286 ! | | 2287 ! j j-1 -I-------| 2288 ! (for I) | | 2289 ! i-1 i i 2290 ! i i+1 (for I) 2291 SELECT CASE( TRIM( sn_snd_crtw%cldes ) ) 2292 CASE( 'oce only' ) ! C-grid ==> T 2293 DO jj = 2, jpjm1 2294 DO ji = fs_2, fs_jpim1 ! vector opt. 2295 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) 2296 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji , jj-1,1) ) 2297 END DO 2298 END DO 2299 CASE( 'weighted oce and ice' ) 2300 SELECT CASE ( cp_ice_msh ) 2301 CASE( 'C' ) ! Ocean and Ice on C-grid ==> T 2302 DO jj = 2, jpjm1 2303 DO ji = fs_2, fs_jpim1 ! vector opt. 2304 zotx1(ji,jj) = 0.5 * ( un (ji,jj,1) + un (ji-1,jj ,1) ) * zfr_l(ji,jj) 2305 zoty1(ji,jj) = 0.5 * ( vn (ji,jj,1) + vn (ji ,jj-1,1) ) * zfr_l(ji,jj) 2306 zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj ) + u_ice(ji-1,jj ) ) * fr_i(ji,jj) 2307 zity1(ji,jj) = 0.5 * ( v_ice(ji,jj ) + v_ice(ji ,jj-1 ) ) * fr_i(ji,jj) 2308 END DO 2309 END DO 2310 CASE( 'I' ) ! Ocean on C grid, Ice on I-point (B-grid) ==> T 2311 DO jj = 2, jpjm1 2312 DO ji = 2, jpim1 ! NO vector opt. 2313 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) 2314 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) 2315 zitx1(ji,jj) = 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1) & 2316 & + u_ice(ji+1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 2317 zity1(ji,jj) = 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1) & 2318 & + v_ice(ji+1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 2319 END DO 2320 END DO 2321 CASE( 'F' ) ! Ocean on C grid, Ice on F-point (B-grid) ==> T 2322 DO jj = 2, jpjm1 2323 DO ji = 2, jpim1 ! NO vector opt. 2324 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) 2325 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) 2326 zitx1(ji,jj) = 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1) & 2327 & + u_ice(ji-1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 2328 zity1(ji,jj) = 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1) & 2329 & + v_ice(ji-1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 2330 END DO 2331 END DO 2332 END SELECT 2333 CALL lbc_lnk( zitx1, 'T', -1. ) ; CALL lbc_lnk( zity1, 'T', -1. ) 2334 CASE( 'mixed oce-ice' ) 2335 SELECT CASE ( cp_ice_msh ) 2336 CASE( 'C' ) ! Ocean and Ice on C-grid ==> T 2337 DO jj = 2, jpjm1 2338 DO ji = fs_2, fs_jpim1 ! vector opt. 2339 zotx1(ji,jj) = 0.5 * ( un (ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) & 2340 & + 0.5 * ( u_ice(ji,jj ) + u_ice(ji-1,jj ) ) * fr_i(ji,jj) 2341 zoty1(ji,jj) = 0.5 * ( vn (ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) & 2342 & + 0.5 * ( v_ice(ji,jj ) + v_ice(ji ,jj-1 ) ) * fr_i(ji,jj) 2343 END DO 2344 END DO 2345 CASE( 'I' ) ! Ocean on C grid, Ice on I-point (B-grid) ==> T 2346 DO jj = 2, jpjm1 2347 DO ji = 2, jpim1 ! NO vector opt. 2348 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) & 2349 & + 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1) & 2350 & + u_ice(ji+1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 2351 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) & 2352 & + 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1) & 2353 & + v_ice(ji+1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 2354 END DO 2355 END DO 2356 CASE( 'F' ) ! Ocean on C grid, Ice on F-point (B-grid) ==> T 2357 DO jj = 2, jpjm1 2358 DO ji = 2, jpim1 ! NO vector opt. 2359 zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj ,1) ) * zfr_l(ji,jj) & 2360 & + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1) & 2361 & + u_ice(ji-1,jj ) + u_ice(ji,jj ) ) * fr_i(ji,jj) 2362 zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji ,jj-1,1) ) * zfr_l(ji,jj) & 2363 & + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1) & 2364 & + v_ice(ji-1,jj ) + v_ice(ji,jj ) ) * fr_i(ji,jj) 2365 END DO 2366 END DO 2367 END SELECT 2368 END SELECT 2369 CALL lbc_lnk( zotx1, ssnd(jps_ocxw)%clgrid, -1. ) ; CALL lbc_lnk( zoty1, ssnd(jps_ocyw)%clgrid, -1. ) 2370 ! 2371 ! 2372 IF( TRIM( sn_snd_crtw%clvor ) == 'eastward-northward' ) THEN ! Rotation of the components 2373 ! ! Ocean component 2374 CALL rot_rep( zotx1, zoty1, ssnd(jps_ocxw)%clgrid, 'ij->e', ztmp1 ) ! 1st component 2375 CALL rot_rep( zotx1, zoty1, ssnd(jps_ocxw)%clgrid, 'ij->n', ztmp2 ) ! 2nd component 2376 zotx1(:,:) = ztmp1(:,:) ! overwrite the components 2377 zoty1(:,:) = ztmp2(:,:) 2378 IF( ssnd(jps_ivx1)%laction ) THEN ! Ice component 2379 CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->e', ztmp1 ) ! 1st component 2380 CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->n', ztmp2 ) ! 2nd component 2381 zitx1(:,:) = ztmp1(:,:) ! overwrite the components 2382 zity1(:,:) = ztmp2(:,:) 2383 ENDIF 2384 ENDIF 2385 ! 2386 ! ! spherical coordinates to cartesian -> 2 components to 3 components 2387 ! IF( TRIM( sn_snd_crtw%clvref ) == 'cartesian' ) THEN 2388 ! ztmp1(:,:) = zotx1(:,:) ! ocean currents 2389 ! ztmp2(:,:) = zoty1(:,:) 2390 ! CALL oce2geo ( ztmp1, ztmp2, 'T', zotx1, zoty1, zotz1 ) 2391 ! ! 2392 ! IF( ssnd(jps_ivx1)%laction ) THEN ! ice velocities 2393 ! ztmp1(:,:) = zitx1(:,:) 2394 ! ztmp1(:,:) = zity1(:,:) 2395 ! CALL oce2geo ( ztmp1, ztmp2, 'T', zitx1, zity1, zitz1 ) 2396 ! ENDIF 2397 ! ENDIF 2398 ! 2399 IF( ssnd(jps_ocxw)%laction ) CALL cpl_snd( jps_ocxw, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info ) ! ocean x current 1st grid 2400 IF( ssnd(jps_ocyw)%laction ) CALL cpl_snd( jps_ocyw, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info ) ! ocean y current 1st grid 2401 ! 2402 ENDIF 2403 ! 2404 IF( ssnd(jps_ficet)%laction ) THEN 2405 CALL cpl_snd( jps_ficet, isec, RESHAPE ( fr_i, (/jpi,jpj,1/) ), info ) 2406 END IF 2407 ! ! ------------------------- ! 2408 ! ! Water levels to waves ! 2409 ! ! ------------------------- ! 2410 IF( ssnd(jps_wlev)%laction ) THEN 2411 IF( ln_apr_dyn ) THEN 2412 IF( kt /= nit000 ) THEN 2413 ztmp1(:,:) = sshb(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 2414 ELSE 2415 ztmp1(:,:) = sshb(:,:) 2416 ENDIF 2417 ELSE 2418 ztmp1(:,:) = sshn(:,:) 2419 ENDIF 2420 CALL cpl_snd( jps_wlev , isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 2421 END IF 2103 2422 ! 2104 2423 ! Fields sent by OPA to SAS when doing OPA<->SAS coupling
Note: See TracChangeset
for help on using the changeset viewer.