hdiff output

r22712/disconnectionDPS.f90 2016-03-16 18:37:11.781304500 +0000 r22711/disconnectionDPS.f90 2016-03-16 18:37:12.009306843 +0000
  1: !  1: !
  2: !   GPL License Info    2: !   GPL License Info  {{{
  3: !  3: !
  4: !   disconnectionDPS is free software; you can redistribute it and/or modify  4: !   disconnectionDPS is free software; you can redistribute it and/or modify
  5: !   it under the terms of the GNU General Public License as published by  5: !   it under the terms of the GNU General Public License as published by
  6: !   the Free Software Foundation; either version 2 of the License, or  6: !   the Free Software Foundation; either version 2 of the License, or
  7: !   (at your option) any later version.  7: !   (at your option) any later version.
  8: !  8: !
  9: !   disconnectionDPS is distributed in the hope that it will be useful,  9: !   disconnectionDPS is distributed in the hope that it will be useful,
 10: !   but WITHOUT ANY WARRANTY; without even the implied warranty of 10: !   but WITHOUT ANY WARRANTY; without even the implied warranty of
 11: !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 11: !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 12: !   GNU General Public License for more details. 12: !   GNU General Public License for more details.
 13: ! 13: !
 14: !   You should have received a copy of the GNU General Public License 14: !   You should have received a copy of the GNU General Public License
 15: !   along with this program; if not, write to the Free Software 15: !   along with this program; if not, write to the Free Software
 16: !   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 16: !   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 17: ! 17: !
 18: ! Program Info  18: !   }}}
  19: !
  20: ! Program Info  {{{
 19: ! 21: !
 20: ! Program to plot disconnectivity trees. 22: ! Program to plot disconnectivity trees.
 21: ! See Becker and Karplus JCP 106 1495 (1997). 23: ! See Becker and Karplus JCP 106 1495 (1997).
 22: ! 24: !
 23: ! Adapted to read PATHSAMPLE.2.0 data files. 25: ! Adapted to read PATHSAMPLE.2.0 data files.
 24: ! keyword NCONNMIN added 26: ! keyword NCONNMIN added
 25: ! 27: !
 26: ! Information and options are passed to the program in a file called 28: ! Information and options are passed to the program in a file called
 27: ! "dinfo", which is keyword driven. 29: ! "dinfo", which is keyword driven.
 28: ! 30: !
160: ! be specified individually at both COLOURMARKER in this file. - vkd 162: ! be specified individually at both COLOURMARKER in this file. - vkd 
161: !163: !
162: ! TRVAL <max> <filename>164: ! TRVAL <max> <filename>
163: ! Colour the graph according to an order parameter value for each 165: ! Colour the graph according to an order parameter value for each 
164: ! minimum. The order parameters are read in from the named file, which should contain 166: ! minimum. The order parameters are read in from the named file, which should contain 
165: ! one line per minimum.  The expected range of the order parameters is [0,1] inclusive.167: ! one line per minimum.  The expected range of the order parameters is [0,1] inclusive.
166: ! max is the total number of minima.168: ! max is the total number of minima.
167: ! Colours are chosen automatically to be evenly distributed with order parameter value 169: ! Colours are chosen automatically to be evenly distributed with order parameter value 
168: ! along the edges of the RBG colour cube: red -> yellow -> green -> cyan -> blue170: ! along the edges of the RBG colour cube: red -> yellow -> green -> cyan -> blue
169: !171: !
170: ! TRVALRANGE TRMIN TRMAX 
171: ! Specify maximum and minimum values for order parameters that are not scaled to the 
172: ! range [0,1]. 
173: ! 
174: ! TRVALSCALE <x> <y>172: ! TRVALSCALE <x> <y>
175: ! Currently only for use with TRVAL.173: ! Currently only for use with TRVAL.
176: ! Creates a colour scalebar displaying the order parameter values for each colour.174: ! Creates a colour scalebar displaying the order parameter values for each colour.
177: ! <x> and <y> (in postscript units) are optional and overide the default values. - vkd175: ! <x> and <y> (in postscript units) are optional and overide the default values. - vkd
178: !176: !
179: ! TSTHRESH    <threshold> ignore transition states above this threshold.177: ! TSTHRESH    <threshold> ignore transition states above this threshold.
180: ! MAXTSENERGY <threshold> ignore transition states above this threshold.178: ! MAXTSENERGY <threshold> ignore transition states above this threshold.
181: ! MAXTSBARRIER <threshold> ignore transition states with both barriers above this threshold.179: ! MAXTSBARRIER <threshold> ignore transition states with both barriers above this threshold.
182: !180: !
183: ! WEIGHTS <file>181: ! WEIGHTS <file>
193: !!! Subroutines: ma readread_line(unit[,logical])191: !!! Subroutines: ma readread_line(unit[,logical])
194: !!!              get_string(string[,logical])192: !!!              get_string(string[,logical])
195: !!!              get_integer(integer[,logical])193: !!!              get_integer(integer[,logical])
196: !!!              get_dp(dp[,logical])194: !!!              get_dp(dp[,logical])
197: !!!              get_logical(lgcl[,logical])195: !!!              get_logical(lgcl[,logical])
198: !!!              upper_case(string)196: !!!              upper_case(string)
199: !!!197: !!!
200: !!! Version 2.0198: !!! Version 2.0
201: !!! MM 21.ix.96199: !!! MM 21.ix.96
202: !!!200: !!!
 201: ! }}}
