16 USE parameters, ONLY : solver_scheme , max_dt , t_start , t_end , &
17 dt_output , cfl, limiter , theta , reconstr_coeff , reconstr_variables , &
18 interfaces_relaxation , n_rk , batimetry_function_flag , riemann_flag
20 USE solver, ONLY : verbose_level
23 USE geometry, ONLY : x0 , xn , comp_cells
24 USE geometry, ONLY : batimetry_profile , n_batimetry_profile
25 USE init, ONLY : riemann_interface
28 USE init, ONLY : hb_l , u_l
31 USE init, ONLY : hb_r , u_r
41 CHARACTER(LEN=40) :: run_name
42 CHARACTER(LEN=40) :: bak_name
43 CHARACTER(LEN=40) :: input_file
44 CHARACTER(LEN=40) :: output_file
45 CHARACTER(LEN=40) :: restart_file
46 CHARACTER(LEN=40) :: batimetry_file
47 CHARACTER(LEN=40) :: dakota_file
49 INTEGER,
PARAMETER :: input_unit = 7
50 INTEGER,
PARAMETER :: backup_unit = 8
51 INTEGER,
PARAMETER :: output_unit = 9
52 INTEGER,
PARAMETER :: restart_unit = 10
53 INTEGER,
PARAMETER :: dakota_unit = 11
65 TYPE(bc) :: hB_bcL , u_bcL
68 TYPE(bc) :: hB_bcR , u_bcR
71 namelist / run_parameters / run_name , restart , batimetry_function_flag , &
72 riemann_flag , max_dt , t_start , t_end , dt_output , solver_scheme , &
73 cfl , limiter , theta , reconstr_coeff , reconstr_variables , n_rk , &
76 namelist / restart_parameters / restart_file
78 namelist / newrun_parameters / x0 , xn , comp_cells , riemann_interface
80 namelist / left_state / hb_l , u_l
82 namelist / right_state / hb_r , u_r
84 namelist / left_boundary_conditions / hb_bcl , u_bcl
86 namelist / right_boundary_conditions / hb_bcr , u_bcr
88 namelist / source_parameters / grav
118 batimetry_function_flag=.false.
124 solver_scheme =
'LxF'
130 limiter(1:n_vars) = 0
133 reconstr_variables = 0
141 riemann_interface = 0.5d0
170 input_file =
'shallow_water.inp'
172 INQUIRE (file=input_file,exist=lexist)
174 IF (lexist .EQV. .false.)
THEN
176 OPEN(input_unit,file=input_file,status=
'NEW')
178 WRITE(input_unit, run_parameters )
179 WRITE(input_unit, restart_parameters )
180 WRITE(input_unit, newrun_parameters )
181 WRITE(input_unit, left_state )
182 WRITE(input_unit, right_state )
183 WRITE(input_unit, left_boundary_conditions )
184 WRITE(input_unit, right_boundary_conditions )
185 WRITE(input_unit, source_parameters )
187 n_batimetry_profile = 2
189 ALLOCATE( batimetry_profile(2,n_batimetry_profile) )
191 batimetry_profile(1,1) = 0.d0
192 batimetry_profile(2,1) = 1.d0
194 batimetry_profile(2,2) = 0.d0
195 batimetry_profile(2,2) = 10.d0
198 WRITE(input_unit,*)
'''BATIMETRY_PROFILE'''
199 WRITE(input_unit,*) n_batimetry_profile
201 DO i = 1, n_batimetry_profile
203 WRITE(input_unit,108) batimetry_profile(1:2,i)
205 108
FORMAT(2(1x,e14.7))
212 WRITE(*,*)
'Input file shallow_water.inp not found'
213 WRITE(*,*)
'A new one with default values has been created'
248 CHARACTER(LEN=80) :: card
252 CHARACTER(LEN=4) :: idx_string
254 OPEN(input_unit,file=input_file,status=
'old')
258 READ(input_unit, run_parameters )
260 IF ( ( solver_scheme .NE.
'LxF' ) .AND. ( solver_scheme .NE.
'KT' ) .AND. &
261 ( solver_scheme .NE.
'GFORCE' ) )
THEN
263 WRITE(*,*)
'WARNING: no correct solver scheme selected',solver_scheme
264 WRITE(*,*)
'Chose between: LxF, GFORCE or KT'
269 IF ( ( solver_scheme.EQ.
'LxF' ) .OR. ( solver_scheme.EQ.
'GFORCE' ) )
THEN
273 ELSEIF ( solver_scheme .EQ.
'KT' )
THEN
280 IF ( ( cfl .GT. max_cfl ) .OR. ( cfl .LT. 0.d0 ) )
THEN
282 WRITE(*,*)
'WARNING: wrong value of cfl ',cfl
283 WRITE(*,*)
'Choose a value between 0.0 and ',max_cfl
289 WRITE(*,*)
'Limiters',limiter
291 IF ( ( maxval(limiter) .GT. 3 ) .OR. ( minval(limiter) .LT. 0 ) )
THEN
293 WRITE(*,*)
'WARNING: wrong limiter ',limiter
294 WRITE(*,*)
'Choose among: none, minmod,superbee,van_leer'
299 IF ( ( reconstr_coeff .GT. 1.0d0 ) .OR. ( reconstr_coeff .LT. 0.d0 ) )
THEN
301 WRITE(*,*)
'WARNING: wrong value of reconstr_coeff ',reconstr_coeff
302 WRITE(*,*)
'Change the value between 0.0 and 1.0 in the input file'
307 IF ( ( reconstr_variables .GT. 2 ) .OR. ( reconstr_variables .LT. 0 ) )
THEN
309 WRITE(*,*)
'WARNING: wrong value of reconstr_variables ',reconstr_variables
310 WRITE(*,*)
'Choose the value among: 0, 1 and 2'
318 READ(input_unit,restart_parameters)
322 READ(input_unit,newrun_parameters)
324 IF ( riemann_flag )
THEN
326 READ(input_unit,left_state)
327 READ(input_unit,right_state)
333 READ(input_unit,left_boundary_conditions)
338 READ(input_unit,right_boundary_conditions)
343 READ(input_unit, source_parameters )
347 WRITE(*,*)
'search batimetry_profile'
349 batimetry_profile_search:
DO
351 READ(input_unit,*,
END = 200 ) card
353 IF( trim(card) ==
'BATIMETRY_PROFILE' )
THEN
355 EXIT batimetry_profile_search
359 END DO batimetry_profile_search
361 READ(input_unit,*) n_batimetry_profile
363 IF ( verbose_level .GE. 1 )
WRITE(*,*)
'n_batimetry_profile' , &
366 ALLOCATE( batimetry_profile(2,n_batimetry_profile) )
368 DO i = 1, n_batimetry_profile
370 READ(input_unit,*) batimetry_profile(1:2,i)
372 IF ( verbose_level .GE. 1 )
WRITE(*,*) i,batimetry_profile(1:2,i)
383 bak_name = trim(run_name)//
'.bak'
385 OPEN(backup_unit,file=bak_name,status=
'unknown')
387 WRITE(backup_unit, run_parameters )
391 WRITE(backup_unit,restart_parameters)
395 WRITE(backup_unit,newrun_parameters)
397 IF ( riemann_flag )
THEN
399 WRITE(backup_unit,left_state)
400 WRITE(backup_unit,right_state)
406 WRITE(backup_unit,left_boundary_conditions)
407 WRITE(backup_unit,right_boundary_conditions)
409 WRITE(backup_unit, source_parameters )
411 WRITE(backup_unit,*)
'''BATIMETRY_PROFILE'''
412 WRITE(backup_unit,*) n_batimetry_profile
414 DO i = 1, n_batimetry_profile
416 WRITE(backup_unit,107) batimetry_profile(1:2,i)
418 107
FORMAT(2(1x,e14.7))
447 USE geometry , ONLY : comp_cells , x0 , dx
457 CHARACTER(LEN=30) :: string
459 OPEN(restart_unit,file=restart_file,status=
'old')
461 READ(restart_unit,1001) x0,dx,comp_cells,t_start
462 1001
FORMAT(e18.8,
' x0', /, e18.8,
' dx', /, i18,
' cells', /, e18.8,
' t', /)
476 IF ( dabs(q(i,j)) .LT. 1d-99) q(i,j) = 0.d0
480 READ(restart_unit,1003) (q(i,j), j=1,n_vars)
485 j = scan(restart_file,
'.' , .true. )
487 string = trim(restart_file(j+2:j+5))
489 READ( string,* ) output_idx
516 USE geometry , ONLY : comp_cells , x0 , dx , x_comp , b_cent
523 REAL*8,
INTENT(IN) :: t
525 CHARACTER(LEN=4) :: idx_string
532 output_idx = output_idx + 1
534 idx_string =
lettera(output_idx-1)
536 output_file = trim(run_name)//
'.q'//idx_string
538 WRITE(*,*)
'WRITING ',output_file
540 OPEN(output_unit,file=output_file,status=
'unknown',form=
'formatted')
542 WRITE(output_unit,1002) x0,dx,comp_cells,t
550 IF ( dabs(q(i,j)) .LT. 1d-99) q(i,j) = 0.d0
554 WRITE(output_unit,*) (q(i,j), i=1,n_vars)
558 WRITE(output_unit,*)
' '
559 WRITE(output_unit,*)
' '
563 output_file = trim(run_name)//
'.p'//idx_string
565 WRITE(*,*)
'WRITING ',output_file
567 OPEN(output_unit,file=output_file,status=
'unknown',form=
'formatted')
569 WRITE(output_unit,1002) x0,dx,comp_cells,t
577 IF ( dabs(q(i,j)) .LT. 1d-99) q(i,j) = 0.d0
581 CALL
qc_to_qp(q(:,j),b_cent(j),qp(:))
583 IF (
REAL(h) .LT. 1d-99) h = 0.d0
584 IF ( abs(
REAL(u)) .LT. 1d-99) u = 0.d0
587 WRITE(output_unit,1005) x_comp(j),
REAL(h) ,
REAL(u) , b_cent(j) , &
592 WRITE(output_unit,*)
' '
593 WRITE(output_unit,*)
' '
597 1002
FORMAT(e18.8,
' x0', /, e18.8,
' dx', /, i18,
' cells', /, e18.8,
' t', /)
603 t_output = t + dt_output
630 CHARACTER ones,tens,hund,thou
634 INTEGER :: iten, ione, ihund, ithou
637 ihund=int((k-(ithou*1000))/100)
638 iten=int((k-(ithou*1000)-(ihund*100))/10)
639 ione=k-ithou*1000-ihund*100-iten*10
653 dakota_file =
'shallow_water.out'
655 OPEN(dakota_unit,file=dakota_file,status=
'unknown',form=
'formatted')
subroutine read_param
Read the input file.
subroutine init_param
Initialization of the variables read from the input file.
subroutine read_solution
Read the solution from the restart unit.
character *4 function lettera(k)
Numeric to String conversion.
subroutine allocate_solver_variables
Memory allocation.
subroutine qc_to_qp(qc, B, qp)
Conservative to physical variables.
subroutine output_solution(t)
Write the solution on the output unit.
subroutine init_grid
Finite volume grid initialization.