QU4 derivatives with respect to and without any function call, for speed reasons
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=R8), | intent(out), | dimension(4) | :: | ni4x | ||
real(kind=R8), | intent(out), | dimension(4) | :: | ni4y | ||
real(kind=R8), | intent(in) | :: | ksi | |||
real(kind=R8), | intent(in) | :: | eta | |||
real(kind=R8), | intent(in), | dimension(4) | :: | x | ||
real(kind=R8), | intent(in), | dimension(4) | :: | y | ||
real(kind=R8), | intent(in) | :: | dj |
subroutine calc_ni4_xy_derivatives(ni4x, ni4y, ksi, eta, x, y, dj)
implicit none
real(kind=R8), intent(out), dimension(4) :: ni4x
real(kind=R8), intent(out), dimension(4) :: ni4y
real(kind=R8), intent(in ) :: ksi
real(kind=R8), intent(in ) :: eta
real(kind=R8), intent(in ), dimension(4) :: x
real(kind=R8), intent(in ), dimension(4) :: y
real(kind=R8), intent(in ) :: dj
!~ standard calculation
!~ ni4x = ( j4(4, ksi, eta, x, y)*ni4ksi(numn, eta) -&
!~ j4(3, ksi, eta, x, y)*ni4eta(numn, ksi) )/dj4(ksi, eta, x, y)
!~ ni4y = ( -j4(2, ksi, eta, x, y)*ni4ksi(numn, eta) +&
!~ j4(1, ksi, eta, x, y)*ni4eta(numn, ksi) )/dj4(ksi, eta, x, y)
real(kind=R8) :: km1, kp1, em1, ep1, kme, kpe, & !
x1, x2, x3, x4, & !
y1, y2, y3, y4, & !
kx, ky, ex, ey
km1 = ksi -1._R8
kp1 = ksi +1._R8
em1 = eta -1._R8
ep1 = eta +1._R8
kme = ksi -eta
kpe = ksi +eta
x1 = x(1) ; x2 = x(2) ; x3 = x(3) ; x4 = x(4)
y1 = y(1) ; y2 = y(2) ; y3 = y(3) ; y4 = y(4)
kx = -km1*x1 +kp1*x2 -kp1*x3 +km1*x4
ky = -km1*y1 +kp1*y2 -kp1*y3 +km1*y4
ex = -em1*x1 +ep1*x2 -ep1*x3 +em1*x4
ey = -em1*y1 +ep1*y2 -ep1*y3 +em1*y4
ni4x(1) = 0.0625_R8*(+km1*kx -em1*ky)/dj
ni4x(2) = 0.0625_R8*(-kp1*kx +em1*ky)/dj
ni4x(3) = 0.0625_R8*(+kp1*kx -ep1*ky)/dj
ni4x(4) = 0.0625_R8*(-km1*kx +ep1*ky)/dj
kx = -km1*x1 +km1*x2 -kp1*x3 +kp1*x4
ky = -km1*y1 +km1*y2 -kp1*y3 +kp1*y4
ex = -em1*x1 +em1*x2 -ep1*x3 +ep1*x4
ey = -em1*y1 +em1*y2 -ep1*y3 +ep1*y4
ni4y(1) = 0.0625_R8*(-km1*ex +em1*ey)/dj
ni4y(2) = 0.0625_R8*(+kp1*ex -em1*ey)/dj
ni4y(3) = 0.0625_R8*(-kp1*ex +ep1*ey)/dj
ni4y(4) = 0.0625_R8*(+km1*ex -ep1*ey)/dj
return
endsubroutine calc_ni4_xy_derivatives