33 template<
template<
class>
class PrimitiveField>
48 deltaTSp0Ptr_(&deltaTSp0),
58 template<
template<
class>
class PrimitiveField>
80 template<
template<
class>
class PrimitiveField>
94 template<
template<
class>
class PrimitiveField>
108 deltaTSp0Ptr_(&deltaTSp0),
118 template<
template<
class>
class PrimitiveField>
132 template<
template<
class>
class PrimitiveField>
158 deltaTSp0Ptr_(&deltaTSp0),
197 tDeltaT_(eqn.tDeltaT_),
198 psiSubSub_(eqn.psiSubSub_),
199 psiSub_(eqn.psiSub_),
200 psiPtr_(eqn.psiPtr_),
203 deltaTSu(eqn.deltaTSu),
204 deltaTSp(eqn.deltaTSp),
215 tDeltaT_(move(eqn.tDeltaT_)),
216 psiSubSub_(eqn.psiSubSub_),
217 psiSub_(eqn.psiSub_),
218 psiPtr_(eqn.psiPtr_),
219 deltaTSp0Ptr_(eqn.deltaTSp0Ptr_),
221 deltaTSu(move(eqn.deltaTSu)),
222 deltaTSp(move(eqn.deltaTSp)),
226 eqn.deltaTSp0Ptr_ = NullObjectPtr<LagrangianDynamicField<scalar>>();
227 eqn.S0Ptr_ = NullObjectPtr<LagrangianDynamicField<Type>>();
235 tDeltaT_(tEqn().tDeltaT_, tEqn.isTmp()),
236 psiSubSub_(tEqn().psiSubSub_),
237 psiSub_(tEqn().psiSub_),
238 psiPtr_(tEqn().psiPtr_),
242 ? tEqn().deltaTSp0Ptr_
278 tEqn.ref().deltaTSp0Ptr_ =
279 NullObjectPtr<LagrangianDynamicField<scalar>>();
284 NullObjectPtr<LagrangianDynamicField<Type>>();
300 mesh().sub(deltaTSp0Ptr_->internalField())
305 if (deltaTSp.valid()) deltaTSp0 = deltaTSp.S();
312 mesh().sub(S0Ptr_->internalField())
317 if (
Su.valid()) S0 +=
Su.S();
318 if (
Sp.valid()) S0 +=
Sp.Su(*this)->S();
365 return psiIo().name();
370 template<
template<
class>
class PrimitiveField>
386 && other.tDeltaT_.valid()
387 && &tDeltaT_() != &other.tDeltaT_()
391 <<
"Combining equations with different time-step fields"
395 if (&psiIo() != &other.
psiIo())
398 <<
"Combining equations with different fields"
406 else if (name_ != other.
name_)
411 if (!tDeltaT_.valid() && other.tDeltaT_.valid())
418 psiPtr_ = other.psiPtr_;
429 if (!tOther.isTmp())
return;
431 if (
notNull(tOther().deltaTSp0Ptr_))
433 if (
notNull(deltaTSp0Ptr_) && deltaTSp0Ptr_ != tOther().deltaTSp0Ptr_)
436 <<
"Operating tmp equations with different previous "
440 if (
isNull(deltaTSp0Ptr_)) deltaTSp0Ptr_ = tOther.ref().deltaTSp0Ptr_;
442 tOther.ref().deltaTSp0Ptr_ =
443 NullObjectPtr<LagrangianDynamicField<scalar>>();
448 if (
notNull(S0Ptr_) && S0Ptr_ != tOther().S0Ptr_)
451 <<
"Operating tmp equations with different previous "
455 if (
isNull(S0Ptr_)) S0Ptr_ = tOther.ref().S0Ptr_;
457 tOther.ref().S0Ptr_ =
458 NullObjectPtr<LagrangianDynamicField<Type>>();
469 if (!tDeltaT_.valid())
472 <<
"Cannot evaluate equation " << name_ <<
" for field "
482 tResult.
ref() *= tDeltaT_();
483 tResult.
ref() += deltaTSu;
492 if (!tDeltaT_.valid())
495 <<
"Cannot evaluate equation " << name_ <<
" for field "
502 tResult.
ref() *= tDeltaT_();
503 tResult.
ref() += deltaTSp;
513 if (!tDeltaT_.valid())
516 <<
"Cannot evaluate equation " << name_ <<
" for field "
526 tResult.
ref() +=
Sp.H();
527 tResult.
ref() *= tDeltaT_();
528 tResult.
ref() += deltaTSu;
538 if (!tDeltaT_.valid())
541 <<
"Cannot evaluate equation " << name_ <<
" for field "
550 tResult.
ref() +=
Sp.A();
551 tResult.
ref() *= tDeltaT_();
552 tResult.
ref() += deltaTSp;
561 if (!tDeltaT_.valid())
564 <<
"Cannot solve equation " << name_ <<
" for field "
571 <<
"Cannot solve equation " << name_ <<
" for constant field "
575 if (!deltaTSp.valid() && !
Sp.valid())
578 <<
"Cannot solve equation " << name_ <<
" for field "
582 if (!deltaTSu.valid() && !
Su.valid())
588 *psiPtr_ = - (allSu()()/allSp()());
592 deltaTSp0Ptr_ = NullObjectPtr<LagrangianDynamicField<scalar>>();
593 S0Ptr_ = NullObjectPtr<LagrangianDynamicField<Type>>();
651 tResult.ref().deltaTSu.negate();
652 tResult.ref().deltaTSp.negate();
653 tResult.ref().Su.negate();
654 tResult.ref().Sp.negate();
655 return tResult.ref();
662 const tmp<LagrangianEqn<Type>>& tEqn
665 tmp<LagrangianEqn<Type>> tResult(-tEqn());
671 #define LAGRANGIAN_EQN_EQN_OPERATOR(Op, EqOp) \
673 template<class Type> \
674 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
676 const LagrangianEqn<Type>& a, \
677 const LagrangianEqn<Type>& b \
680 tmp<LagrangianEqn<Type>> tResult(new LagrangianEqn<Type>(a)); \
681 tResult.ref().op(b); \
682 tResult.ref() EqOp b; \
686 template<class Type> \
687 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
689 const tmp<LagrangianEqn<Type>>& tA, \
690 const LagrangianEqn<Type>& b \
693 tmp<LagrangianEqn<Type>> tResult(tA); \
694 tResult.ref().op(b); \
695 tResult.ref() EqOp b; \
699 template<class Type> \
700 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
702 const tmp<LagrangianEqn<Type>>& tA, \
703 const tmp<LagrangianEqn<Type>>& tB \
707 if (!tA.isTmp()) return tA() Op tB; \
708 if (!tB.isTmp()) return tA Op tB(); \
709 tmp<LagrangianEqn<Type>> tResult(tA Op tB()); \
710 tResult.ref().setPrevious(tB); \
714 #define LAGRANGIAN_COMMUTATIVE_EQN_EQN_OPERATOR(Op, EqOp) \
716 LAGRANGIAN_EQN_EQN_OPERATOR(Op, EqOp) \
718 template<class Type> \
719 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
721 const LagrangianEqn<Type>& a, \
722 const tmp<LagrangianEqn<Type>>& tB \
728 #define LAGRANGIAN_NON_COMMUTATIVE_EQN_EQN_OPERATOR(Op, EqOp) \
730 LAGRANGIAN_EQN_EQN_OPERATOR(Op, EqOp) \
732 template<class Type> \
733 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
735 const LagrangianEqn<Type>& a, \
736 const tmp<LagrangianEqn<Type>>& tB \
739 tmp<LagrangianEqn<Type>> tResult(a Op tB()); \
740 tResult.ref().setPrevious(tB); \
750 #undef LAGRANGIAN_EQN_EQN_OPERATOR
751 #undef LAGRANGIAN_COMMUTATIVE_EQN_EQN_OPERATOR
752 #undef LAGRANGIAN_NON_COMMUTATIVE_EQN_EQN_OPERATOR
755 #define LAGRANGIAN_EQN_FIELD_OPERATOR(Op, EqOp, LagrangianSubField) \
757 template<class Type> \
758 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
760 const LagrangianEqn<Type>& eqn, \
761 const LagrangianSubField<Type>& field \
764 tmp<LagrangianEqn<Type>> tResult(new LagrangianEqn<Type>(eqn)); \
765 tResult.ref().Su EqOp field; \
769 template<class Type> \
770 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
772 const tmp<LagrangianEqn<Type>>& tEqn, \
773 const LagrangianSubField<Type>& field \
776 tmp<LagrangianEqn<Type>> tResult(tEqn); \
777 tResult.ref().Su EqOp field; \
781 template<class Type> \
782 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
784 const tmp<LagrangianEqn<Type>>& tEqn, \
785 const tmp<LagrangianSubField<Type>>& tField \
788 tmp<LagrangianEqn<Type>> tResult(tEqn); \
789 tResult.ref().Su EqOp tField; \
793 template<class Type> \
794 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
796 const LagrangianEqn<Type>& eqn, \
797 const tmp<LagrangianSubField<Type>>& tField \
800 tmp<LagrangianEqn<Type>> tResult(new LagrangianEqn<Type>(eqn)); \
801 tResult.ref().Su EqOp tField; \
805 #define LAGRANGIAN_FIELD_EQN_OPERATOR(Op, EqOp, LagrangianSubField) \
807 template<class Type> \
808 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
810 const LagrangianSubField<Type>& field, \
811 const LagrangianEqn<Type>& eqn \
814 tmp<LagrangianEqn<Type>> tResult = \
815 LagrangianEqn<Type>::NewEmpty(eqn); \
816 tResult.ref() += field; \
817 tResult.ref() EqOp eqn; \
821 template<class Type> \
822 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
824 const LagrangianSubField<Type>& field, \
825 const tmp<LagrangianEqn<Type>>& tEqn \
828 tmp<LagrangianEqn<Type>> tResult = \
829 LagrangianEqn<Type>::NewEmpty(tEqn()); \
830 tResult.ref() += field; \
831 tResult.ref() EqOp tEqn; \
835 template<class Type> \
836 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
838 const tmp<LagrangianSubField<Type>>& tField, \
839 const tmp<LagrangianEqn<Type>>& tEqn \
842 tmp<LagrangianEqn<Type>> tResult = \
843 LagrangianEqn<Type>::NewEmpty(tEqn()); \
844 tResult.ref() += tField; \
845 tResult.ref() EqOp tEqn; \
849 template<class Type> \
850 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
852 const tmp<LagrangianSubField<Type>>& tField, \
853 const LagrangianEqn<Type>& eqn \
856 tmp<LagrangianEqn<Type>> tResult = \
857 LagrangianEqn<Type>::NewEmpty(eqn); \
858 tResult.ref() += tField; \
859 tResult.ref() EqOp eqn; \
881 #undef LAGRANGIAN_EQN_FIELD_OPERATOR
882 #undef LAGRANGIAN_FIELD_EQN_OPERATOR
885 #define LAGRANGIAN_EQN_SCALAR_FIELD_OPERATOR(Op, EqOp, LagrangianSubField) \
887 template<class Type> \
888 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
890 const LagrangianEqn<Type>& eqn, \
891 const LagrangianSubField<scalar>& field \
894 tmp<LagrangianEqn<Type>> tResult(new LagrangianEqn<Type>(eqn)); \
895 tResult.ref().deltaTSu EqOp field; \
896 tResult.ref().deltaTSp EqOp field; \
897 tResult.ref().Su EqOp field; \
898 tResult.ref().Sp EqOp field; \
902 template<class Type> \
903 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
905 const tmp<LagrangianEqn<Type>>& tEqn, \
906 const LagrangianSubField<scalar>& field \
909 tmp<LagrangianEqn<Type>> tResult(tEqn); \
910 tResult.ref().deltaTSu EqOp field; \
911 tResult.ref().deltaTSp EqOp field; \
912 tResult.ref().Su EqOp field; \
913 tResult.ref().Sp EqOp field; \
917 template<class Type> \
918 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
920 const tmp<LagrangianEqn<Type>>& tEqn, \
921 const tmp<LagrangianSubField<scalar>>& tField \
924 tmp<LagrangianEqn<Type>> tResult(tEqn); \
925 tResult.ref().deltaTSu EqOp tField(); \
926 tResult.ref().deltaTSp EqOp tField(); \
927 tResult.ref().Su EqOp tField(); \
928 tResult.ref().Sp EqOp tField(); \
933 template<class Type> \
934 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
936 const LagrangianEqn<Type>& eqn, \
937 const tmp<LagrangianSubField<scalar>>& tField \
940 tmp<LagrangianEqn<Type>> tResult(new LagrangianEqn<Type>(eqn)); \
941 tResult.ref().deltaTSu EqOp tField(); \
942 tResult.ref().deltaTSp EqOp tField(); \
943 tResult.ref().Su EqOp tField(); \
944 tResult.ref().Sp EqOp tField(); \
949 #define LAGRANGIAN_COMMUTATIVE_SCALAR_FIELD_EQN_OPERATOR(Op,LagrangianSubField)\
951 template<class Type> \
952 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
954 const LagrangianSubField<scalar>& field, \
955 const LagrangianEqn<Type>& eqn \
958 return eqn Op field; \
961 template<class Type> \
962 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
964 const LagrangianSubField<scalar>& field, \
965 const tmp<LagrangianEqn<Type>>& tEqn \
968 return tEqn Op field; \
971 template<class Type> \
972 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
974 const tmp<LagrangianSubField<scalar>>& tField, \
975 const tmp<LagrangianEqn<Type>>& tEqn \
978 return tEqn Op tField; \
981 template<class Type> \
982 Foam::tmp<Foam::LagrangianEqn<Type>> Foam::operator Op \
984 const tmp<LagrangianSubField<scalar>>& tField, \
985 const LagrangianEqn<Type>& eqn \
988 return eqn Op tField; \
1001 #undef LAGRANGIAN_EQN_SCALAR_FIELD_OPERATOR
1002 #undef LAGRANGIAN_COMMUTATIVE_SCALAR_FIELD_EQN_OPERATOR
#define LAGRANGIAN_COMMUTATIVE_SCALAR_FIELD_EQN_OPERATOR(Op, LagrangianSubField)
#define LAGRANGIAN_NON_COMMUTATIVE_EQN_EQN_OPERATOR(Op, EqOp)
#define LAGRANGIAN_COMMUTATIVE_EQN_EQN_OPERATOR(Op, EqOp)
#define LAGRANGIAN_EQN_SCALAR_FIELD_OPERATOR(Op, EqOp, LagrangianSubField)
#define LAGRANGIAN_EQN_FIELD_OPERATOR(Op, EqOp, LagrangianSubField)
#define LAGRANGIAN_FIELD_EQN_OPERATOR(Op, EqOp, LagrangianSubField)
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Pre-declare SubField and related Field type.
Generic GeometricField class.
static word group(const word &name)
Return group (extension part of name)
Class to store a coefficient of a Lagrangian equation.
word name_
Symbolic name of the equation or equation term.
This class stores the coefficients of a Lagrangian equation, and facilitates solving that equation an...
LagrangianCoeff< scalar, true > deltaTSp
Implicit time-coefficient.
LagrangianSp< Type > Sp
Implicit coefficient.
void op(const LagrangianEqn< Type > &other)
Check the operation with another equation.
LagrangianCoeff< Type, false > Su
Explicit coefficient.
void solve(const bool final)
Solve.
tmp< LagrangianSp< Type > > allSp() const
Return the combined time and non-time implicit coefficient.
tmp< LagrangianCoeff< scalar, true > > allDiagonalSp() const
Return the combined time and non-time implicit diagonal.
const regIOobject & psiIo() const
Return the field IO.
~LagrangianEqn()
Destructor.
void operator+=(const LagrangianEqn< Type > &other)
Addition assignment.
tmp< LagrangianCoeff< Type, false > > allDiagonalSu() const
Return the combined time and non-time explicit diagonal.
tmp< LagrangianSubSubField< Type > > psi() const
Return the field.
static tmp< LagrangianEqn< Type > > NewEmpty(const LagrangianEqn< Type > &)
Construct from another equation, with empty coefficients.
LagrangianEqn(const word &name, const tmp< LagrangianSubScalarField > &tDeltaT, const LagrangianSubField< Type, PrimitiveField > &psi, LagrangianDynamicField< scalar > &deltaTSp0=NullObjectNonConstRef< LagrangianDynamicField< scalar >>(), LagrangianDynamicField< Type > &S0=NullObjectNonConstRef< LagrangianDynamicField< Type >>())
Construct for a const field and a tmp time-step with a name.
void setPrevious(const tmp< LagrangianEqn< Type >> &tOther)
Set the previous field to that stored by another tmp equation.
LagrangianCoeff< Type, false > deltaTSu
Explicit time-coefficient.
const word & psiName() const
Return the field name.
void operator-=(const LagrangianEqn< Type > &other)
Subtraction assignment.
bool isPsi(const LagrangianSubField< Type, PrimitiveField > &psi) const
Return whether the given field is that of the equation.
tmp< LagrangianCoeff< Type, false > > allSu() const
Return the combined time and non-time explicit coefficient.
Wrapper around LagrangianCoeff to specialise for the implicit coefficient. Trivial at present....
Pre-declare related SubField type.
Reference counter for various OpenFOAM components.
regIOobject is an abstract class derived from IOobject to handle automatic object registration with t...
A class for managing temporary objects.
T & ref() const
Return non-const reference or generate a fatal error.
A class for handling words, derived from string.
static const word null
An empty word.
Foam::fvMesh mesh(Foam::IOobject(regionName, runTime.name(), runTime, Foam::IOobject::MUST_READ), false)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
const volScalarField & psi
bool valid(const PtrList< ModelType > &l)
tmp< VolField< Type > > Su(const VolField< Type > &su, const VolField< Type > &vf)
tmp< VolField< Type > > Sp(const volScalarField &sp, const VolField< Type > &vf)
errorManipArg< error, int > exit(error &err, const int errNo=1)
DimensionedField< Type, LagrangianSubMesh, PrimitiveField > LagrangianSubField
DimensionedField< Type, LagrangianSubMesh, SubField > LagrangianSubSubField
bool notNull(const T &t)
Return true if t is not a reference to the nullObject of type T.
T * NullObjectPtr()
Return pointer to the nullObject of type T.
const T & NullObjectRef()
Return const reference to the nullObject of type T.
word name(const LagrangianState state)
Return a string representation of a Lagrangian state enumeration.
bool isNull(const T &t)
Return true if t is a reference to the nullObject of type T.
void operator+=(fvMatrix< Type > &fvEqn, const CarrierEqn< Type > &cEqn)
Add to a finite-volume equation.
void operator-=(fvMatrix< Type > &fvEqn, const CarrierEqn< Type > &cEqn)
Subtract from a finite-volume equation.
tmp< DimensionedField< Type, GeoMesh, SubField > > toSubField(const DimensionedField< Type, GeoMesh, Field > &)
Return a temporary sub-field from a reference to a field.
Functions to cast/convert dimensioned field references and temporaries based on a primitive field to ...