Changeset 13208 for NEMO/trunk/src/OCE
- Timestamp:
- 2020-07-02T10:54:35+02:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/OCE/SBC/sbcblk.F90
r13132 r13208 74 74 #endif 75 75 76 INTEGER , PUBLIC :: jpfld ! maximum number of files to read 77 INTEGER , PUBLIC, PARAMETER :: jp_wndi = 1 ! index of 10m wind velocity (i-component) (m/s) at T-point 78 INTEGER , PUBLIC, PARAMETER :: jp_wndj = 2 ! index of 10m wind velocity (j-component) (m/s) at T-point 79 INTEGER , PUBLIC, PARAMETER :: jp_tair = 3 ! index of 10m air temperature (Kelvin) 80 INTEGER , PUBLIC, PARAMETER :: jp_humi = 4 ! index of specific humidity ( % ) 81 INTEGER , PUBLIC, PARAMETER :: jp_qsr = 5 ! index of solar heat (W/m2) 82 INTEGER , PUBLIC, PARAMETER :: jp_qlw = 6 ! index of Long wave (W/m2) 83 INTEGER , PUBLIC, PARAMETER :: jp_prec = 7 ! index of total precipitation (rain+snow) (Kg/m2/s) 84 INTEGER , PUBLIC, PARAMETER :: jp_snow = 8 ! index of snow (solid prcipitation) (kg/m2/s) 85 INTEGER , PUBLIC, PARAMETER :: jp_slp = 9 ! index of sea level pressure (Pa) 86 INTEGER , PUBLIC, PARAMETER :: jp_hpgi =10 ! index of ABL geostrophic wind or hpg (i-component) (m/s) at T-point 87 INTEGER , PUBLIC, PARAMETER :: jp_hpgj =11 ! index of ABL geostrophic wind or hpg (j-component) (m/s) at T-point 88 76 INTEGER , PUBLIC, PARAMETER :: jp_wndi = 1 ! index of 10m wind velocity (i-component) (m/s) at T-point 77 INTEGER , PUBLIC, PARAMETER :: jp_wndj = 2 ! index of 10m wind velocity (j-component) (m/s) at T-point 78 INTEGER , PUBLIC, PARAMETER :: jp_tair = 3 ! index of 10m air temperature (Kelvin) 79 INTEGER , PUBLIC, PARAMETER :: jp_humi = 4 ! index of specific humidity ( % ) 80 INTEGER , PUBLIC, PARAMETER :: jp_qsr = 5 ! index of solar heat (W/m2) 81 INTEGER , PUBLIC, PARAMETER :: jp_qlw = 6 ! index of Long wave (W/m2) 82 INTEGER , PUBLIC, PARAMETER :: jp_prec = 7 ! index of total precipitation (rain+snow) (Kg/m2/s) 83 INTEGER , PUBLIC, PARAMETER :: jp_snow = 8 ! index of snow (solid prcipitation) (kg/m2/s) 84 INTEGER , PUBLIC, PARAMETER :: jp_slp = 9 ! index of sea level pressure (Pa) 85 INTEGER , PUBLIC, PARAMETER :: jp_uoatm = 10 ! index of surface current (i-component) 86 ! ! seen by the atmospheric forcing (m/s) at T-point 87 INTEGER , PUBLIC, PARAMETER :: jp_voatm = 11 ! index of surface current (j-component) 88 ! ! seen by the atmospheric forcing (m/s) at T-point 89 INTEGER , PUBLIC, PARAMETER :: jp_hpgi = 12 ! index of ABL geostrophic wind or hpg (i-component) (m/s) at T-point 90 INTEGER , PUBLIC, PARAMETER :: jp_hpgj = 13 ! index of ABL geostrophic wind or hpg (j-component) (m/s) at T-point 91 INTEGER , PUBLIC, PARAMETER :: jpfld = 13 ! maximum number of files to read 92 93 ! Warning: keep this structure allocatable for Agrif... 89 94 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf ! structure of input atmospheric fields (file informations, fields read) 90 95 … … 98 103 LOGICAL :: ln_Cd_L15 ! ice-atm drag = F( ice concentration, atmospheric stability ) (Lupkes et al. JGR2015) 99 104 ! 105 LOGICAL :: ln_crt_fbk ! Add surface current feedback to the wind stress computation (Renault et al. 2020) 106 REAL(wp) :: rn_stau_a ! Alpha and Beta coefficients of Renault et al. 2020, eq. 10: Stau = Alpha * Wnd + Beta 107 REAL(wp) :: rn_stau_b ! 108 ! 100 109 REAL(wp) :: rn_pfac ! multiplication factor for precipitation 101 110 REAL(wp), PUBLIC :: rn_efac ! multiplication factor for evaporation 102 REAL(wp), PUBLIC :: rn_vfac ! multiplication factor for ice/ocean velocity in the calculation of wind stress103 111 REAL(wp) :: rn_zqt ! z(q,t) : height of humidity and temperature measurements 104 112 REAL(wp) :: rn_zu ! z(u) : height of wind measurements … … 162 170 !! 163 171 CHARACTER(len=100) :: cn_dir ! Root directory for location of atmospheric forcing files 164 TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) :: slf_i ! array of namelist informations on the fields to read 165 TYPE(FLD_N) :: sn_wndi, sn_wndj, sn_humi, sn_qsr ! informations about the fields to be read 166 TYPE(FLD_N) :: sn_qlw , sn_tair, sn_prec, sn_snow ! " " 167 TYPE(FLD_N) :: sn_slp , sn_hpgi, sn_hpgj ! " " 172 TYPE(FLD_N), DIMENSION(jpfld) :: slf_i ! array of namelist informations on the fields to read 173 TYPE(FLD_N) :: sn_wndi, sn_wndj , sn_humi, sn_qsr ! informations about the fields to be read 174 TYPE(FLD_N) :: sn_qlw , sn_tair , sn_prec, sn_snow ! " " 175 TYPE(FLD_N) :: sn_slp , sn_uoatm, sn_voatm ! " " 176 TYPE(FLD_N) :: sn_hpgi, sn_hpgj ! " " 177 INTEGER :: ipka ! number of levels in the atmospheric variable 168 178 NAMELIST/namsbc_blk/ sn_wndi, sn_wndj, sn_humi, sn_qsr, sn_qlw , & ! input fields 169 & sn_tair, sn_prec, sn_snow, sn_slp, sn_hpgi, sn_hpgj, & 179 & sn_tair, sn_prec, sn_snow, sn_slp, sn_uoatm, sn_voatm, & 180 & sn_hpgi, sn_hpgj, & 170 181 & ln_NCAR, ln_COARE_3p0, ln_COARE_3p6, ln_ECMWF, & ! bulk algorithm 171 182 & cn_dir , rn_zqt, rn_zu, & 172 & rn_pfac, rn_efac, rn_vfac, ln_Cd_L12, ln_Cd_L15, & 183 & rn_pfac, rn_efac, ln_Cd_L12, ln_Cd_L15, & 184 & ln_crt_fbk, rn_stau_a, rn_stau_b, & ! current feedback 173 185 & ln_skin_cs, ln_skin_wl, ln_humi_sph, ln_humi_dpt, ln_humi_rlh ! cool-skin / warm-layer !LB 174 186 !!--------------------------------------------------------------------- … … 242 254 ! !* set the bulk structure 243 255 ! !- store namelist information in an array 244 IF( ln_blk ) jpfld = 9 245 IF( ln_abl ) jpfld = 11 246 ALLOCATE( slf_i(jpfld) ) 247 ! 248 slf_i(jp_wndi) = sn_wndi ; slf_i(jp_wndj) = sn_wndj 249 slf_i(jp_qsr ) = sn_qsr ; slf_i(jp_qlw ) = sn_qlw 250 slf_i(jp_tair) = sn_tair ; slf_i(jp_humi) = sn_humi 251 slf_i(jp_prec) = sn_prec ; slf_i(jp_snow) = sn_snow 252 slf_i(jp_slp ) = sn_slp 253 IF( ln_abl ) THEN 254 slf_i(jp_hpgi) = sn_hpgi ; slf_i(jp_hpgj) = sn_hpgj 255 END IF 256 ! 257 slf_i(jp_wndi ) = sn_wndi ; slf_i(jp_wndj ) = sn_wndj 258 slf_i(jp_qsr ) = sn_qsr ; slf_i(jp_qlw ) = sn_qlw 259 slf_i(jp_tair ) = sn_tair ; slf_i(jp_humi ) = sn_humi 260 slf_i(jp_prec ) = sn_prec ; slf_i(jp_snow ) = sn_snow 261 slf_i(jp_slp ) = sn_slp 262 slf_i(jp_uoatm) = sn_uoatm ; slf_i(jp_voatm) = sn_voatm 263 slf_i(jp_hpgi ) = sn_hpgi ; slf_i(jp_hpgj ) = sn_hpgj 264 ! 265 IF( .NOT. ln_abl ) THEN ! force to not use jp_hpgi and jp_hpgj, should already be done in namelist_* but we never know... 266 slf_i(jp_hpgi)%clname = 'NOT USED' 267 slf_i(jp_hpgj)%clname = 'NOT USED' 268 ENDIF 256 269 ! 257 270 ! !- allocate the bulk structure … … 264 277 DO jfpr= 1, jpfld 265 278 ! 266 IF( TRIM(sf(jfpr)%clrootname) == 'NOT USED' ) THEN !-- not used field --! (only now allocated and set to zero) 267 ALLOCATE( sf(jfpr)%fnow(jpi,jpj,1) ) 268 sf(jfpr)%fnow(:,:,1) = 0._wp 279 IF( ln_abl .AND. & 280 & ( jfpr == jp_wndi .OR. jfpr == jp_wndj .OR. jfpr == jp_humi .OR. & 281 & jfpr == jp_hpgi .OR. jfpr == jp_hpgj .OR. jfpr == jp_tair ) ) THEN 282 ipka = jpka ! ABL: some fields are 3D input 283 ELSE 284 ipka = 1 285 ENDIF 286 ! 287 ALLOCATE( sf(jfpr)%fnow(jpi,jpj,ipka) ) 288 ! 289 IF( TRIM(sf(jfpr)%clrootname) == 'NOT USED' ) THEN !-- not used field --! (only now allocated and set to default) 290 IF( jfpr == jp_slp ) THEN 291 sf(jfpr)%fnow(:,:,1:ipka) = 101325._wp ! use standard pressure in Pa 292 ELSEIF( jfpr == jp_prec .OR. jfpr == jp_snow .OR. jfpr == jp_uoatm .OR. jfpr == jp_voatm ) THEN 293 sf(jfpr)%fnow(:,:,1:ipka) = 0._wp ! no precip or no snow or no surface currents 294 ELSEIF( ( jfpr == jp_hpgi .OR. jfpr == jp_hpgj ) .AND. .NOT. ln_abl ) THEN 295 DEALLOCATE( sf(jfpr)%fnow ) ! deallocate as not used in this case 296 ELSE 297 WRITE(ctmp1,*) 'sbc_blk_init: no default value defined for field number', jfpr 298 CALL ctl_stop( ctmp1 ) 299 ENDIF 269 300 ELSE !-- used field --! 270 IF( ln_abl .AND. & 271 & ( jfpr == jp_wndi .OR. jfpr == jp_wndj .OR. jfpr == jp_humi .OR. & 272 & jfpr == jp_hpgi .OR. jfpr == jp_hpgj .OR. jfpr == jp_tair ) ) THEN ! ABL: some fields are 3D input 273 ALLOCATE( sf(jfpr)%fnow(jpi,jpj,jpka) ) 274 IF( sf(jfpr)%ln_tint ) ALLOCATE( sf(jfpr)%fdta(jpi,jpj,jpka,2) ) 275 ELSE ! others or Bulk fields are 2D fiels 276 ALLOCATE( sf(jfpr)%fnow(jpi,jpj,1) ) 277 IF( sf(jfpr)%ln_tint ) ALLOCATE( sf(jfpr)%fdta(jpi,jpj,1,2) ) 278 ENDIF 301 IF( sf(jfpr)%ln_tint ) ALLOCATE( sf(jfpr)%fdta(jpi,jpj,ipka,2) ) ! allocate array for temporal interpolation 279 302 ! 280 303 IF( sf(jfpr)%freqh > 0. .AND. MOD( NINT(3600. * sf(jfpr)%freqh), nn_fsbc * NINT(rn_Dt) ) /= 0 ) & … … 327 350 WRITE(numout,*) ' factor applied on precipitation (total & snow) rn_pfac = ', rn_pfac 328 351 WRITE(numout,*) ' factor applied on evaporation rn_efac = ', rn_efac 329 WRITE(numout,*) ' factor applied on ocean/ice velocity rn_vfac = ', rn_vfac330 352 WRITE(numout,*) ' (form absolute (=0) to relative winds(=1))' 331 353 WRITE(numout,*) ' use ice-atm drag from Lupkes2012 ln_Cd_L12 = ', ln_Cd_L12 332 354 WRITE(numout,*) ' use ice-atm drag from Lupkes2015 ln_Cd_L15 = ', ln_Cd_L15 355 WRITE(numout,*) ' use surface current feedback on wind stress ln_crt_fbk = ', ln_crt_fbk 356 IF(ln_crt_fbk) THEN 357 WRITE(numout,*) ' Renault et al. 2020, eq. 10: Stau = Alpha * Wnd + Beta' 358 WRITE(numout,*) ' Alpha rn_stau_a = ', rn_stau_a 359 WRITE(numout,*) ' Beta rn_stau_b = ', rn_stau_b 360 ENDIF 333 361 ! 334 362 WRITE(numout,*) … … 429 457 ! ! compute the surface ocean fluxes using bulk formulea 430 458 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 431 CALL blk_oce_1( kt, sf(jp_wndi)%fnow(:,:,1), sf(jp_wndj)%fnow(:,:,1), & ! <<= in 432 & sf(jp_tair)%fnow(:,:,1), sf(jp_humi)%fnow(:,:,1), & ! <<= in 433 & sf(jp_slp )%fnow(:,:,1), sst_m, ssu_m, ssv_m, & ! <<= in 434 & sf(jp_qsr )%fnow(:,:,1), sf(jp_qlw )%fnow(:,:,1), & ! <<= in (wl/cs) 435 & tsk_m, zssq, zcd_du, zsen, zevp ) ! =>> out 436 437 CALL blk_oce_2( sf(jp_tair)%fnow(:,:,1), sf(jp_qsr )%fnow(:,:,1), & ! <<= in 438 & sf(jp_qlw )%fnow(:,:,1), sf(jp_prec)%fnow(:,:,1), & ! <<= in 439 & sf(jp_snow)%fnow(:,:,1), tsk_m, & ! <<= in 440 & zsen, zevp ) ! <=> in out 459 CALL blk_oce_1( kt, sf(jp_wndi )%fnow(:,:,1), sf(jp_wndj )%fnow(:,:,1), & ! <<= in 460 & sf(jp_tair )%fnow(:,:,1), sf(jp_humi )%fnow(:,:,1), & ! <<= in 461 & sf(jp_slp )%fnow(:,:,1), sst_m, ssu_m, ssv_m, & ! <<= in 462 & sf(jp_uoatm)%fnow(:,:,1), sf(jp_voatm)%fnow(:,:,1), & ! <<= in 463 & sf(jp_qsr )%fnow(:,:,1), sf(jp_qlw )%fnow(:,:,1), & ! <<= in (wl/cs) 464 & tsk_m, zssq, zcd_du, zsen, zevp ) ! =>> out 465 466 CALL blk_oce_2( sf(jp_tair )%fnow(:,:,1), sf(jp_qsr )%fnow(:,:,1), & ! <<= in 467 & sf(jp_qlw )%fnow(:,:,1), sf(jp_prec )%fnow(:,:,1), & ! <<= in 468 & sf(jp_snow )%fnow(:,:,1), tsk_m, & ! <<= in 469 & zsen, zevp ) ! <=> in out 441 470 ENDIF 442 471 ! … … 470 499 471 500 472 SUBROUTINE blk_oce_1( kt, pwndi, pwndj , ptair, phumi,& ! inp473 & pslp , pst , pu , pv,& ! inp474 & pqsr , pqlw ,& ! inp475 & ptsk, pssq , pcd_du, psen , pevp )! out501 SUBROUTINE blk_oce_1( kt, pwndi, pwndj, ptair, phumi, & ! inp 502 & pslp , pst , pu , pv, & ! inp 503 & puatm, pvatm, pqsr , pqlw , & ! inp 504 & ptsk , pssq , pcd_du, psen, pevp ) ! out 476 505 !!--------------------------------------------------------------------- 477 506 !! *** ROUTINE blk_oce_1 *** … … 498 527 REAL(wp), INTENT(in ), DIMENSION(:,:) :: pu ! surface current at U-point (i-component) [m/s] 499 528 REAL(wp), INTENT(in ), DIMENSION(:,:) :: pv ! surface current at V-point (j-component) [m/s] 529 REAL(wp), INTENT(in ), DIMENSION(:,:) :: puatm ! surface current seen by the atm at T-point (i-component) [m/s] 530 REAL(wp), INTENT(in ), DIMENSION(:,:) :: pvatm ! surface current seen by the atm at T-point (j-component) [m/s] 500 531 REAL(wp), INTENT(in ), DIMENSION(:,:) :: pqsr ! 501 532 REAL(wp), INTENT(in ), DIMENSION(:,:) :: pqlw ! … … 508 539 INTEGER :: ji, jj ! dummy loop indices 509 540 REAL(wp) :: zztmp ! local variable 541 REAL(wp) :: zstmax, zstau 542 #if defined key_cyclone 510 543 REAL(wp), DIMENSION(jpi,jpj) :: zwnd_i, zwnd_j ! wind speed components at T-point 544 #endif 545 REAL(wp), DIMENSION(jpi,jpj) :: ztau_i, ztau_j ! wind stress components at T-point 511 546 REAL(wp), DIMENSION(jpi,jpj) :: zU_zu ! bulk wind speed at height zu [m/s] 512 547 REAL(wp), DIMENSION(jpi,jpj) :: ztpot ! potential temperature of air at z=rn_zqt [K] … … 532 567 zwnd_j(:,:) = 0._wp 533 568 CALL wnd_cyc( kt, zwnd_i, zwnd_j ) ! add analytical tropical cyclone (Vincent et al. JGR 2012) 534 DO_2D_00_00 535 pwndi(ji,jj) = pwndi(ji,jj) + zwnd_i(ji,jj) 536 pwndj(ji,jj) = pwndj(ji,jj) + zwnd_j(ji,jj) 569 DO_2D_11_11 570 zwnd_i(ji,jj) = pwndi(ji,jj) + zwnd_i(ji,jj) 571 zwnd_j(ji,jj) = pwndj(ji,jj) + zwnd_j(ji,jj) 572 ! ... scalar wind at T-point (not masked) 573 wndm(ji,jj) = SQRT( zwnd_i(ji,jj) * zwnd_i(ji,jj) + zwnd_j(ji,jj) * zwnd_j(ji,jj) ) 574 END_2D 575 #else 576 ! ... scalar wind module at T-point (not masked) 577 DO_2D_11_11 578 wndm(ji,jj) = SQRT( pwndi(ji,jj) * pwndi(ji,jj) + pwndj(ji,jj) * pwndj(ji,jj) ) 537 579 END_2D 538 580 #endif 539 DO_2D_00_00540 zwnd_i(ji,jj) = ( pwndi(ji,jj) - rn_vfac * 0.5 * ( pu(ji-1,jj ) + pu(ji,jj) ) )541 zwnd_j(ji,jj) = ( pwndj(ji,jj) - rn_vfac * 0.5 * ( pv(ji ,jj-1) + pv(ji,jj) ) )542 END_2D543 CALL lbc_lnk_multi( 'sbcblk', zwnd_i, 'T', -1., zwnd_j, 'T', -1. )544 ! ... scalar wind ( = | U10m - U_oce | ) at T-point (masked)545 wndm(:,:) = SQRT( zwnd_i(:,:) * zwnd_i(:,:) &546 & + zwnd_j(:,:) * zwnd_j(:,:) ) * tmask(:,:,1)547 548 581 ! ----------------------------------------------------------------------------- ! 549 582 ! I Solar FLUX ! … … 597 630 END_2D 598 631 ENDIF 599 600 601 632 602 633 !! Time to call the user-selected bulk parameterization for … … 674 705 pevp(:,:) = pevp(:,:) * tmask(:,:,1) 675 706 676 ! Tau i and j component on T-grid points, using array "zcd_oce" as a temporary array... 677 zcd_oce = 0._wp 678 WHERE ( wndm > 0._wp ) zcd_oce = taum / wndm 679 zwnd_i = zcd_oce * zwnd_i 680 zwnd_j = zcd_oce * zwnd_j 681 682 CALL iom_put( "taum_oce", taum ) ! output wind stress module 707 DO_2D_11_11 708 IF( wndm(ji,jj) > 0._wp ) THEN 709 zztmp = taum(ji,jj) / wndm(ji,jj) 710 #if defined key_cyclone 711 ztau_i(ji,jj) = zztmp * zwnd_i(ji,jj) 712 ztau_j(ji,jj) = zztmp * zwnd_j(ji,jj) 713 #else 714 ztau_i(ji,jj) = zztmp * pwndi(ji,jj) 715 ztau_j(ji,jj) = zztmp * pwndj(ji,jj) 716 #endif 717 ELSE 718 ztau_i(ji,jj) = 0._wp 719 ztau_j(ji,jj) = 0._wp 720 ENDIF 721 END_2D 722 723 IF( ln_crt_fbk ) THEN ! aply eq. 10 and 11 of Renault et al. 2020 (doi: 10.1029/2019MS001715) 724 zstmax = MIN( rn_stau_a * 3._wp + rn_stau_b, 0._wp ) ! set the max value of Stau corresponding to a wind of 3 m/s (<0) 725 DO_2D_01_01 ! end at jpj and jpi, as ztau_j(ji,jj+1) ztau_i(ji+1,jj) used in the next loop 726 zstau = MIN( rn_stau_a * wndm(ji,jj) + rn_stau_b, zstmax ) ! stau (<0) must be smaller than zstmax 727 ztau_i(ji,jj) = ztau_i(ji,jj) + zstau * ( 0.5_wp * ( pu(ji-1,jj ) + pu(ji,jj) ) - puatm(ji,jj) ) 728 ztau_j(ji,jj) = ztau_j(ji,jj) + zstau * ( 0.5_wp * ( pv(ji ,jj-1) + pv(ji,jj) ) - pvatm(ji,jj) ) 729 taum(ji,jj) = SQRT( ztau_i(ji,jj) * ztau_i(ji,jj) + ztau_j(ji,jj) * ztau_j(ji,jj) ) 730 END_2D 731 ENDIF 683 732 684 733 ! ... utau, vtau at U- and V_points, resp. 685 734 ! Note the use of 0.5*(2-umask) in order to unmask the stress along coastlines 686 735 ! Note that coastal wind stress is not used in the code... so this extra care has no effect 687 DO_2D_00_00 688 utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( z wnd_i(ji,jj) + zwnd_i(ji+1,jj ) ) &689 & * MAX(tmask(ji,jj,1),tmask(ji+1,jj,1))690 vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( z wnd_j(ji,jj) + zwnd_j(ji ,jj+1) ) &691 & * MAX(tmask(ji,jj,1),tmask(ji,jj+1,1))736 DO_2D_00_00 ! start loop at 2, in case ln_crt_fbk = T 737 utau(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( ztau_i(ji,jj) + ztau_i(ji+1,jj ) ) & 738 & * MAX(tmask(ji,jj,1),tmask(ji+1,jj,1)) 739 vtau(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( ztau_j(ji,jj) + ztau_j(ji ,jj+1) ) & 740 & * MAX(tmask(ji,jj,1),tmask(ji,jj+1,1)) 692 741 END_2D 693 CALL lbc_lnk_multi( 'sbcblk', utau, 'U', -1., vtau, 'V', -1. ) 742 743 IF( ln_crt_fbk ) THEN 744 CALL lbc_lnk_multi( 'sbcblk', utau, 'U', -1., vtau, 'V', -1., taum, 'T', -1. ) 745 ELSE 746 CALL lbc_lnk_multi( 'sbcblk', utau, 'U', -1., vtau, 'V', -1. ) 747 ENDIF 748 749 CALL iom_put( "taum_oce", taum ) ! output wind stress module 694 750 695 751 IF(sn_cfctl%l_prtctl) THEN … … 862 918 ! 863 919 INTEGER :: ji, jj ! dummy loop indices 864 REAL(wp) :: zwndi_t , zwndj_t ! relative wind components at T-point865 920 REAL(wp) :: zootm_su ! sea-ice surface mean temperature 866 921 REAL(wp) :: zztmp1, zztmp2 ! temporary arrays … … 873 928 ! ------------------------------------------------------------ ! 874 929 ! C-grid ice dynamics : U & V-points (same as ocean) 875 DO_2D_00_00 876 zwndi_t = ( pwndi(ji,jj) - rn_vfac * 0.5_wp * ( puice(ji-1,jj ) + puice(ji,jj) ) ) 877 zwndj_t = ( pwndj(ji,jj) - rn_vfac * 0.5_wp * ( pvice(ji ,jj-1) + pvice(ji,jj) ) ) 878 wndm_ice(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 930 DO_2D_11_11 931 wndm_ice(ji,jj) = SQRT( pwndi(ji,jj) * pwndi(ji,jj) + pwndj(ji,jj) * pwndj(ji,jj) ) 879 932 END_2D 880 CALL lbc_lnk( 'sbcblk', wndm_ice, 'T', 1. )881 933 ! 882 934 ! Make ice-atm. drag dependent on ice concentration … … 898 950 899 951 IF( ln_blk ) THEN 900 ! ---------------------------------------------------- ---------!901 ! Wind stress relative to the moving ice ( U10m - U_ice) !902 ! ---------------------------------------------------- ---------!903 zztmp1 = rn_vfac * 0.5_wp952 ! ---------------------------------------------------- ! 953 ! Wind stress relative to nonmoving ice ( U10m ) ! 954 ! ---------------------------------------------------- ! 955 ! supress moving ice in wind stress computation as we don't know how to do it properly... 904 956 DO_2D_01_01 ! at T point 905 putaui(ji,jj) = rhoa(ji,jj) * zcd_dui(ji,jj) * ( pwndi(ji,jj) - zztmp1 * ( puice(ji-1,jj ) + puice(ji,jj) ))906 pvtaui(ji,jj) = rhoa(ji,jj) * zcd_dui(ji,jj) * ( pwndj(ji,jj) - zztmp1 * ( pvice(ji ,jj-1) + pvice(ji,jj) ))957 putaui(ji,jj) = rhoa(ji,jj) * zcd_dui(ji,jj) * pwndi(ji,jj) 958 pvtaui(ji,jj) = rhoa(ji,jj) * zcd_dui(ji,jj) * pwndj(ji,jj) 907 959 END_2D 908 960 !
Note: See TracChangeset
for help on using the changeset viewer.