Hello<br><br>I&#39;ve managed to get the c-function for freeing preconditioner memory written. The contents of my new &#39;pcasmfreespace.c&#39; is below:<br><br>#include &lt;private/pcimpl.h&gt;     /*I &quot;petscpc.h&quot; I*/<br>
<br>typedef struct {<br> PetscInt   n, n_local, n_local_true;<br> PetscInt   overlap;             /* overlap requested by user */<br> KSP        *ksp;                /* linear solvers for each block */<br> VecScatter *restriction;        /* mapping from global to subregion */<br>
 VecScatter *localization;       /* mapping from overlapping to non-overlapping subregion */<br> VecScatter *prolongation;       /* mapping from subregion to global */<br> Vec        *x,*y,*y_local;      /* work vectors */<br>
 IS         *is;                 /* index set that defines each overlapping subdomain */<br> IS         *is_local;           /* index set that defines each non-overlapping subdomain, may be NULL */<br> Mat        *mat,*pmat;          /* mat is not currently used */<br>
 PCASMType  type;                /* use reduced interpolation, restriction or both */<br> PetscInt  type_set;            /* if user set this value (so won&#39;t change it for symmetric problems) */<br> PetscInt  same_local_solves;   /* flag indicating whether all local solvers are same */<br>
 PetscInt  sort_indices;        /* flag to sort subdomain indices */<br>} PC_ASM;<br><br>void pcasmfreespace_(PC pc)<br>    {<br>      <br>      PC_ASM         *osm = (PC_ASM*)pc-&gt;data;<br>      PetscErrorCode ierr;<br>
      <br>      if (osm-&gt;pmat) {<br>    if (osm-&gt;n_local_true &gt; 0) {<br>      ierr = MatDestroyMatrices(osm-&gt;n_local_true,&amp;osm-&gt;pmat);CHKERRQ(ierr);<br>    }<br>    osm-&gt;pmat = 0;<br>      }<br>      <br>
      if (pc-&gt;pmat) {ierr = MatDestroy(pc-&gt;pmat);CHKERRQ(ierr); pc-&gt;pmat = 0;}<br>      <br>    }<br><br>Note the underscore as I&#39;m trying to call it from Fortran. When I call it from fortran, I use: <br><br>
call pcasmfreespace(global_pc)<br><br>This calls, the function, ok, but (according to Valgrind) I have an invalid read on the line containing:<br><br>if (osm-&gt;pmat){ <br><br>I suspect this is something to do with passing the fortran &quot;pointer&quot; of the PC to c, or something along this lines. Is there anything else special you have to do to pass the &quot;fortran&quot; petsc objects to c?<br>
<br>Thanks<br><br>Gaetan<br><br><br>
Message: 2<br>
Date: Sun, 21 Aug 2011 17:22:28 -0500<br>
From: Barry Smith &lt;<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>&gt;<br>
Subject: Re: [<span class="il">petsc</span>-users] Freeing Preconditioner Matrix Space<br>
To: <span class="il">PETSc</span> users list &lt;<a href="mailto:petsc-users@mcs.anl.gov"><span class="il">petsc</span>-users@mcs.anl.gov</a>&gt;<br>
Message-ID: &lt;<a href="mailto:953121EF-B6AC-42EE-87BE-D4402C121652@mcs.anl.gov">953121EF-B6AC-42EE-87BE-D4402C121652@mcs.anl.gov</a>&gt;<br>
Content-Type: text/plain; charset=us-ascii<br>
<br>
<br>
  You don&#39;t need to put that in the <span class="il">PETSc</span> 
source. Just built it in the same directory you build your application 
and link it in like any of your application code. You will need to stick<br>
#include &lt;private/pcimpl.h&gt;     /*I &quot;petscpc.h&quot; I*/<br>
<br>
typedef struct {<br>
  PetscInt   n, n_local, n_local_true;<br>
  PetscInt   overlap;             /* overlap requested by user */<br>
  KSP        *ksp;                /* linear solvers for each block */<br>
  VecScatter *restriction;        /* mapping from global to subregion */<br>
  VecScatter *localization;       /* mapping from overlapping to non-overlapping subregion */<br>
  VecScatter *prolongation;       /* mapping from subregion to global */<br>
  Vec        *x,*y,*y_local;      /* work vectors */<br>
  IS         *is;                 /* index set that defines each overlapping subdomain */<br>
  IS         *is_local;           /* index set that defines each non-overlapping subdomain, may be NULL */<br>
  Mat        *mat,*pmat;          /* mat is not currently used */<br>
  PCASMType  type;                /* use reduced interpolation, restriction or both */<br>
  PetscBool  type_set;            /* if user set this value (so won&#39;t change it for symmetric problems) */<br>
  PetscBool  same_local_solves;   /* flag indicating whether all local solvers are same */<br>
  PetscBool  sort_indices;        /* flag to sort subdomain indices */<br>
} PC_ASM;<br>
<br>
before the subroutine.<br>
<br>
  Barry<br>
<br>
On Aug 21, 2011, at 3:24 PM, Gaetan Kenway wrote:<br>
<br>
&gt; Hello<br>
&gt;<br>
&gt; I am attempting to implement a &quot;hack&quot; that was posted on the list a
 while back. I&#39;m working with the adjoint linear system solver for a CFD
 solver. I&#39;m using the ASM (or Block Jacobi) preconditioner with ILU(p) 
on each of the sub-domains. I use a different Preconditioner matrix 
(Pmat) than the actual jacobian. What I want to do is destroy the Pmat 
memory after the ILU factorization is performed. The hack that was 
posted is copied below:<br>
&gt;  PCASMFreeSpace(PC pc)<br>
&gt;    {<br>
&gt;   PC_ASM         *osm = (PC_ASM*)pc-&gt;data;<br>
&gt;   PetscErrorCode ierr;<br>
&gt;<br>
&gt;      if (osm-&gt;pmat) {<br>
&gt;     if (osm-&gt;n_local_true &gt; 0) {<br>
&gt;<br>
&gt;       ierr = MatDestroyMatrices(osm-&gt;n_<div id=":x">local_true,&amp;osm-&gt;pmat);CHKERRQ(ierr);<br>
&gt;     }<br>
&gt;   osm-&gt;pmat = 0;<br>
&gt;   }<br>
&gt;   if (pc-&gt;pmat) {ierr = MatDestroy(pc-&gt;pmat);CHKERRQ(ierr); pc-&gt;pmat = 0;}<br>
&gt;<br>
&gt;   return 0;<br>
&gt;  }<br>
&gt;<br>
&gt; However, I&#39;ve had no luck actually getting the function compiled into <span class="il">petsc</span>.
 There are no erorrs reported with i type &quot;make&quot; in the asm directory, 
but when I try to use the function in my application it can&#39;t find the 
symbol while linking. Where does it go in the asm.c file? Does it use 
&quot;static PetscErrorCode&quot; or &quot;PetscErrorCode PETSCKSP_DLLEXPORT&quot;? Does it 
have to be added to the .h include files? What has to be done for it 
work with Fortran?<br>
&gt;<br>
&gt; Any suggestions would be greatly appreciated.  This represents a 
significant chunk of my application&#39;s memory (10%-30%) and as such its 
too much to ignore.   Also is there any chance something like this would
 make it into an actual <span class="il">PETSc</span> release?<br>
&gt;<br>
&gt; Gaetan<br>
&gt;</div><br><br>