Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / var / external / bufr / iok2cpy.f
bloba6d54e3fd7b5d8bec75d8e977d943bea4aa4fc49
1 INTEGER FUNCTION IOK2CPY(LUI,LUO)
3 C$$$ SUBPROGRAM DOCUMENTATION BLOCK
5 C SUBPROGRAM: IOK2CPY
6 C PRGMMR: J. ATOR ORG: NP20 DATE: 2009-06-26
8 C ABSTRACT: THIS FUNCTION DETERMINES WHETHER A MESSAGE, OR A SUBSET
9 C FROM A MESSAGE, CAN BE COPIED FROM LOGICAL UNIT IOLUN(LUI) TO
10 C LOGICAL UNIT IOLUN(LUO). THE DECISION IS BASED ON WHETHER THE
11 C EXACT SAME DEFINITION FOR THE GIVEN MESSAGE TYPE APPEARS WITHIN
12 C THE DICTIONARY TABLE INFORMATION FOR BOTH LOGICAL UNITS. NOTE THAT
13 C IT IS POSSIBLE FOR A MESSAGE TYPE TO BE IDENTICALLY DEFINED FOR TWO
14 C DIFFERENT LOGICAL UNITS EVEN IF THE UNITS THEMSELVES DON'T SHARE
15 C THE EXACT SAME FULL SET OF DICTIONARY TABLES.
17 C PROGRAM HISTORY LOG:
18 C 2009-06-26 J. ATOR -- ORIGINAL AUTHOR
20 C USAGE: IOK2CPY (LUI, LUO)
21 C INPUT ARGUMENT LIST:
22 C LUI - INTEGER: I/O STREAM INDEX INTO INTERNAL MEMORY ARRAYS
23 C FOR LOGICAL UNIT TO COPY FROM
24 C LUO - INTEGER: I/O STREAM INDEX INTO INTERNAL MEMORY ARRAYS
25 C FOR LOGICAL UNIT TO COPY TO
27 C OUTPUT ARGUMENT LIST:
28 C IOK2CPY - INTEGER: RETURN CODE INDICATING WHETHER IT IS OKAY TO
29 C COPY FROM IOLUN(LUI) TO IOLUN(LUO)
30 C 0 - NO
31 C 1 - YES
33 C REMARKS:
34 C THIS ROUTINE CALLS: ICMPDX NEMTBAX
35 C THIS ROUTINE IS CALLED BY: COPYSB COPYMG CPYMEM UFBCPY
36 C Normally not called by any application
37 C programs.
39 C ATTRIBUTES:
40 C LANGUAGE: FORTRAN 77
41 C MACHINE: PORTABLE TO ALL PLATFORMS
43 C$$$
45 INCLUDE 'bufrlib.prm'
47 COMMON /MSGCWD/ NMSG(NFILES),NSUB(NFILES),MSUB(NFILES),
48 . INODE(NFILES),IDATE(NFILES)
49 COMMON /BTABLES/ MAXTAB,NTAB,TAG(MAXJL),TYP(MAXJL),KNT(MAXJL),
50 . JUMP(MAXJL),LINK(MAXJL),JMPB(MAXJL),
51 . IBT(MAXJL),IRF(MAXJL),ISC(MAXJL),
52 . ITP(MAXJL),VALI(MAXJL),KNTI(MAXJL),
53 . ISEQ(MAXJL,2),JSEQ(MAXJL)
55 CHARACTER*10 TAG
56 CHARACTER*8 SUBSET
57 CHARACTER*3 TYP
59 C-----------------------------------------------------------------------
60 C-----------------------------------------------------------------------
62 IOK2CPY = 0
64 C Do both logical units have the same internal table information?
66 IF ( ICMPDX(LUI,LUO) .EQ. 1 ) THEN
67 IOK2CPY = 1
68 RETURN
69 ENDIF
71 C No, so get the Table A mnemonic from the message to be copied,
72 C then check whether that mnemonic is defined within the dictionary
73 C tables for the logical unit to be copied to.
75 SUBSET = TAG(INODE(LUI))
76 CALL NEMTBAX(LUO,SUBSET,MTYP,MSBT,INOD)
77 IF ( INOD .EQ. 0 ) RETURN
79 C The Table A mnemonic is defined within the dictionary tables for
80 C both units, so now make sure the definitions are identical.
82 NTEI = ISC(INODE(LUI))-INODE(LUI)
83 NTEO = ISC(INOD)-INOD
84 IF ( NTEI .NE. NTEO ) RETURN
86 DO I = 1, NTEI
87 IF ( TAG(INODE(LUI)+I) .NE. TAG(INOD+I) ) RETURN
88 IF ( TYP(INODE(LUI)+I) .NE. TYP(INOD+I) ) RETURN
89 IF ( ISC(INODE(LUI)+I) .NE. ISC(INOD+I) ) RETURN
90 IF ( IRF(INODE(LUI)+I) .NE. IRF(INOD+I) ) RETURN
91 IF ( IBT(INODE(LUI)+I) .NE. IBT(INOD+I) ) RETURN
92 ENDDO
94 IOK2CPY = 1
96 RETURN
97 END