//malha multifisica para o metodo da dupla projecao TPZCompMesh *MalhaMDP(TPZVec<TPZCompMesh *> meshvec,TPZGeoMesh * gmesh){ //Creating computational mesh for multiphysic elements gmesh->ResetReference(); TPZCompMesh *mphysics = new TPZCompMesh(gmesh); //criando material int dim =2; TPZMDPMaterial *material = new TPZMDPMaterial(1,dim); //incluindo os dados do problema REAL coefk = 1.; material->SetParameters(coefk, 0.); //solucao exata TPZAutoPointer<TPZFunction<STATE> > solexata; solexata = new TPZDummyFunction<STATE>(SolSuave); material->SetForcingFunctionExact(solexata); //funcao do lado direito da equacao do problema TPZAutoPointer<TPZFunction<STATE> > force; TPZDummyFunction<STATE> *dum; dum = new TPZDummyFunction<STATE>(ForceSuave); dum->SetPolynomialOrder(20); force = dum; material->SetForcingFunction(force); //inserindo o material na malha computacional TPZMaterial *mat(material); mphysics->InsertMaterialObject(mat); //Criando condicoes de contorno TPZFMatrix<STATE> val1(2,2,0.), val2(2,1,0.); int boundcond = dirichlet; //BC -1 TPZMaterial * BCondD1 = material->CreateBC(mat, bc1,boundcond, val1, val2); TPZAutoPointer<TPZFunction<REAL> > bcmatDirichlet1 = new TPZDummyFunction<REAL>(DirichletSuave); BCondD1->SetForcingFunction(bcmatDirichlet1); mphysics->InsertMaterialObject(BCondD1); //BC -2 TPZMaterial * BCondD2 = material->CreateBC(mat, bc2,boundcond, val1, val2); TPZAutoPointer<TPZFunction<REAL> > bcmatDirichlet2 = new TPZDummyFunction<REAL>(DirichletSuave); BCondD2->SetForcingFunction(bcmatDirichlet2); mphysics->InsertMaterialObject(BCondD2); //BC -3 TPZMaterial * BCondD3 = material->CreateBC(mat, bc3,boundcond, val1, val2); TPZAutoPointer<TPZFunction<REAL> > bcmatDirichlet3 = new TPZDummyFunction<REAL>(DirichletSuave); BCondD3->SetForcingFunction(bcmatDirichlet3); mphysics->InsertMaterialObject(BCondD3); //BC -4 TPZMaterial * BCondD4 = material->CreateBC(mat, bc4,boundcond, val1, val2); TPZAutoPointer<TPZFunction<REAL> > bcmatDirichlet4 = new TPZDummyFunction<REAL>(DirichletSuave); BCondD4->SetForcingFunction(bcmatDirichlet4); mphysics->InsertMaterialObject(BCondD4); mphysics->InsertMaterialObject(BCondD1); mphysics->InsertMaterialObject(BCondD2); mphysics->InsertMaterialObject(BCondD3); mphysics->InsertMaterialObject(BCondD4); //set multiphysics element mphysics->SetDimModel(dim); mphysics->SetAllCreateFunctionsMultiphysicElem(); //Fazendo auto build mphysics->AutoBuild(); mphysics->AdjustBoundaryElements(); mphysics->CleanUpUnconnectedNodes(); // Creating multiphysic elements into mphysics computational mesh TPZBuildMultiphysicsMesh::AddElements(meshvec, mphysics); TPZBuildMultiphysicsMesh::AddConnects(meshvec,mphysics); TPZBuildMultiphysicsMesh::TransferFromMeshes(meshvec, mphysics); return mphysics; }
TPZCompMesh *MalhaMultifisicaOpt(TPZVec<TPZCompMesh *> meshvec, TPZGeoMesh *gmesh){ //Creating computational mesh for multiphysic elements gmesh->ResetReference(); TPZCompMesh *mphysics = new TPZCompMesh(gmesh); //criando material int dim =2; TPZMatPoissonControl *material = new TPZMatPoissonControl(MatId,dim); //incluindo os dados do problema REAL k=1; REAL alpha=1; material-> SetParameters( k, alpha); //solucao exata TPZAutoPointer<TPZFunction<STATE> > solexata; solexata = new TPZDummyFunction<STATE>(StateAd, 5); material->SetForcingFunctionExact(solexata); //funcao do lado direito da equacao do problema TPZAutoPointer<TPZFunction<STATE> > force; TPZDummyFunction<STATE> *dum; dum = new TPZDummyFunction<STATE>(OptForcing, 5); dum->SetPolynomialOrder(20); force = dum; material->SetForcingFunction(force); //inserindo o material na malha computacional TPZMaterial *mat(material); mphysics->InsertMaterialObject(mat); mphysics->SetDimModel(dim); //Criando condicoes de contorno TPZFMatrix<STATE> val1(2,2,0.), val2(2,1,0.); TPZMaterial * BCond0 = material->CreateBC(mat, bc0, bcdirichlet, val1, val2); TPZMaterial * BCond1 = material->CreateBC(mat, bc1, bcdirichlet, val1, val2); TPZMaterial * BCond2 = material->CreateBC(mat, bc2, bcdirichlet, val1, val2); TPZMaterial * BCond3 = material->CreateBC(mat, bc3, bcdirichlet, val1, val2); ///Inserir condicoes de contorno mphysics->InsertMaterialObject(BCond0); mphysics->InsertMaterialObject(BCond1); mphysics->InsertMaterialObject(BCond2); mphysics->InsertMaterialObject(BCond3); mphysics->SetAllCreateFunctionsMultiphysicElem(); //Fazendo auto build mphysics->AutoBuild(); mphysics->AdjustBoundaryElements(); mphysics->CleanUpUnconnectedNodes(); TPZBuildMultiphysicsMesh::AddElements(meshvec, mphysics); TPZBuildMultiphysicsMesh::AddConnects(meshvec,mphysics); TPZBuildMultiphysicsMesh::TransferFromMeshes(meshvec, mphysics); return mphysics; }
TPZCompMesh *MalhaCompMultifisica(TPZGeoMesh * gmesh,TPZVec<TPZCompMesh *> meshvec, TPZMatUncoupledPoissonDisc* &mymaterial){ // Creating computational mesh for multiphysic elements gmesh->ResetReference(); TPZCompMesh *mphysics = new TPZCompMesh(gmesh); mphysics->SetAllCreateFunctionsMultiphysicElem(); int dim = 2; mphysics->SetDimModel(dim); mymaterial = new TPZMatUncoupledPoissonDisc(matId, mphysics->Dimension()); mymaterial->SetParameters(1., 1.); mymaterial->SetInternalFlux(-8.,0.); //mymaterial->SetInternalFlux(0.,0.); mymaterial->SetNonSymmetricOne(); mymaterial->SetNonSymmetricTwo(); mymaterial->SetPenaltyConstant(0., 0.); TPZMaterial * mat(mymaterial); mphysics->InsertMaterialObject(mat); TPZAutoPointer<TPZFunction<STATE> > forcef = new TPZDummyFunction<STATE>(ForcingF, 5); // // TPZAutoPointer<TPZFunction<STATE> > forcef = new TPZDummyFunction<STATE>(ForcingF); mymaterial->SetForcingFunction(forcef); ///Inserir condicao de contorno TPZFMatrix<STATE> val1(2,2,0.), val2(2,1,0.); TPZMaterial * BCond0 = mymaterial->CreateBC(mat, bc0,neumann_dirichlet, val1, val2); TPZMaterial * BCond2 = mymaterial->CreateBC(mat, bc2,neumann_dirichlet, val1, val2); TPZMaterial * BCond1 = mymaterial->CreateBC(mat, bc1,dirichlet, val1, val2); TPZMaterial * BCond3 = mymaterial->CreateBC(mat, bc3,dirichlet, val1, val2); // TPZMaterial * BCond0 = mymaterial->CreateBC(mat, bc0,dirichlet, val1, val2); // TPZMaterial * BCond2 = mymaterial->CreateBC(mat, bc2,dirichlet, val1, val2); // TPZMaterial * BCond1 = mymaterial->CreateBC(mat, bc1,dirichlet, val1, val2); // TPZMaterial * BCond3 = mymaterial->CreateBC(mat, bc3,dirichlet, val1, val2); mphysics->InsertMaterialObject(BCond0); mphysics->InsertMaterialObject(BCond1); mphysics->InsertMaterialObject(BCond2); mphysics->InsertMaterialObject(BCond3); mphysics->AutoBuild(); mphysics->AdjustBoundaryElements(); mphysics->CleanUpUnconnectedNodes(); //Creating multiphysic elements into mphysics computational mesh TPZBuildMultiphysicsMesh::AddElements(meshvec, mphysics); TPZBuildMultiphysicsMesh::AddConnects(meshvec,mphysics); TPZBuildMultiphysicsMesh::TransferFromMeshes(meshvec, mphysics); mphysics->Reference()->ResetReference(); mphysics->LoadReferences(); if (disc_functions==true){ //criar elementos de interface int nel = mphysics->ElementVec().NElements(); for(int el = 0; el < nel; el++) { TPZCompEl * compEl = mphysics->ElementVec()[el]; if(!compEl) continue; int index = compEl ->Index(); if(compEl->Dimension() == mphysics->Dimension()) { TPZMultiphysicsElement * InterpEl = dynamic_cast<TPZMultiphysicsElement *>(mphysics->ElementVec()[index]); if(!InterpEl) continue; InterpEl->CreateInterfaces(); } } } return mphysics; }