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 12249 for NEMO/branches/2019/dev_r11943_MERGE_2019/tests/STATION_ASF/MY_SRC/sbcssm.F90 – NEMO

Ignore:
Timestamp:
2019-12-13T19:48:00+01:00 (4 years ago)
Author:
laurent
Message:

Made STATION_ASF testcase fully compliant with new timestepping scheme.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11943_MERGE_2019/tests/STATION_ASF/MY_SRC/sbcssm.F90

    r11831 r12249  
    1414   USE c1d            ! 1D configuration: lk_c1d 
    1515   USE dom_oce        ! ocean domain: variables 
    16    !LB:USE zdf_oce        ! ocean vertical physics: variables 
    1716   USE sbc_oce        ! surface module: variables 
    1817   USE phycst         ! physical constants 
    1918   USE eosbn2         ! equation of state - Brunt Vaisala frequency 
    2019   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    21    !LB:USE zpshde         ! z-coord. with partial steps: horizontal derivatives 
    22    !LB:USE closea         ! for ln_closea 
    2320   ! 
    2421   USE in_out_manager ! I/O manager 
     
    2623   USE lib_mpp        ! distributed memory computing library 
    2724   USE prtctl         ! print control 
    28    USE fldread        ! read input fields  
     25   USE fldread        ! read input fields 
    2926   USE timing         ! Timing 
    3027 
     
    3229   PRIVATE 
    3330 
    34    PUBLIC   sbc_ssm        ! routine called by step.F90 
    35    PUBLIC   sbc_ssm_init   ! routine called by sbcmod.F90 
     31   PUBLIC   sbc_ssm_init   ! called by sbc_init 
     32   PUBLIC   sbc_ssm        ! called by sbc 
    3633 
    3734   CHARACTER(len=100) ::   cn_dir        ! Root directory for location of ssm files 
    3835   LOGICAL            ::   ln_3d_uve     ! specify whether input velocity data is 3D 
    3936   LOGICAL            ::   ln_read_frq   ! specify whether we must read frq or not 
    40     
     37 
    4138   LOGICAL            ::   l_sasread     ! Ice intilisation: =T read a file ; =F anaytical initilaistion 
    4239   LOGICAL            ::   l_initdone = .false. 
     
    6259CONTAINS 
    6360 
    64    SUBROUTINE sbc_ssm( kt ) 
     61   SUBROUTINE sbc_ssm( kt, Kbb, Kmm ) 
    6562      !!---------------------------------------------------------------------- 
    6663      !!                  ***  ROUTINE sbc_ssm  *** 
     
    6966      !!               for an off-line simulation using surface processes only 
    7067      !! 
    71       !! ** Method : calculates the position of data  
     68      !! ** Method : calculates the position of data 
    7269      !!             - interpolates data if needed 
    7370      !!---------------------------------------------------------------------- 
    7471      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     72      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices 
     73      ! (not needed for SAS but needed to keep a consistent interface in sbcmod.F90) 
    7574      ! 
    7675      INTEGER  ::   ji, jj     ! dummy loop indices 
     
    8079      ! 
    8180      IF( ln_timing )   CALL timing_start( 'sbc_ssm') 
    82       
     81 
    8382      IF ( l_sasread ) THEN 
    8483         IF( nfld_3d > 0 ) CALL fld_read( kt, 1, sf_ssm_3d )      !==   read data at kt time step   ==! 
    8584         IF( nfld_2d > 0 ) CALL fld_read( kt, 1, sf_ssm_2d )      !==   read data at kt time step   ==! 
    86          !  
     85         ! 
    8786         IF( ln_3d_uve ) THEN 
    8887            IF( .NOT. ln_linssh ) THEN 
    89                e3t_m(:,:) = sf_ssm_3d(jf_e3t)%fnow(:,:,1) * tmask(:,:,1) ! vertical scale factor  
     88               e3t_m(:,:) = sf_ssm_3d(jf_e3t)%fnow(:,:,1) * tmask(:,:,1) ! vertical scale factor 
    9089            ELSE 
    9190               e3t_m(:,:) = e3t_0(:,:,1)                                 ! vertical scale factor 
    9291            ENDIF 
    9392            ssu_m(:,:) = sf_ssm_3d(jf_usp)%fnow(:,:,1) * umask(:,:,1)    ! u-velocity 
    94             ssv_m(:,:) = sf_ssm_3d(jf_vsp)%fnow(:,:,1) * vmask(:,:,1)    ! v-velocity  
     93            ssv_m(:,:) = sf_ssm_3d(jf_vsp)%fnow(:,:,1) * vmask(:,:,1)    ! v-velocity 
    9594         ELSE 
    9695            IF( .NOT. ln_linssh ) THEN 
    97                e3t_m(:,:) = sf_ssm_2d(jf_e3t)%fnow(:,:,1) * tmask(:,:,1) ! vertical scale factor  
     96               e3t_m(:,:) = sf_ssm_2d(jf_e3t)%fnow(:,:,1) * tmask(:,:,1) ! vertical scale factor 
    9897            ELSE 
    9998               e3t_m(:,:) = e3t_0(:,:,1)                                 ! vertical scale factor 
    10099            ENDIF 
    101100            ssu_m(:,:) = sf_ssm_2d(jf_usp)%fnow(:,:,1) * umask(:,:,1)    ! u-velocity 
    102             ssv_m(:,:) = sf_ssm_2d(jf_vsp)%fnow(:,:,1) * vmask(:,:,1)    ! v-velocity  
     101            ssv_m(:,:) = sf_ssm_2d(jf_vsp)%fnow(:,:,1) * vmask(:,:,1)    ! v-velocity 
    103102         ENDIF 
    104103         ! 
     
    119118         IF( .NOT. ln_linssh ) e3t_m(:,:) = e3t_0(:,:,1) !clem: necessary at least for sas2D 
    120119         frq_m(:,:) = 1._wp                              !              - - 
    121          sshn (:,:) = 0._wp                              !              - - 
    122       ENDIF 
    123        
     120         ssh  (:,:,Kmm) = 0._wp                              !              - - 
     121      ENDIF 
     122 
    124123      IF ( nn_ice == 1 ) THEN 
    125          tsn(:,:,1,jp_tem) = sst_m(:,:) 
    126          tsn(:,:,1,jp_sal) = sss_m(:,:) 
    127          tsb(:,:,1,jp_tem) = sst_m(:,:) 
    128          tsb(:,:,1,jp_sal) = sss_m(:,:) 
    129       ENDIF 
    130       ub (:,:,1) = ssu_m(:,:) 
    131       vb (:,:,1) = ssv_m(:,:) 
    132   
    133       IF(ln_ctl) THEN                  ! print control 
     124         ts(:,:,1,jp_tem,Kmm) = sst_m(:,:) 
     125         ts(:,:,1,jp_sal,Kmm) = sss_m(:,:) 
     126         ts(:,:,1,jp_tem,Kbb) = sst_m(:,:) 
     127         ts(:,:,1,jp_sal,Kbb) = sss_m(:,:) 
     128      ENDIF 
     129      uu (:,:,1,Kbb) = ssu_m(:,:) 
     130      vv (:,:,1,Kbb) = ssv_m(:,:) 
     131 
     132      IF(sn_cfctl%l_prtctl) THEN            ! print control 
    134133         CALL prt_ctl(tab2d_1=sst_m, clinfo1=' sst_m   - : ', mask1=tmask   ) 
    135134         CALL prt_ctl(tab2d_1=sss_m, clinfo1=' sss_m   - : ', mask1=tmask   ) 
     
    156155 
    157156 
    158    SUBROUTINE sbc_ssm_init 
     157   SUBROUTINE sbc_ssm_init( Kbb, Kmm ) 
    159158      !!---------------------------------------------------------------------- 
    160159      !!                  ***  ROUTINE sbc_ssm_init  *** 
    161160      !! 
    162       !! ** Purpose :   Initialisation of sea surface mean data      
    163       !!---------------------------------------------------------------------- 
     161      !! ** Purpose :   Initialisation of sea surface mean data 
     162      !!---------------------------------------------------------------------- 
     163      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices 
     164      ! (not needed for SAS but needed to keep a consistent interface in sbcmod.F90) 
    164165      INTEGER  :: ierr, ierr0, ierr1, ierr2, ierr3   ! return error code 
    165166      INTEGER  :: ifpr                               ! dummy loop indice 
     
    186187      ENDIF 
    187188      ! 
    188       REWIND( numnam_ref )              ! Namelist namsbc_sas in reference namelist : Input fields 
    189189      READ  ( numnam_ref, namsbc_sas, IOSTAT = ios, ERR = 901) 
    190190901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namsbc_sas in reference namelist' ) 
    191       REWIND( numnam_cfg )              ! Namelist namsbc_sas in configuration namelist : Input fields 
    192191      READ  ( numnam_cfg, namsbc_sas, IOSTAT = ios, ERR = 902 ) 
    193192902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namsbc_sas in configuration namelist' ) 
    194193      IF(lwm) WRITE ( numond, namsbc_sas ) 
    195       !            
     194      ! 
    196195      IF(lwp) THEN                              ! Control print 
    197196         WRITE(numout,*) '   Namelist namsbc_sas' 
    198          WRITE(numout,*) '      Initialisation using an input file                                 l_sasread   = ', l_sasread  
     197         WRITE(numout,*) '      Initialisation using an input file                                 l_sasread   = ', l_sasread 
    199198         WRITE(numout,*) '      Are we supplying a 3D u,v and e3 field                             ln_3d_uve   = ', ln_3d_uve 
    200199         WRITE(numout,*) '      Are we reading frq (fraction of qsr absorbed in the 1st T level)   ln_read_frq = ', ln_read_frq 
     
    220219         nn_fwb = 0 
    221220      ENDIF 
    222        
    223       !                   
     221 
     222      ! 
    224223      IF( l_sasread ) THEN                       ! store namelist information in an array 
    225          !  
     224         ! 
    226225         !! following code is a bit messy, but distinguishes between when u,v are 3d arrays and 
    227226         !! when we have other 3d arrays that we need to read in 
     
    269268         ENDIF 
    270269         ! 
    271          ierr1 = 0    ! default definition if slf_?d(ifpr)%ln_tint = .false.  
     270         ierr1 = 0    ! default definition if slf_?d(ifpr)%ln_tint = .false. 
    272271         IF( nfld_3d > 0 ) THEN 
    273272            ALLOCATE( sf_ssm_3d(nfld_3d), STAT=ierr )         ! set sf structure 
     
    276275            ENDIF 
    277276            DO ifpr = 1, nfld_3d 
    278                                             ALLOCATE( sf_ssm_3d(ifpr)%fnow(jpi,jpj,jpk)    , STAT=ierr0 ) 
     277               ALLOCATE( sf_ssm_3d(ifpr)%fnow(jpi,jpj,jpk)    , STAT=ierr0 ) 
    279278               IF( slf_3d(ifpr)%ln_tint )   ALLOCATE( sf_ssm_3d(ifpr)%fdta(jpi,jpj,jpk,2)  , STAT=ierr1 ) 
    280279               IF( ierr0 + ierr1 > 0 ) THEN 
     
    292291            ENDIF 
    293292            DO ifpr = 1, nfld_2d 
    294                                             ALLOCATE( sf_ssm_2d(ifpr)%fnow(jpi,jpj,1)    , STAT=ierr0 ) 
     293               ALLOCATE( sf_ssm_2d(ifpr)%fnow(jpi,jpj,1)    , STAT=ierr0 ) 
    295294               IF( slf_2d(ifpr)%ln_tint )   ALLOCATE( sf_ssm_2d(ifpr)%fdta(jpi,jpj,1,2)  , STAT=ierr1 ) 
    296295               IF( ierr0 + ierr1 > 0 ) THEN 
     
    307306      ENDIF 
    308307      ! 
    309       CALL sbc_ssm( nit000 )   ! need to define ss?_m arrays used in iceistate 
     308      CALL sbc_ssm( nit000, Kbb, Kmm )   ! need to define ss?_m arrays used in iceistate 
    310309      l_initdone = .TRUE. 
    311310      ! 
Note: See TracChangeset for help on using the changeset viewer.