Salome HOME
Updated copyright comment
[modules/med.git] / src / MEDCouplingCorba / Client / MEDCouplingFieldOverTimeClient.cxx
1 // Copyright (C) 2007-2024  CEA, EDF
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony Geay (CEA/DEN)
20
21 #include "MEDCouplingFieldOverTimeClient.hxx"
22 #include "MEDCouplingMultiFieldsClient.hxx"
23 #include "MEDCouplingFieldTemplate.hxx"
24 #include "MEDCouplingDefinitionTime.hxx"
25 #include "MEDCouplingMeshClient.hxx"
26 #include "DataArrayDoubleClient.hxx"
27 #include "MEDCouplingMemArray.hxx"
28 #include "MEDCouplingMesh.hxx"
29
30 #include <vector>
31
32 using namespace MEDCoupling;
33
34 MEDCouplingFieldOverTimeClient::MEDCouplingFieldOverTimeClient(SALOME_MED::MEDCouplingFieldOverTimeCorbaInterface_ptr field):_df(0)
35 {
36   _field_ptr=SALOME_MED::MEDCouplingFieldOverTimeCorbaInterface::_duplicate(field);
37   _field_ptr->Register();
38 }
39
40 MEDCouplingFieldOverTimeClient::~MEDCouplingFieldOverTimeClient()
41 {
42   _field_ptr->UnRegister();
43   delete _df;
44 }
45
46 MEDCouplingFieldOverTimeClient *MEDCouplingFieldOverTimeClient::New(SALOME_MED::MEDCouplingFieldOverTimeCorbaInterface_ptr fieldPtr)
47 {
48   MEDCouplingFieldOverTimeClient *ret=new MEDCouplingFieldOverTimeClient(fieldPtr);
49   MEDCouplingMultiFieldsClient::BuildFullMultiFieldsCorbaFetch(ret,fieldPtr);
50   return ret;
51 }
52
53 void MEDCouplingFieldOverTimeClient::retrieveFieldTemplates()
54 {
55   SALOME_TYPES::ListOfLong *tinyL=0;
56   SALOME_TYPES::ListOfDouble *tinyD=0;
57   SALOME_TYPES::ListOfString *tinyS=0;
58   //
59   CORBA::Long nbOfArrays;
60   CORBA::Long nbOfFields;
61   CORBA::Long nbOfMeshes=_field_ptr->getMainTinyInfo(tinyL,tinyD,nbOfArrays,nbOfFields);
62   int tinyLgth=tinyL->length();
63   std::vector<mcIdType> mainI(tinyLgth);
64   for(int i=0;i<tinyLgth;i++)
65     mainI[i]=(*tinyL)[i];
66   delete tinyL; tinyL=0;
67   tinyLgth=tinyD->length();
68   std::vector<double> mainD(tinyLgth);
69   for(int i=0;i<tinyLgth;i++)
70     mainD[i]=(*tinyD)[i];
71   delete tinyD; tinyD=0;
72   //
73   std::vector<MEDCouplingMesh *> cppms(nbOfMeshes);
74   //
75   std::vector<DataArrayDouble *> cppdas(nbOfArrays);
76   //
77   std::vector<MEDCouplingFieldTemplate *> fts(nbOfFields);
78   for(CORBA::Long i=0;i<nbOfFields;i++)
79     {
80       _field_ptr->getTinyInfo(i,tinyL,tinyD,tinyS);
81       int tinyLgth=tinyL->length();
82       std::vector<mcIdType> tinyLV(tinyLgth);
83       for(int j=0;j<tinyLgth;j++)
84         tinyLV[j]=(*tinyL)[j];
85       delete tinyL; tinyL=0;
86       //
87       tinyLgth=tinyD->length();
88       std::vector<double> tinyLD(tinyLgth);
89       for(int j=0;j<tinyLgth;j++)
90         tinyLD[j]=(*tinyD)[j];
91       delete tinyD; tinyD=0;
92       //
93       tinyLgth=tinyS->length();
94       std::vector<std::string> tinyLS(tinyLgth);
95       for(int j=0;j<tinyLgth;j++)
96         tinyLS[j]=(*tinyS)[j];
97       delete tinyS; tinyS=0;
98       TypeOfField type=(TypeOfField) tinyLV[0];
99       MEDCouplingFieldTemplate *f1=MEDCouplingFieldTemplate::New(type);
100       //
101       DataArrayIdType *array0;
102       f1->resizeForUnserialization(tinyLV,array0);
103       if(array0)
104         {
105           _field_ptr->getSerialisationData(i,tinyL);
106           tinyLgth=tinyL->length();
107           mcIdType *ptr=array0->getPointer();
108           for(int j=0;j<tinyLgth;j++)
109             ptr[j]=(*tinyL)[j];
110           delete tinyL; tinyL=0;
111         }
112       f1->finishUnserialization(tinyLV,tinyLD,tinyLS);
113       fts[i]=f1;
114     }
115   //last step
116   finishUnserialization(mainI,mainD,fts,cppms,cppdas);
117   // clean-up
118   for(std::vector<MEDCouplingFieldTemplate *>::iterator it=fts.begin();it!=fts.end();it++)
119     (*it)->decrRef();
120 }
121
122 std::vector<double> MEDCouplingFieldOverTimeClient::getTimeSteps() const
123 {
124   fetchDefTimeIfNeeded();
125   return _df->getHotSpotsTime();
126 }
127
128 void MEDCouplingFieldOverTimeClient::fetchDefTimeIfNeeded() const
129 {
130   if(!_df)
131     {
132       SALOME_TYPES::ListOfLong *tinyL=0;
133       SALOME_TYPES::ListOfDouble *tinyD=0;
134       _field_ptr->getTinyInfoAboutTimeDefinition(tinyL,tinyD);
135       int tinyLgth=tinyL->length();
136       std::vector<int> mainI(tinyLgth);
137       for(int i=0;i<tinyLgth;i++)
138         mainI[i]=(*tinyL)[i];
139       delete tinyL; tinyL=0;
140       tinyLgth=tinyD->length();
141       std::vector<double> mainD(tinyLgth);
142       for(int i=0;i<tinyLgth;i++)
143         mainD[i]=(*tinyD)[i];
144       delete tinyD; tinyD=0;
145       //
146       _df=new MEDCouplingDefinitionTime;
147       _df->unserialize(mainI,mainD);
148     }
149 }