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/DIA – NEMO

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

Merge of 3.4beta into the trunk

Location:
trunk/NEMOGCM/NEMO/OPA_SRC/DIA
Files:
8 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaar5.F90

    r2715 r3294  
    1919   USE lib_mpp        ! distribued memory computing library 
    2020   USE iom            ! I/O manager library 
     21   USE timing         ! preformance summary 
     22   USE wrk_nemo       ! working arrays 
    2123 
    2224   IMPLICIT NONE 
     
    6567      !! ** Purpose :   compute and output some AR5 diagnostics 
    6668      !!---------------------------------------------------------------------- 
    67       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    68       USE wrk_nemo, ONLY:   zarea_ssh => wrk_2d_1 , zbotpres => wrk_2d_2   ! 2D workspace 
    69       USE wrk_nemo, ONLY:   zrhd      => wrk_3d_1 , zrhop    => wrk_3d_2   ! 3D      - 
    70       USE wrk_nemo, ONLY:   ztsn      => wrk_4d_1                          ! 4D      - 
    7169      ! 
    7270      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     
    7472      INTEGER  ::   ji, jj, jk                      ! dummy loop arguments 
    7573      REAL(wp) ::   zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass 
     74      ! 
     75      REAL(wp), POINTER, DIMENSION(:,:)     :: zarea_ssh , zbotpres       ! 2D workspace  
     76      REAL(wp), POINTER, DIMENSION(:,:,:)   :: zrhd , zrhop               ! 3D workspace 
     77      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztsn                       ! 4D workspace 
    7678      !!-------------------------------------------------------------------- 
    77  
    78       IF( wrk_in_use(2, 1,2) .OR.   & 
    79           wrk_in_use(3, 1,2) .OR.   & 
    80           wrk_in_use(4, 1)   ) THEN 
    81          CALL ctl_stop('dia_ar5: requested workspace arrays unavailable')   ;   RETURN 
    82       ENDIF 
     79      IF( nn_timing == 1 )   CALL timing_start('dia_ar5') 
     80  
     81      CALL wrk_alloc( jpi , jpj              , zarea_ssh , zbotpres ) 
     82      CALL wrk_alloc( jpi , jpj , jpk        , zrhd      , zrhop    ) 
     83      CALL wrk_alloc( jpi , jpj , jpk , jpts , ztsn                 ) 
    8384 
    8485      CALL iom_put( 'cellthc', fse3t(:,:,:) ) 
     
    9495      CALL iom_put( 'sshtot', zvolssh / area_tot ) 
    9596 
    96       !                                         ! thermosteric ssh 
    97       ztsn(:,:,:,jp_tem) = tn (:,:,:) 
     97      !                      
     98      ztsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem)                    ! thermosteric ssh 
    9899      ztsn(:,:,:,jp_sal) = sn0(:,:,:) 
    99100      CALL eos( ztsn, zrhd )                       ! now in situ density using initial salinity 
     
    138139            DO ji = 1, jpi 
    139140               zztmp = area(ji,jj) * fse3t(ji,jj,jk) 
    140                ztemp = ztemp + zztmp * tn(ji,jj,jk) 
    141                zsal  = zsal  + zztmp * sn(ji,jj,jk) 
     141               ztemp = ztemp + zztmp * tsn(ji,jj,jk,jp_tem) 
     142               zsal  = zsal  + zztmp * tsn(ji,jj,jk,jp_sal) 
    142143            END DO 
    143144         END DO 
    144145      END DO 
    145146      IF( .NOT.lk_vvl ) THEN 
    146          ztemp = ztemp + SUM( zarea_ssh(:,:) * tn(:,:,1) ) 
    147          zsal  = zsal  + SUM( zarea_ssh(:,:) * sn(:,:,1) ) 
     147         ztemp = ztemp + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_tem) ) 
     148         zsal  = zsal  + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_sal) ) 
    148149      ENDIF 
    149150      IF( lk_mpp ) THEN   
     
    160161      CALL iom_put( 'saltot' , zsal  ) 
    161162      ! 
    162       IF( wrk_not_released(2, 1,2) .OR.   & 
    163           wrk_not_released(3, 1,2) .OR.   & 
    164           wrk_not_released(4, 1)   )   CALL ctl_stop('dia_ar5: failed to release workspace arrays') 
     163      CALL wrk_dealloc( jpi , jpj              , zarea_ssh , zbotpres ) 
     164      CALL wrk_dealloc( jpi , jpj , jpk        , zrhd      , zrhop    ) 
     165      CALL wrk_dealloc( jpi , jpj , jpk , jpts , ztsn                 ) 
     166      ! 
     167      IF( nn_timing == 1 )   CALL timing_stop('dia_ar5') 
    165168      ! 
    166169   END SUBROUTINE dia_ar5 
     
    173176      !! ** Purpose :   initialization for AR5 diagnostic computation 
    174177      !!---------------------------------------------------------------------- 
    175       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    176       USE wrk_nemo, ONLY:   wrk_4d_1      ! 4D workspace 
    177       ! 
    178178      INTEGER  ::   inum 
    179179      INTEGER  ::   ik 
     
    183183      !!---------------------------------------------------------------------- 
    184184      ! 
    185       IF(wrk_in_use(4, 1) ) THEN 
    186          CALL ctl_stop('dia_ar5_init: requested workspace array unavailable.')   ;   RETURN 
    187       ENDIF 
    188       zsaldta => wrk_4d_1(:,:,:,1:2) 
    189  
     185      IF( nn_timing == 1 )   CALL timing_start('dia_ar5_init') 
     186      ! 
     187      CALL wrk_alloc( jpi , jpj , jpk, jpts, zsaldta ) 
    190188      !                                      ! allocate dia_ar5 arrays 
    191189      IF( dia_ar5_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_ar5_init : unable to allocate arrays' ) 
     
    221219      ENDIF 
    222220      ! 
    223       IF( wrk_not_released(4, 1) )   CALL ctl_stop('dia_ar5_init: failed to release workspace array') 
     221      CALL wrk_dealloc( jpi , jpj , jpk, jpts, zsaldta ) 
     222      ! 
     223      IF( nn_timing == 1 )   CALL timing_stop('dia_ar5_init') 
    224224      ! 
    225225   END SUBROUTINE dia_ar5_init 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diadct.F90

    r3292 r3294  
    3838  USE dianam          ! build name of file 
    3939  USE lib_mpp         ! distributed memory computing library 
    40 #if defined key_ice_lim2 || defined key_ice_lim3 
     40#if defined key_lim2 || defined key_lim3 
    4141  USE ice 
    4242#endif 
    4343  USE domvvl 
     44  USE timing          ! preformance summary 
     45  USE wrk_nemo        ! working arrays 
    4446 
    4547  IMPLICIT NONE 
     
    114116     NAMELIST/namdct/nn_dct,nn_dctwri,nn_secdebug 
    115117 
     118     IF( nn_timing == 1 )   CALL timing_start('dia_dct_init') 
     119 
    116120     !read namelist 
    117121     REWIND( numnam ) 
     
    147151     ENDIF 
    148152 
    149  
     153     IF( nn_timing == 1 )   CALL timing_stop('dia_dct_init') 
     154     ! 
    150155  END SUBROUTINE dia_dct_init 
    151156  
     
    161166 
    162167     !! * Local variables 
    163      INTEGER             :: jsec,            &!loop on sections 
    164                             iost              !error for opening fileout 
    165      LOGICAL             :: lldebug =.FALSE.  !debug a section   
    166      CHARACTER(len=160)  :: clfileout         !fileout name 
     168     INTEGER             :: jsec,            &! loop on sections 
     169                            iost,            &! error for opening fileout 
     170                            itotal            ! nb_sec_max*nb_type_class*nb_class_max 
     171     LOGICAL             :: lldebug =.FALSE.  ! debug a section   
     172     CHARACTER(len=160)  :: clfileout         ! fileout name 
    167173 
    168174      
    169      INTEGER , DIMENSION(1):: ish                                       ! tmp array for mpp_sum 
    170      INTEGER , DIMENSION(3):: ish2                                      !   " 
    171      REAL(wp), DIMENSION(nb_sec_max*nb_type_class*nb_class_max):: zwork !   "   
    172      REAL(wp), DIMENSION(nb_sec_max,nb_type_class,nb_class_max):: zsum  !   " 
     175     INTEGER , DIMENSION(1)             :: ish   ! tmp array for mpp_sum 
     176     INTEGER , DIMENSION(3)             :: ish2  !   " 
     177     REAL(wp), POINTER, DIMENSION(:)    :: zwork !   "   
     178     REAL(wp), POINTER, DIMENSION(:,:,:):: zsum  !   " 
    173179 
    174180     !!---------------------------------------------------------------------     
    175  
     181     IF( nn_timing == 1 )   CALL timing_start('dia_dct') 
     182 
     183     IF( lk_mpp )THEN 
     184        itotal = nb_sec_max*nb_type_class*nb_class_max 
     185        CALL wrk_alloc( itotal                                , zwork )  
     186        CALL wrk_alloc( nb_sec_max,nb_type_class,nb_class_max , zsum  ) 
     187     ENDIF     
     188  
    176189     IF( lwp .AND. kt==nit000+nn_dct-1 ) THEN 
    177190         WRITE(numout,*) " " 
     
    189202           !debug this section computing ? 
    190203           lldebug=.FALSE. 
    191 !           IF( (jsec==nn_secdebug .OR. nn_secdebug==-1) .AND.  kt==nit000+nn_dct-1 .AND. lwp ) lldebug=.TRUE.  
    192            IF( (jsec==nn_secdebug .OR. nn_secdebug==-1) .AND.  kt==nit000+nn_dct-1 ) lldebug=.TRUE.  
     204           IF( (jsec==nn_secdebug .OR. nn_secdebug==-1) .AND.  kt==nit000+nn_dct-1 .AND. lwp ) lldebug=.TRUE.  
    193205 
    194206           !Compute transport through section   
     
    226238     ENDIF 
    227239 
     240     IF( lk_mpp )THEN 
     241        itotal = nb_sec_max*nb_type_class*nb_class_max 
     242        CALL wrk_dealloc( itotal                                , zwork )  
     243        CALL wrk_dealloc( nb_sec_max,nb_type_class,nb_class_max , zsum  ) 
     244     ENDIF     
     245 
     246     IF( nn_timing == 1 )   CALL timing_stop('dia_dct') 
     247     ! 
    228248  END SUBROUTINE dia_dct 
    229249 
     
    250270     TYPE(POINT_SECTION),DIMENSION(nb_point_max)  ::coordtemp !contains listpoints coordinates  
    251271                                                              !read in the file 
    252      INTEGER,DIMENSION(nb_point_max)  ::directemp             !contains listpoints directions 
     272     INTEGER, POINTER, DIMENSION(:) :: directemp              !contains listpoints directions 
    253273                                                              !read in the files 
    254274     LOGICAL :: llbon                                       ,&!local logical 
    255275                lldebug                                       !debug the section 
    256276     !!------------------------------------------------------------------------------------- 
     277     CALL wrk_alloc( nb_point_max, directemp ) 
    257278 
    258279     !open input file 
     
    381402           ENDIF 
    382403 
     404              IF(jsec==nn_secdebug .AND. secs(jsec)%nb_point .NE. 0)THEN 
     405              WRITE(narea+200,*)'avant secs(jsec)%nb_point iptloc ',secs(jsec)%nb_point,iptloc 
     406              DO jpt = 1,iptloc 
     407                 iiglo = secs(jsec)%listPoint(jpt)%I + jpizoom - 1 + nimpp - 1 
     408                 ijglo = secs(jsec)%listPoint(jpt)%J + jpjzoom - 1 + njmpp - 1 
     409                 WRITE(narea+200,*)'avant # I J : ',iiglo,ijglo 
     410              ENDDO 
     411              ENDIF 
     412 
    383413           !remove redundant points between processors 
    384414           !------------------------------------------ 
     
    390420              CALL removepoints(secs(jsec),'J','bot_list',lldebug) 
    391421           ENDIF 
     422           IF(jsec==nn_secdebug .AND. secs(jsec)%nb_point .NE. 0)THEN 
     423              WRITE(narea+200,*)'apres secs(jsec)%nb_point iptloc ',secs(jsec)%nb_point,iptloc 
     424              DO jpt = 1,secs(jsec)%nb_point 
     425                 iiglo = secs(jsec)%listPoint(jpt)%I + jpizoom - 1 + nimpp - 1 
     426                 ijglo = secs(jsec)%listPoint(jpt)%J + jpjzoom - 1 + njmpp - 1 
     427                 WRITE(narea+200,*)'apres # I J : ',iiglo,ijglo 
     428              ENDDO 
     429           ENDIF 
    392430 
    393431           !debug 
     
    395433           IF( lwp .AND. ( jsec==nn_secdebug .OR. nn_secdebug==-1 ) )THEN 
    396434              WRITE(numout,*)"      List of points after removepoints:" 
     435              iptloc = secs(jsec)%nb_point 
    397436              DO jpt = 1,iptloc 
    398437                 iiglo = secs(jsec)%listPoint(jpt)%I + jpizoom - 1 + nimpp - 1 
     
    411450     nb_sec = jsec-1   !number of section read in the file 
    412451 
     452     CALL wrk_dealloc( nb_point_max, directemp ) 
     453     ! 
    413454  END SUBROUTINE readsec 
    414455 
     
    436477                                 ! isgn=-1 : scan listpoint from end to start  
    437478                istart,iend      !first and last points selected in listpoint 
    438      INTEGER :: jpoint   =0      !loop on list points 
    439      INTEGER,DIMENSION(nb_point_max)   :: idirec !contains temporary sec%direction 
    440      INTEGER,DIMENSION(2,nb_point_max) :: icoord !contains temporary sec%listpoint 
     479     INTEGER :: jpoint           !loop on list points 
     480     INTEGER, POINTER, DIMENSION(:)   :: idirec !contains temporary sec%direction 
     481     INTEGER, POINTER, DIMENSION(:,:) :: icoord !contains temporary sec%listpoint 
    441482     !---------------------------------------------------------------------------- 
     483     CALL wrk_alloc(    nb_point_max, idirec ) 
     484     CALL wrk_alloc( 2, nb_point_max, icoord ) 
     485 
    442486     IF( ld_debug )WRITE(numout,*)'      -------------------------' 
    443487     IF( ld_debug )WRITE(numout,*)'      removepoints in listpoint' 
     
    467511     sec%direction            = 0 
    468512 
    469  
    470513     jpoint=iextr+isgn 
    471      DO WHILE( jpoint .GE. 1 .AND. jpoint .LE. sec%nb_point  .AND. & 
    472         icoord( iind,jpoint-isgn ) == itest .AND. icoord( iind,jpoint ) == itest ) 
    473         jpoint=jpoint+isgn 
    474      ENDDO 
     514     DO WHILE( jpoint .GE. 1 .AND. jpoint .LE. sec%nb_point ) 
     515         IF( icoord( iind,jpoint-isgn ) == itest .AND. icoord( iind,jpoint ) == itest )THEN ; jpoint=jpoint+isgn 
     516         ELSE                                                                               ; EXIT 
     517         ENDIF 
     518     ENDDO  
    475519 
    476520     IF( cdextr=='bot_list')THEN ; istart=jpoint-1 ; iend=sec%nb_point 
    477521     ELSE                        ; istart=1        ; iend=jpoint+1 
    478522     ENDIF 
     523 
    479524     sec%listPoint(1:1+iend-istart)%I = icoord(1,istart:iend) 
    480525     sec%listPoint(1:1+iend-istart)%J = icoord(2,istart:iend) 
     
    487532     ENDIF 
    488533 
     534     CALL wrk_dealloc(    nb_point_max, idirec ) 
     535     CALL wrk_dealloc( 2, nb_point_max, icoord ) 
    489536  END SUBROUTINE removepoints 
    490537 
     
    536583 
    537584     TYPE(POINT_SECTION) :: k 
    538      REAL(wp),DIMENSION(nb_type_class,nb_class_max)::zsum 
     585     REAL(wp), POINTER, DIMENSION(:,:):: zsum ! 2D work array 
    539586     !!-------------------------------------------------------- 
     587     CALL wrk_alloc( nb_type_class , nb_class_max , zsum   ) 
    540588 
    541589     IF( ld_debug )WRITE(numout,*)'      Compute transport' 
     
    746794           ENDDO !end of loop on the density classes 
    747795 
    748 #if defined key_ice_lim 
     796#if defined key_lim2 || defined key_lim3 
    749797 
    750798           !ICE CASE     
     
    812860        sec%transport(2,jclass)=sec%transport(2,jclass)+zsum(2,jclass)*1.E-6 
    813861        IF( sec%llstrpond ) THEN 
    814            IF( zsum(1,jclass) .NE. 0 ) THEN 
    815               sec%transport(3,jclass)=sec%transport(3,jclass)+zsum(3,jclass)/zsum(1,jclass) 
    816               sec%transport(5,jclass)=sec%transport(5,jclass)+zsum(5,jclass)/zsum(1,jclass) 
    817               sec%transport(7,jclass)=sec%transport(7,jclass)+zsum(7,jclass) 
    818               sec%transport(9,jclass)=sec%transport(9,jclass)+zsum(9,jclass) 
    819            ELSE 
    820               sec%transport(3,jclass)=0. 
    821               sec%transport(5,jclass)=0. 
    822               sec%transport(7,jclass)=0. 
    823               sec%transport(9,jclass)=0. 
     862           IF( zsum(1,jclass) .NE. 0._wp ) THEN 
     863              sec%transport( 3,jclass) = sec%transport( 3,jclass) + zsum( 3,jclass)/zsum(1,jclass) 
     864              sec%transport( 5,jclass) = sec%transport( 5,jclass) + zsum( 5,jclass)/zsum(1,jclass) 
     865              sec%transport( 7,jclass) = sec%transport( 7,jclass) + zsum( 7,jclass) 
     866              sec%transport( 9,jclass) = sec%transport( 9,jclass) + zsum( 9,jclass) 
    824867           ENDIF 
    825            IF( zsum(2,jclass) .NE. 0 )THEN 
    826               sec%transport( 4,jclass)=sec%transport( 4,jclass)+zsum( 4,jclass)/zsum(2,jclass) 
    827               sec%transport( 6,jclass)=sec%transport( 6,jclass)+zsum( 6,jclass)/zsum(2,jclass) 
    828               sec%transport( 8,jclass)=sec%transport( 8,jclass)+zsum( 8,jclass) 
    829               sec%transport(10,jclass)=sec%transport(10,jclass)+zsum(10,jclass) 
    830            ELSE 
    831               sec%transport( 4,jclass)=0. 
    832               sec%transport( 6,jclass)=0. 
    833               sec%transport( 8,jclass)=0. 
    834               sec%transport(10,jclass)=0. 
     868           IF( zsum(2,jclass) .NE. 0._wp )THEN 
     869              sec%transport( 4,jclass) = sec%transport( 4,jclass) + zsum( 4,jclass)/zsum(2,jclass) 
     870              sec%transport( 6,jclass) = sec%transport( 6,jclass) + zsum( 6,jclass)/zsum(2,jclass) 
     871              sec%transport( 8,jclass) = sec%transport( 8,jclass) + zsum( 8,jclass) 
     872              sec%transport(10,jclass) = sec%transport(10,jclass) + zsum(10,jclass) 
    835873           ENDIF 
    836874        ELSE 
    837            sec%transport( 3,jclass)=0. 
    838            sec%transport( 4,jclass)=0. 
    839            sec%transport( 5,jclass)=0. 
    840            sec%transport( 6,jclass)=0. 
    841            sec%transport( 7,jclass)=0. 
    842            sec%transport( 8,jclass)=0. 
    843            sec%transport(10,jclass)=0. 
     875           sec%transport( 3,jclass) = 0._wp 
     876           sec%transport( 4,jclass) = 0._wp 
     877           sec%transport( 5,jclass) = 0._wp 
     878           sec%transport( 6,jclass) = 0._wp 
     879           sec%transport( 7,jclass) = 0._wp 
     880           sec%transport( 8,jclass) = 0._wp 
     881           sec%transport(10,jclass) = 0._wp 
    844882        ENDIF 
    845883     ENDDO    
     
    852890     ENDIF 
    853891 
     892     CALL wrk_dealloc( nb_type_class , nb_class_max , zsum   ) 
     893     ! 
    854894  END SUBROUTINE transport 
    855895   
     
    872912     !!-------------------------------------------------------------  
    873913     !!arguments 
    874      INTEGER, INTENT(IN)          :: kt         ! time-step 
    875      TYPE(SECTION), INTENT(INOUT) :: sec        ! section to write    
    876      INTEGER ,INTENT(IN)          :: ksec       ! section number 
     914     INTEGER, INTENT(IN)          :: kt          ! time-step 
     915     TYPE(SECTION), INTENT(INOUT) :: sec         ! section to write    
     916     INTEGER ,INTENT(IN)          :: ksec        ! section number 
    877917 
    878918     !!local declarations 
    879      REAL(wp) ,DIMENSION(nb_type_class):: zsumclass 
    880      INTEGER               :: jcl,ji            ! Dummy loop 
    881      CHARACTER(len=2)      :: classe            ! Classname  
    882      REAL(wp)              :: zbnd1,zbnd2       ! Class bounds 
    883      REAL(wp)              :: zslope            ! section's slope coeff 
     919     INTEGER               :: jcl,ji             ! Dummy loop 
     920     CHARACTER(len=2)      :: classe             ! Classname  
     921     REAL(wp)              :: zbnd1,zbnd2        ! Class bounds 
     922     REAL(wp)              :: zslope             ! section's slope coeff 
     923     ! 
     924     REAL(wp), POINTER, DIMENSION(:):: zsumclass ! 1D workspace  
    884925     !!-------------------------------------------------------------  
    885        
     926     CALL wrk_alloc(nb_type_class , zsumclass )   
     927 
    886928     zsumclass(:)=0._wp 
    887929     zslope = sec%slopeSection        
     
    9961038119 FORMAT(I8,1X,I8,1X,I4,1X,A30,1X,f9.2,1X,I4,3X,A8,1X,2F12.4,5X,3E15.6) 
    9971039 
     1040     CALL wrk_dealloc(nb_type_class , zsumclass )   
    9981041  END SUBROUTINE dia_dct_wri 
    9991042 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diadimg.F90

    r2715 r3294  
    1010   USE in_out_manager  ! I/O manager 
    1111   USE daymod          ! calendar 
     12   USE lib_mpp 
    1213 
    1314   IMPLICIT NONE 
     
    4041      !!--------------------------------------------------------------------- 
    4142      ! 
    42       ALLOCATE( z42d(jpi,jpj), z4dep(jpk), STAT=dia_wri_dimg_alloc ) 
    43       ! 
    44       IF( lk_mpp                  )   CALL mpp_sum ( dia_wri_dimg_alloc ) 
    45       IF( dia_wri_dimg_alloc /= 0 )   CALL ctl_warn('dia_wri_dimg_alloc: allocation of array failed.') 
     43      IF( .NOT. ALLOCATED( z42d ) )THEN 
     44 
     45         ALLOCATE( z42d(jpi,jpj), z4dep(jpk), STAT=dia_wri_dimg_alloc ) 
     46 
     47         IF( lk_mpp                  )   CALL mpp_sum ( dia_wri_dimg_alloc ) 
     48         IF( dia_wri_dimg_alloc /= 0 )   CALL ctl_warn('dia_wri_dimg_alloc: allocation of array failed.') 
     49 
     50      ELSE 
     51 
     52         dia_wri_dimg_alloc = 0 
     53 
     54      ENDIF 
    4655      ! 
    4756  END FUNCTION dia_wri_dimg_alloc 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diafwb.F90

    r2528 r3294  
    2222   USE in_out_manager  ! I/O manager 
    2323   USE lib_mpp         ! distributed memory computing library 
     24   USE timing          ! preformance summary 
    2425 
    2526   IMPLICIT NONE 
     
    6162      REAL(wp) ::  zsm0, zfwfnew 
    6263      !!---------------------------------------------------------------------- 
     64      IF( nn_timing == 1 )   CALL timing_start('dia_fwb') 
    6365 
    6466      ! Mean global salinity 
     
    8082               DO ji = fs_2, fs_jpim1   ! vector opt. 
    8183                  zwei  = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 
    82                   a_salb = a_salb + ( sb(ji,jj,jk) - zsm0 ) * zwei 
     84                  a_salb = a_salb + ( tsb(ji,jj,jk,jp_sal) - zsm0 ) * zwei 
    8385               END DO 
    8486            END DO 
     
    106108               DO ji = fs_2, fs_jpim1   ! vector opt. 
    107109                  zwei  = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 
    108                   a_saln = a_saln + ( sn(ji,jj,jk) - zsm0 ) * zwei 
     110                  a_saln = a_saln + ( tsn(ji,jj,jk,jp_sal) - zsm0 ) * zwei 
    109111                  zvol  = zvol  + zwei 
    110112               END DO 
     
    174176         END SELECT 
    175177         !  
    176          DO ji = mi0(ii0), mi1(ii1) 
     178         DO ji = mi0(ii0), MIN(mi1(ii1),jpim1) 
    177179            DO jj = mj0(ij0), mj1(ij1) 
    178180               DO jk = 1, jpk  
    179                   zt = 0.5 * ( tn(ji,jj,jk) + tn(ji+1,jj,jk) ) 
    180                   zs = 0.5 * ( sn(ji,jj,jk) + sn(ji+1,jj,jk) ) 
    181                   zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) 
     181                  zt = 0.5 * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 
     182                  zs = 0.5 * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 
     183                  zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) * tmask_i(ji,jj) 
    182184 
    183185                  IF( un(ji,jj,jk) > 0.e0 ) THEN  
     
    221223         END SELECT 
    222224         !  
    223          DO ji = mi0(ii0), mi1(ii1) 
     225         DO ji = mi0(ii0), MIN(mi1(ii1),jpim1) 
    224226            DO jj = mj0(ij0), mj1(ij1) 
    225227               DO jk = 1, jpk  
    226                   zt = 0.5 * ( tn(ji,jj,jk) + tn(ji+1,jj,jk) ) 
    227                   zs = 0.5 * ( sn(ji,jj,jk) + sn(ji+1,jj,jk) ) 
    228                   zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) 
     228                  zt = 0.5 * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 
     229                  zs = 0.5 * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 
     230                  zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) * tmask_i(ji,jj) 
    229231                   
    230232                  IF( un(ji,jj,jk) > 0.e0 ) THEN  
     
    268270         END SELECT 
    269271         !  
    270          DO ji = mi0(ii0), mi1(ii1) 
     272         DO ji = mi0(ii0), MIN(mi1(ii1),jpim1) 
    271273            DO jj = mj0(ij0), mj1(ij1) 
    272274               DO jk = 1, jpk  
    273                   zt = 0.5 * ( tn(ji,jj,jk) + tn(ji+1,jj,jk) ) 
    274                   zs = 0.5 * ( sn(ji,jj,jk) + sn(ji+1,jj,jk) ) 
    275                   zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) 
     275                  zt = 0.5 * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 
     276                  zs = 0.5 * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 
     277                  zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) * tmask_i(ji,jj) 
    276278                   
    277279                  IF( un(ji,jj,jk) > 0.e0 ) THEN  
     
    315317         END SELECT 
    316318         !  
    317          DO ji = mi0(ii0), mi1(ii1) 
     319         DO ji = mi0(ii0), MIN(mi1(ii1),jpim1) 
    318320            DO jj = mj0(ij0), mj1(ij1) 
    319321               DO jk = 1, jpk 
    320                   zt = 0.5 * ( tn(ji,jj,jk) + tn(ji+1,jj,jk) ) 
    321                   zs = 0.5 * ( sn(ji,jj,jk) + sn(ji+1,jj,jk) ) 
    322                   zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) 
     322                  zt = 0.5 * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 
     323                  zs = 0.5 * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 
     324                  zu = un(ji,jj,jk) * fse3t(ji,jj,jk) * e2u(ji,jj) * tmask_i(ji,jj) 
    323325                   
    324326                  IF( un(ji,jj,jk) > 0.e0 ) THEN  
     
    438440      ENDIF 
    439441 
     442      IF( nn_timing == 1 )   CALL timing_start('dia_fwb') 
     443 
    440444 9005 FORMAT(1X,A,ES24.16) 
    441445 9010 FORMAT(1X,A,ES12.5,A,F10.5,A) 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaharm.F90

    r3292 r3294  
    1616   USE dynspg_oce 
    1717   USE dynspg_ts 
    18    USE surdetermine 
    1918   USE daymod 
    2019   USE tide_mod 
    2120   USE iom  
     21   USE timing          ! preformance summary 
     22   USE wrk_nemo        ! working arrays 
    2223 
    2324   IMPLICIT NONE 
    2425   PRIVATE 
     26 
     27   LOGICAL, PUBLIC, PARAMETER :: lk_diaharm  = .TRUE. 
    2528    
    26    INTEGER, PARAMETER :: nb_harmo_max=9 
    27  
    28    LOGICAL, PUBLIC, PARAMETER ::   lk_diaharm  = .TRUE. 
    29  
    30    INTEGER ::      & !! namelist variables 
    31        nit000_han=1, & ! First time step used for harmonic analysis 
    32        nitend_han=1, & ! Last time step used for harmonic analysis 
    33        nstep_han=1,  & ! Time step frequency for harmonic analysis 
    34        nb_ana          ! Number of harmonics to analyse 
    35  
    36    CHARACTER (LEN=4), DIMENSION(nb_harmo_max) ::   & 
     29   INTEGER, PARAMETER :: jpincomax    = 2.*jpmax_harmo 
     30   INTEGER, PARAMETER :: jpdimsparse  = jpincomax*300*24 
     31 
     32   INTEGER ::                            & !! namelist variables 
     33                         nit000_han = 1, & ! First time step used for harmonic analysis 
     34                         nitend_han = 1, & ! Last time step used for harmonic analysis 
     35                         nstep_han  = 1, & ! Time step frequency for harmonic analysis 
     36                         nb_ana            ! Number of harmonics to analyse 
     37 
     38   INTEGER , ALLOCATABLE, DIMENSION(:)       :: name 
     39   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: ana_temp 
     40   REAL(wp), ALLOCATABLE, DIMENSION(:)       :: ana_freq, vt, ut, ft 
     41   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   :: out_eta, & 
     42                                                out_u  , & 
     43                                                out_v 
     44 
     45   INTEGER :: ninco, nsparse 
     46   INTEGER ,       DIMENSION(jpdimsparse)         :: njsparse, nisparse 
     47   INTEGER , SAVE, DIMENSION(jpincomax)           :: ipos1 
     48   REAL(wp),       DIMENSION(jpdimsparse)         :: valuesparse 
     49   REAL(wp),       DIMENSION(jpincomax)           :: ztmp4 , ztmp7 
     50   REAL(wp), SAVE, DIMENSION(jpincomax,jpincomax) :: ztmp3 , zpilier 
     51   REAL(wp), SAVE, DIMENSION(jpincomax)           :: zpivot 
     52 
     53   CHARACTER (LEN=4), DIMENSION(jpmax_harmo) ::   & 
    3754       tname         ! Names of tidal constituents ('M2', 'K1',...) 
    3855 
    39    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: ana_temp 
    40    REAL(wp), ALLOCATABLE, DIMENSION(:) :: ana_freq, vt, ut, ft 
    41    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: out_eta, & 
    42               out_u, & 
    43                  out_v 
    44    INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) :: name 
    4556 
    4657!! * Routine accessibility 
     
    6778      !! * Local declarations  
    6879      INTEGER :: jh, nhan, jk, ji 
    69       NAMELIST/nam_diaharm/ nit000_han, nitend_han, nstep_han, nb_ana, tname 
    70  
    71       !!---------------------------------------------------------------------- 
    72  
    73       ! Read namelist parameters: 
    74       ! ------------------------- 
     80 
     81      NAMELIST/nam_diaharm/ nit000_han, nitend_han, nstep_han, tname 
     82      !!---------------------------------------------------------------------- 
     83 
     84      IF(lwp) THEN 
     85         WRITE(numout,*) 
     86         WRITE(numout,*) 'dia_harm_init: Tidal harmonic analysis initialization' 
     87         WRITE(numout,*) '~~~~~~~ ' 
     88      ENDIF 
     89      ! 
     90      CALL tide_init_Wave 
     91      ! 
     92      tname(:)='' 
     93      ! 
     94      ! Read Namelist nam_diaharm 
    7595      REWIND ( numnam ) 
    7696      READ   ( numnam, nam_diaharm ) 
    77  
    78       IF(lwp) WRITE(numout,*) 
    79       IF(lwp) WRITE(numout,*) 'dia_harm_init: Tidal harmonic analysis initialization' 
    80       IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~' 
    81  
    82       IF(lwp) WRITE(numout,*) 'First time step used for analysis:  nit000_han= ', nit000_han 
    83       IF(lwp) WRITE(numout,*) 'Last  time step used for analysis:  nitend_han= ', nitend_han 
    84       IF(lwp) WRITE(numout,*) 'Time step frequency for harmonic analysis:  nstep_han= ', nstep_han 
    85  
    86       IF (nb_ana > nb_harmo_max) THEN 
    87         IF(lwp) WRITE(numout,*) ' E R R O R : dia_harm_init. & 
    88                                 & nb_ana must be lower than nb_harmo_max, stop' 
    89         IF(lwp) WRITE(numout,*) 'nb_harmo_max= ', nb_harmo_max 
    90         nstop = nstop + 1 
     97      ! 
     98      IF(lwp) THEN 
     99         WRITE(numout,*) 'First time step used for analysis:  nit000_han= ', nit000_han 
     100         WRITE(numout,*) 'Last  time step used for analysis:  nitend_han= ', nitend_han 
     101         WRITE(numout,*) 'Time step frequency for harmonic analysis:  nstep_han= ', nstep_han 
    91102      ENDIF 
    92103 
     
    94105      ! ---------------------------------------------- 
    95106      IF (nit000 > nit000_han) THEN 
    96         IF(lwp) WRITE(numout,*) ' E R R O R : dia_harm_init. & 
    97                                 & nit000_han must be greater than nit000, stop' 
    98         IF(lwp) WRITE(numout,*) 'restart capability not implemented' 
     107        IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nit000_han must be greater than nit000, stop' 
     108        IF(lwp) WRITE(numout,*) ' restart capability not implemented' 
    99109        nstop = nstop + 1 
    100110      ENDIF 
    101111      IF (nitend < nitend_han) THEN 
    102         IF(lwp) WRITE(numout,*) ' E R R O R : dia_harm_init. & 
    103                                 & nitend_han must be lower than nitend, stop' 
    104         IF(lwp) WRITE(numout,*) 'restart capability not implemented' 
     112        IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nitend_han must be lower than nitend, stop' 
     113        IF(lwp) WRITE(numout,*) ' restart capability not implemented' 
    105114        nstop = nstop + 1 
    106115      ENDIF 
    107116 
    108117      IF (MOD(nitend_han-nit000_han+1,nstep_han).NE.0) THEN 
    109         IF(lwp) WRITE(numout,*) ' E R R O R : dia_harm_init. & 
    110                                 & analysis time span must be a multiple of nstep_han, stop' 
     118        IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : analysis time span must be a multiple of nstep_han, stop' 
    111119        nstop = nstop + 1 
    112120      END IF 
    113121 
    114       CALL tide_init_Wave 
     122      nb_ana=0 
     123      DO jk=1,jpmax_harmo 
     124         DO ji=1,jpmax_harmo 
     125            IF(TRIM(tname(jk)) == Wave(ji)%cname_tide) THEN 
     126               nb_ana=nb_ana+1 
     127            ENDIF 
     128         END DO 
     129      ENDDO 
     130      ! 
     131      IF(lwp) THEN 
     132         WRITE(numout,*) '        Namelist nam_diaharm' 
     133         WRITE(numout,*) '        nb_ana    = ', nb_ana 
     134         CALL flush(numout) 
     135      ENDIF 
     136      ! 
     137      IF (nb_ana > jpmax_harmo) THEN 
     138        IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nb_ana must be lower than jpmax_harmo, stop' 
     139        IF(lwp) WRITE(numout,*) ' jpmax_harmo= ', jpmax_harmo 
     140        nstop = nstop + 1 
     141      ENDIF 
    115142 
    116143      ALLOCATE(name    (nb_ana)) 
     
    162189 
    163190      !! * Local declarations 
    164       INTEGER :: ji, jj, jh, jc, nhc 
     191      INTEGER  :: ji, jj, jh, jc, nhc 
    165192      REAL(wp) :: ztime, ztemp 
     193      !!-------------------------------------------------------------------- 
     194      IF( nn_timing == 1 )   CALL timing_start('dia_harm') 
    166195 
    167196      IF ( kt .EQ. nit000 ) CALL dia_harm_init 
     
    170199           (MOD(kt,nstep_han).EQ.0) ) THEN 
    171200 
    172         ztime = kt*rdt  
     201        ztime = (kt-nit000+1)*rdt  
    173202        
    174203        nhc = 0 
     
    202231      IF ( kt .EQ. nitend_han ) CALL dia_harm_end 
    203232 
     233      IF( nn_timing == 1 )   CALL timing_stop('dia_harm') 
    204234  
    205235   END SUBROUTINE dia_harm 
     
    223253      REAL(wp) :: ztime, ztime_ini, ztime_end 
    224254      REAL(wp) :: X1,X2 
    225       REAL(wp), DIMENSION(jpi,jpj,nb_harmo_max,2) :: ana_amp 
    226  
    227  
    228         IF(lwp) WRITE(numout,*) 
    229         IF(lwp) WRITE(numout,*) 'anharmo_end: kt=nitend_han: Perform harmonic analysis' 
    230         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
    231  
    232         ztime_ini = nit000_han*rdt                 ! Initial time in seconds at the beginning of analysis 
    233         ztime_end = nitend_han*rdt                 ! Final time in seconds at the end of analysis 
    234         nhan = (nitend_han-nit000_han+1)/nstep_han ! Number of dumps used for analysis 
    235  
    236         ninco = 2*nb_ana 
    237  
    238         ksp = 0 
    239         keq = 0         
    240         DO jn = 1, nhan 
    241           ztime=( (nhan-jn)*ztime_ini + (jn-1)*ztime_end )/FLOAT(nhan-1) 
    242           keq = keq + 1 
    243           kun = 0 
    244           DO jh = 1,nb_ana 
     255      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ana_amp 
     256      !!-------------------------------------------------------------------- 
     257      CALL wrk_alloc( jpi , jpj , jpmax_harmo , 2 , ana_amp ) 
     258 
     259      IF(lwp) WRITE(numout,*) 
     260      IF(lwp) WRITE(numout,*) 'anharmo_end: kt=nitend_han: Perform harmonic analysis' 
     261      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
     262 
     263      ztime_ini = nit000_han*rdt                 ! Initial time in seconds at the beginning of analysis 
     264      ztime_end = nitend_han*rdt                 ! Final time in seconds at the end of analysis 
     265      nhan = (nitend_han-nit000_han+1)/nstep_han ! Number of dumps used for analysis 
     266 
     267      ninco = 2*nb_ana 
     268 
     269      ksp = 0 
     270      keq = 0         
     271      DO jn = 1, nhan 
     272         ztime=( (nhan-jn)*ztime_ini + (jn-1)*ztime_end )/FLOAT(nhan-1) 
     273         keq = keq + 1 
     274         kun = 0 
     275         DO jh = 1,nb_ana 
    245276            DO jc = 1,2 
    246               kun = kun + 1 
    247               ksp = ksp + 1 
    248               nisparse(ksp) = keq 
    249               njsparse(ksp) = kun 
    250               valuesparse(ksp)= & 
    251                  +(     MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh)) & 
     277               kun = kun + 1 
     278               ksp = ksp + 1 
     279               nisparse(ksp) = keq 
     280               njsparse(ksp) = kun 
     281               valuesparse(ksp)= & 
     282                   +(   MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh)) & 
    252283                   +(1.-MOD(jc,2))* ft(jh) * SIN(ana_freq(jh)*ztime + vt(jh) + ut(jh))) 
    253284            END DO 
    254           END DO 
    255         END DO 
    256  
    257         nsparse=ksp 
    258  
    259         ! Elevation: 
    260         DO jj = 1, jpj 
    261           DO ji = 1, jpi 
     285         END DO 
     286      END DO 
     287 
     288      nsparse=ksp 
     289 
     290      ! Elevation: 
     291      DO jj = 1, jpj 
     292         DO ji = 1, jpi 
    262293            ! Fill input array 
    263294            kun=0 
    264295            DO jh = 1,nb_ana 
    265               DO jc = 1,2 
    266                 kun = kun + 1 
    267                 tmp4(kun)=ana_temp(ji,jj,kun,1) 
    268               ENDDO 
     296               DO jc = 1,2 
     297                  kun = kun + 1 
     298                  ztmp4(kun)=ana_temp(ji,jj,kun,1) 
     299               ENDDO 
    269300            ENDDO 
    270301 
     
    273304            ! Fill output array 
    274305            DO jh = 1, nb_ana 
    275               ana_amp(ji,jj,jh,1)=tmp7((jh-1)*2+1) 
    276               ana_amp(ji,jj,jh,2)=tmp7((jh-1)*2+2) 
     306               ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1) 
     307               ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2) 
    277308            END DO 
    278           END DO 
    279         END DO 
    280  
    281         ALLOCATE(out_eta(jpi,jpj,2*nb_ana)) 
    282         ALLOCATE(out_u  (jpi,jpj,2*nb_ana)) 
    283         ALLOCATE(out_v  (jpi,jpj,2*nb_ana)) 
    284  
    285  
    286         DO jj = 1, jpj 
    287           DO ji = 1, jpi 
     309         END DO 
     310      END DO 
     311 
     312      ALLOCATE(out_eta(jpi,jpj,2*nb_ana)) 
     313      ALLOCATE(out_u  (jpi,jpj,2*nb_ana)) 
     314      ALLOCATE(out_v  (jpi,jpj,2*nb_ana)) 
     315 
     316      DO jj = 1, jpj 
     317         DO ji = 1, jpi 
    288318            DO jh = 1, nb_ana  
    289                 X1=ana_amp(ji,jj,jh,1) 
    290                 X2=-ana_amp(ji,jj,jh,2) 
    291                 out_eta(ji,jj,jh)=X1 * tmask(ji,jj,1) 
    292                 out_eta(ji,jj,nb_ana+jh)=X2 * tmask(ji,jj,1) 
     319               X1=ana_amp(ji,jj,jh,1) 
     320               X2=-ana_amp(ji,jj,jh,2) 
     321               out_eta(ji,jj,jh)=X1 * tmask(ji,jj,1) 
     322               out_eta(ji,jj,nb_ana+jh)=X2 * tmask(ji,jj,1) 
    293323            ENDDO 
    294           ENDDO 
    295         ENDDO 
    296  
    297         ! ubar: 
    298         DO jj = 1, jpj 
    299           DO ji = 1, jpi 
     324         ENDDO 
     325      ENDDO 
     326 
     327      ! ubar: 
     328      DO jj = 1, jpj 
     329         DO ji = 1, jpi 
    300330            ! Fill input array 
    301331            kun=0 
    302332            DO jh = 1,nb_ana 
    303               DO jc = 1,2 
    304                 kun = kun + 1 
    305                 tmp4(kun)=ana_temp(ji,jj,kun,2) 
    306               ENDDO 
     333               DO jc = 1,2 
     334                  kun = kun + 1 
     335                  ztmp4(kun)=ana_temp(ji,jj,kun,2) 
     336               ENDDO 
    307337            ENDDO 
    308338 
     
    311341            ! Fill output array 
    312342            DO jh = 1, nb_ana 
    313               ana_amp(ji,jj,jh,1)=tmp7((jh-1)*2+1) 
    314               ana_amp(ji,jj,jh,2)=tmp7((jh-1)*2+2) 
     343               ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1) 
     344               ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2) 
    315345            END DO 
    316346 
    317           END DO 
    318         END DO 
    319  
    320         DO jj = 1, jpj 
    321           DO ji = 1, jpi 
     347         END DO 
     348      END DO 
     349 
     350      DO jj = 1, jpj 
     351         DO ji = 1, jpi 
    322352            DO jh = 1, nb_ana  
    323                 X1=ana_amp(ji,jj,jh,1) 
    324                 X2=-ana_amp(ji,jj,jh,2) 
    325                  out_u(ji,jj,jh) = X1 * umask(ji,jj,1) 
    326                  out_u (ji,jj,nb_ana+jh) = X2 * umask(ji,jj,1) 
     353               X1=ana_amp(ji,jj,jh,1) 
     354               X2=-ana_amp(ji,jj,jh,2) 
     355               out_u(ji,jj,jh) = X1 * umask(ji,jj,1) 
     356               out_u (ji,jj,nb_ana+jh) = X2 * umask(ji,jj,1) 
    327357            ENDDO 
    328           ENDDO 
    329         ENDDO 
    330  
    331         ! vbar: 
    332         DO jj = 1, jpj 
    333           DO ji = 1, jpi 
    334               ! Fill input array 
    335               kun=0 
    336               DO jh = 1,nb_ana 
    337                 DO jc = 1,2 
     358         ENDDO 
     359      ENDDO 
     360 
     361      ! vbar: 
     362      DO jj = 1, jpj 
     363         DO ji = 1, jpi 
     364            ! Fill input array 
     365            kun=0 
     366            DO jh = 1,nb_ana 
     367               DO jc = 1,2 
    338368                  kun = kun + 1 
    339                   tmp4(kun)=ana_temp(ji,jj,kun,3) 
    340                 ENDDO 
    341               ENDDO 
    342  
    343               CALL SUR_DETERMINE(jj+1) 
    344  
    345               ! Fill output array 
    346               DO jh = 1, nb_ana 
    347                 ana_amp(ji,jj,jh,1)=tmp7((jh-1)*2+1) 
    348                 ana_amp(ji,jj,jh,2)=tmp7((jh-1)*2+2) 
    349               END DO 
    350  
    351           END DO 
    352         END DO 
    353  
    354         DO jj = 1, jpj 
    355           DO ji = 1, jpi 
     369                  ztmp4(kun)=ana_temp(ji,jj,kun,3) 
     370               ENDDO 
     371            ENDDO 
     372 
     373            CALL SUR_DETERMINE(jj+1) 
     374 
     375            ! Fill output array 
     376            DO jh = 1, nb_ana 
     377               ana_amp(ji,jj,jh,1)=ztmp7((jh-1)*2+1) 
     378               ana_amp(ji,jj,jh,2)=ztmp7((jh-1)*2+2) 
     379            END DO 
     380 
     381         END DO 
     382      END DO 
     383 
     384      DO jj = 1, jpj 
     385         DO ji = 1, jpi 
    356386            DO jh = 1, nb_ana  
    357                 X1=ana_amp(ji,jj,jh,1) 
    358                 X2=-ana_amp(ji,jj,jh,2) 
    359                  out_v(ji,jj,jh)=X1 * vmask(ji,jj,1) 
    360                  out_v(ji,jj,nb_ana+jh)=X2 * vmask(ji,jj,1) 
     387               X1=ana_amp(ji,jj,jh,1) 
     388               X2=-ana_amp(ji,jj,jh,2) 
     389               out_v(ji,jj,jh)=X1 * vmask(ji,jj,1) 
     390               out_v(ji,jj,nb_ana+jh)=X2 * vmask(ji,jj,1) 
    361391            ENDDO 
    362           ENDDO 
    363         ENDDO 
    364  
    365         CALL dia_wri_harm ! Write results in files 
    366  
    367   END SUBROUTINE dia_harm_end 
    368  
    369   SUBROUTINE dia_wri_harm 
     392         ENDDO 
     393      ENDDO 
     394 
     395      CALL dia_wri_harm ! Write results in files 
     396      CALL wrk_dealloc( jpi , jpj , jpmax_harmo , 2 , ana_amp ) 
     397      ! 
     398   END SUBROUTINE dia_harm_end 
     399 
     400   SUBROUTINE dia_wri_harm 
    370401      !!-------------------------------------------------------------------- 
    371402      !!                 ***  ROUTINE dia_wri_harm  *** 
     
    382413      CHARACTER(LEN=lc) :: cltext 
    383414      CHARACTER(LEN=lc) ::   & 
    384          cdfile_name_T    ,   & ! name of the file created (T-points) 
    385          cdfile_name_U    ,   & ! name of the file created (U-points) 
    386          cdfile_name_V          ! name of the file created (V-points) 
    387       INTEGER  ::   jh        
     415         cdfile_name_T   ,   & ! name of the file created (T-points) 
     416         cdfile_name_U   ,   & ! name of the file created (U-points) 
     417         cdfile_name_V         ! name of the file created (V-points) 
     418      INTEGER  ::   jh 
    388419      !!---------------------------------------------------------------------- 
    389420 
     
    395426 
    396427      IF(lwp) WRITE(numout,*) '  ' 
    397       IF(lwp) WRITE(numout,*) 'dia_wri_harm : Write harmonic analysis results'  
     428      IF(lwp) WRITE(numout,*) 'dia_wri_harm : Write harmonic analysis results' 
    398429#if defined key_dimgout 
    399430      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~  Output files: ', TRIM(cdfile_name_T) 
     
    442473#endif 
    443474 
    444   END SUBROUTINE dia_wri_harm 
     475   END SUBROUTINE dia_wri_harm 
     476 
     477   SUBROUTINE SUR_DETERMINE(init) 
     478   !!--------------------------------------------------------------------------------- 
     479   !!                      *** ROUTINE SUR_DETERMINE *** 
     480   !!     
     481   !!     
     482   !!        
     483   !!--------------------------------------------------------------------------------- 
     484   INTEGER, INTENT(in) :: init  
     485                
     486   INTEGER                         :: ji_sd, jj_sd, ji1_sd, ji2_sd, jk1_sd, jk2_sd 
     487   REAL(wp)                        :: zval1, zval2, zx1 
     488   REAL(wp), POINTER, DIMENSION(:) :: ztmpx, zcol1, zcol2 
     489   INTEGER , POINTER, DIMENSION(:) :: ipos2, ipivot 
     490   !--------------------------------------------------------------------------------- 
     491   CALL wrk_alloc( jpincomax , ztmpx , zcol1 , zcol2 ) 
     492   CALL wrk_alloc( jpincomax , ipos2 , ipivot        ) 
     493             
     494   IF( init==1 )THEN 
     495 
     496      IF( nsparse .GT. jpdimsparse ) & 
     497         CALL ctl_stop( 'STOP', 'SUR_DETERMINE : nsparse .GT. jpdimsparse') 
     498 
     499      IF( ninco .GT. jpincomax ) & 
     500         CALL ctl_stop( 'STOP', 'SUR_DETERMINE : ninco .GT. jpincomax') 
     501 
     502      ztmp3(:,:)=0.e0 
     503 
     504      DO jk1_sd = 1, nsparse 
     505         DO jk2_sd = 1, nsparse 
     506 
     507            nisparse(jk2_sd)=nisparse(jk2_sd) 
     508            njsparse(jk2_sd)=njsparse(jk2_sd) 
     509 
     510            IF( nisparse(jk2_sd) == nisparse(jk1_sd) ) THEN 
     511               ztmp3(njsparse(jk1_sd),njsparse(jk2_sd)) = ztmp3(njsparse(jk1_sd),njsparse(jk2_sd))  & 
     512                                                        + valuesparse(jk1_sd)*valuesparse(jk2_sd) 
     513            ENDIF 
     514 
     515         ENDDO 
     516      ENDDO 
     517 
     518      DO jj_sd = 1 ,ninco 
     519          ipos1(jj_sd) = jj_sd 
     520          ipos2(jj_sd) = jj_sd 
     521      ENDDO 
     522 
     523      DO ji_sd = 1 , ninco 
     524 
     525         !find greatest non-zero pivot: 
     526         zval1 = ABS(ztmp3(ji_sd,ji_sd)) 
     527 
     528         ipivot(ji_sd) = ji_sd 
     529         DO jj_sd = ji_sd, ninco 
     530            zval2 = ABS(ztmp3(ji_sd,jj_sd)) 
     531            IF( zval2.GE.zval1 )THEN 
     532               ipivot(ji_sd) = jj_sd 
     533               zval1         = zval2 
     534            ENDIF 
     535         ENDDO 
     536 
     537         DO ji1_sd = 1, ninco 
     538            zcol1(ji1_sd)               = ztmp3(ji1_sd,ji_sd) 
     539            zcol2(ji1_sd)               = ztmp3(ji1_sd,ipivot(ji_sd)) 
     540            ztmp3(ji1_sd,ji_sd)         = zcol2(ji1_sd) 
     541            ztmp3(ji1_sd,ipivot(ji_sd)) = zcol1(ji1_sd) 
     542         ENDDO 
     543 
     544         ipos2(ji_sd)         = ipos1(ipivot(ji_sd)) 
     545         ipos2(ipivot(ji_sd)) = ipos1(ji_sd) 
     546         ipos1(ji_sd)         = ipos2(ji_sd) 
     547         ipos1(ipivot(ji_sd)) = ipos2(ipivot(ji_sd)) 
     548         zpivot(ji_sd)        = ztmp3(ji_sd,ji_sd) 
     549         DO jj_sd = 1, ninco 
     550            ztmp3(ji_sd,jj_sd) = ztmp3(ji_sd,jj_sd) / zpivot(ji_sd) 
     551         ENDDO 
     552 
     553         DO ji2_sd = ji_sd+1, ninco 
     554            zpilier(ji2_sd,ji_sd)=ztmp3(ji2_sd,ji_sd) 
     555            DO jj_sd=1,ninco 
     556               ztmp3(ji2_sd,jj_sd)=  ztmp3(ji2_sd,jj_sd) - ztmp3(ji_sd,jj_sd) * zpilier(ji2_sd,ji_sd) 
     557            ENDDO 
     558         ENDDO 
     559 
     560      ENDDO 
     561 
     562   ENDIF ! End init==1 
     563 
     564   DO ji_sd = 1, ninco 
     565      ztmp4(ji_sd) = ztmp4(ji_sd) / zpivot(ji_sd) 
     566      DO ji2_sd = ji_sd+1, ninco 
     567         ztmp4(ji2_sd) = ztmp4(ji2_sd) - ztmp4(ji_sd) * zpilier(ji2_sd,ji_sd) 
     568      ENDDO 
     569   ENDDO 
     570 
     571   !system solving:  
     572   ztmpx(ninco) = ztmp4(ninco) / ztmp3(ninco,ninco) 
     573   ji_sd = ninco 
     574   DO ji_sd = ninco-1, 1, -1 
     575      zx1=0. 
     576      DO jj_sd = ji_sd+1, ninco 
     577         zx1 = zx1 + ztmpx(jj_sd) * ztmp3(ji_sd,jj_sd) 
     578      ENDDO 
     579      ztmpx(ji_sd) = ztmp4(ji_sd)-zx1 
     580   ENDDO 
     581 
     582   DO jj_sd =1, ninco 
     583      ztmp7(ipos1(jj_sd))=ztmpx(jj_sd) 
     584   ENDDO 
     585 
     586 
     587   CALL wrk_dealloc( jpincomax , ztmpx , zcol1 , zcol2 ) 
     588   CALL wrk_dealloc( jpincomax , ipos2 , ipivot        ) 
     589 
     590  END SUBROUTINE SUR_DETERMINE 
     591 
    445592 
    446593#else 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diahsb.F90

    r2528 r3294  
    1818   USE lib_mpp         ! distributed memory computing library 
    1919   USE trabbc          ! bottom boundary condition 
     20   USE obc_par         ! (for lk_obc) 
    2021   USE bdy_par         ! (for lk_bdy) 
    21    USE obc_par         ! (for lk_obc) 
     22   USE timing          ! preformance summary 
    2223 
    2324   IMPLICIT NONE 
     
    7273      REAL(dp)   ::   z_frc_trd_v                 !    -     - 
    7374      !!--------------------------------------------------------------------------- 
     75      IF( nn_timing == 1 )   CALL timing_start('dia_hsb') 
    7476 
    7577      ! ------------------------- ! 
     
    107109         ! heat content variation 
    108110         zdiff_hc = zdiff_hc + SUM( surf(:,:) * tmask(:,:,jk)          & 
    109             &                       * ( fse3t_n(:,:,jk) * tn(:,:,jk)   & 
     111            &                       * ( fse3t_n(:,:,jk) * tsn(:,:,jk,jp_tem)   & 
    110112            &                           - hc_loc_ini(:,:,jk) ) ) 
    111113         ! salt content variation 
    112114         zdiff_sc = zdiff_sc + SUM( surf(:,:) * tmask(:,:,jk)          & 
    113             &                       * ( fse3t_n(:,:,jk) * sn(:,:,jk)   & 
     115            &                       * ( fse3t_n(:,:,jk) * tsn(:,:,jk,jp_sal)   & 
    114116            &                           - sc_loc_ini(:,:,jk) ) ) 
    115117      ENDDO 
     
    139141      IF ( kt == nitend ) CLOSE( numhsb ) 
    140142 
     143      IF( nn_timing == 1 )   CALL timing_stop('dia_hsb') 
     144 
    1411459020  FORMAT(I5,11D15.7) 
    142146      ! 
     
    205209      WRITE(numout,*) "dia_hsb: heat salt volume budgets activated" 
    206210      WRITE(numout,*) "~~~~~~~  output written in the 'heat_salt_volume_budgets.txt' ASCII file" 
    207       IF( lk_obc .OR. lk_bdy) THEN 
     211      IF( lk_obc .or. lk_bdy ) THEN 
    208212         CALL ctl_warn( 'dia_hsb does not take open boundary fluxes into account' )          
    209213      ENDIF 
     
    248252      ! 4 - initial conservation variables ! 
    249253      ! ---------------------------------- ! 
    250       ssh_ini(:,:) = sshn(:,:)                               ! initial ssh 
     254      ssh_ini(:,:) = sshn(:,:)                                       ! initial ssh 
    251255      DO jk = 1, jpk 
    252          e3t_ini   (:,:,jk) = fse3t_n(:,:,jk)                ! initial vertical scale factors 
    253          hc_loc_ini(:,:,jk) = tn(:,:,jk) * fse3t_n(:,:,jk)   ! initial heat content 
    254          sc_loc_ini(:,:,jk) = sn(:,:,jk) * fse3t_n(:,:,jk)   ! initial salt content 
     256         e3t_ini   (:,:,jk) = fse3t_n(:,:,jk)                        ! initial vertical scale factors 
     257         hc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_tem) * fse3t_n(:,:,jk)   ! initial heat content 
     258         sc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_sal) * fse3t_n(:,:,jk)   ! initial salt content 
    255259      END DO 
    256260      frc_v = 0.d0                                           ! volume       trend due to forcing 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diahth.F90

    r2715 r3294  
    2323   USE lib_mpp         ! MPP library 
    2424   USE iom             ! I/O library 
     25   USE timing          ! preformance summary 
    2526 
    2627   IMPLICIT NONE 
     
    103104      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zdelr      ! delta rho equivalent to deltaT = 0.2 
    104105      !!---------------------------------------------------------------------- 
     106      IF( nn_timing == 1 )   CALL timing_start('dia_hth') 
    105107 
    106108      IF( kt == nit000 ) THEN 
     
    160162         DO ji = 1, jpi 
    161163            IF( tmask(ji,jj,nla10) == 1. ) THEN 
    162                zu  =  1779.50 + 11.250*tn(ji,jj,nla10) - 3.80*sn(ji,jj,nla10) - 0.0745*tn(ji,jj,nla10)*tn(ji,jj,nla10)   & 
    163                   &                                                           - 0.0100*tn(ji,jj,nla10)*sn(ji,jj,nla10) 
    164                zv  =  5891.00 + 38.000*tn(ji,jj,nla10) + 3.00*sn(ji,jj,nla10) - 0.3750*tn(ji,jj,nla10)*tn(ji,jj,nla10) 
    165                zut =    11.25 -  0.149*tn(ji,jj,nla10) - 0.01*sn(ji,jj,nla10) 
    166                zvt =    38.00 -  0.750*tn(ji,jj,nla10) 
     164               zu  =  1779.50 + 11.250 * tsn(ji,jj,nla10,jp_tem) - 3.80   * tsn(ji,jj,nla10,jp_sal)                             & 
     165                  &                                              - 0.0745 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_tem)   & 
     166                  &                                              - 0.0100 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_sal) 
     167               zv  =  5891.00 + 38.000 * tsn(ji,jj,nla10,jp_tem) + 3.00   * tsn(ji,jj,nla10,jp_sal)                             & 
     168                  &                                              - 0.3750 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_tem) 
     169               zut =    11.25 -  0.149 * tsn(ji,jj,nla10,jp_tem) - 0.01   * tsn(ji,jj,nla10,jp_sal) 
     170               zvt =    38.00 -  0.750 * tsn(ji,jj,nla10,jp_tem) 
    167171               zw  = (zu + 0.698*zv) * (zu + 0.698*zv) 
    168172               zdelr(ji,jj) = ztem2 * (1000.*(zut*zv - zvt*zu)/zw) 
     
    184188               ! 
    185189               zzdep = fsdepw(ji,jj,jk) 
    186                zztmp = ( tn(ji,jj,jk-1) - tn(ji,jj,jk) ) / zzdep * tmask(ji,jj,jk)   ! vertical gradient of temperature (dT/dz) 
     190               zztmp = ( tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) ) / zzdep * tmask(ji,jj,jk)   ! vertical gradient of temperature (dT/dz) 
    187191               zzdep = zzdep * tmask(ji,jj,1) 
    188192 
     
    221225               zzdep = fsdepw(ji,jj,jk) * tmask(ji,jj,1) 
    222226               ! 
    223                zztmp = tn(ji,jj,nla10) - tn(ji,jj,jk)                  ! - delta T(10m) 
     227               zztmp = tsn(ji,jj,nla10,jp_tem) - tsn(ji,jj,jk,jp_tem)  ! - delta T(10m) 
    224228               IF( ABS(zztmp) > ztem2 )      zabs2   (ji,jj) = zzdep   ! abs > 0.2 
    225229               IF(     zztmp  > ztem2 )      ztm2    (ji,jj) = zzdep   ! > 0.2 
     
    254258         DO jj = 1, jpj 
    255259            DO ji = 1, jpi 
    256                zztmp = tn(ji,jj,jk) 
     260               zztmp = tsn(ji,jj,jk,jp_tem) 
    257261               IF( zztmp >= 20. )   ik20(ji,jj) = jk 
    258262               IF( zztmp >= 28. )   ik28(ji,jj) = jk 
     
    273277               zztmp =      fsdept(ji,jj,iid  )   &                     ! linear interpolation 
    274278                  &  + (    fsdept(ji,jj,iid+1) - fsdept(ji,jj,iid)                       )   & 
    275                   &  * ( 20.*tmask(ji,jj,iid+1) -     tn(ji,jj,iid)                       )   & 
    276                   &  / (        tn(ji,jj,iid+1) -     tn(ji,jj,iid) + (1.-tmask(ji,jj,1)) ) 
     279                  &  * ( 20.*tmask(ji,jj,iid+1) - tsn(ji,jj,iid,jp_tem)                       )   & 
     280                  &  / ( tsn(ji,jj,iid+1,jp_tem) - tsn(ji,jj,iid,jp_tem) + (1.-tmask(ji,jj,1)) ) 
    277281               hd20(ji,jj) = MIN( zztmp , zzdep) * tmask(ji,jj,1)       ! bound by the ocean depth 
    278282            ELSE  
     
    284288               zztmp =      fsdept(ji,jj,iid  )   &                     ! linear interpolation 
    285289                  &  + (    fsdept(ji,jj,iid+1) - fsdept(ji,jj,iid)                       )   & 
    286                   &  * ( 28.*tmask(ji,jj,iid+1) -     tn(ji,jj,iid)                       )   & 
    287                   &  / (        tn(ji,jj,iid+1) -     tn(ji,jj,iid) + (1.-tmask(ji,jj,1)) ) 
     290                  &  * ( 28.*tmask(ji,jj,iid+1) -    tsn(ji,jj,iid,jp_tem)                       )   & 
     291                  &  / (  tsn(ji,jj,iid+1,jp_tem) -    tsn(ji,jj,iid,jp_tem) + (1.-tmask(ji,jj,1)) ) 
    288292               hd28(ji,jj) = MIN( zztmp , zzdep ) * tmask(ji,jj,1)      ! bound by the ocean depth 
    289293            ELSE  
     
    309313      ! surface boundary condition 
    310314      IF( lk_vvl ) THEN   ;   zthick(:,:) = 0._wp       ;   htc3(:,:) = 0._wp                                    
    311       ELSE                ;   zthick(:,:) = sshn(:,:)   ;   htc3(:,:) = tn(:,:,jk) * sshn(:,:) * tmask(:,:,jk)    
     315      ELSE                ;   zthick(:,:) = sshn(:,:)   ;   htc3(:,:) = tsn(:,:,jk,jp_tem) * sshn(:,:) * tmask(:,:,jk)    
    312316      ENDIF 
    313317      ! integration down to ilevel 
    314318      DO jk = 1, ilevel 
    315319         zthick(:,:) = zthick(:,:) + fse3t(:,:,jk) 
    316          htc3  (:,:) = htc3  (:,:) + fse3t(:,:,jk) * tn(:,:,jk) * tmask(:,:,jk) 
     320         htc3  (:,:) = htc3  (:,:) + fse3t(:,:,jk) * tsn(:,:,jk,jp_tem) * tmask(:,:,jk) 
    317321      END DO 
    318322      ! deepest layer 
     
    320324      DO jj = 1, jpj 
    321325         DO ji = 1, jpi 
    322             htc3(ji,jj) = htc3(ji,jj) + tn(ji,jj,ilevel+1) * MIN( fse3t(ji,jj,ilevel+1), zthick(ji,jj) ) * tmask(ji,jj,ilevel+1) 
     326            htc3(ji,jj) = htc3(ji,jj) + tsn(ji,jj,ilevel+1,jp_tem) * MIN( fse3t(ji,jj,ilevel+1), zthick(ji,jj) )  & 
     327                                                                   * tmask(ji,jj,ilevel+1) 
     328            htc3(ji,jj) = htc3(ji,jj) + tsn(ji,jj,ilevel+1,jp_tem) * MIN( fse3t(ji,jj,ilevel+1), zthick(ji,jj) )   & 
     329               &                                                   * tmask(ji,jj,ilevel+1) 
    323330         END DO 
    324331      END DO 
     
    327334      htc3(:,:) = zcoef * htc3(:,:) 
    328335      CALL iom_put( "hc300", htc3 )      ! first 300m heat content 
     336      ! 
     337      IF( nn_timing == 1 )   CALL timing_stop('dia_hth') 
    329338      ! 
    330339   END SUBROUTINE dia_hth 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diaptr.F90

    r2715 r3294  
    2929   USE lib_mpp          ! MPP library 
    3030   USE lbclnk           ! lateral boundary condition - processor exchanges 
     31   USE timing           ! preformance summary 
     32   USE wrk_nemo         ! working arrays 
    3133 
    3234   IMPLICIT NONE 
     
    9597      !!---------------------------------------------------------------------- 
    9698      INTEGER               ::   dia_ptr_alloc   ! return value 
    97       INTEGER, DIMENSION(5) ::   ierr 
     99      INTEGER, DIMENSION(6) ::   ierr 
    98100      !!---------------------------------------------------------------------- 
    99101      ierr(:) = 0 
     
    121123         &     ndex_h_ind_30(jpj),   ndex_h_ipc_30(jpj), Stat=ierr(5) ) 
    122124         ! 
     125     ALLOCATE( btm30(jpi,jpj) , STAT=ierr(6)  ) 
     126         ! 
    123127      dia_ptr_alloc = MAXVAL( ierr ) 
    124128      IF(lk_mpp)   CALL mpp_sum( dia_ptr_alloc ) 
     
    209213      !! ** Action  : - p_fval: i-mean poleward flux of pva 
    210214      !!---------------------------------------------------------------------- 
    211 #if defined key_mpp_mpi 
    212       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    213       USE wrk_nemo, ONLY:   zwork => wrk_1d_1 
    214 #endif 
    215215      !! 
    216216      IMPLICIT none 
     
    225225      INTEGER               ::   ijpjjpk 
    226226#endif 
     227#if defined key_mpp_mpi 
     228      REAL(wp), POINTER, DIMENSION(:) ::   zwork    ! mask flux array at V-point 
     229#endif 
    227230      !!-------------------------------------------------------------------- 
    228231      ! 
    229232#if defined key_mpp_mpi 
    230       IF( wrk_in_use(1, 1) ) THEN 
    231          CALL ctl_stop('ptr_vjk: ERROR - requested workspace array is unavailable')   ;   RETURN 
    232       END IF 
     233      ijpjjpk = jpj*jpk 
     234      CALL wrk_alloc( jpj*jpk, zwork ) 
    233235#endif 
    234236 
     
    257259      ! 
    258260#if defined key_mpp_mpi 
    259       ijpjjpk = jpj*jpk 
    260261      ish(1) = ijpjjpk  ;   ish2(1) = jpj   ;   ish2(2) = jpk 
    261262      zwork(1:ijpjjpk) = RESHAPE( p_fval, ish ) 
     
    265266      ! 
    266267#if defined key_mpp_mpi 
    267       IF( wrk_not_released(1, 1) )   CALL ctl_stop('ptr_vjk: ERROR - failed to release workspace array') 
     268      CALL wrk_dealloc( jpj*jpk, zwork ) 
    268269#endif 
    269270      ! 
     
    281282      !! ** Action  : - p_fval: i-sum of e1t*e3t*pta 
    282283      !!---------------------------------------------------------------------- 
    283 #if defined key_mpp_mpi 
    284       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    285       USE wrk_nemo, ONLY:   zwork => wrk_1d_1 
    286 #endif 
    287284      !! 
    288285      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pta    ! tracer flux array at T-point 
     
    296293      INTEGER               ::   ijpjjpk 
    297294#endif 
     295#if defined key_mpp_mpi 
     296      REAL(wp), POINTER, DIMENSION(:) ::   zwork    ! mask flux array at V-point 
     297#endif 
    298298      !!--------------------------------------------------------------------  
    299299      ! 
    300300#if defined key_mpp_mpi 
    301       IF( wrk_in_use(1, 1) ) THEN 
    302          CALL ctl_stop('ptr_tjk: requested workspace array unavailable')   ;   RETURN 
    303       ENDIF 
     301      ijpjjpk = jpj*jpk 
     302      CALL wrk_alloc( jpj*jpk, zwork ) 
    304303#endif 
    305304 
     
    315314      END DO 
    316315#if defined key_mpp_mpi 
    317       ijpjjpk = jpj*jpk 
    318316      ish(1) = jpj*jpk   ;   ish2(1) = jpj   ;   ish2(2) = jpk 
    319317      zwork(1:ijpjjpk)= RESHAPE( p_fval, ish ) 
     
    323321      ! 
    324322#if defined key_mpp_mpi 
    325       IF( wrk_not_released(1, 1) )   CALL ctl_stop('ptr_tjk: failed to release workspace array') 
     323      CALL wrk_dealloc( jpj*jpk, zwork ) 
    326324#endif 
    327325      !     
     
    343341      !!---------------------------------------------------------------------- 
    344342      ! 
     343      IF( nn_timing == 1 )   CALL timing_start('dia_ptr') 
     344      ! 
    345345      IF( kt == nit000 .OR. MOD( kt, nn_fptr ) == 0 )   THEN 
    346346         ! 
     
    349349            IF( ln_diaznl ) THEN               ! i-mean temperature and salinity 
    350350               DO jn = 1, nptr 
    351                   tn_jk(:,:,jn) = ptr_tjk( tn(:,:,:), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
     351                  tn_jk(:,:,jn) = ptr_tjk( tsn(:,:,:,jp_tem), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
    352352               END DO 
    353353            ENDIF 
     
    368368            ! 
    369369            !                          ! Transports 
    370             !                                ! local heat & salt transports at T-points  ( tn*mj[vn+v_eiv] ) 
     370            !                                ! local heat & salt transports at T-points  ( tsn*mj[vn+v_eiv] ) 
    371371            vt(:,:,jpk) = 0._wp   ;   vs(:,:,jpk) = 0._wp 
    372372            DO jk= 1, jpkm1 
     
    378378                     zv = ( vn(ji,jj,jk) + vn(ji,jj-1,jk) ) * 0.5_wp 
    379379#endif  
    380                      vt(:,jj,jk) = zv * tn(:,jj,jk) 
    381                      vs(:,jj,jk) = zv * sn(:,jj,jk) 
     380                     vt(:,jj,jk) = zv * tsn(:,jj,jk,jp_tem) 
     381                     vs(:,jj,jk) = zv * tsn(:,jj,jk,jp_sal) 
    382382                  END DO 
    383383               END DO 
     
    430430      ENDIF 
    431431      ! 
    432       IF( kt == nitend )   CALL histclo( numptr )      ! Close the file 
     432#if defined key_mpp_mpi 
     433      IF( kt == nitend .AND. l_znl_root )   CALL histclo( numptr )      ! Close the file 
     434#else 
     435      IF( kt == nitend )                    CALL histclo( numptr )      ! Close the file 
     436#endif 
     437      ! 
     438      IF( nn_timing == 1 )   CALL timing_stop('dia_ptr') 
    433439      ! 
    434440   END SUBROUTINE dia_ptr 
     
    449455      NAMELIST/namptr/ ln_diaptr, ln_diaznl, ln_subbas, ln_ptrcomp, nn_fptr, nn_fwri 
    450456      !!---------------------------------------------------------------------- 
    451  
    452       !                                      ! allocate dia_ptr arrays 
    453       IF( dia_ptr_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'lim_sbc_init : unable to allocate arrays' ) 
     457      IF( nn_timing == 1 )   CALL timing_start('dia_ptr_init') 
    454458 
    455459      REWIND( numnam )                 ! Read Namelist namptr : poleward transport parameters 
     
    468472         WRITE(numout,*) '      Frequency of outputs                               nn_fwri    = ', nn_fwri 
    469473      ENDIF 
    470  
    471       IF( ln_subbas ) THEN   ;   nptr = 5       ! Global, Atlantic, Pacific, Indian, Indo-Pacific 
    472       ELSE                   ;   nptr = 1       ! Global only 
    473       ENDIF 
    474  
    475       rc_pwatt = rc_pwatt * rau0 * rcp          ! conversion from K.s-1 to PetaWatt 
    476  
    477       IF( .NOT. ln_diaptr ) THEN       ! diaptr not used 
    478         RETURN 
    479       ENDIF 
    480474       
    481       IF( lk_mpp )   CALL mpp_ini_znl( numout )     ! Define MPI communicator for zonal sum 
    482  
    483       IF( ln_subbas ) THEN                ! load sub-basin mask 
    484          CALL iom_open( 'subbasins', inum ) 
    485          CALL iom_get( inum, jpdom_data, 'atlmsk', btmsk(:,:,2) )   ! Atlantic basin 
    486          CALL iom_get( inum, jpdom_data, 'pacmsk', btmsk(:,:,3) )   ! Pacific  basin 
    487          CALL iom_get( inum, jpdom_data, 'indmsk', btmsk(:,:,4) )   ! Indian   basin 
    488          CALL iom_close( inum ) 
    489          btmsk(:,:,5) = MAX ( btmsk(:,:,3), btmsk(:,:,4) )          ! Indo-Pacific basin 
    490          WHERE( gphit(:,:) < -30._wp)   ;   btm30(:,:) = 0._wp      ! mask out Southern Ocean 
    491          ELSE WHERE                     ;   btm30(:,:) = tmask(:,:,1) 
    492          END WHERE 
    493       ENDIF 
    494       btmsk(:,:,1) = tmask_i(:,:)                                   ! global ocean 
     475      IF( ln_diaptr) THEN   
    495476       
    496       DO jn = 1, nptr 
    497          btmsk(:,:,jn) = btmsk(:,:,jn) * tmask_i(:,:)               ! interior domain only 
    498       END DO 
     477         IF( ln_subbas ) THEN   ;   nptr = 5       ! Global, Atlantic, Pacific, Indian, Indo-Pacific 
     478         ELSE                   ;   nptr = 1       ! Global only 
     479         ENDIF 
     480 
     481         !                                      ! allocate dia_ptr arrays 
     482         IF( dia_ptr_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_ptr_init : unable to allocate arrays' ) 
     483 
     484         rc_pwatt = rc_pwatt * rau0 * rcp          ! conversion from K.s-1 to PetaWatt 
     485 
     486         IF( lk_mpp )   CALL mpp_ini_znl( numout )     ! Define MPI communicator for zonal sum 
     487 
     488         IF( ln_subbas ) THEN                ! load sub-basin mask 
     489            CALL iom_open( 'subbasins', inum ) 
     490            CALL iom_get( inum, jpdom_data, 'atlmsk', btmsk(:,:,2) )   ! Atlantic basin 
     491            CALL iom_get( inum, jpdom_data, 'pacmsk', btmsk(:,:,3) )   ! Pacific  basin 
     492            CALL iom_get( inum, jpdom_data, 'indmsk', btmsk(:,:,4) )   ! Indian   basin 
     493            CALL iom_close( inum ) 
     494            btmsk(:,:,5) = MAX ( btmsk(:,:,3), btmsk(:,:,4) )          ! Indo-Pacific basin 
     495            WHERE( gphit(:,:) < -30._wp)   ;   btm30(:,:) = 0._wp      ! mask out Southern Ocean 
     496            ELSE WHERE                     ;   btm30(:,:) = tmask(:,:,1) 
     497            END WHERE 
     498         ENDIF 
     499         btmsk(:,:,1) = tmask_i(:,:)                                   ! global ocean 
    499500       
    500       IF( lk_vvl )   CALL ctl_stop( 'diaptr: error in vvl case as constant i-mean surface is used' ) 
    501  
    502       !                                   ! i-sum of e1v*e3v surface and its inverse 
    503       DO jn = 1, nptr 
    504          sjk(:,:,jn) = ptr_tjk( tmask(:,:,:), btmsk(:,:,jn) ) 
    505          r1_sjk(:,:,jn) = 0._wp 
    506          WHERE( sjk(:,:,jn) /= 0._wp )   r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn) 
    507       END DO 
     501         DO jn = 1, nptr 
     502            btmsk(:,:,jn) = btmsk(:,:,jn) * tmask_i(:,:)               ! interior domain only 
     503         END DO 
     504       
     505         IF( lk_vvl )   CALL ctl_stop( 'diaptr: error in vvl case as constant i-mean surface is used' ) 
     506 
     507         !                                   ! i-sum of e1v*e3v surface and its inverse 
     508         DO jn = 1, nptr 
     509            sjk(:,:,jn) = ptr_tjk( tmask(:,:,:), btmsk(:,:,jn) ) 
     510            r1_sjk(:,:,jn) = 0._wp 
     511            WHERE( sjk(:,:,jn) /= 0._wp )   r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn) 
     512         END DO 
     513 
     514      ! Initialise arrays to zero because diatpr is called before they are first calculated 
     515      ! Note that this means diagnostics will not be exactly correct when model run is restarted. 
     516      htr_adv(:) = 0._wp ; str_adv(:) =  0._wp ;  htr_ldf(:) = 0._wp ; str_ldf(:) =  0._wp 
    508517 
    509518#if defined key_mpp_mpi  
    510       iglo (1) = jpjglo                   ! MPP case using MPI  ('key_mpp_mpi') 
    511       iloc (1) = nlcj 
    512       iabsf(1) = njmppt(narea) 
    513       iabsl(:) = iabsf(:) + iloc(:) - 1 
    514       ihals(1) = nldj - 1 
    515       ihale(1) = nlcj - nlej 
    516       idid (1) = 2 
    517       CALL flio_dom_set( jpnj, nproc/jpni, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom_ptr ) 
     519         iglo (1) = jpjglo                   ! MPP case using MPI  ('key_mpp_mpi') 
     520         iloc (1) = nlcj 
     521         iabsf(1) = njmppt(narea) 
     522         iabsl(:) = iabsf(:) + iloc(:) - 1 
     523         ihals(1) = nldj - 1 
     524         ihale(1) = nlcj - nlej 
     525         idid (1) = 2 
     526         CALL flio_dom_set( jpnj, nproc/jpni, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom_ptr ) 
    518527#else 
    519       nidom_ptr = FLIO_DOM_NONE 
    520 #endif 
     528         nidom_ptr = FLIO_DOM_NONE 
     529#endif 
     530      ENDIF  
     531      !  
     532      IF( nn_timing == 1 )   CALL timing_stop('dia_ptr_init') 
    521533      !  
    522534   END SUBROUTINE dia_ptr_init 
     
    531543      !! ** Method  :   NetCDF file 
    532544      !!---------------------------------------------------------------------- 
    533       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    534       USE wrk_nemo, ONLY:   zphi => wrk_1d_1, zfoo => wrk_1d_2    ! 1D workspace 
    535       USE wrk_nemo, ONLY:   z_1  => wrk_2d_1                      ! 2D      - 
    536545      !! 
    537546      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     
    548557#endif 
    549558      REAL(wp)           ::   zsto, zout, zdt, zjulian                ! temporary scalars 
    550       !!---------------------------------------------------------------------- 
    551  
    552       IF( wrk_in_use(1, 1,2) .OR. wrk_in_use(2, 1) ) THEN 
    553          CALL ctl_stop('dia_ptr_wri: requested workspace arrays unavailable')   ;   RETURN 
    554       ENDIF 
     559      !! 
     560      REAL(wp), POINTER, DIMENSION(:)   ::   zphi, zfoo    ! 1D workspace 
     561      REAL(wp), POINTER, DIMENSION(:,:) ::   z_1           ! 2D workspace 
     562      !!--------------------------------------------------------------------  
     563      ! 
     564      CALL wrk_alloc( jpi      , zphi , zfoo ) 
     565      CALL wrk_alloc( jpi , jpk, z_1 ) 
    555566 
    556567      ! define time axis 
     
    866877      ENDIF 
    867878      ! 
    868       IF( wrk_not_released(1, 1,2) .OR.    & 
    869           wrk_not_released(2, 1)    )   CALL ctl_stop('dia_ptr_wri: failed to release workspace arrays') 
     879      CALL wrk_dealloc( jpi      , zphi , zfoo ) 
     880      CALL wrk_dealloc( jpi , jpk, z_1 ) 
    870881      ! 
    871882  END SUBROUTINE dia_ptr_wri 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90

    r2715 r3294  
    2828   USE ldftra_oce      ! ocean active tracers: lateral physics 
    2929   USE ldfdyn_oce      ! ocean dynamics: lateral physics 
     30   USE traldf_iso_grif, ONLY : psix_eiv, psiy_eiv 
    3031   USE sol_oce         ! solver variables 
    3132   USE sbc_oce         ! Surface boundary condition: ocean fields 
     
    4647   USE limwri_2  
    4748#endif 
    48    USE dtatem 
    49    USE dtasal 
    5049   USE lib_mpp         ! MPP library 
     50   USE timing          ! preformance summary 
     51   USE wrk_nemo        ! working array 
    5152 
    5253   IMPLICIT NONE 
     
    116117      !! ** Method  :  use iom_put 
    117118      !!---------------------------------------------------------------------- 
    118       USE oce, ONLY :   z3d => ta   ! use ta as 3D workspace 
    119       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
    120       USE wrk_nemo, ONLY: z2d => wrk_2d_1 
    121119      !! 
    122120      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
     
    124122      INTEGER                      ::   ji, jj, jk              ! dummy loop indices 
    125123      REAL(wp)                     ::   zztmp, zztmpx, zztmpy   !  
     124      !! 
     125      REAL(wp), POINTER, DIMENSION(:,:)   :: z2d       ! 2D workspace 
     126      REAL(wp), POINTER, DIMENSION(:,:,:) :: z3d      ! 3D workspace 
    126127      !!---------------------------------------------------------------------- 
    127128      !  
    128       IF( wrk_in_use(2, 1))THEN 
    129          CALL ctl_stop('dia_wri: ERROR - requested 2D workspace unavailable.') 
    130          RETURN 
    131       END IF 
     129      IF( nn_timing == 1 )   CALL timing_start('dia_wri') 
     130      !  
     131      CALL wrk_alloc( jpi , jpj      , z2d ) 
     132      CALL wrk_alloc( jpi , jpj, jpk , z3d ) 
    132133      ! 
    133134      ! Output the initial state and forcings 
     
    137138      ENDIF 
    138139 
    139       CALL iom_put( "toce"   , tn                    )    ! temperature 
    140       CALL iom_put( "soce"   , sn                    )    ! salinity 
    141       CALL iom_put( "sst"    , tn(:,:,1)             )    ! sea surface temperature 
    142       CALL iom_put( "sst2"   , tn(:,:,1) * tn(:,:,1) )    ! square of sea surface temperature 
    143       CALL iom_put( "sss"    , sn(:,:,1)             )    ! sea surface salinity 
    144       CALL iom_put( "sss2"   , sn(:,:,1) * sn(:,:,1) )    ! square of sea surface salinity 
    145       CALL iom_put( "uoce"   , un                    )    ! i-current       
    146       CALL iom_put( "voce"   , vn                    )    ! j-current 
     140      CALL iom_put( "toce"   , tsn(:,:,:,jp_tem)                     )    ! temperature 
     141      CALL iom_put( "soce"   , tsn(:,:,:,jp_sal)                     )    ! salinity 
     142      CALL iom_put( "sst"    , tsn(:,:,1,jp_tem)                     )    ! sea surface temperature 
     143      CALL iom_put( "sst2"   , tsn(:,:,1,jp_tem) * tsn(:,:,1,jp_tem) )    ! square of sea surface temperature 
     144      CALL iom_put( "sss"    , tsn(:,:,1,jp_sal)                     )    ! sea surface salinity 
     145      CALL iom_put( "sss2"   , tsn(:,:,1,jp_sal) * tsn(:,:,1,jp_sal) )    ! square of sea surface salinity 
     146      CALL iom_put( "uoce"   , un                                    )    ! i-current       
     147      CALL iom_put( "voce"   , vn                                    )    ! j-current 
    147148       
    148       CALL iom_put( "avt"    , avt                   )    ! T vert. eddy diff. coef. 
    149       CALL iom_put( "avm"    , avmu                  )    ! T vert. eddy visc. coef. 
     149      CALL iom_put( "avt"    , avt                                   )    ! T vert. eddy diff. coef. 
     150      CALL iom_put( "avm"    , avmu                                  )    ! T vert. eddy visc. coef. 
    150151      IF( lk_zdfddm ) THEN 
    151          CALL iom_put( "avs" , fsavs(:,:,:)          )    ! S vert. eddy diff. coef. 
     152         CALL iom_put( "avs" , fsavs(:,:,:)                          )    ! S vert. eddy diff. coef. 
    152153      ENDIF 
    153154 
    154155      DO jj = 2, jpjm1                                    ! sst gradient 
    155156         DO ji = fs_2, fs_jpim1   ! vector opt. 
    156             zztmp      = tn(ji,jj,1) 
    157             zztmpx     = ( tn(ji+1,jj  ,1) - zztmp ) / e1u(ji,jj) + ( zztmp - tn(ji-1,jj  ,1) ) / e1u(ji-1,jj  ) 
    158             zztmpy     = ( tn(ji  ,jj+1,1) - zztmp ) / e2v(ji,jj) + ( zztmp - tn(ji  ,jj-1,1) ) / e2v(ji  ,jj-1) 
     157            zztmp      = tsn(ji,jj,1,jp_tem) 
     158            zztmpx     = ( tsn(ji+1,jj  ,1,jp_tem) - zztmp ) / e1u(ji,jj) + ( zztmp - tsn(ji-1,jj  ,1,jp_tem) ) / e1u(ji-1,jj  ) 
     159            zztmpy     = ( tsn(ji  ,jj+1,1,jp_tem) - zztmp ) / e2v(ji,jj) + ( zztmp - tsn(ji  ,jj-1,1,jp_tem) ) / e2v(ji  ,jj-1) 
    159160            z2d(ji,jj) = 0.25 * ( zztmpx * zztmpx + zztmpy * zztmpy )   & 
    160161               &              * umask(ji,jj,1) * umask(ji-1,jj,1) * vmask(ji,jj,1) * umask(ji,jj-1,1) 
     
    178179            DO jj = 2, jpjm1 
    179180               DO ji = fs_2, fs_jpim1   ! vector opt. 
    180                   z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * zztmp * ( tn(ji,jj,jk) + tn(ji+1,jj,jk) ) 
     181                  z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * zztmp * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 
    181182               END DO 
    182183            END DO 
     
    192193            DO jj = 2, jpjm1 
    193194               DO ji = fs_2, fs_jpim1   ! vector opt. 
    194                   z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * zztmp * ( tn(ji,jj,jk) + tn(ji,jj+1,jk) ) 
     195                  z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * zztmp * ( tsn(ji,jj,jk,jp_tem) + tsn(ji,jj+1,jk,jp_tem) ) 
    195196               END DO 
    196197            END DO 
     
    200201      ENDIF 
    201202      ! 
    202       IF( wrk_not_released(2, 1))THEN 
    203          CALL ctl_stop('dia_wri: ERROR - failed to release 2D workspace.') 
    204          RETURN 
    205       END IF 
     203      CALL wrk_dealloc( jpi , jpj      , z2d ) 
     204      CALL wrk_dealloc( jpi , jpj, jpk , z3d ) 
     205      ! 
     206      IF( nn_timing == 1 )   CALL timing_stop('dia_wri') 
    206207      ! 
    207208   END SUBROUTINE dia_wri 
     
    224225      !!      Each nwrite time step, output the instantaneous or mean fields 
    225226      !!---------------------------------------------------------------------- 
    226       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
    227       USE wrk_nemo, ONLY: zw2d => wrk_2d_1 
    228227      !! 
    229228      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
     
    232231      CHARACTER (len=40) ::   clhstnam, clop, clmx           ! local names 
    233232      INTEGER  ::   inum = 11                                ! temporary logical unit 
     233      INTEGER  ::   ji, jj, jk                               ! dummy loop indices 
     234      INTEGER  ::   ierr                                     ! error code return from allocation 
    234235      INTEGER  ::   iimi, iima, ipk, it, itmod, ijmi, ijma   ! local integers 
    235236      REAL(wp) ::   zsto, zout, zmax, zjulian, zdt           ! local scalars 
     237      !! 
     238      REAL(wp), POINTER, DIMENSION(:,:)   :: zw2d       ! 2D workspace 
     239      REAL(wp), POINTER, DIMENSION(:,:,:) :: zw3d       ! 3D workspace 
    236240      !!---------------------------------------------------------------------- 
    237       ! 
    238       IF( wrk_in_use(2, 1))THEN 
    239          CALL ctl_stop('dia_wri: ERROR - requested 2D workspace unavailable.') 
    240          RETURN 
    241       END IF 
     241      !  
     242      IF( nn_timing == 1 )   CALL timing_start('dia_wri') 
     243      ! 
     244      CALL wrk_alloc( jpi , jpj      , zw2d ) 
     245      IF ( ln_traldf_gdia )  call wrk_alloc( jpi , jpj , jpk  , zw3d ) 
    242246      ! 
    243247      ! Output the initial state and forcings 
     
    446450         CALL histdef( nid_U, "vozocrtx", "Zonal Current"                      , "m/s"    ,   &  ! un 
    447451            &          jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout ) 
     452         IF( ln_traldf_gdia ) THEN 
     453            CALL histdef( nid_U, "vozoeivu", "Zonal EIV Current"                  , "m/s"    ,   &  ! u_eiv 
     454                 &          jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout ) 
     455         ELSE 
    448456#if defined key_diaeiv 
    449          CALL histdef( nid_U, "vozoeivu", "Zonal EIV Current"                  , "m/s"    ,   &  ! u_eiv 
     457            CALL histdef( nid_U, "vozoeivu", "Zonal EIV Current"                  , "m/s"    ,   &  ! u_eiv 
    450458            &          jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout ) 
    451459#endif 
     460         END IF 
    452461         !                                                                                      !!! nid_U : 2D 
    453462         CALL histdef( nid_U, "sozotaux", "Wind Stress along i-axis"           , "N/m2"   ,   &  ! utau 
     
    459468         CALL histdef( nid_V, "vomecrty", "Meridional Current"                 , "m/s"    ,   &  ! vn 
    460469            &          jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout ) 
     470         IF( ln_traldf_gdia ) THEN 
     471            CALL histdef( nid_V, "vomeeivv", "Meridional EIV Current"             , "m/s"    ,   &  ! v_eiv 
     472                 &          jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout ) 
     473         ELSE  
    461474#if defined key_diaeiv 
    462          CALL histdef( nid_V, "vomeeivv", "Meridional EIV Current"             , "m/s"    ,   &  ! v_eiv 
     475            CALL histdef( nid_V, "vomeeivv", "Meridional EIV Current"             , "m/s"    ,   &  ! v_eiv 
    463476            &          jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout ) 
    464477#endif 
     478         END IF 
    465479         !                                                                                      !!! nid_V : 2D 
    466480         CALL histdef( nid_V, "sometauy", "Wind Stress along j-axis"           , "N/m2"   ,   &  ! vtau 
     
    472486         CALL histdef( nid_W, "vovecrtz", "Vertical Velocity"                  , "m/s"    ,   &  ! wn 
    473487            &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
     488         IF( ln_traldf_gdia ) THEN 
     489            CALL histdef( nid_W, "voveeivw", "Vertical EIV Velocity"              , "m/s"    ,   &  ! w_eiv 
     490                 &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
     491         ELSE 
    474492#if defined key_diaeiv 
    475          CALL histdef( nid_W, "voveeivw", "Vertical EIV Velocity"              , "m/s"    ,   &  ! w_eiv 
    476             &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
    477 #endif 
     493            CALL histdef( nid_W, "voveeivw", "Vertical EIV Velocity"              , "m/s"    ,   &  ! w_eiv 
     494                 &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
     495#endif 
     496         END IF 
    478497         CALL histdef( nid_W, "votkeavt", "Vertical Eddy Diffusivity"          , "m2/s"   ,   &  ! avt 
    479498            &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
     
    516535 
    517536      ! Write fields on T grid 
    518       CALL histwrite( nid_T, "votemper", it, tn            , ndim_T , ndex_T  )   ! temperature 
    519       CALL histwrite( nid_T, "vosaline", it, sn            , ndim_T , ndex_T  )   ! salinity 
    520       CALL histwrite( nid_T, "sosstsst", it, tn(:,:,1)     , ndim_hT, ndex_hT )   ! sea surface temperature 
    521       CALL histwrite( nid_T, "sosaline", it, sn(:,:,1)     , ndim_hT, ndex_hT )   ! sea surface salinity 
     537      CALL histwrite( nid_T, "votemper", it, tsn(:,:,:,jp_tem), ndim_T , ndex_T  )   ! temperature 
     538      CALL histwrite( nid_T, "vosaline", it, tsn(:,:,:,jp_sal), ndim_T , ndex_T  )   ! salinity 
     539      CALL histwrite( nid_T, "sosstsst", it, tsn(:,:,1,jp_tem), ndim_hT, ndex_hT )   ! sea surface temperature 
     540      CALL histwrite( nid_T, "sosaline", it, tsn(:,:,1,jp_sal), ndim_hT, ndex_hT )   ! sea surface salinity 
    522541      CALL histwrite( nid_T, "sossheig", it, sshn          , ndim_hT, ndex_hT )   ! sea surface height 
    523542!!$#if  defined key_lim3 || defined key_lim2  
     
    528547!!$      CALL histwrite( nid_T, "sorunoff", it, runoff        , ndim_hT, ndex_hT )   ! runoff 
    529548      CALL histwrite( nid_T, "sowaflcd", it, ( emps-rnf )  , ndim_hT, ndex_hT )   ! c/d water flux 
    530       zw2d(:,:) = ( emps(:,:) - rnf(:,:) ) * sn(:,:,1) * tmask(:,:,1) 
     549      zw2d(:,:) = ( emps(:,:) - rnf(:,:) ) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 
    531550      CALL histwrite( nid_T, "sosalflx", it, zw2d          , ndim_hT, ndex_hT )   ! c/d salt flux 
    532551      CALL histwrite( nid_T, "sohefldo", it, qns + qsr     , ndim_hT, ndex_hT )   ! total heat flux 
     
    539558      CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping 
    540559      CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping 
    541       IF( ln_ssr ) zw2d(:,:) = erp(:,:) * sn(:,:,1) * tmask(:,:,1) 
     560      IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 
    542561      CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping 
    543562#endif 
     
    545564      CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping 
    546565      CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping 
    547          IF( ln_ssr ) zw2d(:,:) = erp(:,:) * sn(:,:,1) * tmask(:,:,1) 
     566         IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 
    548567      CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping 
    549568#endif 
     
    570589         ! Write fields on U grid 
    571590      CALL histwrite( nid_U, "vozocrtx", it, un            , ndim_U , ndex_U )    ! i-current 
     591      IF( ln_traldf_gdia ) THEN 
     592         IF (.not. ALLOCATED(psix_eiv))THEN 
     593            ALLOCATE( psix_eiv(jpi,jpj,jpk) , psiy_eiv(jpi,jpj,jpk) , STAT=ierr ) 
     594            IF( lk_mpp   )   CALL mpp_sum ( ierr ) 
     595            IF( ierr > 0 )   CALL ctl_stop('STOP', 'diawri: unable to allocate psi{x,y}_eiv') 
     596            psix_eiv(:,:,:) = 0.0_wp 
     597            psiy_eiv(:,:,:) = 0.0_wp 
     598         ENDIF 
     599         DO jk=1,jpkm1 
     600            zw3d(:,:,jk) = (psix_eiv(:,:,jk+1) - psix_eiv(:,:,jk))/fse3u(:,:,jk)  ! u_eiv = -dpsix/dz 
     601         END DO 
     602         zw3d(:,:,jpk) = 0._wp 
     603         CALL histwrite( nid_U, "vozoeivu", it, zw3d, ndim_U , ndex_U )           ! i-eiv current 
     604      ELSE 
    572605#if defined key_diaeiv 
    573       CALL histwrite( nid_U, "vozoeivu", it, u_eiv         , ndim_U , ndex_U )    ! i-eiv current 
    574 #endif 
     606         CALL histwrite( nid_U, "vozoeivu", it, u_eiv, ndim_U , ndex_U )          ! i-eiv current 
     607#endif 
     608      ENDIF 
    575609      CALL histwrite( nid_U, "sozotaux", it, utau          , ndim_hU, ndex_hU )   ! i-wind stress 
    576610 
    577611         ! Write fields on V grid 
    578612      CALL histwrite( nid_V, "vomecrty", it, vn            , ndim_V , ndex_V  )   ! j-current 
     613      IF( ln_traldf_gdia ) THEN 
     614         DO jk=1,jpk-1 
     615            zw3d(:,:,jk) = (psiy_eiv(:,:,jk+1) - psiy_eiv(:,:,jk))/fse3v(:,:,jk)  ! v_eiv = -dpsiy/dz 
     616         END DO 
     617         zw3d(:,:,jpk) = 0._wp 
     618         CALL histwrite( nid_V, "vomeeivv", it, zw3d, ndim_V , ndex_V )           ! j-eiv current 
     619      ELSE 
    579620#if defined key_diaeiv 
    580       CALL histwrite( nid_V, "vomeeivv", it, v_eiv         , ndim_V , ndex_V  )   ! j-eiv current 
    581 #endif 
     621         CALL histwrite( nid_V, "vomeeivv", it, v_eiv, ndim_V , ndex_V )          ! j-eiv current 
     622#endif 
     623      ENDIF 
    582624      CALL histwrite( nid_V, "sometauy", it, vtau          , ndim_hV, ndex_hV )   ! j-wind stress 
    583625 
    584626         ! Write fields on W grid 
    585627      CALL histwrite( nid_W, "vovecrtz", it, wn             , ndim_T, ndex_T )    ! vert. current 
     628      IF( ln_traldf_gdia ) THEN 
     629         DO jk=1,jpk-1 
     630            DO jj = 2, jpjm1 
     631               DO ji = fs_2, fs_jpim1  ! vector opt. 
     632                  zw3d(ji,jj,jk) = (psiy_eiv(ji,jj,jk) - psiy_eiv(ji,jj-1,jk))/e2v(ji,jj) + & 
     633                       &    (psix_eiv(ji,jj,jk) - psix_eiv(ji-1,jj,jk))/e1u(ji,jj) ! w_eiv = dpsiy/dy + dpsiy/dx 
     634               END DO 
     635            END DO 
     636         END DO 
     637         zw3d(:,:,jpk) = 0._wp 
     638         CALL histwrite( nid_W, "voveeivw", it, zw3d          , ndim_T, ndex_T )    ! vert. eiv current 
     639      ELSE 
    586640#   if defined key_diaeiv 
    587       CALL histwrite( nid_W, "voveeivw", it, w_eiv          , ndim_T, ndex_T )    ! vert. eiv current 
     641         CALL histwrite( nid_W, "voveeivw", it, w_eiv          , ndim_T, ndex_T )    ! vert. eiv current 
    588642#   endif 
     643      ENDIF 
    589644      CALL histwrite( nid_W, "votkeavt", it, avt            , ndim_T, ndex_T )    ! T vert. eddy diff. coef. 
    590645      CALL histwrite( nid_W, "votkeavm", it, avmu           , ndim_T, ndex_T )    ! T vert. eddy visc. coef. 
     
    608663      ENDIF 
    609664      ! 
    610       IF( wrk_not_released(2, 1))THEN 
    611          CALL ctl_stop('dia_wri: ERROR - failed to release 2D workspace.') 
    612          RETURN 
    613       END IF 
     665      CALL wrk_dealloc( jpi , jpj      , zw2d ) 
     666      IF ( ln_traldf_gdia )  call wrk_dealloc( jpi , jpj , jpk  , zw3d ) 
     667      ! 
     668      IF( nn_timing == 1 )   CALL timing_stop('dia_wri') 
    614669      ! 
    615670   END SUBROUTINE dia_wri 
     
    640695      REAL(wp) ::   zsto, zout, zmax, zjulian, zdt 
    641696      !!---------------------------------------------------------------------- 
     697      !  
     698      IF( nn_timing == 1 )   CALL timing_start('dia_wri_state') 
    642699 
    643700      ! 0. Initialisation 
     
    711768 
    712769      ! Write all fields on T grid 
    713       CALL histwrite( id_i, "votemper", kt, tn      , jpi*jpj*jpk, idex )    ! now temperature 
    714       CALL histwrite( id_i, "vosaline", kt, sn      , jpi*jpj*jpk, idex )    ! now salinity 
    715       CALL histwrite( id_i, "sossheig", kt, sshn     , jpi*jpj    , idex )    ! sea surface height 
    716       CALL histwrite( id_i, "vozocrtx", kt, un       , jpi*jpj*jpk, idex )    ! now i-velocity 
    717       CALL histwrite( id_i, "vomecrty", kt, vn       , jpi*jpj*jpk, idex )    ! now j-velocity 
    718       CALL histwrite( id_i, "vovecrtz", kt, wn       , jpi*jpj*jpk, idex )    ! now k-velocity 
    719       CALL histwrite( id_i, "sowaflup", kt, (emp-rnf), jpi*jpj    , idex )    ! freshwater budget 
    720       CALL histwrite( id_i, "sohefldo", kt, qsr + qns, jpi*jpj    , idex )    ! total heat flux 
    721       CALL histwrite( id_i, "soshfldo", kt, qsr      , jpi*jpj    , idex )    ! solar heat flux 
    722       CALL histwrite( id_i, "soicecov", kt, fr_i     , jpi*jpj    , idex )    ! ice fraction 
    723       CALL histwrite( id_i, "sozotaux", kt, utau     , jpi*jpj    , idex )    ! i-wind stress 
    724       CALL histwrite( id_i, "sometauy", kt, vtau     , jpi*jpj    , idex )    ! j-wind stress 
     770      CALL histwrite( id_i, "votemper", kt, tsn(:,:,:,jp_tem), jpi*jpj*jpk, idex )    ! now temperature 
     771      CALL histwrite( id_i, "vosaline", kt, tsn(:,:,:,jp_sal), jpi*jpj*jpk, idex )    ! now salinity 
     772      CALL histwrite( id_i, "sossheig", kt, sshn             , jpi*jpj    , idex )    ! sea surface height 
     773      CALL histwrite( id_i, "vozocrtx", kt, un               , jpi*jpj*jpk, idex )    ! now i-velocity 
     774      CALL histwrite( id_i, "vomecrty", kt, vn               , jpi*jpj*jpk, idex )    ! now j-velocity 
     775      CALL histwrite( id_i, "vovecrtz", kt, wn               , jpi*jpj*jpk, idex )    ! now k-velocity 
     776      CALL histwrite( id_i, "sowaflup", kt, (emp-rnf )       , jpi*jpj    , idex )    ! freshwater budget 
     777      CALL histwrite( id_i, "sohefldo", kt, qsr + qns        , jpi*jpj    , idex )    ! total heat flux 
     778      CALL histwrite( id_i, "soshfldo", kt, qsr              , jpi*jpj    , idex )    ! solar heat flux 
     779      CALL histwrite( id_i, "soicecov", kt, fr_i             , jpi*jpj    , idex )    ! ice fraction 
     780      CALL histwrite( id_i, "sozotaux", kt, utau             , jpi*jpj    , idex )    ! i-wind stress 
     781      CALL histwrite( id_i, "sometauy", kt, vtau             , jpi*jpj    , idex )    ! j-wind stress 
    725782 
    726783      ! 3. Close the file 
     
    735792      ENDIF 
    736793#endif 
     794        
     795      IF( nn_timing == 1 )   CALL timing_stop('dia_wri_state') 
     796      !  
    737797 
    738798   END SUBROUTINE dia_wri_state 
  • trunk/NEMOGCM/NEMO/OPA_SRC/DIA/diawri_dimg.h90

    r2715 r3294  
    8282    INTEGER :: inbsel, jk 
    8383    INTEGER :: iyear,imon,iday 
     84    INTEGER :: ialloc 
    8485    REAL(wp) :: zdtj 
    8586    CHARACTER(LEN=80) :: clname 
     
    8889    CHARACTER(LEN= 4) :: clver 
    8990    !!---------------------------------------------------------------------- 
     91    IF( nn_timing == 1 )   CALL timing_start('dia_wri') 
    9092    ! 
    9193    !  Initialization 
    9294    !  --------------- 
    9395    ! 
    94     IF(.not.ALLOCATED(um))THEN 
     96    IF( .NOT. ALLOCATED(um) )THEN 
    9597       ALLOCATE(um(jpi,jpj,jpk), vm(jpi,jpj,jpk), & 
    9698                wm(jpi,jpj,jpk),                  & 
     
    98100                tm(jpi,jpj,jpk), sm(jpi,jpj,jpk), & 
    99101                fsel(jpi,jpj,jpk),                & 
    100                 Stat=jk) 
    101        IF(jk /= 0)THEN 
    102           WRITE(*,*) 'ERROR: allocate failed in dia_wri (diawri_dimg.h90)' 
    103           CALL mppabort() 
    104        END IF 
    105     END IF 
     102                STAT=ialloc ) 
     103       ! 
     104       IF( lk_mpp      )   CALL mpp_sum ( ialloc  ) 
     105       IF( ialloc /= 0 )   CALL ctl_warn('dia_wri( diawri_dimg.h90) : failed to allocate arrays') 
     106    ENDIF 
     107 
    106108 
    107109    inbsel = 17 
     
    152154       wm(:,:,:)=wm(:,:,:) + wn (:,:,:) 
    153155       avtm(:,:,:)=avtm(:,:,:) + avt (:,:,:) 
    154        tm(:,:,:)=tm(:,:,:) + tn (:,:,:) 
    155        sm(:,:,:)=sm(:,:,:) + sn (:,:,:) 
     156       tm(:,:,:)=tm(:,:,:) + tsn(:,:,:,jp_tem) 
     157       sm(:,:,:)=sm(:,:,:) + tsn(:,:,:,jp_sal) 
    156158       ! 
    157159       fsel(:,:,1 ) = fsel(:,:,1 ) + utau(:,:) * umask(:,:,1) 
     
    159161       fsel(:,:,3 ) = fsel(:,:,3 ) + qsr (:,:) + qns  (:,:)  
    160162       fsel(:,:,4 ) = fsel(:,:,4 ) + ( emp(:,:)-rnf(:,:) )  
    161        !        fsel(:,:,5 ) = fsel(:,:,5 ) + tb  (:,:,1)  !RB not used 
     163       !        fsel(:,:,5 ) = fsel(:,:,5 ) + tsb(:,:,1,jp_tem)  !RB not used 
    162164       fsel(:,:,6 ) = fsel(:,:,6 ) + sshn(:,:)  
    163165       fsel(:,:,7 ) = fsel(:,:,7 ) + qsr(:,:) 
     
    226228          fsel(:,:,3 ) = (qsr (:,:) + qns (:,:)) * tmask(:,:,1) 
    227229          fsel(:,:,4 ) = ( emp(:,:)-rnf(:,:) ) * tmask(:,:,1)  
    228           !         fsel(:,:,5 ) = (tb  (:,:,1) - sf_sst(1)%fnow(:,:) ) *tmask(:,:,1) !RB not used 
     230          !         fsel(:,:,5 ) = (tsb(:,:,1,jp_tem) - sf_sst(1)%fnow(:,:) ) *tmask(:,:,1) !RB not used 
    229231 
    230232          fsel(:,:,6 ) = sshn(:,:) 
     
    302304 
    303305       IF( ll_dia_inst) THEN 
    304           CALL dia_wri_dimg(clname, cltext, tn, jpk, 'T') 
    305        ELSE 
    306           CALL dia_wri_dimg(clname, cltext, tm, jpk, 'T') 
     306          CALL dia_wri_dimg(clname, cltext, tsn(:,:,:,jp_tem), jpk, 'T') 
     307       ELSE 
     308          CALL dia_wri_dimg(clname, cltext, tm               , jpk, 'T') 
    307309       ENDIF 
    308310       ! 
     
    314316 
    315317       IF( ll_dia_inst) THEN 
    316           CALL dia_wri_dimg(clname, cltext, sn, jpk, 'T') 
    317        ELSE 
    318           CALL dia_wri_dimg(clname, cltext, sm, jpk, 'T') 
     318          CALL dia_wri_dimg(clname, cltext, tsn(:,:,:,jp_sal), jpk, 'T') 
     319       ELSE 
     320          CALL dia_wri_dimg(clname, cltext, sm               , jpk, 'T') 
    319321       ENDIF 
    320322       ! 
     
    357359    ENDIF 
    358360    ! 
     361    IF( nn_timing == 1 )   CALL timing_stop('dia_wri') 
     362    ! 
    3593639000 FORMAT(a,"_",a,"_y",i4.4,"m",i2.2,"d",i2.2,".dimgproc") 
    360364    ! 
Note: See TracChangeset for help on using the changeset viewer.