Oh interesting, so I need to add those extra brackets around my class object 
and function calls. I thought the destructor is automatically at Finalize.

Thanks!
Yuyun

-----Original Message-----
From: Jed Brown <j...@jedbrown.org> 
Sent: Sunday, March 3, 2019 2:19 PM
To: Yuyun Yang <yyan...@stanford.edu>; Matthew Knepley <knep...@gmail.com>
Cc: petsc-users@mcs.anl.gov
Subject: Re: [petsc-users] AddressSanitizer: attempting free on address which 
was not malloc()-ed

If you run this with MPICH, it prints

  Attempting to use an MPI routine after finalizing MPICH

You need to ensure that the C++ class destructor is called before 
PetscFinalize.  For example, like this:

diff --git i/test_domain.cpp w/test_domain.cpp index 0cfe22f..23545f2 100644
--- i/test_domain.cpp
+++ w/test_domain.cpp
@@ -8,11 +8,12 @@ int main(int argc, char **argv) {
   PetscErrorCode ierr = 0;
   PetscInitialize(&argc, &argv, NULL, NULL);
 
-  Domain d;
+  {
+    Domain d;
 
-  ierr = d.setFields(); CHKERRQ(ierr);
-  ierr = d.setScatters(); CHKERRQ(ierr);
-  
+    ierr = d.setFields(); CHKERRQ(ierr);
+    ierr = d.setScatters(); CHKERRQ(ierr);  }
   PetscFinalize();
   return ierr;
 }


Yuyun Yang via petsc-users <petsc-users@mcs.anl.gov> writes:

