From 339844e1a25e0f3cd40b3168eedd628c8cf49106 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Thu, 3 Jan 2013 08:53:44 +0000
Subject: [PATCH] BUG: DimensionSets: stored reference instead of dictionary

---
 src/OpenFOAM/dimensionSet/dimensionSets.C | 31 ++++++++++++++-------
 src/OpenFOAM/global/debug/debug.C         | 33 +++++++++--------------
 2 files changed, 34 insertions(+), 30 deletions(-)

diff --git a/src/OpenFOAM/dimensionSet/dimensionSets.C b/src/OpenFOAM/dimensionSet/dimensionSets.C
index 7486781df8a..10b424a5763 100644
--- a/src/OpenFOAM/dimensionSet/dimensionSets.C
+++ b/src/OpenFOAM/dimensionSet/dimensionSets.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -35,15 +35,29 @@ namespace Foam
 
 /* * * * * * * * * * * * * * * Static Member Data  * * * * * * * * * * * * * */
 
-dictionary* dimensionSystemsPtr_(NULL);
+//- Since dimensionSystems() can be reread we actually store a copy of
+//  the controlDict subDict (v.s. a reference to the subDict for e.g.
+//  dimensionedConstants)
+autoPtr<dictionary> dimensionSystemsPtr_(NULL);
 
 dictionary& dimensionSystems()
 {
-    return debug::switchSet
-    (
-        "DimensionSets",
-        dimensionSystemsPtr_
-    );
+    if (!dimensionSystemsPtr_.valid())
+    {
+        dictionary* cachedPtr = NULL;
+        dimensionSystemsPtr_.reset
+        (
+            new dictionary
+            (
+                debug::switchSet
+                (
+                    "DimensionSets",
+                    cachedPtr
+                )
+            )
+        );
+    }
+    return dimensionSystemsPtr_();
 }
 
 
@@ -63,10 +77,9 @@ public:
     {}
     virtual void readData(Foam::Istream& is)
     {
-        deleteDemandDrivenData(dimensionSystemsPtr_);
         unitSetPtr_.clear();
         writeUnitSetPtr_.clear();
-        dimensionSystemsPtr_ = new dictionary(is);
+        dimensionSystemsPtr_.reset(new dictionary(is));
     }
     virtual void writeData(Foam::Ostream& os) const
     {
diff --git a/src/OpenFOAM/global/debug/debug.C b/src/OpenFOAM/global/debug/debug.C
index 999b4cb292d..c7cfcc71866 100644
--- a/src/OpenFOAM/global/debug/debug.C
+++ b/src/OpenFOAM/global/debug/debug.C
@@ -47,47 +47,38 @@ dictionary* debugSwitchesPtr_(NULL);
 dictionary* infoSwitchesPtr_(NULL);
 dictionary* optimisationSwitchesPtr_(NULL);
 
-// to ensure controlDictPtr_ is deleted at the end of the run
-class deleteControlDictPtr
-{
-public:
-
-    deleteControlDictPtr()
-    {}
-
-    ~deleteControlDictPtr()
-    {
-        deleteDemandDrivenData(controlDictPtr_);
-    }
-};
-
-deleteControlDictPtr deleteControlDictPtr_;
-
-
 // Debug switch read and write callback tables.
 simpleObjectRegistry* debugObjectsPtr_(NULL);
 simpleObjectRegistry* infoObjectsPtr_(NULL);
 simpleObjectRegistry* optimisationObjectsPtr_(NULL);
 simpleObjectRegistry* dimensionSetObjectsPtr_(NULL);
 simpleObjectRegistry* dimensionedConstantObjectsPtr_(NULL);
-class deleteDebugSwitchPtr
+
+
+// to ensure controlDictPtr_ is deleted at the end of the run
+class deleteControlDictPtr
 {
 public:
 
-    deleteDebugSwitchPtr()
+    deleteControlDictPtr()
     {}
 
-    ~deleteDebugSwitchPtr()
+    ~deleteControlDictPtr()
     {
         deleteDemandDrivenData(debugObjectsPtr_);
         deleteDemandDrivenData(infoObjectsPtr_);
         deleteDemandDrivenData(optimisationObjectsPtr_);
         deleteDemandDrivenData(dimensionSetObjectsPtr_);
         deleteDemandDrivenData(dimensionedConstantObjectsPtr_);
+
+        debugSwitchesPtr_ = NULL;
+        infoSwitchesPtr_ = NULL;
+        optimisationSwitchesPtr_ = NULL;
+        deleteDemandDrivenData(controlDictPtr_);
     }
 };
 
-deleteDebugSwitchPtr deleteDebugSwitchPtr_;
+deleteControlDictPtr deleteControlDictPtr_;
 //! \endcond
 
 
-- 
GitLab