Anda di halaman 1dari 117

******************************************************************************* * SOURCE CODE and DOCUMENTATION COPYRIGHT (C) 1987-89 KEVIN G.

RHOADS AND THE* * HIGH VOLTAGE RESEARCH LAB., L.E.E.S, Massachusetts Institute of Technology * ******************************************************************************* ******************************************************************************* * * * This file is part of the DATAACQ.LIB library, other components are in files:* * INITOMA.FOR, GLABEL.FOR, LABELS.FOR, STAMP.FOR, ETSTSUB.FOR, XTSTSUB.FOR, * * KTSTSUB.FOR, CTSTSUB.FOR, MTSTSUB.FOR, FRAMOP.FOR, AFROP.ASM, TSTSUB.FOR and* * MORFROP.ASM and I2EPREP.FOR. * * These routines build upon the routines in SCOPEBUS.LIB, which * * contains the low level interfacing to the IEEE-488 bus, the SENSOR I/O board* * and the PAR/OMA. This library should always be linked prior to SCOPEBUS, * * GRAPHICS, UTILS and ASMUTILS. The routines in DATAACQ.LIB are high level * * interface routines, frame operations & frame i/o, PAR programming and * * command & operator interface routines. * *-----------------------------------------------------------------------------* $SEGMENT I_TO_E * *compiler is directed to place object code in segment I_TO_E * *-----------------------------------------------------------------------------* $CHAREQU *compiler is directed NOT to barf on CHARACTER and numeric data types mixed in* *same COMMON BLOCK or EQUIVALENCE * ******************************************************************************* * LIST OF ENTRY POINTS: * * * *SEGMENT I_TO_E * *-----------------------------------------------------------------------------* * INTEGER*4 FUNCTION I2E(SARRAY,DARRAY,NX,NY) * * This is the master light Intensity to (`2') Electric field conversion routine * It orchestrates the calling of other routines. SARRAY and DARRAY are arrays* * for the source and destination, respectively. NX and NY are the dimensions * * of the Source ARRAY (SARRAY). * * * *-----------------------------------------------------------------------------* * INTEGER*4 FUNCTION I2EN(SARRAY,DARRAY,NX,NY) * * SARRAY and DARRAY are buffer numbers specifying the source and destination * * buffers; otherwise identical to I2E, which it calls. * * * *-----------------------------------------------------------------------------* * INTEGER*4 FUNCTION PRPSRC(SARRAY,NX,NY) * * PRPSRC PRePares the SouRCe array for I2E conversion * * * * * *-----------------------------------------------------------------------------* * INTEGER*4 FUNCTION PRPDST(DARRAY,NX,NY) * * PRPDST PRePares the DeSTination array for I2E conversion * * * * * *-----------------------------------------------------------------------------* * SUBROUTINE CNTPTH(SARRAY,DARRAY,NX,NY) * *SEGMENT I__TO_E * * * *-----------------------------------------------------------------------------* *SEGMENT I_TO_E_ * *compiler is directed to place object code in segment I_TO_E * *-----------------------------------------------------------------------------* * SUBROUTINE SPREAD(SARRAY,DARRAY,NX,NY) * * * *-----------------------------------------------------------------------------*

*SEGMENT E2RHO * *compiler is directed to place object code in segment I_TO_E * *-----------------------------------------------------------------------------* * INTEGER*4 FUNCTION E2RHO(SARRAY,DARRAY,NX,NY) * * * * E2RHO is the master conversion routine for Electric field to (`2') RHO * * (charge density) conversions. It is set up as a function, returning 0 if * * the conversion is successful and non-zero values to encode various failure * * codes. * *-----------------------------------------------------------------------------* * INTEGER*4 FUNCTION E2RHON(SARRAY,DARRAY,NX,NY) * * * * Alternate calling sequence for E2RHO: this takes the buffer numbers instead* * of the base addresses as inputs and uses the Pascal deferencing routines (FCAL L3 * in particular) to call the normal E2RHO routine. Return values from E2RHO are * passed through. * * * * * *#############################################################################* * EXPLANATION OF MAJOR DATA ARRAYS: * *----* * * * * * * ******************************************************************************* $SEGMENT I_TO_E * *---------------------------------------------------------------------INTEGER*4 FUNCTION I2E(SARRAY,DARRAY,NX,NY) * IMPLICIT CHARACTER*123 (A-H,J-Z) CHARACTER*8 HAPS(32) CHARACTER*8 HEXOF,THEHEX,HEX2 REAL*4 SMALLA,SMALLG,BIGA,BIGG INTEGER*4 NX,NY,PRPDUN,PRPDST,PRPSRC,KADDR,IXL,IYL,IIXL,IIYL,IJ INTEGER*4 IJS(3),IJ2S(3),BUF(3),FCALL4,I,BLKDSP,I2EALT,IQUAD,MODE INTEGER*4 IAPS(32),LENS(32),LOWCUT,IHICUT,LOWSAV,IHISAV INTEGER*2 SARRAY(NX,NY),DARRAY(NX,NY),TYP(3),ICHS(3),DEFBUF,SAVBUF INTEGER*2 TYPS(32),LENXS(32),LENYS(32),FNRNSN(32),ITYP,BIG,SMALL INTEGER*2 PATH1X,PATH1Y,PATH2X,PATH2Y,PATH3X,PATH3Y,BIG2,SMALL2,I16384 INTEGER*2 PATH(2,6),PATH4X,PATH4Y,PATH5X,PATH5Y,PATH6X,PATH6Y,RANGE INTEGER*2 L0WCUT,IH1CUT LOGICAL*4 REALOK LOGICAL*2 ABORT,ESCAPE,INTRPT LOGICAL*2 PTHDUN,CNVDBG,DISPIT LOGICAL*1 DIDIT,PTHFLG,ALTMOD EQUIVALENCE (PATH(1,1),PATH1X),(PATH(2,1),PATH1Y) EQUIVALENCE (PATH(1,2),PATH2X),(PATH(2,2),PATH2Y) EQUIVALENCE (PATH(1,3),PATH3X),(PATH(2,3),PATH3Y) EQUIVALENCE (PATH(1,4),PATH4X),(PATH(2,4),PATH4Y) EQUIVALENCE (PATH(1,5),PATH5X),(PATH(2,5),PATH5Y) EQUIVALENCE (PATH(1,6),PATH6X),(PATH(2,6),PATH6Y) COMMON /MGPATH/PATH,PTHDUN,/OMACNT/IAPS,HAPS,LENS,/NTRVN/ABORT,ESCAPE,INTR PT COMMON /KIASMN/ICHS,BUF,TYP,IJS,IJ2S,/OMATYP/TYPS,LENXS,LENYS,FNRNSN COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/PARNML/BIG,SMALL,RANGE COMMON /DEBUGC/CNVDBG,/BUFDEF/DEFBUF,/DEBUG5/DISPIT COMMON /I2ENML/LOWCUT,IHICUT,/GLOBAL/LOWSAV,IHISAV SAVE /KIASMN/,/OMATYP/,/BUFDEF/,/MGPATH/,/PARNML/,/PARNM2/,/I2ENML/ SAVE /GLOBAL/ SAVE SAVBUF

EXTERNAL PRPDUN,PRPDST,PRPSRC,HEXOF,APORCP,FCALL4,REALOK,NORML2,CALL3 EXTERNAL RNORML,KADDR SAVE * DIDIT = .FALSE. ALTMOD = .FALSE. GOTO 9000 * ENTRY I2EALT(SARRAY,DARRAY,NX,NY) DIDIT = .FALSE. ALTMOD = .TRUE. * 9000 CONTINUE LOWSAV = LOWCUT IHISAV = IHICUT ID = ICHS(2) IS = ICHS(1) IF (TYPS(ID).EQ.-2.OR.TYPS(ID).EQ.6) THEN IF (LENXS(ID).EQ.LENXS(IS).AND.LENYS(ID).EQ.LENYS(IS)) THEN IF (FNRNSN(ID).EQ.-32768) THEN I = 1 PRINT *,'I2E: USE PRECALCULATED FRINGING VALUES? (Y/n)' ELSE I = 0 PRINT *,'I2E: USE PRECALCULATED FRINGING VALUES? (y/N)' ENDIF I = MENU(I,0,1) IF (I.EQ.1) GOTO 9111 ENDIF ENDIF I = PRPDUN() IF (I.EQ.0) THEN * If PRPDUN returns 0, the preparation for conversion has not been done, so we * attempt to do it or return if we've already tried IF (DIDIT) THEN * tried preparation and it failed, ... * CALL WAIT(3.0) CALL GOTOXY(0,0) CALL CLS * CALL FLASHB PRINT *,' CANNOT CONVERT, PREPARATION FAILS' CALL BEEP CALL FLASHB CALL WAIT(1.0) RETURN ELSE * try preparation, maybe it'll work CALL PRPCNV DIDIT = .TRUE. GOTO 9000 ENDIF ELSEIF (I.EQ.1) THEN * PRPDUN returns 1 if conversion preparation is done but path is not yet known * complete, set PTHFLG so testing for incomplete path is done PTHFLG = .TRUE. ELSEIF (I.EQ.3) THEN * not only is conversion done, but path has been used (and extended if necessary ) * so the path flag is not set PTHFLG = .FALSE.

* * * * * * * * * *

ELSE CALL GOTOXY(0,0) CALL CLS CALL FLASHB PRINT *,'Unknown response from PRPDUN??? ' PRINT *,'This message should NOT be displayed!' CALL BEEP CALL FLASHB CALL WAIT(1.0) RETURN

ENDIF * * Once overall conversion preparation is known complete we prepare the * source array. PRPSRC returns 0 if all cool, non-zero values code => ERRORS I = PRPSRC(SARRAY(1,1),NX,NY) * IF (I.NE.0) THEN * IF (CNVDBG) THEN * PRINT *,'I2E: PRPSRC RETURN = ',I * ENDIF * I2E = I * RETURN * ENDIF * * PRPDST returns 0 if all cool, non-zero values code errors * I = PRPDST(DARRAY(1,1),NX,NY) * IF (I.NE.0) THEN * IF (CNVDBG) THEN * PRINT *,'I2E: PRPDST RETURN = ',I * ENDIF * I2E = I * RETURN * ENDIF * LOWSAV = LOWCUT IHISAV = IHICUT I = NX J = NY IA = KADDR(I) JA = KADDR(J) IT = BUF(1) CALL CALL3(NORML2,IT,IA,JA) * I = NX J = NY CALL RNORML(200,I,J) SMALL2 = 0 BIG2 = 16383 * * compute lowcut and hicut; small2, big2 are absolute limits * small, big are more robust limits generated by ignoring tails * start with weighted arithmetic mean SMALLA = (7.0 * SMALL + SMALL2)/8.0 IF (.NOT.REALOK(SMALLA)) SMALLA = SMALL BIGA = (7.0 * BIG + BIG2)/8.0 IF (.NOT.REALOK(BIGA)) BIGA = BIG IF (BIGA.GT.16383) BIGA = BIG * continue with geometric mean SMALLG = SQRT((1.0 * MAX(SMALL,1)) * MAX(SMALL2,1)) IF (.NOT.REALOK(SMALLG)) SMALLG = SMALL

BIGG = SQRT((1.0 * MIN(BIG,16383)) * MIN(BIG2,16383)) IF (.NOT.REALOK(BIGG)) BIGG = BIG IF (BIGG.GT.16383) BIGG = BIG * use big-small range to compute xx% limits for both kinds of statistics R2 = BIG2 - SMALL2 S2 = SMALL2 + R2*0.037 B2 = BIG2 - R2*0.037 R = BIG - SMALL S = SMALL + R*0.023 B = BIG - R*0.023 * * form weighted average of two means, and two range based limits ITER = 0 9010 CONTINUE ITER = ITER + 1 L0WCUT = (1.2*SMALLG + 1.6*SMALLA + 4.0*S + 1.2*S2)/8.0 IH1CUT = (1.2*BIGG + 1.6*BIGA + 4.0*B + 1.2*B2)/8.0 IF (IH1CUT.GT.BIG.OR.L0WCUT.LT.SMALL) THEN SMALLA = (3.0 * SMALL + SMALLA)/4.0 BIGA = (3.0 * BIG + BIGA)/4.0 IF (.NOT.REALOK(SMALLA)) SMALLA = SMALL IF (.NOT.REALOK(BIGA)) BIGA = BIG SMALLG = SQRT( (1.0*MAX(SMALL,1)) * MAX(SMALLG,1.0)) BIGG = SQRT( (1.0*MIN(BIG,16383)) * MIN(BIGG,16383.0)) IF (.NOT.REALOK(SMALLG)) SMALLG = SMALL IF (.NOT.REALOK(BIGG)) BIGG = BIG R2 = (R + 3.0*R2)*0.25 S2 = (S + 3.0*S2)*0.25 B2 = (B + 3.0*B2)*0.25 IF (ITER.LT.10) GOTO 9010 L0WCUT = (1.0*SMALLA + 15.0*S)/16.0 IH1CUT = (1.0*BIGA + 15.0*B)/16.0 ENDIF PRINT *,'I2E: Global cutoffs are: ',IHICUT,' ',LOWCUT PRINT *,' LOCAL cutoffs are: ',IH1CUT,' ',L0WCUT PRINT *,' Use GLOBAL=1, Local=2, Average=3, Hi=4, Lo=5, Other=6 ?' I = MENU(1,0,6) IF (I.EQ.6) THEN 9871 PRINT *,' LOWCUT = ',LOWCUT,' New value?' READ (*,*,ERR=9871) LOWCUT IF (LOWCUT.LE.0) LOWCUT = 0 9872 PRINT *,' IHICUT = ',IHICUT,' New value?' READ (*,*,ERR=9872) IHICUT IF (IHICUT.GT.16384) IHICUT = 16384 ELSEIF (I.EQ.5) THEN LOWCUT = MIN(0+L0WCUT,0+LOWCUT) IHICUT = MIN(0+IH1CUT,0+IHICUT) ELSEIF (I.EQ.4) THEN LOWCUT = MAX(0+L0WCUT,0+LOWCUT) IHICUT = MAX(0+IH1CUT,0+IHICUT) ELSEIF (I.EQ.3) THEN LOWCUT = (L0WCUT + LOWCUT)/2 IHICUT = (IH1CUT + IHICUT + 1)/2 ELSEIF (I.EQ.2) THEN LOWCUT = L0WCUT IHICUT = IH1CUT ENDIF * PRINT *,'I2E: Cutoffs are: ',IHICUT,' ',LOWCUT * *

* Count fringes along the path * IF (ALTMOD) THEN CALL CNTPTQ(SARRAY(1,1),DARRAY(1,1),NX,NY) ELSE CALL CNTPTH(SARRAY(1,1),DARRAY(1,1),NX,NY) ENDIF IF (CNVDBG.AND.DISPIT) CALL CPDBG5(0,NX,NY) * * * Spread path information * CALL SPREAD(SARRAY(1,1),DARRAY(1,1),NX,NY) * * * IF (CNVDBG) THEN * PRINT *,'Do Smooth? (Y/n)' * I = MENU(1,0,1) * IF (INTRPT.OR.ESCAPE) I = 0 * ELSE * I = 1 * ENDIF * IF (I.EQ.1) THEN PRINT *,'I2E: MEDIAN SMOOTHING quadrants before conversion.' IXL = NX IYL = NY IT = BUF(2) CALL IMED3D(IT,IXL,IYL) IT = BUF(2) CALL IMED3(IT,IXL,IYL) * ENDIF IF (((TYPS(7).EQ.-2).OR.(TYPS(7).EQ.6)).AND.(FNRNSN(7).EQ.0.OR.FNRNSN(7).E Q.-32768)) THEN IF (ICHS(1).NE.7.AND.ICHS(2).NE.7.AND.BUF(1).NE.IAPS(7).AND.BUF(2).NE. IAPS(7)) THEN TYPS(7) = 6 FNRNSN(7) = -32768 IS = BUF(2) ID = IAPS(7) CALL IICOPY(IS,ID,2*NX*NY) LENXS(7) = LENXS(ICHS(1)) LENYS(7) = LENYS(ICHS(1)) ENDIF ENDIF * * Do the conversion * 9111 CONTINUE IXL = NX IYL = NY IIXL = KADDR(IXL) IIYL = KADDR(IYL) IS = BUF(1) IR = BUF(3) IF (BUF(3).NE.KADDR(IAPS(5))) IR = KADDR(IAPS(5)) II = FCALL4(APORCP,IS,IR,IIXL,IIYL) IQUAD = DARRAY(PATH1X,PATH1Y) IF (MOD(IQUAD,2).EQ.1) II = -II * * I = KADDR(SARRAY(1,1))

* * * * * * * * * * * * * *

IF (I.NE.BUF(1).OR.CNVDBG) THEN THEHEX = HEXOF(I) HEX2 = HEXOF(BUF(1)) PRINT *,' I2E: @SARRAY ($',THEHEX,') vs. BUF(1) ($',HEX2,')' CALL WAIT(1.0) ENDIF I = KADDR(DARRAY(1,1)) IF (I.NE.BUF(2).OR.CNVDBG) THEN THEHEX = HEXOF(I) HEX2 = HEXOF(BUF(2)) PRINT *,' I2E: @DARRAY ($',THEHEX,') vs. BUF(2) ($',HEX2,')' CALL WAIT(1.0) ENDIF IJ = NX*NY IS = KADDR(SARRAY(1,1)) ID = KADDR(DARRAY(1,1)) IF (II.EQ.1) THEN ALIGNED - CONVERSION IS ARC-COS PRINT *,'ALIGNED: ARC-COS CONVERSION ' CALL IIACOS(ID,IS,IJ) ELSEIF (II.EQ.-1) THEN CROSSED - CONVERSION IS ARC-SIN PRINT *,'CROSSED: ARC-SIN CONVERSION ' CALL IIASIN(ID,IS,IJ) ELSE PRINT *,'ASSUMING ALIGNED: ARC-COS CONVERSION ' CALL BEEP CALL IIACOS(ID,IS,IJ) CALL WAIT(0.8) ENDIF IF (.NOT.CNVDBG) THEN I = 1 ELSE PRINT *,'I2E: MASK? (Y/n)' I = MENU(1,0,1) ENDIF IF (I.EQ.1) THEN PRINT *,'I2E: FINAL MASKING' IJ = IJS(1) IT = KADDR(DARRAY(1,1)) IT2 = IAPS(5) CALL IIMSK2(IT,IT2,IJ) ENDIF LOWCUT = LOWSAV IHICUT = IHISAV ITYP = TYPS(ICHS(1)) IF (ITYP.EQ.0.OR.ITYP.EQ.5.OR.ITYP.EQ.-1) THEN ==> '|E| from RAW data' TYPS(ICHS(2)) = 9 ELSEIF (ITYP.EQ.1.OR.ITYP.EQ.7) THEN ==> '|E| from ZRC data' TYPS(ICHS(2)) = 10 ELSEIF (ITYP.EQ.3) THEN ==> '|E| from NORMed data' TYPS(ICHS(2)) = 11 ELSEIF (ITYP.EQ.4) THEN ==> '|E| from ZRC&NORM data' TYPS(ICHS(2)) = 12

* * * * * * *

* * *

* 10 * 11 * 12

ELSEIF (ITYP.EQ.8) THEN * 13 ==> '|E| fm ZRC&ZRC-NORM' TYPS(ICHS(2)) = 13 ELSEIF (ITYP.EQ.2) THEN * 2 ==> 'Simulated Data' * 14 ==> '? |E| from ??' TYPS(ICHS(2)) = 14 ELSEIF (ITYP.EQ.-2) THEN * -2 ==> UNINITIALIZED TYPS(ICHS(2)) = -2 ELSEIF (ITYP.EQ.6) THEN * 6 ==> UNKNOWN TYPS(ICHS(2)) = 6 ELSE * 14 ==> '? |E| from ??' TYPS(ICHS(2)) = 14 ENDIF FNRNSN(ICHS(2)) = -IABS(FNRNSN(ICHS(1))) * IF (CNVDBG) THEN SAVBUF = DEFBUF DEFBUF = ICHS(2) I = BLKDSP(DARRAY(1,1),NX,NY) DEFBUF = SAVBUF ENDIF * RETURN END *---------------------------------------------------------------------INTEGER*4 FUNCTION I2EN(SARRAY,DARRAY,NX,NY) * IMPLICIT CHARACTER*123 (A-H,J-Z) * * Alternate calling sequence for I2E: this takes the buffer numbers instead * of the base addresses as inputs and uses the Pascal deferencing routines (FCAL L3 * in particular) to call the normal I2@ routine. Return values from I2E are * passed through. * CHARACTER*8 HAPS(32) INTEGER*4 ZLEN,ZMARK,ZPOINT,ALEN,AMARK,APOINT,APSCR1,APSCR2,APSCR3 INTEGER*4 APMAIN,AP1,AP2,AP3,AP4,AP5,APZR,APMX,AFMTYP,SCRMRK,APS(0:7) INTEGER*4 LNMAIN,LN1,LN2,LN3,LN4,LN5,LNZR,LNMX,LNS(0:7),IAPS(32),LENS(32) INTEGER*4 KADDR,SARRAY,DARRAY,NX,NY,FCALL4,MODE,IA,IA1,IA2,IA3,IA4,IA5 INTEGER*4 I,I2EALT,IIT,INX,INY,IMX,ISC1,ISC2,ISC3,IZ,IZR,JARRAY,KARRAY INTEGER*2 TYPS(32),LENXS(32),LENYS(32),FNRNSN(32) INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384 LOGICAL*2 ZVALID,AVALID,ZZCORR,AACORR,BUFGUD(32),BUFUSE(32) EQUIVALENCE (APS(0),APMAIN),(APS(1),AP1),(APS(2),AP2),(APS(3),AP3) EQUIVALENCE (APS(4),AP4),(APS(5),AP5),(APS(6),APZR),(APS(7),APMX) EQUIVALENCE (LNS(0),LNMAIN),(LNS(1),LN1),(LNS(2),LN2),(LNS(3),LN3) EQUIVALENCE (LNS(4),LN4),(LNS(5),LN5),(LNS(6),LNZR),(LNS(7),LNMX) EQUIVALENCE (IA,IAPS(1)),(IA2,IAPS(2)),(IA4,IAPS(3)),(IZ,IZR,IAPS(4)) EQUIVALENCE (IMX,IAPS(5)),(IIT,IAPS(6)),(IA1,IAPS(7)),(IA3,IAPS(8)) EQUIVALENCE (IA5,IAPS(9)),(ISC1,IAPS(10)),(ISC2,IAPS(11)),(ISC3,IAPS(12)) COMMON /OMABFL/BUFGUD,BUFUSE,/PARNML/BIG,SMALL,RANGE COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/OMABFR/APS,LNS COMMON /OMACNT/IAPS,HAPS,LENS,/OMATYP/TYPS,LENXS,LENYS,FNRNSN COMMON /ZEROS/ZVALID,ZLEN,ZMARK,ZPOINT,ZZCORR COMMON /OMASCR/SCRMRK,APSCR1,APSCR2,APSCR3 COMMON /AMPLS/AVALID,ALEN,AMARK,APOINT,AACORR,AFMTYP

SAVE /OMABFL/,/PARNML/,/PARNM2/,/OMABFR/,/OMACNT/,/OMATYP/ SAVE /ZEROS/,/OMASCR/,/AMPLS/ EXTERNAL KADDR,FCALL4,I2E,I2EALT SAVE * INX = KADDR(NX) INY = KADDR(NY) KARRAY = IAPS(SARRAY) JARRAY = IAPS(DARRAY) I = FCALL4(I2E,KARRAY,JARRAY,INX,INY) I2EN = I RETURN * ENTRY I2ENLT(SARRAY,DARRAY,NX,NY) INX = KADDR(NX) INY = KADDR(NY) KARRAY = IAPS(SARRAY) JARRAY = IAPS(DARRAY) I = FCALL4(I2EALT,KARRAY,JARRAY,INX,INY) I2ENLT = I RETURN END *---------------------------------------------------------------------INTEGER*4 FUNCTION PRPSRC(SARRAY,NX,NY) * IMPLICIT CHARACTER*123 (A-Z) CHARACTER*8 HAPS(32) INTEGER*4 NX,NY,IXL,IYL,IJ,KADDR,IT,IT2,IA,IA1,IA2,IA3,IA4,IA5,IIT INTEGER*4 ZLEN,ZMARK,ZPOINT,ALEN,AMARK,APOINT,APSCR1,APSCR2,APSCR3 INTEGER*4 APMAIN,AP1,AP2,AP3,AP4,AP5,APZR,APMX,AFMTYP,SCRMRK,APS(0:7) INTEGER*4 LNMAIN,LN1,LN2,LN3,LN4,LN5,LNZR,LNMX,LNS(0:7),IAPS(32),LENS(32) INTEGER*4 IJS(3),IJ2S(3),BUF(3),IMX,ISC1,ISC2,ISC3,IZ,IZR,MODE INTEGER*2 SARRAY(NX,NY),TYP(3),ICHS(3) INTEGER*2 I1XUL,I1XUR,I1XLL,I1XLR,I1YUL,I1YUR,I1YLL,I1YLR,B1,B2 INTEGER*2 PATH1X,PATH1Y,PATH2X,PATH2Y,PATH3X,PATH3Y INTEGER*2 PATH(2,6),PATH4X,PATH4Y,PATH5X,PATH5Y,PATH6X,PATH6Y INTEGER*2 TYPS(32),LENXS(32),LENYS(32),FNRNSN(32) INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384 LOGICAL*2 ZVALID,AVALID,ZZCORR,AACORR,BUFGUD(32),BUFUSE(32) LOGICAL*2 PTHDUN,AUTMED,AUTMEN EQUIVALENCE (PATH(1,1),PATH1X),(PATH(2,1),PATH1Y) EQUIVALENCE (PATH(1,2),PATH2X),(PATH(2,2),PATH2Y) EQUIVALENCE (PATH(1,3),PATH3X),(PATH(2,3),PATH3Y) EQUIVALENCE (PATH(1,4),PATH4X),(PATH(2,4),PATH4Y) EQUIVALENCE (PATH(1,5),PATH5X),(PATH(2,5),PATH5Y) EQUIVALENCE (PATH(1,6),PATH6X),(PATH(2,6),PATH6Y) EQUIVALENCE (APS(0),APMAIN),(APS(1),AP1),(APS(2),AP2),(APS(3),AP3) EQUIVALENCE (APS(4),AP4),(APS(5),AP5),(APS(6),APZR),(APS(7),APMX) EQUIVALENCE (LNS(0),LNMAIN),(LNS(1),LN1),(LNS(2),LN2),(LNS(3),LN3) EQUIVALENCE (LNS(4),LN4),(LNS(5),LN5),(LNS(6),LNZR),(LNS(7),LNMX) EQUIVALENCE (IA,IAPS(1)),(IA2,IAPS(2)),(IA4,IAPS(3)),(IZ,IZR,IAPS(4)) EQUIVALENCE (IMX,IAPS(5)),(IIT,IAPS(6)),(IA1,IAPS(7)),(IA3,IAPS(8)) EQUIVALENCE (IA5,IAPS(9)),(ISC1,IAPS(10)),(ISC2,IAPS(11)),(ISC3,IAPS(12)) COMMON /OMABFL/BUFGUD,BUFUSE,/PARNML/BIG,SMALL,RANGE,/I2EBUF/B1,B2 COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/OMABFR/APS,LNS COMMON /OMACNT/IAPS,HAPS,LENS,/OMATYP/TYPS,LENXS,LENYS,FNRNSN COMMON /ZEROS/ZVALID,ZLEN,ZMARK,ZPOINT,ZZCORR COMMON /OMASCR/SCRMRK,APSCR1,APSCR2,APSCR3 COMMON /AMPLS/AVALID,ALEN,AMARK,APOINT,AACORR,AFMTYP COMMON /PTHALT/I1XUL,I1XUR,I1XLL,I1XLR,I1YUL,I1YUR,I1YLL,I1YLR COMMON /MGPATH/PATH,PTHDUN,/SMOOTH/AUTMED,AUTMEN

COMMON /KIASMN/ICHS,BUF,TYP,IJS,IJ2S SAVE /OMABFL/,/PARNML/,/PARNM2/,/OMABFR/,/OMACNT/,/OMATYP/ SAVE /ZEROS/,/OMASCR/,/AMPLS/,/PTHALT/,/MGPATH/,/KIASMN/,/I2EBUF/ SAVE * IF (AUTMED) THEN PRINT *,'PRPSRC: SMOOTHING SOURCE BUFFER' IXL = NX IYL = NY IT = KADDR(SARRAY(1,1)) CALL IMED3(IT,IXL,IYL) IXL = NX IYL = NY IT = KADDR(SARRAY(1,1)) IF (AUTMEN) CALL IMEN3(IT,IXL,IYL) ELSE PRINT *,'PRPSRC ENTERED ...' ENDIF * IF (AVALID.AND.(NX.EQ.LENXS(5)).AND.(NY.EQ.LENYS(5))) THEN PRINT *,'PRPSRC: MASKING SOURCE BUFFER WITH MAX. FRAME' IXL = NX IYL = NY IJ = IJS(1) IT = KADDR(SARRAY(1,1)) IT2 = IAPS(5) CALL IIMSK2(IT,IT2,IJ) PRPSRC = 0 ELSE PRINT *,'PRPSRC: AVALID = ',AVALID,' NX, LENXS(5) = ',NX,' ',LENXS(5 PRINT *,' NY, LENYS(5) = ',NY,' ',LENYS(5) PRPSRC = -1 CALL WAIT(0.8) ENDIF * RETURN END *---------------------------------------------------------------------INTEGER*4 FUNCTION PRPDST(DARRAY,NX,NY) * IMPLICIT CHARACTER*123 (A-Z) CHARACTER*8 HAPS(32) INTEGER*4 NX,NY,KADDR,IT,IJ,IT2,IA,IA1,IA2,IA3,IA4,IA5,IIT,IMX,MODE INTEGER*4 ZLEN,ZMARK,ZPOINT,ALEN,AMARK,APOINT,APSCR1,APSCR2,APSCR3 INTEGER*4 APMAIN,AP1,AP2,AP3,AP4,AP5,APZR,APMX,AFMTYP,SCRMRK,APS(0:7) INTEGER*4 LNMAIN,LN1,LN2,LN3,LN4,LN5,LNZR,LNMX,LNS(0:7),IAPS(32),LENS(32) INTEGER*4 IJS(3),IJ2S(3),BUF(3),ISC1,ISC2,ISC3,IXL,IYL,IZ,IZR INTEGER*2 DARRAY(NX,NY),TYP(3),ICHS(3) INTEGER*2 I1XUL,I1XUR,I1XLL,I1XLR,I1YUL,I1YUR,I1YLL,I1YLR,B1,B2 INTEGER*2 PATH1X,PATH1Y,PATH2X,PATH2Y,PATH3X,PATH3Y INTEGER*2 PATH(2,6),PATH4X,PATH4Y,PATH5X,PATH5Y,PATH6X,PATH6Y INTEGER*2 TYPS(32),LENXS(32),LENYS(32),FNRNSN(32) INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384 LOGICAL*2 ZVALID,AVALID,ZZCORR,AACORR,BUFGUD(32),BUFUSE(32) LOGICAL*2 PTHDUN,AUTMED,AUTMEN EQUIVALENCE (PATH(1,1),PATH1X),(PATH(2,1),PATH1Y) EQUIVALENCE (PATH(1,2),PATH2X),(PATH(2,2),PATH2Y) EQUIVALENCE (PATH(1,3),PATH3X),(PATH(2,3),PATH3Y) EQUIVALENCE (PATH(1,4),PATH4X),(PATH(2,4),PATH4Y) EQUIVALENCE (PATH(1,5),PATH5X),(PATH(2,5),PATH5Y)

* * ) * * *

EQUIVALENCE (PATH(1,6),PATH6X),(PATH(2,6),PATH6Y) EQUIVALENCE (APS(0),APMAIN),(APS(1),AP1),(APS(2),AP2),(APS(3),AP3) EQUIVALENCE (APS(4),AP4),(APS(5),AP5),(APS(6),APZR),(APS(7),APMX) EQUIVALENCE (LNS(0),LNMAIN),(LNS(1),LN1),(LNS(2),LN2),(LNS(3),LN3) EQUIVALENCE (LNS(4),LN4),(LNS(5),LN5),(LNS(6),LNZR),(LNS(7),LNMX) EQUIVALENCE (IA,IAPS(1)),(IA2,IAPS(2)),(IA4,IAPS(3)),(IZ,IZR,IAPS(4)) EQUIVALENCE (IMX,IAPS(5)),(IIT,IAPS(6)),(IA1,IAPS(7)),(IA3,IAPS(8)) EQUIVALENCE (IA5,IAPS(9)),(ISC1,IAPS(10)),(ISC2,IAPS(11)),(ISC3,IAPS(12)) COMMON /PTHALT/I1XUL,I1XUR,I1XLL,I1XLR,I1YUL,I1YUR,I1YLL,I1YLR COMMON /MGPATH/PATH,PTHDUN,/I2EBUF/B1,B2 COMMON /OMABFL/BUFGUD,BUFUSE,/PARNML/BIG,SMALL,RANGE COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/OMABFR/APS,LNS COMMON /OMACNT/IAPS,HAPS,LENS,/OMATYP/TYPS,LENXS,LENYS,FNRNSN COMMON /ZEROS/ZVALID,ZLEN,ZMARK,ZPOINT,ZZCORR COMMON /OMASCR/SCRMRK,APSCR1,APSCR2,APSCR3 COMMON /AMPLS/AVALID,ALEN,AMARK,APOINT,AACORR,AFMTYP COMMON /SMOOTH/AUTMED,AUTMEN COMMON /KIASMN/ICHS,BUF,TYP,IJS,IJ2S SAVE /OMABFL/,/PARNML/,/PARNM2/,/OMABFR/,/OMACNT/,/OMATYP/ SAVE /ZEROS/,/OMASCR/,/AMPLS/,/PTHALT/,/MGPATH/,/SMOOTH/,/KIASMN/,/I2EBUF/ EXTERNAL IIBTS2,IIBTT2,IHITIT SAVE * PRINT *,'PRPDST ENTERED ...' LENXS(ICHS(2)) = LENXS(ICHS(1)) LENYS(ICHS(2)) = LENYS(ICHS(1)) IXL = NX IYL = NY IJ2S(2) = IJ2S(1) IJS(2) = IJS(1) IJ = IJ2S(1) IT = KADDR(DARRAY(1,1)) CALL IHITIT(IT,IJ,$FFFDFFFD) TYPS(ICHS(2)) = -2 * IJ = IJS(2) IT = KADDR(DARRAY(1,1)) IT2 = BUF(1) IF (TYPS(ICHS(1)).NE.2) THEN IF the source is NOT Simulated data then ... PRINT *,'PRPDST: MASKING DESTINATION BUFFER WITH SOURCE' CALL IIBTT2(IT,IT2,-2,IJ) ENDIF In this masking operation -1 is used as the fill value. For fringe counting, -1 is a key indicator that this is a valid data point for which the fringe is not yet counted. Negative fringe values are `suppress' point indicators, so any data points left with the -1 fringe number will be suppressed. The other tag value is -2, which is used for points which have not yet had a quadrant number assigned yet. IF (AVALID.AND.(NX.EQ.LENXS(5)).AND.(NY.EQ.LENYS(5))) THEN PRINT *,' MASKING DESTINATION BUFFER WITH MAX. FRAME' PRINT *,'PRPDST: MASKING DESTINATION BUFFER WITH MAX. FRAME' IJ = IJS(2) IT = KADDR(DARRAY(1,1)) IT2 = IAPS(5) CALL IIBTT2(IT,IT2,-2,IJ) PRPDST = 0 ELSE

* * * * * * * * *

* ) * * * * *

PRINT *,'PRPDST: AVALID = ',AVALID,' NX, LENXS(5) = ',NX,' ',LENXS(5 PRINT *,' NY, LENYS(5) = ',NY,' ',LENYS(5) PRPDST = -1 CALL WAIT(0.8) ENDIF TYPS(ICHS(2)) = 6

PRINT *,'PRPDST: FINISHED, ABOUT TO RETURN ' RETURN END *---------------------------------------------------------------------SUBROUTINE CNTPTH(SARRAY,DARRAY,NX,NY) * IMPLICIT CHARACTER*123 (A-Z) CHARACTER*1 MGFRMN(2),TC,TCALGN(2) REAL*4 LSLOPE,RSLOPE,LINTRC,RINTRC,TEMP0(4096),TEMP3(0:20480) INTEGER*4 LMED,RMED,LUHING,RUHING,LLHING,RLHING,HSPRDN,HSPRDM,IQMAX INTEGER*4 NX,NY,KADDR,IJS(3),IJ2S(3),BUF(3),I,I1,I2,I3,I4,LOWCUT INTEGER*4 LLCTRD,RLCTRD,BLCTRD,TLCTRD,J,MENU,APORCP,K,IHICUT INTEGER*2 SARRAY(NX,NY),DARRAY(NX,NY),QSTART,IQUAD,LOWSAV,IHISAV INTEGER*2 PTH1X(4),PTH1Y(4),PTH2X(4),PTH2Y(4),PTH3X(4),PTH3Y(4) INTEGER*2 PTH(4,2,5),PTH4X(4),PTH4Y(4),PTH5X(4),PTH5Y(4),SAVEP(2,6) INTEGER*2 PATH1X,PATH1Y,PATH2X,PATH2Y,PATH3X,PATH3Y,QDRNT,QS(4),Q2S(4,0:50 ) INTEGER*2 PATH(2,6),PATH4X,PATH4Y,PATH5X,PATH5Y,PATH6X,PATH6Y INTEGER*2 TYPS(32),LENXS(32),LENYS(32),FNRNSN(32),TYP(3),ICHS(3) INTEGER*2 POINTY(2,4,256),POINTB(8,256),POINTX(2,4,512),POINTA(8,512) INTEGER*2 LINEY(256),LINEX(512),VCTRLN,HCTRLN,IXBEG,IYBEG,IXEND,IYEND INTEGER*2 VCNTRL,HCNTRL,ITERS,ABP4X(4),ABP5X(4),ABP4Y(4),ABP5Y(4) INTEGER*2 IASC,ISCAN,IKBF1,IKBF2,IERR LOGICAL*2 PTHDUN,CNVDBG,MGLR,MGUD,MGOTHR,MGOK,BLCTOK,TLCTOK,DISPIT LOGICAL*2 ABORT,ESCAPE,INTRPT,RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS,SMOOTH LOGICAL*2 NOKILL,NOK1LL,DEGLCH LOGICAL*1 PTHSUL,PTHSUR,PTHSLL,PTHSLR,FOOBAR,UL,UR,LL,LR,UL1,UR1,LL1,LR1 LOGICAL*1 INITQD,ISE,DISP1T,ISD,ISC,ISI,ISCDEI,DOMORE,ISA,ISB,OK(4) EQUIVALENCE (PATH(1,1),PATH1X),(PATH(2,1),PATH1Y),(OK(1),LL),(OK(2),LR) EQUIVALENCE (PATH(1,2),PATH2X),(PATH(2,2),PATH2Y),(OK(3),UL),(OK(4),UR) EQUIVALENCE (PATH(1,3),PATH3X),(PATH(2,3),PATH3Y),(ABP4X(1),TEMP0(1)) EQUIVALENCE (PATH(1,4),PATH4X),(PATH(2,4),PATH4Y),(ABP5X(1),TEMP0(5)) EQUIVALENCE (PATH(1,5),PATH5X),(PATH(2,5),PATH5Y),(ABP4Y(1),TEMP0(9)) EQUIVALENCE (PATH(1,6),PATH6X),(PATH(2,6),PATH6Y),(ABP5Y(1),TEMP0(13)) EQUIVALENCE (PTH(1,1,1),PTH1X(1)),(PTH(1,2,1),PTH1Y(1)) EQUIVALENCE (PTH(1,1,2),PTH2X(1)),(PTH(1,2,2),PTH2Y(1)) EQUIVALENCE (PTH(1,1,3),PTH3X(1)),(PTH(1,2,3),PTH3Y(1)) EQUIVALENCE (PTH(1,1,4),PTH4X(1)),(PTH(1,2,4),PTH4Y(1)) EQUIVALENCE (PTH(1,1,5),PTH5X(1)),(PTH(1,2,5),PTH5Y(1)) EQUIVALENCE (POINTY(1,1,1),POINTB(1,1)),(POINTX(1,1,1),POINTA(1,1)) EQUIVALENCE (VCTRLN,VCNTRL),(HCTRLN,HCNTRL),(QS(1),Q2S(1,0),TEMP0(17)) EQUIVALENCE (TCALGN(1),IASC),(TCALGN(2),TC) COMMON /NTRVN/ABORT,ESCAPE,INTRPT,/KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR COMMON /SHFSTA/RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS,/QITERS/ITERS COMMON /MGFORM/LINEX,LINEY,POINTY,POINTX,IXBEG,IYBEG,IXEND,IYEND COMMON /KIASMN/ICHS,BUF,TYP,IJS,IJ2S,/OMATYP/TYPS,LENXS,LENYS,FNRNSN COMMON /MGPATH/PATH,PTHDUN,/MGPTH/PTH,/PTHBEG/PTHSUL,PTHSUR,PTHSLL,PTHSLR COMMON /FETURE/LLCTRD,RLCTRD,BLCTRD,TLCTRD,VCNTRL,HCNTRL,BLCTOK,TLCTOK COMMON /DEBUGC/CNVDBG,/THEQAD/QDRNT,/STARTQ/QSTART,/DEBUG5/DISPIT COMMON /MGFRAM/MGFRMN,MGLR,MGUD,MGOTHR,MGOK,/PARCUM/TEMP3,TEMP0 COMMON /STATLR/LSLOPE,RSLOPE,LINTRC,RINTRC,LMED,RMED,LUHING,RUHING, & LLHING,RLHING,HSPRDN,HSPRDM,/HILOSM/SMOOTH,/ENDKIL/NOKILL, NOK1LL,DEGLCH

COMMON /I2ENML/LOWCUT,IHICUT SAVE /MGPTH/,/MGPATH/,/PTHBEG/,/DEBUGC/,/KIASMN/,/OMATYP/,/THEQAD/ SAVE /QSTART/,/MGFRAM/,/FETURE/,/MGFORM/,/DEBUG5/,/STATLR/,/QITERS/ SAVE /NTRVN/,/KEYGET/,/SHFSTA/,/HILOSM/,/ENDKIL/,/I2ENML/ SAVE SAVEP,DISP1T EXTERNAL QNTPTH,QNTPT4,KADDR,QNTPTI,QNTPTQ,XYGOTO SAVE * INITQD = .FALSE. GOTO 9000 * ENTRY CNTPTQ(SARRAY,DARRAY,NX,NY) INITQD = .TRUE. * 9000 CONTINUE IF (.NOT.PTHDUN) THEN CALL CRCLS PRINT *,' ' PRINT *,'CNTPTH: Cannot proceed, path not chosen.' * PRINT *,' ' CALL BEEP CALL FLASHB RETURN ENDIF * Handling varies with different framings, note certain framings ... ISE = MGFRMN(1).EQ.'E' .OR. MGFRMN(1).EQ.'e' ISD = MGFRMN(1).EQ.'D' .OR. MGFRMN(1).EQ.'d' ISC = MGFRMN(1).EQ.'C' .OR. MGFRMN(1).EQ.'c' ISI = MGFRMN(1).EQ.'I' .OR. MGFRMN(1).EQ.'i' ISCDEI = ISC .OR. ISD .OR. ISE .OR. ISI ISA = MGFRMN(1).EQ.'A' .OR. MGFRMN(1).EQ.'a' ISB = MGFRMN(1).EQ.'B' .OR. MGFRMN(1).EQ.'b' * * IF framing is `E' or if user has asked for it, we get starting quadrant * value here, else it is set to 0. * QSTART = 0 IQMAX = (RLCTRD - LLCTRD - 1)/2 IF (ISCDEI) IQMAX = IQMAX / 2 IQMAX = MIN(50,IQMAX) IQUAD = 6 ITERS = 4 IF (ISCDEI) IQUAD = IQUAD/2 IHISAV = IHICUT LOWSAV = LOWCUT SMOOTH = .FALSE. NOK1LL = .FALSE. NOKILL = .FALSE. DEGLCH = .FALSE. IF (INITQD.OR.ISE.OR.ISI) THEN IF (.NOT.CNVDBG) CALL CRCLS PRINT *,'CNTPTH: Starting quadrant value? (0 .. 9) ' QSTART = MENU(0,0,9) IF (IASC.EQ.10) GOTO 9003 ENDIF * IF (CNVDBG.OR.INITQD.OR.ISE) THEN PRINT *,'CNTPTN: Number of Subsidiary paths per quad? (1..',IQMAX,', d efault=',IQUAD,')' I = IQUAD IQUAD = MENU(I,0,IQMAX)

9871 9872 * 9003

3 * * Framings C, D, E and I have either the TOP or BOTTOM cut off, so two of the * alternate paths are unused - we fill them in here as parallels to the main * path with horizontal offsets toward the two electrodes respectively. * IF (CNVDBG) THEN PRINT *,'MGFRMN = ',MGFRMN(1) PRINT *,'CNTPTH: Display Pictures for ALL alternate paths? (y/N)' I = MENU(0,0,1) DISPIT = I.EQ.1 DISP1T = DISPIT ELSE DISP1T = .FALSE. ENDIF IF (ISCDEI) THEN IF (.NOT.TLCTOK) THEN PATH5Y = IYEND - 2 PATH6Y = PATH5Y PTH5Y(1) = PATH5Y PTH5Y(2) = PATH5Y I1 = 1

IF (IQUAD.LE.0.OR.IQUAD.GT.IQMAX) I = 6 IF (IASC.EQ.10) GOTO 9003 PRINT *,'CNTPTH: Iteration number? (2 .. 20, ',ITERS,' = Default)' I = MENU(0+ITERS,2,20) IF (I.LT.2.OR.I.GT.20) I = ITERS ITERS = I IF (IASC.EQ.10) GOTO 9003 PRINT *,'CNTPTH: Smooth HILO indicators before analyzing? (y/N)' I = MENU(0,0,1) SMOOTH = I.EQ.1 IF (IASC.EQ.10) GOTO 9003 PRINT *,'CNTPTH: ALLOW Beginning-KILL operation? (Y/n)' I = MENU(1,0,1) NOK1LL = I.EQ.0 IF (IASC.EQ.10) GOTO 9003 PRINT *,'CNTPTH: ALLOW DEglitching operations? (y/N)' I = MENU(0,0,1) DEGLCH = I.EQ.1 IF (IASC.EQ.10) GOTO 9003 PRINT *,'CNTPTH: ALLOW END-KILL operation? (Y/n)' I = MENU(1,0,1) NOKILL = I.EQ.0 IF (IASC.EQ.10) GOTO 9003 CALL GOTOXY(0,17) PRINT *,' LOWCUT, IHICUT = ',LOWCUT,', ',IHICUT,' Diddle? (y/N)' I = MENU(0,0,1) IF (I.EQ.1) THEN PRINT *,' LOWCUT = ',LOWCUT,' New value?' READ (*,*,ERR=9871) LOWCUT PRINT *,' IHICUT = ',IHICUT,' New value?' READ (*,*,ERR=9872) IHICUT ENDIF ENDIF CONTINUE ITERS = ITERS - 1 DO 3 I = 1,6 SAVEP(1,I) = PATH(1,I) SAVEP(2,I) = PATH(2,I) CONTINUE

&

= 2 = 3 = 4 (PTH1Y(1).NE.-1.AND.PTH2Y(1).NE.-1) THEN IT = MIN(PTH1Y(1),PTH2Y(1),PTH3Y(1)) PTH1Y(1) = IT PTH2Y(1) = IT ENDIF IF (PTH1Y(2).NE.-1.AND.PTH2Y(2).NE.-1) THEN IT = MIN(PTH1Y(2),PTH2Y(2),PTH3Y(2)) PTH1Y(2) = IT PTH2Y(2) = IT ENDIF ELSEIF (.NOT.BLCTOK) THEN PATH5Y = IYBEG + 2 PATH6Y = PATH5Y PTH5Y(3) = PATH5Y PTH5Y(4) = PATH5Y I1 = 3 I2 = 4 I3 = 1 I4 = 2 IF (PTH1Y(3).NE.-1.AND.PTH2Y(3).NE.-1) THEN IT = MAX(PTH1Y(3),PTH2Y(3),PTH3Y(3)) PTH1Y(3) = IT PTH2Y(3) = IT ENDIF IF (PTH1Y(4).NE.-1.AND.PTH2Y(4).NE.-1) THEN IT = MAX(PTH1Y(4),PTH2Y(4),PTH3Y(4)) PTH1Y(4) = IT PTH2Y(4) = IT ENDIF ENDIF IF ((PTH1X(I1).NE.-1.AND.PTH1Y(I1).NE.-1) .AND. (PTH1X(I2).NE.-1.AND.PTH1Y(I2).NE.-1) ) THEN J1L = LINTRC + LSLOPE*PTH4Y(I1) + 0.5 J1R = RINTRC + RSLOPE*PTH4Y(I1) - 0.5 J1C = (J1L + J1R) / 2 J2L = LINTRC + LSLOPE*PTH5Y(I1) + 0.5 J2R = RINTRC + RSLOPE*PTH5Y(I1) - 0.5 J2C = (J2L + J2R) / 2 PTH1X(I3) = PTH1X(I1) PTH1Y(I3) = PTH1Y(I1) PTH2X(I3) = PTH2X(I1) PTH2Y(I3) = PTH2Y(I1) PTH3X(I3) = PTH3X(I1) PTH3Y(I3) = PTH3Y(I1) PTH4Y(I3) = PTH4Y(I1) PTH5Y(I3) = PTH5Y(I1) J3L = LINTRC + LSLOPE*PTH4Y(I2) J3R = RINTRC + RSLOPE*PTH4Y(I2) J3C = (J1L + J1R) / 2 J4L = LINTRC + LSLOPE*PTH5Y(I2) J4R = RINTRC + RSLOPE*PTH5Y(I2) J4C = (J2L + J2R) / 2 PTH1X(I4) = PTH1X(I2) PTH1Y(I4) = PTH1Y(I2) PTH2X(I4) = PTH2X(I2) PTH2Y(I4) = PTH2Y(I2) + 0.5 - 0.5 + 0.5 - 0.5

I2 I3 I4 IF

PTH3X(I4) = PTH3X(I2) PTH3Y(I4) = PTH3Y(I2) PTH4Y(I4) = PTH4Y(I2) PTH5Y(I4) = PTH5Y(I2) ELSEIF (PTH1X(I1).NE.-1.AND.PTH1Y(I1).NE.-1) THEN J1L = LINTRC + LSLOPE*PTH4Y(I1) + 0.5 J1R = RINTRC + RSLOPE*PTH4Y(I1) - 0.5 J1C = (J1L + J1R) / 2 J2L = LINTRC + LSLOPE*PTH5Y(I1) + 0.5 J2R = RINTRC + RSLOPE*PTH5Y(I1) - 0.5 J2C = (J2L + J2R) / 2 J3L = J1L J3R = J1R J3C = J1C J4L = J2L J4R = J2R J4C = J2C PTH1X(I3) = PTH1X(I1) PTH1Y(I3) = PTH1Y(I1) PTH2X(I3) = PTH2X(I1) PTH2Y(I3) = PTH2Y(I1) PTH3X(I3) = PTH3X(I1) PTH3Y(I3) = PTH3Y(I1) PTH4Y(I3) = PTH4Y(I1) PTH5Y(I3) = PTH5Y(I1) PTH1X(I4) = PTH1X(I1) PTH1Y(I4) = PTH1Y(I1) PTH2X(I4) = PTH2X(I1) PTH2Y(I4) = PTH2Y(I1) PTH3X(I4) = PTH3X(I1) PTH3Y(I4) = PTH3Y(I1) PTH4Y(I4) = PTH4Y(I1) PTH5Y(I4) = PTH5Y(I1) PTH1X(I2) = PTH1X(I1) PTH1Y(I2) = PTH1Y(I1) PTH2X(I2) = PTH2X(I1) PTH2Y(I2) = PTH2Y(I1) PTH3X(I2) = PTH3X(I1) PTH3Y(I2) = PTH3Y(I1) PTH4Y(I2) = PTH4Y(I1) PTH5Y(I2) = PTH5Y(I1) ELSEIF (PTH1X(I2).NE.-1.AND.PTH1Y(I2).NE.-1) THEN J1L = LINTRC + LSLOPE*PTH4Y(I2) + 0.5 J1R = RINTRC + RSLOPE*PTH4Y(I2) - 0.5 J1C = (J1L + J1R) / 2 J2L = LINTRC + LSLOPE*PTH5Y(I2) + 0.5 J2R = RINTRC + RSLOPE*PTH5Y(I2) - 0.5 J2C = (J2L + J2R) / 2 J3L = J1L J3R = J1R J3C = J1C J4L = J2L J4R = J2R J4C = J2C PTH1X(I3) = PTH1X(I2) PTH1Y(I3) = PTH1Y(I2) PTH2X(I3) = PTH2X(I2) PTH2Y(I3) = PTH2Y(I2) PTH3X(I3) = PTH3X(I2) PTH3Y(I3) = PTH3Y(I2)

PTH4Y(I3) = PTH4Y(I2) PTH5Y(I3) = PTH5Y(I2) PTH1X(I4) = PTH1X(I2) PTH1Y(I4) = PTH1Y(I2) PTH2X(I4) = PTH2X(I2) PTH2Y(I4) = PTH2Y(I2) PTH3X(I4) = PTH3X(I2) PTH3Y(I4) = PTH3Y(I2) PTH4Y(I4) = PTH4Y(I2) PTH5Y(I4) = PTH5Y(I2) PTH1X(I1) = PTH1X(I2) PTH1Y(I1) = PTH1Y(I2) PTH2X(I1) = PTH2X(I2) PTH2Y(I1) = PTH2Y(I2) PTH3X(I1) = PTH3X(I2) PTH3Y(I1) = PTH3Y(I2) PTH4Y(I1) = PTH4Y(I2) PTH5Y(I1) = PTH5Y(I2) ENDIF ELSEIF (ISA.OR.ISB) THEN J1L = LINTRC + LSLOPE*PTH4Y(1) + 0.5 J1R = RINTRC + RSLOPE*PTH4Y(1) - 0.5 J1C = (J1L + J1R) / 2 J2L = LINTRC + LSLOPE*PTH5Y(1) + 0.5 J2R = RINTRC + RSLOPE*PTH5Y(1) - 0.5 J2C = (J2L + J2R) / 2 J3L = LINTRC + LSLOPE*PTH4Y(4) + 0.5 J3R = RINTRC + RSLOPE*PTH4Y(4) - 0.5 J3C = (J3L + J3R) / 2 J4L = LINTRC + LSLOPE*PTH5Y(4) + 0.5 J4R = RINTRC + RSLOPE*PTH5Y(4) - 0.5 J4C = (J3L + J3R) / 2 ENDIF * IF (CNVDBG) PRINT *,' Preliminaries done.' DO 1223 I = 1,4 ABP4X(I) = PTH4X(I) ABP5X(I) = PTH5X(I) ABP4Y(I) = PTH4Y(I) ABP5Y(I) = PTH5Y(I) 1223 CONTINUE LL = (PTH1X(1).NE.-1.AND.PTH1Y(1).NE.-1) LR = (PTH1X(2).NE.-1.AND.PTH1Y(2).NE.-1) UL = (PTH1X(3).NE.-1.AND.PTH1Y(3).NE.-1) UR = (PTH1X(4).NE.-1.AND.PTH1Y(4).NE.-1) LL1 = LL .AND. PTHSLR LR1 = LR .AND. (PTHSLL .OR. LL) UL1 = UL .AND. PTHSUR UR1 = UR .AND. (PTHSUL .OR. UL) * * The original CNTPTH was designed to take path information from the common bloc k * and use only one path. It is now QNTPTH and this new CNTPTH saves the PATH in fo * in internal vaiables as the alternate paths are being fringe-counted. The pri mary * path is restored from these later. * * * ALTERNATE PATHS HERE .... APAPAPAPAP apapapapap *

ITER = -1 9009 CONTINUE * IF (CNVDBG) PRINT *,' LOOP BACK: ITER = ',ITER ITER = ITER + 1 IF (ISCDEI) THEN RDIVIS = 2*IQUAD + 1.0 RMULT = 2*ITER + 1.0 IF (ITER.EQ.0) RMULT = RMULT + 0.5 PTH4X(1) = J1L + RMULT * (J1C - J1L + 1)/RDIVIS + 0.5 PTH4Y(1) = (ITER*ABP4Y(1) + (IQUAD-ITER)*PTH3Y(1))/IQUAD PTH5X(1) = J2L + RMULT * (J2C - J2L + 1)/RDIVIS + 0.5 PTH4X(2) = J1R - RMULT * (J1R - J1C + 1)/RDIVIS - 0.5 PTH4Y(2) = (ITER*ABP4Y(2) + (IQUAD-ITER)*PTH3Y(2))/IQUAD PTH5X(2) = J2R - RMULT * (J2R - J2C + 1)/RDIVIS - 0.5 RMULT = 2*ITER + 2.0 IF (ITER.EQ.0) RMULT = RMULT + 0.25 PTH4X(3) = J3L + RMULT * (J3C - J3L + 1)/RDIVIS + 0.5 PTH4Y(3) = (ITER*ABP4Y(3) + (IQUAD-ITER)*PTH3Y(3))/IQUAD PTH5X(3) = J4L + RMULT * (J4C - J4L + 1)/RDIVIS + 0.5 PTH4X(4) = J3R - RMULT * (J3R - J3C + 1)/RDIVIS - 0.5 PTH4Y(4) = (ITER*ABP4Y(4) + (IQUAD-ITER)*PTH3Y(4))/IQUAD PTH5X(4) = J4R - RMULT * (J4R - J4C + 1)/RDIVIS - 0.5 DOMORE = ITER.LT.IQUAD ELSEIF (ISA.OR.ISB) THEN RDIVIS = IQUAD + 1.0 RMULT = ITER + 1.0 IF (ITER.EQ.0) RMULT = RMULT + 0.5 IF (ITER.EQ.1) RMULT = RMULT + 0.25 PTH4X(1) = J1L + RMULT * (J1C - J1L + 1)/RDIVIS + 0.5 PTH4Y(1) = (ITER*ABP4Y(1) + (IQUAD-ITER)*PTH3Y(1))/IQUAD PTH5X(1) = J2L + RMULT * (J2C - J2L + 1)/RDIVIS + 0.5 PTH4X(2) = J1R - RMULT * (J1R - J1C + 1)/RDIVIS - 0.5 PTH4Y(2) = (ITER*ABP4Y(2) + (IQUAD-ITER)*PTH3Y(2))/IQUAD PTH5X(2) = J2R - RMULT * (J2R - J2C + 1)/RDIVIS - 0.5 PTH4X(3) = J3L + RMULT * (J3C - J3L + 1)/RDIVIS + 0.5 PTH4Y(3) = (ITER*ABP4Y(3) + (IQUAD-ITER)*PTH3Y(3))/IQUAD PTH5X(3) = J4L + RMULT * (J4C - J4L + 1)/RDIVIS + 0.5 PTH4X(4) = J3R - RMULT * (J3R - J3C + 1)/RDIVIS - 0.5 PTH4Y(4) = (ITER*ABP4Y(4) + (IQUAD-ITER)*PTH3Y(4))/IQUAD PTH5X(4) = J4R - RMULT * (J4R - J4C + 1)/RDIVIS - 0.5 DOMORE = ITER.LT.IQUAD ELSE DOMORE = .FALSE. ENDIF * IF (DOMORE) THEN DO 101 J = 1,4 DO 102 I = 1,5 PATH(1,I) = PTH(J,1,I) PATH(2,I) = PTH(J,2,I) 102 CONTINUE PATH(1,6) = PATH(1,5) PATH(2,6) = PATH(2,5) IF ( OK(J) ) THEN IF (J.EQ.1.AND.ITER.EQ.0) THEN CALL CRCLS CALL GOTOXY(0,4) CALL QNTPTH(SARRAY,DARRAY,NX,NY) ELSE CALL GOTOXY(0,12)

PRINT *,'Auxilliary path: ',ITER,' ',J,' f ' &

',ITER*4+J,' o

&

101 ELSE

,IQUAD*4+1,' ' CALL QNTPTQ(SARRAY,DARRAY,NX,NY) ENDIF IF (CNVDBG.AND.DISP1T.AND..NOT.(ESCAPE.OR.INTRPT)) THEN CALL CPDBG5(0,NX,NY) ELSEIF (CNVDBG) THEN CALL XYGOTO(0,12) ENDIF Q2S(J,ITER) = DARRAY(PATH5X,PATH5Y) ELSEIF ( ( J.EQ.2.AND.LR1 ) .OR. ( J.EQ.4.AND.UR1 ) ) THEN Q2S(J,ITER) = Q2S(J-1,ITER) ELSE Q2S(J,ITER) = -1 ENDIF CONTINUE GOTO 9009 ITER = ITER - 1 ENDIF

* DO 1224 I = 1,4 PTH4X(I) = ABP4X(I) PTH5X(I) = ABP5X(I) PTH4Y(I) = ABP4Y(I) PTH5Y(I) = ABP5Y(I) 1224 CONTINUE * IF (ISA.OR.ISB) THEN IF (PTHSLL.OR.PTHSLR) THEN J = 3 IF (.NOT.OK(J)) J = 4 ELSEIF (PTHSUL.OR.PTHSUR) THEN J = 1 IF (.NOT.OK(J)) J = 2 ENDIF IF (OK(J)) THEN DO 1102 I = 1,5 PATH(1,I) = PTH(J,1,I) PATH(2,I) = PTH(J,2,I) 1102 CONTINUE PATH(1,6) = PATH(1,5) PATH(2,6) = PATH(2,5) CALL XYGOTO(0,11) PRINT *,ITER,' ',J,' alt. path extra for FORM: ',MGFRMN(1) CALL QNTPTQ(SARRAY,DARRAY,NX,NY) Q2S(1,ITER+1) = DARRAY(PATH5X,PATH5Y) IF (CNVDBG.AND.DISP1T.AND..NOT.(ESCAPE.OR.INTRPT)) CALL CPDBG5(0,N X,NY) ENDIF ENDIF * * All alternate paths done, do main path ... * DO 12 I = 1,6 PATH(1,I) = SAVEP(1,I) PATH(2,I) = SAVEP(2,I) 12 CONTINUE

CALL QNTPTQ(SARRAY,DARRAY,NX,NY) QDRNT = DARRAY(PATH5X,PATH5Y) IF (PTHSLL) THEN J = 1 ELSEIF (PTHSLR) THEN J = 2 ELSEIF (PTHSUL) THEN J = 3 ELSEIF (PTHSUR) THEN J = 4 ELSE J = 1 ENDIF IF (QS(J).EQ.-1) QS(J) = QDRNT IF (Q2S(J,1).EQ.-1) Q2S(J,1) = QDRNT IF (Q2S(J,2).EQ.-1) Q2S(J,2) = QDRNT IF (ISA.OR.ISB) THEN PRINT *,'CNTPTH: QDRNT = ',QDRNT,' extra: ',Q2S(1,ITER+1) ELSE PRINT *,'CNTPTH: QDRNT = ',QDRNT ENDIF II = MIN(3,ITER) PRINT *,' QS = ',(QS(J),' ',J=1,4),' ',((Q2S(J,I),' ',J=1,4),' ',I=1 ,II) IF (ITER.GT.3) THEN DO 1122 JK = 4,ITER,5 II = MIN(ITER,JK+4) PRINT *,'more QS = ',((Q2S(J,I),' ',J=1,4),' ',I=JK,II) 1122 CONTINUE ENDIF * DO 1212 I = 1,NX * IF (DARRAY(I,1).NE.-1) DARRAY(I,1) = QSTART * IF (DARRAY(I,NY).NE.-1) DARRAY(I,NY) = QSTART * 1212 CONTINUE * DO 1213 J = 1,NY * IF (DARRAY(1,J).NE.-1) DARRAY(1,J) = QSTART * IF (DARRAY(NX,J).NE.-1) DARRAY(NX,J) = QSTART * 1213 CONTINUE MXQ = 0 MNQ = QDRNT+12 DO 17 J = 1,4 DO 18 I = 0,2 IF (Q2S(J,I).NE.-1) THEN MXQ = MAX(MXQ,Q2S(J,I)) MNQ = MIN(MNQ,Q2S(J,I)) ENDIF 18 CONTINUE 17 CONTINUE IF ((MXQ-MNQ).GT.1) CALL WAIT(1.7) IF ((MXQ-MNQ).GT.0) CALL WAIT(2.3) LOWCUT = LOWSAV IHICUT = IHISAV RETURN END *---------------------------------------------------------------------*QPQPQPQPQPQPQPQPqpqpqpqpqpqpqpqp $SEGMENT I__TO_E SUBROUTINE QNTPTH(SARRAY,DARRAY,NX,NY) * IMPLICIT CHARACTER*123 (A-Z) CHARACTER*1 MGFRMN(2)

REAL*4 RDEBUG(20480),DENOM,TEMP1(20480) INTEGER*4 NX,NY,LOWCUT,IHICUT,IJKL,APORCP,FCALL4,IB,IDX,IDY,MODE INTEGER*4 IJS(3),IJ2S(3),BUF(3),INDST3,INDEX3,ILEN,I,J,IHI1,IHI2,IHI3 INTEGER*4 IFR,INC,IS,ISS,IT,ISTEP,IXB,IXE,IYE,IYB,J1,J2,JSTEP,K INTEGER*4 LOW1,LOW2,LOW3,LLCTRD,RLCTRD,BLCTRD,TLCTRD INTEGER*2 SARRAY(NX,NY),DARRAY(NX,NY),VALUES(1000,4),VALPTH,IPASS INTEGER*2 PATH1X,PATH1Y,PATH2X,PATH2Y,PATH3X,PATH3Y,QSTART,I16384 INTEGER*2 PATH(2,6),PATH4X,PATH4Y,PATH5X,PATH5Y,PATH6X,PATH6Y INTEGER*2 TYP(3),ICHS(3),STEP(100,2,120),FRYS(100),MAXSTP,BIG2,SMALL2 INTEGER*2 BIG,SMALL,RANGE,VCNTRL,HCNTRL,VCTRLN,HCTRLN,ITERS,HIINIT,LOINIT INTEGER*2 HIEND,LOEND,MIDGLI,UPGLI,LOGLI,TEMP0(4096),IK(7) INTEGER*1 HILO(1000) LOGICAL*2 PTHDUN,CNVDBG,DISPIT,MGLR,MGUD,MGOTHR,MGOK,BLCTOK,TLCTOK LOGICAL*2 SMOOTH,NOKILL,NOK1LL,DEGLCH LOGICAL*1 ISLOW,ISHIGH,AWAY,ISLOW2,ISHI2,MONO,GOOD,ORD,DOCNT,QUIET LOGICAL*1 INITHI,INITLO,ENDHI,ENDLO,INIBAD,FOO1,FOO2 EQUIVALENCE (PATH(1,1),PATH1X),(PATH(2,1),PATH1Y),(STEP(1,1,1),TEMP1(1)) EQUIVALENCE (PATH(1,2),PATH2X),(PATH(2,2),PATH2Y),(HILO(1),TEMP1(20000)) EQUIVALENCE (PATH(1,3),PATH3X),(PATH(2,3),PATH3Y),(TEMP0(1000),IK(1)) EQUIVALENCE (PATH(1,4),PATH4X),(PATH(2,4),PATH4Y) EQUIVALENCE (PATH(1,5),PATH5X),(PATH(2,5),PATH5Y) EQUIVALENCE (PATH(1,6),PATH6X),(PATH(2,6),PATH6Y) EQUIVALENCE (VCNTRL,VCTRLN),(HCNTRL,HCTRLN) COMMON /MGPATH/PATH,PTHDUN,/I2ENML/LOWCUT,IHICUT,/LINPTH/VALPTH,VALUES COMMON /FETURE/LLCTRD,RLCTRD,BLCTRD,TLCTRD,VCNTRL,HCNTRL,BLCTOK,TLCTOK COMMON /KIASMN/ICHS,BUF,TYP,IJS,IJ2S,/DEBUGC/CNVDBG,/PARPLZ/RDEBUG COMMON /DEBUG5/DISPIT,/FRINGE/FRYS,/STARTQ/QSTART,/WFMOUT/TEMP1 COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/PARNML/BIG,SMALL,RANGE COMMON /MGFRAM/MGFRMN,MGLR,MGUD,MGOTHR,MGOK,/QITERS/ITERS,/HILOSM/SMOOTH COMMON /PARCDA/TEMP0,/ENDKIL/NOKILL,NOK1LL,DEGLCH SAVE /MGPATH/,/I2ENML/,/LINPTH/,/KIASMN/,/DEBUGC/,/FRINGE/,/STARTQ/ SAVE /PARNML/,/PARNM2/,/MGFRAM/,/FETURE/,/WFMOUT/,/PARPLZ/,/QITERS/ SAVE /HILOSM/,/PARCDA/,/ENDKIL/ EXTERNAL APORCP,FCALL4,INDST3,INDEX3 SAVE * * ORD = .TRUE. DOCNT = .TRUE. QUIET = .FALSE. GOTO 9090 * ENTRY QNTPT4(SARRAY,DARRAY,NX,NY) ORD = .FALSE. DOCNT = .TRUE. QUIET = .FALSE. GOTO 9090 * ENTRY QNTPTQ(SARRAY,DARRAY,NX,NY) ORD = .FALSE. DOCNT = .TRUE. QUIET = .TRUE. GOTO 9090 * ENTRY QNTPTF(SARRAY,DARRAY,NX,NY) ORD = .FALSE. DOCNT = .FALSE. QUIET = .FALSE. GOTO 9090 *

9090

9002 9001

9004 9003

9014

ENTRY QNTPTI(SARRAY,DARRAY,NX,NY) ORD = .TRUE. DOCNT = .FALSE. QUIET = .FALSE. CONTINUE IF (DOCNT) THEN IHI1 = IHICUT LOW1 = LOWCUT IHI2 = (IHICUT*3 + LOWCUT)/4 LOW2 = (IHICUT + LOWCUT*3)/4 IHI3 = MIN0(16380,(IHICUT+(IHICUT-IHI2))) LOW3 = MAX0(3,(LOWCUT-(LOW2-LOWCUT))) IF ( (ORD.OR.CNVDBG).AND.( (.NOT.QUIET).OR.(ORD.AND.CNVDBG) ) ) THEN PRINT *,'QNTPTH: ENTERED - IHICUT = ',IHICUT,' LOWCUT = ',LOWCUT PRINT *,'IHICUT = ',IHICUT,' LOWCUT = ',LOWCUT PRINT *,'IHI2 = ',IHI2,' LOW2 = ',LOW2 PRINT *,'IHI3 = ',IHI3,' LOW3 = ',LOW3 PRINT *,'ITERS = ',ITERS ENDIF IF (ITERS.GT.39) ITERS = 6 DO 9001 J = 1,4 DO 9002 I = 1,1000 VALUES(I,J) = 0 CONTINUE CONTINUE DO 9003 J = 1,120 DO 9004 I = 1,100 STEP(I,1,J) = 0 STEP(I,2,J) = 0 CONTINUE CONTINUE ENDIF IF (DOCNT.AND.ORD) THEN DO 9014 I = 1,100 FRYS(I) = 0 CONTINUE ENDIF

* * * CURRENTLY setting up simple min/max finding - copy path data to * internal array * IF (DOCNT) THEN IJKL = 0 DO 1 K = 1,5 * IF (CNVDBG) PRINT *,'QNTPTH: FIRST LOOP K = ',K IXB = PATH(1,K) IYB = PATH(2,K) IXE = PATH(1,K+1) IYE = PATH(2,K+1) IDX = IXE - IXB IDY = IYE - IYB IF (K.EQ.4) THEN FRYS(1) = IYB FRYS(99) = IYE FRYS(100) = IJKL + 1 IFR = 1 ENDIF IF (IABS(IDX).GE.IABS(IDY)) THEN IF (IDX.GE.0) THEN

* *

1002 * * * *

2 ELSE

INC = 1 ELSEIF (IDX.LT.0) THEN INC = -1 ENDIF DO 2 I = IXB,(IXE-INC),INC J = IYB + (I-IXB)*IDY/IDX IF (DARRAY(I,J).EQ.-1) GOTO 1001 IJKL = IJKL + 1 IF (IJKL.GT.999) GOTO 1101 IT = 2 ITR = 1 DO 1002 JJ = -1,1 DO 1002 JJ = -2,2 IF (DARRAY(I,J+JJ).NE.-1) THEN IW = 3 - IABS(JJ) IW = 2 - IABS(JJ) IT = IT + SARRAY(I,J+JJ)*IW ITR = ITR + IW ENDIF CONTINUE VALUES(IJKL,1) = (SARRAY(I,J) + IT)/ITR VALUES(IJKL,2) = I VALUES(IJKL,3) = J VALUES(IJKL,4) = DARRAY(I,J) VALUES(IJKL,2) = I VALUES(IJKL,3) = J IF (DARRAY(I,J).NE.-1) THEN VALUES(IJKL,1) = (SARRAY(I,J) + IT)/ITR VALUES(IJKL,4) = DARRAY(I,J) ELSE VALUES(IJKL,1) = VALUES(IJKL-1,1) VALUES(IJKL,4) = VALUES(IJKL-1,4) ENDIF CONTINUE IF (IDY.GE.0) THEN INC = 1 ELSEIF (IDY.LT.0) THEN INC = -1 ENDIF DO 3 J = IYB,(IYE-INC),INC I = IXB + (J-IYB)*IDX/IDY IF (DARRAY(I,J).EQ.-1) GOTO 1001 IJKL = IJKL + 1 IF (IJKL.GT.999) GOTO 1101 IT = 2 ITR = 1 DO 1003 II = -1,1 DO 1003 II = -2,2 IF (DARRAY(I+II,J).NE.-1) THEN IW = 3 - IABS(II) IW = 2 - IABS(II) IT = IT + SARRAY(I+II,J) * IW ITR = ITR + IW ENDIF CONTINUE VALUES(IJKL,2) = I VALUES(IJKL,3) = J IF (DARRAY(I,J).NE.-1) THEN VALUES(IJKL,1) = (SARRAY(I,J) + IT)/ITR

* *

1003

VALUES(IJKL,4) = DARRAY(I,J) ELSE VALUES(IJKL,1) = VALUES(IJKL-1,1) VALUES(IJKL,4) = VALUES(IJKL-1,4) ENDIF CONTINUE ENDIF CONTINUE

3 1 * 1101

CONTINUE IJKL = IJKL + 1 I = PATH(1,6) VALUES(IJKL,2) = J = PATH(2,6) VALUES(IJKL,3) = VALUES(IJKL,1) = VALUES(IJKL,4) = 1001 CONTINUE VALPTH = IJKL ENDIF

I J SARRAY(I,J) DARRAY(I,J)

* * *** *** DEBUGGING STUFF *** IF (CNVDBG.AND.DOCNT) THEN ILEN = VALPTH I = INDST3(ILEN,2,2) ENDIF *** *** * SET STARTING QUADRANT (value set in CNTPTH ...) * and set initial HIGH or LOW * IF (DOCNT) VALUES(1,4) = QSTART * *HIHIHIHIHIHLOLOLOLOLOhihihihihilolololololo * * NEXT - find extrema along path - FIRST, fill auxillary array hilo indicators * IF (DOCNT) THEN DO 190 I = 1,VALPTH HILO(I) = 0 190 CONTINUE J1 = 1 J2 = VALPTH IPASS = 0 HIINIT = 0 LOINIT = 0 HIEND = 0 LOEND = 0 * 191 CONTINUE IPASS = IPASS + 1 * IF (CNVDBG) PRINT *,'QNTPTH: FILL AUXILLIARY HILO, PASS ',IPASS IF (IPASS.GT.3.AND.MOD(IPASS,2).EQ.0) THEN IHI3 = (IHI1 + IHI3)/2 LOW3 = (LOW1 + LOW3)/2 IHI1 = (IHI1 + IHI2)/2 LOW1 = (LOW1 + LOW2)/2

IHI2 = IHI2 - (IHI3-IHI1) LOW2 = LOW2 - (LOW3-LOW1) ELSEIF (IPASS.GT.3.AND.MOD(IPASS,2).EQ.1) THEN IHI1 = (IHI2*7 + LOW2)/8 LOW1 = (IHI2 + LOW2*7)/8 IHI2 = (IHI1*7 + LOW1)/8 LOW2 = (IHI1 + LOW1*7)/8 IHI3 = MIN0(16380,(IHI1+(IHI1-IHI2))) IF (IHI3.EQ.16380) IHI3 = (IHI3 + IHI1) / 2 LOW3 = MAX0(3,(LOW1-(LOW2-LOW1))) IF (LOW3.EQ.3) LOW3 = (LOW3 + LOW1) / 2 ELSEIF (IPASS.EQ.3) THEN * normal standards on the THIRD pass IHI1 = IHICUT LOW1 = LOWCUT IHI2 = (IHI1*7 + LOW1)/8 LOW2 = (IHI1 + LOW1*7)/8 IHI3 = MIN0(16380,(IHI1+(IHI1-IHI2))) IF (IHI3.EQ.16380) IHI3 = (IHI3 + IHI1) / 2 LOW3 = MAX0(3,(LOW1-(LOW2-LOW1))) IF (LOW3.EQ.3) LOW3 = (LOW3 + LOW1) / 2 ELSEIF (IPASS.EQ.2) THEN * Stricter than normal standards on the SECOND pass LOW3 = (LOW3 + LOW1) / 2 IHI3 = (IHI3 + IHI1) / 2 IHI1 = (LOW1 + LOW2) / 2 LOW1 = (IHI1 + IHI2) / 2 IHI2 = IHI1 - (IHI3-IHI1) LOW2 = LOW1 - (LOW3-LOW1) ELSEIF (IPASS.EQ.1) THEN * Stricter than normal standards on the first pass IHI2 = (IHICUT*7 + LOWCUT)/8 LOW2 = (IHICUT + LOWCUT*7)/8 IHI1 = MIN0(16380,(IHICUT+(IHICUT-IHI2))) IF (IHI1.EQ.16380) IHI1 = (IHI1 + IHI2) / 2 LOW1 = MAX0(3,(LOWCUT-(LOW2-LOWCUT))) IF (LOW1.EQ.3) LOW1 = (LOW1 + LOW2) / 2 IHI2 = IHICUT LOW2 = LOWCUT IHI3 = MIN0(16380,(IHI1+(IHI1-IHI2))) IF (IHI3.EQ.16380) IHI3 = (IHI3 + IHI1) / 2 LOW3 = MAX0(3,(LOW1-(LOW2-LOW1))) IF (LOW3.EQ.3) LOW3 = (LOW3 + LOW1) / 2 ENDIF * ISLOW2 = VALUES(1,1).LE.LOW3 ISHI2 = VALUES(1,1).GE.IHI3 ISLOW = VALUES(1,1).LE.LOW1 .OR. ISLOW2 ISHIGH = VALUES(1,1).GE.IHI1 .OR. ISHI2 IF (ISHIGH) THEN HIINIT = HIINIT + 1 IF (ISHI2) HIINIT = HIINIT + 1 ELSEIF (ISLOW) THEN LOINIT = LOINIT + 1 IF (ISLOW2) LOINIT = LOINIT + 1 ELSEIF (VALUES(2,1).LE.LOW1) THEN LOINIT = LOINIT + 1 ELSEIF (VALUES(2,1).GE.IHI1) THEN HIINIT = HIINIT + 1 ENDIF

10 *

IT = 0 DO 10 I = 2,VALPTH IF (ISLOW2) THEN IF (VALUES(I,1).GT.LOW1) THEN ISLOW2 = .FALSE. IT = MIN0(IT+1,0) ENDIF ELSEIF (ISHI2) THEN IF (VALUES(I,1).LT.IHI1) THEN ISHI2 = .FALSE. IT = MAX0(IT-1,0) ENDIF ELSEIF (ISLOW) THEN IF (VALUES(I,1).GT.LOW2) THEN ISLOW = .FALSE. IT = 0 ELSEIF (VALUES(I,1).LT.LOW3) THEN ISLOW2 = .TRUE. IT = IT - 1 ENDIF ELSEIF (ISHIGH) THEN IF (VALUES(I,1).LT.IHI2) THEN ISHIGH = .FALSE. IT = 0 ELSEIF (VALUES(I,1).GT.IHI3) THEN ISHI2 = .TRUE. IT = IT + 1 ENDIF ELSE IF (VALUES(I,1).GE.IHI1) THEN ISHIGH = .TRUE. IT = 1 ELSEIF (VALUES(I,1).LE.LOW1) THEN ISLOW = .TRUE. IT = -1 ENDIF ENDIF HILO(I) = HILO(I) + IT CONTINUE ISLOW2 = VALUES(VALPTH,1).LE.LOW3 ISHI2 = VALUES(VALPTH,1).GE.IHI3 ISLOW = VALUES(VALPTH,1).LE.LOW1 .OR. ISLOW2 ISHIGH = VALUES(VALPTH,1).GE.IHI1 .OR. ISHI2 IF (ISHIGH) THEN HIEND = HIEND + 1 IF (ISHI2) HIEND = HIEND + 1 ELSEIF (ISLOW) THEN LOEND = LOEND + 1 IF (ISLOW2) LOEND = LOEND + 1 ELSEIF (VALUES(VALPTH-1,1).GE.IHI1) THEN HIEND = HIEND + 1 ELSEIF (VALUES(VALPTH-1,1).LE.LOW1) THEN LOEND = LOEND + 1 ENDIF IT = 0 DO 11 I = VALPTH,1,-1 IF (ISLOW2) THEN IF (VALUES(I,1).GT.LOW1) THEN ISLOW2 = .FALSE.

11 * * Reset HI and LOW values and go back to 191 for additional processing passes IF (IPASS.LE.ITERS) GOTO 191 MAXSTP = 6*IPASS INITHI = ((HIINIT*3.0)/IPASS) .GT. 1.0 INITLO = ((LOINIT*3.0)/IPASS) .GT. 1.0 ENDHI = ((HIEND*3.0)/IPASS) .GT. 1.0 ENDLO = ((LOEND*3.0)/IPASS) .GT. 1.0 IF (CNVDBG) PRINT *,'QNTPTH: Init: HI/LO ',INITHI,'/',INITLO,' End: H I/LO ',ENDHI,'/',ENDLO * *ITERiterITERiterITERiterITERiterITERiter * * * FIND MIN AND MAX HILO VALUES AND USE THEM TO SET IGNORE LEVEL ** * IF (ITERS.GE.8) THEN * MNHILO = 0 * MXHILO = 0 * DO 1780 I = 1,VALPTH * MNHILO = MIN(MNHILO,HILO(I)) * MXHILO = MAX(MXHILO,HILO(I)) * 1780 CONTINUE * R = MAX(MXHILO,IABS(MNHILO)) * 2.0 / MAXSTP * S = MIN(MXHILO,IABS(MNHILO)) * 3.0 / MAXSTP * IGNORE = (R + S)*0.5

IT = MIN0(IT+1,0) ENDIF ELSEIF (ISHI2) THEN IF (VALUES(I,1).LT.IHI1) THEN ISHI2 = .FALSE. IT = MAX0(IT-1,0) ENDIF ELSEIF (ISLOW) THEN IF (VALUES(I,1).GT.LOW2) THEN ISLOW = .FALSE. IT = 0 ELSEIF (VALUES(I,1).LT.LOW3) THEN ISLOW2 = .TRUE. IT = IT - 1 ENDIF ELSEIF (ISHIGH) THEN IF (VALUES(I,1).LT.IHI2) THEN ISHIGH = .FALSE. IT = 0 ELSEIF (VALUES(I,1).GT.IHI3) THEN ISHI2 = .TRUE. IT = IT + 1 ENDIF ELSE IF (VALUES(I,1).GE.IHI1) THEN ISHIGH = .TRUE. IT = 1 ELSEIF (VALUES(I,1).LE.LOW1) THEN ISLOW = .TRUE. IT = -1 ENDIF ENDIF HILO(I) = HILO(I) + IT CONTINUE

* ** * * * * * * * * * * *

IF (IGNORE.LT.1) IGNORE = 1 IF (IGNORE.GT.IPASS) IGNORE = IPASS IF (.NOT.SMOOTH) IGNORE = 0 IF (ITERS.LE.9) IGNORE = MIN(IGNORE,1) IF (ITERS.LE.12) IGNORE = MIN(IGNORE,2) IF (ITERS.LE.15) IGNORE = MIN(IGNORE,3) IF (ITERS.LE.18) IGNORE = MIN(IGNORE,4) ELSE IGNORE = 0 ENDIF PRINT *,'QNTPTH: IGNORE LEVEL = ',IGNORE,' IHI1 LOW1 IHI2 LOW2 IHI3 LOW3 = = = = = = IHICUT LOWCUT (IHICUT*3 + LOWCUT)/4 (IHICUT + LOWCUT*3)/4 MIN0(16380,(IHICUT+(IHICUT-IHI2))) MAX0(3,(LOWCUT-(LOW2-LOWCUT))) ITERS = ',ITERS

* * * Beginning and end fixups next ... * IF (HILO(1).EQ.0) GOTO 114 DO 110 I = 2,VALPTH J1 = I IF (HILO(I).EQ.0) GOTO 111 110 CONTINUE 111 CONTINUE MONO = .TRUE. ISHIGH = HILO(1).GT.0 ISLOW = HILO(1).LT.0 DO 112 I = 2,J1 IF (ISLOW) THEN MONO = MONO .AND. HILO(I).GE.HILO(I-1) ELSEIF (ISHIGH) THEN MONO = MONO .AND. HILO(I).LE.HILO(I-1) ELSE ISHIGH = HILO(I) .GT. 0 ISLOW = HILO(I) .LT. 0 ENDIF IF (.NOT.MONO) GOTO 114 112 CONTINUE DO 113 I = 1,J1 HILO(I) = 0 113 CONTINUE 114 CONTINUE HILO(1) = 0 * * IF (MGFRMN(1).EQ.'C'.OR.MGFRMN(1).EQ.'c'.OR. * & MGFRMN(1).EQ.'D'.OR.MGFRMN(1).EQ.'d'.OR. * & MGFRMN(1).EQ.'E'.OR.MGFRMN(1).EQ.'e'.OR. * & MGFRMN(1).EQ.'I'.OR.MGFRMN(1).EQ.'i') GOTO 124 IF (HILO(VALPTH).EQ.0) GOTO 124 DO 120 I = (VALPTH-1),1,-1 J2 = I IF (HILO(I).EQ.0) GOTO 121 120 CONTINUE 121 CONTINUE MONO = .TRUE.

ISHIGH = HILO(VALPTH) .GT. 0 ISLOW = HILO(VALPTH) .LT. 0 DO 122 I = VALPTH-1,J2,-1 IF (ISLOW) THEN MONO = MONO .AND. HILO(I).GE.HILO(I-1) ELSEIF (ISHIGH) THEN MONO = MONO .AND. HILO(I).LE.HILO(I-1) ELSE ISHIGH = HILO(I) .GT. 0 ISLOW = HILO(I) .LT. 0 ENDIF IF (.NOT.MONO) GOTO 124 122 CONTINUE DO 123 I = VALPTH,J2,-1 HILO(I) = 0 123 CONTINUE 124 CONTINUE HILO(VALPTH) = 0 ENDIF * * * * * * * * * Now a little working over of the HILO indicators before analysis. Narrow minima at the PAR/OMA scanning glitches (0.25, 0.5 & 0.75 vertical) get supressed first, ALSO glitches are removed. To be removed, a minimum must be at the central scanning glitch and less than 7% wide OR at the upper or lower off-central glitches and 5% wide OR less than 2% wide. MAXIMA less than 2% wide also get removed.

MIDGLI = (1+NY)/2 LOGLI = (1+MIDGLI)/2 UPGLI = (MIDGLI+NY)/2 IB = -1 I2B = -1 DO 1700 I = 2,(VALPTH-1) IF (IB.GT.0.AND.HILO(I).GE.0.AND.HILO(I-1).LT.0) THEN IF (I2B.LT.0.AND.HILO(I).GT.0.AND.HILO(I-1).LE.0) THEN I2B = VALUES(I,3) I2B2 = I ENDIF IE = VALUES(I,3) IE2 = I IDELT = IE - IB IDELT = MIN(IDELT, (IE2-IB2) ) IF (IB.LE.MIDGLI.AND.MIDGLI.LE.IE) THEN FOO1 = (IDELT*100.LE.NY*7) .AND. DEGLCH IF (CNVDBG.AND.FOO1) PRINT *,'QNTPTH: Eating Central glitch @ ',+(IB2+IE2)/2,'...' ELSEIF (IB.LE.UPGLI.AND.UPGLI.LE.IE) THEN FOO1 = (IDELT*100.LE.NY*5) .AND. DEGLCH IF (CNVDBG.AND.FOO1) PRINT *,'QNTPTH: Eating Upper glitch @ ' ,+(IB2+IE2)/2,'...' ELSEIF (IB.LE.LOGLI.AND.LOGLI.LE.IE) THEN FOO1 = (IDELT*100.LE.NY*5) .AND. DEGLCH IF (CNVDBG.AND.FOO1) PRINT *,'QNTPTH: Eating Lower glitch @ ' ,+(IB2+IE2)/2,'...' ELSE FOO1 = (IDELT*100.LE.NY*2) .AND. DEGLCH IF (CNVDBG.AND.FOO1) PRINT *,'QNTPTH: Eating small glitch (v) @ ',+(IB2+IE2)/2,'...' ENDIF

IF (FOO1) THEN IT = ( HILO(IB2-1) + HILO(IE2+1) + SIGN(1,HILO(IB2-1)) )/2 IF (HILO(IB2-1)*HILO(IE2+1).LT.0) IT = 0 DO 1701 J = IB2,IE2 HILO(J) = IT 1701 CONTINUE ENDIF IB = -1 ELSEIF (I2B.GT.0.AND.HILO(I).LE.0.AND.HILO(I-1).GT.0) THEN IF (IB.LT.0.AND.HILO(I).LT.0.AND.HILO(I-1).GE.0) THEN IB = VALUES(I,3) IB2 = I ENDIF IE = VALUES(I,3) IE2 = I IDELT = IE - I2B IF (IDELT*100.LE.NY*2.AND.DEGLCH) THEN IF (CNVDBG) PRINT *,'QNTPTH: EATING SMALL GLITCH (^) @ ',+(I2B 2+IE2)/2,'...' IT = (HILO(I2B-1) + HILO(IE+1) + 1)/2 DO 1702 J = I2B2,IE2 HILO(J) = IT 1702 CONTINUE ENDIF I2B = -1 ELSEIF (I2B.LT.0.AND.HILO(I).GT.0.AND.HILO(I-1).LE.0) THEN I2B = VALUES(I,3) I2B2 = I ELSEIF (IB.LT.0.AND.HILO(I).LT.0.AND.HILO(I-1).GE.0) THEN IB = VALUES(I,3) IB2 = I ENDIF 1700 CONTINUE * * * NEXT, a 5 point Median smooth and a 9 point Median smooth * IF (.NOT.SMOOTH) GOTO 2300 * DO 2301 I = 1,VALPTH TEMP0(I) = HILO(I) 2301 CONTINUE DO 2302 I = 3,(VALPTH-2) IK(1) = TEMP0(I-2) IK(2) = TEMP0(I-1) IK(3) = TEMP0(I) IK(4) = TEMP0(I+1) IK(5) = TEMP0(I+2) DO 2303 J = 1,3 DO 2304 JJ = J,5 IF (IK(J).LT.IK(JJ)) THEN IKK = IK(J) IK(J) = IK(JJ) IK(JJ) = IKK ENDIF 2304 CONTINUE 2303 CONTINUE HILO(I) = IK(3) 2302 CONTINUE *

2311

2314 2313 2312 *

DO 2311 I = 1,VALPTH TEMP0(I) = HILO(I) CONTINUE DO 2312 I = 5,(VALPTH-4) IK(1) = TEMP0(I-4) IK(2) = TEMP0(I-3) IK(3) = TEMP0(I-2) IK(4) = TEMP0(I-1) IK(5) = TEMP0(I) IK(6) = TEMP0(I+1) IK(7) = TEMP0(I+2) IK(8) = TEMP0(I+3) IK(9) = TEMP0(I+4) DO 2313 J = 1,5 DO 2314 JJ = J,9 IF (IK(J).LT.IK(JJ)) THEN IKK = IK(J) IK(J) = IK(JJ) IK(JJ) = IKK ENDIF CONTINUE CONTINUE HILO(I) = IK(5) CONTINUE

2300 CONTINUE * * * Next sharpen leading edge of first transition ... * IB = -1 IJ = 0 IF (.NOT.BLCTOK) THEN LCTRD = TLCTRD ELSEIF (.NOT.TLCTOK) THEN LCTRD = BLCTRD ELSEIF (VALUES(1,3).LT.HCNTRL) THEN LCTRD = BLCTRD ELSEIF (VALUES(1,3).GT.HCNTRL) THEN LCTRD = TLCTRD ELSE LCTRD = -1 ENDIF IF (INITHI) THEN DO 1720 I = 2,(VALPTH-1) IF (IB.LT.0.AND.HILO(I).LT.0) THEN IB = I II = I ICMP = HILO(I) ELSEIF (IB.GT.0.AND.IJ.EQ.0.AND.HILO(I).LT.ICMP) THEN II = I ICMP = HILO(I) ELSEIF (IB.GT.0.AND.HILO(I).GT.ICMP) THEN IF (IJ.EQ.0) IE = I IJ = I ICMP = HILO(I) ELSEIF (IB.GT.0.AND.(HILO(I).GE.0.OR.(IJ.GT.0.AND.HILO(I).LT.ICMP) )) THEN DO 1721 J = IB,(II-1) HILO(J) = 0

CONTINUE IT = HILO(I) IF (LCTRD.GT.0) THEN J1 = VALUES(II,3) J2 = VALUES(IE,3) ID1 = IABS(J1-LCTRD) ID2 = IABS(J2-LCTRD) ID = MIN(ID1,ID2) IF (ID*100.LT.NY*7) IT = 0 ENDIF DO 1722 J = (IE+1),(IJ+1) HILO(J) = IT 1722 CONTINUE GOTO 1729 ENDIF 1720 CONTINUE ELSEIF (INITLO) THEN DO 1724 I = 2,(VALPTH-1) IF (IB.LT.0.AND.HILO(I).GT.0) THEN IB = I II = I ICMP = HILO(I) ELSEIF (IB.GT.0.AND.IJ.EQ.0.AND.HILO(I).GT.ICMP) THEN II = I ICMP = HILO(I) ELSEIF (IB.GT.0.AND.HILO(I).LT.ICMP) THEN IF (IJ.EQ.0) IE = I IJ = I ICMP = HILO(I) ELSEIF (IB.GT.0.AND.(HILO(I).LE.0.OR.(IJ.GT.0.AND.HILO(I).GT.ICMP) )) THEN DO 1725 J = IB,(II-1) HILO(J) = 0 1725 CONTINUE IT = HILO(I) IF (LCTRD.GT.0) THEN J1 = VALUES(II,3) J2 = VALUES(IE,3) ID1 = IABS(J1-LCTRD) ID2 = IABS(J2-LCTRD) ID = MIN(ID1,ID2) IF (ID*100.LT.NY*7) IT = 0 ENDIF DO 1726 J = (IE+1),(IJ+1) HILO(J) = IT 1726 CONTINUE GOTO 1729 ENDIF 1724 CONTINUE ENDIF 1729 CONTINUE * * ** ** DEBUGGING STUFF ** IF (CNVDBG.AND.DOCNT) THEN ILEN = VALPTH I = INDST3(ILEN,2,2) DO 8002 I = 1,VALPTH

1721

RDEBUG(INDEX3(I,1,2)) = I RDEBUG(INDEX3(I,2,2)) = HILO(I) 8002 CONTINUE * CALL FANCYP(RDEBUG,ILEN,2) * CALL GRCLS ENDIF ** ** * * find extrema along path - NEXT, ANALYZE auxillary array hilo indicators * IF (DOCNT) THEN ISTEP = 0 ICMP = HILO(1) INDCMP = 1 DO 15 I = 2,VALPTH IF (HILO(I).NE.HILO(I-1)) THEN IF (HILO(I).LT.HILO(I-1).AND.HILO(I).LT.0) THEN IF ((HILO(I).EQ.-1.OR.HILO(I-1).GE.0).AND.I.LT.VALPTH-2) T HEN ISTEP = ISTEP + 1 DO 16 J = 1,MAXSTP STEP(ISTEP,1,J) = I STEP(ISTEP,2,J) = 0 16 CONTINUE ELSEIF (STEP(ISTEP,2,IABS(HILO(I))).EQ.0.AND.I.LT.VALPTH-2 ) THEN STEP(ISTEP,1,IABS(HILO(I))) = I ENDIF ICMP = HILO(I) ELSEIF (HILO(I).GT.HILO(I-1).AND.HILO(I).GT.0) THEN IF ((HILO(I).EQ.1.OR.HILO(I-1).LE.0).AND.I.LT.VALPTH-2) TH EN ISTEP = ISTEP + 1 DO 17 J = 1,MAXSTP STEP(ISTEP,1,J) = I STEP(ISTEP,2,J) = 0 17 CONTINUE ELSEIF (STEP(ISTEP,2,IABS(HILO(I))).EQ.0.AND.I.LT.VALPTH-2 ) THEN STEP(ISTEP,1,IABS(HILO(I))) = I ENDIF ICMP = HILO(I) ELSEIF (HILO(I).LT.HILO(I-1).AND.HILO(I-1).GT.0) THEN STEP(ISTEP,2,MAX0(1,IABS(HILO(I)))) = I IF (HILO(I-1).EQ.1.OR.HILO(I).LE.0) THEN DO 18 J = 1,MAXSTP IF (STEP(ISTEP,2,J).EQ.0) STEP(ISTEP,2,J) = I 18 CONTINUE ENDIF ICMP = HILO(I) ELSEIF (HILO(I).GT.HILO(I-1).AND.HILO(I-1).LT.0) THEN STEP(ISTEP,2,MAX0(1,IABS(HILO(I)))) = I IF (HILO(I-1).EQ.-1.OR.HILO(I).GE.0) THEN DO 19 J = 1,MAXSTP IF (STEP(ISTEP,2,J).EQ.0) STEP(ISTEP,2,J) = I 19 CONTINUE ENDIF ICMP = HILO(I) ENDIF

* * * * * * * * * 2) * * * * * * * * * * * * 2) * * * * * * * * * * * * * * * * * * * * * * * * * * * P