> Yes, please see the attached files for a minimal example. Thanks a lot!
>
> Best regards,
> Yuyun
>
> From: Matthew Knepley <knep...@gmail.com>
> Sent: Sunday, March 3, 2019 12:46 PM
> To: Yuyun Yang <yyan...@stanford.edu>
> Cc: Zhang, Junchao <jczh...@mcs.anl.gov>; petsc-users@mcs.anl.gov
> Subject: Re: [petsc-users] AddressSanitizer: attempting free on 
> address which was not malloc()-ed
>
> On Sun, Mar 3, 2019 at 3:05 PM Yuyun Yang 
> <yyan...@stanford.edu<mailto:yyan...@stanford.edu>> wrote:
> Actually, I tried just creating a domain object (since the address sanitizer 
> was complaining about that code to start with). Simply creating that object 
> gave me a core dump, so I suppose the issue must be there. I got the 
> following message when running the code with -objects_dump flag on the 
> command line, but couldn’t find a problem with the code (I’ve attached it 
> here with only the relevant functions).
>
> I think what we are going to need from you is a minimal example that 
> has the error. I am guessing you have a logic bug in the C++, which we cannot 
> debug by looking.
>
>   Thanks,
>
>      Matt
>
> Thanks a lot for your help!
>
> The following objects were never freed
> -----------------------------------------
> [0] Vec seq y
>       [0]  VecCreate() in 
> /home/yyy910805/petsc/src/vec/vec/interface/veccreate.c
> [0] Vec seq Vec_0x84000000_0
>       [0]  VecCreate() in 
> /home/yyy910805/petsc/src/vec/vec/interface/veccreate.c
> [0] Vec seq Vec_0x84000000_1
>       [0]  VecCreate() in 
> /home/yyy910805/petsc/src/vec/vec/interface/veccreate.c
> [0] VecScatter seq VecScatter_0x84000000_2
>       [0]  VecScatterCreate() in 
> /home/yyy910805/petsc/src/vec/vscat/interface/vscreate.c
> [0] VecScatter seq VecScatter_0x84000000_3
>       [0]  VecScatterCreate() in 
> /home/yyy910805/petsc/src/vec/vscat/interface/vscreate.c
> [0] VecScatter seq VecScatter_0x84000000_4
>       [0]  VecScatterCreate() in 
> /home/yyy910805/petsc/src/vec/vscat/interface/vscreate.c
> [0] VecScatter seq VecScatter_0x84000000_5
>       [0]  VecScatterCreate() in 
> /home/yyy910805/petsc/src/vec/vscat/interface/vscreate.c
> Attempting to use an MPI routine after finalizing MPICH
>
> ----------------------------------------------------------------------
> ----------------------------------------------------------------------
> -----
> From: Matthew Knepley <knep...@gmail.com<mailto:knep...@gmail.com>>
> Sent: Sunday, March 3, 2019 11:28 AM
> To: Yuyun Yang <yyan...@stanford.edu<mailto:yyan...@stanford.edu>>
> Cc: Zhang, Junchao <jczh...@mcs.anl.gov<mailto:jczh...@mcs.anl.gov>>; 
> petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>
> Subject: Re: [petsc-users] AddressSanitizer: attempting free on 
> address which was not malloc()-ed
>
> On Sun, Mar 3, 2019 at 1:03 PM Yuyun Yang via petsc-users 
> <petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>> wrote:
> I tried compiling without the sanitizer and running on valgrind. Got a bunch 
> of errors “Uninitialised value was created by a stack allocation at 0x41B280: 
> ComputeVel_qd::computeVel(double*, double, int&, int)”.
>
> There is no memory management code here, so other parts of the code must be 
> relevant.
>
>   Thanks,
>
>     Matt
>
>
> HEAP SUMMARY:
> ==74==     in use at exit: 96,637 bytes in 91 blocks
> ==74==   total heap usage: 47,774 allocs, 47,522 frees, 308,253,653 bytes 
> allocated
> LEAK SUMMARY:
> ==74==    definitely lost: 0 bytes in 0 blocks
> ==74==    indirectly lost: 0 bytes in 0 blocks
> ==74==      possibly lost: 0 bytes in 0 blocks
> ==74==    still reachable: 96,637 bytes in 91 blocks
> ==74==         suppressed: 0 bytes in 0 blocks
>
> The error is located in the attached code (I’ve extracted only the relevant 
> functions), but I couldn’t figure out what is wrong. Is this causing the 
> memory corruption/double free error that happens when I execute the code?
>
> Thanks a lot for your help.
>
> Best regards,
> Yuyun
>
> From: Zhang, Junchao <jczh...@mcs.anl.gov<mailto:jczh...@mcs.anl.gov>>
> Sent: Friday, March 1, 2019 7:36 AM
> To: Yuyun Yang <yyan...@stanford.edu<mailto:yyan...@stanford.edu>>
> Subject: Re: [petsc-users] AddressSanitizer: attempting free on 
> address which was not malloc()-ed
>
>
> On Fri, Mar 1, 2019 at 1:02 AM Yuyun Yang 
> <yyan...@stanford.edu<mailto:yyan...@stanford.edu>> wrote:
> Actually, I also saw a line at the beginning of valgrind saying "shadow 
> memory range interleaves with an existing memory mapping. ASan cannot proceed 
> properly. ABORTING." I guess the code didn't really run through valgrind 
> since it aborted. Should I remove the address sanitizer flag when compiling?
> From the message, it seems ASan (not valgrind) aborted. You can try to 
> compile without sanitizer and then run with valgrind. If no problem, then it 
> is probably a sanitizer issue.
>
>
> Get Outlook for iOS<https://aka.ms/o0ukef> 
> ________________________________
> From: Yuyun Yang
> Sent: Thursday, February 28, 2019 10:54:57 PM
> To: Zhang, Junchao
> Subject: Re: [petsc-users] AddressSanitizer: attempting free on 
> address which was not malloc()-ed
>
> Hmm, still getting the same error from address sanitizer even though valgrind 
> shows no errors and no leaks are possible.
>
> Should I ignore that error? My results did run alright.
>
> Best,
> Yuyun
>
> Get Outlook for iOS<https://aka.ms/o0ukef> 
> ________________________________
> From: Zhang, Junchao <jczh...@mcs.anl.gov<mailto:jczh...@mcs.anl.gov>>
> Sent: Wednesday, February 27, 2019 8:27:17 PM
> To: Yuyun Yang
> Cc: Matthew Knepley; 
> petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>
> Subject: Re: [petsc-users] AddressSanitizer: attempting free on 
> address which was not malloc()-ed
>
> Try the following to see if you can catch the bug easily: 1) Get error 
> code for each petsc function and check it with CHKERRQ; 2) Link your 
> code with a petsc library with debugging enabled (configured with 
> --with-debugging=1); 3) Run your code with valgrind
>
> --Junchao Zhang
>
>
> On Wed, Feb 27, 2019 at 9:04 PM Yuyun Yang 
> <yyan...@stanford.edu<mailto:yyan...@stanford.edu>> wrote:
> Hi Junchao,
>
> This code actually involves a lot of classes and is pretty big. Might be an 
> overkill for me to send everything to you. I'd like to know if I see this 
> sort of error message, which points to this domain file, is it possible that 
> the problem happens in another file (whose operations are linked to this 
> one)? If so, I'll debug a little more and maybe send you more useful 
> information later.
>
> Best regards,
> Yuyun
>
> Get Outlook for iOS<https://aka.ms/o0ukef> 
> ________________________________
> From: Zhang, Junchao <jczh...@mcs.anl.gov<mailto:jczh...@mcs.anl.gov>>
> Sent: Wednesday, February 27, 2019 6:24:13 PM
> To: Yuyun Yang
> Cc: Matthew Knepley; 
> petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>
> Subject: Re: [petsc-users] AddressSanitizer: attempting free on 
> address which was not malloc()-ed
>
> Could you provide a compilable and runnable test so I can try it?
> --Junchao Zhang
>
>
> On Wed, Feb 27, 2019 at 7:34 PM Yuyun Yang 
> <yyan...@stanford.edu<mailto:yyan...@stanford.edu>> wrote:
> Thanks, I fixed that, but I’m not actually calling the testScatters() 
> function in my implementation (in the constructor, the only functions I 
> called are setFields and setScatters). So the problem couldn’t have been that?
>
> Best,
> Yuyun
>
> From: Zhang, Junchao <jczh...@mcs.anl.gov<mailto:jczh...@mcs.anl.gov>>
> Sent: Wednesday, February 27, 2019 10:50 AM
> To: Yuyun Yang <yyan...@stanford.edu<mailto:yyan...@stanford.edu>>
> Cc: Matthew Knepley <knep...@gmail.com<mailto:knep...@gmail.com>>; 
> petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>
> Subject: Re: [petsc-users] AddressSanitizer: attempting free on 
> address which was not malloc()-ed
>
>
> On Wed, Feb 27, 2019 at 10:41 AM Yuyun Yang via petsc-users 
> <petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>> wrote:
> I called VecDestroy() in the destructor for this object – is that not the 
> right way to do it?
> In Domain::testScatters(), you have many VecDuplicate(,&out), You need 
> to VecDestroy(&out) before doing new VecDuplicate(,&out); How do I implement 
> CHECK ALL RETURN CODES?
> For each PETSc function, do ierr = ...;  CHKERRQ(ierr);
>
> From: Matthew Knepley <knep...@gmail.com<mailto:knep...@gmail.com>>
> Sent: Wednesday, February 27, 2019 7:24 AM
> To: Yuyun Yang <yyan...@stanford.edu<mailto:yyan...@stanford.edu>>
> Cc: petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>
> Subject: Re: [petsc-users] AddressSanitizer: attempting free on 
> address which was not malloc()-ed
>
> You call VecDuplicate() a bunch, but VecDestroy() only once in the bottom 
> function. This is wrong.
> Also, CHECK ALL RETURN CODES. This is the fastest way to find errors.
>
>    Matt
>
> On Wed, Feb 27, 2019 at 2:06 AM Yuyun Yang via petsc-users 
> <petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>> wrote:
> Hello team,
>
> I ran into the address sanitizer error that I hope you could help me with. I 
> don’t really know what’s wrong with the way the code frees memory. The 
> relevant code file is attached. The line number following domain.cpp 
> specifically referenced to the vector _q, which seems a little odd, since 
> some other vectors are constructed and freed the same way.
>
> ==1719==ERROR: AddressSanitizer: attempting free on address which was not 
> malloc()-ed: 0x61f0000076c0 in thread T0
>     #0 0x7fbf195282ca in __interceptor_free 
> (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x982ca)
>     #1 0x7fbf1706f895 in PetscFreeAlign 
> /home/yyy910805/petsc/src/sys/memory/mal.c:87
>     #2 0x7fbf1731a898 in VecDestroy_Seq 
> /home/yyy910805/petsc/src/vec/vec/impls/seq/bvec2.c:788
>     #3 0x7fbf1735f795 in VecDestroy 
> /home/yyy910805/petsc/src/vec/vec/interface/vector.c:408
>     #4 0x40dd0a in Domain::~Domain() 
> /home/yyy910805/scycle/source/domain.cpp:132
>     #5 0x40b479 in main /home/yyy910805/scycle/source/main.cpp:242
>     #6 0x7fbf14d2082f in __libc_start_main 
> (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
>     #7 0x4075d8 in _start 
> (/home/yyy910805/scycle/source/main+0x4075d8)
>
> 0x61f0000076c0 is located 1600 bytes inside of 3220-byte region 
> [0x61f000007080,0x61f000007d14) allocated by thread T0 here:
>     #0 0x7fbf19528b32 in __interceptor_memalign 
> (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98b32)
>     #1 0x7fbf1706f7e0 in PetscMallocAlign 
> /home/yyy910805/petsc/src/sys/memory/mal.c:41
>     #2 0x7fbf17073022 in PetscTrMallocDefault 
> /home/yyy910805/petsc/src/sys/memory/mtr.c:183
>     #3 0x7fbf170710a1 in PetscMallocA 
> /home/yyy910805/petsc/src/sys/memory/mal.c:397
>     #4 0x7fbf17326fb0 in VecCreate_Seq 
> /home/yyy910805/petsc/src/vec/vec/impls/seq/bvec3.c:35
>     #5 0x7fbf1736f560 in VecSetType 
> /home/yyy910805/petsc/src/vec/vec/interface/vecreg.c:51
>     #6 0x7fbf1731afae in VecDuplicate_Seq 
> /home/yyy910805/petsc/src/vec/vec/impls/seq/bvec2.c:807
>     #7 0x7fbf1735eff7 in VecDuplicate 
> /home/yyy910805/petsc/src/vec/vec/interface/vector.c:379
>     #8 0x4130de in Domain::setFields() 
> /home/yyy910805/scycle/source/domain.cpp:431
>     #9 0x40c60a in Domain::Domain(char const*) 
> /home/yyy910805/scycle/source/domain.cpp:57
>     #10 0x40b433 in main /home/yyy910805/scycle/source/main.cpp:242
>     #11 0x7fbf14d2082f in __libc_start_main 
> (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
>
> SUMMARY: AddressSanitizer: bad-free ??:0 __interceptor_free 
> ==1719==ABORTING
>
> Thanks very much!
> Yuyun
>
>
> --
> What most experimenters take for granted before they begin their experiments 
> is infinitely more interesting than any results to which their experiments 
> lead.
> -- Norbert Wiener
>
> https://www.cse.buffalo.edu/~knepley/<http://www.cse.buffalo.edu/~knep
> ley/>
>
>
> --
> What most experimenters take for granted before they begin their experiments 
> is infinitely more interesting than any results to which their experiments 
> lead.
> -- Norbert Wiener
>
> https://www.cse.buffalo.edu/~knepley/<http://www.cse.buffalo.edu/~knep
> ley/>
>
>
> --
> What most experimenters take for granted before they begin their experiments 
> is infinitely more interesting than any results to which their experiments 
> lead.
> -- Norbert Wiener
>
> https://www.cse.buffalo.edu/~knepley/<http://www.cse.buffalo.edu/~knep
> ley/>
> #include "domain.hpp"
>
> using namespace std;
>
> Domain::Domain()
>   :  _sbpType("mfc_coordTrans"),_Ny(201),_Nz(1),_Ly(30),_Lz(30),
>      _q(NULL),_r(NULL),_y(NULL),_z(NULL),_y0(NULL),_z0(NULL),_dq(-1),_dr(-1),
>      _bCoordTrans(5)
> {
>   if (_Ny > 1) {
>     _dq = 1.0 / (_Ny - 1.0);
>   }
>   else {
>     _dq = 1;
>   }
>
>   if (_Nz > 1) {
>     _dr = 1.0 / (_Nz - 1.0);
>   }
>   else {
>     _dr = 1;
>   }
> }
>
> // destructor
> Domain::~Domain()
> {
>   // free memory
>   VecDestroy(&_q);
>   VecDestroy(&_r);
>   VecDestroy(&_y);
>   VecDestroy(&_z);
>   VecDestroy(&_y0);
>   VecDestroy(&_z0);
>
>   // set map iterator, free memory from VecScatter
>   map<string,VecScatter>::iterator it;
>   for (it = _scatters.begin(); it != _scatters.end(); it++) {
>     VecScatterDestroy(&(it->second));
>   }
> }
>
> // construct coordinate transform, setting vectors q, r, y, z 
> PetscErrorCode Domain::setFields() {
>   PetscErrorCode ierr = 0;
>
>   // generate vector _y with size _Ny*_Nz
>   ierr = VecCreate(PETSC_COMM_WORLD,&_y); CHKERRQ(ierr);
>   ierr = VecSetSizes(_y,PETSC_DECIDE,_Ny*_Nz); CHKERRQ(ierr);
>   ierr = VecSetFromOptions(_y); CHKERRQ(ierr);
>   ierr = PetscObjectSetName((PetscObject) _y, "y"); CHKERRQ(ierr);
>
>   // duplicate _y into _z, _q, _r
>   ierr = VecDuplicate(_y,&_z); CHKERRQ(ierr);
>   ierr = PetscObjectSetName((PetscObject) _z, "z"); CHKERRQ(ierr);
>   ierr = VecDuplicate(_y,&_q); CHKERRQ(ierr);
>   ierr = PetscObjectSetName((PetscObject) _q, "q"); CHKERRQ(ierr);
>   ierr = VecDuplicate(_y,&_r); CHKERRQ(ierr);
>   ierr = PetscObjectSetName((PetscObject) _r, "r"); CHKERRQ(ierr);
>
>   // construct coordinate transform
>   PetscInt Ii,Istart,Iend,Jj = 0;
>   PetscScalar *y,*z,*q,*r;
>   ierr = VecGetOwnershipRange(_q,&Istart,&Iend);CHKERRQ(ierr);
>
>   // return pointers to local data arrays (the processor's portion of vector 
> data)
>   ierr = VecGetArray(_y,&y); CHKERRQ(ierr);
>   ierr = VecGetArray(_z,&z); CHKERRQ(ierr);
>   ierr = VecGetArray(_q,&q); CHKERRQ(ierr);
>   ierr = VecGetArray(_r,&r); CHKERRQ(ierr);
>
>   // set vector entries for q, r (coordinate transform) and y, z (no 
> transform)
>   for (Ii=Istart; Ii<Iend; Ii++) {
>     q[Jj] = _dq*(Ii/_Nz);
>     r[Jj] = _dr*(Ii-_Nz*(Ii/_Nz));
>
>     // matrix-based, fully compatible, allows curvilinear coordinate 
> transformation
>     if (_sbpType.compare("mfc_coordTrans") ) {
>       y[Jj] = (_dq*_Ly)*(Ii/_Nz);
>       z[Jj] = (_dr*_Lz)*(Ii-_Nz*(Ii/_Nz));
>     }
>     else {
>       // hardcoded transformation (not available for z)
>       if (_bCoordTrans > 0) {
>       y[Jj] = _Ly * sinh(_bCoordTrans * q[Jj]) / sinh(_bCoordTrans);
>       }
>       // no transformation
>       y[Jj] = q[Jj]*_Ly;
>       z[Jj] = r[Jj]*_Lz;
>     }
>     Jj++;
>   }
>
>   // restore arrays
>   ierr = VecRestoreArray(_y,&y); CHKERRQ(ierr);
>   ierr = VecRestoreArray(_z,&z); CHKERRQ(ierr);
>   ierr = VecRestoreArray(_q,&q); CHKERRQ(ierr);
>   ierr = VecRestoreArray(_r,&r); CHKERRQ(ierr);
>
>   return ierr;
> }
>
>
> // scatters values from one vector to another PetscErrorCode 
> Domain::setScatters() {
>   PetscErrorCode ierr = 0;
>
>   ierr = VecCreate(PETSC_COMM_WORLD,&_y0); CHKERRQ(ierr);
>   ierr = VecSetSizes(_y0,PETSC_DECIDE,_Nz); CHKERRQ(ierr);
>   ierr = VecSetFromOptions(_y0); CHKERRQ(ierr);
>   ierr = VecSet(_y0,0.0); CHKERRQ(ierr);
>
>   ierr = VecCreate(PETSC_COMM_WORLD,&_z0); CHKERRQ(ierr);
>   ierr = VecSetSizes(_z0,PETSC_DECIDE,_Ny); CHKERRQ(ierr);
>   ierr = VecSetFromOptions(_z0); CHKERRQ(ierr);
>   ierr = VecSet(_z0,0.0); CHKERRQ(ierr);
>
>   PetscInt *indices;
>   IS is;
>   ierr = PetscMalloc1(_Nz,&indices); CHKERRQ(ierr);
>
>   // we want to scatter from index 0 to _Nz - 1, i.e. take the first _Nz 
> components of the vector to scatter from
>   for (PetscInt Ii = 0; Ii<_Nz; Ii++) {
>     indices[Ii] = Ii;
>   }
>
>   ierr = ISCreateGeneral(PETSC_COMM_WORLD, _Nz, indices, PETSC_COPY_VALUES, 
> &is); CHKERRQ(ierr);
>   ierr = VecScatterCreate(_y, is, _y0, is, &_scatters["body2L"]); 
> CHKERRQ(ierr);
>
>   // free memory
>   ierr = PetscFree(indices); CHKERRQ(ierr);
>   ierr = ISDestroy(&is); CHKERRQ(ierr);
>
>   
> //===============================================================================
>   // set up scatter context to take values for y = Ly from body field and put 
> them on a Vec of size Nz
>   PetscInt *fi;
>   IS isf;
>   ierr = PetscMalloc1(_Nz,&fi); CHKERRQ(ierr);
>
>   for (PetscInt Ii = 0; Ii<_Nz; Ii++) {
>     fi[Ii] = Ii + (_Ny*_Nz-_Nz);
>   }
>   ierr = ISCreateGeneral(PETSC_COMM_WORLD, _Nz, fi, PETSC_COPY_VALUES, 
> &isf); CHKERRQ(ierr);
>
>   PetscInt *ti;
>   IS ist;
>   ierr = PetscMalloc1(_Nz,&ti); CHKERRQ(ierr);
>   for (PetscInt Ii = 0; Ii<_Nz; Ii++) {
>     ti[Ii] = Ii;
>   }
>   ierr = ISCreateGeneral(PETSC_COMM_WORLD, _Nz, ti, PETSC_COPY_VALUES, &ist); 
> CHKERRQ(ierr);
>   ierr = VecScatterCreate(_y, isf, _y0, ist, &_scatters["body2R"]); 
> CHKERRQ(ierr);
>
>   // free memory
>   ierr = PetscFree(fi); CHKERRQ(ierr);
>   ierr = PetscFree(ti); CHKERRQ(ierr);
>   ierr = ISDestroy(&isf); CHKERRQ(ierr);
>   ierr = ISDestroy(&ist); CHKERRQ(ierr);
>
>   
>   
> //==============================================================================
>  
>   IS isf2;
>   ierr = ISCreateStride(PETSC_COMM_WORLD, _Ny, 0, _Nz, &isf2); 
> CHKERRQ(ierr);
>
>   PetscInt *ti2;
>   IS ist2;
>   ierr = PetscMalloc1(_Ny,&ti2); CHKERRQ(ierr);
>
>   for (PetscInt Ii=0; Ii<_Ny; Ii++) {
>     ti2[Ii] = Ii;
>   }
>   ierr = ISCreateGeneral(PETSC_COMM_WORLD, _Ny, ti2, PETSC_COPY_VALUES, 
> &ist2); CHKERRQ(ierr);
>   ierr = VecScatterCreate(_y, isf2, _z0, ist2, &_scatters["body2T"]); 
> CHKERRQ(ierr);
>
>   // free memory
>   ierr = PetscFree(ti2); CHKERRQ(ierr);
>   ierr = ISDestroy(&isf2); CHKERRQ(ierr);
>   ierr = ISDestroy(&ist2); CHKERRQ(ierr);
>
>
>   
> //==============================================================================
>   IS isf3;
>   ierr = ISCreateStride(PETSC_COMM_WORLD, _Ny, _Nz - 1, _Nz, &isf3); 
> CHKERRQ(ierr);
>
>   PetscInt *ti3;
>   IS ist3;
>   ierr = PetscMalloc1(_Ny,&ti3); CHKERRQ(ierr);
>   for (PetscInt Ii = 0; Ii<_Ny; Ii++) {
>     ti3[Ii] = Ii;
>   }
>   ierr = ISCreateGeneral(PETSC_COMM_WORLD, _Ny, ti3, PETSC_COPY_VALUES, 
> &ist3); CHKERRQ(ierr);
>   ierr = VecScatterCreate(_y, isf3, _z0, ist3, &_scatters["body2B"]); 
> CHKERRQ(ierr);
>
>   // free memory
>   ierr = PetscFree(ti3); CHKERRQ(ierr);
>   ierr = ISDestroy(&isf3); CHKERRQ(ierr);
>   ierr = ISDestroy(&ist3); CHKERRQ(ierr);
>
>   return ierr;
> }
> #include "domain.hpp"
>
> using namespace std;
>
> // creates a domain object
> int main(int argc, char **argv) {
>
>   PetscErrorCode ierr = 0;
>   PetscInitialize(&argc, &argv, NULL, NULL);
>
>   Domain d;
>
>   ierr = d.setFields(); CHKERRQ(ierr);
>   ierr = d.setScatters(); CHKERRQ(ierr);
>   
>   PetscFinalize();
>   return ierr;
> }

Reply via email to