diff --git a/NonLinearSolver/materialLaw/numericalMaterial.cpp b/NonLinearSolver/materialLaw/numericalMaterial.cpp index 20a558750f0c361a609a2e587ac5b9db78810ae4..f37e879d13ae38166ce91234b24f8a736e88d27e 100644 --- a/NonLinearSolver/materialLaw/numericalMaterial.cpp +++ b/NonLinearSolver/materialLaw/numericalMaterial.cpp @@ -155,17 +155,25 @@ nonLinearMechSolver* numericalMaterial::createMicroSolver(const int ele, const i std::map<int,int>::const_iterator itm = _meshIdMap.find(type); if (itm == _meshIdMap.end() or _allPertMesh.size() ==0){ /**load model**/ - if (_microMeshFile.length() >0){ - Msg::Info("create model from mesh file %s",_microMeshFile.c_str()); - solver->loadModel(_microMeshFile); - } - else if (_microGeoFile.length()>0 ){ - Msg::Info("create model from geometry file %s",_microGeoFile.c_str()); - solver->createMicroModel(_microGeoFile,_meshDim,_meshOrder,_meshIncomplete); - } - else{ - Msg::Fatal("micro model file must be provided: proc %d, ele %d, GP %d",Msg::GetCommRank(),ele,gpt); - } + std::map<int,std::string>::const_iterator itMestConstraint = _meshOnIP.find(type); + if (itMestConstraint == _meshOnIP.end()){ + if (_microMeshFile.length() >0){ + Msg::Info("create model from mesh file %s",_microMeshFile.c_str()); + solver->loadModel(_microMeshFile); + } + else if (_microGeoFile.length()>0 ){ + Msg::Info("create model from geometry file %s",_microGeoFile.c_str()); + solver->createMicroModel(_microGeoFile,_meshDim,_meshOrder,_meshIncomplete); + } + else{ + Msg::Fatal("micro model file must be provided: proc %d, ele %d, GP %d",Msg::GetCommRank(),ele,gpt); + } + } + else{ + std::string mshFile = itMestConstraint->second; + printf("create model from mesh file %s \n",mshFile.c_str()); + solver->loadModel(mshFile); + } } else{ std::map<int,std::string>::const_iterator itstr = _allPertMesh.find(itm->second); @@ -329,6 +337,12 @@ void numericalMaterial::addMaterialLaw(materialLaw* mlaw){ _allMaterialLaw.push_back(mlaw); }; +void numericalMaterial::addPertutationalMeshIP(const int ele, const int ip, const std::string meshfile){ + Msg::Info("pert mesh it element %d ip %d",ele,ip); + int type = numericalMaterial::createTypeWithTwoInts(ele,ip); + _meshOnIP[type] = meshfile; +}; + void numericalMaterial::setPerturbationMaterialLawIP(const int ele, const int ip){ int num = numericalMaterial::createTypeWithTwoInts(ele,ip); _pertMaterialLawIP.insert(num); diff --git a/NonLinearSolver/materialLaw/numericalMaterial.h b/NonLinearSolver/materialLaw/numericalMaterial.h index c60b1db2132a878ba4e3887b351f1216b1c4a3b6..f5904d5e31ebbed985e59c26134dbe82d1d032b6 100644 --- a/NonLinearSolver/materialLaw/numericalMaterial.h +++ b/NonLinearSolver/materialLaw/numericalMaterial.h @@ -125,6 +125,8 @@ class numericalMaterial : public numericalMaterialBase{ std::map<int,int> _meshIdMap; // mesh id map, std::map<int,std::string>::iterator _idIterator;// iterator to acces meshes std::map<int,std::string> _allPertMesh; // all perturbed meshes + + std::map<int,std::string> _meshOnIP; // constraint mesh on each ip std::string _microMeshFile; // micro meshfile std::string _microGeoFile; // micro geometry @@ -183,7 +185,7 @@ class numericalMaterial : public numericalMaterialBase{ virtual ~numericalMaterial(); // create micro solver - virtual nonLinearMechSolver* createMicroSolver(const int ele=0, const int gpt=0) const; + virtual nonLinearMechSolver* createMicroSolver(const int ele, const int gpt) const; #endif // set micro meshes @@ -196,7 +198,8 @@ class numericalMaterial : public numericalMaterialBase{ virtual void addDomain(partDomain* domain); // set micro material law virtual void addMaterialLaw(materialLaw* mlaw); - + + virtual void addPertutationalMeshIP(const int ele, const int ip, const std::string meshfile); virtual void setPerturbationMaterialLawIP(const int ele, const int ip); virtual void addPerturbationMaterialLaw(materialLaw* mlaw); // set micro periodicity