16 THEN

ENDIF IF (HILO(I).NE.ICMP) THEN IF (HILO(I).LT.(ICMP-IGNORE).AND.HILO(I).LT.0) THEN IF ((HILO(I).EQ.-1.OR.ICMP.GE.0).AND.I.LT.VALPTH-2) THEN ISTEP = ISTEP + 1 DO 16 J = 1,MAXSTP STEP(ISTEP,1,J) = I STEP(ISTEP,2,J) = 0 CONTINUE ELSEIF (STEP(ISTEP,2,IABS(HILO(I))).EQ.0.AND.I.LT.VALPTHSTEP(ISTEP,1,IABS(HILO(I))) = I ENDIF ICMP = HILO(I) INDCMP = I ELSEIF (HILO(I).GT.(ICMP+IGNORE).AND.HILO(I).GT.0) THEN IF ((HILO(I).EQ.1.OR.ICMP.LE.0).AND.I.LT.VALPTH-2) THEN ISTEP = ISTEP + 1 DO 17 J = 1,MAXSTP STEP(ISTEP,1,J) = I STEP(ISTEP,2,J) = 0 CONTINUE ELSEIF (STEP(ISTEP,2,IABS(HILO(I))).EQ.0.AND.I.LT.VALPTHSTEP(ISTEP,1,IABS(HILO(I))) = I ENDIF ICMP = HILO(I) INDCMP = I ELSEIF (HILO(I).LT.(ICMP-IGNORE).AND.ICMP.GT.0) THEN STEP(ISTEP,2,MAX0(1,IABS(HILO(I)))) = I IF (ICMP.EQ.1.OR.HILO(I).LE.0) THEN DO 18 J = 1,MAXSTP IF (STEP(ISTEP,2,J).EQ.0) STEP(ISTEP,2,J) = I CONTINUE ENDIF ICMP = HILO(I) INDCMP = I ELSEIF (HILO(I).GT.(ICMP+IGNORE).AND.ICMP.LT.0) THEN STEP(ISTEP,2,MAX0(1,IABS(HILO(I)))) = I IF (ICMP.EQ.-1.OR.HILO(I).GE.0) THEN DO 19 J = 1,MAXSTP IF (STEP(ISTEP,2,J).EQ.0) STEP(ISTEP,2,J) = I CONTINUE ENDIF ICMP = HILO(I) INDCMP = I ENDIF ELSEIF (I.GT.INDCMP+10) THEN ICMP = (3*ICMP + HILO(I)) / 4 INDCMP = I ENDIF CONTINUE IF (CNVDBG.AND.(DISPIT.OR..NOT.QUIET)) PRINT *,'QNTPTH: ISTEP = ',ISTE

17 THEN

18

19

15

II = ISTEP * * Post processing, fixup and weight STEP indicators, also check validity of * first and last steps... * INIBAD = .FALSE.

ISE = 0 DO 210 I = 1,ISTEP * Find `tightest' step (the one with beginning and end closest together) * Use it to replace any unused steps (which are filled with the first (loosest) * step values ... IB = 0 IS = VALPTH ISEO = ISE ISE = 0 DO 211 J = 1,MAXSTP IB = MAX0(IB,STEP(I,1,J)) ISE = MAX0(ISE,STEP(I,2,J)) ISS = IS IS = MIN0(IS,STEP(I,2,J)) IF (IS.LE.ISEO.OR.IS.LT.IB) IS = ISS 211 CONTINUE IF (I.EQ.ISTEP.AND.IS.GE.(VALPTH-1)) THEN IS = VALPTH ENDIF IF (IB.LT.ISEO) IB = ISEO + 1 IF (IS.LT.IB) IS = IB + 1 DO 212 J = (MAXSTP-1),2,-1 IF ( (STEP(I,1,J).EQ.STEP(I,1,1).OR.STEP(I,1,J).LE.0) .OR. & (STEP(I,2,J).EQ.STEP(I,2,1).OR.STEP(I,2,J).LE.0) ) THEN STEP(I,1,J) = IB STEP(I,2,J) = IS ELSEIF (STEP(I,1,J).LT.ISEO) THEN STEP(I,1,J) = IB ELSEIF (STEP(I,2,J).LT.ISEO) THEN STEP(I,2,J) = IS ENDIF 212 CONTINUE STEP(I,1,MAXSTP) = IB STEP(I,2,MAXSTP) = IS IF (CNVDBG) THEN PRINT *,' ISTEP = ',ISTEP,' IB/IS = ',IB,'/',IS ENDIF * * * First extremum may be spurious - check it * IF (I.EQ.1.AND.I.LE.ISTEP) THEN IDELT = IS - IB IB = 0 IS = VALPTH IAVE = MAXSTP/2 IB2 = 0 IS2 = VALPTH IAVE2 = MAXSTP/2 DO 7213 J=1,MAXSTP IB = MAX0(IB,STEP(I,1,J)) IS = MIN0(IS,STEP(I,1,J)) IAVE = IAVE + STEP(I,1,J) IB2 = MAX0(IB,STEP(I,2,J)) IS2 = MIN0(IS,STEP(I,2,J)) IAVE2 = IAVE2 + STEP(I,2,J) 7213 CONTINUE IAVE = IAVE / MAXSTP IAVE2 = IAVE2 / MAXSTP K = (IB + IS)/2

L1 = (IB + IS2)/2 L2 = (IB2 + IS)/2 IF (INITHI) THEN FOO2 = HILO(K).GT.0 .OR. HILO(L1).GT.0 .OR. HILO(L2).GT.0 FOO2 = FOO2 .OR. HILO(IAVE).GT.0 .OR. HILO(IAVE2).GT.0 ELSEIF (INITLO) THEN FOO2 = HILO(K).LT.0 .OR. HILO(L1).LT.0 .OR. HILO(L2).LT.0 FOO2 = FOO2 .OR. HILO(IAVE).LT.0 .OR. HILO(IAVE2).LT.0 ELSE FOO2 = .FALSE. ENDIF FOO1 = (IB.LE.(IDELT/3)) .OR. (IB.LE.5) INIBAD = FOO1 .AND. (IS.LE.3) INIBAD = INIBAD .OR. IAVE.LE.2 .OR. FOO2 * * Last extremum may be spurious - check it * ELSEIF (I.EQ.ISTEP) THEN II = ISTEP IDELT = IS - IB IB = 0 IS = VALPTH IAVE = MAXSTP/2 IB2 = 0 IS2 = VALPTH IAVE2 = MAXSTP/2 DO 7212 J=1,MAXSTP IB = MAX0(IB,STEP(I,2,J)) IS = MIN0(IS,STEP(I,2,J)) IAVE = IAVE + STEP(I,2,J) IB2 = MAX0(IB,STEP(I,1,J)) IS2 = MIN0(IS,STEP(I,1,J)) IAVE2 = IAVE2 + STEP(I,1,J) 7212 CONTINUE IAVE = IAVE / MAXSTP IAVE2 = IAVE2 / MAXSTP K = (IB + IS + 1)/2 L1 = (IB + IS2)/2 L2 = (IB2 + IS)/2 FOO1 = .NOT. ( ISTEP .EQ. 1 .OR. (ISTEP.EQ.2 .AND. INIBAD) ) IF (ENDHI.AND.FOO1) THEN FOO2 = HILO(K).GT.0 .OR. HILO(L1).GT.0 .OR. HILO(L2).GT.0 FOO2 = FOO2 .OR. HILO(IAVE).GT.0 .OR. HILO(IAVE2).GT.0 ELSEIF (ENDLO.AND.FOO1) THEN FOO2 = HILO(K).LT.0 .OR. HILO(L1).LT.0 .OR. HILO(L2).LT.0 FOO2 = FOO2 .OR. HILO(IAVE).LT.0 .OR. HILO(IAVE2).LT.0 ELSE FOO2 = .FALSE. ENDIF FOO1 = (IS.GE.(VALPTH-(IDELT/3))) .OR. (IS.GE.(VALPTH-5)) FOO1 = IB.GE.(VALPTH-3) .AND. FOO1 IF (FOO1.OR.FOO2) ISTEP = ISTEP - 1 IB = MAX0(IB,VALPTH) DO 7012 J=1,MAXSTP IF (STEP(I,2,J).GE.IAVE) STEP(I,1,J) = (STEP(I,1,J) + IB)/ 2 IF (STEP(I,2,J).GE.K) STEP(I,1,J) = (STEP(I,1,J) + IB)/2 7012 CONTINUE ENDIF 210 CONTINUE

* IF (CNVDBG) THEN IF (II.NE.ISTEP) THEN IF (NOKILL) THEN PRINT *,'QNTPTH: End WOULD HAVE BEEN killed: ISTEP was ',I ' ELSE PRINT *,'QNTPTH: End killed: ISTEP was ',II,' ' ENDIF ENDIF IF (INIBAD) THEN IF (NOK1LL) THEN PRINT *,'QNTPTH: Beginning WOULD HAVE BEEN skipped. ' ELSE PRINT *,'QNTPTH: Beginning skipped. ' ENDIF ENDIF ENDIF IF (NOKILL.AND.II.NE.ISTEP) ISTEP = II IF (NOK1LL) INIBAD = .FALSE. * * IF (INIBAD) THEN JSTEP = 2 ELSE JSTEP = 1 ENDIF K = STEP(JSTEP,1,MAXSTP) + STEP(JSTEP,2,MAXSTP) + 1 DENOM = 2.0 IF (JSTEP.LE.ISTEP) THEN * DO 21 J = 1,MAXSTP * IF (STEP(JSTEP,1,J).GE.0.AND.STEP(JSTEP,2,J).GE.0) THEN * K = K + (STEP(JSTEP,1,J) + STEP(JSTEP,2,J) + 1)*J * DENOM = DENOM + 2*J * ENDIF * 21 CONTINUE K = K / DENOM IF (K.GE.(VALPTH-3)) K = VALPTH + 1 IF (CNVDBG.AND.(DISPIT.OR..NOT.QUIET)) PRINT *,' ISTEP = ',ISTEP, ' JSTEP = ',JSTEP,' K = ',K ELSE K = VALPTH + 1 IF (CNVDBG.AND.(DISPIT.OR..NOT.QUIET)) PRINT *,' ISTEP = ',ISTEP, ' JSTEP = ',JSTEP,' K = ',K, & ' @ end. ' ENDIF DO 24 I = 2,VALPTH IF (I.EQ.K) THEN IFR = IFR + 1 FRYS(IFR) = I VALUES(I,4) = VALUES(I-1,4) + 1 9024 CONTINUE JSTEP = JSTEP + 1 IF (JSTEP.GT.ISTEP) THEN K = VALPTH + 1 IF (CNVDBG.AND.(DISPIT.OR..NOT.QUIET)) PRINT *,' ISTEP = '

I,'

& & ELSE * * * * HEN * J * * * 22

,ISTEP,' JSTEP = ',JSTEP,' K = ' ,K,' I = ',I,' @ end. ' K = 0 DENOM = 0.0 K = STEP(JSTEP,1,MAXSTP) + STEP(JSTEP,2,MAXSTP) + 1 DENOM = 2.0 DO 22 J = 1,MAXSTP IF (STEP(JSTEP,1,J).GE.0.AND.STEP(JSTEP,2,J).GE.0) T K = K + (STEP(JSTEP,1,J) + STEP(JSTEP,2,J) + 1)* DENOM = DENOM + 2*J ENDIF CONTINUE K = K / DENOM IF (K.GE.(VALPTH-3)) K = VALPTH + 1 IF (CNVDBG.AND.(DISPIT.OR..NOT.QUIET)) PRINT *,' ISTEP = ' JSTEP = ',JSTEP,' K = ',K,' I = IF (K.LE.I) THEN PRINT *,'QNTPTH: BARF!! K <= I : ',K,' ',I PRINT *,' ISTEP = ',ISTEP,' JSTEP = ',JSTEP, ' K = ',K,' I = ',I GOTO 9024 ENDIF ENDIF ELSE VALUES(I,4) = VALUES(I-1,4) ENDIF CONTINUE FRYS(98) = IFR

',ISTEP, & ',I

&

24 *

IF (VALUES(VALPTH-2,4).NE.VALUES(VALPTH-3,4)) VALUES(VALPTH-2,4) = VAL UES(VALPTH-3,4) IF (VALUES(VALPTH-1,4).NE.VALUES(VALPTH-2,4)) VALUES(VALPTH-1,4) = VAL UES(VALPTH-2,4) IF (VALUES(VALPTH,4).NE.VALUES(VALPTH-1,4)) VALUES(VALPTH,4) = VALUES( VALPTH-1,4) * IF (CNVDBG) THEN PRINT *,'QNTPTH: FINAL QUADRANT NUMBER IS: ',VALUES(VALPTH,4),' J STEP = ',JSTEP ENDIF ENDIF * * * * This is where the refined extremum detecting code goes. * * ** ** DEBUGGING STUFF ** IF (CNVDBG.AND.DOCNT.AND.(DISPIT.OR..NOT.QUIET)) THEN ILEN = VALPTH I = INDST3(ILEN,2,2) DO 8004 I = 1,VALPTH RDEBUG(INDEX3(I,1,1)) = I

8004

RDEBUG(INDEX3(I,2,1)) = VALUES(I,4) CONTINUE IF (ORD.OR.DISPIT) THEN IF (DISPIT.OR..NOT.ORD) THEN PRINT *,'QNTPTH/CNTPTH: Display GRAPH? (y/N)' ELSE PRINT *,'QNTPTH/CNTPTH: Display GRAPH & PICTURE? (y/N)' ENDIF I = MENU(0,0,1) IF (I.EQ.1) THEN CALL FANCYP(RDEBUG,ILEN,2) CALL GRCLS DISPIT = .TRUE. ENDIF ENDIF ENDIF

** ** * * * FINALLY - Copy quadrant data back to DARRAY * IJKL = 0 DO 100 K = 1,5 IXB = PATH(1,K) IYB = PATH(2,K) IXE = PATH(1,K+1) IYE = PATH(2,K+1) IDX = IXE - IXB IDY = IYE - IYB IF (IABS(IDX).GE.IABS(IDY)) THEN IF (IDX.GE.0) THEN INC = 1 ELSEIF (IDX.LT.0) THEN INC = -1 ENDIF DO 20 I = IXB,(IXE-INC),INC J = IYB + (I-IXB)*IDY/IDX IJKL = IJKL + 1 IF (IJKL.GT.VALPTH) GOTO 101 DARRAY(I,J) = VALUES(IJKL,4) IF (VALUES(IJKL,4).NE.VALUES(IJKL+1,4).AND.VALUES(IJKL,4).NE.V ALUES(IJKL+1,4)-1) & PRINT *,'QNTPTH: VALUES(',IJKL,',4) ERROR! ',VALUES(IJKL,4 ),' ',VALUES(IJKL+1,4) 20 CONTINUE ELSE IF (IDY.GE.0) THEN INC = 1 ELSEIF (IDY.LT.0) THEN INC = -1 ENDIF DO 30 J = IYB,(IYE-INC),INC I = IXB + (J-IYB)*IDX/IDY IJKL = IJKL + 1 IF (IJKL.GT.VALPTH) GOTO 101 DARRAY(I,J) = VALUES(IJKL,4) IF (VALUES(IJKL,4).NE.VALUES(IJKL+1,4).AND.VALUES(IJKL,4).NE.V ALUES(IJKL+1,4)-1) & PRINT *,'QNTPTH: VALUES(',IJKL,',4) ERROR! ',VALUES(IJKL,4

),' ',VALUES(IJKL+1,4) 30 CONTINUE ENDIF 100 CONTINUE 102 CONTINUE I = PATH(1,6) J = PATH(2,6) DARRAY(I,J) = VALUES(VALPTH,4) * RETURN 101 CONTINUE PRINT *,'QNTPTH: ITERATION ERROR IN COPY BACK!' CALL FLASHB CALL BEEP CALL WAIT(0.5) GOTO 102 END *-----------------------------------------------------------------------INTEGER*2 FUNCTION M5I2(A,B,C,D,E) IMPLICIT INTEGER*2 (A-Z) INTEGER*2 A,B,C,D,E,F,G,IT(7),T,I,J IT(1) = A IT(2) = B IT(3) = C IT(4) = D IT(5) = E DO 1 I = 1,3 DO 2 J = I+1,5 IF (IT(I).GT.IT(J)) THEN T = IT(I) IT(I) = IT(J) IT(J) = T ENDIF 2 CONTINUE 1 CONTINUE M5I2 = IT(3) RETURN * ENTRY M7I2(A,B,C,D,E,F,G) IT(1) = A IT(2) = B IT(3) = C IT(4) = D IT(5) = E IT(6) = F IT(7) = G DO 11 I = 1,4 DO 12 J = I+1,7 IF (IT(I).GT.IT(J)) THEN T = IT(I) IT(I) = IT(J) IT(J) = T ENDIF 12 CONTINUE 11 CONTINUE M7I2 = IT(4) RETURN END *---------------------------------------------------------------------$NODEBUG

$SEGMENT I_TO_E_ SUBROUTINE SPREAD(SARRAY,DARRAY,NX,NY) * IMPLICIT CHARACTER*123 (A-Z) CHARACTER*8 HEXOF,THEHEX,THEHX2,HAPS(32) CHARACTER*1 MGFRMN(2),TC,TCALGN(2) INTEGER*4 NX,NY,LOWCUT,IHICUT,LLCTRD,RLCTRD,BLCTRD,TLCTRD,CHANGE,I,I1,I2 INTEGER*4 IJS(3),IJ2S(3),BUF(3),FCALL4,KADDR,CHANGX,CHANGY,ITADDR,ICENTR INTEGER*4 ITADSR,MODE,ICNT26,DCNT26,I4XB,I4XE,I4YB,I4YE,ICMP,ID,INX,IT,IT1 ,IT2 INTEGER*4 IHI1,IHI2,IHI3,IHI4,LOW1,LOW2,LOW3,LOW4,ITER,ITSTV,ITEST,II INTEGER*4 IXB4,IYB4,IXE4,IYE4,J,J1,J2,LCHNG,LCHANG,TEMP0(2048) INTEGER*4 TEMP2(20480),IAPS(32),LENS(32) INTEGER*2 SARRAY(NX,NY),DARRAY(NX,NY),VCNTRL,HCNTRL,PATH4Y,PATH6X,PATH6Y INTEGER*2 PATH1X,PATH1Y,PATH2X,PATH2Y,PATH3X,PATH3Y,PATH(2,6),PATH4X INTEGER*2 I1XUL,I1XUR,I1XLL,I1XLR,I1YUL,I1YUR,I1YLL,I1YLR,PATH5X,PATH5Y INTEGER*2 POINTY(2,4,256),POINTB(8,256),POINTX(2,4,512),POINTA(8,512) INTEGER*2 LINEY(256),LINEX(512),VCTRLN,HCTRLN,IXBEG,IYBEG,IXEND,IYEND INTEGER*2 PTH1X(4),PTH1Y(4),PTH2X(4),PTH2Y(4),PTH3X(4),PTH3Y(4),QSTART INTEGER*2 PTH(4,2,5),PTH4X(4),PTH4Y(4),PTH5X(4),PTH5Y(4),QDRNT,PIND INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384,IASC,ISCAN,IKBF1,IKBF2,IERR INTEGER*2 TYP(3),ICHS(3),DEFBUF,SAVBUF,FRYS(100),POSVAL(2,2048) INTEGER*2 PPSVAL(2,1024),PVAL(2,40,256),M5I2,M7I2 INTEGER*1 ELEFT,ERGHT LOGICAL*2 ABORT,ESCAPE,INTRPT,RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS LOGICAL*2 MGLR,MGUD,MGOTHR,MGOK,BLCTOK,TLCTOK,PTHDUN,CNVDBG LOGICAL*1 DOALI,DOCRS,OLDCAL,IFL,OUTCON,DIDCRN,DIDEDG,TDUN,BDUN LOGICAL*1 ELECON,ELEC0N,DOGLBL EQUIVALENCE (PATH(1,1),PATH1X),(PATH(2,1),PATH1Y) EQUIVALENCE (PATH(1,2),PATH2X),(PATH(2,2),PATH2Y) EQUIVALENCE (PATH(1,3),PATH3X),(PATH(2,3),PATH3Y) EQUIVALENCE (PATH(1,4),PATH4X),(PATH(2,4),PATH4Y) EQUIVALENCE (PATH(1,5),PATH5X),(PATH(2,5),PATH5Y),(TEMP2(1),PVAL(1,1,1)) EQUIVALENCE (PATH(1,6),PATH6X),(PATH(2,6),PATH6Y),(TEMP0(1),POSVAL(1,1)) EQUIVALENCE (POINTY(1,1,1),POINTB(1,1)),(POINTX(1,1,1),POINTA(1,1)) EQUIVALENCE (PTH(1,1,1),PTH1X(1)),(PTH(1,2,1),PTH1Y(1)) EQUIVALENCE (PTH(1,1,2),PTH2X(1)),(PTH(1,2,2),PTH2Y(1)) EQUIVALENCE (PTH(1,1,3),PTH3X(1)),(PTH(1,2,3),PTH3Y(1)) EQUIVALENCE (PTH(1,1,4),PTH4X(1)),(PTH(1,2,4),PTH4Y(1)) EQUIVALENCE (PTH(1,1,5),PTH5X(1)),(PTH(1,2,5),PTH5Y(1)) EQUIVALENCE (VCNTRL,VCTRLN),(HCNTRL,HCTRLN),(LCHNG,LCHANG) EQUIVALENCE (I4XB,IXB4),(I4XE,IXE4),(I4YB,IYB4),(I4YE,IYE4) EQUIVALENCE (TCALGN(1),IASC),(TCALGN(2),TC),(POSVAL(1,1025),PPSVAL(1,1)) COMMON /NTRVN/ABORT,ESCAPE,INTRPT,/KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR COMMON /SHFSTA/RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS COMMON /I2ENML/LOWCUT,IHICUT,/MGFRAM/MGFRMN,MGLR,MGUD,MGOTHR,MGOK COMMON /MGFORM/LINEX,LINEY,POINTY,POINTX,IXBEG,IYBEG,IXEND,IYEND COMMON /FETURE/LLCTRD,RLCTRD,BLCTRD,TLCTRD,VCNTRL,HCNTRL,BLCTOK,TLCTOK COMMON /PTHALT/I1XUL,I1XUR,I1XLL,I1XLR,I1YUL,I1YUR,I1YLL,I1YLR COMMON /MGPATH/PATH,PTHDUN,/KIASMN/ICHS,BUF,TYP,IJS,IJ2S,/MGPTH/PTH COMMON /DEBUGC/CNVDBG,/THEQAD/QDRNT,/FRINGE/FRYS,/STARTQ/QSTART COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/PARNML/BIG,SMALL,RANGE COMMON /PARPLZ/TEMP2,/PARCDA/TEMP0,/OMACNT/IAPS,HAPS,LENS SAVE /MGPATH/,/I2ENML/,/MGFRAM/,/MGFORM/,/FETURE/,/PTHALT/,/KIASMN/,/MGPTH / SAVE /DEBUGC/,/THEQAD/,/FRINGE/,/PARNML/,/PARNM2/,/STARTQ/,/NTRVN/ SAVE /KEYGET/,/SHFSTA/,/PARPLZ/,/PARCDA/,/OMACNT/ EXTERNAL APORCP,FCALL4,KADDR,DSPYX2,DSQYX2,DSQXY2,DSPYX5,DGTYX2,DLTYX2 EXTERNAL DGTYXR,DLTYXR,DLEYXR,DGEYXR,DCNT26,CORNER,EDGES,NUEDGE,NUCRNR EXTERNAL ISPYX2,ISQYX2,ISQXY2,ISPYX5,IGTYX2,ILTYX2,M5I2,M7I2 EXTERNAL IGTYXR,ILTYXR,ILEYXR,IGEYXR,ICNT26

* *

EXTERNAL DTPYX2,DTQYX2,DTQXY2,DTPYX5 SAVE IF (CNVDBG) CALL XYGOTO(0,5) OUTCON = .FALSE. IHI1 = (IHICUT*3 + LOWCUT*2)/5 LOW1 = (IHICUT*2 + LOWCUT*3)/5 IHI2 = (IHICUT*2 + LOWCUT)/3 LOW2 = (IHICUT + LOWCUT*2)/3 IHI3 = (IHICUT*3 + LOWCUT)/4 LOW3 = (IHICUT + LOWCUT*3)/4 IF (CNVDBG) THEN PRINT *,'SPREAD: Entered.' PRINT *,'IHICUT = ',IHICUT,' LOWCUT PRINT *,'IHI1 = ',IHI1,' LOW1 = PRINT *,'IHI2 = ',IHI2,' LOW2 = PRINT *,'IHI3 = ',IHI3,' LOW3 = ENDIF DIDCRN = .FALSE. DIDEDG = .FALSE. IXB4 = 1 IXE4 = NX IYB4 = 1 IYE4 = NY ITSTV = LOW1 INX = NX

* * * * * * * *

= ',LOWCUT ',LOW1 ',LOW2 ',LOW3

* * Do easy cases first, the corners and edges... * IF (CNVDBG) THEN PRINT *,'DO NUEDGE AND NUCRNR? (Y/n)' I = MENU(1,0,1) IF (INTRPT.OR.ESCAPE) I = 0 ELSE I = 1 ENDIF IF (I.EQ.1) THEN CALL CORNER(SARRAY,DARRAY,NX,NY) CALL NUEDGE(SARRAY,DARRAY,NX,NY) CALL NUCRNR(SARRAY,DARRAY,NX,NY) DIDCRN = .TRUE. ENDIF IF (CNVDBG) THEN IF ( (MGFRMN(1).EQ.'C'.OR.MGFRMN(1).EQ.'c') .OR. & (MGFRMN(1).EQ.'D'.OR.MGFRMN(1).EQ.'d') .OR. & (MGFRMN(1).EQ.'E'.OR.MGFRMN(1).EQ.'e') .OR. & (MGFRMN(1).EQ.'I'.OR.MGFRMN(1).EQ.'i') ) THEN PRINT *,'DO EDGES? (y/N)' I = 0 ELSE PRINT *,'DO EDGES? (Y/n)' I = 1 ENDIF I = MENU(I,0,1) IF (I.EQ.0.OR.ABORT.OR.ESCAPE.OR.INTRPT) GOTO 196 ELSE IF ( (MGFRMN(1).EQ.'C'.OR.MGFRMN(1).EQ.'c') .OR. & (MGFRMN(1).EQ.'D'.OR.MGFRMN(1).EQ.'d') .OR. & (MGFRMN(1).EQ.'E'.OR.MGFRMN(1).EQ.'e') .OR.

&

(MGFRMN(1).EQ.'I'.OR.MGFRMN(1).EQ.'i') ) GOTO 196 CALL CORNER(SARRAY,DARRAY,NX,NY) DIDCRN = .TRUE. ENDIF CALL EDGES(SARRAY,DARRAY,NX,NY) DIDEDG = .TRUE.

* * 196 CONTINUE * * IF (CNVDBG) THEN PRINT *,'SPREAD: Do initial horizontal interpolatory spread? (Y/n)' I = MENU(1,0,1) IF (I.EQ.0.OR.ABORT.OR.ESCAPE.OR.INTRPT) GOTO 7196 ENDIF PRINT *,'SPREAD: Do GLOBAL? (Y/n)' I = MENU(1,0,1) DOGLBL = I.EQ.1 PRINT *,'SPREAD: Force consistency on electrode fringe counts? (0=NO, 1=Ou tward, 2=Inward, 3=Both)' I = MENU(0,0,3) ELECON = I.GT.2 ELEC0N = MOD(I,2).EQ.1 PRINT *,'SPREAD: Forced edging on left (0=NO, 1 .. 5 pixels)' ELEFT = MENU(0,0,5) PRINT *,'SPREAD: Forced edging on right (0=NO, 1 .. 5 pixels)' ERGHT = MENU(0,0,5) * * THIS spreading is guided and interpolatory; it therefore runs faster, with * less error than the original (blind, extrapolatory) spreading which it * largely supercedes. * TDUN = .NOT. TLCTOK BDUN = .NOT. BLCTOK * * IF IMAGE OF FORMS `A' or `B' we do this from bottom up to HCNTRL (ie. Horiz. * CeNTeRLine) and from top down to horiz. cent.; for images of other forms we * from the end where the paths start toward the other end. * 9990 CONTINUE IF (BLCTOK.AND..NOT.BDUN) THEN PRINT *,'Doing Horizontal spread up from the bottom.' BDUN = .TRUE. JSS = IYBEG IF (TLCTOK) THEN JEE = HCNTRL + 1 ELSE JEE = IYEND ENDIF JDD = +1 ELSEIF (TLCTOK.AND..NOT.TDUN) THEN PRINT *,'Doing Horizontal spread down from the top.' TDUN = .TRUE. JSS = IYEND IF (BLCTOK) THEN JEE = HCNTRL - 1 ELSE JEE = IYBEG ENDIF

JDD = -1 ELSE GOTO 7196 ENDIF * * * * * IF (ELEC0N) THEN DO 7155 J = JSS,JEE,JDD CALL ISNTRP IF (ESCAPE.OR.INTRPT) NOISY = .FALSE. IF (IERR.EQ.0.AND.(TC.EQ.'Q'.OR.TC.EQ.'q')) NOISY = .FALSE. IF (IERR.EQ.0.AND.(TC.EQ.'N'.OR.TC.EQ.'n')) NOISY = .TRUE. POSVAL(1,1) = -1 POSVAL(2,1) = -1 POSVAL(1,2) = -1 POSVAL(2,2) = -1 IF (J.GT.BLCTRD.AND.J.GT.IYBEG.AND.J.LT.TLCTRD.AND.J.LT.IYEND) THE DO 7151 I = ((9*LLCTRD + VCNTRL + 5)/10),IXBEG,-1 IF (DARRAY(I,J).GT.-1) THEN POSVAL(1,1) = I POSVAL(2,1) = DARRAY(I,J) ENDIF CONTINUE IF (POSVAL(2,1).LT.ILSAVE.AND.J.GT.JSS.AND.POSVAL(2,1).GT.-1) IT = POSVAL(2,2) POSVAL(2,1) = ILSAVE IF (NOISY) PRINT *,'Working on line ',J,' LEFT ELEC. fix DO 7159 I = 0,(POSVAL(1,1)-IXBEG) IF (DARRAY(POSVAL(1,1)-I,J).LE.-1) THEN IF (I.GT.4) GOTO 7158 ELSEIF (DARRAY(POSVAL(1,1)-I,J).EQ.IT) THEN DARRAY(POSVAL(1,1)-I,J) = ILSAVE ENDIF CONTINUE CONTINUE ENDIF IF (POSVAL(2,1).NE.-1) ILSAVE = POSVAL(2,1) DO 7152 I = ((9*RLCTRD + VCNTRL + 5)/10),IXEND IF (DARRAY(I,J).GT.-1) THEN POSVAL(1,1) = I POSVAL(2,1) = DARRAY(I,J) ENDIF CONTINUE IF (POSVAL(2,2).LT.IRSAVE.AND.J.GT.JSS.AND.POSVAL(2,2).GT.-1) IT = POSVAL(2,2) DARRAY(POSVAL(1,2),J) = IRSAVE IF (NOISY) PRINT *,'Working on line ',J,' RIGHT ELEC. fix DO 7157 I = 0,(IXEND-POSVAL(1,2)) IF (DARRAY(POSVAL(1,1)+I,J).EQ.-1) THEN IF (I.GT.4) GOTO 7156 ELSEIF (DARRAY(POSVAL(1,1)+I,J).EQ.IT) THEN DARRAY(POSVAL(1,2)+I,J) = ILSAVE ENDIF CONTINUE CONTINUE ENDIF

7151 THEN * up.'

7159 7158

7152 THEN * up.'

7157 7156

IF (POSVAL(2,2).NE.-1) IRSAVE = POSVAL(2,1) ENDIF 7155 CONTINUE ENDIF * * * * * * Some minor fixups first, if a path is edging along accumulating many counts the path to one side or the other is likely one quadrant low over part of it's length. account for this with a fixup before proceeding to general fixup and filling ...

PIND = 0 DO 7165 J = JEE,JSS,-JDD DO 4165 I = 1,40 PVAL(1,I,J) = -1 PVAL(2,I,J) = -1 4165 CONTINUE * CALL ISNTRP * IF (ESCAPE.OR.INTRPT) NOISY = .FALSE. * IF (IERR.EQ.0.AND.(TC.EQ.'Q'.OR.TC.EQ.'q')) NOISY = .FALSE. * IF (IERR.EQ.0.AND.(TC.EQ.'N'.OR.TC.EQ.'n')) NOISY = .TRUE. * IF (NOISY) PRINT *,' ' IND = 0 * Find the tagging adjacent to the left electrode (if any) which was put there * by NUEDGE, NUCRNR (or also EDGE and CORNER). IT1 = LINTRC + LSLOPE*MIN(BLCTRD,JEE) IT2 = LINTRC + LSLOPE*MAX(TLCTRD,JEE) IXB4 = MIN(IT1,IT2,LLCTRD) IXB4 = MAX(IXB4,IXBEG) IT = 0 IF (J.GT.BLCTRD.AND.J.GT.IYBEG.AND.J.LT.TLCTRD.AND.J.LT.IYEND) THEN DO 7167 I = (VCNTRL-1),IXB4,-1 IF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.DARRAY(I+1,J)) THEN IT = I ENDIF 7167 CONTINUE ENDIF IF (IT.NE.0) THEN * If adjacent to left electrode tagging is found - it is the first `path' IND = IND + 1 POSVAL(1,IND) = IT POSVAL(2,IND) = DARRAY(IT,J) PVAL(1,IND,J) = IT PVAL(2,IND,J) = DARRAY(IT,J) ENDIF * Now find the rest of the paths, up to (and including) the right electrode IF (J.GT.BLCTRD.AND.J.GT.IYBEG.AND.J.LT.TLCTRD.AND.J.LT.IYEND) THEN IT1 = RINTRC + RSLOPE*BLCTRD IT2 = RINTRC + RSLOPE*TLCTRD IXE4 = MAX(IT1,IT2,RLCTRD) IXE4 = MIN(IXE4,IXEND) ELSE IXE4 = IYEND - 2 ENDIF DO 7164 I = (IT+1),IXE4 IF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.DARRAY(I-1,J)) THEN IND = IND + 1 POSVAL(1,IND) = I POSVAL(2,IND) = DARRAY(I,J) PVAL(1,IND,J) = I PVAL(2,IND,J) = DARRAY(I,J)

7164

ENDIF CONTINUE PVAL(1,40,J) = IND PVAL(2,40,J) = IND DO 7161 II = 2,(IND-1) IDL = IABS( POSVAL(2,II) - POSVAL(2,II-1) ) IDR = IABS( POSVAL(2,II) - POSVAL(2,II+1) ) ID = IABS( POSVAL(2,II-1) - POSVAL(2,II+1) ) IF (IDL.GT.1.AND.IDR.GE.1.OR.IDL.GE.1.AND.IDR.GT.1) THEN IF (ID.EQ.0) THEN IF (NOISY) PRINT *,' SKIP FIX J = ',J,' IND = ',IND DARRAY(POSVAL(1,II),J) = DARRAY(POSVAL(1,II-1),J) POSVAL(2,II) = DARRAY(POSVAL(1,II-1),J) ELSEIF (ID.EQ.1) THEN IF (NOISY) PRINT *,' SKIP FIX J = ',J,' IND = ',IND IDL = IABS( IND/2 - (II-1) ) IDR = IABS( IND/2 - (II+1) ) IF (IDR.LT.IDL) THEN IT = DARRAY(POSVAL(1,II+1),J) ELSEIF (IDL.LT.IDR) THEN IT = DARRAY(POSVAL(1,II-1),J) ELSE IT = MAX( DARRAY(POSVAL(1,II-1),J), DARRAY(POSVAL(1,II ENDIF DARRAY(POSVAL(1,II),J) = IT POSVAL(2,II) = IT DARRAY(POSVAL(1,II-1),J) = IT POSVAL(2,II-1) = IT PVAL(2,II-1,J) = IT DARRAY(POSVAL(1,II+1),J) = IT POSVAL(2,II+1) = IT PVAL(2,II+1,J) = IT ELSEIF (PIND.EQ.IND.AND.POSVAL(2,II).GT.PPSVAL(2,II)) THEN DARRAY(POSVAL(1,II),J) = PPSVAL(2,II) POSVAL(2,II) = PPSVAL(2,II) ENDIF PVAL(2,II,J) = POSVAL(2,II) ELSEIF (IDL.EQ.1.AND.IDR.EQ.1.AND.ID.EQ.0) THEN IF (NOISY) PRINT *,' 1-1 FIX J = ',J,' IND = ',IND IDLL = -1 IDLLL = -1 IF (II.GT.2) THEN IDLL = IABS( POSVAL(2,II-1) - POSVAL(2,II-2) ) IF (II.GT.3) IDLLL = IABS( POSVAL(2,II-2) - POSVAL(2,II-3)

+1),J) )

) ENDIF IDRR = -1 IDRRR = -1 IF (II.LT.IND-2) THEN IDRR = IABS( POSVAL(2,II+1) - POSVAL(2,II+2) ) IF (II.LT.IND-3) IDRRR = IABS( POSVAL(2,II+2) - POSVAL(2, II+3) ) ENDIF IF (IDLL.EQ.0.AND.IDRR.EQ.0) THEN DARRAY(POSVAL(1,II),J) = DARRAY(POSVAL(1,II-1),J) POSVAL(2,II) = DARRAY(POSVAL(1,II-1),J) ELSEIF (IDLLL.EQ.0.AND.IDLL.EQ.0) THEN DARRAY(POSVAL(1,II),J) = DARRAY(POSVAL(1,II-1),J) POSVAL(2,II) = DARRAY(POSVAL(1,II-1),J)

ELSEIF (IDRRR.EQ.0.AND.IDRR.EQ.0) THEN DARRAY(POSVAL(1,II),J) = DARRAY(POSVAL(1,II+1),J) POSVAL(2,II) = DARRAY(POSVAL(1,II+1),J) ENDIF PVAL(2,II,J) = POSVAL(2,II) ENDIF 7161 CONTINUE DO 7162 II = 1,IND PPSVAL(1,II) = POSVAL(1,II) PPSVAL(2,II) = POSVAL(2,II) 7162 CONTINUE PIND = IND 7165 CONTINUE * PRINT *,' Preliminary fixups done ...' * * Here is where some global analysis and fixups of the values can be done * * FIRST, check for missed indicators ... * DO 3701 J = JSS+JDD,JEE-JDD,JDD IF (PVAL(1,40,J).NE.PVAL(1,40,J-1).AND.PVAL(1,40,J).NE.PVAL(1,40,J+1) & .AND.PVAL(1,40,J-1).EQ.PVAL(1,40,J+1)) THEN DO 3702 I = 1,PVAL(1,40,J-1) PVAL(1,I,J) = (PVAL(1,I,J-1) + PVAL(1,I,J+1))/2 PVAL(2,I,J) = (PVAL(2,I,J-1) + PVAL(2,I,J+1))/2 3702 CONTINUE ENDIF 3701 CONTINUE * JSSS = JSS IF (JSSS.LT.BLCTRD) JSSS = BLCTRD IF (JSSS.GT.TLCTRD) JSSS = TLCTRD JEEE = JEE IF (JEEE.LT.BLCTRD) JEEE = BLCTRD IF (JEEE.GT.TLCTRD) JEEE = TLCTRD IF (DOGLBL) THEN DO 3703 J = JEEE,JSSS,-JDD IND = PVAL(1,40,J) MN = 100 MX = 0 IF (IND.GT.1) THEN DO 3704 I = 1,IND POSVAL(1,I) = PVAL(1,I,J) IF (I.LE.2) THEN IF (J.LT.JEE.AND.J.GT.JSS) THEN IT = M5I2(PVAL(2,I,J),PVAL(2,I-1,J),PVAL(2,I+1,J), PVAL(2,I,J+1),PVAL(2,I,J+2)) ELSE IT = PVAL(2,I,J) ENDIF ELSEIF (I.GE.IND-1) THEN IF (J.LT.JEE.AND.J.GT.JSS) THEN IT = M5I2(PVAL(2,I,J),PVAL(2,I-1,J),PVAL(2,I+1,J), PVAL(2,I,J-1),PVAL(2,I,J-2)) ELSE IT = PVAL(2,I,J) ENDIF ELSE IT = M5I2(PVAL(2,I,J),PVAL(2,I,J-1),PVAL(2,I,J-2),PVAL

(2,I,J+1),PVAL(2,I,J+2)) ENDIF POSVAL(2,I) = IT MN = MIN(MN,IT) MX = MAX(MX,IT) 3704 CONTINUE IF (POSVAL(2,IND/2).EQ.MX) THEN II = IND/2 ELSE IB = IND + 1 IE = 0 DO 3705 I = 1,IND IF (POSVAL(2,I).EQ.MX) THEN IB = MIN(I,IB) IE = MAX(I,IE) ENDIF 3705 CONTINUE II = (IB + IE)/2 ENDIF IT = POSVAL(2,II) DO 3706 I = II+1,IND-1 IF (POSVAL(2,I).LT.IT) THEN IF (POSVAL(2,I+1).EQ.IT) THEN IF (I.EQ.IND-1) THEN POSVAL(2,I) = IT ELSEIF (POSVAL(2,I+2).EQ.IT) THEN POSVAL(2,I) = IT ELSEIF (POSVAL(2,I+2).LT.IT) THEN POSVAL(2,I+1) = POSVAL(2,I) POSVAL(2,I) = IT ENDIF ELSE IT = POSVAL(2,I) ENDIF ELSEIF (POSVAL(2,I).GT.IT) THEN IF (POSVAL(2,I+1).LE.IT) THEN POSVAL(2,I) = IT ENDIF ENDIF PVAL(2,I,J) = POSVAL(2,I) 3706 CONTINUE DO 3707 I = II,2,-1 IF (POSVAL(2,I).LT.IT) THEN IF (POSVAL(2,I-1).EQ.IT) THEN IF (I.EQ.2) THEN POSVAL(2,I) = IT ELSEIF (POSVAL(2,I-2).EQ.IT) THEN POSVAL(2,I) = IT ELSEIF (POSVAL(2,I-2).LT.IT) THEN POSVAL(2,I-1) = POSVAL(2,I) POSVAL(2,I) = IT ENDIF ELSE IT = POSVAL(2,I) ENDIF ELSEIF (POSVAL(2,I).GT.IT) THEN IF (POSVAL(2,I-1).LE.IT) THEN POSVAL(2,I) = IT ENDIF ENDIF

PVAL(2,I,J) = POSVAL(2,I) CONTINUE PVAL(2,1,J) = POSVAL(2,1) PVAL(2,IND,J) = POSVAL(2,IND) ENDIF 3703 CONTINUE ENDIF 3707 * * SMOOTH 7 pt median : HORIZ. * DO 3723 J = JSSS,JEEE,JDD DO 3725 I = 1,PVAL(1,40,J) POSVAL(2,I) = PVAL(2,I,J) 3725 CONTINUE DO 3724 I = 4,PVAL(1,40,J)-3 PVAL(2,I,J) = M7I2(POSVAL(2,I-1),POSVAL(2,I),POSVAL(2,I+1), & POSVAL(2,I-2),POSVAL(2,I+2), & POSVAL(2,I-3),POSVAL(2,I+3)) 3724 CONTINUE IF (PVAL(1,40,J).GE.5) & PVAL(2,3,J) = M5I2(POSVAL(2,1),POSVAL(2,2),POSVAL(2,3), & POSVAL(2,4),POSVAL(2,5)) IND = PVAL(1,40,J) IF (PVAL(1,40,J).GT.5) & PVAL(2,IND-2,J) = M5I2(POSVAL(2,IND),POSVAL(2,IND-1), & POSVAL(2,IND-2),POSVAL(2,IND-3), & POSVAL(2,IND-4)) 3723 CONTINUE * * SMOOTH 5 pt median : UP/DOWN/LEFT/RIGHT AND SELF * DO 3712 I = 1,PVAL(1,40,JSSS) POSVAL(1,I) = PVAL(2,I,JSSS) POSVAL(2,I) = PVAL(2,I,JSSS+JDD) 3712 CONTINUE IF (JD.GT.0) THEN JS = MIN(JSSS,JSS+JDD) JE = MAX(JEEE,JEE-JDD) ELSE JS = MAX(JSSS,JSS+JDD) JE = MIN(JEEE,JEE-JDD) ENDIF DO 3713 J = JS,JE,JD DO 3714 I = 2,PVAL(1,40,J)-1 * PVAL(2,I,J) = M9I2(POSVAL(1,I-1),POSVAL(1,I),POSVAL(1,I+1), * * POSVAL(2,I-1),POSVAL(2,I),POSVAL(2,I+1), PVAL(2,I-1,J+JDD),PVAL(2,I,J+JDD),PVAL(2,I+1,J+JDD)) PVAL(2,I,J) = M5I2(POSVAL(2,I-1),POSVAL(2,I),POSVAL(2,I+1), & POSVAL(1,I),PVAL(2,I,J+JDD)) 3714 CONTINUE DO 3715 I = 1,PVAL(1,40,J) POSVAL(1,I) = POSVAL(2,I) POSVAL(2,I) = PVAL(2,I,J) 3715 CONTINUE 3713 CONTINUE IJ = IJS(1) IT = KADDR(DARRAY(1,1))

* *

IT2 = KADDR(IAPS(5)) CALL IIMSK2(IT,IT2,IJ) PRINT *,' GLOBAL fixups done ...' * * The MAIN event is next ... * DO 7195 J = JSS,JEE,JDD IND = 0 * IF (NOISY) PRINT *,' ' * CALL ISNTRP * IF (ESCAPE.OR.INTRPT) NOISY = .FALSE. * IF (IERR.EQ.0.AND.(TC.EQ.'Q'.OR.TC.EQ.'q')) NOISY = .FALSE. * IF (IERR.EQ.0.AND.(TC.EQ.'N'.OR.TC.EQ.'n')) NOISY = .TRUE. * *** Find the tagging adjacent to the left electrode (if any) which was put there *** by NUEDGE, NUCRNR (or also EDGE and CORNER). ** IT1 = LINTRC + LSLOPE*MIN(BLCTRD,JEE) ** IT2 = LINTRC + LSLOPE*MAX(TLCTRD,JEE) ** IXB4 = MIN(IT1,IT2,LLCTRD) ** IXB4 = MAX(IXB4,IXBEG) ** IT = 0 ** DO 7197 I = (VCNTRL-1),IXB4,-1 ** IF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.DARRAY(I+1,J)) THEN ** IT = I ** ENDIF ** 7197 CONTINUE ** IF (IT.NE.0) THEN *** If adjacent to left electrode tagging is found it is the first `path' ** IND = IND + 1 ** POSVAL(1,IND) = IT ** POSVAL(2,IND) = DARRAY(IT,J) ** ENDIF *** Now find the rest of the paths, up to (and including) the right electrode ** IT1 = RINTRC + RSLOPE*BLCTRD ** IT2 = RINTRC + RSLOPE*TLCTRD ** IXE4 = MAX(IT1,IT2,RLCTRD) ** IXE4 = MIN(IXE4,IXEND) ** DO 7194 I = (IT+1),IXE4 ** IF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.DARRAY(I-1,J)) THEN ** IND = IND + 1 ** POSVAL(1,IND) = I ** POSVAL(2,IND) = DARRAY(I,J) ** ENDIF ** 7194 CONTINUE *** IND = PVAL(1,40,J) DO 7194 I = 1,IND POSVAL(1,I) = PVAL(1,I,J) POSVAL(2,I) = PVAL(2,I,J) DARRAY(POSVAL(1,I),J) = POSVAL(2,I) 7194 CONTINUE * * IF (NOISY) PRINT *,'Working on line ',J,' found IND = ',IND * * Some fixups ... * First, make sure that quadrant values INCREASE along the electrodes IF (J.GT.BLCTRD.AND.J.GT.IYBEG.AND.J.LT.TLCTRD.AND.J.LT.IYEND) THEN IF (POSVAL(2,1).LT.ILSAVE.AND.ELECON) THEN POSVAL(2,1) = ILSAVE DO 7179 I = 0,(IXBEG-POSVAL(1,1)),-1

* up.'

IF (NOISY) PRINT *,'Working on line ',J,' LEFT ELEC. fix IF (DARRAY(POSVAL(1,1)+I,J).LE.-1) THEN GOTO 7178 ELSE DARRAY(POSVAL(1,1)+I,J) = ILSAVE ENDIF CONTINUE CONTINUE ENDIF IF (POSVAL(2,IND).LT.IRSAVE.AND.ELECON) THEN POSVAL(2,IND) = IRSAVE DARRAY(POSVAL(1,IND),J) = IRSAVE DO 7177 I = 0,(IXEND-POSVAL(1,IND)) IF (NOISY) PRINT *,'Working on line ',J,' RIGHT ELEC. fix IF (DARRAY(POSVAL(1,1)+I,J).LE.-1) THEN GOTO 7176 ELSE DARRAY(POSVAL(1,IND)+I,J) = ILSAVE ENDIF CONTINUE CONTINUE ENDIF ENDIF ILSAVE = POSVAL(2,1) IRSAVE = POSVAL(2,IND)

7179 7178

* up.'

7177 7176

* * Some fixups ... * Next, if a path's quadrant value differs by >=2 from it's two adjacent * neighbors' values, and they either match or differ by but one - replace DO 7181 II = (IND-1),2,-1 IDL = IABS( POSVAL(2,II) - POSVAL(2,II-1) ) IDR = IABS( POSVAL(2,II) - POSVAL(2,II+1) ) ID = IABS( POSVAL(2,II-1) - POSVAL(2,II+1) ) IF (IDL.GT.1.AND.IDR.GT.1.AND.ID.LE.1) THEN * IF (NOISY) PRINT *,'Working on line ',J,' SIMPLE REPLACE OF 2 ' ID = MAX( POSVAL(2,II-1), POSVAL(2,II+1) ) POSVAL(2,II) = ID DARRAY(POSVAL(1,II),J) = ID ENDIF 7181 CONTINUE * * Some fixups ... * Finally, if a path value differs from that of it's four adjacent neighbors' * and they all match - replace DO 7180 II = 3,(IND-2) IDL = IABS( POSVAL(2,II) - POSVAL(2,II-1) ) IDL = IDL + IABS( POSVAL(2,II) - POSVAL(2,II-2) ) IDR = IABS( POSVAL(2,II) - POSVAL(2,II+1) ) IDR = IDR + IABS( POSVAL(2,II) - POSVAL(2,II+2) ) ID = IABS( POSVAL(2,II-1) - POSVAL(2,II+1) ) ID = ID + IABS( POSVAL(2,II-2) - POSVAL(2,II+2) ) ID = ID + IABS( POSVAL(2,II+1) - POSVAL(2,II+2) ) ID = ID + IABS( POSVAL(2,II-1) - POSVAL(2,II-2) ) IF (IDL.GT.1.AND.IDR.GT.1.AND.ID.EQ.0) THEN * IF (NOISY) PRINT *,'Working on line ',J,' SIMPLE REPLACE OF 4 ' ID = MAX( POSVAL(2,II-1), POSVAL(2,II+1) )

7180 * *

POSVAL(2,II) = ID DARRAY(POSVAL(1,II),J) = ID ENDIF CONTINUE

ID2 = 100 ID3 = 100 IDP = 1 IDN = 1 IF (IND.GT.0) THEN DO 7193 IIND = 1,(IND-1) ID = IABS( POSVAL(2,IIND+1) - POSVAL(2,IIND) ) IF (I.GT.1) ID2 = IABS( POSVAL(2,IIND+1) - POSVAL(2,IIND-1) ) IF (IIND.GT.2.AND.IIND.LT.IND-1) THEN IDP = IABS( POSVAL(2,IIND+2) - POSVAL(2,IIND+1) ) IDN = IABS( POSVAL(2,IIND-1) - POSVAL(2,IIND-2) ) ENDIF IF (ID.EQ.0) THEN * If the counts along two adjacent paths match - fill all points between ... * IF (NOISY) PRINT *,'Working on line ',J,' SIMPLE FILL ' DO 7192 I = POSVAL(1,IIND),POSVAL(1,IIND+1) DARRAY(I,J) = POSVAL(2,IIND) 7192 CONTINUE * ELSEIF (ID.GT.2.AND.ID2.EQ.0) THEN ** If the counts along two adjacent paths mismatch by two or more, but the count s ** of the paths surrounding the current one match, then fill with the majority ** count * IF (NOISY) PRINT *,'Working on line ',J,' SKIP FILL ' * DO 7191 I = POSVAL(1,IIND-1),POSVAL(1,IIND+1) * DARRAY(I,J) = POSVAL(2,IIND) * 7191 CONTINUE ELSEIF (ID.EQ.1) THEN * If the counts of two adjacent paths differ by one, fill by halves. * the two halves are filled to match their adjacent paths * IF (NOISY) PRINT *,'Working on line ',J,' HALVES ...' * II = (POSVAL(1,IIND+1)-POSVAL(1,IIND)-1)/2 II = (POSVAL(1,IIND+1)-POSVAL(1,IIND)-1)/3 * DO 7190 I = 1,II * DARRAY(POSVAL(1,IIND)+I,J) = POSVAL(2,IIND) * DARRAY(POSVAL(1,IIND+1)-I,J) = POSVAL(2,IIND+1) * 7190 CONTINUE DO 7190 I = 1,II IF (POSVAL(2,IIND).LT.POSVAL(2,IIND+1)) THEN DARRAY(POSVAL(1,IIND)+2*I-1,J) = POSVAL(2,IIND) DARRAY(POSVAL(1,IIND)+2*I,J) = POSVAL(2,IIND) DARRAY(POSVAL(1,IIND+1)-I,J) = POSVAL(2,IIND+1) ELSE DARRAY(POSVAL(1,IIND)+I,J) = POSVAL(2,IIND) DARRAY(POSVAL(1,IIND+1)-2*I+1,J) = POSVAL(2,IIND+1 ) DARRAY(POSVAL(1,IIND+1)-2*I,J) = POSVAL(2,IIND+1) ENDIF 7190 CONTINUE IF (POSVAL(2,IIND).LT.POSVAL(2,IIND+1)) THEN IF ( (POSVAL(1,IIND)+2*II) .LT. (POSVAL(1,IIND+1)-II) ) THEN K = POSVAL(2,IIND) DARRAY(POSVAL(1,IIND)+2*II+1,J) = K

DARRAY(POSVAL(1,IIND+1)-II-1,J) = K ENDIF ELSE IF ( (POSVAL(1,IIND)+II) .LT. (POSVAL(1,IIND+1)-2*II) ) THEN K = POSVAL(2,IIND+1) DARRAY(POSVAL(1,IIND)+II+1,J) = K DARRAY(POSVAL(1,IIND+1)-2*II-1,J) = K ENDIF ENDIF ELSEIF (ID.GT.2.AND.ID2.EQ.1.AND.IDP.EQ.0.AND.IDN.EQ.0) THEN * If the counts of two adjacent paths differ by more than one, fill around if * the two halves are filled to match their adjacent paths * IF (NOISY) PRINT *,'Working on line ',J,' SKIP HALVES .. .' II = (POSVAL(1,IIND+1)-POSVAL(1,IIND-1)-1)/2 DO 7189 I = 1,II DARRAY(POSVAL(1,IIND-1)+I,J) = POSVAL(2,IIND-1) DARRAY(POSVAL(1,IIND+1)-I,J) = POSVAL(2,IIND+1) 7189 CONTINUE * K = MIN( POSVAL(2,IIND-1) , POSVAL(2,IIND+1) ) K = MAX( POSVAL(2,IIND-1) , POSVAL(2,IIND+1) ) IF ( (POSVAL(1,IIND-1)+II) .LT. (POSVAL(1,IIND+1)-II) ) TH EN DARRAY(POSVAL(1,IIND-1)+II+1,J) = K DARRAY(POSVAL(1,IIND+1)-II-1,J) = K ENDIF DARRAY(POSVAL(1,IIND),J) = K * ELSEIF (NOISY) THEN * PRINT *,'NOT Working on line ',J,' INDEX ',IIND ENDIF 7193 CONTINUE IF (ELEFT.GT.0.OR.ERGHT.GT.0) THEN PRINT *,' Doing edging: ELEFT/ERGHT = ',ELEFT,' / ',ERGHT IJ = IJS(1) IT = KADDR(DARRAY(1,1)) IT2 = KADDR(SARRAY(1,1)) CALL IIMSK2(IT,IT2,IJ) IJ = IJS(1) IT = KADDR(DARRAY(1,1)) IT2 = KADDR(IAPS(5)) CALL IIMSK2(IT,IT2,IJ) ENDIF IF (ELEFT.GT.0) THEN I = POSVAL(1,1) 7300 CONTINUE I = I - 1 IF (DARRAY(I,J).GT.-1) GOTO 7300 IS = I + 1 II = MIN((POSVAL(1,1) - IS),0+ELEFT) II = MAX(II,1) IT = MAX(POSVAL(2,1) - 1,0) * 7301 POSVAL(2,1) = PVAL(2,1,J) DO 7301 I = IS+II,IS,-1 DARRAY(I,J) = IT CONTINUE ENDIF IF (ERGHT.GT.0) THEN I = POSVAL(1,IND)

CONTINUE I = I + 1 IF (DARRAY(I,J).GT.-1) GOTO 7302 IS = I - 1 II = MIN((IS - POSVAL(1,IND)),0+ERGHT) II = MAX(II,1) IT = MAX(POSVAL(2,1) - 1,0) * POSVAL(2,IND) = PVAL(2,IND,J) DO 7303 I = IS-II,IS DARRAY(I,J) = IT 7303 CONTINUE ENDIF ENDIF 7195 CONTINUE * IF ( (.NOT.BDUN).OR.(.NOT.TDUN) ) GOTO 9990 IF (.NOT.TLCTOK) THEN JSS = PATH5Y + 1 JEE = IYEND JDD = +1 ELSEIF (.NOT.BLCTOK) THEN JSS = PATH5Y - 1 JEE = IYBEG JDD = -1 ELSE GOTO 7196 ENDIF DO 7110 J = JSS,JEE,JDD DO 7111 I = IXBEG,IXEND IF (DARRAY(I,J).EQ.-2.AND.DARRAY(I,PATH5Y).GT.-1) & DARRAY(I,J) = DARRAY(I,PATH5Y) 7111 CONTINUE 7110 CONTINUE * 7196 CONTINUE * * * * SINCE (blind or extrapolatory) spreading has been reduced, this code is * no longer particularly necessary. ** ** Tag marginal points, existing tags include -1=>SUPRESS -2=>NotYetAssigned ** New tags are -3, -4, -5; all mean not yet assigned, but -3 points are ** somewhat near extrema, -4 points are even closer and -5 are very near ** extrema. This tagging makes the next steps easier. ** ** IF (CNVDBG) THEN ** PRINT *,'SPREAD: Tag near extremal points w/ FORTRAN(Y) or Assembler (n) code? (Y/n)' ** I = MENU(1,0,1) ** OLDCAL = I.EQ.1 ** ENDIF ** OLDCAL = .FALSE. * PRINT *,'SPREAD: Tagging near extremal points ...' * IF (CNVDBG) THEN * PRINT *,'DO -6''s or not? (y/N)' * I = MENU(0,0,1) * ELSE * I = 0 * ENDIF

7302

** ** IF (OLDCAL) THEN ** DO 340 I = 1,NX ** DO 341 J = 1,NY ** IF (DARRAY(I,J).EQ.-2) THEN ** IF (SARRAY(I,J).LT.LOW2) THEN ** IF (SARRAY(I,J).LT.LOWCUT) THEN ** DARRAY(I,J) = -5 ** ELSEIF (SARRAY(I,J).LT.LOW3) THEN ** DARRAY(I,J) = -4 ** ELSE ** DARRAY(I,J) = -3 ** ENDIF ** ELSEIF (SARRAY(I,J).GT.IHI2) THEN ** IF (SARRAY(I,J).GT.IHICUT) THEN ** DARRAY(I,J) = -5 ** ELSEIF (SARRAY(I,J).GT.IHI3) THEN ** DARRAY(I,J) = -4 ** ELSE ** DARRAY(I,J) = -3 ** ENDIF ** ENDIF ** ENDIF ** 341 CONTINUE ** 340 CONTINUE ** ELSE * IXB4 = IXBEG * IXE4 = IXEND * IYB4 = IYBEG * IYE4 = IYEND * ITSTV = LOW2 * INX = NX * IT = -3 * CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), * & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) * ITSTV = LOW3 * IT = -4 ** ITADDR = KADDR(DARRAY(1,1)) ** ITADSR = KADDR(SARRAY(1,1)) ** CALL ILEYXR(ITADDR,ITADSR, * CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), * & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) * ITSTV = LOWCUT * IT = -5 ** ITADDR = KADDR(DARRAY(1,1)) ** ITADSR = KADDR(SARRAY(1,1)) ** CALL ILEYXR(ITADDR,ITADSR, * CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), * & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) * ITSTV = MAX((0.0+LOWCUT - 2*(LOW3-LOWCUT)/3),0.0+SMALL) * ITSTV = (ITSTV+LOWCUT+SMALL)/3 * IT = -6 ** ITADDR = KADDR(DARRAY(1,1)) ** ITADSR = KADDR(SARRAY(1,1)) * IF (I.EQ.1) * & CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), * & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) * ITSTV = IHI2 * IT = -3 * CALL DGEYXR(DARRAY(1,1),SARRAY(1,1),

* * * * * * * * * * * * * * * ** * *** ** ** ** ** ** ** *** 195 *** * * * * * * * * * * *

&

&

&

& &

IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ITSTV = IHI3 IT = -4 CALL DGEYXR(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ITSTV = IHICUT IT = -5 CALL DGEYXR(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ITSTV = MIN((0.0+IHICUT + 2*(IHICUT-IHI3)/3),BIG+0.0) ITSTV = (ITSTV+IHICUT+BIG)/3 IT = -6 IF (I.EQ.1) CALL DGEYXR(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF IF (QDRNT.LE.1) GOTO 195 IF (CNVDBG) THEN PRINT *,'Do outward from the path, VERSION 1? (y/N)' I = MENU(0,0,1) IF (I.EQ.0) GOTO 195 ENDIF

CONTINUE IHI1 = (IHICUT*3 LOW1 = (IHICUT*2 IHI2 = (IHICUT*2 LOW2 = (IHICUT + IHI3 = (IHICUT*3 LOW3 = (IHICUT + IHI4 = IHI3 LOW4 = LOW3 + LOWCUT*2)/5 + LOWCUT*3)/5 + LOWCUT)/3 LOWCUT*2)/3 + LOWCUT)/4 LOWCUT*3)/4

ITER = 1 ICMP = -2 * IF (CNVDBG) THEN PRINT *,' Do intermediate spreading? (Y/n)' I = MENU(1,0,1) IF (I.EQ.0.OR.ABORT.OR.ESCAPE.OR.INTRPT) GOTO 197 ENDIF * * LOOP BACK point for spreading passes. * ITEST = QDRNT IFL = .FALSE. CHANGX = 0 CHANGY = 0 CHANGE = 0 ICONTG = 0 199 CONTINUE IF (IFL) ITEST = ITEST - 1 IF (ITEST.LT.1) ITEST = 1

IF (CNVDBG) PRINT *,' ' LCHNG = CHANGE CHANGX = 0 CHANGY = 0 I4YB = IYBEG I4YE = IYEND I4XB = IXBEG I4XE = IXEND ICMP = -6 IF (ITER.EQ.1) THEN ICMP = -5 I4YB = IYBEG I4YE = BLCTRD I4XB = IXBEG I4XE = IXEND ELSEIF (ITER.EQ.2) THEN ICMP = -5 I4YB = TLCTRD I4YE = IYEND I4XB = IXBEG I4XE = IXEND ELSEIF (ITER.EQ.3) THEN I4YB = IYBEG I4YE = BLCTRD I4XB = IXBEG I4XE = IXEND ELSEIF (ITER.EQ.4) THEN I4YB = TLCTRD I4YE = IYEND I4XB = IXBEG I4XE = IXEND ENDIF

** *

* ** * New version * ICENTR = (BLCTRD + TLCTRD + 1)/2 DO 100 J = I4YB,I4YE ** IF (CNVDBG) PRINT *,' RIGHT SIDE J = ',J *First do the right side ... DO 101 I = VCNTRL,I4XB,-1 IF (DARRAY(I,J).GT.-1) THEN IT1 = DARRAY(I,J) I1 = I GOTO 102 ENDIF 101 CONTINUE GOTO 149 102 CONTINUE ** IF (CNVDBG) PRINT *,'102: J = ',J,' I1 = ',I1 DO 103 I = (I1+1),I4XE IF (DARRAY(I,J).LE.-2) THEN I1 = I - 1 I2 = I GOTO 104 ELSEIF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.IT1) THEN I1 = I GOTO 102 ENDIF

103 104 **

111 112 ** * this

105

CONTINUE GOTO 149 CONTINUE IF (CNVDBG) PRINT *,'104: J = ',J,' I1 = ',I1,' I2 = ',I2 DO 111 I = (I2+1),I4XE IF (DARRAY(I,J).EQ.-1) THEN GOTO 149 ELSEIF (DARRAY(I,J).GE.0) THEN I2 = I IT2 = DARRAY(I,J) GOTO 112 ENDIF CONTINUE GOTO 149 CONTINUE IF (IABS(IT2-IT1).GT.1) GOTO 149 IF (CNVDBG) PRINT *,'112: J = ',J,' I1 = ',I1,' I2 = ',I2 IF (IT2.EQ.IT1) THEN might need more work, ?there could be undetected intermediate fringes? DO 105 I = I1,I2 IF (DARRAY(I,J).LE.-2.AND.DARRAY(I,J).GE.ICMP) THEN CHANGX = CHANGX + 1 DARRAY(I,J) = IT1 ENDIF CONTINUE ELSE DO 106 ID = 0,(I2-I1+1)/2 IF (DARRAY((I1+ID),J).LE.-2.AND.DARRAY((I1+ID),J).GE.ICMP) THE CHANGX = CHANGX + 1 DARRAY(I1+ID,J) = IT1 ENDIF IF (DARRAY((I2-ID),J).LE.-2.AND.DARRAY((I2-ID),J).GE.ICMP) THE

N CHANGX = CHANGX + 1 DARRAY(I2-ID,J) = IT2 ENDIF CONTINUE ENDIF

106 *

149 CONTINUE *Next do the left side ... * ** IF (CNVDBG) PRINT *,' LEFT SIDE J = ',J DO 151 I = VCNTRL,I4XE IF (DARRAY(I,J).GT.-1) THEN IT1 = DARRAY(I,J) I1 = I GOTO 152 ENDIF 151 CONTINUE GOTO 189 152 CONTINUE ** IF (CNVDBG) PRINT *,'152: J = ',J,' I1 = ',I1 DO 153 I = (I1-1),I4XB,-1 IF (DARRAY(I,J).LE.-2) THEN I1 = I + 1 I2 = I GOTO 154 ELSEIF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.IT1) THEN

153 154 **

161 162 ** * this

155

I1 = I GOTO 152 ENDIF CONTINUE GOTO 189 CONTINUE IF (CNVDBG) PRINT *,'154: J = ',J,' I1 = ',I1,' I2 = ',I2 DO 161 I = (I2-1),I4XB,-1 IF (DARRAY(I,J).EQ.-1) THEN GOTO 189 ELSEIF (DARRAY(I,J).GE.0) THEN I2 = I IT2 = DARRAY(I,J) GOTO 162 ENDIF CONTINUE GOTO 189 CONTINUE IF (IABS(IT2-IT1).GT.1) GOTO 189 IF (CNVDBG) PRINT *,'162: J = ',J,' I1 = ',I1,' I2 = ',I2 IF (IT2.EQ.IT1) THEN might need more work, ?there could be undetected intermediate fringes? DO 155 I = I1,I2,-1 IF (DARRAY(I,J).LE.-2.AND.DARRAY(I,J).GE.ICMP) THEN CHANGX = CHANGX + 1 DARRAY(I,J) = IT1 ENDIF CONTINUE ELSE DO 156 ID = 0,(I1-I2+1)/2 IF (DARRAY((I1-ID),J).LE.-2.AND.DARRAY((I1-ID),J).GE.ICMP) THE CHANGX = CHANGX + 1 DARRAY(I1-ID,J) = IT1 ENDIF IF (DARRAY((I2+ID),J).LE.-2.AND.DARRAY((I2+ID),J).GE.ICMP) THE

N CHANGX = CHANGX + 1 DARRAY(I2+ID,J) = IT2 ENDIF CONTINUE ENDIF

156 *

189 CONTINUE 100 CONTINUE * * IF (ITER.EQ.1.OR.(ITER.LE.5.AND.ICONTG.EQ.0)) THEN ICMP = -6 I4YB = IYBEG I4YE = IYEND I4XB = IXBEG I4XE = IXEND ELSEIF (ITER.LE.5.OR.ITER.GE.10) THEN GOTO 3199 ELSEIF ((15*CHANGX/ITER).GE.LCHNG) THEN GOTO 3199 ELSE ICMP = -6 ENDIF

* * Vertical scanning version; Do right side/top then right side/bottom * * IF (CNVDBG) PRINT *,'SPREAD: DOING VERTICALS ' ICENTR = (I4YB + I4YE + 1)/2 DO 2100 I = VCNTRL,I4XE * Right side / Top DO 2101 J = ICENTR,I4YB,-1 IF (DARRAY(I,J).GT.-1) THEN IT1 = DARRAY(I,J) J1 = J GOTO 2102 ENDIF 2101 CONTINUE GOTO 2149 2102 CONTINUE DO 2103 J = (J1+1),I4YE IF (DARRAY(I,J).LE.-2) THEN J1 = J - 1 J2 = J GOTO 2104 ELSEIF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.IT1) THEN J1 = J GOTO 2102 ENDIF 2103 CONTINUE GOTO 2149 2104 CONTINUE DO 2111 J = (J2+1),I4YE IF (DARRAY(I,J).EQ.-1) THEN GOTO 2149 ELSEIF (DARRAY(I,J).GE.0) THEN J2 = J IT2 = DARRAY(I,J) GOTO 2112 ENDIF 2111 CONTINUE GOTO 2149 2112 CONTINUE IF (IABS(IT2-IT1).GT.1) GOTO 2149 IF (IT2.EQ.IT1.AND.IT1.EQ.ITEST) THEN DO 2115 J = J1,J2 IF (DARRAY(I,J).LE.-2) THEN CHANGY = CHANGY + 1 DARRAY(I,J) = IT1 ENDIF 2115 CONTINUE IFL = .TRUE. ELSEIF (IT2.EQ.IT1) THEN * this might need more work, ?there could be undetected intermediate fringes? DO 2105 J = J1,J2 IF (DARRAY(I,J).LE.-2.AND.DARRAY(I,J).GE.ICMP) THEN CHANGY = CHANGY + 1 DARRAY(I,J) = IT1 ENDIF 2105 CONTINUE ENDIF * 2149 CONTINUE *

* Right side / Bottom * DO 2151 J = ICENTR,I4YE IF (DARRAY(I,J).GT.-1) THEN IT1 = DARRAY(I,J) J1 = J GOTO 2152 ENDIF 2151 CONTINUE GOTO 2189 2152 CONTINUE DO 2153 J = (J1-1),I4YB,-1 IF (DARRAY(I,J).LE.-2) THEN J1 = J + 1 J2 = J GOTO 2154 ELSEIF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.IT1) THEN J1 = J GOTO 2152 ENDIF 2153 CONTINUE GOTO 2189 2154 CONTINUE DO 2161 J = (J2-1),I4YB,-1 IF (DARRAY(I,J).EQ.-1) THEN GOTO 2189 ELSEIF (DARRAY(I,J).GE.0) THEN J2 = J IT2 = DARRAY(I,J) GOTO 2162 ENDIF 2161 CONTINUE GOTO 2189 2162 CONTINUE IF (IABS(IT2-IT1).GT.1) GOTO 2189 IF (IT2.EQ.IT1.AND.IT1.EQ.ITEST) THEN DO 2165 J = J1,J2 IF (DARRAY(I,J).LE.-2) THEN CHANGY = CHANGY + 1 DARRAY(I,J) = IT1 ENDIF 2165 CONTINUE IFL = .TRUE. ELSEIF (IT2.EQ.IT1) THEN * this might need more work, ?there could be undetected intermediate fringes? DO 2155 J = J1,J2,-1 IF (DARRAY(I,J).LE.-2.AND.DARRAY(I,J).GE.ICMP) THEN CHANGY = CHANGY + 1 DARRAY(I,J) = IT1 ENDIF 2155 CONTINUE ENDIF * 2189 CONTINUE 2100 CONTINUE * * * Vertical scanning version; Do Left side/top then Left side/bottom * DO 3100 I = VCNTRL,I4XB,-1

