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 459 for trunk/NEMO/OPA_SRC/DTA/dtatem.F90 – NEMO

Ignore:
Timestamp:
2006-05-10T19:09:01+02:00 (18 years ago)
Author:
opalod
Message:

nemo_v1_update_050:RB: update dtasal and dtatem according to the new coordinate definition

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DTA/dtatem.F90

    r440 r459  
    8383      INTEGER, PARAMETER ::   & 
    8484         jpmois = 12                    ! number of month 
    85       INTEGER ::   ji, jj, jl           ! dummy loop indicies 
     85      INTEGER ::   ji, jj, jk, jl, jkk  ! dummy loop indicies 
     86      REAL(wp), DIMENSION(jpk,2) ::   & 
     87         ztemdta            ! auxiliary array for interpolation 
     88 
    8689      INTEGER ::   & 
    8790         imois, iman, itime, ik ,    &  ! temporary integers 
     
    98101      !!---------------------------------------------------------------------- 
    99102 
    100       ! 0. Initialization 
    101       ! ----------------- 
    102  
    103       iman  = jpmois 
    104       i15   = nday / 16 
    105       imois = nmonth + i15 - 1 
    106       IF( imois == 0 )   imois = iman 
    107  
    108       itime = jpmois 
    109       ipi = jpiglo 
    110       ipj = jpjglo 
    111       ipk = jpk 
    112  
    113       ! 1. First call kt=nit000 
    114       ! ----------------------- 
    115  
    116       IF( kt == nit000 .AND. nlecte == 0 ) THEN 
    117          ntem1 = 0 
    118          IF(lwp) WRITE(numout,*) 
    119          IF(lwp) WRITE(numout,*) ' dtatem : Levitus monthly fields' 
    120          IF(lwp) WRITE(numout,*) ' ~~~~~~' 
    121          IF(lwp) WRITE(numout,*) '             NetCDF FORMAT' 
    122          IF(lwp) WRITE(numout,*) 
    123           
    124          ! open file 
    125  
    126          cl_tdata = 'data_1m_potential_temperature_nomask ' 
     103     ! 0. Initialization 
     104     ! ----------------- 
     105 
     106     iman  = jpmois 
     107     i15   = nday / 16 
     108     imois = nmonth + i15 - 1 
     109     IF( imois == 0 )   imois = iman 
     110 
     111     itime = jpmois 
     112     ipi = jpiglo 
     113     ipj = jpjglo 
     114     ipk = jpk 
     115 
     116     ! 1. First call kt=nit000 
     117     ! ----------------------- 
     118 
     119     IF( kt == nit000 .AND. nlecte == 0 ) THEN 
     120   ntem1 = 0 
     121   IF(lwp) WRITE(numout,*) 
     122   IF(lwp) WRITE(numout,*) ' dtatem : Levitus monthly fields' 
     123   IF(lwp) WRITE(numout,*) ' ~~~~~~' 
     124   IF(lwp) WRITE(numout,*) '             NetCDF FORMAT' 
     125   IF(lwp) WRITE(numout,*) 
     126 
     127   ! open file 
     128 
     129   cl_tdata = 'data_1m_potential_temperature_nomask ' 
    127130#if defined key_agrif 
    128          if ( .NOT. Agrif_Root() ) then 
    129             cl_tdata = TRIM(Agrif_CFixed())//'_'//TRIM(cl_tdata) 
    130          endif 
    131 #endif          
    132          CALL flinopen( TRIM(cl_tdata), mig(1), nlci , mjg(1),  nlcj   & 
    133             &          , .false.     , ipi   , ipj  , ipk   , zlon     & 
    134             &          , zlat        , zlev  , itime, istep , zdate0   & 
    135             &          , rdt         , numtdt                        ) 
    136  
    137          ! title, dimensions and tests 
    138  
    139          IF( itime /= jpmois ) THEN 
    140             IF(lwp) THEN 
    141                WRITE(numout,*) 
    142                WRITE(numout,*) 'problem with time coordinates' 
    143                WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois 
    144             ENDIF 
    145             STOP 'dtatem' 
    146          ENDIF 
    147          IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN 
    148             IF(lwp) THEN 
    149                WRITE(numout,*) 
    150                WRITE(numout,*) 'problem with dimensions' 
    151                WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta 
    152                WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta 
    153                WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk 
    154             ENDIF 
    155             STOP 'dtatem' 
    156          ENDIF 
    157          IF(lwp) WRITE(numout,*) itime,istep,zdate0,rdt,numtdt 
    158  
    159       ENDIF 
    160  
    161  
    162       ! 2. Read monthly file 
    163       ! ------------------- 
    164  
    165       IF( ( kt == nit000 .AND. nlecte == 0 ) .OR. imois /= ntem1 ) THEN 
    166          nlecte = 1 
    167  
    168          ! Calendar computation 
    169           
    170          ntem1 = imois        ! first file record used  
    171          ntem2 = ntem1 + 1    ! last  file record used 
    172          ntem1 = MOD( ntem1, iman ) 
    173          IF( ntem1 == 0 )   ntem1 = iman 
    174          ntem2 = MOD( ntem2, iman ) 
    175          IF( ntem2 == 0 )   ntem2 = iman 
    176          IF(lwp) WRITE(numout,*) 'first record file used ntem1 ', ntem1 
    177          IF(lwp) WRITE(numout,*) 'last  record file used ntem2 ', ntem2 
    178           
    179          ! Read monthly temperature data Levitus  
    180           
    181          CALL flinget( numtdt, 'votemper', jpidta, jpjdta, jpk   & 
    182                      , jpmois, ntem1     , ntem1 , mig(1), nlci   & 
    183                      , mjg(1), nlcj      , temdta(1:nlci,1:nlcj,1:jpk,1)     ) 
    184          CALL flinget( numtdt, 'votemper', jpidta, jpjdta, jpk   & 
    185                      , jpmois, ntem2     , ntem2 , mig(1), nlci   & 
    186                      , mjg(1), nlcj      , temdta(1:nlci,1:nlcj,1:jpk,2)     ) 
    187  
    188          IF(lwp) WRITE(numout,*) 
    189          IF(lwp) WRITE(numout,*) ' read Levitus temperature ok' 
    190          IF(lwp) WRITE(numout,*) 
    191           
     131   if ( .NOT. Agrif_Root() ) then 
     132      cl_tdata = TRIM(Agrif_CFixed())//'_'//TRIM(cl_tdata) 
     133   endif 
     134#endif             
     135   CALL flinopen( TRIM(cl_tdata), mig(1), nlci , mjg(1),  nlcj   & 
     136      &          , .false.     , ipi   , ipj  , ipk   , zlon     & 
     137      &          , zlat        , zlev  , itime, istep , zdate0   & 
     138      &          , rdt         , numtdt                        ) 
     139 
     140   ! title, dimensions and tests 
     141 
     142   IF( itime /= jpmois ) THEN 
     143      IF(lwp) THEN 
     144         WRITE(numout,*) 
     145         WRITE(numout,*) 'problem with time coordinates' 
     146         WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois 
     147      ENDIF 
     148      STOP 'dtatem' 
     149   ENDIF 
     150   IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN 
     151      IF(lwp) THEN 
     152         WRITE(numout,*) 
     153         WRITE(numout,*) 'problem with dimensions' 
     154         WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta 
     155         WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta 
     156         WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk 
     157      ENDIF 
     158      STOP 'dtatem' 
     159   ENDIF 
     160   IF(lwp) WRITE(numout,*) itime,istep,zdate0,rdt,numtdt 
     161 
     162     ENDIF 
     163 
     164 
     165     ! 2. Read monthly file 
     166     ! ------------------- 
     167 
     168     IF( ( kt == nit000 .AND. nlecte == 0 ) .OR. imois /= ntem1 ) THEN 
     169   nlecte = 1 
     170 
     171   ! Calendar computation 
     172 
     173   ntem1 = imois        ! first file record used  
     174   ntem2 = ntem1 + 1    ! last  file record used 
     175   ntem1 = MOD( ntem1, iman ) 
     176   IF( ntem1 == 0 )   ntem1 = iman 
     177   ntem2 = MOD( ntem2, iman ) 
     178   IF( ntem2 == 0 )   ntem2 = iman 
     179   IF(lwp) WRITE(numout,*) 'first record file used ntem1 ', ntem1 
     180   IF(lwp) WRITE(numout,*) 'last  record file used ntem2 ', ntem2 
     181 
     182   ! Read monthly temperature data Levitus  
     183 
     184   CALL flinget( numtdt, 'votemper', jpidta, jpjdta, jpk   & 
     185          , jpmois, ntem1     , ntem1 , mig(1), nlci   & 
     186          , mjg(1), nlcj      , temdta(1:nlci,1:nlcj,1:jpk,1)     ) 
     187   CALL flinget( numtdt, 'votemper', jpidta, jpjdta, jpk   & 
     188          , jpmois, ntem2     , ntem2 , mig(1), nlci   & 
     189          , mjg(1), nlcj      , temdta(1:nlci,1:nlcj,1:jpk,2)     ) 
     190 
     191   IF(lwp) WRITE(numout,*) 
     192   IF(lwp) WRITE(numout,*) ' read Levitus temperature ok' 
     193   IF(lwp) WRITE(numout,*) 
     194 
    192195#if defined key_tradmp 
    193          IF( cp_cfg == "orca"  .AND. jp_cfg == 2 ) THEN 
    194        
    195             !                                        ! ======================= 
    196             !                                        !  ORCA_R2 configuration 
    197             !                                        ! =======================  
    198  
    199             ij0 = 101   ;   ij1 = 109 
    200             ii0 = 141   ;   ii1 = 155 
    201             DO jj = mj0(ij0), mj1(ij1)                      ! Reduced temperature in the Alboran Sea 
    202                DO ji = mi0(ii0), mi1(ii1) 
    203                   temdta(ji,jj, 13:13 ,:) = temdta(ji,jj, 13:13 ,:) - 0.20 
    204                   temdta(ji,jj, 14:15 ,:) = temdta(ji,jj, 14:15 ,:) - 0.35 
    205                   temdta(ji,jj, 16:25 ,:) = temdta(ji,jj, 16:25 ,:) - 0.40 
    206                END DO 
    207             END DO 
    208           
    209             IF( n_cla == 0 ) THEN  
    210                !                                         ! Reduced temperature at Red Sea 
    211                ij0 =  87   ;   ij1 =  96 
    212                ii0 = 148   ;   ii1 = 160 
    213                temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ,  4:10 , : ) = 7.0  
    214                temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 11:13 , : ) = 6.5  
    215                temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 , : ) = 6.0 
    216             ELSE 
    217                il0 = 138   ;   il1 = 138 
    218                ij0 = 101   ;   ij1 = 102 
    219                ii0 = 139   ;   ii1 = 139 
    220                DO jl = mi0(il0), mi1(il1)                ! New temperature profile at Gibraltar 
    221                   DO jj = mj0(ij0), mj1(ij1) 
    222                      DO ji = mi0(ii0), mi1(ii1) 
    223                         temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 
    224                      END DO 
    225                   END DO 
    226                END DO 
    227                il0 = 164   ;   il1 = 164 
    228                ij0 =  88   ;   ij1 =  88 
    229                ii0 = 161   ;   ii1 = 163 
    230                DO jl = mi0(il0), mi1(il1)                ! New temperature profile at Bab el Mandeb 
    231                   DO jj = mj0(ij0), mj1(ij1) 
    232                      DO ji = mi0(ii0), mi1(ii1) 
    233                         temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 
    234                      END DO 
    235                   END DO 
    236                   ij0 =  87   ;   ij1 =  87 
    237                   DO jj = mj0(ij0), mj1(ij1) 
    238                      DO ji = mi0(ii0), mi1(ii1) 
    239                         temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 
    240                      END DO 
    241                   END DO 
    242                END DO 
    243             ENDIF 
    244  
    245          ENDIF 
     196   IF( cp_cfg == "orca"  .AND. jp_cfg == 2 ) THEN 
     197 
     198      !                                        ! ======================= 
     199      !                                        !  ORCA_R2 configuration 
     200      !                                        ! =======================  
     201 
     202      ij0 = 101   ;   ij1 = 109 
     203      ii0 = 141   ;   ii1 = 155 
     204      DO jj = mj0(ij0), mj1(ij1)                      ! Reduced temperature in the Alboran Sea 
     205         DO ji = mi0(ii0), mi1(ii1) 
     206      temdta(ji,jj, 13:13 ,:) = temdta(ji,jj, 13:13 ,:) - 0.20 
     207      temdta(ji,jj, 14:15 ,:) = temdta(ji,jj, 14:15 ,:) - 0.35 
     208      temdta(ji,jj, 16:25 ,:) = temdta(ji,jj, 16:25 ,:) - 0.40 
     209         END DO 
     210      END DO 
     211 
     212      IF( n_cla == 0 ) THEN  
     213         !                                         ! Reduced temperature at Red Sea 
     214         ij0 =  87   ;   ij1 =  96 
     215         ii0 = 148   ;   ii1 = 160 
     216         temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ,  4:10 , : ) = 7.0  
     217         temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 11:13 , : ) = 6.5  
     218         temdta( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 , : ) = 6.0 
     219      ELSE 
     220         il0 = 138   ;   il1 = 138 
     221         ij0 = 101   ;   ij1 = 102 
     222         ii0 = 139   ;   ii1 = 139 
     223         DO jl = mi0(il0), mi1(il1)                ! New temperature profile at Gibraltar 
     224      DO jj = mj0(ij0), mj1(ij1) 
     225          DO ji = mi0(ii0), mi1(ii1) 
     226             temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 
     227          END DO 
     228      END DO 
     229         END DO 
     230         il0 = 164   ;   il1 = 164 
     231         ij0 =  88   ;   ij1 =  88 
     232         ii0 = 161   ;   ii1 = 163 
     233         DO jl = mi0(il0), mi1(il1)                ! New temperature profile at Bab el Mandeb 
     234      DO jj = mj0(ij0), mj1(ij1) 
     235          DO ji = mi0(ii0), mi1(ii1) 
     236             temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 
     237          END DO 
     238      END DO 
     239      ij0 =  87   ;   ij1 =  87 
     240      DO jj = mj0(ij0), mj1(ij1) 
     241          DO ji = mi0(ii0), mi1(ii1) 
     242             temdta(ji,jj,:,:) = temdta(jl,jj,:,:) 
     243          END DO 
     244      END DO 
     245         END DO 
     246      ENDIF 
     247 
     248   ENDIF 
    246249#endif 
    247250 
    248          !                                  ! Mask 
    249          DO jl = 1, 2 
    250             temdta(:,:,:,jl) = temdta(:,:,:,jl) * tmask(:,:,:) 
    251             temdta(:,:,jpk,jl) = 0. 
    252             IF( lk_zps ) THEN                ! z-coord. with partial steps 
    253                DO jj = 1, jpj                  ! interpolation of temperature at the last level 
    254                   DO ji = 1, jpi 
    255                      ik = mbathy(ji,jj) - 1 
    256                      IF( ik > 2 ) THEN 
    257                         zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) ) 
    258                         temdta(ji,jj,ik,jl) = (1.-zl) * temdta(ji,jj,ik,jl) + zl * temdta(ji,jj,ik-1,jl)  
    259                      ENDIF 
    260                   END DO 
    261                END DO 
    262             ENDIF 
    263          END DO 
    264  
    265          IF(lwp) THEN 
    266             WRITE(numout,*) ' temperature Levitus month ', ntem1, ntem2 
    267             WRITE(numout,*) 
    268             WRITE(numout,*) ' Levitus month = ', ntem1, '  level = 1' 
    269             CALL prihre( temdta(:,:,1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
    270             WRITE(numout,*) ' Levitus month = ', ntem1, '  level = ', jpk/2 
    271             CALL prihre( temdta(:,:,jpk/2,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
    272             WRITE(numout,*) ' Levitus month = ',ntem1,'  level = ', jpkm1 
    273             CALL prihre( temdta(:,:,jpkm1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
    274          ENDIF 
    275       ENDIF 
    276  
    277   
    278       ! 2. At every time step compute temperature data 
    279       ! ---------------------------------------------- 
    280  
    281       zxy = FLOAT( nday + 15 - 30 * i15 ) / 30. 
    282       t_dta(:,:,:) = (1.-zxy) * temdta(:,:,:,1) + zxy * temdta(:,:,:,2) 
    283  
     251     IF( ln_sco ) THEN 
     252     DO jl = 1, 2 
     253   DO jj = 1, jpj                  ! interpolation of temperatures 
     254      DO ji = 1, jpi 
     255         DO jk = 1, jpk 
     256        zl=fsdept(ji,jj,jk) 
     257        IF(zl < gdept_0(1)) ztemdta(jk,jl) =  temdta(ji,jj,1,jl) 
     258        IF(zl > gdept_0(jpk)) ztemdta(jk,jl) =  temdta(ji,jj,jpkm1,jl) 
     259        DO jkk = 1, jpkm1 
     260            IF((zl-gdept_0(jkk))*(zl-gdept_0(jkk+1)).le.0.0) THEN 
     261           ztemdta(jk,jl) = temdta(ji,jj,jkk,jl)                                 & 
     262              &           + (zl-gdept_0(jkk))/(gdept_0(jkk+1)-gdept_0(jkk))      & 
     263              &                              *(temdta(ji,jj,jkk+1,jl) - temdta(ji,jj,jkk,jl)) 
     264            ENDIF 
     265        END DO 
     266         END DO 
     267         DO jk = 1, jpkm1 
     268             temdta(ji,jj,jk,jl) = ztemdta(jk,jl) 
     269         END DO 
     270             temdta(ji,jj,jpk,jl) = 0.0 
     271      END DO 
     272   END DO 
     273     END DO 
     274 
     275     IF(lwp) WRITE(numout,*) 
     276     IF(lwp) WRITE(numout,*) ' Levitus temperature data interpolated to s-coordinate' 
     277     IF(lwp) WRITE(numout,*) 
     278 
     279     ELSE 
     280 
     281     !                                  ! Mask 
     282     DO jl = 1, 2 
     283   temdta(:,:,:,jl) = temdta(:,:,:,jl) * tmask(:,:,:) 
     284   temdta(:,:,jpk,jl) = 0. 
     285   IF( ln_zps ) THEN                ! z-coord. with partial steps 
     286      DO jj = 1, jpj                  ! interpolation of temperature at the last level 
     287         DO ji = 1, jpi 
     288       ik = mbathy(ji,jj) - 1 
     289       IF( ik > 2 ) THEN 
     290          zl = ( gdept_0(ik) - fsdept(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) ) 
     291          temdta(ji,jj,ik,jl) = (1.-zl) * temdta(ji,jj,ik,jl) + zl * temdta(ji,jj,ik-1,jl) 
     292       ENDIF 
     293         END DO 
     294      END DO 
     295   ENDIF 
     296     END DO 
     297 
     298     ENDIF 
     299 
     300   IF(lwp) THEN 
     301      WRITE(numout,*) ' temperature Levitus month ', ntem1, ntem2 
     302      WRITE(numout,*) 
     303      WRITE(numout,*) ' Levitus month = ', ntem1, '  level = 1' 
     304      CALL prihre( temdta(:,:,1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
     305      WRITE(numout,*) ' Levitus month = ', ntem1, '  level = ', jpk/2 
     306      CALL prihre( temdta(:,:,jpk/2,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
     307      WRITE(numout,*) ' Levitus month = ',ntem1,'  level = ', jpkm1 
     308      CALL prihre( temdta(:,:,jpkm1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) 
     309   ENDIF 
     310     ENDIF 
     311 
     312 
     313     ! 2. At every time step compute temperature data 
     314     ! ---------------------------------------------- 
     315 
     316     zxy = FLOAT( nday + 15 - 30 * i15 ) / 30. 
     317     t_dta(:,:,:) = (1.-zxy) * temdta(:,:,:,1) + zxy * temdta(:,:,:,2) 
    284318 
    285319   END SUBROUTINE dta_tem 
Note: See TracChangeset for help on using the changeset viewer.