Considera el programa bugod.f que integra la ecuación de Burgers (ver práctica 2) usando el método de Godunov (primer orden).
DO I = 0, CELLS+2 S(I) = (U(I) - U(I-1))/DX END DO
Limitador de pendiente MINMOD:
DO I = 0, CELLS+1 IF ((S(I).EQ.0.0).OR.(S(I+1).EQ.0.0)) THEN SL(I) = 0.0 ELSE SL(I) = 0.5*(S(I)/ABS(S(I)) + S(I+1)/ABS(S(I+1))) & *AMIN1(ABS(S(I)),ABS(S(I+1))) END IF UM(I) = U(I) - SL(I)*DX/2.0 UP(I) = U(I) + SL(I)*DX/2.0 END DO
Limitador de pendiente SUPERBEE:
DO I = 0, CELLS+1 IF ((S(I).EQ.0.0).OR.(S(I+1).EQ.0.0)) THEN SL(I) = 0.0 ELSE IF (ABS(S(I)).GE.ABS(S(I+1))) THEN SL(I) = 0.5*(S(I)/ABS(S(I)) + S(I+1)/ABS(S(I+1))) & *AMIN1(ABS(S(I)),ABS(2*S(I+1))) ELSE SL(I) = 0.5*(S(I)/ABS(S(I)) + S(I+1)/ABS(S(I+1))) *AMIN1(ABS(2*S(I)),ABS(S(I+1))) END IF UM(I) = U(I) - SL(I)*DX/2.0 UP(I) = U(I) + SL(I)*DX/2.0 END DO
Limitador de pendiente VANLEER:
DO I = 0, CELLS+1 IF ((S(I).EQ.0.0).AND.(S(I+1).EQ.0.0)) THEN SL(I) = 0.0 ELSE SL(I) = 2.D0*S(I)*S(I+1)/(S(I) + S(I+1)) END IF UM(I) = U(I) - SL(I)*DX/2.D0 UP(I) = U(I) + SL(I)*DX/2.D0 END DO
DO 10 I = 0, CELLS UL = UP(I) UR = UM(I+1) ... 10 CONTINUE
Implementa el siguiente algoritmo de Runge-Kutta en el avance temporal de bugod.f para conseguir segundo orden de precisión temporal: