92  subroutine drag_torque_zone(dgtq, tstep, zone, center, s11, s22, s33, s12, s13, s23,&
 
   94    integer, 
intent(in) :: tstep
 
   96    type(
coef_t), 
intent(inout) :: coef
 
   97    real(kind=
rp), 
intent(inout) :: s11(coef%Xh%lx,coef%Xh%lx,coef%Xh%lz,coef%msh%nelv)
 
   98    real(kind=
rp), 
intent(inout) :: s22(coef%Xh%lx,coef%Xh%lx,coef%Xh%lz,coef%msh%nelv)
 
   99    real(kind=
rp), 
intent(inout) :: s33(coef%Xh%lx,coef%Xh%lx,coef%Xh%lz,coef%msh%nelv)
 
  100    real(kind=
rp), 
intent(inout) :: s12(coef%Xh%lx,coef%Xh%lx,coef%Xh%lz,coef%msh%nelv)
 
  101    real(kind=
rp), 
intent(inout) :: s13(coef%Xh%lx,coef%Xh%lx,coef%Xh%lz,coef%msh%nelv)
 
  102    real(kind=
rp), 
intent(inout) :: s23(coef%Xh%lx,coef%Xh%lx,coef%Xh%lz,coef%msh%nelv)
 
  103    type(
field_t), 
intent(inout) :: p
 
  104    real(kind=
rp), 
intent(in) :: visc, center(3)
 
  105    real(kind=
rp) :: dgtq(3,4)
 
  106    real(kind=
rp) :: dragpx = 0.0_rp 
 
  107    real(kind=
rp) :: dragpy = 0.0_rp
 
  108    real(kind=
rp) :: dragpz = 0.0_rp
 
  109    real(kind=
rp) :: dragvx = 0.0_rp 
 
  110    real(kind=
rp) :: dragvy = 0.0_rp
 
  111    real(kind=
rp) :: dragvz = 0.0_rp
 
  112    real(kind=
rp) :: torqpx = 0.0_rp 
 
  113    real(kind=
rp) :: torqpy = 0.0_rp
 
  114    real(kind=
rp) :: torqpz = 0.0_rp
 
  115    real(kind=
rp) :: torqvx = 0.0_rp 
 
  116    real(kind=
rp) :: torqvy = 0.0_rp
 
  117    real(kind=
rp) :: torqvz = 0.0_rp
 
  118    real(kind=
rp) :: dragx, dragy, dragz
 
  119    integer :: ie, ifc, mem, ierr
 
  134         ie   = zone%facet_el(mem)%x(2)
 
  135         ifc   = zone%facet_el(mem)%x(1)
 
  138                                s11, s22, s33, s12, s13, s23,&
 
  139                                p%x,visc,ifc,ie, coef, coef%Xh)
 
  141         dragpx = dragpx + dgtq(1,1)  
 
  142         dragpy = dragpy + dgtq(2,1)
 
  143         dragpz = dragpz + dgtq(3,1)
 
  145         dragvx = dragvx + dgtq(1,2)  
 
  146         dragvy = dragvy + dgtq(2,2)
 
  147         dragvz = dragvz + dgtq(3,2)
 
  149         torqpx = torqpx + dgtq(1,3)  
 
  150         torqpy = torqpy + dgtq(2,3)
 
  151         torqpz = torqpz + dgtq(3,3)
 
  153         torqvx = torqvx + dgtq(1,4)  
 
  154         torqvy = torqvy + dgtq(2,4)
 
  155         torqvz = torqvz + dgtq(3,4)
 
  160      call mpi_allreduce(mpi_in_place,dragpx, 1, &
 
  162      call mpi_allreduce(mpi_in_place,dragpy, 1, &
 
  164      call mpi_allreduce(mpi_in_place,dragpz, 1, &
 
  166      call mpi_allreduce(mpi_in_place,dragvx, 1, &
 
  168      call mpi_allreduce(mpi_in_place,dragvy, 1, &
 
  170      call mpi_allreduce(mpi_in_place,dragvz, 1, &
 
  173      call mpi_allreduce(mpi_in_place,torqpx, 1, &
 
  175      call mpi_allreduce(mpi_in_place,torqpy, 1, &
 
  177      call mpi_allreduce(mpi_in_place,torqpz, 1, &
 
  179      call mpi_allreduce(mpi_in_place,torqvx, 1, &
 
  181      call mpi_allreduce(mpi_in_place,torqvy, 1, &
 
  183      call mpi_allreduce(mpi_in_place,torqvz, 1, &
 
 
  216                               s11, s22, s33, s12, s13, s23,&
 
  217                               pm1,visc,f,e, coef, Xh)
 
  218    type(
coef_t), 
intent(in) :: coef
 
  219    type(
space_t), 
intent(in) :: xh
 
  220    real(kind=
rp), 
intent(out) :: dgtq(3,4)
 
  221    real(kind=
rp), 
intent(in) :: center(3)
 
  222    real(kind=
rp), 
intent(in) :: xm0(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  223    real(kind=
rp), 
intent(in) :: ym0(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  224    real(kind=
rp), 
intent(in) :: zm0(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  225    real(kind=
rp), 
intent(in) :: s11(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  226    real(kind=
rp), 
intent(in) :: s22(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  227    real(kind=
rp), 
intent(in) :: s33(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  228    real(kind=
rp), 
intent(in) :: s12(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  229    real(kind=
rp), 
intent(in) :: s13(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  230    real(kind=
rp), 
intent(in) :: s23(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  231    real(kind=
rp), 
intent(in) :: pm1(xh%lx,xh%ly,xh%lz,coef%msh%nelv)
 
  232    real(kind=
rp), 
intent(in) :: visc
 
  233    integer, 
intent(in) :: f,e
 
  234    integer :: pf, i, j1, j2
 
  235    real(kind=
rp) ::    n1,n2,n3, a, v, dgtq_i(3,4)
 
  236    integer :: skpdat(6,6), nx, ny, nz
 
  243    real(kind=
rp) :: s11_, s12_, s22_, s13_, s23_, s33_
 
  250    skpdat(2,1)=nx*(ny-1)+1
 
  253    skpdat(5,1)=ny*(nz-1)+1
 
  256    skpdat(1,2)=1             + (nx-1)
 
  257    skpdat(2,2)=nx*(ny-1)+1   + (nx-1)
 
  260    skpdat(5,2)=ny*(nz-1)+1
 
  267    skpdat(5,3)=ny*(nz-1)+1
 
  270    skpdat(1,4)=1           + nx*(ny-1)
 
  271    skpdat(2,4)=nx          + nx*(ny-1)
 
  274    skpdat(5,4)=ny*(nz-1)+1
 
  284    skpdat(1,6)=1           + nx*ny*(nz-1)
 
  285    skpdat(2,6)=nx          + nx*ny*(nz-1)
 
  293    jskip1 = skpdat(3,pf)
 
  296    jskip2 = skpdat(6,pf)
 
  303         n1 = coef%nx(i,1,f,e)*coef%area(i,1,f,e)
 
  304         n2 = coef%ny(i,1,f,e)*coef%area(i,1,f,e)
 
  305         n3 = coef%nz(i,1,f,e)*coef%area(i,1,f,e)
 
  306         a  = a +          coef%area(i,1,f,e)
 
  308         s11_ = s11(j1,j2,1,e)
 
  309         s12_ = s12(j1,j2,1,e)
 
  310         s22_ = s22(j1,j2,1,e)
 
  311         s13_ = s13(j1,j2,1,e)
 
  312         s23_ = s23(j1,j2,1,e)
 
  313         s33_ = s33(j1,j2,1,e)
 
  314         call drag_torque_pt(dgtq_i,xm0(j1,j2,1,e), ym0(j1,j2,1,e),zm0(j1,j2,1,e), center,&
 
  315                             s11_, s22_, s33_, s12_, s13_, s23_,&
 
  316                             pm1(j1,j2,1,e), n1, n2, n3, v)
 
 
  334  subroutine drag_torque_pt(dgtq, x, y, z, center, s11, s22, s33, s12, s13, s23,&
 
  336    real(kind=
rp), 
intent(inout) :: dgtq(3,4)
 
  337    real(kind=
rp), 
intent(in) :: x
 
  338    real(kind=
rp), 
intent(in) :: y
 
  339    real(kind=
rp), 
intent(in) :: z
 
  340    real(kind=
rp), 
intent(in) :: p
 
  341    real(kind=
rp), 
intent(in) :: v
 
  342    real(kind=
rp), 
intent(in) :: n1, n2, n3, center(3)
 
  343    real(kind=
rp), 
intent(in) :: s11, s12, s22, s13, s23, s33
 
  344    real(kind=
rp) ::  s21, s31, s32, r1, r2, r3
 
  354    dgtq(1,2) = -2*v*(s11*n1 + s12*n2 + s13*n3)
 
  355    dgtq(2,2) = -2*v*(s21*n1 + s22*n2 + s23*n3)
 
  356    dgtq(3,2) = -2*v*(s31*n1 + s32*n2 + s33*n3)
 
  361    dgtq(1,3) = (r2*dgtq(3,1)-r3*dgtq(2,1))
 
  362    dgtq(2,3) = (r3*dgtq(1,1)-r1*dgtq(3,1))
 
  363    dgtq(3,3) = (r1*dgtq(2,1)-r2*dgtq(1,1))
 
  365    dgtq(1,4) = (r2*dgtq(3,2)-r3*dgtq(2,2))
 
  366    dgtq(2,4) = (r3*dgtq(1,2)-r1*dgtq(3,2))
 
  367    dgtq(3,4) = (r1*dgtq(2,2)-r2*dgtq(1,2))
 
 
  380                              s11, s22, s33, s12, s13, s23,&
 
  381                              p, n1, n2, n3, v, n_pts)
 
  383    real(kind=
rp), 
intent(inout),
dimension(n_pts) :: force1, force2, force3
 
  384    real(kind=
rp), 
intent(inout),
dimension(n_pts) :: force4, force5, force6
 
  385    real(kind=
rp), 
intent(in) :: p(n_pts)
 
  386    real(kind=
rp), 
intent(in) :: v
 
  387    real(kind=
rp), 
intent(in) :: n1(n_pts), n2(n_pts), n3(n_pts)
 
  388    real(kind=
rp), 
intent(in), 
dimension(n_pts) :: s11, s12, s22, s13, s23, s33
 
  390    call rzero(force4,n_pts)
 
  391    call rzero(force5,n_pts)
 
  392    call rzero(force6,n_pts)
 
  394    call col3(force1,p,n1,n_pts)
 
  395    call col3(force2,p,n2,n_pts)
 
  396    call col3(force3,p,n3,n_pts)
 
  399    call vdot3(force4,s11,s12,s13,n1,n2,n3,n_pts)
 
  400    call vdot3(force5,s12,s22,s23,n1,n2,n3,n_pts)
 
  401    call vdot3(force6,s13,s23,s33,n1,n2,n3,n_pts)
 
  402    call cmult(force4,v2,n_pts)
 
  403    call cmult(force5,v2,n_pts)
 
  404    call cmult(force6,v2,n_pts)
 
 
  416                                     force4, force5, force6,&
 
  417                                     s11, s22, s33, s12, s13, s23,&
 
  418                                     p, n1, n2, n3, v, n_pts)
 
  420    type(c_ptr) :: force1, force2, force3
 
  421    type(c_ptr) :: force4, force5, force6
 
  422    type(c_ptr) :: p, n1, n2, n3
 
  423    type(c_ptr) :: s11, s12, s22, s13, s23, s33
 
  426    if (neko_bcknd_device .eq. 1) 
then 
  443       call neko_error(
'error in drag_torque, no device bcklnd configured')
 
 
  451    real(kind=
rp), 
dimension(n_pts) :: n1, n2, n3
 
  452    integer :: mask(0:n_pts), facets(0:n_pts), fid, idx(4)
 
  453    real(kind=
rp) :: normal(3), area(3)
 
  460       normal = coef%get_normal(idx(1), idx(2), idx(3), idx(4), fid)
 
  461       area = coef%get_area(idx(1), idx(2), idx(3), idx(4), fid)
 
  462       n1(i) = normal(1)*area(1)
 
  463       n2(i) = normal(2)*area(2)
 
  464       n3(i) = normal(3)*area(3)
 
 
__device__ void nonlinear_index(const int idx, const int lx, int *index)
 
type(mpi_comm) neko_comm
MPI communicator.
 
type(mpi_datatype) mpi_real_precision
MPI type for working precision of REAL types.
 
subroutine, public device_rzero(a_d, n)
Zero a real vector.
 
subroutine, public device_col3(a_d, b_d, c_d, n)
Vector multiplication with 3 vectors .
 
subroutine, public device_masked_red_copy(a_d, b_d, mask_d, n, m)
 
subroutine, public device_vdot3(dot_d, u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, n)
Compute a dot product  (3-d version) assuming vector components  etc.
 
subroutine, public device_cmult(a_d, c, n)
Multiplication by constant c .
 
Device abstraction, common interface for various accelerators.
 
subroutine, public drag_torque_zone(dgtq, tstep, zone, center, s11, s22, s33, s12, s13, s23, p, coef, visc)
Some functions to calculate the lift/drag and torque Calculation can be done on a zone,...
 
subroutine, public setup_normals(coef, mask, facets, n1, n2, n3, n_pts)
 
subroutine, public drag_torque_facet(dgtq, xm0, ym0, zm0, center, s11, s22, s33, s12, s13, s23, pm1, visc, f, e, coef, xh)
Calculate drag and torque over a facet.
 
subroutine, public device_calc_force_array(force1, force2, force3, force4, force5, force6, s11, s22, s33, s12, s13, s23, p, n1, n2, n3, v, n_pts)
Calculate drag and torque from array of points.
 
subroutine, public calc_force_array(force1, force2, force3, force4, force5, force6, s11, s22, s33, s12, s13, s23, p, n1, n2, n3, v, n_pts)
Calculate drag and torque from array of points.
 
subroutine, public drag_torque_pt(dgtq, x, y, z, center, s11, s22, s33, s12, s13, s23, p, n1, n2, n3, v)
Calculate drag and torque from one point.
 
Defines a zone as a subset of facets in a mesh.
 
subroutine, public cmult(a, c, n)
Multiplication by constant c .
 
subroutine, public masked_red_copy(a, b, mask, n, m)
Copy a masked vector to reduced contigous vector .
 
subroutine, public col3(a, b, c, n)
Vector multiplication with 3 vectors .
 
subroutine, public vdot3(dot, u1, u2, u3, v1, v2, v3, n)
Compute a dot product  (3-d version) assuming vector components  etc.
 
subroutine, public rzero(a, n)
Zero a real vector.
 
integer, parameter, public rp
Global precision used in computations.
 
Defines a function space.
 
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
 
The function space for the SEM solution fields.