]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MINICERN/packlib/zebra/fq/fzorec.F
This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / MINICERN / packlib / zebra / fq / fzorec.F
diff --git a/MINICERN/packlib/zebra/fq/fzorec.F b/MINICERN/packlib/zebra/fq/fzorec.F
new file mode 100644 (file)
index 0000000..914e2c7
--- /dev/null
@@ -0,0 +1,314 @@
+*
+* $Id$
+*
+* $Log$
+* Revision 1.2  1996/04/18 16:10:49  mclareni
+* Incorporate changes from J.Zoll for version 3.77
+*
+* Revision 1.1.1.1  1996/03/06 10:47:14  mclareni
+* Zebra
+*
+*
+#include "zebra/pilot.h"
+      SUBROUTINE FZOREC
+
+C-    Record controls, exchange file format
+C-    service routine to FZOUT
+
+C-    Controlling parameter : IDX(2)
+C-
+C-    IDX(2)   > 0   start new logical record,
+C-                   IDX(1) = length
+C-                   IDX(2) = type :  1 start/end of run
+C-                                    2 new d/s of new event
+C-                                    3 new d/s of same event
+C-                                    9 write emergency stop
+C-
+C-             = 0   up-date buffer parameters from L4CURX
+C-                   write PhR if buffer completed :
+C-                   either : buffer full and LR continues
+C-                       or : LR ended on fast block
+C-
+C-             = -1  flush the buffer
+C-             = -2  End-of-File
+C-             = -3  End-of-Data
+
+C-    Note : for each LR there is a final call with IDX(2)=0
+C-    to save the buffer parameters; at this moment the buffer
+C-    is flushed if the record is fast or almost full
+
+#include "zebra/zmach.inc"
+#include "zebra/zunit.inc"
+#include "zebra/mqsys.inc"
+#include "zebra/eqlqf.inc"
+#include "zebra/fzcx.inc"
+C--------------    End CDE                             --------------
+#if (defined(CERNLIB_QTRHOLL))&&(!defined(CERNLIB_A6M))
+      DIMENSION    NAMESR(2)
+      DATA  NAMESR / 4HFZOT, 4HRX   /
+#endif
+#if (defined(CERNLIB_QTRHOLL))&&(defined(CERNLIB_A6M))
+      DATA  NAMESR / 6HFZOREC /
+#endif
+#if !defined(CERNLIB_QTRHOLL)
+      CHARACTER    NAMESR*8
+      PARAMETER   (NAMESR = 'FZOREC  ')
+#endif
+
+#include "zebra/q_or.inc"
+#include "zebra/q_jbit.inc"
+#include "zebra/q_sbit1.inc"
+
+#include "zebra/qtrace.inc"
+
+
+C-    buffer parameters :
+C-                     -6 JFAST = 0 : current buffer is steering rec
+C-                           .NE. 0 : current buffer is fast record
+C-                     -5 NFASTX, # of fast records still to be written
+C-                     -4
+C-                     -3 N4RESX, # of words in LR still to be done
+C-                     -2 N4DONX, # of words stored in buffer
+C-                     -1
+C-              LBPARX +0   maximum size of buffer
+C-                     +1   size of PhR, local machine words
+C-                     +2   INCBUF : step to buffer
+C-                     +3   (off-set for reading)
+C-                     +4   off-set for writing
+C-                          ( =0 normal, =128 ALFA)
+C-                     -1   free to allow packing
+C-              L4STOX +0   start of buffer
+C-              L4STAX +0   start of buffer accumulation
+
+      LBPARX = LQFX + INCBPX
+      JFAST  = IQ(KQSP+LBPARX-6)
+      NFASTX = IQ(KQSP+LBPARX-5)
+#if defined(CERNLIB_QDEVZE)
+      IF (LOGLVX.GE.3)  WRITE (IQLOG,9701) IDX(2),JFAST,NFASTX
+ 9701 FORMAT (' FZOREC-  entered with IDX(2)=',I3,
+     F' JFAST,NFASTX=',2I4)
+#endif
+
+      IF   (IDX(2).EQ.0)           GO TO 41
+
+      N4RESX = IQ(KQSP+LBPARX-3)
+      N4DONX = IQ(KQSP+LBPARX-2)
+      INCBUF = IQ(KQSP+LBPARX+2)
+      JOFFSO = IQ(KQSP+LBPARX+4)
+      L4STOX = KQSP+8 + LBPARX + INCBUF
+      L4STAX = L4STOX + JOFFSO
+      L4ENDX = L4STAX + MAXREX
+#if defined(CERNLIB_QDEVZE)
+      IF (LOGLVX.GE.3)  WRITE (IQLOG,9703) N4RESX,N4DONX
+ 9703 FORMAT (12X,'N4RESX,N4DONX=',2I7)
+#endif
+      IF (IDX(2).LT.0)             GO TO 51
+      IF (IDX(2).EQ.9)             GO TO 30
+
+C-----------------------------------------------------------
+C------            IDX(2) > 0 :  start new logical record
+C-----------------------------------------------------------
+
+      IQ(KQSP+LQFX+21) = IQ(KQSP+LQFX+21) + 1
+
+#if defined(CERNLIB_FZMEMORY)
+      IF (IFIFOX.EQ.3)             GO TO 23
+#endif
+      IF (N4RESX.NE.0)             GO TO 31
+      IF (N4DONX.NE.0)             GO TO 24
+
+C--     LR starts new physical record
+
+   23 LQ(L4STAX+4) = MAXREX
+      IF (MEDIUX.LT.4)  THEN
+          LQ(L4STAX+5) = IQ(KQSP+LQFX+23)
+        ELSE
+          LQ(L4STAX+5) = 0
+        ENDIF
+      LQ(L4STAX+6) = 8
+
+      IQ(KQSP+LBPARX-6)= 0
+      IQ(KQSP+LBPARX-5)= 0
+      N4DONX = 8
+      GO TO 25
+
+   24 IF (LQ(L4STAX+6).EQ.0)  LQ(L4STAX+6)=N4DONX
+   25 IQ(KQSP+LQFX+31) = IQ(KQSP+LQFX+33) + 1
+      IQ(KQSP+LQFX+32) = N4DONX
+      N4DONX = N4DONX + 2
+      L4CURX = L4STAX + N4DONX
+      LQ(L4CURX-2) = IDX(1)
+      LQ(L4CURX-1) = IDX(2)
+      ISTENX = 1
+
+      IF (IDX(2).EQ.1)  THEN
+          LQ(L4STAX+4) = MSBIT1(LQ(L4STAX+4),31-JRUNX)
+          LQ(L4STAX+5) = 0
+        ENDIF
+
+      IQ(KQSP+LBPARX-3) = IDX(1)
+      IQ(KQSP+LBPARX-2) = N4DONX
+
+      NWOVFL = N4DONX + IDX(1) - MAXREX
+      IF (NWOVFL.LE.0)             GO TO 991
+
+      NFASTX = (NWOVFL-1)/MAXREX + 1
+      IF (JBIT(MSTATX,15).EQ.0)   THEN
+          NWUNUS = NFASTX*MAXREX - NWOVFL
+          IF (NWUNUS .GE. 12)  NFASTX=NFASTX-1
+        ENDIF
+      IQ(KQSP+LBPARX-5) = NFASTX
+      GO TO 991
+
+C----              EMERGENCY STOP
+
+   30 IDX(2) = 0
+   31 IF (JFAST.NE.0)              GO TO 36
+      IF (NFASTX.NE.0)             GO TO 33
+      IF (N4RESX+N4DONX.GT.MAXREX) GO TO 33
+      NWTOLR = LQ(L4STAX+6)
+      IF (NWTOLR.EQ.0)             GO TO 36
+      LQ(L4STAX+NWTOLR) = MAXREX - NWTOLR
+
+   33 NWCL = MAXREX - N4DONX
+      IF (NWCL.GT.0)  CALL VZERO (LQ(L4STAX+N4DONX),NWCL)
+      CALL FZOPHR
+
+   36 LQ(L4STAX+4) = MAXREX
+      IF (MEDIUX.LT.4)  THEN
+          LQ(L4STAX+5) = IQ(KQSP+LQFX+23)
+        ELSE
+          LQ(L4STAX+5) = 0
+        ENDIF
+      LQ(L4STAX+6) = 8
+      LQ(L4STAX+4) = MSBIT1 (LQ(L4STAX+4),32)
+
+      IQ(KQSP+LBPARX-6)= 0
+      IQ(KQSP+LBPARX-5)= 0
+      IQ(KQSP+LBPARX-3)= 0
+      IQ(KQSP+LBPARX-2)= 0
+
+      NWCL = MAXREX - 10
+      LQ(L4STAX+8) = NWCL
+      LQ(L4STAX+9) = 5
+      CALL VZERO (LQ(L4STAX+10),NWCL)
+      CALL FZOPHR
+      IF (IDX(2).GT.0)             GO TO 23
+      GO TO 991
+
+C-----------------------------------------------------------
+C------            IDX(2) = 0 :  up-date buffer parameters
+C--                              write the buffer if complete
+C-----------------------------------------------------------
+
+C-        Note : L4CURX=L4ENDX+1 if a double-precision number spans
+C-               two physical records, giving NWFREE = -1
+
+   41 N4DONX = L4CURX - L4STAX
+      NWNEW  = N4DONX - IQ(KQSP+LBPARX-2)
+      N4RESX = IQ(KQSP+LBPARX-3) - NWNEW
+      IQ(KQSP+LBPARX-3) = N4RESX
+      IQ(KQSP+LBPARX-2) = N4DONX
+
+   42 NWFREE = L4ENDX - L4CURX
+#if defined(CERNLIB_QDEVZE)
+      IF (LOGLVX.GE.3)  WRITE (IQLOG,9743) N4RESX,N4DONX,NWFREE
+ 9743 FORMAT (12X,'N4RESX,N4DONX,NWFREE=',3I7)
+#endif
+      IF (NWFREE.LT.0)             GO TO 55
+      IF (N4RESX.NE.0)  THEN
+          IF (NWFREE.EQ.0)         GO TO 55
+          GO TO 999
+        ENDIF
+
+C--                End of LR reached
+
+      IF (N4DONX.EQ.0)             GO TO 999
+      ISTENX = IOR(ISTENX,2)
+      IF (NWFREE.LT.4)             GO TO 54
+      IF (JFAST.NE.0)              GO TO 54
+      IF (JBIT(MSTATX,15).NE.0)    GO TO 54
+      GO TO 999
+
+C-----------------------------------------------------------
+C------            IDX(2) = -1 :  flush the buffer
+C-----------------------------------------------------------
+
+   51 IF (IDX(2).LT.-1)            GO TO 71
+      IF (N4RESX.NE.0)             GO TO 31
+      IF (N4DONX.EQ.0)             GO TO 991
+      ISTENX = IOR(ISTENX,2)
+      NWFREE = MAXREX - N4DONX
+
+C--       construct dummy LR to complete the buffer
+   54 IF (NWFREE.LE.0)             GO TO 55
+      IF (JFAST.EQ.0) THEN
+          IF (LQ(L4STAX+6).EQ.0)  LQ(L4STAX+6)=N4DONX
+        ENDIF
+
+      L4CURX = L4STAX + N4DONX
+      LQ(L4CURX)   = NWFREE - 1
+      IF (NWFREE.LT.2)             GO TO 55
+      LQ(L4CURX+1) = 5
+      NWFILX = NWFREE - 2
+      IF (NWFILX.EQ.0)             GO TO 55
+#if !defined(CERNLIB_FZMEMORY)
+      CALL VZERO (LQ(L4CURX+2),NWFILX)
+#endif
+#if defined(CERNLIB_FZMEMORY)
+      IF (IFIFOX.NE.3)  CALL VZERO (LQ(L4CURX+2),NWFILX)
+#endif
+
+C--                Write the physical record
+
+   55 MWOVSV = LQ(L4ENDX)
+      CALL FZOPHR
+
+C--                Ready buffer for next physical record
+
+      ISTENX = 0
+      IF (N4RESX.GT.0)             GO TO 57
+      IF (NWFREE.LT.0)             GO TO 57
+C--       no pending data for current logical record
+      IQ(KQSP+LBPARX-2) = 0
+      L4CURX = L4STAX
+      GO TO 991
+
+C--       current logical record continues
+   57 IF (IQ(KQSP+LBPARX-6).EQ.0)  THEN
+          LQ(L4STAX+4) = MAXREX
+          IF (MEDIUX.LT.4)  THEN
+              LQ(L4STAX+5) = IQ(KQSP+LQFX+23)
+            ELSE
+              LQ(L4STAX+5) = 0
+            ENDIF
+          LQ(L4STAX+6) = 0
+          N4DONX = 8
+        ELSE
+          N4DONX = 0
+        ENDIF
+      L4CURX = L4STAX + N4DONX
+      IQ(KQSP+LBPARX-2) = N4DONX
+      IF (NWFREE.GE.0)             GO TO 991
+
+C--       double-precision number spannning the physical records
+      LQ(L4CURX) = MWOVSV
+      N4DONX = N4DONX + 1
+      L4CURX = L4CURX + 1
+      IQ(KQSP+LBPARX-2) = N4DONX
+      IF (N4RESX.GT.0)             GO TO 991
+      GO TO 42
+
+C-----------------------------------------------------------
+C------            IDX(2) < -1 :  ENDFILE
+C-----------------------------------------------------------
+
+   71 CALL FZOPHR
+
+  991 IDX(2) = 0
+
+#include "zebra/qtrace99.inc"
+      RETURN
+      END
+*      ==================================================
+#include "zebra/qcardl.inc"