/[MITgcm]/MITgcm/eesupp/src/different_multiple.F
ViewVC logotype

Diff of /MITgcm/eesupp/src/different_multiple.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.7 by jmc, Wed Apr 6 19:49:02 2005 UTC revision 1.8 by jmc, Sun May 15 02:58:40 2005 UTC
# Line 1  Line 1 
1  C     $Header$  C $Header$
2  C $Name$  C $Name$
3    
4  #include "CPP_EEOPTIONS.h"  #include "CPP_EEOPTIONS.h"
5    
6  CBOP  CBOP
7  C     !ROUTINE: DIFFERENT_MULTIPLE  C     !ROUTINE: DIFFERENT_MULTIPLE
8    
9  C     !INTERFACE:  C     !INTERFACE:
10        LOGICAL FUNCTION DIFFERENT_MULTIPLE( freq, val1, val2 )        LOGICAL FUNCTION DIFFERENT_MULTIPLE( freq, val1, step )
11        IMPLICIT NONE        IMPLICIT NONE
12    
13  C     !DESCRIPTION:  C     !DESCRIPTION:
14  C     *==========================================================*  C     *==========================================================*
15  C     | LOGICAL FUNCTION DIFFERENT\_MULTIPLE                        C     | LOGICAL FUNCTION DIFFERENT\_MULTIPLE                      
16  C     | o Checks two numbers multiple of a third number.            C     | o Checks if a multiple of freq exist
17    C     |   around val1 +/- step/2
18  C     *==========================================================*  C     *==========================================================*
19  C     | This routine is used for diagnostic and other periodic      C     | This routine is used for diagnostic and other periodic    
20  C     | operations. It is very sensitive to arithmetic precision.  C     | operations. It is very sensitive to arithmetic precision.
# Line 24  C     *================================= Line 26  C     *=================================
26    
27  C     !INPUT PARAMETERS:  C     !INPUT PARAMETERS:
28  C     == Routine arguments ==  C     == Routine arguments ==
29  C     val1, val2 :: Two times that are checked  C     freq       :: Frequency by which time is divided.
30  C     freq       :: Frequency by which times are divided.  C     val1       :: time that is checked
31        _RL  freq, val1, val2  C     step       :: length of time interval (around val1) that is checked
32          _RL  freq, val1, step
33    
34    C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
35    
36  C     !LOCAL VARIABLES:  C     !LOCAL VARIABLES:
37  C     == Local variables ==  C     == Local variables ==
 C     f              :: Temp. for holding freq  
38  C     v1, v2, v3, v4 :: Temp. for holding time  C     v1, v2, v3, v4 :: Temp. for holding time
39  C     d1, d2, d3     :: Temp. for hold difference  C     d1, d2, d3     :: Temp. for hold difference
40  C     step           :: Temp. for hold difference used as increment        _RL  v1, v2, v3, v4, d1, d2, d3
       _RL  f, v1, v2, v3, v4, d1, d2, d3, step  
41  CEOP  CEOP
42    
43  C     o Do easy cases first.  C     o Do easy cases first.
44        DIFFERENT_MULTIPLE = .FALSE.        DIFFERENT_MULTIPLE = .FALSE.
45    
46        IF ( freq .NE. 0. ) THEN        IF ( freq .NE. 0. ) THEN
47          IF ( ABS(val1-val2) .GT. freq ) THEN          IF ( ABS(step) .GT. freq ) THEN
48           DIFFERENT_MULTIPLE = .TRUE.           DIFFERENT_MULTIPLE = .TRUE.
49          ELSE          ELSE
50    
51  C         o This case is more complex because of round-off error  C         o This case is more complex because of round-off error
           f = freq  
52            v1 = val1            v1 = val1
53            v2 = val2            v2 = val1 - step
54            step = v1-v2            v3 = val1 + step
55    
56  C         Test v1 to see if its a "closest multiple"  C         Test v1 to see if its a "closest multiple"
57            v3 = v1 + step            v4 = NINT(v1/freq)*freq
           v4 = NINT(v1/f)*f  
58            d1 = v1-v4            d1 = v1-v4
59            d2 = v2-v4            d2 = v2-v4
60            d3 = v3-v4            d3 = v3-v4
61            IF ( ABS(d1) .LE. ABS(d2) .AND. ABS(d1) .LE. ABS(d3) )            IF ( ABS(d1) .LE. ABS(d2) .AND. ABS(d1) .LE. ABS(d3) )
62       &        DIFFERENT_MULTIPLE = .TRUE.       &        DIFFERENT_MULTIPLE = .TRUE.
63    
64          ENDIF ! |val1-val2| > freq          ENDIF
65        ENDIF ! freq != 0        ENDIF
66    
67          RETURN
68        END        END

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.8

  ViewVC Help
Powered by ViewVC 1.1.22