v0.14.0
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
VolumeLengthQuality< TYPE > Struct Template Reference

Volume Length Quality. More...

#include <users_modules/basic_finite_elements/nonlinear_elastic_materials/src/VolumeLengthQuality.hpp>

Inheritance diagram for VolumeLengthQuality< TYPE >:
[legend]
Collaboration diagram for VolumeLengthQuality< TYPE >:
[legend]

Public Member Functions

 VolumeLengthQuality (VolumeLengthQualityType type, double alpha, double gamma)
 
MoFEMErrorCode getMaterialOptions ()
 
MoFEMErrorCode getEdgesFromElemCoords ()
 
MoFEMErrorCode calculateLrms ()
 Calculate mean element edge length. More...
 
MoFEMErrorCode calculateQ ()
 Calculate Q. More...
 
virtual MoFEMErrorCode calculateP_PiolaKirchhoffI (const NonlinearElasticElement::BlockData block_data, boost::shared_ptr< const NumeredEntFiniteElement > fe_ptr)
 Volume Length Quality. More...
 
- Public Member Functions inherited from NonlinearElasticElement::FunctionsToCalculatePiolaKirchhoffI< TYPE >
 FunctionsToCalculatePiolaKirchhoffI ()
 
virtual ~FunctionsToCalculatePiolaKirchhoffI ()=default
 
MoFEMErrorCode calculateC_CauchyDeformationTensor ()
 
MoFEMErrorCode calculateE_GreenStrain ()
 
MoFEMErrorCode calculateS_PiolaKirchhoffII ()
 
virtual MoFEMErrorCode calculateP_PiolaKirchhoffI (const BlockData block_data, boost::shared_ptr< const NumeredEntFiniteElement > fe_ptr)
 Function overload to implement user material. More...
 
virtual MoFEMErrorCode calculateCauchyStress (const BlockData block_data, boost::shared_ptr< const NumeredEntFiniteElement > fe_ptr)
 Function overload to implement user material. More...
 
virtual MoFEMErrorCode setUserActiveVariables (int &nb_active_variables)
 add additional active variables More...
 
virtual MoFEMErrorCode setUserActiveVariables (VectorDouble &activeVariables)
 Add additional independent variables More complex physical models depend on gradient of defamation and some additional variables. For example can depend on temperature. This function adds additional independent variables to the model. More...
 
virtual MoFEMErrorCode calculateElasticEnergy (const BlockData block_data, boost::shared_ptr< const NumeredEntFiniteElement > fe_ptr)
 Calculate elastic energy density. More...
 
virtual MoFEMErrorCode calculatesIGma_EshelbyStress (const BlockData block_data, boost::shared_ptr< const NumeredEntFiniteElement > fe_ptr)
 Calculate Eshelby stress. More...
 
virtual MoFEMErrorCode getDataOnPostProcessor (std::map< std::string, std::vector< VectorDouble > > &field_map, std::map< std::string, std::vector< MatrixDouble > > &grad_map)
 Do operations when pre-process. More...
 

Public Attributes

int tYpe
 
double aLpha
 
double gAmma
 
FTensor::Index< 'i', 3 > i
 
FTensor::Index< 'j', 3 > j
 
FTensor::Index< 'k', 3 > k
 
VectorDouble coordsEdges
 
double lrmsSquared0
 
VectorDouble deltaChi
 
ublas::vector< TYPE > deltaX
 
ublas::matrix< TYPE > Q
 
ublas::matrix< TYPE > dXdChiT
 
TYPE lrmsSquared
 
TYPE q
 
TYPE b
 
TYPE detF
 
TYPE currentVolume
 
TYPE tMp
 
- Public Attributes inherited from NonlinearElasticElement::FunctionsToCalculatePiolaKirchhoffI< TYPE >
FTensor::Index< 'i', 3 > i
 
FTensor::Index< 'j', 3 > j
 
FTensor::Index< 'k', 3 > k
 
double lambda
 
double mu
 
MatrixBoundedArray< TYPE, 9 > F
 
