tab_poly_tcheby Subroutine

public subroutine tab_poly_tcheby(nx1, nx2, nvarx, nvary, nb_var, tab_tche1, tab_tche2, var, tab_poly_tche, multi_thread)

Note

Surface définie par un produit de polynômes de Tchebychev en x et y

Le domaine étant discrétisé et UN ensemble de coefficients donnés (provenant d’une approximation par moindres carrés) on a la valeur de la fonction surface en chaque point.

Arguments

Type IntentOptional Attributes Name
integer(kind=I4), intent(in) :: nx1

nbre de points de calcul selon x

integer(kind=I4), intent(in) :: nx2

nbre de points de calcul selon y

integer(kind=I4), intent(in) :: nvarx

degré max de Tchebychev utilisé selon x

integer(kind=I4), intent(in) :: nvary

degré max de Tchebychev utilisé selon y

integer(kind=I4), intent(in) :: nb_var

nbre de coefficients

real(kind=R8), intent(in), dimension(1:nx1, 1:nvarx+1) :: tab_tche1

tableau des valeurs calculées

real(kind=R8), intent(in), dimension(1:nx2, 1:nvary+1) :: tab_tche2

tableau des valeurs calculées

real(kind=R8), intent(in), dimension(1:nb_var) :: var

vecteur des coefficients

real(kind=R8), intent(out), dimension(1:nx1, 1:nx2) :: tab_poly_tche

tableau résultant : surface

logical(kind=I4), intent(in), optional :: multi_thread

Calls

proc~~tab_poly_tcheby~~CallsGraph proc~tab_poly_tcheby tab_poly_tcheby omp_get_num_procs omp_get_num_procs proc~tab_poly_tcheby->omp_get_num_procs

Called by

proc~~tab_poly_tcheby~~CalledByGraph proc~tab_poly_tcheby tab_poly_tcheby proc~least_squares_tcheby least_squares_tcheby proc~least_squares_tcheby->proc~tab_poly_tcheby program~test_tchebychev test_tchebychev program~test_tchebychev->proc~least_squares_tcheby

Source Code

   subroutine tab_poly_tcheby(nx1, nx2, nvarx, nvary, nb_var, tab_tche1, tab_tche2, var, tab_poly_tche, multi_thread)
   implicit none
   integer(kind=I4), intent(in ) :: nb_var                                       !! *nbre de coefficients*
   integer(kind=I4), intent(in ) :: nx1                                          !! *nbre de points de calcul selon x*
   integer(kind=I4), intent(in ) :: nx2                                          !! *nbre de points de calcul selon y*
   integer(kind=I4), intent(in ) :: nvarx                                        !! *degré max de Tchebychev utilisé selon x*
   integer(kind=I4), intent(in ) :: nvary                                        !! *degré max de Tchebychev utilisé selon y*
   real(kind=R8),    intent(in ), dimension(1:nx1, 1:nvarx+1) :: tab_tche1       !! *tableau des valeurs calculées*
   real(kind=R8),    intent(in ), dimension(1:nx2, 1:nvary+1) :: tab_tche2       !! *tableau des valeurs calculées*
   real(kind=R8),    intent(in ), dimension(1:nb_var)         :: var             !! *vecteur des coefficients*
   real(kind=R8),    intent(out), dimension(1:nx1, 1:nx2)     :: tab_poly_tche   !! *tableau résultant : surface*
   logical(kind=I4), intent(in ), optional :: multi_thread

      real(kind=R8)    :: tmp1, tmp2
      integer(kind=I4) :: ivar, jvar, ij, ipt, jpt, ibatch, nb_threads
      logical(kind=I4) :: mlth

      mlth = .false.
      if ( present( multi_thread ) ) mlth = multi_thread

      ! surface d'UN produit de polynômes de tchebytchev

      nb_threads = omp_get_num_procs()
      ibatch = max( nx2/nb_threads, 1 )

      !$OMP PARALLEL DEFAULT(SHARED) NUM_THREADS(nb_threads) IF(mlth)
      !$OMP DO SCHEDULE (STATIC,ibatch) PRIVATE(ipt, tmp1, ij, jvar, tmp2, ivar)

      do jpt = 1, nx2
         do ipt = 1, nx1            ! Un dommaine discrétisé (nx+1)*(nx+1) est balayé

            tmp1 = 0._R8
            ij   = 0                ! chaque point est unique
            do jvar = 0, nvary      ! En chaque point, la fonction calculée est le produit des sommes
               tmp2 = 0._R8         !  de polynômes de Tchebychev. En effet l'approximation est faite
               do ivar = 0, nvarx   !  avec UN polynôme à variables séparées.
                  ij = ij +1
                  tmp2 = tmp2 +var(ij)*tab_tche1(ipt, ivar +1)
               enddo
               tmp1 = tmp1 +tmp2*tab_tche2(jpt, jvar +1)
            enddo
            tab_poly_tche(ipt, jpt) = tmp1

         enddo
      enddo

      !$OMP END DO
      !$OMP END PARALLEL


   return
   endsubroutine tab_poly_tcheby