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.
- 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 :
L’ordre n’étant pas significatif, j’ai tenté un réarrangement des valeurs, mais j’obtiens alors la même erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part gsl: interp2d.c:101: ERROR: x values must be strictly increasing
- 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 :
Cette erreur est provoquée par la ligne de code suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part error: « spline2dbuilder » n'est pas un membre de « alglib »
Sachant que j’ai inclus les en-têtes d’AlgLib suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part alglib::spline2dbuilder builder;
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
1
2
3 #include <ap.h> #include <stdafx.h> #include <interpolation.h>
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part alglib::real_2d_array fitMatrix;- 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 :
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
3 double* lon = new double [nNodes]; double* lat = new double [nNodes]; double* values = new double [nNodes];
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 double lon0; double lat0;
Est-ce que quelqu’un sait comment réaliser cela ?
À bientôt.
Partager