MPI-AMRVAC 3.2
The MPI - Adaptive Mesh Refinement - Versatile Advection Code (development version)
Loading...
Searching...
No Matches
mod_viscosity.t
Go to the documentation of this file.
1!> The module add viscous source terms and check time step
2!>
3!> Viscous forces in the momentum equations:
4!> d m_i/dt += - div (vc_mu * PI)
5!> !! Viscous work in the energy equation:
6!> !! de/dt += - div (v . vc_mu * PI)
7!> where the PI stress tensor is
8!> PI_i,j = - (dv_j/dx_i + dv_i/dx_j) + Kronecker delta_i,j*(2/3)*Sum_k dv_k/dx_k
9!> where vc_mu is the dynamic viscosity coefficient (g cm^-1 s^-1).
11 use mod_comm_lib, only: mpistop
12 implicit none
13
14 !> Viscosity coefficient
15 double precision, public :: vc_mu = 1.d0
16
17 !> Index of the density (in the w array)
18 integer, private, parameter :: rho_ = 1
19
20 !> Indices of the momentum density
21 integer, allocatable, private, protected :: mom(:)
22
23 !> Index of the energy density (-1 if not present)
24 integer, private, protected :: e_
25 !> Indices of the velocity for the form of better vectorization
26 integer, public, protected :: v1_,v2_,v3_
27
28 !> fourth order
29 logical :: vc_4th_order = .false.
30
31 !> source split or not
32 logical :: vc_split= .false.
33
34 !> whether to compute the viscous terms as
35 !> fluxes (ie in the div on the LHS), or not (by default)
36 logical :: viscindiv= .false.
37
38 procedure(sub_add_source), pointer :: viscosity_add_source => null()
39 ! Public methods
40 public :: viscosity_add_source
41 public :: visc_get_flux_prim
42
43contains
44 !> Read this module"s parameters from a file
45 subroutine vc_params_read(files)
47 character(len=*), intent(in) :: files(:)
48 integer :: n
49
50 namelist /vc_list/ vc_mu, vc_4th_order, vc_split, viscindiv
51
52 do n = 1, size(files)
53 open(unitpar, file=trim(files(n)), status="old")
54 read(unitpar, vc_list, end=111)
55111 close(unitpar)
56 end do
57
58
59 end subroutine vc_params_read
60
61 !> Initialize the module
62 subroutine viscosity_init(phys_wider_stencil)
64 use mod_geometry
65 integer, intent(inout) :: phys_wider_stencil
66 integer :: nwx,idir
67
69
70 if(vc_split) any_source_split=.true.
71
72 ! Determine flux variables
73 nwx = 1 ! rho (density)
74
75 allocate(mom(ndir))
76 do idir = 1, ndir
77 nwx = nwx + 1
78 mom(idir) = nwx ! momentum density
79 end do
80 v^c_=mom(^c);
81
82 nwx = nwx + 1
83 e_ = nwx ! energy density
84
85 if (viscindiv) then
86 ! to compute the derivatives from left and right upwinded values
87 phys_wider_stencil = 1
88 end if
89 select case (coordinate)
92 case (cylindrical)
94 case (spherical)
96 end select
97
98 end subroutine viscosity_init
99
100 subroutine viscosity_add_source_cartesian(qdt,ixI^L,ixO^L,wCT,wp,w,x,&
101 energy,qsourcesplit,active)
102 ! Add viscosity source in isotropic Newtonian fluids to w within ixO
103 ! neglecting bulk viscosity
104 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
106 use mod_geometry
107
108 integer, intent(in) :: ixI^L, ixO^L
109 double precision, intent(in) :: qdt, x(ixI^S,1:ndim), wCT(ixI^S,1:nw), wp(ixI^S,1:nw)
110 double precision, intent(inout) :: w(ixI^S,1:nw)
111 logical, intent(in) :: energy,qsourcesplit
112 logical, intent(inout) :: active
113
114 double precision:: lambda(ixI^S,ndir,ndir),tmp(ixI^S),vlambda(ixI^S,ndir),qdtmu,divv23
115 integer:: ix^L,ix^D
116
117 if (viscindiv) return
118
119 if(qsourcesplit .eqv. vc_split) then
120 active = .true.
121 ! standard case, textbook viscosity
122 ! Calculating viscosity sources
123 if(.not.vc_4th_order) then
124 ! involves second derivatives, two extra layers
125 ix^l=ixo^l^ladd2;
126 if({ iximin^d>ixmin^d .or. iximax^d<ixmax^d|.or.})&
127 call mpistop("error for viscous source addition, 2 layers needed")
128 ix^l=ixo^l^ladd1;
129 else
130 ! involves second derivatives, four extra layers
131 ix^l=ixo^l^ladd4;
132 if({ iximin^d>ixmin^d .or. iximax^d<ixmax^d|.or.})&
133 call mpistop("error for viscous source addition"//&
134 "requested fourth order gradients: 4 layers needed")
135 ix^l=ixo^l^ladd2;
136 end if
137 qdtmu=qdt*vc_mu
138 {^ifthreed
139 {do ix^db=ixmin^db,ixmax^db\}
140 ! idim=1, idir=1
141 lambda(ix^d,1,1)=(wp(ix1+1,ix2,ix3,v1_)-wp(ix1-1,ix2,ix3,v1_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))*two*qdtmu
142 ! idim=1, idir=2
143 lambda(ix^d,1,2)=(wp(ix1+1,ix2,ix3,v2_)-wp(ix1-1,ix2,ix3,v2_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))
144 ! idim=1, idir=3
145 lambda(ix^d,1,3)=(wp(ix1+1,ix2,ix3,v3_)-wp(ix1-1,ix2,ix3,v3_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))
146 ! idim=2, idir=1
147 lambda(ix^d,2,1)=(wp(ix1,ix2+1,ix3,v1_)-wp(ix1,ix2-1,ix3,v1_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))
148 ! idim=2, idir=2
149 lambda(ix^d,2,2)=(wp(ix1,ix2+1,ix3,v2_)-wp(ix1,ix2-1,ix3,v2_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))*two*qdtmu
150 ! idim=2, idir=3
151 lambda(ix^d,2,3)=(wp(ix1,ix2+1,ix3,v3_)-wp(ix1,ix2-1,ix3,v3_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))
152 ! idim=3, idir=1
153 lambda(ix^d,3,1)=(wp(ix1,ix2,ix3+1,v1_)-wp(ix1,ix2,ix3-1,v1_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))
154 ! idim=3, idir=2
155 lambda(ix^d,3,2)=(wp(ix1,ix2,ix3+1,v2_)-wp(ix1,ix2,ix3-1,v2_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))
156 ! idim=3, idir=3
157 lambda(ix^d,3,3)=(wp(ix1,ix2,ix3+1,v3_)-wp(ix1,ix2,ix3-1,v3_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))*two*qdtmu
158 ! dv_i/d_j + dv_j/d_i
159 lambda(ix^d,1,2)=(lambda(ix^d,1,2)+lambda(ix^d,2,1))*qdtmu
160 lambda(ix^d,2,1)=lambda(ix^d,1,2)
161 lambda(ix^d,1,3)=(lambda(ix^d,1,3)+lambda(ix^d,3,1))*qdtmu
162 lambda(ix^d,3,1)=lambda(ix^d,1,3)
163 lambda(ix^d,2,3)=(lambda(ix^d,2,3)+lambda(ix^d,3,2))*qdtmu
164 lambda(ix^d,3,2)=lambda(ix^d,2,3)
165 divv23=third*(lambda(ix^d,1,1)+lambda(ix^d,2,2)+lambda(ix^d,3,3))
166 lambda(ix^d,1,1)=lambda(ix^d,1,1)-divv23
167 lambda(ix^d,2,2)=lambda(ix^d,2,2)-divv23
168 lambda(ix^d,3,3)=lambda(ix^d,3,3)-divv23
169 if(energy) then
170 vlambda(ix^d,1)=wp(ix^d,v1_)*lambda(ix^d,1,1)+wp(ix^d,v2_)*lambda(ix^d,2,1)+wp(ix^d,v3_)*lambda(ix^d,3,1)
171 vlambda(ix^d,2)=wp(ix^d,v1_)*lambda(ix^d,1,2)+wp(ix^d,v2_)*lambda(ix^d,2,2)+wp(ix^d,v3_)*lambda(ix^d,3,2)
172 vlambda(ix^d,3)=wp(ix^d,v1_)*lambda(ix^d,1,3)+wp(ix^d,v2_)*lambda(ix^d,2,3)+wp(ix^d,v3_)*lambda(ix^d,3,3)
173 end if
174 {end do\}
175 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
176 {do ix^db=ixomin^db,ixomax^db\}
177 w(ix^d,mom(1))=(lambda(ix1+1,ix2,ix3,1,1)-lambda(ix1-1,ix2,ix3,1,1))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
178 (lambda(ix1,ix2+1,ix3,2,1)-lambda(ix1,ix2-1,ix3,2,1))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))+&
179 (lambda(ix1,ix2,ix3+1,3,1)-lambda(ix1,ix2,ix3-1,3,1))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))+w(ix^d,mom(1))
180 w(ix^d,mom(2))=(lambda(ix1+1,ix2,ix3,1,2)-lambda(ix1-1,ix2,ix3,1,2))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
181 (lambda(ix1,ix2+1,ix3,2,2)-lambda(ix1,ix2-1,ix3,2,2))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))+&
182 (lambda(ix1,ix2,ix3+1,3,2)-lambda(ix1,ix2,ix3-1,3,2))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))+w(ix^d,mom(2))
183 w(ix^d,mom(3))=(lambda(ix1+1,ix2,ix3,1,3)-lambda(ix1-1,ix2,ix3,1,3))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
184 (lambda(ix1,ix2+1,ix3,2,3)-lambda(ix1,ix2-1,ix3,2,3))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))+&
185 (lambda(ix1,ix2,ix3+1,3,3)-lambda(ix1,ix2,ix3-1,3,3))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))+w(ix^d,mom(3))
186 {end do\}
187 }
188 {^iftwod
189 {do ix^db=ixmin^db,ixmax^db\}
190 ! idim=1, idir=1
191 lambda(ix^d,1,1)=(wp(ix1+1,ix2,v1_)-wp(ix1-1,ix2,v1_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))*two*qdtmu
192 ! idim=1, idir=2
193 lambda(ix^d,1,2)=(wp(ix1+1,ix2,v2_)-wp(ix1-1,ix2,v2_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))
194 ! idim=2, idir=1
195 lambda(ix^d,2,1)=(wp(ix1,ix2+1,v1_)-wp(ix1,ix2-1,v1_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))
196 ! idim=2, idir=2
197 lambda(ix^d,2,2)=(wp(ix1,ix2+1,v2_)-wp(ix1,ix2-1,v2_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*two*qdtmu
198 ! dv_i/d_j + dv_j/d_i
199 lambda(ix^d,1,2)=(lambda(ix^d,1,2)+lambda(ix^d,2,1))*qdtmu
200 lambda(ix^d,2,1)=lambda(ix^d,1,2)
201 divv23=third*(lambda(ix^d,1,1)+lambda(ix^d,2,2))
202 lambda(ix^d,1,1)=lambda(ix^d,1,1)-divv23
203 lambda(ix^d,2,2)=lambda(ix^d,2,2)-divv23
204 if(ndir==3) then
205 ! idim=1, idir=3
206 lambda(ix1,ix2,1,3)=(wp(ix1+1,ix2,v3_)-wp(ix1-1,ix2,v3_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))*qdtmu
207 ! idim=2, idir=3
208 lambda(ix1,ix2,2,3)=(wp(ix1,ix2+1,v3_)-wp(ix1,ix2-1,v3_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*qdtmu
209 lambda(ix1,ix2,3,1)=lambda(ix1,ix2,1,3)
210 lambda(ix1,ix2,3,2)=lambda(ix1,ix2,2,3)
211 lambda(ix1,ix2,3,3)=-divv23
212 if(energy) then
213 vlambda(ix1,ix2,1)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,1)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,1)+wp(ix1,ix2,v3_)*lambda(ix1,ix2,3,1)
214 vlambda(ix1,ix2,2)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,2)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,2)+wp(ix1,ix2,v3_)*lambda(ix1,ix2,3,2)
215 vlambda(ix1,ix2,3)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,3)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,3)+wp(ix1,ix2,v3_)*lambda(ix1,ix2,3,3)
216 end if
217 else if(energy) then
218 vlambda(ix1,ix2,1)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,1)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,1)
219 vlambda(ix1,ix2,2)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,2)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,2)
220 end if
221 {end do\}
222 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
223 {do ix^db=ixomin^db,ixomax^db\}
224 w(ix^d,mom(1))=(lambda(ix1+1,ix2,1,1)-lambda(ix1-1,ix2,1,1))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
225 (lambda(ix1,ix2+1,2,1)-lambda(ix1,ix2-1,2,1))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+w(ix^d,mom(1))
226 w(ix^d,mom(2))=(lambda(ix1+1,ix2,1,2)-lambda(ix1-1,ix2,1,2))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
227 (lambda(ix1,ix2+1,2,2)-lambda(ix1,ix2-1,2,2))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+w(ix^d,mom(2))
228 if(ndir==3) then
229 w(ix1,ix2,mom(3))=(lambda(ix1+1,ix2,1,3)-lambda(ix1-1,ix2,1,3))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
230 (lambda(ix1,ix2+1,2,3)-lambda(ix1,ix2-1,2,3))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+w(ix1,ix2,mom(3))
231 end if
232 {end do\}
233 }
234 {^ifoned
235 do ix1=ixmin1,ixmax1
236 ! idim=1, idir=1
237 lambda(ix1,1,1)=(wp(ix1+1,v1_)-wp(ix1-1,v1_))/(x(ix1+1,1)-x(ix1-1,1))*two*qdtmu
238 ! dv_i/d_j + dv_j/d_i
239 divv23=third*lambda(ix1,1,1)
240 lambda(ix1,1,1)=lambda(ix1,1,1)-divv23
241 if(ndir==2) then
242 ! idim=1, idir=2
243 lambda(ix1,1,2)=(wp(ix1+1,v2_)-wp(ix1-1,v2_))/(x(ix1+1,1)-x(ix1-1,1))*qdtmu
244 ! dv_i/d_j + dv_j/d_i
245 lambda(ix1,2,1)=lambda(ix1,1,2)
246 lambda(ix1,2,2)=-divv23
247 if(energy) then
248 vlambda(ix1,1)=wp(ix1,v1_)*lambda(ix1,1,1)+wp(ix1,v2_)*lambda(ix1,2,1)
249 vlambda(ix1,2)=wp(ix1,v1_)*lambda(ix1,1,2)+wp(ix1,v2_)*lambda(ix1,2,2)
250 end if
251 else if(ndir==3) then
252 ! idim=1, idir=2
253 lambda(ix1,1,2)=(wp(ix1+1,v2_)-wp(ix1-1,v2_))/(x(ix1+1,1)-x(ix1-1,1))*qdtmu
254 ! dv_i/d_j + dv_j/d_i
255 lambda(ix1,2,1)=lambda(ix1,1,2)
256 lambda(ix1,2,2)=-divv23
257 ! idim=1, idir=3
258 lambda(ix1,1,3)=(wp(ix1+1,v3_)-wp(ix1-1,v3_))/(x(ix1+1,1)-x(ix1-1,1))*qdtmu
259 lambda(ix1,3,1)=lambda(ix1,1,3)
260 lambda(ix1,3,3)=-divv23
261 if(energy) then
262 vlambda(ix1,1)=wp(ix1,v1_)*lambda(ix1,1,1)+wp(ix1,v2_)*lambda(ix1,2,1)+wp(ix1,v3_)*lambda(ix1,3,1)
263 vlambda(ix1,2)=wp(ix1,v1_)*lambda(ix1,1,2)+wp(ix1,v2_)*lambda(ix1,2,2)+wp(ix1,v3_)*lambda(ix1,3,2)
264 vlambda(ix1,3)=wp(ix1,v1_)*lambda(ix1,1,3)+wp(ix1,v2_)*lambda(ix1,2,3)+wp(ix1,v3_)*lambda(ix1,3,3)
265 end if
266 else if(energy) then
267 vlambda(ix1,1)=wp(ix1,v1_)*lambda(ix1,1,1)
268 end if
269 end do
270 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
271 do ix1=ixomin1,ixomax1
272 if(ndir==1) then
273 w(ix1,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+w(ix1,mom(1))
274 else if(ndir==2) then
275 w(ix1,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+w(ix1,mom(1))
276 w(ix1,mom(2))=(lambda(ix1+1,1,2)-lambda(ix1-1,1,2))/(x(ix1+1,1)-x(ix1-1,1))+w(ix1,mom(2))
277 else
278 w(ix1,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+w(ix1,mom(1))
279 w(ix1,mom(2))=(lambda(ix1+1,1,2)-lambda(ix1-1,1,2))/(x(ix1+1,1)-x(ix1-1,1))+w(ix1,mom(2))
280 w(ix1,mom(3))=(lambda(ix1+1,1,3)-lambda(ix1-1,1,3))/(x(ix1+1,1)-x(ix1-1,1))+w(ix1,mom(3))
281 end if
282 end do
283 }
284 if(energy) then
285 ! de/dt= +div(v.dot.[mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v *kr])
286 ! thus e=e+d_i v_j tensor_ji
287 call divvector(vlambda,ixi^l,ixo^l,tmp)
288 w(ixo^s,e_)=w(ixo^s,e_)+tmp(ixo^s)
289 end if
290 end if
291
292 end subroutine viscosity_add_source_cartesian
293
294 subroutine viscosity_add_source_sphere(qdt,ixI^L,ixO^L,wCT,wp,w,x,&
295 energy,qsourcesplit,active)
296 ! Add viscosity source in isotropic Newtonian fluids to w within ixO
297 ! neglecting bulk viscosity
298 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
300 use mod_geometry
301
302 integer, intent(in) :: ixI^L, ixO^L
303 double precision, intent(in) :: qdt, x(ixI^S,1:ndim), wCT(ixI^S,1:nw), wp(ixI^S,1:nw)
304 double precision, intent(inout) :: w(ixI^S,1:nw)
305 logical, intent(in) :: energy,qsourcesplit
306 logical, intent(inout) :: active
307
308 double precision :: lambda(ixI^S,ndir,ndir),vlambda(ixI^S,ndir),invr(ixI^S),tctan(ixI^S),invrsin(ixI^S)
309 double precision :: qdtmu,tsin,tcos,divv23
310 integer:: ix^L,ix^D
311
312 if (viscindiv) return
313
314 if(qsourcesplit .eqv. vc_split) then
315 active = .true.
316 ! standard case, textbook viscosity
317 ! Calculating viscosity sources
318 if(.not.vc_4th_order) then
319 ! involves second derivatives, two extra layers
320 ix^l=ixo^l^ladd2;
321 if({ iximin^d>ixmin^d .or. iximax^d<ixmax^d|.or.})&
322 call mpistop("error for viscous source addition, 2 layers needed")
323 ix^l=ixo^l^ladd1;
324 else
325 ! involves second derivatives, four extra layers
326 ix^l=ixo^l^ladd4;
327 if({ iximin^d>ixmin^d .or. iximax^d<ixmax^d|.or.})&
328 call mpistop("error for viscous source addition"//&
329 "requested fourth order gradients: 4 layers needed")
330 ix^l=ixo^l^ladd2;
331 end if
332
333 ! construct lambda tensor: lambda_ij = gradv_ij + gradv_ji
334 ! initialize
335 qdtmu=qdt*vc_mu
336 {^ifthreed
337 {do ix^db=ixmin^db,ixmax^db\}
338 invr(ix^d)=1.d0/x(ix^d,1)
339 tcos=dcos(x(ix^d,2))
340 ! idim=1, idir=1
341 lambda(ix^d,1,1)=(wp(ix1+1,ix2,ix3,v1_)-wp(ix1-1,ix2,ix3,v1_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))*two*qdtmu
342 ! idim=1, idir=2
343 lambda(ix^d,1,2)=(wp(ix1+1,ix2,ix3,v2_)-wp(ix1-1,ix2,ix3,v2_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))
344 ! idim=1, idir=3
345 lambda(ix^d,1,3)=(wp(ix1+1,ix2,ix3,v3_)-wp(ix1-1,ix2,ix3,v3_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))
346 ! idim=2, idir=1
347 lambda(ix^d,2,1)=((wp(ix1,ix2+1,ix3,v1_)-wp(ix1,ix2-1,ix3,v1_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))-wp(ix^d,v2_))*invr(ix^d)
348 ! idim=2, idir=2
349 lambda(ix^d,2,2)=((wp(ix1,ix2+1,ix3,v2_)-wp(ix1,ix2-1,ix3,v2_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))+wp(ix^d,v1_))*invr(ix^d)*&
350 two*qdtmu
351 ! idim=2, idir=3
352 lambda(ix^d,2,3)=((wp(ix1,ix2+1,ix3,v3_)-wp(ix1,ix2-1,ix3,v3_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))+wp(ix^d,v2_)*tcos)*invr(ix^d)
353 tsin=dsin(x(ix^d,2))
354 invrsin(ix^d)=invr(ix^d)/tsin
355 tctan(ix^d)=tcos/tsin
356 ! idim=3, idir=1
357 lambda(ix^d,3,1)=((wp(ix1,ix2,ix3+1,v1_)-wp(ix1,ix2,ix3-1,v1_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))-wp(ix^d,v3_)*tsin)*invrsin(ix^d)
358 ! idim=3, idir=2
359 lambda(ix^d,3,2)=((wp(ix1,ix2,ix3+1,v2_)-wp(ix1,ix2,ix3-1,v2_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))-wp(ix^d,v3_)*tcos)*invrsin(ix^d)
360 ! idim=3, idir=3
361 lambda(ix^d,3,3)=((wp(ix1,ix2,ix3+1,v3_)-wp(ix1,ix2,ix3-1,v3_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))+wp(ix^d,v1_)*tsin+&
362 wp(ix^d,v2_)*tcos)*invrsin(ix^d)*two*qdtmu
363 ! dv_i/d_j + dv_j/d_i
364 lambda(ix^d,1,2)=(lambda(ix^d,1,2)+lambda(ix^d,2,1))*qdtmu
365 lambda(ix^d,2,1)=lambda(ix^d,1,2)
366 lambda(ix^d,1,3)=(lambda(ix^d,1,3)+lambda(ix^d,3,1))*qdtmu
367 lambda(ix^d,3,1)=lambda(ix^d,1,3)
368 lambda(ix^d,2,3)=(lambda(ix^d,2,3)+lambda(ix^d,3,2))*qdtmu
369 lambda(ix^d,3,2)=lambda(ix^d,2,3)
370 divv23=third*(lambda(ix^d,1,1)+lambda(ix^d,2,2)+lambda(ix^d,3,3))
371 lambda(ix^d,1,1)=lambda(ix^d,1,1)-divv23
372 lambda(ix^d,2,2)=lambda(ix^d,2,2)-divv23
373 lambda(ix^d,3,3)=lambda(ix^d,3,3)-divv23
374 if(energy) then
375 vlambda(ix^d,1)=wp(ix^d,v1_)*lambda(ix^d,1,1)+wp(ix^d,v2_)*lambda(ix^d,2,1)+wp(ix^d,v3_)*lambda(ix^d,3,1)
376 vlambda(ix^d,2)=wp(ix^d,v1_)*lambda(ix^d,1,2)+wp(ix^d,v2_)*lambda(ix^d,2,2)+wp(ix^d,v3_)*lambda(ix^d,3,2)
377 vlambda(ix^d,3)=wp(ix^d,v1_)*lambda(ix^d,1,3)+wp(ix^d,v2_)*lambda(ix^d,2,3)+wp(ix^d,v3_)*lambda(ix^d,3,3)
378 end if
379 {end do\}
380 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
381 {do ix^db=ixomin^db,ixomax^db\}
382 w(ix^d,mom(1))=(lambda(ix1+1,ix2,ix3,1,1)-lambda(ix1-1,ix2,ix3,1,1))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
383 (lambda(ix1,ix2+1,ix3,2,1)-lambda(ix1,ix2-1,ix3,2,1))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))*invr(ix^d)+&
384 (lambda(ix1,ix2,ix3+1,3,1)-lambda(ix1,ix2,ix3-1,3,1))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))*invrsin(ix^d)+&
385 two*lambda(ix^d,1,1)*invr(ix^d)+lambda(ix^d,2,1)*invr(ix^d)*tctan(ix^d)+w(ix^d,mom(1))
386 w(ix^d,mom(2))=(lambda(ix1+1,ix2,ix3,1,2)-lambda(ix1-1,ix2,ix3,1,2))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
387 (lambda(ix1,ix2+1,ix3,2,2)-lambda(ix1,ix2-1,ix3,2,2))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))*invr(ix^d)+&
388 (lambda(ix1,ix2,ix3+1,3,2)-lambda(ix1,ix2,ix3-1,3,2))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))*invrsin(ix^d)+&
389 two*lambda(ix^d,1,2)*invr(ix^d)+lambda(ix^d,2,2)*invr(ix^d)*tctan(ix^d)-lambda(ix^d,3,3)*tctan(ix^d)*invr(ix^d)**2+&
390 w(ix^d,mom(2))
391 w(ix^d,mom(3))=(lambda(ix1+1,ix2,ix3,1,3)-lambda(ix1-1,ix2,ix3,1,3))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
392 (lambda(ix1,ix2+1,ix3,2,3)-lambda(ix1,ix2-1,ix3,2,3))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))*invr(ix^d)+&
393 (lambda(ix1,ix2,ix3+1,3,3)-lambda(ix1,ix2,ix3-1,3,3))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))*invrsin(ix^d)+&
394 two*lambda(ix^d,1,3)*invr(ix^d)+lambda(ix^d,2,3)*(invr(ix^d)+invr(ix^d)**2)*tctan(ix^d)+w(ix^d,mom(3))
395 {end do\}
396 }
397 {^iftwod
398 {do ix^db=ixmin^db,ixmax^db\}
399 invr(ix1,ix2)=1.d0/x(ix1,ix2,1)
400 ! idim=1, idir=1
401 lambda(ix1,ix2,1,1)=(wp(ix1+1,ix2,v1_)-wp(ix1-1,ix2,v1_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))*two*qdtmu
402 ! idim=1, idir=2
403 lambda(ix1,ix2,1,2)=(wp(ix1+1,ix2,v2_)-wp(ix1-1,ix2,v2_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))
404 ! idim=2, idir=1
405 lambda(ix1,ix2,2,1)=((wp(ix1,ix2+1,v1_)-wp(ix1,ix2-1,v1_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))-wp(ix1,ix2,v2_))*invr(ix1,ix2)
406 ! idim=2, idir=2
407 lambda(ix1,ix2,2,2)=((wp(ix1,ix2+1,v2_)-wp(ix1,ix2-1,v2_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+wp(ix1,ix2,v1_))*invr(ix1,ix2)*&
408 two*qdtmu
409 ! dv_i/d_j + dv_j/d_i
410 lambda(ix1,ix2,1,2)=(lambda(ix1,ix2,1,2)+lambda(ix1,ix2,2,1))*qdtmu
411 lambda(ix1,ix2,2,1)=lambda(ix1,ix2,1,2)
412 divv23=third*(lambda(ix1,ix2,1,1)+lambda(ix1,ix2,2,2))
413 tcos=dcos(x(ix1,ix2,2))
414 tsin=dsin(x(ix1,ix2,2))
415 tctan(ix1,ix2)=tcos/tsin
416 if(ndir==2) then
417 lambda(ix1,ix2,1,1)=lambda(ix1,ix2,1,1)-divv23
418 lambda(ix1,ix2,2,2)=lambda(ix1,ix2,2,2)-divv23
419 if(energy) then
420 vlambda(ix1,ix2,1)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,1)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,1)
421 vlambda(ix1,ix2,2)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,2)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,2)
422 end if
423 else
424 invrsin(ix1,ix2)=invr(ix1,ix2)/tsin
425 ! idim=1, idir=3
426 lambda(ix1,ix2,1,3)=(wp(ix1+1,ix2,v3_)-wp(ix1-1,ix2,v3_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))
427 ! idim=2, idir=3
428 lambda(ix1,ix2,2,3)=((wp(ix1,ix2+1,v3_)-wp(ix1,ix2-1,v3_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+wp(ix1,ix2,v2_)*tcos)*invr(ix1,ix2)
429 ! idim=3, idir=1
430 lambda(ix1,ix2,3,1)=-wp(ix1,ix2,v3_)*tsin*invrsin(ix1,ix2)
431 ! idim=3, idir=2
432 lambda(ix1,ix2,3,2)=-wp(ix1,ix2,v3_)*tcos*invrsin(ix1,ix2)
433 ! idim=3, idir=3
434 lambda(ix1,ix2,3,3)=(wp(ix1,ix2,v1_)*tsin+wp(ix1,ix2,v2_)*tcos)*invrsin(ix1,ix2)*two*qdtmu
435 lambda(ix1,ix2,1,3)=(lambda(ix1,ix2,1,3)+lambda(ix1,ix2,3,1))*qdtmu
436 lambda(ix1,ix2,3,1)=lambda(ix1,ix2,1,3)
437 lambda(ix1,ix2,2,3)=(lambda(ix1,ix2,2,3)+lambda(ix1,ix2,3,2))*qdtmu
438 lambda(ix1,ix2,3,2)=lambda(ix1,ix2,2,3)
439 lambda(ix1,ix2,1,1)=lambda(ix1,ix2,1,1)-divv23
440 lambda(ix1,ix2,2,2)=lambda(ix1,ix2,2,2)-divv23
441 lambda(ix1,ix2,3,3)=-divv23
442 if(energy) then
443 vlambda(ix1,ix2,1)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,1)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,1)+wp(ix1,ix2,v3_)*lambda(ix1,ix2,3,1)
444 vlambda(ix1,ix2,2)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,2)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,2)+wp(ix1,ix2,v3_)*lambda(ix1,ix2,3,2)
445 vlambda(ix1,ix2,3)=wp(ix1,ix2,v1_)*lambda(ix1,ix2,1,3)+wp(ix1,ix2,v2_)*lambda(ix1,ix2,2,3)+wp(ix1,ix2,v3_)*lambda(ix1,ix2,3,3)
446 end if
447 end if
448 {end do\}
449 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
450 {do ix^db=ixomin^db,ixomax^db\}
451 if(ndir==2) then
452 w(ix1,ix2,mom(1))=(lambda(ix1+1,ix2,1,1)-lambda(ix1-1,ix2,1,1))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
453 (lambda(ix1,ix2+1,2,1)-lambda(ix1,ix2-1,2,1))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix1,ix2)+&
454 two*lambda(ix1,ix2,1,1)*invr(ix1,ix2)+lambda(ix1,ix2,2,1)*invr(ix1,ix2)*tctan(ix1,ix2)+w(ix1,ix2,mom(1))
455 w(ix1,ix2,mom(2))=(lambda(ix1+1,ix2,1,2)-lambda(ix1-1,ix2,1,2))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
456 (lambda(ix1,ix2+1,2,2)-lambda(ix1,ix2-1,2,2))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix1,ix2)+&
457 two*lambda(ix1,ix2,1,2)*invr(ix1,ix2)+lambda(ix1,ix2,2,2)*invr(ix1,ix2)*tctan(ix1,ix2)+w(ix1,ix2,mom(2))
458 else
459 w(ix1,ix2,mom(1))=(lambda(ix1+1,ix2,1,1)-lambda(ix1-1,ix2,1,1))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
460 (lambda(ix1,ix2+1,2,1)-lambda(ix1,ix2-1,2,1))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix1,ix2)+&
461 two*lambda(ix1,ix2,1,1)*invr(ix1,ix2)+lambda(ix1,ix2,2,1)*invr(ix1,ix2)*tctan(ix1,ix2)+w(ix1,ix2,mom(1))
462 w(ix1,ix2,mom(2))=(lambda(ix1+1,ix2,1,2)-lambda(ix1-1,ix2,1,2))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
463 (lambda(ix1,ix2+1,2,2)-lambda(ix1,ix2-1,2,2))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix1,ix2)+&
464 two*lambda(ix1,ix2,1,2)*invr(ix1,ix2)+lambda(ix1,ix2,2,2)*invr(ix1,ix2)*tctan(ix1,ix2)-&
465 lambda(ix1,ix2,3,3)*tctan(ix1,ix2)*invr(ix1,ix2)**2+w(ix1,ix2,mom(2))
466 w(ix1,ix2,mom(3))=(lambda(ix1+1,ix2,1,3)-lambda(ix1-1,ix2,1,3))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
467 (lambda(ix1,ix2+1,2,3)-lambda(ix1,ix2-1,2,3))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix1,ix2)+&
468 two*lambda(ix1,ix2,1,3)*invr(ix1,ix2)+lambda(ix1,ix2,2,3)*(invr(ix1,ix2)+invr(ix1,ix2)**2)*tctan(ix1,ix2)+w(ix1,ix2,mom(3))
469 end if
470 {end do\}
471 }
472 {^ifoned
473 do ix1=ixmin1,ixmax1
474 invr(ix1)=1.d0/x(ix1,1)
475 ! idim=1, idir=1
476 lambda(ix1,1,1)=(wp(ix1+1,v1_)-wp(ix1-1,v1_))/(x(ix1+1,1)-x(ix1-1,1))*two*qdtmu
477 ! dv_i/d_j + dv_j/d_i
478 divv23=third*lambda(ix1,1,1)
479 lambda(ix1,1,1)=lambda(ix1,1,1)-divv23
480 if(ndir==1) then
481 if(energy) then
482 vlambda(ix1,1)=wp(ix1,v1_)*lambda(ix1,1,1)
483 end if
484 else if(ndir==2) then
485 ! idim=1, idir=2
486 lambda(ix1,1,2)=(wp(ix1+1,v2_)-wp(ix1-1,v2_))/(x(ix1+1,1)-x(ix1-1,1))
487 lambda(ix1,1,2)=lambda(ix1,1,2)*qdtmu
488 lambda(ix1,2,1)=lambda(ix1,1,2)
489 lambda(ix1,2,2)=-divv23
490 if(energy) then
491 vlambda(ix1,1)=wp(ix1,v1_)*lambda(ix1,1,1)+wp(ix1,v2_)*lambda(ix1,2,1)
492 vlambda(ix1,2)=wp(ix1,v1_)*lambda(ix1,1,2)+wp(ix1,v2_)*lambda(ix1,2,2)
493 end if
494 else
495 tcos=0.d0
496 tsin=1.d0
497 tctan(ix1)=tcos/tsin
498 invrsin(ix1)=invr(ix1)/tsin
499 ! idim=1, idir=3
500 lambda(ix1,1,3)=(wp(ix1+1,v3_)-wp(ix1-1,v3_))/(x(ix1+1,1)-x(ix1-1,1))
501 ! idim=3, idir=1
502 lambda(ix1,3,1)=-wp(ix1,v3_)*tsin*invrsin(ix1)
503 ! idim=3, idir=2
504 lambda(ix1,3,2)=-wp(ix1,v3_)*tcos*invrsin(ix1)
505 ! idim=3, idir=3
506 lambda(ix1,3,3)=(wp(ix1,v1_)*tsin+wp(ix1,v2_)*tcos)*invrsin(ix1)*two*qdtmu
507 lambda(ix1,1,3)=(lambda(ix1,1,3)+lambda(ix1,3,1))*qdtmu
508 lambda(ix1,3,1)=lambda(ix1,1,3)
509 lambda(ix1,3,2)=lambda(ix1,3,2)*qdtmu
510 lambda(ix1,2,3)=lambda(ix1,3,2)
511 lambda(ix1,3,3)=lambda(ix1,3,3)-divv23
512 if(energy) then
513 vlambda(ix1,1)=wp(ix1,v1_)*lambda(ix1,1,1)+wp(ix1,v2_)*lambda(ix1,2,1)+wp(ix1,v3_)*lambda(ix1,3,1)
514 vlambda(ix1,2)=wp(ix1,v1_)*lambda(ix1,1,2)+wp(ix1,v2_)*lambda(ix1,2,2)+wp(ix1,v3_)*lambda(ix1,3,2)
515 vlambda(ix1,3)=wp(ix1,v1_)*lambda(ix1,1,3)+wp(ix1,v2_)*lambda(ix1,2,3)+wp(ix1,v3_)*lambda(ix1,3,3)
516 end if
517 end if
518 end do
519 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
520 do ix1=ixomin1,ixomax1
521 if(ndir==1) then
522 w(ix1,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+&
523 two*lambda(ix1,1,1)*invr(ix1)+w(ix1,mom(1))
524 else if(ndir==2) then
525 w(ix1,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+&
526 two*lambda(ix1,1,1)*invr(ix1)+lambda(ix1,2,1)*invr(ix1)*tctan(ix1)+w(ix1,mom(1))
527 w(ix1,mom(2))=(lambda(ix1+1,1,2)-lambda(ix1-1,1,2))/(x(ix1+1,1)-x(ix1-1,1))+&
528 two*lambda(ix1,1,2)*invr(ix1)+lambda(ix1,2,2)*invr(ix1)*tctan(ix1)+w(ix1,mom(2))
529 else
530 w(ix1,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+&
531 two*lambda(ix1,1,1)*invr(ix1)+lambda(ix1,2,1)*invr(ix1)*tctan(ix1)+w(ix1,mom(1))
532 w(ix1,mom(2))=(lambda(ix1+1,1,2)-lambda(ix1-1,1,2))/(x(ix1+1,1)-x(ix1-1,1))+&
533 two*lambda(ix1,1,2)*invr(ix1)+lambda(ix1,2,2)*invr(ix1)*tctan(ix1)-lambda(ix1,3,3)*tctan(ix1)*invr(ix1)**2+&
534 w(ix1,mom(2))
535 w(ix1,mom(3))=(lambda(ix1+1,1,3)-lambda(ix1-1,1,3))/(x(ix1+1,1)-x(ix1-1,1))+&
536 two*lambda(ix1,1,3)*invr(ix1)+lambda(ix1,2,3)*(invr(ix1)+invr(ix1)**2)*tctan(ix1)+w(ix1,mom(3))
537 end if
538 end do
539 }
540 if(energy) then
541 ! de/dt= +div(v.dot.[mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v *kr])
542 ! thus e=e+d_i v_j tensor_ji
543 call divvector(vlambda,ixi^l,ixo^l,invr)
544 w(ixo^s,e_)=w(ixo^s,e_)+invr(ixo^s)
545 end if
546
547 end if
548
549 end subroutine viscosity_add_source_sphere
550
551 subroutine viscosity_add_source_cylinder(qdt,ixI^L,ixO^L,wCT,wp,w,x,&
552 energy,qsourcesplit,active)
553 ! Add viscosity source in isotropic Newtonian fluids to w within ixO
554 ! neglecting bulk viscosity
555 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
557 use mod_geometry
558
559 integer, intent(in) :: ixI^L, ixO^L
560 double precision, intent(in) :: qdt, x(ixI^S,1:ndim), wCT(ixI^S,1:nw), wp(ixI^S,1:nw)
561 double precision, intent(inout) :: w(ixI^S,1:nw)
562 logical, intent(in) :: energy,qsourcesplit
563 logical, intent(inout) :: active
564
565 double precision:: lambda(ixI^S,ndir,ndir),vlambda(ixI^S,ndir),invr(ixI^S)
566 double precision :: qdtmu,divv23
567 integer:: ix^L,ix^D
568
569 if (viscindiv) return
570
571 if(qsourcesplit .eqv. vc_split) then
572 active = .true.
573 ! standard case, textbook viscosity
574 ! Calculating viscosity sources
575 if(.not.vc_4th_order) then
576 ! involves second derivatives, two extra layers
577 ix^l=ixo^l^ladd2;
578 if({ iximin^d>ixmin^d .or. iximax^d<ixmax^d|.or.})&
579 call mpistop("error for viscous source addition, 2 layers needed")
580 ix^l=ixo^l^ladd1;
581 else
582 ! involves second derivatives, four extra layers
583 ix^l=ixo^l^ladd4;
584 if({ iximin^d>ixmin^d .or. iximax^d<ixmax^d|.or.})&
585 call mpistop("error for viscous source addition"//&
586 "requested fourth order gradients: 4 layers needed")
587 ix^l=ixo^l^ladd2;
588 end if
589
590 ! construct lambda tensor: lambda_ij = gradv_ij + gradv_ji
591 ! initialize
592 qdtmu=qdt*vc_mu
593 {^ifthreed
594 {do ix^db=ixmin^db,ixmax^db\}
595 invr(ix^d)=1.d0/x(ix^d,1)
596 ! idim=1, idir=1
597 lambda(ix^d,1,1)=(wp(ix1+1,ix2,ix3,v1_)-wp(ix1-1,ix2,ix3,v1_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))*two*qdtmu
598 ! idim=1, idir=2
599 lambda(ix^d,1,2)=(wp(ix1+1,ix2,ix3,v2_)-wp(ix1-1,ix2,ix3,v2_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))
600 ! idim=1, idir=3
601 lambda(ix^d,1,3)=(wp(ix1+1,ix2,ix3,v3_)-wp(ix1-1,ix2,ix3,v3_))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))
602 ! idim=2, idir=1
603 lambda(ix^d,2,1)=((wp(ix1,ix2+1,ix3,v1_)-wp(ix1,ix2-1,ix3,v1_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))-wp(ix^d,v2_))*invr(ix^d)
604 ! idim=2, idir=2
605 lambda(ix^d,2,2)=((wp(ix1,ix2+1,ix3,v2_)-wp(ix1,ix2-1,ix3,v2_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))+wp(ix^d,v1_))*invr(ix^d)*&
606 two*qdtmu
607 ! idim=2, idir=3
608 lambda(ix^d,2,3)=(wp(ix1,ix2+1,ix3,v3_)-wp(ix1,ix2-1,ix3,v3_))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))*invr(ix^d)
609 ! idim=3, idir=1
610 lambda(ix^d,3,1)=(wp(ix1,ix2,ix3+1,v1_)-wp(ix1,ix2,ix3-1,v1_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))*invr(ix^d)
611 ! idim=3, idir=2
612 lambda(ix^d,3,2)=(wp(ix1,ix2,ix3+1,v2_)-wp(ix1,ix2,ix3-1,v2_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))*invr(ix^d)
613 ! idim=3, idir=3
614 lambda(ix^d,3,3)=(wp(ix1,ix2,ix3+1,v3_)-wp(ix1,ix2,ix3-1,v3_))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))*invr(ix^d)*two*qdtmu
615 ! dv_i/d_j + dv_j/d_i
616 lambda(ix^d,1,2)=(lambda(ix^d,1,2)+lambda(ix^d,2,1))*qdtmu
617 lambda(ix^d,2,1)=lambda(ix^d,1,2)
618 lambda(ix^d,1,3)=(lambda(ix^d,1,3)+lambda(ix^d,3,1))*qdtmu
619 lambda(ix^d,3,1)=lambda(ix^d,1,3)
620 lambda(ix^d,2,3)=(lambda(ix^d,2,3)+lambda(ix^d,3,2))*qdtmu
621 lambda(ix^d,3,2)=lambda(ix^d,2,3)
622 divv23=third*(lambda(ix^d,1,1)+lambda(ix^d,2,2)+lambda(ix^d,3,3))
623 lambda(ix^d,1,1)=lambda(ix^d,1,1)-divv23
624 lambda(ix^d,2,2)=lambda(ix^d,2,2)-divv23
625 lambda(ix^d,3,3)=lambda(ix^d,3,3)-divv23
626 if(energy) then
627 vlambda(ix^d,1)=wp(ix^d,v1_)*lambda(ix^d,1,1)+wp(ix^d,v2_)*lambda(ix^d,2,1)+wp(ix^d,v3_)*lambda(ix^d,3,1)
628 vlambda(ix^d,2)=wp(ix^d,v1_)*lambda(ix^d,1,2)+wp(ix^d,v2_)*lambda(ix^d,2,2)+wp(ix^d,v3_)*lambda(ix^d,3,2)
629 vlambda(ix^d,3)=wp(ix^d,v1_)*lambda(ix^d,1,3)+wp(ix^d,v2_)*lambda(ix^d,2,3)+wp(ix^d,v3_)*lambda(ix^d,3,3)
630 end if
631 {end do\}
632 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
633 {do ix^db=ixomin^db,ixomax^db\}
634 w(ix^d,mom(1))=(lambda(ix1+1,ix2,ix3,1,1)-lambda(ix1-1,ix2,ix3,1,1))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
635 (lambda(ix1,ix2+1,ix3,2,1)-lambda(ix1,ix2-1,ix3,2,1))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))*invr(ix^d)+&
636 (lambda(ix1,ix2,ix3+1,3,1)-lambda(ix1,ix2,ix3-1,3,1))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))+&
637 (lambda(ix^d,1,1)-lambda(ix^d,2,2))*invr(ix^d)+w(ix^d,mom(1))
638 w(ix^d,mom(2))=(lambda(ix1+1,ix2,ix3,1,2)-lambda(ix1-1,ix2,ix3,1,2))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
639 (lambda(ix1,ix2+1,ix3,2,2)-lambda(ix1,ix2-1,ix3,2,2))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))*invr(ix^d)+&
640 (lambda(ix1,ix2,ix3+1,3,2)-lambda(ix1,ix2,ix3-1,3,2))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))+&
641 two*lambda(ix^d,1,2)*invr(ix^d)+w(ix^d,mom(2))
642 w(ix^d,mom(3))=(lambda(ix1+1,ix2,ix3,1,3)-lambda(ix1-1,ix2,ix3,1,3))/(x(ix1+1,ix2,ix3,1)-x(ix1-1,ix2,ix3,1))+&
643 (lambda(ix1,ix2+1,ix3,2,3)-lambda(ix1,ix2-1,ix3,2,3))/(x(ix1,ix2+1,ix3,2)-x(ix1,ix2-1,ix3,2))*invr(ix^d)+&
644 (lambda(ix1,ix2,ix3+1,3,3)-lambda(ix1,ix2,ix3-1,3,3))/(x(ix1,ix2,ix3+1,3)-x(ix1,ix2,ix3-1,3))+&
645 lambda(ix^d,1,3)*invr(ix^d)+w(ix^d,mom(3))
646 {end do\}
647 }
648 {^iftwod
649 {do ix^db=ixmin^db,ixmax^db\}
650 invr(ix^d)=1.d0/x(ix^d,1)
651 ! idim=1, idir=1
652 lambda(ix^d,1,1)=(wp(ix1+1,ix2,v1_)-wp(ix1-1,ix2,v1_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))*two*qdtmu
653 ! idim=1, idir=2
654 lambda(ix^d,1,2)=(wp(ix1+1,ix2,v2_)-wp(ix1-1,ix2,v2_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))
655 if(phi_==2) then
656 ! idim=2, idir=1
657 lambda(ix^d,2,1)=((wp(ix1,ix2+1,v1_)-wp(ix1,ix2-1,v1_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))-wp(ix^d,v2_))*invr(ix^d)
658 ! idim=2, idir=2
659 lambda(ix^d,2,2)=((wp(ix1,ix2+1,v2_)-wp(ix1,ix2-1,v2_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+wp(ix^d,v1_))*invr(ix^d)*&
660 two*qdtmu
661 if(ndir==3) then
662 ! idim=2, idir=3
663 lambda(ix^d,2,3)=(wp(ix1,ix2+1,v3_)-wp(ix1,ix2-1,v3_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)
664 ! idim=3, idir=1
665 lambda(ix^d,3,1)=0.d0
666 ! idim=3, idir=2
667 lambda(ix^d,3,2)=0.d0
668 ! idim=3, idir=3
669 lambda(ix^d,3,3)=0.d0
670 end if
671 else
672 ! idim=2, idir=1
673 lambda(ix^d,2,1)=(wp(ix1,ix2+1,v1_)-wp(ix1,ix2-1,v1_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)
674 ! idim=2, idir=2
675 lambda(ix^d,2,2)=(wp(ix1,ix2+1,v2_)-wp(ix1,ix2-1,v2_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)*two*qdtmu
676 if(ndir==3) then
677 ! idim=2, idir=3
678 lambda(ix^d,2,3)=(wp(ix1,ix2+1,v3_)-wp(ix1,ix2-1,v3_))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)
679 ! idim=3, idir=1
680 lambda(ix^d,3,1)=-wp(ix^d,v3_)*invr(ix^d)
681 ! idim=3, idir=2
682 lambda(ix^d,3,2)=0.d0
683 ! idim=3, idir=3
684 lambda(ix^d,3,3)=wp(ix^d,v1_)*invr(ix^d)
685 end if
686 end if
687 ! dv_i/d_j + dv_j/d_i
688 lambda(ix^d,1,2)=(lambda(ix^d,1,2)+lambda(ix^d,2,1))*qdtmu
689 lambda(ix^d,2,1)=lambda(ix^d,1,2)
690 divv23=third*(lambda(ix^d,1,1)+lambda(ix^d,2,2)+lambda(ix^d,3,3))
691 lambda(ix^d,1,1)=lambda(ix^d,1,1)-divv23
692 lambda(ix^d,2,2)=lambda(ix^d,2,2)-divv23
693 if(ndir==3) then
694 ! idim=1, idir=3
695 lambda(ix^d,1,3)=(wp(ix1+1,ix2,v3_)-wp(ix1-1,ix2,v3_))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))
696 lambda(ix^d,1,3)=(lambda(ix^d,1,3)+lambda(ix^d,3,1))*qdtmu
697 lambda(ix^d,3,1)=lambda(ix^d,1,3)
698 lambda(ix^d,2,3)=(lambda(ix^d,2,3)+lambda(ix^d,3,2))*qdtmu
699 lambda(ix^d,3,2)=lambda(ix^d,2,3)
700 lambda(ix^d,3,3)=lambda(ix^d,3,3)-divv23
701 if(energy) then
702 vlambda(ix^d,1)=wp(ix^d,v1_)*lambda(ix^d,1,1)+wp(ix^d,v2_)*lambda(ix^d,2,1)+wp(ix^d,v3_)*lambda(ix^d,3,1)
703 vlambda(ix^d,2)=wp(ix^d,v1_)*lambda(ix^d,1,2)+wp(ix^d,v2_)*lambda(ix^d,2,2)+wp(ix^d,v3_)*lambda(ix^d,3,2)
704 vlambda(ix^d,3)=wp(ix^d,v1_)*lambda(ix^d,1,3)+wp(ix^d,v2_)*lambda(ix^d,2,3)+wp(ix^d,v3_)*lambda(ix^d,3,3)
705 end if
706 else if(energy) then
707 vlambda(ix^d,1)=wp(ix^d,v1_)*lambda(ix^d,1,1)+wp(ix^d,v2_)*lambda(ix^d,2,1)
708 vlambda(ix^d,2)=wp(ix^d,v1_)*lambda(ix^d,1,2)+wp(ix^d,v2_)*lambda(ix^d,2,2)
709 end if
710 {end do\}
711 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
712 {do ix^db=ixomin^db,ixomax^db\}
713 if(ndir==2) then
714 if(phi_==2) then
715 w(ix^d,mom(1))=(lambda(ix1+1,ix2,1,1)-lambda(ix1-1,ix2,1,1))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
716 (lambda(ix1,ix2+1,2,1)-lambda(ix1,ix2-1,2,1))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)+&
717 (lambda(ix^d,1,1)-lambda(ix^d,2,2))*invr(ix^d)+w(ix^d,mom(1))
718 w(ix^d,mom(2))=(lambda(ix1+1,ix2,1,2)-lambda(ix1-1,ix2,1,2))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
719 (lambda(ix1,ix2+1,2,2)-lambda(ix1,ix2-1,2,2))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)+&
720 two*lambda(ix^d,1,2)*invr(ix^d)+w(ix^d,mom(2))
721 else
722 w(ix^d,mom(1))=(lambda(ix1+1,ix2,1,1)-lambda(ix1-1,ix2,1,1))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
723 (lambda(ix1,ix2+1,2,1)-lambda(ix1,ix2-1,2,1))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+&
724 lambda(ix^d,1,1)*invr(ix^d)+w(ix^d,mom(1))
725 w(ix^d,mom(2))=(lambda(ix1+1,ix2,1,2)-lambda(ix1-1,ix2,1,2))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
726 (lambda(ix1,ix2+1,2,2)-lambda(ix1,ix2-1,2,2))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+&
727 lambda(ix^d,1,2)*invr(ix^d)+w(ix^d,mom(2))
728 end if
729 else
730 if(phi_==2) then
731 w(ix^d,mom(1))=(lambda(ix1+1,ix2,1,1)-lambda(ix1-1,ix2,1,1))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
732 (lambda(ix1,ix2+1,2,1)-lambda(ix1,ix2-1,2,1))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)+&
733 (lambda(ix^d,1,1)-lambda(ix^d,2,2))*invr(ix^d)+w(ix^d,mom(1))
734 w(ix^d,mom(2))=(lambda(ix1+1,ix2,1,2)-lambda(ix1-1,ix2,1,2))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
735 (lambda(ix1,ix2+1,2,2)-lambda(ix1,ix2-1,2,2))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)+&
736 two*lambda(ix^d,1,2)*invr(ix^d)+w(ix^d,mom(2))
737 w(ix^d,mom(3))=(lambda(ix1+1,ix2,1,3)-lambda(ix1-1,ix2,1,3))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
738 (lambda(ix1,ix2+1,2,3)-lambda(ix1,ix2-1,2,3))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))*invr(ix^d)+&
739 lambda(ix^d,1,3)*invr(ix^d)+w(ix^d,mom(3))
740 else
741 w(ix^d,mom(1))=(lambda(ix1+1,ix2,1,1)-lambda(ix1-1,ix2,1,1))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
742 (lambda(ix1,ix2+1,2,1)-lambda(ix1,ix2-1,2,1))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+&
743 (lambda(ix^d,1,1)-lambda(ix^d,2,2))*invr(ix^d)+w(ix^d,mom(1))
744 w(ix^d,mom(2))=(lambda(ix1+1,ix2,1,3)-lambda(ix1-1,ix2,1,3))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
745 (lambda(ix1,ix2+1,2,3)-lambda(ix1,ix2-1,2,3))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+&
746 two*lambda(ix^d,1,3)*invr(ix^d)+w(ix^d,mom(2))
747 w(ix^d,mom(3))=(lambda(ix1+1,ix2,1,2)-lambda(ix1-1,ix2,1,2))/(x(ix1+1,ix2,1)-x(ix1-1,ix2,1))+&
748 (lambda(ix1,ix2+1,2,2)-lambda(ix1,ix2-1,2,2))/(x(ix1,ix2+1,2)-x(ix1,ix2-1,2))+&
749 lambda(ix^d,1,2)*invr(ix^d)+w(ix^d,mom(3))
750 end if
751 end if
752 {end do\}
753 }
754 {^ifoned
755 {do ix^db=ixmin^db,ixmax^db\}
756 invr(ix^d)=1.d0/x(ix^d,1)
757 if(ndir==1) then
758 ! idim=1, idir=1
759 lambda(ix^d,1,1)=(wp(ix1+1,v1_)-wp(ix1-1,v1_))/(x(ix1+1,1)-x(ix1-1,1))*two*qdtmu
760 divv23=third*lambda(ix^d,1,1)
761 lambda(ix^d,1,1)=lambda(ix^d,1,1)-divv23
762 if(energy) then
763 vlambda(ix^d,1)=wp(ix^d,v1_)*lambda(ix^d,1,1)
764 end if
765 else if(ndir==2) then
766 ! idim=1, idir=1
767 lambda(ix^d,1,1)=(wp(ix1+1,v1_)-wp(ix1-1,v1_))/(x(ix1+1,1)-x(ix1-1,1))*two*qdtmu
768 ! idim=1, idir=2
769 lambda(ix^d,1,2)=(wp(ix1+1,v2_)-wp(ix1-1,v2_))/(x(ix1+1,1)-x(ix1-1,1))
770 if(phi_==2) then
771 ! idim=2, idir=1
772 lambda(ix^d,2,1)=-wp(ix^d,v2_)*invr(ix^d)
773 ! idim=2, idir=2
774 lambda(ix^d,2,2)=+wp(ix^d,v1_)*invr(ix^d)*two*qdtmu
775 else
776 ! idim=2, idir=1
777 lambda(ix^d,2,1)=0.d0
778 ! idim=2, idir=2
779 lambda(ix^d,2,2)=0.d0
780 end if
781 ! dv_i/d_j + dv_j/d_i
782 lambda(ix^d,1,2)=(lambda(ix^d,1,2)+lambda(ix^d,2,1))*qdtmu
783 lambda(ix^d,2,1)=lambda(ix^d,1,2)
784 divv23=third*(lambda(ix^d,1,1)+lambda(ix^d,2,2))
785 lambda(ix^d,1,1)=lambda(ix^d,1,1)-divv23
786 lambda(ix^d,2,2)=lambda(ix^d,2,2)-divv23
787 if(energy) then
788 vlambda(ix^d,1)=wp(ix^d,v1_)*lambda(ix^d,1,1)+wp(ix^d,v2_)*lambda(ix^d,2,1)
789 vlambda(ix^d,2)=wp(ix^d,v1_)*lambda(ix^d,1,2)+wp(ix^d,v2_)*lambda(ix^d,2,2)
790 end if
791 else
792 ! idim=1, idir=1
793 lambda(ix^d,1,1)=(wp(ix1+1,v1_)-wp(ix1-1,v1_))/(x(ix1+1,1)-x(ix1-1,1))*two*qdtmu
794 ! idim=1, idir=2
795 lambda(ix^d,1,2)=(wp(ix1+1,v2_)-wp(ix1-1,v2_))/(x(ix1+1,1)-x(ix1-1,1))
796 ! idim=1, idir=3
797 lambda(ix^d,1,3)=(wp(ix1+1,v3_)-wp(ix1-1,v3_))/(x(ix1+1,1)-x(ix1-1,1))
798 if(phi_==2) then
799 ! idim=2, idir=1
800 lambda(ix^d,2,1)=-wp(ix^d,v2_)*invr(ix^d)
801 ! idim=2, idir=2
802 lambda(ix^d,2,2)=+wp(ix^d,v1_)*invr(ix^d)*two*qdtmu
803 ! idim=2, idir=3
804 lambda(ix^d,2,3)=0.d0
805 ! idim=3, idir=1
806 lambda(ix^d,3,1)=0.d0
807 ! idim=3, idir=2
808 lambda(ix^d,3,2)=0.d0
809 ! idim=3, idir=3
810 lambda(ix^d,3,3)=0.d0
811 else
812 ! idim=2, idir=1
813 lambda(ix^d,2,1)=0.d0
814 ! idim=2, idir=2
815 lambda(ix^d,2,2)=0.d0
816 ! idim=2, idir=3
817 lambda(ix^d,2,3)=0.d0
818 ! idim=3, idir=1
819 lambda(ix^d,3,1)=-wp(ix^d,v3_)*invr(ix^d)
820 ! idim=3, idir=2
821 lambda(ix^d,3,2)=0.d0
822 ! idim=3, idir=3
823 lambda(ix^d,3,3)=wp(ix^d,v1_)*invr(ix^d)*two*qdtmu
824 end if
825 ! dv_i/d_j + dv_j/d_i
826 lambda(ix^d,1,2)=(lambda(ix^d,1,2)+lambda(ix^d,2,1))*qdtmu
827 lambda(ix^d,2,1)=lambda(ix^d,1,2)
828 lambda(ix^d,1,3)=(lambda(ix^d,1,3)+lambda(ix^d,3,1))*qdtmu
829 lambda(ix^d,3,1)=lambda(ix^d,1,3)
830 lambda(ix^d,2,3)=(lambda(ix^d,2,3)+lambda(ix^d,3,2))*qdtmu
831 lambda(ix^d,3,2)=lambda(ix^d,2,3)
832 divv23=third*(lambda(ix^d,1,1)+lambda(ix^d,2,2)+lambda(ix^d,3,3))
833 lambda(ix^d,1,1)=lambda(ix^d,1,1)-divv23
834 lambda(ix^d,2,2)=lambda(ix^d,2,2)-divv23
835 lambda(ix^d,3,3)=lambda(ix^d,3,3)-divv23
836 if(energy) then
837 vlambda(ix^d,1)=wp(ix^d,v1_)*lambda(ix^d,1,1)+wp(ix^d,v2_)*lambda(ix^d,2,1)+wp(ix^d,v3_)*lambda(ix^d,3,1)
838 vlambda(ix^d,2)=wp(ix^d,v1_)*lambda(ix^d,1,2)+wp(ix^d,v2_)*lambda(ix^d,2,2)+wp(ix^d,v3_)*lambda(ix^d,3,2)
839 vlambda(ix^d,3)=wp(ix^d,v1_)*lambda(ix^d,1,3)+wp(ix^d,v2_)*lambda(ix^d,2,3)+wp(ix^d,v3_)*lambda(ix^d,3,3)
840 end if
841 end if
842 {end do\}
843 ! dm/dt= +div(mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v * kr)
844 {do ix^db=ixomin^db,ixomax^db\}
845 if(ndir==1) then
846 w(ix^d,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+w(ix^d,mom(1))
847 else if(ndir==2) then
848 if(phi_==2) then
849 w(ix^d,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+&
850 (lambda(ix^d,1,1)-lambda(ix^d,2,2))*invr(ix^d)+w(ix^d,mom(1))
851 w(ix^d,mom(2))=(lambda(ix1+1,1,2)-lambda(ix1-1,1,2))/(x(ix1+1,1)-x(ix1-1,1))+&
852 two*lambda(ix^d,1,2)*invr(ix^d)+w(ix^d,mom(2))
853 else
854 w(ix^d,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+&
855 (lambda(ix^d,1,1)-lambda(ix^d,2,2))*invr(ix^d)+w(ix^d,mom(1))
856 end if
857 else
858 if(phi_==2) then
859 w(ix^d,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+&
860 (lambda(ix^d,1,1)-lambda(ix^d,2,2))*invr(ix^d)+w(ix^d,mom(1))
861 w(ix^d,mom(2))=(lambda(ix1+1,1,2)-lambda(ix1-1,1,2))/(x(ix1+1,1)-x(ix1-1,1))+&
862 two*lambda(ix^d,1,2)*invr(ix^d)+w(ix^d,mom(2))
863 w(ix^d,mom(3))=(lambda(ix1+1,1,3)-lambda(ix1-1,1,3))/(x(ix1+1,1)-x(ix1-1,1))+&
864 lambda(ix^d,1,3)*invr(ix^d)+w(ix^d,mom(3))
865 else
866 w(ix^d,mom(1))=(lambda(ix1+1,1,1)-lambda(ix1-1,1,1))/(x(ix1+1,1)-x(ix1-1,1))+&
867 (lambda(ix^d,1,1)-lambda(ix^d,2,2))*invr(ix^d)+w(ix^d,mom(1))
868 w(ix^d,mom(2))=(lambda(ix1+1,1,3)-lambda(ix1-1,1,3))/(x(ix1+1,1)-x(ix1-1,1))+&
869 two*lambda(ix^d,1,3)*invr(ix^d)+w(ix^d,mom(2))
870 w(ix^d,mom(3))=(lambda(ix1+1,1,2)-lambda(ix1-1,1,2))/(x(ix1+1,1)-x(ix1-1,1))+&
871 lambda(ix^d,1,2)*invr(ix^d)+w(ix^d,mom(3))
872 end if
873 end if
874 {end do\}
875 }
876 if(energy) then
877 ! de/dt= +div(v.dot.[mu*[d_j v_i+d_i v_j]-(2*mu/3)* div v *kr])
878 ! thus e=e+d_i v_j tensor_ji
879 call divvector(vlambda,ixi^l,ixo^l,invr)
880 w(ixo^s,e_)=w(ixo^s,e_)+invr(ixo^s)
881 end if
882
883 end if
884
885 end subroutine viscosity_add_source_cylinder
886
887 subroutine viscosity_get_dt(w,ixI^L,ixO^L,dtnew,dx^D,x)
888 ! Check diffusion time limit for dt < dtdiffpar * dx**2 / (mu/rho)
890 use mod_geometry
891
892 integer, intent(in) :: ixI^L, ixO^L
893 double precision, intent(in) :: dx^D, x(ixI^S,1:ndim)
894 double precision, intent(in) :: w(ixI^S,1:nw)
895 double precision, intent(inout) :: dtnew
896
897 double precision :: tmp(ixI^S)
898 double precision:: dtdiff_visc, dxinv2(1:ndim), max_mu
899 integer:: idim
900
901 ! Calculate the kinematic viscosity tmp=mu/rho
902 ! here vc_mu must be non-zero!!!
903
904 tmp(ixo^s)=vc_mu/w(ixo^s,rho_)
905
906 if(slab_uniform)then
907 ^d&dxinv2(^d)=one/dx^d**2;
908 do idim=1,ndim
909 dtdiff_visc=dtdiffpar/maxval(tmp(ixo^s)*dxinv2(idim))
910 ! limit the time step
911 dtnew=min(dtnew,dtdiff_visc)
912 enddo
913 else
914 do idim=1,ndim
915 max_mu=maxval(tmp(ixo^s)/block%ds(ixo^s,idim)**2)
916 dtdiff_visc=dtdiffpar/max_mu
917 ! limit the time step
918 dtnew=min(dtnew,dtdiff_visc)
919 enddo
920 endif
921
922 end subroutine viscosity_get_dt
923
924 ! viscInDiv
925 ! Get the viscous stress tensor terms in the idim direction
926 ! Beware : a priori, won't work for ndir /= ndim
927 ! Rq : we work with primitive w variables here
928 ! Rq : ixO^L is already extended by 1 unit in the direction we work on
929
930 subroutine visc_get_flux_prim(w, x, ixI^L, ixO^L, idim, f, energy)
932 use mod_geometry
933 integer, intent(in) :: ixi^l, ixo^l, idim
934 double precision, intent(in) :: w(ixi^s, 1:nw), x(ixi^s, 1:^nd)
935 double precision, intent(inout) :: f(ixi^s, nwflux)
936 logical, intent(in) :: energy
937 integer :: idir, i
938 double precision :: v(ixi^s,1:ndir)
939
940 double precision :: divergence(ixi^s)
941
942 double precision:: lambda(ixi^s,ndir) !, tmp(ixI^S) !gradV(ixI^S,ndir,ndir)
943
944 if (.not. viscindiv) return
945
946 do i=1,ndir
947 v(ixi^s,i)=w(ixi^s,i+1)
948 enddo
949 call divvector(v,ixi^l,ixo^l,divergence)
950
951 call get_crossgrad(ixi^l,ixo^l,x,w,idim,lambda)
952 lambda(ixo^s,idim) = lambda(ixo^s,idim) - (2.d0/3.d0) * divergence(ixo^s)
953
954 ! Compute the idim-th row of the viscous stress tensor
955 do idir = 1, ndir
956 f(ixo^s, mom(idir)) = f(ixo^s, mom(idir)) - vc_mu * lambda(ixo^s,idir)
957 if (energy) f(ixo^s, e_) = f(ixo^s, e_) - vc_mu * lambda(ixo^s,idir) * v(ixi^s,idir)
958 enddo
959
960 end subroutine visc_get_flux_prim
961
962 ! Compute the cross term ( d_i v_j + d_j v_i in Cartesian BUT NOT IN
963 ! CYLINDRICAL AND SPHERICAL )
964 subroutine get_crossgrad(ixI^L,ixO^L,x,w,idim,cross)
966 use mod_geometry
967 integer, intent(in) :: ixI^L, ixO^L, idim
968 double precision, intent(in) :: w(ixI^S, 1:nw), x(ixI^S, 1:ndim)
969 double precision, intent(out) :: cross(ixI^S,ndir)
970
971 double precision :: tmp(ixI^S), v(ixI^S)
972 integer :: idir
973
974 if (ndir/=ndim) call mpistop("This formula are probably wrong for ndim/=ndir")
975 ! Beware also, we work w/ the angle as the 3rd component in cylindrical
976 ! and the colatitude as the 2nd one in spherical
977 cross(ixi^s,:)=zero
978 tmp(ixi^s)=zero
979 select case(coordinate)
981 call cart_cross_grad(ixi^l,ixo^l,x,w,idim,cross)
982 case (cylindrical)
983 if (idim==1) then
984 ! for rr and rz
985 call cart_cross_grad(ixi^l,ixo^l,x,w,idim,cross)
986 ! then we overwrite rth w/ the correct expression
987 {^nooned
988 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
989 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th (rq : already contains 1/r)
990 cross(ixi^s,2)=tmp(ixi^s)
991 v(ixi^s)=w(ixi^s,mom(2))/x(ixi^s,1) ! v_th / r
992 call gradient(v,ixi^l,ixo^l,1,tmp) ! d_r
993 cross(ixi^s,2)=cross(ixi^s,2)+tmp(ixi^s)*x(ixi^s,1)
994 }
995 elseif (idim==2) then
996 ! thr (idem as above)
997 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
998 {^nooned
999 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th
1000 cross(ixi^s,1)=tmp(ixi^s)
1001 v(ixi^s)=w(ixi^s,mom(2))/x(ixi^s,1) ! v_th / r
1002 call gradient(v,ixi^l,ixo^l,1,tmp) ! d_r
1003 cross(ixi^s,1)=cross(ixi^s,1)+tmp(ixi^s)*x(ixi^s,1)
1004 ! thth
1005 v(ixi^s)=w(ixi^s,mom(2)) ! v_th
1006 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th
1007 cross(ixi^s,2)=two*tmp(ixi^s)
1008 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
1009 cross(ixi^s,2)=cross(ixi^s,2)+two*v(ixi^s)/x(ixi^s,1) ! + 2 vr/r
1010 !thz
1011 v(ixi^s)=w(ixi^s,mom(3)) ! v_z
1012 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th
1013 }
1014 cross(ixi^s,3)=tmp(ixi^s)
1015 v(ixi^s)=w(ixi^s,mom(2)) ! v_th
1016 {^ifthreed
1017 call gradient(v,ixi^l,ixo^l,3,tmp) ! d_z
1018 }
1019 cross(ixi^s,3)=cross(ixi^s,3)+tmp(ixi^s)
1020 {^ifthreed
1021 elseif (idim==3) then
1022 ! for zz and rz
1023 call cart_cross_grad(ixi^l,ixo^l,x,w,idim,cross)
1024 ! then we overwrite zth w/ the correct expression
1025 !thz
1026 v(ixi^s)=w(ixi^s,mom(3)) ! v_z
1027 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th
1028 cross(ixi^s,2)=tmp(ixi^s)
1029 v(ixi^s)=w(ixi^s,mom(2)) ! v_th
1030 call gradient(v,ixi^l,ixo^l,3,tmp) ! d_z
1031 cross(ixi^s,2)=cross(ixi^s,2)+tmp(ixi^s)
1032 }
1033 endif
1034 case (spherical)
1035 if (idim==1) then
1036 ! rr (normal, simply 2 * dr vr)
1037 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
1038 call gradient(v,ixi^l,ixo^l,1,tmp) ! d_r
1039 cross(ixi^s,1)=two*tmp(ixi^s)
1040 !rth
1041 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
1042 {^nooned
1043 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th (rq : already contains 1/r)
1044 cross(ixi^s,2)=tmp(ixi^s)
1045 v(ixi^s)=w(ixi^s,mom(2))/x(ixi^s,1) ! v_th / r
1046 call gradient(v,ixi^l,ixo^l,1,tmp) ! d_r
1047 cross(ixi^s,2)=cross(ixi^s,2)+tmp(ixi^s)*x(ixi^s,1)
1048 }
1049 {^ifthreed
1050 !rph
1051 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
1052 call gradient(v,ixi^l,ixo^l,3,tmp) ! d_phi (rq : contains 1/rsin(th))
1053 cross(ixi^s,3)=tmp(ixi^s)
1054 v(ixi^s)=w(ixi^s,mom(3))/x(ixi^s,1) ! v_phi / r
1055 call gradient(v,ixi^l,ixo^l,1,tmp) ! d_r
1056 cross(ixi^s,3)=cross(ixi^s,3)+tmp(ixi^s)*x(ixi^s,1)
1057 }
1058 elseif (idim==2) then
1059 ! thr
1060 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
1061 {^nooned
1062 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th (rq : already contains 1/r)
1063 cross(ixi^s,1)=tmp(ixi^s)
1064 v(ixi^s)=w(ixi^s,mom(2))/x(ixi^s,1) ! v_th / r
1065 call gradient(v,ixi^l,ixo^l,1,tmp) ! d_r
1066 cross(ixi^s,1)=cross(ixi^s,1)+tmp(ixi^s)*x(ixi^s,1)
1067 ! thth
1068 v(ixi^s)=w(ixi^s,mom(2)) ! v_th
1069 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th
1070 cross(ixi^s,2)=two*tmp(ixi^s)
1071 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
1072 cross(ixi^s,2)=cross(ixi^s,2)+two*v(ixi^s)/x(ixi^s,1) ! + 2 vr/r
1073 }
1074 {^ifthreed
1075 !thph
1076 v(ixi^s)=w(ixi^s,mom(2)) ! v_th
1077 call gradient(v,ixi^l,ixo^l,3,tmp) ! d_phi (rq : contains 1/rsin(th))
1078 cross(ixi^s,3)=tmp(ixi^s)
1079 v(ixi^s)=w(ixi^s,mom(3))/dsin(x(ixi^s,2)) ! v_ph / sin(th)
1080 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th
1081 cross(ixi^s,3)=cross(ixi^s,3)+tmp(ixi^s)*dsin(x(ixi^s,2))
1082 }
1083 {^ifthreed
1084 elseif (idim==3) then
1085 !phr
1086 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
1087 call gradient(v,ixi^l,ixo^l,3,tmp) ! d_phi
1088 cross(ixi^s,1)=tmp(ixi^s)
1089 v(ixi^s)=w(ixi^s,mom(3))/x(ixi^s,1) ! v_phi / r
1090 call gradient(v,ixi^l,ixo^l,1,tmp) ! d_r
1091 cross(ixi^s,1)=cross(ixi^s,1)+tmp(ixi^s)*x(ixi^s,1)
1092 !phth
1093 v(ixi^s)=w(ixi^s,mom(2)) ! v_th
1094 call gradient(v,ixi^l,ixo^l,3,tmp) ! d_phi
1095 cross(ixi^s,2)=tmp(ixi^s)
1096 v(ixi^s)=w(ixi^s,mom(3))/dsin(x(ixi^s,2)) ! v_ph / sin(th)
1097 call gradient(v,ixi^l,ixo^l,2,tmp) ! d_th
1098 cross(ixi^s,2)=cross(ixi^s,2)+tmp(ixi^s)*dsin(x(ixi^s,2))
1099 !phph
1100 v(ixi^s)=w(ixi^s,mom(3)) ! v_ph
1101 call gradient(v,ixi^l,ixo^l,3,tmp) ! d_phi
1102 cross(ixi^s,3)=two*tmp(ixi^s)
1103 v(ixi^s)=w(ixi^s,mom(1)) ! v_r
1104 cross(ixi^s,3)=cross(ixi^s,3)+two*v(ixi^s)/x(ixi^s,1) ! + 2 vr/r
1105 v(ixi^s)=w(ixi^s,mom(2)) ! v_th
1106 cross(ixi^s,3)=cross(ixi^s,3)+two*v(ixi^s)/(x(ixi^s,1)*dtan(x(ixi^s,2))) ! + 2 vth/(rtan(th))
1107 }
1108 endif
1109 case default
1110 call mpistop("Unknown geometry specified")
1111 end select
1112
1113 end subroutine get_crossgrad
1114
1115 !> yields d_i v_j + d_j v_i for a given i, OK in Cartesian and for some
1116 !> tensor terms in cylindrical (rr & rz) and in spherical (rr)
1117 subroutine cart_cross_grad(ixI^L,ixO^L,x,w,idim,cross)
1119 use mod_geometry
1120 integer, intent(in) :: ixI^L, ixO^L, idim
1121 double precision, intent(in) :: w(ixI^S, 1:nw), x(ixI^S, 1:^ND)
1122 double precision, intent(out) :: cross(ixI^S,ndir)
1123
1124 double precision :: tmp(ixI^S), v(ixI^S)
1125 integer :: idir
1126
1127 v(ixi^s)=w(ixi^s,mom(idim))
1128 do idir=1,ndir
1129 call gradient(v,ixi^l,ixo^l,idir,tmp)
1130 cross(ixo^s,idir)=tmp(ixo^s)
1131 enddo
1132 do idir=1,ndir
1133 v(ixi^s)=w(ixi^s,mom(idir))
1134 call gradient(v,ixi^l,ixo^l,idim,tmp)
1135 cross(ixo^s,idir)=cross(ixo^s,idir)+tmp(ixo^s)
1136 enddo
1137
1138 end subroutine cart_cross_grad
1139
1140 subroutine visc_add_source_geom(qdt, ixI^L, ixO^L, wCT, w, x)
1142 use mod_geometry
1143 ! w and wCT conservative variables here
1144 integer, intent(in) :: ixI^L, ixO^L
1145 double precision, intent(in) :: qdt, x(ixI^S, 1:ndim)
1146 double precision, intent(inout) :: wCT(ixI^S, 1:nw), w(ixI^S, 1:nw)
1147 ! to change and to set as a parameter in the parfile once the possibility to
1148 ! solve the equations in an angular momentum conserving form has been
1149 ! implemented (change tvdlf.t eg)
1150 double precision :: vv(ixI^S), divergence(ixI^S)
1151 double precision :: tmp(ixI^S),tmp1(ixI^S)
1152 integer :: i
1153
1154 if (.not. viscindiv) return
1155
1156 select case (coordinate)
1157 case (cylindrical)
1158 ! thth tensor term - - -
1159 ! 1st the cross grad term
1160{^nooned
1161 call gradient(wct(ixi^s,mom(2)),ixi^l,ixo^l,2,tmp1) ! d_th
1162 tmp(ixo^s)=two*(tmp1(ixo^s)+wct(ixo^s,mom(1))/x(ixo^s,1)) ! 2 ( d_th v_th / r + vr/r )
1163 ! 2nd the divergence
1164 call divvector(wct(ixi^s,mom(1:ndir)),ixi^l,ixo^l,divergence)
1165 tmp(ixo^s) = tmp(ixo^s) - (2.d0/3.d0) * divergence(ixo^s)
1166 ! s[mr]=-thth/radius
1167 w(ixo^s,mom(1))=w(ixo^s,mom(1))-qdt*vc_mu*tmp(ixo^s)/x(ixo^s,1)
1168 ! rth tensor term - - -
1169 call gradient(wct(ixi^s,mom(1)),ixi^l,ixo^l,2,tmp) ! d_th
1170 vv(ixi^s)=wct(ixi^s,mom(2))/x(ixi^s,1) ! v_th / r
1171 call gradient(vv,ixi^l,ixo^l,1,tmp1) ! d_r
1172 tmp(ixo^s)=tmp(ixo^s)+tmp1(ixo^s)*x(ixo^s,1)
1173 ! s[mphi]=+rth/radius
1174 w(ixo^s,mom(2))=w(ixo^s,mom(2))+qdt*vc_mu*tmp(ixo^s)/x(ixo^s,1)
1175}
1176 case (spherical)
1177 ! thth tensor term - - -
1178 ! 1st the cross grad term
1179{^nooned
1180 call gradient(wct(ixi^s,mom(2)),ixi^l,ixo^l,2,tmp1) ! d_th
1181 tmp(ixo^s)=two*(tmp1(ixo^s)+wct(ixo^s,mom(1))/x(ixo^s,1)) ! 2 ( 1/r * d_th v_th + vr/r )
1182 ! 2nd the divergence
1183 call divvector(wct(ixi^s,mom(1:ndir)),ixi^l,ixo^l,divergence)
1184 tmp(ixo^s) = tmp(ixo^s) - (2.d0/3.d0) * divergence(ixo^s)
1185 ! s[mr]=-thth/radius
1186 w(ixo^s,mom(1))=w(ixo^s,mom(1))-qdt*vc_mu*tmp(ixo^s)/x(ixo^s,1)
1187}
1188 ! phiphi tensor term - - -
1189 ! 1st the cross grad term
1190{^ifthreed
1191 call gradient(wct(ixi^s,mom(3)),ixi^l,ixo^l,3,tmp1) ! d_phi
1192 tmp(ixo^s)=two*(tmp1(ixo^s)+wct(ixo^s,mom(1))/x(ixo^s,1)+wct(ixo^s,mom(2))/(x(ixo^s,1)*dtan(x(ixo^s,2)))) ! 2 ( 1/rsinth * d_ph v_ph + vr/r + vth/rtanth )
1193}
1194 ! 2nd the divergence
1195 tmp(ixo^s) = tmp(ixo^s) - (2.d0/3.d0) * divergence(ixo^s)
1196 ! s[mr]=-phiphi/radius
1197 w(ixo^s,mom(1))=w(ixo^s,mom(1))-qdt*vc_mu*tmp(ixo^s)/x(ixo^s,1)
1198 ! s[mth]=-cotanth*phiphi/radius
1199{^nooned
1200 w(ixo^s,mom(2))=w(ixo^s,mom(2))-qdt*vc_mu*tmp(ixo^s)/(x(ixo^s,1)*dtan(x(ixo^s,2)))
1201}
1202 ! rth tensor term - - -
1203 call gradient(wct(ixi^s,mom(1)),ixi^l,ixo^l,2,tmp) ! d_th (rq : already contains 1/r)
1204 vv(ixi^s)=wct(ixi^s,mom(2))/x(ixi^s,1) ! v_th / r
1205 call gradient(vv,ixi^l,ixo^l,1,tmp1) ! d_r
1206 tmp(ixo^s)=tmp(ixo^s)+tmp1(ixo^s)*x(ixo^s,1)
1207 ! s[mth]=+rth/radius
1208 w(ixo^s,mom(2))=w(ixo^s,mom(2))+qdt*vc_mu*tmp(ixo^s)/x(ixo^s,1)
1209 ! rphi tensor term - - -
1210{^ifthreed
1211 call gradient(wct(ixi^s,mom(1)),ixi^l,ixo^l,3,tmp) ! d_phi (rq : contains 1/rsin(th))
1212}
1213 vv(ixi^s)=wct(ixi^s,mom(3))/x(ixi^s,1) ! v_phi / r
1214 call gradient(vv,ixi^l,ixo^l,1,tmp1) ! d_r
1215 tmp(ixo^s)=tmp(ixo^s)+tmp1(ixo^s)*x(ixo^s,1)
1216 ! s[mphi]=+rphi/radius
1217 w(ixo^s,mom(3))=w(ixo^s,mom(3))+qdt*vc_mu*tmp(ixo^s)/x(ixo^s,1)
1218 ! phith tensor term - - -
1219{^ifthreed
1220 call gradient(wct(ixi^s,mom(2)),ixi^l,ixo^l,3,tmp) ! d_phi
1221}
1222{^nooned
1223 vv(ixi^s)=wct(ixi^s,mom(3))/dsin(x(ixi^s,2)) ! v_ph / sin(th)
1224 call gradient(vv,ixi^l,ixo^l,2,tmp1) ! d_th
1225 tmp(ixo^s)=tmp(ixo^s)+tmp1(ixo^s)*dsin(x(ixo^s,2))
1226 ! s[mphi]=+cotanth*phith/radius
1227 w(ixo^s,mom(3))=w(ixo^s,mom(3))+qdt*vc_mu*tmp(ixo^s)/(x(ixo^s,1)*dtan(x(ixo^s,2)))
1228}
1229 end select
1230
1231 end subroutine visc_add_source_geom
1232
1233 subroutine sub_add_source(qdt,ixI^L,ixO^L,wCT,wp,w,x,&
1234 energy,qsourcesplit,active)
1236 use mod_geometry
1237 integer, intent(in) :: ixI^L, ixO^L
1238 double precision, intent(in) :: qdt, x(ixI^S,1:ndim), wCT(ixI^S,1:nw), wp(ixI^S,1:nw)
1239 double precision, intent(inout) :: w(ixI^S,1:nw)
1240 logical, intent(in) :: energy,qsourcesplit
1241 logical, intent(inout) :: active
1242 end subroutine sub_add_source
1243
1244end module mod_viscosity
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
Module with geometry-related routines (e.g., divergence, curl)
Definition mod_geometry.t:2
subroutine divvector(qvec, ixil, ixol, divq, nth_in)
integer coordinate
Definition mod_geometry.t:7
integer, parameter spherical
integer, parameter cartesian
Definition mod_geometry.t:8
integer, parameter cylindrical
integer, parameter cartesian_expansion
integer, parameter cartesian_stretched
Definition mod_geometry.t:9
subroutine gradient(q, ixil, ixol, idir, gradq, nth_in)
This module contains definitions of global parameters and variables and some generic functions/subrou...
type(state), pointer block
Block pointer for using one block and its previous state.
double precision dtdiffpar
For resistive MHD, the time step is also limited by the diffusion time: .
integer, parameter unitpar
file handle for IO
logical any_source_split
if any normal source term is added in split fasion
character(len=std_len), dimension(:), allocatable par_files
Which par files are used as input.
integer ndir
Number of spatial dimensions (components) for vector variables.
logical slab_uniform
uniform Cartesian geometry or not (stretched Cartesian)
The module add viscous source terms and check time step.
integer, public, protected v3_
subroutine, public visc_get_flux_prim(w, x, ixil, ixol, idim, f, energy)
integer, public, protected v2_
subroutine get_crossgrad(ixil, ixol, x, w, idim, cross)
subroutine viscosity_add_source_cartesian(qdt, ixil, ixol, wct, wp, w, x, energy, qsourcesplit, active)
subroutine cart_cross_grad(ixil, ixol, x, w, idim, cross)
yields d_i v_j + d_j v_i for a given i, OK in Cartesian and for some tensor terms in cylindrical (rr ...
subroutine sub_add_source(qdt, ixil, ixol, wct, wp, w, x, energy, qsourcesplit, active)
subroutine viscosity_add_source_cylinder(qdt, ixil, ixol, wct, wp, w, x, energy, qsourcesplit, active)
subroutine viscosity_init(phys_wider_stencil)
Initialize the module.
subroutine viscosity_get_dt(w, ixil, ixol, dtnew, dxd, x)
double precision, public vc_mu
Viscosity coefficient.
logical vc_4th_order
fourth order
logical vc_split
source split or not
subroutine visc_add_source_geom(qdt, ixil, ixol, wct, w, x)
subroutine vc_params_read(files)
Read this module"s parameters from a file.
subroutine viscosity_add_source_sphere(qdt, ixil, ixol, wct, wp, w, x, energy, qsourcesplit, active)
logical viscindiv
whether to compute the viscous terms as fluxes (ie in the div on the LHS), or not (by default)
procedure(sub_add_source), pointer, public viscosity_add_source
integer, public, protected v1_
Indices of the velocity for the form of better vectorization.