Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Failure or success in windows developer instructions for adding built-in functionalities to FreeFEM++? #316

Open
KrombopulosMichael opened this issue Sep 12, 2024 · 0 comments

Comments

@KrombopulosMichael
Copy link

KrombopulosMichael commented Sep 12, 2024

On Windows, I wanted to add a PackSixDoubles method to FreeFEM++ with the following c++ code of the file combine_six_float.cpp:

#include <iostream>
#include <cstdint>
#include <cstring>
#include "AFunction.hpp"
#include "AFunction_ext.hpp"
#include "ff++.hpp"

using namespace std;

// Constants for packing/unpacking
const int BITS_PER_DOUBLE = 10; // Number of bits for each double (reduced precision)
const int TOTAL_BITS = 64;
const int NUM_DOUBLES = 6;

// Function to reduce the precision of a double
unsigned long long reducePrecision(double value)
{
	// Shift and truncate the double (this is just a placeholder for actual precision reduction)
	unsigned long long intValue = static_cast<unsigned long long>(value * (1 << BITS_PER_DOUBLE));
	return intValue;
}

// Function to pack 6 doubles into one double (changed signature to pass by value)
double PackSixDoubles(const double &d1, const double &d2, const double &d3, const double &d4, const double &d5, const double &d6)
{
	// Reduced precision for each double
	unsigned long long r1 = reducePrecision(d1);
	unsigned long long r2 = reducePrecision(d2);
	unsigned long long r3 = reducePrecision(d3);
	unsigned long long r4 = reducePrecision(d4);
	unsigned long long r5 = reducePrecision(d5);
	unsigned long long r6 = reducePrecision(d6);

	// Combine them using bitshift operations
	unsigned long long packedValue = (r1 << (5 * BITS_PER_DOUBLE)) |
																	 (r2 << (4 * BITS_PER_DOUBLE)) |
																	 (r3 << (3 * BITS_PER_DOUBLE)) |
																	 (r4 << (2 * BITS_PER_DOUBLE)) |
																	 (r5 << (1 * BITS_PER_DOUBLE)) |
																	 r6;

	// Cast to double
	return *reinterpret_cast<double *>(&packedValue);
}

static void init()
{
	// Use OneOperator6_ for the function with six double arguments
	Global.Add("PackSixDoubles", "(", new OneOperator6_<double, double>(PackSixDoubles));
}

LOADFUNC(init);

no errors seem to be indicated with intellisense for the c++ code, so with $FF_FOLDER set to the FreeFEM++ folder I proceed in MINGW64 / MSYS2:

  1. ff-c++ -cygwin ./combine_six_float.cpp (OK)
  2. g++ -c -g -I "$FF_FOLDER/include/ -Iinclude ./combine_six_float.cpp (OK)
  3. g++ -shared -g ./combine_six_float.o -o ./combine_six_float.dll -L $FF_FOLDER/include/ -L $FF_FOLDER/include/ (FAILED)

Since step 1 seems to already produce a .o and .dll file that I can use in FreeFEM++, are steps 2 and 3 (which fails) even needed?
They are mentioned in the documentation...?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant