[cig-commits] r8949 - cs/benchmark/cigma/trunk/src

luis at geodynamics.org luis at geodynamics.org
Wed Dec 19 12:07:02 PST 2007


Author: luis
Date: 2007-12-19 12:07:02 -0800 (Wed, 19 Dec 2007)
New Revision: 8949

Added:
   cs/benchmark/cigma/trunk/src/ExternalField.cpp
   cs/benchmark/cigma/trunk/src/ExternalField.h
Log:
Added ExternalField class

Added: cs/benchmark/cigma/trunk/src/ExternalField.cpp
===================================================================
--- cs/benchmark/cigma/trunk/src/ExternalField.cpp	2007-12-19 20:06:53 UTC (rev 8948)
+++ cs/benchmark/cigma/trunk/src/ExternalField.cpp	2007-12-19 20:07:02 UTC (rev 8949)
@@ -0,0 +1,89 @@
+#include <iostream>
+#include <cstdlib>
+#include <dlfcn.h>
+#include <cassert>
+#include "ExternalField.h"
+
+// ---------------------------------------------------------------------------
+
+cigma::ExternalField::ExternalField()
+{
+    handle = 0;
+}
+
+cigma::ExternalField::~ExternalField()
+{
+    close_library();
+}
+
+// ---------------------------------------------------------------------------
+
+void cigma::ExternalField::load_library(std::string filename, std::string prefix)
+{
+    std::string function_name;
+    char *error;
+
+    //handle = dlopen(filename.c_str(), RTLD_LAZY);
+
+    handle = dlopen(filename.c_str(), RTLD_NOW);
+    error = dlerror();
+    if (!handle)
+    {
+        std::cerr << error << std::endl;
+        // XXX: throw exception
+        assert(false);
+    }
+
+    /* clear any existing error */
+    dlerror();
+
+    function_name = prefix + "_get_dim";
+    *(void **)(&ext_get_dim) = dlsym(handle, function_name.c_str());
+    error = dlerror();
+    if (error != NULL)
+    {
+        std::cerr << error << std::endl;
+        // XXX: throw exception
+        assert(false);
+    }
+
+    function_name = prefix + "_get_rank";
+    *(void **)(&ext_get_rank) = dlsym(handle, function_name.c_str());
+    error = dlerror();
+    if (error != NULL)
+    {
+        std::cerr << error << std::endl;
+        // XXX: throw exception
+        assert(false);
+    }
+
+    function_name = prefix + "_eval";
+    *(void **)(&ext_eval) = dlsym(handle, function_name.c_str());
+    error = dlerror();
+    if (error != NULL)
+    {
+        std::cerr << error << std::endl;
+        // XXX: throw exception
+        assert(false);
+    }
+
+    function_name = prefix + "_batch_eval";
+    *(void **)(&ext_batch_eval) = dlsym(handle, function_name.c_str());
+    error = dlerror();
+    if (error != NULL)
+    {
+        std::cerr << error << std::endl;
+        // XXX: throw exception
+        assert(false);
+    }
+}
+
+void cigma::ExternalField::close_library()
+{
+    if (handle != 0)
+    {
+        dlclose(handle);
+    }
+}
+
+// ---------------------------------------------------------------------------

Added: cs/benchmark/cigma/trunk/src/ExternalField.h
===================================================================
--- cs/benchmark/cigma/trunk/src/ExternalField.h	2007-12-19 20:06:53 UTC (rev 8948)
+++ cs/benchmark/cigma/trunk/src/ExternalField.h	2007-12-19 20:07:02 UTC (rev 8949)
@@ -0,0 +1,53 @@
+#ifndef __EXTERNAL_FIELD_H__
+#define __EXTERNAL_FIELD_H__
+
+#include <string>
+#include "Points.h"
+#include "Field.h"
+
+
+namespace cigma
+{
+    class ExternalField;
+}
+
+
+/**
+ * @brief External Field object
+ *
+ */
+class cigma::ExternalField : public Field
+{
+public:
+    typedef void (*get_int_fn)(int*);
+    typedef void (*eval_from_point_fn)(double*,double*);
+    typedef void (*eval_from_points_fn)(int,double*,double*);
+
+public:
+    ExternalField();
+    ~ExternalField();
+
+public:
+    int n_dim() { return dim; }
+    int n_rank() { return rank; }
+
+public:
+    void load_library(std::string filename, std::string prefix);
+    void close_library();
+
+public:
+    void eval(double *x, double *y);
+    void eval(Points &domain, Points &range);
+
+public:
+    int dim;
+    int rank;
+    void *handle;
+    get_int_fn ext_get_dim;
+    get_int_fn ext_get_rank;
+    eval_from_point_fn ext_eval;
+    eval_from_points_fn ext_batch_eval;
+};
+
+
+#endif



More information about the cig-commits mailing list