* Left side / Top DO 3101 J = ICENTR,I4YB,-1 IF (DARRAY(I,J).GT.-1) THEN IT1 = DARRAY(I,J) J1 = J GOTO 3102 ENDIF 3101 CONTINUE GOTO 3149 3102 CONTINUE DO 3103 J = (J1+1),I4YE IF (DARRAY(I,J).LE.-2) THEN J1 = J - 1 J2 = J GOTO 3104 ELSEIF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.IT1) THEN J1 = J GOTO 3102 ENDIF 3103 CONTINUE GOTO 3149 3104 CONTINUE DO 3111 J = (J2+1),I4YE IF (DARRAY(I,J).EQ.-1) THEN GOTO 3149 ELSEIF (DARRAY(I,J).GE.0) THEN J2 = J IT2 = DARRAY(I,J) GOTO 3112 ENDIF 3111 CONTINUE GOTO 3149 3112 CONTINUE IF (IABS(IT2-IT1).GT.1) GOTO 3149 IF (IT2.EQ.IT1) THEN * this might need more work, ?there could be undetected intermediate fringes? DO 3105 J = J1,J2 IF (DARRAY(I,J).LE.-2.AND.DARRAY(I,J).GE.ICMP) THEN CHANGY = CHANGY + 1 DARRAY(I,J) = IT1 ENDIF 3105 CONTINUE ENDIF * 3149 CONTINUE * * Left side / Bottom * DO 3151 J = ICENTR,I4YE IF (DARRAY(I,J).GT.-1) THEN IT1 = DARRAY(I,J) J1 = J GOTO 3152 ENDIF 3151 CONTINUE GOTO 3189 3152 CONTINUE DO 3153 J = (J1-1),I4YB,-1 IF (DARRAY(I,J).LE.-2) THEN J1 = J + 1

3153 3154

3161 3162 * this

3155 *

J2 = J GOTO 3154 ELSEIF (DARRAY(I,J).GE.0.AND.DARRAY(I,J).NE.IT1) THEN J1 = J GOTO 3152 ENDIF CONTINUE GOTO 3189 CONTINUE DO 3161 J = (J2-1),I4YB,-1 IF (DARRAY(I,J).EQ.-1) THEN GOTO 3189 ELSEIF (DARRAY(I,J).GE.0) THEN J2 = J IT2 = DARRAY(I,J) GOTO 3162 ENDIF CONTINUE GOTO 3189 CONTINUE IF (IABS(IT2-IT1).GT.1) GOTO 3189 IF (IT2.EQ.IT1) THEN might need more work, ?there could be undetected intermediate fringes? DO 3155 J = J1,J2,-1 IF (DARRAY(I,J).LE.-2.AND.DARRAY(I,J).GE.ICMP) THEN CHANGY = CHANGY + 1 DARRAY(I,J) = IT1 ENDIF CONTINUE ENDIF

3189 CONTINUE 3100 CONTINUE * * 3199 CONTINUE * * * NEXT, TEST for CHANGes in the last iteration. If there were CHANGes, go * back and do it again, or if ITER less than 4 do it again. * INX = NX I4XB = 1 I4XE = NX I4YB = 1 I4YE = NY IUNDUN = DCNT26(DARRAY(1,1),I4XB,I4XE,INX,I4YB,I4YE) CHANGE = CHANGY + CHANGX IF ( ((CHANGE.EQ.0.OR.LCHNG.EQ.0) .OR. ITER.LE.5) .OR. & ((CHANGE*12/ITER.LT.LCHNG) .AND. ITER.GT.5 .AND. ITER.LE.7) .OR. & ((CHANGE*16/ITER.LT.LCHNG) .AND. ITER.GE.8 .AND. ITER.LE.10) .OR. & ((CHANGE*18/ITER.LT.LCHNG) .AND. ITER.GE.11) & ) THEN I = ITER CALL CONTAG(SARRAY(1,1),DARRAY(1,1),0+NX,0+NY,0+I) INX = NX I4XB = 1 I4XE = NX I4YB = 1 I4YE = NY

