void TPZBndCond::Clone(std::map<int, TPZAutoPointer<TPZMaterial> > &matvec) { int matid = Id(); TPZAutoPointer<TPZMaterial> refmaterial = Material(); TPZAutoPointer<TPZMaterial> newrefmaterial; int refmatid = 0; if(refmaterial) { refmaterial->Clone(matvec); refmatid = refmaterial->Id(); newrefmaterial = matvec[refmatid]; } std::map<int, TPZAutoPointer<TPZMaterial> >::iterator matit; matit = matvec.find(matid); if(matit == matvec.end()) { TPZAutoPointer<TPZMaterial> newmat = TPZAutoPointer<TPZMaterial>(new TPZBndCond(*this, newrefmaterial)); matvec[matid] = newmat; } }
void TPZDarcyAnalysis::Run() { std::string dirname = PZSOURCEDIR; // gRefDBase.InitializeUniformRefPattern(EOned); // gRefDBase.InitializeUniformRefPattern(EQuadrilateral); // gRefDBase.InitializeUniformRefPattern(ETriangle); // gRefDBase.InitializeUniformRefPattern(ECube); #ifdef PZDEBUG #ifdef LOG4CXX std::string FileName = dirname; FileName = dirname + "/Projects/DarcyflowHdiv3D/"; FileName += "DarcyFlowLog3D.cfg"; InitializePZLOG(FileName); #endif #endif // Reading mesh std::string GridFileName; GridFileName = dirname + "/Projects/DarcyflowHdiv3D/"; GridFileName += "SingleLayer.dump"; //GridFileName += "MixLayer.dump"; //GridFileName += "BatatacoarseQ.dump"; //GridFileName += "QUAD4.dump"; if(fLayers[0]->GetIsGIDGeometry()) { ReadGeoMesh(GridFileName); } else { int nx = 2; int ny = 2; int nz = 2; Geometry(nx,ny,nz); // CreatedGeoMesh(); } REAL deg = 0.0; int hcont = 0; RotateGeomesh(deg * M_PI/180.0); this->UniformRefinement(fSimulationData->GetHrefinement()); std::set<int> matidstoRef; // matidstoRef.insert(2); // matidstoRef.insert(3); // matidstoRef.insert(4); matidstoRef.insert(3); matidstoRef.insert(5); this->UniformRefinement(hcont, matidstoRef); this->PrintGeoMesh(); int q = fSimulationData->Getqorder(); int p = fSimulationData->Getporder(); int s = 0; // if (fSimulationData->GetIsH1approx()) if (false) { // CmeshH1(p); } else { CreateMultiphysicsMesh(q,p,s); // CreateInterfaces(); } // Analysis bool mustOptimizeBandwidth = true; TPZAnalysis *an = new TPZAnalysis(fcmeshdarcy,mustOptimizeBandwidth); int numofThreads = 0; bool IsDirecSolver = fSimulationData->GetIsDirect(); if (IsDirecSolver) { if (fSimulationData->GetIsBroyden()) { TPZFStructMatrix fullMatrix(fcmeshdarcy); TPZStepSolver<STATE> step; fullMatrix.SetNumThreads(numofThreads); step.SetDirect(ELU); an->SetStructuralMatrix(fullMatrix); an->SetSolver(step); } else{ TPZSkylineNSymStructMatrix skylnsym(fcmeshdarcy); TPZStepSolver<STATE> step; skylnsym.SetNumThreads(numofThreads); step.SetDirect(ELU); an->SetStructuralMatrix(skylnsym); an->SetSolver(step); } } else { if (fSimulationData->GetIsBroyden()) { TPZFStructMatrix fullMatrix(fcmeshdarcy); fullMatrix.SetNumThreads(numofThreads); TPZAutoPointer<TPZMatrix<STATE> > fullMatrixa = fullMatrix.Create(); TPZAutoPointer<TPZMatrix<STATE> > fullMatrixaClone = fullMatrixa->Clone(); TPZStepSolver<STATE> *stepre = new TPZStepSolver<STATE>(fullMatrixaClone); TPZStepSolver<STATE> *stepGMRES = new TPZStepSolver<STATE>(fullMatrixa); TPZStepSolver<STATE> *stepGC = new TPZStepSolver<STATE>(fullMatrixa); stepre->SetDirect(ELU); stepre->SetReferenceMatrix(fullMatrixa); stepGMRES->SetGMRES(10, 20, *stepre, 1.0e-10, 0); stepGC->SetCG(10, *stepre, 1.0e-10, 0); if (fSimulationData->GetIsCG()) { an->SetSolver(*stepGC); } else{ an->SetSolver(*stepGMRES); } } else{ TPZSkylineNSymStructMatrix skylnsym(fcmeshdarcy); skylnsym.SetNumThreads(numofThreads); TPZAutoPointer<TPZMatrix<STATE> > skylnsyma = skylnsym.Create(); TPZAutoPointer<TPZMatrix<STATE> > skylnsymaClone = skylnsyma->Clone(); TPZStepSolver<STATE> *stepre = new TPZStepSolver<STATE>(skylnsymaClone); TPZStepSolver<STATE> *stepGMRES = new TPZStepSolver<STATE>(skylnsyma); TPZStepSolver<STATE> *stepGC = new TPZStepSolver<STATE>(skylnsyma); stepre->SetDirect(ELU); stepre->SetReferenceMatrix(skylnsyma); stepGMRES->SetGMRES(10, 20, *stepre, 1.0e-10, 0); stepGC->SetCG(10, *stepre, 1.0e-10, 0); if (fSimulationData->GetIsCG()) { an->SetSolver(*stepGC); } else{ an->SetSolver(*stepGMRES); } } } this->InitializeSolution(an); this->TimeForward(an); }
void TPZAnalysis::SetStructuralMatrix(TPZAutoPointer<TPZStructMatrix> strmatrix){ fStructMatrix = TPZAutoPointer<TPZStructMatrix>(strmatrix->Clone()); }