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 5965 for branches/2014/dev_r4650_UKMO14.5_SST_BIAS_CORRECTION/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssm.F90 – NEMO

Ignore:
Timestamp:
2015-12-01T16:35:30+01:00 (8 years ago)
Author:
timgraham
Message:

Upgraded branch to r5518 of trunk (v3.6 stable revision)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO14.5_SST_BIAS_CORRECTION/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssm.F90

    r4292 r5965  
    1414   USE oce             ! ocean dynamics and tracers 
    1515   USE dom_oce         ! ocean space and time domain 
    16    USE sbc_oce         ! Surface boundary condition: ocean fields 
    1716   USE sbc_oce         ! surface boundary condition: ocean fields 
    1817   USE sbcapr          ! surface boundary condition: atmospheric pressure 
    19    USE prtctl          ! Print control                    (prt_ctl routine) 
    20    USE iom 
     18   USE eosbn2          ! equation of state and related derivatives 
     19   ! 
    2120   USE in_out_manager  ! I/O manager 
     21   USE prtctl          ! Print control 
     22   USE iom             ! IOM library 
    2223 
    2324   IMPLICIT NONE 
     
    5455      INTEGER, INTENT(in) ::   kt   ! ocean time step 
    5556      ! 
     57      INTEGER  ::   ji, jj               ! loop index 
    5658      REAL(wp) ::   zcoef, zf_sbc       ! local scalar 
     59      REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts 
    5760      !!--------------------------------------------------------------------- 
    58       !                                                   ! ---------------------------------------- ! 
     61 
     62      !                                        !* surface T-, U-, V- ocean level variables (T, S, depth, velocity) 
     63      DO jj = 1, jpj 
     64         DO ji = 1, jpi 
     65            zts(ji,jj,jp_tem) = tsn(ji,jj,mikt(ji,jj),jp_tem) 
     66            zts(ji,jj,jp_sal) = tsn(ji,jj,mikt(ji,jj),jp_sal) 
     67         END DO 
     68      END DO 
     69      ! 
    5970      IF( nn_fsbc == 1 ) THEN                             !   Instantaneous surface fields        ! 
    6071         !                                                ! ---------------------------------------- ! 
    6172         ssu_m(:,:) = ub(:,:,1) 
    6273         ssv_m(:,:) = vb(:,:,1) 
    63          sst_m(:,:) = tsn(:,:,1,jp_tem) 
    64          sss_m(:,:) = tsn(:,:,1,jp_sal) 
     74         IF( ln_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
     75         ELSE                    ;   sst_m(:,:) = zts(:,:,jp_tem) 
     76         ENDIF 
     77         sss_m(:,:) = zts(:,:,jp_sal) 
    6578         !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 
    6679         IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
     
    6881         ENDIF 
    6982         ! 
    70          IF( lk_vvl )   fse3t_m(:,:) = fse3t_n(:,:,1) 
     83         IF( lk_vvl )   e3t_m(:,:) = fse3t_n(:,:,1) 
     84         ! 
     85         frq_m(:,:) = fraqsr_1lev(:,:) 
    7186         ! 
    7287      ELSE 
     
    7994            ssu_m(:,:) = zcoef * ub(:,:,1) 
    8095            ssv_m(:,:) = zcoef * vb(:,:,1) 
    81             sst_m(:,:) = zcoef * tsn(:,:,1,jp_tem) 
    82             sss_m(:,:) = zcoef * tsn(:,:,1,jp_sal) 
    83             !                          ! removed inverse barometer ssh when Patm forcing is used  
     96            IF( ln_useCT )  THEN    ;   sst_m(:,:) = zcoef * eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
     97            ELSE                    ;   sst_m(:,:) = zcoef * zts(:,:,jp_tem) 
     98            ENDIF 
     99            sss_m(:,:) = zcoef * zts(:,:,jp_sal) 
     100            !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 
    84101            IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = zcoef * ( sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) ) 
    85             ELSE                    ;   ssh_m(:,:) = zcoef *   sshn(:,:) 
    86             ENDIF 
    87             IF( lk_vvl )   fse3t_m(:,:) = zcoef * fse3t_n(:,:,1) 
     102            ELSE                    ;   ssh_m(:,:) = zcoef * sshn(:,:) 
     103            ENDIF 
     104            ! 
     105            IF( lk_vvl )   e3t_m(:,:) = zcoef * fse3t_n(:,:,1) 
     106            ! 
     107            frq_m(:,:) = zcoef * fraqsr_1lev(:,:) 
    88108            !                                             ! ---------------------------------------- ! 
    89109         ELSEIF( MOD( kt - 2 , nn_fsbc ) == 0 ) THEN      !   Initialisation: New mean computation   ! 
     
    94114            sss_m(:,:) = 0.e0 
    95115            ssh_m(:,:) = 0.e0 
    96             IF( lk_vvl )   fse3t_m(:,:) = 0.e0 
     116            IF( lk_vvl )   e3t_m(:,:) = 0.e0 
     117            frq_m(:,:) = 0.e0 
    97118         ENDIF 
    98119         !                                                ! ---------------------------------------- ! 
     
    101122         ssu_m(:,:) = ssu_m(:,:) + ub(:,:,1) 
    102123         ssv_m(:,:) = ssv_m(:,:) + vb(:,:,1) 
    103          sst_m(:,:) = sst_m(:,:) + tsn(:,:,1,jp_tem) 
    104          sss_m(:,:) = sss_m(:,:) + tsn(:,:,1,jp_sal) 
     124         IF( ln_useCT )  THEN    ;   sst_m(:,:) = sst_m(:,:) + eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
     125         ELSE                    ;   sst_m(:,:) = sst_m(:,:) + zts(:,:,jp_tem) 
     126         ENDIF 
     127         sss_m(:,:) = sss_m(:,:) + zts(:,:,jp_sal) 
    105128         !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics) 
    106          IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) - 0.5 *  ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
     129         IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
    107130         ELSE                    ;   ssh_m(:,:) = ssh_m(:,:) + sshn(:,:) 
    108131         ENDIF 
    109          IF( lk_vvl )   fse3t_m(:,:) = fse3t_m(:,:) + fse3t_n(:,:,1) 
     132         ! 
     133         IF( lk_vvl )   e3t_m(:,:) = fse3t_m(:,:) + fse3t_n(:,:,1) 
     134         ! 
     135         frq_m(:,:) =   frq_m(:,:) + fraqsr_1lev(:,:) 
    110136 
    111137         !                                                ! ---------------------------------------- ! 
     
    118144            ssv_m(:,:) = ssv_m(:,:) * zcoef           ! 
    119145            ssh_m(:,:) = ssh_m(:,:) * zcoef           ! mean SSH             [m] 
    120             IF( lk_vvl )   fse3t_m(:,:) = fse3t_m(:,:) * zcoef   ! mean vertical scale factor [m] 
     146            IF( lk_vvl )   e3t_m(:,:) = fse3t_m(:,:) * zcoef   ! mean vertical scale factor [m] 
     147            frq_m(:,:) = frq_m(:,:) * zcoef   ! mean fraction of solar net radiation absorbed in the 1st T level [-] 
    121148            ! 
    122149         ENDIF 
     
    135162            CALL iom_rstput( kt, nitrst, numrow, 'sss_m'  , sss_m  ) 
    136163            CALL iom_rstput( kt, nitrst, numrow, 'ssh_m'  , ssh_m  ) 
    137             IF( lk_vvl ) THEN 
    138                CALL iom_rstput( kt, nitrst, numrow, 'fse3t_m'  , fse3t_m(:,:)  ) 
    139             END IF 
    140             ! 
    141          ENDIF 
    142          ! 
     164            IF( lk_vvl )   CALL iom_rstput( kt, nitrst, numrow, 'e3t_m'  , e3t_m  ) 
     165            CALL iom_rstput( kt, nitrst, numrow, 'frq_m'  , frq_m  ) 
     166            ! 
     167         ENDIF 
     168         ! 
     169      ENDIF 
     170      ! 
     171      IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN          !   Mean value at each nn_fsbc time-step   ! 
     172         CALL iom_put( 'ssu_m', ssu_m ) 
     173         CALL iom_put( 'ssv_m', ssv_m ) 
     174         CALL iom_put( 'sst_m', sst_m ) 
     175         CALL iom_put( 'sss_m', sss_m ) 
     176         CALL iom_put( 'ssh_m', ssh_m ) 
     177         IF( lk_vvl )   CALL iom_put( 'e3t_m', e3t_m ) 
     178         CALL iom_put( 'frq_m', frq_m ) 
    143179      ENDIF 
    144180      ! 
     
    176212            CALL iom_get( numror, jpdom_autoglo, 'sss_m'  , sss_m  )   !   "         "    salinity    (T-point) 
    177213            CALL iom_get( numror, jpdom_autoglo, 'ssh_m'  , ssh_m  )   !   "         "    height      (T-point) 
    178             IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'fse3t_m', fse3t_m(:,:) ) 
     214            IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'e3t_m', e3t_m ) 
     215            ! fraction of solar net radiation absorbed in 1st T level 
     216            IF( iom_varid( numror, 'frq_m', ldstop = .FALSE. ) > 0 ) THEN 
     217               CALL iom_get( numror, jpdom_autoglo, 'frq_m'  , frq_m  ) 
     218            ELSE 
     219               frq_m(:,:) = 1._wp   ! default definition 
     220            ENDIF 
    179221            ! 
    180222            IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN      ! nn_fsbc has changed between 2 runs 
     
    187229               sss_m(:,:) = zcoef * sss_m(:,:) 
    188230               ssh_m(:,:) = zcoef * ssh_m(:,:) 
    189                IF( lk_vvl ) fse3t_m(:,:) = zcoef * fse3t_m(:,:) 
     231               IF( lk_vvl )   e3t_m(:,:) = zcoef * fse3t_m(:,:) 
     232               frq_m(:,:) = zcoef * frq_m(:,:) 
    190233            ELSE 
    191234               IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields read in the ocean restart file' 
     
    194237      ENDIF 
    195238      ! 
     239      IF( .NOT. l_ssm_mean ) THEN   ! default initialisation. needed by lim_istate 
     240         ! 
     241         IF(lwp) WRITE(numout,*) '          default initialisation of ss?_m arrays' 
     242         ssu_m(:,:) = ub(:,:,1) 
     243         ssv_m(:,:) = vb(:,:,1) 
     244         IF( ln_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 
     245         ELSE                    ;   sst_m(:,:) = tsn(:,:,1,jp_tem) 
     246         ENDIF 
     247         sss_m(:,:) = tsn(:,:,1,jp_sal) 
     248         ssh_m(:,:) = sshn(:,:) 
     249         IF( lk_vvl )   e3t_m(:,:) = fse3t_n(:,:,1) 
     250         frq_m(:,:) = 1._wp 
     251         ! 
     252      ENDIF 
     253      ! 
    196254   END SUBROUTINE sbc_ssm_init 
    197255 
Note: See TracChangeset for help on using the changeset viewer.