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 82 – NEMO

Changeset 82


Ignore:
Timestamp:
2004-04-22T15:04:37+02:00 (20 years ago)
Author:
opalod
Message:

CT : BUGFIX048 : Bug correction of Poleward Transport diagnostic

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DIA/ptr.F90

    r24 r82  
    1919   USE lib_mpp 
    2020   USE in_out_manager 
     21   USE dianam 
     22   USE phycst 
    2123 
    2224   IMPLICIT NONE 
    2325   PRIVATE 
     26 
     27   INTERFACE prt_vj 
     28      MODULE PROCEDURE prt_vj_3d, prt_vj_2d 
     29   END INTERFACE 
    2430 
    2531   !! *  Routine accessibility 
     
    2733   PUBLIC dia_ptr        ! call by in step module 
    2834   PUBLIC prt_vj         ! call by tra_ldf & tra_adv routines 
     35   PUBLIC prt_vjk        ! call by tra_ldf & tra_adv routines 
    2936 
    3037   !! * Share Module variables 
     
    5663CONTAINS 
    5764 
    58    FUNCTION ptr_vj( pva )   RESULT ( p_fval ) 
    59       !!---------------------------------------------------------------------- 
    60       !!                    ***  ROUTINE ptr_vj  *** 
     65   FUNCTION prt_vj_3d( pva )   RESULT ( p_fval ) 
     66      !!---------------------------------------------------------------------- 
     67      !!                    ***  ROUTINE prt_vj_3d  *** 
    6168      !! 
    6269      !! ** Purpose :   "zonal" and vertical sum computation of a "meridional" 
     
    8289      !!-------------------------------------------------------------------- 
    8390 
    84       p_fval(  1  ) = 0.e0 
    85       p_fval(jpjm1) = 0.e0 
     91      p_fval(:) = 0.e0 
    8692      DO jk = 1, jpkm1 
    8793         DO jj = 2, jpjm1 
     
    9399      IF( lk_mpp )   CALL mpp_sum( p_fval, ijpj )     !!bug  I presume 
    94100 
    95    END FUNCTION ptr_vj 
    96  
    97  
    98    FUNCTION ptr_vjk( pva )   RESULT ( p_fval ) 
    99       !!---------------------------------------------------------------------- 
    100       !!                    ***  ROUTINE ptr_vjk  *** 
     101   END FUNCTION prt_vj_3d 
     102 
     103 
     104 
     105   FUNCTION prt_vj_2d( pva )   RESULT ( p_fval ) 
     106       !!---------------------------------------------------------------------- 
     107       !!                    ***  ROUTINE prt_vj_2d  *** 
     108       !! 
     109       !! ** Purpose :   "zonal" and vertical sum computation of a "meridional" 
     110       !!      flux array 
     111       !! 
     112       !! ** Method  : - i-k sum of pva using the interior 2D vmask (vmask_i). 
     113       !!      pva is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
     114       !! 
     115       !! ** Action  : - p_fval: i-k-mean poleward flux of pva 
     116       !! 
     117       !! History : 
     118       !!   9.0  !  03-09  (G. Madec)  Original code 
     119       !!---------------------------------------------------------------------- 
     120       !! * arguments 
     121       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   & 
     122          pva                         ! mask flux array at V-point 
     123  
     124       !! * local declarations 
     125       INTEGER  ::   ji, jj            ! dummy loop arguments 
     126       INTEGER  ::   ijpj = jpj        ! ??? 
     127       REAL(wp),DIMENSION(jpj) ::   & 
     128          p_fval                       ! function value 
     129       !!-------------------------------------------------------------------- 
     130  
     131       p_fval(:) = 0.e0 
     132       DO jj = 2, jpjm1 
     133          DO ji = fs_2, fs_jpim1   ! Vector opt. 
     134             p_fval(jj) = p_fval(jj) + pva(ji,jj) * tmask_i(ji,jj+1) * tmask_i(ji,jj) 
     135          END DO 
     136       END DO 
     137       IF( lk_mpp )   CALL mpp_sum( p_fval, ijpj )     !!bug  I presume 
     138  
     139    END FUNCTION prt_vj_2d 
     140 
     141 
     142 
     143   FUNCTION prt_vjk( pva )   RESULT ( p_fval ) 
     144      !!---------------------------------------------------------------------- 
     145      !!                    ***  ROUTINE prt_vjk  *** 
    101146      !! 
    102147      !! ** Purpose :   "zonal" sum computation of a "meridional" flux array 
     
    120165      !!-------------------------------------------------------------------- 
    121166  
    122       p_fval(  1  , : ) = 0.e0 
    123       p_fval(jpjm1, : ) = 0.e0 
    124       p_fval(  :  ,jpk) = 0.e0 
     167      p_fval(:,:) = 0.e0 
    125168      DO jk = 1, jpkm1 
    126169         DO jj = 2, jpjm1 
     
    132175      IF( lk_mpp)   CALL mpp_sum( p_fval, jpj*jpk )    !!bug  I presume 
    133176 
    134    END FUNCTION ptr_vjk 
    135  
    136    FUNCTION ptr_vtjk( pva )   RESULT ( p_fval ) 
    137       !!---------------------------------------------------------------------- 
    138       !!                    ***  ROUTINE ptr_vtjk  *** 
     177   END FUNCTION prt_vjk 
     178 
     179   FUNCTION prt_vtjk( pva )   RESULT ( p_fval ) 
     180      !!---------------------------------------------------------------------- 
     181      !!                    ***  ROUTINE prt_vtjk  *** 
    139182      !! 
    140183      !! ** Purpose :   "zonal" mean computation of a tracer field 
     
    158201         p_fval                       ! return function value 
    159202      !!--------------------------------------------------------------------  
    160       p_fval(  1  , : ) = 0.e0 
    161       p_fval(jpjm1, : ) = 0.e0 
    162       p_fval(  :  ,jpk) = 0.e0 
     203 
     204      p_fval(:,:) = 0.e0 
    163205      DO jk = 1, jpkm1 
    164206         DO jj = 2, jpjm1 
    165207            DO ji = fs_2, fs_jpim1   ! Vector opt. 
    166                p_fval(jj,jk) = p_fval(jj,jk) + ( pva(ji,jj,jk) + pva(ji,jj,jk) )                & 
     208               p_fval(jj,jk) = p_fval(jj,jk) + ( pva(ji,jj,jk) + pva(ji,jj+1,jk) )              & 
    167209                  &                          * e1v(ji,jj) * fse3v(ji,jj,jk) * vmask(ji,jj,jk)   & 
    168210                  &                          * tmask_i(ji,jj+1) * tmask_i(ji,jj) 
     
    170212         END DO 
    171213      END DO 
    172       p_fval(:,:) = p_val(:,:) * 0.5 
     214      p_fval(:,:) = p_fval(:,:) * 0.5 
    173215      IF( lk_mpp )   CALL mpp_sum( p_fval, jpj*jpk )         !!bug  I presume 
    174216 
    175    END FUNCTION ptr_vtjk 
     217   END FUNCTION prt_vtjk 
    176218 
    177219 
     
    184226 
    185227      !! * Local variables 
     228      INTEGER ::   jk               ! dummy loop 
    186229      REAL(wp) ::   & 
    187          zsverdrup = 1.e-6          ! conversion from m3/s to Sverdrup 
    188       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   & 
    189          zvfl                       ! mask flux array at V-point 
     230         zsverdrup = 1.e-6,  &      ! conversion from m3/s to Sverdrup 
     231         zpwatt    = 1.e-15, &      ! conversion from W    to PW 
     232         zggram    = 1.e-6          ! conversion from g    to Pg 
    190233      !!---------------------------------------------------------------------- 
    191234 
     
    208251      ! poleward transport: overturning component 
    209252      pht_ove(:) = SUM( v_msf(:,:) * tn_jk(:,:), 2 )   ! SUM over jk 
     253      pst_ove(:) = SUM( v_msf(:,:) * sn_jk(:,:), 2 )   ! SUM over jk 
     254 
     255      ! conversion in PW and G g 
     256      zpwatt = zpwatt * rau0 * rcp 
     257      pht_adv(:) = pht_adv(:) * zpwatt 
     258      pht_ove(:) = pht_ove(:) * zpwatt 
     259      pht_ldf(:) = pht_ldf(:) * zpwatt 
     260      pht_eiv(:) = pht_eiv(:) * zpwatt 
     261      pst_adv(:) = pst_adv(:) * zggram 
     262      pst_ove(:) = pst_ove(:) * zggram 
     263      pst_ldf(:) = pst_ldf(:) * zggram 
     264      pst_eiv(:) = pst_eiv(:) * zggram 
    210265 
    211266      ! "Meridional" Stream-Function 
     
    259314      ! inverse of the ocean "zonal" v-point section 
    260315      z_1(:,:,:) = 1.e0 
    261       surf_jk_r(:,:) = prt_vtjk( z1(:,:,:) ) 
     316      surf_jk_r(:,:) = prt_vtjk( z_1(:,:,:) ) 
    262317      WHERE( surf_jk_r(:,:) /= 0.e0 )   surf_jk_r(:,:) = 1.e0 / surf_jk_r(:,:) 
    263318 
     
    282337      !! * Arguments 
    283338      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     339      REAL(wp), DIMENSION(jpjglo) ::   zphi, zfoo 
    284340      !!----------------------------------------------------------------------  
    285341 
     
    291347         IF( cp_cfg == "orca" ) THEN                 !   ORCA configurations 
    292348            !                                        ! ======================= 
    293   
    294             iline = 100 / jp_cfg             ! i-line that passes near the North Pole 
     349 
     350            IF( jp_cfg == 05  )   iline = 192   ! i-line that passes near the North Pole 
     351            IF( jp_cfg == 025 )   iline = 384   ! i-line that passes near the North Pole 
     352            IF( jp_cfg == 2   )   iline =  48   ! i-line that passes near the North Pole 
     353            IF( jp_cfg == 4   )   iline =  24   ! i-line that passes near the North Pole 
     354  
    295355            zphi(:) = 0.e0    
    296356            DO ji = mi0(iline), mi1(iline) 
    297357               zphi(:) = gphiv(ji,:)         ! if iline is in the local domain 
    298358            END DO 
    299             IF( lk_mpp )   CALL mpp_sum( zphi, jpj )        ! provide the correct zphi to all local domains 
     359            ! provide the correct zphi to all local domains 
     360            IF( lk_mpp )   CALL mpp_sum( zphi, jpj )         
     361            ! introduce arbitray northernmost grid point to avoid netcdf error 
     362            zphi(jpjglo) = 2*zphi(jpjglo-1)-zphi(jpjglo-2) 
    300363 
    301364            !                                        ! ======================= 
     
    323386      ENDIF 
    324387 
    325       IF( kt === nitend )   CLOSE( numptr )   
     388      IF( kt == nitend )   CLOSE( numptr ) 
    326389 
    327390   END SUBROUTINE dia_ptr_wri 
     
    344407      !!---------------------------------------------------------------------- 
    345408      USE ioipsl          ! NetCDF IPSL library 
     409      USE daymod 
    346410 
    347411      !! * Arguments 
     
    353417 
    354418      !! * Local variables 
    355       CHARACTER (len=15) ::   clexp 
    356419      CHARACTER (len=40) ::   & 
    357          clhstnam, clop, clmax      ! temporary names 
     420         clhstnam, clop             ! temporary names 
     421      INTEGER ::   iline, it, ji    ! 
    358422      REAL(wp) ::   & 
    359          zsto, zout, zdt,           ! temporary scalars 
     423         zsto, zout, zdt, zmax, &   ! temporary scalars 
    360424         zjulian 
     425      REAL(wp), DIMENSION(jpjglo) ::   zphi, zfoo 
    361426      !!---------------------------------------------------------------------- 
    362427       
     
    393458            !                                        ! ======================= 
    394459 
    395             iline = 100 / jp_cfg             ! i-line that passes near the North Pole 
    396             zphi(:) = 0.e0                    
     460            IF( jp_cfg == 05  )   iline = 192   ! i-line that passes near the North Pole 
     461            IF( jp_cfg == 025 )   iline = 384   ! i-line that passes near the North Pole 
     462            IF( jp_cfg == 2   )   iline =  48   ! i-line that passes near the North Pole 
     463            IF( jp_cfg == 4   )   iline =  24   ! i-line that passes near the North Pole 
     464            zphi(:) = 0.e0 
    397465            DO ji = mi0(iline), mi1(iline)  
    398466               zphi(:) = gphiv(ji,:)         ! if iline is in the local domain 
    399467            END DO 
    400             IF( lk_mpp )   CALL mpp_sum( zphi, jpj )        ! provide the correct zphi to all local domains 
     468            ! provide the correct zphi to all local domains 
     469            IF( lk_mpp )   CALL mpp_sum( zphi, jpj )         
    401470 
    402471            !                                        ! ======================= 
     
    413482         clop = "ave(x)" 
    414483         zout = nf_ptr * zdt 
    415          zfoo = 0.e0 
     484         zfoo(:) = 0.e0 
    416485 
    417486         ! Compute julian date from starting date of the run 
     
    463532#if defined key_diaeiv 
    464533         ! Eddy induced velocity 
    465          CALL histdef( numptr, "zomsfglo", "Meridional Stream-Function: global",   & 
     534         CALL histdef( numptr, "zomsfeiv", "Bolus Meridional Stream-Function: global",   & 
    466535            "Sv"      , 1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout ) 
    467536         CALL histdef( numptr, "sophteiv", "Bolus Advective Heat Transport",   & 
     
    479548         ! define time axis 
    480549         it= kt - nit000 + 1 
     550         ndex(1) = 1 
    481551         CALL histwrite( numptr, "zotemglo", it, tn_jk    , jpj*jpk, ndex ) 
    482552         CALL histwrite( numptr, "zosalglo", it, sn_jk    , jpj*jpk, ndex ) 
     
    497567 
    498568      ! Close the file 
    499       IF( kt === nitend )   CALL histclo( numptr )           ! Netcdf write 
     569      IF( kt == nitend )   CALL histclo( numptr )           ! Netcdf write 
    500570 
    501571   END SUBROUTINE dia_ptr_wri 
     
    508578   !!---------------------------------------------------------------------- 
    509579   LOGICAL, PUBLIC, PARAMETER ::   lk_diaptr = .FALSE.    ! poleward transport flag 
     580   INTEGER, PUBLIC ::    & !!: ** ptr namelist (namptr) ** 
     581      nf_ptr = 15           !: frequency of ptr computation 
    510582CONTAINS 
    511583   SUBROUTINE dia_ptr( kt )        ! Empty routine 
Note: See TracChangeset for help on using the changeset viewer.