362 integer,
intent(in) :: ixI^L, ixO^L
363 double precision,
intent(in) :: x(ixI^S,1:ndim)
364 double precision,
intent(in) :: w(ixI^S,1:nw)
366 double precision,
intent(in) :: rho(ixI^S),Te(ixI^S)
367 double precision,
intent(in) :: alpha
368 double precision,
intent(out) :: qvec(ixI^S,1:ndim)
371 double precision,
dimension(ixI^S,1:ndim) :: mf,Bc,Bcf,gradT
372 double precision,
dimension(ixI^S) :: ka,kaf,ke,kef,qdd,Bnorm
373 double precision :: minq,maxq,qd(ixI^S,2**(ndim-1))
374 integer :: idims,idir,ix^D,ix^L,ixC^L,ixA^L,ixB^L
380 if(
allocated(iw_mag))
then
382 {
do ix^db=ixmin^db,ixmax^db\}
383 ^d&mf({ix^d},^d)=w({ix^d},iw_mag(^d))+
block%B0({ix^d},^d,0)\
385 bnorm(ix^d)=dsqrt(^d&mf({ix^d},^d)**2+)
386 if(bnorm(ix^d)/=0.d0)
then
387 bnorm(ix^d)=1.d0/bnorm(ix^d)
389 bnorm(ix^d)=bigdouble
392 ^d&mf({ix^d},^d)=mf({ix^d},^d)*bnorm({ix^d})\
395 {
do ix^db=ixmin^db,ixmax^db\}
397 bnorm(ix^d)=dsqrt(^d&w({ix^d},iw_mag(^d))**2+)
398 if(bnorm(ix^d)/=0.d0)
then
399 bnorm(ix^d)=1.d0/bnorm(ix^d)
401 bnorm(ix^d)=bigdouble
404 ^d&mf({ix^d},^d)=w({ix^d},iw_mag(^d))*bnorm({ix^d})\
408 mf(ix^s,1:ndim)=block%B0(ix^s,1:ndim,0)
411 ixcmax^d=ixomax^d; ixcmin^d=ixomin^d-1;
415 {
do ix^db=ixcmin^db,ixcmax^db\}
416 bc(ix^d,idims)=0.125d0*(mf(ix1,ix2,ix3,idims)+mf(ix1+1,ix2,ix3,idims)&
417 +mf(ix1,ix2+1,ix3,idims)+mf(ix1+1,ix2+1,ix3,idims)&
418 +mf(ix1,ix2,ix3+1,idims)+mf(ix1+1,ix2,ix3+1,idims)&
419 +mf(ix1,ix2+1,ix3+1,idims)+mf(ix1+1,ix2+1,ix3+1,idims))
425 {
do ix^db=ixcmin^db,ixcmax^db\}
426 bc(ix^d,idims)=0.25d0*(mf(ix1,ix2,idims)+mf(ix1+1,ix2,idims)&
427 +mf(ix1,ix2+1,idims)+mf(ix1+1,ix2+1,idims))
434 ixbmax^d=ixmax^d-kr(idims,^d);
435 call gradientf(te,x,ixi^l,ixb^l,idims,gradt(ixi^s,idims))
437 if(fl%tc_constant)
then
438 if(fl%tc_perpendicular)
then
439 ka(ixc^s)=fl%tc_k_para-fl%tc_k_perp
440 ke(ixc^s)=fl%tc_k_perp
442 ka(ixc^s)=fl%tc_k_para
447 {
do ix^db=ixmin^db,ixmax^db\}
448 if(te(ix^d) < block%wextra(ix^d,fl%Tcoff_))
then
449 qdd(ix^d)=fl%tc_k_para*sqrt(block%wextra(ix^d,fl%Tcoff_)**5)
451 qdd(ix^d)=fl%tc_k_para*sqrt(te(ix^d)**5)
455 qdd(ix^s)=fl%tc_k_para*sqrt(te(ix^s)**5)
459 {
do ix^db=ixcmin^db,ixcmax^db\}
460 ka(ix^d)=0.125d0*(qdd(ix1,ix2,ix3)+qdd(ix1+1,ix2,ix3)&
461 +qdd(ix1,ix2+1,ix3)+qdd(ix1+1,ix2+1,ix3)&
462 +qdd(ix1,ix2,ix3+1)+qdd(ix1+1,ix2,ix3+1)&
463 +qdd(ix1,ix2+1,ix3+1)+qdd(ix1+1,ix2+1,ix3+1))
467 {
do ix^db=ixcmin^db,ixcmax^db\}
468 ka(ix^d)=0.25d0*(qdd(ix1,ix2)+qdd(ix1+1,ix2)&
469 +qdd(ix1,ix2+1)+qdd(ix1+1,ix2+1))
473 if(fl%tc_perpendicular)
then
474 qdd(ix^s)=fl%tc_k_perp*rho(ix^s)**2*bnorm(ix^s)**2/dsqrt(te(ix^s))
476 {
do ix^db=ixcmin^db,ixcmax^db\}
477 ke(ix^d)=0.125d0*(qdd(ix1,ix2,ix3)+qdd(ix1+1,ix2,ix3)&
478 +qdd(ix1,ix2+1,ix3)+qdd(ix1+1,ix2+1,ix3)&
479 +qdd(ix1,ix2,ix3+1)+qdd(ix1+1,ix2,ix3+1)&
480 +qdd(ix1,ix2+1,ix3+1)+qdd(ix1+1,ix2+1,ix3+1))
481 if(ke(ix^d)<ka(ix^d))
then
482 ka(ix^d)=ka(ix^d)-ke(ix^d)
490 {
do ix^db=ixcmin^db,ixcmax^db\}
491 ke(ix^d)=0.25d0*(qdd(ix1,ix2)+qdd(ix1+1,ix2)&
492 +qdd(ix1,ix2+1)+qdd(ix1+1,ix2+1))
493 if(ke(ix^d)<ka(ix^d))
then
494 ka(ix^d)=ka(ix^d)-ke(ix^d)
503 if(fl%tc_slope_limiter==0)
then
509 if({ ix^d==0 .and. ^d==idims | .or.})
then
510 ixbmin^d=ixcmin^d+ix^d;
511 ixbmax^d=ixcmax^d+ix^d;
512 qdd(ixc^s)=qdd(ixc^s)+gradt(ixb^s,idims)
516 qvec(ixc^s,idims)=qdd(ixc^s)*0.5d0**(ndim-1)
519 qdd(ixc^s)=sum(qvec(ixc^s,1:ndim)*bc(ixc^s,1:ndim),dim=ndim+1)
522 gradt(ixc^s,idims)=ka(ixc^s)*bc(ixc^s,idims)*qdd(ixc^s)
523 if(fl%tc_perpendicular) gradt(ixc^s,idims)=gradt(ixc^s,idims)+ke(ixc^s)*qvec(ixc^s,idims)
528 ixb^l=ixo^l-kr(idims,^d);
529 ixamax^d=ixomax^d; ixamin^d=ixbmin^d;
531 if({ ix^d==0 .and. ^d==idims | .or.})
then
532 ixbmin^d=ixamin^d-ix^d;
533 ixbmax^d=ixamax^d-ix^d;
534 qvec(ixa^s,idims)=qvec(ixa^s,idims)+gradt(ixb^s,idims)
537 qvec(ixa^s,idims)=qvec(ixa^s,idims)*0.5d0**(ndim-1)
538 if(fl%tc_saturate)
then
543 if({ ix^d==0 .and. ^d==idims | .or.})
then
544 ixbmin^d=ixamin^d-ix^d;
545 ixbmax^d=ixamax^d-ix^d;
546 bcf(ixa^s,idims)=bcf(ixa^s,idims)+bc(ixb^s,idims)
550 bcf(ixa^s,idims)=bcf(ixa^s,idims)*0.5d0**(ndim-1)
551 ixb^l=ixa^l+kr(idims,^d);
552 qdd(ixa^s)=2.75d0*(rho(ixa^s)+rho(ixb^s))*dsqrt(0.5d0*(te(ixa^s)+te(ixb^s)))**3*dabs(bcf(ixa^s,idims))
553 {
do ix^db=ixamin^db,ixamax^db\}
554 if(dabs(qvec(ix^d,idims))>qdd(ix^d))
then
555 qvec(ix^d,idims)=sign(1.d0,qvec(ix^d,idims))*qdd(ix^d)
563 ixamax^d=ixomax^d; ixamin^d=ixomin^d-kr(idims,^d);
566 {
do ix^db=ixamin^db,ixamax^db\}
568 ^d&bcf({ix^d},^d)=0.25d0*(bc({ix^d},^d)+bc(ix1,ix2-1,ix3,^d)&
569 +bc(ix1,ix2,ix3-1,^d)+bc(ix1,ix2-1,ix3-1,^d))\
570 kaf(ix^d)=0.25d0*(ka(ix1,ix2,ix3)+ka(ix1,ix2-1,ix3)&
571 +ka(ix1,ix2,ix3-1)+ka(ix1,ix2-1,ix3-1))
573 if(fl%tc_perpendicular) &
574 kef(ix^d)=0.25d0*(ke(ix1,ix2,ix3)+ke(ix1,ix2-1,ix3)&
575 +ke(ix1,ix2,ix3-1)+ke(ix1,ix2-1,ix3-1))
577 else if(idims==2)
then
578 {
do ix^db=ixamin^db,ixamax^db\}
579 ^d&bcf({ix^d},^d)=0.25d0*(bc({ix^d},^d)+bc(ix1-1,ix2,ix3,^d)&
580 +bc(ix1,ix2,ix3-1,^d)+bc(ix1-1,ix2,ix3-1,^d))\
581 kaf(ix^d)=0.25d0*(ka(ix1,ix2,ix3)+ka(ix1-1,ix2,ix3)&
582 +ka(ix1,ix2,ix3-1)+ka(ix1-1,ix2,ix3-1))
583 if(fl%tc_perpendicular) &
584 kef(ix^d)=0.25d0*(ke(ix1,ix2,ix3)+ke(ix1-1,ix2,ix3)&
585 +ke(ix1,ix2,ix3-1)+ke(ix1-1,ix2,ix3-1))
588 {
do ix^db=ixamin^db,ixamax^db\}
589 ^d&bcf({ix^d},^d)=0.25d0*(bc({ix^d},^d)+bc(ix1,ix2-1,ix3,^d)&
590 +bc(ix1-1,ix2,ix3,^d)+bc(ix1-1,ix2-1,ix3,^d))\
591 kaf(ix^d)=0.25d0*(ka(ix1,ix2,ix3)+ka(ix1,ix2-1,ix3)&
592 +ka(ix1-1,ix2,ix3)+ka(ix1-1,ix2-1,ix3))
593 if(fl%tc_perpendicular) &
594 kef(ix^d)=0.25d0*(ke(ix1,ix2,ix3)+ke(ix1,ix2-1,ix3)&
595 +ke(ix1-1,ix2,ix3)+ke(ix1-1,ix2-1,ix3))
601 {
do ix^db=ixamin^db,ixamax^db\}
602 ^d&bcf({ix^d},^d)=0.5d0*(bc(ix1,ix2,^d)+bc(ix1,ix2-1,^d))\
603 kaf(ix^d)=0.5d0*(ka(ix1,ix2)+ka(ix1,ix2-1))
604 if(fl%tc_perpendicular) &
605 kef(ix^d)=0.5d0*(ke(ix1,ix2)+ke(ix1,ix2-1))
608 {
do ix^db=ixamin^db,ixamax^db\}
609 ^d&bcf({ix^d},^d)=0.5d0*(bc(ix1,ix2,^d)+bc(ix1-1,ix2,^d))\
610 kaf(ix^d)=0.5d0*(ka(ix1,ix2)+ka(ix1-1,ix2))
611 if(fl%tc_perpendicular) &
612 kef(ix^d)=0.5d0*(ke(ix1,ix2)+ke(ix1-1,ix2))
620 {
do ix^db=ixcmin^db,ixcmax^db\}
621 qdd(ix^d)=0.25d0*(gradt(ix1,ix2,ix3,idims)+gradt(ix1,ix2+1,ix3,idims)&
622 +gradt(ix1,ix2,ix3+1,idims)+gradt(ix1,ix2+1,ix3+1,idims))
624 else if(idims==2)
then
625 {
do ix^db=ixcmin^db,ixcmax^db\}
626 qdd(ix^d)=0.25d0*(gradt(ix1,ix2,ix3,idims)+gradt(ix1+1,ix2,ix3,idims)&
627 +gradt(ix1,ix2,ix3+1,idims)+gradt(ix1+1,ix2,ix3+1,idims))
630 {
do ix^db=ixcmin^db,ixcmax^db\}
631 qdd(ix^d)=0.25d0*(gradt(ix1,ix2,ix3,idims)+gradt(ix1+1,ix2,ix3,idims)&
632 +gradt(ix1,ix2+1,ix3,idims)+gradt(ix1+1,ix2+1,ix3,idims))
638 {
do ix^db=ixcmin^db,ixcmax^db\}
639 qdd(ix^d)=0.5d0*(gradt(ix1,ix2,idims)+gradt(ix1,ix2+1,idims))
642 {
do ix^db=ixcmin^db,ixcmax^db\}
643 qdd(ix^d)=0.5d0*(gradt(ix1,ix2,idims)+gradt(ix1+1,ix2,idims))
650 {
do ix^db=ixamin^db,ixamax^db\}
651 minq=min(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
652 maxq=max(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
653 if(qdd(ix^d)<minq)
then
655 else if(qdd(ix^d)>maxq)
then
660 if(qdd(ix1,ix2-1,ix3)<minq)
then
662 else if(qdd(ix1,ix2-1,ix3)>maxq)
then
665 qd(ix^d,2)=qdd(ix1,ix2-1,ix3)
667 if(qdd(ix1,ix2,ix3-1)<minq)
then
669 else if(qdd(ix1,ix2,ix3-1)>maxq)
then
672 qd(ix^d,3)=qdd(ix1,ix2,ix3-1)
674 if(qdd(ix1,ix2-1,ix3-1)<minq)
then
676 else if(qdd(ix1,ix2-1,ix3-1)>maxq)
then
679 qd(ix^d,4)=qdd(ix1,ix2-1,ix3-1)
681 qvec(ix^d,idims)=kaf(ix^d)*0.25d0*(bc(ix^d,idims)**2*qd(ix^d,1)+bc(ix1,ix2-1,ix3,idims)**2*qd(ix^d,2)&
682 +bc(ix1,ix2,ix3-1,idims)**2*qd(ix^d,3)+bc(ix1,ix2-1,ix3-1,idims)**2*qd(ix^d,4))
683 if(fl%tc_perpendicular) &
684 qvec(ix^d,idims)=qvec(ix^d,idims)+kef(ix^d)*0.25d0*(qd(ix^d,1)+qd(ix^d,2)+qd(ix^d,3)+qd(ix^d,4))
686 else if(idims==2)
then
687 {
do ix^db=ixamin^db,ixamax^db\}
688 minq=min(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
689 maxq=max(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
690 if(qdd(ix^d)<minq)
then
692 else if(qdd(ix^d)>maxq)
then
697 if(qdd(ix1-1,ix2,ix3)<minq)
then
699 else if(qdd(ix1-1,ix2,ix3)>maxq)
then
702 qd(ix^d,2)=qdd(ix1-1,ix2,ix3)
704 if(qdd(ix1,ix2,ix3-1)<minq)
then
706 else if(qdd(ix1,ix2,ix3-1)>maxq)
then
709 qd(ix^d,3)=qdd(ix1,ix2,ix3-1)
711 if(qdd(ix1-1,ix2,ix3-1)<minq)
then
713 else if(qdd(ix1-1,ix2,ix3-1)>maxq)
then
716 qd(ix^d,4)=qdd(ix1-1,ix2,ix3-1)
718 qvec(ix^d,idims)=kaf(ix^d)*0.25d0*(bc(ix^d,idims)**2*qd(ix^d,1)+bc(ix1-1,ix2,ix3,idims)**2*qd(ix^d,2)&
719 +bc(ix1,ix2,ix3-1,idims)**2*qd(ix^d,3)+bc(ix1-1,ix2,ix3-1,idims)**2*qd(ix^d,4))
720 if(fl%tc_perpendicular) &
721 qvec(ix^d,idims)=qvec(ix^d,idims)+kef(ix^d)*0.25d0*(qd(ix^d,1)+qd(ix^d,2)+qd(ix^d,3)+qd(ix^d,4))
724 {
do ix^db=ixamin^db,ixamax^db\}
725 minq=min(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
726 maxq=max(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
727 if(qdd(ix^d)<minq)
then
729 else if(qdd(ix^d)>maxq)
then
734 if(qdd(ix1-1,ix2,ix3)<minq)
then
736 else if(qdd(ix1-1,ix2,ix3)>maxq)
then
739 qd(ix^d,2)=qdd(ix1-1,ix2,ix3)
741 if(qdd(ix1,ix2-1,ix3)<minq)
then
743 else if(qdd(ix1,ix2-1,ix3)>maxq)
then
746 qd(ix^d,3)=qdd(ix1,ix2-1,ix3)
748 if(qdd(ix1-1,ix2-1,ix3)<minq)
then
750 else if(qdd(ix1-1,ix2-1,ix3)>maxq)
then
753 qd(ix^d,4)=qdd(ix1-1,ix2-1,ix3)
755 qvec(ix^d,idims)=kaf(ix^d)*0.25d0*(bc(ix^d,idims)**2*qd(ix^d,1)+bc(ix1-1,ix2,ix3,idims)**2*qd(ix^d,2)&
756 +bc(ix1,ix2-1,ix3,idims)**2*qd(ix^d,3)+bc(ix1-1,ix2-1,ix3,idims)**2*qd(ix^d,4))
757 if(fl%tc_perpendicular) &
758 qvec(ix^d,idims)=qvec(ix^d,idims)+kef(ix^d)*0.25d0*(qd(ix^d,1)+qd(ix^d,2)+qd(ix^d,3)+qd(ix^d,4))
764 {
do ix^db=ixamin^db,ixamax^db\}
765 minq=min(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
766 maxq=max(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
767 if(qdd(ix^d)<minq)
then
769 else if(qdd(ix^d)>maxq)
then
774 if(qdd(ix1,ix2-1)<minq)
then
776 else if(qdd(ix1,ix2-1)>maxq)
then
779 qd(ix^d,2)=qdd(ix1,ix2-1)
781 qvec(ix^d,idims)=kaf(ix^d)*0.5d0*(bc(ix1,ix2,idims)**2*qd(ix^d,1)+bc(ix1,ix2-1,idims)**2*qd(ix^d,2))
782 if(fl%tc_perpendicular) &
783 qvec(ix^d,idims)=qvec(ix^d,idims)+kef(ix^d)*0.5d0*(qd(ix^d,1)+qd(ix^d,2))
786 {
do ix^db=ixamin^db,ixamax^db\}
787 minq=min(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
788 maxq=max(alpha*gradt(ix^d,idims),gradt(ix^d,idims)/alpha)
789 if(qdd(ix^d)<minq)
then
791 else if(qdd(ix^d)>maxq)
then
796 if(qdd(ix1-1,ix2)<minq)
then
798 else if(qdd(ix1-1,ix2)>maxq)
then
801 qd(ix^d,2)=qdd(ix1-1,ix2)
803 qvec(ix^d,idims)=kaf(ix^d)*0.5d0*(bc(ix1,ix2,idims)**2*qd(ix^d,1)+bc(ix1-1,ix2,idims)**2*qd(ix^d,2))
804 if(fl%tc_perpendicular) &
805 qvec(ix^d,idims)=qvec(ix^d,idims)+kef(ix^d)*0.5d0*(qd(ix^d,1)+qd(ix^d,2))
810 ixb^l=ixa^l+kr(idims,^d);
811 bnorm(ixa^s)=0.5d0*(mf(ixa^s,idims)+mf(ixb^s,idims))
814 ixbmax^d=ixamax^d+kr(idims,^d);
816 if(idir==idims) cycle
817 qdd(ixi^s)=
slope_limiter(gradt(ixi^s,idir),ixi^l,ixb^l,idir,-1,fl%tc_slope_limiter)
818 qdd(ixi^s)=
slope_limiter(qdd,ixi^l,ixa^l,idims,1,fl%tc_slope_limiter)
819 qvec(ixa^s,idims)=qvec(ixa^s,idims)+kaf(ixa^s)*bnorm(ixa^s)*bcf(ixa^s,idir)*qdd(ixa^s)
821 if(fl%tc_saturate)
then
824 ixb^l=ixa^l+kr(idims,^d);
825 qdd(ixa^s)=2.75d0*(rho(ixa^s)+rho(ixb^s))*dsqrt(0.5d0*(te(ixa^s)+te(ixb^s)))**3*dabs(bnorm(ixa^s))
826 {
do ix^db=ixamin^db,ixamax^db\}
827 if(dabs(qvec(ix^d,idims))>qdd(ix^d))
then
828 qvec(ix^d,idims)=sign(1.d0,qvec(ix^d,idims))*qdd(ix^d)