<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Re:Using pdgetrf and pdgetri for Matrix inversion in C++ in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1327895#M32273</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;I have posted an update of my issue above.&lt;/P&gt;
&lt;P&gt;I didn't think that it would be such difficult to have a simple example of matrix inversion with ScaLapack.&lt;/P&gt;
&lt;P&gt;Regards&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sun, 07 Nov 2021 17:12:59 GMT</pubDate>
    <dc:creator>chris6</dc:creator>
    <dc:date>2021-11-07T17:12:59Z</dc:date>
    <item>
      <title>Using pdgetrf and pdgetri for Matrix inversion in C++</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1323417#M32231</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I am trying to use scaLapack to inverse a 120k x 120k matrix with `pdgetrf` and `pdgetri` . I have found an example of matrix inversion using `pdgetrf` and `pdgetri` :&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;#include &amp;lt;mpi.h&amp;gt;
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;cassert&amp;gt;
//#include "block_cyclic_mat.h"
#include &amp;lt;mkl.h&amp;gt;
#include "mkl_scalapack.h"
#include &amp;lt;vector&amp;gt;
#include &amp;lt;memory&amp;gt;

using namespace std;

static double getri_flops(int N)
{
// From:
// https://icl.cs.utk.edu/svn/scalapack-dev/scalapack/trunk/TESTING/LIN/pdinvdriver.f
// Factorization: 2/3 N^3 - 1/2 N^2
// Inverse : 4/3 N^3 - N^2

return ((2.0/3.0 * N * N * N) - (1.0/2.0 * N * N) +
(4.0/3.0 * N * N * N) - (N * N))/1024.0/1024.0/1024.0;
}

/// n_global: the order of the matrix
static void inv_driver(int n_global)
{

auto grid = make_shared&amp;lt;blacs_grid_t&amp;gt;();

//// self code
//n_global = 3;
//double *aaa = new double(n_global*n_global);
//for (int i = 0; i &amp;lt; 9; i++)
//{
// aaa[i] = i + 1;
//}
//aaa[8] = 10;
//auto a = block_cyclic_mat_t::createWithArray(grid, n_global, n_global, aaa);


// Create a NxN random matrix A
auto a = block_cyclic_mat_t::random(grid, n_global, n_global);

// Create a NxN matrix to hold A^{-1}
auto ai = block_cyclic_mat_t::constant(grid, n_global, n_global);

// Copy A to A^{-1} since it will be overwritten during factorization
copy_n(a-&amp;gt;local_data(), a-&amp;gt;local_size(), ai-&amp;gt;local_data());

MPI_Barrier (MPI_COMM_WORLD);

double t0 = MPI_Wtime();

// Factorize A
int ia = 1, ja = 1;
vector&amp;lt;int&amp;gt; ipiv(a-&amp;gt;local_rows() + a-&amp;gt;row_block_size() + 100);
int info;

//å«ä¹åºè¯¥æ¯D-GE-TRFã
//ç¬¬ä¸ä¸ªDè¡¨ç¤ºæä»¬çç©éµæ¯doubleç±»åç
//GEè¡¨ç¤ºæä»¬çç©éµæ¯Generalç±»åç
//TRFè¡¨ç¤ºå¯¹ç©éµè¿è¡ä¸è§åè§£ä¹å°±æ¯æä»¬éå¸¸æè¯´çLUåè§£ã
pdgetrf_(n_global, n_global,
ai-&amp;gt;local_data(), ia, ja, ai-&amp;gt;descriptor(),
ipiv.data(),
info);
assert(info == 0);
double t_factor = MPI_Wtime() - t0;

// Compute A^{-1} based on the LU factorization

// Compute workspace for double and integer work arrays on each process
int lwork = 10;
int liwork = 10;
vector&amp;lt;double&amp;gt; work (lwork);
vector&amp;lt;int&amp;gt; iwork(liwork);

lwork = liwork = -1;

// è®¡ç®lworkä¸liworkçå¼
pdgetri_(n_global,
ai-&amp;gt;local_data(), ia, ja, ai-&amp;gt;descriptor(),
ipiv.data(),
work.data(), lwork, iwork.data(), liwork, info);
assert(info == 0);
lwork = static_cast&amp;lt;int&amp;gt;(work[0]);
liwork = static_cast&amp;lt;size_t&amp;gt;(iwork[0]);
work.resize(lwork);
iwork.resize(liwork);

// Now compute the inverse
t0 = MPI_Wtime();
pdgetri_(n_global,
ai-&amp;gt;local_data(), ia, ja, ai-&amp;gt;descriptor(),
ipiv.data(),
work.data(), lwork, iwork.data(), liwork, info);
assert(info == 0);
double t_solve = MPI_Wtime() - t0;

// Verify that the inverse is correct using A*A^{-1} = I
auto identity = block_cyclic_mat_t::diagonal(grid, n_global, n_global);

// Compute I = A * A^{-1} - I and verify that the ||I|| is small
char nein = 'N';
double alpha = 1.0, beta = -1.0;
pdgemm_(nein, nein, n_global, n_global, n_global, alpha,
a-&amp;gt;local_data() , ia, ja, a-&amp;gt;descriptor(),
ai-&amp;gt;local_data(), ia, ja, ai-&amp;gt;descriptor(),
beta,
identity-&amp;gt;local_data(), ia, ja, identity-&amp;gt;descriptor());

// Compute 1-norm of the result
char norm='1';
work.resize(identity-&amp;gt;local_cols());
double err = pdlange_(norm, n_global, n_global,
identity-&amp;gt;local_data(), ia, ja, identity-&amp;gt;descriptor(), work.data());

double t_total = t_factor + t_solve;
double t_glob;
MPI_Reduce(&amp;amp;t_total, &amp;amp;t_glob, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);

if (grid-&amp;gt;iam() == 0)
{
double gflops = getri_flops(n_global)/t_glob/grid-&amp;gt;nprocs();
printf("\n"
"MATRIX INVERSE BENCHMARK SUMMARY\n"
"================================\n"
"N = %d\tNP = %d\tNP_ROW = %d\tNP_COL = %d\n"
"Time for PxGETRF + PxGETRI = %10.7f seconds\tGflops/Proc = %10.7f, Error = %f\n",
n_global, grid-&amp;gt;nprocs(), grid-&amp;gt;nprows(), grid-&amp;gt;npcols(),
t_glob, gflops, err);fflush(stdout);
}
}

int main(int argc, char** argv)
{
MPI_Init(&amp;amp;argc, &amp;amp;argv);
int n_global = 4096;

if (argc &amp;gt; 1)
{
n_global = int(atol(argv[1])); // stol å­ç¬¦ä¸²è½¬é¿æ´å½¢
}

inv_driver(n_global);
MPI_Finalize();
}


&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I tried to compile this source in the following way :&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;mpicxx -I/opt/intel/oneapi/mpi/latest/include -L${MKLROOT}/lib/intel64 -lmkl_scalapack_ilp64 -lmkl_intel_ ilp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_intelmpi_ilp64 -liomp5 -lpthread -lm -ldl main.cpp&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;But I get the following errors :&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;main.cpp: In function ‘void inv_driver(int)’:
main.cpp:27:29: error: ‘blacs_grid_t’ was not declared in this scope
auto grid = make_shared&amp;lt;blacs_grid_t&amp;gt;();
^~~~~~~~~~~~
main.cpp:27:29: note: suggested alternative: ‘clockid_t’
auto grid = make_shared&amp;lt;blacs_grid_t&amp;gt;();
^~~~~~~~~~~~
clockid_t
main.cpp:27:43: error: no matching function for call to ‘make_shared&amp;lt;&amp;lt;expression error&amp;gt; &amp;gt;()’
auto grid = make_shared&amp;lt;blacs_grid_t&amp;gt;();
^
In file included from /usr/include/c++/8/memory:81,
from main.cpp:8:
/usr/include/c++/8/bits/shared_ptr.h:718:5: note: candidate: ‘template&amp;lt;class _Tp, class ... _Args&amp;gt; std::shared_ptr&amp;lt;_Tp&amp;gt; std::make_shared(_Args&amp;amp;&amp;amp; ...)’
make_shared(_Args&amp;amp;&amp;amp;... __args)
^~~~~~~~~~~
/usr/include/c++/8/bits/shared_ptr.h:718:5: note: template argument deduction/substitution failed:
main.cpp:27:43: error: template argument 1 is invalid
auto grid = make_shared&amp;lt;blacs_grid_t&amp;gt;();
^
main.cpp:41:14: error: ‘block_cyclic_mat_t’ has not been declared
auto a = block_cyclic_mat_t::random(grid, n_global, n_global);
^~~~~~~~~~~~~~~~~~
main.cpp:44:15: error: ‘block_cyclic_mat_t’ has not been declared
auto ai = block_cyclic_mat_t::constant(grid, n_global, n_global);
^~~~~~~~~~~~~~~~~~
main.cpp:47:5: error: ‘copy_n’ was not declared in this scope
copy_n(a-&amp;gt;local_data(), a-&amp;gt;local_size(), ai-&amp;gt;local_data());
^~~~~~
main.cpp:47:5: note: suggested alternative: ‘ctpcon’
copy_n(a-&amp;gt;local_data(), a-&amp;gt;local_size(), ai-&amp;gt;local_data());
^~~~~~
ctpcon
main.cpp:100:21: error: ‘block_cyclic_mat_t’ has not been declared
auto identity = block_cyclic_mat_t::diagonal(grid, n_global, n_global);
^~~~~~~~~~~~~~~~~~
main.cpp:105:5: error: ‘pdgemm_’ was not declared in this scope
pdgemm_(nein, nein, n_global, n_global, n_global, alpha,
^~~~~~~
main.cpp:105:5: note: suggested alternative: ‘pdgels_’
pdgemm_(nein, nein, n_global, n_global, n_global, alpha,
^~~~~~~
pdgels_&lt;/LI-CODE&gt;
&lt;P&gt;&lt;BR /&gt;I couldn't find into my OneAPI installation the header `"block_cyclic_mat.h"`.&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;Moreover, I get a lot of same error about `"block_cyclic_mat_t"` with : `"error: ‘block_cyclic_mat_t’` has not been declared"&lt;/P&gt;
&lt;P&gt;By the way, I have also errors about `"blacs_grid_t’` was not declared in this scope" and `"error: no matching function for call to ‘make_shared&amp;lt;&amp;lt;expression error&amp;gt; &amp;gt;()’ "`&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;Does anyone see what's wrong and if this is the case, how to circumvent these compilation errors ?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Best regards&lt;/P&gt;</description>
      <pubDate>Wed, 20 Oct 2021 09:22:20 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1323417#M32231</guid>
      <dc:creator>chris6</dc:creator>
      <dc:date>2021-10-20T09:22:20Z</dc:date>
    </item>
    <item>
      <title>Re: Using pdgetrf and pdgetri for Matrix inversion in C++</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1324453#M32232</link>
      <description>&lt;P&gt;Hi Chris,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for reaching out to us.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We suppose that blacs_grid_t and block_cyclic_mat_t are user defined routines. So, could you please include the related code ?&lt;/P&gt;
&lt;P&gt;or&lt;/P&gt;
&lt;P&gt;Could you please use Intel oneAPI MKL Library related routines .&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;gt;&amp;gt;&amp;gt; &lt;I&gt;I have also errors about `"blacs_grid_t’` was not declared in this scope".&lt;/I&gt;&lt;/P&gt;
&lt;P&gt;Please refer to the below link for using&amp;nbsp; blacs and change the code accordingly.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.intel.com/content/www/us/en/develop/documentation/onemkl-developer-reference-c/top/blacs-routines/blacs-support-routines/initialization-routines.html#initialization-routines" target="_blank" rel="noopener"&gt;https://www.intel.com/content/www/us/en/develop/documentation/onemkl-developer-reference-c/top/blacs-routines/blacs-support-routines/initialization-routines.html#initialization-routines&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For using pdgemm, please include "mkl_pblas.h" in your code.&lt;/P&gt;
&lt;P&gt;Please refer to the below link for more details.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.intel.com/content/www/us/en/develop/documentation/onemkl-developer-reference-c/top/pblas-routines/pblas-level-3-routines/p-gemm.html#p-gemm" target="_blank" rel="noopener"&gt;https://www.intel.com/content/www/us/en/develop/documentation/onemkl-developer-reference-c/top/pblas-routines/pblas-level-3-routines/p-gemm.html#p-gemm&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks &amp;amp; Regards,&lt;/P&gt;
&lt;P&gt;Hemanth.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 26 Oct 2021 05:50:33 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1324453#M32232</guid>
      <dc:creator>HemanthCH_Intel</dc:creator>
      <dc:date>2021-10-26T05:50:33Z</dc:date>
    </item>
    <item>
      <title>Re:Using pdgetrf and pdgetri for Matrix inversion in C++</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1326286#M32257</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;We haven't heard back from you. Could you please provide an update on your issue?&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Thanks &amp;amp; regards,&lt;/P&gt;&lt;P&gt;Hemanth.&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Mon, 01 Nov 2021 13:07:59 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1326286#M32257</guid>
      <dc:creator>HemanthCH_Intel</dc:creator>
      <dc:date>2021-11-01T13:07:59Z</dc:date>
    </item>
    <item>
      <title>Re: Using pdgetrf and pdgetri for Matrix inversion in C++</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1327894#M32272</link>
      <description>&lt;P&gt;Hi Hemanth !&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for your support. The code I posted above comes from the following link :&lt;/P&gt;
&lt;P&gt;&lt;A title="Scalapack - Inverse a Matrix" href="https://cpp.hotexamples.com/site/file?hash=0x997241836033d9ef832d155f2515172857071833425d44fbaa0fe82464fedf5d&amp;amp;fullName=inverse.cpp&amp;amp;project=flySword/C-" target="_blank" rel="noopener"&gt;https://cpp.hotexamples.com/site/file?hash=0x997241836033d9ef832d155f2515172857071833425d44fbaa0fe82464fedf5d&amp;amp;fullName=inverse.cpp&amp;amp;project=flySword/C-&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I didn't find on inte.com documentation a simple example of matrix inversion with ScaLapack.&lt;/P&gt;
&lt;P&gt;Could you provide please a simple example which uses MPI and the Intel OneAPI routines of ScaLapack to invert large matrix. I have at work&lt;/P&gt;
&lt;P&gt;a worstation which has 1TB RAM and 64 cores with 2 GPU RTX A6000 which gives 96GB.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I would be grateful if you can show me this basic example.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Best regards&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 07 Nov 2021 17:06:31 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1327894#M32272</guid>
      <dc:creator>chris6</dc:creator>
      <dc:date>2021-11-07T17:06:31Z</dc:date>
    </item>
    <item>
      <title>Re: Re:Using pdgetrf and pdgetri for Matrix inversion in C++</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1327895#M32273</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;I have posted an update of my issue above.&lt;/P&gt;
&lt;P&gt;I didn't think that it would be such difficult to have a simple example of matrix inversion with ScaLapack.&lt;/P&gt;
&lt;P&gt;Regards&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 07 Nov 2021 17:12:59 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1327895#M32273</guid>
      <dc:creator>chris6</dc:creator>
      <dc:date>2021-11-07T17:12:59Z</dc:date>
    </item>
    <item>
      <title>Re:Using pdgetrf and pdgetri for Matrix inversion in C++</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1328326#M32281</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;We are working on your issue, we will get back to you soon.&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Hemanth.&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Tue, 09 Nov 2021 04:52:13 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1328326#M32281</guid>
      <dc:creator>HemanthCH_Intel</dc:creator>
      <dc:date>2021-11-09T04:52:13Z</dc:date>
    </item>
    <item>
      <title>Re:Using pdgetrf and pdgetri for Matrix inversion in C++</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1337275#M32307</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;You could re-use these ScaLAPACK examples which are ready to take and build: &lt;A href="https://github.com/flySword/C-" target="_blank"&gt;https://github.com/flySword/C-&lt;/A&gt;&lt;/P&gt;&lt;P&gt;All common header files like block_cyclic_mat.h&amp;nbsp;and others You could find out into Common directory.&lt;/P&gt;&lt;P&gt;The only thing you have to do is link against MKL. Here is the link to the MKL User Adviser to see how to link with ScaLAPACK API correctly:  &lt;A href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl-link-line-advisor.html" target="_blank"&gt;https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl-link-line-advisor.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;At this moment we don't have a "C" API examples to share. The Corresponding Feature Request would open and probably these examples will be added in one of the future versions of oneMKL.&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Right now, the thread is closing and we will no longer respond to this thread.&amp;nbsp;If you require additional assistance from Intel, please start a new thread.&amp;nbsp;Any further interaction in this thread will be considered community only.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;--Gennady&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Thu, 18 Nov 2021 12:15:40 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Using-pdgetrf-and-pdgetri-for-Matrix-inversion-in-C/m-p/1337275#M32307</guid>
      <dc:creator>Gennady_F_Intel</dc:creator>
      <dc:date>2021-11-18T12:15:40Z</dc:date>
    </item>
  </channel>
</rss>

