@@ -28,6 +28,7 @@ MODULE mod_pos
2828 ! ! - gser (P)
2929 ! ! - gcf (P)
3030 ! ! - gammln (P)
31+ ! ! - update_bounce (copy paste from mod_pos_tstep)
3132 ! !
3233 ! !------------------------------------------------------------------------------
3334
@@ -2032,6 +2033,116 @@ FUNCTION gammln(xx)
20322033
20332034 END FUNCTION gammln
20342035
2036+ SUBROUTINE update_bounce (ia , iam , ja , ka , x0 , y0 , z0 )
2037+ ! --------------------------------------------------
2038+ !
2039+ ! Purpose:
2040+ ! Update the indexes of the trajectory in case of
2041+ ! a sudden change of fluxes sign
2042+ !
2043+ ! --------------------------------------------------
2044+
2045+ ! Position indexes
2046+ INTEGER , INTENT (INOUT ) :: ia, iam, ja, ka
2047+ INTEGER :: tmpia, tmpiam, tmpja, tmpka
2048+
2049+ ! Real positions
2050+ REAL (DP), INTENT (INOUT ) :: x0, y0, z0
2051+
2052+ ! Fluxes
2053+ REAL (DP) :: uu, um ! Fluxes
2054+
2055+ ! Temporal storage of indexes
2056+ tmpia = ia
2057+ tmpiam = iam
2058+ tmpja = ja
2059+ tmpka = ka
2060+
2061+ ! Zonal walls
2062+ IF (x0 == DBLE (ia)) THEN
2063+
2064+ uu = (intrpg* uflux(ia,ja,ka,nsp) + intrpr* uflux(ia,ja,ka,nsm))
2065+
2066+ IF (uu .GT. 0.d0 ) THEN
2067+ ! Redifine the indexes
2068+ tmpiam = ia
2069+ tmpia = ia + 1
2070+ IF ( (tmpia .EQ. IMT + 1 ) .AND. (iperio .EQ. 1 )) tmpia = 1
2071+ END IF
2072+
2073+ ELSE IF (x0 == DBLE (iam)) THEN
2074+
2075+ um = (intrpg* uflux(iam,ja,ka,nsp) + intrpr* uflux(iam,ja,ka,nsm))
2076+
2077+ IF (um .LT. 0.d0 ) THEN
2078+ ! Redifine the indexes
2079+ tmpia = iam
2080+ tmpiam = tmpia - 1
2081+ IF ( (tmpiam .EQ. 0 ) .AND. (iperio .EQ. 1 ) ) tmpiam = IMT
2082+ END IF
2083+
2084+ END IF
2085+
2086+ ! Meridional wall
2087+ IF (y0 == DBLE (ja)) THEN
2088+
2089+ uu = (intrpg* vflux(ia,ja,ka,nsp) + intrpr* vflux(ia,ja,ka,nsm))
2090+
2091+ IF (uu .GT. 0.d0 ) THEN
2092+ ! Redifine the indexes
2093+ tmpja = ja + 1
2094+ END IF
2095+
2096+ ELSE IF (y0 == DBLE (ja-1 )) THEN
2097+
2098+ um = (intrpg* vflux(ia,ja-1 ,ka,nsp) + intrpr* vflux(ia,ja-1 ,ka,nsm))
2099+
2100+ IF (um .LT. 0.d0 ) THEN
2101+ ! Redifine the indexes
2102+ tmpja = ja - 1
2103+ END IF
2104+
2105+ END IF
2106+
2107+ ! Vertical wall
2108+ IF (z0 == DBLE (ka)) THEN
2109+
2110+ ! Recalculate the fluxes
2111+ #if defined w_explicit
2112+ uu = (intrpg* wflux(ia,ja,ka ,nsp) + intrpr* wflux(ia,ja,ka ,nsm))
2113+ #else
2114+ CALL vertvel(ia,iam,ja,ka)
2115+ uu = (intrpg* wflux(ka ,nsp) + intrpr* wflux(ka ,nsm))
2116+ #endif
2117+ IF (uu .GT. 0.d0 ) THEN
2118+ ! Redifine the indexes
2119+ tmpka = ka + 1
2120+ END IF
2121+
2122+ ELSE IF (z0 == DBLE (ka-1 )) THEN
2123+
2124+ #if defined w_explicit
2125+ um = (intrpg* wflux(ia,ja,ka-1 ,nsp) + intrpr* wflux(ia,ja,ka-1 ,nsm))
2126+ #else
2127+ CALL vertvel(ia,iam,ja,ka)
2128+ um = (intrpg* wflux(ka-1 ,nsp) + intrpr* wflux(ka-1 ,nsm))
2129+ #endif
2130+
2131+ IF (um .LT. 0.d0 ) THEN
2132+ ! Redifine the indexes
2133+ tmpka = ka - 1
2134+ END IF
2135+
2136+ END IF
2137+
2138+ ! Reassign indexes
2139+ ia = tmpia
2140+ iam = tmpiam
2141+ ja = tmpja
2142+ ka = tmpka
2143+
2144+ END SUBROUTINE update_bounce
2145+
20352146END MODULE mod_pos
20362147
20372148#endif
0 commit comments