source: trunk/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_oce.F90 @ 7753

Last change on this file since 7753 was 7753, checked in by mocavero, 4 years ago

Reverting trunk to remove OpenMP

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