MatrixBoundedArray< TYPE, 9 > C
 
MatrixBoundedArray< TYPE, 9 > E
 
MatrixBoundedArray< TYPE, 9 > S
 
MatrixBoundedArray< TYPE, 9 > invF
 
MatrixBoundedArray< TYPE, 9 > P
 
MatrixBoundedArray< TYPE, 9 > sIGma
 
MatrixBoundedArray< TYPE, 9 > h
 
MatrixBoundedArray< TYPE, 9 > H
 
MatrixBoundedArray< TYPE, 9 > invH
 
MatrixBoundedArray< TYPE, 9 > sigmaCauchy
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_F
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_C
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_E
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_S
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_invF
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_P
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_sIGma
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_h
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_H
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_invH
 
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_sigmaCauchy
 
TYPE J
 
TYPE eNergy
 
TYPE detH
 
TYPE detF
 
int gG
 Gauss point number. More...
 
CommonDatacommonDataPtr
 
MoFEM::VolumeElementForcesAndSourcesCore::UserDataOperatoropPtr
 pointer to finite element tetrahedral operator More...
 

Additional Inherited Members

- Static Protected Member Functions inherited from NonlinearElasticElement::FunctionsToCalculatePiolaKirchhoffI< TYPE >
static auto resizeAndSet (MatrixBoundedArray< TYPE, 9 > &m)
 

Detailed Description

template<typename TYPE>
struct VolumeLengthQuality< TYPE >

Volume Length Quality.

Examples
mesh_smoothing.cpp.

Definition at line 32 of file VolumeLengthQuality.hpp.

Constructor & Destructor Documentation

◆ VolumeLengthQuality()

template<typename TYPE >
VolumeLengthQuality< TYPE >::VolumeLengthQuality ( VolumeLengthQualityType  type,
double  alpha,
double  gamma 
)
inline

Definition at line 45 of file VolumeLengthQuality.hpp.

47 tYpe(type), aLpha(alpha), gAmma(gamma) {
49 CHKERRABORT(PETSC_COMM_WORLD, ierr);
50 }
static PetscErrorCode ierr
Implementation of elastic (non-linear) St. Kirchhoff equation.
MoFEMErrorCode getMaterialOptions()

Member Function Documentation

◆ calculateLrms()

template<typename TYPE >
MoFEMErrorCode VolumeLengthQuality< TYPE >::calculateLrms ( )
inline

Calculate mean element edge length.

\[ \Delta \boldsymbol\chi = \boldsymbol\chi^1 - \boldsymbol\chi^2 \]

\[ \Delta X = \mathbf{F} \Delta \boldsymbol\chi \]

\[ l_\textrm{rms} = \sqrt{\frac{1}{6} \sum_{i=0}^6 l_i^2 } = L_\textrm{rms}dl_\textrm{rms} \]

Definition at line 128 of file VolumeLengthQuality.hpp.

128 {
130 if (deltaChi.size() != 3) {
131 deltaChi.resize(3);
132 deltaX.resize(3);
133 dXdChiT.resize(3, 3);
134 }
135 lrmsSquared = 0;
136 lrmsSquared0 = 0;
137 std::fill(dXdChiT.data().begin(), dXdChiT.data().end(), 0);
138 for (int ee = 0; ee < 6; ee++) {
139 for (int dd = 0; dd < 3; dd++) {
140 deltaChi[dd] = coordsEdges[6 * ee + dd] - coordsEdges[6 * ee + 3 + dd];
141 }
142 std::fill(deltaX.begin(), deltaX.end(), 0);
143 for (int ii = 0; ii != 3; ++ii)
144 for (int jj = 0; jj != 3; ++jj)
145 deltaX(ii) += this->F(ii, jj) * deltaChi(jj);
146
147 for (int dd = 0; dd < 3; dd++) {
148 lrmsSquared += (1. / 6.) * deltaX[dd] * deltaX[dd];
149 lrmsSquared0 += (1. / 6.) * deltaChi[dd] * deltaChi[dd];
150 }
151 for (int ii = 0; ii != 3; ++ii)
152 for (int jj = 0; jj != 3; ++jj)
153 dXdChiT(ii, jj) += deltaX(ii) * deltaChi(jj);
154 }
156 }
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
Definition: ddTensor0.hpp:33
ublas::matrix< TYPE > dXdChiT
ublas::vector< TYPE > deltaX

