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 2068 for branches/DEV_r1837_MLF/NEMO/OPA_SRC/TRA – NEMO

Ignore:
Timestamp:
2010-09-06T17:56:51+02:00 (14 years ago)
Author:
mlelod
Message:

ticket: #663 ensuring restartability and conservation

Location:
branches/DEV_r1837_MLF/NEMO/OPA_SRC/TRA
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/DEV_r1837_MLF/NEMO/OPA_SRC/TRA/trabbc.F90

    r1601 r2068  
    3535   REAL(wp) ::   rn_geoflx_cst = 86.4e-3      ! Constant value of geothermal heat flux 
    3636 
    37    INTEGER , DIMENSION(jpi,jpj) ::   nbotlevt   ! ocean bottom level index at T-pt 
    38    REAL(wp), DIMENSION(jpi,jpj) ::   qgh_trd0   ! geothermal heating trend 
     37   INTEGER , PUBLIC, DIMENSION(jpi,jpj) ::   nbotlevt   ! ocean bottom level index at T-pt 
     38   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qgh_trd0   ! geothermal heating trend 
    3939  
    4040   !! * Substitutions 
  • branches/DEV_r1837_MLF/NEMO/OPA_SRC/TRA/tranxt.F90

    r2005 r2068  
    178178      !! 
    179179      INTEGER  ::   ji, jj, jk      ! dummy loop indices 
    180       REAL(wp) ::   zt_m, zs_m      ! temporary scalars 
     180      REAL(wp) ::   zt_d, zs_d      ! temporary scalars 
    181181      REAL(wp) ::   ztn, zsn        !    -         - 
    182182      !!---------------------------------------------------------------------- 
     
    203203                  !                                         ! time laplacian on tracers 
    204204                  !                                         ! used for both Asselin and Brown & Campana filters 
    205                   zt_m = ta(ji,jj,jk) - 2. * tn(ji,jj,jk) + tb(ji,jj,jk) 
    206                   zs_m = sa(ji,jj,jk) - 2. * sn(ji,jj,jk) + sb(ji,jj,jk) 
     205                  zt_d = ta(ji,jj,jk) - 2. * tn(ji,jj,jk) + tb(ji,jj,jk) 
     206                  zs_d = sa(ji,jj,jk) - 2. * sn(ji,jj,jk) + sb(ji,jj,jk) 
    207207                  ! 
    208208                  !                                         ! swap of arrays 
    209                   tb(ji,jj,jk) = tn(ji,jj,jk) + atfp * zt_m               ! tb <-- tn filtered 
    210                   sb(ji,jj,jk) = sn(ji,jj,jk) + atfp * zs_m               ! sb <-- sn filtered 
     209                  tb(ji,jj,jk) = tn(ji,jj,jk) + atfp * zt_d               ! tb <-- tn filtered 
     210                  sb(ji,jj,jk) = sn(ji,jj,jk) + atfp * zs_d               ! sb <-- sn filtered 
    211211                  tn(ji,jj,jk) = ta(ji,jj,jk)                             ! tn <-- ta 
    212212                  sn(ji,jj,jk) = sa(ji,jj,jk)                             ! sn <-- sa 
    213213                  !                                         ! semi imlicit hpg computation (Brown & Campana) 
    214214                  IF( ln_dynhpg_imp ) THEN 
    215                      ta(ji,jj,jk) = ztn + rbcp * zt_m                     ! ta <-- Brown & Campana average 
    216                      sa(ji,jj,jk) = zsn + rbcp * zs_m                     ! sa <-- Brown & Campana average 
     215                     ta(ji,jj,jk) = ztn + rbcp * zt_d                     ! ta <-- Brown & Campana average 
     216                     sa(ji,jj,jk) = zsn + rbcp * zs_d                     ! sa <-- Brown & Campana average 
    217217                  ENDIF 
    218218               END DO 
     
    254254      REAL     ::   ztc_a, ztc_n, ztc_b            !    -         - 
    255255      REAL     ::   zsc_a, zsc_n, zsc_b            !    -         - 
    256       REAL     ::   ztc_f, zsc_f, ztc_m, zsc_m     !    -         - 
    257       REAL     ::   ze3t_f, ze3t_m                 !    -         - 
     256      REAL     ::   ztc_f, zsc_f, ztc_d, zsc_d     !    -         - 
     257      REAL     ::   ze3t_f, ze3t_d                 !    -         - 
    258258      REAL     ::   zfact1, zfact2                 !    -         - 
    259259      !!---------------------------------------------------------------------- 
     
    274274      ELSE                                             ! apply filter on thickness weighted tracer and swap 
    275275         DO jk = 1, jpkm1 
    276             zfact1 = atfp * r2dt_t(jk) 
     276            zfact1 = atfp * rdttra(jk) 
    277277            zfact2 = zfact1 / rau0 
    278278            DO jj = 1, jpj 
     
    282282                  ze3t_n = fse3t_n(ji,jj,jk) 
    283283                  ze3t_a = fse3t_a(ji,jj,jk) 
    284                   ze3t_m = fse3t_m(ji,jj,jk) 
     284                  ze3t_d = fse3t_d(ji,jj,jk) 
    285285                  !                                         ! tracer content at Before, now and after 
    286286                  ztc_b  = tb(ji,jj,jk) * ze3t_b   ;   zsc_b = sb(ji,jj,jk) * ze3t_b 
     
    290290                  !                                         ! Time laplacian on tracer contents 
    291291                  !                                         ! used for both Asselin and Brown & Campana filters 
    292                   ztc_m  = ztc_a  - 2. * ztc_n + ztc_b 
    293                   zsc_m  = zsc_a  - 2. * zsc_n + zsc_b 
     292                  ztc_d  = ztc_a - 2. * ztc_n + ztc_b 
     293                  zsc_d  = zsc_a - 2. * zsc_n + zsc_b 
    294294                  !                                         ! Asselin Filter on thicknesses and tracer contents 
    295                   ze3t_f = ze3t_n + atfp * ze3t_m 
    296                   ztc_f  = ztc_n  + atfp * ztc_m 
    297                   zsc_f  = zsc_n  + atfp * zsc_m 
     295                  ze3t_f = ze3t_n + atfp * ze3t_d 
     296                  ztc_f  = ztc_n  + atfp * ztc_d 
     297                  zsc_f  = zsc_n  + atfp * zsc_d 
    298298                  !                                         ! Filter correction 
    299299                  IF( jk == 1 ) THEN 
    300                      ze3t_f = ze3t_f - zfact2 * ( emp_b       (ji,jj)    - emp         (ji,jj)    ) 
    301                      ztc_f  = ztc_f  - zfact1 * ( sbc_trd_hc_n(ji,jj)    - sbc_trd_hc_b(ji,jj)    ) 
     300                     ! WRITE(numout,*) 'filter correction: sbc_trd_hc_n' 
     301                     ze3t_f = ze3t_f - zfact2 * ( emp_b       (ji,jj) - emp         (ji,jj) ) 
     302                     ztc_f  = ztc_f  - zfact1 * ( sbc_trd_hc_n(ji,jj) - sbc_trd_hc_b(ji,jj) ) 
    302303                  ENDIF 
    303304                  IF( ln_traqsr .AND. ( jk .LE. nksr ) ) THEN 
     305                     ! WRITE(numout,*) 'jk =', jk 
     306                     ! WRITE(numout,*) 'filter correction: qsr_trd_hc_n' 
    304307                     ztc_f  = ztc_f  - zfact1 * ( qsr_trd_hc_n(ji,jj,jk) - qsr_trd_hc_b(ji,jj,jk) ) 
    305308                  ENDIF 
    306                   !                                         ! swap of arrays 
     309                                                          ! swap of arrays 
    307310                  ze3t_f = 1.e0 / ze3t_f 
    308311                  tb(ji,jj,jk) = ztc_f * ze3t_f                           ! tb <-- tn filtered 
     
    312315                  !                                         ! semi imlicit hpg computation (Brown & Campana) 
    313316                  IF( ln_dynhpg_imp ) THEN 
    314                      ze3t_m       = 1.e0   / ( ze3t_n + rbcp * ze3t_m ) 
    315                      ta(ji,jj,jk) = ze3t_m * ( ztc_n  + rbcp * ztc_m  )   ! ta <-- Brown & Campana average 
    316                      sa(ji,jj,jk) = ze3t_m * ( zsc_n  + rbcp * zsc_m  )   ! sa <-- Brown & Campana average 
     317                     ze3t_d       = 1.e0   / ( ze3t_n + rbcp * ze3t_d ) 
     318                     ta(ji,jj,jk) = ze3t_d * ( ztc_n  + rbcp * ztc_d  )   ! ta <-- Brown & Campana average 
     319                     sa(ji,jj,jk) = ze3t_d * ( zsc_n  + rbcp * zsc_d  )   ! sa <-- Brown & Campana average 
    317320                  ENDIF 
    318321               END DO 
  • branches/DEV_r1837_MLF/NEMO/OPA_SRC/TRA/traqsr.F90

    r1975 r2068  
    112112         ztrdt(:,:,:) = ta(:,:,:)  
    113113         ztrds(:,:,:) = 0.e0 
     114      ENDIF 
     115 
     116      !                                           ! ---------------------------------------- ! 
     117      !                                           !          Swap of forcing field           ! 
     118      !                                           ! ---------------------------------------- ! 
     119      IF( kt /= nit000 ) qsr_trd_hc_b(:,:,:) = qsr_trd_hc_n(:,:,:) 
     120      !                                           ! ---------------------------------------- ! 
     121      IF( kt == nit000 ) THEN                     !   set the forcing field at nit000 - 1    ! 
     122         !                                        ! ---------------------------------------- ! 
     123         IF( ln_rstart .AND.    &                               !* Restart: read in restart file 
     124            & iom_varid( numror, 'qsr_trd_hc_b', ldstop = .FALSE. ) > 0 ) THEN  
     125            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields red in the restart file' 
     126            CALL iom_get( numror, jpdom_autoglo, 'qsr_trd_hc_b', qsr_trd_hc_b )   ! before heat content trend due to Qsr flux 
     127         ENDIF 
    114128      ENDIF 
    115129 
     
    225239            END DO 
    226240         END DO 
     241      ENDIF 
     242 
     243      !                                            ! ---------------------------------------- ! 
     244      IF( lrst_oce ) THEN                          !      Write in the ocean restart file     ! 
     245         !                                         ! ---------------------------------------- ! 
     246         IF(lwp) WRITE(numout,*) 
     247         IF(lwp) WRITE(numout,*) 'qsr : penetrative solar radiation forcing field written in ocean restart file ',   & 
     248            &                    'at it= ', kt,' date= ', ndastp 
     249         IF(lwp) WRITE(numout,*) '~~~~' 
     250         CALL iom_rstput( kt, nitrst, numrow, 'qsr_trd_hc_b', qsr_trd_hc_n ) 
     251         ! 
    227252      ENDIF 
    228253 
  • branches/DEV_r1837_MLF/NEMO/OPA_SRC/TRA/trasbc.F90

    r1975 r2068  
    2020   USE trdmod          ! ocean trends  
    2121   USE trdmod_oce      ! ocean variables trends 
     22   USE iom 
    2223   USE in_out_manager  ! I/O manager 
     24   USE restart         ! ocean restart 
    2325   USE prtctl          ! Print control 
    2426 
     
    132134         ENDIF 
    133135      ENDIF 
    134  
    135       !                             ! ---------------------- ! 
    136       IF( lk_vvl ) THEN             !  Variable Volume case  ! 
    137          !                          ! ---------------------- ! 
     136      !                                            ! ---------------------------------------- ! 
     137      IF( kt /= nit000 ) THEN                      !          Swap of forcing fields          ! 
     138         !                                         ! ---------------------------------------- ! 
     139         sbc_trd_hc_b(:,:) = sbc_trd_hc_n(:,:)                         ! Swap the ocean forcing fields except at nit000 
     140         IF ( .NOT. lk_vvl ) sbc_trd_sc_b(:,:)   = sbc_trd_sc_n(:,:) 
     141      ENDIF 
     142      !                                            ! ---------------------------------------- ! 
     143      IF( kt == nit000 ) THEN                      !   set the forcing field at nit000 - 1    ! 
     144         !                                         ! ---------------------------------------- ! 
     145         IF( ln_rstart .AND.    &                               !* Restart: read in restart file 
     146            & iom_varid( numror, 'sbc_trd_hc_b', ldstop = .FALSE. ) > 0 ) THEN  
     147            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields red in the restart file' 
     148            CALL iom_get( numror, jpdom_autoglo, 'sbc_trd_hc_b', sbc_trd_hc_b )   ! before heat content sbc trend 
     149            CALL iom_get( numror, jpdom_autoglo, 'qsr_trd_hc_b', qsr_trd_hc_b )   ! before heat content trend due to Qsr flux 
     150            IF ( .NOT. lk_vvl ) THEN 
     151               CALL iom_get( numror, jpdom_autoglo, 'sbc_trd_sc_b', sbc_trd_sc_b )   ! before salt content sbc trend 
     152            ENDIF 
     153         ENDIF 
     154      ENDIF 
     155      !                                            ! ---------------------- ! 
     156      IF( lk_vvl ) THEN                            !  Variable Volume case  ! 
     157         !                                         ! ---------------------- ! 
    138158!!gm BUG : in key_vvl emps must be modified to only include the salt flux due to sea-ice freezing/melting 
    139159!!gm       otherwise this flux will be missing  ==> modification required in limsbc,  limsbc_2 and CICE interface.s 
     
    161181            END DO 
    162182         ENDIF 
    163          !                          ! ---------------------- ! 
    164       ELSE                          !  Constant Volume case  ! 
    165          !                          ! ---------------------- ! 
     183         !                                         ! ---------------------- ! 
     184      ELSE                                         !  Constant Volume case  ! 
     185         !                                         ! ---------------------- ! 
    166186         IF ( neuler == 0 .AND. kt == nit000 ) THEN 
    167187            DO jj = 2, jpj 
     
    197217      ENDIF 
    198218 
     219      !                                            ! ---------------------------------------- ! 
     220      IF( lrst_oce ) THEN                          !      Write in the ocean restart file     ! 
     221         !                                         ! ---------------------------------------- ! 
     222         IF(lwp) WRITE(numout,*) 
     223         IF(lwp) WRITE(numout,*) 'sbc : ocean surface forcing fields written in ocean restart file ',   & 
     224            &                    'at it= ', kt,' date= ', ndastp 
     225         IF(lwp) WRITE(numout,*) '~~~~' 
     226         CALL iom_rstput( kt, nitrst, numrow, 'sbc_trd_hc_b', sbc_trd_hc_n ) 
     227         IF ( .NOT. lk_vvl ) CALL iom_rstput( kt, nitrst, numrow, 'sbc_trd_sc_b', sbc_trd_sc_n ) 
     228         ! 
     229      ENDIF 
     230 
    199231      IF( l_trdtra ) THEN           ! save the sbc trends for diagnostic 
    200232         ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 
     
    205237      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' sbc  - Ta: ', mask1=tmask,   & 
    206238         &                       tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    207       ! 
    208239   END SUBROUTINE tra_sbc 
    209240 
Note: See TracChangeset for help on using the changeset viewer.