{"id":8090,"date":"2025-08-25T14:10:26","date_gmt":"2025-08-25T19:10:26","guid":{"rendered":"https:\/\/elligno.com\/?p=8090"},"modified":"2025-08-26T09:19:21","modified_gmt":"2025-08-26T14:19:21","slug":"programmation-scientifique-data-structure","status":"publish","type":"post","link":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/","title":{"rendered":"Programmation Scientifique C++ Moderne: Data Structure"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Programmation Scientifique C++ Moderne<\/h3>\n\n\n\n<p>La programmation scientifique est l&rsquo;une des premi\u00e8res applications de l&rsquo;ordinateur et demeure une des plus importantes. Aujourd&rsquo;hui nous sommes en mesure de simuler un tr\u00e8s grand \u00e9ventail de ph\u00e9nom\u00e8nes physique. C++ est le langage dominant en programmation scientifique. Depuis quelques ann\u00e9es le C++ a connu une \u00e9volution tr\u00e8s rapide et de nouvelles fonctionnalit\u00e9s rendent le langage encore plus performant.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementation du Champ Scalaire<\/h3>\n\n\n\n<p>Notre environnement de programmation scientifique prend en charge de nombreux types de donn\u00e9es scientifiques, tels que les champs scalaires, les champs vectoriels, les tenseurs, etc., types math\u00e9matiques couramment utilis\u00e9s en programmation scientifique.<\/p>\n\n\n\n<p>C++20 contient plusieurs nouvelles fonctionnalit\u00e9s qui trouvent une application en programmation scientifique. Dans ce blog je pr\u00e9sente un exemple d&rsquo;application dans le cas particulier d&rsquo;un type math\u00e9matique appel\u00e9 champ scalaire.<\/p>\n\n\n\n<p>Parmi toutes ces nouvelles fonctionnalit\u00e9s il y a le concept de &lsquo;Range\u00a0\u00bb. D\u00e9fini comme \u00e9tant une s\u00e9quence de nombre sur lesquels je peux it\u00e9rer. Un \u00ab\u00a0range\u00a0\u00bb \u00e0 un d\u00e9but et une fin ou appel\u00e9 sentinelle dans la nouvelle mouture C++20. Notre librairie math\u00e9matique supporte de nombreux types (supporte STL-like API). Pourquoi? parce que je peux utiliser ceux-ci avec les algorithmes de la STL. Mais depuis C++20 ceux-ci satisfont au concept de Range. Je donne un exemple ci-dessous.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">STL API<\/h4>\n\n\n\n<p>Le champ scalaire est une API de type STL fournissant un type d&rsquo;it\u00e9rateur pour parcourir les valeurs du champ. Qu&rsquo;est-ce qui motive ce choix&nbsp;? Je souhaite que notre structure de donn\u00e9es soit utilis\u00e9e avec les algorithmes de la STL et la nouvelle biblioth\u00e8que de \u00ab\u00a0Range\u00a0\u00bbC++20.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-cpp\" data-line=\"\">using pointer = value_type *;\nusing iterator = pointer;\nusing const_pointer = const value_type *;\nusing const_iterator = const_pointer;\nuing reference = value_type &amp;;\nusing const_reference = const value_type &amp;;\nusing range_diff_type = ptrdiff_t;\n\nusing reverse_iterator = std::reverse_iterator&lt;iterator&gt;;\nusing const_reverse_iterator = std::reverse_iterator&lt;const_iterator&gt;;\n\n\/**\n * @brief Iterator access\n * @return iterator\n*\/\nconst_iterator cbegin() const;\niterator begin();\nconst_iterator cend() const;\niterator end();<\/code><\/pre>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">scalar field ctor<\/h4>\n\n\n\n<p>Nous souhaitons pouvoir initialiser un champ scalaire avec des valeurs initiales. J&rsquo;ai impl\u00e9ment\u00e9 un constructeur bas\u00e9 sur un mod\u00e8le utilisant le langage C++20 \u00ab&nbsp;Concept&nbsp;\u00bb (contigu). Je peux initialiser le champ scalaire avec un std::span (C++20), mais aussi avec un conteneur standard tel que std::vector ou avec l&rsquo;un de nos types num\u00e9riques. Toutes nos structures de donn\u00e9es scientifiques, telles que les mod\u00e8les d&rsquo;expression et les tableaux \u00e0 virgule flottante rapide, sont compatibles avec l&rsquo;interface STL. Je d\u00e9taillerai ci-dessous les avantages de cette approche.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-cpp\" data-line=\"\">\/\/ scalar field initialization\ntemplate&lt;std::ranges::contiguous_range ContRng&gt; \/\/ contiguous_range concept C++20\n\tscalarField1D( const std::shared_ptr&lt;gridLattice1D&gt;&amp; aGrid, \n\t               std::string aName, ContRng aInitValues)\n\t: m_gridLattice{aGrid},\n\t  m_fieldName{std::move(aName)}\n\t  {\n\t\t\t   ....\n\t  }<\/code><\/pre>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Scalar field intialization<\/h4>\n\n\n\n<p>Ci-dessous un exemple d&rsquo;initialization d&rsquo;un champ scalaire avec differents containeurs contigus.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-cpp\" data-line=\"\">\/\/ create shared ptr grid (quick utility to create a one-diemnsional grid)\nauto grid1Dptr = std::make_shared&lt;gridLattice1D&gt;(std::string{&quot;d=1 [0,1] [0:99]&quot;});\n\/\/ one-dimensional scalar field \nscalarField1D w_scal1D{ grid1Dptr, std::string{&quot;scalar field 1D&quot;}};\n\/\/ sanity check\nstatic_assert( std::is_same_v&lt;decltype(w_scal1D),scalarField1D&gt; == true ); \/\/ value type\nassert(std::is_lvalue_reference_v&lt;decltype((w_scal1D))&gt;);        \/\/ value category\nassert(rng::range&lt;decltype(w_scal1D)&gt;);                          \/\/ check range\n       \n\/\/ since our field is a range, we can use the range library algorithm\nrng::fill( w_scal1D, 2.3); \/\/ initialize with values<\/code><\/pre>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">D&rsquo;autres types d&rsquo;initialization<\/h4>\n\n\n\n<p>Le champ scalaire \u00e9tant une plage et pouvant \u00eatre initialis\u00e9 \u00e0 partir d&rsquo;une plage contigu\u00eb, nous pouvons initialiser \u00e0 partir de n&rsquo;importe quelle plage satisfaisant \u00e0 cette exigence. Ci-dessous, nous utilisons un vecteur de la biblioth\u00e8que standard et un tableau num\u00e9rique issu de notre environnement de programmation.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-cpp\" data-line=\"\">\/\/ std vector initialization\nstd::vector&lt;double&gt; w_contRng(w_scal1D.grid().getNoPoints()); \/\/ zero initialized\nrng::fill(w_contRng, 1.);\n\/\/ initial value (contiguous range concept)\nscalarField1D w_contRngScal1D{grid1Dptr, std::string{&quot;scalar field 1D&quot;}, w_contRng};\n\t   \n\/\/ in-house fast-floating point array (numerical types library)\nRealNumArray&lt;double&gt; w_numArray(DIM::value, ptrArr); \/\/ &#039;DIM&#039; metaprogramming constant\nif( rng::sized_range&lt;decltype(w_numArray)&gt; &amp;&amp; \/\/ &#039;RealNumArray&#039; satisfied C++20 concepts\n    rng::contiguous_range&lt;RealNumArray&lt;double&gt;&gt;) \/\/ for fast-floating point operations\n{\n  \/\/ initial values for scalar field\n  scalarField1D w_numRngScal1D{grid1Dptr, std::string{&quot;scalar field 1D&quot;}, w_numArray};\n          ....\n}<\/code><\/pre>\n\n\n\n<div style=\"height:36px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">C++20 subrange<\/h4>\n\n\n\n<p>Subrange est probablement l&rsquo;utilitaire de plage le plus pratique. Il s&rsquo;agit d&rsquo;un couple it\u00e9rateur\/sentinelle qui mod\u00e9lise le concept de view C++20. Vous pouvez l&rsquo;utiliser pour regrouper deux it\u00e9rateurs, ou un it\u00e9rateur et une sentinelle.<\/p>\n\n\n\n<p>L&rsquo;une des fonctionnalit\u00e9s int\u00e9ressantes de subrange est tuple-like API&nbsp;: nous pouvons d\u00e9composer le couple it\u00e9rateur\/sentinelle \u00e0 l&rsquo;aide de structured binding C++17.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-cpp\" data-line=\"\">namespace rng = std::ranges;\n\n\/\/ std vector initialization\nstd::vector&lt;double&gt; w_contRng(w_scal1D.grid().getNoPoints()); \/\/ zero initialized\nrng::fill(w_contRng, 1.);\n\n\/\/ initial value (contiguous range concept)\nscalarField1D w_contRngScal1D{grid1Dptr, std::string{&quot;scalar field 1D&quot;}, w_contRng};\n\n\/\/ define a subrange from scalar field values (scalar field is a range)\nauto [rngFieldBeg, rngFieldEnd] =  \/\/ iterator pair\nrng::subrange{rng::next(rng::begin(w_contRngScal1D)),  \/\/ begin range \n                        rng::prev(rng::end(w_contRngScal1D)),    \/\/ end range\n                        rng::size(w_contRngScal1D)-2};           \/\/ number of elements\n\t\t\t\n\/\/ can pass it to our physics algorithm (HLL solver part of our generic library) \nhllSchemeFluxAlgo(rngFieldBeg, rngFieldEnd);<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programmation Scientifique C++ Moderne La programmation scientifique est l&rsquo;une des premi\u00e8res applications de l&rsquo;ordinateur et demeure une des plus importantes. Aujourd&rsquo;hui nous sommes en mesure de simuler un tr\u00e8s grand \u00e9ventail de ph\u00e9nom\u00e8nes physique. C++ est le langage dominant en programmation scientifique. Depuis quelques ann\u00e9es le C++ a connu une \u00e9volution tr\u00e8s rapide et de [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22,24],"tags":[34,35],"class_list":["post-8090","post","type-post","status-publish","format-standard","hentry","category-nouvelles","category-trucs-et-astuces","tag-logiciel-scientifique","tag-programmation-scientifique"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Programmation Scientifique C++ Moderne: Data Structure - Elligno<\/title>\n<meta name=\"description\" content=\"Je pr\u00e9sente un exemple de programmation scientifique qui utilise C++ moderne d&#039;un champ scalaire tir\u00e9 de notre librairie math\u00e9matique.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Programmation Scientifique C++ Moderne: Data Structure - Elligno\" \/>\n<meta property=\"og:description\" content=\"Je pr\u00e9sente un exemple de programmation scientifique qui utilise C++ moderne d&#039;un champ scalaire tir\u00e9 de notre librairie math\u00e9matique.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/\" \/>\n<meta property=\"og:site_name\" content=\"Elligno\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-25T19:10:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-26T14:19:21+00:00\" \/>\n<meta name=\"author\" content=\"Jean B\u00e9langer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jean B\u00e9langer\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/\"},\"author\":{\"name\":\"Jean B\u00e9langer\",\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#\\\/schema\\\/person\\\/1129358366bfe88ea0feee16d1850da9\"},\"headline\":\"Programmation Scientifique C++ Moderne: Data Structure\",\"datePublished\":\"2025-08-25T19:10:26+00:00\",\"dateModified\":\"2025-08-26T14:19:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/\"},\"wordCount\":531,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#organization\"},\"keywords\":[\"logiciel scientifique\",\"programmation scientifique\"],\"articleSection\":[\"Nouvelles\",\"Trucs et astuces\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/\",\"url\":\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/\",\"name\":\"Programmation Scientifique C++ Moderne: Data Structure - Elligno\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#website\"},\"datePublished\":\"2025-08-25T19:10:26+00:00\",\"dateModified\":\"2025-08-26T14:19:21+00:00\",\"description\":\"Je pr\u00e9sente un exemple de programmation scientifique qui utilise C++ moderne d'un champ scalaire tir\u00e9 de notre librairie math\u00e9matique.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/programmation-scientifique-data-structure\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/elligno.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programmation Scientifique C++ Moderne: Data Structure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/elligno.com\\\/fr\\\/\",\"name\":\"Elligno\",\"description\":\"Site dev elligno\",\"publisher\":{\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/elligno.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#organization\",\"name\":\"Elligno Inc\",\"url\":\"https:\\\/\\\/elligno.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/elligno.com\\\/wp-content\\\/uploads\\\/2021\\\/06\\\/favicon.png\",\"contentUrl\":\"https:\\\/\\\/elligno.com\\\/wp-content\\\/uploads\\\/2021\\\/06\\\/favicon.png\",\"width\":256,\"height\":256,\"caption\":\"Elligno Inc\"},\"image\":{\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/elligno.com\\\/fr\\\/#\\\/schema\\\/person\\\/1129358366bfe88ea0feee16d1850da9\",\"name\":\"Jean B\u00e9langer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/de24c8e76c71b2cc42a3e48f52b8e4c86199356560cc80ef2224bbc130cae4e8?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/de24c8e76c71b2cc42a3e48f52b8e4c86199356560cc80ef2224bbc130cae4e8?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/de24c8e76c71b2cc42a3e48f52b8e4c86199356560cc80ef2224bbc130cae4e8?s=96&d=mm&r=g\",\"caption\":\"Jean B\u00e9langer\"},\"url\":\"https:\\\/\\\/elligno.com\\\/fr\\\/author\\\/elligno-panel-xr3w\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Programmation Scientifique C++ Moderne: Data Structure - Elligno","description":"Je pr\u00e9sente un exemple de programmation scientifique qui utilise C++ moderne d'un champ scalaire tir\u00e9 de notre librairie math\u00e9matique.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/","og_locale":"fr_FR","og_type":"article","og_title":"Programmation Scientifique C++ Moderne: Data Structure - Elligno","og_description":"Je pr\u00e9sente un exemple de programmation scientifique qui utilise C++ moderne d'un champ scalaire tir\u00e9 de notre librairie math\u00e9matique.","og_url":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/","og_site_name":"Elligno","article_published_time":"2025-08-25T19:10:26+00:00","article_modified_time":"2025-08-26T14:19:21+00:00","author":"Jean B\u00e9langer","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Jean B\u00e9langer"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/#article","isPartOf":{"@id":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/"},"author":{"name":"Jean B\u00e9langer","@id":"https:\/\/elligno.com\/fr\/#\/schema\/person\/1129358366bfe88ea0feee16d1850da9"},"headline":"Programmation Scientifique C++ Moderne: Data Structure","datePublished":"2025-08-25T19:10:26+00:00","dateModified":"2025-08-26T14:19:21+00:00","mainEntityOfPage":{"@id":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/"},"wordCount":531,"commentCount":0,"publisher":{"@id":"https:\/\/elligno.com\/fr\/#organization"},"keywords":["logiciel scientifique","programmation scientifique"],"articleSection":["Nouvelles","Trucs et astuces"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/","url":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/","name":"Programmation Scientifique C++ Moderne: Data Structure - Elligno","isPartOf":{"@id":"https:\/\/elligno.com\/fr\/#website"},"datePublished":"2025-08-25T19:10:26+00:00","dateModified":"2025-08-26T14:19:21+00:00","description":"Je pr\u00e9sente un exemple de programmation scientifique qui utilise C++ moderne d'un champ scalaire tir\u00e9 de notre librairie math\u00e9matique.","breadcrumb":{"@id":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/elligno.com\/fr\/programmation-scientifique-data-structure\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elligno.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Programmation Scientifique C++ Moderne: Data Structure"}]},{"@type":"WebSite","@id":"https:\/\/elligno.com\/fr\/#website","url":"https:\/\/elligno.com\/fr\/","name":"Elligno","description":"Site dev elligno","publisher":{"@id":"https:\/\/elligno.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elligno.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/elligno.com\/fr\/#organization","name":"Elligno Inc","url":"https:\/\/elligno.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/elligno.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/elligno.com\/wp-content\/uploads\/2021\/06\/favicon.png","contentUrl":"https:\/\/elligno.com\/wp-content\/uploads\/2021\/06\/favicon.png","width":256,"height":256,"caption":"Elligno Inc"},"image":{"@id":"https:\/\/elligno.com\/fr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/elligno.com\/fr\/#\/schema\/person\/1129358366bfe88ea0feee16d1850da9","name":"Jean B\u00e9langer","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/de24c8e76c71b2cc42a3e48f52b8e4c86199356560cc80ef2224bbc130cae4e8?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/de24c8e76c71b2cc42a3e48f52b8e4c86199356560cc80ef2224bbc130cae4e8?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/de24c8e76c71b2cc42a3e48f52b8e4c86199356560cc80ef2224bbc130cae4e8?s=96&d=mm&r=g","caption":"Jean B\u00e9langer"},"url":"https:\/\/elligno.com\/fr\/author\/elligno-panel-xr3w\/"}]}},"_links":{"self":[{"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/posts\/8090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/comments?post=8090"}],"version-history":[{"count":0,"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/posts\/8090\/revisions"}],"wp:attachment":[{"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/media?parent=8090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/categories?post=8090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/elligno.com\/fr\/wp-json\/wp\/v2\/tags?post=8090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}