203: 202: 
 203: ! Modules: KEYWORDS VARS PAGE {{{
 204: !MODULE KEYWORDS {{{
204: MODULE KEYWORDS205: MODULE KEYWORDS
205:    IMPLICIT NONE206:    IMPLICIT NONE
206:    INTEGER, PARAMETER :: MAX_LINES=2, MAX_LENGTH=100207:    INTEGER, PARAMETER :: MAX_LINES=2, MAX_LENGTH=100
207:    INTEGER, PARAMETER :: TOT_LENGTH=MAX_LINES*MAX_LENGTH208:    INTEGER, PARAMETER :: TOT_LENGTH=MAX_LINES*MAX_LENGTH
208:    INTEGER :: POSITION209:    INTEGER :: POSITION
209:    CHARACTER(LEN=TOT_LENGTH) :: INPUT210:    CHARACTER(LEN=TOT_LENGTH) :: INPUT
210:    SAVE211:    SAVE
211:    CONTAINS212:    CONTAINS
212: !!213: !!
213: ! READ_LINE(INT U, L SUCCESS)214: ! READ_LINE(INT U, L SUCCESS){{{
214:    SUBROUTINE READ_LINE(U, SUCCESS)215:    SUBROUTINE READ_LINE(U, SUCCESS)
215:       IMPLICIT NONE216:       IMPLICIT NONE
216:       INTEGER, INTENT(IN) :: U217:       INTEGER, INTENT(IN) :: U
217:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS218:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS
218:       INTEGER :: I, LINES, NEXT, ERR219:       INTEGER :: I, LINES, NEXT, ERR
219:       LOGICAL :: CONTINUE220:       LOGICAL :: CONTINUE
220:       CHARACTER(LEN=7) :: FMT_STRING221:       CHARACTER(LEN=7) :: FMT_STRING
221: !     Generate format string of max_length characters.222: !     Generate format string of max_length characters.
222:       WRITE (FMT_STRING, '(I4)') max_length223:       WRITE (FMT_STRING, '(I4)') max_length
223:       FMT_STRING = '(A' // TRIM(ADJUSTL(fmt_string)) // ')'224:       FMT_STRING = '(A' // TRIM(ADJUSTL(fmt_string)) // ')'
242:                   EXIT243:                   EXIT
243:                ENDIF244:                ENDIF
244:             END DO245:             END DO
245:             IF (.NOT.CONTINUE) EXIT246:             IF (.NOT.CONTINUE) EXIT
246:          END DO247:          END DO
247:          IF (ERR /= 0) EXIT248:          IF (ERR /= 0) EXIT
248:          IF (TRIM(INPUT) /= '') EXIT   ! Only read in next line if this one's empty.249:          IF (TRIM(INPUT) /= '') EXIT   ! Only read in next line if this one's empty.
249:       END DO250:       END DO
250:       POSITION = 1251:       POSITION = 1
251:    END SUBROUTINE READ_LINE252:    END SUBROUTINE READ_LINE
 253: ! }}}
252: !!254: !!
253: ! UPPER_CASE(STRING)255: ! UPPER_CASE(STRING){{{
254:    SUBROUTINE UPPER_CASE(STRING)256:    SUBROUTINE UPPER_CASE(STRING)
255:       IMPLICIT NONE257:       IMPLICIT NONE
256:       CHARACTER(LEN=*), INTENT(INOUT) :: STRING258:       CHARACTER(LEN=*), INTENT(INOUT) :: STRING
257:       INTEGER, PARAMETER :: LOWER_TO_UPPER = ICHAR("A")-ICHAR("a")259:       INTEGER, PARAMETER :: LOWER_TO_UPPER = ICHAR("A")-ICHAR("a")
258:       INTEGER :: I260:       INTEGER :: I
259:       DO I=1, LEN_TRIM(STRING)261:       DO I=1, LEN_TRIM(STRING)
260:          IF (LGE(STRING(I:I), 'a').AND.LLE(string(i:i), 'z')) THEN262:          IF (LGE(STRING(I:I), 'a').AND.LLE(string(i:i), 'z')) THEN
261:             STRING(I:I) = ACHAR(IACHAR(STRING(I:I))+LOWER_TO_UPPER)263:             STRING(I:I) = ACHAR(IACHAR(STRING(I:I))+LOWER_TO_UPPER)
262:          ENDIF264:          ENDIF
263:       END DO265:       END DO
264:    END SUBROUTINE UPPER_CASE266:    END SUBROUTINE UPPER_CASE
 267: ! }}}
265: !!268: !!
266: ! GET_STRING(CH(*) STRING, L SUCCESS)269: ! GET_STRING(CH(*) STRING, L SUCCESS){{{
267:    SUBROUTINE GET_STRING(STRING, SUCCESS)270:    SUBROUTINE GET_STRING(STRING, SUCCESS)
268:       IMPLICIT NONE271:       IMPLICIT NONE
269:       CHARACTER(LEN=*), INTENT(INOUT) :: STRING272:       CHARACTER(LEN=*), INTENT(INOUT) :: STRING
270:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS273:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS
271:       CHARACTER(LEN=TOT_LENGTH) :: TEMP274:       CHARACTER(LEN=TOT_LENGTH) :: TEMP
272:       INTEGER :: OUTCOME275:       INTEGER :: OUTCOME
273:       CALL NEXT_ITEM(TEMP, OUTCOME)276:       CALL NEXT_ITEM(TEMP, OUTCOME)
274:       IF (OUTCOME == 3) THEN277:       IF (OUTCOME == 3) THEN
275:          STRING = TEMP278:          STRING = TEMP
276:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.279:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.
277:       ELSE280:       ELSE
278:          IF (PRESENT(SUCCESS)) SUCCESS = .FALSE.281:          IF (PRESENT(SUCCESS)) SUCCESS = .FALSE.
279:       ENDIF282:       ENDIF
280:    END SUBROUTINE GET_STRING283:    END SUBROUTINE GET_STRING
 284: ! }}}
281: !!285: !!
282: ! GET_INTEGER(INT VALUE, L SUCCESS)286: ! GET_INTEGER(INT VALUE, L SUCCESS){{{
283:    SUBROUTINE GET_INTEGER(VALUE, SUCCESS)287:    SUBROUTINE GET_INTEGER(VALUE, SUCCESS)
284:       IMPLICIT NONE288:       IMPLICIT NONE
285:       INTEGER, INTENT(INOUT) :: VALUE289:       INTEGER, INTENT(INOUT) :: VALUE
286:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS290:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS
287:       INTEGER :: TEMP, OUTCOME, ERR291:       INTEGER :: TEMP, OUTCOME, ERR
288:       CHARACTER(LEN=TOT_LENGTH) :: ITEM292:       CHARACTER(LEN=TOT_LENGTH) :: ITEM
289:       CALL NEXT_ITEM(ITEM, OUTCOME)293:       CALL NEXT_ITEM(ITEM, OUTCOME)
290:       READ (UNIT=ITEM, FMT=*, IOSTAT=ERR) TEMP294:       READ (UNIT=ITEM, FMT=*, IOSTAT=ERR) TEMP
291:       IF ((ERR == 0).AND.(OUTCOME==3)) THEN295:       IF ((ERR == 0).AND.(OUTCOME==3)) THEN
292:          VALUE = TEMP296:          VALUE = TEMP
293:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.297:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.
294:       ELSE298:       ELSE
295:          IF (PRESENT(SUCCESS)) SUCCESS = .FALSE.299:          IF (PRESENT(SUCCESS)) SUCCESS = .FALSE.
296:       ENDIF300:       ENDIF
297:    END SUBROUTINE GET_INTEGER301:    END SUBROUTINE GET_INTEGER
 302: ! }}}
298: !!303: !!
299: ! READ_TRFILE(CH(120) FILE_TRACE, INT VALUE, INT(:) :: VALUES)304: ! READ_TRFILE(CH(120) FILE_TRACE, INT VALUE, INT(:) :: VALUES){{{
300:    SUBROUTINE READ_TRFILE(FILE_TRACE, VALUE, VALUES)305:    SUBROUTINE READ_TRFILE(FILE_TRACE, VALUE, VALUES)
301:       IMPLICIT NONE306:       IMPLICIT NONE
302:       INTEGER :: VALUES(:)307:       INTEGER :: VALUES(:)
303:       INTEGER :: ERR, I, N_TRACE, VALUE, NUMOFMIN308:       INTEGER :: ERR, I, N_TRACE, VALUE, NUMOFMIN
304:       CHARACTER(LEN=120) :: FILE_TRACE 309:       CHARACTER(LEN=120) :: FILE_TRACE 
305:       310:       
306:       CALL COUNT_MIN(FILE_TRACE, N_TRACE)311:       CALL COUNT_MIN(FILE_TRACE, N_TRACE)
307:       OPEN (UNIT=22, FILE=TRIM(FILE_TRACE), STATUS='OLD', IOSTAT=ERR)312:       OPEN (UNIT=22, FILE=TRIM(FILE_TRACE), STATUS='OLD', IOSTAT=ERR)
308:       IF (ERR /= 0) THEN313:       IF (ERR /= 0) THEN
309:       WRITE (6, '(/,2A,/)') 'ERROR: Could not open ', TRIM(file_trace)314:       WRITE (6, '(/,2A,/)') 'ERROR: Could not open ', TRIM(file_trace)
310:       STOP315:       STOP
311:       END IF316:       END IF
312:       DO I=1, N_TRACE317:       DO I=1, N_TRACE
313:       READ (22, *) NUMOFMIN318:       READ (22, *) NUMOFMIN
314:       VALUES(NUMOFMIN)=VALUE319:       VALUES(NUMOFMIN)=VALUE
315:       END DO320:       END DO
316:       CLOSE (22)321:       CLOSE (22)
317:       WRITE (6, '(A,I2,A,I6, 3A)')'Colour ',value, ': ', n_trace, ' minima read in from ', TRIM(file_trace), '.'322:       WRITE (6, '(A,I2,A,I6, 3A)')'Colour ',value, ': ', n_trace, ' minima read in from ', TRIM(file_trace), '.'
318:   323:   
319:    END SUBROUTINE READ_TRFILE324:    END SUBROUTINE READ_TRFILE
 325: ! }}}
320: !!326: !!
321: ! GET_DP(DP VALUE, SUCCESS) 327: ! GET_DP(DP VALUE, SUCCESS) {{{
322:    SUBROUTINE GET_DP(VALUE, SUCCESS)328:    SUBROUTINE GET_DP(VALUE, SUCCESS)
323:       IMPLICIT NONE329:       IMPLICIT NONE
324:       DOUBLE PRECISION, INTENT(INOUT) :: VALUE330:       DOUBLE PRECISION, INTENT(INOUT) :: VALUE
325:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS331:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS
326:       DOUBLE PRECISION :: TEMP332:       DOUBLE PRECISION :: TEMP
327:       INTEGER :: OUTCOME, ERR333:       INTEGER :: OUTCOME, ERR
328:       CHARACTER(LEN=TOT_LENGTH) :: ITEM334:       CHARACTER(LEN=TOT_LENGTH) :: ITEM
329:       CALL NEXT_ITEM(ITEM, OUTCOME)335:       CALL NEXT_ITEM(ITEM, OUTCOME)
330:       READ (UNIT=ITEM, FMT=*, IOSTAT=ERR) TEMP336:       READ (UNIT=ITEM, FMT=*, IOSTAT=ERR) TEMP
331:       IF ((ERR == 0).AND.(OUTCOME==3)) THEN337:       IF ((ERR == 0).AND.(OUTCOME==3)) THEN
332:          VALUE = TEMP338:          VALUE = TEMP
333:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.339:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.
334:       ELSE340:       ELSE
335:          IF (PRESENT(SUCCESS)) SUCCESS = .FALSE.341:          IF (PRESENT(SUCCESS)) SUCCESS = .FALSE.
336:       ENDIF342:       ENDIF
337:    END SUBROUTINE GET_DP343:    END SUBROUTINE GET_DP
 344: ! }}}
338: !!345: !!
339: ! GET_LOGICAL(L LGCL, L SUCCESS)346: ! GET_LOGICAL(L LGCL, L SUCCESS){{{
340:    SUBROUTINE GET_LOGICAL(LGCL, SUCCESS)347:    SUBROUTINE GET_LOGICAL(LGCL, SUCCESS)
341:       IMPLICIT NONE348:       IMPLICIT NONE
342:       LOGICAL, INTENT(INOUT) :: LGCL349:       LOGICAL, INTENT(INOUT) :: LGCL
343:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS350:       LOGICAL, INTENT(INOUT), OPTIONAL :: SUCCESS
344:       INTEGER :: OUTCOME351:       INTEGER :: OUTCOME
345:       CHARACTER(LEN=TOT_LENGTH) :: ITEM352:       CHARACTER(LEN=TOT_LENGTH) :: ITEM
346:       CALL NEXT_ITEM(ITEM, OUTCOME)353:       CALL NEXT_ITEM(ITEM, OUTCOME)
347:       CALL UPPER_CASE(ITEM)354:       CALL UPPER_CASE(ITEM)
348:       IF ((TRIM(ITEM)=='TRUE').OR.(TRIM(item)=='T').OR.(TRIM(item)=='.TRUE.') &355:       IF ((TRIM(ITEM)=='TRUE').OR.(TRIM(item)=='T').OR.(TRIM(item)=='.TRUE.') &
349:     & .OR.(TRIM(ITEM)=='.T.').OR.(TRIM(item)=='ON')) THEN356:     & .OR.(TRIM(ITEM)=='.T.').OR.(TRIM(item)=='ON')) THEN
350:          LGCL = .TRUE.357:          LGCL = .TRUE.
351:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.358:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.
352:       ELSE IF ((TRIM(ITEM)=='FALSE').OR.(TRIM(item)=='F').OR.(TRIM(item)=='.FALSE.') &359:       ELSE IF ((TRIM(ITEM)=='FALSE').OR.(TRIM(item)=='F').OR.(TRIM(item)=='.FALSE.') &
353:     & .OR.(TRIM(ITEM)=='.F.').OR.(TRIM(item)=='OFF')) THEN360:     & .OR.(TRIM(ITEM)=='.F.').OR.(TRIM(item)=='OFF')) THEN
354:          LGCL = .FALSE.361:          LGCL = .FALSE.
355:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.362:          IF (PRESENT(SUCCESS)) SUCCESS = .TRUE.
356:       ELSE363:       ELSE
357:          IF (PRESENT(SUCCESS)) SUCCESS = .FALSE.364:          IF (PRESENT(SUCCESS)) SUCCESS = .FALSE.
358:       ENDIF365:       ENDIF
359:    END SUBROUTINE GET_LOGICAL366:    END SUBROUTINE GET_LOGICAL
 367: ! }}}
360: !!368: !!
361: ! NEXT_ITEM(CH(:) ITEM, INT OUTCOME)369: ! NEXT_ITEM(CH(:) ITEM, INT OUTCOME){{{
362:    SUBROUTINE NEXT_ITEM(ITEM, OUTCOME)370:    SUBROUTINE NEXT_ITEM(ITEM, OUTCOME)
363:       IMPLICIT NONE371:       IMPLICIT NONE
364:       CHARACTER(LEN=TOT_LENGTH), INTENT(OUT) :: ITEM372:       CHARACTER(LEN=TOT_LENGTH), INTENT(OUT) :: ITEM
365:       INTEGER, INTENT(OUT) :: OUTCOME373:       INTEGER, INTENT(OUT) :: OUTCOME
366: !     Values of outcome:374: !     Values of outcome:
367: !      1: null string read375: !      1: null string read
368: !      2: end of line reached with no string376: !      2: end of line reached with no string
369: !      3: correctly read a string of at least one character377: !      3: correctly read a string of at least one character
370:       INTEGER :: I, J378:       INTEGER :: I, J
371:       ITEM = ''379:       ITEM = ''
412:                CASE DEFAULT420:                CASE DEFAULT
413:                   ITEM(J:J) = INPUT(I:I)421:                   ITEM(J:J) = INPUT(I:I)
414:                   J = J + 1422:                   J = J + 1
415:                   OUTCOME=3423:                   OUTCOME=3
416:                   POSITION = I+1424:                   POSITION = I+1
417:                END SELECT425:                END SELECT
418:             END DO426:             END DO
419:          ENDIF427:          ENDIF
420:       ENDIF428:       ENDIF
421:    END SUBROUTINE NEXT_ITEM429:    END SUBROUTINE NEXT_ITEM
 430:    ! }}}
422: !!431: !!
423: END MODULE KEYWORDS432: END MODULE KEYWORDS
 433: ! }}}
424: !................................................................................!434: !................................................................................!
425: !MODULE VARS 435: !MODULE VARS {{{
426: MODULE VARS 436: MODULE VARS 
427: 437: 
428:    IMPLICIT NONE438:    IMPLICIT NONE
429: 439: 
430:    INTEGER, DIMENSION(:), ALLOCATABLE :: NODES, FIRSTCOL, LASTCOL, COLSPAN, CHILDREN440:    INTEGER, DIMENSION(:), ALLOCATABLE :: NODES, FIRSTCOL, LASTCOL, COLSPAN, CHILDREN
431:    INTEGER, DIMENSION(:,:), ALLOCATABLE :: BASIN, BRANCHES, COL_0, ORDER, &441:    INTEGER, DIMENSION(:,:), ALLOCATABLE :: BASIN, BRANCHES, COL_0, ORDER, &
432:       NODE_SIZE, PARENT, MARKNODE442:       NODE_SIZE, PARENT, MARKNODE
433:    DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: DPMARKNODE443:    DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: DPMARKNODE
434:    DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: END_X, END_Y, M444:    DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: END_X, END_Y, M
435:    DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: LEVELWEIGHTS, CENTRESPAN445:    DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: LEVELWEIGHTS, CENTRESPAN
440:    INTEGER :: NMINTR=0450:    INTEGER :: NMINTR=0
441:    INTEGER :: CONNECTMIN=0451:    INTEGER :: CONNECTMIN=0
442:    INTEGER :: MINRANGE=10000452:    INTEGER :: MINRANGE=10000
443:    INTEGER, ALLOCATABLE :: MINIDS(:)453:    INTEGER, ALLOCATABLE :: MINIDS(:)
444:    INTEGER, ALLOCATABLE :: MINTRS(:)454:    INTEGER, ALLOCATABLE :: MINTRS(:)
445:    DOUBLE PRECISION, ALLOCATABLE :: DPMINTRS(:)455:    DOUBLE PRECISION, ALLOCATABLE :: DPMINTRS(:)
446:    DOUBLE PRECISION :: DELTA_E, E_HIGH456:    DOUBLE PRECISION :: DELTA_E, E_HIGH
447:    DOUBLE PRECISION :: TSTHRESH=1.0D100457:    DOUBLE PRECISION :: TSTHRESH=1.0D100
448:    DOUBLE PRECISION :: TSBARTHRESH=1.0D100458:    DOUBLE PRECISION :: TSBARTHRESH=1.0D100
449:    DOUBLE PRECISION :: CSCALE=1.0D0 459:    DOUBLE PRECISION :: CSCALE=1.0D0 
450:    DOUBLE PRECISION :: TRMIN=0.0D0 
451:    DOUBLE PRECISION :: TRMAX=1.0D0 
452:    DOUBLE PRECISION :: BENERGY=1.0D100 460:    DOUBLE PRECISION :: BENERGY=1.0D100 
453:    DOUBLE PRECISION :: TRSCALEX=90.0461:    DOUBLE PRECISION :: TRSCALEX=90.0
454:    DOUBLE PRECISION :: TRSCALEY=50.0462:    DOUBLE PRECISION :: TRSCALEY=50.0
455:    CHARACTER(LEN=120) :: FILE_MIN, FILE_PICK, FILE_TS, FILE_WEIGHTS, &    463:    CHARACTER(LEN=120) :: FILE_MIN, FILE_PICK, FILE_TS, FILE_WEIGHTS, &    
456:       FILE_TRACE464:       FILE_TRACE
457:    CHARACTER(LEN=10) :: LAB_FMT465:    CHARACTER(LEN=10) :: LAB_FMT
458:    LOGICAL :: BARRIERS, CENTRE_GMIN, DUMP_NUMBERS, DUMP_SIZES, EXCLUDEALL, &466:    LOGICAL :: BARRIERS, CENTRE_GMIN, DUMP_NUMBERS, DUMP_SIZES, EXCLUDEALL, &
459:       IDENTIFY, MONOTONIC, SPLIT, WEIGHTS467:       IDENTIFY, MONOTONIC, SPLIT, WEIGHTS
460:    LOGICAL :: IDENTIFY_NODE=.FALSE.468:    LOGICAL :: IDENTIFY_NODE=.FALSE.
461:    LOGICAL :: IDENTIFY_NODE_SIZE=.FALSE.469:    LOGICAL :: IDENTIFY_NODE_SIZE=.FALSE.
463:    LOGICAL :: TRMINT=.FALSE.471:    LOGICAL :: TRMINT=.FALSE.
464:    LOGICAL :: TRPRINT=.FALSE.472:    LOGICAL :: TRPRINT=.FALSE.
465:    LOGICAL :: TRVALT=.FALSE.473:    LOGICAL :: TRVALT=.FALSE.
466:    LOGICAL :: BASINT=.FALSE.474:    LOGICAL :: BASINT=.FALSE.
467:    LOGICAL :: WEIGHTLOWER=.FALSE.475:    LOGICAL :: WEIGHTLOWER=.FALSE.
468:    LOGICAL :: TRVALSCALET=.FALSE.476:    LOGICAL :: TRVALSCALET=.FALSE.
469:    LOGICAL :: MATCHMIN=.FALSE.477:    LOGICAL :: MATCHMIN=.FALSE.
470:    INTEGER, ALLOCATABLE :: NCONN(:)478:    INTEGER, ALLOCATABLE :: NCONN(:)
471: 479: 
472: END MODULE VARS480: END MODULE VARS
 481: ! }}}
473: !................................................................................!482: !................................................................................!
474: !MODULE PAGE483: !MODULE PAGE{{{
475: MODULE PAGE484: MODULE PAGE
476: 485: 
477:    IMPLICIT NONE486:    IMPLICIT NONE
478:    INTEGER :: PAGE_X=595,  PAGE_Y=842487:    INTEGER :: PAGE_X=595,  PAGE_Y=842
479:    INTEGER :: MARGIN_X=40, MARGIN_Y=50488:    INTEGER :: MARGIN_X=40, MARGIN_Y=50
480:    INTEGER :: SCALE_WIDTH=40489:    INTEGER :: SCALE_WIDTH=40
481:    INTEGER :: FONT_SIZE=10490:    INTEGER :: FONT_SIZE=10
482: 491: 
483:    INTEGER :: LABEL_SIZE=10492:    INTEGER :: LABEL_SIZE=10
484: 493: 
485: END MODULE PAGE494: END MODULE PAGE
 495: ! }}}
 496: ! }}}
