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.
Type | Intent | Optional | 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 |
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