Rearranging solidMechanics solvers and src, and added wmake darwin rules
This commit is contained in:
parent
2fa97bf862
commit
ab6cd72839
777 changed files with 45905 additions and 35089 deletions
|
@ -1,9 +0,0 @@
|
|||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # run from this directory
|
||||
|
||||
set -x
|
||||
|
||||
wmake libso materialModels
|
||||
|
||||
wmake newStressedFoam
|
||||
wmake newContactStressFoam
|
|
@ -1,35 +0,0 @@
|
|||
rheologyModel/rheologyModel.C
|
||||
rheologyLaws = rheologyModel/rheologyLaws
|
||||
|
||||
$(rheologyLaws)/rheologyLaw/rheologyLaw.C
|
||||
$(rheologyLaws)/rheologyLaw/newRheologyLaw.C
|
||||
|
||||
$(rheologyLaws)/linearElastic/linearElastic.C
|
||||
$(rheologyLaws)/multiMaterial/multiMaterial.C
|
||||
$(rheologyLaws)/MaxwellViscoelastic/MaxwellViscoelastic.C
|
||||
$(rheologyLaws)/BurgersViscoelastic/BurgersViscoelastic.C
|
||||
$(rheologyLaws)/KelvinSLSViscoelastic/KelvinSLSViscoelastic.C
|
||||
$(rheologyLaws)/MaxwellSLSViscoelastic/MaxwellSLSViscoelastic.C
|
||||
$(rheologyLaws)/MaxwellElasticViscoelastic/MaxwellElasticViscoelastic.C
|
||||
$(rheologyLaws)/PronyViscoelastic/PronyViscoelastic.C
|
||||
|
||||
thermalModel/thermalModel.C
|
||||
thermalLaws = thermalModel/thermalLaws
|
||||
|
||||
$(thermalLaws)/thermalLaw/thermalLaw.C
|
||||
$(thermalLaws)/thermalLaw/newThermalLaw.C
|
||||
$(thermalLaws)/constantThermal/constantThermal.C
|
||||
$(thermalLaws)/multiMaterialThermal/multiMaterialThermal.C
|
||||
|
||||
cohesiveLaws/cohesiveLaw/cohesiveLaw.C
|
||||
cohesiveLaws/Dugdale/DugdaleCohesiveLaw.C
|
||||
cohesiveLaws/linear/linearCohesiveLaw.C
|
||||
|
||||
fvPatchFields/tractionDisplacement/tractionDisplacementFvPatchVectorField.C
|
||||
fvPatchFields/tractionDisplacementThermo/tractionDisplacementThermoFvPatchVectorField.C
|
||||
fvPatchFields/nusselt/nusseltFvPatchScalarField.C
|
||||
fvPatchFields/newDirectionMixed/newDirectionMixedFvPatchFields.C
|
||||
fvPatchFields/cohesiveLaw/cohesiveLawFvPatchVectorField.C
|
||||
fvPatchFields/cohesiveZone/cohesiveZoneFvPatchVectorField.C
|
||||
|
||||
LIB = $(FOAM_LIBBIN)/libmaterialModels
|
|
@ -1,5 +0,0 @@
|
|||
EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume
|
|
@ -1,88 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Description
|
||||
Dugdale cohesive law.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "DugdaleCohesiveLaw.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(DugdaleCohesiveLaw, 0);
|
||||
addToRunTimeSelectionTable(cohesiveLaw, DugdaleCohesiveLaw, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from components
|
||||
Foam::DugdaleCohesiveLaw::DugdaleCohesiveLaw
|
||||
(
|
||||
const word& cohesiveLawName,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
cohesiveLaw(cohesiveLawName, dict),
|
||||
deltaC_(GIc()/sigmaMax())
|
||||
{}
|
||||
|
||||
|
||||
Foam::DugdaleCohesiveLaw::DugdaleCohesiveLaw
|
||||
(
|
||||
const DugdaleCohesiveLaw& dcl
|
||||
)
|
||||
:
|
||||
cohesiveLaw(dcl),
|
||||
deltaC_(dcl.deltaC_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::DugdaleCohesiveLaw::~DugdaleCohesiveLaw()
|
||||
{}
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
//- Return current holding traction
|
||||
Foam::scalar Foam::DugdaleCohesiveLaw::traction(scalar delta) const
|
||||
{
|
||||
if (delta > deltaC().value())
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
else if (delta < 0)
|
||||
{
|
||||
return sigmaMax().value();
|
||||
}
|
||||
|
||||
return sigmaMax().value();
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,112 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Description
|
||||
Virtual base class for cohesive law.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "cohesiveLaw.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(cohesiveLaw, 0);
|
||||
defineRunTimeSelectionTable(cohesiveLaw, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::autoPtr<Foam::cohesiveLaw> Foam::cohesiveLaw::New
|
||||
(
|
||||
const word& cohesiveLawName,
|
||||
const dictionary& dict
|
||||
)
|
||||
{
|
||||
Info << "Selecting cohesive law: " << cohesiveLawName << endl;
|
||||
|
||||
dictionaryConstructorTable::iterator cstrIter =
|
||||
dictionaryConstructorTablePtr_->find(cohesiveLawName);
|
||||
|
||||
if (cstrIter == dictionaryConstructorTablePtr_->end())
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"cohesiveLaw::New(const word& cohesiveLawName, "
|
||||
"const dictionary& dict)"
|
||||
) << "Unknown cohesive law " << cohesiveLawName
|
||||
<< endl << endl
|
||||
<< "Valid cohesive laws are :" << endl
|
||||
<< dictionaryConstructorTablePtr_->toc()
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
return autoPtr<cohesiveLaw>(cstrIter()(cohesiveLawName, dict));
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from components
|
||||
Foam::cohesiveLaw::cohesiveLaw
|
||||
(
|
||||
const word& cohesiveLawName,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
cohesiveLawCoeffs_(dict.subDict(cohesiveLawName + "Coeffs")),
|
||||
GIc_(cohesiveLawCoeffs_.lookup("GIc")),
|
||||
sigmaMax_(cohesiveLawCoeffs_.lookup("sigmaMax"))
|
||||
{}
|
||||
|
||||
|
||||
Foam::cohesiveLaw::cohesiveLaw
|
||||
(
|
||||
const cohesiveLaw& cl
|
||||
)
|
||||
:
|
||||
refCount(),
|
||||
cohesiveLawCoeffs_(cl.cohesiveLawCoeffs_),
|
||||
GIc_(cl.GIc_),
|
||||
sigmaMax_(cl.sigmaMax_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::cohesiveLaw::~cohesiveLaw()
|
||||
{}
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void Foam::cohesiveLaw::writeDict(Ostream& os) const
|
||||
{
|
||||
os.writeKeyword(word(type() + "Coeffs"))
|
||||
<< cohesiveLawCoeffs();
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,165 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Class
|
||||
cohesiveLaw
|
||||
|
||||
Description
|
||||
Virtual base class for cohesive zone model.
|
||||
|
||||
SourceFiles
|
||||
cohesiveLaw.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef cohesiveLaw_H
|
||||
#define cohesiveLaw_H
|
||||
|
||||
#include "IOdictionary.H"
|
||||
#include "autoPtr.H"
|
||||
#include "runTimeSelectionTables.H"
|
||||
#include "dimensionedTypes.H"
|
||||
#include "tmp.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class cohesiveLaw Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class cohesiveLaw
|
||||
:
|
||||
public refCount
|
||||
{
|
||||
|
||||
private:
|
||||
|
||||
// Private data
|
||||
|
||||
//- Cohesive law coefficients
|
||||
dictionary cohesiveLawCoeffs_;
|
||||
|
||||
//- Fracture energy
|
||||
dimensionedScalar GIc_;
|
||||
|
||||
//- Maximum cohesive strength
|
||||
dimensionedScalar sigmaMax_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("cohesiveLaw");
|
||||
|
||||
|
||||
// Declare run-time constructor selection tables
|
||||
|
||||
declareRunTimeSelectionTable
|
||||
(
|
||||
autoPtr,
|
||||
cohesiveLaw,
|
||||
dictionary,
|
||||
(
|
||||
const word& cohesiveLawName,
|
||||
const dictionary& dict
|
||||
),
|
||||
(cohesiveLawName, dict)
|
||||
);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Select null constructed
|
||||
static autoPtr<cohesiveLaw> New
|
||||
(
|
||||
const word& cohesiveLawName,
|
||||
const dictionary& dict
|
||||
);
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from components
|
||||
cohesiveLaw
|
||||
(
|
||||
const word& cohesiveLawName,
|
||||
const dictionary& dict
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
cohesiveLaw(const cohesiveLaw&);
|
||||
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual autoPtr<cohesiveLaw> clone() const = 0;
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~cohesiveLaw();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return cohesive law coefficients
|
||||
const dictionary& cohesiveLawCoeffs() const
|
||||
{
|
||||
return cohesiveLawCoeffs_;
|
||||
}
|
||||
|
||||
//- Return reference to fracture energy
|
||||
const dimensionedScalar& GIc() const
|
||||
{
|
||||
return GIc_;
|
||||
}
|
||||
|
||||
//- Return reference to maximum cohesive strength
|
||||
const dimensionedScalar& sigmaMax() const
|
||||
{
|
||||
return sigmaMax_;
|
||||
}
|
||||
|
||||
//- Return reference to critical separation distance
|
||||
virtual const dimensionedScalar& deltaC() const = 0;
|
||||
|
||||
//- Return current holding traction
|
||||
virtual scalar traction(scalar delta) const = 0;
|
||||
|
||||
//- Write dictionary
|
||||
void writeDict(Ostream& os) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,237 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
componentReference
|
||||
|
||||
Description
|
||||
Class contains data for a component reference as used in stress
|
||||
analysis solvers.
|
||||
|
||||
SourceFiles
|
||||
componentReferenceI.H
|
||||
componentReference.C
|
||||
componentReferenceIO.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef componentReference_H
|
||||
#define componentReference_H
|
||||
|
||||
#include "polyPatchID.H"
|
||||
#include "fvMesh.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class componentReference Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class componentReference
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Patch ID
|
||||
polyPatchID patchID_;
|
||||
|
||||
//- Face index
|
||||
label faceIndex_;
|
||||
|
||||
//- Direction
|
||||
direction dir_;
|
||||
|
||||
//- Value in direction
|
||||
scalar value_;
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Create direction given a name
|
||||
direction getDir(const dictionary& dict) const
|
||||
{
|
||||
word dirName(dict.lookup("direction"));
|
||||
|
||||
if (dirName == "x" || dirName == "X")
|
||||
{
|
||||
return vector::X;
|
||||
}
|
||||
else if (dirName == "y" || dirName == "Y")
|
||||
{
|
||||
return vector::Y;
|
||||
}
|
||||
else if (dirName == "z" || dirName == "Z")
|
||||
{
|
||||
return vector::Z;
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalIOErrorIn
|
||||
(
|
||||
"vector::component componentReference::getComp("
|
||||
"const word& dirName) const",
|
||||
dict
|
||||
) << "Direction " << dirName << " not recognised. Please "
|
||||
<< "use x, y or z" << abort(FatalIOError);
|
||||
|
||||
// Dummy return to keep compiler happy
|
||||
return vector::X;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//- Check if patch face is in range
|
||||
void checkPatchFace(const fvMesh& mesh) const
|
||||
{
|
||||
if
|
||||
(
|
||||
!patchID_.active()
|
||||
|| faceIndex_ >= mesh.boundaryMesh()[patchID_.index()].size()
|
||||
)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"void checkPatchFace(const componentReference::fvMesh&)"
|
||||
"const"
|
||||
) << "Non-existing patch or index out of range."
|
||||
<< abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
|
||||
// Public classes
|
||||
|
||||
//- Class used for the read-construction of
|
||||
// PtrLists of componentReference
|
||||
class iNew
|
||||
{
|
||||
const fvMesh& mesh_;
|
||||
|
||||
public:
|
||||
|
||||
iNew(const fvMesh& mesh)
|
||||
:
|
||||
mesh_(mesh)
|
||||
{}
|
||||
|
||||
autoPtr<componentReference> operator()(Istream& is) const
|
||||
{
|
||||
dictionary crDict(is);
|
||||
|
||||
autoPtr<componentReference> cr
|
||||
(
|
||||
new componentReference(mesh_, crDict)
|
||||
);
|
||||
|
||||
return cr;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from components
|
||||
componentReference
|
||||
(
|
||||
const fvMesh& mesh,
|
||||
const word& patchName,
|
||||
const label faceIndex,
|
||||
const direction dir,
|
||||
const scalar value
|
||||
)
|
||||
:
|
||||
patchID_(patchName, mesh.boundaryMesh()),
|
||||
faceIndex_(faceIndex),
|
||||
dir_(dir),
|
||||
value_(value)
|
||||
{
|
||||
checkPatchFace(mesh);
|
||||
}
|
||||
|
||||
|
||||
//- Construct from dictionary
|
||||
componentReference
|
||||
(
|
||||
const fvMesh& mesh,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
patchID_(dict.lookup("patch"), mesh.boundaryMesh()),
|
||||
faceIndex_(readLabel(dict.lookup("face"))),
|
||||
dir_(getDir(dict)),
|
||||
value_(readScalar(dict.lookup("value")))
|
||||
{
|
||||
checkPatchFace(mesh);
|
||||
}
|
||||
|
||||
//- Clone
|
||||
autoPtr<componentReference> clone() const
|
||||
{
|
||||
return autoPtr<componentReference>(new componentReference(*this));
|
||||
}
|
||||
|
||||
|
||||
// Destructor - default
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return patch index
|
||||
label patchIndex() const
|
||||
{
|
||||
return patchID_.index();
|
||||
}
|
||||
|
||||
//- Return face index
|
||||
label faceIndex() const
|
||||
{
|
||||
return faceIndex_;
|
||||
}
|
||||
|
||||
//- Return direction
|
||||
direction dir() const
|
||||
{
|
||||
return dir_;
|
||||
}
|
||||
|
||||
//- Return value
|
||||
scalar value() const
|
||||
{
|
||||
return value_;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,56 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Type
|
||||
componentReferenceList
|
||||
|
||||
Description
|
||||
container classes for componentReference
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef componentReferenceList_H
|
||||
#define componentReferenceList_H
|
||||
|
||||
#include "componentReference.H"
|
||||
#include "PtrList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
typedef PtrList<componentReference> componentReferenceList;
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,265 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "cohesiveLawFvPatchVectorField.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "volFields.H"
|
||||
#include "rheologyModel.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
cohesiveLawFvPatchVectorField::cohesiveLawFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(p, iF),
|
||||
cohesiveLawPtr_(NULL),
|
||||
relaxationFactor_(1.0),
|
||||
traction_(p.size(), vector::zero)
|
||||
{}
|
||||
|
||||
|
||||
cohesiveLawFvPatchVectorField::cohesiveLawFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(p, iF),
|
||||
cohesiveLawPtr_
|
||||
(
|
||||
cohesiveLaw::New(dict.lookup("cohesiveLaw"), dict).ptr()
|
||||
),
|
||||
relaxationFactor_(readScalar(dict.lookup("relaxationFactor"))),
|
||||
traction_(p.size(), vector::zero)
|
||||
{
|
||||
fvPatchVectorField::operator=(patchInternalField());
|
||||
gradient() = vector::zero;
|
||||
}
|
||||
|
||||
|
||||
cohesiveLawFvPatchVectorField::cohesiveLawFvPatchVectorField
|
||||
(
|
||||
const cohesiveLawFvPatchVectorField& cpf
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(cpf),
|
||||
cohesiveLawPtr_(cpf.cohesiveLawPtr_->clone().ptr()),
|
||||
relaxationFactor_(cpf.relaxationFactor_),
|
||||
traction_(cpf.traction_)
|
||||
{}
|
||||
|
||||
|
||||
cohesiveLawFvPatchVectorField::cohesiveLawFvPatchVectorField
|
||||
(
|
||||
const cohesiveLawFvPatchVectorField& cpf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(cpf, p, iF, mapper),
|
||||
cohesiveLawPtr_(cpf.cohesiveLawPtr_->clone().ptr()),
|
||||
relaxationFactor_(cpf.relaxationFactor_),
|
||||
traction_(cpf.traction_, mapper)
|
||||
{}
|
||||
|
||||
|
||||
cohesiveLawFvPatchVectorField::cohesiveLawFvPatchVectorField
|
||||
(
|
||||
const cohesiveLawFvPatchVectorField& cpf,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(cpf, iF),
|
||||
cohesiveLawPtr_(cpf.cohesiveLawPtr_->clone().ptr()),
|
||||
relaxationFactor_(cpf.relaxationFactor_),
|
||||
traction_(cpf.traction_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
const cohesiveLaw& cohesiveLawFvPatchVectorField::law() const
|
||||
{
|
||||
if (!cohesiveLawPtr_)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"const cohesiveLaw& cohesiveLawFvPatchVectorField::law() const"
|
||||
) << "Law pointer not set" << abort(FatalError);
|
||||
}
|
||||
|
||||
return *cohesiveLawPtr_;
|
||||
}
|
||||
|
||||
|
||||
void cohesiveLawFvPatchVectorField::autoMap
|
||||
(
|
||||
const fvPatchFieldMapper& m
|
||||
)
|
||||
{
|
||||
if (cohesiveLawPtr_ == NULL)
|
||||
{
|
||||
FatalErrorIn("cohesiveFvPatchVectorField::autoMap")
|
||||
<< "NULL cohesive law"
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
fixedGradientFvPatchVectorField::autoMap(m);
|
||||
|
||||
traction_.autoMap(m);
|
||||
}
|
||||
|
||||
|
||||
// Reverse-map the given fvPatchField onto this fvPatchField
|
||||
void cohesiveLawFvPatchVectorField::rmap
|
||||
(
|
||||
const fvPatchVectorField& ptf,
|
||||
const labelList& addr
|
||||
)
|
||||
{
|
||||
fixedGradientFvPatchVectorField::rmap(ptf, addr);
|
||||
|
||||
const cohesiveLawFvPatchVectorField& dmptf =
|
||||
refCast<const cohesiveLawFvPatchVectorField>(ptf);
|
||||
|
||||
// No need to grab the cohesive zone pointer more than once
|
||||
if (!cohesiveLawPtr_)
|
||||
{
|
||||
cohesiveLawPtr_ = dmptf.cohesiveLawPtr_->clone().ptr();
|
||||
|
||||
relaxationFactor_ = dmptf.relaxationFactor_;
|
||||
}
|
||||
|
||||
traction_.rmap(dmptf.traction_, addr);
|
||||
}
|
||||
|
||||
|
||||
// Update the coefficients associated with the patch field
|
||||
void cohesiveLawFvPatchVectorField::updateCoeffs()
|
||||
{
|
||||
if (updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Looking up rheology
|
||||
|
||||
const fvPatchField<scalar>& mu =
|
||||
lookupPatchField<volScalarField, scalar>("mu");
|
||||
|
||||
const fvPatchField<scalar>& lambda =
|
||||
lookupPatchField<volScalarField, scalar>("lambda");
|
||||
|
||||
vectorField n = patch().nf();
|
||||
|
||||
const fvPatchField<tensor>& gradU =
|
||||
lookupPatchField<volTensorField, tensor>("grad(U)");
|
||||
|
||||
// Patch displacement
|
||||
const vectorField& U = *this;
|
||||
|
||||
// Patch stress
|
||||
tensorField sigma = mu*(gradU + gradU.T()) + I*(lambda*tr(gradU));
|
||||
|
||||
// Normal stress component
|
||||
scalarField sigmaN = (n & (n & sigma));
|
||||
|
||||
scalarField delta = -(n & U);
|
||||
|
||||
label sizeByTwo = patch().size()/2;
|
||||
|
||||
for(label i = 0; i < sizeByTwo; i++)
|
||||
{
|
||||
scalar tmp = delta[i];
|
||||
delta[i] += delta[sizeByTwo + i];
|
||||
delta[sizeByTwo + i] += tmp;
|
||||
}
|
||||
|
||||
forAll (traction_, faceI)
|
||||
{
|
||||
if (delta[faceI] < 0)
|
||||
{
|
||||
// Return from traction to symmetryPlane??
|
||||
traction_[faceI] = law().sigmaMax().value()*n[faceI];
|
||||
}
|
||||
else if(delta[faceI] > law().deltaC().value())
|
||||
{
|
||||
// Traction free
|
||||
traction_[faceI] = vector::zero;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Calculate cohesive traction from cohesive zone model
|
||||
traction_[faceI] = law().traction(delta[faceI])*n[faceI];
|
||||
}
|
||||
}
|
||||
|
||||
gradient() =
|
||||
(
|
||||
traction_
|
||||
- (n & (mu*gradU.T() - (mu + lambda)*gradU))
|
||||
- n*lambda*tr(gradU)
|
||||
)/(2.0*mu + lambda);
|
||||
|
||||
fixedGradientFvPatchVectorField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
// Write
|
||||
void cohesiveLawFvPatchVectorField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchVectorField::write(os);
|
||||
traction_.writeEntry("traction", os);
|
||||
os.writeKeyword("cohesiveLaw") << law().type()
|
||||
<< token::END_STATEMENT << nl;
|
||||
os.writeKeyword("relaxationFactor") << relaxationFactor_
|
||||
<< token::END_STATEMENT << nl;
|
||||
law().writeDict(os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField(fvPatchVectorField, cohesiveLawFvPatchVectorField);
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,325 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
cohesiveZoneFvPatchVectorField
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "cohesiveZoneFvPatchVectorField.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "transformField.H"
|
||||
#include "volFields.H"
|
||||
#include "rheologyModel.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
cohesiveZoneFvPatchVectorField::cohesiveZoneFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
directionMixedFvPatchVectorField(p, iF),
|
||||
UName_("undefined"),
|
||||
rheologyName_("undefined"),
|
||||
cohesiveLawPtr_(NULL),
|
||||
relaxationFactor_(1.0)
|
||||
{}
|
||||
|
||||
|
||||
cohesiveZoneFvPatchVectorField::cohesiveZoneFvPatchVectorField
|
||||
(
|
||||
const cohesiveZoneFvPatchVectorField& ptf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
directionMixedFvPatchVectorField(ptf, p, iF, mapper),
|
||||
UName_(ptf.UName_),
|
||||
rheologyName_(ptf.rheologyName_),
|
||||
cohesiveLawPtr_(ptf.cohesiveLawPtr_),
|
||||
relaxationFactor_(ptf.relaxationFactor_)
|
||||
{}
|
||||
|
||||
|
||||
cohesiveZoneFvPatchVectorField::cohesiveZoneFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
directionMixedFvPatchVectorField(p, iF),
|
||||
UName_(dict.lookup("U")),
|
||||
rheologyName_(dict.lookup("rheology")),
|
||||
cohesiveLawPtr_
|
||||
(
|
||||
cohesiveLaw::New(dict.lookup("cohesiveLaw"), dict).ptr()
|
||||
),
|
||||
relaxationFactor_(readScalar(dict.lookup("relaxationFactor")))
|
||||
{
|
||||
if (dict.found("refValue"))
|
||||
{
|
||||
this->refValue() = vectorField("refValue", dict, p.size());
|
||||
}
|
||||
else
|
||||
{
|
||||
this->refValue() = vector::zero;
|
||||
}
|
||||
|
||||
if (dict.found("refGradient"))
|
||||
{
|
||||
this->refGrad() = vectorField("refGradient", dict, p.size());
|
||||
}
|
||||
else
|
||||
{
|
||||
this->refGrad() = vector::zero;
|
||||
}
|
||||
|
||||
if (dict.found("valueFraction"))
|
||||
{
|
||||
this->valueFraction() =
|
||||
symmTensorField("valueFraction", dict, p.size());
|
||||
}
|
||||
else
|
||||
{
|
||||
vectorField n = patch().nf();
|
||||
|
||||
this->valueFraction() = sqr(n);
|
||||
}
|
||||
|
||||
if (dict.found("value"))
|
||||
{
|
||||
Field<vector>::operator=(vectorField("value", dict, p.size()));
|
||||
}
|
||||
else
|
||||
{
|
||||
Field<vector> normalValue = transform(valueFraction(), refValue());
|
||||
|
||||
Field<vector> gradValue =
|
||||
this->patchInternalField() + refGrad()/this->patch().deltaCoeffs();
|
||||
|
||||
Field<vector> transformGradValue =
|
||||
transform(I - valueFraction(), gradValue);
|
||||
|
||||
Field<vector>::operator=(normalValue + transformGradValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
cohesiveZoneFvPatchVectorField::cohesiveZoneFvPatchVectorField
|
||||
(
|
||||
const cohesiveZoneFvPatchVectorField& ptf,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
directionMixedFvPatchVectorField(ptf, iF),
|
||||
UName_(ptf.UName_),
|
||||
rheologyName_(ptf.rheologyName_),
|
||||
cohesiveLawPtr_(ptf.cohesiveLawPtr_),
|
||||
relaxationFactor_(ptf.relaxationFactor_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
// Map from self
|
||||
void cohesiveZoneFvPatchVectorField::autoMap
|
||||
(
|
||||
const fvPatchFieldMapper& m
|
||||
)
|
||||
{
|
||||
if (cohesiveLawPtr_ == NULL)
|
||||
{
|
||||
FatalErrorIn("cohesiveZoneFvPatchVectorField::autoMap")
|
||||
<< "NULL cohesive law"
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
directionMixedFvPatchVectorField::autoMap(m);
|
||||
}
|
||||
|
||||
|
||||
// Reverse-map the given fvPatchField onto this fvPatchField
|
||||
void cohesiveZoneFvPatchVectorField::rmap
|
||||
(
|
||||
const fvPatchField<vector>& ptf,
|
||||
const labelList& addr
|
||||
)
|
||||
{
|
||||
directionMixedFvPatchVectorField::rmap(ptf, addr);
|
||||
|
||||
const cohesiveZoneFvPatchVectorField& dmptf =
|
||||
refCast<const cohesiveZoneFvPatchVectorField>(ptf);
|
||||
|
||||
// No need to grab the cohesive zone pointer more than once
|
||||
if (!cohesiveLawPtr_)
|
||||
{
|
||||
cohesiveLawPtr_ = dmptf.cohesiveLawPtr_->clone().ptr();
|
||||
|
||||
relaxationFactor_ = dmptf.relaxationFactor_;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void cohesiveZoneFvPatchVectorField::updateCoeffs()
|
||||
{
|
||||
if (this->updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Looking up rheology
|
||||
const rheologyModel& rheology =
|
||||
this->db().objectRegistry::lookupObject<rheologyModel>(rheologyName_);
|
||||
|
||||
const scalarField mu =
|
||||
rheology.mu()().boundaryField()[patch().index()];
|
||||
|
||||
const scalarField lambda =
|
||||
rheology.lambda()().boundaryField()[patch().index()];
|
||||
|
||||
const fvPatchField<tensor>& gradU =
|
||||
lookupPatchField<volTensorField, tensor>
|
||||
(
|
||||
"grad(" +UName_ + ")"
|
||||
);
|
||||
|
||||
// Patch displacement
|
||||
const vectorField& U = *this;
|
||||
|
||||
// Patch stress
|
||||
tensorField sigma = mu*(gradU + gradU.T()) + I*(lambda*tr(gradU));
|
||||
|
||||
// Patch normal
|
||||
vectorField n = patch().nf();
|
||||
|
||||
// Normal stress component
|
||||
scalarField sigmaN = (n&(n&sigma));
|
||||
|
||||
// Chech crack propagation
|
||||
forAll(sigmaN, faceI)
|
||||
{
|
||||
vector cohesiveTraction = vector::zero;
|
||||
|
||||
if
|
||||
(
|
||||
(magSqr(valueFraction()[faceI]) > 1-SMALL)
|
||||
&& (sigmaN[faceI] >= law().sigmaMax().value())
|
||||
)
|
||||
{
|
||||
// Switch to full traction boundary condition
|
||||
valueFraction()[faceI] = symmTensor::zero;
|
||||
|
||||
Info << "Crack started at face: " << faceI << endl;
|
||||
|
||||
// Cohesive traction
|
||||
cohesiveTraction = n[faceI]*law().sigmaMax().value();
|
||||
}
|
||||
else if(magSqr(valueFraction()[faceI]) < SMALL)
|
||||
{
|
||||
// Normal displacement
|
||||
scalar Un = -(n[faceI]&U[faceI]);
|
||||
|
||||
if(Un < 0)
|
||||
{
|
||||
// Return from traction to symmetryPlane
|
||||
refValue()[faceI] = vector::zero;
|
||||
refGrad() = vector::zero;
|
||||
valueFraction()[faceI] = sqr(n[faceI]);
|
||||
Info << "Face removed from crack: " << faceI << endl;
|
||||
}
|
||||
else if(Un > law().deltaC().value()/2)
|
||||
{
|
||||
// Traction free
|
||||
cohesiveTraction = vector::zero;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Calculate cohesive traction from cohesive zone model
|
||||
cohesiveTraction = law().traction(2*Un)*n[faceI];
|
||||
}
|
||||
}
|
||||
|
||||
if(magSqr(valueFraction()[faceI]) < SMALL)
|
||||
{
|
||||
cohesiveTraction =
|
||||
relaxationFactor_*cohesiveTraction
|
||||
+ (1.0 - relaxationFactor_)*sigmaN[faceI]*n[faceI];
|
||||
|
||||
refGrad()[faceI] =
|
||||
(
|
||||
cohesiveTraction
|
||||
- (
|
||||
n[faceI]
|
||||
& (
|
||||
mu[faceI]*gradU[faceI].T()
|
||||
- (mu[faceI] + lambda[faceI])*gradU[faceI]
|
||||
)
|
||||
)
|
||||
- n[faceI]*lambda[faceI]*tr(gradU[faceI])
|
||||
)
|
||||
/(2.0*mu[faceI] + lambda[faceI]);
|
||||
}
|
||||
}
|
||||
|
||||
directionMixedFvPatchVectorField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
// Write
|
||||
void cohesiveZoneFvPatchVectorField::write(Ostream& os) const
|
||||
{
|
||||
directionMixedFvPatchVectorField::write(os);
|
||||
os.writeKeyword("U") << UName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("rheology") << rheologyName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("cohesiveLaw") << law().type()
|
||||
<< token::END_STATEMENT << nl;
|
||||
os.writeKeyword("relaxationFactor") << relaxationFactor_
|
||||
<< token::END_STATEMENT << nl;
|
||||
law().writeDict(os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField(fvPatchVectorField, cohesiveZoneFvPatchVectorField);
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,328 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
newDirectionMixedFvPatchField
|
||||
|
||||
Description
|
||||
Doubly mixed fixed value-fixed gradient boundary condition
|
||||
separated into a normal and a tangential component given a
|
||||
direction vector. The mixture is controlled by two separate
|
||||
valueFraction coefficients in the normal and tangential direction.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "newDirectionMixedFvPatchField.H"
|
||||
#include "transformField.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
template<class Type>
|
||||
void newDirectionMixedFvPatchField<Type>::checkNHat()
|
||||
{
|
||||
scalarField magNHat(Foam::mag(nHat_));
|
||||
|
||||
if (min(magNHat) < SMALL)
|
||||
{
|
||||
FatalErrorIn("void newDirectionMixedFvPatchField<Type>::checkNHat()")
|
||||
<< "Incorrectly defined normal direction. mag = "
|
||||
<< min(magNHat)
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
magNHat /= mag(magNHat);
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Type>
|
||||
newDirectionMixedFvPatchField<Type>::newDirectionMixedFvPatchField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<Type, volMesh>& iF
|
||||
)
|
||||
:
|
||||
fvPatchField<Type>(p, iF),
|
||||
refValue_(p.size()),
|
||||
refGrad_(p.size()),
|
||||
nHat_(p.size()),
|
||||
normalValueFraction_(p.size()),
|
||||
tangentialValueFraction_(p.size())
|
||||
{}
|
||||
|
||||
|
||||
template<class Type>
|
||||
newDirectionMixedFvPatchField<Type>::newDirectionMixedFvPatchField
|
||||
(
|
||||
const newDirectionMixedFvPatchField<Type>& ptf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<Type, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
fvPatchField<Type>(ptf, p, iF, mapper),
|
||||
refValue_(ptf.refValue_, mapper),
|
||||
refGrad_(ptf.refGrad_, mapper),
|
||||
nHat_(ptf.nHat_, mapper),
|
||||
normalValueFraction_(ptf.normalValueFraction_, mapper),
|
||||
tangentialValueFraction_(ptf.tangentialValueFraction_, mapper)
|
||||
{
|
||||
this->checkNHat();
|
||||
}
|
||||
|
||||
|
||||
template<class Type>
|
||||
newDirectionMixedFvPatchField<Type>::newDirectionMixedFvPatchField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<Type, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
fvPatchField<Type>(p, iF, dict),
|
||||
refValue_("refValue", dict, p.size()),
|
||||
refGrad_("refGradient", dict, p.size()),
|
||||
nHat_("nHat", dict, p.size()),
|
||||
normalValueFraction_("normalValueFraction", dict, p.size()),
|
||||
tangentialValueFraction_("tangentialValueFraction", dict, p.size())
|
||||
{
|
||||
this->checkNHat();
|
||||
evaluate();
|
||||
}
|
||||
|
||||
|
||||
template<class Type>
|
||||
newDirectionMixedFvPatchField<Type>::newDirectionMixedFvPatchField
|
||||
(
|
||||
const newDirectionMixedFvPatchField<Type>& ptf,
|
||||
const DimensionedField<Type, volMesh>& iF
|
||||
)
|
||||
:
|
||||
fvPatchField<Type>(ptf, iF),
|
||||
refValue_(ptf.refValue_),
|
||||
refGrad_(ptf.refGrad_),
|
||||
nHat_(ptf.nHat_),
|
||||
normalValueFraction_(ptf.normalValueFraction_),
|
||||
tangentialValueFraction_(ptf.tangentialValueFraction_)
|
||||
{
|
||||
this->checkNHat();
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
// Map from self
|
||||
template<class Type>
|
||||
void newDirectionMixedFvPatchField<Type>::autoMap
|
||||
(
|
||||
const fvPatchFieldMapper& m
|
||||
)
|
||||
{
|
||||
Field<Type>::autoMap(m);
|
||||
refValue_.autoMap(m);
|
||||
refGrad_.autoMap(m);
|
||||
nHat_.autoMap(m);
|
||||
normalValueFraction_.autoMap(m);
|
||||
tangentialValueFraction_.autoMap(m);
|
||||
}
|
||||
|
||||
|
||||
// Reverse-map the given fvPatchField onto this fvPatchField
|
||||
template<class Type>
|
||||
void newDirectionMixedFvPatchField<Type>::rmap
|
||||
(
|
||||
const fvPatchField<Type>& ptf,
|
||||
const labelList& addr
|
||||
)
|
||||
{
|
||||
fvPatchField<Type>::rmap(ptf, addr);
|
||||
|
||||
const newDirectionMixedFvPatchField<Type>& dmptf =
|
||||
refCast<const newDirectionMixedFvPatchField<Type> >(ptf);
|
||||
|
||||
refValue_.rmap(dmptf.refValue_, addr);
|
||||
refGrad_.rmap(dmptf.refGrad_, addr);
|
||||
nHat_.rmap(dmptf.nHat_, addr);
|
||||
normalValueFraction_.rmap(dmptf.normalValueFraction_, addr);
|
||||
tangentialValueFraction_.rmap(dmptf.tangentialValueFraction_, addr);
|
||||
}
|
||||
|
||||
|
||||
// Return gradient at boundary
|
||||
template<class Type>
|
||||
tmp<Field<Type> > newDirectionMixedFvPatchField<Type>::snGrad() const
|
||||
{
|
||||
Field<Type> pif = this->patchInternalField();
|
||||
|
||||
const scalarField& deltaCoeffs = this->patch().deltaCoeffs();
|
||||
const tensorField nn= nHat_*nHat_;
|
||||
|
||||
Field<Type> normalValue =
|
||||
normalValueFraction_*transform(nn, refValue_)
|
||||
+ (1.0 - normalValueFraction_)*transform(nn, pif + refGrad_/deltaCoeffs);
|
||||
|
||||
Field<Type> tangentialValue =
|
||||
tangentialValueFraction_*transform(I - nn, refValue_)
|
||||
+ (1.0 - tangentialValueFraction_)*
|
||||
transform(I - nn, pif + refGrad_/deltaCoeffs);
|
||||
|
||||
return (normalValue + tangentialValue - pif)*deltaCoeffs;
|
||||
}
|
||||
|
||||
|
||||
// Evaluate the field on the patch
|
||||
template<class Type>
|
||||
void newDirectionMixedFvPatchField<Type>::evaluate()
|
||||
{
|
||||
if (!this->updated())
|
||||
{
|
||||
this->updateCoeffs();
|
||||
}
|
||||
|
||||
Field<Type> pif = this->patchInternalField();
|
||||
|
||||
const scalarField& deltaCoeffs = this->patch().deltaCoeffs();
|
||||
const tensorField nn = nHat_*nHat_;
|
||||
|
||||
Field<Type> normalValue =
|
||||
normalValueFraction_*transform(nn, refValue_)
|
||||
+ (1.0 - normalValueFraction_)*transform(nn, pif + refGrad_/deltaCoeffs);
|
||||
|
||||
Field<Type> tangentialValue =
|
||||
tangentialValueFraction_*transform(I - nn, refValue_)
|
||||
+ (1.0 - tangentialValueFraction_)*
|
||||
transform(I - nn, pif + refGrad_/deltaCoeffs);
|
||||
|
||||
Field<Type>::operator=(normalValue + tangentialValue);
|
||||
|
||||
fvPatchField<Type>::evaluate();
|
||||
}
|
||||
|
||||
|
||||
//- Return the matrix diagonal coefficients corresponding to the
|
||||
// evaluation of the value of this patchField
|
||||
template<class Type>
|
||||
tmp<Field<Type> > newDirectionMixedFvPatchField<Type>::valueInternalCoeffs
|
||||
(
|
||||
const tmp<scalarField>&
|
||||
) const
|
||||
{
|
||||
const Field<Type> one(this->size(), pTraits<Type>::one);
|
||||
const tensorField nn= nHat_*nHat_;
|
||||
|
||||
return
|
||||
transform(nn, one)*(1.0 - normalValueFraction_)
|
||||
+ transform(I - nn, one)*(1.0 - tangentialValueFraction_);
|
||||
|
||||
}
|
||||
|
||||
//- Return the matrix source coefficients corresponding to the
|
||||
// evaluation of the value of this patchField
|
||||
template<class Type>
|
||||
tmp<Field<Type> > newDirectionMixedFvPatchField<Type>::valueBoundaryCoeffs
|
||||
(
|
||||
const tmp<scalarField>&
|
||||
) const
|
||||
{
|
||||
const scalarField& deltaCoeffs = this->patch().deltaCoeffs();
|
||||
const tensorField nn= nHat_*nHat_;
|
||||
|
||||
return
|
||||
normalValueFraction_*transform(nn, refValue_)
|
||||
+ (1.0 - normalValueFraction_)*transform(nn, refGrad_)/deltaCoeffs
|
||||
+ tangentialValueFraction_*transform(I - nn, refValue_)
|
||||
+ (1.0 - tangentialValueFraction_)*
|
||||
transform(I - nn, refGrad_)/deltaCoeffs;
|
||||
|
||||
// Alternative; allows fiddling internal/boundary split for value coeffs
|
||||
// return
|
||||
// *this
|
||||
// - scale
|
||||
// (
|
||||
// valueInternalCoeffs(this->patch().weights()),
|
||||
// this->patchInternalField()
|
||||
// );
|
||||
}
|
||||
|
||||
//- Return the matrix diagonal coefficients corresponding to the
|
||||
// evaluation of the gradient of this patchField
|
||||
template<class Type>
|
||||
tmp<Field<Type> >
|
||||
newDirectionMixedFvPatchField<Type>::gradientInternalCoeffs() const
|
||||
{
|
||||
const scalarField& deltaCoeffs = this->patch().deltaCoeffs();
|
||||
const Field<Type> one(this->size(), pTraits<Type>::one);
|
||||
const tensorField nn= nHat_*nHat_;
|
||||
|
||||
return
|
||||
-transform(nn, one)*normalValueFraction_*deltaCoeffs
|
||||
- transform(I - nn, one)*tangentialValueFraction_*deltaCoeffs;
|
||||
}
|
||||
|
||||
//- Return the matrix source coefficients corresponding to the
|
||||
// evaluation of the gradient of this patchField
|
||||
template<class Type>
|
||||
tmp<Field<Type> >
|
||||
newDirectionMixedFvPatchField<Type>::gradientBoundaryCoeffs() const
|
||||
{
|
||||
const scalarField& deltaCoeffs = this->patch().deltaCoeffs();
|
||||
const tensorField nn= nHat_*nHat_;
|
||||
|
||||
return
|
||||
normalValueFraction_*deltaCoeffs*transform(nn, refValue_)
|
||||
+ (1.0 - normalValueFraction_)*transform(nn, refGrad_)
|
||||
+ tangentialValueFraction_*deltaCoeffs*transform(I - nn, refValue_)
|
||||
+ (1.0 - tangentialValueFraction_)*transform(I - nn, refGrad_);
|
||||
|
||||
// Alternative; allows fiddling internal/boundary split for grad coeffs
|
||||
// return
|
||||
// snGrad()
|
||||
// - scale(gradientInternalCoeffs(), this->patchInternalField());
|
||||
}
|
||||
|
||||
|
||||
// Write
|
||||
template<class Type>
|
||||
void newDirectionMixedFvPatchField<Type>::write(Ostream& os) const
|
||||
{
|
||||
fvPatchField<Type>::write(os);
|
||||
refValue_.writeEntry("refValue", os);
|
||||
refGrad_.writeEntry("refGradient", os);
|
||||
nHat_.writeEntry("nHat", os);
|
||||
normalValueFraction_.writeEntry("normalValueFraction", os);
|
||||
tangentialValueFraction_.writeEntry("tangentialValueFraction", os);
|
||||
this->writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,302 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
newDirectionMixedFvPatchField
|
||||
|
||||
Description
|
||||
Doubly mixed fixed value-fixed gradient boundary condition
|
||||
separated into a normal and a tangential component given a
|
||||
direction vector. The mixture is controlled by two separate
|
||||
valueFraction coefficients in the normal and tangential direction.
|
||||
|
||||
SourceFiles
|
||||
newDirectionMixedFvPatchField.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef newDirectionMixedFvPatchField_H
|
||||
#define newDirectionMixedFvPatchField_H
|
||||
|
||||
#include "fvPatchField.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class directionMixedFvPatch Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Type>
|
||||
class newDirectionMixedFvPatchField
|
||||
:
|
||||
public fvPatchField<Type>
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Value field
|
||||
Field<Type> refValue_;
|
||||
|
||||
//- Gradient field
|
||||
Field<Type> refGrad_;
|
||||
|
||||
//- Normal direction
|
||||
vectorField nHat_;
|
||||
|
||||
//- Fraction (0-1) of value used for normal component
|
||||
scalarField normalValueFraction_;
|
||||
|
||||
//- Fraction (0-1) of value used for tangential component
|
||||
scalarField tangentialValueFraction_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Check and normalize nHat
|
||||
void checkNHat();
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("newDirectionMixed");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from patch and internal field
|
||||
newDirectionMixedFvPatchField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<Type, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct from patch, internal field and dictionary
|
||||
newDirectionMixedFvPatchField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<Type, volMesh>&,
|
||||
const dictionary&
|
||||
);
|
||||
|
||||
//- Construct by mapping given newDirectionMixedFvPatchField onto
|
||||
// a new patch
|
||||
newDirectionMixedFvPatchField
|
||||
(
|
||||
const newDirectionMixedFvPatchField<Type>&,
|
||||
const fvPatch&,
|
||||
const DimensionedField<Type, volMesh>&,
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchField<Type> > clone() const
|
||||
{
|
||||
return tmp<fvPatchField<Type> >
|
||||
(
|
||||
new newDirectionMixedFvPatchField<Type>(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
newDirectionMixedFvPatchField
|
||||
(
|
||||
const newDirectionMixedFvPatchField<Type>&,
|
||||
const DimensionedField<Type, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchField<Type> > clone
|
||||
(
|
||||
const DimensionedField<Type, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return tmp<fvPatchField<Type> >
|
||||
(
|
||||
new newDirectionMixedFvPatchField<Type>(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Access
|
||||
|
||||
//- Return true if this patch field fixes a value.
|
||||
// Needed to check if a level has to be specified while solving
|
||||
// Poissons equations.
|
||||
virtual bool fixesValue() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
virtual void autoMap
|
||||
(
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Reverse map the given fvPatchField onto this fvPatchField
|
||||
virtual void rmap
|
||||
(
|
||||
const fvPatchField<Type>&,
|
||||
const labelList&
|
||||
);
|
||||
|
||||
|
||||
// Return defining fields
|
||||
|
||||
virtual Field<Type>& refValue()
|
||||
{
|
||||
return refValue_;
|
||||
}
|
||||
|
||||
virtual const Field<Type>& refValue() const
|
||||
{
|
||||
return refValue_;
|
||||
}
|
||||
|
||||
virtual Field<Type>& refGrad()
|
||||
{
|
||||
return refGrad_;
|
||||
}
|
||||
|
||||
virtual const Field<Type>& refGrad() const
|
||||
{
|
||||
return refGrad_;
|
||||
}
|
||||
|
||||
virtual vectorField& nHat()
|
||||
{
|
||||
return nHat_;
|
||||
}
|
||||
|
||||
virtual const vectorField& nHat() const
|
||||
{
|
||||
return nHat_;
|
||||
}
|
||||
|
||||
virtual scalarField& normalValueFraction()
|
||||
{
|
||||
return normalValueFraction_;
|
||||
}
|
||||
|
||||
virtual const scalarField& normalValueFraction() const
|
||||
{
|
||||
return normalValueFraction_;
|
||||
}
|
||||
|
||||
|
||||
virtual scalarField& tangentialValueFraction()
|
||||
{
|
||||
return tangentialValueFraction_;
|
||||
}
|
||||
|
||||
virtual const scalarField& tangentialValueFraction() const
|
||||
{
|
||||
return tangentialValueFraction_;
|
||||
}
|
||||
|
||||
|
||||
// Evaluation functions
|
||||
|
||||
//- Return gradient at boundary
|
||||
virtual tmp<Field<Type> > snGrad() const;
|
||||
|
||||
//- Evaluate the patch field
|
||||
virtual void evaluate();
|
||||
|
||||
//- Return the matrix diagonal coefficients corresponding to the
|
||||
// evaluation of the value of this patchField with given weights
|
||||
virtual tmp<Field<Type> > valueInternalCoeffs
|
||||
(
|
||||
const tmp<scalarField>&
|
||||
) const;
|
||||
|
||||
//- Return the matrix source coefficients corresponding to the
|
||||
// evaluation of the value of this patchField with given weights
|
||||
virtual tmp<Field<Type> > valueBoundaryCoeffs
|
||||
(
|
||||
const tmp<scalarField>&
|
||||
) const;
|
||||
|
||||
//- Return the matrix diagonal coefficients corresponding to the
|
||||
// evaluation of the gradient of this patchField
|
||||
virtual tmp<Field<Type> > gradientInternalCoeffs() const;
|
||||
|
||||
//- Return the matrix source coefficients corresponding to the
|
||||
// evaluation of the gradient of this patchField
|
||||
virtual tmp<Field<Type> > gradientBoundaryCoeffs() const;
|
||||
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
|
||||
|
||||
// Member operators
|
||||
|
||||
virtual void operator=(const fvPatchField<Type>&) {}
|
||||
virtual void operator+=(const fvPatchField<Type>&) {}
|
||||
virtual void operator-=(const fvPatchField<Type>&) {}
|
||||
virtual void operator*=(const fvPatchField<Type>&) {}
|
||||
virtual void operator/=(const fvPatchField<Type>&) {}
|
||||
|
||||
virtual void operator=(const Field<Type>&) {}
|
||||
virtual void operator+=(const Field<Type>&) {}
|
||||
virtual void operator-=(const Field<Type>&) {}
|
||||
virtual void operator*=(const Field<scalar>&) {}
|
||||
virtual void operator/=(const Field<scalar>&) {}
|
||||
|
||||
virtual void operator=(const Type&) {}
|
||||
virtual void operator+=(const Type&) {}
|
||||
virtual void operator-=(const Type&) {}
|
||||
virtual void operator*=(const scalar) {}
|
||||
virtual void operator/=(const scalar) {}
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#ifdef NoRepository
|
||||
# include "newDirectionMixedFvPatchField.C"
|
||||
#else
|
||||
# ifdef xlC
|
||||
# pragma implementation("newDirectionMixedFvPatchField.C")
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,243 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "nusseltFvPatchScalarField.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "fvPatchFieldMapper.H"
|
||||
#include "volFields.H"
|
||||
#include "surfaceFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
nusseltFvPatchScalarField::nusseltFvPatchScalarField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
mixedFvPatchScalarField(p, iF),
|
||||
DTName_("undefined"),
|
||||
Tinf_(0.0),
|
||||
alpha_(p.size(), 0.0)
|
||||
{
|
||||
refValue() = 0.0;
|
||||
refGrad() = 0.0;
|
||||
valueFraction() = 0.0;
|
||||
}
|
||||
|
||||
|
||||
nusseltFvPatchScalarField::nusseltFvPatchScalarField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
mixedFvPatchScalarField(p, iF),
|
||||
DTName_(dict.lookup("DT")),
|
||||
Tinf_(readScalar(dict.lookup("Tinf"))),
|
||||
alpha_("alpha", dict, p.size())
|
||||
{
|
||||
if (dict.found("value"))
|
||||
{
|
||||
fvPatchField<scalar>::operator=
|
||||
(
|
||||
scalarField("value", dict, p.size())
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
fvPatchField<scalar>::operator=(patchInternalField());
|
||||
}
|
||||
|
||||
refValue() = *this;
|
||||
refGrad() = 0.0;
|
||||
valueFraction() = 0.0;
|
||||
|
||||
if (Tinf_ < SMALL)
|
||||
{
|
||||
FatalIOErrorIn
|
||||
(
|
||||
"nusseltFvPatchScalarField::nusseltFvPatchScalarField\n"
|
||||
"(\n"
|
||||
" const fvPatch&,\n"
|
||||
" const DimensionedField<scalar, volMesh>&,\n"
|
||||
" const dictionary&\n"
|
||||
")",
|
||||
dict
|
||||
) << "unphysical Tinf specified (Tinf = 0 or negative)"
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
if (min(alpha_) < -SMALL)
|
||||
{
|
||||
FatalIOErrorIn
|
||||
(
|
||||
"nusseltFvPatchScalarField::nusseltFvPatchScalarField\n"
|
||||
"(\n"
|
||||
" const fvPatch&,\n"
|
||||
" const DimensionedField<scalar, volMesh>&,\n"
|
||||
" const dictionary&\n"
|
||||
")",
|
||||
dict
|
||||
) << "unphysical alpha specified (alpha = 0 or negative)" << endl
|
||||
<< exit(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nusseltFvPatchScalarField::nusseltFvPatchScalarField
|
||||
(
|
||||
const nusseltFvPatchScalarField& ptf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
mixedFvPatchScalarField(ptf, p, iF, mapper),
|
||||
DTName_(ptf.DTName_),
|
||||
Tinf_(ptf.Tinf_),
|
||||
alpha_(ptf.alpha_)
|
||||
{}
|
||||
|
||||
|
||||
nusseltFvPatchScalarField::nusseltFvPatchScalarField
|
||||
(
|
||||
const nusseltFvPatchScalarField& ptf
|
||||
)
|
||||
:
|
||||
mixedFvPatchScalarField(ptf),
|
||||
DTName_(ptf.DTName_),
|
||||
Tinf_(ptf.Tinf_),
|
||||
alpha_(ptf.alpha_)
|
||||
{}
|
||||
|
||||
|
||||
nusseltFvPatchScalarField::nusseltFvPatchScalarField
|
||||
(
|
||||
const nusseltFvPatchScalarField& ptpsf,
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
mixedFvPatchScalarField(ptpsf, iF),
|
||||
DTName_(ptpsf.DTName_),
|
||||
Tinf_(ptpsf.Tinf_),
|
||||
alpha_(ptpsf.alpha_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
// Map from self
|
||||
void nusseltFvPatchScalarField::autoMap
|
||||
(
|
||||
const fvPatchFieldMapper& m
|
||||
)
|
||||
{
|
||||
mixedFvPatchScalarField::autoMap(m);
|
||||
alpha_.autoMap(m);
|
||||
}
|
||||
|
||||
|
||||
// Reverse-map the given fvPatchField onto this fvPatchField
|
||||
void nusseltFvPatchScalarField::rmap
|
||||
(
|
||||
const fvPatchField<scalar>& ptf,
|
||||
const labelList& addr
|
||||
)
|
||||
{
|
||||
mixedFvPatchField<scalar>::rmap(ptf, addr);
|
||||
|
||||
const nusseltFvPatchScalarField& npsf =
|
||||
refCast<const nusseltFvPatchScalarField>(ptf);
|
||||
|
||||
alpha_.rmap(npsf.alpha_, addr);
|
||||
}
|
||||
|
||||
|
||||
// Update the coefficients associated with the patch field
|
||||
void nusseltFvPatchScalarField::updateCoeffs()
|
||||
{
|
||||
if (updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
scalarField Tinternal = patchInternalField();
|
||||
|
||||
// Lookup temperature diffusivity of the patch
|
||||
const fvPatchField<scalar>& DT =
|
||||
this->lookupPatchField<volScalarField, scalar>(DTName_);
|
||||
|
||||
// Calculate flux
|
||||
scalarField tempFlux = alpha_*(Tinternal - Tinf_);
|
||||
|
||||
refValue() =
|
||||
neg(tempFlux)*
|
||||
min
|
||||
(
|
||||
Tinternal - tempFlux/(DT*patch().deltaCoeffs()),
|
||||
Tinf_
|
||||
)
|
||||
+ pos(tempFlux)*
|
||||
max
|
||||
(
|
||||
Tinternal - tempFlux/(DT*patch().deltaCoeffs()),
|
||||
Tinf_
|
||||
);
|
||||
|
||||
refGrad() = -tempFlux;
|
||||
valueFraction() = pos(tempFlux);
|
||||
|
||||
mixedFvPatchScalarField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
// Write
|
||||
void nusseltFvPatchScalarField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchScalarField::write(os);
|
||||
os.writeKeyword("DT") << DTName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("Tinf") << Tinf_ << token::END_STATEMENT << endl;
|
||||
alpha_.writeEntry("alpha", os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField(fvPatchScalarField, nusseltFvPatchScalarField);
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,201 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
nusseltFvPatchScalarField
|
||||
|
||||
Description
|
||||
Nusselt boundary condition for temperature
|
||||
|
||||
SourceFiles
|
||||
nusseltFvPatchScalarField.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef nusseltFvPatchScalarFields_H
|
||||
#define nusseltFvPatchScalarFields_H
|
||||
|
||||
#include "mixedFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class nusseltFvPatch Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class nusseltFvPatchScalarField
|
||||
:
|
||||
public mixedFvPatchScalarField
|
||||
{
|
||||
|
||||
// Private data
|
||||
|
||||
//- Name of the displacement field
|
||||
const word DTName_;
|
||||
|
||||
//- Reference temperature at infinity
|
||||
scalar Tinf_;
|
||||
|
||||
//- Heat transfer coefficient
|
||||
scalarField alpha_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("nusselt");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from patch and internal field
|
||||
nusseltFvPatchScalarField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct from patch, internal field and dictionary
|
||||
nusseltFvPatchScalarField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&,
|
||||
const dictionary&
|
||||
);
|
||||
|
||||
//- Construct by mapping given nusseltFvPatchScalarField
|
||||
// onto a new patch
|
||||
nusseltFvPatchScalarField
|
||||
(
|
||||
const nusseltFvPatchScalarField&,
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&,
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
nusseltFvPatchScalarField
|
||||
(
|
||||
const nusseltFvPatchScalarField&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchScalarField> clone() const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new nusseltFvPatchScalarField(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
nusseltFvPatchScalarField
|
||||
(
|
||||
const nusseltFvPatchScalarField&,
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchScalarField> clone
|
||||
(
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new nusseltFvPatchScalarField(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Access
|
||||
|
||||
//- Return the temperature at infinity
|
||||
scalar Tinf() const
|
||||
{
|
||||
return Tinf_;
|
||||
}
|
||||
|
||||
//- Return reference to the temperature at infinity
|
||||
// to allow adjustment
|
||||
scalar& Tinf()
|
||||
{
|
||||
return Tinf_;
|
||||
}
|
||||
|
||||
//- Return the heat transfer coefficient
|
||||
const scalarField& alpha() const
|
||||
{
|
||||
return alpha_;
|
||||
}
|
||||
|
||||
//- Return reference to the heat transfer coefficient
|
||||
// to allow adjustment
|
||||
scalarField& alpha()
|
||||
{
|
||||
return alpha_;
|
||||
}
|
||||
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
virtual void autoMap
|
||||
(
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Reverse map the given fvPatchField onto this fvPatchField
|
||||
virtual void rmap
|
||||
(
|
||||
const fvPatchField<scalar>&,
|
||||
const labelList&
|
||||
);
|
||||
|
||||
|
||||
// Evaluation functions
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,205 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "tractionDisplacementFvPatchVectorField.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "volFields.H"
|
||||
#include "rheologyModel.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
tractionDisplacementFvPatchVectorField::
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(p, iF),
|
||||
UName_("undefined"),
|
||||
rheologyName_("undefined"),
|
||||
traction_(p.size(), vector::zero),
|
||||
pressure_(p.size(), 0.0)
|
||||
{
|
||||
fvPatchVectorField::operator=(patchInternalField());
|
||||
gradient() = vector::zero;
|
||||
}
|
||||
|
||||
|
||||
tractionDisplacementFvPatchVectorField::
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(p, iF),
|
||||
UName_(dict.lookup("U")),
|
||||
rheologyName_(dict.lookup("rheology")),
|
||||
traction_("traction", dict, p.size()),
|
||||
pressure_("pressure", dict, p.size())
|
||||
{
|
||||
fvPatchVectorField::operator=(patchInternalField());
|
||||
gradient() = vector::zero;
|
||||
Info << "rf: " << rheologyName_ << endl;
|
||||
}
|
||||
|
||||
|
||||
tractionDisplacementFvPatchVectorField::
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementFvPatchVectorField& tdpvf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(tdpvf, p, iF, mapper),
|
||||
UName_(tdpvf.UName_),
|
||||
rheologyName_(tdpvf.rheologyName_),
|
||||
traction_(tdpvf.traction_, mapper),
|
||||
pressure_(tdpvf.pressure_, mapper)
|
||||
{}
|
||||
|
||||
|
||||
tractionDisplacementFvPatchVectorField::
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementFvPatchVectorField& tdpvf
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(tdpvf),
|
||||
UName_(tdpvf.UName_),
|
||||
rheologyName_(tdpvf.rheologyName_),
|
||||
traction_(tdpvf.traction_),
|
||||
pressure_(tdpvf.pressure_)
|
||||
{}
|
||||
|
||||
|
||||
tractionDisplacementFvPatchVectorField::
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementFvPatchVectorField& tdpvf,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(tdpvf, iF),
|
||||
UName_(tdpvf.UName_),
|
||||
rheologyName_(tdpvf.rheologyName_),
|
||||
traction_(tdpvf.traction_),
|
||||
pressure_(tdpvf.pressure_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void tractionDisplacementFvPatchVectorField::autoMap
|
||||
(
|
||||
const fvPatchFieldMapper& m
|
||||
)
|
||||
{
|
||||
fixedGradientFvPatchVectorField::autoMap(m);
|
||||
traction_.autoMap(m);
|
||||
pressure_.autoMap(m);
|
||||
}
|
||||
|
||||
|
||||
// Reverse-map the given fvPatchField onto this fvPatchField
|
||||
void tractionDisplacementFvPatchVectorField::rmap
|
||||
(
|
||||
const fvPatchVectorField& ptf,
|
||||
const labelList& addr
|
||||
)
|
||||
{
|
||||
fixedGradientFvPatchVectorField::rmap(ptf, addr);
|
||||
|
||||
const tractionDisplacementFvPatchVectorField& dmptf =
|
||||
refCast<const tractionDisplacementFvPatchVectorField>(ptf);
|
||||
|
||||
traction_.rmap(dmptf.traction_, addr);
|
||||
pressure_.rmap(dmptf.pressure_, addr);
|
||||
}
|
||||
|
||||
|
||||
// Update the coefficients associated with the patch field
|
||||
void tractionDisplacementFvPatchVectorField::updateCoeffs()
|
||||
{
|
||||
if (updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Looking up rheology
|
||||
const rheologyModel& rheology =
|
||||
this->db().objectRegistry::lookupObject<rheologyModel>(rheologyName_);
|
||||
|
||||
const scalarField mu = rheology.mu()().boundaryField()[patch().index()];
|
||||
const scalarField lambda =
|
||||
rheology.lambda()().boundaryField()[patch().index()];
|
||||
|
||||
vectorField n = patch().nf();
|
||||
|
||||
const fvPatchField<tensor>& gradU =
|
||||
lookupPatchField<volTensorField, tensor>("grad(" +UName_ + ")");
|
||||
|
||||
gradient() =
|
||||
(
|
||||
(traction_ - (pressure_)*n)
|
||||
- (n & (mu*gradU.T() - (mu + lambda)*gradU))
|
||||
- n*lambda*tr(gradU)
|
||||
)/(2.0*mu + lambda);
|
||||
|
||||
fixedGradientFvPatchVectorField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
// Write
|
||||
void tractionDisplacementFvPatchVectorField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchVectorField::write(os);
|
||||
os.writeKeyword("U") << UName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("rheology") << rheologyName_ << token::END_STATEMENT << nl;
|
||||
traction_.writeEntry("traction", os);
|
||||
pressure_.writeEntry("pressure", os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField(fvPatchVectorField, tractionDisplacementFvPatchVectorField);
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,199 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
tractionDisplacementFvPatchVectorField
|
||||
|
||||
Description
|
||||
Fixed traction boundary condition for the standard linear elastic, fixed
|
||||
coefficient displacement equation (stressedFoam).
|
||||
|
||||
Author
|
||||
Hrvoje Jasak, Wikki Ltd. All rights reserved
|
||||
|
||||
SourceFiles
|
||||
tractionDisplacementFvPatchVectorField.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef tractionDisplacementFvPatchVectorField_H
|
||||
#define tractionDisplacementFvPatchVectorField_H
|
||||
|
||||
#include "fvPatchFields.H"
|
||||
#include "fixedGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class tractionDisplacementFvPatchVectorField Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class tractionDisplacementFvPatchVectorField
|
||||
:
|
||||
public fixedGradientFvPatchVectorField
|
||||
{
|
||||
|
||||
// Private Data
|
||||
|
||||
//- Name of the displacement field
|
||||
const word UName_;
|
||||
|
||||
//- Name of rheology model
|
||||
const word rheologyName_;
|
||||
|
||||
//- Traction
|
||||
vectorField traction_;
|
||||
|
||||
//- Pressure
|
||||
scalarField pressure_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("tractionDisplacement");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from patch and internal field
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct from patch, internal field and dictionary
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&,
|
||||
const dictionary&
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
// tractionDisplacementFvPatchVectorField onto a new patch
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementFvPatchVectorField&,
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&,
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementFvPatchVectorField&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchVectorField> clone() const
|
||||
{
|
||||
return tmp<fvPatchVectorField>
|
||||
(
|
||||
new tractionDisplacementFvPatchVectorField(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
tractionDisplacementFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementFvPatchVectorField&,
|
||||
const DimensionedField<vector, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchVectorField> clone
|
||||
(
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return tmp<fvPatchVectorField>
|
||||
(
|
||||
new tractionDisplacementFvPatchVectorField(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Access
|
||||
|
||||
virtual const vectorField& traction() const
|
||||
{
|
||||
return traction_;
|
||||
}
|
||||
|
||||
virtual vectorField& traction()
|
||||
{
|
||||
return traction_;
|
||||
}
|
||||
|
||||
virtual const scalarField& pressure() const
|
||||
{
|
||||
return pressure_;
|
||||
}
|
||||
|
||||
virtual scalarField& pressure()
|
||||
{
|
||||
return pressure_;
|
||||
}
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
virtual void autoMap
|
||||
(
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Reverse map the given fvPatchField onto this fvPatchField
|
||||
virtual void rmap
|
||||
(
|
||||
const fvPatchVectorField&,
|
||||
const labelList&
|
||||
);
|
||||
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,243 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "tractionDisplacementThermoFvPatchVectorField.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "volFields.H"
|
||||
#include "rheologyModel.H"
|
||||
#include "thermalModel.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
tractionDisplacementThermoFvPatchVectorField::
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(p, iF),
|
||||
UName_("undefined"),
|
||||
TName_("undefined"),
|
||||
rheologyName_("undefined"),
|
||||
thermoName_("undefined"),
|
||||
traction_(p.size(), vector::zero),
|
||||
pressure_(p.size(), 0.0)
|
||||
{
|
||||
fvPatchVectorField::operator=(patchInternalField());
|
||||
gradient() = vector::zero;
|
||||
}
|
||||
|
||||
|
||||
tractionDisplacementThermoFvPatchVectorField::
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(p, iF),
|
||||
UName_(dict.lookup("U")),
|
||||
TName_(dict.lookup("T")),
|
||||
rheologyName_(dict.lookup("rheology")),
|
||||
thermoName_(dict.lookup("thermo")),
|
||||
traction_("traction", dict, p.size()),
|
||||
pressure_("pressure", dict, p.size())
|
||||
{
|
||||
fvPatchVectorField::operator=(patchInternalField());
|
||||
gradient() = vector::zero;
|
||||
}
|
||||
|
||||
|
||||
tractionDisplacementThermoFvPatchVectorField::
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementThermoFvPatchVectorField& tdpvf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<vector, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(tdpvf, p, iF, mapper),
|
||||
UName_(tdpvf.UName_),
|
||||
TName_(tdpvf.TName_),
|
||||
rheologyName_(tdpvf.rheologyName_),
|
||||
thermoName_(tdpvf.thermoName_),
|
||||
traction_(tdpvf.traction_, mapper),
|
||||
pressure_(tdpvf.pressure_, mapper)
|
||||
{}
|
||||
|
||||
|
||||
tractionDisplacementThermoFvPatchVectorField::
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementThermoFvPatchVectorField& tdpvf
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(tdpvf),
|
||||
UName_(tdpvf.UName_),
|
||||
TName_(tdpvf.TName_),
|
||||
rheologyName_(tdpvf.rheologyName_),
|
||||
thermoName_(tdpvf.thermoName_),
|
||||
traction_(tdpvf.traction_),
|
||||
pressure_(tdpvf.pressure_)
|
||||
{}
|
||||
|
||||
|
||||
tractionDisplacementThermoFvPatchVectorField::
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementThermoFvPatchVectorField& tdpvf,
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
)
|
||||
:
|
||||
fixedGradientFvPatchVectorField(tdpvf, iF),
|
||||
UName_(tdpvf.UName_),
|
||||
TName_(tdpvf.TName_),
|
||||
rheologyName_(tdpvf.rheologyName_),
|
||||
thermoName_(tdpvf.thermoName_),
|
||||
traction_(tdpvf.traction_),
|
||||
pressure_(tdpvf.pressure_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void tractionDisplacementThermoFvPatchVectorField::autoMap
|
||||
(
|
||||
const fvPatchFieldMapper& m
|
||||
)
|
||||
{
|
||||
fixedGradientFvPatchVectorField::autoMap(m);
|
||||
traction_.autoMap(m);
|
||||
pressure_.autoMap(m);
|
||||
}
|
||||
|
||||
|
||||
// Reverse-map the given fvPatchField onto this fvPatchField
|
||||
void tractionDisplacementThermoFvPatchVectorField::rmap
|
||||
(
|
||||
const fvPatchVectorField& ptf,
|
||||
const labelList& addr
|
||||
)
|
||||
{
|
||||
fixedGradientFvPatchVectorField::rmap(ptf, addr);
|
||||
|
||||
const tractionDisplacementThermoFvPatchVectorField& dmptf =
|
||||
refCast<const tractionDisplacementThermoFvPatchVectorField>(ptf);
|
||||
|
||||
traction_.rmap(dmptf.traction_, addr);
|
||||
pressure_.rmap(dmptf.pressure_, addr);
|
||||
}
|
||||
|
||||
|
||||
// Update the coefficients associated with the patch field
|
||||
void tractionDisplacementThermoFvPatchVectorField::updateCoeffs()
|
||||
{
|
||||
if (updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Looking up rheology
|
||||
const rheologyModel& rheology =
|
||||
this->db().objectRegistry::
|
||||
lookupObject<rheologyModel>(rheologyName_);
|
||||
|
||||
const scalarField mu = rheology.mu()().boundaryField()[patch().index()];
|
||||
const scalarField lambda =
|
||||
rheology.lambda()().boundaryField()[patch().index()];
|
||||
|
||||
vectorField n = patch().nf();
|
||||
|
||||
const fvPatchField<tensor>& gradU =
|
||||
lookupPatchField<volTensorField, tensor>("grad(" +UName_ + ")");
|
||||
|
||||
// Thermal component
|
||||
|
||||
// Looking up thermo
|
||||
const thermalModel& thermo =
|
||||
this->db().objectRegistry::lookupObject<thermalModel>(thermoName_);
|
||||
|
||||
const fvPatchField<scalar>& T =
|
||||
lookupPatchField<volScalarField, scalar>(TName_);
|
||||
|
||||
const scalarField rhoThreeKalpha =
|
||||
rheology.rho()().boundaryField()[patch().index()]*
|
||||
rheology.threeK()().boundaryField()[patch().index()]*
|
||||
thermo.alpha()().boundaryField()[patch().index()];
|
||||
|
||||
const scalarField T0 = thermo.T0()().boundaryField()[patch().index()];
|
||||
|
||||
gradient() =
|
||||
(
|
||||
(traction_ - (pressure_)*n)
|
||||
- (n & (mu*gradU.T() - (mu + lambda)*gradU))
|
||||
- n*lambda*tr(gradU)
|
||||
+ n*rhoThreeKalpha*(T - T0)
|
||||
)/(2.0*mu + lambda);
|
||||
|
||||
fixedGradientFvPatchVectorField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
// Write
|
||||
void tractionDisplacementThermoFvPatchVectorField::write
|
||||
(
|
||||
Ostream& os
|
||||
) const
|
||||
{
|
||||
fvPatchVectorField::write(os);
|
||||
os.writeKeyword("U") << UName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("T") << TName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("rheology") << rheologyName_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("thermo") << thermoName_ << token::END_STATEMENT << nl;
|
||||
traction_.writeEntry("traction", os);
|
||||
pressure_.writeEntry("pressure", os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
(
|
||||
fvPatchVectorField,
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,201 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright held by original author
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
|
||||
Author
|
||||
Hrvoje Jasak, Wikki Ltd. All rights reserved
|
||||
|
||||
SourceFiles
|
||||
tractionDisplacementThermoFvPatchVectorField.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef tractionDisplacementThermoFvPatchVectorField_H
|
||||
#define tractionDisplacementThermoFvPatchVectorField_H
|
||||
|
||||
#include "fvPatchFields.H"
|
||||
#include "fixedGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class tractionDisplacementThermoFvPatchVectorField Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class tractionDisplacementThermoFvPatchVectorField
|
||||
:
|
||||
public fixedGradientFvPatchVectorField
|
||||
{
|
||||
|
||||
// Private Data
|
||||
|
||||
//- Name of the displacement field
|
||||
const word UName_;
|
||||
|
||||
//- Name of the temperature field
|
||||
const word TName_;
|
||||
|
||||
//- Name of rheology model
|
||||
const word rheologyName_;
|
||||
|
||||
//- Name of thermal model
|
||||
const word thermoName_;
|
||||
|
||||
//- Traction
|
||||
vectorField traction_;
|
||||
|
||||
//- Pressure
|
||||
scalarField pressure_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("tractionDisplacementThermo");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from patch and internal field
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct from patch, internal field and dictionary
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&,
|
||||
const dictionary&
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
// tractionDisplacementThermoFvPatchVectorField onto a new patch
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementThermoFvPatchVectorField&,
|
||||
const fvPatch&,
|
||||
const DimensionedField<vector, volMesh>&,
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementThermoFvPatchVectorField&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchVectorField> clone() const
|
||||
{
|
||||
return tmp<fvPatchVectorField>
|
||||
(
|
||||
new tractionDisplacementThermoFvPatchVectorField(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
tractionDisplacementThermoFvPatchVectorField
|
||||
(
|
||||
const tractionDisplacementThermoFvPatchVectorField&,
|
||||
const DimensionedField<vector, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchVectorField> clone
|
||||
(
|
||||
const DimensionedField<vector, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return tmp<fvPatchVectorField>
|
||||
(
|
||||
new tractionDisplacementThermoFvPatchVectorField(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Access
|
||||
|
||||
virtual const vectorField& traction() const
|
||||
{
|
||||
return traction_;
|
||||
}
|
||||
|
||||
virtual vectorField& traction()
|
||||
{
|
||||
return traction_;
|
||||
}
|
||||
|
||||
virtual const scalarField& pressure() const
|
||||
{
|
||||
return pressure_;
|
||||
}
|
||||
|
||||
virtual scalarField& pressure()
|
||||
{
|
||||
return pressure_;
|
||||
}
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
virtual void autoMap
|
||||
(
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Reverse map the given fvPatchField onto this fvPatchField
|
||||
virtual void rmap
|
||||
(
|
||||
const fvPatchVectorField&,
|
||||
const labelList&
|
||||
);
|
||||
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,210 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "BurgersViscoelastic.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(BurgersViscoelastic, 0);
|
||||
addToRunTimeSelectionTable(rheologyLaw, BurgersViscoelastic, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::BurgersViscoelastic::BurgersViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
rheologyLaw(name, sigma, dict),
|
||||
rho_(dict.lookup("rho")),
|
||||
k1_(dict.lookup("k1")),
|
||||
eta1_(dict.lookup("eta1")),
|
||||
k2_(dict.lookup("k2")),
|
||||
eta2_(dict.lookup("eta2")),
|
||||
nu_(dict.lookup("nu"))
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::BurgersViscoelastic::~BurgersViscoelastic()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::BurgersViscoelastic::rho(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
rho_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::BurgersViscoelastic::E(scalar t) const
|
||||
{
|
||||
scalar E = 0.0;
|
||||
|
||||
if(t>=0)
|
||||
{
|
||||
scalar p1 = eta1_.value()/k1_.value()
|
||||
+ eta1_.value()/k2_.value()
|
||||
+ eta2_.value()/k2_.value();
|
||||
|
||||
scalar p2 = eta1_.value()*eta2_.value()/(k1_.value()*k2_.value());
|
||||
|
||||
scalar q1 = eta1_.value();
|
||||
|
||||
scalar q2 = eta1_.value()*eta2_.value()/k2_.value();
|
||||
|
||||
scalar A = sqrt(sqr(p1) - 4*p2);
|
||||
|
||||
scalar r1 = (p1 - A)/(2*p2);
|
||||
|
||||
scalar r2 = (p1 + A)/(2*p2);
|
||||
|
||||
E = (q1 - q2*r1)*exp(-r1*t)/A - (q1 - q2*r2)*exp(-r2*t)/A;
|
||||
}
|
||||
|
||||
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"E",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("E", k1_.dimensions(), E),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::BurgersViscoelastic::nu(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"nu",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
nu_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::BurgersViscoelastic::J(scalar t) const
|
||||
{
|
||||
scalar J = 0.0;
|
||||
|
||||
if(t >= 0)
|
||||
{
|
||||
J = 1.0/k1_.value()
|
||||
+ (1 - exp(-k2_.value()*t/eta2_.value()))/k2_.value()
|
||||
+ t/eta1_.value();
|
||||
}
|
||||
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"J",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("J", dimless/k1_.dimensions(), J),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,154 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
BurgersViscoelastic
|
||||
|
||||
Description
|
||||
Linear elastic rheology
|
||||
|
||||
SourceFiles
|
||||
BurgersViscoelastic.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef BurgersViscoelastic_H
|
||||
#define BurgersViscoelastic_H
|
||||
|
||||
#include "rheologyLaw.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class BurgersViscoelastic Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class BurgersViscoelastic
|
||||
:
|
||||
public rheologyLaw
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Density
|
||||
dimensionedScalar rho_;
|
||||
|
||||
//- Linear spring constant of Maxwell model
|
||||
dimensionedScalar k1_;
|
||||
|
||||
//- Coefficient of viscosity of Maxwell model
|
||||
dimensionedScalar eta1_;
|
||||
|
||||
//- Linear spring constant of Kelvin model
|
||||
dimensionedScalar k2_;
|
||||
|
||||
//- Coefficient of viscosity of Kelvin model
|
||||
dimensionedScalar eta2_;
|
||||
|
||||
//- Poisson's ratio
|
||||
dimensionedScalar nu_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
BurgersViscoelastic(const BurgersViscoelastic&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const BurgersViscoelastic&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("BurgersViscoelastic");
|
||||
|
||||
// Static data members
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from dictionary
|
||||
BurgersViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~BurgersViscoelastic();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return density
|
||||
virtual tmp<volScalarField> rho() const
|
||||
{
|
||||
return rho(0);
|
||||
}
|
||||
|
||||
//- Return modulus of elasticity
|
||||
virtual tmp<volScalarField> E() const
|
||||
{
|
||||
return E(0);
|
||||
}
|
||||
|
||||
//- Return Poisson's ratio
|
||||
virtual tmp<volScalarField> nu() const
|
||||
{
|
||||
return nu(0);
|
||||
}
|
||||
|
||||
//- Return density
|
||||
virtual tmp<volScalarField> rho(scalar t) const;
|
||||
|
||||
//- Return modulus of elasticity
|
||||
virtual tmp<volScalarField> E(scalar t) const;
|
||||
|
||||
//- Return Poisson's ratio
|
||||
virtual tmp<volScalarField> nu(scalar t) const;
|
||||
|
||||
//- Return creep compliance
|
||||
virtual tmp<volScalarField> J(scalar t) const;
|
||||
|
||||
//- Correct the rheological model
|
||||
virtual void correct()
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,203 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "KelvinSLSViscoelastic.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(KelvinSLSViscoelastic, 0);
|
||||
addToRunTimeSelectionTable(rheologyLaw, KelvinSLSViscoelastic, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::KelvinSLSViscoelastic::KelvinSLSViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
rheologyLaw(name, sigma, dict),
|
||||
rho_(dict.lookup("rho")),
|
||||
k1_(dict.lookup("k1")),
|
||||
k2_(dict.lookup("k2")),
|
||||
eta2_(dict.lookup("eta2")),
|
||||
nu_(dict.lookup("nu"))
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::KelvinSLSViscoelastic::~KelvinSLSViscoelastic()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::KelvinSLSViscoelastic::rho(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
rho_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::KelvinSLSViscoelastic::E(scalar t) const
|
||||
{
|
||||
scalar E = 0.0;
|
||||
|
||||
if(t>=0)
|
||||
{
|
||||
scalar p1 = eta2_.value()/(k1_.value() + k2_.value());
|
||||
|
||||
scalar q0 = k1_.value()*k2_.value()/(k1_.value() + k2_.value());
|
||||
|
||||
scalar q1 = k1_.value()*eta2_.value()/(k1_.value() + k2_.value());
|
||||
|
||||
E = q0 + (q1/p1 - q0)*exp(-t/p1);
|
||||
}
|
||||
|
||||
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"E",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("E", k1_.dimensions(), E),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::KelvinSLSViscoelastic::nu(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"nu",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
nu_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::KelvinSLSViscoelastic::J(scalar t) const
|
||||
{
|
||||
scalar J = 0.0;
|
||||
|
||||
if(t >= 0)
|
||||
{
|
||||
scalar p1 = eta2_.value()/(k1_.value() + k2_.value());
|
||||
|
||||
scalar q0 = k1_.value()*k2_.value()/(k1_.value() + k2_.value());
|
||||
|
||||
scalar q1 = k1_.value()*eta2_.value()/(k1_.value() + k2_.value());
|
||||
|
||||
J = 1.0/q0 + (p1/q1 - 1.0/q0)*exp(-q0*t/q1);
|
||||
}
|
||||
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"J",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("J", dimless/k1_.dimensions(), J),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,204 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "MaxwellElasticViscoelastic.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(MaxwellElasticViscoelastic, 0);
|
||||
addToRunTimeSelectionTable
|
||||
(
|
||||
rheologyLaw,
|
||||
MaxwellElasticViscoelastic,
|
||||
dictionary
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::MaxwellElasticViscoelastic::MaxwellElasticViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
rheologyLaw(name, sigma, dict),
|
||||
rho_(dict.lookup("rho")),
|
||||
k_(dict.lookup("k")),
|
||||
eta_(dict.lookup("eta")),
|
||||
nu_(dict.lookup("nu"))
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::MaxwellElasticViscoelastic::~MaxwellElasticViscoelastic()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::MaxwellElasticViscoelastic::rho(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
rho_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::MaxwellElasticViscoelastic::E(scalar t) const
|
||||
{
|
||||
scalar tau = eta_.value()/k_.value();
|
||||
|
||||
tmp<volScalarField> tE
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"E",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
k_*exp(-t/tau),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
if (t < 0)
|
||||
{
|
||||
tE().internalField() = 0.0;
|
||||
tE().correctBoundaryConditions();
|
||||
}
|
||||
|
||||
return tE;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::MaxwellElasticViscoelastic::nu(scalar t) const
|
||||
{
|
||||
scalar tau = eta_.value()/k_.value();
|
||||
|
||||
scalar E0 = k_.value();
|
||||
|
||||
scalar Et = k_.value()*exp(-t/tau);
|
||||
|
||||
scalar nu = 0.5 - Et/(6*E0);
|
||||
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"nu",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("nu", dimless, nu),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::MaxwellElasticViscoelastic::J(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tJ
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"J",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar
|
||||
(
|
||||
"J",
|
||||
dimless/k_.dimensions(),
|
||||
1.0/k_.value() + t/eta_.value()
|
||||
),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
if (t < 0)
|
||||
{
|
||||
tJ().internalField() = 0.0;
|
||||
tJ().correctBoundaryConditions();
|
||||
}
|
||||
|
||||
return tJ;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,148 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
MaxwellElasticViscoelastic
|
||||
|
||||
Description
|
||||
Linear elastic rheology
|
||||
|
||||
SourceFiles
|
||||
MaxwellElasticViscoelastic.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef MaxwellElasticViscoelastic_H
|
||||
#define MaxwellElasticViscoelastic_H
|
||||
|
||||
#include "rheologyLaw.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class MaxwellElasticViscoelastic Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class MaxwellElasticViscoelastic
|
||||
:
|
||||
public rheologyLaw
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Density
|
||||
dimensionedScalar rho_;
|
||||
|
||||
//- Linear spring constant
|
||||
dimensionedScalar k_;
|
||||
|
||||
//- Coefficient of viscosity
|
||||
dimensionedScalar eta_;
|
||||
|
||||
//- Poisson's ratio
|
||||
dimensionedScalar nu_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
MaxwellElasticViscoelastic(const MaxwellElasticViscoelastic&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const MaxwellElasticViscoelastic&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("MaxwellElasticViscoelastic");
|
||||
|
||||
// Static data members
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from dictionary
|
||||
MaxwellElasticViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~MaxwellElasticViscoelastic();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return density
|
||||
virtual tmp<volScalarField> rho() const
|
||||
{
|
||||
return rho(0);
|
||||
}
|
||||
|
||||
//- Return modulus of elasticity
|
||||
virtual tmp<volScalarField> E() const
|
||||
{
|
||||
return E(0);
|
||||
}
|
||||
|
||||
//- Return Poisson's ratio
|
||||
virtual tmp<volScalarField> nu() const
|
||||
{
|
||||
return nu(0);
|
||||
}
|
||||
|
||||
//- Return density
|
||||
virtual tmp<volScalarField> rho(scalar t) const;
|
||||
|
||||
//- Return modulus of elasticity
|
||||
virtual tmp<volScalarField> E(scalar t) const;
|
||||
|
||||
//- Return Poisson's ratio
|
||||
virtual tmp<volScalarField> nu(scalar t) const;
|
||||
|
||||
//- Return creep compliance
|
||||
virtual tmp<volScalarField> J(scalar t) const;
|
||||
|
||||
//- Correct the rheological model
|
||||
virtual void correct()
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,197 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "MaxwellSLSViscoelastic.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(MaxwellSLSViscoelastic, 0);
|
||||
addToRunTimeSelectionTable(rheologyLaw, MaxwellSLSViscoelastic, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::MaxwellSLSViscoelastic::MaxwellSLSViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
rheologyLaw(name, sigma, dict),
|
||||
rho_(dict.lookup("rho")),
|
||||
k1_(dict.lookup("k1")),
|
||||
eta1_(dict.lookup("eta1")),
|
||||
k2_(dict.lookup("k2")),
|
||||
nu_(dict.lookup("nu"))
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::MaxwellSLSViscoelastic::~MaxwellSLSViscoelastic()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField>
|
||||
Foam::MaxwellSLSViscoelastic::rho(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
rho_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::MaxwellSLSViscoelastic::E(scalar t) const
|
||||
{
|
||||
scalar E = 0.0;
|
||||
|
||||
if(t>=0)
|
||||
{
|
||||
E = k2_.value() + k1_.value()*exp(-k1_.value()*t/eta1_.value());
|
||||
}
|
||||
|
||||
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"E",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("E", k1_.dimensions(), E),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::MaxwellSLSViscoelastic::nu(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"nu",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
nu_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::MaxwellSLSViscoelastic::J(scalar t) const
|
||||
{
|
||||
scalar J = 0.0;
|
||||
|
||||
if(t>=0)
|
||||
{
|
||||
scalar Jg = 1.0/(k2_.value() + k1_.value());
|
||||
|
||||
scalar Jr = 1.0/k2_.value();
|
||||
|
||||
scalar tau = eta1_.value()/k1_.value();
|
||||
|
||||
scalar tauC = tau*(k1_.value() + k2_.value())/k2_.value();
|
||||
|
||||
J = Jg + (Jr - Jg)*(1.0 - exp(-t/tauC));
|
||||
}
|
||||
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"J",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("J", dimless/k1_.dimensions(), J),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,150 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
MaxwellSLSViscoelastic
|
||||
|
||||
Description
|
||||
Linear elastic rheology
|
||||
|
||||
SourceFiles
|
||||
MaxwellSLSViscoelastic.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef MaxwellSLSViscoelastic_H
|
||||
#define MaxwellSLSViscoelastic_H
|
||||
|
||||
#include "rheologyLaw.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class MaxwellSLSViscoelastic Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class MaxwellSLSViscoelastic
|
||||
:
|
||||
public rheologyLaw
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Density
|
||||
dimensionedScalar rho_;
|
||||
|
||||
//- Linear spring constant of Maxwell model
|
||||
dimensionedScalar k1_;
|
||||
|
||||
//- Coefficient of viscosity of Maxwell model
|
||||
dimensionedScalar eta1_;
|
||||
|
||||
//- Linear spring constant
|
||||
dimensionedScalar k2_;
|
||||
|
||||
//- Poisson's ratio
|
||||
dimensionedScalar nu_;
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
MaxwellSLSViscoelastic(const MaxwellSLSViscoelastic&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const MaxwellSLSViscoelastic&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("MaxwellSLSViscoelastic");
|
||||
|
||||
// Static data members
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from dictionary
|
||||
MaxwellSLSViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~MaxwellSLSViscoelastic();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return density
|
||||
virtual tmp<volScalarField> rho() const
|
||||
{
|
||||
return rho(0);
|
||||
}
|
||||
|
||||
//- Return modulus of elasticity
|
||||
virtual tmp<volScalarField> E() const
|
||||
{
|
||||
return E(0);
|
||||
}
|
||||
|
||||
//- Return Poisson's ratio
|
||||
virtual tmp<volScalarField> nu() const
|
||||
{
|
||||
return nu(0);
|
||||
}
|
||||
|
||||
//- Return density
|
||||
virtual tmp<volScalarField> rho(scalar t) const;
|
||||
|
||||
//- Return modulus of elasticity
|
||||
virtual tmp<volScalarField> E(scalar t) const;
|
||||
|
||||
//- Return Poisson's ratio
|
||||
virtual tmp<volScalarField> nu(scalar t) const;
|
||||
|
||||
//- Return creep compliance
|
||||
virtual tmp<volScalarField> J(scalar t) const;
|
||||
|
||||
//- Correct the rheological model
|
||||
virtual void correct()
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,190 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "MaxwellViscoelastic.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(MaxwellViscoelastic, 0);
|
||||
addToRunTimeSelectionTable(rheologyLaw, MaxwellViscoelastic, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::MaxwellViscoelastic::MaxwellViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
rheologyLaw(name, sigma, dict),
|
||||
rho_(dict.lookup("rho")),
|
||||
k_(dict.lookup("k")),
|
||||
eta_(dict.lookup("eta")),
|
||||
nu_(dict.lookup("nu"))
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::MaxwellViscoelastic::~MaxwellViscoelastic()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::MaxwellViscoelastic::rho(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
rho_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::MaxwellViscoelastic::E(scalar t) const
|
||||
{
|
||||
scalar tau = eta_.value()/k_.value();
|
||||
|
||||
tmp<volScalarField> tE
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"E",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
k_*exp(-t/tau),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
if (t < 0)
|
||||
{
|
||||
tE().internalField() = 0.0;
|
||||
tE().correctBoundaryConditions();
|
||||
}
|
||||
|
||||
return tE;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::MaxwellViscoelastic::nu(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"nu",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
nu_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::MaxwellViscoelastic::J(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tJ
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"J",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar
|
||||
(
|
||||
"J",
|
||||
dimless/k_.dimensions(),
|
||||
1.0/k_.value() + t/eta_.value()
|
||||
),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
if (t < 0)
|
||||
{
|
||||
tJ().internalField() = 0.0;
|
||||
tJ().correctBoundaryConditions();
|
||||
}
|
||||
|
||||
return tJ;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,170 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "PronyViscoelastic.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(PronyViscoelastic, 0);
|
||||
addToRunTimeSelectionTable(rheologyLaw, PronyViscoelastic, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::PronyViscoelastic::PronyViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
rheologyLaw(name, sigma, dict),
|
||||
rho_(dict.lookup("rho")),
|
||||
k_("k", dict, readInt(dict.lookup("size"))),
|
||||
kDimensions_(dict.lookup("kDimensions")),
|
||||
tau_("tau", dict, readInt(dict.lookup("size"))),
|
||||
tauDimensions_(dict.lookup("tauDimensions")),
|
||||
nu_(dict.lookup("nu"))
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::PronyViscoelastic::~PronyViscoelastic()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::PronyViscoelastic::rho(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
rho_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::PronyViscoelastic::E(scalar t) const
|
||||
{
|
||||
scalar E = 0.0;
|
||||
|
||||
E = k_[0];
|
||||
|
||||
for(int i=1; i<k_.size(); i++)
|
||||
{
|
||||
E += k_[i]*exp(-t/tau_[i]);
|
||||
}
|
||||
|
||||
if(t < 0)
|
||||
{
|
||||
E = 0;
|
||||
}
|
||||
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"E",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("E", kDimensions_, E),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::PronyViscoelastic::nu(scalar t) const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"nu",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
nu_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::PronyViscoelastic::J(scalar t) const
|
||||
{
|
||||
notImplemented(type() + "::J(scalar t)");
|
||||
|
||||
return 1.0/E(t);
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,153 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
PronyViscoelastic
|
||||
|
||||
Description
|
||||
Linear elastic rheology
|
||||
|
||||
SourceFiles
|
||||
PronyViscoelastic.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef PronyViscoelastic_H
|
||||
#define PronyViscoelastic_H
|
||||
|
||||
#include "rheologyLaw.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class PronyViscoelastic Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class PronyViscoelastic
|
||||
:
|
||||
public rheologyLaw
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Density
|
||||
dimensionedScalar rho_;
|
||||
|
||||
//- Linear spring constants of generalised Maxwell model
|
||||
Field<scalar> k_;
|
||||
|
||||
//- Dimension set for k field
|
||||
dimensionSet kDimensions_;
|
||||
|
||||
//- Relaxation times of generalised Maxwell model
|
||||
Field<scalar> tau_;
|
||||
|
||||
//- Dimension set for tau field
|
||||
dimensionSet tauDimensions_;
|
||||
|
||||
//- Poisson's ratio
|
||||
dimensionedScalar nu_;
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
PronyViscoelastic(const PronyViscoelastic&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const PronyViscoelastic&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("PronyViscoelastic");
|
||||
|
||||
// Static data members
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from dictionary
|
||||
PronyViscoelastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~PronyViscoelastic();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return density
|
||||
virtual tmp<volScalarField> rho() const
|
||||
{
|
||||
return rho(0);
|
||||
}
|
||||
|
||||
//- Return modulus of elasticity
|
||||
virtual tmp<volScalarField> E() const
|
||||
{
|
||||
return E(0);
|
||||
}
|
||||
|
||||
//- Return Poisson's ratio
|
||||
virtual tmp<volScalarField> nu() const
|
||||
{
|
||||
return nu(0);
|
||||
}
|
||||
|
||||
//- Return density
|
||||
virtual tmp<volScalarField> rho(scalar t) const;
|
||||
|
||||
//- Return modulus of elasticity
|
||||
virtual tmp<volScalarField> E(scalar t) const;
|
||||
|
||||
//- Return Poisson's ratio
|
||||
virtual tmp<volScalarField> nu(scalar t) const;
|
||||
|
||||
//- Return creep compliance
|
||||
virtual tmp<volScalarField> J(scalar t) const;
|
||||
|
||||
//- Correct the rheological model
|
||||
virtual void correct()
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,148 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "linearElastic.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(linearElastic, 0);
|
||||
addToRunTimeSelectionTable(rheologyLaw, linearElastic, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::linearElastic::linearElastic
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
rheologyLaw(name, sigma, dict),
|
||||
rho_(dict.lookup("rho")),
|
||||
E_(dict.lookup("E")),
|
||||
nu_(dict.lookup("nu"))
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::linearElastic::~linearElastic()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::linearElastic::rho() const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
rho_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::linearElastic::E() const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"E",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
E_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::linearElastic::nu() const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"nu",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
nu_,
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
|
||||
tresult().correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,261 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
Zoned multi-material rheology controlled by a material indicator field.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "multiMaterial.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "zeroGradientFvPatchFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(multiMaterial, 0);
|
||||
addToRunTimeSelectionTable(rheologyLaw, multiMaterial, dictionary);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::scalarField> Foam::multiMaterial::indicator
|
||||
(
|
||||
const label i
|
||||
) const
|
||||
{
|
||||
const scalarField& mat = materials_.internalField();
|
||||
|
||||
tmp<scalarField> tresult(new scalarField(mat.size(), 0.0));
|
||||
scalarField& result = tresult();
|
||||
|
||||
forAll (mat, matI)
|
||||
{
|
||||
if (mat[matI] > i - SMALL && mat[matI] < i + 1 - SMALL)
|
||||
{
|
||||
result[matI] = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::multiMaterial::multiMaterial
|
||||
(
|
||||
const word& name,
|
||||
const volSymmTensorField& sigma,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
rheologyLaw(name, sigma, dict),
|
||||
PtrList<rheologyLaw>(),
|
||||
materials_
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"materials",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh()
|
||||
)
|
||||
{
|
||||
PtrList<rheologyLaw>& laws = *this;
|
||||
|
||||
PtrList<entry> lawEntries(dict.lookup("laws"));
|
||||
laws.setSize(lawEntries.size());
|
||||
|
||||
forAll (laws, lawI)
|
||||
{
|
||||
laws.set
|
||||
(
|
||||
lawI,
|
||||
rheologyLaw::New
|
||||
(
|
||||
lawEntries[lawI].keyword(),
|
||||
sigma,
|
||||
lawEntries[lawI].dict()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if
|
||||
(
|
||||
min(materials_).value() < 0
|
||||
|| max(materials_).value() > laws.size() + SMALL
|
||||
)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"multiMaterial::multiMaterial\n"
|
||||
"(\n"
|
||||
" const word& name,\n"
|
||||
" const volSymmTensorField& sigma,\n"
|
||||
" const dictionary& dict\n"
|
||||
")"
|
||||
) << "Invalid definition of material indicator field. "
|
||||
<< "Number of materials: " << laws.size()
|
||||
<< " max index: " << max(materials_)
|
||||
<< ". Should be " << laws.size() - 1
|
||||
<< abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::multiMaterial::~multiMaterial()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::multiMaterial::rho() const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rho",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("zeroRho", dimDensity, 0),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
volScalarField& result = tresult();
|
||||
|
||||
// Accumulate data for all fields
|
||||
const PtrList<rheologyLaw>& laws = *this;
|
||||
|
||||
forAll (laws, lawI)
|
||||
{
|
||||
result.internalField() +=
|
||||
indicator(lawI)*laws[lawI].rho()().internalField();
|
||||
}
|
||||
|
||||
result.correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::multiMaterial::E() const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"E",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("zeroE", dimForce/dimArea, 0),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
volScalarField& result = tresult();
|
||||
|
||||
// Accumulate data for all fields
|
||||
const PtrList<rheologyLaw>& laws = *this;
|
||||
|
||||
forAll (laws, lawI)
|
||||
{
|
||||
result.internalField() +=
|
||||
indicator(lawI)*laws[lawI].E()().internalField();
|
||||
}
|
||||
|
||||
result.correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::volScalarField> Foam::multiMaterial::nu() const
|
||||
{
|
||||
tmp<volScalarField> tresult
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"nu",
|
||||
mesh().time().timeName(),
|
||||
mesh(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar("zeroE", dimless, 0),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
)
|
||||
);
|
||||
volScalarField& result = tresult();
|
||||
|
||||
// Accumulate data for all fields
|
||||
const PtrList<rheologyLaw>& laws = *this;
|
||||
|
||||
forAll (laws, lawI)
|
||||
{
|
||||
result.internalField() +=
|
||||
indicator(lawI)*laws[lawI].nu()().internalField();
|
||||
}
|
||||
|
||||
result.correctBoundaryConditions();
|
||||
|
||||
return tresult;
|
||||
}
|
||||
|
||||
|
||||
void Foam::multiMaterial::correct()
|
||||
{
|
||||
PtrList<rheologyLaw>& laws = *this;
|
||||
|
||||
forAll (laws, lawI)
|
||||
{
|
||||
laws[lawI].correct();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,282 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2008 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
rheologyModel
|
||||
|
||||
Description
|
||||
Material rheology for solids.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "rheologyModel.H"
|
||||
#include "volFields.H"
|
||||
#include "fvc.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
defineTypeNameAndDebug(rheologyModel, 0);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
rheologyModel::rheologyModel
|
||||
(
|
||||
const volSymmTensorField& sigma
|
||||
)
|
||||
:
|
||||
IOdictionary
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"rheologyProperties",
|
||||
sigma.time().constant(),
|
||||
sigma.db(),
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE
|
||||
)
|
||||
),
|
||||
sigma_(sigma),
|
||||
planeStress_(lookup("planeStress")),
|
||||
lawPtr_(rheologyLaw::New("law", sigma_, subDict("rheology")))
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||
|
||||
// Return first Lame's coefficient
|
||||
tmp<volScalarField> rheologyModel::mu() const
|
||||
{
|
||||
volScalarField lawE = lawPtr_->E();
|
||||
volScalarField lawNu = lawPtr_->nu();
|
||||
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"mu",
|
||||
sigma_.time().timeName(),
|
||||
sigma_.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
lawE/(2.0*(1.0 + lawNu))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Return second Lame's coefficient
|
||||
tmp<volScalarField> rheologyModel::lambda() const
|
||||
{
|
||||
volScalarField lawE = lawPtr_->E();
|
||||
volScalarField lawNu = lawPtr_->nu();
|
||||
|
||||
if (planeStress())
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"lambda",
|
||||
sigma_.time().timeName(),
|
||||
sigma_.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
lawNu*lawE/((1.0 + lawNu)*(1.0 - lawNu))
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"lambda",
|
||||
sigma_.time().timeName(),
|
||||
sigma_.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
lawNu*lawE/((1.0 + lawNu)*(1.0 - 2.0*lawNu))
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Return threeK
|
||||
tmp<volScalarField> rheologyModel::threeK() const
|
||||
{
|
||||
volScalarField lawRho = lawPtr_->rho();
|
||||
volScalarField lawE = lawPtr_->E();
|
||||
volScalarField lawNu = lawPtr_->nu();
|
||||
|
||||
if (planeStress())
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"threeK",
|
||||
sigma_.time().timeName(),
|
||||
sigma_.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
lawE/(lawRho*(1 - lawNu))
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"threeK",
|
||||
sigma_.time().timeName(),
|
||||
sigma_.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
lawE/(lawRho*(1 - 2*lawNu))
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Return first Lame's coefficient
|
||||
tmp<volScalarField> rheologyModel::mu(scalar t) const
|
||||
{
|
||||
volScalarField lawE = lawPtr_->E(t);
|
||||
volScalarField lawNu = lawPtr_->nu(t);
|
||||
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"mu",
|
||||
sigma_.time().timeName(),
|
||||
sigma_.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
lawE/(2.0*(1.0 + lawNu))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Return second Lame's coefficient
|
||||
tmp<volScalarField> rheologyModel::lambda(scalar t) const
|
||||
{
|
||||
volScalarField lawE = lawPtr_->E(t);
|
||||
volScalarField lawNu = lawPtr_->nu(t);
|
||||
|
||||
if (planeStress())
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"lambda",
|
||||
sigma_.time().timeName(),
|
||||
sigma_.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
lawNu*lawE/((1.0 + lawNu)*(1.0 - lawNu))
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
return tmp<volScalarField>
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"lambda",
|
||||
sigma_.time().timeName(),
|
||||
sigma_.db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
lawNu*lawE/((1.0 + lawNu)*(1.0 - 2.0*lawNu))
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void rheologyModel::correct()
|
||||
{
|
||||
lawPtr_->correct();
|
||||
}
|
||||
|
||||
|
||||
bool rheologyModel::read()
|
||||
{
|
||||
if (regIOobject::read())
|
||||
{
|
||||
lookup("planeStress") >> planeStress_;
|
||||
lawPtr_ = rheologyLaw::New("law", sigma_, subDict("rheology"));
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,158 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
rheologyModel
|
||||
|
||||
Description
|
||||
Material rheology for solids.
|
||||
|
||||
SourceFiles
|
||||
rheologyModel.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef rheologyModel_H
|
||||
#define rheologyModel_H
|
||||
|
||||
#include "IOdictionary.H"
|
||||
#include "typeInfo.H"
|
||||
#include "runTimeSelectionTables.H"
|
||||
#include "volFields.H"
|
||||
#include "tmp.H"
|
||||
#include "rheologyLaw.H"
|
||||
#include "Switch.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class rheologyModel Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class rheologyModel
|
||||
:
|
||||
public IOdictionary
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Reference to stress field
|
||||
const volSymmTensorField& sigma_;
|
||||
|
||||
//- Plane stress
|
||||
Switch planeStress_;
|
||||
|
||||
//- Rheology law
|
||||
autoPtr<rheologyLaw> lawPtr_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow copy construct
|
||||
rheologyModel(const rheologyModel&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const rheologyModel&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("rheologyModel");
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from dictionary
|
||||
rheologyModel
|
||||
(
|
||||
const volSymmTensorField& sigma
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~rheologyModel()
|
||||
{}
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return true for plane stress
|
||||
const Switch& planeStress() const
|
||||
{
|
||||
return planeStress_;
|
||||
}
|
||||
|
||||
//- Return rheology law
|
||||
const rheologyLaw& law() const
|
||||
{
|
||||
return lawPtr_();
|
||||
}
|
||||
|
||||
//- Return density
|
||||
tmp<volScalarField> rho() const
|
||||
{
|
||||
return lawPtr_->rho();
|
||||
}
|
||||
|
||||
//- Return first Lame's coefficient
|
||||
tmp<volScalarField> mu() const;
|
||||
|
||||
//- Return second Lame's coefficient
|
||||
tmp<volScalarField> lambda() const;
|
||||
|
||||
//- Return threeK
|
||||
tmp<volScalarField> threeK() const;
|
||||
|
||||
//- Return density
|
||||
tmp<volScalarField> rho(scalar t) const
|
||||
{
|
||||
return lawPtr_->rho(t);
|
||||
}
|
||||
|
||||
//- Return first Lame's coefficient
|
||||
tmp<volScalarField> mu(scalar t) const;
|
||||
|
||||
//- Return second Lame's coefficient
|
||||
tmp<volScalarField> lambda(scalar t) const;
|
||||
|
||||
//- Correct the rheological model
|
||||
void correct();
|
||||
|
||||
//- Read rheologyProperties dictionary
|
||||
virtual bool read();
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,5 +0,0 @@
|
|||
contactProblem.C
|
||||
contactPatchPair.C
|
||||
newContactStressFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/newContactStressFoam
|
|
@ -1,11 +0,0 @@
|
|||
EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
||||
-I../materialModels/lnInclude \
|
||||
-I../newStressedFoam/
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
-lmaterialModels \
|
||||
-llduSolvers
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
if (runTime.outputTime())
|
||||
{
|
||||
volScalarField ca = contact.contactArea();
|
||||
ca.write();
|
||||
}
|
|
@ -1,447 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "contactPatchPair.H"
|
||||
#include "contactProblem.H"
|
||||
#include "surfaceFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from components
|
||||
Foam::contactPatchPair::contactPatchPair
|
||||
(
|
||||
const word& name,
|
||||
const contactProblem& cp,
|
||||
const word& masterPatchName,
|
||||
const word& slavePatchName,
|
||||
const dimensionedScalar& frictionCoeff,
|
||||
const scalar contactTol,
|
||||
const intersection::algorithm alg,
|
||||
const intersection::direction dir
|
||||
)
|
||||
:
|
||||
name_(name),
|
||||
cp_(cp),
|
||||
masterPatch_(masterPatchName, cp.mesh().boundaryMesh()),
|
||||
slavePatch_(slavePatchName, cp.mesh().boundaryMesh()),
|
||||
frictionCoeff_(frictionCoeff),
|
||||
contactTol_(contactTol),
|
||||
masterInterpolate_
|
||||
(
|
||||
cp.mesh().boundaryMesh()[masterPatch_.index()]
|
||||
),
|
||||
slaveInterpolate_
|
||||
(
|
||||
cp.mesh().boundaryMesh()[slavePatch_.index()]
|
||||
),
|
||||
masterToSlaveInterpolate_
|
||||
(
|
||||
cp.mesh().boundaryMesh()[masterPatch_.index()], // from patch
|
||||
cp.mesh().boundaryMesh()[slavePatch_.index()], // to patch
|
||||
alg,
|
||||
dir
|
||||
),
|
||||
slaveToMasterInterpolate_
|
||||
(
|
||||
cp.mesh().boundaryMesh()[slavePatch_.index()], // from patch
|
||||
cp.mesh().boundaryMesh()[masterPatch_.index()], // to patch
|
||||
alg,
|
||||
dir
|
||||
)
|
||||
{}
|
||||
|
||||
|
||||
// Construct from dictionary
|
||||
Foam::contactPatchPair::contactPatchPair
|
||||
(
|
||||
const word& name,
|
||||
const contactProblem& cp,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
name_(name),
|
||||
cp_(cp),
|
||||
masterPatch_(dict.lookup("masterPatch"), cp.mesh().boundaryMesh()),
|
||||
slavePatch_(dict.lookup("slavePatch"), cp.mesh().boundaryMesh()),
|
||||
frictionCoeff_(dict.lookup("frictionCoeff")),
|
||||
contactTol_(readScalar(dict.lookup("contactTol"))),
|
||||
masterInterpolate_
|
||||
(
|
||||
cp.mesh().boundaryMesh()[masterPatch_.index()]
|
||||
),
|
||||
slaveInterpolate_
|
||||
(
|
||||
cp.mesh().boundaryMesh()[slavePatch_.index()]
|
||||
),
|
||||
masterToSlaveInterpolate_
|
||||
(
|
||||
cp.mesh().boundaryMesh()[masterPatch_.index()], // from patch
|
||||
cp.mesh().boundaryMesh()[slavePatch_.index()], // to patch
|
||||
intersection::algorithmNames_.read(dict.lookup("projectionAlgo")),
|
||||
intersection::directionNames_.read(dict.lookup("projectionDir"))
|
||||
|
||||
),
|
||||
slaveToMasterInterpolate_
|
||||
(
|
||||
cp.mesh().boundaryMesh()[slavePatch_.index()], // from patch
|
||||
cp.mesh().boundaryMesh()[masterPatch_.index()], // to patch
|
||||
intersection::algorithmNames_.read(dict.lookup("projectionAlgo")),
|
||||
intersection::directionNames_.read(dict.lookup("projectionDir"))
|
||||
|
||||
)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::tmp<Foam::scalarField>
|
||||
Foam::contactPatchPair::masterTouchFraction() const
|
||||
{
|
||||
// Get reference to displacement field and mesh
|
||||
const volVectorField& U = cp_.U();
|
||||
const fvMesh& mesh = cp_.mesh();
|
||||
|
||||
// Interpolate slave displacement into master vertices
|
||||
vectorField masterVertexU =
|
||||
slaveToMasterInterpolate_.pointInterpolate<vector>
|
||||
(
|
||||
slaveInterpolate_.faceToPointInterpolate
|
||||
(
|
||||
U.boundaryField()[slavePatch_.index()]
|
||||
)
|
||||
);
|
||||
|
||||
const vectorField& projectionDir =
|
||||
mesh.boundaryMesh()[masterPatch_.index()].pointNormals();
|
||||
|
||||
|
||||
// Calculate master gap function
|
||||
scalarField vertexMasterGap =
|
||||
(
|
||||
(
|
||||
masterVertexU
|
||||
- masterInterpolate_.faceToPointInterpolate
|
||||
(
|
||||
U.boundaryField()[masterPatch_.index()]
|
||||
)
|
||||
)
|
||||
& projectionDir
|
||||
) + slaveToMasterInterpolate_.pointDistanceToIntersection() - contactTol_;
|
||||
|
||||
// Calculate area in contact
|
||||
|
||||
const faceList& masterPatchLocalFaces =
|
||||
mesh.boundaryMesh()[masterPatch_.index()].localFaces();
|
||||
|
||||
const pointField& masterPatchLocalPoints =
|
||||
mesh.boundaryMesh()[masterPatch_.index()].localPoints();
|
||||
|
||||
tmp<scalarField> ttouchFrac
|
||||
(
|
||||
new scalarField(masterPatchLocalFaces.size(), 0)
|
||||
);
|
||||
scalarField& touchFrac = ttouchFrac();
|
||||
|
||||
forAll (masterPatchLocalFaces, faceI)
|
||||
{
|
||||
touchFrac[faceI] =
|
||||
masterPatchLocalFaces[faceI].areaInContact
|
||||
(
|
||||
masterPatchLocalPoints,
|
||||
vertexMasterGap
|
||||
);
|
||||
}
|
||||
|
||||
return ttouchFrac;
|
||||
}
|
||||
|
||||
|
||||
Foam::tmp<Foam::scalarField>
|
||||
Foam::contactPatchPair::slaveTouchFraction() const
|
||||
{
|
||||
// Get reference to displacement field and mesh
|
||||
const volVectorField& U = cp_.U();
|
||||
const fvMesh& mesh = cp_.mesh();
|
||||
|
||||
// Interpolate master displacement into slave vertices
|
||||
vectorField slaveVertexU =
|
||||
masterToSlaveInterpolate_.pointInterpolate<vector>
|
||||
(
|
||||
masterInterpolate_.faceToPointInterpolate
|
||||
(
|
||||
U.boundaryField()[masterPatch_.index()]
|
||||
)
|
||||
);
|
||||
|
||||
const vectorField& projectionDir =
|
||||
mesh.boundaryMesh()[slavePatch_.index()].pointNormals();
|
||||
|
||||
|
||||
// Calculate slave gap function
|
||||
scalarField vertexSlaveGap =
|
||||
(
|
||||
(
|
||||
slaveVertexU
|
||||
- slaveInterpolate_.faceToPointInterpolate
|
||||
(
|
||||
U.boundaryField()[slavePatch_.index()]
|
||||
)
|
||||
)
|
||||
& projectionDir
|
||||
) + masterToSlaveInterpolate_.pointDistanceToIntersection() - contactTol_;
|
||||
|
||||
// Calculate area in contact
|
||||
|
||||
const faceList& slavePatchLocalFaces =
|
||||
mesh.boundaryMesh()[slavePatch_.index()].localFaces();
|
||||
|
||||
const pointField& slavePatchLocalPoints =
|
||||
mesh.boundaryMesh()[slavePatch_.index()].localPoints();
|
||||
|
||||
tmp<scalarField> ttouchFrac
|
||||
(
|
||||
new scalarField(slavePatchLocalFaces.size(), 0)
|
||||
);
|
||||
scalarField& touchFrac = ttouchFrac();
|
||||
|
||||
forAll (slavePatchLocalFaces, faceI)
|
||||
{
|
||||
touchFrac[faceI] =
|
||||
slavePatchLocalFaces[faceI].areaInContact
|
||||
(
|
||||
slavePatchLocalPoints,
|
||||
vertexSlaveGap
|
||||
);
|
||||
}
|
||||
|
||||
return ttouchFrac;
|
||||
}
|
||||
|
||||
|
||||
void Foam::contactPatchPair::correct
|
||||
(
|
||||
const FieldField<Field, vector>& curTraction,
|
||||
FieldField<Field, vector>& newTraction,
|
||||
FieldField<Field, vector>& refValue,
|
||||
FieldField<Field, scalar>& valueFraction
|
||||
)
|
||||
{
|
||||
// Get reference to displacement field and mesh
|
||||
const volVectorField::GeometricBoundaryField& Upatches =
|
||||
cp_.U().boundaryField();
|
||||
|
||||
const fvMesh& mesh = cp_.mesh();
|
||||
const surfaceVectorField::GeometricBoundaryField& Apatches =
|
||||
mesh.Sf().boundaryField();
|
||||
const surfaceScalarField::GeometricBoundaryField& magApatches =
|
||||
mesh.magSf().boundaryField();
|
||||
|
||||
// Get patch indices
|
||||
const label masterIndex = masterPatch_.index();
|
||||
const label slaveIndex = slavePatch_.index();
|
||||
|
||||
// Calculate patch normals
|
||||
vectorField nMasterPatch = Apatches[masterIndex]/magApatches[masterIndex];
|
||||
|
||||
vectorField nSlavePatch = Apatches[slaveIndex]/magApatches[slaveIndex];
|
||||
|
||||
|
||||
// Calculate slave pressure and tangential force
|
||||
|
||||
scalarField slavePressure = -( nSlavePatch & curTraction[slaveIndex]);
|
||||
|
||||
// Enforce gradient condition on the master patch
|
||||
|
||||
// Calculate relative tangential velocity for master patch
|
||||
vectorField relUmaster =
|
||||
slaveToMasterInterpolate_.faceInterpolate<vector>
|
||||
(
|
||||
Upatches[slaveIndex]
|
||||
)
|
||||
- Upatches[masterIndex];
|
||||
|
||||
relUmaster -= nMasterPatch*(nMasterPatch & relUmaster);
|
||||
relUmaster /= mag(relUmaster) + VSMALL;
|
||||
|
||||
// Calculate tangential master traction
|
||||
scalarField magMasterTangential =
|
||||
Foam::mag((I - nMasterPatch*nMasterPatch) & curTraction[masterIndex]);
|
||||
|
||||
// Calculate master pressure
|
||||
scalarField masterPressure =
|
||||
max
|
||||
(
|
||||
slaveToMasterInterpolate_.faceInterpolate<scalar>
|
||||
(
|
||||
slavePressure
|
||||
),
|
||||
0.0
|
||||
);
|
||||
|
||||
// Calculate master traction, using the positive part of
|
||||
// slave pressure and tangential fricton
|
||||
// Mind the signs: pressure = negative gradient (minus master normal)
|
||||
// friction = positive pressure
|
||||
newTraction[masterIndex] +=
|
||||
masterTouchFraction()*
|
||||
(
|
||||
-nMasterPatch*masterPressure
|
||||
+ relUmaster*
|
||||
min
|
||||
(
|
||||
frictionCoeff_.value()*masterPressure,
|
||||
magMasterTangential
|
||||
)
|
||||
);
|
||||
|
||||
// Enforce direction mixed condition on the slave patch
|
||||
|
||||
// Calculate slave fraction. Correct for negative pressure
|
||||
// (if the pressure is negative, the contact is released)
|
||||
//HJ, fiddle pos pressure!!!
|
||||
scalarField slaveFrac = slaveTouchFraction();
|
||||
|
||||
// Calculate slave displacement
|
||||
vectorField slaveVertexU =
|
||||
masterToSlaveInterpolate_.pointInterpolate<vector>
|
||||
(
|
||||
masterInterpolate_.faceToPointInterpolate
|
||||
(
|
||||
Upatches[masterIndex]
|
||||
)
|
||||
);
|
||||
|
||||
const vectorField& projectionDir =
|
||||
mesh.boundaryMesh()[slaveIndex].pointNormals();
|
||||
|
||||
// Calculate slave displacement
|
||||
vectorField slaveDisp =
|
||||
slaveInterpolate_.pointToFaceInterpolate
|
||||
(
|
||||
slaveVertexU
|
||||
+ masterToSlaveInterpolate_.pointDistanceToIntersection()
|
||||
*projectionDir
|
||||
);
|
||||
|
||||
// Accumulate normal of slave displacement
|
||||
refValue[slaveIndex] +=
|
||||
nSlavePatch*
|
||||
min
|
||||
(
|
||||
pos(slaveFrac)*
|
||||
(
|
||||
(nSlavePatch & Upatches[slaveIndex])
|
||||
+ slaveFrac*contactTol_
|
||||
),
|
||||
(nSlavePatch & slaveDisp)
|
||||
);
|
||||
|
||||
|
||||
// Accumulate slave friction
|
||||
|
||||
// Calculate relative tangential velocity for slave patch
|
||||
vectorField relUslave =
|
||||
masterToSlaveInterpolate_.faceInterpolate<vector>
|
||||
(
|
||||
Upatches[masterIndex]
|
||||
)
|
||||
- Upatches[slaveIndex];
|
||||
|
||||
relUslave -= nSlavePatch*(nSlavePatch & relUslave);
|
||||
relUslave /= mag(relUslave) + VSMALL;
|
||||
|
||||
// Take out normal component out of slave traction and find the
|
||||
// magnitude of the tangential traction.
|
||||
scalarField magSlaveTangential =
|
||||
Foam::mag((I - nSlavePatch*nSlavePatch) & curTraction[slaveIndex]);
|
||||
|
||||
// Calculate slave traction
|
||||
newTraction[slaveIndex] +=
|
||||
slaveFrac*relUslave*
|
||||
min
|
||||
(
|
||||
frictionCoeff_.value()*max(slavePressure, scalar(0)),
|
||||
magSlaveTangential
|
||||
);
|
||||
|
||||
// Accumulate slave touch fraction
|
||||
valueFraction[slaveIndex] += slaveFrac;
|
||||
|
||||
/*
|
||||
Info << "slavePressure: " << slavePressure << nl
|
||||
<< "slaveTouchFrac: " << slaveTouchFraction() << nl
|
||||
// << "slaveFrac: " << slaveFrac << nl
|
||||
<< "refValueSlave: " << refValue[slaveIndex].component(vector::Y) << nl
|
||||
// << "slaveTraction: " << newTraction[slaveIndex] << nl
|
||||
<< "masterTouchFrac: " << masterTouchFraction() << nl
|
||||
// << "interpolated slave pressure: "
|
||||
// << slaveToMasterInterpolate_.faceInterpolate<scalar>
|
||||
// (
|
||||
// slavePressure
|
||||
// )
|
||||
// << nl
|
||||
// << "masterTraction: "
|
||||
// << newTraction[masterIndex].component(vector::Y)
|
||||
<< endl;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
void Foam::contactPatchPair::writeDict(Ostream& os) const
|
||||
{
|
||||
os << nl << name() << nl << token::BEGIN_BLOCK;
|
||||
|
||||
os << "masterPatch " << masterPatch_.name() << token::END_STATEMENT << nl
|
||||
<< "slavePatch " << slavePatch_.name() << token::END_STATEMENT << nl
|
||||
<< "frictionCoeff " << frictionCoeff_ << token::END_STATEMENT << nl
|
||||
<< "contactTol " << contactTol_ << token::END_STATEMENT << nl
|
||||
<< "projectionAlgo "
|
||||
<< intersection::algorithmNames_
|
||||
[masterToSlaveInterpolate_.projectionAlgo()]
|
||||
<< token::END_STATEMENT << nl
|
||||
<< "projectionDir "
|
||||
<< intersection::directionNames_
|
||||
[masterToSlaveInterpolate_.projectionDir()]
|
||||
<< token::END_STATEMENT << nl
|
||||
<< token::END_BLOCK << endl;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,178 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
contactPatchPair
|
||||
|
||||
Description
|
||||
A pair of surfaces in contact.
|
||||
|
||||
SourceFiles
|
||||
contactPatchPair.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef contactPatchPair_H
|
||||
#define contactPatchPair_H
|
||||
|
||||
#include "polyPatchID.H"
|
||||
#include "dimensionedTypes.H"
|
||||
#include "volFieldsFwd.H"
|
||||
#include "primitivePatchInterpolation.H"
|
||||
#include "patchToPatchInterpolation.H"
|
||||
#include "FieldFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
class contactProblem;
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class contactPatchPair Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class contactPatchPair
|
||||
{
|
||||
private:
|
||||
|
||||
// Private data
|
||||
|
||||
//- Name
|
||||
const word name_;
|
||||
|
||||
//- Reference to contact problem
|
||||
const contactProblem& cp_;
|
||||
|
||||
//- Master patch ID. Gradient condition will be enforced
|
||||
const polyPatchID masterPatch_;
|
||||
|
||||
//- Slave patch ID. Direction mixed condition will be enforced
|
||||
const polyPatchID slavePatch_;
|
||||
|
||||
//- Friction coefficient
|
||||
dimensionedScalar frictionCoeff_;
|
||||
|
||||
//- Contact tolerance
|
||||
const scalar contactTol_;
|
||||
|
||||
//- Master patch interpolator
|
||||
primitivePatchInterpolation masterInterpolate_;
|
||||
|
||||
//- Slave patch interpolator
|
||||
primitivePatchInterpolation slaveInterpolate_;
|
||||
|
||||
//- Master to slave patch interpolator
|
||||
patchToPatchInterpolation masterToSlaveInterpolate_;
|
||||
|
||||
//- Master to slave patch interpolator
|
||||
patchToPatchInterpolation slaveToMasterInterpolate_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
contactPatchPair(const contactPatchPair&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const contactPatchPair&);
|
||||
|
||||
|
||||
|
||||
public:
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from components
|
||||
contactPatchPair
|
||||
(
|
||||
const word& name,
|
||||
const contactProblem& cp,
|
||||
const word& masterPatchName,
|
||||
const word& slavePatchName,
|
||||
const dimensionedScalar& frictionCoeff,
|
||||
const scalar contactTol,
|
||||
const intersection::algorithm alg = intersection::FULL_RAY,
|
||||
const intersection::direction dir = intersection::CONTACT_SPHERE
|
||||
);
|
||||
|
||||
//- Construct from components
|
||||
contactPatchPair
|
||||
(
|
||||
const word& name,
|
||||
const contactProblem& cp,
|
||||
const dictionary& dict
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return name
|
||||
const word& name() const
|
||||
{
|
||||
return name_;
|
||||
}
|
||||
|
||||
//- Return master patch ID
|
||||
const polyPatchID masterPatch() const
|
||||
{
|
||||
return masterPatch_;
|
||||
}
|
||||
|
||||
//- Return slave patch ID
|
||||
const polyPatchID& slavePatch() const
|
||||
{
|
||||
return slavePatch_;
|
||||
}
|
||||
|
||||
//- Return master touch fraction
|
||||
tmp<scalarField> masterTouchFraction() const;
|
||||
|
||||
//- Return slave touch fraction
|
||||
tmp<scalarField> slaveTouchFraction() const;
|
||||
|
||||
//- Correct contact data
|
||||
void correct
|
||||
(
|
||||
const FieldField<Field, vector>& curTraction,
|
||||
FieldField<Field, vector>& newTraction,
|
||||
FieldField<Field, vector>& refValue,
|
||||
FieldField<Field, scalar>& normalValueFraction
|
||||
);
|
||||
|
||||
//- Write dictionary
|
||||
void writeDict(Ostream&) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,56 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Type
|
||||
contactPatchPairList
|
||||
|
||||
Description
|
||||
Container classes for contactPatchPair
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef contactPatchPairList_H
|
||||
#define contactPatchPairList_H
|
||||
|
||||
#include "contactPatchPair.H"
|
||||
#include "PtrList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
typedef PtrList<contactPatchPair> contactPatchPairList;
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,336 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Description
|
||||
Class describes a multiple body contact problem. Each individual contact
|
||||
is described by a contactPatchPair. contactProblem handles
|
||||
multiple contact updates and sets the boundary conditions on the
|
||||
displacement field.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "contactProblem.H"
|
||||
#include "fvMesh.H"
|
||||
#include "FieldFields.H"
|
||||
#include "directionMixedFvPatchFields.H"
|
||||
#include "surfaceFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
defineTypeNameAndDebug(contactProblem, 0);
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Read constructor given IOobject
|
||||
contactProblem::contactProblem
|
||||
(
|
||||
volVectorField& U,
|
||||
const volTensorField& gradU
|
||||
)
|
||||
:
|
||||
IOdictionary
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"contactProperties",
|
||||
U.time().constant(),
|
||||
U.db(),
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE
|
||||
)
|
||||
),
|
||||
contactPatchPairList(),
|
||||
U_(U),
|
||||
gradU_(gradU),
|
||||
urfValue_(readScalar(lookup("urfValue"))),
|
||||
urfTraction_(readScalar(lookup("urfTraction"))),
|
||||
urfFraction_(readScalar(lookup("urfFraction")))
|
||||
{
|
||||
// Read contactPatchPairList
|
||||
Istream& is = lookup("contacts");
|
||||
|
||||
PtrList<entry> contactEntries(is);
|
||||
|
||||
contactPatchPairList& contacts = *this;
|
||||
|
||||
contacts.setSize(contactEntries.size());
|
||||
|
||||
forAll(contacts, contactI)
|
||||
{
|
||||
contacts.set
|
||||
(
|
||||
contactI,
|
||||
new contactPatchPair
|
||||
(
|
||||
contactEntries[contactI].keyword(),
|
||||
*this,
|
||||
contactEntries[contactI].dict()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void contactProblem::correct()
|
||||
{
|
||||
contactPatchPairList& contacts = *this;
|
||||
|
||||
// Create fields for accumulation
|
||||
volVectorField::GeometricBoundaryField& Upatches = U().boundaryField();
|
||||
|
||||
FieldField<Field, vector> curTraction(Upatches.size());
|
||||
FieldField<Field, vector> newTraction(Upatches.size());
|
||||
FieldField<Field, vector> refValue(Upatches.size());
|
||||
FieldField<Field, scalar> valueFraction(Upatches.size());
|
||||
|
||||
forAll (Upatches, patchI)
|
||||
{
|
||||
curTraction.set
|
||||
(
|
||||
patchI,
|
||||
new vectorField(Upatches[patchI].size(), vector::zero)
|
||||
);
|
||||
|
||||
newTraction.set
|
||||
(
|
||||
patchI,
|
||||
new vectorField(Upatches[patchI].size(), vector::zero)
|
||||
);
|
||||
|
||||
refValue.set
|
||||
(
|
||||
patchI,
|
||||
new vectorField(Upatches[patchI].size(), vector::zero)
|
||||
);
|
||||
|
||||
valueFraction.set
|
||||
(
|
||||
patchI,
|
||||
new scalarField(Upatches[patchI].size(), 0)
|
||||
);
|
||||
}
|
||||
|
||||
// Collect patches involved in contact
|
||||
boolList contactPatches(Upatches.size(), false);
|
||||
|
||||
forAll (contacts, contactI)
|
||||
{
|
||||
contactPatches[contacts[contactI].masterPatch().index()] = true;
|
||||
contactPatches[contacts[contactI].slavePatch().index()] = true;
|
||||
}
|
||||
|
||||
// Calculate the traction for all involved patches
|
||||
|
||||
// Collect fields
|
||||
const volTensorField::GeometricBoundaryField& gradUpatches =
|
||||
gradU().boundaryField();
|
||||
|
||||
const surfaceVectorField::GeometricBoundaryField& Apatches =
|
||||
mesh().Sf().boundaryField();
|
||||
const surfaceScalarField::GeometricBoundaryField& magApatches =
|
||||
mesh().magSf().boundaryField();
|
||||
|
||||
// Lookup mu and lambda form object registry
|
||||
const volScalarField& mu =
|
||||
mesh().objectRegistry::lookupObject<volScalarField>("mu");
|
||||
|
||||
const volScalarField::GeometricBoundaryField& muPatches =
|
||||
mu.boundaryField();
|
||||
|
||||
const volScalarField& lambda =
|
||||
mesh().objectRegistry::lookupObject<volScalarField>("lambda");
|
||||
|
||||
const volScalarField::GeometricBoundaryField& lambdaPatches =
|
||||
lambda.boundaryField();
|
||||
|
||||
forAll (Upatches, patchI)
|
||||
{
|
||||
if (contactPatches[patchI])
|
||||
{
|
||||
vectorField nPatch = Apatches[patchI]/magApatches[patchI];
|
||||
|
||||
curTraction[patchI] =
|
||||
nPatch &
|
||||
(
|
||||
muPatches[patchI]*
|
||||
(
|
||||
gradUpatches[patchI]
|
||||
+ gradUpatches[patchI].T()
|
||||
)
|
||||
+ I*(lambdaPatches[patchI]*tr(gradUpatches[patchI]))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Accumulate contact data and active patches
|
||||
forAll (contacts, contactI)
|
||||
{
|
||||
contacts[contactI].correct
|
||||
(
|
||||
curTraction,
|
||||
newTraction,
|
||||
refValue,
|
||||
valueFraction
|
||||
);
|
||||
}
|
||||
|
||||
// Enforce accumulated contact onto the patches
|
||||
forAll (Upatches, patchI)
|
||||
{
|
||||
if (contactPatches[patchI])
|
||||
{
|
||||
// Cast the patch into direction mixed type
|
||||
directionMixedFvPatchVectorField& curUPatch =
|
||||
refCast<directionMixedFvPatchVectorField>(Upatches[patchI]);
|
||||
|
||||
// Set the values using under-relaxation
|
||||
curUPatch.refValue() =
|
||||
(1.0 - urfValue_)*curUPatch.refValue()
|
||||
+ urfValue_*refValue[patchI];
|
||||
|
||||
// Calculate the gradient from under-relaxad accumulated traction
|
||||
vectorField nPatch = Apatches[patchI]/magApatches[patchI];
|
||||
|
||||
curUPatch.refGrad() =
|
||||
(
|
||||
(1.0 - urfTraction_)*curTraction[patchI]
|
||||
+ urfTraction_*newTraction[patchI]
|
||||
|
||||
- (nPatch &
|
||||
(
|
||||
muPatches[patchI]*gradUpatches[patchI].T()
|
||||
- (
|
||||
muPatches[patchI]
|
||||
+ lambdaPatches[patchI]
|
||||
)*gradUpatches[patchI]
|
||||
)
|
||||
)
|
||||
|
||||
- nPatch*
|
||||
(
|
||||
lambdaPatches[patchI]*tr(gradUpatches[patchI])
|
||||
)
|
||||
|
||||
)/(2.0*muPatches[patchI] + lambdaPatches[patchI]);
|
||||
|
||||
// Set the value fractions
|
||||
curUPatch.valueFraction() =
|
||||
(1.0 - urfFraction_)*curUPatch.valueFraction()
|
||||
+ I*urfFraction_*valueFraction[patchI];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
tmp<volScalarField> contactProblem::contactArea() const
|
||||
{
|
||||
tmp<volScalarField> tca
|
||||
(
|
||||
new volScalarField
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"contactArea",
|
||||
U().time().timeName(),
|
||||
U().db(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh(),
|
||||
dimensionedScalar(0)
|
||||
)
|
||||
);
|
||||
|
||||
volScalarField& ca = tca();
|
||||
|
||||
// Set contact area boundary
|
||||
const contactPatchPairList& contacts = *this;
|
||||
|
||||
forAll (contacts, contactI)
|
||||
{
|
||||
// Get master contact
|
||||
ca.boundaryField()[contacts[contactI].masterPatch().index()] +=
|
||||
contacts[contactI].masterTouchFraction();
|
||||
|
||||
// Get slave contact
|
||||
ca.boundaryField()[contacts[contactI].slavePatch().index()] +=
|
||||
contacts[contactI].slaveTouchFraction();
|
||||
}
|
||||
|
||||
return tca;
|
||||
}
|
||||
|
||||
|
||||
// Return a list of contactPatchPair names
|
||||
wordList contactProblem::names() const
|
||||
{
|
||||
const contactPatchPairList& contacts = *this;
|
||||
|
||||
wordList t(contacts.size());
|
||||
|
||||
forAll (contacts, contactI)
|
||||
{
|
||||
t[contactI] = contacts[contactI].name();
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
bool contactProblem::read()
|
||||
{
|
||||
if (regIOobject::read())
|
||||
{
|
||||
urfValue_ = readScalar(lookup("urfValue"));
|
||||
urfTraction_ = readScalar(lookup("urfTraction"));
|
||||
urfFraction_ = readScalar(lookup("urfFraction"));
|
||||
|
||||
// Decided not to re-read contactPatchPairList. HJ, 10/Jul/2004
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,161 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Class
|
||||
contactProblem
|
||||
|
||||
Description
|
||||
Class describes a multiple body contact problem. Each individual contact
|
||||
is described by a contactPatchPair. contactProblem handles
|
||||
multiple contact updates and sets the boundary conditions on the
|
||||
displacement field.
|
||||
|
||||
SourceFiles
|
||||
contactProblem.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef contactProblem_H
|
||||
#define contactProblem_H
|
||||
|
||||
#include "contactPatchPairList.H"
|
||||
#include "IOdictionary.H"
|
||||
#include "volFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
class fvMesh;
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class contactProblem Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class contactProblem
|
||||
:
|
||||
public IOdictionary,
|
||||
public contactPatchPairList
|
||||
{
|
||||
private:
|
||||
|
||||
// Private data
|
||||
|
||||
//- Reference to displacement field
|
||||
volVectorField& U_;
|
||||
|
||||
//- Reference to displacement gradient field
|
||||
const volTensorField& gradU_;
|
||||
|
||||
//- Value under-relaxation
|
||||
scalar urfValue_;
|
||||
|
||||
//- Gradient under-relaxation
|
||||
scalar urfTraction_;
|
||||
|
||||
//- Fraction under-relaxation
|
||||
scalar urfFraction_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
contactProblem(const contactProblem&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const contactProblem&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("contactProblem");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Read constructor
|
||||
contactProblem
|
||||
(
|
||||
volVectorField& U,
|
||||
const volTensorField& gradU
|
||||
);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~contactProblem()
|
||||
{}
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return const reference to displacement field
|
||||
const volVectorField& U() const
|
||||
{
|
||||
return U_;
|
||||
}
|
||||
|
||||
//- Return reference to displacement field
|
||||
volVectorField& U()
|
||||
{
|
||||
return U_;
|
||||
}
|
||||
|
||||
//- Return const reference to displacement gradient field
|
||||
const volTensorField& gradU() const
|
||||
{
|
||||
return gradU_;
|
||||
}
|
||||
|
||||
//- Return reference to displacement field
|
||||
const fvMesh& mesh() const
|
||||
{
|
||||
return U_.mesh();
|
||||
}
|
||||
|
||||
//- Return contact area field
|
||||
tmp<volScalarField> contactArea() const;
|
||||
|
||||
//- Return a list of contact patch pair names
|
||||
wordList names() const;
|
||||
|
||||
//- Correct contact conditions
|
||||
void correct();
|
||||
|
||||
//- Read rheologyProperties dictionary
|
||||
virtual bool read();
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,38 +0,0 @@
|
|||
mesh.weights();
|
||||
|
||||
Info<< "Reading field U\n" << endl;
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh
|
||||
);
|
||||
|
||||
// Create gradient field
|
||||
volTensorField gradU = fvc::grad(U);
|
||||
|
||||
volSymmTensorField sigma
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigma",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedSymmTensor("zero", dimForce/dimArea, symmTensor::zero)
|
||||
);
|
||||
|
||||
// Create rheology model
|
||||
rheologyModel rheology(sigma);
|
||||
|
||||
// Create contact problem
|
||||
contactProblem contact(U, gradU);
|
|
@ -1,120 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Application
|
||||
stressedFoam
|
||||
|
||||
Description
|
||||
Transient/steady-state solver for solid bodies in contact.
|
||||
|
||||
Solves for the displacement vector field U, also generating the
|
||||
stress tensor field sigma.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "rheologyModel.H"
|
||||
#include "contactProblem.H"
|
||||
#include "componentReferenceList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
# include "setRootCase.H"
|
||||
|
||||
# include "createTime.H"
|
||||
# include "createMesh.H"
|
||||
# include "createFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Info<< "\nCalculating displacement field\n" << endl;
|
||||
|
||||
volScalarField rho = rheology.rho();
|
||||
|
||||
// Force n-sqaured projection
|
||||
// polyPatch::setNSquaredProjection(true);
|
||||
|
||||
while (runTime.loop())
|
||||
{
|
||||
Info<< "Iteration: " << runTime.timeName() << nl << endl;
|
||||
|
||||
# include "readStressedFoamControls.H"
|
||||
|
||||
volScalarField mu = rheology.mu();
|
||||
volScalarField lambda = rheology.lambda();
|
||||
|
||||
int iCorr=0;
|
||||
scalar initialResidual=0;
|
||||
|
||||
contact.correct();
|
||||
|
||||
do
|
||||
{
|
||||
fvVectorMatrix UEqn
|
||||
(
|
||||
fvm::d2dt2(rho, U)
|
||||
==
|
||||
fvm::laplacian(2*mu + lambda, U, "laplacian(DU,U)")
|
||||
|
||||
+ fvc::div
|
||||
(
|
||||
mu*gradU.T() + lambda*(I*tr(gradU)) - (mu + lambda)*gradU,
|
||||
"div(sigma)"
|
||||
)
|
||||
);
|
||||
|
||||
# include "setComponentReference.H"
|
||||
|
||||
initialResidual = UEqn.solve().initialResidual();
|
||||
|
||||
gradU = fvc::grad(U);
|
||||
|
||||
# include "calculateSigma.H"
|
||||
|
||||
rheology.correct();
|
||||
|
||||
rho = rheology.rho();
|
||||
mu = rheology.mu();
|
||||
lambda = rheology.lambda();
|
||||
|
||||
} while (initialResidual > convergenceTolerance && ++iCorr < nCorr);
|
||||
|
||||
# include "calculateStress.H"
|
||||
# include "calculateContactArea.H"
|
||||
|
||||
Info<< "ExecutionTime = "
|
||||
<< runTime.elapsedCpuTime()
|
||||
<< " s\n\n" << endl;
|
||||
}
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,3 +0,0 @@
|
|||
newStressedFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/newStressedFoam
|
|
@ -1,8 +0,0 @@
|
|||
EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I../materialModels/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
-lmaterialModels \
|
||||
-llduSolvers
|
|
@ -1 +0,0 @@
|
|||
sigma = 2*mu*symm(gradU) + lambda*(I*tr(gradU));
|
|
@ -1,101 +0,0 @@
|
|||
if (runTime.outputTime())
|
||||
{
|
||||
volScalarField sigmaEq
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmaEq",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sqrt((3.0/2.0)*magSqr(dev(sigma)))
|
||||
);
|
||||
|
||||
Info<< "Max sigmaEq = " << max(sigmaEq).value()
|
||||
<< endl;
|
||||
|
||||
volScalarField sigmaxx
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmaxx",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sigma.component(symmTensor::XX)
|
||||
);
|
||||
|
||||
volScalarField sigmayy
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmayy",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sigma.component(symmTensor::YY)
|
||||
);
|
||||
|
||||
volScalarField sigmazz
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmazz",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sigma.component(symmTensor::ZZ)
|
||||
);
|
||||
|
||||
Info<< "Max sigmazz = " << max(sigmazz).value()
|
||||
<< endl;
|
||||
|
||||
volScalarField sigmaxy
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmaxy",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sigma.component(symmTensor::XY)
|
||||
);
|
||||
|
||||
volScalarField sigmaxz
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmaxz",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sigma.component(symmTensor::XZ)
|
||||
);
|
||||
|
||||
volScalarField sigmayz
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmayz",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sigma.component(symmTensor::YZ)
|
||||
);
|
||||
|
||||
runTime.write();
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
Info<< "Reading field U\n" << endl;
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh
|
||||
);
|
||||
|
||||
volSymmTensorField sigma
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigma",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedSymmTensor("zero", dimForce/dimArea, symmTensor::zero)
|
||||
);
|
||||
|
||||
rheologyModel rheology(sigma);
|
|
@ -1,115 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Application
|
||||
stressedFoam
|
||||
|
||||
Description
|
||||
Transient/steady-state segregated finite-volume solver for a solid
|
||||
body.
|
||||
|
||||
Solves for the displacement vector field U, also generating the
|
||||
stress tensor field sigma.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "rheologyModel.H"
|
||||
#include "componentReferenceList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
# include "setRootCase.H"
|
||||
|
||||
# include "createTime.H"
|
||||
# include "createMesh.H"
|
||||
# include "createFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Info<< "\nCalculating displacement field\n" << endl;
|
||||
|
||||
volTensorField gradU = fvc::grad(U);
|
||||
volScalarField rho = rheology.rho();
|
||||
|
||||
while (runTime.loop())
|
||||
{
|
||||
Info<< "Iteration: " << runTime.timeName() << nl << endl;
|
||||
|
||||
# include "readStressedFoamControls.H"
|
||||
|
||||
volScalarField mu = rheology.mu();
|
||||
volScalarField lambda = rheology.lambda();
|
||||
|
||||
int iCorr = 0;
|
||||
scalar initialResidual = 0;
|
||||
|
||||
do
|
||||
{
|
||||
fvVectorMatrix UEqn
|
||||
(
|
||||
fvm::d2dt2(rho, U)
|
||||
==
|
||||
fvm::laplacian(2*mu + lambda, U, "laplacian(DU,U)")
|
||||
|
||||
+ fvc::div
|
||||
(
|
||||
mu*gradU.T() + lambda*(I*tr(gradU)) - (mu + lambda)*gradU,
|
||||
"div(sigma)"
|
||||
)
|
||||
);
|
||||
|
||||
# include "setComponentReference.H"
|
||||
|
||||
initialResidual = UEqn.solve().initialResidual();
|
||||
|
||||
gradU = fvc::grad(U);
|
||||
|
||||
# include "calculateSigma.H"
|
||||
|
||||
rheology.correct();
|
||||
|
||||
rho = rheology.rho();
|
||||
mu = rheology.mu();
|
||||
lambda = rheology.lambda();
|
||||
|
||||
} while (initialResidual > convergenceTolerance && ++iCorr < nCorr);
|
||||
|
||||
# include "calculateStress.H"
|
||||
|
||||
Info<< "ExecutionTime = "
|
||||
<< runTime.elapsedCpuTime()
|
||||
<< " s\n\n" << endl;
|
||||
}
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,11 +0,0 @@
|
|||
const dictionary& stressControl =
|
||||
mesh.solutionDict().subDict("stressedFoam");
|
||||
|
||||
int nCorr(readInt(stressControl.lookup("nCorrectors")));
|
||||
scalar convergenceTolerance(readScalar(stressControl.lookup("U")));
|
||||
|
||||
componentReferenceList cr
|
||||
(
|
||||
stressControl.lookup("componentReference"),
|
||||
componentReference::iNew(mesh)
|
||||
);
|
|
@ -0,0 +1,3 @@
|
|||
elasticAcpSolidFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/elasticAcpSolidFoam
|
|
@ -0,0 +1,16 @@
|
|||
EXE_INC = \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/dynamicMesh/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/dynamicFvMesh/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/topoChangerFvMesh/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/solidModels/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
-lmeshTools \
|
||||
-ldynamicFvMesh \
|
||||
-ldynamicMesh \
|
||||
-ltopoChangerFvMesh \
|
||||
-lsolidModels
|
|
@ -0,0 +1,35 @@
|
|||
// aitken acceleration
|
||||
aitkenDelta.storePrevIter();
|
||||
|
||||
// update delta
|
||||
aitkenDelta = (U - U.prevIter()) / aitkenInitialRes;
|
||||
|
||||
// update relaxation factor
|
||||
if(iCorr == 0)
|
||||
{
|
||||
aitkenTheta = 0.01;
|
||||
if(mesh.relax(U.name()))
|
||||
{
|
||||
aitkenTheta = mesh.relaxationFactor(U.name());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
vectorField b = aitkenDelta.internalField() - aitkenDelta.prevIter().internalField();
|
||||
//scalar sumMagB = gSum(mag(b));
|
||||
scalar sumMagB = gSum(magSqr(b));
|
||||
if(sumMagB < SMALL)
|
||||
{
|
||||
//Warning << "Aitken under-relaxation: denominator less then SMALL"
|
||||
// << endl;
|
||||
sumMagB += SMALL;
|
||||
}
|
||||
|
||||
aitkenTheta = -aitkenTheta*
|
||||
gSum(aitkenDelta.prevIter().internalField() & b)
|
||||
/
|
||||
sumMagB;
|
||||
}
|
||||
|
||||
// correction to the latest U
|
||||
U += aitkenTheta*aitkenDelta*aitkenInitialRes;
|
|
@ -0,0 +1,49 @@
|
|||
if(divSigmaExpMethod == "standard")
|
||||
{
|
||||
divSigmaExp = fvc::div
|
||||
(
|
||||
mu*gradU.T() + lambda*(I*tr(gradU)) - (mu + lambda)*gradU,
|
||||
"div(sigma)"
|
||||
);
|
||||
}
|
||||
else if(divSigmaExpMethod == "surface")
|
||||
{
|
||||
divSigmaExp = fvc::div
|
||||
(
|
||||
muf*(mesh.Sf() & fvc::interpolate(gradU.T()))
|
||||
+ lambdaf*(mesh.Sf() & I*fvc::interpolate(tr(gradU)))
|
||||
- (muf + lambdaf)*(mesh.Sf() & fvc::interpolate(gradU))
|
||||
);
|
||||
}
|
||||
else if(divSigmaExpMethod == "decompose")
|
||||
{
|
||||
snGradU = fvc::snGrad(U);
|
||||
|
||||
surfaceTensorField shearGradU =
|
||||
((I - n*n)&fvc::interpolate(gradU));
|
||||
|
||||
divSigmaExp = fvc::div
|
||||
(
|
||||
mesh.magSf()
|
||||
*(
|
||||
- (muf + lambdaf)*(snGradU&(I - n*n))
|
||||
+ lambdaf*tr(shearGradU&(I - n*n))*n
|
||||
+ muf*(shearGradU&n)
|
||||
)
|
||||
);
|
||||
}
|
||||
else if(divSigmaExpMethod == "expLaplacian")
|
||||
{
|
||||
divSigmaExp =
|
||||
- fvc::laplacian(mu + lambda, U, "laplacian(DU,U)")
|
||||
+ fvc::div
|
||||
(
|
||||
mu*gradU.T()
|
||||
+ lambda*(I*tr(gradU)),
|
||||
"div(sigma)"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalError << "divSigmaExp method " << divSigmaExpMethod << " not found!" << endl;
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
// force residual is the net force on the model
|
||||
// this should got to zero in a converged steady state model
|
||||
// should be altered for parallel runs
|
||||
vector netForce = vector::zero;
|
||||
forAll(mesh.boundary(), patchi)
|
||||
{
|
||||
netForce +=
|
||||
sum(
|
||||
mesh.Sf().boundaryField()[patchi]
|
||||
&
|
||||
(
|
||||
2*mu.boundaryField()[patchi]*symm(gradU.boundaryField()[patchi])
|
||||
+ lambda*tr(gradU.boundaryField()[patchi])*I
|
||||
)
|
||||
);
|
||||
}
|
||||
forceResidual = mag(netForce);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
scalar maxDU = gMax(mag(U.internalField() - U.oldTime().internalField()));
|
||||
|
||||
relativeResidual =
|
||||
gMax
|
||||
(
|
||||
mag(U.internalField() - U.prevIter().internalField())
|
||||
/(maxDU + SMALL)
|
||||
);
|
||||
|
||||
resid = (U - U.prevIter())/(max(mag(U-U.oldTime()))+dimensionedScalar("SMALL", dimLength, SMALL));
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
surfaceVectorField n = mesh.Sf()/mesh.magSf();
|
||||
|
||||
// traction = (n&fvc::interpolate(sigma));
|
||||
|
||||
// surfaceTensorField sGradU =
|
||||
// ((I - n*n)&fvc::interpolate(gradU));
|
||||
|
||||
// traction =
|
||||
// (2*mu + lambda)*snGradU
|
||||
// - (mu + lambda)*(snGradU&(I - n*n))
|
||||
// + mu*(sGradU&n)
|
||||
// + lambda*tr(sGradU&(I - n*n))*n;
|
||||
|
||||
// traction =
|
||||
// (2*mu + lambda)*fvc::snGrad(U)
|
||||
// - (mu + lambda)*(n&sGradU)
|
||||
// + mu*(sGradU&n)
|
||||
// + lambda*tr(sGradU)*n;
|
||||
|
||||
// philipc
|
||||
// I am having trouble with back-calculation of interface tractions from solid interface
|
||||
// procedure (in multiMaterial.C), the tractions have quite large differences from each
|
||||
// side. Interpolating sigma is OK for now
|
||||
// traction = rheology.law().interfaceTraction(n, U, gradU, rheology.mu(), rheology.lambda());
|
||||
# include "calculateEpsilonSigma.H"
|
||||
traction = (n&fvc::interpolate(sigma));
|
||||
|
||||
// forAll(traction.boundaryField(), patchi)
|
||||
// {
|
||||
// if (mesh.boundary()[patchi].type() == "cohesive")
|
||||
// {
|
||||
// forAll(traction.boundaryField()[patchi], facei)
|
||||
// {
|
||||
// Pout << "face " << facei << " with traction magnitude "
|
||||
// << mag(traction.boundaryField()[patchi][facei])/1e6 << " MPa and traction "
|
||||
// << traction.boundaryField()[patchi][facei]/1e6 << " MPa" << endl;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
label sizeByTwo = mesh.boundary()[cohesivePatchID].size()/2;
|
||||
vectorField Cczm = mesh.boundary()[cohesivePatchID].Cf();
|
||||
|
||||
for(label i = 0; i < sizeByTwo; i++)
|
||||
{
|
||||
Cczm[i] -= Cczm[sizeByTwo + i];
|
||||
Cczm[sizeByTwo + i] = Cczm[i];
|
||||
}
|
||||
|
||||
scalar error = sum(mag(Cczm));
|
||||
|
||||
if(error < SMALL)
|
||||
{
|
||||
Info << "Cohesive patch face ordering: OK" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
Info << "Cohesive patch face ordering: error (" << error << ")"
|
||||
<< endl;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,226 @@
|
|||
label cohesivePatchID = -1;
|
||||
|
||||
solidCohesiveFvPatchVectorField* cohesivePatchUPtr = NULL;
|
||||
solidCohesiveFixedModeMixFvPatchVectorField* cohesivePatchUFixedModePtr = NULL;
|
||||
|
||||
forAll (U.boundaryField(), patchI)
|
||||
{
|
||||
if (isA<solidCohesiveFvPatchVectorField>(U.boundaryField()[patchI]))
|
||||
{
|
||||
cohesivePatchID = patchI;
|
||||
cohesivePatchUPtr =
|
||||
&refCast<solidCohesiveFvPatchVectorField>
|
||||
(
|
||||
U.boundaryField()[cohesivePatchID]
|
||||
);
|
||||
break;
|
||||
}
|
||||
else if (isA<solidCohesiveFixedModeMixFvPatchVectorField>(U.boundaryField()[patchI]))
|
||||
{
|
||||
cohesivePatchID = patchI;
|
||||
cohesivePatchUFixedModePtr =
|
||||
&refCast<solidCohesiveFixedModeMixFvPatchVectorField>
|
||||
(
|
||||
U.boundaryField()[cohesivePatchID]
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(cohesivePatchID == -1)
|
||||
{
|
||||
FatalErrorIn(args.executable())
|
||||
<< "Can't find cohesiveLawFvPatch" << nl
|
||||
<< "One of the boundary patches in " << U.name() << ".boundaryField() "
|
||||
<< "should be of type " << solidCohesiveFvPatchVectorField::typeName
|
||||
<< "or " << solidCohesiveFixedModeMixFvPatchVectorField::typeName
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// solidCohesiveFvPatchVectorField& cohesivePatchU =
|
||||
// refCast<solidCohesiveFvPatchVectorField>
|
||||
// (
|
||||
// U.boundaryField()[cohesivePatchID]
|
||||
// );
|
||||
|
||||
// philipc: I have moved cohesive stuff to constitutiveModel
|
||||
|
||||
// cohesiveZone is an index field
|
||||
// which allows the user to limit the crack to certain areas at runtime
|
||||
// 1 for faces within cohesiveZone
|
||||
// 0 for faces outside cohesiveZone
|
||||
surfaceScalarField cohesiveZone
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"cohesiveZone",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("zero", dimless, 0.0)
|
||||
);
|
||||
|
||||
// limit crack to specified boxes
|
||||
{
|
||||
const dictionary& stressControl =
|
||||
mesh.solutionDict().subDict("stressedFoam");
|
||||
|
||||
List<boundBox> userBoxes(stressControl.lookup("crackLimitingBoxes"));
|
||||
const surfaceVectorField& Cf = mesh.Cf();
|
||||
forAll(cohesiveZone.internalField(), faceI)
|
||||
{
|
||||
bool faceInsideBox = false;
|
||||
|
||||
forAll(userBoxes, boxi)
|
||||
{
|
||||
if(userBoxes[boxi].contains(Cf.internalField()[faceI])) faceInsideBox = true;
|
||||
}
|
||||
|
||||
if(faceInsideBox)
|
||||
{
|
||||
cohesiveZone.internalField()[faceI] = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
forAll(cohesiveZone.boundaryField(), patchI)
|
||||
{
|
||||
// cracks may go along proc boundaries
|
||||
if(mesh.boundaryMesh()[patchI].type() == processorPolyPatch::typeName)
|
||||
{
|
||||
forAll(cohesiveZone.boundaryField()[patchI], faceI)
|
||||
{
|
||||
bool faceInsideBox = false;
|
||||
|
||||
forAll(userBoxes, boxi)
|
||||
{
|
||||
if(userBoxes[boxi].contains(Cf.boundaryField()[patchI][faceI])) faceInsideBox = true;
|
||||
}
|
||||
|
||||
if(faceInsideBox)
|
||||
{
|
||||
cohesiveZone.boundaryField()[patchI][faceI] = 1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Info << "\nThere are " << gSum(cohesiveZone.internalField()) << " potential internal crack faces" << nl << endl;
|
||||
Info << "\nThere are " << gSum(cohesiveZone.boundaryField())/2 << " potential coupled boundary crack faces" << nl << endl;
|
||||
|
||||
// write field for visualisation
|
||||
volScalarField cohesiveZoneVol
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"cohesiveZoneVol",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("zero", dimless, 0.0)
|
||||
);
|
||||
forAll(cohesiveZone.internalField(), facei)
|
||||
{
|
||||
if(cohesiveZone.internalField()[facei])
|
||||
{
|
||||
cohesiveZoneVol.internalField()[mesh.owner()[facei]] = 1.0;
|
||||
cohesiveZoneVol.internalField()[mesh.neighbour()[facei]] = 1.0;
|
||||
}
|
||||
}
|
||||
forAll(cohesiveZone.boundaryField(), patchi)
|
||||
{
|
||||
forAll(cohesiveZone.boundaryField()[patchi], facei)
|
||||
{
|
||||
if(cohesiveZone.boundaryField()[patchi][facei] > 0.0)
|
||||
{
|
||||
cohesiveZoneVol.boundaryField()[patchi][facei] = 1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
Info << "Writing cohesiveZone field" << endl;
|
||||
cohesiveZoneVol.write();
|
||||
}
|
||||
|
||||
|
||||
Switch initialiseSolution(false);
|
||||
|
||||
if
|
||||
(
|
||||
mesh.solutionDict().subDict("stressedFoam")
|
||||
.found("initialiseSolution")
|
||||
)
|
||||
{
|
||||
initialiseSolution =
|
||||
Switch
|
||||
(
|
||||
mesh.solutionDict().subDict("stressedFoam").lookup
|
||||
(
|
||||
"initialiseSolution"
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Switch breakOnlyOneFacePerTopologyChange(true);
|
||||
|
||||
if
|
||||
(
|
||||
mesh.solutionDict().subDict("stressedFoam")
|
||||
.found("breakOnlyOneFacePerTopologyChange")
|
||||
)
|
||||
{
|
||||
breakOnlyOneFacePerTopologyChange =
|
||||
Switch
|
||||
(
|
||||
mesh.solutionDict().subDict("stressedFoam").lookup
|
||||
(
|
||||
"breakOnlyOneFacePerTopologyChange"
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Switch crackPropagationFromSpecifiedPatches
|
||||
(
|
||||
mesh.solutionDict().subDict("stressedFoam").lookup
|
||||
(
|
||||
"crackPropagationFromSpecifiedPatches"
|
||||
)
|
||||
);
|
||||
|
||||
wordList crackPropagationPatchNames
|
||||
(
|
||||
mesh.solutionDict().subDict("stressedFoam").lookup
|
||||
(
|
||||
"crackPropagationPatches"
|
||||
)
|
||||
);
|
||||
|
||||
labelList crackPropagationPatches(crackPropagationPatchNames.size(), -1);
|
||||
|
||||
forAll(crackPropagationPatchNames, patchI)
|
||||
{
|
||||
crackPropagationPatches[patchI] =
|
||||
mesh.boundaryMesh().findPatchID
|
||||
(
|
||||
crackPropagationPatchNames[patchI]
|
||||
);
|
||||
|
||||
if(crackPropagationPatches[patchI] == -1)
|
||||
{
|
||||
FatalErrorIn(args.executable())
|
||||
<< "Can't find " << crackPropagationPatchNames[patchI]
|
||||
<< " patch" << abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
// Internal faces next to selected crack propagation patches
|
||||
labelList crackPropagationPatchesInternalFaces;
|
||||
|
||||
# include "updateCrackPropagationPatchesInternalFaces.H"
|
||||
|
|
@ -1,13 +1,10 @@
|
|||
fvMesh stressMesh
|
||||
crackerFvMesh mesh
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"solid",
|
||||
fvMesh::defaultRegion,
|
||||
runTime.timeName(),
|
||||
runTime,
|
||||
IOobject::MUST_READ
|
||||
)
|
||||
);
|
||||
|
||||
const volPointInterpolation& cpi = volPointInterpolation::New(stressMesh);
|
||||
|
|
@ -0,0 +1,148 @@
|
|||
Info<< "Reading field U\n" << endl;
|
||||
volVectorField U
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"U",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh
|
||||
);
|
||||
|
||||
volTensorField gradU //= fvc::grad(U);
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"grad(U)",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedTensor("zero", dimless, tensor::zero)
|
||||
);
|
||||
surfaceVectorField snGradU // = fvc::snGrad(U);
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"snGrad(U)",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedVector("zero", dimless, vector::zero)
|
||||
);
|
||||
|
||||
volVectorField V
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"V",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
fvc::ddt(U)
|
||||
);
|
||||
|
||||
volSymmTensorField epsilon
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"epsilon",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedSymmTensor("zero", dimless, symmTensor::zero)
|
||||
);
|
||||
|
||||
volSymmTensorField sigma
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigma",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedSymmTensor("zero", dimForce/dimArea, symmTensor::zero)
|
||||
);
|
||||
|
||||
volVectorField divSigmaExp
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"divSigmaExp",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedVector("zero", dimForce/dimVolume, vector::zero)
|
||||
);
|
||||
|
||||
constitutiveModel rheology(sigma, U);
|
||||
|
||||
surfaceVectorField traction
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"traction",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedVector("zero", dimForce/dimArea, vector::zero)
|
||||
);
|
||||
|
||||
// for aitken relaxation
|
||||
volVectorField aitkenDelta
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"aitkenDelta",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedVector("zero", dimLength, vector::zero)
|
||||
);
|
||||
// aitken relaxation factor
|
||||
scalar aitkenInitialRes = 1.0;
|
||||
scalar aitkenTheta = 0.1;
|
||||
if(mesh.relax(U.name()))
|
||||
{
|
||||
aitkenTheta = mesh.relaxationFactor(U.name());
|
||||
}
|
||||
|
||||
|
||||
volVectorField resid
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"resid",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedVector("zero", dimless, vector::zero)
|
||||
);
|
|
@ -0,0 +1,30 @@
|
|||
OFstream * filePtr(NULL);
|
||||
word historyPatchName(mesh.solutionDict().subDict("stressedFoam").lookup("historyPatch"));
|
||||
label historyPatchID = mesh.boundaryMesh().findPatchID(historyPatchName);
|
||||
if(historyPatchID == -1)
|
||||
{
|
||||
Warning << "history patch " << historyPatchName
|
||||
<< " not found. Force-displacement will not be written"
|
||||
<< endl;
|
||||
}
|
||||
else if(Pstream::master())
|
||||
{
|
||||
Info << "Force-displacement for patch " << historyPatchName
|
||||
<< " will be written to forceDisp.dat"
|
||||
<< endl;
|
||||
word hisDirName("history");
|
||||
mkDir(hisDirName);
|
||||
filePtr = new OFstream(hisDirName/"forceDisp.dat");
|
||||
OFstream& forceDispFile = *filePtr;
|
||||
forceDispFile << "#Disp(mm)\tForce(N)" << endl;
|
||||
}
|
||||
|
||||
|
||||
clipGauge* clipGPtr = NULL;
|
||||
if(mesh.solutionDict().subDict("stressedFoam").found("clipGauge"))
|
||||
{
|
||||
if(Switch(mesh.solutionDict().subDict("stressedFoam").lookup("clipGauge")))
|
||||
{
|
||||
clipGPtr = new clipGauge("clipGauge1", U);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
boolList needRef(mesh.regions().nRegions(), true);
|
||||
labelList refCells(mesh.regions().nRegions(), -1);
|
||||
|
||||
labelList deadCells;
|
||||
|
||||
# include "updateReference.H"
|
||||
|
|
@ -0,0 +1,257 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Application
|
||||
elasticAcpSolidFoam
|
||||
|
||||
Description
|
||||
Arbitrary crack propagation solver.
|
||||
Cracks may propagate along any mesh internal face.
|
||||
|
||||
Please cite:
|
||||
Carolan D, Tuković Z, Murphy N, Ivankovic A, Arbitrary crack propagation
|
||||
in multi-phase materials using the finite volume method, Computational
|
||||
Materials Science, 2013, http://dx.doi.org/10.1016/j.commatsci.2012.11.049.
|
||||
|
||||
Author
|
||||
Zeljko Tukovic, FSB Zagreb
|
||||
Declan Carolan UCD
|
||||
Philip Cardiff UCD
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "constitutiveModel.H"
|
||||
//#include "componentReferenceList.H"
|
||||
#include "crackerFvMesh.H"
|
||||
#include "processorPolyPatch.H"
|
||||
#include "SortableList.H"
|
||||
#include "solidInterface.H"
|
||||
#include "solidCohesiveFvPatchVectorField.H"
|
||||
#include "solidCohesiveFixedModeMixFvPatchVectorField.H"
|
||||
#include "clipGauge.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
# include "setRootCase.H"
|
||||
# include "createTime.H"
|
||||
# include "createCrackerMesh.H"
|
||||
# include "createFields.H"
|
||||
# include "createCrack.H"
|
||||
//# include "createReference.H"
|
||||
# include "createHistory.H"
|
||||
# include "readDivSigmaExpMethod.H"
|
||||
# include "createSolidInterfaceNoModify.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Info<< "\nStarting time loop\n" << endl;
|
||||
|
||||
lduMatrix::debug = 0;
|
||||
|
||||
scalar maxEffTractionFraction = 0;
|
||||
|
||||
// time rates for predictor
|
||||
volTensorField gradV = fvc::ddt(gradU);
|
||||
surfaceVectorField snGradV =
|
||||
(snGradU - snGradU.oldTime())/runTime.deltaT();
|
||||
|
||||
//# include "initialiseSolution.H"
|
||||
|
||||
while (runTime.run())
|
||||
{
|
||||
# include "readStressedFoamControls.H"
|
||||
# include "setDeltaT.H"
|
||||
|
||||
runTime++;
|
||||
|
||||
Info<< "\nTime: " << runTime.timeName() << " s\n" << endl;
|
||||
|
||||
volScalarField rho = rheology.rho();
|
||||
volScalarField mu = rheology.mu();
|
||||
volScalarField lambda = rheology.lambda();
|
||||
surfaceScalarField muf = fvc::interpolate(mu);
|
||||
surfaceScalarField lambdaf = fvc::interpolate(lambda);
|
||||
|
||||
if(solidInterfaceCorr)
|
||||
solidInterfacePtr->modifyProperties(muf, lambdaf);
|
||||
|
||||
//# include "waveCourantNo.H"
|
||||
|
||||
int iCorr = 0;
|
||||
lduMatrix::solverPerformance solverPerf;
|
||||
scalar initialResidual = 0;
|
||||
scalar relativeResidual = 1;
|
||||
//scalar forceResidual = 1;
|
||||
label nFacesToBreak = 0;
|
||||
label nCoupledFacesToBreak = 0;
|
||||
bool topoChange = false;
|
||||
|
||||
//bool noMoreCracks = false;
|
||||
|
||||
// Predictor step using time rates
|
||||
if (predictor)
|
||||
{
|
||||
Info << "Predicting U, gradU and snGradU using velocity"
|
||||
<< endl;
|
||||
U += V*runTime.deltaT();
|
||||
gradU += gradV*runTime.deltaT();
|
||||
snGradU += snGradV*runTime.deltaT();
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
surfaceVectorField n = mesh.Sf()/mesh.magSf();
|
||||
do
|
||||
{
|
||||
U.storePrevIter();
|
||||
|
||||
# include "calculateDivSigmaExp.H"
|
||||
|
||||
fvVectorMatrix UEqn
|
||||
(
|
||||
rho*fvm::d2dt2(U)
|
||||
==
|
||||
fvm::laplacian(2*muf + lambdaf, U, "laplacian(DU,U)")
|
||||
+ divSigmaExp
|
||||
);
|
||||
|
||||
//# include "setReference.H"
|
||||
|
||||
if(solidInterfaceCorr)
|
||||
solidInterfacePtr->correct(UEqn);
|
||||
|
||||
if(relaxEqn)
|
||||
UEqn.relax();
|
||||
|
||||
solverPerf = UEqn.solve();
|
||||
|
||||
if(aitkenRelax)
|
||||
{
|
||||
# include "aitkenRelaxation.H"
|
||||
}
|
||||
else
|
||||
{
|
||||
U.relax();
|
||||
}
|
||||
|
||||
if(iCorr == 0)
|
||||
{
|
||||
initialResidual = solverPerf.initialResidual();
|
||||
aitkenInitialRes = gMax(mag(U.internalField()));
|
||||
}
|
||||
|
||||
//gradU = solidInterfacePtr->grad(U);
|
||||
gradU = fvc::grad(U); // use leastSquaresSolidInterface grad scheme
|
||||
|
||||
|
||||
# include "calculateRelativeResidual.H"
|
||||
//# include "calculateForceResidual.H"
|
||||
|
||||
if(iCorr % infoFrequency == 0)
|
||||
{
|
||||
Info << "\tTime " << runTime.value()
|
||||
<< ", Corr " << iCorr
|
||||
<< ", Solving for " << U.name()
|
||||
<< " using " << solverPerf.solverName()
|
||||
<< ", res = " << solverPerf.initialResidual()
|
||||
<< ", rel res = " << relativeResidual;
|
||||
if(aitkenRelax) Info << ", aitken = " << aitkenTheta;
|
||||
Info << ", inner iters " << solverPerf.nIterations() << endl;
|
||||
}
|
||||
}
|
||||
while
|
||||
(
|
||||
//iCorr++ == 0
|
||||
iCorr++ < 2
|
||||
||
|
||||
(
|
||||
solverPerf.initialResidual() > convergenceTolerance
|
||||
//relativeResidual > convergenceTolerance
|
||||
&&
|
||||
iCorr < nCorr
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
Info << "Solving for " << U.name() << " using "
|
||||
<< solverPerf.solverName()
|
||||
<< ", Initial residual = " << initialResidual
|
||||
<< ", Final residual = " << solverPerf.initialResidual()
|
||||
<< ", No outer iterations " << iCorr
|
||||
<< ", Relative residual " << relativeResidual << endl;
|
||||
|
||||
# include "calculateTraction.H"
|
||||
# include "updateCrack.H"
|
||||
|
||||
Info << "Max effective traction fraction: " << maxEffTractionFraction << endl;
|
||||
|
||||
// reset counter if faces want to crack
|
||||
if((nFacesToBreak > 0) || (nCoupledFacesToBreak > 0)) iCorr = 0;
|
||||
}
|
||||
while( (nFacesToBreak > 0) || (nCoupledFacesToBreak > 0));
|
||||
|
||||
if(cohesivePatchUPtr)
|
||||
{
|
||||
if(returnReduce(cohesivePatchUPtr->size(), sumOp<label>()))
|
||||
{
|
||||
cohesivePatchUPtr->cracking();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( returnReduce(cohesivePatchUFixedModePtr->size(), sumOp<label>()) )
|
||||
{
|
||||
Pout << "Number of faces in crack: " << cohesivePatchUFixedModePtr->size()
|
||||
<< endl;
|
||||
cohesivePatchUFixedModePtr->relativeSeparationDistance();
|
||||
}
|
||||
}
|
||||
|
||||
// update time rates for predictor
|
||||
if(predictor)
|
||||
{
|
||||
V = fvc::ddt(U);
|
||||
gradV = fvc::ddt(gradU);
|
||||
snGradV = (snGradU - snGradU.oldTime())/runTime.deltaT();
|
||||
}
|
||||
|
||||
# include "calculateEpsilonSigma.H"
|
||||
# include "writeFields.H"
|
||||
# include "writeHistory.H"
|
||||
|
||||
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
||||
<< " ClockTime = " << runTime.elapsedClockTime() << " s\n\n"
|
||||
<< endl;
|
||||
}
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -0,0 +1,136 @@
|
|||
if (initialiseSolution)
|
||||
{
|
||||
Info << "Initialise solution" << endl;
|
||||
|
||||
const dictionary& stressControl =
|
||||
mesh.solutionDict().subDict("stressedFoam");
|
||||
|
||||
int nCorr(readInt(stressControl.lookup("nCorrectors")));
|
||||
scalar convergenceTolerance
|
||||
(
|
||||
readScalar(stressControl.lookup("U"))
|
||||
);
|
||||
|
||||
volScalarField rho = rheology.rho();
|
||||
surfaceScalarField mu = fvc::interpolate(rheology.mu());
|
||||
surfaceScalarField lambda = fvc::interpolate(rheology.lambda());
|
||||
//interface.modifyProperties(mu, lambda);
|
||||
interfacePtr->modifyProperties(mu, lambda);
|
||||
|
||||
int iCorr = 0;
|
||||
lduMatrix::solverPerformance solverPerf;
|
||||
scalar initialResidual = 0;
|
||||
scalar relRes = GREAT;
|
||||
|
||||
surfaceVectorField n = mesh.Sf()/mesh.magSf();
|
||||
|
||||
do
|
||||
{
|
||||
U.storePrevIter();
|
||||
|
||||
surfaceTensorField sGradU =
|
||||
((I - n*n)&fvc::interpolate(gradU));
|
||||
|
||||
fvVectorMatrix UEqn
|
||||
(
|
||||
fvm::laplacian(2*mu + lambda, U, "laplacian(DU,U)")
|
||||
+ fvc::div
|
||||
(
|
||||
mesh.magSf()
|
||||
*(
|
||||
- (mu + lambda)*(snGradU & (I - n*n))
|
||||
+ mu*(sGradU & n)
|
||||
+ lambda*tr(sGradU&(I - n*n))*n
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
# include "setReference.H"
|
||||
|
||||
interfacePtr->correct(UEqn);
|
||||
|
||||
solverPerf = UEqn.solve();
|
||||
|
||||
U.relax();
|
||||
|
||||
if(iCorr == 0)
|
||||
{
|
||||
initialResidual = solverPerf.initialResidual();
|
||||
}
|
||||
|
||||
//gradU = fvc::grad(U);
|
||||
//gradU = interface.grad(U);
|
||||
gradU = interfacePtr->grad(U);
|
||||
snGradU = fvc::snGrad(U);
|
||||
|
||||
relRes =
|
||||
gMax
|
||||
(
|
||||
mag(U.internalField() - U.prevIter().internalField())
|
||||
/(
|
||||
mag
|
||||
(
|
||||
U.internalField()
|
||||
- U.oldTime().internalField()
|
||||
)
|
||||
+ SMALL
|
||||
)
|
||||
);
|
||||
}
|
||||
while
|
||||
(
|
||||
relRes > convergenceTolerance
|
||||
&& ++iCorr < nCorr
|
||||
);
|
||||
|
||||
Info << "Solving for " << U.name() << " using "
|
||||
<< solverPerf.solverName()
|
||||
<< ", Initial residual = " << initialResidual
|
||||
<< ", Final residual = " << solverPerf.initialResidual()
|
||||
<< ", No outer iterations " << iCorr
|
||||
<< ", Relative residual " << relRes << endl;
|
||||
|
||||
# include "calculateTraction.H"
|
||||
|
||||
scalarField effTraction =
|
||||
mag(n.internalField() & traction.internalField());
|
||||
// cohesivePatchU.effectiveTraction
|
||||
// (
|
||||
// traction.internalField(),
|
||||
// n.internalField()
|
||||
// );
|
||||
|
||||
scalar maxEffTraction = 0.0;
|
||||
|
||||
if
|
||||
(
|
||||
crackPropagationFromSpecifiedPatches
|
||||
&& crackPropagationPatchesInternalFaces.size()
|
||||
)
|
||||
{
|
||||
maxEffTraction =
|
||||
gMax
|
||||
(
|
||||
scalarField
|
||||
(
|
||||
effTraction,
|
||||
crackPropagationPatchesInternalFaces
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
maxEffTraction = gMax(cohesiveZone.internalField()*effTraction);
|
||||
}
|
||||
|
||||
Info << "Max effTraction: " << maxEffTraction << endl;
|
||||
|
||||
// if (maxEffTraction >= CzLaw.sigmaMax().value())
|
||||
// {
|
||||
// FatalErrorIn(args.executable())
|
||||
// << "Maximal effective traction is greater then critical traction"
|
||||
// << abort(FatalError);
|
||||
// }
|
||||
|
||||
U.oldTime() = U;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
//- how explicit component of sigma is to be calculated
|
||||
word divSigmaExpMethod(mesh.solutionDict().subDict("stressedFoam").lookup("divSigmaExp"));
|
||||
Info << divSigmaExpMethod << " method chosen for calculation of sigmaExp" << endl;
|
||||
Info << "Selecting divSigmaExp calculation method " << divSigmaExpMethod << endl;
|
||||
if(divSigmaExpMethod != "standard" && divSigmaExpMethod != "surface" && divSigmaExpMethod != "decompose" && divSigmaExpMethod != "laplacian")
|
||||
{
|
||||
FatalError << "divSigmaExp method " << divSigmaExpMethod << " not found!" << nl
|
|
@ -0,0 +1,19 @@
|
|||
const dictionary& stressControl =
|
||||
mesh.solutionDict().subDict("stressedFoam");
|
||||
|
||||
int nCorr(readInt(stressControl.lookup("nCorrectors")));
|
||||
scalar convergenceTolerance(readScalar(stressControl.lookup("U")));
|
||||
Switch predictor(stressControl.lookup("predictor"));
|
||||
Switch dynamicTimeStep(stressControl.lookup("dynamicTimeStep"));
|
||||
scalar deltaTmin(readScalar(stressControl.lookup("deltaTmin")));
|
||||
scalar deltaTmax(readScalar(stressControl.lookup("deltaTmax")));
|
||||
scalar dynamicTimeStepActivation(readScalar(stressControl.lookup("dynamicTimeStepActivation")));
|
||||
int infoFrequency(readInt(stressControl.lookup("infoFrequency")));
|
||||
Switch aitkenRelax(stressControl.lookup("aitkenRelaxation"));
|
||||
Switch relaxEqn(stressControl.lookup("relaxEqn"));
|
||||
|
||||
if(relaxEqn && solidInterfaceCorr)
|
||||
{
|
||||
FatalError << "relaxEqn and solidInterface may not be used concurrently"
|
||||
<< exit(FatalError);
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
if (dynamicTimeStep && runTime.value() > dynamicTimeStepActivation)
|
||||
{
|
||||
if
|
||||
(
|
||||
//(maxEffTraction < 0.999*CzLaw.sigmaMax().value())
|
||||
(returnReduce(maxEffTractionFraction, maxOp<scalar>()) < 0.99)
|
||||
//&& (cohesivePatchU.size() == 0)
|
||||
&& (mag(runTime.deltaT().value() - deltaTmax) < SMALL)
|
||||
)
|
||||
{
|
||||
runTime.setDeltaT(deltaTmax);
|
||||
}
|
||||
else
|
||||
{
|
||||
scalar newDeltaT = deltaTmin;
|
||||
|
||||
if (newDeltaT/runTime.deltaT().value() < 0.5)
|
||||
{
|
||||
newDeltaT = 0.5*runTime.deltaT().value();
|
||||
Info << "Reducing time step" << nl;
|
||||
}
|
||||
|
||||
runTime.setDeltaT(newDeltaT);
|
||||
}
|
||||
|
||||
Pout << "Current time step size: "
|
||||
<< runTime.deltaT().value() << " s" << endl;
|
||||
|
||||
scalar maxDT = runTime.deltaT().value();
|
||||
|
||||
if(mag(returnReduce(maxDT, maxOp<scalar>()) - runTime.deltaT().value()) > SMALL)
|
||||
{
|
||||
FatalError << "Processors have different time-steps!"
|
||||
<< exit(FatalError);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
// Set reference
|
||||
for (label regI = 0; regI < mesh.regions().nRegions(); regI++)
|
||||
{
|
||||
if (needRef[regI])
|
||||
{
|
||||
UEqn.source()[refCells[regI]] +=
|
||||
UEqn.diag()[refCells[regI]]*vector::zero;
|
||||
|
||||
UEqn.diag()[refCells[regI]] +=
|
||||
UEqn.diag()[refCells[regI]];
|
||||
}
|
||||
}
|
||||
|
||||
// Set value for dead cells (small particles or regions)
|
||||
// label size = mesh.nCells() - label(sum(gamma.internalField()));
|
||||
|
||||
if (deadCells.size())
|
||||
{
|
||||
labelList curRefCell(deadCells.size(), -1);
|
||||
label index = 0;
|
||||
forAll(deadCells, cellI)
|
||||
{
|
||||
curRefCell[index++] = deadCells[cellI];
|
||||
|
||||
// if (gamma.internalField()[cellI] < 1 - SMALL)
|
||||
// {
|
||||
// curRefCell[index++] = cellI;
|
||||
// }
|
||||
}
|
||||
|
||||
vectorField curRefValue(curRefCell.size(), vector::zero);
|
||||
|
||||
UEqn.setValues(curRefCell, curRefValue);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,564 @@
|
|||
nFacesToBreak = 0;
|
||||
nCoupledFacesToBreak = 0;
|
||||
{
|
||||
// Check internal faces
|
||||
|
||||
// scalarField effTraction =
|
||||
// cohesiveZone.internalField() *
|
||||
// mag(traction.internalField());
|
||||
scalarField normalTraction =
|
||||
cohesiveZone.internalField() *
|
||||
( n.internalField() & traction.internalField() );
|
||||
normalTraction = max(normalTraction, 0.0); // only consider tensile tractions
|
||||
scalarField shearTraction =
|
||||
cohesiveZone.internalField() *
|
||||
mag( (I - Foam::sqr(n.internalField())) & traction.internalField() );
|
||||
|
||||
// the traction fraction is monitored to decide which faces to break:
|
||||
// ie (tN/tNC)^2 + (tS/tSC)^2 >1 to crack a face
|
||||
|
||||
const surfaceScalarField sigmaMax = rheology.cohLaw().sigmaMax();
|
||||
const surfaceScalarField tauMax = rheology.cohLaw().tauMax();
|
||||
|
||||
const scalarField& sigmaMaxI = sigmaMax.internalField();
|
||||
const scalarField& tauMaxI = tauMax.internalField();
|
||||
|
||||
//scalarField effTractionFraction = effTraction/sigmaMax;
|
||||
scalarField effTractionFraction(normalTraction.size(), 0.0);
|
||||
|
||||
if(cohesivePatchUPtr)
|
||||
{
|
||||
effTractionFraction =
|
||||
(normalTraction/sigmaMaxI)*(normalTraction/sigmaMaxI) + (shearTraction/tauMaxI)*(shearTraction/tauMaxI);
|
||||
}
|
||||
else
|
||||
{
|
||||
// solidCohesiveFixedModeMix only uses sigmaMax
|
||||
effTractionFraction =
|
||||
(normalTraction/sigmaMaxI)*(normalTraction/sigmaMaxI) + (shearTraction/sigmaMaxI)*(shearTraction/sigmaMaxI);
|
||||
}
|
||||
maxEffTractionFraction = gMax(effTractionFraction);
|
||||
|
||||
SLList<label> facesToBreakList;
|
||||
SLList<scalar> facesToBreakEffTractionFractionList;
|
||||
|
||||
forAll(effTractionFraction, faceI)
|
||||
{
|
||||
if (effTractionFraction[faceI] > 1.0)
|
||||
{
|
||||
facesToBreakList.insert(faceI);
|
||||
facesToBreakEffTractionFractionList.insert(effTractionFraction[faceI]);
|
||||
}
|
||||
}
|
||||
|
||||
labelList facesToBreak(facesToBreakList);
|
||||
List<scalar> facesToBreakEffTractionFraction(facesToBreakEffTractionFractionList);
|
||||
|
||||
nFacesToBreak = facesToBreak.size();
|
||||
|
||||
// Break only one face per topo change
|
||||
if (nFacesToBreak > 1)
|
||||
{
|
||||
nFacesToBreak = 1;
|
||||
}
|
||||
|
||||
// philipc - select face with maximum effective traction fraction
|
||||
label faceToBreakIndex = -1;
|
||||
scalar faceToBreakEffTractionFraction = 0;
|
||||
forAll(facesToBreakEffTractionFraction, faceI)
|
||||
{
|
||||
if (facesToBreakEffTractionFraction[faceI] > faceToBreakEffTractionFraction)
|
||||
{
|
||||
faceToBreakEffTractionFraction = facesToBreakEffTractionFraction[faceI];
|
||||
faceToBreakIndex = facesToBreak[faceI];
|
||||
}
|
||||
}
|
||||
|
||||
scalar gMaxEffTractionFraction =
|
||||
returnReduce(faceToBreakEffTractionFraction, maxOp<scalar>());
|
||||
|
||||
if (Pstream::parRun())
|
||||
{
|
||||
bool procHasFaceToBreak = false;
|
||||
if (nFacesToBreak > 0)
|
||||
{
|
||||
if ( mag(gMaxEffTractionFraction - faceToBreakEffTractionFraction) < SMALL )
|
||||
{
|
||||
// philipc - Maximum traction fraction is on this processor
|
||||
procHasFaceToBreak = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if maximum is present on more then one processors
|
||||
label procID = Pstream::nProcs();
|
||||
if (procHasFaceToBreak)
|
||||
{
|
||||
procID = Pstream::myProcNo();
|
||||
}
|
||||
|
||||
label minProcID =
|
||||
returnReduce<label>(procID, minOp<label>());
|
||||
|
||||
if (procID != minProcID)
|
||||
{
|
||||
nFacesToBreak = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Check coupled (processor) patches
|
||||
|
||||
SLList<label> coupledFacesToBreakList;
|
||||
SLList<scalar> coupledFacesToBreakEffTractionFractionList;
|
||||
forAll(mesh.boundary(), patchI)
|
||||
{
|
||||
if (mesh.boundary()[patchI].coupled())
|
||||
{
|
||||
// scalarField pEffTraction =
|
||||
// cohesiveZone.boundaryField()[patchI] *
|
||||
// mag(traction.boundaryField()[patchI]);
|
||||
// scalarField pEffTractionFraction = pEffTraction/sigmaMax.boundaryField()[patchI];
|
||||
|
||||
scalarField pNormalTraction =
|
||||
cohesiveZone.boundaryField()[patchI] *
|
||||
( n.boundaryField()[patchI] & traction.boundaryField()[patchI] );
|
||||
pNormalTraction = max(pNormalTraction, 0.0); // only consider tensile tractions
|
||||
scalarField pShearTraction =
|
||||
cohesiveZone.boundaryField()[patchI] *
|
||||
mag( (I - Foam::sqr(n.boundaryField()[patchI])) & traction.boundaryField()[patchI] );
|
||||
|
||||
// the traction fraction is monitored to decide which faces to break:
|
||||
// ie (tN/tNC)^2 + (tS/tSC)^2 >1 to crack a face
|
||||
const scalarField& pSigmaMax = sigmaMax.boundaryField()[patchI];
|
||||
const scalarField& pTauMax = tauMax.boundaryField()[patchI];
|
||||
|
||||
scalarField pEffTractionFraction(pNormalTraction.size(), 0.0);
|
||||
if(cohesivePatchUPtr)
|
||||
{
|
||||
pEffTractionFraction =
|
||||
(pNormalTraction/pSigmaMax)*(pNormalTraction/pSigmaMax) + (pShearTraction/pTauMax)*(pShearTraction/pTauMax);
|
||||
}
|
||||
else
|
||||
{
|
||||
// solidCohesiveFixedModeMix only uses sigmaMax
|
||||
pEffTractionFraction =
|
||||
(pNormalTraction/pSigmaMax)*(pNormalTraction/pSigmaMax) + (pShearTraction/pSigmaMax)*(pShearTraction/pSigmaMax);
|
||||
}
|
||||
|
||||
label start = mesh.boundaryMesh()[patchI].start();
|
||||
|
||||
forAll(pEffTractionFraction, faceI)
|
||||
{
|
||||
if (pEffTractionFraction[faceI] > maxEffTractionFraction)
|
||||
{
|
||||
maxEffTractionFraction = pEffTractionFraction[faceI];
|
||||
}
|
||||
|
||||
if (pEffTractionFraction[faceI] > 1.0)
|
||||
{
|
||||
coupledFacesToBreakList.insert(start + faceI);
|
||||
coupledFacesToBreakEffTractionFractionList.insert
|
||||
(
|
||||
pEffTractionFraction[faceI]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
labelList coupledFacesToBreak(coupledFacesToBreakList);
|
||||
List<scalar> coupledFacesToBreakEffTractionFraction
|
||||
(
|
||||
coupledFacesToBreakEffTractionFractionList
|
||||
);
|
||||
|
||||
nCoupledFacesToBreak = coupledFacesToBreak.size();
|
||||
|
||||
// Break only one face per topo change
|
||||
if (nCoupledFacesToBreak > 1)
|
||||
{
|
||||
nCoupledFacesToBreak = 1;
|
||||
}
|
||||
|
||||
// Select coupled face with maximum effective traction fraction
|
||||
label coupledFaceToBreakIndex = -1;
|
||||
scalar coupledFaceToBreakEffTractionFraction = 0;
|
||||
forAll(coupledFacesToBreakEffTractionFraction, faceI)
|
||||
{
|
||||
if
|
||||
(
|
||||
coupledFacesToBreakEffTractionFraction[faceI]
|
||||
> coupledFaceToBreakEffTractionFraction
|
||||
)
|
||||
{
|
||||
coupledFaceToBreakEffTractionFraction =
|
||||
coupledFacesToBreakEffTractionFraction[faceI];
|
||||
coupledFaceToBreakIndex = coupledFacesToBreak[faceI];
|
||||
}
|
||||
}
|
||||
|
||||
scalar gMaxCoupledEffTractionFraction =
|
||||
returnReduce(coupledFaceToBreakEffTractionFraction, maxOp<scalar>());
|
||||
|
||||
if (Pstream::parRun())
|
||||
{
|
||||
|
||||
bool procHasCoupledFaceToBreak = false;
|
||||
if (nCoupledFacesToBreak > 0)
|
||||
{
|
||||
if
|
||||
(
|
||||
mag(gMaxCoupledEffTractionFraction - coupledFaceToBreakEffTractionFraction)
|
||||
< SMALL
|
||||
)
|
||||
{
|
||||
// Maximum traction fraction is on this processor
|
||||
procHasCoupledFaceToBreak = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if maximum is present on more then one processors
|
||||
label procID = Pstream::nProcs();
|
||||
if (procHasCoupledFaceToBreak)
|
||||
{
|
||||
procID = Pstream::myProcNo();
|
||||
}
|
||||
|
||||
label minProcID =
|
||||
returnReduce<label>(procID, minOp<label>());
|
||||
|
||||
if (procID != minProcID)
|
||||
{
|
||||
nCoupledFacesToBreak = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (gMaxCoupledEffTractionFraction > gMaxEffTractionFraction)
|
||||
{
|
||||
// Break coupled face
|
||||
nFacesToBreak = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Break internal face
|
||||
nCoupledFacesToBreak = 0;
|
||||
}
|
||||
|
||||
// Make sure that coupled faces are broken in pairs
|
||||
labelList ngbProc(Pstream::nProcs(), -1);
|
||||
labelList index(Pstream::nProcs(), -1);
|
||||
if (nCoupledFacesToBreak)
|
||||
{
|
||||
label patchID =
|
||||
mesh.boundaryMesh().whichPatch(coupledFaceToBreakIndex);
|
||||
|
||||
label start = mesh.boundaryMesh()[patchID].start();
|
||||
label localIndex = coupledFaceToBreakIndex - start;
|
||||
|
||||
const processorPolyPatch& procPatch =
|
||||
refCast<const processorPolyPatch>(mesh.boundaryMesh()[patchID]);
|
||||
label ngbProcNo = procPatch.neighbProcNo();
|
||||
|
||||
ngbProc[Pstream::myProcNo()] = ngbProcNo;
|
||||
index[Pstream::myProcNo()] = localIndex;
|
||||
}
|
||||
|
||||
if (returnReduce(nCoupledFacesToBreak, maxOp<label>()))
|
||||
{
|
||||
reduce(ngbProc, maxOp<labelList>());
|
||||
reduce(index, maxOp<labelList>());
|
||||
|
||||
for (label procI = 0; procI < Pstream::nProcs(); procI++)
|
||||
{
|
||||
if (procI != Pstream::myProcNo())
|
||||
{
|
||||
if (ngbProc[procI] == Pstream::myProcNo())
|
||||
{
|
||||
forAll(mesh.boundaryMesh(), patchI)
|
||||
{
|
||||
if
|
||||
(
|
||||
mesh.boundaryMesh()[patchI].type()
|
||||
== processorPolyPatch::typeName
|
||||
)
|
||||
{
|
||||
const processorPolyPatch& procPatch =
|
||||
refCast<const processorPolyPatch>
|
||||
(
|
||||
mesh.boundaryMesh()[patchI]
|
||||
);
|
||||
label ngbProcNo = procPatch.neighbProcNo();
|
||||
|
||||
if (ngbProcNo == procI)
|
||||
{
|
||||
label start =
|
||||
mesh.boundaryMesh()[patchI].start();
|
||||
coupledFaceToBreakIndex = start + index[procI];
|
||||
nCoupledFacesToBreak = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
vector faceToBreakTraction = vector::zero;
|
||||
vector faceToBreakNormal = vector::zero;
|
||||
scalar faceToBreakSigmaMax = 0.0;
|
||||
scalar faceToBreakTauMax = 0.0;
|
||||
// Set faces to break
|
||||
if (nFacesToBreak > 0)
|
||||
{
|
||||
faceToBreakTraction = traction.internalField()[faceToBreakIndex];
|
||||
faceToBreakNormal = n.internalField()[faceToBreakIndex];
|
||||
|
||||
// Scale broken face traction
|
||||
faceToBreakSigmaMax = sigmaMaxI[faceToBreakIndex];
|
||||
faceToBreakTauMax = tauMaxI[faceToBreakIndex];
|
||||
scalar normalTrac = faceToBreakNormal & faceToBreakTraction;
|
||||
normalTrac = max(normalTrac, 0.0);
|
||||
scalar shearTrac = mag( (I - sqr(faceToBreakNormal)) & faceToBreakTraction );
|
||||
scalar scaleFactor = 1;
|
||||
if(cohesivePatchUPtr)
|
||||
{
|
||||
scaleFactor =
|
||||
::sqrt(1 / (
|
||||
(normalTrac/faceToBreakSigmaMax)*(normalTrac/faceToBreakSigmaMax)
|
||||
+ (shearTrac/faceToBreakTauMax)*(shearTrac/faceToBreakTauMax)
|
||||
) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// solidCohesiveFixedModeMix only uses sigmaMax
|
||||
scaleFactor =
|
||||
::sqrt(1 / (
|
||||
(normalTrac/faceToBreakSigmaMax)*(normalTrac/faceToBreakSigmaMax)
|
||||
+ (shearTrac/faceToBreakSigmaMax)*(shearTrac/faceToBreakSigmaMax)
|
||||
) );
|
||||
}
|
||||
|
||||
faceToBreakTraction *= scaleFactor;
|
||||
|
||||
topoChange = true;
|
||||
}
|
||||
else if (nCoupledFacesToBreak > 0)
|
||||
{
|
||||
label patchID =
|
||||
mesh.boundaryMesh().whichPatch(coupledFaceToBreakIndex);
|
||||
label start = mesh.boundaryMesh()[patchID].start();
|
||||
label localIndex = coupledFaceToBreakIndex - start;
|
||||
|
||||
faceToBreakTraction = traction.boundaryField()[patchID][localIndex];
|
||||
faceToBreakNormal = n.boundaryField()[patchID][localIndex];
|
||||
|
||||
// Scale broken face traction
|
||||
faceToBreakSigmaMax = sigmaMax.boundaryField()[patchID][localIndex];
|
||||
faceToBreakTauMax = tauMax.boundaryField()[patchID][localIndex];
|
||||
scalar normalTrac = faceToBreakNormal & faceToBreakTraction;
|
||||
normalTrac = max(normalTrac, 0.0);
|
||||
scalar shearTrac = mag( (I - sqr(faceToBreakNormal)) & faceToBreakTraction );
|
||||
scalar scaleFactor = 1;
|
||||
if(cohesivePatchUPtr)
|
||||
{
|
||||
scaleFactor =
|
||||
::sqrt(1 / (
|
||||
(normalTrac/faceToBreakSigmaMax)*(normalTrac/faceToBreakSigmaMax)
|
||||
+ (shearTrac/faceToBreakTauMax)*(shearTrac/faceToBreakTauMax)
|
||||
) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// solidCohesiveFixedModeMix only uses sigmaMax
|
||||
scaleFactor =
|
||||
::sqrt(1 / (
|
||||
(normalTrac/faceToBreakSigmaMax)*(normalTrac/faceToBreakSigmaMax)
|
||||
+ (shearTrac/faceToBreakSigmaMax)*(shearTrac/faceToBreakSigmaMax)
|
||||
) );
|
||||
}
|
||||
|
||||
faceToBreakTraction *= scaleFactor;
|
||||
|
||||
topoChange = true;
|
||||
}
|
||||
|
||||
reduce(topoChange, orOp<bool>());
|
||||
|
||||
labelList faceToBreak(nFacesToBreak, faceToBreakIndex);
|
||||
boolList faceToBreakFlip(nFacesToBreak, false);
|
||||
labelList coupledFaceToBreak
|
||||
(
|
||||
nCoupledFacesToBreak,
|
||||
coupledFaceToBreakIndex
|
||||
);
|
||||
|
||||
reduce(nFacesToBreak, maxOp<label>());
|
||||
reduce(nCoupledFacesToBreak, maxOp<label>());
|
||||
|
||||
if (nFacesToBreak || nCoupledFacesToBreak)
|
||||
{
|
||||
Pout << "Internal face to break: " << faceToBreak << endl;
|
||||
Pout << "Coupled face to break: " << coupledFaceToBreak << endl;
|
||||
|
||||
mesh.setBreak(faceToBreak, faceToBreakFlip, coupledFaceToBreak);
|
||||
mesh.update();
|
||||
|
||||
const labelList& faceMap = mesh.topoChangeMap().faceMap();
|
||||
label start = mesh.boundaryMesh()[cohesivePatchID].start();
|
||||
|
||||
mu = rheology.mu();
|
||||
lambda = rheology.lambda();
|
||||
muf = fvc::interpolate(mu);
|
||||
lambdaf = fvc::interpolate(lambda);
|
||||
|
||||
// we need to modify propertiess after cracking otherwise momentum equation is wrong
|
||||
// but solidInterface seems to hold some information about old mesh
|
||||
// so we will delete it and make another
|
||||
// we could probably add a public clearout function
|
||||
// create new solidInterface
|
||||
//Pout << "Creating new solidInterface" << endl;
|
||||
//delete solidInterfacePtr;
|
||||
//solidInterfacePtr = new solidInterface(mesh, rheology);
|
||||
// delete demand driven data as the mesh has changed
|
||||
if(rheology.solidInterfaceActive())
|
||||
{
|
||||
rheology.solInterface().clearOut();
|
||||
solidInterfacePtr->modifyProperties(muf, lambdaf);
|
||||
}
|
||||
|
||||
// Local crack displacement
|
||||
vectorField UpI =
|
||||
U.boundaryField()[cohesivePatchID].patchInternalField();
|
||||
vectorField oldUpI =
|
||||
U.oldTime().boundaryField()[cohesivePatchID].patchInternalField();
|
||||
|
||||
// Global crack displacement
|
||||
vectorField globalUpI = mesh.globalCrackField(UpI);
|
||||
vectorField globalOldUpI = mesh.globalCrackField(oldUpI);
|
||||
|
||||
// mu and lambda field on new crack faces must be updated
|
||||
scalarField muPI = mu.boundaryField()[cohesivePatchID].patchInternalField();
|
||||
scalarField lambdaPI = lambda.boundaryField()[cohesivePatchID].patchInternalField();
|
||||
scalarField globalMuPI = mesh.globalCrackField(muPI);
|
||||
scalarField globalLambdaPI = mesh.globalCrackField(lambdaPI);
|
||||
|
||||
// cohesivePatchU.size()
|
||||
int cohesivePatchSize(cohesivePatchUPtr ? cohesivePatchUPtr->size() : cohesivePatchUFixedModePtr->size());
|
||||
|
||||
// Initialise U for new cohesive face
|
||||
const labelList& gcfa = mesh.globalCrackFaceAddressing();
|
||||
label globalIndex = mesh.localCrackStart();
|
||||
// for (label i=0; i<cohesivePatchU.size(); i++)
|
||||
for (label i=0; i<cohesivePatchSize; i++)
|
||||
{
|
||||
label oldFaceIndex = faceMap[start+i];
|
||||
|
||||
// If new face
|
||||
if (oldFaceIndex == faceToBreakIndex)
|
||||
{
|
||||
U.boundaryField()[cohesivePatchID][i] =
|
||||
0.5
|
||||
*(
|
||||
globalUpI[globalIndex]
|
||||
+ globalUpI[gcfa[globalIndex]]
|
||||
);
|
||||
U.oldTime().boundaryField()[cohesivePatchID][i] =
|
||||
0.5
|
||||
*(
|
||||
globalOldUpI[globalIndex]
|
||||
+ globalOldUpI[gcfa[globalIndex]]
|
||||
);
|
||||
|
||||
// initialise mu and lambda on new faces
|
||||
// set new face value to value of internal cell
|
||||
muf.boundaryField()[cohesivePatchID][i] = globalMuPI[globalIndex];
|
||||
lambdaf.boundaryField()[cohesivePatchID][i] = globalLambdaPI[globalIndex];
|
||||
|
||||
globalIndex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
globalIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
// we must calculate grad using interface
|
||||
// U at the interface has not been calculated yet as interface.correct()
|
||||
// has not been called yet
|
||||
// not really a problem as gradU is correct in second outer iteration
|
||||
// as long as this does not cause convergence problems for the first iterations.
|
||||
// we should be able to calculate the interface displacements without
|
||||
// having to call interface.correct()
|
||||
// todo: add calculateInterfaceU() function
|
||||
// interface grad uses Gauss, we need least squares
|
||||
//gradU = solidInterfacePtr->grad(U);
|
||||
gradU = fvc::grad(U); // leastSquaresSolidInterface grad scheme
|
||||
//snGradU = fvc::snGrad(U);
|
||||
|
||||
# include "calculateTraction.H"
|
||||
//if (nFacesToBreak || nCoupledFacesToBreak) mesh.write(); traction.write();
|
||||
|
||||
// Initialise initiation traction for new cohesive patch face
|
||||
// for (label i=0; i<cohesivePatchU.size(); i++)
|
||||
for (label i=0; i<cohesivePatchSize; i++)
|
||||
{
|
||||
label oldFaceIndex = faceMap[start+i];
|
||||
|
||||
// If new face
|
||||
if
|
||||
(
|
||||
(oldFaceIndex == faceToBreakIndex)
|
||||
|| (oldFaceIndex == coupledFaceToBreakIndex)
|
||||
)
|
||||
{
|
||||
vector n0 =
|
||||
mesh.Sf().boundaryField()[cohesivePatchID][i]
|
||||
/mesh.magSf().boundaryField()[cohesivePatchID][i];
|
||||
//vector n1 = -n0;
|
||||
|
||||
if ((n0&faceToBreakNormal) > SMALL)
|
||||
{
|
||||
traction.boundaryField()[cohesivePatchID][i] =
|
||||
faceToBreakTraction;
|
||||
|
||||
traction.oldTime().boundaryField()[cohesivePatchID][i] =
|
||||
faceToBreakTraction;
|
||||
|
||||
if(cohesivePatchUPtr)
|
||||
{
|
||||
cohesivePatchUPtr->traction()[i] = faceToBreakTraction;
|
||||
}
|
||||
else
|
||||
{
|
||||
cohesivePatchUFixedModePtr->traction()[i] = faceToBreakTraction;
|
||||
cohesivePatchUFixedModePtr->initiationTraction()[i] = faceToBreakTraction;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
traction.boundaryField()[cohesivePatchID][i] =
|
||||
-faceToBreakTraction;
|
||||
|
||||
traction.oldTime().boundaryField()[cohesivePatchID][i] =
|
||||
-faceToBreakTraction;
|
||||
|
||||
//cohesivePatchU.traction()[i] = -faceToBreakTraction;
|
||||
if(cohesivePatchUPtr)
|
||||
{
|
||||
cohesivePatchUPtr->traction()[i] = -faceToBreakTraction;
|
||||
}
|
||||
else
|
||||
{
|
||||
cohesivePatchUFixedModePtr->traction()[i] = -faceToBreakTraction;
|
||||
cohesivePatchUFixedModePtr->initiationTraction()[i] = -faceToBreakTraction;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// hmmnn we only need a reference for very small groups of cells
|
||||
// turn off for now
|
||||
//# include "updateReference.H"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
{
|
||||
labelHashSet selectedFaces;
|
||||
|
||||
const labelListList& edgeFaces = mesh.edgeFaces();
|
||||
|
||||
const scalarField& cohesiveZoneI = cohesiveZone.internalField();
|
||||
|
||||
forAll (crackPropagationPatches, patchI)
|
||||
{
|
||||
label curPatchID = crackPropagationPatches[patchI];
|
||||
|
||||
const labelList& patchEdges =
|
||||
mesh.boundaryMesh()[curPatchID].meshEdges();
|
||||
|
||||
forAll(patchEdges, edgeI)
|
||||
{
|
||||
label curEdge = patchEdges[edgeI];
|
||||
|
||||
const labelList& curFaces = edgeFaces[curEdge];
|
||||
|
||||
forAll(curFaces, faceI)
|
||||
{
|
||||
if (curFaces[faceI] < mesh.nInternalFaces())
|
||||
{
|
||||
if (cohesiveZoneI[curFaces[faceI]] > (1.0 - SMALL))
|
||||
{
|
||||
if (!selectedFaces.found(curFaces[faceI]))
|
||||
{
|
||||
selectedFaces.insert(curFaces[faceI]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if (notchPatchID != -1)
|
||||
// {
|
||||
// const labelList& notchPatchEdges =
|
||||
// mesh.boundaryMesh()[notchPatchID].meshEdges();
|
||||
|
||||
// forAll(notchPatchEdges, edgeI)
|
||||
// {
|
||||
// label curEdge = notchPatchEdges[edgeI];
|
||||
|
||||
// const labelList& curFaces = edgeFaces[curEdge];
|
||||
|
||||
// forAll(curFaces, faceI)
|
||||
// {
|
||||
// if (curFaces[faceI] < mesh.nInternalFaces())
|
||||
// {
|
||||
// if (cohesiveZoneI[curFaces[faceI]] > (1.0 - SMALL))
|
||||
// {
|
||||
// selectedFaces.insert(curFaces[faceI]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// if (mesh.boundary()[cohesivePatchID].size())
|
||||
// {
|
||||
// const labelList& cohesivePatchEdges =
|
||||
// mesh.boundaryMesh()[cohesivePatchID].meshEdges();
|
||||
|
||||
// forAll(cohesivePatchEdges, edgeI)
|
||||
// {
|
||||
// label curEdge = cohesivePatchEdges[edgeI];
|
||||
|
||||
// const labelList& curFaces = edgeFaces[curEdge];
|
||||
|
||||
// forAll(curFaces, faceI)
|
||||
// {
|
||||
// if (curFaces[faceI] < mesh.nInternalFaces())
|
||||
// {
|
||||
// if (cohesiveZoneI[curFaces[faceI]] > (1.0 - SMALL))
|
||||
// {
|
||||
// selectedFaces.insert(curFaces[faceI]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
crackPropagationPatchesInternalFaces = labelList(selectedFaces.toc());
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
{
|
||||
// Check which region needs reference
|
||||
needRef = boolList(mesh.regions().nRegions(), true);
|
||||
|
||||
forAll(U.boundaryField(), patchI)
|
||||
{
|
||||
// philipc - this used to set a reference on
|
||||
// processors which did not have a patch that fixesValue
|
||||
// so processor in the centre of the domain all had
|
||||
// a referece set causing stress peaks and resulting
|
||||
// in an incorrect solution
|
||||
// so a quick fix is to not set a reference on regions
|
||||
// with a processor boundary
|
||||
//if (U.boundaryField()[patchI].fixesValue())
|
||||
if (
|
||||
U.boundaryField()[patchI].fixesValue()
|
||||
||
|
||||
mesh.boundaryMesh()[patchI].type()
|
||||
== processorPolyPatch::typeName
|
||||
)
|
||||
{
|
||||
const unallocLabelList& curFaceCells =
|
||||
mesh.boundary()[patchI].faceCells();
|
||||
|
||||
forAll(curFaceCells, fI)
|
||||
{
|
||||
needRef[mesh.regions()[curFaceCells[fI]]] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Find reference cell for each region
|
||||
refCells = labelList(mesh.regions().nRegions(), -1);
|
||||
|
||||
forAll(refCells, regI)
|
||||
{
|
||||
refCells[regI] = findIndex(mesh.regions(), regI);
|
||||
|
||||
if (refCells[regI] == -1)
|
||||
{
|
||||
FatalErrorIn(args.executable())
|
||||
<< "Can't find reference cell for region: "
|
||||
<< regI << abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
// Find dead cells
|
||||
labelHashSet deadCellsSet;
|
||||
const labelList& regs = mesh.regions();
|
||||
|
||||
forAll(regs, cellI)
|
||||
{
|
||||
if (mesh.nCellsInRegion(regs[cellI]) < 0.01*mesh.nCells())
|
||||
{
|
||||
deadCellsSet.insert(cellI);
|
||||
}
|
||||
}
|
||||
|
||||
deadCells = deadCellsSet.toc();
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
scalar E0 = rheology.law().E()().internalField()[0];
|
||||
scalar nu0 = rheology.law().nu()().internalField()[0];
|
||||
scalar rho0 = rho.internalField()[0];
|
||||
|
||||
scalar waveVelocity =
|
||||
::sqrt(E0*(1 - nu0)/(rho0*(1 + nu0)*(1 - 2*nu0)));
|
||||
|
||||
// Courant number
|
||||
scalarField Co =
|
||||
waveVelocity*runTime.deltaT().value()
|
||||
*mesh.surfaceInterpolation::deltaCoeffs().internalField();
|
||||
|
||||
Info<< "Courant Number mean: " << gAverage(Co)
|
||||
<< " max: " << gMax(Co)
|
||||
<< " wave velocity magnitude: " << waveVelocity << endl;
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
if (runTime.outputTime() || topoChange)
|
||||
{
|
||||
volScalarField sigmaEq
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmaEq",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sqrt((3.0/2.0)*magSqr(dev(sigma)))
|
||||
);
|
||||
|
||||
Info<< "Max sigmaEq = " << max(sigmaEq).value()
|
||||
<< endl;
|
||||
|
||||
volScalarField epsilonEq
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"epsilonEq",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sqrt((2.0/3.0)*magSqr(dev(epsilon)))
|
||||
);
|
||||
|
||||
Info<< "Max epsilonEq = " << max(epsilonEq).value()
|
||||
<< endl;
|
||||
|
||||
// Info << "\nCalculate maximal principal stress ..." << flush;
|
||||
// // Principal stresses
|
||||
// volVectorField sigmaMax
|
||||
// (
|
||||
// IOobject
|
||||
// (
|
||||
// "sigmaMax",
|
||||
// runTime.timeName(),
|
||||
// mesh,
|
||||
// IOobject::NO_READ,
|
||||
// IOobject::AUTO_WRITE
|
||||
// ),
|
||||
// mesh,
|
||||
// dimensionedVector("sigmaMax", dimPressure, vector::zero)
|
||||
// );
|
||||
// vectorField& sigmaMaxI = sigmaMax.internalField();
|
||||
|
||||
// forAll (sigmaMaxI, cellI)
|
||||
// {
|
||||
// vector eValues = eigenValues(sigma.internalField()[cellI]);
|
||||
// tensor eVectors = eigenVectors(sigma.internalField()[cellI]);
|
||||
|
||||
// scalar maxEValue = 0;
|
||||
// label iMax = -1;
|
||||
// forAll(eValues, i)
|
||||
// {
|
||||
// if (eValues[i] > maxEValue)
|
||||
// {
|
||||
// maxEValue = eValues[i];
|
||||
// iMax = i;
|
||||
// }
|
||||
// }
|
||||
|
||||
// if (iMax != -1)
|
||||
// {
|
||||
// if (iMax == 0)
|
||||
// {
|
||||
// sigmaMaxI[cellI] = eVectors.x()*eValues.x();
|
||||
// }
|
||||
// else if (iMax == 1)
|
||||
// {
|
||||
// sigmaMaxI[cellI] = eVectors.y()*eValues.y();
|
||||
// }
|
||||
// else if (iMax == 2)
|
||||
// {
|
||||
// sigmaMaxI[cellI] = eVectors.z()*eValues.z();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
//- cohesive damage and cracking, and GII and GII
|
||||
volScalarField damageAndCracks
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"damageAndCracks",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("zero", dimless, 0.0),
|
||||
calculatedFvPatchVectorField::typeName
|
||||
);
|
||||
volScalarField GI
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"GI",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("zero", dimless, 0.0),
|
||||
calculatedFvPatchVectorField::typeName
|
||||
);
|
||||
volScalarField GII
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"GII",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh,
|
||||
dimensionedScalar("zero", dimless, 0.0),
|
||||
calculatedFvPatchVectorField::typeName
|
||||
);
|
||||
forAll(U.boundaryField(), patchi)
|
||||
{
|
||||
// if(U.boundaryField()[patchi].type() == cohesiveLawMultiMatFvPatchVectorField::typeName)
|
||||
if(U.boundaryField()[patchi].type() == solidCohesiveFvPatchVectorField::typeName)
|
||||
{
|
||||
// cohesiveLawMultiMatFvPatchVectorField& Upatch =
|
||||
// refCast<cohesiveLawMultiMatFvPatchVectorField>(U.boundaryField()[patchi]);
|
||||
solidCohesiveFvPatchVectorField& Upatch =
|
||||
refCast<solidCohesiveFvPatchVectorField>(U.boundaryField()[patchi]);
|
||||
|
||||
GI.boundaryField()[patchi] = Upatch.GI();
|
||||
GII.boundaryField()[patchi] = Upatch.GII();
|
||||
damageAndCracks.boundaryField()[patchi] = Upatch.crackingAndDamage();
|
||||
}
|
||||
}
|
||||
volScalarField GTotal("GTotal", GI + GII);
|
||||
GTotal.write();
|
||||
|
||||
|
||||
runTime.writeNow();
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
//- write force displacement to file
|
||||
if(historyPatchID != -1)
|
||||
{
|
||||
Info << "Writing disp and force of patch "<<historyPatchName<<" to file"
|
||||
<< endl;
|
||||
|
||||
//- for small strain or moving mesh
|
||||
vector force = gSum(mesh.boundary()[historyPatchID].Sf() & sigma.boundaryField()[historyPatchID]);
|
||||
|
||||
//- for large strain total lagrangian
|
||||
// tensorField F = I + gradU.boundaryField()[historyPatchID];
|
||||
// vectorField totalForce = mesh.Sf().boundaryField()[historyPatchID] & (sigma.boundaryField()[historyPatchID] & F);
|
||||
|
||||
//vector force = sum( totalForce );
|
||||
|
||||
//scalar force = force[vector::Y];;
|
||||
|
||||
//- patchIntegrate utility integrates it this way but this is worng because the sigma tensor should
|
||||
//- be dotted with the surface normal to give the actual traction/force
|
||||
//- you cannot just take the component of the sigma tensor
|
||||
//scalar forcePatchIntegrateMethod = gSum(
|
||||
// mesh.magSf().boundaryField()[historyPatchID]
|
||||
// *sigma.boundaryField()[historyPatchID].component(symmTensor::XY)
|
||||
// );
|
||||
|
||||
vector avDisp = gAverage(U.boundaryField()[historyPatchID]);
|
||||
|
||||
//- write to file
|
||||
if(Pstream::master())
|
||||
{
|
||||
OFstream& forceDispFile = *filePtr;
|
||||
forceDispFile << avDisp.x() << " " << avDisp.y() << " " << avDisp.z() << " "
|
||||
<< force.x() << " " << force.y() << " " << force.z() << endl;
|
||||
}
|
||||
}
|
||||
|
||||
if(clipGPtr)
|
||||
{
|
||||
clipGPtr->write();
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
elasticContactIncrSolidFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/elasticContactIncrSolidFoam
|
|
@ -1,14 +0,0 @@
|
|||
EXE_INC = \
|
||||
-I$(FOAM_SRC)/finiteVolume/lnInclude \
|
||||
-I$(FOAM_SRC)/meshTools/lnInclude \
|
||||
-I$(FOAM_SRC)/lagrangian/basic/lnInclude \
|
||||
-I../solidModels/lnInclude \
|
||||
-I$(FOAM_SRC)/VectorN/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lsolidModels \
|
||||
-lfiniteVolume \
|
||||
-llduSolvers \
|
||||
-lmeshTools \
|
||||
-llagrangian \
|
||||
-lVectorN
|
|
@ -1,15 +0,0 @@
|
|||
EXE_INC = \
|
||||
// -I../../../myLibraries/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I../materialModels/lnInclude \
|
||||
-I./solidInterface
|
||||
// -I./patchToPatchInterpolation
|
||||
|
||||
EXE_LIBS = \
|
||||
-L$(FOAM_USER_LIBBIN) \
|
||||
// -lfiniteVolume_philipc \
|
||||
// -lfiniteVolume \
|
||||
-lmaterialModels_philipc \
|
||||
-llduSolvers \
|
||||
-lmeshTools
|
|
@ -1,9 +0,0 @@
|
|||
EXE_INC = \
|
||||
-I$(FOAM_SRC)/finiteVolume/lnInclude \
|
||||
-I$(FOAM_SRC)/dynamicMesh/lnInclude \
|
||||
-I../materialModels/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-L$(FOAM_USER_LIBBIN) \
|
||||
-lfiniteVolume \
|
||||
-lmaterialModels_philipc
|
|
@ -1,47 +0,0 @@
|
|||
if(divDSigmaExpMethod == "standard")
|
||||
{
|
||||
divDSigmaExp = fvc::div
|
||||
(
|
||||
mu*gradDU.T() + lambda*(I*tr(gradDU)) - (mu + lambda)*gradDU,
|
||||
"div(sigma)"
|
||||
);
|
||||
}
|
||||
else if(divDSigmaExpMethod == "surface")
|
||||
{
|
||||
divDSigmaExp = fvc::div
|
||||
(
|
||||
muf*(mesh.Sf() & fvc::interpolate(gradDU.T()))
|
||||
+ lambdaf*(mesh.Sf() & I*fvc::interpolate(tr(gradDU)))
|
||||
- (muf + lambdaf)*(mesh.Sf() & fvc::interpolate(gradDU))
|
||||
);
|
||||
}
|
||||
else if(divDSigmaExpMethod == "decompose")
|
||||
{
|
||||
surfaceTensorField shearGradDU = ((I - n*n)&fvc::interpolate(gradDU));
|
||||
|
||||
divDSigmaExp = fvc::div
|
||||
(
|
||||
mesh.magSf()
|
||||
*
|
||||
(
|
||||
- (muf + lambdaf)*(fvc::snGrad(DU)&(I - n*n))
|
||||
+ lambdaf*tr(shearGradDU&(I - n*n))*n
|
||||
+ muf*(shearGradDU&n)
|
||||
)
|
||||
);
|
||||
}
|
||||
else if(divDSigmaExpMethod == "laplacian")
|
||||
{
|
||||
divDSigmaExp =
|
||||
- fvc::laplacian(mu + lambda, DU, "laplacian(DDU,DU)")
|
||||
+ fvc::div
|
||||
(
|
||||
mu*gradDU.T()
|
||||
+ lambda*(I*tr(gradDU)),
|
||||
"div(sigma)"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalError << "divDSigmaExp method " << divDSigmaExpMethod << " not found!" << endl;
|
||||
}
|
|
@ -1,153 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
correctGlobalFaceZoneMesh.H
|
||||
|
||||
When there is a globalFaceZone and the mesh is moved by interpolating U to the
|
||||
vertices with volPointInterpolation, then there are two problems:
|
||||
-some points on the patch with the faceZone are moved incorrectly, I think
|
||||
it is because the faceZone has no U and causes an incorrect interpolation,
|
||||
-the faceZones points not on the proc cells are not moved at all because
|
||||
they have no U.
|
||||
|
||||
So the points on the patch with the faceZone need to be fixed and also all the
|
||||
faceZone points need to be moved and synchronised so each proc has the same
|
||||
full faceZone mesh.
|
||||
|
||||
The mapping of procs faceZone order of points to the master procs faceZone point
|
||||
order is kept in procToGlobalFZmap, which is calculated at the start of the run
|
||||
in the createGlobalToLocalFaceZonePointMap.H header file.
|
||||
|
||||
Note: DU is used for updated Lagrangian solver instead of U
|
||||
|
||||
philipc
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
//- this is only needed in a parallel runs
|
||||
if(Pstream::parRun())
|
||||
{
|
||||
//***** FIX INCORRECT POINT ON PATCHES WITH FACEZONE *****//
|
||||
contactPatchPairList& contacts = contact;
|
||||
|
||||
forAll(contacts, contactI)
|
||||
{
|
||||
label masterID = contacts[contactI].masterPatch().index();
|
||||
label slaveID = contacts[contactI].slavePatch().index();
|
||||
|
||||
primitivePatchInterpolation masterInterpolator
|
||||
(
|
||||
mesh.boundaryMesh()[masterID]
|
||||
);
|
||||
primitivePatchInterpolation slaveInterpolator
|
||||
(
|
||||
mesh.boundaryMesh()[slaveID]
|
||||
);
|
||||
|
||||
//- U must be interpolated to the vertices, this ignores the faceZone
|
||||
//- points with no U (unlike volPointInterpolation)
|
||||
vectorField correctMasterPointU =
|
||||
masterInterpolator.faceToPointInterpolate<vector>
|
||||
(
|
||||
U.boundaryField()[masterID]
|
||||
);
|
||||
vectorField correctSlavePointU =
|
||||
slaveInterpolator.faceToPointInterpolate<vector>
|
||||
(
|
||||
U.boundaryField()[slaveID]
|
||||
);
|
||||
|
||||
vectorField oldMasterPoints =
|
||||
mesh.boundaryMesh()[masterID].localPoints();
|
||||
vectorField oldSlavePoints =
|
||||
mesh.boundaryMesh()[slaveID].localPoints();
|
||||
|
||||
labelList masterPointLabels =
|
||||
mesh.boundaryMesh()[masterID].meshPoints();
|
||||
labelList slavePointLabels =
|
||||
mesh.boundaryMesh()[slaveID].meshPoints();
|
||||
|
||||
//- correct the patch newPoints
|
||||
forAll(masterPointLabels, pointI)
|
||||
{
|
||||
label pointGlobalLabel = masterPointLabels[pointI];
|
||||
newPoints[pointGlobalLabel] =
|
||||
oldMasterPoints[pointI] + correctMasterPointU[pointI];
|
||||
}
|
||||
forAll(slavePointLabels, pointI)
|
||||
{
|
||||
label pointGlobalLabel = slavePointLabels[pointI];
|
||||
newPoints[pointGlobalLabel] =
|
||||
oldSlavePoints[pointI] + correctSlavePointU[pointI];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//***** NOW FIX AND SYNCHRONISE ALL THE FACEZONE POINTS *****//
|
||||
|
||||
forAll(mesh.faceZones(), faceZoneI)
|
||||
{
|
||||
//- find the patch corresponding to this faceZone
|
||||
//- assuming that the FZ is called <patch_name>FaceZone
|
||||
string faceZoneName = mesh.faceZones().names()[faceZoneI];
|
||||
//- remove the string FaceZone from the end of the face zone name to get the patch name
|
||||
string patchName = faceZoneName.substr(0, (faceZoneName.size()-8));
|
||||
label patchID = mesh.boundaryMesh().findPatchID(patchName);
|
||||
if(patchID == -1)
|
||||
{
|
||||
FatalError << "Patch " << patchName << " not found corresponding for faceZone"
|
||||
<< faceZoneName << exit(FatalError);
|
||||
}
|
||||
|
||||
vectorField globalFZpoints =
|
||||
mesh.faceZones()[faceZoneI]().localPoints();
|
||||
|
||||
//- new points for the face zone
|
||||
vectorField globalFZnewPoints(globalFZpoints.size(), vector::zero);
|
||||
|
||||
//- inter-proc points are shared by multiple procs
|
||||
//- pointNumProc is the number of procs which a point lies on
|
||||
scalarField pointNumProcs(globalFZpoints.size(), 0.0);
|
||||
|
||||
forAll(globalFZnewPoints, globalPointI)
|
||||
{
|
||||
label localPoint = procToGlobalFZmap[faceZoneI][globalPointI];
|
||||
|
||||
//if(localPoint < mesh.boundaryMesh()[patchID].localPoints().size())
|
||||
if(pointOnLocalProcPatch[faceZoneI][localPoint])
|
||||
{
|
||||
label procPoint =
|
||||
mesh.faceZones()[faceZoneI]().meshPoints()[localPoint];
|
||||
globalFZnewPoints[globalPointI] = newPoints[procPoint];
|
||||
pointNumProcs[globalPointI] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
reduce(globalFZnewPoints, sumOp<vectorField>());
|
||||
reduce(pointNumProcs, sumOp<scalarField>());
|
||||
|
||||
//- now average the newPoints between all procs
|
||||
if(min(pointNumProcs) < 1)
|
||||
{
|
||||
FatalError << "pointNumProc has not been set for all points" << exit(FatalError);
|
||||
}
|
||||
globalFZnewPoints /= pointNumProcs;
|
||||
|
||||
//- the globalFZnewPoints now contains the correct FZ new points in
|
||||
//- a global order, now convert them back into the local proc order
|
||||
|
||||
vectorField procFZnewPoints(globalFZpoints.size(), vector::zero);
|
||||
|
||||
forAll(globalFZnewPoints, globalPointI)
|
||||
{
|
||||
label localPoint = procToGlobalFZmap[faceZoneI][globalPointI];
|
||||
procFZnewPoints[localPoint] = globalFZnewPoints[globalPointI];
|
||||
}
|
||||
|
||||
//- now fix the newPoints points on the globalFaceZones
|
||||
labelList procFZmeshPoints = mesh.faceZones()[faceZoneI]().meshPoints();
|
||||
|
||||
forAll(procFZmeshPoints, pointI)
|
||||
{
|
||||
label procPoint = procFZmeshPoints[pointI];
|
||||
newPoints[procPoint] = procFZnewPoints[pointI];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,138 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
createGlobalToLocalFaceZonePointMap.H
|
||||
|
||||
I could not figure out the order of the points on a globalFaceZone, they is a
|
||||
different order for each processor where the processors own points come first.
|
||||
|
||||
So I decide that the master proc order is the global order and I find the map
|
||||
from this order to each proc order here by just commparing actual point
|
||||
coordinates.
|
||||
|
||||
This map is then used to correct and synchronise the globalFaceZone points on
|
||||
all the procs when the mesh is moved, in header file correctGlobalFaceZoneMesh.H.
|
||||
|
||||
philipc
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
//- procToGlobalFZmap is a map from the current proc faceZone point order to the
|
||||
//- master proc point order
|
||||
//- these are read if present to allow restarting of contact cases
|
||||
IOList<labelList> procToGlobalFZmap
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"procToGlobalFZmap",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh.faceZones().size()
|
||||
);
|
||||
|
||||
IOList<labelList> pointOnLocalProcPatch
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"pointOnLocalProcPatch",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
mesh.faceZones().size()
|
||||
);
|
||||
|
||||
//- if they have been read then don't recalculate it
|
||||
bool globalFaceZoneMappingSet = false;
|
||||
if(gMax(procToGlobalFZmap[0]) > 0 && gMax(pointOnLocalProcPatch[0]) > 0)
|
||||
{
|
||||
Info << "Reading procToGlobalFZmap and pointOnLocalProcPatch allowing restart of contact cases"
|
||||
<< endl;
|
||||
globalFaceZoneMappingSet = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Info << "procToGlobalFZmap and pointOnLocalProcPatch will be calculated as it has not been found" << nl
|
||||
<< "this message should only appear starting a new analysis" << endl;
|
||||
}
|
||||
|
||||
//- this is only needed in a parallel runs
|
||||
if(Pstream::parRun())
|
||||
{
|
||||
if(!globalFaceZoneMappingSet)
|
||||
{
|
||||
forAll(mesh.faceZones(), faceZoneI)
|
||||
{
|
||||
vectorField globalFZpoints = mesh.faceZones()[faceZoneI]().localPoints();
|
||||
|
||||
procToGlobalFZmap[faceZoneI].setSize(globalFZpoints.size(), 0);
|
||||
|
||||
//- set all slave points to zero because only the master order is used
|
||||
if(!Pstream::master())
|
||||
{
|
||||
globalFZpoints *= 0.0;
|
||||
}
|
||||
|
||||
//- pass points to all procs
|
||||
reduce(globalFZpoints, sumOp<vectorField>());
|
||||
|
||||
|
||||
//- now every proc has the master's list of FZ points
|
||||
//- every proc must now find the mapping from their local FZpoints to
|
||||
//- the globalFZpoints
|
||||
|
||||
vectorField procFZpoints = mesh.faceZones()[faceZoneI]().localPoints();
|
||||
|
||||
forAll(globalFZpoints, globalPointI)
|
||||
{
|
||||
forAll(procFZpoints, procPointI)
|
||||
{
|
||||
if(procFZpoints[procPointI] == globalFZpoints[globalPointI])
|
||||
{
|
||||
procToGlobalFZmap[faceZoneI][globalPointI] = procPointI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- procToGlobalFZmap now contains the local FZpoint label for each
|
||||
//- global FZ point label - for each faceZone
|
||||
|
||||
//- check what points are on the current proc patch
|
||||
pointOnLocalProcPatch[faceZoneI].setSize(globalFZpoints.size(), 0);
|
||||
|
||||
//- find corresponding patch
|
||||
string faceZoneName = mesh.faceZones().names()[faceZoneI];
|
||||
//- remove the string FaceZone from the end of the face zone name to get the patch name
|
||||
string patchName = faceZoneName.substr(0, (faceZoneName.size()-8));
|
||||
label patchID = mesh.boundaryMesh().findPatchID(patchName);
|
||||
if(patchID == -1)
|
||||
{
|
||||
FatalError << "Patch " << patchName << " not found corresponding for faceZone"
|
||||
<< faceZoneName << exit(FatalError);
|
||||
}
|
||||
|
||||
forAll(mesh.faceZones()[faceZoneI]().localPoints(), fzpi)
|
||||
{
|
||||
forAll(mesh.boundaryMesh()[patchID].localPoints(), pi)
|
||||
{
|
||||
if(mesh.faceZones()[faceZoneI]().localPoints()[fzpi] == mesh.boundaryMesh()[patchID].localPoints()[pi])
|
||||
{
|
||||
pointOnLocalProcPatch[faceZoneI][fzpi] = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} //- end if(!globalFaceZoneMappingSet)
|
||||
}
|
||||
|
||||
//- write to disk to allow restart of cases
|
||||
//- because it is not possible to calculate the
|
||||
//- mapping after the meshes have moved
|
||||
if(!globalFaceZoneMappingSet && Pstream::parRun())
|
||||
{
|
||||
procToGlobalFZmap.write();
|
||||
pointOnLocalProcPatch.write();
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
Switch solidInterfaceCorr(false);
|
||||
|
||||
solidInterface* solidInterfacePtr(NULL);
|
||||
|
||||
{
|
||||
const dictionary& stressControl =
|
||||
mesh.solutionDict().subDict("stressedFoam");
|
||||
|
||||
solidInterfaceCorr = Switch(stressControl.lookup("solidInterface"));
|
||||
|
||||
if(solidInterfaceCorr)
|
||||
{
|
||||
Info << "Creating solid interface correction" << endl;
|
||||
solidInterfacePtr = new solidInterface(mesh, rheology);
|
||||
solidInterfacePtr->modifyProperties(muf, lambdaf);
|
||||
gradDU = solidInterfacePtr->grad(DU);
|
||||
|
||||
//- solidInterface needs muf and lambdaf to be used for divDSigmaExp
|
||||
if(divDSigmaExpMethod != "surface" && divDSigmaExpMethod != "decompose")
|
||||
{
|
||||
FatalError << "divDSigmaExp must be decompose or surface when solidInterface is on"
|
||||
<< exit(FatalError);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,220 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2004-2007 Hrvoje Jasak
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Application
|
||||
elasticContactIncrSolidFoam
|
||||
|
||||
Description
|
||||
Transient/steady-state segregated finite-volume solver for small strain
|
||||
elastic solid bodies in contact, using an incremental total Lagrangian
|
||||
approach.
|
||||
Works in parallel.
|
||||
|
||||
Solves for the displacement increment vector field DU, also generating the
|
||||
stress tensor field sigma.
|
||||
|
||||
It is only for frictionless contact, friction not implemented yet.
|
||||
|
||||
Author
|
||||
Philip Cardiff
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "fvCFD.H"
|
||||
#include "rheologyModel.H"
|
||||
#include "contactProblem.H"
|
||||
#include "solidInterface.H"
|
||||
|
||||
#include "volPointInterpolation.H"
|
||||
#include "pointPatchInterpolation.H"
|
||||
#include "primitivePatchInterpolation.H"
|
||||
#include "fixedValuePointPatchFields.H"
|
||||
#include "pointFields.H"
|
||||
#include "pointMesh.H"
|
||||
#include "pointBoundaryMesh.H"
|
||||
#include "primitivePatchInterpolation.H"
|
||||
#include "twoDPointCorrector.H"
|
||||
//#include "leastSquaresVolPointInterpolation.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
# include "setRootCase.H"
|
||||
|
||||
# include "createTime.H"
|
||||
|
||||
# include "createMesh.H"
|
||||
|
||||
# include "createFields.H"
|
||||
|
||||
# include "readDivDSigmaExpMethod.H"
|
||||
|
||||
# include "createGlobalToLocalFaceZonePointMap.H"
|
||||
|
||||
# include "createSolidInterface.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Info<< "\nStarting time loop\n" << endl;
|
||||
|
||||
for (runTime++; !runTime.end(); runTime++)
|
||||
{
|
||||
Info<< "Time: " << runTime.timeName() << endl;
|
||||
|
||||
# include "readContactControls.H"
|
||||
|
||||
# include "readStressedFoamControls.H"
|
||||
|
||||
//-- for moving the mesh and then back again
|
||||
vectorField oldMeshPoints = mesh.allPoints();
|
||||
|
||||
int iCorr = 0;
|
||||
lduMatrix::solverPerformance solverPerf;
|
||||
word solverName;
|
||||
lduMatrix::debug = 0;
|
||||
scalar residual = GREAT;
|
||||
scalar initialResidual = 0;
|
||||
scalar relativeResidual = GREAT;
|
||||
|
||||
//- reset DU to zero at the start of the time-step if
|
||||
//- a predictor is not required
|
||||
if(!predictor)
|
||||
{
|
||||
DU = dimensionedVector("zero", dimLength, vector::zero);
|
||||
}
|
||||
|
||||
do //- start of momentum loop
|
||||
{
|
||||
DU.storePrevIter();
|
||||
|
||||
//- correct the contact boundaries
|
||||
if(iCorr % uEqnContactCorrFreq == 0)
|
||||
{
|
||||
Info << "\t\tCorrecting contact in the momentum loop "
|
||||
<< "iteration: " << iCorr
|
||||
<< ", residual: " << residual
|
||||
<< endl;
|
||||
//# include "moveMeshLeastSquares.H"
|
||||
# include "moveSolidMesh.H"
|
||||
contact.correct();
|
||||
mesh.movePoints(oldMeshPoints);
|
||||
}
|
||||
|
||||
# include "calculateDivDSigmaExp.H"
|
||||
|
||||
fvVectorMatrix DUEqn
|
||||
(
|
||||
fvm::d2dt2(rho, DU)
|
||||
==
|
||||
fvm::laplacian(2*mu + lambda, DU, "laplacian(DDU,DU)")
|
||||
+ divDSigmaExp
|
||||
);
|
||||
|
||||
if(solidInterfaceCorr)
|
||||
{
|
||||
solidInterfacePtr->correct(DUEqn);
|
||||
}
|
||||
|
||||
solverPerf = DUEqn.solve();
|
||||
|
||||
DU.relax();
|
||||
|
||||
solverName = solverPerf.solverName();
|
||||
|
||||
if(solidInterfaceCorr)
|
||||
{
|
||||
gradDU = solidInterfacePtr->grad(DU);
|
||||
}
|
||||
else
|
||||
{
|
||||
gradDU = fvc::grad(DU);
|
||||
}
|
||||
|
||||
U = U.oldTime() + DU;
|
||||
|
||||
residual = solverPerf.initialResidual();
|
||||
|
||||
//****************************************************//
|
||||
// The contact residual is the initial residual for the
|
||||
// first iteration of the momentum equation
|
||||
//****************************************************//
|
||||
if(iCorr == 0)
|
||||
{
|
||||
initialResidual = solverPerf.initialResidual();
|
||||
}
|
||||
|
||||
# include "calculateRelativeResidual.H"
|
||||
|
||||
Info << "\tTime " << runTime.value()
|
||||
<< ", Corrector " << iCorr
|
||||
<< ", Solving for " << DU.name()
|
||||
<< " using " << solverPerf.solverName()
|
||||
<< ", residual = " << solverPerf.initialResidual()
|
||||
<< ", relative residual = " << relativeResidual << endl;
|
||||
} //- end of momentum loop
|
||||
while
|
||||
(
|
||||
relativeResidual > convergenceTolerance
|
||||
//residual > convergenceTolerance
|
||||
&&
|
||||
++iCorr < nCorr
|
||||
);
|
||||
|
||||
// Print out info per contact iteration
|
||||
Info << "\t\tSolving for " << DU.name()
|
||||
<< " using " << solverName
|
||||
<< ", Initial residual = " << initialResidual
|
||||
<< ", Final residual = " << solverPerf.initialResidual()
|
||||
<< ", No outer iterations " << iCorr << endl;
|
||||
|
||||
lduMatrix::debug = 1;
|
||||
|
||||
# include "calculateDEpsilonDSigma.H"
|
||||
|
||||
epsilon += DEpsilon;
|
||||
|
||||
sigma += DSigma;
|
||||
|
||||
# include "writeFields.H"
|
||||
|
||||
//# include "writeBoundaryNetForces.H"
|
||||
|
||||
//# include "moveMeshLeastSquares.H"
|
||||
//# include "moveSolidMesh.H"
|
||||
//# include "printContactResults.H"
|
||||
//mesh.movePoints(oldMeshPoints);
|
||||
|
||||
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
||||
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
||||
<< endl << endl;
|
||||
}
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -1,28 +0,0 @@
|
|||
{
|
||||
//- move mesh for the contact correction
|
||||
|
||||
// Create point interpolation
|
||||
volPointInterpolation pointInterpolation(mesh);
|
||||
|
||||
// Calculate mesh points displacement
|
||||
pointVectorField pointU = pointInterpolation.interpolate(U);
|
||||
|
||||
const vectorField& pointUI = pointU.internalField();
|
||||
|
||||
// Move mesh
|
||||
vectorField newPoints = mesh.allPoints();
|
||||
|
||||
forAll (pointUI, pointI)
|
||||
{
|
||||
newPoints[pointI] += pointUI[pointI];
|
||||
}
|
||||
|
||||
# include "correctGlobalFaceZoneMesh.H"
|
||||
|
||||
twoDPointCorrector twoDCorrector(mesh);
|
||||
twoDCorrector.correctPoints(newPoints);
|
||||
|
||||
mesh.movePoints(newPoints);
|
||||
mesh.V00();
|
||||
mesh.moving(false);
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
if (runTime.outputTime())
|
||||
{
|
||||
// FAILS IN PARALLEL - FIX
|
||||
// Info << "Print contact area" << endl;
|
||||
//volScalarField ca = contact.contactArea();
|
||||
//ca.write();
|
||||
|
||||
//-------------------------------------------------------------//
|
||||
// I couldn't get tmp to return the pointScalarField correctly //
|
||||
// so I had to make the pointScalarField here and pass it to //
|
||||
// contactGapPoints and pointContactForce to populate //
|
||||
//-------------------------------------------------------------//
|
||||
//This is the point distance for each contact vertex
|
||||
pointScalarField cGapPoints
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"pointContactGap",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
pMesh,
|
||||
dimensionedScalar("scalar", dimLength, 0.0),
|
||||
"calculated"
|
||||
);
|
||||
|
||||
contact.contactGapPoints(cGapPoints);
|
||||
cGapPoints.write();
|
||||
|
||||
|
||||
//- This is the point distance for each contact vertex
|
||||
pointVectorField cPointForce
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"pointContactForce",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
pMesh,
|
||||
dimensionedVector("vector", dimForce, vector::zero),
|
||||
"calculated"
|
||||
);
|
||||
contact.contactPointForce(cPointForce);
|
||||
cPointForce.write();
|
||||
|
||||
//- this is the actual (sigma&n)&n) on the contact patches
|
||||
//- SHOULD THIS BE A REF TO A TMP...?
|
||||
volScalarField cPressure = contact.contactPressure();
|
||||
cPressure.write();
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
//****************************************************//
|
||||
// Read the contact tol and max contact correctors
|
||||
//****************************************************//
|
||||
const IOdictionary& contactControl =
|
||||
IOobject
|
||||
(
|
||||
"contactProperties",
|
||||
U.time().constant(),
|
||||
U.db(),
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE
|
||||
);
|
||||
|
||||
|
||||
//- The frequnecy the conatct is corrected inside the momentum loop
|
||||
int uEqnContactCorrFreq(readInt(contactControl.lookup("innerContactCorrectFreq")));
|
|
@ -1,15 +0,0 @@
|
|||
//- how explicit component of sigma is to be calculated
|
||||
word divDSigmaExpMethod(mesh.solutionDict().subDict("stressedFoam").lookup("divDSigmaExp"));
|
||||
Info << divDSigmaExpMethod << " method chosen for calculation of sigmaExp" << endl;
|
||||
if
|
||||
(
|
||||
divDSigmaExpMethod != "standard"
|
||||
&& divDSigmaExpMethod != "surface"
|
||||
&& divDSigmaExpMethod != "decompose"
|
||||
&& divDSigmaExpMethod != "laplacian"
|
||||
)
|
||||
{
|
||||
FatalError << "divDSigmaExp method " << divDSigmaExpMethod << " not found!" << nl
|
||||
<< "valid methods are:\nstandard\nsurface\ndecompose\nlaplacian"
|
||||
<< exit(FatalError);
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
const dictionary& stressControl =
|
||||
mesh.solutionDict().subDict("stressedFoam");
|
||||
|
||||
int nCorr(readInt(stressControl.lookup("nCorrectors")));
|
||||
scalar convergenceTolerance(readScalar(stressControl.lookup("DU")));
|
||||
|
||||
Switch predictor(stressControl.lookup("predictor"));
|
|
@ -1,14 +0,0 @@
|
|||
// * * * * * * * * * * * * * * * * NET FORCES * * * * * * * * * * * * * * * //
|
||||
|
||||
vectorField netForces(mesh.boundary().size(), vector::zero);
|
||||
|
||||
Info << nl;
|
||||
forAll(netForces, patchI)
|
||||
{
|
||||
netForces[patchI] = gSum(mesh.Sf().boundaryField()[patchI] & sigma.boundaryField()[patchI]);
|
||||
|
||||
Info << "patch\t" << mesh.boundary()[patchI].name() << "\t\tnet force is\t"
|
||||
<< netForces[patchI] << " N" << endl;
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
@ -1,78 +0,0 @@
|
|||
if (runTime.outputTime())
|
||||
{
|
||||
volScalarField epsilonEq
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"epsilonEq",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sqrt((2.0/3.0)*magSqr(dev(epsilon)))
|
||||
);
|
||||
|
||||
Info<< "Max epsilonEq = " << max(epsilonEq).value()
|
||||
<< endl;
|
||||
|
||||
volScalarField sigmaEq
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"sigmaEq",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
sqrt((3.0/2.0)*magSqr(dev(sigma)))
|
||||
);
|
||||
|
||||
Info<< "Max sigmaEq = " << max(sigmaEq).value()
|
||||
<< endl;
|
||||
|
||||
volScalarField pressure
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"pressure",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
tr(sigma)/3.0
|
||||
);
|
||||
|
||||
//- boundary surface pressure
|
||||
forAll(pressure.boundaryField(), patchi)
|
||||
{
|
||||
const vectorField& nb = n.boundaryField()[patchi];
|
||||
pressure.boundaryField()[patchi] =
|
||||
-(nb & ( nb & sigma.boundaryField()[patchi] ));
|
||||
}
|
||||
|
||||
//- contact slave penetration
|
||||
# include "moveSolidMesh.H"
|
||||
pointMesh pMesh(mesh);
|
||||
pointScalarField cGapPoints
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"pointContactGap",
|
||||
runTime.timeName(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::AUTO_WRITE
|
||||
),
|
||||
pMesh,
|
||||
dimensionedScalar("scalar", dimLength, 0.0),
|
||||
"calculated"
|
||||
);
|
||||
contact.contactGapPoints(cGapPoints);
|
||||
cGapPoints.write();
|
||||
mesh.movePoints(oldMeshPoints);
|
||||
|
||||
runTime.write();
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
elasticContactNonLinULSolidFoam.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/elasticContactNonLinULSolidFoam
|
|
@ -1,14 +0,0 @@
|
|||
EXE_INC = \
|
||||
-I$(FOAM_SRC)/finiteVolume/lnInclude \
|
||||
-I$(FOAM_SRC)/meshTools/lnInclude \
|
||||
-I$(FOAM_SRC)/lagrangian/basic/lnInclude \
|
||||
-I../solidModels/lnInclude \
|
||||
-I$(FOAM_SRC)/VectorN/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lsolidModels \
|
||||
-lfiniteVolume \
|
||||
-llduSolvers \
|
||||
-lmeshTools \
|
||||
-llagrangian \
|
||||
-lVectorN
|
|
@ -1,15 +0,0 @@
|
|||
EXE_INC = \
|
||||
// -I../../../myLibraries/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I../materialModels/lnInclude \
|
||||
-I./solidInterface
|
||||
// -I./patchToPatchInterpolation
|
||||
|
||||
EXE_LIBS = \
|
||||
-L$(FOAM_USER_LIBBIN) \
|
||||
// -lfiniteVolume_philipc \
|
||||
// -lfiniteVolume \
|
||||
-lmaterialModels_philipc \
|
||||
-llduSolvers \
|
||||
-lmeshTools
|
|
@ -1,9 +0,0 @@
|
|||
EXE_INC = \
|
||||
-I$(FOAM_SRC)/finiteVolume/lnInclude \
|
||||
-I$(FOAM_SRC)/dynamicMesh/lnInclude \
|
||||
-I../materialModels/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-L$(FOAM_USER_LIBBIN) \
|
||||
-lfiniteVolume \
|
||||
-lmaterialModels_philipc
|
|
@ -1,3 +0,0 @@
|
|||
DEpsilon = symm(gradDU) + 0.5*symm(gradDU & gradDU.T());
|
||||
|
||||
DSigma = 2*mu*DEpsilon + lambda*(I*tr(DEpsilon));
|
|
@ -1,47 +0,0 @@
|
|||
if(divDSigmaExpMethod == "standard")
|
||||
{
|
||||
divDSigmaExp = fvc::div
|
||||
(
|
||||
mu*gradDU.T() + lambda*(I*tr(gradDU)) - (mu + lambda)*gradDU,
|
||||
"div(sigma)"
|
||||
);
|
||||
}
|
||||
else if(divDSigmaExpMethod == "surface")
|
||||
{
|
||||
divDSigmaExp = fvc::div
|
||||
(
|
||||
muf*(mesh.Sf() & fvc::interpolate(gradDU.T()))
|
||||
+ lambdaf*(mesh.Sf() & I*fvc::interpolate(tr(gradDU)))
|
||||
- (muf + lambdaf)*(mesh.Sf() & fvc::interpolate(gradDU))
|
||||
);
|
||||
}
|
||||
else if(divDSigmaExpMethod == "decompose")
|
||||
{
|
||||
surfaceTensorField shearGradDU =
|
||||
((I - n*n)&fvc::interpolate(gradDU));
|
||||
|
||||
divDSigmaExp = fvc::div
|
||||
(
|
||||
mesh.magSf()
|
||||
*(
|
||||
- (muf + lambdaf)*(fvc::snGrad(DU)&(I - n*n))
|
||||
+ lambdaf*tr(shearGradDU&(I - n*n))*n
|
||||
+ muf*(shearGradDU&n)
|
||||
)
|
||||
);
|
||||
}
|
||||
else if(divDSigmaExpMethod == "laplacian")
|
||||
{
|
||||
divDSigmaExp =
|
||||
- fvc::laplacian(mu + lambda, DU, "laplacian(DDU,DU)")
|
||||
+ fvc::div
|
||||
(
|
||||
mu*gradDU.T()
|
||||
+ lambda*(I*tr(gradDU)),
|
||||
"div(sigma)"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalError << "divDSigmaExp method " << divDSigmaExpMethod << " not found!" << endl;
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
//----------------------------------------------------//
|
||||
//- sigma explicit large strain explicit terms
|
||||
//----------------------------------------------------//
|
||||
if(divDSigmaLargeStrainExpMethod == "standard")
|
||||
{
|
||||
divDSigmaLargeStrainExp =
|
||||
fvc::div
|
||||
(
|
||||
mu*(gradDU & gradDU.T())
|
||||
+ 0.5*lambda*(gradDU && gradDU)*I //- equivalent to 0.5*lambda*(I*tr(gradDU & gradDU.T()))
|
||||
+ ((sigma + DSigma) & DF.T()),
|
||||
"div(sigma)"
|
||||
);
|
||||
}
|
||||
else if(divDSigmaLargeStrainExpMethod == "surface")
|
||||
{
|
||||
divDSigmaLargeStrainExp =
|
||||
fvc::div
|
||||
(
|
||||
muf * (mesh.Sf() & fvc::interpolate(gradDU & gradDU.T()))
|
||||
+ 0.5*lambdaf * (mesh.Sf() & (fvc::interpolate(gradDU && gradDU)*I))
|
||||
+ (mesh.Sf() & fvc::interpolate( sigma & DF.T() ))
|
||||
+ (mesh.Sf() & fvc::interpolate(DSigma & DF.T() ))
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalError
|
||||
<< "divDSigmaLargeStrainExp not found!"
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
//- relax large strain component
|
||||
divDSigmaLargeStrainExp.relax();
|
|
@ -1,72 +0,0 @@
|
|||
//void Foam::edgeCorrectedVolPointInterpolation::makeExtrapolationWeights() const
|
||||
//{
|
||||
// Interpolation:
|
||||
// For each point to be corrected calculate the extrapolated value
|
||||
// for each face around it and combine them using the inverse
|
||||
// distance weighting factors
|
||||
|
||||
//const labelList& ptc = boundaryPoints();
|
||||
|
||||
// Calculate the correction vectors
|
||||
|
||||
//extrapolationVectorsPtr_ =
|
||||
// new FieldField<Field, vector>(ptc.size());
|
||||
//FieldField<Field, vector>& extraVecs = *extrapolationVectorsPtr_;
|
||||
FieldField<Field, vector> extraVecs(ptc.size());
|
||||
|
||||
{
|
||||
const labelListList& pfaces = mesh.pointFaces();
|
||||
|
||||
const volVectorField& centres = mesh.C();
|
||||
|
||||
const fvBoundaryMesh& bm = mesh.boundary();
|
||||
|
||||
forAll (ptc, pointI)
|
||||
{
|
||||
const label curPoint = ptc[pointI];
|
||||
|
||||
const labelList& curFaces = pfaces[curPoint];
|
||||
|
||||
// extraVecs.hook(new vectorField(curFaces.size())); //- no hook function
|
||||
extraVecs.set
|
||||
(
|
||||
pointI,
|
||||
new vectorField(curFaces.size())
|
||||
);
|
||||
|
||||
vectorField& curExtraVectors = extraVecs[pointI];
|
||||
|
||||
label nFacesAroundPoint = 0;
|
||||
|
||||
const vector& pointLoc = mesh.points()[curPoint];
|
||||
|
||||
// Go through all the faces
|
||||
forAll (curFaces, faceI)
|
||||
{
|
||||
if (!mesh.isInternalFace(curFaces[faceI]))
|
||||
{
|
||||
// This is a boundary face. If not in the empty patch
|
||||
// or coupled calculate the extrapolation vector
|
||||
label patchID =
|
||||
mesh.boundaryMesh().whichPatch(curFaces[faceI]);
|
||||
|
||||
if
|
||||
(
|
||||
!isA<emptyFvPatch>(bm[patchID])
|
||||
&& !bm[patchID].coupled()
|
||||
)
|
||||
{
|
||||
// Found a face for extrapolation
|
||||
curExtraVectors[nFacesAroundPoint] =
|
||||
pointLoc
|
||||
- centres.boundaryField()[patchID]
|
||||
[bm[patchID].patch().whichFace(curFaces[faceI])];
|
||||
|
||||
nFacesAroundPoint++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
curExtraVectors.setSize(nFacesAroundPoint);
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue