<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Verdana;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Verdana","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Verdana","sans-serif"'>You may want to write a class, say petsc_init_uninit, whose constructor<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Verdana","sans-serif"'>initializes petsc and whose destructor finalizes it.&nbsp; Then declare an object<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Verdana","sans-serif"'>of class petsc_init_uninit in main.&nbsp; This will solve the first issue.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Verdana","sans-serif"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Verdana","sans-serif"'><a href="http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.2">http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.2</a><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Verdana","sans-serif"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Verdana","sans-serif"'>Chetan<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Verdana","sans-serif"'><o:p>&nbsp;</o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> petsc-users-bounces@mcs.anl.gov [mailto:petsc-users-bounces@mcs.anl.gov] <b>On Behalf Of </b>Mohammad Mirzadeh<br><b>Sent:</b> Thursday, December 01, 2011 5:48 PM<br><b>To:</b> PETSc users list<br><b>Subject:</b> [petsc-users] VecGet/RestoreArray and related functions<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><div><p class=MsoNormal>Hi guys,<o:p></o:p></p><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>I am having a conceptual problem trying to design my vector wrappers for my application. The problem is some of vector&nbsp;functionality&nbsp;in PETSc require extra function calls which makes it hard to design a good wrapper. One example that I encountered was when trying to write the destructor for my vector object. You see, for example, the following code is not good enough<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Vector::~Vector(){<o:p></o:p></p></div><div><p class=MsoNormal>VecDestroy(v_local);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>This, in itself wont work since all calls to VecDestroy() should be made before PetscFinalize() and this wont happen if you define a Vector in your main function since the destructor is called upon exit ... So, I had to fix this by actually having a destructor function memer that I could call explicitly before PetscFinalize() or create the Vector object on the heap so that I can manually invoke the destructor via delete operator!<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Another example I'm struggling with is the following: I am trying to write accessors so that I can do the following:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Vector a (PETSC_COMM_WORLD, PETSC_DECIDE,10); // make a petsc vector of global length 10 using my own wrappers<o:p></o:p></p></div><div><p class=MsoNormal>for (int i=0; i&lt;a.GetLocalSize(); i++){<o:p></o:p></p></div><div><p class=MsoNormal>a(i) = i;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>For this to work, I am using the VecGetArray() and VecRestoreArray() functions. The problem is you cannot easily use them inside the accessor which basically looks something like:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>inline double&amp; Vector::operator()(int i){<o:p></o:p></p></div><div><p class=MsoNormal>return ptr_to_dataArray[i];<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>since you need to call to VecRestoreArray after the assignment which means after return!. The simple fix to this is to call the VecGetArray() and VecRestoreArray() in the main function where you are putting in the values but this does not look very neat to me ... so I ended up putting the VecGetArray() inside the constructor and VecRestoreArray() inside the destructor to automate the process.&nbsp;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Now I have the following two questions. 1) Is this safe? As far as I could understand from the manual, VecGetArray() &quot;returns&quot; a pointer to internal data stored on this processor. Then I guess VecRestoreArray() is there to somehow nullify the pointer to prevent accidental use of pointer? Since all pointers all private members of my class I assume this is safe then unless these two functions are actually doing some extra work?<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>2) Is there any better way of writing these wrappers and get around the problem of having to call &quot;supplemental&quot; functions safely?<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Sorry if my lack of knowledge is causing all these confusion.&nbsp;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal>Mohammad<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div></div></div></div></body></html>