R,'

R,'

R,'

R,'

R,'

I = DCNT26(DARRAY(1,1),I4XB,I4XE,INX,I4YB,I4YE) ICONTG = (IUNDUN - I) CHANGE = CHANGE + ICONTG PRINT *,'SPREAD: CHANGX = ',CHANGX,' CHANGY = ',CHANGY,' ITER = ',ITE CHANGE ',CHANGE,' REMAINING ',I IDELT = (101.0*CHANGE) / (1+I) IF (I.GT.0.AND.((I.LT.IUNDUN.AND.IDELT.GT.15).OR.ITER.LE.4)) THEN ITER = ITER + 1 IUNDUN = I GOTO 199 ENDIF IUNDUN = I ELSEIF (ITER.LE.6) THEN I = IUNDUN PRINT *,'SPREAD: CHANGX = ',CHANGX,' CHANGY = ',CHANGY,' ITER = ',ITE CHANGE ',CHANGE,' REMAINING ',I ITER = ITER + 1 IF (I.GT.0) GOTO 199 ELSEIF (ITER.GT.6.AND..NOT.DIDEDG) THEN CALL EDGES(SARRAY,DARRAY,NX,NY) DIDEDG = .TRUE. INX = NX I4XB = 1 I4XE = NX I4YB = 1 I4YE = NY I = DCNT26(DARRAY(1,1),I4XB,I4XE,INX,I4YB,I4YE) CHANGE = CHANGE + (IUNDUN - I) PRINT *,'SPREAD: CHANGX = ',CHANGX,' CHANGY = ',CHANGY,' ITER = ',ITE CHANGE ',CHANGE,' REMAINING ',I IDELT = (101.0*CHANGE) / (1+I) IF (I.GT.0.AND.I.LT.IUNDUN.AND.IDELT.GT.15) THEN ITER = ITER + 1 IUNDUN = I GOTO 199 ENDIF IUNDUN = I ELSEIF (ITER.GT.7.AND..NOT.DIDCRN) THEN CALL CORNER(SARRAY,DARRAY,NX,NY) DIDCRN = .TRUE. INX = NX I4XB = 1 I4XE = NX I4YB = 1 I4YE = NY I = DCNT26(DARRAY(1,1),I4XB,I4XE,INX,I4YB,I4YE) CHANGE = CHANGE + (IUNDUN - I) PRINT *,'SPREAD: CHANGX = ',CHANGX,' CHANGY = ',CHANGY,' ITER = ',ITE CHANGE ',CHANGE,' REMAINING ',I IDELT = (101.0*CHANGE) / (1+I) IF (I.GT.0.AND.I.LT.IUNDUN.AND.IDELT.GT.15) THEN ITER = ITER + 1 IUNDUN = I GOTO 199 ENDIF IUNDUN = I ELSE I = IUNDUN PRINT *,'SPREAD: CHANGX = ',CHANGX,' CHANGY = ',CHANGY,' ITER = ',ITE CHANGE ',CHANGE,' REMAINING ',I

* * * * * * * Post processing, (?) do corners and edges ... IF (CNVDBG.AND..NOT.(DIDEDG)) THEN IF ( (MGFRMN(1).EQ.'C'.OR.MGFRMN(1).EQ.'c') .OR. & (MGFRMN(1).EQ.'D'.OR.MGFRMN(1).EQ.'d') .OR. & (MGFRMN(1).EQ.'E'.OR.MGFRMN(1).EQ.'e') .OR. & (MGFRMN(1).EQ.'I'.OR.MGFRMN(1).EQ.'i') ) THEN PRINT *,'DO EDGES? (Y/n)' I = 1 ELSE PRINT *,'DO EDGES? (y/N)' I = 0 ENDIF I = MENU(I,0,1) IF (I.EQ.0) GOTO 1196 ELSEIF (.NOT.(DIDEDG)) THEN IF (.NOT. ( (MGFRMN(1).EQ.'C'.OR.MGFRMN(1).EQ.'C') .OR. & (MGFRMN(1).EQ.'D'.OR.MGFRMN(1).EQ.'d') .OR. & (MGFRMN(1).EQ.'E'.OR.MGFRMN(1).EQ.'e') .OR. & (MGFRMN(1).EQ.'I'.OR.MGFRMN(1).EQ.'i') ) ) GOTO 1196 ELSE GOTO 1196 ENDIF * PRINT *,'SPREAD: DOING EDGES' IF (.NOT.DIDEDG) CALL EDGES(SARRAY,DARRAY,NX,NY) * IF (.NOT.DIDCRN) CALL CORNER(SARRAY,DARRAY,NX,NY) * 1196 CONTINUE * * 197 CONTINUE INX = NX I4XB = 1 I4XE = NX I4YB = 1 I4YE = NY I = DCNT26(DARRAY(1,1),I4XB,I4XE,INX,I4YB,I4YE) * * Fill in any untagged points with 0 (ie. First Quadrant) -* IIT = QSTART IF (I.GT.0) THEN IF (.NOT.CNVDBG) THEN I = 1 ELSE PRINT *,'Fill untagged points? (y/N/2=Zero fill/3)'

IDELT = (101.0*CHANGE) / (1+I) ENDIF ITER = ITER + 1 IF ((IDELT.GT.5).OR.(ITER.LE.8.AND.IDELT.GT.1)) THEN IF ( (I.GT.0) .AND. (CHANGE.GT.0. & OR.(LCHNG.GT.0.AND.ITER.LE.8))) GOTO 199 ENDIF 198 CONTINUE IF (CNVDBG.AND.IUNDUN.GT.0) THEN PRINT *,' Done with automatic looping - CONTINUE LOOPING (y/N)' I = MENU(0,0,1) IF (I.EQ.1) GOTO 199 ENDIF

* * * * *

* * * * * * * * *

I = MENU(0,0,3) IF (I.EQ.2) IIT = 0 IF (I.EQ.3) THEN PRINT *,'Fill with ? (0..9)' IIT = MENU(0,0,9) ENDIF ENDIF ENDIF IF (I.GT.0) THEN PRINT *,'SPREAD: FILLing untagged points: ',IIT,' (',QSTART,')' DO 9666 I = 1,NX DO 9667 J = 1,NY IF (DARRAY(I,J).LE.-2.AND.DARRAY(I,J).GE.-5) DARRAY(I,J) = 0 9667 CONTINUE 9666 CONTINUE IXB4 = 1 IXE4 = NX INX = NX IYB4 = 1 IYE4 = NY ITSTV = LOW1 IT = -2 CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ITSTV = IHI1 IT = -2 CALL DGEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) CALL DSPYX5(DARRAY(1,1),IXB4,IXE4,INX,IYB4,IYE4,IIT) ENDIF

RETURN END *---------------------------------------------------------------------$SEGMENT I_TO__E * This is code from SPREAD which has been seperated out for increased flexibilit y * of use and to shorten SPREAD and make it more understandable. There are sever al * entry points, CORNER, NUEDGE, EDGES, OUTWRD and CONTAG. * SUBROUTINE CORNER(SARRAY,DARRAY,NX,NY) * IMPLICIT CHARACTER*123 (A-Z) CHARACTER*8 HEXOF,THEHEX,THEHX2 CHARACTER*1 MGFRMN(2) REAL*4 LSLOPE,RSLOPE,LINTRC,RINTRC INTEGER*4 NX,NY,LOWCUT,IHICUT,LLCTRD,RLCTRD,BLCTRD,TLCTRD,CHANGE,I,I4YB INTEGER*4 IJS(3),IJ2S(3),BUF(3),FCALL4,KADDR,CHANGX,CHANGY,ITADDR,I4YE INTEGER*4 ITADSR,MODE,ICNT26,DCNT26,ICENTR,ID,IHI1,IHI2,IHI3,LOW1,LOW2,LOW 3 INTEGER*4 IIXL,IIYL,INX,IT,ITSTV,IXB4,IXE4,IYB4,IYE4,J,JSTART,JSTOP INTEGER*4 LMED,RMED,LUHING,RUHING,LLHING,RLHING,HSPRDN,HSPRDM INTEGER*4 I4XB,I4XE,ITERNO,ICMP INTEGER*2 SARRAY(NX,NY),DARRAY(NX,NY),VCNTRL,HCNTRL,PATH4Y,PATH6X,PATH6Y INTEGER*2 PATH1X,PATH1Y,PATH2X,PATH2Y,PATH3X,PATH3Y,PATH(2,6),PATH4X INTEGER*2 I1XUL,I1XUR,I1XLL,I1XLR,I1YUL,I1YUR,I1YLL,I1YLR,PATH5X,PATH5Y INTEGER*2 POINTY(2,4,256),POINTB(8,256),POINTX(2,4,512),POINTA(8,512) INTEGER*2 LINEY(256),LINEX(512),VCTRLN,HCTRLN,IXBEG,IYBEG,IXEND,IYEND INTEGER*2 PTH1X(4),PTH1Y(4),PTH2X(4),PTH2Y(4),PTH3X(4),PTH3Y(4) INTEGER*2 PTH(4,2,5),PTH4X(4),PTH4Y(4),PTH5X(4),PTH5Y(4),QDRNT

INTEGER*2 TYP(3),ICHS(3),DEFBUF,SAVBUF,FRYS(100),GRG(9),QSTART INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384 LOGICAL*2 MGLR,MGUD,MGOTHR,MGOK,BLCTOK,TLCTOK,PTHDUN,CNVDBG LOGICAL*1 DOALI,DOCRS,OLDCAL,IFL,DB,DT,DL,DR,SAMER,DIFRNR,HI,LO LOGICAL*1 SAMEL,DIFRNL,EXTRAR,EXTRAL EQUIVALENCE (PATH(1,1),PATH1X),(PATH(2,1),PATH1Y),(CHANGE,CHANGY) EQUIVALENCE (PATH(1,2),PATH2X),(PATH(2,2),PATH2Y) EQUIVALENCE (PATH(1,3),PATH3X),(PATH(2,3),PATH3Y) EQUIVALENCE (PATH(1,4),PATH4X),(PATH(2,4),PATH4Y) EQUIVALENCE (PATH(1,5),PATH5X),(PATH(2,5),PATH5Y) EQUIVALENCE (PATH(1,6),PATH6X),(PATH(2,6),PATH6Y) EQUIVALENCE (POINTY(1,1,1),POINTB(1,1)),(POINTX(1,1,1),POINTA(1,1)) EQUIVALENCE (PTH(1,1,1),PTH1X(1)),(PTH(1,2,1),PTH1Y(1)) EQUIVALENCE (PTH(1,1,2),PTH2X(1)),(PTH(1,2,2),PTH2Y(1)) EQUIVALENCE (PTH(1,1,3),PTH3X(1)),(PTH(1,2,3),PTH3Y(1)) EQUIVALENCE (PTH(1,1,4),PTH4X(1)),(PTH(1,2,4),PTH4Y(1)) EQUIVALENCE (PTH(1,1,5),PTH5X(1)),(PTH(1,2,5),PTH5Y(1)) EQUIVALENCE (VCNTRL,VCTRLN),(HCNTRL,HCTRLN) EQUIVALENCE (I4XB,IXB4),(I4XE,IXE4),(I4YB,IYB4),(I4YE,IYE4) COMMON /I2ENML/LOWCUT,IHICUT,/MGFRAM/MGFRMN,MGLR,MGUD,MGOTHR,MGOK COMMON /MGFORM/LINEX,LINEY,POINTY,POINTX,IXBEG,IYBEG,IXEND,IYEND COMMON /FETURE/LLCTRD,RLCTRD,BLCTRD,TLCTRD,VCNTRL,HCNTRL,BLCTOK,TLCTOK COMMON /PTHALT/I1XUL,I1XUR,I1XLL,I1XLR,I1YUL,I1YUR,I1YLL,I1YLR COMMON /MGPATH/PATH,PTHDUN,/KIASMN/ICHS,BUF,TYP,IJS,IJ2S,/MGPTH/PTH COMMON /DEBUGC/CNVDBG,/THEQAD/QDRNT,/FRINGE/FRYS,/STARTQ/QSTART COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/PARNML/BIG,SMALL,RANGE COMMON /STATLR/LSLOPE,RSLOPE,LINTRC,RINTRC,LMED,RMED,LUHING,RUHING, & LLHING,RLHING,HSPRDN,HSPRDM SAVE /MGPATH/,/I2ENML/,/MGFRAM/,/MGFORM/,/FETURE/,/PTHALT/,/KIASMN/,/MGPTH / SAVE /DEBUGC/,/THEQAD/,/FRINGE/,/PARNML/,/PARNM2/,/STARTQ/,/STATLR/ EXTERNAL APORCP,FCALL4,KADDR,DSPYX2,DSQYX2,DSQXY2,DSPYX5,DGTYX2,DLTYX2 EXTERNAL DGTYXR,DLTYXR,DLEYXR,DGEYXR,DCNT26 EXTERNAL ISPYX2,ISQYX2,ISQXY2,ISPYX5,IGTYX2,ILTYX2 EXTERNAL IGTYXR,ILTYXR,ILEYXR,IGEYXR,ICNT26 EXTERNAL DTPYX2,DTQYX2,DTQXY2,DTPYX5 SAVE IHI1 = LOW1 = IHI2 = LOW2 = IHI3 = LOW3 = PRINT (IHICUT*3 + LOWCUT*2)/5 (IHICUT*2 + LOWCUT*3)/5 (IHICUT*2 + LOWCUT)/3 (IHICUT + LOWCUT*2)/3 (IHICUT*3 + LOWCUT)/4 (IHICUT + LOWCUT*3)/4 *,'SPREAD; CORNER: Entered.'

* *

* * * First, the corner the path (or alternate paths) start from ... * IXB4 = 1 IXE4 = NX IYB4 = 1 IYE4 = NY ITSTV = LOW1 INX = NX IT = -2 CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ITSTV = IHI1 IT = -2 CALL DGEYXR(DARRAY(1,1),SARRAY(1,1),

& *

IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT)

* * ** * *

* * * ** ** ** * ** * * * * * ** * *

IXB4 = LLCTRD + 1 IXE4 = RLCTRD - 1 IYB4 = BLCTRD IYE4 = TLCTRD ITSTV = LOW2 INX = NX IT = -3 CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ITSTV = IHI2 IT = -3 CALL DGEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) PRINT *,'CORNER: Doing Corners, part 1 ...' IF (0.LT.I1XUL.AND.0.LT.I1YUL) THEN IT = DARRAY(PATH1X,PATH1Y) PRINT *,'CORNER: Doing UPPER LEFT corner ' JSTART = MAX0(PTH2Y(3),PTH4Y(3),PTH3Y(3),TLCTRD) JSTART = IYEND JSTART = NY JSTOP = MIN0(PTH1Y(3),HCNTRL,I1YUL) IXB4 = IXBEG IXB4 = 1 IXE4 = LLCTRD - 1 IYB4 = JSTART IYE4 = JSTOP INX = NX ITADDR = KADDR(DARRAY(1,1)) CALL ISPYX2(ITADDR,IXB4,IXE4,INX,IYB4,IYE4,IT) DO 1 J = JSTART,JSTOP,-1 DO 2 I = IXBEG,(LLCTRD-1) IF (DARRAY(I,J).EQ.-2) THEN IF (DARRAY(PTH1X(3),J).GE.0) THEN DARRAY(I,J) = DARRAY(PTH1X(3),J) ELSE DARRAY(I,J) = IT ENDIF ENDIF 2 CONTINUE 1 CONTINUE ENDIF IF (0.LT.I1XLL.AND.0.LT.I1YLL) THEN IT = DARRAY(PATH1X,PATH1Y) PRINT *,'CORNER: Doing LOWER LEFT corner ' JSTART = MIN0(PTH2Y(1),PTH4Y(1),PTH3Y(1),BLCTRD) JSTART = IYBEG JSTART = 1 JSTOP = MAX0(PTH1Y(1),HCNTRL,I1YLL) IXB4 = IXBEG IXB4 = 1 IXE4 = LLCTRD - 1 IYB4 = JSTART IYE4 = JSTOP INX = NX ITADDR = KADDR(DARRAY(1,1)) CALL ISPYX2(ITADDR,IXB4,IXE4,INX,IYB4,IYE4,IT) DO 3 J = JSTART,JSTOP

* * ** ** ** * ** * * * * * ** * *

4 3 ENDIF

DO 4 I = IXBEG,(LLCTRD-1) IF (DARRAY(I,J).EQ.-2) THEN IF (DARRAY(PTH1X(1),J).GE.0) THEN DARRAY(I,J) = DARRAY(PTH1X(1),J) ELSE DARRAY(I,J) = IT ENDIF ENDIF CONTINUE CONTINUE

* * * ** ** ** * ** * * * * * ** * *

IF (0.LT.I1XUR.AND.0.LT.I1YUR) THEN IT = DARRAY(PATH1X,PATH1Y) PRINT *,'CORNER: Doing UPPER RIGHT corner ' JSTART = MAX0(PTH2Y(4),PTH4Y(4),PTH3Y(4),TLCTRD) JSTART = IYEND JSTART = NY JSTOP = MIN0(PTH1Y(4),HCNTRL,I1YUR) IXB4 = IXEND IXB4 = NX IXE4 = RLCTRD + 1 IYB4 = JSTART IYE4 = JSTOP INX = NX ITADDR = KADDR(DARRAY(1,1)) CALL ISPYX2(ITADDR,IXB4,IXE4,INX,IYB4,IYE4,IT) DO 5 J = JSTART,JSTOP,-1 DO 6 I = (RLCTRD+1),IXEND IF (DARRAY(I,J).EQ.-2) THEN IF (DARRAY(PTH1X(4),J).GE.0) THEN DARRAY(I,J) = DARRAY(PTH1X(4),J) ELSE DARRAY(I,J) = IT ENDIF ENDIF 6 CONTINUE 5 CONTINUE ENDIF IF (0.LT.I1XLR.AND.0.LT.I1YLR) THEN IT = DARRAY(PATH1X,PATH1Y) PRINT *,'CORNER: Doing LOWER RIGHT corner ' JSTART = MIN0(PTH2Y(2),PTH4Y(2),PTH3Y(2),BLCTRD) JSTART = IYBEG JSTART = 1 JSTOP = MAX0(PTH1Y(2),HCNTRL,I1YLR) IXB4 = IXEND IXB4 = NX IXE4 = RLCTRD + 1 IYB4 = JSTART IYE4 = JSTOP INX = NX ITADDR = KADDR(DARRAY(1,1)) CALL ISPYX2(ITADDR,IXB4,IXE4,INX,IYB4,IYE4,IT) DO 7 J = JSTART,JSTOP DO 8 I = (RLCTRD+1),IXEND IF (DARRAY(I,J).EQ.-2) THEN IF (DARRAY(PTH1X(2),J).GE.0) THEN DARRAY(I,J) = DARRAY(PTH1X(2),J)

* * * ** **

** * ** * * *

ELSE DARRAY(I,J) = IT ENDIF 8 7 ENDIF CONTINUE CONTINUE

ENDIF * * Next, the other corners, if possible ... * IF (DARRAY(PATH3X,PATH3Y).EQ.DARRAY(PATH1X,PATH1X)) THEN * PRINT *,'CORNER: Doing Corners, part 2 ...' ID = -1 IF (DARRAY(PATH4X,PATH4Y).EQ.DARRAY(PATH1X,PATH1X)) ID = 0 * * Upper Left * DO 21 J = HCNTRL,(TLCTRD+2) * DO 22 I = IXBEG,(LLCTRD+ID) * IF (DARRAY(I,J).EQ.-2) DARRAY(I,J) = IT * 22 CONTINUE * 21 CONTINUE IT = DARRAY(PATH1X,PATH1Y) * PRINT *,'CORNER: Doing UPPER LEFT corner ' IXB4 = IXBEG IXE4 = LLCTRD + ID IYE4 = HCNTRL IYB4 = MIN0( (TLCTRD+2), NY) INX = NX ITADDR = KADDR(DARRAY(1,1)) CALL ISPYX2(ITADDR,IXB4,IXE4,INX,IYB4,IYE4,IT) ** * * Lower Left * DO 23 J = HCNTRL,(BLCTRD-2),-1 * DO 24 I = IXBEG,(LLCTRD+ID) * IF (DARRAY(I,J).EQ.-2) DARRAY(I,J) = IT * 24 CONTINUE * 23 CONTINUE IT = DARRAY(PATH1X,PATH1Y) * PRINT *,'CORNER: Doing LOWER LEFT corner ' IXB4 = IXBEG IXE4 = LLCTRD + ID IYE4 = HCNTRL IYB4 = MAX0( (BLCTRD-2), 1) INX = NX ITADDR = KADDR(DARRAY(1,1)) CALL ISPYX2(ITADDR,IXB4,IXE4,INX,IYB4,IYE4,IT) ** * * Upper Right * DO 25 J = HCNTRL,(TLCTRD+2) * DO 26 I = (RLCTRD-ID),IXEND * IF (DARRAY(I,J).EQ.-2) DARRAY(I,J) = IT * 26 CONTINUE * 25 CONTINUE IT = DARRAY(PATH1X,PATH1Y) * PRINT *,'CORNER: Doing UPPER RIGHT corner ' IXB4 = IXEND IXE4 = RLCTRD - ID IYE4 = HCNTRL

