87 energy,qsourcesplit,active)
94 integer,
intent(in) :: ixI^L, ixO^L
95 double precision,
intent(in) :: qdt, x(ixI^S,1:ndim), wCT(ixI^S,1:nw)
96 double precision,
intent(inout) :: w(ixI^S,1:nw)
97 logical,
intent(in) :: energy,qsourcesplit
98 logical,
intent(inout) :: active
100 double precision:: lambda(ixI^S,ndir,ndir),tmp(ixI^S),tmp2(ixI^S),v(ixI^S,ndir),vlambda(ixI^S,ndir)
101 integer:: ix^L,idim,idir,jdir,iw
105 if(qsourcesplit .eqv.
vc_split)
then
112 if({ iximin^
d>ixmin^
d .or. iximax^
d<ixmax^
d|.or.})&
113 call mpistop(
"error for viscous source addition, 2 layers needed")
118 if({ iximin^
d>ixmin^
d .or. iximax^
d<ixmax^
d|.or.})&
119 call mpistop(
"error for viscous source addition"//&
120 "requested fourth order gradients: 4 layers needed")
126 v(ixi^s,idir)=wct(ixi^s,mom(idir))/wct(ixi^s,rho_)
134 do idim=1,ndim;
do idir=1,ndir
137 tmp(ixi^s)=v(ixi^s,idir)
141 if (idim==
r_ .and. (idir==2 .or. idir==
phi_))
then
142 tmp(ixi^s) = tmp(ixi^s)/x(ixi^s,1)
144 elseif (idim==2 .and. idir==
phi_)
then
145 tmp(ixi^s)=tmp(ixi^s)/dsin(x(ixi^s,2))
149 call gradient(tmp,ixi^l,ix^l,idim,tmp2)
154 if (idim==
r_ .and. (idir==2 .or. idir==
phi_))
then
155 tmp2(ix^s) = tmp2(ix^s)*x(ix^s,1)
157 elseif (idim==2 .and. idir==
phi_ )
then
158 tmp2(ix^s)=tmp2(ix^s)*dsin(x(ix^s,2))
159 elseif (idim==2 .and. idir==2 )
then
160 tmp2(ix^s)=tmp2(ix^s)+v(ix^s,
r_)/x(ix^s,1)
161 elseif (idim==
phi_.and. idir==
phi_)
then
162 tmp2(ix^s)=tmp2(ix^s)+v(ix^s,
r_)/x(ix^s,1)+v(ix^s,2)/(x(ix^s,1)*dtan(x(ix^s,2)))
166 lambda(ix^s,idim,idir)= lambda(ix^s,idim,idir)+ tmp2(ix^s)
167 lambda(ix^s,idir,idim)= lambda(ix^s,idir,idim)+ tmp2(ix^s)
171 lambda(ix^s,1:ndir,1:ndir)=lambda(ix^s,1:ndir,1:ndir)*
vc_mu*qdt
179 tmp(ix^s)=tmp(ix^s)+lambda(ix^s,idir,idir)
181 tmp(ix^s)=tmp(ix^s)/3.d0
185 lambda(ix^s,idir,idir)=lambda(ix^s,idir,idir)-tmp(ix^s)
192 tmp(ix^s)=lambda(ix^s,idir,idim)
197 if (idim==
r_ .and. idir==
r_ ) tmp(ix^s) = tmp(ix^s)*x(ix^s,1)**two
198 if (idim==
r_ .and. (idir==2 .or. idir==
phi_)) tmp(ix^s) = tmp(ix^s)*x(ix^s,1)**3.d0
200 if (idim==2 .and. (idir==
r_ .or. idir==2)) tmp(ix^s) = tmp(ix^s)*dsin(x(ix^s,2))
201 if (idim==2 .and. idir==
phi_ ) tmp(ix^s) = tmp(ix^s)*dsin(x(ix^s,2))**two
204 call gradient(tmp,ixi^l,ixo^l,idim,tmp2)
209 if (idim==
r_ .and. idir==
r_ ) tmp2(ixo^s) = tmp2(ixo^s)/(x(ixo^s,1)**two)
210 if (idim==
r_ .and. (idir==2 .or. idir==
phi_)) tmp2(ixo^s) = tmp2(ixo^s)/(x(ixo^s,1)**3.d0)
212 if (idim==2 .and. (idir==
r_ .or. idir==2)) tmp2(ixo^s) = tmp2(ixo^s)/(dsin(x(ixo^s,2)))
213 if (idim==2 .and. idir==
phi_ ) tmp2(ixo^s) = tmp2(ixo^s)/(dsin(x(ixo^s,2))**two)
216 w(ixo^s,mom(idir))=w(ixo^s,mom(idir))+tmp2(ixo^s)
222 if (
coordinate==
spherical .and. idir==2 ) w(ixo^s,mom(idir))=w(ixo^s,mom(idir))-lambda(ixo^s,
phi_,
phi_)/(x(ixo^s,1)/dtan(x(ixo^s,2)))
232 vlambda(ixi^s,idim)=vlambda(ixi^s,idim)+v(ixi^s,idir)*lambda(ixi^s,idir,idim)
236 w(ixo^s,e_)=w(ixo^s,e_)+tmp2(ixo^s)
311 integer,
intent(in) :: ixI^L, ixO^L, idim
312 double precision,
intent(in) :: w(ixI^S, 1:nw), x(ixI^S, 1:ndim)
313 double precision,
intent(out) :: cross(ixI^S,ndir)
315 double precision :: tmp(ixI^S), v(ixI^S)
318 if (ndir/=ndim)
call mpistop(
"This formula are probably wrong for ndim/=ndir")
332 v(ixi^s)=w(ixi^s,mom(1))
334 cross(ixi^s,2)=tmp(ixi^s)
335 v(ixi^s)=w(ixi^s,mom(2))/x(ixi^s,1)
337 cross(ixi^s,2)=cross(ixi^s,2)+tmp(ixi^s)*x(ixi^s,1)
339 elseif (idim==2)
then
341 v(ixi^s)=w(ixi^s,mom(1))
344 cross(ixi^s,1)=tmp(ixi^s)
345 v(ixi^s)=w(ixi^s,mom(2))/x(ixi^s,1)
347 cross(ixi^s,1)=cross(ixi^s,1)+tmp(ixi^s)*x(ixi^s,1)
349 v(ixi^s)=w(ixi^s,mom(2))
351 cross(ixi^s,2)=two*tmp(ixi^s)
352 v(ixi^s)=w(ixi^s,mom(1))
353 cross(ixi^s,2)=cross(ixi^s,2)+two*v(ixi^s)/x(ixi^s,1)
355 v(ixi^s)=w(ixi^s,mom(3))
358 cross(ixi^s,3)=tmp(ixi^s)
359 v(ixi^s)=w(ixi^s,mom(2))
363 cross(ixi^s,3)=cross(ixi^s,3)+tmp(ixi^s)
365 elseif (idim==3)
then
370 v(ixi^s)=w(ixi^s,mom(3))
372 cross(ixi^s,2)=tmp(ixi^s)
373 v(ixi^s)=w(ixi^s,mom(2))
375 cross(ixi^s,2)=cross(ixi^s,2)+tmp(ixi^s)
381 v(ixi^s)=w(ixi^s,mom(1))
383 cross(ixi^s,1)=two*tmp(ixi^s)
385 v(ixi^s)=w(ixi^s,mom(1))
388 cross(ixi^s,2)=tmp(ixi^s)
389 v(ixi^s)=w(ixi^s,mom(2))/x(ixi^s,1)
391 cross(ixi^s,2)=cross(ixi^s,2)+tmp(ixi^s)*x(ixi^s,1)
395 v(ixi^s)=w(ixi^s,mom(1))
397 cross(ixi^s,3)=tmp(ixi^s)
398 v(ixi^s)=w(ixi^s,mom(3))/x(ixi^s,1)
400 cross(ixi^s,3)=cross(ixi^s,3)+tmp(ixi^s)*x(ixi^s,1)
402 elseif (idim==2)
then
404 v(ixi^s)=w(ixi^s,mom(1))
407 cross(ixi^s,1)=tmp(ixi^s)
408 v(ixi^s)=w(ixi^s,mom(2))/x(ixi^s,1)
410 cross(ixi^s,1)=cross(ixi^s,1)+tmp(ixi^s)*x(ixi^s,1)
412 v(ixi^s)=w(ixi^s,mom(2))
414 cross(ixi^s,2)=two*tmp(ixi^s)
415 v(ixi^s)=w(ixi^s,mom(1))
416 cross(ixi^s,2)=cross(ixi^s,2)+two*v(ixi^s)/x(ixi^s,1)
420 v(ixi^s)=w(ixi^s,mom(2))
422 cross(ixi^s,3)=tmp(ixi^s)
423 v(ixi^s)=w(ixi^s,mom(3))/dsin(x(ixi^s,2))
425 cross(ixi^s,3)=cross(ixi^s,3)+tmp(ixi^s)*dsin(x(ixi^s,2))
428 elseif (idim==3)
then
430 v(ixi^s)=w(ixi^s,mom(1))
432 cross(ixi^s,1)=tmp(ixi^s)
433 v(ixi^s)=w(ixi^s,mom(3))/x(ixi^s,1)
435 cross(ixi^s,1)=cross(ixi^s,1)+tmp(ixi^s)*x(ixi^s,1)
437 v(ixi^s)=w(ixi^s,mom(2))
439 cross(ixi^s,2)=tmp(ixi^s)
440 v(ixi^s)=w(ixi^s,mom(3))/dsin(x(ixi^s,2))
442 cross(ixi^s,2)=cross(ixi^s,2)+tmp(ixi^s)*dsin(x(ixi^s,2))
444 v(ixi^s)=w(ixi^s,mom(3))
446 cross(ixi^s,3)=two*tmp(ixi^s)
447 v(ixi^s)=w(ixi^s,mom(1))
448 cross(ixi^s,3)=cross(ixi^s,3)+two*v(ixi^s)/x(ixi^s,1)
449 v(ixi^s)=w(ixi^s,mom(2))
450 cross(ixi^s,3)=cross(ixi^s,3)+two*v(ixi^s)/(x(ixi^s,1)*dtan(x(ixi^s,2)))
454 call mpistop(
"Unknown geometry specified")
488 integer,
intent(in) :: ixI^L, ixO^L
489 double precision,
intent(in) :: qdt, x(ixI^S, 1:ndim)
490 double precision,
intent(inout) :: wCT(ixI^S, 1:nw), w(ixI^S, 1:nw)
494 double precision :: vv(ixI^S), divergence(ixI^S)
495 double precision :: tmp(ixI^S),tmp1(ixI^S)
505 call gradient(wct(ixi^s,mom(2)),ixi^l,ixo^l,2,tmp1)
506 tmp(ixo^s)=two*(tmp1(ixo^s)+wct(ixo^s,mom(1))/x(ixo^s,1))
508 call divvector(wct(ixi^s,mom(1:
ndir)),ixi^l,ixo^l,divergence)
509 tmp(ixo^s) = tmp(ixo^s) - (2.d0/3.d0) * divergence(ixo^s)
511 w(ixo^s,mom(1))=w(ixo^s,mom(1))-qdt*
vc_mu*tmp(ixo^s)/x(ixo^s,1)
513 call gradient(wct(ixi^s,mom(1)),ixi^l,ixo^l,2,tmp)
514 vv(ixi^s)=wct(ixi^s,mom(2))/x(ixi^s,1)
515 call gradient(vv,ixi^l,ixo^l,1,tmp1)
516 tmp(ixo^s)=tmp(ixo^s)+tmp1(ixo^s)*x(ixo^s,1)
518 w(ixo^s,mom(2))=w(ixo^s,mom(2))+qdt*
vc_mu*tmp(ixo^s)/x(ixo^s,1)
524 call gradient(wct(ixi^s,mom(2)),ixi^l,ixo^l,2,tmp1)
525 tmp(ixo^s)=two*(tmp1(ixo^s)+wct(ixo^s,mom(1))/x(ixo^s,1))
527 call divvector(wct(ixi^s,mom(1:
ndir)),ixi^l,ixo^l,divergence)
528 tmp(ixo^s) = tmp(ixo^s) - (2.d0/3.d0) * divergence(ixo^s)
530 w(ixo^s,mom(1))=w(ixo^s,mom(1))-qdt*
vc_mu*tmp(ixo^s)/x(ixo^s,1)
535 call gradient(wct(ixi^s,mom(3)),ixi^l,ixo^l,3,tmp1)
536 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))))
539 tmp(ixo^s) = tmp(ixo^s) - (2.d0/3.d0) * divergence(ixo^s)
541 w(ixo^s,mom(1))=w(ixo^s,mom(1))-qdt*
vc_mu*tmp(ixo^s)/x(ixo^s,1)
544 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)))
547 call gradient(wct(ixi^s,mom(1)),ixi^l,ixo^l,2,tmp)
548 vv(ixi^s)=wct(ixi^s,mom(2))/x(ixi^s,1)
549 call gradient(vv,ixi^l,ixo^l,1,tmp1)
550 tmp(ixo^s)=tmp(ixo^s)+tmp1(ixo^s)*x(ixo^s,1)
552 w(ixo^s,mom(2))=w(ixo^s,mom(2))+qdt*
vc_mu*tmp(ixo^s)/x(ixo^s,1)
555 call gradient(wct(ixi^s,mom(1)),ixi^l,ixo^l,3,tmp)
557 vv(ixi^s)=wct(ixi^s,mom(3))/x(ixi^s,1)
558 call gradient(vv,ixi^l,ixo^l,1,tmp1)
559 tmp(ixo^s)=tmp(ixo^s)+tmp1(ixo^s)*x(ixo^s,1)
561 w(ixo^s,mom(3))=w(ixo^s,mom(3))+qdt*
vc_mu*tmp(ixo^s)/x(ixo^s,1)
564 call gradient(wct(ixi^s,mom(2)),ixi^l,ixo^l,3,tmp)
567 vv(ixi^s)=wct(ixi^s,mom(3))/dsin(x(ixi^s,2))
568 call gradient(vv,ixi^l,ixo^l,2,tmp1)
569 tmp(ixo^s)=tmp(ixo^s)+tmp1(ixo^s)*dsin(x(ixo^s,2))
571 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)))