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.
obcdta.F90 in branches/2011/UKMO_MERCATOR_obc_bdy_merge/NEMOGCM/NEMO/OPA_SRC/OBC – NEMO

source: branches/2011/UKMO_MERCATOR_obc_bdy_merge/NEMOGCM/NEMO/OPA_SRC/OBC/obcdta.F90 @ 2797

Last change on this file since 2797 was 2797, checked in by davestorkey, 13 years ago

Delete BDY module and first implementation of new OBC module.

  1. Initial restructuring.
  2. Use fldread to read open boundary data.
  • Property svn:keywords set to Id
File size: 19.6 KB
Line 
1MODULE obcdta
2   !!======================================================================
3   !!                       ***  MODULE obcdta  ***
4   !! Open boundary data : read the data for the unstructured open boundaries.
5   !!======================================================================
6   !! History :  1.0  !  2005-01  (J. Chanut, A. Sellar)  Original code
7   !!             -   !  2007-01  (D. Storkey) Update to use IOM module
8   !!             -   !  2007-07  (D. Storkey) add obc_dta_fla
9   !!            3.0  !  2008-04  (NEMO team)  add in the reference version
10   !!            3.3  !  2010-09  (E.O'Dea) modifications for Shelf configurations
11   !!            3.3  !  2010-09  (D.Storkey) add ice boundary conditions
12   !!            3.4  ????????????????
13   !!----------------------------------------------------------------------
14#if defined key_obc
15   !!----------------------------------------------------------------------
16   !!   'key_obc'                     Open Boundary Conditions
17   !!----------------------------------------------------------------------
18   !!    obc_dta        : read external data along open boundaries from file
19   !!    obc_dta_init   : initialise arrays etc for reading of external data
20   !!----------------------------------------------------------------------
21   USE oce             ! ocean dynamics and tracers
22   USE dom_oce         ! ocean space and time domain
23   USE phycst          ! physical constants
24   USE obc_oce         ! ocean open boundary conditions
25   USE obctides        ! tidal forcing at boundaries
26   USE fldread         ! read input fields
27   USE iom             ! IOM library
28   USE in_out_manager  ! I/O logical units
29#if defined key_lim2
30   USE ice_2
31#endif
32
33   IMPLICIT NONE
34   PRIVATE
35
36   PUBLIC   obc_dta          ! routine called by step.F90 and dynspg_ts.F90
37   PUBLIC   obc_dta_init     ! routine called by nemogcm.F90
38
39   INTEGER, ALLOCATABLE, DIMENSION(:)   ::   nb_obc_fld        ! Number of fields to update for each boundary set.
40   INTEGER                              ::   nb_obc_fld_sum    ! Total number of fields to update for all boundary sets.
41
42   TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:), TARGET ::   bf        ! structure of input fields (file informations, fields read)
43
44   TYPE(MAP_POINTER), ALLOCATABLE, DIMENSION(:) :: nbmap_ptr   ! array of pointers to nbmap
45
46   !!----------------------------------------------------------------------
47   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
48   !! $Id$
49   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
50   !!----------------------------------------------------------------------
51CONTAINS
52
53      SUBROUTINE obc_dta( kt, jit )
54      !!----------------------------------------------------------------------
55      !!                   ***  SUBROUTINE obc_dta  ***
56      !!                   
57      !! ** Purpose :   Update external data for open boundary conditions
58      !!
59      !! ** Method  :   Use fldread.F90
60      !!               
61      !!----------------------------------------------------------------------
62      INTEGER, INTENT( in )           ::   kt    ! ocean time-step index
63      INTEGER, INTENT( in ), OPTIONAL ::   jit   ! subcycle time-step index (for timesplitting option)
64      !!
65      INTEGER     ::  ib_obc, jfld, jstart, jend            ! local indices
66      INTEGER, POINTER, DIMENSION(:)  ::   nblen, nblenrim  ! short cuts
67      !!
68      !!---------------------------------------------------------------------------
69
70      ! for nn_dtactl = 0, initialise data arrays once for all
71      ! from initial conditions
72      !-------------------------------------------------------
73      IF( kt .eq. 1 .and. .not. PRESENT(jit) ) THEN
74
75         DO ib_obc = 1, nb_obc
76            IF( nn_dtactl(ib_obc) .eq. 0 ) THEN
77
78               !!! TO BE DONE !!!
79
80            ENDIF
81         ENDDO
82
83      ENDIF
84
85      ! for nn_dtactl = 1, update external data from files
86      !---------------------------------------------------
87     
88      jstart = 1
89      DO ib_obc = 1, nb_obc   
90         IF( nn_dtactl(ib_obc) .eq. 1 ) THEN
91     
92            IF( PRESENT(jit) ) THEN
93               ! Update barotropic boundary conditions only
94               ! jit is optional argument for fld_read
95               IF( nn_dyn2d(ib_obc) .gt. 0 ) THEN
96                  jend = jstart + 2
97                  CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend), jit=jit )
98               ENDIF
99            ELSE
100               jend = jstart + nb_obc_fld(ib_obc) - 1
101               CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend ), map=nbmap_ptr(jstart:jend), timeshift=1 )
102            ENDIF
103            jstart = jend+1
104
105         END IF ! nn_dtactl(ib_obc) = 1
106      END DO  ! ib_obc
107
108      END SUBROUTINE obc_dta
109
110
111      SUBROUTINE obc_dta_init
112      !!----------------------------------------------------------------------
113      !!                   ***  SUBROUTINE obc_dta_init  ***
114      !!                   
115      !! ** Purpose :   Initialise arrays for reading of external data
116      !!                for open boundary conditions
117      !!
118      !! ** Method  :   Use fldread.F90
119      !!               
120      !!----------------------------------------------------------------------
121      INTEGER     ::  ib_obc, jfld, jstart, jend, ierror  ! local indices
122      !!
123      CHARACTER(len=100)                     ::   cn_dir        ! Root directory for location of data files
124      CHARACTER(len=100), DIMENSION(nb_obc)  ::   cn_dir_array  ! Root directory for location of data files
125      INTEGER                                ::   ilen_global   ! Max length required for global obc dta arrays
126      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   ilen1, ilen3  ! size of 1st and 3rd dimensions of local arrays
127      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   iobc           ! obc set for a particular jfld
128      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   igrid         ! index for grid type (1,2,3 = T,U,V)
129      INTEGER, POINTER, DIMENSION(:)         ::   nblen, nblenrim  ! short cuts
130      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   blf_i         !  array of namelist information structures
131      TYPE(FLD_N) ::   bn_tem, bn_sal, bn_u3d, bn_v3d   !
132      TYPE(FLD_N) ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read
133#if defined key_lim2
134      TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif      !
135#endif
136      NAMELIST/namobc_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d 
137#if defined key_lim2
138      NAMELIST/namobc_dta/ bn_frld, bn_hicif, bn_hsnif
139#endif
140      !!---------------------------------------------------------------------------
141
142      ! Work out how many fields there are to read in and allocate arrays
143      ! -----------------------------------------------------------------
144      ALLOCATE( nb_obc_fld(nb_obc) )
145      nb_obc_fld(:) = 0
146      DO ib_obc = 1, nb_obc         
147         IF( nn_dtactl(ib_obc) .eq. 1 ) THEN
148            IF( nn_dyn2d(ib_obc) .gt. 0 ) THEN
149               nb_obc_fld(ib_obc) = nb_obc_fld(ib_obc) + 3
150            ENDIF
151            IF( nn_dyn3d(ib_obc) .gt. 0 ) THEN
152               nb_obc_fld(ib_obc) = nb_obc_fld(ib_obc) + 2
153            ENDIF
154            IF( nn_tra(ib_obc) .gt. 0 ) THEN
155               nb_obc_fld(ib_obc) = nb_obc_fld(ib_obc) + 2
156            ENDIF
157#if defined key_lim2
158            IF( nn_ice_lim2(ib_obc) .gt. 0 ) THEN
159               nb_obc_fld(ib_obc) = nb_obc_fld(ib_obc) + 3
160            ENDIF
161#endif               
162         ENDIF
163      ENDDO           
164
165      nb_obc_fld_sum = SUM( nb_obc_fld )
166
167      ALLOCATE( bf(nb_obc_fld_sum), STAT=ierror )
168      IF( ierror > 0 ) THEN   
169         CALL ctl_stop( 'obc_dta: unable to allocate bf structure' )   ;   RETURN 
170      ENDIF
171      ALLOCATE( blf_i(nb_obc_fld_sum), STAT=ierror )
172      IF( ierror > 0 ) THEN   
173         CALL ctl_stop( 'obc_dta: unable to allocate blf_i structure' )   ;   RETURN 
174      ENDIF
175      ALLOCATE( nbmap_ptr(nb_obc_fld_sum), STAT=ierror )
176      IF( ierror > 0 ) THEN   
177         CALL ctl_stop( 'obc_dta: unable to allocate nbmap_ptr structure' )   ;   RETURN 
178      ENDIF
179      ALLOCATE( ilen1(nb_obc_fld_sum), ilen3(nb_obc_fld_sum) ) 
180      ALLOCATE( iobc(nb_obc_fld_sum) ) 
181      ALLOCATE( igrid(nb_obc_fld_sum) ) 
182
183      ! Read namelists
184      ! --------------
185      REWIND(numnam)
186      jfld = 0 
187      DO ib_obc = 1, nb_obc         
188         IF( nn_dtactl(ib_obc) .eq. 1 ) THEN
189            ! set file information
190            cn_dir = './'        ! directory in which the model is executed
191            ! ... default values (NB: frequency positive => hours, negative => months)
192            !                    !  file       ! frequency !  variable        ! time intep !  clim   ! 'yearly' or ! weights  ! rotation  !
193            !                    !  name       !  (hours)  !   name           !   (T/F)    !  (T/F)  !  'monthly'  ! filename ! pairs     !
194            bn_ssh     = FLD_N(  'obc_ssh'     ,    24     ,  'sossheig'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
195            bn_u2d     = FLD_N(  'obc_vel2d_u' ,    24     ,  'vobtcrtx'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
196            bn_v2d     = FLD_N(  'obc_vel2d_v' ,    24     ,  'vobtcrty'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
197            bn_u3d     = FLD_N(  'obc_vel3d_u' ,    24     ,  'vozocrtx'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
198            bn_v3d     = FLD_N(  'obc_vel3d_v' ,    24     ,  'vomecrty'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
199            bn_tem     = FLD_N(  'obc_tem'     ,    24     ,  'votemper'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
200            bn_sal     = FLD_N(  'obc_sal'     ,    24     ,  'vosaline'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
201#if defined key_lim2
202            bn_frld    = FLD_N(  'obc_frld'    ,    24     ,  'ildsconc'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
203            bn_hicif   = FLD_N(  'obc_hicif'   ,    24     ,  'iicethic'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
204            bn_hsnif   = FLD_N(  'obc_hsnif'   ,    24     ,  'isnothic'    ,  .false.   , .false. ,   'yearly'  , ''       , ''        )
205#endif
206
207            ! Important NOT to rewind here.
208            READ( numnam, namobc_dta )
209
210            cn_dir_array(ib_obc) = cn_dir
211
212            nblen => idx_obc(ib_obc)%nblen
213            nblenrim => idx_obc(ib_obc)%nblenrim
214
215            ! Only read in necessary fields for this set.
216            ! Important that barotropic variables come first.
217            IF( nn_dyn2d(ib_obc) .gt. 0 ) THEN
218
219               jfld = jfld + 1
220               blf_i(jfld) = bn_ssh
221               iobc(jfld) = ib_obc
222               igrid(jfld) = 1
223               IF( nn_dyn2d(ib_obc) .eq. jp_frs ) THEN
224                  ilen1(jfld) = nblen(igrid(jfld))
225               ELSE
226                  ilen1(jfld) = nblenrim(igrid(jfld))
227               ENDIF
228               ilen3(jfld) = 1
229
230               jfld = jfld + 1
231               blf_i(jfld) = bn_u2d
232               iobc(jfld) = ib_obc
233               igrid(jfld) = 2
234               IF( nn_dyn2d(ib_obc) .eq. jp_frs ) THEN
235                  ilen1(jfld) = nblen(igrid(jfld))
236               ELSE
237                  ilen1(jfld) = nblenrim(igrid(jfld))
238               ENDIF
239               ilen3(jfld) = 1
240
241               jfld = jfld + 1
242               blf_i(jfld) = bn_v2d
243               iobc(jfld) = ib_obc
244               igrid(jfld) = 3
245               IF( nn_dyn2d(ib_obc) .eq. jp_frs ) THEN
246                  ilen1(jfld) = nblen(igrid(jfld))
247               ELSE
248                  ilen1(jfld) = nblenrim(igrid(jfld))
249               ENDIF
250               ilen3(jfld) = 1
251
252            ENDIF
253
254            ! baroclinic velocities
255            IF( nn_dyn3d(ib_obc) .gt. 0 ) THEN
256
257               jfld = jfld + 1
258               blf_i(jfld) = bn_u3d
259               iobc(jfld) = ib_obc
260               igrid(jfld) = 2
261               IF( nn_dyn3d(ib_obc) .eq. jp_frs ) THEN
262                  ilen1(jfld) = nblen(igrid(jfld))
263               ELSE
264                  ilen1(jfld) = nblenrim(igrid(jfld))
265               ENDIF
266               ilen3(jfld) = jpk
267
268               jfld = jfld + 1
269               blf_i(jfld) = bn_v3d
270               iobc(jfld) = ib_obc
271               igrid(jfld) = 3
272               IF( nn_dyn3d(ib_obc) .eq. jp_frs ) THEN
273                  ilen1(jfld) = nblen(igrid(jfld))
274               ELSE
275                  ilen1(jfld) = nblenrim(igrid(jfld))
276               ENDIF
277               ilen3(jfld) = jpk
278
279            ENDIF
280
281            ! temperature and salinity
282            IF( nn_tra(ib_obc) .gt. 0 ) THEN
283
284               jfld = jfld + 1
285               blf_i(jfld) = bn_tem
286               iobc(jfld) = ib_obc
287               igrid(jfld) = 1
288               IF( nn_tra(ib_obc) .eq. jp_frs ) THEN
289                  ilen1(jfld) = nblen(igrid(jfld))
290               ELSE
291                  ilen1(jfld) = nblenrim(igrid(jfld))
292               ENDIF
293               ilen3(jfld) = jpk
294
295               jfld = jfld + 1
296               blf_i(jfld) = bn_sal
297               iobc(jfld) = ib_obc
298               igrid(jfld) = 1
299               IF( nn_tra(ib_obc) .eq. jp_frs ) THEN
300                  ilen1(jfld) = nblen(igrid(jfld))
301               ELSE
302                  ilen1(jfld) = nblenrim(igrid(jfld))
303               ENDIF
304               ilen3(jfld) = jpk
305
306            ENDIF
307
308#if defined key_lim2
309            ! sea ice
310            IF( nn_tra(ib_obc) .gt. 0 ) THEN
311
312               jfld = jfld + 1
313               blf_i(jfld) = bn_frld
314               iobc(jfld) = ib_obc
315               igrid(jfld) = 1
316               IF( nn_ice_lim2(ib_obc) .eq. jp_frs ) THEN
317                  ilen1(jfld) = nblen(igrid(jfld))
318               ELSE
319                  ilen1(jfld) = nblenrim(igrid(jfld))
320               ENDIF
321               ilen3(jfld) = 1
322
323               jfld = jfld + 1
324               blf_i(jfld) = bn_hicif
325               iobc(jfld) = ib_obc
326               igrid(jfld) = 1
327               IF( nn_ice_lim2(ib_obc) .eq. jp_frs ) THEN
328                  ilen1(jfld) = nblen(igrid(jfld))
329               ELSE
330                  ilen1(jfld) = nblenrim(igrid(jfld))
331               ENDIF
332               ilen3(jfld) = 1
333
334               jfld = jfld + 1
335               blf_i(jfld) = bn_hsnif
336               iobc(jfld) = ib_obc
337               igrid(jfld) = 1
338               IF( nn_ice_lim2(ib_obc) .eq. jp_frs ) THEN
339                  ilen1(jfld) = nblen(igrid(jfld))
340               ELSE
341                  ilen1(jfld) = nblenrim(igrid(jfld))
342               ENDIF
343               ilen3(jfld) = 1
344
345            ENDIF
346#endif
347         ENDIF ! nn_dtactl .eq. 1
348      ENDDO ! ib_obc
349
350      IF( jfld .ne. nb_obc_fld_sum ) THEN
351         CALL ctl_stop( 'obc_dta: error in initialisation: jpfld .ne. nb_obc_fld_sum' )   ;   RETURN 
352      ENDIF
353
354      DO jfld = 1, nb_obc_fld_sum
355         ALLOCATE( bf(jfld)%fnow(ilen1(jfld),1,ilen3(jfld)) )
356         IF( blf_i(jfld)%ln_tint ) ALLOCATE( bf(jfld)%fdta(ilen1(jfld),1,ilen3(jfld),2) )
357         nbmap_ptr(jfld)%ptr => idx_obc(iobc(jfld))%nbmap(:,igrid(jfld))
358      ENDDO
359
360      ! fill bf with blf_i and control print
361      !-------------------------------------
362      jstart = 1
363      DO ib_obc = 1, nb_obc
364         jend = jstart + nb_obc_fld(ib_obc) - 1
365         CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(ib_obc), 'obc_dta', 'open boundary conditions', 'namobc_dta' )
366         jstart = jend + 1
367      ENDDO
368
369      ! Initialise local boundary data arrays
370      ! nn_dtactl=0 : allocate space - will be filled from initial conditions later
371      ! nn_dtactl=1 : point to "fnow" arrays
372      !-------------------------------------
373
374      jfld = 0
375      DO ib_obc=1, nb_obc
376
377         nblen => idx_obc(ib_obc)%nblen
378         nblenrim => idx_obc(ib_obc)%nblenrim
379
380         IF( nn_dtactl(ib_obc) .eq. 0 ) THEN
381               
382            ! nn_dtactl = 0
383            ! Allocate space
384            !---------------
385            IF (nn_dyn2d(ib_obc) .gt. 0) THEN
386               IF( nn_dyn2d(ib_obc) .eq. jp_frs ) THEN
387                  ilen1(1) = nblen(1)
388                  ilen1(2) = nblen(2)
389                  ilen1(3) = nblen(3)
390               ELSE
391                  ilen1(1) = nblenrim(1)
392                  ilen1(2) = nblenrim(2)
393                  ilen1(3) = nblenrim(3)
394               ENDIF
395               ALLOCATE( dta_obc(ib_obc)%ssh(ilen1(1)) )
396               ALLOCATE( dta_obc(ib_obc)%u2d(ilen1(2)) )
397               ALLOCATE( dta_obc(ib_obc)%v2d(ilen1(3)) )
398            ENDIF
399            IF (nn_dyn3d(ib_obc) .gt. 0) THEN
400               IF( nn_dyn3d(ib_obc) .eq. jp_frs ) THEN
401                  ilen1(2) = nblen(2)
402                  ilen1(3) = nblen(3)
403               ELSE
404                  ilen1(2) = nblenrim(2)
405                  ilen1(3) = nblenrim(3)
406               ENDIF
407               ALLOCATE( dta_obc(ib_obc)%u3d(ilen1(2),jpk) )
408               ALLOCATE( dta_obc(ib_obc)%v3d(ilen1(3),jpk) )
409            ENDIF
410            IF (nn_tra(ib_obc) .gt. 0) THEN
411               IF( nn_tra(ib_obc) .eq. jp_frs ) THEN
412                  ilen1(1) = nblen(1)
413               ELSE
414                  ilen1(1) = nblenrim(1)
415               ENDIF
416               ALLOCATE( dta_obc(ib_obc)%tem(ilen1(1),jpk) )
417               ALLOCATE( dta_obc(ib_obc)%sal(ilen1(1),jpk) )
418            ENDIF
419#if defined key_lim2
420            IF (nn_ice_lim2(ib_obc) .gt. 0) THEN
421               IF( nn_ice_lim2(ib_obc) .eq. jp_frs ) THEN
422                  ilen1(1) = nblen(igrid(jfld))
423               ELSE
424                  ilen1(1) = nblenrim(igrid(jfld))
425               ENDIF
426               ALLOCATE( dta_obc(ib_obc)%ssh(ilen1(1)) )
427               ALLOCATE( dta_obc(ib_obc)%u2d(ilen1(1)) )
428               ALLOCATE( dta_obc(ib_obc)%v2d(ilen1(1)) )
429            ENDIF
430#endif
431
432         ELSE
433
434            ! nn_dtactl = 1
435            ! Set boundary data arrays to point to relevant "fnow" arrays
436            !-----------------------------------------------------------
437            IF (nn_dyn2d(ib_obc) .gt. 0) THEN
438               jfld = jfld + 1
439               dta_obc(ib_obc)%ssh => bf(jfld)%fnow(:,1,1)
440               jfld = jfld + 1
441               dta_obc(ib_obc)%u2d => bf(jfld)%fnow(:,1,1)
442               jfld = jfld + 1
443               dta_obc(ib_obc)%v2d => bf(jfld)%fnow(:,1,1)
444            ENDIF
445            IF (nn_dyn3d(ib_obc) .gt. 0) THEN
446               jfld = jfld + 1
447               dta_obc(ib_obc)%u3d => bf(jfld)%fnow(:,1,:)
448               jfld = jfld + 1
449               dta_obc(ib_obc)%v3d => bf(jfld)%fnow(:,1,:)
450            ENDIF
451            IF (nn_tra(ib_obc) .gt. 0) THEN
452               jfld = jfld + 1
453               dta_obc(ib_obc)%tem => bf(jfld)%fnow(:,1,:)
454               jfld = jfld + 1
455               dta_obc(ib_obc)%sal => bf(jfld)%fnow(:,1,:)
456            ENDIF
457#if defined key_lim2
458            IF (nn_ice_lim2(ib_obc) .gt. 0) THEN
459               jfld = jfld + 1
460               dta_obc(ib_obc)%frld  => bf(jfld)%fnow(:,1,1)
461               jfld = jfld + 1
462               dta_obc(ib_obc)%hicif => bf(jfld)%fnow(:,1,1)
463               jfld = jfld + 1
464               dta_obc(ib_obc)%hsnif => bf(jfld)%fnow(:,1,1)
465            ENDIF
466#endif
467
468         ENDIF ! nn_dtactl .eq. 0
469
470      ENDDO ! ib_obc
471
472      END SUBROUTINE obc_dta_init
473
474#else
475   !!----------------------------------------------------------------------
476   !!   Dummy module                   NO Open Boundary Conditions
477   !!----------------------------------------------------------------------
478CONTAINS
479   SUBROUTINE obc_dta( kt, jit )              ! Empty routine
480      WRITE(*,*) 'obc_dta: You should not have seen this print! error?', kt
481   END SUBROUTINE obc_dta
482   SUBROUTINE obc_dta_init()                  ! Empty routine
483      WRITE(*,*) 'obc_dta_init: You should not have seen this print! error?'
484   END SUBROUTINE obc_dta_init
485#endif
486
487   !!==============================================================================
488END MODULE obcdta
Note: See TracBrowser for help on using the repository browser.