◆ calculateP_PiolaKirchhoffI()

template<typename TYPE >
virtual MoFEMErrorCode VolumeLengthQuality< TYPE >::calculateP_PiolaKirchhoffI ( const NonlinearElasticElement::BlockData  block_data,
boost::shared_ptr< const NumeredEntFiniteElement >  fe_ptr 
)
inlinevirtual

Volume Length Quality.

Based on: Three‐dimensional brittle fracture: configurational‐force‐driven crack propagation International Journal for Numerical Methods in Engineering 97 (7), 531-550

\[ \mathcal{B}(a)=\frac{a}{2(1-\gamma)}-\ln{(a-\gamma)} \]

\[ q = q_0 b, \quad q_0 = 6\sqrt{2}\frac{V_0}{L^3_\textrm{rms}}, \quad b = \frac{\textrm{det}(\mathbf{F})}{\textrm{d}l^3_\textrm{rms}} \]

\[ \mathbf{P} = \mathcal{B}(a)\mathbf{Q}, \]

where \(a\) depending on problem could be \(q\) or \(b\).

Reimplemented from NonlinearElasticElement::FunctionsToCalculatePiolaKirchhoffI< TYPE >.

Definition at line 205 of file VolumeLengthQuality.hpp.

207 {
209
212 if (this->invF.size1() != 3)
213 this->invF.resize(3, 3);
214
215 CHKERR invertTensor3by3(this->F, detF, this->invF);
218
219 double lrms03 = lrmsSquared0 * sqrt(lrmsSquared0);
220 b = detF / (lrmsSquared * sqrt(lrmsSquared) / lrms03);
221
222 currentVolume = detF * this->opPtr->getVolume();
223 q = 6. * sqrt(2.) * currentVolume / (lrmsSquared * sqrt(lrmsSquared));
224
225 if (this->P.size1() != 3)
226 this->P.resize(3, 3);
227
228 switch (tYpe) {
229 case QUALITY:
230 // Only use for testing, simple quality gradient
231 noalias(this->P) = q * Q;
232 break;
234 // This is used form mesh smoothing
235 tMp = q / (1.0 - gAmma) - 1.0 / (q - gAmma);
236 noalias(this->P) = tMp * Q;
237 break;
239 // Works well with Arbitrary Lagrangian Formulation
240 tMp = b / (1.0 - gAmma) - 1.0 / (b - gAmma);
241 noalias(this->P) = tMp * Q;
242 break;
244 // When scaled by volume works well with ALE and face flipping.
245 // Works well with smooth crack propagation
247 tMp *= b / (1.0 - gAmma) - 1.0 / (b - gAmma);
248 noalias(this->P) = tMp * Q;
249 break;
250 }
251
252 // Divide by volume, to make units as they should be
253 this->P *= aLpha / this->opPtr->getVolume();
254
256 }
@ BARRIER_AND_CHANGE_QUALITY_SCALED_BY_VOLUME
@ BARRIER_AND_QUALITY
@ BARRIER_AND_CHANGE_QUALITY
#define CHKERR
Inline error check.
Definition: definitions.h:535
MoFEMErrorCode invertTensor3by3(ublas::matrix< T, L, A > &jac_data, ublas::vector< T, A > &det_data, ublas::matrix< T, L, A > &inv_jac_data)
Calculate inverse of tensor rank 2 at integration points.
Definition: Templates.hpp:1608
MoFEMErrorCode determinantTensor3by3(T1 &t, T2 &det)
Calculate determinant 3 by 3.
Definition: Templates.hpp:1627
MoFEM::VolumeElementForcesAndSourcesCore::UserDataOperator * opPtr
pointer to finite element tetrahedral operator
MoFEMErrorCode calculateQ()
Calculate Q.
ublas::matrix< TYPE > Q
MoFEMErrorCode getEdgesFromElemCoords()
MoFEMErrorCode calculateLrms()
Calculate mean element edge length.

