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 2185 for branches/devukmo2010/NEMO/OPA_SRC/BDY/bdyini.F90 – NEMO

Ignore:
Timestamp:
2010-10-07T17:17:57+02:00 (14 years ago)
Author:
rfurner
Message:

adding updates from bdy branch, revision 2100:2168

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/devukmo2010/NEMO/OPA_SRC/BDY/bdyini.F90

    r2128 r2185  
    1919   USE oce             ! ocean dynamics and tracers variables 
    2020   USE dom_oce         ! ocean space and time domain 
     21   USE obc_par         ! ocean open boundary conditions 
    2122   USE bdy_oce         ! unstructured open boundary conditions 
    2223   USE bdytides        ! tides at open boundaries initialization (tide_init routine) 
     
    3233 
    3334   !!---------------------------------------------------------------------- 
    34    !! NEMO/OPA 3.0 , LOCEAN-IPSL (2008)  
     35   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    3536   !! $Id$  
    3637   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    37    !!--------------------------------------------------------------------------------- 
    38  
     38   !!---------------------------------------------------------------------- 
    3939CONTAINS 
    4040    
     
    5050      !! 
    5151      !! ** Input   :  bdy_init.nc, input file for unstructured open boundaries 
    52       !! 
    5352      !!----------------------------------------------------------------------       
    5453      INTEGER ::   ii, ij, ik, igrd, ib, ir   ! dummy loop indices 
     
    5655      INTEGER ::   ib_len, ibr_max 
    5756      INTEGER ::   iw, ie, is, in  
    58       INTEGER ::   inum                 ! temporary logical unit 
    59       INTEGER ::   id_dummy             ! temporary integers 
     57      INTEGER ::   inum                 ! local logical unit 
     58      INTEGER ::   id_dummy             ! local integers 
    6059      INTEGER ::   igrd_start, igrd_end ! start and end of loops on igrd 
    6160      INTEGER, DIMENSION (2)             ::   kdimsz 
     
    6867      !! 
    6968      NAMELIST/nambdy/filbdy_mask, filbdy_data_T, filbdy_data_U, filbdy_data_V,          & 
    70          &            filbdy_data_bt_T, filbdy_data_bt_U, filbdy_data_bt_V,          & 
     69         &            filbdy_data_bt_T, filbdy_data_bt_U, filbdy_data_bt_V,              & 
    7170         &            ln_bdy_tides, ln_bdy_clim, ln_bdy_vol, ln_bdy_mask,                & 
    7271         &            ln_bdy_dyn_fla, ln_bdy_dyn_frs, ln_bdy_tra_frs,ln_bdy_ice_frs,     & 
    7372         &            nbdy_dta, nb_rimwidth, volbdy 
    74  
    7573      !!---------------------------------------------------------------------- 
    7674 
     
    7977      IF(lwp) WRITE(numout,*) '~~~~~~~~' 
    8078      ! 
    81       IF( jperio /= 0 ) CALL ctl_stop( 'Cyclic or symmetric,',   & 
    82            ' and unstructured open boundary condition are not compatible' ) 
    83  
    84 #if defined key_obc 
    85       CALL ctl_stop( 'Straight open boundaries,',   & 
    86            ' and unstructured open boundaries are not compatible' ) 
    87 #endif 
    88  
    89       ! Read namelist parameters 
     79      IF( jperio /= 0 )   CALL ctl_stop( 'Cyclic or symmetric,',   & 
     80         &                               ' and unstructured open boundary condition are not compatible' ) 
     81 
     82      IF( lk_obc      )   CALL ctl_stop( 'Straight open boundaries,',   & 
     83         &                               ' and unstructured open boundaries are not compatible' ) 
     84 
    9085      ! --------------------------- 
    91       REWIND( numnam ) 
     86      REWIND( numnam )                    ! Read namelist parameters 
    9287      READ  ( numnam, nambdy ) 
    9388 
    94       ! control prints 
     89      !                                   ! control prints 
    9590      IF(lwp) WRITE(numout,*) '         nambdy' 
    9691 
    97       ! Check nbdy_dta value 
     92      !                                         ! check type of data used (nbdy_dta value) 
    9893      IF(lwp) WRITE(numout,*) 'nbdy_dta =', nbdy_dta       
    99       IF(lwp) WRITE(numout,*) ' ' 
    100       SELECT CASE( nbdy_dta ) 
    101       CASE( 0 ) 
    102         IF(lwp) WRITE(numout,*) '         initial state used for bdy data'         
    103       CASE( 1 ) 
    104         IF(lwp) WRITE(numout,*) '         boundary data taken from file' 
    105       CASE DEFAULT 
    106         CALL ctl_stop( 'nbdy_dta must be 0 or 1' ) 
     94      IF(lwp) WRITE(numout,*) 
     95      SELECT CASE( nbdy_dta )                   !  
     96      CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      initial state used for bdy data'         
     97      CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      boundary data taken from file' 
     98      CASE DEFAULT   ;   CALL ctl_stop( 'nbdy_dta must be 0 or 1' ) 
    10799      END SELECT 
    108100 
    109       IF(lwp) WRITE(numout,*) ' ' 
     101      IF(lwp) WRITE(numout,*) 
    110102      IF(lwp) WRITE(numout,*) 'Boundary rim width for the FRS nb_rimwidth = ', nb_rimwidth 
    111103 
    112       IF(lwp) WRITE(numout,*) ' ' 
    113       IF(lwp) WRITE(numout,*) '         volbdy = ', volbdy 
    114  
    115       IF (ln_bdy_vol) THEN 
    116         SELECT CASE ( volbdy ) ! Check volbdy value 
    117         CASE( 1 ) 
    118           IF(lwp) WRITE(numout,*) '         The total volume will be constant' 
    119         CASE( 0 ) 
    120           IF(lwp) WRITE(numout,*) '         The total volume will vary according' 
    121           IF(lwp) WRITE(numout,*) '         to the surface E-P flux' 
    122         CASE DEFAULT 
    123           CALL ctl_stop( 'volbdy must be 0 or 1' ) 
    124         END SELECT 
     104      IF(lwp) WRITE(numout,*) 
     105      IF(lwp) WRITE(numout,*) '      volbdy = ', volbdy 
     106 
     107      IF( ln_bdy_vol ) THEN                     ! check volume conservation (volbdy value) 
     108         SELECT CASE ( volbdy ) 
     109         CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      The total volume will be constant' 
     110         CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      The total volume will vary according to the surface E-P flux' 
     111         CASE DEFAULT   ;   CALL ctl_stop( 'volbdy must be 0 or 1' ) 
     112         END SELECT 
     113         IF(lwp) WRITE(numout,*) 
    125114      ELSE 
    126         IF(lwp) WRITE(numout,*) 'No volume correction with unstructured open boundaries' 
    127         IF(lwp) WRITE(numout,*) ' ' 
    128       ENDIF 
    129  
    130       IF (ln_bdy_tides) THEN 
    131         IF(lwp) WRITE(numout,*) ' ' 
     115         IF(lwp) WRITE(numout,*) 'No volume correction with unstructured open boundaries' 
     116         IF(lwp) WRITE(numout,*) 
     117      ENDIF 
     118 
     119      IF( ln_bdy_tides ) THEN 
    132120        IF(lwp) WRITE(numout,*) 'Tidal harmonic forcing at unstructured open boundaries' 
    133         IF(lwp) WRITE(numout,*) ' ' 
    134       ENDIF 
    135  
    136       IF (ln_bdy_dyn_fla) THEN 
    137         IF(lwp) WRITE(numout,*) ' ' 
     121        IF(lwp) WRITE(numout,*) 
     122      ENDIF 
     123 
     124      IF( ln_bdy_dyn_fla ) THEN 
    138125        IF(lwp) WRITE(numout,*) 'Flather condition on U, V at unstructured open boundaries' 
    139         IF(lwp) WRITE(numout,*) ' ' 
    140       ENDIF 
    141  
    142       IF (ln_bdy_dyn_frs) THEN 
    143         IF(lwp) WRITE(numout,*) ' ' 
     126        IF(lwp) WRITE(numout,*) 
     127      ENDIF 
     128 
     129      IF( ln_bdy_dyn_frs ) THEN 
    144130        IF(lwp) WRITE(numout,*) 'FRS condition on U and V at unstructured open boundaries' 
    145         IF(lwp) WRITE(numout,*) ' ' 
    146       ENDIF 
    147  
    148       IF (ln_bdy_tra_frs) THEN 
    149         IF(lwp) WRITE(numout,*) ' ' 
     131        IF(lwp) WRITE(numout,*) 
     132      ENDIF 
     133 
     134      IF( ln_bdy_tra_frs ) THEN 
    150135        IF(lwp) WRITE(numout,*) 'FRS condition on T & S fields at unstructured open boundaries' 
    151         IF(lwp) WRITE(numout,*) ' ' 
    152       ENDIF 
    153  
    154       IF (ln_bdy_ice_frs) THEN 
    155         IF(lwp) WRITE(numout,*) ' ' 
     136        IF(lwp) WRITE(numout,*) 
     137      ENDIF 
     138 
     139      IF( ln_bdy_ice_frs ) THEN 
    156140        IF(lwp) WRITE(numout,*) 'FRS condition on ice fields at unstructured open boundaries' 
    157         IF(lwp) WRITE(numout,*) ' ' 
    158       ENDIF 
    159  
    160       ! Read tides namelist  
    161       ! ------------------------ 
    162       IF( ln_bdy_tides )   CALL tide_init 
     141        IF(lwp) WRITE(numout,*) 
     142      ENDIF 
     143 
     144      IF( ln_bdy_tides )   CALL tide_init      ! Read tides namelist  
     145 
    163146 
    164147      ! Read arrays defining unstructured open boundaries 
     
    170153      !          = 0  elsewhere    
    171154  
    172       IF( cp_cfg == "eel" .AND. jp_cfg == 5 ) THEN 
     155      IF( cp_cfg == "eel" .AND. jp_cfg == 5 ) THEN          ! EEL configuration at 5km resolution 
    173156         zmask(         :                ,:) = 0.e0 
    174157         zmask(jpizoom+1:jpizoom+jpiglo-2,:) = 1.e0           
    175       ELSE IF ( ln_bdy_mask ) THEN 
     158      ELSE IF( ln_bdy_mask ) THEN 
    176159         CALL iom_open( filbdy_mask, inum ) 
    177160         CALL iom_get ( inum, jpdom_data, 'bdy_msk', zmask(:,:) ) 
     
    181164      ENDIF 
    182165 
    183       ! Save mask over local domain       
    184       DO ij = 1, nlcj 
     166      DO ij = 1, nlcj      ! Save mask over local domain       
    185167         DO ii = 1, nlci 
    186168            bdytmask(ii,ij) = zmask( mig(ii), mjg(ij) ) 
     
    197179         END DO 
    198180      END DO 
    199  
    200       ! Lateral boundary conditions 
    201       CALL lbc_lnk( bdyumask(:,:), 'U', 1. ) 
    202       CALL lbc_lnk( bdyvmask(:,:), 'V', 1. ) 
     181      CALL lbc_lnk( bdyumask(:,:), 'U', 1. )   ;   CALL lbc_lnk( bdyvmask(:,:), 'V', 1. )      ! Lateral boundary cond. 
     182 
    203183 
    204184      ! Read discrete distance and mapping indices 
     
    210190      IF( cp_cfg == "eel" .AND. jp_cfg == 5 ) THEN 
    211191         icount = 0 
    212          ! Define west boundary (from ii=2 to ii=1+nb_rimwidth): 
    213          DO ir = 1, nb_rimwidth          
     192         DO ir = 1, nb_rimwidth                  ! Define west boundary (from ii=2 to ii=1+nb_rimwidth): 
    214193            DO ij = 3, jpjglo-2 
    215                icount=icount+1 
     194               icount = icount + 1 
    216195               nbidta(icount,:) = ir + 1 + (jpizoom-1) 
    217                nbjdta(icount,:) = ij + (jpjzoom-1)  
     196               nbjdta(icount,:) = ij     + (jpjzoom-1)  
    218197               nbrdta(icount,:) = ir 
    219198            END DO 
    220199         END DO 
    221  
    222          ! Define east boundary (from ii=jpiglo-1 to ii=jpiglo-nb_rimwidth): 
    223          DO ir=1,nb_rimwidth          
     200         ! 
     201         DO ir = 1, nb_rimwidth                  ! Define east boundary (from ii=jpiglo-1 to ii=jpiglo-nb_rimwidth): 
    224202            DO ij=3,jpjglo-2 
    225                icount=icount+1 
     203               icount = icount + 1 
    226204               nbidta(icount,:) = jpiglo-ir + (jpizoom-1) 
    227205               nbidta(icount,2) = jpiglo-ir-1 + (jpizoom-1) ! special case for u points 
     
    230208            END DO 
    231209         END DO 
    232              
     210         !        
    233211      ELSE            ! Read indices and distances in unstructured boundary data files  
    234  
    235          IF( ln_bdy_tides ) THEN  
    236             ! Read tides input files for preference in case there are 
    237             ! no bdydata files.  
     212         ! 
     213         IF( ln_bdy_tides ) THEN             ! Read tides input files for preference in case there are no bdydata files 
    238214            clfile(4) = TRIM(filtide)//TRIM(tide_cpt(1))//'_grid_T.nc' 
    239215            clfile(5) = TRIM(filtide)//TRIM(tide_cpt(1))//'_grid_U.nc' 
    240216            clfile(6) = TRIM(filtide)//TRIM(tide_cpt(1))//'_grid_V.nc' 
    241217         ENDIF 
    242          IF( ln_bdy_dyn_fla .and. .not. ln_bdy_tides ) THEN  
     218         IF( ln_bdy_dyn_fla .AND. .NOT. ln_bdy_tides ) THEN  
    243219            clfile(4) = filbdy_data_bt_T 
    244220            clfile(5) = filbdy_data_bt_U 
     
    248224         IF( ln_bdy_tra_frs ) THEN  
    249225            clfile(1) = filbdy_data_T 
    250             IF( .not. ln_bdy_dyn_frs ) THEN  
    251                clfile(2) = filbdy_data_T  ! Dummy read re read T file for sake of 6 files 
    252                clfile(3) = filbdy_data_T  ! 
     226            IF( .NOT. ln_bdy_dyn_frs ) THEN  
     227               clfile(2) = filbdy_data_T     ! Dummy read re read T file for sake of 6 files 
     228               clfile(3) = filbdy_data_T     ! 
    253229            ENDIF 
    254230         ENDIF           
    255231         IF( ln_bdy_dyn_frs ) THEN  
    256             IF( .not. ln_bdy_tra_frs ) THEN  
    257                clfile(1) = filbdy_data_U ! Dummy Read  
    258             ENDIF 
     232            IF( .NOT. ln_bdy_tra_frs )   clfile(1) = filbdy_data_U      ! Dummy Read  
    259233            clfile(2) = filbdy_data_U 
    260234            clfile(3) = filbdy_data_V  
    261235         ENDIF 
    262236 
    263          ! how many files are we to read in? 
    264          IF(ln_bdy_tides .or. ln_bdy_dyn_fla) then 
    265              igrd_start = 4 
     237         !                                   ! how many files are we to read in? 
     238         IF(ln_bdy_tides .OR. ln_bdy_dyn_fla)   igrd_start = 4 
     239         ! 
     240         IF(ln_bdy_tra_frs    ) THEN   ;   igrd_start = 1 
     241         ELSEIF(ln_bdy_dyn_frs) THEN   ;   igrd_start = 2 
    266242         ENDIF 
    267  
    268          IF(ln_bdy_tra_frs) then 
    269              igrd_start = 1 
    270          ELSEIF(ln_bdy_dyn_frs) then 
    271              igrd_start = 2 
    272          ENDIF 
    273  
    274          IF( ln_bdy_tra_frs ) then 
    275              igrd_end = 1 
    276          ENDIF 
    277  
    278          IF(ln_bdy_dyn_fla .or. ln_bdy_tides) THEN 
    279              igrd_end = 6 
    280          ELSEIF( ln_bdy_dyn_frs) THEN 
    281              igrd_end = 3 
     243         ! 
     244         IF( ln_bdy_tra_frs   )   igrd_end = 1 
     245         ! 
     246         IF(ln_bdy_dyn_fla .OR. ln_bdy_tides) THEN   ;   igrd_end = 6 
     247         ELSEIF( ln_bdy_dyn_frs             ) THEN   ;   igrd_end = 3 
    282248         ENDIF 
    283249 
     
    287253            IF(lwp) WRITE(numout,*) 'kdimsz : ',kdimsz 
    288254            ib_len = kdimsz(1) 
    289             IF( ib_len > jpbdta) CALL ctl_stop(          & 
    290                 'Boundary data array in file too long.', & 
    291                 'File :', TRIM(clfile(igrd)),            & 
    292                 'increase parameter jpbdta.' ) 
     255            IF( ib_len > jpbdta)   CALL ctl_stop(  'Boundary data array in file too long.',                  & 
     256                &                                  'File :', TRIM(clfile(igrd)),'increase parameter jpbdta.' ) 
    293257 
    294258            CALL iom_get( inum, jpdom_unknown, 'nbidta', zdta(1:ib_len,:) ) 
     
    298262            CALL iom_get( inum, jpdom_unknown, 'nbjdta', zdta(1:ib_len,:) ) 
    299263            DO ii = 1,ib_len 
    300               nbjdta(ii,igrd) = INT( zdta(ii,1) ) 
    301             END DO 
    302             CALL iom_get ( inum, jpdom_unknown, 'nbrdta', zdta(1:ib_len,:) ) 
     264               nbjdta(ii,igrd) = INT( zdta(ii,1) ) 
     265            END DO 
     266            CALL iom_get( inum, jpdom_unknown, 'nbrdta', zdta(1:ib_len,:) ) 
    303267            DO ii = 1,ib_len 
    304               nbrdta(ii,igrd) = INT( zdta(ii,1) ) 
     268               nbrdta(ii,igrd) = INT( zdta(ii,1) ) 
    305269            END DO 
    306270            CALL iom_close( inum ) 
    307271 
    308             ! Check that rimwidth in file is big enough for Frs case(barotropic is one): 
    309             IF( igrd < 4) then 
    310                 ibr_max = MAXVAL( nbrdta(:,igrd) ) 
    311                 IF(lwp) WRITE(numout,*) 
    312                 IF(lwp) WRITE(numout,*) ' Maximum rimwidth in file is ', ibr_max 
    313                 IF(lwp) WRITE(numout,*) ' nb_rimwidth from namelist is ', nb_rimwidth 
    314                 IF (ibr_max < nb_rimwidth) CALL ctl_stop( & 
    315                     'nb_rimwidth is larger than maximum rimwidth in file' ) 
     272            IF( igrd < 4) THEN            ! Check that rimwidth in file is big enough for Frs case(barotropic is one): 
     273               ibr_max = MAXVAL( nbrdta(:,igrd) ) 
     274               IF(lwp) WRITE(numout,*) 
     275               IF(lwp) WRITE(numout,*) ' Maximum rimwidth in file is ', ibr_max 
     276               IF(lwp) WRITE(numout,*) ' nb_rimwidth from namelist is ', nb_rimwidth 
     277               IF (ibr_max < nb_rimwidth)   CALL ctl_stop( 'nb_rimwidth is larger than maximum rimwidth in file' ) 
    316278            ENDIF !Check igrd < 4 
    317279            ! 
     
    329291 
    330292      DO igrd = igrd_start, igrd_end 
    331         icount  = 0 
    332         icountr = 0 
    333         nblen(igrd) = 0 
    334         nblenrim(igrd) = 0 
    335         nblendta(igrd) = 0 
    336         DO ir=1, nb_rimwidth 
    337           DO ib = 1, jpbdta 
    338           ! check if point is in local domain and equals ir 
    339             IF(  nbidta(ib,igrd) >= iw .AND. nbidta(ib,igrd) <= ie .AND.   & 
    340                & nbjdta(ib,igrd) >= is .AND. nbjdta(ib,igrd) <= in .AND.   & 
    341                & nbrdta(ib,igrd) == ir  ) THEN 
    342                ! 
    343                icount = icount  + 1 
    344                ! 
    345                IF( ir == 1 )   icountr = icountr+1 
     293         icount  = 0 
     294         icountr = 0 
     295         nblen   (igrd) = 0 
     296         nblenrim(igrd) = 0 
     297         nblendta(igrd) = 0 
     298         DO ir=1, nb_rimwidth 
     299            DO ib = 1, jpbdta 
     300               ! check if point is in local domain and equals ir 
     301               IF(  nbidta(ib,igrd) >= iw .AND. nbidta(ib,igrd) <= ie .AND.   & 
     302                  & nbjdta(ib,igrd) >= is .AND. nbjdta(ib,igrd) <= in .AND.   & 
     303                  & nbrdta(ib,igrd) == ir  ) THEN 
     304                  ! 
     305                  icount = icount  + 1 
     306                  ! 
     307                  IF( ir == 1 )   icountr = icountr+1 
    346308                  IF (icount > jpbdim) THEN 
    347309                     IF(lwp) WRITE(numout,*) 'bdy_ini: jpbdim too small' 
     
    364326      DO igrd = igrd_start, igrd_end 
    365327         DO ib = 1, nblen(igrd) 
    366             ! tanh formulation 
    367             nbw(ib,igrd) = 1.- TANH( FLOAT( nbr(ib,igrd) - 1 ) *0.5 ) 
    368             ! quadratic 
    369 !           nbw(ib,igrd) = (FLOAT(nb_rimwidth+1-nbr(ib,igrd))/FLOAT(nb_rimwidth))**2 
    370             ! linear 
    371 !           nbw(ib,igrd) =  FLOAT(nb_rimwidth+1-nbr(ib,igrd))/FLOAT(nb_rimwidth) 
     328            nbw(ib,igrd) = 1.- TANH( FLOAT( nbr(ib,igrd) - 1 ) *0.5 )                     ! tanh formulation 
     329!           nbw(ib,igrd) = (FLOAT(nb_rimwidth+1-nbr(ib,igrd))/FLOAT(nb_rimwidth))**2      ! quadratic 
     330!           nbw(ib,igrd) =  FLOAT(nb_rimwidth+1-nbr(ib,igrd))/FLOAT(nb_rimwidth)          ! linear 
    372331         END DO 
    373332      END DO  
     
    420379 
    421380      ! Lateral boundary conditions 
    422       CALL lbc_lnk( fmask        , 'F', 1. ) 
    423       CALL lbc_lnk( bdytmask(:,:), 'T', 1. ) 
    424       CALL lbc_lnk( bdyumask(:,:), 'U', 1. ) 
    425       CALL lbc_lnk( bdyvmask(:,:), 'V', 1. ) 
     381      CALL lbc_lnk( fmask        , 'F', 1. )   ;   CALL lbc_lnk( bdytmask(:,:), 'T', 1. ) 
     382      CALL lbc_lnk( bdyumask(:,:), 'U', 1. )   ;   CALL lbc_lnk( bdyvmask(:,:), 'V', 1. ) 
    426383 
    427384      IF( ln_bdy_vol .OR. ln_bdy_dyn_fla ) THEN      ! Indices and directions of rim velocity components 
     
    473430      ! Compute total lateral surface for volume correction: 
    474431      ! ---------------------------------------------------- 
    475   
    476432      bdysurftot = 0.e0  
    477433      IF( ln_bdy_vol ) THEN   
     
    491447               &                    * tmask_i(nbi(ib,igrd),nbj(ib,igrd)+1) 
    492448         END DO 
    493  
     449         ! 
    494450         IF( lk_mpp )   CALL mpp_sum( bdysurftot )      ! sum over the global domain 
    495451      END IF    
Note: See TracChangeset for help on using the changeset viewer.