IMEXSfloW  1.0
templategithubproject
 All Classes Files Functions Variables Pages
constitutive.f90
Go to the documentation of this file.
1 !********************************************************************************
3 !********************************************************************************
5 
6  USE parameters, ONLY : n_eqns , n_vars
7 
8  IMPLICIT none
9 
10  LOGICAL, ALLOCATABLE :: implicit_flag(:)
11 
12  CHARACTER(LEN=20) :: phase1_name
13  CHARACTER(LEN=20) :: phase2_name
14 
15  !--------- Constants for the equations of state -----------------------------
16 
17 
18  COMPLEX*16 :: h
19  COMPLEX*16 :: u
20 
21 
22  REAL*8 :: grav
23 
24 CONTAINS
25 
26  !******************************************************************************
28  !
32  !******************************************************************************
33 
34  SUBROUTINE init_problem_param
35 
36  USE parameters, ONLY : n_nh
37 
38  ALLOCATE( implicit_flag(n_eqns) )
39 
40  implicit_flag(1:n_eqns) = .false.
41  implicit_flag(2) = .true.
42 
43  n_nh = count( implicit_flag )
44 
45  END SUBROUTINE init_problem_param
46 
47  !******************************************************************************
49  !
56  !******************************************************************************
57 
58  SUBROUTINE phys_var(Bj,r_qj,c_qj)
59 
60  USE complexify
61  USE parameters, ONLY : eps_sing
62  IMPLICIT none
63 
64  REAL*8, INTENT(IN) :: bj
65  REAL*8, INTENT(IN), OPTIONAL :: r_qj(n_vars)
66  COMPLEX*16, INTENT(IN), OPTIONAL :: c_qj(n_vars)
67 
68  COMPLEX*16 :: qj(n_vars)
69 
70  IF ( present(c_qj) ) THEN
71 
72  qj = c_qj
73 
74  ELSE
75 
76  qj = dcmplx(r_qj)
77 
78  END IF
79 
80  h = qj(1) - dcmplx( bj , 0.d0 )
81 
82 
83  ! Correction for small values of h (Eq. 2.17 K&P 2007)
84  IF ( REAL( h ) .GT. eps_sing ** 0.25d0 ) then
85 
86  u = qj(2) / h
87 
88  ELSE
89 
90  u = dsqrt(2.d0) * h * qj(2) / cdsqrt( h**4 + dcmplx(eps_sing,0.d0) )
91 
92  END IF
93 
94  END SUBROUTINE phys_var
95 
96  !******************************************************************************
98  !
103  !******************************************************************************
104 
105  SUBROUTINE eval_local_speeds(qj,Bj,vel_min,vel_max)
106 
107  IMPLICIT none
108 
109  REAL*8, INTENT(IN) :: qj(n_vars)
110  REAL*8, INTENT(IN) :: bj
111  REAL*8, INTENT(OUT) :: vel_min(n_vars) , vel_max(n_vars)
112 
113  REAL*8 :: h_temp , u_temp
114 
115  CALL phys_var(bj,r_qj = qj)
116 
117  vel_min(1:n_eqns) = REAL(u) - dsqrt( grav * REAL(h) )
118  vel_max(1:n_eqns) = REAL(u) + dsqrt( grav * REAL(h) )
119 
120  END SUBROUTINE eval_local_speeds
121  !******************************************************************************
123  !
127  !******************************************************************************
128 
129  SUBROUTINE eval_local_speeds2(qj,Bj,vel_min,vel_max)
130 
131  IMPLICIT none
132 
133  REAL*8, INTENT(IN) :: qj(n_vars)
134  REAL*8, INTENT(IN) :: bj
135  REAL*8, INTENT(OUT) :: vel_min(n_vars) , vel_max(n_vars)
136 
137  REAL*8 :: h_temp , u_temp
138 
139  h_temp = qj(1) - bj
140 
141  IF ( h_temp .NE. 0.d0 ) THEN
142 
143  u_temp = qj(2) / h_temp
144 
145  ELSE
146 
147  u_temp = 0.d0
148 
149  END IF
150 
151  vel_min(1:n_eqns) = REAL(u_temp) - dsqrt( grav * REAL(h_temp) )
152  vel_max(1:n_eqns) = REAL(u_temp) + dsqrt( grav * REAL(h_temp) )
153 
154 
155  END SUBROUTINE eval_local_speeds2
156 
157 
158 
159  !******************************************************************************
161  !
175  !******************************************************************************
176 
177  SUBROUTINE qc_to_qp(qc,B,qp)
178 
179  IMPLICIT none
180 
181  REAL*8, INTENT(IN) :: qc(n_vars)
182  REAL*8, INTENT(IN) :: b
183  REAL*8, INTENT(OUT) :: qp(n_vars)
184 
185  CALL phys_var(b,r_qj = qc)
186 
187  qp(1) = REAL(h+b)
188  qp(2) = REAL(u)
189 
190 
191  END SUBROUTINE qc_to_qp
192 
193  !******************************************************************************
195  !
204  !******************************************************************************
205 
206  SUBROUTINE qp_to_qc(qp,B,qc)
207 
208  USE complexify
209  IMPLICIT none
210 
211  REAL*8, INTENT(IN) :: qp(n_vars)
212  REAL*8, INTENT(IN) :: b
213  REAL*8, INTENT(OUT) :: qc(n_vars)
214 
215  REAL*8 :: r_hb !> batimetry + height
216  REAL*8 :: r_u !> velocity
217 
218  r_hb = qp(1)
219  r_u = qp(2)
220 
221  qc(1) = r_hb
222  qc(2) = ( r_hb - b ) * r_u
223 
224  END SUBROUTINE qp_to_qc
225 
226  !******************************************************************************
228  !
239  !******************************************************************************
240 
241  SUBROUTINE qc_to_qp2(qc,B,qp)
242 
243  IMPLICIT none
244 
245  REAL*8, INTENT(IN) :: qc(n_vars)
246  REAL*8, INTENT(IN) :: b
247  REAL*8, INTENT(OUT) :: qp(n_vars)
248 
249  CALL phys_var(b,r_qj = qc)
250 
251  qp(1) = REAL(h)
252  qp(2) = REAL(u)
253 
254 
255  END SUBROUTINE qc_to_qp2
256 
257 
258  !******************************************************************************
260  !
269  !******************************************************************************
270 
271  SUBROUTINE qp2_to_qc(qp,B,qc)
272 
273  USE complexify
274  IMPLICIT none
275 
276  REAL*8, INTENT(IN) :: qp(n_vars)
277  REAL*8, INTENT(IN) :: b
278  REAL*8, INTENT(OUT) :: qc(n_vars)
279 
280  REAL*8 :: r_h !> batimetry + height
281  REAL*8 :: r_u !> velocity
282 
283  r_h = qp(1)
284  r_u = qp(2)
285 
286  qc(1) = r_h + b
287  qc(2) = r_h * r_u
288 
289  END SUBROUTINE qp2_to_qc
290 
291  !******************************************************************************
293  !
302  !******************************************************************************
303 
304  SUBROUTINE eval_fluxes(Bj,c_qj,r_qj,c_flux,r_flux)
305 
306  USE complexify
307  IMPLICIT none
308 
309  REAL*8, INTENT(IN) :: bj
310  COMPLEX*16, INTENT(IN), OPTIONAL :: c_qj(n_vars)
311  COMPLEX*16, INTENT(OUT), OPTIONAL :: c_flux(n_eqns)
312  REAL*8, INTENT(IN), OPTIONAL :: r_qj(n_vars)
313  REAL*8, INTENT(OUT), OPTIONAL :: r_flux(n_eqns)
314 
315  COMPLEX*16 :: qj(n_vars)
316  COMPLEX*16 :: flux(n_eqns)
317 
318  INTEGER :: i
319 
320  IF ( present(c_qj) .AND. present(c_flux) ) THEN
321 
322  qj = c_qj
323 
324  ELSEIF ( present(r_qj) .AND. present(r_flux) ) THEN
325 
326  DO i = 1,n_vars
327 
328  qj(i) = dcmplx( r_qj(i) )
329 
330  END DO
331 
332  ELSE
333 
334  WRITE(*,*) 'Constitutive, eval_fluxes: problem with arguments'
335  stop
336 
337  END IF
338 
339  flux(1) = qj(2)
340 
341  ! check if h is small
342  IF((qj(1)-bj).GT.10.d0**(-8))THEN
343 
344  flux(2) = qj(2)**2.d0 / ( qj(1) - bj ) + 0.5d0 * grav * ( qj(1) - bj ) ** 2.d0
345 
346  ELSE
347 
348  flux(2) = 0.d0
349 
350  ENDIF
351 
352  IF ( present(c_qj) .AND. present(c_flux) ) THEN
353 
354  c_flux = flux
355 
356  ELSEIF ( present(r_qj) .AND. present(r_flux) ) THEN
357 
358  r_flux = REAL( flux )
359 
360  END IF
361 
362  END SUBROUTINE eval_fluxes
363 
364  !******************************************************************************
366  !
376  !******************************************************************************
377 
378  SUBROUTINE eval_nonhyperbolic_terms( Bj , Bprimej , c_qj , c_nh_term_impl , &
379  r_qj , r_nh_term_impl )
380 
381  USE complexify
382  IMPLICIT NONE
383 
384  REAL*8, INTENT(IN) :: bj
385  REAL*8, INTENT(IN) :: bprimej
386 
387  COMPLEX*16, INTENT(IN), OPTIONAL :: c_qj(n_vars)
388  COMPLEX*16, INTENT(OUT), OPTIONAL :: c_nh_term_impl(n_eqns)
389  REAL*8, INTENT(IN), OPTIONAL :: r_qj(n_vars)
390  REAL*8, INTENT(OUT), OPTIONAL :: r_nh_term_impl(n_eqns)
391 
392  COMPLEX*16 :: qj(n_vars)
393 
394  COMPLEX*16 :: nh_term(n_eqns)
395 
396  COMPLEX*16 :: relaxation_term(n_eqns)
397  COMPLEX*16 :: heat , drag
398  COMPLEX*16 :: vel_term
399 
400  COMPLEX*16 :: forces_term(n_eqns)
401 
402  INTEGER :: i
403 
404  IF ( present(c_qj) .AND. present(c_nh_term_impl) ) THEN
405 
406  qj = c_qj
407 
408  ELSEIF ( present(r_qj) .AND. present(r_nh_term_impl) ) THEN
409 
410  DO i = 1,n_vars
411 
412  qj(i) = dcmplx( r_qj(i) )
413 
414  END DO
415 
416  ELSE
417 
418  WRITE(*,*) 'Constitutive, eval_fluxes: problem with arguments'
419  stop
420 
421  END IF
422 
423  ! initialize and evaluate the relaxation terms
424  relaxation_term(1:n_eqns) = dcmplx(0.d0)
425 
426  ! initialize and evaluate the forces terms
427  forces_term(1:n_eqns) = dcmplx(0.d0)
428 
429  nh_term = relaxation_term + forces_term
430 
431  IF ( present(c_qj) .AND. present(c_nh_term_impl) ) THEN
432 
433  c_nh_term_impl = nh_term
434 
435  ELSEIF ( present(r_qj) .AND. present(r_nh_term_impl) ) THEN
436 
437  r_nh_term_impl = REAL( nh_term )
438 
439  END IF
440 
441  END SUBROUTINE eval_nonhyperbolic_terms
442 
443  !******************************************************************************
445  !
451  !******************************************************************************
452 
453  SUBROUTINE eval_explicit_forces( Bj , Bprimej , qj , expl_forces_term )
454 
455  IMPLICIT NONE
456 
457  REAL*8, INTENT(IN) :: bj
458  REAL*8, INTENT(IN) :: bprimej
459 
460  REAL*8, INTENT(IN) :: qj(n_eqns)
461  REAL*8, INTENT(OUT) :: expl_forces_term(n_eqns)
462 
463  expl_forces_term(1:n_eqns) = 0.d0
464 
465  CALL phys_var(bj,r_qj = qj)
466 
467  expl_forces_term(2) = grav * h * bprimej
468 
469  ! friction term
470  expl_forces_term(2) = expl_forces_term(2) + ( 0.001 / (1.d0+10.d0*h) ) * u
471 
472  END SUBROUTINE eval_explicit_forces
473 
474 END MODULE constitutive
475 
476 
subroutine qc_to_qp2(qc, B, qp)
Conservative to 2nd set of physical variables.
subroutine init_problem_param
Initialization of relaxation flags.
subroutine eval_explicit_forces(Bj, Bprimej, qj, expl_forces_term)
Explicit Forces term.
subroutine qp2_to_qc(qp, B, qc)
From 2nd set of physical to conservative variables.
subroutine qp_to_qc(qp, B, qc)
Physical to conservative variables.
subroutine eval_fluxes(Bj, c_qj, r_qj, c_flux, r_flux)
Hyperbolic Fluxes.
Parameters.
Definition: parameters.f90:7
Constitutive equations.
Definition: constitutive.f90:4
subroutine qc_to_qp(qc, B, qp)
Conservative to physical variables.
subroutine eval_local_speeds2(qj, Bj, vel_min, vel_max)
Local Characteristic speeds.
subroutine eval_nonhyperbolic_terms(Bj, Bprimej, c_qj, c_nh_term_impl, r_qj, r_nh_term_impl)
Non-Hyperbolic terms.
subroutine phys_var(Bj, r_qj, c_qj)
Physical variables.
subroutine eval_local_speeds(qj, Bj, vel_min, vel_max)
Local Characteristic speeds.