IYB4 = MIN0( (TLCTRD+2), NY) INX = NX ITADDR = KADDR(DARRAY(1,1)) CALL ISPYX2(ITADDR,IXB4,IXE4,INX,IYB4,IYE4,IT) ** * * Lower Right * DO 27 J = HCNTRL,(BLCTRD-2),-1 * DO 28 I = (RLCTRD-ID),IXEND * IF (DARRAY(I,J).EQ.-2) DARRAY(I,J) = IT * 28 CONTINUE * 27 CONTINUE IT = DARRAY(PATH1X,PATH1Y) * PRINT *,'CORNER: Doing LOWER RIGHT corner ' IXB4 = IXEND IXE4 = RLCTRD - ID IYE4 = HCNTRL IYB4 = MAX0( (BLCTRD-2), 1) INX = NX ITADDR = KADDR(DARRAY(1,1)) CALL ISPYX2(ITADDR,IXB4,IXE4,INX,IYB4,IYE4,IT) ** ENDIF RETURN * * ENTRY NUEDGE(SARRAY,DARRAY,NX,NY) PRINT *,'NUEDGE: Entered.' IHI1 = (IHICUT*3 + LOWCUT*2)/5 LOW1 = (IHICUT*2 + LOWCUT*3)/5 IHI2 = (IHICUT*2 + LOWCUT)/3 LOW2 = (IHICUT + LOWCUT*2)/3 IHI3 = (IHICUT*3 + LOWCUT)/4 LOW3 = (IHICUT + LOWCUT*3)/4 IHI5 = MAX( IHICUT + (IHICUT - IHI3), MIN(0+BIG,0+BIG2) ) LOW5 = MIN( LOWCUT - (LOCUT - LOW3), MAX(0+SMALL,0+SMALL2) ) IHI6 = MAX( IHI5 + (IHICUT - IHI3), MIN(0+BIG,0+BIG2) ) LOW6 = MIN( LOW5 - (LOCUT - LOW3), MAX(0+SMALL,0+SMALL2) ) HI = SARRAY(PATH1X,PATH1Y) .GE. IHI3 LO = SARRAY(PATH1X,PATH1Y) .LE. LOW3 * IF (CNVDBG) PRINT *,'NUEDGE: First loop. HI = ',HI,' LO = ',LO IF (.NOT.(HI.OR.LO)) RETURN ILOL = 0 IHIL = 0 ILOR = 0 IHIR = 0 IYB4 = BLCTRD + (TLCTRD-BLCTRD)/12 IYE4 = TLCTRD - (TLCTRD-BLCTRD)/12 DO 1730 J = IYB4,IYE4 L = LINTRC + LSLOPE*J - 1 1731 CONTINUE L = L + 1 IF (DARRAY(L,J).EQ.-1.AND.L.LE.VCNTRL) GOTO 1731 MX = MAX(SARRAY(L,J),SARRAY(L+1,J),SARRAY(L+2,J),SARRAY(L+3,J),SARRAY( L+4,J)) MN = MIN(SARRAY(L,J),SARRAY(L+1,J),SARRAY(L+2,J),SARRAY(L+3,J),SARRAY( L+4,J)) IF (MX.GE.IHI1) THEN IHIL = IHIL + 1 IF (MX.GE.IHI2) IHIL = IHIL + 1

1732

IF (MX.GE.IHI3) IHIL = IHIL + 1 IF (MX.GE.IHICUT) IHIL = IHIL + 1 IF (MX.GE.IHI5) IHIL = IHIL + 1 ELSEIF (MN.LE.LOW1) THEN ILOL = ILOL + 1 IF (MN.LE.LOW2) ILOL = ILOL + 1 IF (MN.LE.LOW3) ILOL = ILOL + 1 IF (MN.LE.LOWCUT) ILOL = ILOL + 1 IF (MN.LE.LOW5) ILOL = ILOL + 1 ENDIF L = RINTRC + RSLOPE*J + 1 CONTINUE L = L - 1 IF (DARRAY(L,J).EQ.-1.AND.L.GE.VCNTRL) GOTO 1732 MX = MAX(SARRAY(L,J),SARRAY(L-1,J),SARRAY(L-2,J),SARRAY(L-3,J),SARRAY( MN = MIN(SARRAY(L,J),SARRAY(L-1,J),SARRAY(L-2,J),SARRAY(L-3,J),SARRAY(

L-4,J)) L-4,J)) IF (MX.GE.IHI1) THEN IHIR = IHIR + 1 IF (MX.GE.IHI2) IHIR = IF (MX.GE.IHI3) IHIR = IF (MX.GE.IHICUT) IHIR IF (MX.GE.IHI5) IHIR = ELSEIF (MN.LE.LOW1) THEN ILOR = ILOR + 1 IF (MN.LE.LOW2) ILOR = IF (MN.LE.LOW3) ILOR = IF (MN.LE.LOWCUT) ILOR IF (MN.LE.LOW5) ILOR = ENDIF 1730 CONTINUE IHIR + IHIR + = IHIR IHIR + ILOR + ILOR + = ILOR ILOR + 1 1 + 1 1 1 1 + 1 1

* * IF (.NOT.CNVDBG) THEN * PRINT *,'NUEDGE: Cutoff levels? (1=Extreme/2=MODERATE,/3=Relaxed/4=V' 'y Relaxed)' * I = MENU(2,0,5) * IF (I.EQ.1) THEN * IHX = IHI6 * IHI = IHI5 * LOX = LOW6 * LOW = LOW5 * ELSEIF (I.EQ.3) THEN * IHX = IHICUT * IHI = IHI3 * LOX = LOWCUT * LOW = LOW3 * ELSEIF (I.EQ.4) THEN * IHX = IHI3 * IHI = IHI2 * LOX = LOW3 * LOW = LOW2 * ELSEIF (I.EQ.5) THEN * IHX = IHI2 * IHI = IHI1 * LOX = LOW2 * LOW = LOW1 * ELSE * IHX = IHI5 * IHI = IHICUT

* * * *

LOX = LOW5 LOW = LOWCUT ENDIF ENDIF IF (CNVDBG) PRINT *,'NUEDGE: HIL = ',IHIL,' LOWL = ',ILOL,' HIR = ', IHIR,' LOWR = ',ILOR I = IHIL IHIL = IHIL - ILOL/3 ILOL = ILOL - I/3 I = IHIR IHIR = IHIR - ILOR/3 ILOR = ILOR - I/3 IF (CNVDBG) PRINT *,'after fix HIL = ',IHIL,' LOWL = ',ILOL,' HIR = ', IHIR,' LOWR = ',ILOR * I = 2*(IYE4 - IYB4 + 1) SAMER = (LO.AND.(ILOR .GE. I)) .OR. (HI.AND.(IHIR .GE. I)) DIFRNR = (HI.AND.(ILOR .GE. I)) .OR. (LO.AND.(IHIR .GE. I)) SAMEL = (LO.AND.(ILOL .GE. I)) .OR. (HI.AND.(IHIL .GE. I)) DIFRNL = (HI.AND.(ILOL .GE. I)) .OR. (LO.AND.(IHIL .GE. I)) DL = SAMEL .OR. DIFRNL DR = SAMER .OR. DIFRNR IF (.NOT.(DL.OR.DR)) RETURN I = 4*(TLCTRD - BLCTRD + 1) EXTRAR = (IHIR .GT. I) .OR. (ILOR .GT. I) EXTRAL = (IHIL .GT. I) .OR. (ILOL .GT. I) * PRINT *,'For left electrode; SAME ',SAMEL,' DIF. ',DIFRNL,' EXTRAL ',EXT RAL * IF (CNVDBG) THEN PRINT *,'NUEDGE: Cutoff levels? (1=Extreme/2=MODERATE,/3=Relaxed/4=V'' y Relaxed)' I = MENU(2,-2,6) IF (I.EQ.1) THEN IHX = IHI6 IHI = IHI5 LOX = LOW6 LOW = LOW5 ELSEIF (I.EQ.-1) THEN IHX = 16383 IHI = IHI6 LOX = 0 LOW = LOW6 ELSEIF (I.EQ.-2) THEN IHX = 16383 IHI = 16382 LOX = 0 LOW = 1 ELSEIF (I.EQ.3) THEN IHX = IHICUT IHI = IHI3 LOX = LOWCUT LOW = LOW3 ELSEIF (I.EQ.4) THEN IHX = IHI3 IHI = IHI2 LOX = LOW3 LOW = LOW2 ELSEIF (I.EQ.5) THEN IHX = IHI2

IHI = IHI1 LOX = LOW2 LOW = LOW1 ELSEIF (I.EQ.6) THEN IHX = IHI1 IHI = (IHI1 + LOW1 + 1)/2 LOX = LOW1 LOW = (IHI1 + LOW1)/2 ELSE IHX = IHI5 IHI = IHICUT LOX = LOW5 LOW = LOWCUT ENDIF ENDIF PRINT *,'Levels? (Default 1=0/1, 2=1/2, 3=2/3 ...)' IOFFL = MENU(1,0,7) IF (IOFFL.LE.0) IOFFL = 1 IF (MOD(IOFFL,2).EQ.1) THEN IOFFLS = IOFFL - 1 IOFFLD = IOFFL ELSE IOFFLD = IOFFL - 1 IOFFLS = IOFFL ENDIF IF (BLCTOK) THEN IF (TLCTOK) THEN JE = HCNTRL ELSE JE = IYEND ENDIF DO 2901 J = BLCTRD,JE DO 2902 I = LLCTRD,IXBEG,-1 II = I IF (SARRAY(I,J).EQ.0.OR.DARRAY(I,J).EQ.-1) GOTO 2903 CONTINUE IS = LLCTRD IF (CNVDBG) PRINT *,' FALLTHROUGH ' GOTO 2904 CONTINUE DO 2912 I = (II+1),VCNTRL IS = I IF (SARRAY(I,J).NE.0.AND.DARRAY(I,J).NE.-1) GOTO 2904 CONTINUE IS = LLCTRD IF (CNVDBG) PRINT *,'GRONK 2904' CONTINUE IF (LO) THEN IF (SARRAY(IS,J).GT.IHI) THEN IT = QSTART + IOFFLD ELSE IT = QSTART + IOFFLS ENDIF ELSEIF (HI) THEN IF (SARRAY(IS,J).LT.LOW) THEN IT = QSTART + IOFFLD ELSE IT = QSTART + IOFFLS

2902

2903

2912 2904 *

2901

3002

3003

3012 3004

3001 *

ENDIF ENDIF IF (DARRAY(IS,J).EQ.-2) DARRAY(IS,J) = IT IF (DARRAY(IS+1,J).EQ.-2) DARRAY(IS+1,J) = IT IF (DARRAY(IS+2,J).EQ.-2) DARRAY(IS+2,J) = IT IF (DARRAY(IS+1,J).EQ.-2) DARRAY(IS+1,J) = IT IF (DARRAY(IS+2,J).EQ.-2) DARRAY(IS+2,J) = IT CONTINUE ENDIF IF (TLCTOK) THEN IF (BLCTOK) THEN JE = HCNTRL ELSE JE = IYBEG ENDIF DO 3001 J = BLCTRD,JE DO 3002 I = LLCTRD,IXBEG,-1 II = I IF (SARRAY(I,J).EQ.0.OR.DARRAY(I,J).EQ.-1) GOTO 3003 CONTINUE IS = LLCTRD IF (CNVDBG) PRINT *,' FALLTHROUGH ' GOTO 3004 CONTINUE DO 3012 I = (II+1),VCNTRL IS = I IF (SARRAY(I,J).NE.0.AND.DARRAY(I,J).NE.-1) GOTO 3004 CONTINUE IS = LLCTRD IF (CNVDBG) PRINT *,'GRONK 3004' CONTINUE IF (LO) THEN IF (SARRAY(IS,J).GT.IHI) THEN IT = QSTART + IOFFLD ELSE IT = QSTART + IOFFLS ENDIF ELSEIF (HI) THEN IF (SARRAY(IS,J).LT.LOW) THEN IT = QSTART + IOFFLD ELSE IT = QSTART + IOFFLS ENDIF ENDIF IF (DARRAY(IS,J).EQ.-2) DARRAY(IS,J) = IT IF (DARRAY(IS+1,J).EQ.-2) DARRAY(IS+1,J) = IT IF (DARRAY(IS+2,J).EQ.-2) DARRAY(IS+2,J) = IT IF (DARRAY(IS+3,J).EQ.-2) DARRAY(IS+3,J) = IT IF (DARRAY(IS+4,J).EQ.-2) DARRAY(IS+4,J) = IT CONTINUE ENDIF IF (DL) THEN IT1 = LINTRC + LSLOPE * BLCTRD IT2 = LINTRC + LSLOPE * TLCTRD IXB4 = MIN( (LLCTRD - 1), IT1,IT2) IXE4 = MAX( ((5*IXB4 + VCNTRL)/6), IT1,IT2) + 1 INX = NX IF (SAMEL) THEN IT = QSTART + IOFFLS

&

&

&

&

&

DOALI = HI DOCRS = LO ELSEIF (DIFRNL) THEN IT = QSTART + IOFFLD DOALI = LO DOCRS = HI ENDIF IF (DOALI) THEN IF (EXTRAL.OR.DIFRNL) THEN ITSTV = IHX IYB4 = HCNTRL IYE4 = IYEND IF (TLCTOK) IYE4 = TLCTRD ELSE ITSTV = IHI IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD ENDIF CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (EXTRAL.OR.DIFRNL) THEN IYB4 = HCNTRL IYE4 = 1 IF (BLCTOK) IYE4 = BLCTRD ELSE IYE4 = HCNTRL IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD ENDIF CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNL) THEN IT = QSTART + IOFFLS ITSTV = LOW IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ELSEIF (DOCRS) THEN IF (EXTRAL.OR.DIFRNL) THEN ITSTV = LOX IYB4 = HCNTRL IYE4 = IYEND IF (TLCTOK) IYE4 = TLCTRD ELSE ITSTV = LOW IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD ENDIF IF (TLCTOK) IYB4 = TLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT)

IF (EXTRAL.OR.DIFRNL) THEN IYB4 = HCNTRL IYE4 = 1 IF (BLCTOK) IYE4 = BLCTRD ELSE IYE4 = HCNTRL IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD ENDIF CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNL) THEN IT = QSTART + IOFFLS ITSTV = IHI IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF ENDIF * * PRINT *,'For right electrode; SAME ',SAMER,' DIF. ',DIFRNR,' EXTRAR ',EX TRAR * IF (CNVDBG) THEN PRINT *,'NUEDGE: Cutoff levels? (1=Extreme/2=MODERATE,/3=Relaxed/4=V'' y Relaxed)' I = MENU(2,-2,6) IF (I.EQ.1) THEN IHX = IHI6 IHI = IHI5 LOX = LOW6 LOW = LOW5 ELSEIF (I.EQ.-1) THEN IHX = 16383 IHI = IHI6 LOX = 0 LOW = LOW6 ELSEIF (I.EQ.-2) THEN IHX = 16383 IHI = 16382 LOX = 0 LOW = 1 ELSEIF (I.EQ.3) THEN IHX = IHICUT IHI = IHI3 LOX = LOWCUT LOW = LOW3 ELSEIF (I.EQ.4) THEN IHX = IHI3 IHI = IHI2 LOX = LOW3 LOW = LOW2 ELSEIF (I.EQ.5) THEN

IHX = IHI2 IHI = IHI1 LOX = LOW2 LOW = LOW1 ELSEIF (I.EQ.6) THEN IHX = IHI1 IHI = (IHI1 + LOW1 + 1)/2 LOX = LOW1 LOW = (IHI1 + LOW1)/2 ELSE IHX = IHI5 IHI = IHICUT LOX = LOW5 LOW = LOWCUT ENDIF ENDIF PRINT *,'Levels? (Default 1=0/1, 2=1/2, 3=2/3 ...)' IOFFR = MENU(1,0,7) IF (IOFFR.LE.0) IOFFR = 1 IF (MOD(IOFFR,2).EQ.1) THEN IOFFRS = IOFFR - 1 IOFFRD = IOFFR ELSE IOFFRD = IOFFR - 1 IOFFRS = IOFFR ENDIF IF (BLCTOK) THEN IF (TLCTOK) THEN JE = HCNTRL ELSE JE = IYEND ENDIF DO 2801 J = BLCTRD,JE DO 2802 I = RLCTRD,IXEND II = I IF (SARRAY(I,J).EQ.0.OR.DARRAY(I,J).EQ.-1) GOTO 2803 CONTINUE IE = RLCTRD IF (CNVDBG) PRINT *,' FALLTHROUGH ' GOTO 2804 CONTINUE DO 2812 I = (II-1),VCNTRL,-1 IE = I IF (SARRAY(I,J).NE.0.AND.DARRAY(I,J).NE.-1) GOTO 2804 CONTINUE IS = RLCTRD IF (CNVDBG) PRINT *,'GRONK 2804' CONTINUE IF (LO) THEN IF (SARRAY(IE,J).GT.IHI) THEN IT = QSTART + IOFFRD ELSE IT = QSTART + IOFFRS ENDIF ELSEIF (HI) THEN IF (SARRAY(IE,J).LT.LOW) THEN IT = QSTART + IOFFRD ELSE

2802

2803

2812 2804 *

2801

2702

2703

2712 2704 *

IT = QSTART + IOFFRS ENDIF ENDIF IF (DARRAY(IE,J).EQ.-2) DARRAY(IE,J) = IT IF (DARRAY(IE-1,J).EQ.-2) DARRAY(IE-1,J) = IT IF (DARRAY(IE-2,J).EQ.-2) DARRAY(IE-2,J) = IT IF (DARRAY(IE-3,J).EQ.-2) DARRAY(IE-3,J) = IT IF (DARRAY(IE-4,J).EQ.-2) DARRAY(IE-4,J) = IT CONTINUE ENDIF IF (TLCTOK) THEN IF (BLCTOK) THEN JE = HCNTRL ELSE JE = IYBEG ENDIF DO 2701 J = BLCTRD,JE DO 2702 I = RLCTRD,IXEND II = I IF (SARRAY(I,J).EQ.0.OR.DARRAY(I,J).EQ.-1) GOTO 2703 CONTINUE IE = RLCTRD IF (CNVDBG) PRINT *,' FALLTHROUGH ' GOTO 2704 CONTINUE DO 2712 I = (II-1),VCNTRL,-1 IE = I IF (SARRAY(I,J).NE.0.AND.DARRAY(I,J).NE.-1) GOTO 2704 CONTINUE IE = RLCTRD IF (CNVDBG) PRINT *,'GRONK 2704' CONTINUE

IF (LO) THEN IF (SARRAY(IE,J).GT.IHI) THEN IT = QSTART + IOFFRD ELSE IT = QSTART + IOFFRS ENDIF ELSEIF (HI) THEN IF (SARRAY(IE,J).LT.LOW) THEN IT = QSTART + IOFFRD ELSE IT = QSTART + IOFFRS ENDIF ENDIF IF (DARRAY(IE,J).EQ.-2) DARRAY(IE,J) = IT IF (DARRAY(IE-1,J).EQ.-2) DARRAY(IE-1,J) = IF (DARRAY(IE-2,J).EQ.-2) DARRAY(IE-2,J) = IF (DARRAY(IE-3,J).EQ.-2) DARRAY(IE-3,J) = IF (DARRAY(IE-4,J).EQ.-2) DARRAY(IE-4,J) = 2701 CONTINUE ENDIF * IF (DR) THEN IT1 = RINTRC + RSLOPE * BLCTRD IT2 = RINTRC + RSLOPE * TLCTRD IXB4 = MAX( (RLCTRD + 1), IT1,IT2) IXE4 = MIN( ((5*IXB4 + VCNTRL)/6), IT1,IT2) - 1 INX = NX

IT IT IT IT

&

&

&

&

IF (SAMER) THEN IT = QSTART + IOFFRS DOALI = HI DOCRS = LO ELSEIF (DIFRNR) THEN IT = QSTART + IOFFRD DOALI = LO DOCRS = HI ENDIF IF (DOALI) THEN IF (EXTRAR.OR.DIFRNR) THEN ITSTV = IHIX IYB4 = HCNTRL IYE4 = IYEND IF (TLCTOK) IYE4 = TLCTRD ELSE ITSTV = IHI IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD ENDIF CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (EXTRAR.OR.DIFRNR) THEN IYB4 = HCNTRL IYE4 = 1 IF (BLCTOK) IYE4 = BLCTRD ELSE IYE4 = HCNTRL IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD ENDIF CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNR) THEN IT = QSTART + IOFFRS ITSTV = LOW IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ELSEIF (DOCRS) THEN IF (EXTRAR.OR.DIFRNR) THEN ITSTV = LOWX IYB4 = HCNTRL IYE4 = IYEND IF (TLCTOK) IYE4 = TLCTRD ELSE ITSTV = LOW IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD ENDIF CALL DLTYX2(DARRAY(1,1),SARRAY(1,1),

&

IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (EXTRAR.OR.DIFRNR) THEN IYB4 = HCNTRL IYE4 = 1 IF (BLCTOK) IYE4 = BLCTRD ELSE IYE4 = HCNTRL IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD ENDIF CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNR) THEN IT = QSTART + IOFFRS ITSTV = IHI IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF ENDIF * *nununununununu RETURN * * ENTRY NUCRNR(SARRAY,DARRAY,NX,NY) ILOL = 0 IHIL = 0 ILOR = 0 IHIR = 0 IF (BLCTOK) THEN IYB4 = IYBEG IYE4 = BLCTRD + (TLCTRD-BLCTRD)/12 ELSE GOTO 2399 ENDIF DO 2330 J = IYB4,IYE4 L = IXBEG 2331 CONTINUE L = L + 1 IF (DARRAY(L,J).EQ.-1.AND.L.LE.VCNTRL) GOTO 2331 MX = MAX(SARRAY(L,J),SARRAY(L+1,J),SARRAY(L+2,J),SARRAY(L+3,J),SARRAY( L+4,J)) MN = MIN(SARRAY(L,J),SARRAY(L+1,J),SARRAY(L+2,J),SARRAY(L+3,J),SARRAY( L+4,J)) IF (MX.GE.IHI1) THEN IHIL = IHIL + 1 IF (MX.GE.IHI2) IHIL = IHIL + 1 IF (MX.GE.IHI3) IHIL = IHIL + 1 IF (MX.GE.IHICUT) IHIL = IHIL + 1 IF (MX.GE.IHI5) IHIL = IHIL + 1 ELSEIF (MN.LE.LOW1) THEN ILOL = ILOL + 1

2332

IF (MN.LE.LOW2) ILOL = ILOL + 1 IF (MN.LE.LOW3) ILOL = ILOL + 1 IF (MN.LE.LOWCUT) ILOL = ILOL + 1 IF (MN.LE.LOW5) ILOL = ILOL + 1 ENDIF L = IXEND CONTINUE L = L - 1 IF (DARRAY(L,J).EQ.-1.AND.L.GE.VCNTRL) GOTO 2332 MX = MAX(SARRAY(L,J),SARRAY(L-1,J),SARRAY(L-2,J),SARRAY(L-3,J),SARRAY( MN = MIN(SARRAY(L,J),SARRAY(L-1,J),SARRAY(L-2,J),SARRAY(L-3,J),SARRAY(

L-4,J)) L-4,J)) IF (MX.GE.IHI1) THEN IHIR = IHIR + 1 IF (MX.GE.IHI2) IHIR = IF (MX.GE.IHI3) IHIR = IF (MX.GE.IHICUT) IHIR IF (MX.GE.IHI5) IHIR = ELSEIF (MN.LE.LOW1) THEN ILOR = ILOR + 1 IF (MN.LE.LOW2) ILOR = IF (MN.LE.LOW3) ILOR = IF (MN.LE.LOWCUT) ILOR IF (MN.LE.LOW5) ILOR = ENDIF 2330 CONTINUE * IF (CNVDBG) PRINT *,'NUCRNR: HIL = ',IHIL,' LOWL = ',ILOL,' HIR = ', IHIR,' LOWR = ',ILOR I = IHIL IHIL = IHIL - ILOL/3 ILOL = ILOL - I/3 I = IHIR IHIR = IHIR - ILOR/3 ILOR = ILOR - I/3 IF (CNVDBG) PRINT *,'after fix HIL = ',IHIL,' LOWL = ',ILOL,' HIR = ', IHIR,' LOWR = ',ILOR * I = 2*(IYE4 - IYB4 + 1) SAMER = (LO.AND.(ILOR .GE. I)) .OR. (HI.AND.(IHIR .GE. I)) DIFRNR = (HI.AND.(ILOR .GE. I)) .OR. (LO.AND.(IHIR .GE. I)) SAMEL = (LO.AND.(ILOL .GE. I)) .OR. (HI.AND.(IHIL .GE. I)) DIFRNL = (HI.AND.(ILOL .GE. I)) .OR. (LO.AND.(IHIL .GE. I)) DL = SAMEL .OR. DIFRNL DR = SAMER .OR. DIFRNR IF (.NOT.(DL.OR.DR)) RETURN * I = 4*(TLCTRD - BLCTRD + 1) * EXTRAR = (IHIR .GT. I) .OR. (ILOR .GT. I) * EXTRAL = (IHIL .GT. I) .OR. (ILOL .GT. I) * PRINT *,'LOWER left electrode; SAME ',SAMEL,' DIF. ',DIFRNL,' EXTRAL ',E XTRAL IF (DL) THEN IT1 = ( (LINTRC + LSLOPE * IYBEG) + IXBEG)/2 IT2 = ( (LINTRC + LSLOPE * BLCTRD) + IXBEG)/2 IXB4 = MIN( (LLCTRD - 1), IT1,IT2) IF (IXB4.LT.IXBEG) IXB4 = IXBEG IT1 = LINTRC + LSLOPE * IYBEG IT2 = LINTRC + LSLOPE * BLCTRD IHIR + IHIR + = IHIR IHIR + ILOR + ILOR + = ILOR ILOR + 1 1 + 1 1 1 1 + 1 1

IXE4 = MAX( ((5*IXB4 + VCNTRL)/6), IT1,IT2) + 1 INX = NX IF (SAMEL) THEN IT = QSTART + IOFFLS DOALI = HI DOCRS = LO ELSEIF (DIFRNL) THEN IT = QSTART + IOFFLD DOALI = LO DOCRS = HI ENDIF IF (DOALI) THEN ITSTV = IHI5 CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNL) THEN IT = QSTART + IOFFLS ITSTV = LOWCUT CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ELSEIF (DOCRS) THEN ITSTV = LOW5 CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNL) THEN IT = QSTART + IOFFLS ITSTV = IHICUT CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF ENDIF * PRINT *,'LOWER right electrode; SAME ',SAMER,' DIF. ',DIFRNR,' EXTRAR ', EXTRAR IF (DR) THEN IT1 = ( (RINTRC + RSLOPE * BLCTRD) + IXEND)/2 IT2 = ( (RINTRC + RSLOPE * IXBEG) + IXEND)/2 IXB4 = MAX( (RLCTRD + 1), IT1,IT2) IF (IXB4 .GT. IXEND) IXB4 = IXEND IT1 = RINTRC + RSLOPE * BLCTRD IT2 = RINTRC + RSLOPE * IXBEG IXE4 = MIN( ((5*IXB4 + VCNTRL)/6), IT1,IT2) - 1 INX = NX IF (SAMER) THEN IT = QSTART + IOFFRS DOALI = HI DOCRS = LO ELSEIF (DIFRNR) THEN IT = QSTART + IOFFRD DOALI = LO DOCRS = HI ENDIF IF (DOALI) THEN ITSTV = IHI5 CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNR) THEN IT = QSTART + IOFFRS

ITSTV = LOWCUT CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ELSEIF (DOCRS) THEN ITSTV = LOW5 CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNR) THEN IT = QSTART + IOFFRS ITSTV = IHICUT CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF ENDIF 2399 CONTINUE * ILOL = 0 IHIL = 0 ILOR = 0 IHIR = 0 IF (TLCTOK) THEN IYB4 = IYEND IYE4 = TLCTRD - (TLCTRD-BLCTRD)/12 ELSE GOTO 4799 ENDIF DO 4730 J = IYB4,IYE4 L = IXBEG 4731 CONTINUE L = L + 1 IF (DARRAY(L,J).EQ.-1.AND.L.LE.VCNTRL) GOTO 4731 MX = MAX(SARRAY(L,J),SARRAY(L+1,J),SARRAY(L+2,J),SARRAY(L+3,J),SARRAY( L+4,J)) MN = MIN(SARRAY(L,J),SARRAY(L+1,J),SARRAY(L+2,J),SARRAY(L+3,J),SARRAY( L+4,J)) IF (MX.GE.IHI1) THEN IHIL = IHIL + 1 IF (MX.GE.IHI2) IHIL = IHIL + 1 IF (MX.GE.IHI3) IHIL = IHIL + 1 IF (MX.GE.IHICUT) IHIL = IHIL + 1 IF (MX.GE.IHI5) IHIL = IHIL + 1 ELSEIF (MN.LE.LOW1) THEN ILOL = ILOL + 1 IF (MN.LE.LOW2) ILOL = ILOL + 1 IF (MN.LE.LOW3) ILOL = ILOL + 1 IF (MN.LE.LOWCUT) ILOL = ILOL + 1 IF (MN.LE.LOW5) ILOL = ILOL + 1 ENDIF L = IXEND 4732 CONTINUE L = L - 1 IF (DARRAY(L,J).EQ.-1.AND.L.GE.VCNTRL) GOTO 4732 MX = MAX(SARRAY(L,J),SARRAY(L-1,J),SARRAY(L-2,J),SARRAY(L-3,J),SARRAY( L-4,J)) MN = MIN(SARRAY(L,J),SARRAY(L-1,J),SARRAY(L-2,J),SARRAY(L-3,J),SARRAY( L-4,J)) IF (MX.GE.IHI1) THEN IHIR = IHIR + 1

IF (MX.GE.IHI2) IHIR = IF (MX.GE.IHI3) IHIR = IF (MX.GE.IHICUT) IHIR IF (MX.GE.IHI5) IHIR = ELSEIF (MN.LE.LOW1) THEN ILOR = ILOR + 1 IF (MN.LE.LOW2) ILOR = IF (MN.LE.LOW3) ILOR = IF (MN.LE.LOWCUT) ILOR IF (MN.LE.LOW5) ILOR = ENDIF 4730 CONTINUE *

IHIR + IHIR + = IHIR IHIR + ILOR + ILOR + = ILOR ILOR +

1 1 + 1 1 1 1 + 1 1

IF (CNVDBG) PRINT *,'NUCRNR: HIL = ',IHIL,' LOWL = ',ILOL,' HIR = ', IHIR,' LOWR = ',ILOR I = IHIL IHIL = IHIL - ILOL/3 ILOL = ILOL - I/3 I = IHIR IHIR = IHIR - ILOR/3 ILOR = ILOR - I/3 IF (CNVDBG) PRINT *,'after fix HIL = ',IHIL,' LOWL = ',ILOL,' HIR = ', IHIR,' LOWR = ',ILOR * I = 2*(IYE4 - IYB4 + 1) SAMER = (LO.AND.(ILOR .GE. I)) .OR. (HI.AND.(IHIR .GE. I)) DIFRNR = (HI.AND.(ILOR .GE. I)) .OR. (LO.AND.(IHIR .GE. I)) SAMEL = (LO.AND.(ILOL .GE. I)) .OR. (HI.AND.(IHIL .GE. I)) DIFRNL = (HI.AND.(ILOL .GE. I)) .OR. (LO.AND.(IHIL .GE. I)) DL = SAMEL .OR. DIFRNL DR = SAMER .OR. DIFRNR IF (.NOT.(DL.OR.DR)) RETURN * I = 4*(TLCTRD - BLCTRD + 1) * EXTRAR = (IHIR .GT. I) .OR. (ILOR .GT. I) * EXTRAL = (IHIL .GT. I) .OR. (ILOL .GT. I) * PRINT *,'UPPER left electrode; SAME ',SAMEL,' DIF. ',DIFRNL,' EXTRAL ',E XTRAL IF (DL) THEN IT1 = ( (LINTRC + LSLOPE * IYEND) + IXBEG)/2 IT2 = ( (LINTRC + LSLOPE * TLCTRD) + IXBEG)/2 IXB4 = MIN( (LLCTRD - 1), IT1,IT2) IF (IXB4 .LT. IXBEG) IXB4 = IXBEG IT1 = LINTRC + LSLOPE * IYEND IT2 = LINTRC + LSLOPE * TLCTRD IXE4 = MAX( ((5*IXB4 + VCNTRL)/6), IT1,IT2) + 1 INX = NX IF (SAMEL) THEN IT = QSTART DOALI = HI DOCRS = LO ELSEIF (DIFRNL) THEN IT = QSTART + 1 DOALI = LO DOCRS = HI ENDIF IF (DOALI) THEN ITSTV = IHI5 CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT)

IF (DIFRNL) THEN IT = QSTART ITSTV = LOWCUT CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ELSEIF (DOCRS) THEN ITSTV = LOW5 CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNL) THEN IT = QSTART ITSTV = IHICUT CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF ENDIF * PRINT *,'UPPER right electrode; SAME ',SAMER,' DIF. ',DIFRNR,' EXTRAR ', EXTRAR IF (DR) THEN IT1 = ( (RINTRC + RSLOPE * TLCTRD) + IXEND)/2 IT2 = ( (RINTRC + RSLOPE * IXEND) + IXEND)/2 IXB4 = MAX( (RLCTRD + 1), IT1,IT2) IF (IXB4 .GT. IXEND) IXB4 = IXEND IT1 = RINTRC + RSLOPE * TLCTRD IT2 = RINTRC + RSLOPE * IXEND IXE4 = MIN( ((5*IXB4 + VCNTRL)/6), IT1,IT2) - 1 INX = NX IF (SAMER) THEN IT = QSTART DOALI = HI DOCRS = LO ELSEIF (DIFRNR) THEN IT = QSTART + 1 DOALI = LO DOCRS = HI ENDIF IF (DOALI) THEN ITSTV = IHI5 CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNR) THEN IT = QSTART ITSTV = LOWCUT CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ELSEIF (DOCRS) THEN ITSTV = LOW5 CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IF (DIFRNR) THEN IT = QSTART ITSTV = IHICUT CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF

ENDIF 4799 CONTINUE RETURN * * ENTRY EDGET(SARRAY,DARRAY,NX,NY) DB = .FALSE. DT = .TRUE. DL = .FALSE. DR = .FALSE. GOTO 9001 * ENTRY EDGEB(SARRAY,DARRAY,NX,NY) DT = .FALSE. DB = .TRUE. DL = .FALSE. DR = .FALSE. GOTO 9001 * ENTRY EDGEL(SARRAY,DARRAY,NX,NY) DB = .FALSE. DL = .TRUE. DT = .FALSE. DR = .FALSE. GOTO 9001 * ENTRY EDGER(SARRAY,DARRAY,NX,NY) DB = .FALSE. DR = .TRUE. DL = .FALSE. DT = .FALSE. GOTO 9001 * ENTRY EDGES(SARRAY,DARRAY,NX,NY) DB = .TRUE. DT = .TRUE. DL = .TRUE. DR = .TRUE. 9001 CONTINUE IHI1 = (IHICUT*3 + LOWCUT*2)/5 LOW1 = (IHICUT*2 + LOWCUT*3)/5 IHI2 = (IHICUT*2 + LOWCUT)/3 LOW2 = (IHICUT + LOWCUT*2)/3 IHI3 = (IHICUT*3 + LOWCUT)/4 LOW3 = (IHICUT + LOWCUT*3)/4 PRINT *,'SPREAD; EDGES: T/B L/R = ',DT,'/',DB,' ',DL,'/',DR * the outer regions other than the corners ... * First, prepare * IT = SARRAY(PATH1X,PATH1Y) DOALI = IT.GT.IHI2 DOCRS = IT.LT.LOW2 IF (.NOT.(DOCRS.OR.DOALI)) THEN DOALI = IT.GT.IHI1 DOCRS = IT.LT.LOW1 ENDIF IF (DOCRS.AND.DOALI) THEN DOALI = IT.GT.IHI3 DOCRS = IT.LT.LOW3 ENDIF

IF (DOCRS.AND.DOALI) THEN DOALI = IT.GT.IHICUT DOCRS = IT.LT.LOWCUT ENDIF IF ( (DOCRS.AND.DOALI) .OR. (.NOT.(DOCRS.OR.DOALI)) ) THEN IIXL = KADDR(NX) IIYL = KADDR(NY) I = FCALL4(APORCP,BUF(1),BUF(3),IIXL,IIYL) DOALI = I.EQ.+1 DOCRS = I.EQ.-1 ENDIF IT = DARRAY(PATH1X,PATH1Y) IF (MOD(IT,2).EQ.1) THEN DOALI = .NOT. DOALI DOCRS = .NOT. DOCRS ENDIF * * IXB4 = 1 IXE4 = NX IYB4 = 1 IYE4 = NY ITSTV = LOW2 INX = NX IT = -2 CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ITSTV = IHI2 IT = -2 CALL DGEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IXB4 = 1 IXE4 = NX IYB4 = 1 IYE4 = NY ITSTV = LOW3 INX = NX IT = -4 CALL DLEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ITSTV = IHI3 IT = -4 CALL DGEYXR(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) PRINT *,'Doing outside edges ...' * * * Next, the outer regions other than the corners ... * First, across the bottom * * IF (OLDCAL) THEN * ICMP = -1 * DO 302 J = 1,BLCTRD * IF (J.GT.(BLCTRD/2)) ICMP = -2 * DO 303 I = NX,(VCNTRL-1),-1 * IF ( ((DARRAY(I,J).GT.ICMP).AND.(DARRAY(I,J).NE.IT)) ) THEN * GOTO 304

* * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * *

& 303 304

& 305 306 302

ELSEIF (DARRAY(I,J).EQ.-2) THEN IF ( (SARRAY(I,J).LT.LOWCUT.AND.DOALI) .OR. (SARRAY(I,J).GT.IHICUT.AND.DOCRS) ) GOTO 304 DARRAY(I,J) = IT ENDIF CONTINUE CONTINUE DO 305 I = 1,(VCNTRL+1) IF ( ((DARRAY(I,J).GT.ICMP).AND.(DARRAY(I,J).NE.IT)) ) THEN GOTO 306 ELSEIF (DARRAY(I,J).EQ.-2) THEN IF ( (SARRAY(I,J).LT.LOWCUT.AND.DOALI) .OR. (SARRAY(I,J).GT.IHICUT.AND.DOCRS) ) GOTO 306 DARRAY(I,J) = IT ENDIF CONTINUE CONTINUE CONTINUE

* * * * * * * * * *

* * * * * *

ELSE IF (DB) THEN IT = DARRAY(PATH1X,PATH1Y) IYE4 = BLCTRD IYB4 = 1 INX = NX IF (DOALI) THEN ITSTV = IHICUT IXB4 = IXEND IXE4 = VCNTRL CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IXB4 = 1 IXE4 = VCNTRL CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) + 1 ITSTV = LOWCUT IXB4 = IXEND IXE4 = VCNTRL CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IXB4 = 1 IXE4 = VCNTRL CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ELSEIF (DOCRS) THEN ITSTV = LOWCUT IXB4 = IXEND IXE4 = VCNTRL CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IXB4 = 1 IXE4 = VCNTRL CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) + 1 ITSTV = IHICUT IXB4 = IXEND IXE4 = VCNTRL CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT)

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

& ENDIF ENDIF

IXB4 = 1 IXE4 = VCNTRL CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT)