◆ calculateQ()

template<typename TYPE >
MoFEMErrorCode VolumeLengthQuality< TYPE >::calculateQ ( )
inline

Calculate Q.

\[ \mathbf{Q} = \mathbf{F}^{-\mathsf{T}} - \frac{1}{2} \frac{1}{l^2_\textrm{rms}} \sum_i^6 \Delta\mathbf{X}_i \Delta\boldsymbol\chi_i^\mathsf{T} \]

Definition at line 172 of file VolumeLengthQuality.hpp.

172 {
174 Q.resize(3, 3, false);
178 t_Q(i, j) = t_invF(j, i) - 0.5 * t_dXdChiT(i, j) / lrmsSquared;
180 }
auto getFTensor2FromArray3by3(ublas::matrix< T, L, A > &data, const FTensor::Number< S > &, const size_t rr, const size_t cc=0)
Definition: Templates.hpp:1359
FTensor::Tensor2< FTensor::PackPtr< TYPE *, 0 >, 3, 3 > t_invF
FTensor::Index< 'i', 3 > i
FTensor::Index< 'j', 3 > j

◆ getEdgesFromElemCoords()

template<typename TYPE >
MoFEMErrorCode VolumeLengthQuality< TYPE >::getEdgesFromElemCoords ( )
inline

Get coordinates of edges using cannonical element numeration

Definition at line 81 of file VolumeLengthQuality.hpp.

81 {
83 if (coordsEdges.empty()) {
84 coordsEdges.resize(6 * 2 * 3, false);
85 }
86 cblas_dcopy(3, &this->opPtr->getCoords()[0 * 3], 1,
87 &coordsEdges[0 * 3 * 2 + 0], 1);
88 cblas_dcopy(3, &this->opPtr->getCoords()[1 * 3], 1,
89 &coordsEdges[0 * 3 * 2 + 3], 1);
90 cblas_dcopy(3, &this->opPtr->getCoords()[0 * 3], 1,
91 &coordsEdges[1 * 3 * 2 + 0], 1);
92 cblas_dcopy(3, &this->opPtr->getCoords()[2 * 3], 1,
93 &coordsEdges[1 * 3 * 2 + 3], 1);
94 cblas_dcopy(3, &this->opPtr->getCoords()[0 * 3], 1,
95 &coordsEdges[2 * 3 * 2 + 0], 1);
96 cblas_dcopy(3, &this->opPtr->getCoords()[3 * 3], 1,
97 &coordsEdges[2 * 3 * 2 + 3], 1);
98 cblas_dcopy(3, &this->opPtr->getCoords()[1 * 3], 1,
99 &coordsEdges[3 * 3 * 2 + 0], 1);
100 cblas_dcopy(3, &this->opPtr->getCoords()[2 * 3], 1,
101 &coordsEdges[3 * 3 * 2 + 3], 1);
102 cblas_dcopy(3, &this->opPtr->getCoords()[1 * 3], 1,
103 &coordsEdges[4 * 3 * 2 + 0], 1);
104 cblas_dcopy(3, &this->opPtr->getCoords()[3 * 3], 1,
105 &coordsEdges[4 * 3 * 2 + 3], 1);
106 cblas_dcopy(3, &this->opPtr->getCoords()[2 * 3], 1,
107 &coordsEdges[5 * 3 * 2 + 0], 1);
108 cblas_dcopy(3, &this->opPtr->getCoords()[3 * 3], 1,
109 &coordsEdges[5 * 3 * 2 + 3], 1);
111 }

◆ getMaterialOptions()

template<typename TYPE >
MoFEMErrorCode VolumeLengthQuality< TYPE >::getMaterialOptions ( )
inline

Definition at line 52 of file VolumeLengthQuality.hpp.

