#include "ProblemVec.h" #include "RecoveryEstimator.h" #include "Serializer.h" #include "AbstractFunction.h" #include "Operator.h" #include "SystemVector.h" #include "DOFMatrix.h" #include "FiniteElemSpace.h" #include "Estimator.h" #include "Marker.h" #include "AdaptInfo.h" #include "FileWriter.h" #include "CoarseningManager.h" #include "RefinementManager.h" #include "Mesh.h" #include "OEMSolver.h" #include "Preconditioner.h" #include "MatVecMultiplier.h" #include "DirichletBC.h" #include "RobinBC.h" #include "PeriodicBC.h" #include "Lagrange.h" namespace AMDiS { ProblemVec *ProblemVec::traversePtr_ = NULL; void ProblemVec::initialize(Flag initFlag, ProblemVec *adoptProblem, Flag adoptFlag) { FUNCNAME("ProblemVec::initialize()"); // === create meshes === if (meshes_.size() != 0) { WARNING("meshes already created\n"); } else { if (initFlag.isSet(CREATE_MESH) || ((!adoptFlag.isSet(INIT_MESH))&& (initFlag.isSet(INIT_SYSTEM) || initFlag.isSet(INIT_FE_SPACE)))) { createMesh(); } if (adoptProblem && (adoptFlag.isSet(INIT_MESH) || adoptFlag.isSet(INIT_SYSTEM) || adoptFlag.isSet(INIT_FE_SPACE))) { meshes_ = adoptProblem->getMeshes(); componentMeshes_ = adoptProblem->componentMeshes_; refinementManager_ = adoptProblem->refinementManager_; coarseningManager_ = adoptProblem->coarseningManager_; } } if (meshes_.size() == 0) WARNING("no mesh created\n"); // === create fespace === if (feSpaces_.size() != 0) { WARNING("feSpaces already created\n"); } else { if (initFlag.isSet(INIT_FE_SPACE) || (initFlag.isSet(INIT_SYSTEM)&&!adoptFlag.isSet(INIT_FE_SPACE))) { createFESpace(); } if (adoptProblem && (adoptFlag.isSet(INIT_FE_SPACE) || adoptFlag.isSet(INIT_SYSTEM))) { feSpaces_ = adoptProblem->getFESpaces(); componentSpaces_ = adoptProblem->componentSpaces_; } } if (feSpaces_.size() == 0) WARNING("no feSpace created\n"); // === create system === if (initFlag.isSet(INIT_SYSTEM)) { createMatricesAndVectors(); } if (adoptProblem && adoptFlag.isSet(INIT_SYSTEM)) { solution_ = adoptProblem->getSolution(); rhs_ = adoptProblem->getRHS(); systemMatrix_ = adoptProblem->getSystemMatrix(); } // === create solver === if (solver_) { WARNING("solver already created\n"); } else { if (initFlag.isSet(INIT_SOLVER)) { createSolver(); } if (adoptProblem && adoptFlag.isSet(INIT_SOLVER)) { TEST_EXIT(!solver_)("solver already created\n"); solver_ = adoptProblem->getSolver(); } } if (!solver_) WARNING("no solver created\n"); // === create estimator === if (initFlag.isSet(INIT_ESTIMATOR)) { createEstimator(); } if (adoptProblem && adoptFlag.isSet(INIT_ESTIMATOR)) { estimator_ = adoptProblem->getEstimator(); } // === create marker === if (initFlag.isSet(INIT_MARKER)) { createMarker(); } if (adoptProblem && adoptFlag.isSet(INIT_MARKER)) { marker_ = adoptProblem->getMarker(); } // === create file writer === if (initFlag.isSet(INIT_FILEWRITER)) { createFileWriter(); } // === read serialization and init mesh === // There are two possiblities where the user can define a serialization // to be read from disk. Either by providing the parameter -rs when executing // the program or in the init file. The -rs parameter is always checked first, // because it can be added automatically when rescheduling the program // before timeout of the runqueue. int readSerialization = 0; ::std::string serializationFilename = ""; GET_PARAMETER(0, "argv->rs", &serializationFilename); // If the parameter -rs is set, we do nothing here, because the problem will be // deserialized in the constructor of a following AdaptInstationary initialization. if (!serializationFilename.compare("")) { int readSerializationWithAdaptInfo = 0; GET_PARAMETER(0, name_ + "->input->read serialization", "%d", &readSerialization); GET_PARAMETER(0, name_ + "->input->serialization with adaptinfo", "%d", &readSerializationWithAdaptInfo); // The serialization file is only read, if the adaptInfo part should not be used. // If the adaptInfo part should be also read, the serialization file will be read // in the constructor of the AdaptInstationary problem, because we do not have here // the adaptInfo object. if (readSerialization && !readSerializationWithAdaptInfo) { GET_PARAMETER(0, name_ + "->input->serialization filename", &serializationFilename); TEST_EXIT(serializationFilename != "")("no serialization file\n"); MSG("Deserialization from file: %s\n", serializationFilename.c_str()); ::std::ifstream in(serializationFilename.c_str()); deserialize(in); in.close(); } else { // Initialize the meshes if there is no serialization file. for (int i = 0; i < static_cast(meshes_.size()); i++) { if (initFlag.isSet(INIT_MESH) && meshes_[i] && !(meshes_[i]->isInitialized())) { meshes_[i]->initialize(); // do global refinements int globalRefinements = 0; GET_PARAMETER(0, meshes_[0]->getName() + "->global refinements", "%d", &globalRefinements); for (int gr = 0; gr < static_cast(meshes_.size()); gr++) { refinementManager_->globalRefine(meshes_[gr], globalRefinements); } } } } } doOtherStuff(); } void ProblemVec::createMesh() { FUNCNAME("ProblemVec::createMesh()"); componentMeshes_.resize(numComponents_); ::std::map meshForRefinementSet; char number[3]; ::std::string meshName(""); GET_PARAMETER(0, name_ + "->mesh", &meshName); TEST_EXIT(meshName != "")("no mesh name spezified\n"); int dim = 0; GET_PARAMETER(0, name_ + "->dim", "%d", &dim); TEST_EXIT(dim)("no problem dimension spezified!\n"); for (int i = 0; i < numComponents_; i++) { sprintf(number, "%d", i); int refSet = -1; GET_PARAMETER(0, name_ + "->refinement set[" + number + "]", "%d", &refSet); if (refSet < 0) { WARNING("refinement set for component %d not set\n", i); refSet = 0; } if (meshForRefinementSet[refSet] == NULL) { Mesh *newMesh = NEW Mesh(meshName, dim); meshForRefinementSet[refSet] = newMesh; meshes_.push_back(newMesh); } componentMeshes_[i] = meshForRefinementSet[refSet]; } switch(dim) { case 1: coarseningManager_ = NEW CoarseningManager1d(); refinementManager_ = NEW RefinementManager1d(); break; case 2: coarseningManager_ = NEW CoarseningManager2d(); refinementManager_ = NEW RefinementManager2d(); break; case 3: coarseningManager_ = NEW CoarseningManager3d(); refinementManager_ = NEW RefinementManager3d(); break; default: ERROR_EXIT("invalid dim!\n"); } } void ProblemVec::createFESpace() { FUNCNAME("ProblemVec::createFESpace()"); int degree = 1; char number[3]; ::std::map< ::std::pair, FiniteElemSpace*> feSpaceMap; int dim = -1; GET_PARAMETER(0, name_ + "->dim", "%d", &dim); TEST_EXIT(dim != -1)("no problem dimension spezified!\n"); componentSpaces_.resize(numComponents_, NULL); for (int i = 0; i < numComponents_; i++) { sprintf(number, "%d", i); GET_PARAMETER(0, name_ + "->polynomial degree[" + number + "]","%d", °ree); TEST_EXIT(componentSpaces_[i] == NULL)("feSpace already created\n"); if (feSpaceMap[::std::pair(componentMeshes_[i], degree)] == NULL) { FiniteElemSpace *newFESpace = FiniteElemSpace::provideFESpace(NULL, Lagrange::getLagrange(dim, degree), componentMeshes_[i], name_ + "->feSpace"); feSpaceMap[::std::pair(componentMeshes_[i], degree)] = newFESpace; feSpaces_.push_back(newFESpace); } componentSpaces_[i] = feSpaceMap[::std::pair(componentMeshes_[i], degree)]; } // create dof admin for vertex dofs if neccessary for (int i = 0; i < static_cast(meshes_.size()); i++) { if (meshes_[i]->getNumberOfDOFs(VERTEX) == 0) { DimVec ln_dof(meshes_[i]->getDim(), DEFAULT_VALUE, 0); ln_dof[VERTEX]= 1; meshes_[i]->createDOFAdmin("vertex dofs", ln_dof); } } } void ProblemVec::createMatricesAndVectors() { FUNCNAME("ProblemVec::createMatricesAndVectors()"); int i; // === create vectors and system matrix === systemMatrix_ = NEW Matrix(numComponents_, numComponents_); systemMatrix_->set(NULL); rhs_ = NEW SystemVector("rhs", componentSpaces_, numComponents_); solution_ = NEW SystemVector("solution", componentSpaces_, numComponents_); char number[10]; ::std::string numberedName; for (i = 0; i < numComponents_; i++) { (*systemMatrix_)[i][i] = NEW DOFMatrix(componentSpaces_[i], componentSpaces_[i], "A_ii"); (*systemMatrix_)[i][i]->setCoupleMatrix(false); sprintf(number, "[%d]", i); numberedName = "rhs" + ::std::string(number); rhs_->setDOFVector(i, NEW DOFVector(componentSpaces_[i], numberedName)); numberedName = name_ + ::std::string(number); solution_->setDOFVector(i, NEW DOFVector(componentSpaces_[i], numberedName)); solution_->getDOFVector(i)->refineInterpol(true); solution_->getDOFVector(i)->setCoarsenOperation(COARSE_INTERPOL); solution_->getDOFVector(i)->set(0.0); } // === create matVec === matVec_ = NEW StandardMatVec, SystemVector>(systemMatrix_); } void ProblemVec::createSolver() { FUNCNAME("ProblemVec::createSolver()"); // === create solver === ::std::string solverType("no"); GET_PARAMETER(0, name_ + "->solver", &solverType); OEMSolverCreator *solverCreator = dynamic_cast*>( CreatorMap > ::getCreator(solverType) ); TEST_EXIT(solverCreator)("no solver type\n"); solverCreator->setName(name_ + "->solver"); solver_ = solverCreator->create(); solver_->initParameters(); // === create preconditioners === ::std::string preconType("no"); PreconditionerScal *scalPrecon; PreconditionerVec *vecPrecon = NEW PreconditionerVec(numComponents_); GET_PARAMETER(0, name_ + "->solver->left precon", &preconType); CreatorInterface *preconCreator = CreatorMap::getCreator(preconType); int i, j; if (!preconCreator->isNullCreator()) { dynamic_cast(preconCreator)-> setName(name_ + "->solver->left precon"); for(i = 0; i < numComponents_; i++) { dynamic_cast(preconCreator)-> setSizeAndRow(numComponents_, i); scalPrecon = preconCreator->create(); for(j = 0; j < numComponents_; j++) { scalPrecon->setMatrix(&(*systemMatrix_)[i][j], j); } vecPrecon->setScalarPrecon(i, scalPrecon); } leftPrecon_ = vecPrecon; } vecPrecon = NEW PreconditionerVec(numComponents_); GET_PARAMETER(0, name_ + "->solver->right precon", &preconType); preconCreator = CreatorMap::getCreator(preconType); if(!preconCreator->isNullCreator()) { dynamic_cast(preconCreator)-> setName(name_ + "->solver->left precon"); for(i = 0; i < numComponents_; i++) { dynamic_cast(preconCreator)-> setSizeAndRow(numComponents_, i); scalPrecon = preconCreator->create(); for(j = 0; j < numComponents_; j++) { scalPrecon->setMatrix(&(*systemMatrix_)[i][j], j); } vecPrecon->setScalarPrecon(i, scalPrecon); } rightPrecon_ = vecPrecon; } // === create vector creator === solver_->setVectorCreator(NEW SystemVector::Creator("temp", componentSpaces_, numComponents_)); } void ProblemVec::createEstimator() { FUNCNAME("ProblemVec::createEstimator()"); int i, j; // create and set leaf data prototype for(i = 0; i < static_cast(meshes_.size()); i++) { meshes_[i]->setElementDataPrototype (NEW LeafDataEstimatableVec(NEW LeafDataCoarsenableVec)); } char number[3]; ::std::string estName; for(i = 0; i < numComponents_; i++) { TEST_EXIT(estimator_[i] == NULL)("estimator already created\n"); sprintf(number, "%d", i); estName = name_ + "->estimator[" + ::std::string(number) + "]"; // === create estimator === ::std::string estimatorType("no"); GET_PARAMETER(0, estName, &estimatorType); EstimatorCreator *estimatorCreator = dynamic_cast( CreatorMap::getCreator(estimatorType)); if(estimatorCreator) { estimatorCreator->setName(estName); estimatorCreator->setRow(i); if(estimatorType == "recovery") { dynamic_cast(estimatorCreator)-> setSolution(solution_->getDOFVector(i)); } estimator_[i] = estimatorCreator->create(); } if(estimator_[i]) { for(j=0; j < numComponents_; j++) { estimator_[i]->addSystem((*systemMatrix_)[i][j], solution_->getDOFVector(j), rhs_->getDOFVector(j)); } } } } void ProblemVec::createMarker() { FUNCNAME("ProblemVec::createMarker()"); ::std::string numberedName; char number[10]; int numMarkersCreated = 0; for (int i = 0; i < numComponents_; i++) { sprintf(number, "[%d]", i); numberedName = name_ + "->marker" + ::std::string(number); marker_[i] = Marker::createMarker(numberedName, i); if (marker_[i]) { numMarkersCreated++; if (numMarkersCreated > 1) marker_[i]->setMaximumMarking(true); } } } void ProblemVec::createFileWriter() { FUNCNAME("ProblemVec::createFileWriter()"); // Create one filewriter for all components of the problem ::std::string numberedName = name_ + "->output"; ::std::string filename = ""; GET_PARAMETER(0, numberedName + "->filename", &filename); if (filename != "") { ::std::vector< DOFVector* > solutionList(numComponents_); for (int i = 0; i < numComponents_; i++) { TEST_EXIT(componentMeshes_[0] == componentMeshes_[i]) ("All Meshes have to be equal to write a vector file.\n"); solutionList[i] = solution_->getDOFVector(i); } fileWriters_.push_back(NEW FileWriter(numberedName, componentMeshes_[0], solutionList)); } // Create own filewriters for each components of the problem char number[10]; for (int i = 0; i < numComponents_; i++) { sprintf(number, "[%d]", i); numberedName = name_ + "->output" + ::std::string(number); filename = ""; GET_PARAMETER(0, numberedName + "->filename", &filename); if (filename != "") { fileWriters_.push_back(NEW FileWriter(numberedName, componentMeshes_[i], solution_->getDOFVector(i))); } } // Check for serializer int writeSerialization = 0; GET_PARAMETER(0, name_ + "->write serialization", "%d", &writeSerialization); if (writeSerialization) { MSG("Use are using the obsolete parameter: %s->write serialization\n", name_.c_str()); MSG("Please use instead the following parameter: %s->output->write serialization\n", name_.c_str()); ERROR_EXIT("Usage of an obsolete parameter (see message above)!\n"); } GET_PARAMETER(0, name_ + "->output->write serialization", "%d", &writeSerialization); if (writeSerialization) { fileWriters_.push_back(NEW Serializer(this)); } } void ProblemVec::doOtherStuff() { } void ProblemVec::solve(AdaptInfo *adaptInfo) { FUNCNAME("Problem::solve()"); if (!solver_) { WARNING("no solver\n"); return; } #ifdef _OPENMP double wtime = omp_get_wtime(); #endif clock_t first = clock(); int iter = solver_->solve(matVec_, solution_, rhs_, leftPrecon_, rightPrecon_); #ifdef _OPENMP INFO(info_, 8)("solution of discrete system needed %.5f seconds system time / %.5f seconds wallclock time\n", TIME_USED(first, clock()), omp_get_wtime() - wtime); #else INFO(info_, 8)("solution of discrete system needed %.5f seconds\n", TIME_USED(first, clock())); #endif adaptInfo->setSolverIterations(iter); adaptInfo->setMaxSolverIterations(solver_->getMaxIterations()); adaptInfo->setSolverTolerance(solver_->getTolerance()); adaptInfo->setSolverResidual(solver_->getResidual()); } void ProblemVec::estimate(AdaptInfo *adaptInfo) { FUNCNAME("ProblemVec::estimate()"); clock_t first = clock(); #ifdef _OPENMP double wtime = omp_get_wtime(); #endif for (int i = 0; i < numComponents_; i++) { Estimator *scalEstimator = estimator_[i]; if (scalEstimator) { scalEstimator->estimate(adaptInfo->getTimestep()); adaptInfo->setEstSum(scalEstimator->getErrorSum(), i); adaptInfo->setEstMax(scalEstimator->getErrorMax(), i); adaptInfo->setTimeEstSum(scalEstimator->getTimeEst(), i); adaptInfo->setTimeEstMax(scalEstimator->getTimeEstMax(), i); } else { WARNING("no estimator for component %d\n" , i); } } #ifdef _OPENMP INFO(info_, 8)("estimation of the error needed %.5f seconds system time / %.5f seconds wallclock time\n", TIME_USED(first, clock()), omp_get_wtime() - wtime); #else INFO(info_, 8)("estimation of the error needed %.5f seconds\n", TIME_USED(first, clock())); #endif } Flag ProblemVec::markElements(AdaptInfo *adaptInfo) { FUNCNAME("ProblemVec::markElements()"); // to enforce albert-like behavior: refinement even if space tolerance // here is reached already because of time adaption allowFirstRefinement(); Flag markFlag = 0; for (int i = 0; i < numComponents_; i++) { if (marker_[i]) { markFlag |= marker_[i]->markMesh(adaptInfo, componentMeshes_[i]); } else { WARNING("no marker for component %d\n", i); } } return markFlag; } Flag ProblemVec::refineMesh(AdaptInfo *adaptInfo) { FUNCNAME("ProblemVec::refineMesh()"); int numMeshes = static_cast(meshes_.size()); Flag refineFlag = 0; for (int i = 0; i < numMeshes; i++) { refineFlag |= refinementManager_->refineMesh(meshes_[i]); } return refineFlag; } Flag ProblemVec::coarsenMesh(AdaptInfo *adaptInfo) { FUNCNAME("ProblemVec::coarsenMesh()"); int i, numMeshes = static_cast(meshes_.size()); Flag coarsenFlag = 0; for(i = 0; i < numMeshes; i++) { if(adaptInfo->isCoarseningAllowed(i)) { coarsenFlag |= coarseningManager_->coarsenMesh(meshes_[i]); WARNING("coarsening for component %d no allowed\n", i); } } return coarsenFlag; } Flag ProblemVec::oneIteration(AdaptInfo *adaptInfo, Flag toDo) { FUNCNAME("ProblemVec::oneIteration()"); if (allowFirstRef_) { for (int i = 0; i < numComponents_; i++) { adaptInfo->allowRefinement(true, i); } allowFirstRef_ = false; } else { for (int i = 0; i < numComponents_; i++) { if (adaptInfo->spaceToleranceReached(i)) { adaptInfo->allowRefinement(false, i); } else { adaptInfo->allowRefinement(true, i); } } } return StandardProblemIteration::oneIteration(adaptInfo, toDo); } void ProblemVec::buildAfterCoarsen(AdaptInfo *adaptInfo, Flag flag) { FUNCNAME("ProblemVec::buildAfterCoarsen()"); clock_t first = clock(); #ifdef _OPENMP double wtime = omp_get_wtime(); #endif for (int i = 0; i < static_cast(meshes_.size()); i++) { meshes_[i]->dofCompress(); } Flag assembleFlag = flag | (*systemMatrix_)[0][0]->getAssembleFlag() | rhs_->getDOFVector(0)->getAssembleFlag() | Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS | Mesh::FILL_DET | Mesh::FILL_GRD_LAMBDA | Mesh::FILL_NEIGH; if (useGetBound_) { assembleFlag |= Mesh::FILL_BOUND; } for (int i = 0; i < numComponents_; i++) { MSG("%d DOFs for %s\n", componentSpaces_[i]->getAdmin()->getUsedSize(), componentSpaces_[i]->getName().c_str()); rhs_->getDOFVector(i)->set(0.0); for (int j = 0; j < numComponents_; j++) { if ((*systemMatrix_)[i][j]) { // The matrix should not be deleted, if it was assembled before // and it is marked to be assembled only once. if (!(assembleMatrixOnlyOnce_[i][j] && assembledMatrix_[i][j])) { (*systemMatrix_)[i][j]->clear(); } } } } int i; #ifdef _OPENMP #pragma omp parallel for #endif for (i = 0; i < numComponents_; i++) { const BasisFunction *basisFcts = componentSpaces_[i]->getBasisFcts(); for (int j = 0; j < numComponents_; j++) { // Only if this variable is true, the current matrix will be assembled. bool assembleMatrix = true; // The DOFMatrix which should be assembled (or not, if assembleMatrix // will be set to false). DOFMatrix *matrix = (*systemMatrix_)[i][j]; // If the matrix was assembled before and it is marked to be assembled // only once, it will not be assembled. if (assembleMatrixOnlyOnce_[i][j] && assembledMatrix_[i][j]) { assembleMatrix = false; } // If there is no DOFMatrix (e.g. if it is completly 0), do not assemble. if (!matrix) { assembleMatrix = false; } // If the matrix should not be assembled, the rhs vector has to be considered. // This will be only done, if i == j. So, if both is not true, we can jump // to the next matrix. if (!assembleMatrix && i != j) { continue; } if (assembleMatrix && matrix->getBoundaryManager()) matrix->getBoundaryManager()->initMatrix(matrix); if (componentMeshes_[i] != componentMeshes_[j]) { ERROR_EXIT("not yet\n"); } else { BoundaryType *bound = NULL; if (useGetBound_) { bound = GET_MEMORY(BoundaryType, basisFcts->getNumber()); } TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(componentMeshes_[i], -1, assembleFlag); while (elInfo) { if (useGetBound_) { basisFcts->getBound(elInfo, bound); } if (assembleMatrix) { matrix->assemble(1.0, elInfo, bound); if (matrix->getBoundaryManager()) { matrix-> getBoundaryManager()-> fillBoundaryConditions(elInfo, matrix); } } if (i == j) { rhs_->getDOFVector(i)->assemble(1.0, elInfo, bound); } elInfo = stack.traverseNext(elInfo); } if (assembleMatrix && matrix->getBoundaryManager()) matrix->getBoundaryManager()->exitMatrix(matrix); if (useGetBound_) { FREE_MEMORY(bound, BoundaryType, basisFcts->getNumber()); } } assembledMatrix_[i][j] = true; } // fill boundary conditions if (rhs_->getDOFVector(i)->getBoundaryManager()) rhs_->getDOFVector(i)->getBoundaryManager()->initVector(rhs_->getDOFVector(i)); if (solution_->getDOFVector(i)->getBoundaryManager()) solution_->getDOFVector(i)->getBoundaryManager()->initVector(solution_->getDOFVector(i)); TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(componentMeshes_[i], -1, assembleFlag); while (elInfo) { if (rhs_->getDOFVector(i)->getBoundaryManager()) rhs_->getDOFVector(i)->getBoundaryManager()-> fillBoundaryConditions(elInfo, rhs_->getDOFVector(i)); if (solution_->getDOFVector(i)->getBoundaryManager()) solution_->getDOFVector(i)->getBoundaryManager()-> fillBoundaryConditions(elInfo, solution_->getDOFVector(i)); elInfo = stack.traverseNext(elInfo); } if (rhs_->getDOFVector(i)->getBoundaryManager()) rhs_->getDOFVector(i)->getBoundaryManager()->exitVector(rhs_->getDOFVector(i)); if (solution_->getDOFVector(i)->getBoundaryManager()) solution_->getDOFVector(i)->getBoundaryManager()->exitVector(solution_->getDOFVector(i)); } #ifdef _OPENMP INFO(info_, 8)("buildAfterCoarsen needed %.5f seconds system time / %.5f seconds wallclock time\n", TIME_USED(first, clock()), omp_get_wtime() - wtime); #else INFO(info_, 8)("buildAfterCoarsen needed %.5f seconds\n", TIME_USED(first, clock())); #endif } void ProblemVec::writeFiles(AdaptInfo *adaptInfo, bool force) { FUNCNAME("ProblemVec::writeFiles()"); clock_t first = clock(); #ifdef _OPENMP double wtime = omp_get_wtime(); #endif int i; int size = static_cast(fileWriters_.size()); #ifdef _OPENMP #pragma omp parallel for schedule(static, 1) #endif for (i = 0; i < size; i++) { fileWriters_[i]->writeFiles(adaptInfo, force); } #ifdef _OPENMP INFO(info_, 8)("writeFiles needed %.5f seconds system time / %.5f seconds wallclock time\n", TIME_USED(first, clock()), omp_get_wtime() - wtime); #else INFO(info_, 8)("writeFiles needed %.5f seconds\n", TIME_USED(first, clock())); #endif } void ProblemVec::writeDelayedFiles() { for (int i = 0; i < static_cast(fileWriters_.size()); i++) { fileWriters_[i]->writeDelayedFiles(); } } bool ProblemVec::existsDelayedCalculation() { for (int i = 0; i < static_cast(fileWriters_.size()); i++) { if (fileWriters_[i]->isWritingDelayed()) return true; } return false; } void ProblemVec::interpolInitialSolution(::std::vector >*> *fct) { FUNCNAME("ProblemVec::interpolInitialSolution()"); solution_->interpol(fct); } void ProblemVec::addMatrixOperator(Operator *op, int i, int j, double *factor, double *estFactor) { FUNCNAME("ProblemVec::addMatrixOperator()"); if (!(*systemMatrix_)[i][j]) { TEST_EXIT(i != j)("should have been created already\n"); (*systemMatrix_)[i][j] = NEW DOFMatrix(componentSpaces_[i], componentSpaces_[j], ""); (*systemMatrix_)[i][j]->setCoupleMatrix(true); (*systemMatrix_)[i][j]->getBoundaryManager()-> setBoundaryConditionMap((*systemMatrix_)[i][i]->getBoundaryManager()-> getBoundaryConditionMap()); } (*systemMatrix_)[i][j]->addOperator(op, factor, estFactor); } void ProblemVec::addVectorOperator(Operator *op, int i, double *factor, double *estFactor) { FUNCNAME("ProblemVec::addVectorOperator()"); rhs_->getDOFVector(i)->addOperator(op, factor, estFactor); } void ProblemVec::addDirichletBC(BoundaryType type, int system, AbstractFunction >* b) { FUNCNAME("ProblemVec::addDirichletBC()"); DirichletBC *dirichlet = new DirichletBC(type, b, componentSpaces_[system]); for (int i = 0; i < numComponents_; i++) { if (systemMatrix_ && (*systemMatrix_)[system][i]) { (*systemMatrix_)[system][i]->getBoundaryManager()->addBoundaryCondition(dirichlet); } } if (rhs_) rhs_->getDOFVector(system)->getBoundaryManager()->addBoundaryCondition(dirichlet); if (solution_) solution_->getDOFVector(system)->getBoundaryManager()->addBoundaryCondition(dirichlet); } void ProblemVec::addNeumannBC(BoundaryType type, int row, int col, AbstractFunction > *n) { FUNCNAME("ProblemVec::addNeumannBC()"); NeumannBC *neumann = new NeumannBC(type, n, componentSpaces_[row], componentSpaces_[col]); if (rhs_) rhs_->getDOFVector(row)->getBoundaryManager()->addBoundaryCondition(neumann); } void ProblemVec::addRobinBC(BoundaryType type, int row, int col, AbstractFunction > *n, AbstractFunction > *r) { FUNCNAME("ProblemVec::addRobinBC()"); RobinBC *robin = new RobinBC(type, n, r, componentSpaces_[row], componentSpaces_[col]); if (rhs_) rhs_->getDOFVector(row)->getBoundaryManager()->addBoundaryCondition(robin); if (systemMatrix_ && (*systemMatrix_)[row][col]) { (*systemMatrix_)[row][col]->getBoundaryManager()->addBoundaryCondition(robin); } } void ProblemVec::addPeriodicBC(BoundaryType type, int row, int col) { FUNCNAME("ProblemVec::addPeriodicBC()"); FiniteElemSpace *feSpace = componentSpaces_[row]; PeriodicBC *periodic = new PeriodicBC(type, feSpace); if (systemMatrix_ && (*systemMatrix_)[row][col]) (*systemMatrix_)[row][col]->getBoundaryManager()->addBoundaryCondition(periodic); if (rhs_) rhs_->getDOFVector(row)->getBoundaryManager()-> addBoundaryCondition(periodic); } void ProblemVec::writeResidualMesh(AdaptInfo *adaptInfo, const ::std::string name) { FUNCNAME("ProblemVec::writeResidualMesh()"); Mesh *mesh = this->getMesh(0); FiniteElemSpace *fe = this->getFESpace(0); std::map vec; TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS); while (elInfo) { Element *el = elInfo->getElement(); double lError = el->getEstimation(0); vec[elInfo->getElement()->getIndex()] = lError; elInfo = stack.traverseNext(elInfo); } ElementFileWriter fw(name, mesh, fe, vec); fw.writeFiles(adaptInfo, true); } void ProblemVec::serialize(::std::ostream &out) { FUNCNAME("ProblemVec::serialize()"); SerializerUtil::serializeBool(out, &allowFirstRef_); for (int i = 0; i < static_cast(meshes_.size()); i++) { meshes_[i]->serialize(out); } solution_->serialize(out); } void ProblemVec::deserialize(::std::istream &in) { FUNCNAME("ProblemVec::deserialize()"); SerializerUtil::deserializeBool(in, &allowFirstRef_); for (int i = 0; i < static_cast(meshes_.size()); i++) { meshes_[i]->deserialize(in); } solution_->deserialize(in); } }