486: !................................................................................!497: !................................................................................!
487: !PROGRAM DISCONNECTION498: !PROGRAM DISCONNECTION{{{
488: PROGRAM DISCONNECTION499: PROGRAM DISCONNECTION
489: 500: 
490:    USE PAGE501:    USE PAGE
491:    USE VARS502:    USE VARS
492:    IMPLICIT NONE503:    IMPLICIT NONE
493: ! Parameters 504: ! Parameters {{{
494:    TYPE TRANSITION_STATE505:    TYPE TRANSITION_STATE
495:       DOUBLE PRECISION :: E506:       DOUBLE PRECISION :: E
496:       INTEGER :: N, MIN1, MIN2507:       INTEGER :: N, MIN1, MIN2
497:    END TYPE TRANSITION_STATE508:    END TYPE TRANSITION_STATE
498: 509: 
499:    CHARACTER(LEN=3) :: PG510:    CHARACTER(LEN=3) :: PG
500:    CHARACTER(LEN=8) :: MIN_TRIM, BRANCH_TRIM, BRANCH_TRIM2511:    CHARACTER(LEN=8) :: MIN_TRIM, BRANCH_TRIM, BRANCH_TRIM2
501:    DOUBLE PRECISION :: B_HIGH, B_LOW, ENERGY, FRAC, LPAFS, &512:    DOUBLE PRECISION :: B_HIGH, B_LOW, ENERGY, FRAC, LPAFS, &
502:       & X1, X2, X3, X_POS, Y1, Y2, Y3, Y_POS, PADDING, E_GMIN, SPLIT_OPTION513:       & X1, X2, X3, X_POS, Y1, Y2, Y3, Y_POS, PADDING, E_GMIN, SPLIT_OPTION
503:    TYPE(TRANSITION_STATE), DIMENSION(:), ALLOCATABLE :: TS514:    TYPE(TRANSITION_STATE), DIMENSION(:), ALLOCATABLE :: TS
509:    INTEGER, ALLOCATABLE :: PLUS(:), MINUS(:), NDISTA(:)520:    INTEGER, ALLOCATABLE :: PLUS(:), MINUS(:), NDISTA(:)
510:    LOGICAL, ALLOCATABLE :: DEADTS(:)521:    LOGICAL, ALLOCATABLE :: DEADTS(:)
511:    INTEGER NDUMMY, NN 522:    INTEGER NDUMMY, NN 
512:    DOUBLE PRECISION VMIN, VMAX, DUMMY,R2523:    DOUBLE PRECISION VMIN, VMAX, DUMMY,R2
513:    DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: END_E, TSEN524:    DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: END_E, TSEN
514:    DOUBLE PRECISION, DIMENSION(:,:,:), ALLOCATABLE :: BRANCH_XY525:    DOUBLE PRECISION, DIMENSION(:,:,:), ALLOCATABLE :: BRANCH_XY
515: 526: 
516:    INTEGER, ALLOCATABLE :: DJWBASIN(:), NMINGROUP(:), GROUPMAP(:)527:    INTEGER, ALLOCATABLE :: DJWBASIN(:), NMINGROUP(:), GROUPMAP(:)
517:    DOUBLE PRECISION ETHRESH528:    DOUBLE PRECISION ETHRESH
518:    INTEGER NBASIN, NCOUNT, J2529:    INTEGER NBASIN, NCOUNT, J2
 530: ! }}}
519:    WRITE (6, '(/, A)') 'Disconnectivity Graphs'531:    WRITE (6, '(/, A)') 'Disconnectivity Graphs'
520:    WRITE (6, '(A, /)') '----------------------'532:    WRITE (6, '(A, /)') '----------------------'
521: 533: 
522:    CALL READ_OPTIONS534:    CALL READ_OPTIONS
523: ! 
524: ! Rescale order parameter values between 0 and 1 using the values of TRMAX and TRMIN. 
525: ! 
526:    IF (TRVALT) THEN 
527:       PRINT '(A,2G20.10)','Scaling order parameter values between 0 and 1 for range ',TRMIN,TRMAX 
528:       CSCALE=1.0D0/(TRMAX-TRMIN) 
529:       DO J1=1,MINRANGE 
530:          DPMINTRS(J1)=(DPMINTRS(J1)-TRMIN)*CSCALE 
531: !        PRINT *,'J1,DPMINTRS=',J1,DPMINTRS(J1) 
532:       ENDDO 
533:    ENDIF 
534: 535: 
535: !  Procure minima info.536: !  Procure minima info.
536:    CALL COUNT_MIN(FILE_MIN, N_MIN)537:    CALL COUNT_MIN(FILE_MIN, N_MIN)
537:    ALLOCATE (M(N_MIN), END_X(N_MIN), END_Y(N_MIN))538:    ALLOCATE (M(N_MIN), END_X(N_MIN), END_Y(N_MIN))
538:    ALLOCATE (END_E(0:N_MIN), END_M(0:N_MIN))539:    ALLOCATE (END_E(0:N_MIN), END_M(0:N_MIN))
539:    ALLOCATE (DJWBASIN(N_MIN),NMINGROUP(N_MIN),GROUPMAP(0:N_MIN))540:    ALLOCATE (DJWBASIN(N_MIN),NMINGROUP(N_MIN),GROUPMAP(0:N_MIN))
540:    OPEN (UNIT=20, FILE=TRIM(FILE_MIN), STATUS='OLD', IOSTAT=err)541:    OPEN (UNIT=20, FILE=TRIM(FILE_MIN), STATUS='OLD', IOSTAT=err)
541:    IF (ERR /= 0) THEN542:    IF (ERR /= 0) THEN
542:       WRITE (6, '(/,2A,/)') 'ERROR: Could not open ', TRIM(file_min)543:       WRITE (6, '(/,2A,/)') 'ERROR: Could not open ', TRIM(file_min)
543:       STOP544:       STOP
1321:                  IF (MARKNODE(I,K) ==2)  WRITE (20, '(A)') '0 1 0 setrgbcolor'1322:                  IF (MARKNODE(I,K) ==2)  WRITE (20, '(A)') '0 1 0 setrgbcolor'
1322:                  IF (MARKNODE(I,K) ==3)  WRITE (20, '(A)') '0 0 1 setrgbcolor'1323:                  IF (MARKNODE(I,K) ==3)  WRITE (20, '(A)') '0 0 1 setrgbcolor'
1323:                  IF (MARKNODE(I,K) ==4)  WRITE (20, '(A)') '1 0 1 setrgbcolor'  ! magenta1324:                  IF (MARKNODE(I,K) ==4)  WRITE (20, '(A)') '1 0 1 setrgbcolor'  ! magenta
1324:                  WRITE (20, '(2F7.2, A, 2F7.2, A)') x1, y1, ' mt ', x3, y3, ' ls'1325:                  WRITE (20, '(2F7.2, A, 2F7.2, A)') x1, y1, ' mt ', x3, y3, ' ls'
1325:                  WRITE (20, '(A)') '0 0 0 setrgbcolor'1326:                  WRITE (20, '(A)') '0 0 0 setrgbcolor'
1326:                ELSE1327:                ELSE
1327:                  WRITE (20, '(2F7.2, A, 2F7.2, A)') x1, y1, ' mt ', x3, y3, ' ls'1328:                  WRITE (20, '(2F7.2, A, 2F7.2, A)') x1, y1, ' mt ', x3, y3, ' ls'
1328:                ENDIF1329:                ENDIF
1329:             ELSE IF (TRVALT) THEN ! otherwise DPMARKNODE is not allocated1330:             ELSE IF (TRVALT) THEN ! otherwise DPMARKNODE is not allocated
1330:                IF (DPMARKNODE(I,K).GE.0.0D0) THEN1331:                IF (DPMARKNODE(I,K).GE.0.0D0) THEN
1331:                   R2=DPMARKNODE(I,K)*3.0D0! *CSCALE1332:                   R2=DPMARKNODE(I,K)*3.0D0*CSCALE
1332:                   IF (R2.GT.3.0D0) THEN1333:                   IF (R2.GT.3.0D0) THEN
1333:                      WRITE(6,*) 'WARNING: value of DPMARKNODE is ',DPMARKNODE(I,K),' for ',i,k1334:                      WRITE(6,*) 'WARNING: value of DPMARKNODE is ',DPMARKNODE(I,K),' for ',i,k
1334:                      R2=3.0D01335:                      R2=3.0D0
1335:                   END IF1336:                   END IF
1336:                    IF (R2.LT.1.0d0.AND.R2.GE.0.0d0)  WRITE (20, '(2F7.4,A)') (2.67d0-R2)/2.67D0 ,R2/2.0D0, ' 0  setrgbcolor'1337:                    IF (R2.LT.1.0d0.AND.R2.GE.0.0d0)  WRITE (20, '(2F7.4,A)') (2.67d0-R2)/2.67D0 ,R2/2.0D0, ' 0  setrgbcolor'
1337:                    IF (R2.LT.1.5d0.AND.R2.GE.1.0d0)  WRITE (20, '(F7.4,A)')  0.625D0-(R2-1.0D0)*1.25D0, ' 0.50  0  setrgbcolor' 1338:                    IF (R2.LT.1.5d0.AND.R2.GE.1.0d0)  WRITE (20, '(F7.4,A)')  0.625D0-(R2-1.0D0)*1.25D0, ' 0.50  0  setrgbcolor' 
1338:                    IF (R2.LT.2.0d0.AND.R2.GE.1.5d0)  WRITE (20, '(A,F7.4,A)') '0 0.5 ',0.625D0+(R2-2.0d0)*1.25D0,'  setrgbcolor'1339:                    IF (R2.LT.2.0d0.AND.R2.GE.1.5d0)  WRITE (20, '(A,F7.4,A)') '0 0.5 ',0.625D0+(R2-2.0d0)*1.25D0,'  setrgbcolor'
1339:                    IF (R2.LE.3.0d0.AND.R2.GE.2.0d0)  &1340:                    IF (R2.LE.3.0d0.AND.R2.GE.2.0d0)  &
1340:   &         WRITE (20, '(A,2F7.4,A)') '0 ',(3.0d0-R2)/2.0D0, ((2.0D0-R2)-1.67d0)/(-2.67D0), '  setrgbcolor'            1341:   &         WRITE (20, '(A,2F7.4,A)') '0 ',(3.0d0-R2)/2.0D0, ((2.0D0-R2)-1.67d0)/(-2.67D0), '  setrgbcolor'            
1341: !                  IF (R2.LE.1.AND.R2.GE.0)  WRITE (20, '(A,F6.4,A)') '1 0 ',(1-R2)/2,'  setrgbcolor'1342: !                  IF (R2.LE.1.AND.R2.GE.0)  WRITE (20, '(A,F6.4,A)') '1 0 ',(1-R2)/2,'  setrgbcolor'
1384: !                 IF (MARKNODE(I,K) ==8)  WRITE (20, '(A)') '0 0.5 1 setrgbcolor'1385: !                 IF (MARKNODE(I,K) ==8)  WRITE (20, '(A)') '0 0.5 1 setrgbcolor'
1385: !                 IF (MARKNODE(I,K) ==9)  WRITE (20, '(A)') '0 0 1 setrgbcolor'1386: !                 IF (MARKNODE(I,K) ==9)  WRITE (20, '(A)') '0 0 1 setrgbcolor'
1386: !                 IF (MARKNODE(I,K) ==10)  WRITE (20, '(A)') '0.5 0 1 setrgbcolor'1387: !                 IF (MARKNODE(I,K) ==10)  WRITE (20, '(A)') '0.5 0 1 setrgbcolor'
1387:                   WRITE (20, '(2F7.2, A, 2F7.2, A)') x1, y1, ' mt ', x2, y2, ' ls'1388:                   WRITE (20, '(2F7.2, A, 2F7.2, A)') x1, y1, ' mt ', x2, y2, ' ls'
1388:                   WRITE (20, '(A)') '0 0 0 setrgbcolor'1389:                   WRITE (20, '(A)') '0 0 0 setrgbcolor'
1389:                ELSE1390:                ELSE
1390:                   WRITE (20, '(2F7.2, A, 2F7.2, A)') x1, y1, ' mt ', x2, y2, ' ls'1391:                   WRITE (20, '(2F7.2, A, 2F7.2, A)') x1, y1, ' mt ', x2, y2, ' ls'
1391:                ENDIF1392:                ENDIF
1392:             ELSE IF (TRVALT) THEN1393:             ELSE IF (TRVALT) THEN
1393:                IF (DPMARKNODE(I,K).GE.0.0D0) THEN1394:                IF (DPMARKNODE(I,K).GE.0.0D0) THEN
1394:                    R2=DPMARKNODE(I,K)*3.0D0 ! *CSCALE1395:                    R2=DPMARKNODE(I,K)*3.0D0*CSCALE
1395:                    IF (R2.GT.3.0D0) THEN1396:                    IF (R2.GT.3.0D0) THEN
1396:                       WRITE(6,*) 'WARNING: value of DPMARKNODE is ',DPMARKNODE(I,K),' for ',i,k1397:                       WRITE(6,*) 'WARNING: value of DPMARKNODE is ',DPMARKNODE(I,K),' for ',i,k
1397:                       R2=3.0D01398:                       R2=3.0D0
1398:                    END IF1399:                    END IF
1399:                    IF (R2.LT.1.0d0.AND.R2.GE.0.0d0)  WRITE (20, '(2F7.4,A)') (2.67d0-R2)/2.67D0 ,R2/2.0D0, ' 0  setrgbcolor'1400:                    IF (R2.LT.1.0d0.AND.R2.GE.0.0d0)  WRITE (20, '(2F7.4,A)') (2.67d0-R2)/2.67D0 ,R2/2.0D0, ' 0  setrgbcolor'
1400:                    IF (R2.LT.1.5d0.AND.R2.GE.1.0d0)  WRITE (20, '(F7.4,A)')  0.625D0-(R2-1.0D0)*1.25D0, ' 0.50  0  setrgbcolor' 1401:                    IF (R2.LT.1.5d0.AND.R2.GE.1.0d0)  WRITE (20, '(F7.4,A)')  0.625D0-(R2-1.0D0)*1.25D0, ' 0.50  0  setrgbcolor' 
1401:                    IF (R2.LT.2.0d0.AND.R2.GE.1.5d0)  WRITE (20, '(A,F7.4,A)') '0 0.5 ',0.625D0+(R2-2.0d0)*1.25D0,'  setrgbcolor'1402:                    IF (R2.LT.2.0d0.AND.R2.GE.1.5d0)  WRITE (20, '(A,F7.4,A)') '0 0.5 ',0.625D0+(R2-2.0d0)*1.25D0,'  setrgbcolor'
1402:                    IF (R2.LE.3.0d0.AND.R2.GE.2.0d0)  &1403:                    IF (R2.LE.3.0d0.AND.R2.GE.2.0d0)  &
1403:   &                   WRITE (20, '(A,2F7.4,A)') &1404:   &                   WRITE (20, '(A,2F7.4,A)') &
1404:   &                   '0 ',(3.0d0-R2)/2.0D0, ((2.0D0-R2)-1.67d0)/(-2.67D0), '  setrgbcolor'1405:   &                   '0 ',(3.0d0-R2)/2.0D0, ((2.0D0-R2)-1.67d0)/(-2.67D0), '  setrgbcolor'
1580:      & '0.7 swidth 2.25 swidth moveto', &1581:      & '0.7 swidth 2.25 swidth moveto', &
1581:      & '1.0 swidth 2.25 swidth lineto', &1582:      & '1.0 swidth 2.25 swidth lineto', &
1582:      & 'stroke', &1583:      & 'stroke', &
1583:      & '%Numbers for scale', &1584:      & '%Numbers for scale', &
1584:      & '/Times-Roman findfont 12 scalefont setfont', &1585:      & '/Times-Roman findfont 12 scalefont setfont', &
1585:      & '0.0 swidth 3.40 swidth moveto', &1586:      & '0.0 swidth 3.40 swidth moveto', &
1586:      & '(Order Parameter) show', &1587:      & '(Order Parameter) show', &
1587:      & '/Times-Roman findfont 10 scalefont setfont'1588:      & '/Times-Roman findfont 10 scalefont setfont'
1588:       WRITE (20, '(4((A, /), (A2, F7.2, A, /)), (A, /), (A1, F7.2, A)) ') &1589:       WRITE (20, '(4((A, /), (A2, F7.2, A, /)), (A, /), (A1, F7.2, A)) ') &
1589:      & '1.2 swidth -0.04 swidth moveto', &1590:      & '1.2 swidth -0.04 swidth moveto', &
1590:      & '( ', TRMIN+0.00/CSCALE, ' ) show', &1591:      & '( ', 0.00/CSCALE, ' ) show', &
1591:      & '1.2 swidth 0.71 swidth moveto', &1592:      & '1.2 swidth 0.71 swidth moveto', &
1592:      & '( ', TRMIN+0.25/CSCALE, ' ) show', &1593:      & '( ', 0.25/CSCALE, ' ) show', &
1593:      & '1.2 swidth 1.46 swidth moveto', &1594:      & '1.2 swidth 1.46 swidth moveto', &
1594:      & '( ', TRMIN+0.50/CSCALE, ' ) show', &1595:      & '( ', 0.50/CSCALE, ' ) show', &
1595:      & '1.2 swidth 2.21 swidth moveto', &1596:      & '1.2 swidth 2.21 swidth moveto', &
1596:      & '( ', TRMIN+0.75/CSCALE, ' ) show', &1597:      & '( ', 0.75/CSCALE, ' ) show', &
1597:      & '1.3 swidth 2.90 swidth moveto', &1598:      & '1.2 swidth 2.96 swidth moveto', &
1598:      & '( ', TRMIN+1.00/CSCALE, ' ) show'1599:      & '( ', 1.00/CSCALE, ' ) show'
1599:    END IF1600:    END IF
1600: 1601: 
1601:    WRITE (20, '(/, A)') 'showpage'1602:    WRITE (20, '(/, A)') 'showpage'
1602:    CLOSE (20)1603:    CLOSE (20)
1603:    WRITE (6, '(A, /)') 'Done.'1604:    WRITE (6, '(A, /)') 'Done.'
1604:    DEALLOCATE(DJWBASIN,TSEN)1605:    DEALLOCATE(DJWBASIN,TSEN)
1605: 1606: 
1606: !   CALL SYSTEM('ps2pdf tree.ps tree.pdf')1607: !   CALL SYSTEM('ps2pdf tree.ps tree.pdf')
1607: 1608: 
1608: END PROGRAM DISCONNECTION1609: END PROGRAM DISCONNECTION
 1610: ! }}}