Next, the outer regions other than the corners ... Next, across the top IF (OLDCAL) THEN ICMP = -1 DO 312 J = NY,TLCTRD,-1 DO 313 I = NX,(VCNTRL-1),-1 IF ( ((DARRAY(I,J).GT.ICMP).AND.(DARRAY(I,J).NE.IT)) ) THEN GOTO 314 ELSEIF (DARRAY(I,J).EQ.-2) THEN IF ( (SARRAY(I,J).LT.LOWCUT.AND.DOALI) .OR. & (SARRAY(I,J).GT.IHICUT.AND.DOCRS) ) GOTO 314 DARRAY(I,J) = IT ENDIF 313 CONTINUE 314 CONTINUE DO 315 I = 1,(VCNTRL+1) IF ( ((DARRAY(I,J).GT.ICMP).AND.(DARRAY(I,J).NE.IT)) ) THEN GOTO 316 ELSEIF (DARRAY(I,J).EQ.-2) THEN IF ( (SARRAY(I,J).LT.LOWCUT.AND.DOALI) .OR. & (SARRAY(I,J).GT.IHICUT.AND.DOCRS) ) GOTO 316 DARRAY(I,J) = IT ENDIF 315 CONTINUE 316 CONTINUE 312 CONTINUE ELSE IF (DT) THEN IT = DARRAY(PATH1X,PATH1Y) IYE4 = TLCTRD IYB4 = IYEND INX = NX IF (DOALI) THEN ITSTV = IHICUT IXB4 = IXEND IXE4 = VCNTRL CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IXB4 = 1 IXE4 = VCNTRL CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) + 1 ITSTV = LOWCUT IXB4 = IXEND IXE4 = VCNTRL CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IXB4 = 1 IXE4 = VCNTRL CALL DLTYX2(DARRAY(1,1),SARRAY(1,1),

* * * * * * * * *

* * * * * * * * * *

IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ELSEIF (DOCRS) THEN ITSTV = LOWCUT IXB4 = IXEND IXE4 = VCNTRL CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IXB4 = 1 IXE4 = VCNTRL CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) + 1 ITSTV = IHICUT IXB4 = IXEND IXE4 = VCNTRL CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IXB4 = 1 IXE4 = VCNTRL CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF

&

* * * Next, the outer regions other than the corners ... * Next, along the inside of the left electrode * * IF (PTH2X(1).NE.-1) THEN * IS = PTH2X(1) * ELSEIF (PTH2X(3).NE.-1) THEN * IS = PTH2X(3) * ELSE * IS = LLCTRD - 3 * ENDIF * IF (OLDCAL) THEN * ICMP = -1 * DO 382 I = IS,VCNTRL ** IF (I.GT.((VCTRLN+IS)/2)) ICMP = -2 * DO 383 J = IYBEG,HCNTRL * IF ( ((DARRAY(I,J).GT.ICMP).AND.(DARRAY(I,J).NE.IT)) ) THEN * GOTO 389 * ELSEIF (DARRAY(I,J).EQ.-2) THEN * IF ( (SARRAY(I,J).LT.LOWCUT.AND.DOALI) .OR. * & (SARRAY(I,J).GT.IHICUT.AND.DOCRS) ) GOTO 389 * DARRAY(I,J) = IT * ENDIF * 383 CONTINUE * 389 CONTINUE * DO 388 J = IYEND,HCNTRL,-1 * IF ( ((DARRAY(I,J).GT.ICMP).AND.(DARRAY(I,J).NE.IT)) ) THEN * GOTO 387 * ELSEIF (DARRAY(I,J).EQ.-2) THEN * IF ( (SARRAY(I,J).LT.LOWCUT.AND.DOALI) .OR. * & (SARRAY(I,J).GT.IHICUT.AND.DOCRS) ) GOTO 387 * DARRAY(I,J) = IT * ENDIF * 388 CONTINUE * 387 CONTINUE * 382 CONTINUE

ELSE IF (DL) THEN IT = DARRAY(PATH3X,PATH3Y) IXB4 = LLCTRD + 1 IXE4 = VCNTRL INX = NX IF (DOALI) THEN ITSTV = IHICUT IYE4 = HCNTRL IYB4 = IYEND CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYE4 = HCNTRL IYB4 = 1 CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) + 1 ITSTV = LOWCUT IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYE4 = HCNTRL IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ELSEIF (DOCRS) THEN ITSTV = LOWCUT IYE4 = HCNTRL IYB4 = IYEND CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYE4 = HCNTRL IYB4 = 1 CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) + 1 ITSTV = IHICUT IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYE4 = HCNTRL IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF

** * * * Next, the outer regions other than the corners ... * Next, along the inside of the right electrode * * IF (PTH2X(2).NE.-1) THEN * IS = PTH2X(2)

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ELSEIF (PTH2X(4).NE.-1) THEN IS = PTH2X(4) ELSE IS = RLCTRD + 3 ENDIF IF (OLDCAL) THEN ICMP = -1 DO 372 I = IS,VCNTRL,-1 IF (I.LT.((VCTRLN+IS)/2)) ICMP = -2 DO 373 J = IYBEG,HCNTRL IF ( ((DARRAY(I,J).GT.ICMP).AND.(DARRAY(I,J).NE.IT)) ) THEN GOTO 379 ELSEIF (DARRAY(I,J).EQ.-2) THEN IF ( (SARRAY(I,J).LT.LOWCUT.AND.DOALI) .OR. & (SARRAY(I,J).GT.IHICUT.AND.DOCRS) ) GOTO 379 DARRAY(I,J) = IT ENDIF 373 CONTINUE 379 CONTINUE DO 378 J = IYEND,HCNTRL,-1 IF ( ((DARRAY(I,J).GT.ICMP).AND.(DARRAY(I,J).NE.IT)) ) THEN GOTO 377 ELSEIF (DARRAY(I,J).EQ.-2) THEN IF ( (SARRAY(I,J).LT.LOWCUT.AND.DOALI) .OR. & (SARRAY(I,J).GT.IHICUT.AND.DOCRS) ) GOTO 377 DARRAY(I,J) = IT ENDIF 378 CONTINUE 377 CONTINUE 372 CONTINUE ELSE IF (DR) THEN IT = DARRAY(PATH3X,PATH3Y) IXB4 = RLCTRD - 1 IXE4 = VCNTRL INX = NX IF (DOALI) THEN ITSTV = IHICUT IYE4 = HCNTRL IYB4 = IYEND CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYE4 = HCNTRL IYB4 = 1 CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) + 1 ITSTV = LOWCUT IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYE4 = HCNTRL IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ELSEIF (DOCRS) THEN ITSTV = LOWCUT

IYE4 = HCNTRL IYB4 = IYEND CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYE4 = HCNTRL IYB4 = 1 CALL DLTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IT = DARRAY(PATH1X,PATH1Y) + 1 ITSTV = IHICUT IYE4 = HCNTRL IYB4 = IYEND IF (TLCTOK) IYB4 = TLCTRD CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) IYE4 = HCNTRL IYB4 = 1 IF (BLCTOK) IYB4 = BLCTRD CALL DGTYX2(DARRAY(1,1),SARRAY(1,1), & IXB4,IXE4,INX,IYB4,IYE4,ITSTV,IT) ENDIF ENDIF RETURN * ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** *** ** ** ** ** ** ** ** **

ENTRY OUTWRD(SARRAY,DARRAY,NX,NY) PRINT *,'OUTWRD: Outward from the path, VERSION 2 ...' IF (PTH1X(1).GT.0.AND.PTH4Y(1).LT.HCNTRL) THEN I4YB = PTH4Y(1) ELSEIF (PTH1X(2).GT.0.AND.PTH4Y(2).LT.HCNTRL) THEN I4YB = PTH4Y(2) ELSEIF (PATH4Y.LT.HCNTRL) THEN I4YB = PATH4Y ELSE I4YB = IYBEG ENDIF IF (I4YB.LT.IYBEG) I4YB = IYBEG IF (PTH1X(3).GT.0.AND.PTH4Y(3).GT.HCNTRL) THEN I4YE = PTH4Y(3) ELSEIF (PTH1X(4).GT.0.AND.PTH4Y(4).GT.HCNTRL) THEN I4YE = PTH4Y(4) ELSEIF (PATH4Y.GT.HCNTRL) THEN I4YE = PATH4Y ELSE I4YE = IYEND ENDIF IF (I4YE.GT.IYEND) I4YE = IYEND PRINT *,'OUTWRD: I4YB = ',I4YB,' I4YE = ',I4YE ICENTR = (I4YB + I4YE + 1) / 2 DO 1099 I = (PATH5X+1),(RLCTRD+1) DO 1098 J = I4YB,(ICENTR+1) IF (DARRAY(I,J).EQ.-2) THEN DARRAY(I,J) = DARRAY(I-1,J) ELSEIF (DARRAY(I,J).EQ.-3) THEN IF ( ( DARRAY((I-1),J).EQ.DARRAY((I-1),(J-1)) ) .OR. & ( DARRAY((I-1),J).EQ.DARRAY((I-1),(J+1)) ) .OR.

** & ( DARRAY(I,(J+1)).EQ.-2 ) ) ** & DARRAY(I,J) = DARRAY((I-1),J) ** ELSEIF (DARRAY(I,J).EQ.-4.AND. (DARRAY(I,(J+1)).EQ.-3.OR. ** & DARRAY(I,(J+1)).EQ.-2) ) THEN ** IF ( ( DARRAY((I-1),J).EQ.DARRAY((I-1),(J-1)) ) .OR. ** & ( DARRAY((I-1),J).EQ.DARRAY((I-1),(J+1)) ) ) ** & DARRAY(I,J) = DARRAY((I-1),J) ** ELSEIF ( (DARRAY(I,J).EQ.-5 .AND. (DARRAY(I,(J+1)).EQ.-3.OR. ** & DARRAY(I,(J+1)).EQ.-2)) .OR. ** & (DARRAY(I,J).EQ.-4 .AND. DARRAY(I,(J+1)).EQ.-4) ) THEN ** IF ( (DARRAY((I-1),J).EQ.DARRAY((I-1),(J-1))) .AND. ** & (DARRAY((I-1),J).EQ.DARRAY((I-1),(J+1))) ) ** & DARRAY(I,J) = DARRAY((I-1),J) ** ELSEIF (DARRAY(I,J).EQ.-4.AND. (DARRAY(I,(J+1)).NE.-5.AND. ** & DARRAY(I,(J+1)).NE.-6) ) THEN ** IF ( (DARRAY((I-1),J).EQ.DARRAY((I-1),(J-1))) .AND. ** & (DARRAY((I-1),J).EQ.DARRAY((I-1),(J+1))) ) ** & DARRAY(I,J) = DARRAY((I-1),J) ** ELSE ** ENDIF ** 1098 CONTINUE ** DO 1095 J = I4YE,(ICENTR-1),-1 ** IF (DARRAY(I,J).EQ.-2) THEN ** DARRAY(I,J) = DARRAY(I-1,J) ** ELSEIF (DARRAY(I,J).EQ.-3) THEN ** IF ( ( DARRAY((I-1),J).EQ.DARRAY((I-1),(J-1)) ) .OR. ** & ( DARRAY((I-1),J).EQ.DARRAY((I-1),(J+1)) ) .OR. ** & ( DARRAY(I,(J-1)).EQ.-2 ) ) ** & DARRAY(I,J) = DARRAY((I-1),J) ** ELSEIF (DARRAY(I,J).EQ.-4.AND. (DARRAY(I,(J-1)).EQ.-3.OR. ** & DARRAY(I,(J-1)).EQ.-2) ) THEN ** IF ( ( DARRAY((I-1),J).EQ.DARRAY((I-1),(J-1)) ) .OR. ** & ( DARRAY((I-1),J).EQ.DARRAY((I-1),(J+1)) ) ) ** & DARRAY(I,J) = DARRAY((I-1),J) ** ELSEIF ( (DARRAY(I,J).EQ.-5 .AND. (DARRAY(I,(J-1)).EQ.-3.OR. ** & DARRAY(I,(J-1)).EQ.-2)) .OR. ** & (DARRAY(I,J).EQ.-4 .AND. DARRAY(I,(J-1)).EQ.-4) ) THEN ** IF ( (DARRAY((I-1),J).EQ.DARRAY((I-1),(J-1))) .AND. ** & (DARRAY((I-1),J).EQ.DARRAY((I-1),(J+1))) ) ** & DARRAY(I,J) = DARRAY((I-1),J) ** ELSEIF (DARRAY(I,J).EQ.-4.AND. (DARRAY(I,(J-1)).NE.-5.AND. ** & DARRAY(I,(J-1)).NE.-6) ) THEN ** IF ( (DARRAY((I-1),J).EQ.DARRAY((I-1),(J-1))) .AND. ** & (DARRAY((I-1),J).EQ.DARRAY((I-1),(J+1))) ) ** & DARRAY(I,J) = DARRAY((I-1),J) ** ELSE ** ENDIF ** 1095 CONTINUE ** 1099 CONTINUE *** ** DO 1097 I = (PATH5X-1),(LLCTRD-1),-1 ** DO 1096 J = I4YB,(ICENTR+1) ** IF (DARRAY(I,J).EQ.-2.OR.DARRAY(I,J).EQ.-3) THEN ** DARRAY(I,J) = DARRAY(I+1,J) ** ELSEIF (DARRAY(I,J).EQ.-3) THEN ** IF ( ( DARRAY((I+1),J).EQ.DARRAY((I+1),(J-1)) ) .OR. ** & ( DARRAY((I+1),J).EQ.DARRAY((I+1),(J+1)) ) .OR. ** & ( DARRAY(I,(J+1)).EQ.-2 ) ) ** & DARRAY(I,J) = DARRAY((I+1),J) ** ELSEIF (DARRAY(I,J).EQ.-4.AND. (DARRAY(I,(J+1)).EQ.-3.OR.

** & DARRAY(I,(J+1)).EQ.-2) ) THEN ** IF ( ( DARRAY((I+1),J).EQ.DARRAY((I+1),(J-1)) ) .OR. ** & ( DARRAY((I+1),J).EQ.DARRAY((I+1),(J+1)) ) ) ** & DARRAY(I,J) = DARRAY((I+1),J) ** ELSEIF ( (DARRAY(I,J).EQ.-5 .AND. (DARRAY(I,(J+1)).EQ.-3.OR. ** & DARRAY(I,(J+1)).EQ.-2)) .OR. ** & (DARRAY(I,J).EQ.-4 .AND. DARRAY(I,(J+1)).EQ.-4) ) THEN ** IF ( (DARRAY((I+1),J).EQ.DARRAY((I+1),(J-1))) .AND. ** & (DARRAY((I+1),J).EQ.DARRAY((I+1),(J+1))) ) ** & DARRAY(I,J) = DARRAY((I+1),J) ** ELSEIF (DARRAY(I,J).EQ.-4.AND. (DARRAY(I,(J+1)).NE.-5.AND. ** & DARRAY(I,(J+1)).NE.-6) ) THEN ** IF ( (DARRAY((I+1),J).EQ.DARRAY((I+1),(J-1))) .AND. ** & (DARRAY((I+1),J).EQ.DARRAY((I+1),(J+1))) ) ** & DARRAY(I,J) = DARRAY((I+1),J) *** ELSE ** ENDIF ** 1096 CONTINUE ** DO 1094 J = I4YE,(ICENTR-1),-1 ** IF (DARRAY(I,J).EQ.-2.OR.DARRAY(I,J).EQ.-3) THEN ** DARRAY(I,J) = DARRAY(I+1,J) ** ELSEIF (DARRAY(I,J).EQ.-3) THEN ** IF ( ( DARRAY((I+1),J).EQ.DARRAY((I+1),(J-1)) ) .OR. ** & ( DARRAY((I+1),J).EQ.DARRAY((I+1),(J+1)) ) .OR. ** & ( DARRAY(I,(J-1)).EQ.-2 ) ) ** & DARRAY(I,J) = DARRAY((I+1),J) ** ELSEIF (DARRAY(I,J).EQ.-4.AND. (DARRAY(I,(J-1)).EQ.-3.OR. ** & DARRAY(I,(J-1)).EQ.-2) ) THEN ** IF ( ( DARRAY((I+1),J).EQ.DARRAY((I+1),(J-1)) ) .OR. ** & ( DARRAY((I+1),J).EQ.DARRAY((I+1),(J+1)) ) ) ** & DARRAY(I,J) = DARRAY((I+1),J) ** ELSEIF ( (DARRAY(I,J).EQ.-5 .AND. (DARRAY(I,(J-1)).EQ.-3.OR. ** & DARRAY(I,(J-1)).EQ.-2)) .OR. ** & (DARRAY(I,J).EQ.-4 .AND. DARRAY(I,(J-1)).EQ.-4) ) THEN ** IF ( (DARRAY((I+1),J).EQ.DARRAY((I+1),(J-1))) .AND. ** & (DARRAY((I+1),J).EQ.DARRAY((I+1),(J+1))) ) ** & DARRAY(I,J) = DARRAY((I+1),J) ** ELSEIF (DARRAY(I,J).EQ.-4.AND. (DARRAY(I,(J-1)).NE.-5.AND. ** & DARRAY(I,(J-1)).NE.-6) ) THEN ** IF ( (DARRAY((I+1),J).EQ.DARRAY((I+1),(J-1))) .AND. ** & (DARRAY((I+1),J).EQ.DARRAY((I+1),(J+1))) ) ** & DARRAY(I,J) = DARRAY((I+1),J) *** ELSE ** ENDIF ** 1094 CONTINUE ** 1097 CONTINUE ** RETURN *** * ENTRY CONTAG(SARRAY,DARRAY,NX,NY,ITERNO) IHI1 = (IHICUT*3 + LOWCUT*2)/5 LOW1 = (IHICUT*2 + LOWCUT*3)/5 IHI2 = (IHICUT*2 + LOWCUT)/3 LOW2 = (IHICUT + LOWCUT*2)/3 IHI3 = (IHICUT*3 + LOWCUT)/4 LOW3 = (IHICUT + LOWCUT*3)/4 IS = MAX(IXBEG,2) IE = MIN(IXEND,NX-1) JS = MAX(IYBEG,2) JE = MIN(IYEND,NY-1)

IF (ITERNO.LE.4) THEN IEND = 5 - ITERNO ICMP = 0 ELSE IEND = 1 ICMP = -2 ENDIF ID = 1 JD = 1 IF (MOD(ITERNO,4).EQ.0) THEN I = IS IS = IE IE = I J = JS JS = JE JE = J ELSEIF (MOD(ITERNO,4).EQ.1) THEN J = JS JS = JE JE = J ELSEIF (MOD(ITERNO,4).EQ.3) THEN I = IS IS = IE IE = I ENDIF IF (JE.LT.JS) JD = -1 IF (IE.LT.IS) ID = -1 PRINT *,'CONTAG: entered: IEND = ',IEND,' ICMP = ',ICMP,' IS = ',IS,' IE = ',IE,' JS = ',JS,' JE = ',JE PRINT *,' ITERNO = ',ITERNO THEHEX = HEXOF(DARRAY(1,1)) THEHX2 = HEXOF(SARRAY(1,1)) * THEHEX = HEXOF(KADDR(DARRAY(1,1))) * THEHX2 = HEXOF(KADDR(SARRAY(1,1))) * PRINT *,' DARRAY @ $',THEHEX,' SARRAY @ $',THEHX2 DO 401 I = IS,IE,ID DO 402 J = JS,JE,JD IF ((DARRAY(I,J).EQ.-2).OR. & (ITERNO.LE.4.AND.(J.LE.BLCTRD.OR.J.GE.TLCTRD))) THEN GRG(1) = DARRAY(I-1,J-1) GRG(2) = DARRAY(I-1,J) GRG(3) = DARRAY(I-1,J+1) GRG(4) = DARRAY(I,J-1) GRG(5) = DARRAY(I,J) GRG(6) = DARRAY(I,J+1) GRG(7) = DARRAY(I+1,J-1) GRG(8) = DARRAY(I+1,J) GRG(9) = DARRAY(I+1,J+1) DO 405 KI = 1,5 DO 406 KJ = KI+1,9 IF (GRG(KI).LT.GRG(KJ)) THEN L = GRG(KI) GRG(KI) = GRG(KJ) GRG(KJ) = L ENDIF 406 CONTINUE 405 CONTINUE ENDIF IF (DARRAY(I,J).EQ.-2) THEN DO 407 KI = 5,IEND,-1

