]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Update the LinearAlgebra implementations to use VectorMemory::Pointer. 4954/head
authorWolfgang Bangerth <bangerth@colostate.edu>
Thu, 24 Aug 2017 19:02:37 +0000 (13:02 -0600)
committerWolfgang Bangerth <bangerth@colostate.edu>
Thu, 24 Aug 2017 19:02:37 +0000 (13:02 -0600)
This facilitates automatic memory allocation cleanup.

include/deal.II/lac/block_linear_operator.h
include/deal.II/lac/linear_operator.h

index 60fa0775dcc35c0b170c15cc2e64ffff127c11a7..2fcc737cf5bd7fa6cd1043b4efb490bd23d7ff5a 100644 (file)
@@ -758,8 +758,8 @@ block_forward_substitution(const BlockLinearOperator<Range, Domain, BlockPayload
     if (m == 0)
       return;
 
-    static GrowingVectorMemory<typename  Range::BlockType> vector_memory;
-    typename Range::BlockType *tmp = vector_memory.alloc();
+    static GrowingVectorMemory<typename Range::BlockType> vector_memory;
+    typename VectorMemory<typename Range::BlockType>::Pointer tmp (vector_memory);
 
     diagonal_inverse.block(0, 0).vmult_add(v.block(0), u.block(0));
 
@@ -773,8 +773,6 @@ block_forward_substitution(const BlockLinearOperator<Range, Domain, BlockPayload
         *tmp *= -1.;
         diagonal_inverse.block(i, i).vmult_add(v.block(i),*tmp);
       }
-
-    vector_memory.free(tmp);
   };
 
   return return_op;
@@ -867,8 +865,8 @@ block_back_substitution(const BlockLinearOperator<Range, Domain, BlockPayload> &
            ExcDimensionMismatch(diagonal_inverse.n_block_cols(), m));
     Assert(v.n_blocks() == m, ExcDimensionMismatch(v.n_blocks(), m));
     Assert(u.n_blocks() == m, ExcDimensionMismatch(u.n_blocks(), m));
-    static GrowingVectorMemory<typename  Range::BlockType> vector_memory;
-    typename  Range::BlockType *tmp = vector_memory.alloc();
+    static GrowingVectorMemory<typename Range::BlockType> vector_memory;
+    typename VectorMemory<typename Range::BlockType>::Pointer tmp (vector_memory);
 
     if (m == 0)
       return;
@@ -885,8 +883,6 @@ block_back_substitution(const BlockLinearOperator<Range, Domain, BlockPayload> &
         *tmp *= -1.;
         diagonal_inverse.block(i, i).vmult_add(v.block(i),*tmp);
       }
-
-    vector_memory.free(tmp);
   };
 
   return return_op;
index c0fd4d54da5051cbbe0235e2465e52ab1efcacf2..afa127380223e1271e40549120ca3479a07728eb 100644 (file)
@@ -582,44 +582,40 @@ operator*(const LinearOperator<Range, Intermediate, Payload> &first_op,
       {
         static GrowingVectorMemory<Intermediate> vector_memory;
 
-        Intermediate *i = vector_memory.alloc();
+        typename VectorMemory<Intermediate>::Pointer i (vector_memory);
         second_op.reinit_range_vector(*i, /*bool omit_zeroing_entries =*/ true);
         second_op.vmult(*i, u);
         first_op.vmult(v, *i);
-        vector_memory.free(i);
       };
 
       return_op.vmult_add = [first_op, second_op](Range &v, const Domain &u)
       {
         static GrowingVectorMemory<Intermediate> vector_memory;
 
-        Intermediate *i = vector_memory.alloc();
+        typename VectorMemory<Intermediate>::Pointer i (vector_memory);
         second_op.reinit_range_vector(*i, /*bool omit_zeroing_entries =*/ true);
         second_op.vmult(*i, u);
         first_op.vmult_add(v, *i);
-        vector_memory.free(i);
       };
 
       return_op.Tvmult = [first_op, second_op](Domain &v, const Range &u)
       {
         static GrowingVectorMemory<Intermediate> vector_memory;
 
-        Intermediate *i = vector_memory.alloc();
+        typename VectorMemory<Intermediate>::Pointer i (vector_memory);
         first_op.reinit_domain_vector(*i, /*bool omit_zeroing_entries =*/ true);
         first_op.Tvmult(*i, u);
         second_op.Tvmult(v, *i);
-        vector_memory.free(i);
       };
 
       return_op.Tvmult_add = [first_op, second_op](Domain &v, const Range &u)
       {
         static GrowingVectorMemory<Intermediate> vector_memory;
 
-        Intermediate *i = vector_memory.alloc();
+        typename VectorMemory<Intermediate>::Pointer i (vector_memory);
         first_op.reinit_domain_vector(*i, /*bool omit_zeroing_entries =*/ true);
         first_op.Tvmult(*i, u);
         second_op.Tvmult_add(v, *i);
-        vector_memory.free(i);
       };
 
       return return_op;
@@ -701,11 +697,10 @@ inverse_operator(const LinearOperator<Range, Domain, Payload> &op,
   {
     static GrowingVectorMemory<Range> vector_memory;
 
-    Range *v2 = vector_memory.alloc();
+    typename VectorMemory<Range>::Pointer v2 (vector_memory);
     op.reinit_range_vector(*v2, /*bool omit_zeroing_entries =*/ false);
     solver.solve(op, *v2, u, preconditioner);
     v += *v2;
-    vector_memory.free(v2);
   };
 
   return_op.Tvmult = [op, &solver, &preconditioner](Range &v, const Domain &u)
@@ -719,11 +714,10 @@ inverse_operator(const LinearOperator<Range, Domain, Payload> &op,
   {
     static GrowingVectorMemory<Range> vector_memory;
 
-    Range *v2 = vector_memory.alloc();
+    typename VectorMemory<Range>::Pointer v2 (vector_memory);
     op.reinit_range_vector(*v2, /*bool omit_zeroing_entries =*/ false);
     solver.solve(transpose_operator(op), *v2, u, preconditioner);
     v += *v2;
-    vector_memory.free(v2);
   };
 
   return return_op;
@@ -1041,7 +1035,7 @@ namespace
   {
     static GrowingVectorMemory<Range> vector_memory;
 
-    Range *i = vector_memory.alloc();
+    typename VectorMemory<Range>::Pointer i (vector_memory);
     i->reinit(v, /*bool omit_zeroing_entries =*/true);
 
     function(*i, u);
@@ -1050,8 +1044,6 @@ namespace
       v += *i;
     else
       v = *i;
-
-    vector_memory.free(i);
   }
 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.