00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef SOFA_GPU_CUDA_CUDASPHEREFORCEFIELD_INL
00026 #define SOFA_GPU_CUDA_CUDASPHEREFORCEFIELD_INL
00027
00028 #include "CudaSphereForceField.h"
00029 #include <sofa/component/forcefield/SphereForceField.inl>
00030
00031 namespace sofa
00032 {
00033
00034 namespace gpu
00035 {
00036
00037 namespace cuda
00038 {
00039
00040 extern "C"
00041 {
00042 void SphereForceFieldCuda3f_addForce(unsigned int size, GPUSphere* sphere, void* penetration, void* f, const void* x, const void* v);
00043 void SphereForceFieldCuda3f_addDForce(unsigned int size, GPUSphere* sphere, const void* penetration, void* f, const void* dx);
00044
00045 void SphereForceFieldCuda3f1_addForce(unsigned int size, GPUSphere* sphere, void* penetration, void* f, const void* x, const void* v);
00046 void SphereForceFieldCuda3f1_addDForce(unsigned int size, GPUSphere* sphere, const void* penetration, void* f, const void* dx);
00047 }
00048
00049 }
00050
00051 }
00052
00053 namespace component
00054 {
00055
00056 namespace forcefield
00057 {
00058
00059 using namespace gpu::cuda;
00060
00061
00062 template <>
00063 void SphereForceField<gpu::cuda::CudaVec3fTypes>::addForce(VecDeriv& f, const VecCoord& x, const VecDeriv& v)
00064 {
00065 data.sphere.center = sphereCenter.getValue();
00066 data.sphere.r = sphereRadius.getValue();
00067 data.sphere.stiffness = stiffness.getValue();
00068 data.sphere.damping = damping.getValue();
00069 f.resize(x.size());
00070 data.penetration.resize(x.size());
00071 SphereForceFieldCuda3f_addForce(x.size(), &data.sphere, data.penetration.deviceWrite(), f.deviceWrite(), x.deviceRead(), v.deviceRead());
00072 }
00073
00074 template <>
00075 void SphereForceField<gpu::cuda::CudaVec3fTypes>::addDForce(VecDeriv& df, const VecCoord& dx, double kFactor, double )
00076 {
00077 df.resize(dx.size());
00078 double stiff = data.sphere.stiffness;
00079 data.sphere.stiffness *= kFactor;
00080 SphereForceFieldCuda3f_addDForce(dx.size(), &data.sphere, data.penetration.deviceRead(), df.deviceWrite(), dx.deviceRead());
00081 data.sphere.stiffness = stiff;
00082 }
00083
00084
00085 template <>
00086 void SphereForceField<gpu::cuda::CudaVec3f1Types>::addForce(VecDeriv& f, const VecCoord& x, const VecDeriv& v)
00087 {
00088 data.sphere.center = sphereCenter.getValue();
00089 data.sphere.r = sphereRadius.getValue();
00090 data.sphere.stiffness = stiffness.getValue();
00091 data.sphere.damping = damping.getValue();
00092 f.resize(x.size());
00093 data.penetration.resize(x.size());
00094 SphereForceFieldCuda3f1_addForce(x.size(), &data.sphere, data.penetration.deviceWrite(), f.deviceWrite(), x.deviceRead(), v.deviceRead());
00095 }
00096
00097 template <>
00098 void SphereForceField<gpu::cuda::CudaVec3f1Types>::addDForce(VecDeriv& df, const VecCoord& dx, double kFactor, double )
00099 {
00100 df.resize(dx.size());
00101 double stiff = data.sphere.stiffness;
00102 data.sphere.stiffness *= kFactor;
00103 SphereForceFieldCuda3f1_addDForce(dx.size(), &data.sphere, data.penetration.deviceRead(), df.deviceWrite(), dx.deviceRead());
00104 data.sphere.stiffness = stiff;
00105 }
00106
00107 }
00108
00109 }
00110
00111 }
00112
00113 #endif