# mus_compute_test_module.f90 Source File

## Source Code

! Copyright (c) 2016 Jiaxing Qi <jiaxing.qi@uni-siegen.de>
! Copyright (c) 2020 Kannan Masilamani <kannan.masilamani@uni-siegen.de>
! Copyright (c) 2020 Peter Vitt <peter.vitt2@uni-siegen.de>
!
! Redistribution and use in source and binary forms, with or without
! modification, are permitted provided that the following conditions are met:
!
! 1. Redistributions of source code must retain the above copyright notice,
! this list of conditions and the following disclaimer.
!
! 2. Redistributions in binary form must reproduce the above copyright notice,
! this list of conditions and the following disclaimer in the documentation
! and/or other materials provided with the distribution.
!
! THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF SIEGEN “AS IS” AND ANY EXPRESS
! OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! IN NO EVENT SHALL UNIVERSITY OF SIEGEN OR CONTRIBUTORS BE LIABLE FOR ANY
! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
! ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! Copyright (c) 2011-2013 Manuel Hasert <m.hasert@grs-sim.de>
! Copyright (c) 2011 Harald Klimach <harald.klimach@uni-siegen.de>
! Copyright (c) 2011 Konstantin Kleinheinz <k.kleinheinz@grs-sim.de>
! Copyright (c) 2011-2012 Simon Zimny <s.zimny@grs-sim.de>
! Copyright (c) 2012, 2014-2016 Jiaxing Qi <jiaxing.qi@uni-siegen.de>
! Copyright (c) 2012 Kartik Jain <kartik.jain@uni-siegen.de>
! Copyright (c) 2013-2015, 2019 Kannan Masilamani <kannan.masilamani@uni-siegen.de>
! Copyright (c) 2016 Tobias Schneider <tobias1.schneider@student.uni-siegen.de>
!
! Redistribution and use in source and binary forms, with or without
! modification, are permitted provided that the following conditions are met:
!
! 1. Redistributions of source code must retain the above copyright notice,
! this list of conditions and the following disclaimer.
!
! 2. Redistributions in binary form must reproduce the above copyright notice,
! this list of conditions and the following disclaimer in the documentation
! and/or other materials provided with the distribution.
!
! THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF SIEGEN “AS IS” AND ANY EXPRESS
! OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! IN NO EVENT SHALL UNIVERSITY OF SIEGEN OR CONTRIBUTORS BE LIABLE FOR ANY
! DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
! ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! ****************************************************************************** !
!> This module provides the definition and methods for
module mus_test_module

! include treelm modules
use env_module,               only: rk
use tem_varSys_module,        only: tem_varSys_type

! include musubi modules
use mus_field_prop_module,     only: mus_field_prop_type
use mus_scheme_layout_module,  only: mus_scheme_layout_type
use mus_derVarPos_module,      only: mus_derVarPos_type
use mus_param_module,          only: mus_param_type

implicit none

private

public :: vec_fma

contains

! ****************************************************************************** !
!> Testing routine which performs fused multiplication and addtion on the state
!! variable. The calculation is simple, so that the cost is mostly due to
!! the data transfer through the memory interface.
!!
!! This subroutine interface must match the abstract interface definition
!! [[kernel]] in scheme/[[mus_scheme_type_module]].f90 in order to be callable
!! via [[mus_scheme_type:compute]] function pointer.
subroutine vec_fma( fieldProp, inState, outState, auxField, neigh, nElems, &
&                 nSolve, level, layout, params, varSys, derVarPos       )
! -------------------------------------------------------------------- !
!> Array of field properties (fluid or species)
type(mus_field_prop_type), intent(in) :: fieldProp(:)
!> variable system definition
type(tem_varSys_type), intent(in) :: varSys
!> current layout
type(mus_scheme_layout_type), intent(in) :: layout
!> number of elements in state Array
integer, intent(in) :: nElems
!> input  pdf vector
real(kind=rk), intent(in)  ::  inState(nElems * varSys%nScalars)
!> output pdf vector
real(kind=rk), intent(out) :: outState(nElems * varSys%nScalars)
!> Auxiliary field computed from pre-collision state
!! Is updated with correct velocity field for multicomponent models
real(kind=rk), intent(inout) :: auxField(nElems * varSys%nAuxScalars)
!> connectivity vector
integer, intent(in) :: neigh(nElems * layout%fStencil%QQ)
!> number of elements solved in kernel
integer, intent(in) :: nSolve
!> current level
integer,intent(in) :: level
!> global parameters
type(mus_param_type),intent(in) :: params
!> position of derived quantities in varsys for all fields
type( mus_derVarPos_type ), intent(in) :: derVarPos(:)
! -------------------------------------------------------------------- !
integer :: ii, nScalars
! ---------------------------------------------------------------------------

nScalars = varSys%nScalars

!$omp do schedule(static) !cdir nodep !ibm* independent !dir$ ivdep
!dirvector aligned nontemporal(outstate) nodeloop: do ii = 1, nSolve * nScalars outState(ii) = inState(ii) * 1.00001_rk + 0.000001_rk end do nodeloop !omp end do nowait

end subroutine vec_fma
! ****************************************************************************** !

end module mus_test_module