2D AMRCLAW
Functions/Subroutines
limiter.f File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine limiter (maxm, meqn, mwaves, mbc, mx, wave, s, mthlim)
 Apply a limiter to the waves. More...
 

Function/Subroutine Documentation

◆ limiter()

subroutine limiter (   maxm,
  meqn,
  mwaves,
  mbc,
  mx,
dimension(meqn, mwaves, 1-mbc:maxm+mbc)  wave,
dimension(mwaves, 1-mbc:maxm+mbc)  s,
dimension(mwaves)  mthlim 
)

Apply a limiter to the waves.

The limiter is computed by comparing the 2-norm of each wave with the projection of the wave from the interface to the left or right onto the current wave. For a linear system this would correspond to comparing the norms of the two waves. For a nonlinear problem the eigenvectors are not colinear and so the projection is needed to provide more limiting in the case where the neighboring wave has large norm but points in a different direction in phase space.

The specific limiter used in each family is determined by the value of the corresponding element of the array mthlim, as used in the function philim. Note that a different limiter may be used in each wave family.

dotl and dotr denote the inner product of wave with the wave to the left or right. The norm of the projections onto the wave are then given by dotl/wnorm2 and dotr/wnorm2, where wnorm2 is the 2-norm of wave.

Definition at line 24 of file limiter.f.

References amr_module::mthlim, amr_module::mwaves, and philim().

24 c =====================================================
25 c
26 c
27  implicit double precision (a-h,o-z)
28  dimension mthlim(mwaves)
29  dimension wave(meqn, mwaves, 1-mbc:maxm+mbc)
30  dimension s(mwaves, 1-mbc:maxm+mbc)
31 c
32 c
33  do 50 mw=1,mwaves
34  if (mthlim(mw) .eq. 0) go to 50
35  dotr = 0.d0
36  do 40 i = 0, mx+1
37  wnorm2 = 0.d0
38  dotl = dotr
39  dotr = 0.d0
40  do 20 m=1,meqn
41  wnorm2 = wnorm2 + wave(m,mw,i)**2
42  dotr = dotr + wave(m,mw,i)*wave(m,mw,i+1)
43  20 continue
44  if (i.eq.0) go to 40
45  if (wnorm2.eq.0.d0) go to 40
46 c
47  if (s(mw,i) .gt. 0.d0) then
48  wlimitr = philim(wnorm2, dotl, mthlim(mw))
49  else
50  wlimitr = philim(wnorm2, dotr, mthlim(mw))
51  endif
52 c
53  do 30 m=1,meqn
54  wave(m,mw,i) = wlimitr * wave(m,mw,i)
55  30 continue
56  40 continue
57  50 continue
58 c
59  return
double precision function philim(a, b, meth)
Definition: philim.f:5
Here is the call graph for this function: