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 2257 for branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90 – NEMO

Ignore:
Timestamp:
2010-10-13T17:58:28+02:00 (14 years ago)
Author:
cetlod
Message:

Apply the modified leap-frog scheme on runoff & correct a bug on time stepping for hpg implicit case

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90

    r2239 r2257  
    3131   CHARACTER(len=100), PUBLIC ::   cn_dir       = './'    !: Root directory for location of ssr files 
    3232   LOGICAL           , PUBLIC ::   ln_rnf_depth = .false. !: depth       river runoffs attribute specified in a file 
    33    LOGICAL           , PUBLIC ::   ln_rnf_temp  = .false. !: temperature river runoffs attribute specified in a file  
     33   LOGICAL           , PUBLIC ::   ln_rnf_tem   = .false. !: temperature river runoffs attribute specified in a file  
    3434   LOGICAL           , PUBLIC ::   ln_rnf_sal   = .false. !: salinity    river runoffs attribute specified in a file  
    3535   LOGICAL           , PUBLIC ::   ln_rnf_emp   = .false. !: runoffs into a file to be read or already into precipitation 
     
    5656   INTEGER,  PUBLIC, DIMENSION(jpi,jpj) ::   nk_rnf       !: depth of runoff in model levels 
    5757 
    58    REAL(wp), PUBLIC, DIMENSION(jpi,jpj,2) ::  tsc_rnf  !: temperature & salinity content of river runoffs   [K.m/s & PSU.m/s] 
     58   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpts) :: rnf_tsc_b, rnf_tsc  !: before and now  
     59   !                                                                 !: temp. & sal. content of river runoffs   [K.m/s & PSU.m/s] 
    5960 
    6061   !! * Substitutions   
     
    8889      IF( kt == nit000 )   CALL sbc_rnf_init                           ! Read namelist and allocate structures 
    8990 
     91      !                                            ! ---------------------------------------- ! 
     92      IF( kt /= nit000 ) THEN                      !          Swap of forcing fields          ! 
     93         !                                         ! ---------------------------------------- ! 
     94         rnf_b    (:,:  ) = rnf    (:,:  )               ! Swap the ocean forcing fields except at nit000 
     95         rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:)               ! where before fields are set at the end of the routine 
     96         ! 
     97      ENDIF 
     98 
    9099      !                                                   !-------------------! 
    91100      IF( .NOT. ln_rnf_emp ) THEN                         !   Update runoff   ! 
    92101         !                                                !-------------------! 
    93102         ! 
    94                              CALL fld_read ( kt, nn_fsbc, sf_rnf     ! Read Runoffs data and provide it at kt  
    95          IF( ln_rnf_temp )   CALL fld_read ( kt, nn_fsbc, sf_t_rnf )    ! idem for runoffs temperature if required 
     103                             CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt  
     104         IF( ln_rnf_tem  )   CALL fld_read ( kt, nn_fsbc, sf_t_rnf )    ! idem for runoffs temperature if required 
    96105         IF( ln_rnf_sal  )   CALL fld_read ( kt, nn_fsbc, sf_s_rnf )    ! idem for runoffs salinity    if required 
    97106 
     
    107116 
    108117         ! C a u t i o n : runoff is negative and in kg/m2/s  
    109  
    110          IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN 
     118         IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 
    111119            rnf(:,:)  = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) )   
    112120            ! 
    113121            z1_rau0 = 1.e0 / rau0 
    114122            !                                                              ! set temperature & salinity content of runoffs 
    115             IF( ln_rnf_temp )   THEN                                       ! use runoffs temperature data 
    116                tsc_rnf(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * z1_rau0 
     123            IF( ln_rnf_tem )   THEN                                        ! use runoffs temperature data 
     124               rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * z1_rau0 
    117125               WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999 )                      ! if missing data value use SST as runoffs temperature   
    118                    tsc_rnf(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 
     126                   rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 
    119127               ENDWHERE 
    120128            ELSE                                                           ! use SST as runoffs temperature 
    121                tsc_rnf(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 
     129               rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 
    122130            ENDIF   
    123131            !                                                              ! use runoffs salinity data  
    124             IF( ln_rnf_sal ) tsc_rnf(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * z1_rau0 
     132            IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * z1_rau0 
    125133            !                                                              ! else use S=0 for runoffs (done one for all in the init) 
    126134            ! 
    127             IF( ln_rnf_temp .OR. ln_rnf_sal ) THEN                         ! runoffs as outflow: use ocean SST and SSS 
     135            IF( ln_rnf_tem .OR. ln_rnf_sal ) THEN                         ! runoffs as outflow: use ocean SST and SSS 
    128136               WHERE( rnf(:,:) < 0.e0 )                                    ! example baltic model when flow is out of domain  
    129                   tsc_rnf(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 
    130                   tsc_rnf(:,:,jp_sal) = sss_m(:,:) * rnf(:,:) * z1_rau0 
     137                  rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 
     138                  rnf_tsc(:,:,jp_sal) = sss_m(:,:) * rnf(:,:) * z1_rau0 
    131139               ENDWHERE 
    132140            ENDIF 
    133  
     141            ! 
    134142            CALL iom_put( "runoffs", rnf )         ! output runoffs arrays 
    135143         ENDIF 
    136144         ! 
    137145      ENDIF 
     146      ! 
     147      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    ! 
     148         !                                             ! ---------------------------------------- ! 
     149         IF( ln_rstart .AND.    &                               !* Restart: read in restart file 
     150            & iom_varid( numror, 'rnf_b', ldstop = .FALSE. ) > 0 ) THEN  
     151            IF(lwp) WRITE(numout,*) '          nit000-1 runoff forcing fields red in the restart file' 
     152            CALL iom_get( numror, jpdom_autoglo, 'rnf_b', rnf_b )     ! before runoff 
     153            CALL iom_get( numror, jpdom_autoglo, 'rnf_hc_b', rnf_tsc_b(:,:,jp_tem) )   ! before heat content of runoff 
     154            CALL iom_get( numror, jpdom_autoglo, 'rnf_sc_b', rnf_tsc_b(:,:,jp_sal) )   ! before salinity content of runoff 
     155         ELSE                                                   !* no restart: set from nit000 values 
     156            IF(lwp) WRITE(numout,*) '          nit000-1 runoff forcing fields set to nit000' 
     157             rnf_b    (:,:  ) = rnf    (:,:  )   
     158             rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:)    
     159         ENDIF 
     160      ENDIF 
     161      !                                                ! ---------------------------------------- ! 
     162      IF( lrst_oce ) THEN                              !      Write in the ocean restart file     ! 
     163         !                                             ! ---------------------------------------- ! 
     164         IF(lwp) WRITE(numout,*) 
     165         IF(lwp) WRITE(numout,*) 'sbcrnf : runoff forcing fields written in ocean restart file ',   & 
     166            &                    'at it= ', kt,' date= ', ndastp 
     167         IF(lwp) WRITE(numout,*) '~~~~' 
     168         CALL iom_rstput( kt, nitrst, numrow, 'rnf_b' , rnf ) 
     169         CALL iom_rstput( kt, nitrst, numrow, 'rnf_hc_b', rnf_tsc(:,:,jp_tem) ) 
     170         CALL iom_rstput( kt, nitrst, numrow, 'rnf_sc_b', rnf_tsc(:,:,jp_sal) ) 
     171      ENDIF 
     172 
    138173      ! 
    139174   END SUBROUTINE sbc_rnf 
     
    202237      INTEGER           ::   ierror, inum  ! temporary integer 
    203238      !!  
    204       NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_temp, ln_rnf_sal,   & 
    205          &                 sn_rnf, sn_cnf    , sn_s_rnf    , sn_t_rnf   , sn_dep_rnf,   &   
    206          &                 ln_rnf_mouth      , rn_hrnf     , rn_avt_rnf , rn_rfact   
     239      NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal,   & 
     240         &                 sn_rnf, sn_cnf    , sn_s_rnf    , sn_t_rnf  , sn_dep_rnf,   &   
     241         &                 ln_rnf_mouth      , rn_hrnf     , rn_avt_rnf, rn_rfact   
    207242      !!---------------------------------------------------------------------- 
    208243 
     
    243278         IF(lwp) WRITE(numout,*) 
    244279         IF(lwp) WRITE(numout,*) '          runoffs directly provided in the precipitations' 
    245          IF( ln_rnf_depth .OR. ln_rnf_temp .OR. ln_rnf_sal ) THEN 
     280         IF( ln_rnf_depth .OR. ln_rnf_tem .OR. ln_rnf_sal ) THEN 
    246281           CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' )  
    247            ln_rnf_depth = .FALSE.   ;   ln_rnf_temp = .FALSE.   ;   ln_rnf_sal = .FALSE. 
     282           ln_rnf_depth = .FALSE.   ;   ln_rnf_tem = .FALSE.   ;   ln_rnf_sal = .FALSE. 
    248283         ENDIF 
    249284         ! 
     
    261296         CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 
    262297         ! 
    263          IF( ln_rnf_temp ) THEN                     ! Create (if required) sf_t_rnf structure 
     298         IF( ln_rnf_tem ) THEN                     ! Create (if required) sf_t_rnf structure 
    264299            IF(lwp) WRITE(numout,*) 
    265300            IF(lwp) WRITE(numout,*) '          runoffs temperatures read in a file' 
     
    294329            CALL iom_close( inum )                                      ! close file   
    295330   
    296             nk_rnf(:,:)=0                              ! set the number of level over which river runoffs are applied 
    297             DO jj=1,jpj   
    298               DO ji=1,jpi   
     331            nk_rnf(:,:) = 0                              ! set the number of level over which river runoffs are applied 
     332            DO jj = 1, jpj   
     333              DO ji = 1, jpi   
    299334                IF ( h_rnf(ji,jj) > 0.e0 ) THEN   
    300                   jk= 
    301                   DO WHILE ( jk/=(mbathy(ji,jj)-1) .AND. fsdept(ji,jj,jk) < h_rnf(ji,jj) );  jk=jk+1;   ENDDO   
    302                   nk_rnf(ji,jj)=jk   
    303                 ELSE IF ( h_rnf(ji,jj) == -1   ) THEN   ;  nk_rnf(ji,jj)= 
    304                 ELSE IF ( h_rnf(ji,jj) == -999 ) THEN   ;  nk_rnf(ji,jj)=mbathy(ji,jj)-1 
     335                  jk =  
     336                  DO WHILE ( jk /= ( mbathy(ji,jj) - 1 ) .AND. fsdept(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 ;  ENDDO   
     337                  nk_rnf(ji,jj) = jk   
     338                ELSE IF ( h_rnf(ji,jj) == -1   ) THEN   ;  nk_rnf(ji,jj) =  
     339                ELSE IF ( h_rnf(ji,jj) == -999 ) THEN   ;  nk_rnf(ji,jj) = mbathy(ji,jj) - 1 
    305340                ELSE IF ( h_rnf(ji,jj) /= 0 ) THEN   
    306341                  CALL ctl_stop( 'runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  )   
     
    309344              ENDDO   
    310345            ENDDO   
    311             DO jj=1,jpj                               ! set the associated depth  
    312               DO ji=1,jpi  
    313                 h_rnf(ji,jj)=0.e0 
    314                 DO jk=1,nk_rnf(ji,jj)                         
    315                    h_rnf(ji,jj)=h_rnf(ji,jj)+fse3t(ji,jj,jk)   
     346            DO jj = 1, jpj                               ! set the associated depth  
     347              DO ji = 1, jpi  
     348                h_rnf(ji,jj) = 0.e0 
     349                DO jk = 1, nk_rnf(ji,jj)                         
     350                   h_rnf(ji,jj) = h_rnf(ji,jj)+fse3t(ji,jj,jk)   
    316351                ENDDO 
    317352              ENDDO 
    318353            ENDDO 
    319354         ELSE                                       ! runoffs applied at the surface  
    320             nk_rnf(:,:)= 
    321             h_rnf(:,:)=fse3t(:,:,1) 
     355            nk_rnf(:,:) =  
     356            h_rnf(:,:)  = fse3t(:,:,1) 
    322357         ENDIF   
    323358      !  
    324359      ENDIF 
    325360 
    326       tsc_rnf(:,:,:) = 0.e0                 ! runoffs temperature & salinty contents initilisation 
     361      rnf_tsc(:,:,:) = 0.e0                 ! runoffs temperature & salinty contents initilisation 
    327362      !                                   ! ======================== 
    328363      !                                   !   River mouth vicinity 
Note: See TracChangeset for help on using the changeset viewer.