Salut à tous !

Je récupère des données sur une grille non-structurée, donc pas une grille régulière, à partir d’un fichier NetCDF. Je n’ai pas de problème pour lire un fichier NetCDF. J’ai donc désormais, pour un ensemble de nœuds donnés (leur nombre est stocké dans la variable « nNodes »), un tableau 1D contenant les longitudes des nœuds (nommons le « lon »), un autre tableau 1D contenant les latitudes (« lat ») des nœuds et enfin un troisième tableau 1D contenant les valeurs aux nœuds (« val »). Les spécificités de la bibliothèque NetCDF fait que ces trois tableaux sont des tableaux de type C en double précision (donc des « double* »).

Je dois déterminer la valeur en un point inclut dans le domaine, mais qui ne correspond pas à l’un des nœuds. Je dois donc réaliser une interpolation bicubique (en anglais « bicubic fit » plutôt que « bicubic interpolation »). Ceci pour avant-hier (tout va bien). Je cherche donc une bibliothèque me permettant de réaliser cela efficacement. C’est là que je me retrouve dans l’expectative, je viens donc voir ici si quelqu’un peut m’aider à me tirer de là.

J’ai trouvé trois bibliothèques qui pourraient me permettre de réaliser cette interpolation, mais je ne parviens pas m’en tirer.

  1. J’ai d’abord envisagé d’utiliser la GSL, mais visiblement elle ne permet pas de réaliser des interpolations que sur grilles régulières. Du coup, je ne parviens pas à l’utiliser pour sur mon cas. En particulier, la grille étant non-structurée, on ne peut pas attendre que les nœuds apparaissent dans un ordre de tri par aux coordonnées. Du coup, j’obtiens l’erreur suivante en cours d’exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gsl: interp2d.c:101: ERROR: x values must be strictly increasing
    L’ordre n’étant pas significatif, j’ai tenté un réarrangement des valeurs, mais j’obtiens alors la même erreur.
  2. La bibliothèque AlgLib apparaît proposer exactement ce qu’il me faut, plus particulièrement l’algorithme « FastDDM ». Cependant, en tentant de l’utiliser j’obtiens l’erreur de compilation suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: « spline2dbuilder » n'est pas un membre de « alglib »
    Cette erreur est provoquée par la ligne de code suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alglib::spline2dbuilder builder;
    Sachant que j’ai inclus les en-têtes d’AlgLib suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <ap.h>
    #include <stdafx.h>
    #include <interpolation.h>
    En revanche, je parviens à utiliser d’autres éléments d’AlgLib, par exemple la ligne suivante compile sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alglib::real_2d_array fitMatrix;
    Je me demande si je n’ai pas oublié un en-tête, mais toujours est-il que je ne parviens pas non plus à utiliser AlgLib dans mon cas.
  3. Enfin, j’ai déjà utilisé Eigen et elle propose des éléments permettant de réaliser des interpolations. Cependant, c’est une partie non-supportée de la bibliothèque, du coup la documentation est plutôt chiche à ce niveau. J’ai trouvé un exemple, mais je ne parviens pas à l’appliquer à mon cas.


Je me sens plutôt coincé, je me demande si quelqu’un sur ce forum a déjà réalisé ce genre d’interpolation et pourrait me conseiller une marche à suivre.

Je résume mon besoin. Pour un domaine maillé par une grille non-structurée contenant « nNodes » nœuds, je dispose des tableaux qui ont été créé ainsi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
double* lon = new double [nNodes];
double* lat = new double [nNodes];
double* values = new double [nNodes];
Les spécificités de la façon dont j’accède à mes données ne me permettent malheureusement pas de créer ces tableaux autrement. Les tableaux « lon » et « lat » contiennent respectivement les longitudes et les latitudes des nœuds d’un maillage non-structuré définissant un domaine. Le tableau « val » donne les valeurs aux nœuds. Je dispose des deux valeurs suivantes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
double lon0;
double lat0;
Je dois désormais déterminer la valeur à la position définie par « lon0 » et « lat0 », sachant que cette position est à l’intérieur du domaine défini par la grille, mais n’est pas un nœud de la grille.

Est-ce que quelqu’un sait comment réaliser cela ?

À bientôt.