45 void objective::makeFolder()
53 mkDir(objFunctionFolder_);
58 void objective::setObjectiveFilePtr()
const
60 objFunctionFilePtr_.reset
67 void objective::setInstantValueFilePtr()
const
69 instantValueFilePtr_.reset
79 void objective::setMeanValueFilePtr()
const
81 meanValueFilePtr_.reset
104 const dictionary&
dict,
105 const word& adjointSolverName,
106 const word& primalSolverName
115 fileName(
"uniform")/fileName(
"objectives")/adjointSolverName,
117 IOobject::READ_IF_PRESENT,
127 adjointSolverName_(adjointSolverName),
128 primalSolverName_(primalSolverName),
130 computeMeanFields_(false),
132 normalize_(
dict.getOrDefault<
bool>(
"normalize", false)),
135 JMean_(this->getOrDefault<scalar>(
"JMean",
Zero)),
137 normFactor_(nullptr),
138 target_(
dict.getOrDefault<scalar>(
"target",
Zero)),
140 integrationStartTimePtr_(nullptr),
141 integrationEndTimePtr_(nullptr),
149 bdSdbMultPtr_(nullptr),
150 bdndbMultPtr_(nullptr),
151 bdxdbMultPtr_(nullptr),
152 bdxdbDirectMultPtr_(nullptr),
153 bEdgeContribution_(nullptr),
154 bdJdStressPtr_(nullptr),
155 divDxDbMultPtr_(nullptr),
156 gradDxDbMultPtr_(nullptr),
158 objFunctionFolder_(
"word"),
159 objFunctionFilePtr_(nullptr),
160 instantValueFilePtr_(nullptr),
161 meanValueFilePtr_(nullptr)
166 if (
dict.found(
"integrationStartTime"))
170 new scalar(
dict.get<scalar>(
"integrationStartTime"))
173 if (
dict.found(
"integrationEndTime"))
177 new scalar(
dict.get<scalar>(
"integrationEndTime"))
184 scalar normFactor(
Zero);
185 if (
dict.readIfPresent(
"normFactor", normFactor))
202 const dictionary&
dict,
203 const word& objectiveType,
204 const word& adjointSolverName,
205 const word& primalSolverName
208 auto cstrIter = objectiveConstructorTablePtr_->cfind(objectiveType);
210 if (!cstrIter.found())
217 *objectiveConstructorTablePtr_
221 return autoPtr<objective>
236 bool objective::readDict(
const dictionary&
dict)
243 scalar objective::JCycle()
const
249 || (hasIntegrationStartTime() && hasIntegrationEndTime())
259 if (normalize_ && normFactor_.valid())
268 void objective::updateNormalizationFactor()
270 if (normalize_ && normFactor_.empty())
272 normFactor_.reset(
new scalar(JCycle()));
277 void objective::accumulateJMean(solverControl& solverControl)
279 if (solverControl.doAverageIter())
281 const label iAverageIter = solverControl.averageIter();
282 if (iAverageIter == 0)
286 scalar avIter(iAverageIter);
287 scalar oneOverItP1 = 1./(avIter + 1);
288 scalar mult = avIter*oneOverItP1;
289 JMean_ = JMean_*mult + J_*oneOverItP1;
294 void objective::accumulateJMean()
296 if (hasIntegrationStartTime() && hasIntegrationEndTime())
298 const scalar time = mesh_.time().value();
299 if (isWithinIntegrationTime())
301 const scalar dt = mesh_.time().deltaT().value();
302 const scalar elapsedTime = time - integrationStartTimePtr_();
303 const scalar denom = elapsedTime + dt;
304 JMean_ = (JMean_*elapsedTime + J_*dt)/denom;
310 <<
"Unallocated integration start or end time"
316 scalar objective::weight()
const
328 void objective::doNormalization()
330 if (normalize_ && normFactor_.valid())
332 const scalar oneOverNorm(1./normFactor_());
336 dJdbPtr_().primitiveFieldRef() *= oneOverNorm;
338 if (hasBoundarydJdb())
340 bdJdbPtr_() *= oneOverNorm;
344 bdSdbMultPtr_() *= oneOverNorm;
348 bdndbMultPtr_() *= oneOverNorm;
352 bdxdbMultPtr_() *= oneOverNorm;
354 if (hasdxdbDirectMult())
356 bdxdbDirectMultPtr_() *= oneOverNorm;
358 if (hasBoundaryEdgeContribution())
360 bEdgeContribution_() *= oneOverNorm;
362 if (hasDivDxDbMult())
364 divDxDbMultPtr_() *= oneOverNorm;
366 if (hasGradDxDbMult())
368 gradDxDbMultPtr_() *= oneOverNorm;
370 if (hasBoundarydJdStress())
372 bdJdStressPtr_() *= oneOverNorm;
378 bool objective::isWithinIntegrationTime()
const
380 if (hasIntegrationStartTime() && hasIntegrationEndTime())
382 const scalar time = mesh_.time().value();
385 time >= integrationStartTimePtr_()
386 && time <= integrationEndTimePtr_()
392 <<
"Unallocated integration start or end time"
399 void objective::incrementIntegrationTimes(
const scalar timeSpan)
401 if (hasIntegrationStartTime() && hasIntegrationEndTime())
403 integrationStartTimePtr_() += timeSpan;
404 integrationEndTimePtr_() += timeSpan;
409 <<
"Unallocated integration start or end time"
417 if (dJdbPtr_.empty())
422 createZeroFieldPtr<scalar>
425 (
"dJdb_" + objectiveName_),
426 dimensionSet(0, 5, -2, 0, 0, 0, 0)
437 if (bdJdbPtr_.empty())
439 bdJdbPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
441 return bdJdbPtr_()[patchI];
447 if (bdSdbMultPtr_.empty())
449 bdSdbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
451 return bdSdbMultPtr_()[patchI];
457 if (bdndbMultPtr_.empty())
459 bdndbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
461 return bdndbMultPtr_()[patchI];
467 if (bdxdbMultPtr_.empty())
469 bdxdbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
471 return bdxdbMultPtr_()[patchI];
477 if (bdxdbDirectMultPtr_.empty())
479 bdxdbDirectMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
481 return bdxdbDirectMultPtr_()[patchI];
485 const vectorField& objective::boundaryEdgeMultiplier
491 if (bdxdbDirectMultPtr_.empty())
494 <<
"Unallocated boundaryEdgeMultiplier field"
497 return bEdgeContribution_()[patchI][edgeI];
503 if (bdJdStressPtr_.empty())
505 bdJdStressPtr_.reset(createZeroBoundaryPtr<tensor>(mesh_));
507 return bdJdStressPtr_()[patchI];
513 if (bdJdbPtr_.empty())
515 bdJdbPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
523 if (bdSdbMultPtr_.empty())
525 bdSdbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
527 return bdSdbMultPtr_();
533 if (bdndbMultPtr_.empty())
535 bdndbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
537 return bdndbMultPtr_();
543 if (bdxdbMultPtr_.empty())
545 bdxdbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
547 return bdxdbMultPtr_();
553 if (bdxdbDirectMultPtr_.empty())
555 bdxdbDirectMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
557 return bdxdbDirectMultPtr_();
563 if (bdxdbDirectMultPtr_.empty())
566 <<
"Unallocated boundaryEdgeMultiplier field"
570 return bEdgeContribution_();
576 if (bdJdStressPtr_.empty())
578 bdJdStressPtr_.reset(createZeroBoundaryPtr<tensor>(mesh_));
580 return bdJdStressPtr_();
586 if (divDxDbMultPtr_.empty())
589 divDxDbMultPtr_.reset
591 createZeroFieldPtr<scalar>
594 (
"divDxDbMult"+objectiveName_),
601 return divDxDbMultPtr_();
607 if (gradDxDbMultPtr_.empty())
610 gradDxDbMultPtr_.reset
612 createZeroFieldPtr<tensor>
615 (
"gradDxDbMult"+objectiveName_),
621 return gradDxDbMultPtr_();
625 void objective::nullify()
633 if (hasBoundarydJdb())
649 if (hasdxdbDirectMult())
653 if (hasBoundaryEdgeContribution())
655 for (Field<vectorField>&
field : bEdgeContribution_())
660 if (hasBoundarydJdStress())
662 bdJdStressPtr_() == tensor::zero;
664 if (hasDivDxDbMult())
669 if (hasGradDxDbMult())
671 gradDxDbMultPtr_() ==
687 if (objFunctionFilePtr_.empty())
689 setObjectiveFilePtr();
692 objFunctionFilePtr_() << mesh_.time().value() <<
tab << J_ <<
endl;
699 void objective::writeInstantaneousValue()
const
706 if (instantValueFilePtr_.empty())
708 setInstantValueFilePtr();
711 instantValueFilePtr_() << mesh_.time().value() <<
tab << J_ <<
endl;
716 void objective::writeInstantaneousSeparator()
const
720 if (instantValueFilePtr_.valid())
722 instantValueFilePtr_() <<
endl;
728 void objective::writeMeanValue()
const
737 || (hasIntegrationStartTime() && hasIntegrationEndTime())
743 if (meanValueFilePtr_.empty())
745 setMeanValueFilePtr();
749 << mesh_.time().value() <<
tab << JMean_ <<
endl;
757 os.writeEntry(
"JMean", JMean_);
758 if (normFactor_.valid())
760 os.writeEntry(
"normFactor", normFactor_());