46 void objective::makeFolder()
54 mkDir(objFunctionFolder_);
59 void objective::setObjectiveFilePtr()
const
61 objFunctionFilePtr_.reset
68 void objective::setInstantValueFilePtr()
const
70 instantValueFilePtr_.reset
80 void objective::setMeanValueFilePtr()
const
82 meanValueFilePtr_.reset
105 const dictionary&
dict,
106 const word& adjointSolverName,
107 const word& primalSolverName
116 fileName(
"uniform")/fileName(
"objectives")/adjointSolverName,
118 IOobject::READ_IF_PRESENT,
128 adjointSolverName_(adjointSolverName),
129 primalSolverName_(primalSolverName),
131 computeMeanFields_(false),
133 normalize_(
dict.getOrDefault<
bool>(
"normalize", false)),
136 JMean_(this->getOrDefault<scalar>(
"JMean",
Zero)),
138 normFactor_(nullptr),
142 autoPtr<scalar>::
New(
dict.
get<scalar>(
"target")) :
145 integrationStartTimePtr_(nullptr),
146 integrationEndTimePtr_(nullptr),
154 bdSdbMultPtr_(nullptr),
155 bdndbMultPtr_(nullptr),
156 bdxdbMultPtr_(nullptr),
157 bdxdbDirectMultPtr_(nullptr),
158 bEdgeContribution_(nullptr),
159 bdJdStressPtr_(nullptr),
160 divDxDbMultPtr_(nullptr),
161 gradDxDbMultPtr_(nullptr),
163 objFunctionFolder_(
"word"),
164 objFunctionFilePtr_(nullptr),
165 instantValueFilePtr_(nullptr),
166 meanValueFilePtr_(nullptr),
167 width_(IOstream::defaultPrecision() + 5)
172 if (
dict.found(
"integrationStartTime"))
176 new scalar(
dict.get<scalar>(
"integrationStartTime"))
179 if (
dict.found(
"integrationEndTime"))
183 new scalar(
dict.get<scalar>(
"integrationEndTime"))
190 scalar normFactor(
Zero);
191 if (
dict.readIfPresent(
"normFactor", normFactor))
208 const dictionary&
dict,
209 const word& objectiveType,
210 const word& adjointSolverName,
211 const word& primalSolverName
214 auto* ctorPtr = objectiveConstructorTable(objectiveType);
223 *objectiveConstructorTablePtr_
227 return autoPtr<objective>
242 bool objective::readDict(
const dictionary&
dict)
249 scalar objective::JCycle()
const
255 || (hasIntegrationStartTime() && hasIntegrationEndTime())
268 if (normalize_ && normFactor_)
277 void objective::updateNormalizationFactor()
279 if (normalize_ && !normFactor_)
281 normFactor_.reset(
new scalar(JCycle()));
286 void objective::accumulateJMean(solverControl& solverControl)
288 if (solverControl.doAverageIter())
290 const label iAverageIter = solverControl.averageIter();
291 if (iAverageIter == 0)
295 scalar avIter(iAverageIter);
296 scalar oneOverItP1 = 1./(avIter + 1);
297 scalar mult = avIter*oneOverItP1;
298 JMean_ = JMean_*mult + J_*oneOverItP1;
303 void objective::accumulateJMean()
305 if (hasIntegrationStartTime() && hasIntegrationEndTime())
307 const scalar time = mesh_.time().value();
308 if (isWithinIntegrationTime())
310 const scalar dt = mesh_.time().deltaT().value();
311 const scalar elapsedTime = time - integrationStartTimePtr_();
312 const scalar denom = elapsedTime + dt;
313 JMean_ = (JMean_*elapsedTime + J_*dt)/denom;
319 <<
"Unallocated integration start or end time"
325 scalar objective::weight()
const
337 void objective::doNormalization()
339 if (normalize_ && normFactor_)
341 const scalar oneOverNorm(1./normFactor_());
345 dJdbPtr_().primitiveFieldRef() *= oneOverNorm;
347 if (hasBoundarydJdb())
349 bdJdbPtr_() *= oneOverNorm;
353 bdSdbMultPtr_() *= oneOverNorm;
357 bdndbMultPtr_() *= oneOverNorm;
361 bdxdbMultPtr_() *= oneOverNorm;
363 if (hasdxdbDirectMult())
365 bdxdbDirectMultPtr_() *= oneOverNorm;
367 if (hasBoundaryEdgeContribution())
369 bEdgeContribution_() *= oneOverNorm;
371 if (hasDivDxDbMult())
373 divDxDbMultPtr_() *= oneOverNorm;
375 if (hasGradDxDbMult())
377 gradDxDbMultPtr_() *= oneOverNorm;
379 if (hasBoundarydJdStress())
381 bdJdStressPtr_() *= oneOverNorm;
387 bool objective::isWithinIntegrationTime()
const
389 if (hasIntegrationStartTime() && hasIntegrationEndTime())
391 const scalar time = mesh_.time().value();
394 time >= integrationStartTimePtr_()
395 && time <= integrationEndTimePtr_()
401 <<
"Unallocated integration start or end time"
408 void objective::incrementIntegrationTimes(
const scalar timeSpan)
410 if (hasIntegrationStartTime() && hasIntegrationEndTime())
412 integrationStartTimePtr_() += timeSpan;
413 integrationEndTimePtr_() += timeSpan;
418 <<
"Unallocated integration start or end time"
431 createZeroFieldPtr<scalar>
434 (
"dJdb_" + objectiveName_),
435 dimensionSet(0, 5, -2, 0, 0, 0, 0)
448 bdJdbPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
450 return bdJdbPtr_()[patchI];
458 bdSdbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
460 return bdSdbMultPtr_()[patchI];
468 bdndbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
470 return bdndbMultPtr_()[patchI];
478 bdxdbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
480 return bdxdbMultPtr_()[patchI];
486 if (!bdxdbDirectMultPtr_)
488 bdxdbDirectMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
490 return bdxdbDirectMultPtr_()[patchI];
494 const vectorField& objective::boundaryEdgeMultiplier
500 if (!bdxdbDirectMultPtr_)
503 <<
"Unallocated boundaryEdgeMultiplier field"
506 return bEdgeContribution_()[patchI][edgeI];
514 bdJdStressPtr_.reset(createZeroBoundaryPtr<tensor>(mesh_));
516 return bdJdStressPtr_()[patchI];
524 bdJdbPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
534 bdSdbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
536 return *bdSdbMultPtr_;
544 bdndbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
546 return *bdndbMultPtr_;
554 bdxdbMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
556 return *bdxdbMultPtr_;
562 if (!bdxdbDirectMultPtr_)
564 bdxdbDirectMultPtr_.reset(createZeroBoundaryPtr<vector>(mesh_));
566 return *bdxdbDirectMultPtr_;
572 if (!bdxdbDirectMultPtr_)
575 <<
"Unallocated boundaryEdgeMultiplier field"
579 return *bEdgeContribution_;
587 bdJdStressPtr_.reset(createZeroBoundaryPtr<tensor>(mesh_));
589 return *bdJdStressPtr_;
595 if (!divDxDbMultPtr_)
598 divDxDbMultPtr_.reset
600 createZeroFieldPtr<scalar>
603 (
"divDxDbMult"+objectiveName_),
610 return *divDxDbMultPtr_;
616 if (!gradDxDbMultPtr_)
619 gradDxDbMultPtr_.reset
621 createZeroFieldPtr<tensor>
624 (
"gradDxDbMult"+objectiveName_),
630 return *gradDxDbMultPtr_;
634 void objective::nullify()
642 if (hasBoundarydJdb())
658 if (hasdxdbDirectMult())
662 if (hasBoundaryEdgeContribution())
664 for (Field<vectorField>&
field : bEdgeContribution_())
669 if (hasBoundarydJdStress())
671 bdJdStressPtr_() == tensor::zero;
673 if (hasDivDxDbMult())
678 if (hasGradDxDbMult())
680 gradDxDbMultPtr_() ==
696 if (!objFunctionFilePtr_)
698 setObjectiveFilePtr();
699 OFstream& file = objFunctionFilePtr_();
700 ios_base::fmtflags flags = file.flags();
701 flags |= std::cout.left;
705 file<<
setw(width_) <<
"#target" <<
" "
706 <<
setw(width_) << target_() <<
endl;
710 file<<
setw(width_) <<
"#normFactor " <<
" "
711 <<
setw(width_) << normFactor_() <<
endl;
714 file<<
setw(4) <<
"#" <<
" ";
715 file<<
setw(width_) <<
"J" <<
" ";
716 file<<
setw(width_) <<
"JCycle" <<
" ";
721 OFstream& file = objFunctionFilePtr_();
722 file<<
setw(4) << mesh_.time().value() <<
" ";
723 file<<
setw(width_) << J_ <<
" ";
724 file<<
setw(width_) << JCycle() <<
" ";
733 void objective::writeInstantaneousValue()
const
740 if (!instantValueFilePtr_)
742 setInstantValueFilePtr();
745 instantValueFilePtr_() << mesh_.time().value() <<
tab << J_ <<
endl;
750 void objective::writeInstantaneousSeparator()
const
754 if (instantValueFilePtr_)
756 instantValueFilePtr_() <<
endl;
762 void objective::writeMeanValue()
const
771 || (hasIntegrationStartTime() && hasIntegrationEndTime())
777 if (!meanValueFilePtr_)
779 setMeanValueFilePtr();
783 << mesh_.time().value() <<
tab << JMean_ <<
endl;
791 os.writeEntry(
"JMean", JMean_);
794 os.writeEntry(
"normFactor", normFactor_());
800 void objective::addHeaderInfo()
const
806 void objective::addHeaderColumns()
const
812 void objective::addColumnValues()
const