52 {
54 CHKERR PetscOptionsBegin(PETSC_COMM_WORLD, "",
55 "Get VolumeLengthQuality material options",
56 "none");
57 CHKERR PetscOptionsEList(
58 "-volume_length_type", "Volume length quality type", "",
61 CHKERR PetscOptionsScalar("-volume_length_alpha",
62 "volume length alpha parameter", "", aLpha,
63 &aLpha, PETSC_NULL);
64 CHKERR PetscOptionsScalar("-volume_length_gamma",
65 "volume length parameter (barrier)", "", gAmma,
66 &gAmma, PETSC_NULL);
67 ierr = PetscOptionsEnd();
69 }
@ LASTOP_VOLUMELENGTHQUALITYTYPE
static const char * VolumeLengthQualityTypeNames[]
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:447
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:440

Member Data Documentation

◆ aLpha

template<typename TYPE >
double VolumeLengthQuality< TYPE >::aLpha

Definition at line 38 of file VolumeLengthQuality.hpp.

◆ b

template<typename TYPE >
TYPE VolumeLengthQuality< TYPE >::b

Definition at line 77 of file VolumeLengthQuality.hpp.

◆ coordsEdges

template<typename TYPE >
VectorDouble VolumeLengthQuality< TYPE >::coordsEdges

Definition at line 71 of file VolumeLengthQuality.hpp.

◆ currentVolume

template<typename TYPE >
TYPE VolumeLengthQuality< TYPE >::currentVolume

Definition at line 77 of file VolumeLengthQuality.hpp.

◆ deltaChi

template<typename TYPE >
VectorDouble VolumeLengthQuality< TYPE >::deltaChi

Definition at line 73 of file VolumeLengthQuality.hpp.

◆ deltaX

template<typename TYPE >
ublas::vector<TYPE> VolumeLengthQuality< TYPE >::deltaX

Definition at line 75 of file VolumeLengthQuality.hpp.

◆ detF

template<typename TYPE >
TYPE VolumeLengthQuality< TYPE >::detF

Definition at line 77 of file VolumeLengthQuality.hpp.

◆ dXdChiT

template<typename TYPE >
ublas::matrix<TYPE> VolumeLengthQuality< TYPE >::dXdChiT

Definition at line 76 of file VolumeLengthQuality.hpp.

◆ gAmma

template<typename TYPE >
double VolumeLengthQuality< TYPE >::gAmma

Definition at line 39 of file VolumeLengthQuality.hpp.

◆ i

template<typename TYPE >
FTensor::Index<'i', 3> VolumeLengthQuality< TYPE >::i

Definition at line 41 of file VolumeLengthQuality.hpp.

◆ j

template<typename TYPE >
FTensor::Index<'j', 3> VolumeLengthQuality< TYPE >::j

Definition at line 42 of file VolumeLengthQuality.hpp.

◆ k

template<typename TYPE >
FTensor::Index<'k', 3> VolumeLengthQuality< TYPE >::k

Definition at line 43 of file VolumeLengthQuality.hpp.

◆ lrmsSquared

template<typename TYPE >
TYPE VolumeLengthQuality< TYPE >::lrmsSquared

Definition at line 77 of file VolumeLengthQuality.hpp.

◆ lrmsSquared0

template<typename TYPE >
double VolumeLengthQuality< TYPE >::lrmsSquared0

Definition at line 72 of file VolumeLengthQuality.hpp.

◆ Q

template<typename TYPE >
ublas::matrix<TYPE> VolumeLengthQuality< TYPE >::Q

Definition at line 76 of file VolumeLengthQuality.hpp.

◆ q

template<typename TYPE >
TYPE VolumeLengthQuality< TYPE >::q

Definition at line 77 of file VolumeLengthQuality.hpp.

◆ tMp

template<typename TYPE >
TYPE VolumeLengthQuality< TYPE >::tMp

Definition at line 77 of file VolumeLengthQuality.hpp.

◆ tYpe

template<typename TYPE >
int VolumeLengthQuality< TYPE >::tYpe

Definition at line 37 of file VolumeLengthQuality.hpp.


The documentation for this struct was generated from the following file: