bool StructuralFE2MaterialStatus :: createRVE(int n, GaussPoint *gp, const std :: string &inputfile) { OOFEMTXTDataReader dr( inputfile.c_str() ); EngngModel *em = InstanciateProblem(dr, _processor, 0); // Everything but nrsolver is updated. dr.finish(); em->setProblemScale(microScale); em->checkProblemConsistency(); em->initMetaStepAttributes( em->giveMetaStep(1) ); em->giveNextStep(); // Makes sure there is a timestep (which we will modify before solving a step) em->init(); this->rve.reset( em ); std :: ostringstream name; name << this->rve->giveOutputBaseFileName() << "-gp" << n; if ( this->domain->giveEngngModel()->isParallel() && this->domain->giveEngngModel()->giveNumberOfProcesses() > 1 ) { name << "." << this->domain->giveEngngModel()->giveRank(); } this->rve->letOutputBaseFileNameBe( name.str() ); this->bc = dynamic_cast< PrescribedGradientHomogenization * >( this->rve->giveDomain(1)->giveBc(1) ); if ( !this->bc ) { OOFEM_ERROR("RVE doesn't have necessary boundary condition; should have a type of PrescribedGradientHomogenization as first b.c."); } return true; }
// Uses an input file for now, should eventually create the RVE itself. bool FE2FluidMaterialStatus :: createRVE(int n, GaussPoint *gp, const std::string &inputfile) { OOFEMTXTDataReader dr(inputfile.c_str()); EngngModel *em = InstanciateProblem(&dr, _processor, 0); // Everything but nrsolver is updated. dr.finish(); em->setProblemScale(microScale); em->checkProblemConsistency(); em->initMetaStepAttributes( em->giveMetaStep( 1 ) ); em->giveNextStep(); // Makes sure there is a timestep (which we will modify before solving a step) em->init(); this->rve = dynamic_cast<StokesFlow*> (em); if (!this->rve) { return false; } std::ostringstream name; name << this->rve->giveOutputBaseFileName() << "-gp" << n; #ifdef __PARALLEL_MODE if (this->domain->giveEngngModel()->isParallel() && this->domain->giveEngngModel()->giveNumberOfProcesses() > 1) { name << "." << this->domain->giveEngngModel()->giveRank(); } #endif this->rve->letOutputBaseFileNameBe(name.str()); this->bc = dynamic_cast< MixedGradientPressureBC* >(this->rve->giveDomain(1)->giveBc(1)); if (!this->bc) { OOFEM_ERROR("FE2FluidMaterialStatus :: createRVE - RVE doesn't have necessary boundary condition; should have MixedGradientPressure as first b.c. (in first domain)"); } return true; }
void SolutionbasedShapeFunction :: loadProblem() { for ( int i = 0; i < this->domain->giveNumberOfSpatialDimensions(); i++ ) { OOFEM_LOG_INFO("************************** Instanciating microproblem from file %s for dimension %u\n", filename.c_str(), i); // Set up and solve problem OOFEMTXTDataReader drMicro( filename.c_str() ); EngngModel *myEngngModel = InstanciateProblem(& drMicro, _processor, 0, NULL, false); drMicro.finish(); myEngngModel->checkProblemConsistency(); myEngngModel->initMetaStepAttributes( myEngngModel->giveMetaStep(1) ); thisTimestep = myEngngModel->giveNextStep(); myEngngModel->init(); this->setLoads(myEngngModel, i + 1); // Check for ( int j = 1; j <= myEngngModel->giveDomain(1)->giveNumberOfElements(); j++ ) { Element *e = myEngngModel->giveDomain(1)->giveElement(j); FloatArray centerCoord; int vlockCount = 0; centerCoord.resize(3); centerCoord.zero(); for ( int k = 1; k <= e->giveNumberOfDofManagers(); k++ ) { DofManager *dman = e->giveDofManager(k); centerCoord.add( * dman->giveCoordinates() ); for ( Dof *dof: *dman ) { if ( dof->giveBcId() != 0 ) { vlockCount++; } } } if ( vlockCount == 30 ) { OOFEM_WARNING("Element over-constrained (%u)! Center coordinate: %f, %f, %f\n", e->giveNumber(), centerCoord.at(1) / 10, centerCoord.at(2) / 10, centerCoord.at(3) / 10); } } myEngngModel->solveYourselfAt(thisTimestep); isLoaded = true; // Set correct export filename std :: string originalFilename; originalFilename = myEngngModel->giveOutputBaseFileName(); if ( i == 0 ) { originalFilename = originalFilename + "_X"; } if ( i == 1 ) { originalFilename = originalFilename + "_Y"; } if ( i == 2 ) { originalFilename = originalFilename + "_Z"; } myEngngModel->letOutputBaseFileNameBe(originalFilename + "_1_Base"); myEngngModel->doStepOutput(thisTimestep); modeStruct *mode = new(modeStruct); mode->myEngngModel = myEngngModel; // Check elements // Set unknowns to the mean value of opposite sides of the domain. // Loop thru all nodes and compute phi for all degrees of freedom on the boundary. Save phi in a list for later use. initializeSurfaceData(mode); // Update with factor double am = 1.0, ap = 1.0; computeCorrectionFactors(* mode, & dofs, & am, & ap); OOFEM_LOG_INFO("Correction factors: am=%f, ap=%f\n", am, ap); mode->ap = ap; mode->am = am; updateModelWithFactors(mode); // myEngngModel->letOutputBaseFileNameBe(originalFilename + "_2_Updated"); modes.push_back(mode); OOFEM_LOG_INFO("************************** Microproblem at %p instanciated \n", myEngngModel); } }