[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