Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / applications / solvers / solidMechanics / utilities / calculateCourantNumber / calculateCourantNumber.C
blobf7209f800c446f2b59e2bb0438e201f3e4b1c00e
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Application
25     calculateCourantNumber
27 Description
28     Simple utility which calculate the Courant number for solid mechanics
29     models.
31 Author
32     Philip Cardiff UCD
34 \*---------------------------------------------------------------------------*/
36 #include "fvCFD.H"
37 #include "constitutiveModel.H"
39 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 int main(int argc, char *argv[])
43 # include "setRootCase.H"
44 # include "createTime.H"
45 # include "createMesh.H"
47 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
49   Info<< "\nCalculating Courant number\n" << endl;
51   // Calculate Courant number for every face
53   // Mechanical properties
54   volVectorField U
55     (
56      IOobject
57      (
58       "U",
59       runTime.timeName(),
60       mesh,
61       IOobject::NO_READ,
62       IOobject::NO_WRITE
63       ),
64      mesh,
65      dimensionedVector("zero", dimLength, vector::zero)
66      );
67   volSymmTensorField sigma
68     (
69      IOobject
70      (
71       "sigma",
72       runTime.timeName(),
73       mesh,
74       IOobject::NO_READ,
75       IOobject::NO_WRITE
76       ),
77      mesh,
78      dimensionedSymmTensor("zero", dimForce/dimArea, symmTensor::zero)
79      );
80   constitutiveModel rheology(sigma, U);
81   volScalarField mu = rheology.mu();
82   volScalarField lambda = rheology.lambda();
83   volScalarField rho = rheology.rho();
84   surfaceScalarField Ef =
85       fvc::interpolate(mu*(3*lambda + 2*mu)/(lambda+mu), "E");
86   surfaceScalarField nuf = fvc::interpolate(lambda/(2*(lambda+mu)), "nu");
87   surfaceScalarField rhof = fvc::interpolate(rho);
89   surfaceScalarField waveVelocity =
90     Foam::sqrt(Ef*(1 - nuf)/(rhof*(1 + nuf)*(1 - 2*nuf)));
92   // Courant number
93   scalarField Co =
94     waveVelocity.internalField()*runTime.deltaT().value()
95     *mesh.surfaceInterpolation::deltaCoeffs().internalField();
97   // Calculate required time-step for a Courant number of 1.0
98   scalar requiredDeltaT = 1.0 /
99     gMax
100       (
101           mesh.surfaceInterpolation::deltaCoeffs().internalField()
102           *waveVelocity.internalField()
103           );
105   scalar averageCo = gAverage(Co);
106   scalar maxCo = gMax(Co);
107   scalar averageWaveVel = gAverage(waveVelocity);
108   scalar maxWaveVel = gMax(waveVelocity);
110   Info<< "\nCourant Number\n\tmean: " << averageCo
111       << "\n\tmax: " << maxCo << nl
112       << "Wave velocity magnitude\n\tmean " << averageWaveVel
113       << "\n\tmax: " << maxWaveVel << nl
114       << "Time step required for a maximum Courant number of 1.0 is "
115       << requiredDeltaT << endl;
117   Info<< "\nEnd\n" << endl;
119   return(0);
123 // ************************************************************************* //