1609: !................................................................................!1611: !................................................................................!
1610: ! Subroutines 1612: ! Subroutines {{{
1611: ! READ_OPTIONS1613: ! READ_OPTIONS{{{
1612: SUBROUTINE READ_OPTIONS1614: SUBROUTINE READ_OPTIONS
 1615: !> \name READ_OPTIONS
 1616: !> \brief Read options from the file dinfo.
1613:    USE KEYWORDS1617:    USE KEYWORDS
1614:    USE PAGE1618:    USE PAGE
1615:    USE VARS1619:    USE VARS
1616:    IMPLICIT NONE1620:    IMPLICIT NONE
1617:    CHARACTER(LEN=50) :: KEYWORD1621:    CHARACTER(LEN=50) :: KEYWORD
1618:    INTEGER ERR, NDUMMY, I41622:    INTEGER ERR, NDUMMY, I4
1619:    INTEGER, ALLOCATABLE :: SAVEID(:)1623:    INTEGER, ALLOCATABLE :: SAVEID(:)
1620:    LOGICAL :: SUCCESS1624:    LOGICAL :: SUCCESS
1621: 1625: 
1622:    BARRIERS = .TRUE.1626:    BARRIERS = .TRUE.
1737:          TRVALT = .TRUE.1741:          TRVALT = .TRUE.
1738:          CALL GET_INTEGER(MINRANGE)1742:          CALL GET_INTEGER(MINRANGE)
1739:          WRITE (6, '(A)') 'Minima will be traced in colour according to values of an order parameter'1743:          WRITE (6, '(A)') 'Minima will be traced in colour according to values of an order parameter'
1740:          ALLOCATE(DPMINTRS(1:MINRANGE))1744:          ALLOCATE(DPMINTRS(1:MINRANGE))
1741:          DPMINTRS=-1.0D0 ! new initialization, because 0.0D0 is a legitimate value 1745:          DPMINTRS=-1.0D0 ! new initialization, because 0.0D0 is a legitimate value 
1742:          CALL GET_STRING(FILE_TRACE)1746:          CALL GET_STRING(FILE_TRACE)
1743:          CALL GET_DP(CSCALE)1747:          CALL GET_DP(CSCALE)
1744:          CALL GET_LOGICAL(WEIGHTLOWER)1748:          CALL GET_LOGICAL(WEIGHTLOWER)
1745:          OPEN (UNIT=22, FILE=TRIM(FILE_TRACE), STATUS='OLD', IOSTAT=ERR)1749:          OPEN (UNIT=22, FILE=TRIM(FILE_TRACE), STATUS='OLD', IOSTAT=ERR)
1746:          IF (ERR /= 0) THEN1750:          IF (ERR /= 0) THEN
1747:             WRITE (6, '(/,2A,/)') 'ERROR: Could not open ', TRIM(file_trace)1751:          WRITE (6, '(/,2A,/)') 'ERROR: Could not open ', TRIM(file_trace)
1748:             STOP1752:          STOP
1749:          END IF1753:          END IF
1750:          DO I4=1, MINRANGE1754:          DO I4=1, MINRANGE
1751:             READ(22, *, IOSTAT=ERR) DPMINTRS(I4)1755:             READ(22, *, IOSTAT=ERR) DPMINTRS(I4)
1752:             IF (ERR /= 0) EXIT1756:             IF (ERR /= 0) EXIT
1753:          ENDDO1757:          ENDDO
1754:          CLOSE(22)1758:          CLOSE(22)
1755:       CASE ('TRVALSCALE')1759:       CASE ('TRVALSCALE')
1756:          TRVALSCALET = .TRUE.1760:          TRVALSCALET = .TRUE.
1757:          CALL GET_DP(TRSCALEX)1761:          CALL GET_DP(TRSCALEX)
1758:          CALL GET_DP(TRSCALEY)1762:          CALL GET_DP(TRSCALEY)
1759:       CASE ('TRVALRANGE') 
1760:          CALL GET_DP(TRMIN) 
1761:          CALL GET_DP(TRMAX) 
1762:       CASE ('TS')1763:       CASE ('TS')
1763:          CALL GET_STRING(FILE_TS)1764:          CALL GET_STRING(FILE_TS)
1764:       CASE ('WEIGHTS')1765:       CASE ('WEIGHTS')
1765:          CALL GET_STRING(FILE_WEIGHTS)1766:          CALL GET_STRING(FILE_WEIGHTS)
1766:          WEIGHTS=.TRUE.1767:          WEIGHTS=.TRUE.
1767:       CASE ('BASINT')1768:       CASE ('BASINT')
1768:          BASINT = .TRUE.1769:          BASINT = .TRUE.
1769:          CALL GET_DP(BENERGY)1770:          CALL GET_DP(BENERGY)
1770:       CASE DEFAULT1771:       CASE DEFAULT
1771:          WRITE (6, '(2A)') 'Keyword not recognised in dinfo: ', TRIM(keyword)1772:          WRITE (6, '(2A)') 'Keyword not recognised in dinfo: ', TRIM(keyword)
1785: !      WRITE (6, '(A)') 'First energy level must by specified using FIRST.'1786: !      WRITE (6, '(A)') 'First energy level must by specified using FIRST.'
1786: !      STOP1787: !      STOP
1787: !   ENDIF1788: !   ENDIF
1788: 1789: 
1789:    IF (N_LEVELS <= 0) THEN1790:    IF (N_LEVELS <= 0) THEN
1790:       WRITE (6, '(A)') 'Number of levels must be specified using LEVELS.'1791:       WRITE (6, '(A)') 'Number of levels must be specified using LEVELS.'
1791:       STOP1792:       STOP
1792:    ENDIF1793:    ENDIF
1793: 1794: 
1794: END SUBROUTINE READ_OPTIONS1795: END SUBROUTINE READ_OPTIONS
 1796: ! }}}
1795: !................................................................................!1797: !................................................................................!
1796: ! COUNT_MIN(FN, N)1798: ! COUNT_MIN(FN, N){{{
1797: SUBROUTINE COUNT_MIN(FN, N)1799: SUBROUTINE COUNT_MIN(FN, N)
 1800: !> \name COUNT_MIN
 1801: !> \brief Count the number of minima in the list.
1798:    IMPLICIT NONE1802:    IMPLICIT NONE
1799:  1803:  
1800:    CHARACTER(LEN=100), INTENT(IN) :: FN1804:    CHARACTER(LEN=100), INTENT(IN) :: FN
1801:    INTEGER, INTENT(OUT) :: N1805:    INTEGER, INTENT(OUT) :: N
1802:    DOUBLE PRECISION DUMMY1806:    DOUBLE PRECISION DUMMY
1803:  1807:  
1804:    INTEGER :: ERR, J1808:    INTEGER :: ERR, J
1805:  1809:  
1806:    N = 01810:    N = 0
1807:    OPEN (UNIT=23, FILE=TRIM(FN), STATUS='OLD', IOSTAT=err)1811:    OPEN (UNIT=23, FILE=TRIM(FN), STATUS='OLD', IOSTAT=err)
1810:       STOP1814:       STOP
1811:    END IF1815:    END IF
1812:    DO1816:    DO
1813:       READ (UNIT=23, FMT=*, IOSTAT=ERR) DUMMY1817:       READ (UNIT=23, FMT=*, IOSTAT=ERR) DUMMY
1814:       IF (ERR /= 0) EXIT1818:       IF (ERR /= 0) EXIT
1815:       N = N + 11819:       N = N + 1
1816:    END DO1820:    END DO
1817:    CLOSE (23)1821:    CLOSE (23)
1818:  1822:  
1819: END SUBROUTINE COUNT_MIN1823: END SUBROUTINE COUNT_MIN
 1824: ! }}}
1820: !................................................................................!1825: !................................................................................!
1821: ! COUNT_TS(FN, N_TS, B_HIGH, B_LOW)1826: ! COUNT_TS(FN, N_TS, B_HIGH, B_LOW){{{
1822: SUBROUTINE COUNT_TS(FN, N_TS, B_HIGH, B_LOW)1827: SUBROUTINE COUNT_TS(FN, N_TS, B_HIGH, B_LOW)
 1828: !> \name COUNT_TS 
 1829: !> Count the number of transition states for NON-DEGENERATE rearrangements.
 1830: !> Also returned are the highest and lowest transition state energies.
1823: 1831: 
1824:    IMPLICIT NONE1832:    IMPLICIT NONE
1825: 1833: 
1826:    CHARACTER(LEN=100), INTENT(IN) :: FN1834:    CHARACTER(LEN=100), INTENT(IN) :: FN
1827:    INTEGER, INTENT(OUT) :: N_TS1835:    INTEGER, INTENT(OUT) :: N_TS
1828:    DOUBLE PRECISION :: B_HIGH, B_LOW1836:    DOUBLE PRECISION :: B_HIGH, B_LOW
1829: 1837: 
1830:    CHARACTER(LEN=3) :: PG1838:    CHARACTER(LEN=3) :: PG
1831:    DOUBLE PRECISION :: E, LPAFS1839:    DOUBLE PRECISION :: E, LPAFS
1832:    INTEGER :: ERR, I, H, MIN1, MIN21840:    INTEGER :: ERR, I, H, MIN1, MIN2
1844: ! standard PATHSAMPLE.2.0 format1852: ! standard PATHSAMPLE.2.0 format
1845:       READ (UNIT=20, FMT=*, IOSTAT=ERR) E, LPAFS, H, MIN1, MIN21853:       READ (UNIT=20, FMT=*, IOSTAT=ERR) E, LPAFS, H, MIN1, MIN2
1846:       IF (ERR /= 0) EXIT1854:       IF (ERR /= 0) EXIT
1847:       IF (MIN1 /= MIN2) N_TS=N_TS+11855:       IF (MIN1 /= MIN2) N_TS=N_TS+1
1848:       IF (E > B_HIGH) B_HIGH=E1856:       IF (E > B_HIGH) B_HIGH=E
1849:       IF (E < B_LOW) B_LOW=E1857:       IF (E < B_LOW) B_LOW=E
1850:    END DO1858:    END DO
1851:    CLOSE (20)1859:    CLOSE (20)
1852: 1860: 
1853: END SUBROUTINE COUNT_TS1861: END SUBROUTINE COUNT_TS
 1862: ! }}}
1854: !................................................................................!1863: !................................................................................!
1855: ! CONNECTIONS(INT :: LEVEL, NODE, INT(N_BR) :: CONNECT, INT N_BR)1864: ! CONNECTIONS(INT :: LEVEL, NODE, INT(N_BR) :: CONNECT, INT N_BR){{{
1856: SUBROUTINE CONNECTIONS(LEVEL, NODE, CONNECT, N_BR)1865: SUBROUTINE CONNECTIONS(LEVEL, NODE, CONNECT, N_BR)
 1866: !> \name CONNECTIONS
 1867: !> Subroutine to make a list (CONNECT) of the basins in level LEVEL+1 that are
 1868: !> connected to basin NODE in level LEVEL.
1857: 1869: 
1858:    USE VARS1870:    USE VARS
1859:    IMPLICIT NONE1871:    IMPLICIT NONE
1860: 1872: 
1861:    INTEGER, INTENT(IN) :: LEVEL, NODE, N_BR1873:    INTEGER, INTENT(IN) :: LEVEL, NODE, N_BR
1862:    INTEGER, DIMENSION(N_BR), INTENT(OUT) :: CONNECT1874:    INTEGER, DIMENSION(N_BR), INTENT(OUT) :: CONNECT
1863: 1875: 
1864:    INTEGER :: I, J, LAST1876:    INTEGER :: I, J, LAST
1865: 1877: 
1866:    LAST = 01878:    LAST = 0
1869:    DO I = 1, N_MIN1881:    DO I = 1, N_MIN
1870:       IF (NCONN(I).LE.NCONNMIN) CYCLE1882:       IF (NCONN(I).LE.NCONNMIN) CYCLE
1871:       IF ((BASIN(LEVEL, I) == NODE).AND.(BASIN(LEVEL+1, I) > LAST)) THEN1883:       IF ((BASIN(LEVEL, I) == NODE).AND.(BASIN(LEVEL+1, I) > LAST)) THEN
1872:          CONNECT(J) = BASIN(LEVEL+1, I)1884:          CONNECT(J) = BASIN(LEVEL+1, I)
1873:          LAST = CONNECT(J)1885:          LAST = CONNECT(J)
1874:          J = J + 11886:          J = J + 1
1875:       ENDIF1887:       ENDIF
1876:    END DO1888:    END DO
1877: 1889: 
1878: END SUBROUTINE CONNECTIONS1890: END SUBROUTINE CONNECTIONS
 1891: !}}}
1879: !................................................................................!1892: !................................................................................!
1880: ! HEADER1893: ! HEADER{{{
1881: SUBROUTINE HEADER1894: SUBROUTINE HEADER
 1895: !> \name HEADER
 1896: !> \brief Write preamble for PostScript file and draw energy scale.
1882: 1897: 
1883:    USE PAGE1898:    USE PAGE
1884:    USE VARS1899:    USE VARS
1885:    IMPLICIT NONE1900:    IMPLICIT NONE
1886: 1901: 
1887:    DOUBLE PRECISION :: X1, X2, Y1, Y2, X_POS, Y_POS1902:    DOUBLE PRECISION :: X1, X2, Y1, Y2, X_POS, Y_POS
1888:    DOUBLE PRECISION, PARAMETER :: TICK_WIDTH=3.0D01903:    DOUBLE PRECISION, PARAMETER :: TICK_WIDTH=3.0D0
1889:    INTEGER :: I1904:    INTEGER :: I
1890: 1905: 
1891: !  Definitions.1906: !  Definitions.
1939:       Y1 = Y_POS(1.0D0*(N_LEVELS-I)/(N_LEVELS-1)) - 5.0D01954:       Y1 = Y_POS(1.0D0*(N_LEVELS-I)/(N_LEVELS-1)) - 5.0D0
1940:       WRITE (20, '(2F7.2, A, '//TRIM(lab_fmt)//', A)') &1955:       WRITE (20, '(2F7.2, A, '//TRIM(lab_fmt)//', A)') &
1941: !     WRITE (20, '(2F7.2, A, F8.3, A)') &1956: !     WRITE (20, '(2F7.2, A, F8.3, A)') &
1942:          & X1, Y1, ' mt (', e_high - (n_levels-i)*delta_e, ') show'1957:          & X1, Y1, ' mt (', e_high - (n_levels-i)*delta_e, ') show'
1943:    END DO1958:    END DO
1944: 1959: 
1945: !  Landmark for manipulate.f90.1960: !  Landmark for manipulate.f90.
1946:    WRITE (20, '(/, A, /)') '% Manipulate landmark.'1961:    WRITE (20, '(/, A, /)') '% Manipulate landmark.'
1947: 1962: 
1948: END SUBROUTINE HEADER1963: END SUBROUTINE HEADER
 1964: !}}}
1949: !................................................................................!1965: !................................................................................!
1950: !DP X_POS(DP X) 1966: !DP X_POS(DP X) {{{
1951: FUNCTION X_POS(X)1967: FUNCTION X_POS(X)
 1968: !> \name X_POS
 1969: !> \brief Convert coordinates on (0,1) to PostScript units on paper.
1952: 1970: 
1953:    USE PAGE1971:    USE PAGE
1954:    IMPLICIT NONE1972:    IMPLICIT NONE
1955:    DOUBLE PRECISION :: X_POS1973:    DOUBLE PRECISION :: X_POS
1956:    DOUBLE PRECISION, INTENT(IN) :: X1974:    DOUBLE PRECISION, INTENT(IN) :: X
1957: 1975: 
1958:    X_POS = X * (PAGE_X - 2*MARGIN_X - SCALE_WIDTH) + MARGIN_X + SCALE_WIDTH1976:    X_POS = X * (PAGE_X - 2*MARGIN_X - SCALE_WIDTH) + MARGIN_X + SCALE_WIDTH
1959: 1977: 
1960: END FUNCTION X_POS1978: END FUNCTION X_POS
 1979: ! }}}
1961: 1980: 
1962: ! DP Y_POS(DP Y)1981: ! DP Y_POS(DP Y){{{
1963: FUNCTION Y_POS(Y)1982: FUNCTION Y_POS(Y)
1964: 1983: 
1965:    USE PAGE1984:    USE PAGE
1966:    IMPLICIT NONE1985:    IMPLICIT NONE
1967:    DOUBLE PRECISION :: Y_POS1986:    DOUBLE PRECISION :: Y_POS
1968:    DOUBLE PRECISION, INTENT(IN) :: Y1987:    DOUBLE PRECISION, INTENT(IN) :: Y
1969:  1988:  
1970:    Y_POS = PAGE_Y - (Y * (PAGE_Y - 2*MARGIN_Y) + MARGIN_Y)1989:    Y_POS = PAGE_Y - (Y * (PAGE_Y - 2*MARGIN_Y) + MARGIN_Y)
1971:  1990:  
1972: END FUNCTION Y_POS1991: END FUNCTION Y_POS
 1992: ! }}}
1973: !................................................................................!1993: !................................................................................!
1974: ! ENDPOINTS(INT L, DP(0:N_MIN) END_E, INT(0:N_MIN) END_M)1994: ! ENDPOINTS(INT L, DP(0:N_MIN) END_E, INT(0:N_MIN) END_M){{{
1975: SUBROUTINE ENDPOINTS(L, END_E, END_M)1995: SUBROUTINE ENDPOINTS(L, END_E, END_M)
1976: 1996: 
1977:    USE VARS1997:    USE VARS
1978:    IMPLICIT NONE1998:    IMPLICIT NONE
1979: 1999: 
1980:    INTEGER, INTENT(IN) :: L2000:    INTEGER, INTENT(IN) :: L
1981:    DOUBLE PRECISION, DIMENSION(0:N_MIN), INTENT(OUT) :: END_E2001:    DOUBLE PRECISION, DIMENSION(0:N_MIN), INTENT(OUT) :: END_E
1982:    INTEGER, DIMENSION(0:N_MIN), INTENT(OUT) :: END_M2002:    INTEGER, DIMENSION(0:N_MIN), INTENT(OUT) :: END_M
1983:  2003:  
1984:    INTEGER :: A2004:    INTEGER :: A
1987:  2007:  
1988:    DO A = 1, N_MIN2008:    DO A = 1, N_MIN
1989:       IF (NCONN(A).LE.NCONNMIN) CYCLE2009:       IF (NCONN(A).LE.NCONNMIN) CYCLE
1990:       IF ( M(A) < END_E(BASIN(L, A)) ) THEN2010:       IF ( M(A) < END_E(BASIN(L, A)) ) THEN
1991:          END_E(BASIN(L, A)) = M(A)2011:          END_E(BASIN(L, A)) = M(A)
1992:          END_M(BASIN(L, A)) = A2012:          END_M(BASIN(L, A)) = A
1993:       END IF2013:       END IF
1994:    END DO2014:    END DO
1995: 2015: 
1996: END SUBROUTINE ENDPOINTS2016: END SUBROUTINE ENDPOINTS
 2017: !}}}
1997: !................................................................................!2018: !................................................................................!
1998: ! MIX(INT N, INT(N) MIXLIST)2019: ! MIX(INT N, INT(N) MIXLIST){{{
1999: SUBROUTINE MIX(N, MIXLIST)2020: SUBROUTINE MIX(N, MIXLIST)
2000: 2021: 
2001:    IMPLICIT NONE2022:    IMPLICIT NONE
2002: 2023: 
2003:    INTEGER :: N2024:    INTEGER :: N
2004:    INTEGER, DIMENSION(N) :: MIXLIST2025:    INTEGER, DIMENSION(N) :: MIXLIST
2005: 2026: 
2006:    INTEGER :: SGN, DELTA, POS, I2027:    INTEGER :: SGN, DELTA, POS, I
2007:    INTEGER, DIMENSION(N) :: COPYLIST2028:    INTEGER, DIMENSION(N) :: COPYLIST
2008:    LOGICAL :: BIG2029:    LOGICAL :: BIG
2020:          DELTA = DELTA - 22041:          DELTA = DELTA - 2
2021:          SGN = -SGN2042:          SGN = -SGN
2022:          BIG = .FALSE.2043:          BIG = .FALSE.
2023:       ELSE2044:       ELSE
2024:          POS = POS + SGN2045:          POS = POS + SGN
2025:          BIG = .TRUE.2046:          BIG = .TRUE.
2026:       END IF2047:       END IF
2027:    END DO2048:    END DO
2028: 2049: 
2029: END SUBROUTINE MIX2050: END SUBROUTINE MIX
 2051: ! }}}
2030: !................................................................................!2052: !................................................................................!
2031: !INDEXX(INT N, DP(N) ARR, INT(N) INDX)2053: !INDEXX(INT N, DP(N) ARR, INT(N) INDX){{{
2032:       SUBROUTINE INDEXX(N,ARR,INDX)2054:       SUBROUTINE INDEXX(N,ARR,INDX)
 2055: !> \name INDEXX
 2056: !> Unmodified Numerical Recipes routine to return a sorted index indx of
 2057: !> length n for the array arr such that arr(inx(i)) are in ascending order
 2058: !> for i=1, 2, ... n.
2033:       INTEGER N,INDX(N),M,NSTACK2059:       INTEGER N,INDX(N),M,NSTACK
2034:       DOUBLE PRECISION ARR(N)2060:       DOUBLE PRECISION ARR(N)
2035:       PARAMETER (M=7,NSTACK=50)2061:       PARAMETER (M=7,NSTACK=50)
2036:       INTEGER I,INDXT,IR,ITEMP,J,JSTACK,K,L,ISTACK(NSTACK)2062:       INTEGER I,INDXT,IR,ITEMP,J,JSTACK,K,L,ISTACK(NSTACK)
2037:       DOUBLE PRECISION A2063:       DOUBLE PRECISION A
2038:       DO 11 J=1,N2064:       DO 11 J=1,N
2039:         INDX(J)=J2065:         INDX(J)=J
2040: 11    CONTINUE2066: 11    CONTINUE
2041:       JSTACK=02067:       JSTACK=0
2042:       L=12068:       L=1
2102:           ISTACK(JSTACK-1)=I2128:           ISTACK(JSTACK-1)=I
2103:           IR=J-12129:           IR=J-1
2104:         ELSE2130:         ELSE
2105:           ISTACK(JSTACK)=J-12131:           ISTACK(JSTACK)=J-1
2106:           ISTACK(JSTACK-1)=L2132:           ISTACK(JSTACK-1)=L
2107:           L=I2133:           L=I
2108:         ENDIF2134:         ENDIF
2109:       ENDIF2135:       ENDIF
2110:       GOTO 12136:       GOTO 1
2111:       END2137:       END
 2138: !  (C) Copr. 1986-92 Numerical Recipes Software 1(-V%'2150)-3.
 2139: !}}}
2112: 2140: 
2113: ! GETNCONN(NMIN,NTS,NCONN,PLUS,MINUS,NCONNMIN,NCONNMAX,DEBUG)2141: ! GETNCONN(NMIN,NTS,NCONN,PLUS,MINUS,NCONNMIN,NCONNMAX,DEBUG){{{
2114:       SUBROUTINE GETNCONN(NMIN,NTS,NCONN,PLUS,MINUS,NCONNMIN,NCONNMAX,DEBUG,TSEN)2142:       SUBROUTINE GETNCONN(NMIN,NTS,NCONN,PLUS,MINUS,NCONNMIN,NCONNMAX,DEBUG,TSEN)
 2143: !> \name GETNCONN
 2144: !>  Subroutine GETNCONN sets up array NCONN containing the number of  
 2145: !>  connections for each minimum after pruning according to the value of
 2146: !>  NCONNMIN.
2115: !     USE COMMON, ONLY: NMIN,NTS,NCONN,PLUS,MINUS,NCONNMIN,NCONNMAX,MAXMIN,DEBUG2147: !     USE COMMON, ONLY: NMIN,NTS,NCONN,PLUS,MINUS,NCONNMIN,NCONNMAX,MAXMIN,DEBUG
2116:       USE VARS, ONLY : M, TSTHRESH, TSBARTHRESH2148:       USE VARS, ONLY : M, TSTHRESH, TSBARTHRESH
2117:       IMPLICIT NONE2149:       IMPLICIT NONE
2118:       INTEGER NMIN2150:       INTEGER NMIN
2119:       INTEGER J1, PNCONNECTED, NCONNECTED, NZERO, JMAX, NCONN(NMIN), NTS, NCONNMIN, NCONNMAX, &2151:       INTEGER J1, PNCONNECTED, NCONNECTED, NZERO, JMAX, NCONN(NMIN), NTS, NCONNMIN, NCONNMAX, &
2120:      &        PLUS(NTS), MINUS(NTS)2152:      &        PLUS(NTS), MINUS(NTS)
2121:       DOUBLE PRECISION TSEN(NTS)2153:       DOUBLE PRECISION TSEN(NTS)
2122:       LOGICAL CONNECTED(NMIN), DEBUG 2154:       LOGICAL CONNECTED(NMIN), DEBUG 
2123: !  2155: !  
2124: !  Record the number of connections for each minimum in NCONN.2156: !  Record the number of connections for each minimum in NCONN.
2165:          IF (NCONN(J1).GT.NCONNMAX) THEN2197:          IF (NCONN(J1).GT.NCONNMAX) THEN
2166:             NCONNMAX=NCONN(J1)2198:             NCONNMAX=NCONN(J1)
2167:             JMAX=J12199:             JMAX=J1
2168:          ENDIF2200:          ENDIF
2169:       ENDDO2201:       ENDDO
2170: !     WRITE(*,'(4(A,I6))') 'getnconn> max connections: ',NCONNMAX,' for min ',JMAX,' # of zeros=',NZERO, &2202: !     WRITE(*,'(4(A,I6))') 'getnconn> max connections: ',NCONNMAX,' for min ',JMAX,' # of zeros=',NZERO, &
2171: !    &                     ' after removing minima with < ',NCONNMIN+12203: !    &                     ' after removing minima with < ',NCONNMIN+1
2172: 2204: 
2173:       RETURN2205:       RETURN
2174:       END2206:       END
 2207: !}}}
 2208: ! }}}


legend
Lines Added 
Lines changed
 Lines Removed

hdiff - version: 2.1.0