LAHARS-MODEL  0.1
templategithubproject
IMEX_Sflow_2d.f90
Go to the documentation of this file.
1 !********************************************************************************
26 !********************************************************************************
27 
30 
32 
33  USE geometry_2d, ONLY : init_grid
34 
35  USE geometry_2d, ONLY : dx,dy,b_cent,cell_size
36 
38 
39  USE inpout_2d, ONLY : init_param
40  USE inpout_2d, ONLY : read_param
41  USE inpout_2d, ONLY : update_param
42  USE inpout_2d, ONLY : output_solution
43  USE inpout_2d, ONLY : output_runout
44  USE inpout_2d, ONLY : read_solution
45  USE inpout_2d, ONLY : close_units
46 
47  USE inpout_2d, ONLY : output_runout_flag
48 
49 
52  USE solver_2d, ONLY : imex_rk_solver
54  USE solver_2d, ONLY : timestep, timestep2
55  ! USE solver_2d, ONLY : check_solve
56 
57  USE inpout_2d, ONLY : restart
58 
59  USE parameters_2d, ONLY : t_start
60  USE parameters_2d, ONLY : t_end
61  USE parameters_2d, ONLY : t_output
62  USE parameters_2d, ONLY : t_runout
63  USE parameters_2d, ONLY : t_steady
64  USE parameters_2d, ONLY : dt0
65  USE parameters_2d, ONLY : riemann_flag
66  USE parameters_2d, ONLY : verbose_level
68 
69 
70  USE solver_2d, ONLY : q , dt
71  USE solver_2d, ONLY : q1max
72 
73  ! USE solver_2d, ONLY : solve_mask
74 
75  IMPLICIT NONE
76 
77  REAL*8 :: t
78  REAL*8 :: t1 , t2
79  REAL*8 :: dt_old , dt_old_old
80  LOGICAL :: stop_flag
81  LOGICAL :: stop_flag_old
82 
83  CALL cpu_time(t1)
84 
85  CALL init_param
86 
87  CALL read_param
88 
89  CALL init_grid
90 
92 
93  CALL allocate_solver_variables
94 
95  IF ( restart ) THEN
96 
97  CALL read_solution
98 
99  ELSE
100 
101  IF( riemann_flag .EQV. .true. )THEN
102 
103  ! riemann problem defined in file.inp
104  CALL riemann_problem
105 
106  ELSE
107 
108  ! generic problem defined by initial conditions function (in init_2d.f90)
109  CALL initial_conditions
110 
111  ENDIF
112 
113  END IF
114 
115  t = t_start
116 
117  WRITE(*,*)
118  WRITE(*,*) '******** START COMPUTATION *********'
119  WRITE(*,*)
120 
121  IF ( verbose_level .GE. 1 ) THEN
122 
123  WRITE(*,*) 'Min q(1,:,:)=',minval(q(1,:,:))
124  WRITE(*,*) 'Max q(1,:,:)=',maxval(q(1,:,:))
125 
126  WRITE(*,*) 'Min B(:,:)=',minval(b_cent(:,:))
127  WRITE(*,*) 'Max B(:,:)=',maxval(b_cent(:,:))
128 
129 
130  WRITE(*,*) 'size B_cent',size(b_cent,1),size(b_cent,2)
131 
132  WRITE(*,*) 'SUM(q(1,:,:)=',sum(q(1,:,:))
133  WRITE(*,*) 'SUM(B_cent(:,:)=',sum(b_cent(:,:))
134 
135  END IF
136 
137  q1max(:,:) = q(1,:,:)
138 
139  dt_old = dt0
140  dt_old_old = dt_old
141  t_steady = t_end
142  stop_flag = .false.
143 
144 
145  IF ( output_runout_flag ) CALL output_runout(t,stop_flag)
146 
147  CALL output_solution(t)
148 
149  IF ( sum(q(1,:,:)) .EQ. 0.d0 ) t_steady = t_output
150 
151  IF ( solid_transport_flag ) THEN
152 
153  WRITE(*,fmt="(A3,F10.4,A5,F9.5,A15,ES12.3E3,A15,ES12.3E3,A15,ES12.3E3)") &
154  't =',t,'dt =',dt0, &
155  ' total volume = ',dx*dy*sum(q(1,:,:)) , &
156  ' total area = ',dx*dy*count(q(1,:,:).GT.1.d-5) , &
157  ' total sediment fraction = ',dx*dy*sum(q(4,:,:))
158 
159  ELSE
160 
161  WRITE(*,fmt="(A3,F10.4,A5,F9.5,A15,ES12.3E3,A15,ES12.3E3)") &
162  't =',t,'dt =',dt0, &
163  ' total volume = ',dx*dy*sum(q(1,:,:)) , &
164  ' total area = ',dx*dy*count(q(1,:,:).GT.1.d-5)
165 
166  END IF
167 
168  DO WHILE ( ( t .LT. t_end ) .AND. ( t .LT. t_steady ) )
169 
170  CALL update_param
171 
172  ! CALL check_solve
173  ! WRITE(*,*) 'cells to solve:',COUNT(solve_mask)
174 
175 
176  ! CALL timestep
177 
178  CALL timestep2
179 
180  IF ( t+dt .GT. t_end ) dt = t_end - t
181  IF ( t+dt .GT. t_output ) dt = t_output - t
182 
183  IF ( output_runout_flag ) THEN
184 
185  IF ( t+dt .GT. t_runout ) dt = t_runout - t
186 
187  END IF
188 
189  dt = min(dt,1.1d0*0.5d0*(dt_old+dt_old_old))
190 
191  dt_old_old = dt_old
192  dt_old = dt
193 
194  CALL imex_rk_solver
195 
196  IF ( solid_transport_flag ) THEN
197 
198  CALL update_erosion_deposition_ver(dt)
199 
200  END IF
201 
202  q1max(:,:) = max( q1max(:,:) , q(1,:,:) )
203 
204  t = t+dt
205 
206  IF ( solid_transport_flag ) THEN
207 
208  WRITE(*,fmt="(A3,F10.4,A5,F9.5,A15,ES12.3E3,A15,ES12.3E3,A15,ES12.3E3)")&
209  't =',t,'dt =',dt, &
210  ' total volume = ',dx*dy*sum(q(1,:,:)) , &
211  ' total area = ',dx*dy*count(q(1,:,:).GT.1.d-7) , &
212  ' total sediment fraction = ',dx*dy*sum(q(4,:,:))
213 
214  ELSE
215 
216  WRITE(*,fmt="(A3,F10.4,A5,F9.5,A15,ES12.3E3,A15,ES12.3E3)") &
217  't =',t,'dt =',dt, &
218  ' total volume = ',dx*dy*sum(q(1,:,:)) , &
219  ' total area = ',dx*dy*count(q(1,:,:).GT.1.d-7)
220 
221  END IF
222 
223  IF ( output_runout_flag ) THEN
224 
225  IF ( ( t .GE. t_runout ) .OR. ( t .GE. t_steady ) ) THEN
226 
227  stop_flag_old = stop_flag
228 
229  IF ( output_runout_flag ) CALL output_runout(t,stop_flag)
230 
231  IF ( ( stop_flag ) .AND. (.NOT.stop_flag_old) ) THEN
232 
233  t_steady = min(t_end,t_output)
234  t_runout = t_steady
235 
236  END IF
237 
238  END IF
239 
240  END IF
241 
242  IF ( ( t .GE. t_output ) .OR. ( t .GE. t_end ) ) THEN
243 
244  CALL output_solution(t)
245 
246  END IF
247 
248  END DO
249 
250  CALL deallocate_solver_variables
251 
252  CALL close_units
253 
254  CALL cpu_time(t2)
255 
256  WRITE(*,*) 'Time taken by the code was',t2-t1,'seconds'
257 
258 END PROGRAM imex_sflow_2d
259 
real *8 dy
Control volumes size.
Definition: geometry_2d.f90:71
real *8 t_steady
end time when reached steady solution
real *8, dimension(:,:), allocatable b_cent
Topography at the centers of the control volumes.
Definition: geometry_2d.f90:47
subroutine read_solution
Read the solution from the restart unit.
Definition: inpout_2d.f90:2480
Parameters.
real *8 dx
Control volumes size.
Definition: geometry_2d.f90:68
real *8 t_end
end time for the run
Numerical solver.
Definition: solver_2d.f90:12
subroutine deallocate_solver_variables
Memory deallocation.
Definition: solver_2d.f90:370
Input/Output module.
Definition: inpout_2d.f90:13
Initial solution.
Definition: init_2d.f90:8
subroutine update_param
Read the input file.
Definition: inpout_2d.f90:2374
real *8 dt
Time step.
Definition: solver_2d.f90:83
subroutine initial_conditions
Problem initialization.
Definition: init_2d.f90:200
real *8 dt0
Initial time step.
Constitutive equations.
subroutine update_erosion_deposition_ver(dt)
Evaluate the averaged explicit terms.
Definition: solver_2d.f90:1745
program imex_sflow_2d
Main Program.
subroutine init_grid
Finite volume grid initialization.
Definition: geometry_2d.f90:92
logical restart
Flag to start a run from a previous output: .
Definition: inpout_2d.f90:100
subroutine output_runout(time, stop_flag)
Write runout on file.
Definition: inpout_2d.f90:3321
subroutine output_solution(time)
Write the solution on the output unit.
Definition: inpout_2d.f90:2873
subroutine init_problem_param
Initialization of relaxation flags.
Grid module.
Definition: geometry_2d.f90:7
real *8 cell_size
Definition: geometry_2d.f90:80
subroutine timestep2
Time-step computation.
Definition: solver_2d.f90:564
logical riemann_flag
Flag to choose the sort of problem to solve.
real *8 t_output
time of the next output
subroutine read_param
Read the input file.
Definition: inpout_2d.f90:567
integer verbose_level
subroutine timestep
Time-step computation.
Definition: solver_2d.f90:487
subroutine close_units
Definition: inpout_2d.f90:3216
real *8 t_runout
time of the next runout output
subroutine riemann_problem
Riemann problem initialization.
Definition: init_2d.f90:49
subroutine init_param
Initialization of the variables read from the input file.
Definition: inpout_2d.f90:225
subroutine imex_rk_solver
Runge-Kutta integration.
Definition: solver_2d.f90:634
real *8, dimension(:,:), allocatable q1max
Maximum over time of thickness.
Definition: solver_2d.f90:60
logical solid_transport_flag
Flag to choose if we model solid phase transport.
subroutine allocate_solver_variables
Memory allocation.
Definition: solver_2d.f90:166
logical output_runout_flag
Flag to save the max runout at ouput times.
Definition: inpout_2d.f90:124
real *8 t_start
initial time for the run
real *8, dimension(:,:,:), allocatable q
Conservative variables.
Definition: solver_2d.f90:35