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_CUDASUBSETMAPPING_INL
00026 #define SOFA_GPU_CUDA_CUDASUBSETMAPPING_INL
00027
00028 #include "CudaSubsetMapping.h"
00029 #include <sofa/component/mapping/SubsetMapping.inl>
00030
00031 namespace sofa
00032 {
00033
00034 namespace gpu
00035 {
00036
00037 namespace cuda
00038 {
00039
00040 extern "C"
00041 {
00042 void SubsetMappingCuda3f_apply(unsigned int size, const void* map, void* out, const void* in);
00043 void SubsetMappingCuda3f_applyJ(unsigned int size, const void* map, void* out, const void* in);
00044 void SubsetMappingCuda3f_applyJT(unsigned int insize, unsigned int maxNOut, const void* mapT, void* out, const void* in);
00045 void SubsetMappingCuda3f_applyJT1(unsigned int size, const void* map, void* out, const void* in);
00046
00047 void SubsetMappingCuda3f1_apply(unsigned int size, const void* map, void* out, const void* in);
00048 void SubsetMappingCuda3f1_applyJ(unsigned int size, const void* map, void* out, const void* in);
00049 void SubsetMappingCuda3f1_applyJT(unsigned int insize, unsigned int maxNOut, const void* mapT, void* out, const void* in);
00050 void SubsetMappingCuda3f1_applyJT1(unsigned int size, const void* map, void* out, const void* in);
00051
00052 void SubsetMappingCuda3f1_3f_apply(unsigned int size, const void* map, void* out, const void* in);
00053 void SubsetMappingCuda3f1_3f_applyJ(unsigned int size, const void* map, void* out, const void* in);
00054 void SubsetMappingCuda3f1_3f_applyJT(unsigned int insize, unsigned int maxNOut, const void* mapT, void* out, const void* in);
00055 void SubsetMappingCuda3f1_3f_applyJT1(unsigned int size, const void* map, void* out, const void* in);
00056
00057 void SubsetMappingCuda3f_3f1_apply(unsigned int size, const void* map, void* out, const void* in);
00058 void SubsetMappingCuda3f_3f1_applyJ(unsigned int size, const void* map, void* out, const void* in);
00059 void SubsetMappingCuda3f_3f1_applyJT(unsigned int insize, unsigned int maxNOut, const void* mapT, void* out, const void* in);
00060 void SubsetMappingCuda3f_3f1_applyJT1(unsigned int size, const void* map, void* out, const void* in);
00061 }
00062
00063 }
00064
00065 }
00066
00067 namespace component
00068 {
00069
00070 namespace mapping
00071 {
00072
00073 using namespace gpu::cuda;
00074
00075 template <>
00076 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes> > >::postInit()
00077 {
00078 const IndexArray& indices = this->f_indices.getValue();
00079 if (!indices.empty())
00080 {
00081 this->data.clear(indices.size());
00082 for (unsigned int i=0;i<indices.size();i++)
00083 this->data.addPoint(indices[i]);
00084 this->data.init(this->fromModel->getX()->size());
00085 }
00086 }
00087
00088 template <>
00089 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3fTypes> > >::postInit()
00090 {
00091 const IndexArray& indices = this->f_indices.getValue();
00092 if (!indices.empty())
00093 {
00094 this->data.clear(indices.size());
00095 for (unsigned int i=0;i<indices.size();i++)
00096 this->data.addPoint(indices[i]);
00097 this->data.init(this->fromModel->getX()->size());
00098 }
00099 }
00100
00101 template <>
00102 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes> > >::apply( Out::VecCoord& out, const In::VecCoord& in )
00103 {
00104 out.fastResize(data.map.size());
00105 SubsetMappingCuda3f_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00106 }
00107
00108 template <>
00109 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes> > >::applyJ( Out::VecDeriv& out, const In::VecDeriv& in )
00110 {
00111 out.fastResize(data.map.size());
00112 SubsetMappingCuda3f_applyJ(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00113 }
00114
00115 template <>
00116 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes> > >::applyJT( In::VecDeriv& out, const Out::VecDeriv& in )
00117 {
00118 if (data.map.size() == 0) return;
00119 unsigned int insize = out.size();
00120 if (data.mapT.empty())
00121 SubsetMappingCuda3f_applyJT1(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00122 else
00123 SubsetMappingCuda3f_applyJT(insize, data.maxNOut, data.mapT.deviceRead(), out.deviceWrite(), in.deviceRead());
00124 }
00125
00126 template <>
00127 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3fTypes> > >::apply( Out::VecCoord& out, const In::VecCoord& in )
00128 {
00129 out.fastResize(data.map.size());
00130 SubsetMappingCuda3f_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00131 }
00132
00133 template <>
00134 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3fTypes> > >::applyJ( Out::VecDeriv& out, const In::VecDeriv& in )
00135 {
00136 out.fastResize(data.map.size());
00137 SubsetMappingCuda3f_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00138 }
00139
00140
00142
00143 template <>
00144 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types> > >::postInit()
00145 {
00146 const IndexArray& indices = this->f_indices.getValue();
00147 if (!indices.empty())
00148 {
00149 this->data.clear(indices.size());
00150 for (unsigned int i=0;i<indices.size();i++)
00151 this->data.addPoint(indices[i]);
00152 this->data.init(this->fromModel->getX()->size());
00153 }
00154 }
00155
00156 template <>
00157 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3f1Types> > >::postInit()
00158 {
00159 const IndexArray& indices = this->f_indices.getValue();
00160 if (!indices.empty())
00161 {
00162 this->data.clear(indices.size());
00163 for (unsigned int i=0;i<indices.size();i++)
00164 this->data.addPoint(indices[i]);
00165 this->data.init(this->fromModel->getX()->size());
00166 }
00167 }
00168
00169 template <>
00170 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types> > >::apply( Out::VecCoord& out, const In::VecCoord& in )
00171 {
00172 out.fastResize(data.map.size());
00173 SubsetMappingCuda3f1_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00174 }
00175
00176 template <>
00177 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types> > >::applyJ( Out::VecDeriv& out, const In::VecDeriv& in )
00178 {
00179 out.fastResize(data.map.size());
00180 SubsetMappingCuda3f1_applyJ(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00181 }
00182
00183 template <>
00184 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types> > >::applyJT( In::VecDeriv& out, const Out::VecDeriv& in )
00185 {
00186 if (data.map.size() == 0) return;
00187 unsigned int insize = out.size();
00188 if (data.mapT.empty())
00189 SubsetMappingCuda3f1_applyJT1(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00190 else
00191 SubsetMappingCuda3f1_applyJT(insize, data.maxNOut, data.mapT.deviceRead(), out.deviceWrite(), in.deviceRead());
00192 }
00193
00194 template <>
00195 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3f1Types> > >::apply( Out::VecCoord& out, const In::VecCoord& in )
00196 {
00197 out.fastResize(data.map.size());
00198 SubsetMappingCuda3f1_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00199 }
00200
00201 template <>
00202 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3f1Types> > >::applyJ( Out::VecDeriv& out, const In::VecDeriv& in )
00203 {
00204 out.fastResize(data.map.size());
00205 SubsetMappingCuda3f1_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00206 }
00207
00208
00209
00210 template <>
00211 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes> > >::postInit()
00212 {
00213 const IndexArray& indices = this->f_indices.getValue();
00214 if (!indices.empty())
00215 {
00216 this->data.clear(indices.size());
00217 for (unsigned int i=0;i<indices.size();i++)
00218 this->data.addPoint(indices[i]);
00219 this->data.init(this->fromModel->getX()->size());
00220 }
00221 }
00222
00223 template <>
00224 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3fTypes> > >::postInit()
00225 {
00226 const IndexArray& indices = this->f_indices.getValue();
00227 if (!indices.empty())
00228 {
00229 this->data.clear(indices.size());
00230 for (unsigned int i=0;i<indices.size();i++)
00231 this->data.addPoint(indices[i]);
00232 this->data.init(this->fromModel->getX()->size());
00233 }
00234 }
00235
00236 template <>
00237 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes> > >::apply( Out::VecCoord& out, const In::VecCoord& in )
00238 {
00239 out.fastResize(data.map.size());
00240 SubsetMappingCuda3f1_3f_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00241 }
00242
00243 template <>
00244 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes> > >::applyJ( Out::VecDeriv& out, const In::VecDeriv& in )
00245 {
00246 out.fastResize(data.map.size());
00247 SubsetMappingCuda3f1_3f_applyJ(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00248 }
00249
00250 template <>
00251 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes> > >::applyJT( In::VecDeriv& out, const Out::VecDeriv& in )
00252 {
00253 if (data.map.size() == 0) return;
00254 unsigned int insize = out.size();
00255 if (data.mapT.empty())
00256 SubsetMappingCuda3f1_3f_applyJT1(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00257 else
00258 SubsetMappingCuda3f1_3f_applyJT(insize, data.maxNOut, data.mapT.deviceRead(), out.deviceWrite(), in.deviceRead());
00259 }
00260
00261 template <>
00262 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3fTypes> > >::apply( Out::VecCoord& out, const In::VecCoord& in )
00263 {
00264 out.fastResize(data.map.size());
00265 SubsetMappingCuda3f1_3f_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00266 }
00267
00268 template <>
00269 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3f1Types>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3fTypes> > >::applyJ( Out::VecDeriv& out, const In::VecDeriv& in )
00270 {
00271 out.fastResize(data.map.size());
00272 SubsetMappingCuda3f1_3f_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00273 }
00274
00275
00276
00277 template <>
00278 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types> > >::postInit()
00279 {
00280 const IndexArray& indices = this->f_indices.getValue();
00281 if (!indices.empty())
00282 {
00283 this->data.clear(indices.size());
00284 for (unsigned int i=0;i<indices.size();i++)
00285 this->data.addPoint(indices[i]);
00286 this->data.init(this->fromModel->getX()->size());
00287 }
00288 }
00289
00290 template <>
00291 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3f1Types> > >::postInit()
00292 {
00293 const IndexArray& indices = this->f_indices.getValue();
00294 if (!indices.empty())
00295 {
00296 this->data.clear(indices.size());
00297 for (unsigned int i=0;i<indices.size();i++)
00298 this->data.addPoint(indices[i]);
00299 this->data.init(this->fromModel->getX()->size());
00300 }
00301 }
00302
00303 template <>
00304 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types> > >::apply( Out::VecCoord& out, const In::VecCoord& in )
00305 {
00306 out.fastResize(data.map.size());
00307 SubsetMappingCuda3f_3f1_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00308 }
00309
00310 template <>
00311 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types> > >::applyJ( Out::VecDeriv& out, const In::VecDeriv& in )
00312 {
00313 out.fastResize(data.map.size());
00314 SubsetMappingCuda3f_3f1_applyJ(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00315 }
00316
00317 template <>
00318 void SubsetMapping<sofa::core::componentmodel::behavior::MechanicalMapping< sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MechanicalState<gpu::cuda::CudaVec3f1Types> > >::applyJT( In::VecDeriv& out, const Out::VecDeriv& in )
00319 {
00320 if (data.map.size() == 0) return;
00321 unsigned int insize = out.size();
00322 if (data.mapT.empty())
00323 SubsetMappingCuda3f_3f1_applyJT1(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00324 else
00325 SubsetMappingCuda3f_3f1_applyJT(insize, data.maxNOut, data.mapT.deviceRead(), out.deviceWrite(), in.deviceRead());
00326 }
00327
00328 template <>
00329 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3f1Types> > >::apply( Out::VecCoord& out, const In::VecCoord& in )
00330 {
00331 out.fastResize(data.map.size());
00332 SubsetMappingCuda3f_3f1_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00333 }
00334
00335 template <>
00336 void SubsetMapping<sofa::core::Mapping< sofa::core::componentmodel::behavior::State<gpu::cuda::CudaVec3fTypes>, sofa::core::componentmodel::behavior::MappedModel<gpu::cuda::CudaVec3f1Types> > >::applyJ( Out::VecDeriv& out, const In::VecDeriv& in )
00337 {
00338 out.fastResize(data.map.size());
00339 SubsetMappingCuda3f_3f1_apply(data.map.size(), data.map.deviceRead(), out.deviceWrite(), in.deviceRead());
00340 }
00341
00342 }
00343
00344 }
00345
00346 }
00347
00348 #endif