1 // Copyright (C) 2017-2020 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #define MEDCOUPLING_EXPORT
21 #define INTERPKERNEL_EXPORT
22 #define MEDCOUPLINGREMAPPER_EXPORT
24 %newobject MEDCoupling::MEDCouplingRemapper::transferField;
25 %newobject MEDCoupling::MEDCouplingRemapper::reverseTransferField;
28 #include "MEDCouplingRemapper.hxx"
32 %include "InterpolationOptions.hxx"
39 NOT_IK_ONLY_PREFERED = 1,
42 } InterpolationMatrixPolicy;
44 class MEDCouplingRemapper : public TimeLabel, public INTERP_KERNEL::InterpolationOptions
47 void updateTime() const;
49 MEDCouplingRemapper();
50 ~MEDCouplingRemapper();
51 int prepare(const MEDCouplingMesh *srcMesh, const MEDCouplingMesh *targetMesh, const std::string& method);
52 int prepareEx(const MEDCouplingFieldTemplate *src, const MEDCouplingFieldTemplate *target);
53 void transfer(const MEDCouplingFieldDouble *srcField, MEDCouplingFieldDouble *targetField, double dftValue);
54 void partialTransfer(const MEDCouplingFieldDouble *srcField, MEDCouplingFieldDouble *targetField);
55 void reverseTransfer(MEDCouplingFieldDouble *srcField, const MEDCouplingFieldDouble *targetField, double dftValue);
56 MEDCouplingFieldDouble *transferField(const MEDCouplingFieldDouble *srcField, double dftValue);
57 MEDCouplingFieldDouble *reverseTransferField(const MEDCouplingFieldDouble *targetField, double dftValue);
58 bool setOptionInt(const std::string& key, int value);
59 bool setOptionDouble(const std::string& key, double value);
60 bool setOptionString(const std::string& key, const std::string& value);
61 int getInterpolationMatrixPolicy() const;
62 void setInterpolationMatrixPolicy(int newInterpMatPol);
64 int nullifiedTinyCoeffInCrudeMatrixAbs(double maxValAbs);
65 int nullifiedTinyCoeffInCrudeMatrix(double scaleFactor);
66 double getMaxValueInCrudeMatrix() const;
67 int getNumberOfColsOfMatrix() const;
68 static std::string BuildMethodFrom(const std::string& meth1, const std::string& meth2);
71 PyObject *getCrudeMatrix() const
73 const std::vector<std::map<mcIdType,double> >& m=self->getCrudeMatrix();
74 std::size_t sz=m.size();
75 PyObject *ret=PyList_New(sz);
76 for(std::size_t i=0;i<sz;i++)
78 const std::map<mcIdType,double>& row=m[i];
79 PyObject *ret0=PyDict_New();
80 for(std::map<mcIdType,double>::const_iterator it=row.begin();it!=row.end();it++)
82 std::unique_ptr<PyObject,std::function<void(PyObject*)>> k(PyInt_FromLong((*it).first),[](PyObject *obj) { Py_XDECREF(obj); } ),v(PyFloat_FromDouble((*it).second),[](PyObject *obj) { Py_XDECREF(obj); } );
83 PyDict_SetItem(ret0,k.get(),v.get());
85 PyList_SetItem(ret,i,ret0);
89 #if defined(WITH_NUMPY) && defined(WITH_SCIPY)
90 PyObject *getCrudeCSRMatrix() const
92 return ToCSRMatrix(self->getCrudeMatrix(),self->getNumberOfColsOfMatrix());
95 void setCrudeMatrix(const MEDCouplingMesh *srcMesh, const MEDCouplingMesh *targetMesh, const std::string& method, PyObject *m)
97 std::vector<std::map<mcIdType,double> > mCpp;
100 #if defined(WITH_NUMPY) && defined(WITH_SCIPY)
101 PyObject *indptr(PyObject_GetAttrString(m,"indptr"));
102 PyObject *indices(PyObject_GetAttrString(m,"indices"));
103 PyObject *data(PyObject_GetAttrString(m,"data"));
104 MCAuto<DataArrayInt32> indptrPtr, indicesPtr;
105 // csr_matrix.indptr and csr_matrix.indices are always dtype==int32
106 // #if defined(MEDCOUPLING_USE_64BIT_IDS)
107 // indptrPtr = MEDCoupling_DataArrayInt64_New__SWIG_1(indptr,NULL,NULL);
108 // indicesPtr = MEDCoupling_DataArrayInt64_New__SWIG_1(indices,NULL,NULL);
110 indptrPtr = MEDCoupling_DataArrayInt32_New__SWIG_1(indptr,NULL,NULL);
111 indicesPtr = MEDCoupling_DataArrayInt32_New__SWIG_1(indices,NULL,NULL);
113 MCAuto<DataArrayDouble> dataPtr(MEDCoupling_DataArrayDouble_New__SWIG_1(data,NULL,NULL));
114 convertCSR_MCDataToVectMapIntDouble(indptrPtr,indicesPtr,dataPtr,mCpp);
115 Py_XDECREF(data); Py_XDECREF(indptr); Py_XDECREF(indices);
117 throw INTERP_KERNEL::Exception("pywrap of MEDCouplingRemapper::setCrudeMatrix : unexpected situation regarding numpy/scipy !");
121 convertToVectMapIntDouble(m,mCpp);
122 self->setCrudeMatrix(srcMesh,targetMesh,method,mCpp);
125 void setCrudeMatrixEx(const MEDCouplingFieldTemplate *src, const MEDCouplingFieldTemplate *target, PyObject *m)
127 std::vector<std::map<mcIdType,double> > mCpp;
128 convertToVectMapIntDouble(m,mCpp);
129 self->setCrudeMatrixEx(src,target,mCpp);