New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 6772 for branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90 – NEMO

Ignore:
Timestamp:
2016-07-01T18:02:45+02:00 (8 years ago)
Author:
cbricaud
Message:

clean in coarsening branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90

    r5602 r6772  
    4444   USE sbc_ice         ! Surface boundary condition: ice fields 
    4545   USE lib_fortran     ! to use key_nosignedzero 
     46   USE sbcapr 
    4647#if defined key_lim3 
    4748   USE ice, ONLY       : u_ice, v_ice, jpl, pfrld, a_i_b 
    4849   USE limthd_dh       ! for CALL lim_thd_snwblow 
    4950#elif defined key_lim2 
    50    USE ice_2, ONLY     : u_ice, v_ice 
     51   USE ice_2, ONLY     : u_ice, v_ice, pfrld 
    5152   USE par_ice_2 
    5253#endif 
     
    8384   REAL(wp), PARAMETER ::   Cice =    1.4e-3      ! iovi 1.63e-3     ! transfer coefficient over ice 
    8485   REAL(wp), PARAMETER ::   albo =    0.066       ! ocean albedo assumed to be constant 
     86   REAL(wp), PARAMETER ::   rgas =  287.1         ! gas const. dry air (J/kg/K) 
     87   REAL(wp), PARAMETER ::   rvap =  461.51        ! gas const. vapour  (J/kg/K) 
    8588 
    8689   !                                  !!* Namelist namsbc_core : CORE bulk parameters 
     
    9194   REAL(wp) ::   rn_zqt      ! z(q,t) : height of humidity and temperature measurements 
    9295   REAL(wp) ::   rn_zu       ! z(u)   : height of wind measurements 
     96   ! 
     97   LOGICAL  ::   ln_tair_celsius  !: logical flag for Read Tair: Tair in NEMO is Kelvin 
     98   LOGICAL  ::   ln_humi_rel      !: logical flag for Read relative humidity (T) or specific humidity (F) 
     99   LOGICAL  ::   ln_cohum_arc     !: logical flag for Correction of Humidity in the Arctic Ocean 
     100   LOGICAL  ::   ln_cotair_arc    !: logical flag for Correction of Air Temperature in the Arctic Ocean 
     101   LOGICAL  ::   ln_corad_antar   !: logical flag for Correction of radiatives fluxes in the Southern Ocean 
     102 
    93103 
    94104   !! * Substitutions 
     
    143153      INTEGER  ::   ios      ! Local integer output status for namelist read 
    144154      ! 
     155      INTEGER  ::   ji,jj 
     156      REAL(wp) ::   zzlat, zzlat1, zzlat2, zfm, zfrld 
     157      REAL(wp) ::   zmin,zmax 
     158      REAL(wp), DIMENSION(:,:), POINTER :: xyt,z_qsr,z_qlw,z_qsr1,z_qlw1, z_hum, z_tair 
     159      REAL(wp), DIMENSION(:,:), POINTER :: zqsr_lr, zqsr_hr, zqlw_lr, zqlw_hr 
     160      
    145161      CHARACTER(len=100) ::  cn_dir   !   Root directory for location of core files 
    146162      TYPE(FLD_N), DIMENSION(jpfld) ::   slf_i     ! array of namelist informations on the fields to read 
     
    151167         &                  sn_wndi, sn_wndj, sn_humi  , sn_qsr ,           & 
    152168         &                  sn_qlw , sn_tair, sn_prec  , sn_snow,           & 
    153          &                  sn_tdif, rn_zqt,  rn_zu 
     169         &                  sn_tdif, rn_zqt,  rn_zu , ln_tair_celsius,   & 
     170         &                  ln_humi_rel  , ln_cohum_arc,      & 
     171         &                  ln_cotair_arc, ln_corad_antar 
     172 
    154173      !!--------------------------------------------------------------------- 
    155174      ! 
     175      CALL wrk_alloc( jpi,jpj, xyt,z_qsr,z_qlw,z_qsr1,z_qlw1, z_hum, z_tair ) 
     176      CALL wrk_alloc( jpi,jpj, zqsr_lr, zqsr_hr, zqlw_lr, zqlw_hr ) 
    156177      !                                         ! ====================== ! 
    157178      IF( kt == nit000 ) THEN                   !  First call kt=nit000  ! 
     
    194215         CALL fld_fill( sf, slf_i, cn_dir, 'sbc_blk_core', 'flux formulation for ocean surface boundary condition', 'namsbc_core' ) 
    195216         ! 
     217         ! 
     218         IF(lwp) WRITE(numout,*) 'sbc_blk_core: jfld = ',jfld 
     219         IF( ln_cohum_arc   ) CALL ctl_warn( 'sbc_blk_core: correction of humidity in arctic' ) 
     220         IF( ln_cotair_arc  ) CALL ctl_warn( 'sbc_blk_core: correction of air temperature in arctic' ) 
     221         IF( ln_corad_antar ) CALL ctl_warn( 'sbc_blk_core: correction of short radiation in antartic' ) 
     222         IF( ln_humi_rel    ) CALL ctl_warn( 'sbc_blk_core: use relative humidity instead of specific humidity') 
     223         IF( ln_tair_celsius) CALL ctl_warn( 'sbc_blk_core: Tair is read in Celsius') 
     224         IF(lwp) WRITE(numout,*) 'sbc_blk_core: rn_pfac = ',rn_pfac 
     225         ! 
    196226         sfx(:,:) = 0._wp                          ! salt flux; zero unless ice is present (computed in limsbc(_2).F90) 
    197227         ! 
     
    199229 
    200230      CALL fld_read( kt, nn_fsbc, sf )             ! input fields provided at the current time-step 
     231 
     232      !========================================= 
     233      !  ONLINE CORRECTIONS 
     234      !========================================= 
     235      ! 
     236      ! Correction of Tair 
     237      ! 
     238      IF( ln_tair_celsius .AND. MOD( kt-1, nn_fsbc ) == 0 ) THEN 
     239         sf(jp_tair)%fnow = sf(jp_tair)%fnow + 273.15_wp  ! Conversion of the Temperature °C --> Kelvin 
     240      ENDIF 
     241      ! 
     242      ! Correction of SW and LW in the Southern Ocean 
     243      ! 
     244      IF( ln_corad_antar .AND. .NOT. sf(jp_qsr)%ln_tint .AND. MOD( kt-1, 86400/INT(rdt) ) == 0 ) THEN 
     245         z_qsr(:,:) = 0.8 * sf(jp_qsr)%fnow(:,:,1) 
     246         xyt(:,:) = 0.e0 ; zzlat1 = -65. ; zzlat2 = -60. 
     247         DO jj = 1, jpj 
     248            DO ji = 1, jpi 
     249               zzlat = gphit(ji,jj) 
     250               IF( zzlat >= zzlat1 .AND. zzlat <= zzlat2 ) THEN 
     251                  xyt(ji,jj) = (zzlat2-zzlat)/(zzlat2-zzlat1) 
     252               ELSE IF ( zzlat < zzlat1 ) THEN 
     253                  xyt(ji,jj) = 1 
     254               ENDIF 
     255            END DO 
     256         END DO 
     257         IF(lwp) WRITE(numout,*) 'Correc ln_corad_antar' 
     258         z_qsr1(:,:) = z_qsr(:,:) * xyt(:,:) + ( 1.0 - xyt(:,:) ) * sf(jp_qsr)%fnow(:,:,1) 
     259         sf(jp_qsr)%fnow(:,:,1) = z_qsr1(:,:) 
     260      ENDIF 
     261 
     262      IF( MOD( kt-1, nn_fsbc ) == 0 )THEN 
     263         ! 
     264         IF ( nmonth >= 5 .AND. nmonth <= 9 ) THEN 
     265            ! 
     266            ! Correction of Humidity in the Arctic Ocean 
     267            ! 
     268            IF( ln_cohum_arc ) THEN 
     269               z_hum(:,:) = 0.85 * sf(jp_humi)%fnow(:,:,1) 
     270               xyt(:,:) = 0.e0 ; zzlat1 = 78. ; zzlat2 = 82. 
     271               DO jj = 1, jpj 
     272                  DO ji = 1, jpi 
     273                     zzlat = gphit(ji,jj) 
     274#if defined key_lim2 ||  defined key_lim3  
     275                     IF ( ALLOCATED(pfrld) ) THEN ; zfrld = pfrld(ji,jj) ; ELSE ; zfrld = 0 ; ENDIF 
     276#endif 
     277                     IF( zzlat >= zzlat1 .AND. zzlat <= zzlat2 .AND. zfrld < 0.85 ) THEN 
     278                        xyt(ji,jj) = ( zzlat - zzlat1 ) / ( zzlat2 - zzlat1 ) 
     279                     ELSE IF ( zzlat > zzlat2 .AND. zfrld < 0.85 ) THEN 
     280                        xyt(ji,jj) = 1._wp 
     281                     ENDIF 
     282                  ENDDO 
     283               ENDDO 
     284               IF(lwp) WRITE(numout,*) 'Correc ln_cohum_arc' 
     285               sf(jp_humi)%fnow(:,:,1) = z_hum(:,:) * xyt(:,:) + ( 1.0 - xyt(:,:) ) * sf(jp_humi)%fnow(:,:,1) 
     286            ENDIF 
     287            ! 
     288            ! Correction of Air Temperature in the Arctic Ocean 
     289            ! 
     290            IF( ln_cotair_arc ) THEN 
     291               z_tair(:,:) = sf(jp_tair)%fnow(:,:,1) - 2.0 
     292               xyt(:,:) = 0.e0 ; zzlat1 = 78. ; zzlat2 = 82. 
     293               DO jj = 1, jpj 
     294                  DO ji = 1, jpi 
     295                     zzlat = gphit(ji,jj) 
     296#if defined key_lim2 ||  defined key_lim3  
     297                     IF( ALLOCATED(pfrld) ) THEN ; zfrld = pfrld(ji,jj) ; ELSE ; zfrld=0 ; ENDIF 
     298#endif 
     299                     IF( zzlat >= zzlat1 .AND. zzlat <= zzlat2 .AND. zfrld < 0.85 ) THEN 
     300                        xyt(ji,jj) = ( zzlat - zzlat1 ) / ( zzlat2 - zzlat1 ) 
     301                     ELSE IF( zzlat > zzlat2 .AND. zfrld < 0.85 ) THEN 
     302                        xyt(ji,jj) = 1._wp 
     303                     ENDIF 
     304                  END DO 
     305               ENDDO 
     306               IF(lwp) WRITE(numout,*) 'Correc ln_cotair_arc' 
     307               sf(jp_tair)%fnow(:,:,1) = z_tair(:,:) * xyt(:,:) + ( 1.0 - xyt(:,:) ) * sf(jp_tair)%fnow(:,:,1) 
     308            ENDIF 
     309            ! 
     310         ENDIF ! 5 <= nmonth <= 9 
     311 
     312         ! 
     313      ENDIF ! IF MOD( kt-1, nn_fsbc ) 
     314 
     315      DO jj=1,jpj 
     316         DO ji=1,jpi 
     317            sf(jp_humi)%fnow(ji,jj,1) = MAX( MIN( sf(jp_humi)%fnow(ji,jj,1) ,1.0 ) , 0.0 ) 
     318            sf(jp_prec)%fnow(ji,jj,1) = MAX(      sf(jp_prec)%fnow(ji,jj,1) ,0.0 ) 
     319            sf(jp_qsr )%fnow(ji,jj,1) = MAX(      sf(jp_qsr )%fnow(ji,jj,1) ,0.0 ) 
     320            sf(jp_qlw )%fnow(ji,jj,1) = MAX(      sf(jp_qlw )%fnow(ji,jj,1) ,0.0 ) 
     321         ENDDO 
     322      END DO 
     323 
     324      ! 
     325      !========================================= 
     326      ! END OF ONLINE CORRECTIONS 
     327      !========================================= 
     328      ! 
    201329 
    202330      !                                            ! compute the surface ocean fluxes using CORE bulk formulea 
     
    215343      ENDIF 
    216344#endif 
     345      ! 
     346      CALL wrk_dealloc( jpi,jpj, xyt,z_qsr,z_qlw,z_qsr1,z_qlw1, z_hum, z_tair ) 
     347      CALL wrk_dealloc( jpi,jpj, zqsr_lr, zqsr_hr, zqlw_lr, zqlw_hr ) 
    217348      ! 
    218349   END SUBROUTINE sbc_blk_core 
     
    257388      REAL(wp), DIMENSION(:,:), POINTER ::   zt_zu             ! air temperature at wind speed height 
    258389      REAL(wp), DIMENSION(:,:), POINTER ::   zq_zu             ! air spec. hum.  at wind speed height 
     390      REAL(wp), DIMENSION(:,:), POINTER ::   zqatm , zpatm     ! specific humidity and mean sea level pressure (Pa) 
     391      REAL(wp) :: vt, vp, vq, zqa, zq0, zq1, zq2, zee 
    259392      !!--------------------------------------------------------------------- 
    260393      ! 
     
    262395      ! 
    263396      CALL wrk_alloc( jpi,jpj, zwnd_i, zwnd_j, zqsatw, zqlw, zqsb, zqla, zevap ) 
    264       CALL wrk_alloc( jpi,jpj, Cd, Ch, Ce, zst, zt_zu, zq_zu ) 
     397      CALL wrk_alloc( jpi,jpj, Cd, Ch, Ce, zst, zt_zu, zq_zu ,zqatm, zpatm ) 
    265398      ! 
    266399      ! local scalars ( place there for vector optimisation purposes) 
     
    314447      ! ... specific humidity at SST and IST 
    315448      zqsatw(:,:) = zcoef_qsatw * EXP( -5107.4 / zst(:,:) ) 
    316  
     449      ! 
     450      IF ( ln_humi_rel ) THEN 
     451         zq0    = rvap / rgas - 1.0 
     452         zq1    = rgas / rvap 
     453         zq2    = 1.0 - zq1 
     454         zpatm(:,:) = 100800.                   ! atmospheric pressure (assumed constant  here) 
     455         IF ( ln_apr_dyn ) zpatm(:,:) = apr(:,:) 
     456         DO jj = 1 , jpj 
     457            DO ji = 1 , jpi 
     458               vt  = sf(jp_tair)%fnow(ji,jj,1) - rt0  ! air temperature (Celsius) 
     459               vp  = zpatm(ji,jj) / 100.              ! mean sea level pressure (mb or hPa) 
     460               vq  = sf(jp_humi)%fnow(ji,jj,1)        ! relative humidity (fraction of 1) 
     461               ! Convert RH at the air/sea interface in specific humidity (kg/kg) 
     462               ! Teten's formula for qsat (mb) 
     463               zqa = ( 1.0007 + 3.46e-6 * vp) * 6.1121 * EXP( 17.502 * vt / ( 240.97+vt ) ) 
     464               zee = zqa * vq                         ! vapour partial pressure (mb) 
     465               vq  = zq1 * zee / ( vp - zq2 * zee )   ! specific humidity (kg/kg) 
     466               zqatm(ji,jj) = vq 
     467            ENDDO 
     468         ENDDO 
     469      ELSE 
     470         zqatm(:,:)=sf(jp_humi)%fnow(:,:,1) 
     471      ENDIF 
     472      ! 
    317473      ! ... NCAR Bulk formulae, computation of Cd, Ch, Ce at T-point : 
    318       CALL turb_core_2z( rn_zqt, rn_zu, zst, sf(jp_tair)%fnow, zqsatw, sf(jp_humi)%fnow, wndm,   & 
     474      CALL turb_core_2z( rn_zqt, rn_zu, zst, sf(jp_tair)%fnow, zqsatw, zqatm, wndm,   & 
    319475         &               Cd, Ch, Ce, zt_zu, zq_zu ) 
    320476     
     
    354510      IF( ABS( rn_zu - rn_zqt) < 0.01_wp ) THEN 
    355511         !! q_air and t_air are (or "are almost") given at 10m (wind reference height) 
    356          zevap(:,:) = rn_efac*MAX( 0._wp,     rhoa*Ce(:,:)*( zqsatw(:,:) - sf(jp_humi)%fnow(:,:,1) )*wndm(:,:) ) ! Evaporation 
     512         !zevap(:,:) = rn_efac*MAX( 0._wp,     rhoa*Ce(:,:)*( zqsatw(:,:) - sf(jp_humi)%fnow(:,:,1) )*wndm(:,:) ) ! Evaporation 
     513          zevap(:,:) = rn_efac*MAX( 0._wp,     rhoa*Ce(:,:)*( zqsatw(:,:) - zqatm(:,:)              )*wndm(:,:) ) ! Evaporation 
    357514         zqsb (:,:) =                     cpa*rhoa*Ch(:,:)*( zst   (:,:) - sf(jp_tair)%fnow(:,:,1) )*wndm(:,:)   ! Sensible Heat 
    358515      ELSE 
     
    414571      ! 
    415572      CALL wrk_dealloc( jpi,jpj, zwnd_i, zwnd_j, zqsatw, zqlw, zqsb, zqla, zevap ) 
    416       CALL wrk_dealloc( jpi,jpj, Cd, Ch, Ce, zst, zt_zu, zq_zu ) 
     573      CALL wrk_dealloc( jpi,jpj, Cd, Ch, Ce, zst, zt_zu, zq_zu, zqatm, zpatm ) 
    417574      ! 
    418575      IF( nn_timing == 1 )  CALL timing_stop('blk_oce_core') 
     
    437594      REAL(wp) ::             zwndi_t , zwndj_t               ! relative wind components at T-point 
    438595      !!--------------------------------------------------------------------- 
    439       ! 
     596 
    440597      IF( nn_timing == 1 )  CALL timing_start('blk_ice_core_tau') 
    441598      ! 
     
    530687      REAL(wp) ::   zcoef_dqlw, zcoef_dqla, zcoef_dqsb 
    531688      REAL(wp) ::   zztmp, z1_lsub                               ! temporary variable 
     689      REAL(wp) ::   ztamr,zmt1,zmt2,zmt3,zev,zes 
    532690      !! 
    533691      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw             ! long wave heat flux over ice 
     
    536694      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_dqsb            ! sensible  heat sensitivity over ice 
    537695      REAL(wp), DIMENSION(:,:)  , POINTER ::   zevap, zsnw       ! evaporation and snw distribution after wind blowing (LIM3) 
     696      REAL(wp), DIMENSION(:,:)  , POINTER ::   zqatm, zpatm , ztatm            ! specific humidity 
    538697      !!--------------------------------------------------------------------- 
    539698      ! 
     
    541700      ! 
    542701      CALL wrk_alloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb )  
     702      CALL wrk_alloc( jpi,jpj, zqatm, zpatm, ztatm ) 
     703  
     704     IF ( ln_humi_rel ) THEN 
     705         zpatm(:,:) = 100800.                   ! atmospheric pressure (assumed constant here) 
     706         IF (ln_apr_dyn) zpatm(:,:) = apr(:,:) 
     707         DO jj=1,jpj 
     708            DO ji=1,jpi 
     709               ztatm (ji,jj) = sf(jp_tair)%fnow(ji,jj,1)                   ! air temperature in Kelvins 
     710               ztamr = ztatm(ji,jj) - rtt                                  ! Saturation water vapour 
     711               zmt1  = SIGN( 17.269,  ztamr ) 
     712               zmt2  = SIGN( 21.875,  ztamr ) 
     713               zmt3  = SIGN( 28.200, -ztamr ) 
     714               zes   = 611.0 * EXP(  ABS( ztamr ) * MIN ( zmt1, zmt2 )   & 
     715                  &                / ( ztatm(ji,jj) - 35.86  + MAX( 0.e0, zmt3 ) )  ) 
     716               zev = sf(jp_humi)%fnow(ji,jj,1) * zes                       ! vapour pressure 
     717               zqatm(ji,jj) = 0.622 * zev / ( zpatm(ji,jj) - 0.378 * zev ) ! specific humidity 
     718            ENDDO 
     719         ENDDO 
     720      ELSE 
     721         zqatm(:,:) = sf(jp_humi)%fnow(:,:,1) 
     722      ENDIF 
    543723 
    544724      ! local scalars ( place there for vector optimisation purposes) 
     
    574754               ! Latent Heat 
    575755               qla_ice(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls  * Cice * wndm_ice(ji,jj)   &                            
    576                   &                         * (  11637800. * EXP( -5897.8 / ptsu(ji,jj,jl) ) / rhoa - sf(jp_humi)%fnow(ji,jj,1)  ) ) 
     756                  &                         * (  11637800. * EXP( -5897.8 / ptsu(ji,jj,jl) ) / rhoa - zqatm(ji,jj)  ) ) 
    577757              ! Latent heat sensitivity for ice (Dqla/Dt) 
    578758               IF( qla_ice(ji,jj,jl) > 0._wp ) THEN 
     
    659839      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_core_flx') 
    660840       
     841      CALL wrk_dealloc( jpi,jpj, zqatm, zpatm, ztatm ) 
    661842   END SUBROUTINE blk_ice_core_flx 
    662843#endif 
Note: See TracChangeset for help on using the changeset viewer.