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 2715 for trunk/NEMOGCM/NEMO/OPA_SRC/OBC/obcdta.F90 – NEMO

Ignore:
Timestamp:
2011-03-30T17:58:35+02:00 (13 years ago)
Author:
rblod
Message:

First attempt to put dynamic allocation on the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/OBC/obcdta.F90

    r2528 r2715  
    44   !! Open boundary data : read the data for the open boundaries. 
    55   !!============================================================================== 
     6   !! History :  OPA  ! 1998-05 (J.M. Molines) Original code 
     7   !!            8.5  ! 2002-10 (C. Talandier, A-M. Treguier) Free surface, F90 
     8   !!   NEMO     1.0  ! 2004-06 (F. Durand, A-M. Treguier) Netcdf BC files on input 
     9   !!            3.0  ! 2007-2008 (C. Langlais, P. Mathiot, J.M. Molines) high frequency boundaries data 
     10   !!------------------------------------------------------------------------------ 
    611#if defined key_obc 
    712   !!------------------------------------------------------------------------------ 
     
    1015   !!   obc_dta           : read u, v, t, s data along each open boundary 
    1116   !!------------------------------------------------------------------------------ 
    12    !! * Modules used 
    1317   USE oce             ! ocean dynamics and tracers  
    1418   USE dom_oce         ! ocean space and time domain 
     
    1923   USE in_out_manager  ! I/O logical units 
    2024   USE lib_mpp         ! distributed memory computing 
    21    USE dynspg_oce 
     25   USE dynspg_oce      ! ocean: surface pressure gradient 
    2226   USE ioipsl          ! now only for  ymds2ju function  
    2327   USE iom             !  
     
    2630   PRIVATE 
    2731 
    28    !! * Accessibility 
    29    PUBLIC obc_dta      ! routines called by step.F90 
    30    PUBLIC obc_dta_bt   ! routines called by dynspg_ts.F90 
    31  
    32    !! * Shared module variables 
    33    REAL(wp),  DIMENSION(2)              ::  zjcnes_obc   !  
    34    REAL(wp),  DIMENSION(:), ALLOCATABLE :: ztcobc 
     32   PUBLIC   obc_dta         ! routine  called by step.F90 
     33   PUBLIC   obc_dta_bt      ! routine  called by dynspg_ts.F90 
     34   PUBLIC   obc_dta_alloc   ! function called by obcini.F90 
     35 
     36   REAL(wp),  DIMENSION(2)              ::   zjcnes_obc   !  
     37   REAL(wp),  DIMENSION(:), ALLOCATABLE ::   ztcobc 
    3538   REAL(wp) :: rdt_obc 
    3639   REAL(wp) :: zjcnes 
     
    3942   INTEGER ::  itobce, itobcw, itobcs, itobcn, itobc_b  ! number of time steps in OBC files 
    4043 
    41    INTEGER ::   & 
    42       ntobc      , &     !:  where we are in the obc file 
    43       ntobc_b    , &     !:  first record used 
    44       ntobc_a            !:  second record used 
    45  
    46    CHARACTER (len=40) :: &    ! name of data files 
    47       cl_obc_eTS   , cl_obc_eU,  & 
    48       cl_obc_wTS   , cl_obc_wU,  & 
    49       cl_obc_nTS   , cl_obc_nV,  & 
    50       cl_obc_sTS   , cl_obc_sV 
    51  
    52 # if defined key_dynspg_ts 
     44   INTEGER ::   ntobc        ! where we are in the obc file 
     45   INTEGER ::   ntobc_b      ! first record used 
     46   INTEGER ::   ntobc_a      ! second record used 
     47 
     48   CHARACTER (len=40) ::   cl_obc_eTS, cl_obc_eU   ! name of data files 
     49   CHARACTER (len=40) ::   cl_obc_wTS, cl_obc_wU   !   -       - 
     50   CHARACTER (len=40) ::   cl_obc_nTS, cl_obc_nV   !   -       - 
     51   CHARACTER (len=40) ::   cl_obc_sTS, cl_obc_sV   !   -       - 
     52 
    5353   ! bt arrays for interpolating time dependent data on the boundaries 
    54    INTEGER :: nt_m=0, ntobc_m 
    55    REAL(wp), DIMENSION(jpj,0:jptobc) :: ubtedta, vbtedta, sshedta  ! East 
    56    REAL(wp), DIMENSION(jpj,0:jptobc) :: ubtwdta, vbtwdta, sshwdta ! West 
    57    REAL(wp), DIMENSION(jpi,0:jptobc) :: ubtndta, vbtndta, sshndta ! North 
    58    REAL(wp), DIMENSION(jpi,0:jptobc) :: ubtsdta, vbtsdta, sshsdta ! South 
     54   INTEGER ::   nt_m=0, ntobc_m 
     55   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtedta, vbtedta, sshedta    ! East 
     56   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtwdta, vbtwdta, sshwdta    ! West 
     57   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtndta, vbtndta, sshndta    ! North 
     58   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ubtsdta, vbtsdta, sshsdta    ! South 
    5959   ! arrays used for interpolating time dependent data on the boundaries 
    60    REAL(wp), DIMENSION(jpj,jpk,0:jptobc) :: uedta, vedta, tedta, sedta    ! East 
    61    REAL(wp), DIMENSION(jpj,jpk,0:jptobc) :: uwdta, vwdta, twdta, swdta    ! West 
    62    REAL(wp), DIMENSION(jpi,jpk,0:jptobc) :: undta, vndta, tndta, sndta    ! North 
    63    REAL(wp), DIMENSION(jpi,jpk,0:jptobc) :: usdta, vsdta, tsdta, ssdta    ! South 
    64 # else 
    65    ! bt arrays for interpolating time dependent data on the boundaries 
    66    REAL(wp), DIMENSION(jpj,jptobc) :: ubtedta, vbtedta, sshedta  ! East 
    67    REAL(wp), DIMENSION(jpj,jptobc) :: ubtwdta, vbtwdta, sshwdta        ! West 
    68    REAL(wp), DIMENSION(jpi,jptobc) :: ubtndta, vbtndta, sshndta        ! North 
    69    REAL(wp), DIMENSION(jpi,jptobc) :: ubtsdta, vbtsdta, sshsdta        ! South 
    70    ! arrays used for interpolating time dependent data on the boundaries 
    71    REAL(wp), DIMENSION(jpj,jpk,jptobc) :: uedta, vedta, tedta, sedta    ! East 
    72    REAL(wp), DIMENSION(jpj,jpk,jptobc) :: uwdta, vwdta, twdta, swdta    ! West 
    73    REAL(wp), DIMENSION(jpi,jpk,jptobc) :: undta, vndta, tndta, sndta    ! North 
    74    REAL(wp), DIMENSION(jpi,jpk,jptobc) :: usdta, vsdta, tsdta, ssdta    ! South 
    75 # endif 
    76    LOGICAL, DIMENSION (jpj,jpk ) :: ltemsk=.TRUE., luemsk=.TRUE., lvemsk=.TRUE.  ! boolean msks 
    77    LOGICAL, DIMENSION (jpj,jpk ) :: ltwmsk=.TRUE., luwmsk=.TRUE., lvwmsk=.TRUE.  ! used for outliers 
    78    LOGICAL, DIMENSION (jpi,jpk ) :: ltnmsk=.TRUE., lunmsk=.TRUE., lvnmsk=.TRUE.  ! checks 
    79    LOGICAL, DIMENSION (jpi,jpk ) :: ltsmsk=.TRUE., lusmsk=.TRUE., lvsmsk=.TRUE. 
     60   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: uedta, vedta, tedta, sedta    ! East 
     61   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: uwdta, vwdta, twdta, swdta    ! West 
     62   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: undta, vndta, tndta, sndta    ! North 
     63   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: usdta, vsdta, tsdta, ssdta    ! South 
     64 
     65   ! Masks set to .TRUE. after successful allocation below 
     66   LOGICAL , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ltemsk, luemsk, lvemsk  ! boolean msks 
     67   LOGICAL , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ltwmsk, luwmsk, lvwmsk  ! used for outliers 
     68   LOGICAL , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ltnmsk, lunmsk, lvnmsk  ! checks 
     69   LOGICAL , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ltsmsk, lusmsk, lvsmsk 
    8070 
    8171   !! * Substitutions 
     
    8575   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    8676   !! $Id$ 
    87    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     77   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    8878   !!---------------------------------------------------------------------- 
    89  
    9079CONTAINS 
     80 
     81   INTEGER FUNCTION obc_dta_alloc() 
     82      !!------------------------------------------------------------------- 
     83      !!                     ***  ROUTINE obc_dta_alloc  *** 
     84      !!------------------------------------------------------------------- 
     85      INTEGER :: ierr(2) 
     86      !!------------------------------------------------------------------- 
     87# if defined key_dynspg_ts 
     88      ALLOCATE(   &     ! time-splitting : 0:jptobc 
     89         ! bt arrays for interpolating time dependent data on the boundaries 
     90         &      ubtedta  (jpj,0:jptobc) , vbtedta  (jpj,0:jptobc) , sshedta  (jpj,0:jptobc) ,    & 
     91         &      ubtwdta  (jpj,0:jptobc) , vbtwdta  (jpj,0:jptobc) , sshwdta  (jpj,0:jptobc) ,    & 
     92         &      ubtndta  (jpi,0:jptobc) , vbtndta  (jpi,0:jptobc) , sshndta  (jpi,0:jptobc) ,    & 
     93         &      ubtsdta  (jpi,0:jptobc) , vbtsdta  (jpi,0:jptobc) , sshsdta  (jpi,0:jptobc) ,    & 
     94         ! arrays used for interpolating time dependent data on the boundaries 
     95         &      uedta(jpj,jpk,0:jptobc) , vedta(jpj,jpk,0:jptobc)                           ,     & 
     96         &      tedta(jpj,jpk,0:jptobc) , sedta(jpj,jpk,0:jptobc)                           ,     & 
     97         &      uwdta(jpj,jpk,0:jptobc) , vwdta(jpj,jpk,0:jptobc)                           ,     & 
     98         &      twdta(jpj,jpk,0:jptobc) , swdta(jpj,jpk,0:jptobc)                           ,     & 
     99         &      undta(jpi,jpk,0:jptobc) , vndta(jpi,jpk,0:jptobc)                           ,     & 
     100         &      tndta(jpi,jpk,0:jptobc) , sndta(jpi,jpk,0:jptobc)                           ,     & 
     101         &      usdta(jpi,jpk,0:jptobc) , vsdta(jpi,jpk,0:jptobc)                           ,     & 
     102         &      tsdta(jpi,jpk,0:jptobc) , ssdta(jpi,jpk,0:jptobc)                           , STAT=ierr(1) ) 
     103# else 
     104      ALLOCATE(   &     ! no time splitting : 1:jptobc 
     105         ! bt arrays for interpolating time dependent data on the boundaries 
     106         &      ubtedta  (jpj,jptobc) , vbtedta  (jpj,jptobc) , sshedta  (jpj,jptobc)  ,     & 
     107         &      ubtwdta  (jpj,jptobc) , vbtwdta  (jpj,jptobc) , sshwdta  (jpj,jptobc)  ,     & 
     108         &      ubtndta  (jpi,jptobc) , vbtndta  (jpi,jptobc) , sshndta  (jpi,jptobc)  ,     & 
     109         &      ubtsdta  (jpi,jptobc) , vbtsdta  (jpi,jptobc) , sshsdta  (jpi,jptobc)  ,     & 
     110         ! arrays used for interpolating time dependent data on the boundaries 
     111         &      uedta(jpj,jpk,jptobc) , vedta(jpj,jpk,jptobc)                          ,     & 
     112         &      tedta(jpj,jpk,jptobc) , sedta(jpj,jpk,jptobc)                          ,     & 
     113         &      uwdta(jpj,jpk,jptobc) , vwdta(jpj,jpk,jptobc)                          ,     & 
     114         &      twdta(jpj,jpk,jptobc) , swdta(jpj,jpk,jptobc)                          ,     & 
     115         &      undta(jpi,jpk,jptobc) , vndta(jpi,jpk,jptobc)                          ,     & 
     116         &      tndta(jpi,jpk,jptobc) , sndta(jpi,jpk,jptobc)                          ,     & 
     117         &      usdta(jpi,jpk,jptobc) , vsdta(jpi,jpk,jptobc)                          ,     & 
     118         &      tsdta(jpi,jpk,jptobc) , ssdta(jpi,jpk,jptobc)                          , STAT=ierr(1) ) 
     119# endif 
     120 
     121      ALLOCATE( ltemsk(jpj,jpk) , luemsk(jpj,jpk) , lvemsk(jpj,jpk) ,     & 
     122         &      ltwmsk(jpj,jpk) , luwmsk(jpj,jpk) , lvwmsk(jpj,jpk) ,     & 
     123         &      ltnmsk(jpj,jpk) , lunmsk(jpj,jpk) , lvnmsk(jpj,jpk) ,     & 
     124         &      ltsmsk(jpj,jpk) , lusmsk(jpj,jpk) , lvsmsk(jpj,jpk) , STAT=ierr(2) ) 
     125 
     126      obc_dta_alloc = MAXVAL( ierr ) 
     127      IF( lk_mpp )   CALL mpp_sum( obc_dta_alloc ) 
     128 
     129      IF( obc_dta_alloc == 0 )  THEN         ! Initialise mask values following successful allocation 
     130         !      east            !          west            !          north           !          south           ! 
     131         ltemsk(:,:) = .TRUE.   ;   ltwmsk(:,:) = .TRUE.   ;   ltnmsk(:,:) = .TRUE.   ;   ltsmsk(:,:) = .TRUE. 
     132         luemsk(:,:) = .TRUE.   ;   luwmsk(:,:) = .TRUE.   ;   lunmsk(:,:) = .TRUE.   ;   lusmsk(:,:) = .TRUE. 
     133         lvemsk(:,:) = .TRUE.   ;   lvwmsk(:,:) = .TRUE.   ;   lvnmsk(:,:) = .TRUE.   ;   lvsmsk(:,:) = .TRUE. 
     134      END IF 
     135      ! 
     136   END FUNCTION obc_dta_alloc 
     137 
    91138 
    92139   SUBROUTINE obc_dta( kt ) 
     
    106153      !!                 attribute of variable time_counter). 
    107154      !! 
    108       !! 
    109       !! History : 
    110       !!        !  98-05 (J.M. Molines) Original code 
    111       !!   8.5  !  02-10 (C. Talandier, A-M. Treguier) Free surface, F90 
    112       !! 
    113       !!   9.0  !  04-06 (F. Durand, A-M. Treguier) Netcdf BC files on input 
    114       !!        !  2007-2008 (C. Langlais, P. Mathiot, J.M. Molines) high frequency boundaries data 
    115155      !!--------------------------------------------------------------------------- 
    116       !! * Arguments 
    117156      INTEGER, INTENT( in ) ::   kt          ! ocean time-step index 
    118  
    119       !! * Local declarations 
     157      ! 
    120158      INTEGER, SAVE :: immfile, iyyfile                     ! 
    121159      INTEGER :: nt              !  record indices (incrementation) 
    122160      REAL(wp) ::   zsec, zxy, znum, zden ! time interpolation weight 
    123  
    124161      !!--------------------------------------------------------------------------- 
    125162 
     
    227264 
    228265 
    229    SUBROUTINE obc_dta_ini (kt) 
     266   SUBROUTINE obc_dta_ini( kt ) 
    230267      !!----------------------------------------------------------------------------- 
    231268      !!                       ***  SUBROUTINE obc_dta_ini  *** 
    232269      !! 
    233       !! ** Purpose : 
    234       !!      When obc_dta first call, realize some data initialization 
    235       !! 
    236       !! ** Method : 
    237       !! 
    238       !! History : 
    239       !!   9.0  ! 07-10 (J.M. Molines ) 
     270      !! ** Purpose :   When obc_dta first call, realize some data initialization 
    240271      !!---------------------------------------------------------------------------- 
    241       !! * Argument 
    242272      INTEGER, INTENT(in)  :: kt      ! ocean time-step index 
    243  
    244       !! * Local declarations 
     273      ! 
    245274      INTEGER ::   ji, jj   ! dummy loop indices 
    246275      INTEGER, SAVE :: immfile, iyyfile                     ! 
     
    521550      !!                Data at the boundary must be in m2/s  
    522551      !! 
    523       !! History : 
    524       !!   9.0  !  05-11 (V. garnier) Original code 
     552      !! History :  9.0  !  05-11 (V. garnier) Original code 
    525553      !!--------------------------------------------------------------------------- 
    526       !! * Arguments 
    527554      INTEGER, INTENT( in ) ::   kt          ! ocean time-step index 
    528555      INTEGER, INTENT( in ) ::   kbt         ! barotropic ocean time-step index 
    529  
    530       !! * Local declarations 
     556      ! 
    531557      INTEGER ::   ji, jj  ! dummy loop indices 
    532558      INTEGER ::   i15 
     
    534560      REAL(wp) ::  zxy 
    535561      INTEGER ::   isrel           ! number of seconds since 1/1/1992 
    536  
    537562      !!--------------------------------------------------------------------------- 
    538563 
     
    10961121   END SUBROUTINE obc_read 
    10971122 
     1123 
    10981124   INTEGER FUNCTION nrecbef() 
    10991125      !!----------------------------------------------------------------------- 
     
    11271153      END FUNCTION nrecbef 
    11281154 
    1129       !!============================================================================== 
     1155 
    11301156      SUBROUTINE obc_depth_average(nt_x) 
    11311157         !!----------------------------------------------------------------------- 
     
    12121238      END SUBROUTINE obc_dta 
    12131239#endif 
     1240   !!============================================================================== 
    12141241   END MODULE obcdta 
Note: See TracChangeset for help on using the changeset viewer.