@@ -1451,6 +1451,159 @@ END FUNCTION MP5
14511451END SUBROUTINE GET_SCALAR_FACE_VALUE
14521452
14531453
1454+ SUBROUTINE GET_SCALAR_FACE_COEF (A ,U ,BF ,I1 ,I2 ,J1 ,J2 ,K1 ,K2 ,IOR ,LIMITER )
1455+
1456+ USE GLOBAL_CONSTANTS, ONLY: CENTRAL_LIMITER,GODUNOV_LIMITER,SUPERBEE_LIMITER,CHARM_LIMITER
1457+
1458+ REAL (EB), INTENT (IN ) :: A(0 :,0 :,0 :),U(- 1 :,- 1 :,- 1 :)
1459+ REAL (EB), INTENT (INOUT ) :: BF(0 :,0 :,0 :)
1460+ INTEGER , INTENT (IN ) :: LIMITER,I1,I2,J1,J2,K1,K2,IOR
1461+ REAL (EB) :: R,B,DU_UP,DU_LOC
1462+ INTEGER :: I,J,K,IM1,JM1,KM1,IP1,JP1,KP1,IP2,JP2,KP2
1463+
1464+ SELECT CASE (LIMITER)
1465+ CASE (GODUNOV_LIMITER,CENTRAL_LIMITER)
1466+ BF= 0._EB
1467+ RETURN
1468+ END SELECT
1469+
1470+ SELECT CASE (IOR)
1471+ CASE (1 ) ; IM1=- 1 ; JM1= 0 ; KM1= 0 ; IP1= 1 ; JP1= 0 ; KP1= 0 ; IP2= 2 ; JP2= 0 ; KP2= 0
1472+ CASE (2 ) ; IM1= 0 ; JM1=- 1 ; KM1= 0 ; IP1= 0 ; JP1= 1 ; KP1= 0 ; IP2= 0 ; JP2= 2 ; KP2= 0
1473+ CASE (3 ) ; IM1= 0 ; JM1= 0 ; KM1=- 1 ; IP1= 0 ; JP1= 0 ; KP1= 1 ; IP2= 0 ; JP2= 0 ; KP2= 2
1474+ END SELECT
1475+
1476+ ! $OMP PARALLEL DEFAULT(NONE) IF(I2>1) &
1477+ ! $OMP& SHARED(U,A,BF,I1,I2,J1,J2,K1,K2,IP1,JP1,KP1,IM1,JM1,KM1,IP2,JP2,KP2,LIMITER) &
1478+ ! $OMP& PRIVATE(I,J,K,DU_UP,DU_LOC,B,R)
1479+
1480+ SELECT CASE (LIMITER)
1481+
1482+ CASE (SUPERBEE_LIMITER)
1483+ ! $OMP DO COLLAPSE(3) SCHEDULE(STATIC)
1484+ DO K= K1,K2
1485+ DO J= J1,J2
1486+ DO I= I1,I2
1487+ DU_LOC = U(I+ IP1,J+ JP1,K+ KP1) - U(I,J,K)
1488+ IF (A(I,J,K) > 0._EB ) THEN
1489+ DU_UP = U(I,J,K) - U(I+ IM1,J+ JM1,K+ KM1)
1490+ ELSE
1491+ DU_UP = U(I+ IP2,J+ JP2,K+ KP2) - U(I+ IP1,J+ JP1,K+ KP1)
1492+ ENDIF
1493+ R = 0._EB ; B = 0._EB
1494+ IF (ABS (DU_LOC) > TWO_EPSILON_EB) R = DU_UP/ DU_LOC
1495+ IF (R > TWO_EPSILON_EB) B = MAX (0._EB , MIN (2._EB * R,1._EB ), MIN (R,2._EB ))
1496+ BF(I,J,K) = MAX (0._EB , MIN (B, BF(I,J,K)))
1497+ ENDDO
1498+ ENDDO
1499+ ENDDO
1500+ ! $OMP END DO
1501+
1502+ CASE (CHARM_LIMITER)
1503+ ! $OMP DO COLLAPSE(3) SCHEDULE(STATIC)
1504+ DO K= K1,K2
1505+ DO J= J1,J2
1506+ DO I= I1,I2
1507+ DU_LOC = U(I+ IP1,J+ JP1,K+ KP1) - U(I,J,K)
1508+ IF (A(I,J,K) > 0._EB ) THEN
1509+ DU_UP = U(I,J,K) - U(I+ IM1,J+ JM1,K+ KM1)
1510+ ELSE
1511+ DU_UP = U(I+ IP2,J+ JP2,K+ KP2) - U(I+ IP1,J+ JP1,K+ KP1)
1512+ ENDIF
1513+ R = 0._EB ; B = 0._EB
1514+ IF (ABS (DU_UP) > TWO_EPSILON_EB) R = DU_LOC/ DU_UP
1515+ IF (R > TWO_EPSILON_EB) B = R* (3._EB * R+1._EB )/ ((R+1._EB )** 2 )
1516+ BF(I,J,K) = MAX (0._EB , MIN (B, BF(I,J,K)))
1517+ ENDDO
1518+ ENDDO
1519+ ENDDO
1520+ ! $OMP END DO
1521+
1522+ END SELECT
1523+ ! $OMP END PARALLEL
1524+
1525+ END SUBROUTINE GET_SCALAR_FACE_COEF
1526+
1527+
1528+ SUBROUTINE GET_SCALAR_FACE_VALUE_NEW (A ,U ,F ,BF ,I1 ,I2 ,J1 ,J2 ,K1 ,K2 ,IOR ,LIMITER )
1529+
1530+ USE GLOBAL_CONSTANTS, ONLY: CENTRAL_LIMITER,GODUNOV_LIMITER,SUPERBEE_LIMITER,CHARM_LIMITER
1531+
1532+ REAL (EB), INTENT (IN ) :: A(0 :,0 :,0 :),U(- 1 :,- 1 :,- 1 :),BF(0 :,0 :,0 :)
1533+ REAL (EB), INTENT (OUT ) :: F(0 :,0 :,0 :)
1534+ INTEGER , INTENT (IN ) :: LIMITER,I1,I2,J1,J2,K1,K2,IOR
1535+ REAL (EB) :: DU_UP,DU_LOC
1536+ INTEGER :: I,J,K,IM1,JM1,KM1,IP1,JP1,KP1,IP2,JP2,KP2
1537+
1538+ SELECT CASE (IOR)
1539+ CASE (1 ) ; IM1=- 1 ; JM1= 0 ; KM1= 0 ; IP1= 1 ; JP1= 0 ; KP1= 0 ; IP2= 2 ; JP2= 0 ; KP2= 0
1540+ CASE (2 ) ; IM1= 0 ; JM1=- 1 ; KM1= 0 ; IP1= 0 ; JP1= 1 ; KP1= 0 ; IP2= 0 ; JP2= 2 ; KP2= 0
1541+ CASE (3 ) ; IM1= 0 ; JM1= 0 ; KM1=- 1 ; IP1= 0 ; JP1= 0 ; KP1= 1 ; IP2= 0 ; JP2= 0 ; KP2= 2
1542+ END SELECT
1543+
1544+ ! $OMP PARALLEL IF(I2>1)
1545+ SELECT CASE (LIMITER)
1546+ CASE (CENTRAL_LIMITER) ! central differencing
1547+ ! $OMP DO SCHEDULE(STATIC)
1548+ DO K= K1,K2
1549+ DO J= J1,J2
1550+ DO I= I1,I2
1551+ F(I,J,K) = 0.5_EB * (U(I,J,K) + U(I+ IP1,J+ JP1,K+ KP1))
1552+ ENDDO
1553+ ENDDO
1554+ ENDDO
1555+ ! $OMP END DO
1556+ CASE (GODUNOV_LIMITER) ! first-order upwinding
1557+ ! $OMP DO SCHEDULE(STATIC)
1558+ DO K= K1,K2
1559+ DO J= J1,J2
1560+ DO I= I1,I2
1561+ IF (A(I,J,K)>0._EB ) THEN
1562+ F(I,J,K) = U(I,J,K)
1563+ ELSE
1564+ F(I,J,K) = U(I+ IP1,J+ JP1,K+ KP1)
1565+ ENDIF
1566+ ENDDO
1567+ ENDDO
1568+ ENDDO
1569+ ! $OMP END DO
1570+ CASE (SUPERBEE_LIMITER) ! SUPERBEE, Roe (1986)
1571+ ! $OMP DO SCHEDULE(STATIC) PRIVATE(DU_LOC)
1572+ DO K= K1,K2
1573+ DO J= J1,J2
1574+ DO I= I1,I2
1575+ DU_LOC = U(I+ IP1,J+ JP1,K+ KP1)- U(I,J,K)
1576+ IF (A(I,J,K)>0._EB ) THEN
1577+ F(I,J,K) = U(I,J,K) + 0.5_EB * BF(I,J,K)* DU_LOC
1578+ ELSE
1579+ F(I,J,K) = U(I+ IP1,J+ JP1,K+ KP1) - 0.5_EB * BF(I,J,K)* DU_LOC
1580+ ENDIF
1581+ ENDDO
1582+ ENDDO
1583+ ENDDO
1584+ ! $OMP END DO
1585+ CASE (CHARM_LIMITER) ! CHARM
1586+ ! $OMP DO SCHEDULE(STATIC) PRIVATE(DU_UP)
1587+ DO K= K1,K2
1588+ DO J= J1,J2
1589+ DO I= I1,I2
1590+ IF (A(I,J,K)>0._EB ) THEN
1591+ DU_UP = U(I,J,K)- U(I+ IM1,J+ JM1,K+ KM1)
1592+ F(I,J,K) = U(I,J,K) + 0.5_EB * BF(I,J,K)* DU_UP
1593+ ELSE
1594+ DU_UP = U(I+ IP2,J+ JP2,K+ KP2)- U(I+ IP1,J+ JP1,K+ KP1)
1595+ F(I,J,K) = U(I+ IP1,J+ JP1,K+ KP1) - 0.5_EB * BF(I,J,K)* DU_UP
1596+ ENDIF
1597+ ENDDO
1598+ ENDDO
1599+ ENDDO
1600+ ! $OMP END DO
1601+ END SELECT
1602+ ! $OMP END PARALLEL
1603+
1604+ END SUBROUTINE GET_SCALAR_FACE_VALUE_NEW
1605+
1606+
14541607! > \brief Random fluctuation, Theta'(t+dt) = R^2*Theta'(t) + Normal(0,sqrt(1-R^2)*SIGMA) ; R = exp(-dt/TAU)
14551608! > \param SIGMA Standard deviation of time series
14561609! > \param TAU Time scale or period of the time function (s)
0 commit comments