1 // Copyright (C) 2010-2012 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.
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 #include "vtkMedReader.h"
22 #include "vtkMedFile.h"
23 #include "vtkMedDriver.h"
24 #include "vtkMedUtilities.h"
25 #include "vtkMedFamily.h"
26 #include "vtkMedGroup.h"
27 #include "vtkMedMesh.h"
28 #include "vtkMedUnstructuredGrid.h"
29 #include "vtkMedCurvilinearGrid.h"
30 #include "vtkMedRegularGrid.h"
31 #include "vtkMedEntityArray.h"
32 #include "vtkMedField.h"
33 #include "vtkMedFieldStep.h"
34 #include "vtkMedFieldOverEntity.h"
35 #include "vtkMedProfile.h"
36 #include "vtkMedIntArray.h"
37 #include "vtkMedLocalization.h"
38 #include "vtkMedFamilyOnEntity.h"
39 #include "vtkMedFieldOnProfile.h"
40 #include "vtkMedSelection.h"
41 #include "vtkMedFamilyOnEntityOnProfile.h"
42 #include "vtkMedLink.h"
43 #include "vtkMedInterpolation.h"
44 #include "vtkMedStructElement.h"
45 #include "vtkMedConstantAttribute.h"
47 #include "vtkObjectFactory.h"
48 #include "vtkMutableDirectedGraph.h"
49 #include "vtkStringArray.h"
50 #include "vtkDataSetAttributes.h"
51 #include "vtkUnsignedCharArray.h"
52 #include "vtkInformation.h"
53 #include "vtkInformationVector.h"
54 #include "vtkSmartPointer.h"
55 #include "vtkVariantArray.h"
56 #include "vtkMultiBlockDataSet.h"
57 #include "vtkExecutive.h"
58 #include "vtkStreamingDemandDrivenPipeline.h"
59 #include "vtkUnstructuredGrid.h"
61 #include "vtkPointData.h"
62 #include "vtkCellData.h"
63 #include "vtkFieldData.h"
64 #include "vtkInformationQuadratureSchemeDefinitionVectorKey.h"
65 #include "vtkQuadratureSchemeDefinition.h"
66 #include "vtkCellType.h"
67 #include "vtkCellArray.h"
68 #include "vtkDoubleArray.h"
69 #include "vtkConfigure.h"
70 #include "vtkMultiProcessController.h"
71 #include "vtkCommunicator.h"
73 #include "vtkSMDoubleVectorProperty.h"
74 #include "vtkInformationDataObjectKey.h"
89 vtkSmartPointer<vtkDataArray> DataArray;
90 vtkSmartPointer<vtkDataArray> Vectors;
91 vtkSmartPointer<vtkIdTypeArray> QuadratureIndexArray;
94 class vtkMedListOfFieldSteps : public std::list<vtkMedFieldStep*>
97 typedef int LocalizationKey;
99 class vtkMedReader::vtkMedReaderInternal
103 int CurrentPieceNumber;
105 double UpdateTimeStep;
106 vtkTimeStamp FileNameMTime;
107 vtkTimeStamp MetaDataMTime;
108 vtkTimeStamp GroupSelectionMTime;
109 vtkTimeStamp FamilySelectionMTime;
111 int RealAnimationMode;
112 vtkMedSelection* Families;
114 // this stores the aggregation of all compute steps from
115 // both meshes and fields.
116 std::map<med_float, std::set<med_int> > GlobalComputeStep;
118 // Store the vtkMutableDirectedGraph that represents links between family, groups and cell types
119 vtkMutableDirectedGraph* SIL;
121 // this map is used to keep clean data sets in the cache, without any field.
122 // for each support, store the vtkDataSet
123 map<vtkMedFamilyOnEntityOnProfile*, vtkSmartPointer<vtkDataSet> > DataSetCache;
125 // this is the current dataset for the given support.
126 map<vtkMedFamilyOnEntityOnProfile*, vtkDataSet*> CurrentDataSet;
128 // for each support, cache the VTK arrays that correspond to a given field at the given step.
129 map<vtkMedFamilyOnEntityOnProfile*, map<vtkMedFieldOnProfile*, VTKField> > FieldCache;
130 //map<vtkMedFamilyOnEntity*, map<vtkMedFieldOnProfile*, bool> > FieldMatchCache;
132 // This list keep tracks of all the currently selected supports
133 set<vtkMedFamilyOnEntityOnProfile*> UsedSupports;
135 // this map keeps for each support, the quadrature offset array so that
136 // different fields on the same support can use
137 // the same offset array, provided they use the same gauss points definitions
138 map<vtkMedFamilyOnEntityOnProfile*,
139 map<LocalizationKey, vtkSmartPointer<vtkIdTypeArray> > >
140 QuadratureOffsetCache;
142 map<vtkMedFamilyOnEntityOnProfile*,
143 map<vtkMedFieldOnProfile*, LocalizationKey> > QuadOffsetKey;
145 std::map<std::string, vtkSmartPointer<vtkMedFile> > MedFiles;
147 vtkMedReaderInternal()
149 this->SIL=vtkMutableDirectedGraph::New();
150 this->SILUpdateStamp=-1;
151 this->RealAnimationMode=vtkMedReader::PhysicalTime;
152 this->Families=vtkMedSelection::New();
153 this->FamilySelectionMTime.Modified();
154 this->GroupSelectionMTime.Modified();
156 ~vtkMedReaderInternal()
159 this->Families->Delete();
162 void ClearSupportCache(vtkMedFamilyOnEntityOnProfile* foep)
164 //this->Med2VTKPointIndex.erase(foep);
165 this->QuadratureOffsetCache.erase(foep);
166 //this->FieldMatchCache.erase(foe);
167 this->FieldCache.erase(foep);
168 this->CurrentDataSet.erase(foep);
169 this->DataSetCache.erase(foep);
172 vtkIdType GetChild(vtkIdType parent, const vtkStdString childName)
174 vtkStringArray* names=vtkStringArray::SafeDownCast(
175 this->SIL->GetVertexData()->GetArray("Names"));
178 vtkIdType nedges=this->SIL->GetOutDegree(parent);
179 for(vtkIdType id=0; id<nedges; id++)
181 vtkOutEdgeType edge=this->SIL->GetOutEdge(parent, id);
182 if(names->GetValue(edge.Target)==childName)
188 vtkIdType GetGroupId(const char* key)
190 vtkstd::string meshname, celltypename, groupname;
191 vtkMedUtilities::SplitGroupKey(key, meshname, celltypename, groupname);
192 vtkIdType root=GetChild(0, "SIL");
195 vtkIdType mesh=GetChild(root, meshname);
198 vtkIdType type=GetChild(mesh, celltypename);
201 return GetChild(type, groupname);
207 vtkCxxRevisionMacro(vtkMedReader, "$Revision$");
208 vtkStandardNewMacro(vtkMedReader);
210 vtkMedReader::vtkMedReader()
213 this->SetNumberOfInputPorts(0);
214 this->PointFields=vtkMedSelection::New();
215 this->CellFields=vtkMedSelection::New();
216 this->QuadratureFields=vtkMedSelection::New();
217 this->ElnoFields=vtkMedSelection::New();
218 this->Entities=vtkMedSelection::New();
219 this->Groups=vtkMedSelection::New();
220 this->Frequencies=vtkMedSelection::New();
221 this->AnimationMode=Default;
222 this->TimeIndexForIterations=0;
223 this->CacheStrategy=CacheGeometry;
224 this->Internal=new vtkMedReaderInternal;
225 this->TimePrecision=0.00001;
226 this->AvailableTimes=vtkDoubleArray::New();
227 this->GenerateVectors = 0;
230 vtkMedReader::~vtkMedReader()
232 this->SetFileName(NULL);
233 this->PointFields->Delete();
234 this->CellFields->Delete();
235 this->QuadratureFields->Delete();
236 this->ElnoFields->Delete();
237 this->Entities->Delete();
238 this->Groups->Delete();
239 this->Frequencies->Delete();
240 delete this->Internal;
241 this->AvailableTimes->Delete();
244 int vtkMedReader::GetSILUpdateStamp()
246 return this->Internal->SILUpdateStamp;
249 void vtkMedReader::SetFileName(const char* fname)
252 if(fname==this->FileName)
254 if(fname&&this->FileName&&!strcmp(fname, this->FileName))
258 delete[] this->FileName;
261 size_t fnl=strlen(fname)+1;
262 char* dst=new char[fnl];
263 const char* src=fname;
278 this->Internal->MedFiles.clear();
279 this->Internal->FileNameMTime.Modified();
283 int vtkMedReader::CanReadFile(const char* fname)
285 // the factory give a driver only when it can read the file version,
286 // or it returns a NULL pointer.
287 vtkSmartPointer<vtkMedFile> file=vtkSmartPointer<vtkMedFile>::New();
288 file->SetFileName(fname);
290 if(!file->CreateDriver())
296 int vtkMedReader::RequestInformation(vtkInformation *request,
297 vtkInformationVector **inputVector, vtkInformationVector *outputVector)
299 vtkInformation* outInfo = outputVector->GetInformationObject(0);
300 outInfo->Set(vtkStreamingDemandDrivenPipeline::MAXIMUM_NUMBER_OF_PIECES(),-1);
302 if(this->Internal->MetaDataMTime <= this->Internal->FileNameMTime)
304 this->ClearCaches(Initialize);
306 vtkMedFile* file=vtkMedFile::New();
307 file->SetFileName(this->FileName);
308 this->Internal->MedFiles[this->FileName] = file;
311 std::list<vtkMedFile*> file_stack;
312 file_stack.push_back(file);
314 // if the file cannot create a driver, this means that the filename is not
315 // valid, or that I do not know how to read this file.
316 while (file_stack.size() > 0)
318 vtkMedFile* file = file_stack.front();
319 file_stack.pop_front();
320 // This reads information from disk
321 file->ReadInformation();
323 // add all files linked to in the current file to the files to read.
324 for (int linkid=0; linkid<file->GetNumberOfLink(); linkid++)
326 vtkMedLink* link = file->GetLink(linkid);
327 const char* filename = link->GetFullLink(file->GetFileName());
328 if(this->Internal->MedFiles.find(filename) == this->Internal->MedFiles.end())
330 vtkMedFile* newfile = vtkMedFile::New();
331 newfile->SetFileName(filename);
332 this->Internal->MedFiles[filename] = newfile;
333 file_stack.push_back(newfile);
339 // This computes some meta information, like which field use which
340 // support, but do not read large data from disk.
343 // This computes the initial global id of each cell type.
344 this->InitializeCellGlobalIds();
346 this->ClearSelections();
348 this->BuildSIL(this->Internal->SIL);
349 this->Internal->SILUpdateStamp++;
351 this->GatherComputeSteps();
353 this->Internal->MetaDataMTime.Modified();
356 outInfo->Set(vtkDataObject::SIL(), this->Internal->SIL);
357 request->AppendUnique(vtkExecutive::KEYS_TO_COPY(),
358 vtkDataObject::SIL());
359 request->AppendUnique(vtkExecutive::KEYS_TO_COPY(),
360 vtkMedUtilities::BLOCK_NAME());
361 this->AdvertiseTime(outInfo);
365 int vtkMedReader::RequestData(vtkInformation *request,
366 vtkInformationVector **inputVector, vtkInformationVector *outputVector)
368 if(this->FileName==NULL)
370 vtkWarningMacro( << "FileName must be set and meta data loaded");
374 vtkInformation *info=outputVector->GetInformationObject(0);
376 vtkMultiBlockDataSet *output=vtkMultiBlockDataSet::SafeDownCast(info->Get(
377 vtkDataObject::DATA_OBJECT()));
379 if (info->Has(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES()))
381 this->Internal->NumberOfPieces=info->Get(
382 vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES());
386 vtkMultiProcessController* controller =
387 vtkMultiProcessController::GetGlobalController();
390 this->Internal->NumberOfPieces=controller->GetNumberOfProcesses();
394 this->Internal->NumberOfPieces = 1;
397 if (info->Has(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER()))
399 this->Internal->CurrentPieceNumber=info->Get(
400 vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER());
404 this->Internal->CurrentPieceNumber=0;
405 vtkMultiProcessController* controller =
406 vtkMultiProcessController::GetGlobalController();
409 this->Internal->CurrentPieceNumber= controller->GetLocalProcessId();
413 this->Internal->CurrentPieceNumber=0;
418 vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS()))
420 this->Internal->GhostLevel=info->Get(
421 vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS());
425 this->Internal->GhostLevel=0;
428 if (info->Has(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()))
430 this->Internal->UpdateTimeStep=info->Get(
431 vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS())[0];
435 this->Internal->UpdateTimeStep=0;
438 this->InitializeParallelRead();
439 output->Initialize();
441 this->ChooseRealAnimationMode();
443 std::list<vtkMedDriver::FileOpen> openlist;
444 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
445 fileit = this->Internal->MedFiles.begin();
446 while(fileit != this->Internal->MedFiles.end())
448 vtkMedFile* file = fileit->second;
449 openlist.push_back(vtkMedDriver::FileOpen(file->GetMedDriver()));
453 // clear the dataset cache of unneeded geometry
454 this->ClearCaches(StartRequest);
456 // This call create the vtkMedSupports, but do not create the corresponding vtkDataSet;
457 this->CreateMedSupports();
458 this->ClearCaches(AfterCreateMedSupports);
459 // This call creates the actual vtkDataSet that corresponds to each support
462 int maxprogress=2*this->Internal->UsedSupports.size();
465 for(set<vtkMedFamilyOnEntityOnProfile*>::iterator it=
466 this->Internal->UsedSupports.begin(); it
467 !=this->Internal->UsedSupports.end(); it++)
470 vtkMedFamilyOnEntityOnProfile* foep = *it;
471 sstr<<"Support : "<<vtkMedUtilities::SimplifyName(
472 foep->GetFamilyOnEntity()->GetFamily()->GetName());
473 this->SetProgressText(sstr.str().c_str());
474 int doBuildSupportField = 1;
476 this->BuildVTKSupport(foep, doBuildSupportField);
477 this->UpdateProgress((float) progress/((float) maxprogress-1));
482 this->ClearCaches(EndBuildVTKSupports);
483 // This call maps the fields to the supports
484 for(set<vtkMedFamilyOnEntityOnProfile*>::iterator it=
485 this->Internal->UsedSupports.begin(); it
486 !=this->Internal->UsedSupports.end(); it++)
488 vtkMedFamilyOnEntityOnProfile* foep = *it;
489 if((foep->GetValid() == 0) && (this->Internal->NumberOfPieces == 1))
492 sstr<<"Loading fields on "<<vtkMedUtilities::SimplifyName(
493 foep->GetFamilyOnEntity()->GetFamily()->GetName());
494 this->SetProgressText(sstr.str().c_str());
496 this->MapFieldsOnSupport(*it, doMapField);
497 this->UpdateProgress((float) progress/((float) maxprogress-1));
502 // This call clean up caches (what is actually done depends of the CacheStrategy)
503 this->ClearCaches(EndRequest);
507 void vtkMedReader::InitializeCellGlobalIds()
509 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
510 fileit = this->Internal->MedFiles.begin();
511 while(fileit != this->Internal->MedFiles.end())
513 vtkMedFile* file = fileit->second;
515 for(int m=0; m<file->GetNumberOfMesh(); m++)
517 vtkMedMesh* mesh = file->GetMesh(m);
518 med_int nstep = mesh->GetNumberOfGridStep();
519 for(med_int stepid=0; stepid<nstep; stepid++)
521 vtkMedGrid* grid = mesh->GetGridStep(stepid);
522 grid->InitializeCellGlobalIds();
528 // Method to create the filters for the MED parallel read functions
529 // It is defined here as we have all information for initialization
530 void vtkMedReader::InitializeParallelRead()
532 // If there is only one process for reading no need to enter here
533 if (this->Internal->NumberOfPieces <= 1)
538 // FIRST: Generate filters for the cells
540 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
541 meshfit = this->Internal->MedFiles.begin();
542 while(meshfit != this->Internal->MedFiles.end())
544 vtkMedFile* meshfile = meshfit->second;
546 med_idt pFileID = meshfile->GetMedDriver()->GetParallelFileId();
548 for(int mid=0; mid<meshfile->GetNumberOfMesh(); mid++)
550 vtkMedMesh* mesh = meshfile->GetMesh(mid);
551 for(int gid=0; gid<mesh->GetNumberOfGridStep(); gid++)
553 vtkMedGrid* grid = mesh->GetGridStep(gid);
554 // read point family data and create EntityArrays
556 for(int eid=0; eid < grid->GetNumberOfEntityArray(); eid++)
558 vtkMedEntityArray* array = grid->GetEntityArray(eid);
560 // Next continue is to avoid to create filters for the
561 // points, at the moment we charge the points in all nodes
562 if (array->GetEntity().GeometryType == MED_POINT1) // !MED_NODE
565 med_int nbofconstituentpervalue = vtkMedUtilities::GetNumberOfNodes(
566 array->GetEntity().GeometryType);
567 if (nbofconstituentpervalue == -1)
568 vtkErrorMacro("Still not implemented for MED_POLYGON and MED_POLYHEDRON"); // Ã gerer
570 // Calculating block sizes
571 int nEntity = array->GetNumberOfEntity();
572 int block_size = ( nEntity / this->Internal->NumberOfPieces );
573 med_size start = block_size * this->Internal->CurrentPieceNumber + 1;
574 med_size stride = block_size;
576 med_size blocksize = block_size;
577 med_size lastblocksize = (nEntity % this->Internal->NumberOfPieces);
578 if ((this->Internal->NumberOfPieces ==
579 this->Internal->CurrentPieceNumber+1) && (lastblocksize != 0))
581 blocksize += lastblocksize;
582 stride += lastblocksize;
586 vtkMedFilter *filter = vtkMedFilter::New();
587 filter->SetFilterSizes( start, stride, count, blocksize, lastblocksize );
588 array->SetFilter(filter);
594 // SECOND: Filters for the Fields
596 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
598 // link the FieldOnProfile with the profiles
599 fieldfileit = this->Internal->MedFiles.begin();
600 while(fieldfileit != this->Internal->MedFiles.end())
602 vtkMedFile* fieldfile = fieldfileit->second;
604 med_idt pFileID = fieldfile->GetMedDriver()->GetParallelFileId();
606 for(int fid=0; fid<fieldfile->GetNumberOfField(); fid++)
608 vtkMedField* field = fieldfile->GetField(fid);
610 if (field->GetFieldType() == vtkMedField::CellField)
612 for(int sid = 0; sid< field->GetNumberOfFieldStep(); sid++)
614 vtkMedFieldStep* step = field->GetFieldStep(sid);
616 for(int foeid = 0; foeid < step->GetNumberOfFieldOverEntity(); foeid++)
617 // TODO : seul le premier pas de temps est dispo au debut
619 vtkMedFieldOverEntity* fieldOverEntity = step->GetFieldOverEntity(foeid);
621 for(int fopid = 0; fopid < fieldOverEntity->GetNumberOfFieldOnProfile(); fopid++)
623 vtkMedFieldOnProfile* fop = fieldOverEntity->GetFieldOnProfile(fopid);
624 // Here implement the filters as before:
625 // 1- Modify vtkMedFieldOnProfile to contain a filter
626 // 2- Create the filters here only if they are on CELLs (use GetFieldType)
627 med_int nbofconstituentpervalue = field->GetNumberOfComponent();
629 int nVectors = fop->GetNumberOfValues();
631 int block_size = ( nVectors / this->Internal->NumberOfPieces );
632 int start = block_size * this->Internal->CurrentPieceNumber + 1;
633 int stride = block_size;
635 int blocksize = block_size;
636 int lastblocksize = (nVectors % this->Internal->NumberOfPieces);
637 if ((this->Internal->NumberOfPieces ==
638 this->Internal->CurrentPieceNumber+1) && (lastblocksize != 0))
640 blocksize += lastblocksize;
641 stride += lastblocksize;
645 vtkMedFilter *filter = vtkMedFilter::New();
646 filter->SetFilterSizes( start, stride, count, blocksize, lastblocksize );
647 fop->SetFilter(filter);
657 void vtkMedReader::LinkMedInfo()
659 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
661 // link the FieldOnProfile with the profiles
662 fieldfileit = this->Internal->MedFiles.begin();
663 while(fieldfileit != this->Internal->MedFiles.end())
665 vtkMedFile* fieldfile = fieldfileit->second;
668 for(int fid=0; fid<fieldfile->GetNumberOfField(); fid++)
670 vtkMedField* field = fieldfile->GetField(fid);
672 for(int sid = 0; sid< field->GetNumberOfFieldStep(); sid++)
674 vtkMedFieldStep* step = field->GetFieldStep(sid);
676 for(int foeid = 0; foeid < step->GetNumberOfFieldOverEntity(); foeid++)
678 vtkMedFieldOverEntity* fieldOverEntity = step->GetFieldOverEntity(foeid);
680 for(int fopid = 0; fopid < fieldOverEntity->GetNumberOfFieldOnProfile(); fopid++)
682 vtkMedFieldOnProfile* fop = fieldOverEntity->GetFieldOnProfile(fopid);
684 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
685 profilefileit = this->Internal->MedFiles.begin();
686 while(profilefileit != this->Internal->MedFiles.end() && fop->GetProfile() == NULL)
688 vtkMedFile* profilefile = profilefileit->second;
691 for(int pid = 0; pid < profilefile->GetNumberOfProfile(); pid++)
693 vtkMedProfile *profile = profilefile->GetProfile(pid);
694 if(strcmp(profile->GetName(), fop->GetProfileName()) == 0)
696 fop->SetProfile(profile);
707 // first, add a familyOnEntityOnProfile to all FamilyOnEntity with a NULL
708 // profile. This is used if no field is mapped to this support.
709 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
710 meshfit = this->Internal->MedFiles.begin();
711 while(meshfit != this->Internal->MedFiles.end())
713 vtkMedFile* meshfile = meshfit->second;
716 for(int mid=0; mid<meshfile->GetNumberOfMesh(); mid++)
718 vtkMedMesh* mesh = meshfile->GetMesh(mid);
720 for(int gid=0; gid<mesh->GetNumberOfGridStep(); gid++)
722 vtkMedGrid* grid = mesh->GetGridStep(gid);
723 // read point family data and create EntityArrays
725 for(int eid=0; eid < grid->GetNumberOfEntityArray(); eid++)
727 vtkMedEntityArray* array = grid->GetEntityArray(eid);
729 for(int fid=0; fid < array->GetNumberOfFamilyOnEntity(); fid++)
731 vtkMedFamilyOnEntity* foe = array->GetFamilyOnEntity(fid);
732 if(foe->GetFamilyOnEntityOnProfile((vtkMedProfile*)NULL) == NULL)
734 vtkMedFamilyOnEntityOnProfile* foep =
735 vtkMedFamilyOnEntityOnProfile::New();
736 foep->SetFamilyOnEntity(foe);
737 foep->SetProfile(NULL);
738 foe->AddFamilyOnEntityOnProfile(foep);
747 fieldfileit = this->Internal->MedFiles.begin();
748 while(fieldfileit != this->Internal->MedFiles.end())
750 vtkMedFile* fieldfile = fieldfileit->second;
753 for(int fieldid=0; fieldid < fieldfile->GetNumberOfField(); fieldid++)
755 vtkMedField* field = fieldfile->GetField(fieldid);
757 for(int fstepid=0; fstepid < field->GetNumberOfFieldStep(); fstepid++)
759 vtkMedFieldStep* step = field->GetFieldStep(fstepid);
761 vtkMedComputeStep meshcs = step->GetMeshComputeStep();
763 for(int foeid=0; foeid<step->GetNumberOfFieldOverEntity() ;foeid++)
765 vtkMedFieldOverEntity* fieldOverEntity = step->GetFieldOverEntity(foeid);
766 const vtkMedEntity& fieldentity = fieldOverEntity->GetEntity();
769 fopid < fieldOverEntity->GetNumberOfFieldOnProfile(); fopid++)
771 vtkMedFieldOnProfile* fop =
772 fieldOverEntity->GetFieldOnProfile(fopid);
774 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
775 meshfileit = this->Internal->MedFiles.begin();
776 while(meshfileit != this->Internal->MedFiles.end())
778 vtkMedFile* meshfile = meshfileit->second;
781 if(field->GetLocal() == 1 && (meshfile != fieldfile))
784 for(int mid=0; mid<meshfile->GetNumberOfMesh(); mid++)
786 vtkMedMesh* mesh = meshfile->GetMesh(mid);
788 // the field must be on this mesh.
789 if(strcmp(mesh->GetName(),
790 field->GetMeshName()) != 0)
793 vtkMedGrid* grid = mesh->GetGridStep(meshcs);
796 vtkErrorMacro("the field " << field->GetName()
797 << " at step iteration:"
798 << step->GetComputeStep().IterationIt
800 << step->GetComputeStep().TimeIt
801 << " uses mesh at step "
802 << meshcs.TimeIt << " " << meshcs.IterationIt
803 << "which does not exists!");
807 for(int eid=0; eid < grid->GetNumberOfEntityArray(); eid++)
809 vtkMedEntityArray* array = grid->GetEntityArray(eid);
811 // if the support is on points,
812 // the field must also be on points
813 if(array->GetEntity().EntityType == MED_NODE &&
814 fieldentity.EntityType != MED_NODE)
817 if(array->GetEntity().EntityType != MED_NODE &&
818 fieldentity.EntityType == MED_NODE)
821 // for fields not on points, the geometry type
822 // of the support must match
823 if(array->GetEntity().EntityType != MED_NODE &&
824 array->GetEntity().GeometryType != fieldentity.GeometryType)
827 for(int fid = 0; fid < array->GetNumberOfFamilyOnEntity(); fid++)
829 vtkMedFamilyOnEntity* foe = array->GetFamilyOnEntity(fid);
830 if(foe->GetFamilyOnEntityOnProfile(fop->GetProfile()) == NULL)
832 vtkMedFamilyOnEntityOnProfile* foep =
833 vtkMedFamilyOnEntityOnProfile::New();
834 foep->SetProfile(fop->GetProfile());
835 foep->SetFamilyOnEntity(foe);
836 foe->AddFamilyOnEntityOnProfile(foep);
839 // also add the family on entity with no profile.
840 if(foe->GetFamilyOnEntityOnProfile((vtkMedProfile*)NULL) == NULL)
842 vtkMedFamilyOnEntityOnProfile* foep =
843 vtkMedFamilyOnEntityOnProfile::New();
844 foep->SetProfile(NULL);
845 foep->SetFamilyOnEntity(foe);
846 foe->AddFamilyOnEntityOnProfile(foep);
859 // Now, link localizations and interpolations
860 fieldfileit = this->Internal->MedFiles.begin();
861 while(fieldfileit != this->Internal->MedFiles.end())
863 vtkMedFile* fieldfile = fieldfileit->second;
866 for(int locid = 0; locid < fieldfile->GetNumberOfLocalization(); locid++)
868 vtkMedLocalization* loc = fieldfile->GetLocalization(locid);
870 for(int fid = 0; fid < fieldfile->GetNumberOfField() &&
871 loc->GetInterpolation() == NULL; fid++)
873 vtkMedField* field = fieldfile->GetField(fid);
874 for(int interpid = 0; interpid < field->GetNumberOfInterpolation();
877 vtkMedInterpolation* interp = field->GetInterpolation(interpid);
878 if(strcmp(loc->GetInterpolationName(),
879 interp->GetName()) == 0)
881 loc->SetInterpolation(interp);
889 // now that the interpolation is set, build the shape functions.
890 fieldfileit = this->Internal->MedFiles.begin();
891 while(fieldfileit != this->Internal->MedFiles.end())
893 vtkMedFile* fieldfile = fieldfileit->second;
896 for(int locid = 0; locid < fieldfile->GetNumberOfLocalization(); locid++)
898 vtkMedLocalization* loc = fieldfile->GetLocalization(locid);
899 loc->BuildShapeFunction();
903 // set the supportmesh pointer in the structural element
904 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
905 fileit = this->Internal->MedFiles.begin();
906 while(fileit != this->Internal->MedFiles.end())
908 vtkMedFile* file = fileit->second;
911 for(int structelemit = 0;
912 structelemit < file->GetNumberOfStructElement();
915 vtkMedStructElement* structElem =
916 file->GetStructElement(structelemit);
918 for(int supportmeshit = 0;
919 supportmeshit < file->GetNumberOfSupportMesh();
922 vtkMedMesh* supportMesh =
923 file->GetSupportMesh(supportmeshit);
925 if(strcmp(supportMesh->GetName(), structElem->GetName()) == 0 )
927 structElem->SetSupportMesh(supportMesh);
934 // set the pointer to the profile used by the constant attributes
935 fileit = this->Internal->MedFiles.begin();
936 while(fileit != this->Internal->MedFiles.end())
938 vtkMedFile* file = fileit->second;
941 for(int structelemit = 0;
942 structelemit < file->GetNumberOfStructElement();
945 vtkMedStructElement* structElem =
946 file->GetStructElement(structelemit);
948 for(int cstattit = 0; cstattit < structElem->GetNumberOfConstantAttribute(); cstattit++)
950 vtkMedConstantAttribute* cstatt = structElem->GetConstantAttribute(cstattit);
953 profit < file->GetNumberOfProfile();
956 vtkMedProfile* profile =
957 file->GetProfile(profit);
959 if(strcmp(profile->GetName(), cstatt->GetProfileName()) == 0 )
961 cstatt->SetProfile(profile);
969 meshfit = this->Internal->MedFiles.begin();
970 while(meshfit != this->Internal->MedFiles.end())
972 vtkMedFile* meshfile = meshfit->second;
975 for(int mid=0; mid<meshfile->GetNumberOfMesh(); mid++)
977 vtkMedMesh* mesh = meshfile->GetMesh(mid);
979 for(int gid=0; gid<mesh->GetNumberOfGridStep(); gid++)
981 vtkMedGrid* grid = mesh->GetGridStep(gid);
982 // read point family data and create EntityArrays
984 for(int eid=0; eid < grid->GetNumberOfEntityArray(); eid++)
986 vtkMedEntityArray* array = grid->GetEntityArray(eid);
987 if(array->GetEntity().EntityType != MED_STRUCT_ELEMENT)
990 for(int structelemit = 0; structelemit < meshfile->GetNumberOfStructElement(); structelemit++)
992 vtkMedStructElement* structelem = meshfile->GetStructElement(structelemit);
993 if(structelem->GetGeometryType() == array->GetEntity().GeometryType)
995 array->SetStructElement(structelem);
1005 int vtkMedReader::GetFrequencyArrayStatus(const char* name)
1007 return this->Frequencies->GetKeyStatus(name);
1010 void vtkMedReader::SetFrequencyArrayStatus(const char* name, int status)
1012 if(this->Frequencies->GetKeyStatus(name) == status)
1017 this->Frequencies->SetKeyStatus(name, status);
1022 int vtkMedReader::GetNumberOfFrequencyArrays()
1024 return this->Frequencies->GetNumberOfKey();
1027 const char* vtkMedReader::GetFrequencyArrayName(int index)
1029 return this->Frequencies->GetKey(index);
1034 bool operator()(pair<double, int> i, pair<double, int> j)
1036 if(i.first!=j.first)
1037 return (i.first<j.first);
1038 return i.second<j.second;
1042 vtkDoubleArray* vtkMedReader::GetAvailableTimes()
1044 this->AvailableTimes->Initialize();
1045 this->AvailableTimes->SetNumberOfComponents(1);
1047 std::set<std::string> newFrequencies;
1050 std::map<med_float, std::set<med_int> >::iterator it =
1051 this->Internal->GlobalComputeStep.begin();
1052 while(it != this->Internal->GlobalComputeStep.end())
1054 double time = it->first;
1055 this->AvailableTimes->InsertNextValue(time);
1056 string name = vtkMedUtilities::GetModeKey(tid, time, this->Internal->GlobalComputeStep.size()-1);
1057 this->Frequencies->AddKey(name.c_str());
1058 newFrequencies.insert(name);
1063 // now check if old frequencies have been removed
1064 for(int f = 0; f < this->Frequencies->GetNumberOfKey(); f++)
1066 const char* name = this->Frequencies->GetKey(f);
1067 if(newFrequencies.find(name) == newFrequencies.end())
1069 this->Frequencies->RemoveKeyByIndex(f);
1074 return this->AvailableTimes;
1077 void vtkMedReader::ChooseRealAnimationMode()
1079 if(this->AnimationMode!=Default)
1081 this->Internal->RealAnimationMode=this->AnimationMode;
1085 // if there is exactly one physical time and more than one iteration
1086 // set the animation mode to iteration, else default to physical time.
1087 if (this->Internal->GlobalComputeStep.size() == 1 &&
1088 this->Internal->GlobalComputeStep[0].size() > 1)
1090 this->Internal->RealAnimationMode=Iteration;
1094 this->Internal->RealAnimationMode=PhysicalTime;
1097 int vtkMedReader::GetEntityStatus(const vtkMedEntity& entity)
1099 if (entity.EntityType==MED_NODE)
1101 if(entity.EntityType == MED_DESCENDING_FACE
1102 || entity.EntityType == MED_DESCENDING_EDGE)
1105 return this->Entities->GetKeyStatus(vtkMedUtilities::EntityKey(entity).c_str());
1108 int vtkMedReader::GetFamilyStatus(vtkMedMesh* mesh, vtkMedFamily* family)
1113 if(this->Internal->GroupSelectionMTime > this->Internal->FamilySelectionMTime)
1115 this->SelectFamiliesFromGroups();
1118 int status = this->Internal->Families->GetKeyStatus(vtkMedUtilities::FamilyKey(
1119 mesh->GetName(), family->GetPointOrCell(),
1120 family->GetName()).c_str());
1125 int vtkMedReader::IsMeshSelected(vtkMedMesh* mesh)
1127 for(int fam=0; fam<mesh->GetNumberOfPointFamily(); fam++)
1129 if(this->GetFamilyStatus(mesh, mesh->GetPointFamily(fam))!=0)
1133 for(int fam=0; fam<mesh->GetNumberOfCellFamily(); fam++)
1135 if(this->GetFamilyStatus(mesh, mesh->GetCellFamily(fam))!=0)
1141 void vtkMedReader::GatherComputeSteps()
1143 this->Internal->GlobalComputeStep.clear();
1145 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1146 fieldfileit = this->Internal->MedFiles.begin();
1147 while(fieldfileit != this->Internal->MedFiles.end())
1149 vtkMedFile* file = fieldfileit->second;
1152 // first loop over all fields to gather their compute steps
1153 for(int fieldId=0; fieldId<file->GetNumberOfField(); fieldId++)
1155 vtkMedField* field=file->GetField(fieldId);
1157 for(int stepId=0; stepId<field->GetNumberOfFieldStep(); stepId++)
1159 vtkMedFieldStep* step=field->GetFieldStep(stepId);
1160 const vtkMedComputeStep& cs = step->GetComputeStep();
1161 this->Internal->GlobalComputeStep[cs.TimeOrFrequency].insert(cs.IterationIt);
1165 // then loop over all meshes to gather their grid steps too.
1166 // for meshes, do not add the MED_UNDEF_DT time
1167 for(int meshId=0; meshId<file->GetNumberOfMesh(); meshId++)
1169 vtkMedMesh* mesh=file->GetMesh(meshId);
1171 for(int stepId=0; stepId<mesh->GetNumberOfGridStep(); stepId++)
1173 vtkMedGrid* grid=mesh->GetGridStep(stepId);
1174 const vtkMedComputeStep& cs = grid->GetComputeStep();
1175 if(cs.TimeOrFrequency != MED_UNDEF_DT || cs.TimeIt != MED_NO_DT)
1177 this->Internal->GlobalComputeStep[cs.TimeOrFrequency].insert(cs.IterationIt);
1182 if(this->Internal->GlobalComputeStep.size() == 0)
1184 this->Internal->GlobalComputeStep[MED_UNDEF_DT].insert(MED_NO_IT);
1188 int vtkMedReader::IsFieldSelected(vtkMedField* field)
1190 return this->IsPointFieldSelected(field)||this->IsCellFieldSelected(field)
1191 ||this->IsQuadratureFieldSelected(field) || this->IsElnoFieldSelected(field);
1194 int vtkMedReader::IsPointFieldSelected(vtkMedField* field)
1196 return field->GetFieldType()==vtkMedField::PointField
1197 &&this->GetPointFieldArrayStatus(vtkMedUtilities::SimplifyName(
1198 field->GetName()).c_str());
1201 int vtkMedReader::IsCellFieldSelected(vtkMedField* field)
1203 return field->GetFieldType()==vtkMedField::CellField
1204 &&this->GetCellFieldArrayStatus(vtkMedUtilities::SimplifyName(
1205 field->GetName()).c_str());
1208 vtkMedProfile* vtkMedReader::GetProfile(const char* pname)
1210 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1211 fileit = this->Internal->MedFiles.begin();
1212 while(fileit != this->Internal->MedFiles.end())
1214 vtkMedFile* file = fileit->second;
1216 vtkMedProfile* profile = file->GetProfile(pname);
1223 vtkMedLocalization* vtkMedReader::GetLocalization(const char* lname)
1225 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1226 fileit = this->Internal->MedFiles.begin();
1227 while(fileit != this->Internal->MedFiles.end())
1229 vtkMedFile* file = fileit->second;
1231 vtkMedLocalization* loc = file->GetLocalization(lname);
1239 int vtkMedReader::GetLocalizationKey(vtkMedFieldOnProfile* fop)
1241 vtkMedLocalization* def=this->GetLocalization(fop->GetLocalizationName());
1243 // This is not a quadrature field with explicit definition.
1244 // There are two possible cases : either the intergration point is
1245 // at the center of the cell
1246 //1 quadrature point at the cell center
1248 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1249 fileit = this->Internal->MedFiles.begin();
1250 while(fileit != this->Internal->MedFiles.end())
1252 vtkMedFile* file = fileit->second;
1255 if(def && def->GetParentFile() == file)
1256 return nloc + def->GetMedIterator() - 1;
1258 nloc += file->GetNumberOfLocalization();
1262 if(fop->GetNumberOfIntegrationPoint()==1)
1263 return nloc + 1 + fop->GetParentFieldOverEntity()->GetEntity().GeometryType;
1265 // or it is an elno field (field stored on nodes of the cells,
1266 // but with discontinuities at the vertices)
1267 return -fop->GetParentFieldOverEntity()->GetEntity().GeometryType;//ELNO
1270 int vtkMedReader::IsQuadratureFieldSelected(vtkMedField* field)
1272 return field->GetFieldType()==vtkMedField::QuadratureField
1273 &&this->GetQuadratureFieldArrayStatus(vtkMedUtilities::SimplifyName(
1274 field->GetName()).c_str());
1277 int vtkMedReader::IsElnoFieldSelected(vtkMedField* field)
1279 return field->GetFieldType()==vtkMedField::ElnoField
1280 &&this->GetElnoFieldArrayStatus(vtkMedUtilities::SimplifyName(
1281 field->GetName()).c_str());
1285 // Give the animation steps to the pipeline
1286 void vtkMedReader::AdvertiseTime(vtkInformation* info)
1288 this->ChooseRealAnimationMode();
1290 if(this->Internal->RealAnimationMode==PhysicalTime)
1292 // I advertise the union of all times available
1293 // in all selected fields and meshes
1294 set<double> timeset;
1296 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1297 fieldfileit = this->Internal->MedFiles.begin();
1298 while(fieldfileit != this->Internal->MedFiles.end())
1300 vtkMedFile* file = fieldfileit->second;
1303 // first loop over all fields to gather their compute steps
1304 for(int fieldId=0; fieldId<file->GetNumberOfField(); fieldId++)
1306 vtkMedField* field=file->GetField(fieldId);
1308 if(!this->IsFieldSelected(field))
1311 field->GatherFieldTimes(timeset);
1314 // then loop over all meshes to gather their grid steps too.
1315 for(int meshId=0; meshId<file->GetNumberOfMesh(); meshId++)
1317 vtkMedMesh* mesh=file->GetMesh(meshId);
1319 if(!this->IsMeshSelected(mesh))
1322 mesh->GatherGridTimes(timeset);
1326 if(timeset.size() > 0)
1328 // remove MED_UNDEF_DT if there are other time step
1329 if(timeset.size() > 1)
1330 timeset.erase(MED_UNDEF_DT);
1332 vector<double> times;
1333 set<double>::iterator it = timeset.begin();
1334 while(it != timeset.end())
1336 times.push_back(*it);
1339 sort(times.begin(), times.end());
1341 info->Set(vtkStreamingDemandDrivenPipeline::TIME_STEPS(), ×[0],
1343 double timeRange[2];
1344 timeRange[0]=times[0];
1345 timeRange[1]=times[times.size()-1];
1346 info->Set(vtkStreamingDemandDrivenPipeline::TIME_RANGE(), &timeRange[0],
1351 info->Remove(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
1352 info->Remove(vtkStreamingDemandDrivenPipeline::TIME_RANGE());
1355 else if(this->Internal->RealAnimationMode==Iteration)
1357 // I advertise the union of all iterations available at the given
1358 // Time for all selected fields.
1359 set<med_int> iterationsets;
1360 med_float time = MED_UNDEF_DT;
1361 if(this->TimeIndexForIterations >= 0 &&
1362 this->TimeIndexForIterations <
1363 this->AvailableTimes->GetNumberOfTuples())
1365 time = this->AvailableTimes->
1366 GetValue((vtkIdType)this->TimeIndexForIterations);
1369 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1370 fieldfileit = this->Internal->MedFiles.begin();
1371 while(fieldfileit != this->Internal->MedFiles.end())
1373 vtkMedFile* file = fieldfileit->second;
1376 for(int fieldId=0; fieldId<file->GetNumberOfField(); fieldId++)
1378 vtkMedField* field=file->GetField(fieldId);
1379 if(!this->IsFieldSelected(field))
1382 field->GatherFieldIterations(time, iterationsets);
1384 // then loop over all meshes to gather their grid steps too.
1385 for(int meshId=0; meshId<file->GetNumberOfMesh(); meshId++)
1387 vtkMedMesh* mesh=file->GetMesh(meshId);
1389 if(!this->IsMeshSelected(mesh))
1392 mesh->GatherGridIterations(time, iterationsets);
1396 if(iterationsets.size()>0)
1398 // remove MED_NO_IT if there are other available iterations.
1399 if(iterationsets.size()>1)
1400 iterationsets.erase(MED_NO_IT);
1402 vector<double> iterations;
1403 set<med_int>::iterator it=iterationsets.begin();
1404 while(it!=iterationsets.end())
1406 iterations.push_back((double)*it);
1409 sort(iterations.begin(), iterations.end());
1410 info->Set(vtkStreamingDemandDrivenPipeline::TIME_STEPS(), &iterations[0],
1412 double timeRange[2];
1413 timeRange[0]=iterations[0];
1414 timeRange[1]=iterations[iterations.size()-1];
1415 info->Set(vtkStreamingDemandDrivenPipeline::TIME_RANGE(), &timeRange[0],
1420 info->Remove(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
1421 info->Remove(vtkStreamingDemandDrivenPipeline::TIME_RANGE());
1426 info->Remove(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
1427 info->Remove(vtkStreamingDemandDrivenPipeline::TIME_RANGE());
1431 vtkIdType vtkMedReader::GetFrequencyIndex(double freq)
1433 return this->AvailableTimes->LookupValue(freq);
1436 int vtkMedReader::RequestDataObject(vtkInformation* request,
1437 vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector)
1439 vtkInformation *info = outputVector->GetInformationObject(0);
1440 if (vtkMultiBlockDataSet::SafeDownCast(
1441 info->Get(vtkDataObject::DATA_OBJECT())))
1443 // The output is already created
1448 vtkMultiBlockDataSet* output=vtkMultiBlockDataSet::New();
1449 this->GetExecutive()->SetOutputData(0, output);
1451 this->GetOutputPortInformation(0)->Set(vtkDataObject::DATA_EXTENT_TYPE(),
1452 output->GetExtentType());
1457 void vtkMedReader::ClearSelections()
1459 this->PointFields->Initialize();
1460 this->CellFields->Initialize();
1461 this->QuadratureFields->Initialize();
1462 this->ElnoFields->Initialize();
1464 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1465 fieldfileit = this->Internal->MedFiles.begin();
1466 while(fieldfileit != this->Internal->MedFiles.end())
1468 vtkMedFile* file = fieldfileit->second;
1471 for(int index=0; index < file->GetNumberOfField(); index++)
1473 vtkMedField* field = file->GetField(index);
1474 switch(field->GetFieldType())
1476 case vtkMedField::PointField :
1477 this->PointFields->AddKey(vtkMedUtilities::SimplifyName(
1478 field->GetName()).c_str());
1480 case vtkMedField::CellField :
1481 this->CellFields->AddKey(vtkMedUtilities::SimplifyName(
1482 field->GetName()).c_str());
1484 case vtkMedField::QuadratureField :
1485 this->QuadratureFields->AddKey(vtkMedUtilities::SimplifyName(
1486 field->GetName()).c_str());
1488 case vtkMedField::ElnoField :
1489 this->ElnoFields->AddKey(vtkMedUtilities::SimplifyName(
1490 field->GetName()).c_str());
1495 this->Internal->Families->Initialize();
1496 this->Groups->Initialize();
1497 for(int meshIndex=0; meshIndex < file->GetNumberOfMesh(); meshIndex++)
1499 vtkMedMesh* mesh = file->GetMesh(meshIndex);
1500 for(int famIndex=0; famIndex<mesh->GetNumberOfPointFamily(); famIndex++)
1502 vtkMedFamily* fam=mesh->GetPointFamily(famIndex);
1504 int ng=fam->GetNumberOfGroup();
1505 for(int gindex=0; gindex<ng; gindex++)
1507 vtkMedGroup* group=fam->GetGroup(gindex);
1508 string gname=vtkMedUtilities::GroupKey(mesh->GetName(),
1509 fam->GetPointOrCell(), group->GetName());
1511 this->Groups->AddKey(gname.c_str());
1512 this->Groups->SetKeyStatus(gname.c_str(), 0);
1515 for(int famIndex=0; famIndex<mesh->GetNumberOfCellFamily(); famIndex++)
1517 vtkMedFamily* fam=mesh->GetCellFamily(famIndex);
1519 int ng=fam->GetNumberOfGroup();
1520 for(int gindex=0; gindex<ng; gindex++)
1522 vtkMedGroup* group=fam->GetGroup(gindex);
1523 string gname=vtkMedUtilities::GroupKey(mesh->GetName(),
1524 fam->GetPointOrCell(), group->GetName());
1526 this->Groups->AddKey(gname.c_str());
1527 this->Groups->SetKeyStatus(gname.c_str(), 1);
1531 this->Internal->GroupSelectionMTime.Modified();
1533 for(int meshIndex=0; meshIndex< file->GetNumberOfMesh(); meshIndex++)
1535 if(file->GetMesh(meshIndex)->GetNumberOfGridStep() == 0)
1538 vtkMedGrid* grid=file->GetMesh(meshIndex)->GetGridStep(0);
1540 for(int entityIndex=0; entityIndex<grid->GetNumberOfEntityArray();
1543 vtkMedEntityArray* array=grid->GetEntityArray(entityIndex);
1544 string name=vtkMedUtilities::EntityKey(array->GetEntity());
1545 this->Entities->AddKey(name.c_str());
1552 void vtkMedReader::SelectFamiliesFromGroups()
1554 this->Internal->Families->Initialize();
1556 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1557 meshfileit = this->Internal->MedFiles.begin();
1558 while(meshfileit != this->Internal->MedFiles.end())
1560 vtkMedFile* file = meshfileit->second;
1563 for(int meshIndex=0; meshIndex < file->GetNumberOfMesh(); meshIndex++)
1565 vtkMedMesh* mesh = file->GetMesh(meshIndex);
1566 for(int famIndex=0; famIndex<mesh->GetNumberOfFamily(); famIndex++)
1568 vtkMedFamily* fam=mesh->GetFamily(famIndex);
1569 string name=vtkMedUtilities::FamilyKey(mesh->GetName(),
1570 fam->GetPointOrCell(), fam->GetName());
1572 this->Internal->Families->SetKeyStatus(name.c_str(), 0);
1574 for(int gindex=0; gindex<fam->GetNumberOfGroup(); gindex++)
1576 vtkMedGroup* group=fam->GetGroup(gindex);
1577 string gname=vtkMedUtilities::GroupKey(mesh->GetName(),
1578 fam->GetPointOrCell(), group->GetName());
1579 int state=this->Groups->GetKeyStatus(gname.c_str());
1583 this->SetFamilyStatus(name.c_str(), 1);
1590 this->Internal->FamilySelectionMTime.Modified();
1593 int vtkMedReader::GetNumberOfPointFieldArrays()
1595 return this->PointFields->GetNumberOfKey();
1599 vtkMedReader::GetPointFieldArrayName(int index)
1601 return this->PointFields->GetKey(index);
1604 int vtkMedReader::GetPointFieldArrayStatus(const char* name)
1606 return this->PointFields->GetKeyStatus(name);
1609 void vtkMedReader::SetPointFieldArrayStatus(const char* name, int status)
1611 if(this->PointFields->KeyExists(name)&&this->PointFields->GetKeyStatus(
1615 this->PointFields->SetKeyStatus(name, status);
1620 int vtkMedReader::GetNumberOfCellFieldArrays()
1622 return this->CellFields->GetNumberOfKey();
1626 vtkMedReader::GetCellFieldArrayName(int index)
1628 return this->CellFields->GetKey(index);
1631 int vtkMedReader::GetCellFieldArrayStatus(const char* name)
1633 return this->CellFields->GetKeyStatus(name);
1636 void vtkMedReader::SetCellFieldArrayStatus(const char* name, int status)
1638 if(this->CellFields->KeyExists(name)&&this->CellFields->GetKeyStatus(
1642 this->CellFields->SetKeyStatus(name, status);
1647 int vtkMedReader::GetNumberOfQuadratureFieldArrays()
1649 return this->QuadratureFields->GetNumberOfKey();
1652 const char* vtkMedReader::GetQuadratureFieldArrayName(int index)
1654 return this->QuadratureFields->GetKey(index);
1657 int vtkMedReader::GetQuadratureFieldArrayStatus(const char* name)
1659 return this->QuadratureFields->GetKeyStatus(name);
1662 void vtkMedReader::SetQuadratureFieldArrayStatus(const char* name, int status)
1664 if(this->QuadratureFields->KeyExists(name)
1665 &&this->QuadratureFields->GetKeyStatus(name)==status)
1668 this->QuadratureFields->SetKeyStatus(name, status);
1673 int vtkMedReader::GetNumberOfElnoFieldArrays()
1675 return this->ElnoFields->GetNumberOfKey();
1678 const char* vtkMedReader::GetElnoFieldArrayName(int index)
1680 return this->ElnoFields->GetKey(index);
1683 int vtkMedReader::GetElnoFieldArrayStatus(const char* name)
1685 return this->ElnoFields->GetKeyStatus(name);
1688 void vtkMedReader::SetElnoFieldArrayStatus(const char* name, int status)
1690 if(this->ElnoFields->KeyExists(name)
1691 &&this->ElnoFields->GetKeyStatus(name)==status)
1694 this->ElnoFields->SetKeyStatus(name, status);
1699 void vtkMedReader::SetEntityStatus(const char* name, int status)
1701 if(this->Entities->KeyExists(name)&&this->Entities->GetKeyStatus(name)
1705 this->Entities->SetKeyStatus(name, status);
1710 void vtkMedReader::SetFamilyStatus(const char* name, int status)
1712 if(this->Internal->Families->KeyExists(name)
1713 &&this->Internal->Families->GetKeyStatus(name)==status)
1716 this->Internal->Families->SetKeyStatus(name, status);
1719 void vtkMedReader::SetGroupStatus(const char* name, int status)
1722 if(this->Groups->KeyExists(name)&&this->Groups->GetKeyStatus(name)
1726 this->Groups->SetKeyStatus(name, status);
1730 this->Internal->GroupSelectionMTime.Modified();
1733 int vtkMedReader::GetGroupStatus(const char* key)
1735 return this->Groups->GetKeyStatus(key);
1738 void vtkMedReader::AddQuadratureSchemeDefinition(vtkInformation* info,
1739 vtkMedLocalization* loc)
1741 if(info==NULL||loc==NULL)
1744 vtkInformationQuadratureSchemeDefinitionVectorKey *key=
1745 vtkQuadratureSchemeDefinition::DICTIONARY();
1747 vtkQuadratureSchemeDefinition* def=vtkQuadratureSchemeDefinition::New();
1748 int cellType=vtkMedUtilities::GetVTKCellType(loc->GetGeometryType());
1749 // Control to avoid crahs when loading a file with structural elements.
1750 // This should be removed in version 7.1.0 of SALOME.
1751 // See mantis issue 21990
1752 if(loc->GetGeometryType() >= MED_STRUCT_GEO_INTERNAL)
1754 vtkErrorMacro("You are loading a file containing structural elements BUT they are still not supported");
1757 if(loc->GetWeights()->GetVoidPointer(0) == NULL)
1759 def->Initialize(cellType, vtkMedUtilities::GetNumberOfPoint(
1760 loc->GetGeometryType()), loc->GetNumberOfQuadraturePoint(),
1761 (double*)loc->GetShapeFunction()->GetVoidPointer(0),
1762 (double*)loc->GetWeights()->GetVoidPointer(0));
1763 key->Set(info, def, cellType);
1768 void vtkMedReader::LoadConnectivity(vtkMedEntityArray* array)
1770 vtkMedGrid* grid = array->GetParentGrid();
1771 array->LoadConnectivity();
1772 if (array->GetConnectivity()==MED_NODAL||vtkMedUtilities::GetDimension(
1773 array->GetEntity().GeometryType)<2
1774 || grid->GetParentMesh()->GetMeshType() == MED_STRUCTURED_MESH)
1777 vtkMedEntity subentity;
1778 subentity.EntityType = vtkMedUtilities::GetSubType(array->GetEntity().EntityType);
1780 vtkMedUnstructuredGrid* ugrid = vtkMedUnstructuredGrid::SafeDownCast(grid);
1784 for(int index=0; index<vtkMedUtilities::GetNumberOfSubEntity(
1785 array->GetEntity().GeometryType); index++)
1787 subentity.GeometryType = vtkMedUtilities::GetSubGeometry(
1788 array->GetEntity().GeometryType, index);
1789 vtkMedEntityArray* subarray=ugrid->GetEntityArray(subentity);
1793 vtkErrorMacro("DESC connectivity used, but sub types do not exist in file.");
1796 subarray->LoadConnectivity();
1800 vtkDataSet* vtkMedReader::CreateUnstructuredGridForPointSupport(
1801 vtkMedFamilyOnEntityOnProfile* foep)
1803 vtkUnstructuredGrid* vtkgrid = vtkUnstructuredGrid::New();
1804 foep->ComputeIntersection(NULL);
1805 vtkMedFamilyOnEntity* foe = foep->GetFamilyOnEntity();
1806 vtkMedGrid* medgrid=foe->GetParentGrid();
1807 vtkMedUnstructuredGrid* medugrid=vtkMedUnstructuredGrid::SafeDownCast(
1809 vtkMedCurvilinearGrid* medcgrid=vtkMedCurvilinearGrid::SafeDownCast(
1812 medgrid->LoadCoordinates();
1814 vtkIdType npts=medgrid->GetNumberOfPoints();
1816 bool shallowCopy= (medugrid != NULL || medcgrid!=NULL);
1817 if(medgrid->GetParentMesh()->GetSpaceDimension()!=3)
1823 shallowCopy = foep->CanShallowCopyPointField(NULL);
1826 vtkDataArray* coords = NULL;
1828 if(medugrid != NULL)
1829 coords = medugrid->GetCoordinates();
1830 if(medcgrid != NULL)
1831 coords = medcgrid->GetCoordinates();
1834 vtkIdType numberOfPoints;
1835 vtkPoints* points=vtkPoints::New(coords->GetDataType());
1836 vtkgrid->SetPoints(points);
1839 vtkIdTypeArray* pointGlobalIds=vtkIdTypeArray::New();
1840 pointGlobalIds->SetName("MED_POINT_ID");
1841 pointGlobalIds->SetNumberOfComponents(1);
1842 vtkgrid->GetPointData()->SetGlobalIds(pointGlobalIds);
1843 pointGlobalIds->Delete();
1847 vtkgrid->GetPoints()->SetData(coords);
1848 numberOfPoints=npts;
1850 pointGlobalIds->SetNumberOfTuples(numberOfPoints);
1851 vtkIdType* ptr=pointGlobalIds->GetPointer(0);
1852 for(int pid=0; pid<numberOfPoints; pid++)
1857 vtkIdType currentIndex=0;
1859 for(vtkIdType index=0; index<medgrid->GetNumberOfPoints(); index++)
1861 if (!foep->KeepPoint(index))
1866 double coord[3]={0.0, 0.0, 0.0};
1867 double * tuple=medgrid->GetCoordTuple(index);
1868 for(int dim=0; dim<medgrid->GetParentMesh()->GetSpaceDimension()&&dim<3; dim++)
1870 coord[dim]=tuple[dim];
1872 vtkgrid->GetPoints()->InsertPoint(currentIndex, coord);
1873 pointGlobalIds->InsertNextValue(index+1);
1876 vtkgrid->GetPoints()->Squeeze();
1877 pointGlobalIds->Squeeze();
1878 numberOfPoints=currentIndex;
1881 // now create the VTK_VERTEX cells
1882 for(vtkIdType id=0; id<numberOfPoints; id++)
1884 vtkgrid->InsertNextCell(VTK_VERTEX, 1, &id);
1888 // in this particular case, the global ids of the cells is the same as the global ids of the points.
1889 vtkgrid->GetCellData()->SetGlobalIds(vtkgrid->GetPointData()->GetGlobalIds());
1894 vtkMedGrid* vtkMedReader::FindGridStep(vtkMedMesh* mesh)
1896 if(this->Internal->RealAnimationMode == vtkMedReader::PhysicalTime)
1898 vtkMedComputeStep cs;
1899 cs.TimeOrFrequency = this->Internal->UpdateTimeStep;
1900 return mesh->FindGridStep(cs, vtkMedReader::PhysicalTime);
1902 else if(this->Internal->RealAnimationMode == vtkMedReader::Modes)
1904 vtkMedComputeStep cs;
1905 cs.IterationIt = MED_NO_IT;
1906 cs.TimeIt = MED_NO_DT;
1907 cs.TimeOrFrequency = MED_NO_DT;
1908 return mesh->FindGridStep(cs, vtkMedReader::Modes);
1912 vtkMedComputeStep cs;
1913 // the time is set by choosing its index in the global
1914 // array giving the available times : this->TimeIndexForIterations
1915 cs.TimeOrFrequency = (med_int)this->AvailableTimes->GetValue(
1916 (vtkIdType)this->TimeIndexForIterations);
1917 // the iteration is asked by the pipeline
1918 cs.IterationIt = (med_int)this->Internal->UpdateTimeStep;
1919 return mesh->FindGridStep(cs, vtkMedReader::Iteration);
1924 void vtkMedReader::CreateMedSupports()
1926 this->Internal->UsedSupports.clear();
1928 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1929 meshfileit = this->Internal->MedFiles.begin();
1930 while(meshfileit != this->Internal->MedFiles.end())
1932 vtkMedFile* file = meshfileit->second;
1935 for(int meshIndex=0; meshIndex<file->GetNumberOfMesh(); meshIndex++)
1937 vtkMedMesh* mesh = file->GetMesh(meshIndex);
1938 vtkMedGrid* grid = this->FindGridStep(mesh);
1942 for(int entityIndex=0; entityIndex<grid->GetNumberOfEntityArray();
1945 vtkMedEntityArray* array=grid->GetEntityArray(entityIndex);
1946 if(this->GetEntityStatus(array->GetEntity())==0)
1951 file->GetMedDriver()->LoadFamilyIds(array);
1952 for(int foeIndex=0; foeIndex<array->GetNumberOfFamilyOnEntity();
1955 vtkMedFamilyOnEntity* foe=array->GetFamilyOnEntity(foeIndex);
1956 vtkMedFamily* family=foe->GetFamily();
1957 if(this->GetFamilyStatus(mesh, family)==0)
1960 // now, I look over all non-point fields to see which profiles
1961 // have to be used on points.
1962 bool selectedSupport = false;
1964 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
1965 fieldfileit = this->Internal->MedFiles.begin();
1966 while(fieldfileit != this->Internal->MedFiles.end())
1968 vtkMedFile* fieldfile = fieldfileit->second;
1971 for(int fieldId=0; fieldId<fieldfile->GetNumberOfField(); fieldId++)
1973 vtkMedField* field=fieldfile->GetField(fieldId);
1975 if (!this->IsFieldSelected(field))
1978 vtkMedListOfFieldSteps steps;
1980 this->GatherFieldSteps(field, steps);
1982 vtkMedListOfFieldSteps::iterator it=steps.begin();
1983 while(it!=steps.end())
1985 vtkMedFieldStep *step = *it;
1986 step->LoadInformation();
1989 for(int eid=0; eid<step->GetNumberOfFieldOverEntity(); eid++)
1991 vtkMedFieldOverEntity* fieldOverEntity =
1992 step->GetFieldOverEntity(eid);
1994 for(int pid = 0; pid < fieldOverEntity->GetNumberOfFieldOnProfile(); pid++)
1996 vtkMedFieldOnProfile* fop =
1997 fieldOverEntity->GetFieldOnProfile(pid);
1998 vtkMedProfile* prof = fop->GetProfile();
1999 vtkMedFamilyOnEntityOnProfile* foep =
2000 foe->GetFamilyOnEntityOnProfile(prof);
2003 this->Internal->UsedSupports.insert(foep);
2004 selectedSupport = true;
2011 // If no field use this family on entity, I nevertheless create the
2012 // support, with an empty profile.
2013 if(!selectedSupport)
2015 vtkMedFamilyOnEntityOnProfile* foep =
2016 foe->GetFamilyOnEntityOnProfile((vtkMedProfile*)NULL);
2019 foep = vtkMedFamilyOnEntityOnProfile::New();
2020 foep->SetFamilyOnEntity(foe);
2021 foep->SetProfile(NULL);
2022 foe->AddFamilyOnEntityOnProfile(foep);
2025 this->Internal->UsedSupports.insert(foep);
2033 bool vtkMedReader::BuildVTKSupport(
2034 vtkMedFamilyOnEntityOnProfile* foep,
2038 vtkMedFamilyOnEntity* foe = foep->GetFamilyOnEntity();
2041 vtkMultiProcessController* controller = vtkMultiProcessController::GetGlobalController();
2042 if (controller != NULL)
2044 numProc = controller->GetNumberOfProcesses();
2047 if ((foep->GetValid() == 0) && numProc == 1)
2052 vtkMedGrid* grid=foe->GetParentGrid();
2054 vtkMedEntityArray* array=foe->GetEntityArray();
2055 vtkMedMesh* mesh=grid->GetParentMesh();
2056 vtkSmartPointer<vtkStringArray> path = vtkSmartPointer<vtkStringArray>::New();
2057 string meshName=vtkMedUtilities::SimplifyName(mesh->GetName());
2058 path->InsertNextValue(meshName);
2059 std::string finalName;
2061 if(foe->GetPointOrCell()==vtkMedUtilities::OnPoint)
2063 path->InsertNextValue(vtkMedUtilities::OnPointName);
2064 finalName=vtkMedUtilities::SimplifyName(foe->GetFamily()->GetName());
2068 path->InsertNextValue(vtkMedUtilities::OnCellName);
2069 path->InsertNextValue(vtkMedUtilities::SimplifyName(foe->GetFamily()->GetName()));
2070 finalName=vtkMedUtilities::EntityKey(array->GetEntity());
2073 if(foep->GetProfile() != NULL)
2075 path->InsertNextValue(finalName);
2076 finalName = foep->GetProfile()->GetName();
2079 ostringstream progressBarTxt;
2080 for(int depth=0; depth<path->GetNumberOfValues(); depth++)
2082 progressBarTxt<<path->GetValue(depth)<<" ";
2084 progressBarTxt<<finalName;
2085 SetProgressText(progressBarTxt.str().c_str());
2087 vtkDataSet* cachedDataSet = NULL;
2088 if(this->Internal->DataSetCache.find(foep)!=this->Internal->DataSetCache.end())
2090 cachedDataSet = this->Internal->DataSetCache[foep];
2094 vtkDataSet* dataset = NULL;
2097 if(foe->GetPointOrCell()==vtkMedUtilities::OnPoint)
2099 dataset = this->CreateUnstructuredGridForPointSupport(foep);
2103 dataset = foep->GetFamilyOnEntity()->GetParentGrid()->
2104 CreateVTKDataSet(foep);
2113 this->Internal->DataSetCache[foep]=dataset;
2114 cachedDataSet = dataset;
2119 vtkMultiBlockDataSet* root=vtkMedUtilities::GetParent(this->GetOutput(), path);
2120 int nb=root->GetNumberOfBlocks();
2122 if(cachedDataSet != NULL)
2124 vtkDataSet* realDataSet=cachedDataSet->NewInstance();
2125 root->SetBlock(nb, realDataSet);
2126 realDataSet->Delete();
2128 root->GetMetaData(nb)->Set(vtkCompositeDataSet::NAME(), finalName.c_str());
2129 realDataSet->ShallowCopy(cachedDataSet);
2131 this->Internal->DataSetCache[foep]=cachedDataSet;
2132 this->Internal->CurrentDataSet[foep]=realDataSet;
2134 path->InsertNextValue(finalName);
2135 path->SetName("BLOCK_NAME");
2136 realDataSet->GetFieldData()->AddArray(path);
2137 realDataSet->GetInformation()->Remove(vtkMedUtilities::BLOCK_NAME());
2138 for(int depth=0; depth<path->GetNumberOfValues(); depth++)
2140 realDataSet->GetInformation()->Set(vtkMedUtilities::BLOCK_NAME(),
2141 path->GetValue(depth), depth);
2146 void vtkMedReader::MapFieldOnSupport(vtkMedFieldOnProfile* fop,
2147 vtkMedFamilyOnEntityOnProfile* foep,
2150 bool cached = false;
2152 if(this->Internal->FieldCache.find(foep)
2153 !=this->Internal->FieldCache.end())
2155 map<vtkMedFieldOnProfile*, VTKField>& fieldCache =
2156 this->Internal->FieldCache[foep];
2157 if(fieldCache.find(fop)!=fieldCache.end())
2165 this->CreateVTKFieldOnSupport(fop, foep, doCreateField);
2167 this->SetVTKFieldOnSupport(fop, foep);
2170 void vtkMedReader::MapFieldsOnSupport(vtkMedFamilyOnEntityOnProfile* foep,
2173 // now loop over all fields to map it to the created grids
2174 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
2175 fieldfileit = this->Internal->MedFiles.begin();
2176 while(fieldfileit != this->Internal->MedFiles.end())
2178 vtkMedFile* file = fieldfileit->second;
2181 for(int fieldId=0; fieldId<file->GetNumberOfField(); fieldId++)
2183 vtkMedField* field=file->GetField(fieldId);
2185 if(strcmp(foep->GetFamilyOnEntity()->
2186 GetParentGrid()->GetParentMesh()->GetName(),
2187 field->GetMeshName()) != 0)
2190 if(strcmp(foep->GetFamilyOnEntity()->
2191 GetParentGrid()->GetParentMesh()->GetName(),
2192 field->GetMeshName()) != 0)
2195 if (!this->IsFieldSelected(field))
2198 vtkMedListOfFieldSteps steps;
2200 this->GatherFieldSteps(field, steps);
2202 vtkMedListOfFieldSteps::iterator it=steps.begin();
2203 while(it!=steps.end())
2205 vtkMedFieldStep *step = *it;
2206 step->LoadInformation();
2209 for(int eid=0; eid<step->GetNumberOfFieldOverEntity(); eid++)
2211 vtkMedFieldOverEntity* fieldOverEntity = step->GetFieldOverEntity(eid);
2212 for(int pid = 0; pid < fieldOverEntity->GetNumberOfFieldOnProfile(); pid++)
2214 vtkMedFieldOnProfile* fop = fieldOverEntity->GetFieldOnProfile(pid);
2215 if(foep->CanMapField(fop))
2217 this->MapFieldOnSupport(fop, foep, doCreateField);
2226 void vtkMedReader::GatherFieldSteps(vtkMedField* field,
2227 vtkMedListOfFieldSteps& steps)
2229 if(this->Internal->RealAnimationMode == vtkMedReader::PhysicalTime)
2231 vtkMedComputeStep cs;
2232 cs.TimeOrFrequency = this->Internal->UpdateTimeStep;
2233 vtkMedFieldStep* fs =
2234 field->FindFieldStep(cs, vtkMedReader::PhysicalTime);
2236 steps.push_back(fs);
2238 else if(this->Internal->RealAnimationMode == vtkMedReader::Iteration)
2240 vtkMedComputeStep cs;
2241 cs.IterationIt = (med_int)this->Internal->UpdateTimeStep;
2242 cs.TimeOrFrequency = (med_int)this->AvailableTimes->GetValue(
2243 (vtkIdType)this->TimeIndexForIterations);
2244 vtkMedFieldStep* fs =
2245 field->FindFieldStep(cs, vtkMedReader::Iteration);
2247 steps.push_back(fs);
2251 for(int modeid = 0; modeid < this->Frequencies->GetNumberOfKey(); modeid++)
2253 if(this->Frequencies->GetKeyStatus(
2254 this->Frequencies->GetKey(modeid)) == 0)
2259 vtkMedComputeStep cs;
2260 cs.TimeOrFrequency = this->AvailableTimes->GetValue(modeid);
2261 vtkMedFieldStep* fs =
2262 field->FindFieldStep(cs, vtkMedReader::PhysicalTime);
2264 steps.push_back(fs);
2269 void vtkMedReader::SetVTKFieldOnSupport(vtkMedFieldOnProfile* fop,
2270 vtkMedFamilyOnEntityOnProfile* foep)
2272 vtkMedFamilyOnEntity* foe = foep->GetFamilyOnEntity();
2273 vtkMedFieldOverEntity* fieldOverEntity = fop->GetParentFieldOverEntity();
2274 vtkMedFieldStep* step = fieldOverEntity->GetParentStep();
2275 vtkMedField* field = step->GetParentField();
2277 const vtkMedComputeStep& cs = step->GetComputeStep();
2279 vtkDataSet* ds=this->Internal->CurrentDataSet[foep];
2282 // ds == NULL could arrive is some cases when working in parallel
2283 vtkWarningMacro( "--- vtkMedReader::SetVTKFieldOnSupport: ds is NULL !!");
2287 VTKField& vtkfield=this->Internal->FieldCache[foep][fop];
2289 std::string name=vtkMedUtilities::SimplifyName(field->GetName());
2290 std::string vectorname = name+"_Vector";
2291 if(this->AnimationMode==Modes)
2293 double freq = cs.TimeOrFrequency;
2294 int index = this->GetFrequencyIndex(freq);
2295 name += string(" ") + vtkMedUtilities::GetModeKey(index, freq,
2296 this->AvailableTimes->GetNumberOfTuples()-1);
2297 vectorname += string(" ") + vtkMedUtilities::GetModeKey(index, freq,
2298 this->AvailableTimes->GetNumberOfTuples()-1);
2301 vtkfield.DataArray->SetName(name.c_str());
2302 vtkfield.DataArray->Squeeze();
2303 if(vtkfield.Vectors != NULL)
2305 vtkfield.Vectors->SetName(vectorname.c_str());
2306 vtkfield.Vectors->Squeeze();
2308 if(vtkfield.QuadratureIndexArray!=NULL)
2310 vtkfield.QuadratureIndexArray->Squeeze();
2313 if(foe->GetPointOrCell()==vtkMedUtilities::OnCell)
2315 if(field->GetFieldType()==vtkMedField::PointField)
2317 if(vtkfield.DataArray->GetNumberOfTuples()!=ds->GetNumberOfPoints())
2319 vtkDebugMacro("the data array " << vtkfield.DataArray->GetName()
2320 << " do not have the good number of tuples");
2323 ds->GetPointData()->AddArray(vtkfield.DataArray);
2324 if(vtkfield.Vectors != NULL && this->GenerateVectors)
2326 ds->GetPointData()->AddArray(vtkfield.Vectors);
2327 ds->GetPointData()->SetActiveVectors(vtkfield.Vectors->GetName());
2329 switch (vtkfield.DataArray->GetNumberOfComponents())
2332 ds->GetPointData()->SetActiveScalars(vtkfield.DataArray->GetName());
2335 ds->GetPointData()->SetActiveVectors(vtkfield.DataArray->GetName());
2338 // if the data set is only composed of VTK_VERTEX cells,
2339 // and no field called with the same name exist on cells,
2340 // map this field to cells too
2341 if(foe->GetVertexOnly()==1 && ds->GetCellData()->GetArray(
2342 vtkfield.DataArray->GetName())==NULL)
2344 ds->GetCellData()->AddArray(vtkfield.DataArray);
2345 if(vtkfield.Vectors != NULL && this->GenerateVectors)
2347 ds->GetCellData()->AddArray(vtkfield.Vectors);
2348 ds->GetCellData()->SetActiveVectors(vtkfield.Vectors->GetName());
2350 switch (vtkfield.DataArray->GetNumberOfComponents())
2353 ds->GetCellData()->SetActiveScalars(vtkfield.DataArray->GetName());
2356 ds->GetCellData()->SetActiveVectors(vtkfield.DataArray->GetName());
2361 if(field->GetFieldType()==vtkMedField::CellField)
2363 if((this->Internal->NumberOfPieces == 1) && vtkfield.DataArray->GetNumberOfTuples()!=ds->GetNumberOfCells() )
2365 vtkDebugMacro("the data array " << vtkfield.DataArray->GetName()
2366 << " do not have the good number of tuples"
2367 << " ncell=" << ds->GetNumberOfCells()
2368 << " ntuple=" << vtkfield.DataArray->GetNumberOfTuples());
2371 // In case we are in parallel and our process does not contain the data
2372 if(ds->GetNumberOfCells()==0)
2376 ds->GetCellData()->AddArray(vtkfield.DataArray);
2378 if(vtkfield.Vectors != NULL && this->GenerateVectors)
2380 ds->GetCellData()->AddArray(vtkfield.Vectors);
2381 ds->GetCellData()->SetActiveVectors(vtkfield.Vectors->GetName());
2383 switch (vtkfield.DataArray->GetNumberOfComponents())
2386 ds->GetCellData()->SetActiveScalars(vtkfield.DataArray->GetName());
2389 ds->GetCellData()->SetActiveVectors(vtkfield.DataArray->GetName());
2392 // if the data set is only composed of VTK_VERTEX cells,
2393 // and no field called with the same name exist on points,
2394 // map this field to points too
2395 if(foe->GetVertexOnly()==1 && ds->GetPointData()->GetArray(
2396 vtkfield.DataArray->GetName())==NULL)
2398 ds->GetPointData()->AddArray(vtkfield.DataArray);
2399 if(vtkfield.Vectors != NULL && this->GenerateVectors)
2401 ds->GetPointData()->AddArray(vtkfield.Vectors);
2402 ds->GetPointData()->SetActiveVectors(vtkfield.Vectors->GetName());
2404 switch (vtkfield.DataArray->GetNumberOfComponents())
2407 ds->GetPointData()->SetActiveScalars(vtkfield.DataArray->GetName());
2410 ds->GetPointData()->SetActiveVectors(vtkfield.DataArray->GetName());
2415 if(field->GetFieldType()==vtkMedField::QuadratureField ||
2416 field->GetFieldType()==vtkMedField::ElnoField )
2418 vtkIdType ncells=ds->GetNumberOfCells();
2419 vtkIdType nid=vtkfield.QuadratureIndexArray->GetNumberOfTuples();
2420 vtkIdType nda=vtkfield.DataArray->GetNumberOfTuples();
2421 if((nid!=ncells) && (this->Internal->NumberOfPieces == 1))
2424 "There should be as many quadrature index values as there are cells");
2431 vtkfield.DataArray->SetNumberOfTuples( 0 );
2432 vtkfield.DataArray->Squeeze();
2434 if (nid>ncells) // PROBABLY NOT NECESSARY
2436 vtkfield.QuadratureIndexArray->SetNumberOfTuples(ncells);
2437 int nquad=fop->GetNumberOfIntegrationPoint();
2438 vtkfield.DataArray->SetNumberOfTuples( nquad * ds->GetNumberOfCells() );
2439 vtkfield.DataArray->Squeeze();
2441 ds->GetFieldData()->AddArray(vtkfield.DataArray);
2442 ds->GetCellData()->AddArray(vtkfield.QuadratureIndexArray);
2444 nid=vtkfield.QuadratureIndexArray->GetNumberOfTuples();
2445 nda=vtkfield.DataArray->GetNumberOfTuples();
2447 if(vtkfield.Vectors != NULL && this->GenerateVectors)
2449 ds->GetFieldData()->AddArray(vtkfield.Vectors);
2456 if(vtkfield.DataArray->GetNumberOfTuples()!=ds->GetNumberOfPoints())
2458 vtkDebugMacro("the data array " << vtkfield.DataArray->GetName() << " do not have the good number of tuples");
2461 ds->GetPointData()->AddArray(vtkfield.DataArray);
2462 if(vtkfield.Vectors != NULL && this->GenerateVectors)
2464 ds->GetPointData()->AddArray(vtkfield.Vectors);
2465 ds->GetPointData()->SetActiveVectors(vtkfield.Vectors->GetName());
2467 switch (vtkfield.DataArray->GetNumberOfComponents())
2470 ds->GetPointData()->SetActiveScalars(vtkfield.DataArray->GetName());
2473 ds->GetPointData()->SetActiveVectors(vtkfield.DataArray->GetName());
2476 // all the VTK_VERTEX created cells have the same order than the points,
2477 // I can safely map the point array to the cells in this particular case.
2478 ds->GetCellData()->AddArray(vtkfield.DataArray);
2479 if(vtkfield.Vectors != NULL && this->GenerateVectors)
2481 ds->GetCellData()->AddArray(vtkfield.Vectors);
2482 ds->GetCellData()->SetActiveVectors(vtkfield.Vectors->GetName());
2484 switch (vtkfield.DataArray->GetNumberOfComponents())
2487 ds->GetCellData()->SetActiveScalars(vtkfield.DataArray->GetName());
2490 ds->GetCellData()->SetActiveVectors(vtkfield.DataArray->GetName());
2496 void vtkMedReader::InitializeQuadratureOffsets(vtkMedFieldOnProfile* fop,
2497 vtkMedFamilyOnEntityOnProfile* foep)
2499 vtkMedFamilyOnEntity* foe = foep->GetFamilyOnEntity();
2501 vtkMedFieldOverEntity* fieldOverEntity = fop->GetParentFieldOverEntity();
2502 vtkMedFieldStep* step = fieldOverEntity->GetParentStep();
2503 vtkMedField *field= step->GetParentField();
2505 // then I compute the quadrature key if needed, and try to find the quadrature offsets.
2506 if(this->Internal->QuadratureOffsetCache.find(foep)
2507 ==this->Internal->QuadratureOffsetCache.end())
2508 this->Internal->QuadratureOffsetCache[foep]=map<LocalizationKey,
2509 vtkSmartPointer<vtkIdTypeArray> > ();
2511 map<LocalizationKey, vtkSmartPointer<vtkIdTypeArray> >& quadOffsets=
2512 this->Internal->QuadratureOffsetCache[foep];
2514 LocalizationKey quadkey=this->GetLocalizationKey(fop);
2516 if(quadOffsets.find(quadkey)!=quadOffsets.end())
2517 {// the quadrature offset array has already been created
2521 vtkIdTypeArray* qoffsets=vtkIdTypeArray::New();
2522 quadOffsets[quadkey]=qoffsets;
2526 if(field->GetFieldType() == vtkMedField::ElnoField)
2528 qoffsets->GetInformation()->Set(vtkMedUtilities::ELNO(), 1);
2531 else if(field->GetFieldType() == vtkMedField::QuadratureField)
2533 qoffsets->GetInformation()->Set(vtkMedUtilities::ELGA(), 1);
2538 sstr<<"QuadraturePointOffset";
2541 qoffsets->SetName(sstr.str().c_str());
2543 vtkSmartPointer<vtkMedLocalization> loc=
2544 this->GetLocalization(fop->GetLocalizationName());
2548 if(fop->GetNumberOfIntegrationPoint()==1)
2549 {// cell-centered fields can be seen as quadrature fields with 1
2550 // quadrature point at the center
2551 vtkMedLocalization* center=vtkMedLocalization::New();
2554 center->BuildCenter(fieldOverEntity->GetEntity().GeometryType);
2556 else if(loc == NULL && field->GetFieldType() == vtkMedField::ElnoField)
2557 {// ELNO fields have no vtkMedLocalization,
2558 // I need to create a dummy one
2559 vtkMedLocalization* elnodef=vtkMedLocalization::New();
2562 elnodef->BuildELNO(fieldOverEntity->GetEntity().GeometryType);
2566 vtkErrorMacro("Cannot find localization of quadrature field "
2567 << field->GetName());
2570 this->AddQuadratureSchemeDefinition(qoffsets->GetInformation(), loc);
2573 void vtkMedReader::CreateVTKFieldOnSupport(vtkMedFieldOnProfile* fop,
2574 vtkMedFamilyOnEntityOnProfile* foep, int doCreateField)
2576 vtkMedFamilyOnEntity* foe = foep->GetFamilyOnEntity();
2577 vtkMedFieldOverEntity* fieldOverEntity = fop->GetParentFieldOverEntity();
2578 vtkMedFieldStep* step = fieldOverEntity->GetParentStep();
2579 vtkMedField* field = step->GetParentField();
2581 if(vtkMedUnstructuredGrid::SafeDownCast(
2582 foep->GetFamilyOnEntity()->GetParentGrid()) != NULL)
2584 fop->Load(MED_COMPACT_STMODE);
2588 fop->Load(MED_GLOBAL_STMODE);
2591 vtkMedIntArray* profids=NULL;
2593 vtkMedProfile* profile=fop->GetProfile();
2598 profids=profile->GetIds();
2601 VTKField& vtkfield=this->Internal->FieldCache[foep][fop];
2603 bool shallowok = true;
2605 // for structured grid, the values are loaded globally, and cells which are
2606 // not on the profile or not on the family are blanked out.
2607 // shallow copy is therefore always possible
2608 if(vtkMedUnstructuredGrid::SafeDownCast(
2609 foep->GetFamilyOnEntity()->GetParentGrid()) != NULL)
2611 shallowok = foep->CanShallowCopy(fop);
2616 vtkfield.DataArray = fop->GetData();
2620 vtkDataArray* data=vtkMedUtilities::NewArray(field->GetDataType());
2621 vtkfield.DataArray=data;
2623 vtkfield.DataArray->SetNumberOfComponents(field->GetNumberOfComponent());
2626 for(int comp=0; comp<field->GetNumberOfComponent(); comp++)
2628 vtkfield.DataArray->SetComponentName(comp, vtkMedUtilities::SimplifyName(
2629 field->GetComponentName()->GetValue(comp)).c_str());
2632 bool createOffsets=false;
2633 if(field->GetFieldType()==vtkMedField::QuadratureField ||
2634 field->GetFieldType()==vtkMedField::ElnoField )
2636 this->InitializeQuadratureOffsets(fop, foep);
2638 LocalizationKey quadKey = this->GetLocalizationKey(fop);
2639 vtkfield.QuadratureIndexArray
2640 =this->Internal->QuadratureOffsetCache[foep][quadKey];
2641 vtkDataSet* ds = this->Internal->CurrentDataSet[foep];
2643 vtkfield.DataArray->GetInformation()->Set(
2644 vtkQuadratureSchemeDefinition::QUADRATURE_OFFSET_ARRAY_NAME(),
2645 vtkfield.QuadratureIndexArray->GetName());
2646 vtkfield.QuadratureIndexArray->GetInformation()->Set(
2647 vtkAbstractArray::GUI_HIDE(), 1);
2649 if(vtkfield.QuadratureIndexArray->GetNumberOfTuples()
2650 !=ds->GetNumberOfCells())
2652 vtkfield.QuadratureIndexArray->SetNumberOfTuples(0);
2662 // build the quadrature offset array if needed
2666 int nquad=fop->GetNumberOfIntegrationPoint();
2667 noffsets=fop->GetData()->GetNumberOfTuples()/nquad;
2669 vtkDataSet* ds=this->Internal->CurrentDataSet[foep];
2670 if(noffsets!=ds->GetNumberOfCells())
2673 "number of quadrature offsets (" << noffsets << ") must "
2674 << "match the number of cells (" << ds->GetNumberOfCells() << ")!");
2677 vtkfield.QuadratureIndexArray->SetNumberOfTuples(noffsets);
2678 for(vtkIdType id=0; id<noffsets; id++)
2680 vtkfield.QuadratureIndexArray->SetValue(id, nquad*id);
2685 else if(foe->GetPointOrCell() == vtkMedUtilities::OnCell
2686 && field->GetFieldType() != vtkMedField::PointField)
2688 // Cell-centered field on cell support
2690 if (field->GetFieldType()==vtkMedField::QuadratureField ||
2691 field->GetFieldType()==vtkMedField::ElnoField)
2693 nquad=fop->GetNumberOfIntegrationPoint();
2695 vtkMedIntArray* profids=NULL;
2698 profids=profile->GetIds();
2700 vtkIdType maxIndex=fop->GetData()->GetNumberOfTuples();
2702 vtkIdType quadIndex = 0;
2704 for (vtkIdType id = 0; id<maxIndex; id++)
2706 vtkIdType realIndex = (profids!=NULL ? profids->GetValue(id)-1 : id);
2707 if (!foep->KeepCell(realIndex))
2710 if (field->GetFieldType()==vtkMedField::QuadratureField ||
2711 field->GetFieldType()==vtkMedField::ElnoField)
2713 for (int q = 0; q<nquad; q++)
2715 vtkfield.DataArray->InsertNextTuple(nquad*realIndex+q,
2720 vtkfield.QuadratureIndexArray->InsertNextValue(quadIndex);
2726 vtkfield.DataArray->InsertNextTuple(id, fop->GetData());
2729 vtkfield.DataArray->Squeeze();
2730 vtkDataSet* ds = this->Internal->CurrentDataSet[foep];
2732 else if(foe->GetPointOrCell() == vtkMedUtilities::OnCell
2733 && field->GetFieldType() == vtkMedField::PointField)
2734 {// point field on cell support
2735 vtkMedIntArray* profids=NULL;
2737 vtkMedProfile* profile=fop->GetProfile();
2743 profids=profile->GetIds();
2746 vtkIdType maxId=fop->GetData()->GetNumberOfTuples();
2748 for(vtkIdType id=0; id<maxId; id++)
2750 // if I have a profile, then I should insert the value at the position given in the profile.
2751 vtkIdType destIndex;
2754 destIndex=profids->GetValue(id)-1; // -1 because med indices start at 1
2761 if(!foep->KeepPoint(destIndex))
2763 // if I use the med2VTKIndex, then the index to insert
2764 // this value is given by the map.
2765 destIndex = foep->GetVTKPointIndex(destIndex);
2766 vtkfield.DataArray->InsertTuple(destIndex, id, fop->GetData());
2768 vtkfield.DataArray->Squeeze();
2769 }// point field on cell support
2770 else if(foe->GetPointOrCell() == vtkMedUtilities::OnPoint &&
2771 field->GetFieldType() == vtkMedField::PointField)
2774 vtkIdType maxId = fop->GetData()->GetNumberOfTuples();
2776 for(vtkIdType id=0; id<maxId; id++)
2778 vtkIdType realIndex=id;
2781 realIndex=profids->GetValue(id)-1; // -1 because med indices start at 1
2784 if(!foep->KeepPoint(realIndex))
2787 vtkfield.DataArray->InsertNextTuple(fop->GetData()->GetTuple(id));
2789 vtkfield.DataArray->Squeeze();
2790 }// support on point
2792 // now generate the vector field if asked for
2793 if(this->GenerateVectors)
2795 int ncomp = vtkfield.DataArray->GetNumberOfComponents();
2796 if(ncomp > 1 && ncomp != 3)
2798 vtkDataArray* vectors = vtkfield.DataArray->NewInstance();
2799 vectors->SetNumberOfComponents(3);
2800 vectors->SetNumberOfTuples(vtkfield.DataArray->GetNumberOfTuples());
2801 vtkfield.Vectors = vectors;
2804 vectors->CopyInformation(vtkfield.DataArray->GetInformation());
2807 vectors->SetComponentName(2, "Z");
2809 vectors->SetComponentName(2, vtkfield.DataArray->GetComponentName(2));
2811 vectors->SetComponentName(1, vtkfield.DataArray->GetComponentName(1));
2812 vectors->SetComponentName(0, vtkfield.DataArray->GetComponentName(0));
2814 int tuplesize = (ncomp > 3? ncomp: 3);
2815 double* tuple = new double[tuplesize];
2816 for(int tid=0; tid<tuplesize; tid++)
2821 for(vtkIdType id=0; id < vtkfield.DataArray->GetNumberOfTuples(); id++)
2823 vtkfield.DataArray->GetTuple(id, tuple);
2824 vectors->SetTuple(id, tuple);
2830 int vtkMedReader::HasMeshAnyCellSelectedFamily(vtkMedMesh* mesh)
2832 int nfam = mesh->GetNumberOfCellFamily();
2833 for (int famid = 0; famid<nfam; famid++)
2835 vtkMedFamily* fam = mesh->GetFamily(famid);
2836 if (fam->GetPointOrCell()!=vtkMedUtilities::OnCell||!this->GetFamilyStatus(
2844 int vtkMedReader::HasMeshAnyPointSelectedFamily(vtkMedMesh* mesh)
2846 int nfam = mesh->GetNumberOfCellFamily();
2847 for (int famid = 0; famid<nfam; famid++)
2849 vtkMedFamily* fam = mesh->GetFamily(famid);
2850 if (fam->GetPointOrCell()!=vtkMedUtilities::OnPoint
2851 ||!this->GetFamilyStatus(mesh, fam))
2858 void vtkMedReader::BuildSIL(vtkMutableDirectedGraph* sil)
2865 vtkSmartPointer<vtkVariantArray> childEdge=
2866 vtkSmartPointer<vtkVariantArray>::New();
2867 childEdge->InsertNextValue(0);
2869 vtkSmartPointer<vtkVariantArray> crossEdge=
2870 vtkSmartPointer<vtkVariantArray>::New();
2871 crossEdge->InsertNextValue(1);
2873 // CrossEdge is an edge linking hierarchies.
2874 vtkUnsignedCharArray* crossEdgesArray=vtkUnsignedCharArray::New();
2875 crossEdgesArray->SetName("CrossEdges");
2876 sil->GetEdgeData()->AddArray(crossEdgesArray);
2877 crossEdgesArray->Delete();
2878 vtkstd::deque<vtkstd::string> names;
2880 // Now build the hierarchy.
2881 vtkIdType rootId=sil->AddVertex();
2882 names.push_back("SIL");
2884 // Add a global entry to encode global names for the families
2885 vtkIdType globalFamilyRoot=sil->AddChild(rootId, childEdge);
2886 names.push_back("Families");
2888 // Add a global entry to encode global names for the families
2889 vtkIdType globalGroupRoot=sil->AddChild(rootId, childEdge);
2890 names.push_back("Groups");
2892 // Add the groups subtree
2893 vtkIdType groupsRoot=sil->AddChild(rootId, childEdge);
2894 names.push_back("GroupTree");
2896 // Add a global entry to encode names for the cell types
2897 vtkIdType globalEntityRoot=sil->AddChild(rootId, childEdge);
2898 names.push_back("Entity");
2900 // Add the cell types subtree
2901 vtkIdType entityTypesRoot=sil->AddChild(rootId, childEdge);
2902 names.push_back("EntityTree");
2904 // this is the map that keep added cell types
2905 map<vtkMedEntity, vtkIdType> entityMap;
2906 map<med_entity_type, vtkIdType> typeMap;
2908 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
2909 meshfileit = this->Internal->MedFiles.begin();
2910 while(meshfileit != this->Internal->MedFiles.end())
2912 vtkMedFile* file = meshfileit->second;
2915 int numMeshes=file->GetNumberOfMesh();
2916 for(int meshIndex=0; meshIndex<numMeshes; meshIndex++)
2918 vtkMedMesh* mesh = file->GetMesh(meshIndex);
2919 vtkMedGrid* grid = this->FindGridStep(mesh);
2925 for(int entityIndex=0; entityIndex<grid->GetNumberOfEntityArray(); entityIndex++)
2927 vtkMedEntityArray* array=grid->GetEntityArray(entityIndex);
2928 vtkMedEntity entity = array->GetEntity();
2930 if(entityMap.find(entity)==entityMap.end())
2932 vtkIdType entityGlobalId=sil->AddChild(globalEntityRoot, childEdge);
2933 names.push_back(vtkMedUtilities::EntityKey(entity));
2936 if(typeMap.find(entity.EntityType)==typeMap.end())
2938 typeId=sil->AddChild(entityTypesRoot, childEdge);
2939 names.push_back(vtkMedUtilities::EntityName(entity.EntityType));
2940 typeMap[entity.EntityType]=typeId;
2944 typeId=typeMap[entity.EntityType];
2946 vtkIdType entityId=sil->AddChild(typeId, childEdge);
2947 names.push_back(entity.GeometryName);
2949 sil->AddEdge(entityId, entityGlobalId, crossEdge);
2951 entityMap[entity]=entityId;
2955 vtkIdType meshGroup = sil->AddChild(groupsRoot, childEdge);
2956 names.push_back(vtkMedUtilities::SimplifyName(mesh->GetName()));
2958 // add the two OnPoint and OnCell entries, for groups and for families
2959 vtkIdType meshCellGroups = sil->AddChild(meshGroup, childEdge);
2960 names.push_back(vtkMedUtilities::OnCellName);
2962 vtkIdType meshPointGroups = sil->AddChild(meshGroup, childEdge);
2963 names.push_back(vtkMedUtilities::OnPointName);
2965 // this maps will keep all added groups on nodes/cells of this mesh
2966 map<string, vtkIdType> nodeGroupMap;
2967 map<string, vtkIdType> cellGroupMap;
2970 for(int famIndex=0; famIndex<mesh->GetNumberOfFamily(); famIndex++)
2972 vtkMedFamily* family=mesh->GetFamily(famIndex);
2974 vtkIdType globalFamilyId = sil->AddChild(globalFamilyRoot, childEdge);
2975 names.push_back(vtkMedUtilities::FamilyKey(mesh->GetName(),
2976 family->GetPointOrCell(),
2977 family->GetName()));
2979 // family with Id 0 is both on cell and on points, so add it to both
2980 map<string, vtkIdType> & groupMap=(family->GetPointOrCell()
2981 ==vtkMedUtilities::OnPoint? nodeGroupMap: cellGroupMap);
2983 vtkIdType groupRootId =
2984 (family->GetPointOrCell()==vtkMedUtilities::OnPoint?
2985 meshPointGroups : meshCellGroups);
2987 // add all the groups of this family
2988 for(vtkIdType groupIndex=0; groupIndex<family->GetNumberOfGroup();
2991 vtkMedGroup* group=family->GetGroup(groupIndex);
2993 vtkIdType familyGroupId = sil->AddChild(globalFamilyId, childEdge);
2994 names.push_back(vtkMedUtilities::FamilyKey(
2995 mesh->GetName(), family->GetPointOrCell(),
2996 family->GetName()));
2998 vtkIdType groupGlobalId;
2999 if(groupMap.find(group->GetName())==groupMap.end())
3001 vtkIdType groupLocalId;
3002 groupLocalId=sil->AddChild(groupRootId, childEdge);
3003 names.push_back(vtkMedUtilities::SimplifyName(group->GetName()));
3005 groupGlobalId=sil->AddChild(globalGroupRoot, childEdge);
3006 names.push_back(vtkMedUtilities::GroupKey(
3007 mesh->GetName(), family->GetPointOrCell(),
3009 groupMap[group->GetName()]=groupGlobalId;
3011 sil->AddEdge(groupLocalId, groupGlobalId, crossEdge);
3013 vtkIdType groupId = groupMap[group->GetName()];
3014 sil->AddEdge(familyGroupId, groupId, childEdge);
3021 // This array is used to assign names to nodes.
3022 vtkStringArray* namesArray=vtkStringArray::New();
3023 namesArray->SetName("Names");
3024 namesArray->SetNumberOfTuples(sil->GetNumberOfVertices());
3025 sil->GetVertexData()->AddArray(namesArray);
3026 namesArray->Delete();
3027 vtkstd::deque<vtkstd::string>::iterator iter;
3029 for(cc=0, iter=names.begin(); iter!=names.end(); ++iter, ++cc)
3031 namesArray->SetValue(cc, (*iter).c_str());
3035 void vtkMedReader::ClearMedSupports()
3037 this->Internal->DataSetCache.clear();
3038 //this->Internal->Med2VTKPointIndex.clear();
3040 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
3041 meshfileit = this->Internal->MedFiles.begin();
3042 while(meshfileit != this->Internal->MedFiles.end())
3044 vtkMedFile* file = meshfileit->second;
3046 int numMeshes=file->GetNumberOfMesh();
3047 for(int meshIndex=0; meshIndex<numMeshes; meshIndex++)
3049 vtkMedMesh* mesh=file->GetMesh(meshIndex);
3050 mesh->ClearMedSupports();
3053 int numProf = file->GetNumberOfProfile();
3054 for (int prof = 0; prof<numProf; prof++)
3056 vtkMedProfile* profile = file->GetProfile(prof);
3057 if (profile->GetIds()!=NULL)
3058 profile->GetIds()->Initialize();
3063 void vtkMedReader::ClearMedFields()
3065 this->Internal->FieldCache.clear();
3066 this->Internal->QuadOffsetKey.clear();
3067 this->Internal->QuadratureOffsetCache.clear();
3069 std::map<std::string, vtkSmartPointer<vtkMedFile> >::iterator
3070 fieldfileit = this->Internal->MedFiles.begin();
3071 while(fieldfileit != this->Internal->MedFiles.end())
3073 vtkMedFile* file = fieldfileit->second;
3076 int numFields=file->GetNumberOfField();
3077 for(int ff=0; ff<numFields; ff++)
3079 vtkMedField* field=file->GetField(ff);
3080 int nstep=field->GetNumberOfFieldStep();
3081 for(int sid=0; sid<nstep; sid++)
3083 vtkMedFieldStep* step = field->GetFieldStep(sid);
3084 for(int id=0; id<step->GetNumberOfFieldOverEntity(); id++)
3086 vtkMedFieldOverEntity * fieldOverEntity=step->GetFieldOverEntity(id);
3087 for(int pid = 0; pid < fieldOverEntity->GetNumberOfFieldOnProfile(); pid++)
3089 vtkMedFieldOnProfile* fop = fieldOverEntity->GetFieldOnProfile(pid);
3090 if(fop->GetData() != NULL)
3099 void vtkMedReader::ClearCaches(int when)
3104 this->Internal->CurrentDataSet.clear();
3105 this->Internal->DataSetCache.clear();
3106 this->Internal->FieldCache.clear();
3107 this->Internal->UsedSupports.clear();
3108 this->Internal->QuadratureOffsetCache.clear();
3109 this->Internal->QuadOffsetKey.clear();
3110 //this->Internal->Med2VTKPointIndex.clear();
3113 this->Internal->CurrentDataSet.clear();
3114 this->Internal->UsedSupports.clear();
3115 if(this->CacheStrategy==CacheNothing)
3117 this->ClearMedSupports();
3118 this->ClearMedFields();
3120 else if(this->CacheStrategy==CacheGeometry)
3122 this->ClearMedFields();
3125 case AfterCreateMedSupports:
3126 // TODO : clear the unused supports and associated cached datasets and fields
3128 case EndBuildVTKSupports:
3131 if(this->CacheStrategy==CacheNothing)
3133 this->ClearMedSupports();
3134 this->ClearMedFields();
3136 else if(this->CacheStrategy==CacheGeometry && this->AnimationMode != Modes)
3138 this->ClearMedFields();
3144 void vtkMedReader::PrintSelf(ostream& os, vtkIndent indent)
3146 PRINT_STRING(os, indent, FileName);
3147 PRINT_IVAR(os, indent, AnimationMode);
3148 PRINT_IVAR(os, indent, TimeIndexForIterations);
3149 PRINT_OBJECT(os, indent, PointFields);
3150 PRINT_OBJECT(os, indent, CellFields);
3151 PRINT_OBJECT(os, indent, QuadratureFields);
3152 PRINT_OBJECT(os, indent, ElnoFields);
3153 PRINT_OBJECT(os, indent, Groups);
3154 PRINT_OBJECT(os, indent, Entities);
3155 PRINT_IVAR(os, indent, CacheStrategy);
3156 this->Superclass::PrintSelf(os, indent);