Added C interface
This commit is contained in:
parent
b59b6716a6
commit
69e1a7ad9d
3 changed files with 63 additions and 1 deletions
8
Makefile
8
Makefile
|
|
@ -1,5 +1,11 @@
|
|||
example: gravity.o
|
||||
$(CC) -O3 example.c -o example gravity.o ../grapite/libgrapite.a -lcuda -lcudart -lstdc++ -lm
|
||||
|
||||
gravity.o:
|
||||
$(CXX) -O3 --std=c++23 gravity.cpp -c
|
||||
|
||||
main:
|
||||
$(CXX) -O3 main.cpp ../grapite/libgrapite.a -lcuda -lcudart -o $@
|
||||
|
||||
clean:
|
||||
$(RM) main
|
||||
$(RM) main *.o
|
||||
26
example.c
Normal file
26
example.c
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
void etics_external_init(const int n_total);
|
||||
void etics_external_grav(const double* const A, const int n_act, double x_act[][3], double pot_act[], double a_act[][3]);
|
||||
|
||||
int main()
|
||||
{
|
||||
const int n_total = 1024;
|
||||
etics_external_init(n_total);
|
||||
|
||||
srand(19640916);
|
||||
|
||||
double x_act[n_total][3], pot_act[n_total], a_act[n_total][3];
|
||||
for (int i = 0; i < n_total; i++) {
|
||||
x_act[i][0] = rand();
|
||||
x_act[i][1] = rand();
|
||||
x_act[i][2] = rand();
|
||||
}
|
||||
|
||||
double A[2048];
|
||||
for (int i = 0; i < 2048; i++) {
|
||||
A[i] = rand();
|
||||
}
|
||||
|
||||
etics_external_grav(A, n_total, x_act, pot_act, a_act);
|
||||
}
|
||||
30
gravity.cpp
Normal file
30
gravity.cpp
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
#include <span>
|
||||
#include "../grapite/etics_interface.h"
|
||||
#include "../grapite/particle_manager.h"
|
||||
|
||||
static grapite::Active_particles* particles_i;
|
||||
static grapite::Etics_interface* etics_interface;
|
||||
|
||||
extern "C"
|
||||
void etics_external_init(const int n_total)
|
||||
{
|
||||
particles_i = new grapite::Active_particles{n_total};
|
||||
etics_interface = new grapite::Etics_interface{n_total};
|
||||
}
|
||||
|
||||
extern "C"
|
||||
void etics_external_grav(const double* const A, const int n_act, double x_act[][3], double pot_act[], double a_act[][3])
|
||||
{
|
||||
// Load coefficients
|
||||
std::span A_complex{reinterpret_cast<const Complex*>(A), 1024};
|
||||
std::copy(begin(A_complex), end(A_complex), etics_interface->A_h);
|
||||
etics_interface->GetGpuLock();
|
||||
etics_interface->SendCoeffsToGPU();
|
||||
etics_interface->ReleaseGpuLock();
|
||||
|
||||
// Calculate potentials and forces
|
||||
particles_i->ni_core = 0;
|
||||
particles_i->ni_total = n_act;
|
||||
particles_i->flush_memory();
|
||||
etics_interface->calculate_gravity(particles_i, grapite::Selector::halo, 0, pot_act, reinterpret_cast<vec3*>(a_act));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue