File: /nfs/home/0/users/jenkins/mfix.git/model/adjust_dt.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2     !                                                                      C
3     !  Module name: ADJUST_DT(IER, NIT)                                    C
4     !  Purpose: Automatically adjust time step                             C
5     !                                                                      C
6     !  Author: M. Syamlal                                 Date: FEB-10-97  C
7     !                                                                      C
8     !  Literature/Document References:                                     C
9     !                                                                      C
10     !  Variables referenced:                                               C
11     !                                                                      C
12     !  Variables modified:
13     !                                                                      C
14     !  Local variables: NONE                                               C
15     !                                                                      C
16     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
17     !
18           LOGICAL FUNCTION ADJUST_DT (IER, NIT)
19     !...Translated by Pacific-Sierra Research VAST-90 2.06G5  12:17:31  12/09/98
20     !...Switches: -xf
21     !
22     !-----------------------------------------------
23     !   M o d u l e s
24     !-----------------------------------------------
25           USE param
26           USE param1
27           USE run
28           USE output
29           USE compar
30           USE mpi_utility
31     
32           IMPLICIT NONE
33     !-----------------------------------------------
34     !   G l o b a l   P a r a m e t e r s
35     !-----------------------------------------------
36     !-----------------------------------------------
37     !   D u m m y   A r g u m e n t s
38     !-----------------------------------------------
39           INTEGER IER, NIT
40     !-----------------------------------------------
41     !   L o c a l   P a r a m e t e r s
42     !-----------------------------------------------
43           INTEGER, PARAMETER :: STEPS_MIN = 5
44     !-----------------------------------------------
45     !   L o c a l   V a r i a b l e s
46     !-----------------------------------------------
47           DOUBLE PRECISION :: NITOS_NEW
48           CHARACTER(LEN=70), DIMENSION(1) :: LINE
49     !-----------------------------------------------
50     !   E x t e r n a l   F u n c t i o n s
51     !-----------------------------------------------
52     !-----------------------------------------------
53     !
54     !
55     !//  only do this routine if the root processor
56     !//SP
57     !     if (myPE.ne.PE_IO) return
58     
59           ADJUST_DT = .FALSE.                     !No need to iterate again
60           IF (DT==UNDEFINED .OR. DT<ZERO) RETURN
61     
62           use_DT_prev = .FALSE.  ! when false use current dt to advance time.
63     
64     
65     !     Initialize
66           IF (IER == 100) THEN
67              DT_DIR = -1
68              STEPS_TOT = 0
69              NITOS = 0.
70              NIT_TOT = 0
71     
72     ! Iterate successfully converged.
73     !---------------------------------------------------------------------//
74           ELSE IF(IER == 0) THEN
75     
76     !AE TIME 041601: Set back the timestep to original size which was
77     ! halved previously for 2nd order accurate time implementation.
78              IF((CN_ON.AND.NSTEP>1 .AND. RUN_TYPE == 'NEW') .OR. &
79                 (CN_ON.AND.RUN_TYPE /= 'NEW' .AND. NSTEP >= (NSTEPRST+1))) &
80                 DT = 2.D0*DT
81     
82              IF(STEPS_TOT >= STEPS_MIN) THEN
83                 NITOS_NEW = DBLE(NIT_TOT)/(STEPS_TOT*DT)
84                 IF (NITOS_NEW > NITOS) DT_DIR = DT_DIR*(-1)
85                 STEPS_TOT = 0
86                 NITOS = NITOS_NEW
87                 NIT_TOT = 0
88                 IF (DT_DIR > 0) THEN
89                    DT = MIN(DT_MAX,DT/DT_FAC)
90                 ELSE
91                    DT = DT*DT_FAC
92                 ENDIF
93     ! in case IER = 0 and DT is modified, use DT_prev to advance time
94                use_DT_prev = .TRUE.
95                 IF (FULL_LOG.and.myPE.eq.PE_IO) &
96                    WRITE (*, *) 'DT = ', DT, '  NIT/s = ', NINT(NITOS)
97              ELSE
98                 STEPS_TOT = STEPS_TOT + 1
99                 NIT_TOT = NIT_TOT + NIT
100              ENDIF
101     ! No need to iterate again
102              ADJUST_DT = .FALSE.
103     
104     !AE TIME 041601: Cut the timestep into half for 2nd order accurate
105     ! time implementation.
106              IF((CN_ON.AND.NSTEP>1 .AND. RUN_TYPE == 'NEW') .OR. &
107                 (CN_ON.AND.RUN_TYPE /= 'NEW' .AND. NSTEP >= (NSTEPRST+1))) &
108                 DT = 0.5D0*DT
109     
110     ! Iterate failed to converge.
111     !---------------------------------------------------------------------//
112           ELSE
113     !AE TIME 041601: Set back the timestep to original size which was
114     ! halved previously for 2nd order accurate time implementation
115              IF ((CN_ON.AND.NSTEP>1.AND.RUN_TYPE == 'NEW') .OR. &
116                 (CN_ON.AND.RUN_TYPE /= 'NEW' .AND. NSTEP >= (NSTEPRST+1))) &
117                 DT = 2.D0*DT
118     
119     ! The step size has decreased to the minimum.
120              IF (DT < DT_MIN) THEN
121                 IF(AUTO_RESTART) THEN
122                    LINE(1) = 'DT < DT_MIN.  Recovery not possible! Trying Automatic Restart'
123                   ELSE
124                      LINE(1) = 'DT < DT_MIN.  Recovery not possible!'
125                   ENDIF
126                 IF (FULL_LOG.and.myPE.eq.PE_IO) WRITE (*, *) LINE(1)
127                 CALL WRITE_ERROR ('ADJUST_DT', LINE, 1)
128     !           CALL MFIX_EXIT(myPE)
129     
130     ! The time step cannot be reduced the step size is fixed.
131              ELSE IF (DT_FAC >= ONE) THEN
132                 LINE(1) = 'DT_FAC >= 1.  Recovery not possible!'
133                 IF (FULL_LOG.and.myPE.eq.PE_IO) WRITE (*, *) LINE(1)
134                 CALL WRITE_ERROR ('ADJUST_DT', LINE, 1)
135                 CALL MFIX_EXIT(myPE)
136              ELSE
137     
138     ! Reduce the step size.
139                 DT_DIR = -1
140                 STEPS_TOT = 0
141                 NITOS = 0.
142                 NIT_TOT = 0
143                 DT = DT*DT_FAC
144     
145                 IF (FULL_LOG) THEN
146                    IF(myPE.eq.PE_IO) then
147                       WRITE (*, '(12X,A,G12.5,9X,A)') &
148                          ' Dt=', DT, ' Recovered            :-)'
149                    ENDIF
150                    CALL START_LOG
151                    IF(DMP_LOG)WRITE (UNIT_LOG, '(12X,A,G12.5,9X,A)') &
152                       ' Dt=', DT, ' Recovered            :-)'
153                    CALL END_LOG
154                 ENDIF
155                 CALL RESET_NEW
156     ! Iterate again with new dt
157                 ADJUST_DT = .TRUE.
158     
159     
160     !AE TIME 041601: Cut the timestep into half for 2nd order accurate
161     ! time implementation.
162                 IF ((CN_ON.AND.NSTEP>1.AND.RUN_TYPE == 'NEW') .OR. &
163                    (CN_ON.AND.RUN_TYPE /= 'NEW' .AND. NSTEP>=(NSTEPRST+1)))&
164                      DT = 0.5D0*DT
165              ENDIF
166     
167     ! Get courant numbers and max p_star for the diverged iteration.
168     !        call get_stats(IER)
169     
170           ENDIF
171     
172     !AIKEDEBUG Get the min. Courant number displayed.
173     !      call get_stats(IER)
174     
175           ODT = ONE/DT
176     
177           call bcast (dt,root)
178           call bcast (odt,root)
179     !
180           RETURN
181           END FUNCTION ADJUST_DT
182     
183     !// Comments on the modifications for DMP version implementation
184     !// 001 Include header file and common declarations for parallelization
185     !// 400 Added mpi_utility module and other global reduction (bcast) calls
186