

{"id":707,"date":"2018-09-01T15:45:48","date_gmt":"2018-09-01T13:45:48","guid":{"rendered":"https:\/\/project.inria.fr\/damaris\/?page_id=707"},"modified":"2023-09-05T11:16:51","modified_gmt":"2023-09-05T09:16:51","slug":"paraview-connector","status":"publish","type":"page","link":"https:\/\/project.inria.fr\/damaris\/paraview-connector\/","title":{"rendered":"ParaView Connector"},"content":{"rendered":"<p>In order to benefit from ParaView connector that has been implemented in Damaris, it is necessary to build Damaris on a machine that ParaView Catalyst is already installed. You may use <a href=\"https:\/\/gitlab.kitware.com\/paraview\/paraview\/blob\/master\/Documentation\/dev\/build.md\">this link<\/a> to install ParaView in your machine. Please note that if you are going to have your simulation and visualization in two different nodes, it is recommended not to install ParaView GUI on simulation nodes. Also, please ensure that the version of Paraview that Damaris is compiled against matches the Paraview being used for visualization of the simulation exactly.<\/p>\n<p><strong>Note 1:<\/strong>&nbsp;The first version of ParaView backend for Damaris (Damaris 1.3.0), has been developed and tested with ParaView 5.5.0. Damaris v1.3.1+ has been tested with 5.5.0 and 5.8.0 of Paraview.<\/p>\n<p><strong>Note 2:<\/strong>&nbsp;In situ visualization with VisIt and ParaView in Damaris are quite similar. As a result, it is recommended to check the <a href=\"https:\/\/project.inria.fr\/damaris\/visit-connector\/\">in situ visualization with VisIt documentation<\/a> before working through this tutorial.<\/p>\n<h4>Example code<\/h4>\n<p>A working example that closely matches the following description is available in the <em>\/examples\/paraview<\/em> directory, of either the git repository or installed if Damaris was configured with -DENABLE_EXAMPLES=ON and is named <em>image.cpp<\/em>. It has an accompanying Catalyst script code (<em>image.py<\/em>) and Damaris configuration file (<em>image.xml<\/em>).<\/p>\n<h4>ParaView Options<\/h4>\n<p class=\"p1\">When using ParaView Catalyst in support of in situ data analysis and visualization without Damaris, the instrumented simulation starts loading a set of Python scripts. These scripts, include necessary steps to produce images, generate plots, and also extract derived information such as polygonal data in support of in situ processing and visualization.&nbsp;During the simulation execution, any analysis and visualization output is generated in synchronous fashion (i.e., while the&nbsp;simulation is running).<\/p>\n<p>The mentioned Python scripts are used in the same way within Damaris too. In this context, simulation processes pass the datasets to the dedicated core(s) using shared memory. Afterwards, the dedicated core(s) load the Python scripts and use the steps inside each script to process data.<\/p>\n<p>In the context of Damaris, ParaView should be enabled in the xml configuration files. The Python scripts should be introduced in the same file as well. To do that, it is necessary to create a &lt;paraview&gt; tag in the xml configuration file and mention the Python script files like this:<\/p>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\">&lt;paraview&gt;\n    &lt;script&gt;\/path\/to\/the\/first\/script1.py&lt;\/script&gt;\n    &lt;script&gt;\/path\/to\/the\/first\/script2.py&lt;\/script&gt;\n&lt;\/paraview&gt;<\/pre>\n<h4>Description of meshes, fields and variables<\/h4>\n<p>Definition of meshes, fields and variables is as same as the ones that were described for VisIt connector <a href=\"https:\/\/project.inria.fr\/damaris\/visit-connector\/\">here<\/a>. We will describe them once more in this tutorial with an example. Please note that in the current version of ParaView backend for Damaris (version 1.3.0), only<strong> rectilinear<\/strong> and <strong>curvilinear<\/strong> meshes are supported.<\/p>\n<h5>Example<\/h5>\n<p>Suppose that you are going to decompose a 3D array with 100x100x100 dimensions over some processes (let&#8217;s say the number of processes is <em>size<\/em>). The decomposition will happen over the Z axis, as a result, each process will work on a 3D array with the dimensions of (100 , 100 , 100\/size). To do so, doing the following steps is necessary:<\/p>\n<h6><strong><span style=\"font-size: 14pt;\">1. Parameters&nbsp;<\/span><\/strong><\/h6>\n<p>To make the xml configuration file more flexible, it is better to define every important data item as an parameter. To do so, we can define the following parameters in the xml file:<\/p>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\">&lt;parameter name=\"WIDTH\" type=\"int\" value=\"100\" \/&gt;\n&lt;parameter name=\"HEIGHT\" type=\"int\" value=\"100\" \/&gt;\n&lt;parameter name=\"DEPTH\" type=\"int\" value=\"100\" \/&gt;\n&lt;parameter name=\"size\" type=\"int\" value=\"2\" \/&gt;\n<\/pre>\n<p>As the parameter names imply, WIDTH, HEIGHT and DEPTH are defined as the dimensions of the main data to be written. The parameter <em>size<\/em> is used for passing the number of simulation processes (not dedicated ones) to Damaris. This parameter can be set in the simulation code and at runtime using API function <em>damaris_parameter_set()<\/em> .<\/p>\n<h6><strong><span style=\"font-size: 14pt;\">2. Variables<\/span><\/strong><\/h6>\n<p>Variables are those data that are written to Damaris at the end of each iteration. In this case, we should define a variable with its attributes like this:<\/p>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\">&lt;variable name=\"pressure\" type=\"scalar\" layout=\"cells\" mesh=\"mesh\" centering=\"zonal\" \/&gt;\n<\/pre>\n<p>In this definition, pressure is the name of the variable, that is going to be written at each iteration. Scalar is the type of the data. In addition, layout and the mesh of this variable are defined as <em>cells<\/em> and <em>mesh<\/em>. These two items are discussed later in this document. Finally, the centering attribute determines that is variable should be visualized using internal volumes of the mesh (zonal) or points of the mesh (nodal).<\/p>\n<h6><strong>3. Layout<\/strong><\/h6>\n<p>The layout of a variable defines the structure of its data <em>in memory<\/em>. The definition of each layout includes the number of its dimensions, extents along each direction, the data type, etc. For the mentioned variable, its layout is defined as:<\/p>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\">&lt;layout name=\"cells\" type=\"double\" dimensions=\"DEPTH\/size,HEIGHT,WIDTH\"\nglobal=\"DEPTH,HEIGHT,WIDTH\" ghosts=\"0:0,0:0,0:0\" \/&gt;\n<\/pre>\n<ul>\n<li>Each layout should have a name. Here, the name is assigned as <em>cells<\/em>.<\/li>\n<li>The type of the layout determines the type of each data element. In this case, the type is defined as double.<\/li>\n<li>The local dimensions of the data is defined as (WIDTH,HEIGHT,DEPTH\/size). This means that each MPI process handles a data with these dimensions.<\/li>\n<li>The global tag defines the global dimensions of the data, like (WIDTH,HEIGHT,DEPTH).<\/li>\n<li>The ghosts attribute indicates the existence of ghost values in each direction. Ghosts are not implemented in the current version of Damaris (1.5.0) yet.<\/li>\n<\/ul>\n<h6><strong>4. Mesh<\/strong><\/h6>\n<p>A mesh (or grid) defines how data elements in a variable should be distributed in a 2D or 3D space. Each mesh in Damaris configuration file includes a name, its type, its dimensions and the list of variables associated to each dimension. For the mentioned example in this document, the mesh should be defined as:<\/p>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\">&lt;mesh name=\"mesh\" type=\"rectilinear\" topology=\"3\"&gt;\n    &lt;coord name=\"coord\/x\" label=\"x\"\/&gt;\n    &lt;coord name=\"coord\/y\" label=\"y\"\/&gt;\n    &lt;coord name=\"coord\/z\" label=\"z\"\/&gt;\n&lt;\/mesh&gt;\n<\/pre>\n<p>In this definition, the mesh name is <em>mesh,<\/em> its type is <em>rectilinear, <\/em>its topology is 3 and the variable that contain the coordinates of each dimension are coord\/x, coord\/y and coord\/z. Each of these coordinate variables indicates that it is located in a group (the name of the group is coord). The definition of these coordinate variables should be defined as:<\/p>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\">&lt;group name=\"coord\"&gt;\n    &lt;variable name=\"x\" layout=\"rmeshX\" visualizable=\"false\" time-varying=\"false\" \/&gt;\n    &lt;variable name=\"y\" layout=\"rmeshY\" visualizable=\"false\" time-varying=\"false\" \/&gt;\n    &lt;variable name=\"z\" layout=\"rmeshZ\" visualizable=\"false\" time-varying=\"false\" \/&gt;\n&lt;\/group&gt;\n<\/pre>\n<p>As the above definition shows, the group name is coord and 3 different variables, namely x, y and z are defined inside it. As a result, the full name of each coordinate variable should be coord\/x, coord\/y and coord\/z. Each of these variables are not time varying and visualizable. This means that the value of these variables are not changed during different iteration of the simulation and hence are not visualizable. The shape of each variable is defined as three different layouts as rmeshX, rmeshY and rmeshZ. The definition of these meshes are defined as below:<\/p>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\">&lt;layout name=\"rmeshX\" type=\"float\" dimensions=\"WIDTH+1\" global=\"WIDTH+1\" ghosts=\"0:0\" \/&gt;\n&lt;layout name=\"rmeshY\" type=\"float\" dimensions=\"HEIGHT+1\" global=\"HEIGHT+1\" ghost=\"0:0\" \/&gt;\n&lt;layout name=\"rmeshZ\" type=\"float\" dimensions=\"DEPTH\/size+1\" global=\"DEPTH+1\" ghost=\"0:0\" \/&gt;\n<\/pre>\n<p>As shown in the definition of coordinate layouts, each dimension of each layout equals the dimension of the data plus one. This means that for visualization of a data block with (WIDTH, HEIGHT , DEPTH\/size) dimensions, a mesh with dimensions of (WIDTH+1, HEIGHT+1 , DEPTH\/size +1) is needed.<\/p>\n<h4>Instrumenting the simulation<\/h4>\n<p>For instrumenting a simulation for in situ visualization with ParaView Catalyst, the first steps are the standard ones to initialize, start, stop and finalize Damaris in your simulation. These steps are discussed in another page of Damaris documentation (<a href=\"https:\/\/project.inria.fr\/damaris\/instrumenting-a-simulation\/\">found here<\/a>). After those steps, you can proceed with the following steps described below:<\/p>\n<h5>Writing coordinates<\/h5>\n<p>For in situ visualization with ParaView (and also VisIt) in Damaris, it is necessary to write the coordinate variables first. For example, for the mentioned above example, the user should initialize the value of coordinate variables specified in the xml file, that are coord\/x, coord\/y and coord\/z. The below code, shows how the coordinate variables should be passed to Damaris:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">int X,Y,Z;\nint size = GetSize();  \/\/ The number of client MPI ranks\nint rank = GetRank();\n\n\/\/ Pass the specific size parameter back to Damaris\ndamaris_parameter_set(\"size\",&amp;size,sizeof(int));\n\ndamaris_parameter_get(\"WIDTH\",&amp;X,sizeof(int));\ndamaris_parameter_get(\"HEIGHT\",&amp;Y,sizeof(int));\ndamaris_parameter_get(\"DEPTH\",&amp;Z,sizeof(int));\n\nint Z_local = Z\/size;\n\nfloat* XCoord = new float[X+1];\nfloat* YCoord = new float[Y+1];\nfloat* ZCoord = new float[Z_local +1];\n\nfor(int i=0; i&lt;=X ; i++)\nXCoord[i] = i;\n\nfor(int j=0; j&lt;=Y ; j++)\nYCoord[j] = j;\n\nfor(int k=0; k&lt;=Z_local ; k++)\nZCoord[k] =  rank*Z_local +k;\n\ndamaris_write(\"coord\/x\" , XCoord);\ndamaris_write(\"coord\/y\" , YCoord);\ndamaris_write(\"coord\/z\" , ZCoord);\n<\/pre>\n<p>Regarding the above code example, please note that:<\/p>\n<ul>\n<li>Each process should pass its local coordinates to Damaris. Because of this, the value of Z is divided by <em>size<\/em> in the code.<\/li>\n<li>For visualizing a block of 100x100x100 elements in the cells of a mesh, we need a mesh with 101x101x101 points. Because of this, each coordinate array (e.g. XCoord, YCoord and ZCoord) have been created with the size equal to X+1, Y+1 and Z_local+1;<\/li>\n<li>If coordinates of a grid are not changing over time, it is better to defines the coordinates as non-time-varying and also set the visualizable attribute as false.<\/li>\n<\/ul>\n<h5>Writing the positions and the data<\/h5>\n<p>Unlike the VisIt plug-in for Damaris, for ParaView plug-in it is necessary to write the position of each block of data into Damaris. The position means where exactly ParaView should visualize the passed data block. Writing the position, can happen while the variable array data is written to Damaris. Take a look at the below example:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">double* pressure_data = new double[X*Y*Z_local];\n\nfor(int i=0; i&lt;X; i++)\n  for(int j=0; j&lt;Y; j++)\n    for(int k=0; k&lt;Z_local; k++)\n        \/\/ fill the local pressure_data array\n\nint64_t pos[3];\n\npos[0] = 0;\npos[1] = 0;\npos[2] = rank*Z_local;\n\ndamaris_set_position(\"pressure\" , pos);\ndamaris_write(\"pressure\" , pressure_data);\ndamaris_end_iteration();\n<\/pre>\n<p>Considering the above source code, please note that:<\/p>\n<ul>\n<li>The main variable in the defined XML file is called <em>pressure<\/em>. As a result, in the damaris functions that need a variable name, the passed value is &#8220;pressure&#8221;.<\/li>\n<li>In the layout of the main variable (i.e. pressure) that is called &#8220;cells&#8221;, the type of the layout is defined as double. As a result, the data that is passed to damaris_write is a block of double data.<\/li>\n<li>Do not forget to call damaris_end_iteration when all of the data are written at the end of each iteration.<\/li>\n<\/ul>\n<h4>Running the simulation<\/h4>\n<p>Running the simulation while ParaView is enabled is like running other examples of Damaris. Just do not forget that when you have N dedicated cores and the simulation uses M processes, you should run the simulation with N+M processes, that is:<\/p>\n<pre lang=\"bash\" line=\"1\" escaped=\"true\">mpirun -np &lt;N+M&gt; &lt;config-file.xml&gt;\n<\/pre>\n<p>You will also need to ensure the python script specified in the configuration xml file defines a Catalyst pipeline and that it specifies the hostname of the machine that the Paraview GUI is running on. The value can be <em>localhost<\/em> for simulations running on the same node as the Paraview GUI, otherwise a FQDN should be specified.<\/p>\n<pre lang=\"python\" line=\"2\" escaped=\"true\"># Live Visualization, if enabled.\ncoprocessor.DoLiveVisualization(datadescription, \"localhost\", 22222)\n<\/pre>\n<h4>Connection to ParaView<\/h4>\n<p>After running the instrumented simulation, it is the time to show the result. To this aim:<\/p>\n<ul>\n<li>Open ParaView GUI and from the Catalyst menu select &#8220;connect&#8230;&#8221;.<\/li>\n<li>Afterwards, a dialog is shown to enter the port number for connecting to the simulation. (The default port is 22222, but you may change it in the Python script of your simulation.)<\/li>\n<li>When ParaView GUI is connected to the simulation, you will receive a message about the connection in the GUI.<\/li>\n<li>The final step is to go&nbsp;to the pipeline browser in ParaView GUI (in the left pane) and select what you want to do with the received information from simulation.<\/li>\n<\/ul>\n<h4>Example of unstructured-mesh mesh type<\/h4>\n<p>Since Damaris version 1.5, an unstructured mesh data type has been supported for use with the Paraview connector. VisIt support is hoped to follow soon.<br \/>\nThe unstructured mesh data representation is more complex than other mesh types and is built up of 5 variables that need to be declared and linked with the &lt;mesh type=&#8221;unstructured&#8221; &#8230; \/&gt; XML element. The variables used each need a layout and the layouts are parameterized using the parameters seen.<br \/>\nThe mesh type declaration is highlighted here, where the <em>name<\/em> component is set to an available <em>variable<\/em> defined in the XML and filled with data by the simulation client code.<\/p>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\"><data>\n     <mesh name=\"fluid_domain_umesh\" type=\"unstructured\" topology=\"3\" comment=\"These arrays can be ragged, i.e. each rank could have a different number of sections and each section can have a different number of vertices etc\">\n          <coord name=\"umesh_vars\/unstructured_mesh_xyz\" unit=\"m\">\n          <vertex_global_id name=\"umesh_vars\/unstructured_gid\" offset=\"-1\">\n          <section_types name=\"umesh_vars\/section_types\">\n          <section_sizes name=\"umesh_vars\/section_sizes\">\n          <section_connectivity name=\"umesh_vars\/section_connectivity\">\n     <\/section_connectivity><\/section_sizes><\/section_types><\/vertex_global_id><\/coord><\/mesh>\n<\/data><\/pre>\n<p>A full example which includes the mesh variables and layouts and the field data and their layouts is shown below. The field variables are:<\/p>\n<ul>\n<li>pressure    (single float per field)<\/li>\n<li>velocity    (3 component vector per field element)<\/li>\n<li>mpi_rank_id (requires an integer per field)<\/li>\n<\/ul>\n<pre lang=\"xml\" line=\"1\" escaped=\"true\"><data>\n               <parameter name=\"cs_glob_n_ranks\" type=\"int\" value=\"4\"> \n               <parameter name=\"mesh_dim\" type=\"int\" value=\"3\"> \n               <parameter name=\"n_sections_total\" type=\"int\" value=\"1\"> \n               <parameter name=\"n_vertices_total\" type=\"int\" value=\"1\">\n               <parameter name=\"n_connectivity_total\" type=\"int\" value=\"1\"> \n               <parameter name=\"n_elements_total\" type=\"int\" value=\"1\"> \n               <parameter name=\"n_sections_local\" type=\"int\" value=\"1\"> \n               <parameter name=\"n_vertices_local\" type=\"int\" value=\"1\">\n               <parameter name=\"n_connectivity_local\" type=\"int\" value=\"1\"> \n               <parameter name=\"n_elements_local\" type=\"int\" value=\"1\"> \n               <parameter name=\"n_elements_offset\" type=\"int\" value=\"1\">\n              \n               <layout name=\"zonal_layout_usmesh\" type=\"double\" dimensions=\"n_elements_local\" global=\"n_elements_total\" comment=\"For the field data e.g. Pressure\">\n               <layout name=\"zonal_layout_usmesh_int\" type=\"int\" dimensions=\"n_elements_local\" global=\"n_elements_total\" comment=\"For the integer based MPI rank data\">\n               <layout name=\"zonal_layout_usmesh_vect3\" type=\"double\" dimensions=\"3,n_elements_local\" global=\"3,n_elements_total\" comment=\"For vectorised (3 component) field data e.g. Velocity \">\n             \n               <layout name=\"unstructured_vertex_layout_xyz\" type=\"double\" dimensions=\"mesh_dim, n_vertices_local\" global=\"mesh_dim, n_vertices_total\">\n               <layout name=\"unstructured_gid_layout\" type=\"long\" dimensions=\"n_vertices_local\" global=\"n_vertices_total\">\n               <layout name=\"mesh_n_sections\" type=\"int\" dimensions=\"n_sections_local\" global=\"n_sections_total\">\n               <layout name=\"connectivity_size\" type=\"long\" dimensions=\"n_connectivity_local\" global=\"n_connectivity_total\">\n\n            <group name=\"umesh_vars\">    \n               <variable name=\"unstructured_mesh_xyz\" layout=\"unstructured_vertex_layout_xyz\" type=\"vector\" visualizable=\"false\" time-varying=\"false\" comment=\"The x,y,(z) coordinates of each vertex\">\n               <variable name=\"unstructured_gid\" layout=\"unstructured_gid_layout\" type=\"scalar\" visualizable=\"false\" time-varying=\"false\" comment=\"The global id's of each vertex\">\n               \n               <variable name=\"section_types\" layout=\"mesh_n_sections\" type=\"scalar\" visualizable=\"false\" time-varying=\"false\" comment=\"The section geometry type - VTK_QUAD VTK_HEXAHEDRON etc.\">\n               <variable name=\"section_sizes\" layout=\"mesh_n_sections\" type=\"scalar\" visualizable=\"false\" time-varying=\"false\" comment=\"The number of elements in each section- soe equiv to the number of field values per section\">\n               <variable name=\"section_connectivity\" layout=\"connectivity_size\" type=\"scalar\" visualizable=\"false\" time-varying=\"false\" comment=\"n_connectivity += section->n_elements * vtk_type_stride ;\">\n               \n               <mesh name=\"fluid_domain_umesh\" type=\"unstructured\" topology=\"3\" comment=\"These arrays can be ragged, i.e. each rank could have a different number of sections and each section can have a different number of vertices etc\">\n                  <coord name=\"umesh_vars\/unstructured_mesh_xyz\" unit=\"m\">\n                  <vertex_global_id name=\"umesh_vars\/unstructured_gid\" offset=\"-1\">\n                  <section_types name=\"umesh_vars\/section_types\">\n                  <section_sizes name=\"umesh_vars\/section_sizes\">\n                  <section_connectivity name=\"umesh_vars\/section_connectivity\">\n               <\/section_connectivity><\/section_sizes><\/section_types><\/vertex_global_id><\/coord><\/mesh><\/variable><\/variable><\/variable><\/variable><\/variable><\/group>\n\n            <group name=\"fields\">     \n              <variable name=\"pressure\" layout=\"zonal_layout_usmesh\" mesh=\"fluid_domain_umesh\" type=\"scalar\" visualizable=\"true\" unit=\"Pa\" centering=\"zonal\">\n              <variable name=\"velocity\" layout=\"zonal_layout_usmesh_vect3\" mesh=\"fluid_domain_umesh\" type=\"vector\" visualizable=\"true\" vectorlength=\"3\" unit=\"m\/s\" centering=\"zonal\">\n              <variable name=\"mpi_rank_id\" layout=\"zonal_layout_usmesh_int\" mesh=\"fluid_domain_umesh\" type=\"scalar\" visualizable=\"true\" time-varying=\"false\" unit=\"rank\" centering=\"zonal\" comment=\"Compare store=MyStore with Paraview csv output\">\n           <\/variable><\/variable><\/variable><\/group>\n     <\/layout><\/layout><\/layout><\/layout><\/layout><\/layout><\/layout><\/parameter><\/parameter><\/parameter><\/parameter><\/parameter><\/parameter><\/parameter><\/parameter><\/parameter><\/parameter><\/parameter><\/data>\n<\/pre>\n<p>The simulation client code needs to fill the mesh variables with the correct data, also matching the type of the data, i.e. int  float double etc.<br \/>\nA client side code example will be added here to extend this tutorial.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In order to benefit from ParaView connector that has been implemented in Damaris, it is necessary to build Damaris on a machine that ParaView Catalyst is already installed. You may use this link to install ParaView in your machine. Please note that if you are going to have your simulation&#8230;<\/p>\n<p> <a class=\"continue-reading-link\" href=\"https:\/\/project.inria.fr\/damaris\/paraview-connector\/\"><span>Continue reading<\/span><i class=\"crycon-right-dir\"><\/i><\/a> <\/p>\n","protected":false},"author":1249,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-707","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/project.inria.fr\/damaris\/wp-json\/wp\/v2\/pages\/707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/project.inria.fr\/damaris\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/project.inria.fr\/damaris\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/project.inria.fr\/damaris\/wp-json\/wp\/v2\/users\/1249"}],"replies":[{"embeddable":true,"href":"https:\/\/project.inria.fr\/damaris\/wp-json\/wp\/v2\/comments?post=707"}],"version-history":[{"count":30,"href":"https:\/\/project.inria.fr\/damaris\/wp-json\/wp\/v2\/pages\/707\/revisions"}],"predecessor-version":[{"id":1199,"href":"https:\/\/project.inria.fr\/damaris\/wp-json\/wp\/v2\/pages\/707\/revisions\/1199"}],"wp:attachment":[{"href":"https:\/\/project.inria.fr\/damaris\/wp-json\/wp\/v2\/media?parent=707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}