source: trunk/NEMOGCM/NEMO/OPA_SRC/OBC/obc_oce.F90 @ 10

Last change on this file since 10 was 10, checked in by cholod, 12 years ago

allow to start without obc restart

File size: 19.0 KB
Line 
1MODULE obc_oce
2   !!==============================================================================
3   !!                       ***  MODULE obc_oce   ***
4   !! Open Boundary Cond. :   define related variables
5   !!==============================================================================
6   !! history :  OPA  ! 1991-01 (CLIPPER)  Original code
7   !!   NEMO     1.0  ! 2002-02 (C. Talandier)  modules, F90
8   !!----------------------------------------------------------------------
9#if defined key_obc
10   !!----------------------------------------------------------------------
11   !!   'key_obc' :                                 Open Boundary Condition
12   !!----------------------------------------------------------------------
13   USE par_oce         ! ocean parameters
14   USE obc_par         ! open boundary condition parameters
15
16   IMPLICIT NONE
17   PUBLIC
18   
19   PUBLIC   obc_oce_alloc   ! called by obcini.F90 module
20
21   !!----------------------------------------------------------------------
22   !! open boundary variables
23   !!----------------------------------------------------------------------
24   !
25   !                                            !!* Namelist namobc: open boundary condition *
26   INTEGER           ::   nn_obcdta   = 0        !:  = 0 use the initial state as obc data
27   !                                             !   = 1 read obc data in obcxxx.dta files
28   CHARACTER(len=20) ::   cn_obcdta   = 'annual' !: set to annual  if obc datafile hold 1 year of data
29   !                                             !  set to monthly if obc datafile hold 1 month of data
30   LOGICAL           ::   ln_obc_clim = .true.   !:  obc data files are climatological
31   LOGICAL           ::   ln_obc_fla  = .false.  !:  Flather open boundary condition not used
32   LOGICAL           ::   ln_vol_cst  = .true.   !:  Conservation of the whole volume
33   REAL(wp)          ::   rn_dpein    =  1.      !: damping time scale for inflow at East open boundary
34   REAL(wp)          ::   rn_dpwin    =  1.      !:    "                      "   at West open boundary
35   REAL(wp)          ::   rn_dpsin    =  1.      !:    "                      "   at South open boundary
36   REAL(wp)          ::   rn_dpnin    =  1.      !:    "                      "   at North open boundary
37   REAL(wp)          ::   rn_dpeob    = 15.      !: damping time scale for the climatology at East open boundary
38   REAL(wp)          ::   rn_dpwob    = 15.      !:    "                           "       at West open boundary
39   REAL(wp)          ::   rn_dpsob    = 15.      !:    "                           "       at South open boundary
40   REAL(wp)          ::   rn_dpnob    = 15.      !:    "                           "       at North open boundary
41   REAL(wp)          ::   rn_volemp   =  1.      !: = 0 the total volume will have the variability of the
42   !                                             !      surface Flux E-P else (volemp = 1) the volume will be constant
43   !                                             !  = 1 the volume will be constant during all the integration.
44
45   !                                  !!! OLD non-DOCTOR name of namelist variables
46   INTEGER  ::   nbobc                 !: number of open boundaries ( 1=< nbobc =< 4 )
47   INTEGER  ::   nobc_dta              !:  = 0 use the initial state as obc data
48   REAL(wp) ::   rdpein                !: damping time scale for inflow at East open boundary
49   REAL(wp) ::   rdpwin                !:    "                      "   at West open boundary
50   REAL(wp) ::   rdpsin                !:    "                      "   at South open boundary
51   REAL(wp) ::   rdpnin                !:    "                      "   at North open boundary
52   REAL(wp) ::   rdpeob                !: damping time scale for the climatology at East open boundary
53   REAL(wp) ::   rdpwob                !:    "                           "       at West open boundary
54   REAL(wp) ::   rdpsob                !:    "                           "       at South open boundary
55   REAL(wp) ::   rdpnob                !:    "                           "       at North open boundary
56   REAL(wp) ::   volemp                !: = 0 the total volume will have the variability of the
57   CHARACTER(len=20) :: cffile
58
59
60   !!General variables for open boundaries:
61   !!--------------------------------------
62   LOGICAL ::   lfbceast, lfbcwest      !: logical flag for a fixed East and West open boundaries       
63   LOGICAL ::   lfbcnorth, lfbcsouth    !: logical flag for a fixed North and South open boundaries       
64   !                                    !  These logical flags are set to 'true' if damping time
65   !                                    !  scale are set to 0 in the namelist, for both inflow and outflow).
66
67!--> IND4 Begin
68!     Logical for restarting with radiative OBCs, but without an OBC restart restart.obc.output file.
69!     During the first 30 time steps, used FIXED boundary conditions.
70!     We modify : obcini, obctra, obcdyn
71   LOGICAL :: ln_obc_rstart = .TRUE. !: radiative OBCs, but do not read restart.obc.output
72!<-- IND4 End
73
74   REAL(wp), PUBLIC ::   obcsurftot       !: Total lateral surface of open boundaries
75   
76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: &  !:
77      obctmsk,            &  !: mask array identical to tmask, execpt along OBC where it is set to 0
78      !                      !  it used to calculate the cumulate flux E-P in the obcvol.F90 routine
79      obcumask, obcvmask     !: u-, v- Force filtering mask for the open
80      !                      !  boundary condition on grad D
81
82   !!--------------------
83   !! East open boundary:
84   !!--------------------
85   INTEGER ::   nie0  , nie1      !: do loop index in mpp case for jpieob
86   INTEGER ::   nie0p1, nie1p1    !: do loop index in mpp case for jpieob+1
87   INTEGER ::   nie0m1, nie1m1    !: do loop index in mpp case for jpieob-1
88   INTEGER ::   nje0  , nje1      !: do loop index in mpp case for jpjed, jpjef
89   INTEGER ::   nje0p1, nje1m1    !: do loop index in mpp case for jpjedp1,jpjefm1
90   INTEGER ::   nje1m2, nje0m1    !: do loop index in mpp case for jpjefm1-1,jpjed
91
92   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::   &  !:
93      sshfoe,           & !: now climatology of the east boundary sea surface height
94      ubtfoe,vbtfoe       !: now climatology of the east boundary barotropic transport
95     
96   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   &  !:
97      ufoe, vfoe,       & !: now climatology of the east boundary velocities
98      tfoe, sfoe,       & !: now climatology of the east boundary temperature and salinity
99      uclie               !: baroclinic componant of the zonal velocity after radiation
100      !                   ! in the obcdyn.F90 routine
101
102   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sshfoe_b   !: east boundary ssh correction averaged over the barotropic loop
103      !                                            !  (if Flather's algoritm applied at open boundary)
104
105   !!-------------------------------
106   !! Arrays for radiative East OBC:
107   !!-------------------------------
108   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   uebnd, vebnd      !: baroclinic u & v component of the velocity over 3 rows
109      !                                                    !  and 3 time step (now, before, and before before)
110   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   tebnd, sebnd      !: East boundary temperature and salinity over 2 rows
111      !                                                    !  and 2 time step (now and before)
112   REAL(wp), ALLOCATABLE, SAVE,     DIMENSION(:,:) ::   u_cxebnd, v_cxebnd    !: Zonal component of the phase speed ratio computed with
113      !                                                    !  radiation of u and v velocity (respectively) at the
114      !                                                    !  east open boundary (u_cxebnd = cx rdt )
115   REAL(wp), ALLOCATABLE, SAVE,     DIMENSION(:,:) ::   uemsk, vemsk, temsk   !: 2D mask for the East OB
116
117   ! Note that those arrays are optimized for mpp case
118   ! (hence the dimension jpj is the size of one processor subdomain)
119
120   !!--------------------
121   !! West open boundary
122   !!--------------------
123   INTEGER ::   niw0  , niw1       !: do loop index in mpp case for jpiwob
124   INTEGER ::   niw0p1, niw1p1     !: do loop index in mpp case for jpiwob+1
125   INTEGER ::   njw0  , njw1       !: do loop index in mpp case for jpjwd, jpjwf
126   INTEGER ::   njw0p1, njw1m1     !: do loop index in mpp case for jpjwdp1,jpjwfm1
127   INTEGER ::   njw1m2, njw0m1     !: do loop index in mpp case for jpjwfm2,jpjwd
128
129   REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:) ::   &  !:
130      sshfow,           & !: now climatology of the west boundary sea surface height
131      ubtfow,vbtfow       !: now climatology of the west boundary barotropic transport
132
133   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   &  !:
134      ufow, vfow,       & !: now climatology of the west velocities
135      tfow, sfow,       & !: now climatology of the west temperature and salinity
136      ucliw               !: baroclinic componant of the zonal velocity after the radiation
137      !                   !  in the obcdyn.F90 routine
138
139   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sshfow_b    !: west boundary ssh correction averaged over the barotropic loop
140      !                                          !  (if Flather's algoritm applied at open boundary)
141
142   !!-------------------------------
143   !! Arrays for radiative West OBC
144   !!-------------------------------
145   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   uwbnd, vwbnd     !: baroclinic u & v components of the velocity over 3 rows
146      !                                                   !  and 3 time step (now, before, and before before)
147   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   twbnd, swbnd     !: west boundary temperature and salinity over 2 rows and
148      !                                                   !  2 time step (now and before)
149   REAL(wp), ALLOCATABLE, SAVE,     DIMENSION(:,:) ::   u_cxwbnd, v_cxwbnd   !: Zonal component of the phase speed ratio computed with
150      !                                                   !  radiation of zonal and meridional velocity (respectively)
151      !                                                   !  at the west open boundary (u_cxwbnd = cx rdt )
152   REAL(wp), ALLOCATABLE, SAVE,     DIMENSION(:,:) ::   uwmsk, vwmsk, twmsk  !: 2D mask for the West OB
153
154   ! Note that those arrays are optimized for mpp case
155   ! (hence the dimension jpj is the size of one processor subdomain)
156
157   !!---------------------
158   !! North open boundary
159   !!---------------------
160   INTEGER ::   nin0  , nin1       !: do loop index in mpp case for jpind, jpinf
161   INTEGER ::   nin0p1, nin1m1     !: do loop index in mpp case for jpindp1, jpinfm1
162   INTEGER ::   nin1m2, nin0m1     !: do loop index in mpp case for jpinfm1-1,jpind
163   INTEGER ::   njn0  , njn1       !: do loop index in mpp case for jpnob
164   INTEGER ::   njn0p1, njn1p1     !: do loop index in mpp case for jpnob+1
165   INTEGER ::   njn0m1, njn1m1     !: do loop index in mpp case for jpnob-1
166
167   REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:) ::   &  !:
168      sshfon,           & !: now climatology of the north boundary sea surface height
169      ubtfon,vbtfon       !: now climatology of the north boundary barotropic transport
170
171   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   &    !:
172      ufon, vfon,       & !: now climatology of the north boundary velocities
173      tfon, sfon,       & !: now climatology of the north boundary temperature and salinity
174      vclin               !: baroclinic componant of the meridian velocity after the radiation
175      !                   !  in yhe obcdyn.F90 routine
176
177   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sshfon_b      !: north boundary ssh correction averaged over the barotropic loop
178      !                                            !  (if Flather's algoritm applied at open boundary)
179
180   !!--------------------------------
181   !! Arrays for radiative North OBC
182   !!--------------------------------
183   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   unbnd, vnbnd      !: baroclinic u & v components of the velocity over 3
184      !                                                    !  rows and 3 time step (now, before, and before before)
185   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   tnbnd, snbnd      !: north boundary temperature and salinity over
186      !                                                    !  2 rows and 2 time step (now and before)
187   REAL(wp), ALLOCATABLE, SAVE,     DIMENSION(:,:) ::   u_cynbnd, v_cynbnd    !: Meridional component of the phase speed ratio compu-
188      !                                                    !  ted with radiation of zonal and meridional velocity
189      !                                                    !  (respectively) at the north OB (u_cynbnd = cx rdt )
190   REAL(wp), ALLOCATABLE, SAVE,     DIMENSION(:,:) ::   unmsk, vnmsk, tnmsk   !: 2D mask for the North OB
191
192   ! Note that those arrays are optimized for mpp case
193   ! (hence the dimension jpj is the size of one processor subdomain)
194   
195   !!---------------------
196   !! South open boundary
197   !!---------------------
198   INTEGER ::   nis0  , nis1       !: do loop index in mpp case for jpisd, jpisf
199   INTEGER ::   nis0p1, nis1m1     !: do loop index in mpp case for jpisdp1, jpisfm1
200   INTEGER ::   nis1m2, nis0m1     !: do loop index in mpp case for jpisfm1-1,jpisd
201   INTEGER ::   njs0  , njs1       !: do loop index in mpp case for jpsob
202   INTEGER ::   njs0p1, njs1p1     !: do loop index in mpp case for jpsob+1
203
204   REAL(wp), ALLOCATABLE, SAVE,   DIMENSION(:) ::    &   !:
205      sshfos,           & !: now climatology of the south boundary sea surface height
206      ubtfos,vbtfos       !: now climatology of the south boundary barotropic transport
207
208   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::    &   !:
209      ufos, vfos,       & !: now climatology of the south boundary velocities
210      tfos, sfos,       & !: now climatology of the south boundary temperature and salinity
211      vclis               !: baroclinic componant of the meridian velocity after the radiation
212      !                   !  in the obcdyn.F90 routine
213
214   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sshfos_b     !: south boundary ssh correction averaged over the barotropic loop
215      !                                           !  (if Flather's algoritm applied at open boundary)
216
217   !!--------------------------------
218   !! Arrays for radiative South OBC   (computed by the forward time step in dynspg)
219   !!--------------------------------
220   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   usbnd, vsbnd     !: baroclinic u & v components of the velocity over 3
221      !                                                   !  rows and 3 time step (now, before, and before before)
222   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   tsbnd, ssbnd     !: south boundary temperature and salinity over
223      !                                                   !  2 rows and 2 time step (now and before)
224   REAL(wp), ALLOCATABLE, SAVE,     DIMENSION(:,:) ::   u_cysbnd, v_cysbnd   !: Meridional component of the phase speed ratio
225      !                                                   !  computed with radiation of zonal and meridional velocity
226      !                                                   !  (repsectively) at the south OB (u_cynbnd = cx rdt )
227   REAL(wp), ALLOCATABLE, SAVE,     DIMENSION(:,:) ::   usmsk, vsmsk, tsmsk  !: 2D mask for the South OB
228
229   !!----------------------------------------------------------------------
230   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
231   !! $Id: obc_oce.F90 2715 2011-03-30 15:58:35Z rblod $
232   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
233   !!----------------------------------------------------------------------
234CONTAINS
235
236   INTEGER FUNCTION obc_oce_alloc()
237      !!----------------------------------------------------------------------
238      !!               ***  FUNCTION obc_oce_alloc  ***
239      !!----------------------------------------------------------------------
240
241      ALLOCATE(                                                               &
242              !! East open boundary
243              obctmsk(jpi,jpj), obcumask(jpi,jpj), obcvmask(jpi,jpj),        &
244              sshfoe(jpjed:jpjef), ubtfoe(jpjed:jpjef), vbtfoe(jpjed:jpjef), &
245              ufoe(jpj,jpk), vfoe(jpj,jpk), tfoe(jpj,jpk), sfoe(jpj,jpk),    &
246              uclie(jpj,jpk), sshfoe_b(jpjed:jpjef,jpj),                     &
247              !! Arrays for radiative East OBC
248              uebnd(jpj,jpk,3,3), vebnd(jpj,jpk,3,3) ,                       &
249              tebnd(jpj,jpk,2,2), sebnd(jpj,jpk,2,2),                        &
250              u_cxebnd(jpj,jpk), v_cxebnd(jpj,jpk),                          &
251              uemsk(jpj,jpk), vemsk(jpj,jpk), temsk(jpj,jpk),                &
252              !! West open boundary
253              sshfow(jpjwd:jpjwf), ubtfow(jpjwd:jpjwf), vbtfow(jpjwd:jpjwf), &
254              ufow(jpj,jpk), vfow(jpj,jpk), tfow(jpj,jpk),                   &
255              sfow(jpj,jpk), ucliw(jpj,jpk), sshfow_b(jpjwd:jpjwf,jpj),      &
256              !! Arrays for radiative West OBC
257              uwbnd(jpj,jpk,3,3), vwbnd(jpj,jpk,3,3),                        &
258              twbnd(jpj,jpk,2,2), swbnd(jpj,jpk,2,2),                        &
259              u_cxwbnd(jpj,jpk), v_cxwbnd(jpj,jpk),                          &
260              uwmsk(jpj,jpk), vwmsk(jpj,jpk), twmsk(jpj,jpk),                &
261              !! North open boundary
262              sshfon(jpind:jpinf), ubtfon(jpind:jpinf), vbtfon(jpind:jpinf), &
263              ufon(jpi,jpk), vfon(jpi,jpk), tfon(jpi,jpk),                   &
264              sfon(jpi,jpk), vclin(jpi,jpk), sshfon_b(jpind:jpinf,jpj),      &
265              !! Arrays for radiative North OBC
266              unbnd(jpi,jpk,3,3), vnbnd(jpi,jpk,3,3),                        &
267              tnbnd(jpi,jpk,2,2), snbnd(jpi,jpk,2,2),                        &
268              u_cynbnd(jpi,jpk), v_cynbnd(jpi,jpk),                          &
269              unmsk(jpi,jpk), vnmsk(jpi,jpk), tnmsk (jpi,jpk),               &
270              !! South open boundary
271              sshfos(jpisd:jpisf), ubtfos(jpisd:jpisf), vbtfos(jpisd:jpisf), &
272              ufos(jpi,jpk), vfos(jpi,jpk), tfos(jpi,jpk),                   &
273              sfos(jpi,jpk), vclis(jpi,jpk),                                 &
274              sshfos_b(jpisd:jpisf,jpj),                                     &
275              !! Arrays for radiative South OBC
276              usbnd(jpi,jpk,3,3), vsbnd(jpi,jpk,3,3),                        &
277              tsbnd(jpi,jpk,2,2), ssbnd(jpi,jpk,2,2),                        &
278              u_cysbnd(jpi,jpk), v_cysbnd(jpi,jpk),                          &
279              usmsk(jpi,jpk), vsmsk(jpi,jpk), tsmsk(jpi,jpk),                &
280              !!
281              STAT=obc_oce_alloc )
282      !
283   END FUNCTION obc_oce_alloc
284   
285#else
286   !!----------------------------------------------------------------------
287   !!   Default option         Empty module                          No OBC
288   !!----------------------------------------------------------------------
289#endif
290
291   !!======================================================================
292END MODULE obc_oce
Note: See TracBrowser for help on using the repository browser.