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.
bdy_oce.F90 in branches/2014/dev_r4621_NOC4_BDY_VERT_INTERP/NEMOGCM/NEMO/OPA_SRC/BDY – NEMO

source: branches/2014/dev_r4621_NOC4_BDY_VERT_INTERP/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_oce.F90 @ 4694

Last change on this file since 4694 was 4694, checked in by jamesharle, 10 years ago

Update of fldread to handle depth information in BDY files and addition of an interpolation routine. Updated BDY code to handle T/S BDY interpolation on the fly. Conservative remapping of U/V still to be coded. Not compiled or test yet.

  • Property svn:keywords set to Id
File size: 10.1 KB
RevLine 
[911]1MODULE bdy_oce
2   !!======================================================================
3   !!                       ***  MODULE bdy_oce   ***
4   !! Unstructured Open Boundary Cond. :   define related variables
5   !!======================================================================
[1125]6   !! History :  1.0  !  2001-05  (J. Chanut, A. Sellar)  Original code
7   !!            3.0  !  2008-04  (NEMO team)  add in the reference version     
[2528]8   !!            3.3  !  2010-09  (D. Storkey) add ice boundary conditions
[3294]9   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge
[4292]10   !!            3.6  !  2012-01  (C. Rousset) add ice boundary conditions for lim3
[911]11   !!----------------------------------------------------------------------
[1125]12#if defined key_bdy 
[911]13   !!----------------------------------------------------------------------
[1125]14   !!   'key_bdy'                      Unstructured Open Boundary Condition
[911]15   !!----------------------------------------------------------------------
16   USE par_oce         ! ocean parameters
17   USE bdy_par         ! Unstructured boundary parameters
[2715]18   USE lib_mpp         ! distributed memory computing
[911]19
20   IMPLICIT NONE
21   PUBLIC
22
[3294]23   TYPE, PUBLIC ::   OBC_INDEX    !: Indices and weights which define the open boundary
24      INTEGER,          DIMENSION(jpbgrd) ::  nblen
25      INTEGER,          DIMENSION(jpbgrd) ::  nblenrim
26      INTEGER, POINTER, DIMENSION(:,:)   ::  nbi
27      INTEGER, POINTER, DIMENSION(:,:)   ::  nbj
28      INTEGER, POINTER, DIMENSION(:,:)   ::  nbr
29      INTEGER, POINTER, DIMENSION(:,:)   ::  nbmap
[4292]30      REAL(wp)   , POINTER, DIMENSION(:,:)   ::  nbw
31      REAL(wp)   , POINTER, DIMENSION(:,:)   ::  nbd
32      REAL(wp)   , POINTER, DIMENSION(:,:)   ::  nbdout
33      REAL(wp)   , POINTER, DIMENSION(:,:)   ::  flagu
34      REAL(wp)   , POINTER, DIMENSION(:,:)   ::  flagv
[3294]35   END TYPE OBC_INDEX
36
[4292]37   !! Logicals in OBC_DATA structure are true if the chosen algorithm requires this
38   !! field as external data. If true the data can come from external files
39   !! or model initial conditions. If false then no "external" data array
40   !! is required for this field.
41
[3294]42   TYPE, PUBLIC ::   OBC_DATA     !: Storage for external data
[4292]43      INTEGER,       DIMENSION(2)     ::  nread
44      LOGICAL                         ::  ll_ssh
45      LOGICAL                         ::  ll_u2d
46      LOGICAL                         ::  ll_v2d
47      LOGICAL                         ::  ll_u3d
48      LOGICAL                         ::  ll_v3d
49      LOGICAL                         ::  ll_tem
50      LOGICAL                         ::  ll_sal
51      REAL(wp), POINTER, DIMENSION(:)     ::  ssh
52      REAL(wp), POINTER, DIMENSION(:)     ::  u2d
53      REAL(wp), POINTER, DIMENSION(:)     ::  v2d
54      REAL(wp), POINTER, DIMENSION(:,:)   ::  u3d
55      REAL(wp), POINTER, DIMENSION(:,:)   ::  v3d
56      REAL(wp), POINTER, DIMENSION(:,:)   ::  tem
57      REAL(wp), POINTER, DIMENSION(:,:)   ::  sal
[3294]58#if defined key_lim2
[4292]59      LOGICAL                         ::  ll_frld
60      LOGICAL                         ::  ll_hicif
61      LOGICAL                         ::  ll_hsnif
62      REAL(wp), POINTER, DIMENSION(:)     ::  frld
63      REAL(wp), POINTER, DIMENSION(:)     ::  hicif
64      REAL(wp), POINTER, DIMENSION(:)     ::  hsnif
65#elif defined key_lim3
66      LOGICAL                         ::  ll_a_i
67      LOGICAL                         ::  ll_ht_i
68      LOGICAL                         ::  ll_ht_s
69      REAL, POINTER, DIMENSION(:,:)   ::  a_i   !: now ice leads fraction climatology
70      REAL, POINTER, DIMENSION(:,:)   ::  ht_i  !: Now ice  thickness climatology
71      REAL, POINTER, DIMENSION(:,:)   ::  ht_s  !: now snow thickness
[3294]72#endif
73   END TYPE OBC_DATA
74
[911]75   !!----------------------------------------------------------------------
76   !! Namelist variables
77   !!----------------------------------------------------------------------
[3294]78   CHARACTER(len=80), DIMENSION(jp_bdy) ::   cn_coords_file !: Name of bdy coordinates file
79   CHARACTER(len=80)                    ::   cn_mask_file   !: Name of bdy mask file
[1125]80   !
[3294]81   LOGICAL, DIMENSION(jp_bdy) ::   ln_coords_file           !: =T read bdy coordinates from file;
82   !                                                        !: =F read bdy coordinates from namelist
83   LOGICAL                    ::   ln_mask_file             !: =T read bdymask from file
84   LOGICAL                    ::   ln_vol                   !: =T volume correction             
[1125]85   !
[3294]86   INTEGER                    ::   nb_bdy                   !: number of open boundary sets
[4694]87   INTEGER                    ::   nb_jpk_bdy               ! Number of levels in the bdy data (set < 0 if consistent with planned run)
[3294]88   INTEGER, DIMENSION(jp_bdy) ::   nn_rimwidth              !: boundary rim width for Flow Relaxation Scheme
89   INTEGER                    ::   nn_volctl                !: = 0 the total volume will have the variability of the surface Flux E-P
90   !                                                        !  = 1 the volume will be constant during all the integration.
[4292]91   CHARACTER(len=20), DIMENSION(jp_bdy) ::   cn_dyn2d       ! Choice of boundary condition for barotropic variables (U,V,SSH)
92   INTEGER, DIMENSION(jp_bdy)           ::   nn_dyn2d_dta   !: = 0 use the initial state as bdy dta ;
[3294]93                                                            !: = 1 read it in a NetCDF file
94                                                            !: = 2 read tidal harmonic forcing from a NetCDF file
95                                                            !: = 3 read external data AND tidal harmonic forcing from NetCDF files
[4292]96   CHARACTER(len=20), DIMENSION(jp_bdy) ::   cn_dyn3d       ! Choice of boundary condition for baroclinic velocities
97   INTEGER, DIMENSION(jp_bdy)           ::   nn_dyn3d_dta   !: = 0 use the initial state as bdy dta ;
[3294]98                                                            !: = 1 read it in a NetCDF file
[4292]99   CHARACTER(len=20), DIMENSION(jp_bdy) ::   cn_tra         ! Choice of boundary condition for active tracers (T and S)
100   INTEGER, DIMENSION(jp_bdy)           ::   nn_tra_dta     !: = 0 use the initial state as bdy dta ;
[3294]101                                                            !: = 1 read it in a NetCDF file
[3651]102   LOGICAL, DIMENSION(jp_bdy) ::   ln_tra_dmp               !: =T Tracer damping
103   LOGICAL, DIMENSION(jp_bdy) ::   ln_dyn3d_dmp             !: =T Baroclinic velocity damping
[4292]104   REAL(wp),    DIMENSION(jp_bdy) ::   rn_time_dmp              !: Damping time scale in days
105   REAL(wp),    DIMENSION(jp_bdy) ::   rn_time_dmp_out          !: Damping time scale in days at radiation outflow points
[3651]106
[4333]107#if ( defined key_lim2 || defined key_lim3 )
[4608]108   CHARACTER(len=20), DIMENSION(jp_bdy) ::   cn_ice_lim       ! Choice of boundary condition for sea ice variables
[4333]109   INTEGER, DIMENSION(jp_bdy)           ::   nn_ice_lim_dta   !: = 0 use the initial state as bdy dta ;
[4292]110                                                              !: = 1 read it in a NetCDF file
[3294]111#endif
112   !
113   
[911]114   !!----------------------------------------------------------------------
115   !! Global variables
116   !!----------------------------------------------------------------------
[4292]117   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET ::   bdytmask   !: Mask defining computational domain at T-points
118   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET ::   bdyumask   !: Mask defining computational domain at U-points
119   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET ::   bdyvmask   !: Mask defining computational domain at V-points
[911]120
[3294]121   REAL(wp)                                    ::   bdysurftot !: Lateral surface of unstructured open boundary
122
[911]123   !!----------------------------------------------------------------------
[3294]124   !! open boundary data variables
[911]125   !!----------------------------------------------------------------------
126
[3294]127   INTEGER,  DIMENSION(jp_bdy)                     ::   nn_dta            !: =0 => *all* data is set to initial conditions
128                                                                          !: =1 => some data to be read in from data files
[3651]129   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   dta_global        !: workspace for reading in global data arrays (unstr.  bdy)
[4694]130   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   dta_global_z      !: workspace for reading in global depth arrays (unstr.  bdy)
[3651]131   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   dta_global2       !: workspace for reading in global data arrays (struct. bdy)
[4694]132   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   dta_global2_z     !: workspace for reading in global depth arrays (struct. bdy)
[4354]133!$AGRIF_DO_NOT_TREAT
[3294]134   TYPE(OBC_INDEX), DIMENSION(jp_bdy), TARGET      ::   idx_bdy           !: bdy indices (local process)
[4292]135   TYPE(OBC_DATA) , DIMENSION(jp_bdy), TARGET      ::   dta_bdy           !: bdy external data (local process)
[4354]136!$AGRIF_END_DO_NOT_TREAT
[2715]137   !!----------------------------------------------------------------------
138   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
139   !! $Id$
140   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
141   !!----------------------------------------------------------------------
142CONTAINS
143
144   FUNCTION bdy_oce_alloc()
145      !!----------------------------------------------------------------------
146      USE lib_mpp, ONLY: ctl_warn, mpp_sum
147      !
148      INTEGER :: bdy_oce_alloc
149      !!----------------------------------------------------------------------
150      !
[4292]151      ALLOCATE( bdytmask(jpi,jpj) , bdyumask(jpi,jpj), bdyvmask(jpi,jpj),     & 
[3294]152         &      STAT=bdy_oce_alloc )
[4354]153      !
154      ! Initialize masks
155      bdytmask(:,:) = 1._wp
156      bdyumask(:,:) = 1._wp
157      bdyvmask(:,:) = 1._wp
158      !
[2715]159      IF( lk_mpp             )   CALL mpp_sum ( bdy_oce_alloc )
160      IF( bdy_oce_alloc /= 0 )   CALL ctl_warn('bdy_oce_alloc: failed to allocate arrays.')
161      !
162   END FUNCTION bdy_oce_alloc
163
[911]164#else
165   !!----------------------------------------------------------------------
[1125]166   !!   Dummy module                NO Unstructured Open Boundary Condition
[911]167   !!----------------------------------------------------------------------
[2528]168   LOGICAL ::   ln_tides = .false.  !: =T apply tidal harmonic forcing along open boundaries
[911]169#endif
170
171   !!======================================================================
172END MODULE bdy_oce
[3294]173
Note: See TracBrowser for help on using the repository browser.