| | 45 | |
| | 46 | |
| | 47 | === How max speeds are calculated === |
| | 48 | ==== Elliptic max speed depends on the solver ==== |
| | 49 | * Poisson |
| | 50 | {{{ |
| | 51 | elliptic_maxspeed(level)=max(elliptic_maxspeed(level),sqrt(nDim*& |
| | 52 | maxval(abs(Info%q(ir(1,1):ir(1,2),ir(2,1):ir(2,2),ir(3,1):ir(3,2),iPhiGas)-& |
| | 53 | Info%q(il(1,1):il(1,2),il(2,1):il(2,2),il(3,1):il(3,2),iPhiGas))))) |
| | 54 | }}} |
| | 55 | ==== Hydro max speed ==== |
| | 56 | * MUSCL uses maximum speed from the riemann solvers - which is usually just the max of the left and right most waves |
| | 57 | {{{ |
| | 58 | max(ABS(SL),ABS(SR)) |
| | 59 | }}} |
| | 60 | * sweep uses the GetMaxSpeed routine to find the fastest eigen speed on the grid after an update |
| | 61 | {{{ |
| | 62 | SUBROUTINE GetMaxSpeed(Info) |
| | 63 | TYPE(InfoDef) :: Info |
| | 64 | REAL(KIND=qPrec), DIMENSION(:,:,:,:), POINTER :: q |
| | 65 | REAL(KIND=qPREC) :: myMaxSpeed, fast_speed(3), A2, B2, B, dx, A |
| | 66 | INTEGER :: i,j,k,level |
| | 67 | level=Info%level |
| | 68 | dx=levels(level)%dx |
| | 69 | q=>Info%q |
| | 70 | myMaxSpeed=0d0 |
| | 71 | DO i=1, Info%mX(1) |
| | 72 | DO j=1, Info%mX(2) |
| | 73 | DO k=1, Info%mX(3) |
| | 74 | A=SoundSpeed(q(i,j,k,:)) |
| | 75 | A2=q(i,j,k,1)*A**2 |
| | 76 | IF (iE_rad /= 0) THEN |
| | 77 | A2=A2+4d0/9d0*q(i,j,k,iE_rad)*(1d0-exp(-q(i,j,k,iKappa)*dx)) |
| | 78 | A=sqrt(A2/q(i,j,k,1)) |
| | 79 | END IF |
| | 80 | IF (lMHD) THEN |
| | 81 | B2 = SUM(q(i,j,k,iBx:iBz)**2) |
| | 82 | B = A2+B2 |
| | 83 | fast_speed(1:nDim) = sqrt(half*(B+sqrt(B**2-4d0*A2*q(i,j,k,iB(1:nDim))**2))/q(i,j,k,1)) |
| | 84 | mymaxspeed= maxval(abs(q(i,j,k,imom(1:nDim)))/q(i,j,k,1)+fast_speed(1:nDim)) |
| | 85 | ELSE |
| | 86 | ! mymaxspeed=maxval(abs(q(i,j,k,imom(1:nDim)))+A2)/q(i,j,k,1) |
| | 87 | mymaxspeed=sqrt(sum(q(i,j,k,imom(1:nDim))**2))/q(i,j,k,1)+A |
| | 88 | END IF |
| | 89 | IF (mymaxspeed > maxspeed(level)) THEN |
| | 90 | maxspeed(level)=mymaxspeed |
| | 91 | maxspeed_location(level,:)=CellPos(Info, i, j, k) |
| | 92 | END IF |
| | 93 | END DO |
| | 94 | END DO |
| | 95 | END DO |
| | 96 | END SUBROUTINE GetMaxSpeed |
| | 97 | }}} |
| | 98 | |
| | 99 | ==== Particle max speed ==== |
| | 100 | This just finds the fastest particle speed |
| | 101 | {{{ |
| | 102 | ParticleMaxSpeed=max(ParticleMaxSpeed, sqrt(sum(vel(i,1:nDim)**2))) |
| | 103 | }}} |