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 3294 for trunk/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90 – NEMO

Ignore:
Timestamp:
2012-01-28T17:44:18+01:00 (12 years ago)
Author:
rblod
Message:

Merge of 3.4beta into the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90

    r2777 r3294  
    1313   !!            2.0  !  2006-07  (S. Masson)  distributed restart using iom 
    1414   !!            3.3  !  2010-10  (C. Ethe) merge TRC-TRA 
     15   !!            3.4  !  2011-04  (G. Madec) Merge of dtatem and dtasal & suppression of tb,tn/sb,sn  
    1516   !!---------------------------------------------------------------------- 
    1617 
     
    3031   USE zdf_oce         ! ocean vertical physics 
    3132   USE phycst          ! physical constants 
    32    USE dtatem          ! temperature data                 (dta_tem routine) 
    33    USE dtasal          ! salinity data                    (dta_sal routine) 
     33   USE dtatsd          ! data temperature and salinity   (dta_tsd routine) 
    3434   USE restart         ! ocean restart                   (rst_read routine) 
    3535   USE in_out_manager  ! I/O manager 
     
    4242   USE dynspg_exp      ! pressure gradient schemes 
    4343   USE dynspg_ts       ! pressure gradient schemes 
    44    USE traswp          ! Swap arrays                      (tra_swp routine) 
    4544   USE lib_mpp         ! MPP library 
     45   USE wrk_nemo        ! Memory allocation 
     46   USE timing          ! Timing 
    4647 
    4748   IMPLICIT NONE 
     
    6869      ! - ML - needed for initialization of e3t_b 
    6970      INTEGER  ::  jk     ! dummy loop indice 
     71      !!---------------------------------------------------------------------- 
     72      ! 
     73      IF( nn_timing == 1 )  CALL timing_start('istate_init') 
     74      ! 
    7075 
    7176      IF(lwp) WRITE(numout,*) 
     
    7378      IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
    7479 
    75       rhd  (:,:,:) = 0.e0 
    76       rhop (:,:,:) = 0.e0 
    77       rn2  (:,:,:) = 0.e0  
    78       ta   (:,:,:) = 0.e0     
    79       sa   (:,:,:) = 0.e0 
     80      CALL dta_tsd_init                       ! Initialisation of T & S input data 
     81 
     82      rhd  (:,:,:  ) = 0.e0 
     83      rhop (:,:,:  ) = 0.e0 
     84      rn2  (:,:,:  ) = 0.e0  
     85      tsa  (:,:,:,:) = 0.e0     
    8086 
    8187      IF( ln_rstart ) THEN                    ! Restart from a file 
     
    8389         neuler = 1                              ! Set time-step indicator at nit000 (leap-frog) 
    8490         CALL rst_read                           ! Read the restart file 
    85          CALL tra_swap                           ! swap 3D arrays (t,s)  in a 4D array (ts) 
     91         !                                       ! define e3u_b, e3v_b from e3t_b read in restart file 
     92         CALL dom_vvl_2( nit000, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 
    8693         CALL day_init                           ! model calendar (using both namelist and restart infos) 
    8794      ELSE 
     
    9299         CALL day_init                           ! model calendar (using both namelist and restart infos) 
    93100         !                                       ! Initialization of ocean to zero 
    94          !   before fields     !       now fields      
    95          sshb (:,:)   = 0.e0   ;   sshn (:,:)   = 0.e0 
    96          ub   (:,:,:) = 0.e0   ;   un   (:,:,:) = 0.e0 
    97          vb   (:,:,:) = 0.e0   ;   vn   (:,:,:) = 0.e0   
    98          rotb (:,:,:) = 0.e0   ;   rotn (:,:,:) = 0.e0 
    99          hdivb(:,:,:) = 0.e0   ;   hdivn(:,:,:) = 0.e0 
     101         !   before fields      !       now fields      
     102         sshb (:,:)   = 0._wp   ;   sshn (:,:)   = 0._wp 
     103         ub   (:,:,:) = 0._wp   ;   un   (:,:,:) = 0._wp 
     104         vb   (:,:,:) = 0._wp   ;   vn   (:,:,:) = 0._wp   
     105         rotb (:,:,:) = 0._wp   ;   rotn (:,:,:) = 0._wp 
     106         hdivb(:,:,:) = 0._wp   ;   hdivn(:,:,:) = 0._wp 
     107         ! 
     108         !                                       ! define e3u_b, e3v_b from e3t_b initialized in domzgr 
     109         CALL dom_vvl_2( nit000, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 
    100110         ! 
    101111         IF( cp_cfg == 'eel' ) THEN 
     
    103113         ELSEIF( cp_cfg == 'gyre' ) THEN          
    104114            CALL istate_gyre                     ! GYRE  configuration : start from pre-defined T-S fields 
    105          ELSE 
    106             !                                    ! Other configurations: Initial T-S fields 
    107 #if defined key_dtatem 
    108             CALL dta_tem( nit000 )                  ! read 3D temperature data 
    109             tb(:,:,:) = t_dta(:,:,:)   ;   tn(:,:,:) = t_dta(:,:,:) 
    110              
    111 #else 
    112             IF(lwp) WRITE(numout,*)                 ! analytical temperature profile 
    113             IF(lwp) WRITE(numout,*)'             Temperature initialization using an analytic profile' 
    114             CALL istate_tem 
    115 #endif 
    116 #if defined key_dtasal 
    117             CALL dta_sal( nit000 )                  ! read 3D salinity data 
    118             sb(:,:,:) = s_dta(:,:,:)   ;   sn(:,:,:) = s_dta(:,:,:) 
    119 #else 
    120             ! No salinity data 
    121             IF(lwp)WRITE(numout,*)                  ! analytical salinity profile 
    122             IF(lwp)WRITE(numout,*)'             Salinity initialisation using a constant value' 
    123             CALL istate_sal 
    124 #endif 
     115         ELSEIF( ln_tsd_init      ) THEN         ! Initial T-S fields read in files 
     116            CALL dta_tsd( nit000, tsb )                  ! read 3D T and S data at nit000 
     117            tsn(:,:,:,:) = tsb(:,:,:,:) 
     118            ! 
     119         ELSE                                    ! Initial T-S fields defined analytically 
     120            CALL istate_t_s 
    125121         ENDIF 
    126122         ! 
    127          CALL tra_swap                     ! swap 3D arrays (tb,sb,tn,sn)  in a 4D array 
    128123         CALL eos( tsb, rhd, rhop )        ! before potential and in situ densities 
    129124#if ! defined key_c1d 
     
    148143      ENDIF 
    149144      ! 
     145      IF( nn_timing == 1 )  CALL timing_stop('istate_init') 
     146      ! 
    150147   END SUBROUTINE istate_init 
    151148 
    152  
    153    SUBROUTINE istate_tem 
     149   SUBROUTINE istate_t_s 
    154150      !!--------------------------------------------------------------------- 
    155       !!                  ***  ROUTINE istate_tem  *** 
     151      !!                  ***  ROUTINE istate_t_s  *** 
    156152      !!    
    157153      !! ** Purpose :   Intialization of the temperature field with an  
    158154      !!      analytical profile or a file (i.e. in EEL configuration) 
    159155      !! 
    160       !! ** Method  :   Use Philander analytic profile of temperature 
     156      !! ** Method  : - temperature: use Philander analytic profile 
     157      !!              - salinity   : use to a constant value 35.5 
    161158      !! 
    162159      !! References :  Philander ??? 
    163160      !!---------------------------------------------------------------------- 
    164       INTEGER :: ji, jj, jk 
     161      INTEGER  :: ji, jj, jk 
     162      REAL(wp) ::   zsal = 35.50 
    165163      !!---------------------------------------------------------------------- 
    166164      ! 
    167165      IF(lwp) WRITE(numout,*) 
    168       IF(lwp) WRITE(numout,*) 'istate_tem : initial temperature profile' 
    169       IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
     166      IF(lwp) WRITE(numout,*) 'istate_t_s : Philander s initial temperature profile' 
     167      IF(lwp) WRITE(numout,*) '~~~~~~~~~~   and constant salinity (',zsal,' psu)' 
    170168      ! 
    171169      DO jk = 1, jpk 
    172          DO jj = 1, jpj 
    173             DO ji = 1, jpi 
    174                tn(ji,jj,jk) = (  ( ( 7.5 - 0.*ABS(gphit(ji,jj))/30. )   & 
    175                   &               *( 1.-TANH((fsdept(ji,jj,jk)-80.)/30.) )   & 
    176                   &            + 10.*(5000.-fsdept(ji,jj,jk))/5000.)  ) * tmask(ji,jj,jk) 
    177                tb(ji,jj,jk) = tn(ji,jj,jk) 
    178           END DO 
    179         END DO 
     170         tsn(:,:,jk,jp_tem) = (  ( ( 7.5 - 0. * ABS( gphit(:,:) )/30. ) * ( 1.-TANH((fsdept(:,:,jk)-80.)/30.) )   & 
     171            &                + 10. * ( 5000. - fsdept(:,:,jk) ) /5000.)  ) * tmask(:,:,jk) 
     172         tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 
    180173      END DO 
    181       ! 
    182       IF(lwp) CALL prizre( tn    , jpi   , jpj   , jpk   , jpj/2 ,   & 
    183          &                 1     , jpi   , 5     , 1     , jpk   ,   & 
    184          &                 1     , 1.    , numout                  ) 
    185       ! 
    186    END SUBROUTINE istate_tem 
    187  
    188  
    189    SUBROUTINE istate_sal 
    190       !!--------------------------------------------------------------------- 
    191       !!                  ***  ROUTINE istate_sal  *** 
    192       !! 
    193       !! ** Purpose :   Intialize the salinity field with an analytic profile 
    194       !! 
    195       !! ** Method  :   Use to a constant value 35.5 
    196       !!               
    197       !! ** Action  :   Initialize sn and sb 
    198       !!---------------------------------------------------------------------- 
    199       REAL(wp) ::   zsal = 35.50_wp 
    200       !!---------------------------------------------------------------------- 
    201       ! 
    202       IF(lwp) WRITE(numout,*) 
    203       IF(lwp) WRITE(numout,*) 'istate_sal : initial salinity : ', zsal 
    204       IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
    205       ! 
    206       sn(:,:,:) = zsal * tmask(:,:,:) 
    207       sb(:,:,:) = sn(:,:,:) 
    208       ! 
    209    END SUBROUTINE istate_sal 
     174      tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 
     175      tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 
     176      ! 
     177   END SUBROUTINE istate_t_s 
    210178 
    211179 
     
    254222            ! 
    255223            DO jk = 1, jpk 
    256                tn(:,:,jk) = ( zt2 + zt1 * exp( - fsdept(:,:,jk) / 1000 ) ) * tmask(:,:,jk) 
    257                tb(:,:,jk) = tn(:,:,jk) 
     224               tsn(:,:,jk,jp_tem) = ( zt2 + zt1 * exp( - fsdept(:,:,jk) / 1000 ) ) * tmask(:,:,jk) 
     225               tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 
    258226            END DO 
    259227            ! 
    260             IF(lwp) CALL prizre( tn    , jpi   , jpj   , jpk   , jpj/2 ,   & 
    261                &                 1     , jpi   , 5     , 1     , jpk   ,   & 
    262                &                 1     , 1.    , numout                  ) 
     228            IF(lwp) CALL prizre( tsn(:,:,:,jp_tem), jpi   , jpj   , jpk   , jpj/2 ,   & 
     229               &                             1     , jpi   , 5     , 1     , jpk   ,   & 
     230               &                             1     , 1.    , numout                  ) 
    263231            ! 
    264232            ! set salinity field to a constant value 
     
    268236            IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
    269237            ! 
    270             sn(:,:,:) = zsal * tmask(:,:,:) 
    271             sb(:,:,:) = sn(:,:,:) 
     238            tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 
     239            tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 
    272240            ! 
    273241            ! set the dynamics: U,V, hdiv, rot (and ssh if necessary) 
     
    323291            ! 
    324292            CALL iom_open ( 'eel.initemp', inum ) 
    325             CALL iom_get ( inum, jpdom_data, 'initemp', tb ) ! read before temprature (tb) 
     293            CALL iom_get ( inum, jpdom_data, 'initemp', tsb(:,:,:,jp_tem) ) ! read before temprature (tb) 
    326294            CALL iom_close( inum ) 
    327295            ! 
    328             tn(:,:,:) = tb(:,:,:)                            ! set nox temperature to tb 
    329             ! 
    330             IF(lwp) CALL prizre( tn    , jpi   , jpj   , jpk   , jpj/2 ,   & 
    331                &                 1     , jpi   , 5     , 1     , jpk   ,   & 
    332                &                 1     , 1.    , numout                  ) 
     296            tsn(:,:,:,jp_tem) = tsb(:,:,:,jp_tem)                            ! set nox temperature to tb 
     297            ! 
     298            IF(lwp) CALL prizre( tsn(:,:,:,jp_tem), jpi   , jpj   , jpk   , jpj/2 ,   & 
     299               &                            1     , jpi   , 5     , 1     , jpk   ,   & 
     300               &                            1     , 1.    , numout                  ) 
    333301            ! 
    334302            ! set salinity field to a constant value 
     
    338306            IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
    339307            ! 
    340             sn(:,:,:) = zsal * tmask(:,:,:) 
    341             sb(:,:,:) = sn(:,:,:) 
     308            tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 
     309            tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 
    342310            ! 
    343311            !                                    ! =========================== 
     
    377345            DO jj = 1, jpj 
    378346               DO ji = 1, jpi 
    379                   tn(ji,jj,jk) = (  16. - 12. * TANH( (fsdept(ji,jj,jk) - 400) / 700 )         )   & 
     347                  tsn(ji,jj,jk,jp_tem) = (  16. - 12. * TANH( (fsdept(ji,jj,jk) - 400) / 700 )         )   & 
    380348                       &           * (-TANH( (500-fsdept(ji,jj,jk)) / 150 ) + 1) / 2               & 
    381349                       &       + (      15. * ( 1. - TANH( (fsdept(ji,jj,jk)-50.) / 1500.) )       & 
     
    383351                       &                + 7.  * (1500. - fsdept(ji,jj,jk)) / 1500.             )   &  
    384352                       &           * (-TANH( (fsdept(ji,jj,jk) - 500) / 150) + 1) / 2 
    385                   tn(ji,jj,jk) = tn(ji,jj,jk) * tmask(ji,jj,jk) 
    386                   tb(ji,jj,jk) = tn(ji,jj,jk) 
    387  
    388                   sn(ji,jj,jk) =  (  36.25 - 1.13 * TANH( (fsdept(ji,jj,jk) - 305) / 460 )  )  & 
     353                  tsn(ji,jj,jk,jp_tem) = tsn(ji,jj,jk,jp_tem) * tmask(ji,jj,jk) 
     354                  tsb(ji,jj,jk,jp_tem) = tsn(ji,jj,jk,jp_tem) 
     355 
     356                  tsn(ji,jj,jk,jp_sal) =  (  36.25 - 1.13 * TANH( (fsdept(ji,jj,jk) - 305) / 460 )  )  & 
    389357                     &              * (-TANH((500 - fsdept(ji,jj,jk)) / 150) + 1) / 2          & 
    390358                     &          + (  35.55 + 1.25 * (5000. - fsdept(ji,jj,jk)) / 5000.         & 
     
    393361                     &                + 0.2  * TANH( (fsdept(ji,jj,jk) - 1000.) / 5000.)    )  & 
    394362                     &              * (-TANH((fsdept(ji,jj,jk) - 500) / 150) + 1) / 2  
    395                   sn(ji,jj,jk) = sn(ji,jj,jk) * tmask(ji,jj,jk) 
    396                   sb(ji,jj,jk) = sn(ji,jj,jk) 
     363                  tsn(ji,jj,jk,jp_sal) = tsn(ji,jj,jk,jp_sal) * tmask(ji,jj,jk) 
     364                  tsb(ji,jj,jk,jp_sal) = tsn(ji,jj,jk,jp_sal) 
    397365               END DO 
    398366            END DO 
     
    408376         ! ---------------------- 
    409377         CALL iom_open ( 'data_tem', inum ) 
    410          CALL iom_get ( inum, jpdom_data, 'votemper', tn )  
     378         CALL iom_get ( inum, jpdom_data, 'votemper', tsn(:,:,:,jp_tem) )  
    411379         CALL iom_close( inum ) 
    412380 
    413          tn(:,:,:) = tn(:,:,:) * tmask(:,:,:)  
    414          tb(:,:,:) = tn(:,:,:) 
     381         tsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) * tmask(:,:,:)  
     382         tsb(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) 
    415383 
    416384         ! Read salinity field 
    417385         ! ------------------- 
    418386         CALL iom_open ( 'data_sal', inum ) 
    419          CALL iom_get ( inum, jpdom_data, 'vosaline', sn )  
     387         CALL iom_get ( inum, jpdom_data, 'vosaline', tsn(:,:,:,jp_sal) )  
    420388         CALL iom_close( inum ) 
    421389 
    422          sn(:,:,:)  = sn(:,:,:) * tmask(:,:,:)  
    423          sb(:,:,:)  = sn(:,:,:) 
     390         tsn(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) * tmask(:,:,:)  
     391         tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 
    424392 
    425393      END SELECT 
     
    429397         WRITE(numout,*) '              Initial temperature and salinity profiles:' 
    430398         WRITE(numout, "(9x,' level   gdept_0   temperature   salinity   ')" ) 
    431          WRITE(numout, "(10x, i4, 3f10.2)" ) ( jk, gdept_0(jk), tn(2,2,jk), sn(2,2,jk), jk = 1, jpk ) 
     399         WRITE(numout, "(10x, i4, 3f10.2)" ) ( jk, gdept_0(jk), tsn(2,2,jk,jp_tem), tsn(2,2,jk,jp_sal), jk = 1, jpk ) 
    432400      ENDIF 
    433401 
     
    446414      !!                 p=integral [ rau*g dz ] 
    447415      !!---------------------------------------------------------------------- 
    448       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    449       USE wrk_nemo, ONLY:   zprn => wrk_3d_1    ! 3D workspace 
    450  
    451416      USE dynspg          ! surface pressure gradient             (dyn_spg routine) 
    452417      USE divcur          ! hor. divergence & rel. vorticity      (div_cur routine) 
     
    456421      INTEGER ::   indic             ! ??? 
    457422      REAL(wp) ::   zmsv, zphv, zmsu, zphu, zalfg     ! temporary scalars 
    458       !!---------------------------------------------------------------------- 
    459  
    460       IF(wrk_in_use(3, 1) ) THEN 
    461          CALL ctl_stop('istate_uvg: requested workspace array unavailable')   ;   RETURN 
    462       ENDIF 
    463  
     423      REAL(wp), POINTER, DIMENSION(:,:,:) :: zprn 
     424      !!---------------------------------------------------------------------- 
     425      ! 
     426      CALL wrk_alloc( jpi, jpj, jpk, zprn) 
     427      ! 
    464428      IF(lwp) WRITE(numout,*)  
    465429      IF(lwp) WRITE(numout,*) 'istate_uvg : Start from Geostrophy' 
     
    557521      rotb (:,:,:) = rotn (:,:,:)       ! set the before to the now value 
    558522      ! 
    559       IF( wrk_not_released(3, 1) ) THEN 
    560          CALL ctl_stop('istate_uvg: failed to release workspace array') 
    561       ENDIF 
     523      CALL wrk_dealloc( jpi, jpj, jpk, zprn) 
    562524      ! 
    563525   END SUBROUTINE istate_uvg 
Note: See TracChangeset for help on using the changeset viewer.