IF (GRG(KI).GE.ICMP.AND.GRG(KI).NE.-1) THEN DARRAY(I,J) = GRG(KI) GOTO 408 ENDIF 407 CONTINUE 408 CONTINUE ELSEIF (ITERNO.LE.4.AND.GRG(5).GT.DARRAY(I,J) & .AND.DARRAY(I,J).GT.-1) THEN DARRAY(I,J) = GRG(KI) ENDIF 402 CONTINUE 401 CONTINUE RETURN END *---------------------------------------------------------------------$SEGMENT E2RHO INTEGER*4 FUNCTION E2RHO(SARRAY,DARRAY,NX,NY) IMPLICIT INTEGER*4 (E) * IMPLICIT CHARACTER*123 (A-D,F-Z) * * E2RHO is the master conversion routine for Electric field to (`2') RHO * (charge density) conversions. It is set up as a function, returning 0 if * the conversion is successful and non-zero values to encode various failure * codes. * CHARACTER*8 HAPS(32) INTEGER*4 ZLEN,ZMARK,ZPOINT,ALEN,AMARK,APOINT,APSCR1,APSCR2,APSCR3 INTEGER*4 APMAIN,AP1,AP2,AP3,AP4,AP5,APZR,APMX,AFMTYP,SCRMRK,APS(0:7) INTEGER*4 LNMAIN,LN1,LN2,LN3,LN4,LN5,LNZR,LNMX,LNS(0:7),IAPS(32),LENS(32) INTEGER*4 KADDR,NX,NY,IJS(3),IJ2S(3),BUF(3),IA,IA1,IA2,IA3,IA4,IA5,IZ,IZR INTEGER*4 LLCTRD,RLCTRD,BLCTRD,TLCTRD,IMX,ISC1,ISC2,ISC3,I,IIT,J,K,MODE INTEGER*4 IFILL,LX,LY INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384,VCNTRL,HCNTRL,VCTRLN,HCTRLN INTEGER*2 TYPS(32),LENXS(32),LENYS(32),FNRNSN(32),ITYP,TYP(3),ICHS(3) INTEGER*2 SARRAY(NX,NY),DARRAY(NX,NY) LOGICAL*2 ZVALID,AVALID,ZZCORR,AACORR,BUFGUD(32),BUFUSE(32),BLCTOK,TLCTOK LOGICAL*1 SMOOTH EQUIVALENCE (APS(0),APMAIN),(APS(1),AP1),(APS(2),AP2),(APS(3),AP3) EQUIVALENCE (APS(4),AP4),(APS(5),AP5),(APS(6),APZR),(APS(7),APMX) EQUIVALENCE (LNS(0),LNMAIN),(LNS(1),LN1),(LNS(2),LN2),(LNS(3),LN3) EQUIVALENCE (LNS(4),LN4),(LNS(5),LN5),(LNS(6),LNZR),(LNS(7),LNMX) EQUIVALENCE (IA,IAPS(1)),(IA2,IAPS(2)),(IA4,IAPS(3)),(IZ,IZR,IAPS(4)) EQUIVALENCE (IMX,IAPS(5)),(IIT,IAPS(6)),(IA1,IAPS(7)),(IA3,IAPS(8)) EQUIVALENCE (IA5,IAPS(9)),(ISC1,IAPS(10)),(ISC2,IAPS(11)),(ISC3,IAPS(12)) EQUIVALENCE (VCTRLN,VCNTRL),(HCTRLN,HCNTRL) COMMON /FETURE/LLCTRD,RLCTRD,BLCTRD,TLCTRD,VCNTRL,HCNTRL,BLCTOK,TLCTOK COMMON /OMABFL/BUFGUD,BUFUSE,/PARNML/BIG,SMALL,RANGE COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/OMABFR/APS,LNS COMMON /OMACNT/IAPS,HAPS,LENS,/OMATYP/TYPS,LENXS,LENYS,FNRNSN COMMON /ZEROS/ZVALID,ZLEN,ZMARK,ZPOINT,ZZCORR COMMON /OMASCR/SCRMRK,APSCR1,APSCR2,APSCR3 COMMON /AMPLS/AVALID,ALEN,AMARK,APOINT,AACORR,AFMTYP COMMON /KIASMN/ICHS,BUF,TYP,IJS,IJ2S SAVE /OMABFL/,/PARNML/,/PARNM2/,/OMABFR/,/OMACNT/,/OMATYP/ SAVE /ZEROS/,/OMASCR/,/AMPLS/,/KIASMN/,/FETURE/ EXTERNAL KADDR,IMED5X SAVE * SMOOTH = .TRUE. GOTO 9000

* ENTRY E2RH0(SARRAY,DARRAY,NX,NY) SMOOTH = .FALSE. 9000 CONTINUE IFILL = 8192 * K = RLCTRD - LLCTRD + 1 DO 1 J = 1,NY DARRAY(1,J) = IFILL DO 2 I = 2,NX-1 IF (SARRAY(I,J).NE.0) THEN IF (SARRAY(I+1,J).NE.0.AND.SARRAY(I-1,J).NE.0) THEN DARRAY(I,J) = 8192 + (SARRAY(I+1,J)-SARRAY(I-1,J))*K/32 ELSEIF (SARRAY(I-1,J).NE.0) THEN DARRAY(I,J) = 8192 + (SARRAY(I,J)-SARRAY(I-1,J))*K/16 ELSEIF (SARRAY(I+1,J).NE.0) THEN DARRAY(I,J) = 8192 + (SARRAY(I+1,J)-SARRAY(I,J))*K/16 ELSE DARRAY(I,J) = IFILL ENDIF ELSE DARRAY(I,J) = IFILL ENDIF 2 CONTINUE DARRAY(NX,J) = IFILL 1 CONTINUE * ITYP = TYPS(ICHS(1)) IF (ITYP.GE.9.AND.ITYP.LE.14) THEN TYPS(ICHS(2)) = ITYP + 6 ELSEIF (ITYP.EQ.0.OR.ITYP.EQ.5.OR.ITYP.EQ.-1) THEN ==> 'rho from RAW data' TYPS(ICHS(2)) = 15 ELSEIF (ITYP.EQ.1.OR.ITYP.EQ.7) THEN ==> 'rho from ZRC data' TYPS(ICHS(2)) = 16 ELSEIF (ITYP.EQ.3) THEN ==> 'rho from NORMed data' TYPS(ICHS(2)) = 17 ELSEIF (ITYP.EQ.4) THEN ==> 'rho from ZRC&NORM data' TYPS(ICHS(2)) = 18 ELSEIF (ITYP.EQ.8) THEN ==> 'rho fm ZRC&ZRC-NORM' TYPS(ICHS(2)) = 19 ELSEIF (ITYP.EQ.2) THEN ==> 'Simulated Data' ==> '? rho from ??' TYPS(ICHS(2)) = 20 ELSEIF (ITYP.EQ.-2) THEN ==> UNINITIALIZED TYPS(ICHS(2)) = -2 ELSEIF (ITYP.EQ.6) THEN ==> UNKNOWN TYPS(ICHS(2)) = 6 ELSE ==> '? rho from ??' TYPS(ICHS(2)) = 20 ENDIF FNRNSN(ICHS(2)) = -IABS(FNRNSN(ICHS(1)))

* 15 * 16 * 17 * 18 * 19 * 2 * 20 * -2 * 6

* 20

* IF (SMOOTH) THEN PRINT *,'Median smoothing Rho frame.' IT = KADDR(DARRAY(1,1)) LX = NX LY = NY CALL IMED5X(IT,LX,LY) IT = KADDR(DARRAY(1,1)) LX = NX LY = NY CALL IMED3(IT,LX,LY) IT = KADDR(DARRAY(1,1)) LX = NX LY = NY CALL IMED3D(IT,LX,LY) IT = KADDR(DARRAY(1,1)) LX = NX LY = NY CALL IMED5X(IT,LX,LY) ENDIF * IF (SMOOTH) THEN E2RHO = 0 ELSE E2RH0 = 0 ENDIF RETURN END *---------------------------------------------------------------------INTEGER*4 FUNCTION E2RHON(SARRAY,DARRAY,NX,NY) IMPLICIT INTEGER*4 (E) * IMPLICIT CHARACTER*123 (A-D,F-Z) * * Alternate calling sequence for E2RHO: this takes the buffer numbers instead * of the base addresses as inputs and uses the Pascal deferencing routines (FCAL L4 * in particular) to call the normal E2RHO routine. Return values from E2RHO are * passed through. * CHARACTER*8 HAPS(32) INTEGER*4 ZLEN,ZMARK,ZPOINT,ALEN,AMARK,APOINT,APSCR1,APSCR2,APSCR3 INTEGER*4 APMAIN,AP1,AP2,AP3,AP4,AP5,APZR,APMX,AFMTYP,SCRMRK,APS(0:7) INTEGER*4 LNMAIN,LN1,LN2,LN3,LN4,LN5,LNZR,LNMX,LNS(0:7),IAPS(32),LENS(32) INTEGER*4 KADDR,SARRAY,DARRAY,NX,NY,FCALL4,MODE,JARRAY,KARRAY,I,IZ,IZR INTEGER*4 IA,IA1,IA2,IA3,IA4,IA5,ISC1,ISC2,ISC3,IIT,IMX,INX,INY INTEGER*2 TYPS(32),LENXS(32),LENYS(32),FNRNSN(32) INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384 LOGICAL*2 ZVALID,AVALID,ZZCORR,AACORR,BUFGUD(32),BUFUSE(32) LOGICAL*1 NORMAL EQUIVALENCE (APS(0),APMAIN),(APS(1),AP1),(APS(2),AP2),(APS(3),AP3) EQUIVALENCE (APS(4),AP4),(APS(5),AP5),(APS(6),APZR),(APS(7),APMX) EQUIVALENCE (LNS(0),LNMAIN),(LNS(1),LN1),(LNS(2),LN2),(LNS(3),LN3) EQUIVALENCE (LNS(4),LN4),(LNS(5),LN5),(LNS(6),LNZR),(LNS(7),LNMX) EQUIVALENCE (IA,IAPS(1)),(IA2,IAPS(2)),(IA4,IAPS(3)),(IZ,IZR,IAPS(4)) EQUIVALENCE (IMX,IAPS(5)),(IIT,IAPS(6)),(IA1,IAPS(7)),(IA3,IAPS(8)) EQUIVALENCE (IA5,IAPS(9)),(ISC1,IAPS(10)),(ISC2,IAPS(11)),(ISC3,IAPS(12)) COMMON /OMABFL/BUFGUD,BUFUSE,/PARNML/BIG,SMALL,RANGE COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/OMABFR/APS,LNS COMMON /OMACNT/IAPS,HAPS,LENS,/OMATYP/TYPS,LENXS,LENYS,FNRNSN COMMON /ZEROS/ZVALID,ZLEN,ZMARK,ZPOINT,ZZCORR

COMMON /OMASCR/SCRMRK,APSCR1,APSCR2,APSCR3 COMMON /AMPLS/AVALID,ALEN,AMARK,APOINT,AACORR,AFMTYP SAVE /OMABFL/,/PARNML/,/PARNM2/,/OMABFR/,/OMACNT/,/OMATYP/ SAVE /ZEROS/,/OMASCR/,/AMPLS/ EXTERNAL KADDR,FCALL4,E2RHO,E2RH0 SAVE * NORMAL = .TRUE. GOTO 9000 * ENTRY E2RH0N(SARRAY,DARRAY,NX,NY) NORMAL = .FALSE. * 9000 CONTINUE INX = KADDR(NX) INY = KADDR(NY) KARRAY = IAPS(SARRAY) JARRAY = IAPS(DARRAY) IF (NORMAL) THEN I = FCALL4(E2RHO,KARRAY,JARRAY,INX,INY) E2RHON = I ELSE I = FCALL4(E2RH0,KARRAY,JARRAY,INX,INY) E2RH0N = I ENDIF RETURN END *---------------------------------------------------------------------INTEGER*4 FUNCTION ERHOPL(SARRAY,DARRAY,NX,NY) IMPLICIT INTEGER*4 (E) * IMPLICIT CHARACTER*123 (A-D,F-Z) CHARACTER*8 HAPS(32),FIT,FUNC,FORM CHARACTER*1 TC,TCALGN(2) REAL*4 FIXR,L11,L21,L12,L22,FACT1,FACT2,R1,R2,RNKCOR,RANKC1,RANKC2 REAL*4 S11,S12,S21,S22,ITX,ITY,CORR1,CORR2,COVC,ER,EL,RHOR,RHOL REAL*4 R502(2048),R501(20480),X1,X2,Y1,Y2,COV,B1,B2 REAL*4 TEMP1(20480),TEMP3(0:20480),R500(2048),R555(2048) REAL*4 M1,M2,TX1,TX2,TY1,TY2,TCOV,TCORR,TSLOPE,TINTRC INTEGER*4 ZLEN,ZMARK,ZPOINT,ALEN,AMARK,APOINT,APSCR1,APSCR2,APSCR3,IND INTEGER*4 APMAIN,AP1,AP2,AP3,AP4,AP5,APZR,APMX,AFMTYP,SCRMRK,APS(0:7) INTEGER*4 LNMAIN,LN1,LN2,LN3,LN4,LN5,LNZR,LNMX,LNS(0:7),IAPS(32),LENS(32) INTEGER*4 KADDR,NX,NY,IJS(3),IJ2S(3),BUF(3),INDST3,INDEX3,I,IA,IA1,IA2,IA3 INTEGER*4 LLCTRD,RLCTRD,BLCTRD,TLCTRD,IA4,IA5,IE,IIT,IS,II,IMX,MENU INTEGER*4 ISC1,ISC2,ISC3,IZ,IZR,J,K,K1,K2,L,LE,LL,LS,MODE,STAT,XTRCMG INTEGER*4 WIDTH,SVSTAT,SVWID,SVOFFS,SVST,SVEND,BLCT,TLCT,RLCT,LLCT INTEGER*4 OFFSET INTEGER*2 TYP(3),ICHS(3),SARRAY(NX,NY),DARRAY(NX,NY),BLCTOK,TLCTOK INTEGER*2 TYPS(32),LENXS(32),LENYS(32),FNRNSN(32),IXBEG,IXEND,IYBEG,IYEND INTEGER*2 POINTY(2,4,256),POINTB(8,256),POINTX(2,4,512),POINTA(8,512) INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384,VCNTRL,HCNTRL,VCTRLN,HCTRLN INTEGER*2 LINEY(256),LINEX(512),IASC,ISCAN,IKBF1,IKBF2,IERR,SVINT INTEGER*2 SVTRIM,DEFBUF,BUF1,BUF2 LOGICAL*2 ABORT,ESCAPE,INTRPT,RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS LOGICAL*2 ZVALID,AVALID,ZZCORR,AACORR,BUFGUD(32),BUFUSE(32),CNVDBG LOGICAL*1 NORMAL,LINEAR,LOGLOG,LOGLIN,ORDLS,TRMLS,ETRMLS,ABSDEV LOGICAL*1 EQUAL,PRMARY,SECOND,INTFRM,DOTRIM EQUIVALENCE (APS(0),APMAIN),(APS(1),AP1),(APS(2),AP2),(APS(3),AP3) EQUIVALENCE (APS(4),AP4),(APS(5),AP5),(APS(6),APZR),(APS(7),APMX) EQUIVALENCE (LNS(0),LNMAIN),(LNS(1),LN1),(LNS(2),LN2),(LNS(3),LN3) EQUIVALENCE (LNS(4),LN4),(LNS(5),LN5),(LNS(6),LNZR),(LNS(7),LNMX)

EQUIVALENCE (IA,IAPS(1)),(IA2,IAPS(2)),(IA4,IAPS(3)),(IZ,IZR,IAPS(4)) EQUIVALENCE (IMX,IAPS(5)),(IIT,IAPS(6)),(IA1,IAPS(7)),(IA3,IAPS(8)) EQUIVALENCE (IA5,IAPS(9)),(ISC1,IAPS(10)),(ISC2,IAPS(11)),(ISC3,IAPS(12)) EQUIVALENCE (POINTY(1,1,1),POINTB(1,1)),(POINTX(1,1,1),POINTA(1,1)) EQUIVALENCE (VCTRLN,VCNTRL),(HCTRLN,HCNTRL) EQUIVALENCE (TCALGN(1),IASC),(TCALGN(2),TC) COMMON /NTRVN/ABORT,ESCAPE,INTRPT,/KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR COMMON /SHFSTA/RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS,/BUFDEF/DEFBUF COMMON /FETURE/LLCTRD,RLCTRD,BLCTRD,TLCTRD,VCNTRL,HCNTRL,BLCTOK,TLCTOK COMMON /MGFORM/LINEX,LINEY,POINTY,POINTX,IXBEG,IYBEG,IXEND,IYEND COMMON /OMABFL/BUFGUD,BUFUSE,/PARNML/BIG,SMALL,RANGE,/PARCDA/R502 COMMON /PARNM2/BIG2,SMALL2,MODE,I16384,/OMABFR/APS,LNS COMMON /OMACNT/IAPS,HAPS,LENS,/OMATYP/TYPS,LENXS,LENYS,FNRNSN COMMON /ZEROS/ZVALID,ZLEN,ZMARK,ZPOINT,ZZCORR,/I2EBUF/BUF1,BUF2 COMMON /OMASCR/SCRMRK,APSCR1,APSCR2,APSCR3 COMMON /AMPLS/AVALID,ALEN,AMARK,APOINT,AACORR,AFMTYP COMMON /KIASMN/ICHS,BUF,TYP,IJS,IJ2S,/PARPLZ/R501 COMMON /COEFIT/TSLOPE,TINTRC,TCORR,TX1,TX2,TY1,TY2,TCOV,RNKCOR COMMON /PARCUM/TEMP3,R555,R500,/WFMOUT/TEMP1 COMMON /DEBUGC/CNVDBG SAVE /OMABFL/,/PARNML/,/PARNM2/,/OMABFR/,/OMACNT/,/OMATYP/,/DEBUGC/ SAVE /ZEROS/,/OMASCR/,/AMPLS/,/KIASMN/,/FETURE/,/PARPLZ/,/MGFORM/ SAVE /PARCDA/,/PARCUM/,/WFMOUT/,/NTRVN/,/KEYGET/,/SHFSTA/,/BUFDEF/ EXTERNAL KADDR,INDST3,INDEX3,FANCYD,DANWYA,DOWAIT,AUTOA,DANWY0,GRCLS EXTERNAL DANWYI,PAUSE,FSET07,DIANWY,DAANWY,FIXR,MENU,XTRCMG EXTERNAL TLNFIT,TLNFIP,TLNFIS,LINFIT,LINFIP,LINFIS,TLNFET,TLNFEP,TLNFES EXTERNAL MEDFIT,TMDFIT,TMDFET,TRIMD SAVE * NORMAL = .TRUE. GOTO 9000 * ENTRY ERH0PL(SARRAY,DARRAY,NX,NY) NORMAL = .FALSE. 9000 CONTINUE SVSTAT = 0 SVWID = 0 SVOFFS = 0 SVST = 0 SVEND = 0 SVINT = -1 SVTRIM = -1 IF (TYP(5).EQ.-2.OR.LENXS(5).NE.NX.OR.LENYS(5).NE.NY) THEN JYBEG = 1 JYEND = NY JXBEG = 1 JXEND = NX TLCT = NY BLCT = 1 LLCT = 1 RLCT = NX ELSE JYBEG = IYBEG JYEND = IYEND JXBEG = IXBEG JXEND = IXEND TLCT = TLCTRD BLCT = BLCTRD LLCT = LLCTRD RLCT = RLCTRD

ENDIF IF (JYBEG.LE.0.OR.JYBEG.GT.NY) JYBEG = 1 IF (JYEND.LE.0.OR.JYEND.GT.NY) JYEND = NY IF (JXBEG.LE.0.OR.JXBEG.GT.NX) JXBEG = 1 IF (JXEND.LE.0.OR.JXEND.GT.NX) JXEND = NX IF (LLCT.LE.0.OR.LLCT.GT.NX) LLCT = NX/3 IF (RLCT.LE.0.OR.RLCT.GT.NX) RLCT = (NX*2)/3 IF (TLCT.LE.0.OR.TLCT.GT.NY) TLCT = NY IF (BLCT.LE.0.OR.BLCT.GT.NY) BLCT = 1 IF (CNVDBG) THEN CALL GRCLS ELSE CALL GCRCLS PRINT *,' ' ENDIF LL = (TLCT-BLCT+1)*0.05 LS = BLCT + LL LE = TLCT - LL LINEAR = .FALSE. LOGLOG = .TRUE. LOGLIN = .FALSE. FUNC = 'LogLin' ORDLS = .FALSE. TRMLS = .TRUE. ETRMLS = .FALSE. ABSDEV = .FALSE. FIT = 'Trim L-S' EQUAL = .TRUE. PRMARY = .FALSE. SECOND = .FALSE. INTFRM = .TRUE. FORM = 'Equal' OFFSET = 0 WIDTH = 3 STAT = 3 IFIT = 2 IFORM = 1 IFUNC = 2 DOTRIM = .FALSE. 9002 CONTINUE CALL XYGOTO(0,4) IF (.NOT.NORMAL) THEN PRINT *,'LOG-LINEAR FIT & SCATTER PLOT ' PRINT *,'OUTLIER-TRIMMED LEAST-SQUARES FITTING' PRINT *,'WITH EQUAL TREATMENT OF THE VARIABLES' ELSE PRINT *,'Surface E-Rho Plots: What form for fit? 1=Log Log ' PRINT *,' 2=Log Linear ' PRINT *,' 3=Linear ' PRINT *,' ^C=Exit ' PRINT *,' DEFAULT = ',IFUNC I = MENU(IFUNC,0,3) IF (IASC.EQ.10) GOTO 9003 IF (ESCAPE.OR.INTRPT) GOTO 9001 IF (ABORT) STOP ' User initiated abort!' IFUNC = I LINEAR = I .EQ. 3 LOGLIN = I .EQ. 2 LOGLOG = I .EQ. 1 CALL XYGOTO(0,4)

PRINT *,'Surface E-Rho Plots: What kind of fit? 1=Least Squares' PRINT *,' 2=Trimmed L-S' PRINT *,' 3=Extra Trimmed L-S' PRINT *,' 4=Abs.Dev. (Median)' PRINT *,' 5=TRIMMED Median' PRINT *,' 6=EXTRA Trim. Med.' PRINT *,' ^C=Exit ' PRINT *,' DEFAULT = ',IFIT I = MENU(IFIT,0,6) IF (ESCAPE.OR.INTRPT) GOTO 9001 IF (ABORT) STOP ' User initiated abort!' IFIT = I ORDLS = I .EQ. 1 TRMLS = I .EQ. 2 ETRMLS = I .EQ. 3 ABSDEV = I .EQ. 4 IF (IASC.EQ.10) GOTO 9003 IF (IFIT.LE.3) THEN CALL XYGOTO(0,4) PRINT *,'Surface E-Rho Plots: Treatment of variables? 1=Equal' PRINT *,' 2=E - primar y' PRINT *,' ary' PRINT *,' PRINT *,' DEFAULT = ',IFORM I = MENU(IFORM,0,3) IF (IASC.EQ.10) GOTO 9003 IF (ESCAPE.OR.INTRPT) GOTO 9001 IF (ABORT) STOP ' User initiated abort!' IFORM = I EQUAL = I .EQ. 1 PRMARY = I .EQ. 2 SECOND = I .EQ. 3 ELSE IFORM = -1 ENDIF CALL XYGOTO(0,4) PRINT *,'Presentation of values (0=NORMALIZED, 1=internal form) ?' I = MENU(0,0,1) INTFRM = I.NE.0 IF (IASC.EQ.10) GOTO 9003 CALL XYGOTO(0,4) IF (DOTRIM) THEN PRINT *,'TRIM data? (Y/n)' I = 1 ELSE PRINT *,'TRIM data? (y/N)' I = 0 ENDIF I = MENU(I,0,1) DOTRIM = I.NE.0 IF (IASC.EQ.10) GOTO 9003 CALL XYGOTO(0,4) PRINT *,'Surface E-Rho Plots: Start at Y = ? (',LS,'; ',JYBEG,' : ',J YEND,')' I = MENU(LS,0+JYBEG,0+JYEND) IF (I.GE.JYBEG.AND.I.LE.JYEND) LS = I IF (IASC.EQ.10) GOTO 9003 CALL XYGOTO(0,4) ^C=Exit' 3=Rho - prim

PRINT *,'Surface E-Rho Plots: End a Y = ? (',LE,'; ',JYBEG,' : ',JYEN D,')' I = MENU(LE,0+JYBEG,0+JYEND) IF (I.GE.JYBEG.AND.I.LE.JYEND) LE = I IF (IASC.EQ.10) GOTO 9003 CALL XYGOTO(0,4) PRINT *,'Surface E-Rho Plots: OFFSET From detected edge? (0 .. 10)' OFFSET = MENU(0+OFFSET,-1,10) IF (IASC.EQ.10) GOTO 9003 CALL XYGOTO(0,4) PRINT *,'Surface E-Rho Plots: WIDTH of grab (number of points)? (1 .. 10)' WIDTH = MENU(0+WIDTH,0,10) IF (WIDTH.LT.1) WIDTH = 1 IF (IASC.EQ.10) GOTO 9003 IF (WIDTH.GT.1) THEN CALL XYGOTO(0,4) PRINT *,'Surface E-Rho Plots: Mean(1), Median(2), BI-MEAN(3)?' PRINT *,'Surface E-Rho Plots: Weighted mean(4), Sorted Weighted me an(5)' STAT = MENU(0+STAT,0,5) IF (IASC.EQ.10) GOTO 9003 ELSE STAT = -1 ENDIF ENDIF 9003 CONTINUE L = LE-LS+1 I = INDST3(L,2,4) IF (WIDTH.LT.1) WIDTH = 1 * IF (STAT.LT.1) STAT = 1 IF (OFFSET.LT.0) OFFSET = 0 IF (SVWID.EQ.WIDTH .AND. (SVSTAT.EQ.STAT .OR. WIDTH.EQ.1) .AND. & SVST.EQ.LS .AND. SVOFFS.EQ.OFFSET .AND. SVEND.EQ.LE .AND. & ((INTFRM.AND.SVINT.EQ.1).OR.(SVINT.EQ.0.AND..NOT.INTFRM)) ) GOTO 9112 * * * Pick out the data, we take E and Rho values directly adjacent to the * electrodes. Find the non-zero values near the electrodes ... * * IF (.NOT.CNVDBG) THEN * PRINT *,'DEBUG MODE? (y/N)' * I = MENU(0,0,1) * CNVDBG = I.EQ.1 * ENDIF PRINT *,' Beginning data extraction ...' K1 = 0 K2 = 0 DO 1 J = LS,LE DO 2 I = LLCT,JXBEG,-1 II = I IF (SARRAY(I,J).EQ.0.OR.DARRAY(I,J).EQ.8192) GOTO 3 2 CONTINUE IS = LLCT IF (CNVDBG) PRINT *,'E-Rho plots: FALLTHROUGH - K1 =',K1 GOTO 4 3 CONTINUE DO 12 I = (II+1),VCNTRL IS = I IF (SARRAY(I,J).NE.0.AND.DARRAY(I,J).NE.8192) GOTO 4

12 4 *

CONTINUE IS = LLCT IF (CNVDBG) PRINT *,'E-Rho plots: GRONK 4 - K1 =',K1 CONTINUE DO 5 I = RLCT,JXEND II = I IF (SARRAY(I,J).EQ.0.OR.DARRAY(I,J).EQ.8192) GOTO 6 CONTINUE IE = RLCT IF (CNVDBG) PRINT *,'E-Rho plots: FALLTHROUGH - K2 =',K2 GOTO 7 CONTINUE DO 15 I = (II-1),VCNTRL,-1 IE = I IF (SARRAY(I,J).NE.0.AND.DARRAY(I,J).NE.8192) GOTO 7 CONTINUE IE = RLCT IF (CNVDBG) PRINT *,'E-Rho plots: GRONK 7 - K2 =',K2 CONTINUE IF (WIDTH.EQ.1) THEN EL = SARRAY(IS+OFFSET,J) RHOL = DARRAY(IS+OFFSET,J) - 8192.0 ER = SARRAY(IE-OFFSET,J) RHOR = DARRAY(IE-OFFSET,J) - 8192.0 ELSE EL = XTRCMG(SARRAY(IS+OFFSET,J),WIDTH,STAT) RHOL = XTRCMG(DARRAY(IS+OFFSET,J),WIDTH,STAT) - 8192.0 ER = XTRCMG(SARRAY(IE-OFFSET-WIDTH+1,J),WIDTH,STAT) RHOR = XTRCMG(DARRAY(IE-OFFSET-WIDTH+1,J),WIDTH,STAT) - 8192.0 ENDIF IF (.NOT.INTFRM) THEN EL = EL / 4096.0 ER = ER / 4096.0 RHOL = RHOL / 256.0 RHOR = RHOR / 256.0 ENDIF IF (CNVDBG) PRINT '(2(2(G11.4,'' ''),'' ''),I5,2X,I5)',EL,RHOL,ER,R

15 7 *

* HOR,IS,IE

I = INDST3(L,2,4) IF ( EL.NE.0.0 .AND. RHOL.NE.0.0 .AND. ER.NE.0.0 .AND. RHOR.NE.0.0 & ) THEN K1 = K1 + 1 K2 = K2 + 1 R500(INDEX3(K1,1,1)) = EL R500(INDEX3(K1,2,1)) = RHOL R500(INDEX3(K2,1,3)) = ER R500(INDEX3(K2,2,3)) = RHOR ELSEIF ( ER.NE.0.0 .AND. RHOR.NE.0.0 ) THEN K2 = K2 + 1 R500(INDEX3(K2,1,3)) = ER R500(INDEX3(K2,2,3)) = RHOR ELSEIF ( EL.NE.0.0 .AND. RHOL.NE.0.0 ) THEN K1 = K1 + 1 R500(INDEX3(K1,1,1)) = EL R500(INDEX3(K1,2,1)) = RHOL ENDIF 1 CONTINUE *

* NEXT trim the data, saving the old values of K1 and K2 as KK1 and KK2 * KK1 = K1 KK2 = K2 IF (DOTRIM) THEN K1 = 0 CALL TRIMD(R500(INDEX3(I,1,1)),L,KK1,K1) K2 = 0 CALL TRIMD(R500(INDEX3(I,1,3)),L,KK2,K2) PRINT *,'K1/K2 KK1/KK2 ',K1,'/',K2,' ',KK1,'/',KK2 ENDIF * * Having found non-zero E - Rho combinations we copy the last ones forward to * fill out the plotting arrays * DO 102 I = K1+1,L R500(INDEX3(I,1,1)) = R500(INDEX3(K1,1,1)) R500(INDEX3(I,2,1)) = R500(INDEX3(K1,2,1)) 102 CONTINUE DO 112 I = K2+1,L R500(INDEX3(I,1,3)) = R500(INDEX3(K2,1,3)) R500(INDEX3(I,2,3)) = R500(INDEX3(K2,2,3)) 112 CONTINUE 9112 CONTINUE IF (INTFRM) THEN SVINT = 1 ELSE SVINT = 0 ENDIF SVWID = WIDTH SVOFFS = OFFSET SVSTAT = STAT SVST = LS SVEND = LE * PRINT *,'E-Rho plots: K1 = ',K1,' K2 = ',K2,' L = ',L PRINT *,'Preparing to fit.' * * * NEXT, prepare for fitting and plotting. The data are copied over from sub* arrays 1 & 2 to 3 & 4, getting log'ed if log-log plots are being done. * * IF (LINEAR) THEN FUNC = 'Linear' * prepare for straight line fit DO 121 I = 1,L R500(INDEX3(I,1,4)) = R500(INDEX3(I,1,3)) R500(INDEX3(I,2,4)) = R500(INDEX3(I,2,3)) R500(INDEX3(I,1,2)) = R500(INDEX3(I,1,1)) R500(INDEX3(I,2,2)) = R500(INDEX3(I,2,1)) 121 CONTINUE ELSEIF (LOGLOG) THEN FUNC = 'Log-Log' * prepare for power law fit (straight line fit of log-log data) DO 122 I = 1,L R500(INDEX3(I,1,4)) = ALOG( R500(INDEX3(I,1,3)) ) R500(INDEX3(I,2,4)) = ALOG(ABS( R500(INDEX3(I,2,3)) )) R500(INDEX3(I,1,2)) = ALOG( R500(INDEX3(I,1,1)) ) R500(INDEX3(I,2,2)) = ALOG(ABS( R500(INDEX3(I,2,1)) ))

CONTINUE IF ( R500(INDEX3(1,2,1)) .LT. 0.0 ) THEN FACT1 = -1.0D0 ELSE FACT1 = +1.0D0 ENDIF IF ( R500(INDEX3(1,2,3)) .LT. 0.0 ) THEN FACT2 = -1.0D0 ELSE FACT2 = +1.0D0 ENDIF ELSEIF (LOGLIN) THEN FUNC = 'Log Lin' * prepare for power law fit (straight line fit of log-log data) DO 123 I = 1,L R500(INDEX3(I,1,4)) = R500(INDEX3(I,1,3)) R500(INDEX3(I,2,4)) = ALOG(ABS( R500(INDEX3(I,2,3)) )) R500(INDEX3(I,1,2)) = R500(INDEX3(I,1,1)) R500(INDEX3(I,2,2)) = ALOG(ABS( R500(INDEX3(I,2,1)) )) 123 CONTINUE IF ( R500(INDEX3(1,2,1)) .LT. 0.0 ) THEN FACT1 = -1.0D0 ELSE FACT1 = +1.0D0 ENDIF IF ( R500(INDEX3(1,2,3)) .LT. 0.0 ) THEN FACT2 = -1.0D0 ELSE FACT2 = +1.0D0 ENDIF ENDIF * ** Next do linear fit (least-squares of perpendicular distance) to data (or log data) ** First, fit the left side data (in the first plot position) IF (LINEAR) THEN IND = 1 ELSEIF (LOGLOG.OR.LOGLIN) THEN IND = 2 ENDIF S11 = R500(INDEX3(1,1,IND)) L11 = R500(INDEX3(1,1,IND)) DO 130 I = 2,K1 ITX = FIXR( R500(INDEX3(I,1,IND)) ) IF (S11.GT.ITX.AND.ITX.NE.0) S11 = ITX IF (L11.LT.ITX) L11 = ITX 130 CONTINUE IF (TRMLS) THEN FIT = 'TRIM L-S' IF (EQUAL) THEN CALL TLNFIT(R500(INDEX3(1,1,IND)),L,K1) ELSEIF (PRMARY) THEN CALL TLNFIP(R500(INDEX3(1,1,IND)),L,K1) ELSEIF (SECOND) THEN CALL TLNFIS(R500(INDEX3(1,1,IND)),L,K1) ENDIF ELSEIF (ORDLS) THEN FIT = 'Ord L-S' IF (EQUAL) THEN CALL LINFIT(R500(INDEX3(1,1,IND)),L,K1)

122

ELSEIF (PRMARY) THEN CALL LINFIP(R500(INDEX3(1,1,IND)),L,K1) ELSEIF (SECOND) THEN CALL LINFIS(R500(INDEX3(1,1,IND)),L,K1) ENDIF ELSEIF (ETRMLS) THEN FIT = 'Ext Trim' IF (EQUAL) THEN CALL TLNFET(R500(INDEX3(1,1,IND)),L,K1) ELSEIF (PRMARY) THEN CALL TLNFEP(R500(INDEX3(1,1,IND)),L,K1) ELSEIF (SECOND) THEN CALL TLNFES(R500(INDEX3(1,1,IND)),L,K1) ENDIF ELSEIF (ABSDEV) THEN FIT = 'MEDIAN ' CALL MEDFIT(R500(INDEX3(1,1,IND)),L,K1) I = INDST3(L,2,4) ELSEIF (IFIT.EQ.5) THEN FIT = 'Tr. Med' CALL TMDFIT(R500(INDEX3(1,1,IND)),L,K1,0.00001) I = INDST3(L,2,4) ELSEIF (IFIT.EQ.6) THEN FIT = 'X T Med' CALL TMDFET(R500(INDEX3(1,1,IND)),L,K1,0.00001) I = INDST3(L,2,4) ENDIF I = INDST3(L,2,4) IF (EQUAL) THEN FORM = 'Equal' ELSEIF (PRMARY) THEN FORM = 'Ordin.' ELSEIF (SECOND) THEN FORM = 'Invert' ENDIF X1 = TX1 X2 = TX2 Y1 = TY1 Y2 = TY2 COV = TCOV M1 = TSLOPE B1 = TINTRC CORR1 = TCORR RANKC1 = RNKCOR PRINT *,' ' PRINT *,'E-Rho plots: FIRST fit: ',FUNC,' by ',FORM,' ',FIT PRINT '(A,G11.4,A,G11.4,A,G11.4,A,G11.4)',' X1 = ',X1,' Y1 = ',Y1,' Slope ',M1,' Int. ',B1 PRINT '(A,G11.4,A,G11.4,A,G11.4,A,G11.4)',' X2 = ',X2,' Y2 = ',Y2,' COV = ',COV,' COR = ',CORR1 PRINT '(A,G11.4)','Rank Correlation = ',RANKC1 PRINT *,' ' * * Next, fit the right side data (in the third plot position, originally in the * second plot position) X1 = 0.0D0 X2 = 0.0D0 Y1 = 0.0D0 Y2 = 0.0D0 COV = 0.0D0

IF (LINEAR) THEN IND = 3 ELSEIF (LOGLOG.OR.LOGLIN) THEN IND = 4 ENDIF S12 = R500(INDEX3(1,1,IND)) L12 = R500(INDEX3(1,1,IND)) DO 131 I = 2,K2 ITX = FIXR( R500(INDEX3(I,1,IND)) ) IF (S12.GT.ITX.AND.ITX.GT.0) S12 = ITX IF (L12.LT.ITX) L12 = ITX 131 CONTINUE IF (TRMLS) THEN IF (EQUAL) THEN CALL TLNFIT(R500(INDEX3(1,1,IND)),L,K2) ELSEIF (PRMARY) THEN CALL TLNFIP(R500(INDEX3(1,1,IND)),L,K2) ELSEIF (SECOND) THEN CALL TLNFIS(R500(INDEX3(1,1,IND)),L,K2) ENDIF ELSEIF (ORDLS) THEN IF (EQUAL) THEN CALL LINFIT(R500(INDEX3(1,1,IND)),L,K2) ELSEIF (PRMARY) THEN CALL LINFIP(R500(INDEX3(1,1,IND)),L,K2) ELSEIF (SECOND) THEN CALL LINFIS(R500(INDEX3(1,1,IND)),L,K2) ENDIF ELSEIF (ETRMLS) THEN IF (EQUAL) THEN CALL TLNFET(R500(INDEX3(1,1,IND)),L,K2) ELSEIF (PRMARY) THEN CALL TLNFEP(R500(INDEX3(1,1,IND)),L,K2) ELSEIF (SECOND) THEN CALL TLNFES(R500(INDEX3(1,1,IND)),L,K2) ENDIF ELSEIF (ABSDEV) THEN FIT = 'MEDIAN ' CALL MEDFIT(R500(INDEX3(1,1,IND)),L,K2) I = INDST3(L,2,4) ELSEIF (IFIT.EQ.5) THEN FIT = 'Tr. Med' CALL TMDFIT(R500(INDEX3(1,1,IND)),L,K2,0.00001) I = INDST3(L,2,4) ELSEIF (IFIT.EQ.6) THEN FIT = 'X T Med' CALL TMDFET(R500(INDEX3(1,1,IND)),L,K2,0.00001) I = INDST3(L,2,4) ENDIF X1 = TX1 X2 = TX2 Y1 = TY1 Y2 = TY2 COV = TCOV M2 = TSLOPE B2 = TINTRC CORR2 = TCORR RANKC2 = RNKCOR PRINT *,' ' PRINT *,'E-Rho plots: SECOND fit: ',FUNC,' by ',FORM,' ',FIT

PRINT '(A,G11.4,A,G11.4,A,G11.4,A,G11.4)',' X1 = ',X1,' Y1 = ',Y1,' Slope ',M2,' Int. ',B2 PRINT '(A,G11.4,A,G11.4,A,G11.4,A,G11.4)',' X2 = ',X2,' Y2 = ',Y2,' COV = ',COV,' COR = ',CORR2 PRINT '(A,G11.4)','Rank Correlation = ',RANKC2 IF (CNVDBG) THEN PRINT *,' waiting ...' CALL DOWAIT ELSE CALL WAIT(1.1) ENDIF * * Now use the fits to create fit lines for comparison to data ... * R1 = L11 - S11 R2 = L12 - S12 IF (LINEAR) THEN DO 132 I = 1,L R500(INDEX3(I,1,2)) = S11 + R1*(I-1)/(L-1) R500(INDEX3(I,2,2)) = B1 + M1 * R500(INDEX3(I,1,2)) R500(INDEX3(I,1,4)) = S12 + R2*(I-1)/(L-1) R500(INDEX3(I,2,4)) = B2 + M2 * R500(INDEX3(I,1,4)) 132 CONTINUE ELSEIF (LOGLOG) THEN DO 133 I = 1,L ITX = S11 + R1*(I-1)/(L-1.0) R500(INDEX3(I,1,2)) = EXP(ITX) R500(INDEX3(I,2,2)) = EXP(B1 + M1*ITX) * FACT1 ITX = S12 + R2*(I-1)/(L-1.0) R500(INDEX3(I,1,4)) = EXP(ITX) R500(INDEX3(I,2,4)) = EXP(B2 + M2*ITX) * FACT2 133 CONTINUE ELSEIF (LOGLIN) THEN DO 134 I = 1,L ITX = S11 + R1*(I-1)/(L-1.0) R500(INDEX3(I,1,2)) = ITX R500(INDEX3(I,2,2)) = EXP(B1 + M1*ITX) * FACT1 ITX = S12 + R2*(I-1)/(L-1.0) R500(INDEX3(I,1,4)) = ITX R500(INDEX3(I,2,4)) = EXP(B2 + M2*ITX) * FACT2 134 CONTINUE ENDIF * CALL FSET07 CALL DAANWY(R500(1),L,4) CALL CRSROF CALL GOTOXY(22,0) CALL CRSROF IF (INTFRM) THEN PRINT *,FUNC,' ',FORM,' ',FIT,' Internal form values' ELSE PRINT *,FUNC,' ',FORM,' ',FIT,' Normalized values' ENDIF CALL CRSROF CALL GOTOXY(22,2) CALL CRSROF PRINT '(A,G11.4,'' '',G11.4)','Fit Correlations = ',CORR1,CORR2 CALL GOTOXY(22,3) CALL CRSROF PRINT '(A,G11.4,'' '',G11.4)','RANK Correlations = ',RANKC1,RANKC2

CALL CRSROF CALL DOWAIT CALL GOTOXY(0,0) CALL GCRCLS PRINT *,' ' PRINT *,'E-Rho Plots - Fit Coefficients:' PRINT *,FUNC,' ',FORM,' ',FIT PRINT *,' ' IF (LOGLOG) THEN PRINT *,'Left electrode: Log |Rho| as fn. of Log E ' PRINT '(A,G11.4,A,G11.4,A,G11.4,A,G11.4)',' Slope = ',M1,' Intercept = ' & ,B1,' Sign = ',FACT1,' Corr. ',CORR1 ELSEIF (LOGLIN) THEN PRINT *,'Left electrode: Log |Rho| as fn. of E ' PRINT '(A,G11.4,A,G11.4,A,G11.4,A,G11.4)',' Slope = ',M1,' Intercept ,B1,' Sign = ',FACT1,' Corr. ',CORR1 ELSE PRINT *,'Left electrode: Rho as fn. of E ' PRINT '(A,G11.4,A,G11.4,A,G11.4)',' Slope = ',M1,' & B1,' Corr. ',CORR1 ENDIF PRINT '(A,G11.4)','Rank Correlation (GOODNESS OF FIT) = PRINT *,' ' PRINT *,' ' IF (LOGLOG) THEN PRINT *,'Right electrode: Log |Rho| as fn. of Log E PRINT '(A,G11.4,A,G11.4,A,G11.4,A,G11.4)',' Slope = = ' & ,B2,' Sign = ',FACT2,' Corr. ',CORR2 ELSEIF (LOGLIN) THEN PRINT *,'Right electrode: Log |Rho| as fn. of E ' PRINT '(A,G11.4,A,G11.4,A,G11.4,A,G11.4)',' Slope = ',M2,' Intercept ,B2,' Sign = ',FACT2,' Corr. ',CORR2 ELSE PRINT *,'Right electrode: Rho as fn. of E ' PRINT '(A,G11.4,A,G11.4,A,G11.4)',' Slope = ',M2,' Intercept = ', & B2,' Corr. ',CORR2 ENDIF PRINT '(A,G11.4)','Rank Correlation (GOODNESS OF FIT) = ',RANKC2 PRINT *,' ' PRINT *,' Press ESCape to continue or ^C to exit.' CALL DOWAIT IF (INTRPT.OR.ESCAPE) GOTO 9001 CALL CLS PRINT *,'File values? (1=y/3=N,2=New File)' I = MENU(0,0,3) IF (INTRPT.OR.ESCAPE.OR..NOT.NORMAL) GOTO 9001 IF (I.EQ.1) CALL FILEIT(R500(1),L,K1,K2,KK1,KK2,LS,LE,OFFSET,WIDTH,STAT) IF (I.EQ.2) CALL F1LEIT(R500(1),L,K1,K2,KK1,KK2,LS,LE,OFFSET,WIDTH,STAT) GOTO 9002 * 9001 CONTINUE IF (LINEAR) THEN ERHOPL = 0 ELSEIF (LOGLOG) THEN ERH0PL = 0 ENDIF Intercept = ', ',RANKC1

= ' &

' ',M2,' Intercept

= ' &

CLOSE (UNIT=76,ERR=9998,STATUS='KEEP') 9998 CONTINUE RETURN END *---------------------------------------------------------------------INTEGER*4 FUNCTION XTRCMG(IT,NUMBER,STAT) REAL*8 ACCUM,DENOM INTEGER*4 NUMBER,STAT,NUMB INTEGER*2 IT(100),TEMP1(12) LOGICAL*2 CNVDBG COMMON /DEBUGC/CNVDBG EXTERNAL I2SORT * IF (NUMBER.LE.1) THEN XTRCMG = IT(1) RETURN ENDIF IF (STAT.EQ.1.OR.NUMBER.LT.3) THEN ACCUM = 0.0D0 DO 1 I = 1,NUMBER ACCUM = ACCUM + IT(I) 1 CONTINUE XTRCMG = NINT(ACCUM/NUMBER) RETURN ELSEIF (STAT.EQ.4) THEN ACCUM = 0.0D0 DENOM = 0.0D0 DO 11 I = 1,NUMBER K = MIN(I,NUMBER-I+1) ACCUM = ACCUM + IT(I) * K DENOM = DENOM + K 11 CONTINUE XTRCMG = NINT(ACCUM/DENOM) RETURN ENDIF NUMB = NUMBER IF (NUMBER.GT.12) NUMB = 12 DO 2 I = 1,NUMB TEMP1(I) = IT(I) 2 CONTINUE CALL I2SORT(TEMP1(1),NUMB,1,1) J = MAX((NUMB+1)/2,1) K = NUMB + 1 - J ACCUM = TEMP1(J) + TEMP1(K) DENOM = 2.0D0 IF (STAT.EQ.5) THEN DO 21 I = 1,NUMB L = MIN(I,NUMB-I+1) ACCUM = ACCUM + TEMP1(I) * L DENOM = DENOM + L 21 CONTINUE ELSEIF (STAT.NE.2) THEN J = MAX((NUMB+1)/4,1) K = NUMB + 1 - J ACCUM = ACCUM + TEMP1(J) + TEMP1(K) DENOM = 4.0D0 ENDIF XTRCMG = NINT(ACCUM/DENOM) RETURN END

*---------------------------------------------------------------------SUBROUTINE FILEIT(ERHO,L,K1,K2,KK1,KK2,LS,LE,OFFSET,WIDTH,STAT) CHARACTER*(23) INFN,OUTFN CHARACTER DEFV*6,DEFNM*8,DEFEXT*3,CRUD*1 REAL*4 ERHO(L,2,4) INTEGER*4 L,K1,K2,KK1,KK2,IOS,LE,LS,OFFSET,WIDTH,STAT,LUN INTEGER*2 DEFBUF,BUF1,BUF2, TYPS(32),LENXS(32),LENYS(32),FNRNSN(32) LOGICAL*4 ISOPEN LOGICAL*1 FIRST COMMON /OMATYP/TYPS,LENXS,LENYS,FNRNSN,/BUFDEF/DEFBUF,/I2EBUF/BUF1,BUF2 SAVE /OMATYP/,/BUFDEF/,/I2EBUF/ SAVE FIRST,OUTFN,DEFV,DEFNM,DEFEXT,LUN DATA FIRST/.TRUE./,DEFV/' '/,DEFNM/'ELECTROD'/,DEFEXT/'DAT'/ * 9000 CONTINUE IF (FIRST) THEN LUN = 76 FIRST = .FALSE. 9001 CALL CRCLS 9005 CONTINUE PRINT *,'File for output? (',DEFNM,'.',DEFEXT,')' READ (*,'(A)',ERR=9001) INFN IF (INFN(1:1).EQ.CHAR(3)) RETURN CALL CHCKFN(INFN,OUTFN,DEFV,DEFNM,DEFEXT) OPEN (UNIT=LUN,FILE=OUTFN,STATUS='OLD',ERR=9002,IOSTAT=IOS) PRINT *,'FILE ALREADY EXISTS, APPENDING DATA ' GOTO 9109 9002 CONTINUE OPEN (UNIT=LUN,FILE=OUTFN,STATUS='NEW',ERR=9004,IOSTAT=IOS) PRINT *,'FILE DID NOT EXIST, CREATED ' GOTO 9003 9004 CONTINUE PRINT *,'CAN''T OPEN FILE ',OUTFN PRINT *,'ERROR NUMBER IS ',IOS CALL FLASHB GOTO 9005 ELSE LUN = 76 ENDIF 9009 CONTINUE INQUIRE (UNIT=LUN,OPENED=ISOPEN) IF (ISOPEN) GOTO 9003 OPEN (UNIT=LUN,FILE=OUTFN,STATUS='OLD',ERR=9010,IOSTAT=IOS) 9109 CONTINUE PRINT *,'OPENED output file.' CALL WIND(LUN) INQUIRE (UNIT=LUN,IOSTAT=IOS) PRINT *,' WOUND output file to end.' * 9003 CONTINUE PRINT *,'STARTING to write output file.' WRITE (UNIT=LUN, & FMT='(/''============================================================== ============'')' & ,ERR=9011) WRITE (UNIT=LUN,FMT='(/''From Frames numbered '',I8.6,2X,I8.6)',ERR=9011,I OSTAT=IOS) & FNRNSN(BUF1),FNRNSN(BUF2) 9911 CONTINUE WRITE (UNIT=LUN,FMT='(''Extracted at offset '',I6.4,'' over '',I6.4,'' num

ber of points)'')', & ERR=9021,IOSTAT=IOS) OFFSET,WIDTH 9921 CONTINUE IF (STAT.EQ.1) THEN WRITE (UNIT=LUN,FMT='(A)',ERR=9031,IOSTAT=IOS) 'Extracted by SIMPLE AR ITHMETIC MEAN ' ELSEIF (STAT.EQ.2) THEN WRITE (UNIT=LUN,FMT='(A)',ERR=9031,IOSTAT=IOS) 'Extracted by MEDIAN ' ELSEIF (STAT.EQ.3) THEN WRITE (UNIT=LUN,FMT='(A)',ERR=9031,IOSTAT=IOS) 'Extracted by Tukey''s BI-MEAN ' ELSEIF (STAT.EQ.4) THEN WRITE (UNIT=LUN,FMT='(A)',ERR=9031,IOSTAT=IOS) 'Extracted by Weighted MEAN' ELSEIF (STAT.EQ.5) THEN WRITE (UNIT=LUN,FMT='(A)',ERR=9031,IOSTAT=IOS) 'Extracted by SORTED We ighted MEAN' ELSE WRITE (UNIT=LUN,FMT='(A)',ERR=9031,IOSTAT=IOS) 'Extracted by UNKNOWN M ETHODS' ENDIF 9931 CONTINUE WRITE (UNIT=LUN,FMT='(''Number of data points, MAIN; LEFT'',I4.3,'' RIGH T'',I4.3)',ERR=9041 & ,IOSTAT=IOS) K1,K2 9941 CONTINUE IF (K1.NE.KK1.OR.K2.NE.KK2) & WRITE (UNIT=LUN,FMT='(''Number of data points, TAILS; LEFT'',I4.3,'' RI GHT'',I4.3)',ERR=9051 & ,IOSTAT=IOS) +(KK1-K1),+(KK2 -K2) 9951 CONTINUE WRITE (UNIT=LUN, & FMT='(/''-------------------------------------------------------------------------'')' & ,ERR=9061,IOSTAT=IOS) 9961 CONTINUE 9997 WRITE (UNIT=LUN,FMT='(I4.3,2X,I4.3,4X,I4.3,2X,I4.3)',ERR=9012,IOSTAT=IOS) K1,K2,+(KK1-K1),+(KK2-K2) PRINT *,'Wrote output file header.' 9996 CONTINUE DO 1 I = 1,MIN(K1,K2) WRITE (UNIT=LUN,FMT='(G16.7,2X,G16.7,4X,G16.7,2X,G16.7)',ERR=9013,IOST AT=IOS) & ERHO(I,1,1),ERHO(I,2,1),ERHO(I,1,3),ERHO(I,2,3) 1 CONTINUE 9995 CONTINUE IF (K1.GT.K2) THEN DO 11 I = MIN(K1,K2)+1,K1 WRITE (UNIT=LUN,FMT='(G16.7,2X,G16.7)',ERR=9014,IOSTAT=IOS) & ERHO(I,1,1),ERHO(I,2,1) 11 CONTINUE ELSEIF (K2.GT.K1) THEN DO 12 I = MIN(K1,K2)+1,K2 WRITE (UNIT=LUN,FMT='(38X,G16.7,2X,G16.7)',ERR=9014,IOSTAT=IOS) & ERHO(I,1,3),ERHO(I,2,3) 12 CONTINUE ENDIF ID1 = KK1 - K1 ID2 = KK2 - K2 ID = MIN(ID1,ID2)

9994 CONTINUE IF (ID.GT.0) THEN DO 13 I = 1,ID WRITE (UNIT=LUN,FMT='(G16.7,2X,G16.7,4X,G16.7,2X,G16.7)',ERR=9015,I OSTAT=IOS) & ERHO(I+K1,1,1),ERHO(I+K1,2,1),ERHO(I+K2,1,3),ERHO(I+K2,2,3) 13 CONTINUE ENDIF 9993 CONTINUE IF (ID1.GT.ID2.AND.ID1.GT.0) THEN DO 14 I = (ID+1),ID1 WRITE (UNIT=LUN,FMT='(G16.7,2X,G16.7)',ERR=9016,IOSTAT=IOS) & ERHO(I+K1,1,1),ERHO(I+K1,2,1) 14 CONTINUE ELSEIF (ID2.GT.ID1.AND.ID2.GT.0) THEN DO 15 I = (ID+1),ID2 WRITE (UNIT=LUN,FMT='(38X,G16.7,2X,G16.7)',ERR=9016,IOSTAT=IOS) & ERHO(I+K2,1,3),ERHO(I+K2,2,3) 15 CONTINUE ENDIF * 9999 CONTINUE * CLOSE (UNIT=LUN,ERR=9998,STATUS='KEEP') 9998 CONTINUE RETURN * 9010 CONTINUE PRINT *,'CAN''T OPEN EXISTING FILE ',OUTFN PRINT *,'ERROR NUMBER IS ',IOS PRINT *,' What action? (1=RETRY, 2=Abort, 3=New Filename)' I = MENU(1,0,3) IF (I.EQ.2) GOTO 9999 IF (I.EQ.1) GOTO 9009 FIRST = .TRUE. IF (I.EQ.3) GOTO 9000 * 9011 CONTINUE PRINT *,'ERROR WRITING RECORD HEADER -line 1; IOS = ',IOS GOTO 9911 9021 CONTINUE PRINT *,'ERROR WRITING RECORD HEADER -line 2; IOS = ',IOS GOTO 9921 9031 CONTINUE PRINT *,'ERROR WRITING RECORD HEADER -line 3; IOS = ',IOS GOTO 9931 9041 CONTINUE PRINT *,'ERROR WRITING RECORD HEADER -line 4; IOS = ',IOS GOTO 9941 9051 CONTINUE PRINT *,'ERROR WRITING RECORD HEADER -line 5; IOS = ',IOS GOTO 9951 9061 CONTINUE PRINT *,'ERROR WRITING RECORD HEADER -line 6; IOS = ',IOS GOTO 9961 * 9012 CONTINUE PRINT *,'ERROR WRITING DATA RECORD @ 9012 - ERROR NUMBER IS ',IOS PRINT *,' What action? (1=RETRY, 2=Abort)' I = MENU(1,0,2) IF (I.EQ.1) GOTO 9997

GOTO 9999 * 9013 CONTINUE PRINT *,'ERROR WRITING DATA RECORD @ 9013 - ERROR NUMBER IS ',IOS PRINT *,' What action? (1=RETRY, 2=Abort)' I = MENU(1,0,2) IF (I.EQ.1) GOTO 9996 GOTO 9999 * 9014 CONTINUE PRINT *,'ERROR WRITING DATA RECORD @ 9014 - ERROR NUMBER IS ',IOS PRINT *,' What action? (1=RETRY, 2=Abort)' I = MENU(1,0,2) IF (I.EQ.1) GOTO 9995 GOTO 9999 * 9015 CONTINUE PRINT *,'ERROR WRITING DATA RECORD @ 9015 - ERROR NUMBER IS ',IOS PRINT *,' What action? (1=RETRY, 2=Abort)' I = MENU(1,0,2) IF (I.EQ.1) GOTO 9994 GOTO 9999 * 9016 CONTINUE PRINT *,'ERROR WRITING DATA RECORD @ 9016 - ERROR NUMBER IS ',IOS PRINT *,' What action? (1=RETRY, 2=Abort)' I = MENU(1,0,2) IF (I.EQ.1) GOTO 9993 GOTO 9999 * ENTRY F1LEIT(ERHO,L,K1,K2,KK1,KK2,LS,LE,OFFSET,WIDTH,STAT) ENTRY FIL3IT(ERHO,L,K1,K2,KK1,KK2,LS,LE,OFFSET,WIDTH,STAT) FIRST = .TRUE. GOTO 9000 END

Anda mungkin juga menyukai