Nek5000
SEM for Incompressible NS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
induct.F90
Go to the documentation of this file.
1 !-----------------------------------------------------------------------
2 ! To do:
3 ! Differing BC's imposed for ophinv, incomprn, etc.
4 ! 1-shot Fast solver for Helmholtz and pressure
5 !-----------------------------------------------------------------------
7 subroutine compute_cfl(cfl,u,v,w,dt)
8  use kinds, only : dp
9  use size_m, only : nx1, ny1, nz1, nelv, lx1, ly1, lz1
10  use geom, only : rxm1, rym1, rzm1, jacmi, sxm1, sym1, szm1, txm1, tym1, tzm1
11  use input, only : if3d
12 ! use soln, only : cflf
13  use wz_m, only : zgm1
14  use mesh, only : if_ortho
15  implicit none
16 
17  real(DP) :: cfl, dt
18  real(DP) :: u(nx1,ny1,nz1,nelv),v(nx1,ny1,nz1,nelv),w(nx1,ny1,nz1,nelv)
19 
20 ! Store the inverse jacobian to speed up this operation
21  real(DP) :: dri(lx1), dsi(ly1), dti(lz1)
22 
23  integer :: e, i, j, k, l, nxyz
24  integer, save :: icalld = 0
25  real(DP) :: ur, us, ut, cflr, cfls, cflt, cflm
26  real(DP), external :: glmax
27 
28 
29  if (icalld == 0) then
30  icalld=1
31  call getdr(dri,zgm1(1,1),nx1)
32  call getdr(dsi,zgm1(1,2),ny1)
33  if (if3d) call getdr(dti,zgm1(1,3),nz1)
34  endif
35 
36  cfl = 0.
37  l = 0
38 
39  if (if3d) then
40  nxyz = nx1*ny1*nz1
41  do e=1,nelv
42  do k=1,nz1
43  do j=1,ny1
44  do i=1,nx1
45  l = l+1
46  if (if_ortho) then
47  ur = ( u(i,j,k,e)*rxm1(i,j,k,e) ) * jacmi(i,j,k,e)
48  us = ( v(i,j,k,e)*sym1(i,j,k,e) ) * jacmi(i,j,k,e)
49  ut = ( w(i,j,k,e)*tzm1(i,j,k,e) ) * jacmi(i,j,k,e)
50  else
51  ur = ( u(i,j,k,e)*rxm1(i,j,k,e) &
52  + v(i,j,k,e)*rym1(i,j,k,e) &
53  + w(i,j,k,e)*rzm1(i,j,k,e) ) * jacmi(i,j,k,e)
54  us = ( u(i,j,k,e)*sxm1(i,j,k,e) &
55  + v(i,j,k,e)*sym1(i,j,k,e) &
56  + w(i,j,k,e)*szm1(i,j,k,e) ) * jacmi(i,j,k,e)
57  ut = ( u(i,j,k,e)*txm1(i,j,k,e) &
58  + v(i,j,k,e)*tym1(i,j,k,e) &
59  + w(i,j,k,e)*tzm1(i,j,k,e) ) * jacmi(i,j,k,e)
60  endif
61  cflr = abs(dt*ur*dri(i))
62  cfls = abs(dt*us*dsi(j))
63  cflt = abs(dt*ut*dti(k))
64 
65  cflm = cflr + cfls + cflt
66  cfl = max(cfl,cflm)
67 
68 !max cflf(i,j,k,e) = cflm
69 
70  enddo
71  enddo
72  enddo
73  enddo
74  else
75 #if 0
76  nxyz = nx1*ny1
77  do e=1,nelv
78  do j=1,ny1
79  do i=1,nx1
80  l = l+1
81  ur = ( u(i,j,1,e)*rxm1(i,j,1,e) &
82  + v(i,j,1,e)*rym1(i,j,1,e) ) * jacmi(l,1)
83  us = ( u(i,j,1,e)*sxm1(i,j,1,e) &
84  + v(i,j,1,e)*sym1(i,j,1,e) ) * jacmi(l,1)
85 
86  cflr = abs(dt*ur*dri(i))
87  cfls = abs(dt*us*dsi(j))
88 
89  cflm = cflr + cfls
90  cfl = max(cfl,cflm)
91 
92 !max cflf(i,j,1,e) = cflm
93 
94  enddo
95  enddo
96  enddo
97 #endif
98  endif
99 
100  cfl = glmax(cfl,1)
101 
102  return
103  end subroutine compute_cfl
104 
105 !-----------------------------------------------------------------------
106 subroutine getdr(dri,zgm1,nx1)
107  use kinds, only : dp
108  implicit none
109  integer :: nx1
110  real(DP) :: dri(nx1),zgm1(nx1)
111 
112  integer :: i
113 
114  dri(1) = zgm1(2) - zgm1(1) ! Compute 1/Dx
115  do i=2,nx1-1
116  dri(i) = 0.5*( zgm1(i+1) - zgm1(i-1) )
117  enddo
118  dri(nx1) = zgm1(nx1) - zgm1(nx1-1)
119 
120  dri = 1._dp / dri
121 
122  return
123 end subroutine getdr
124 
125 !-----------------------------------------------------------------------
127 ! at current time step.
128 subroutine set_dealias_rx
129  use kinds, only : dp
130  use size_m, only : nx1, ny1, nz1, nxd, nyd, nzd, lxd, nelv, ldim
131  use geom, only : ifgeom, rx
132  use geom, only : rxm1, rym1, rzm1, sxm1, sym1, szm1, txm1, tym1, tzm1
133  use input, only : if3d
134  use tstep , only : istep
135  use speclib, only : zwgl
136  use mesh, only : if_ortho
137  use interp, only : jgl, jgt
138  use interp, only : get_int_ptr
139  implicit none
140 
141  real(DP) :: zd(lxd),wd(lxd)
142  integer :: e, i, j, k, l, ii
143  integer :: nxyz1, nxyzd
144  real(DP) :: w
145 
146  real(DP) :: w2((2*lxd)**ldim,2)
147  integer, parameter :: ldw = 2*(2*lxd)**ldim
148  integer :: iptr
149 
150  integer, save :: ilstep = -1
151 
152  if ( .NOT. ifgeom .AND. ilstep > 1) return ! already computed
153  if (ifgeom .AND. ilstep == istep) return ! already computed
154  ilstep = istep
155 
156  nxyz1 = nx1*ny1*nz1
157  nxyzd = nxd*nyd*nzd
158 
159  call zwgl(zd,wd,nxd) ! zwgl -- NOT zwgll!
160 
161  call get_int_ptr(iptr, nx1, nxd)
162 
163 
164  if (if3d) then
165 
166  do e=1,nelv
167 
168  ! Interpolate z+ and z- into fine mesh, translate to r-s-t coords
169  if (if_ortho) then
170 #if 1
171  call specmpn(rx(1,1,e),nxd,rxm1(1,1,1,e),nx1,jgl(iptr),jgt(iptr),if3d,w2,ldw)
172  call specmpn(rx(1,2,e),nxd,sym1(1,1,1,e),nx1,jgl(iptr),jgt(iptr),if3d,w2,ldw)
173  call specmpn(rx(1,3,e),nxd,tzm1(1,1,1,e),nx1,jgl(iptr),jgt(iptr),if3d,w2,ldw)
174 #else
175  call intp_rstd(rx(1,1,e),rxm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
176  call intp_rstd(rx(1,2,e),sym1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
177  call intp_rstd(rx(1,3,e),tzm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
178 #endif
179  else
180 #if 0
181  call intp_rstd(rx(1,1,e),rxm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
182  call intp_rstd(rx(1,2,e),rym1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
183  call intp_rstd(rx(1,3,e),rzm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
184  call intp_rstd(rx(1,4,e),sxm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
185  call intp_rstd(rx(1,5,e),sym1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
186  call intp_rstd(rx(1,6,e),szm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
187  call intp_rstd(rx(1,7,e),txm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
188  call intp_rstd(rx(1,8,e),tym1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
189  call intp_rstd(rx(1,9,e),tzm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
190 #endif
191  endif
192 
193  l = 0
194  do k=1,nzd
195  do j=1,nyd
196  do i=1,nxd
197  l = l+1
198  w = wd(i)*wd(j)*wd(k)
199  rx(l,:,e) = w*rx(l,:,e)
200  enddo
201  enddo
202  enddo
203  enddo
204 
205  else ! 2D
206 #if 0
207  do e=1,nelv
208 
209  ! Interpolate z+ and z- into fine mesh, translate to r-s-t coords
210 
211  call intp_rstd(rx(1,1,e),rxm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
212  call intp_rstd(rx(1,2,e),rym1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
213  call intp_rstd(rx(1,3,e),sxm1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
214  call intp_rstd(rx(1,4,e),sym1(1,1,1,e),nx1,nxd,if3d,0) ! 0 --> fwd
215 
216  l = 0
217  do j=1,nyd
218  do i=1,nxd
219  l = l+1
220  w = wd(i)*wd(j)
221  do ii=1,4
222  rx(l,ii,e) = w*rx(l,ii,e)
223  enddo
224  enddo
225  enddo
226  enddo
227 #endif
228  endif
229 
230  return
231 end subroutine set_dealias_rx
232 !-----------------------------------------------------------------------
subroutine compute_cfl(cfl, u, v, w, dt)
Given velocity field (u,v,w) and dt, compute current CFL number.
Definition: induct.F90:7
cleaned
Definition: tstep_mod.F90:2
Input parameters from preprocessors.
Definition: input_mod.F90:11
Module containing memoized interpolation matrices.
Definition: interp_mod.F90:5
cleaned
Definition: wz_mod.F90:2
subroutine get_int_ptr(ip, mx, md)
Get pointer to jgl() for interpolation pair (mx,md)
Definition: interp_mod.F90:32
subroutine set_dealias_rx
Eulerian scheme, add convection term to forcing function.
Definition: induct.F90:128
cleaned
Definition: mesh_mod.F90:2
subroutine getdr(dri, zgm1, nx1)
Definition: induct.F90:106
Geometry arrays.
Definition: geom_mod.F90:2
subroutine, public zwgl(Z, W, NP)
Generate NP Gauss Legendre points (Z) and weights (W) associated with Jacobi polynomial P(N)(alpha=0...
Definition: speclib.F90:77