v0.14.0
SmallStrainPlasticity.cpp
Go to the documentation of this file.
1 /** \fiele SmallStrainPlasticity.cpp
2  * \brief Operators and data structures for small strain plasticity
3  * \ingroup small_strain_plasticity
4  *
5  * Implementation of small strain plasticity
6  *
7  * This file is part of MoFEM.
8  * MoFEM is free software: you can redistribute it and/or modify it under
9  * the terms of the GNU Lesser General Public License as published by the
10  * Free Software Foundation, either version 3 of the License, or (at your
11  * option) any later version.
12  *
13  * MoFEM is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16  * License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with MoFEM. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #include <MoFEM.hpp>
23 using namespace MoFEM;
24 
25 #include <boost/numeric/ublas/vector_proxy.hpp>
26 #include <boost/numeric/ublas/matrix.hpp>
27 #include <boost/numeric/ublas/matrix_proxy.hpp>
28 #include <boost/numeric/ublas/vector.hpp>
29 #include <boost/numeric/ublas/symmetric.hpp>
30 
31 #include <adolc/adolc.h>
33 
35  PetscFunctionBegin;
36  int def_length = 0;
37  rval = mField.get_moab().tag_get_handle(
38  "PLASTIC_STRAIN",def_length,MB_TYPE_DOUBLE,
39  thPlasticStrain,MB_TAG_CREAT|MB_TAG_SPARSE|MB_TAG_VARLEN,NULL
40  ); CHKERRQ_MOAB(rval);
41  rval = mField.get_moab().tag_get_handle(
42  "INTERNAL_VARIABLES",def_length,MB_TYPE_DOUBLE,
43  thInternalVariables,MB_TAG_CREAT|MB_TAG_SPARSE|MB_TAG_VARLEN,NULL
44  ); CHKERRQ_MOAB(rval);
45  PetscFunctionReturn(0);
46 }
47 
49  vector<VectorDouble > &values_at_gauss_pts,
50  vector<MatrixDouble > &gardient_at_gauss_pts
51 ):
53 valuesAtGaussPts(values_at_gauss_pts),
54 gradientAtGaussPts(gardient_at_gauss_pts),
55 zeroAtType(MBVERTEX) {
56 }
57 
59  int side,EntityType type,DataForcesAndSourcesCore::EntData &data
60 ) {
61  PetscFunctionBegin;
62  try {
63  int nb_dofs = data.getFieldData().size();
64  if(nb_dofs == 0) {
65  PetscFunctionReturn(0);
66  }
67  int nb_gauss_pts = data.getN().size1();
68  int rank = data.getFieldDofs()[0]->getNbOfCoeffs();
69  //initialize
70  if(type == zeroAtType) {
71  valuesAtGaussPts.resize(nb_gauss_pts);
72  gradientAtGaussPts.resize(nb_gauss_pts);
73  for(int gg = 0;gg<nb_gauss_pts;gg++) {
74  valuesAtGaussPts[gg].resize(rank,false);
75  gradientAtGaussPts[gg].resize(rank,3,false);
76  valuesAtGaussPts[gg].clear();
77  gradientAtGaussPts[gg].clear();
78  }
79  }
80  VectorDouble& values = data.getFieldData();
81  for(int gg = 0;gg<nb_gauss_pts;gg++) {
82  VectorDouble &values_at_gauss_pts = valuesAtGaussPts[gg];
83  MatrixDouble &gradient_at_gauss_pts = gradientAtGaussPts[gg];
84  VectorAdaptor N = data.getN(gg,nb_dofs/rank);
85  MatrixAdaptor diffN = data.getDiffN(gg,nb_dofs/rank);
86  for(int dd = 0;dd<nb_dofs/rank;dd++) {
87  for(int rr1 = 0;rr1<rank;rr1++) {
88  const double v = values[rank*dd+rr1];
89  values_at_gauss_pts[rr1] += N[dd]*v;
90  for(int rr2 = 0;rr2<3;rr2++) {
91  gradient_at_gauss_pts(rr1,rr2) += diffN(dd,rr2)*v;
92  }
93  }
94  }
95  }
96  // cerr << rowFieldName << endl;
97  // cerr << side << " " << type << endl;
98  // cerr << values << endl;
99  // cerr << valuesAtGaussPts[0] << endl;
100  // cerr << gradientAtGaussPts[0] << endl;
101  // cerr << endl;
102  } catch (const std::exception& ex) {
103  ostringstream ss;
104  ss << "throw in method: " << ex.what() << endl;
105  SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
106  }
107  PetscFunctionReturn(0);
108 }
109 
111  const string field_name,CommonData &common_data
112 ):
114  field_name,common_data.dataAtGaussPts[field_name],common_data.gradAtGaussPts[field_name]
115 ) {
116 }
117 
119  string field_name,
120  CommonData &common_data
121 ):
123 commonData(common_data) {
124 }
125 
127  int side,EntityType type,DataForcesAndSourcesCore::EntData &data
128 ) {
129  PetscFunctionBegin;
130 
131  try {
132  //do it only once, no need to repeat this for edges,faces or tets
133  if(type != MBVERTEX) PetscFunctionReturn(0);
134 
135  int nb_dofs = data.getFieldData().size();
136  if(nb_dofs==0) PetscFunctionReturn(0);
137  int nb_gauss_pts = data.getN().size1();
138 
139  for(int gg = 0;gg<nb_gauss_pts;gg++) {
140 
141  if(commonData.deltaGamma[gg]>0) {
142 
143  VectorAdaptor plastic_strain = VectorAdaptor(
144  6,ublas::shallow_array_adaptor<double>(6,&commonData.plasticStrainPtr[gg*6])
145  );
146  int nb_internal_variables = commonData.internalVariables[gg].size();
147  VectorAdaptor internal_variables = VectorAdaptor(
148  nb_internal_variables,
149  ublas::shallow_array_adaptor<double>(
150  nb_internal_variables,&commonData.internalVariablesPtr[gg*nb_internal_variables]
151  )
152  );
153 
154  // cerr << plastic_strain << " " << commonData.plasticStrain[gg] << endl;
155  // cerr << internal_variables << " " << commonData.internalVariables[gg] << endl;
156 
157  plastic_strain = commonData.plasticStrain[gg];
158  internal_variables = commonData.internalVariables[gg];
159  }
160 
161  }
162 
163  } catch (const std::exception& ex) {
164  ostringstream ss;
165  ss << "throw in method: " << ex.what() << endl;
166  SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
167  }
168 
169  PetscFunctionReturn(0);
170 }
171 
173  PetscFunctionBegin;
174  unsigned int nb_dofs = diffN.size1();
175  if(B.size2()!=3*nb_dofs) {
176  B.resize(6,3*nb_dofs,false);
177  }
178  B.clear();
179  for(int dd = 0;dd<nb_dofs;dd++) {
180  const double diff[] = {
181  diffN(dd,0), diffN(dd,1), diffN(dd,2)
182  };
183  const int dd3 = 3*dd;
184  for(int rr = 0;rr<3;rr++) {
185  B(rr,dd3+rr) = diff[rr];
186  }
187  // gamma_xy
188  B(3,dd3+0) = diff[1];
189  B(3,dd3+1) = diff[0];
190  // gamma_yz
191  B(4,dd3+1) = diff[2];
192  B(4,dd3+2) = diff[1];
193  // gamma_xz
194  B(5,dd3+0) = diff[2];
195  B(5,dd3+2) = diff[0];
196  }
197  PetscFunctionReturn(0);
198 }
199 
201  const MatrixAdaptor &diffN,MatrixDouble &volB,double alpha
202 ) {
203  PetscFunctionBegin;
204  int nb_dofs = diffN.size1();
205  for(int dd = 0;dd<nb_dofs;dd++) {
206  const double diff[] = {
207  diffN(dd,0), diffN(dd,1), diffN(dd,2)
208  };
209  const int dd3 = 3*dd;
210  for(int rr1 = 0;rr1<3;rr1++) {
211  for(int rr2 = 0;rr2<3;rr2++) {
212  volB(rr1,dd3+rr2) += alpha*diff[rr2]/3.;
213  }
214  }
215  }
216  PetscFunctionReturn(0);
217 }
218 
220  string field_name,
221  CommonData &common_data
222 ):
224 commonData(common_data) {
225 }
226 
228  int side,EntityType type,DataForcesAndSourcesCore::EntData &data
229 ) {
230  PetscFunctionBegin;
231 
232  try {
233 
234  int nb_dofs = data.getFieldData().size();
235  if(nb_dofs==0) PetscFunctionReturn(0);
236  int nb_gauss_pts = data.getN().size1();
237  nF.resize(nb_dofs,false);
238  nF.clear();
239 
240  if(commonData.bBar) {
241  double v = 0;
242  volB.resize(6,nb_dofs,false);
243  volB.clear();
244  for(int gg = 0;gg<nb_gauss_pts;gg++) {
245  double val = getVolume()*getGaussPts()(3,gg);
246  if(getHoGaussPtsDetJac().size()>0) {
247  val *= getHoGaussPtsDetJac()[gg]; ///< higher order geometry
248  }
249  v += val;
250  const MatrixAdaptor &diffN = data.getDiffN(gg,nb_dofs/3);
251  ierr = addVolumetricB(diffN,volB,val); CHKERRQ(ierr);
252  }
253  volB /= v;
254  }
255 
256  for(int gg = 0;gg<nb_gauss_pts;gg++) {
257 
258  double val = getVolume()*getGaussPts()(3,gg);
259  if(getHoGaussPtsDetJac().size()>0) {
260  val *= getHoGaussPtsDetJac()[gg]; ///< higher order geometry
261  }
262  const MatrixAdaptor &diffN = data.getDiffN(gg,nb_dofs/3);
263  ierr = makeB(diffN,B); CHKERRQ(ierr);
264  if(commonData.bBar) {
265  ierr = addVolumetricB(diffN,B,-1); CHKERRQ(ierr);
266  B += volB;
267  }
268  // cerr << gg << endl;
269  // cerr << diffN << endl;
270  // cerr << B << endl;
271  // cerr << commonData.sTress[gg] << endl;
272  // cerr << prod(trans(B),commonData.sTress[gg]) << endl;
273 
274  noalias(nF) += val*prod(trans(B),commonData.sTress[gg]);
275  // cerr << "nF " << nF << endl;
276 
277  }
278 
279  // cerr << side << " " << type << " " << data.getN().size1() << " "<< data.getN().size2() << endl;
280 
281  int *indices_ptr;
282  indices_ptr = &data.getIndices()[0];
283 
284  ierr = VecSetValues(
285  getFEMethod()->snes_f,
286  nb_dofs,
287  indices_ptr,
288  &nF[0],
289  ADD_VALUES
290  ); CHKERRQ(ierr);
291 
292 
293  } catch (const std::exception& ex) {
294  ostringstream ss;
295  ss << "throw in method: " << ex.what() << endl;
296  SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
297  }
298 
299  PetscFunctionReturn(0);
300 }
301 
303  string field_name,
304  CommonData &common_data
305 ):
307 commonData(common_data) {
308  // sYmm = false;
309 }
310 
312  int row_side,int col_side,
313  EntityType row_type,EntityType col_type,
316 ) {
317  PetscFunctionBegin;
318  try {
319 
320  int nb_dofs_row = row_data.getFieldData().size();
321  if(nb_dofs_row==0) PetscFunctionReturn(0);
322  int nb_dofs_col = col_data.getFieldData().size();
323  if(nb_dofs_col==0) PetscFunctionReturn(0);
324 
325  K.resize(nb_dofs_row,nb_dofs_col,false);
326  K.clear();
327 
328  int nb_gauss_pts = row_data.getN().size1();
329 
330  if(commonData.bBar) {
331  double v = 0;
332  rowVolB.resize(6,nb_dofs_row,false);
333  rowVolB.clear();
334  colVolB.resize(6,nb_dofs_col,false);
335  colVolB.clear();
336  for(int gg = 0;gg<nb_gauss_pts;gg++) {
337  double val = getVolume()*getGaussPts()(3,gg);
338  if(getHoGaussPtsDetJac().size()>0) {
339  val *= getHoGaussPtsDetJac()[gg]; ///< higher order geometry
340  }
341  v += val;
342  const MatrixAdaptor &diffN_row = row_data.getDiffN(gg,nb_dofs_row/3);
343  const MatrixAdaptor &diffN_col = col_data.getDiffN(gg,nb_dofs_col/3);
344  ierr = addVolumetricB(diffN_row,rowVolB,val); CHKERRQ(ierr);
345  ierr = addVolumetricB(diffN_col,colVolB,val); CHKERRQ(ierr);
346  }
347  rowVolB /= v;
348  colVolB /= v;
349  }
350 
351  for(int gg = 0;gg<nb_gauss_pts;gg++) {
352 
353  double val = getVolume()*getGaussPts()(3,gg);
354  if(getHoGaussPtsDetJac().size()>0) {
355  val *= getHoGaussPtsDetJac()[gg]; ///< higher order geometry
356  }
357 
358  const MatrixAdaptor &diffN_row = row_data.getDiffN(gg,nb_dofs_row/3);
359  const MatrixAdaptor &diffN_col = col_data.getDiffN(gg,nb_dofs_col/3);
360  ierr = makeB(diffN_row,rowB); CHKERRQ(ierr);
361  ierr = makeB(diffN_col,colB); CHKERRQ(ierr);
362  if(commonData.bBar) {
363  ierr = addVolumetricB(diffN_row,rowB,-1); CHKERRQ(ierr); // B-bar
364  ierr = addVolumetricB(diffN_col,colB,-1); CHKERRQ(ierr);
365  rowB += rowVolB;
366  colB += colVolB;
367  }
368 
369  CB.resize(6,nb_dofs_col,false);
370  cblas_dgemm(
371  CblasRowMajor,CblasNoTrans,CblasNoTrans,
372  6,nb_dofs_col,6,
373  1.,
375  &colB(0,0),nb_dofs_col,
376  0,
377  &CB(0,0),nb_dofs_col
378  );
379  cblas_dgemm(
380  CblasRowMajor,CblasTrans,CblasNoTrans,
381  nb_dofs_row,nb_dofs_col,6,
382  val,
383  &rowB(0,0),nb_dofs_row,
384  &CB(0,0),nb_dofs_col,
385  1,
386  &K(0,0),nb_dofs_col
387  );
388  //noalias(CB) = prod(commonData.materialTangentOperator[gg],colB);
389  //noalias(K) += val*prod(trans(rowB),CB);
390 
391  }
392 
393  // cerr << K << endl;
394  // cerr << row_data.getIndices() << endl;
395  // cerr << col_data.getIndices() << endl;
396  // cerr << getFEMethod()->snes_A << endl;
397  // cerr << getFEMethod()->snes_B << endl;
398 
399  int *row_indices_ptr,*col_indices_ptr;
400  row_indices_ptr = &row_data.getIndices()[0];
401  col_indices_ptr = &col_data.getIndices()[0];
402 
403  ierr = MatSetValues(
404  getFEMethod()->snes_B,
405  nb_dofs_row,row_indices_ptr,
406  nb_dofs_col,col_indices_ptr,
407  &K(0,0),ADD_VALUES
408  ); CHKERRQ(ierr);
409 
410  //is symmetric
411  if(row_side != col_side || row_type != col_type) {
412 
413  transK.resize(nb_dofs_col,nb_dofs_row,false);
414  noalias(transK) = trans(K);
415  ierr = MatSetValues(
416  getFEMethod()->snes_B,
417  nb_dofs_col,col_indices_ptr,
418  nb_dofs_row,row_indices_ptr,
419  &transK(0,0),ADD_VALUES
420  ); CHKERRQ(ierr);
421 
422  }
423 
424  } catch (const std::exception& ex) {
425  ostringstream ss;
426  ss << "throw in method: " << ex.what() << endl;
427  SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
428  }
429  PetscFunctionReturn(0);
430 }
431 
433  PetscFunctionBegin;
434 
435  rval = mField.get_moab().tag_get_handle(
436  "PLASTIC_STRAIN",thPlasticStrain
437  ); CHKERRQ_MOAB(rval);
438  rval = mField.get_moab().tag_get_handle(
439  "INTERNAL_VARIABLES",thInternalVariables
440  ); CHKERRQ_MOAB(rval);
441  PetscFunctionReturn(0);
442 }
443 
445  const EntityHandle tet,const int nb_gauss_pts,const int nb_internal_variables
446 ) {
447  PetscFunctionBegin;
448 
449  VectorDouble v;
450  {
451  rval = mField.get_moab().tag_get_by_ptr(
453  );
454  if(rval != MB_SUCCESS || commonData.plasticStrainSize != 6*nb_gauss_pts) {
455  v.resize(6*nb_gauss_pts,false);
456  v.clear();
457  int tag_size[1];
458  tag_size[0] = v.size();
459  void const* tag_data[] = { &v[0] };
460  rval = mField.get_moab().tag_set_by_ptr(
461  thPlasticStrain,&tet,1,tag_data,tag_size
462  ); CHKERRQ_MOAB(rval);
463  rval = mField.get_moab().tag_get_by_ptr(
465  ); CHKERRQ_MOAB(rval);
466  }
467  }
468  if(nb_internal_variables>0) {
469  rval = mField.get_moab().tag_get_by_ptr(
471  );
472  if(rval != MB_SUCCESS || commonData.internalVariablesSize != nb_internal_variables*nb_gauss_pts) {
473  v.resize(nb_internal_variables*nb_gauss_pts,false);
474  v.clear();
475  int tag_size[1];
476  tag_size[0] = v.size();
477  void const* tag_data[] = { &v[0] };
478  rval = mField.get_moab().tag_set_by_ptr(
479  thInternalVariables,&tet,1,tag_data,tag_size
480  ); CHKERRQ_MOAB(rval);
481  rval = mField.get_moab().tag_get_by_ptr(
483  );
484  }
485  }
486  PetscFunctionReturn(0);
487 }
488 
490  int side,EntityType type,DataForcesAndSourcesCore::EntData &data
491 ) {
492  PetscFunctionBegin;
493 
494  try {
495 
496  //do it only once, no need to repeat this for edges,faces or tets
497  if(type != MBVERTEX) PetscFunctionReturn(0);
498 
499  int nb_dofs = data.getFieldData().size();
500  if(nb_dofs==0) PetscFunctionReturn(0);
501 
502  int nb_gauss_pts = data.getN().size1();
503  int nb_internal_variables = cP.internalVariables.size();
504  if(!initCp) {
505  ierr = getTags(); CHKERRQ(ierr);
506  }
507  EntityHandle tet = getNumeredEntFiniteElementPtr()->getEnt();
508  ierr = setTagsData(tet,nb_gauss_pts,nb_internal_variables); CHKERRQ(ierr);
509 
510  commonData.sTress.resize(nb_gauss_pts);
511  commonData.materialTangentOperator.resize(nb_gauss_pts);
512  commonData.plasticStrain.resize(nb_gauss_pts);
513  commonData.internalVariables.resize(nb_gauss_pts);
514  commonData.internalFluxes.resize(nb_gauss_pts);
515  commonData.deltaGamma.resize(nb_gauss_pts);
516 
517  // B-bar
518  double ave_tr_strain = 0;
519  if(commonData.bBar) {
520  double v = 0;
521  for(int gg = 0;gg<nb_gauss_pts;gg++) {
522  double val = getVolume()*getGaussPts()(3,gg);
523  if(getHoGaussPtsDetJac().size()>0) {
524  val *= getHoGaussPtsDetJac()[gg]; ///< higher order geometry
525  }
526  v += val;
527  for(int ii = 0;ii<3;ii++) {
528  ave_tr_strain += val*commonData.gradAtGaussPts[rowFieldName][gg](ii,ii)/3.;
529  }
530  // cerr << commonData.gradAtGaussPts[rowFieldName][gg] << endl;
531  }
532  ave_tr_strain /= v;
533  // cerr << "v " << v << " ave_tr_strain " << ave_tr_strain << endl;
534  }
535 
536  for(int gg = 0;gg<nb_gauss_pts;gg++) {
537 
538  VectorAdaptor plastic_strain = VectorAdaptor(
539  6,ublas::shallow_array_adaptor<double>(6,&commonData.plasticStrainPtr[gg*6])
540  );
541  VectorAdaptor internal_variables = VectorAdaptor(
542  nb_internal_variables,
543  ublas::shallow_array_adaptor<double>(
544  nb_internal_variables,&commonData.internalVariablesPtr[gg*nb_internal_variables]
545  )
546  );
547 
548  cP.sTrain.resize(6,false);
549  {
550  double tr_strain = 0;
551  for(int ii = 0;ii<3;ii++) {
552  cP.sTrain[ii] = commonData.gradAtGaussPts[rowFieldName][gg](ii,ii);
553  tr_strain += cP.sTrain[ii]/3;
554  }
555  if(commonData.bBar) {
556  for(int ii = 0;ii<3;ii++) {
557  cP.sTrain[ii] += ave_tr_strain-tr_strain;
558  }
559  }
560  cP.sTrain[3] =
561  commonData.gradAtGaussPts[rowFieldName][gg](0,1)+
562  commonData.gradAtGaussPts[rowFieldName][gg](1,0);
563  cP.sTrain[4] =
564  commonData.gradAtGaussPts[rowFieldName][gg](1,2)+
565  commonData.gradAtGaussPts[rowFieldName][gg](2,1);
566  cP.sTrain[5] =
567  commonData.gradAtGaussPts[rowFieldName][gg](0,2)+
568  commonData.gradAtGaussPts[rowFieldName][gg](2,0);
569  // cerr << "Grad " << commonData.gradAtGaussPts[rowFieldName][gg] << endl;
570  // cerr << cP.sTrain << endl;
571  }
572 
573 
574  {
575  cP.plasticStrain0.resize(6,false);
576  noalias(cP.plasticStrain0) = plastic_strain;
577  cP.internalVariables0.resize(nb_internal_variables,false);
578  noalias(cP.internalVariables0) = internal_variables;
579  cP.plasticStrain.resize(6,false);
580  noalias(cP.plasticStrain) = plastic_strain;
581  cP.internalVariables.resize(nb_internal_variables,false);
582  noalias(cP.internalVariables) = internal_variables;
583  cP.deltaGamma = 0;
584  commonData.sTress[gg].clear();
585  commonData.internalFluxes[gg].clear();
586  }
587 
588  if(!initCp) {
589  cP.gG = 0;
590  ierr = cP.evaluatePotentials(); CHKERRQ(ierr);
591  } else {
592  cP.gG = 1;
593  ierr = cP.setActiveVariablesW(); CHKERRQ(ierr);
594  if(
595  getFEMethod()->snes_ctx ==
596  SnesMethod::CTX_SNESSETJACOBIAN &&
597  (!isLinear || !hessianWCalculated)
598  ) {
599  ierr = cP.pLayW(); CHKERRQ(ierr);
600  hessianWCalculated = true;
601  } else {
602  ierr = cP.pLayW_NoHessian(); CHKERRQ(ierr);
603  }
604  ierr = cP.setActiveVariablesYH(); CHKERRQ(ierr);
605  ierr = cP.pLayY_NoGradient(); CHKERRQ(ierr);
606  // cerr << "C " << cP.C << endl;
607  }
608 
609  double y = cP.y;
610  if(y>0) {
611  // ierr = PCFactorSetMatSolverPackage(cP.pC,MATSOLVERPETSC); CHKERRQ(ierr);
612  // ierr = KSPMonitorCancel(cP.kSp); CHKERRQ(ierr);
613  // ierr = SNESMonitorCancel(cP.sNes); CHKERRQ(ierr);
614  // ierr = SNESSetTolerances(cP.sNes,cP.tOl,1e-12,0,20,1000); CHKERRQ(ierr);
615  // ierr = SNESLineSearchSetType(cP.lineSearch,SNESLINESEARCHBT); CHKERRQ(ierr);
616  ierr = cP.solveColasetProjection(); CHKERRQ(ierr);
617  }
618 
619  {
620  commonData.sTress[gg].resize(6,false);
621  noalias(commonData.sTress[gg]) = cP.sTress;
622  commonData.plasticStrain[gg].resize(6,false);
623  noalias(commonData.plasticStrain[gg]) = cP.plasticStrain;
624  commonData.internalVariables[gg].resize(nb_internal_variables,false);
625  noalias(commonData.internalVariables[gg]) = cP.internalVariables;
626  commonData.internalFluxes[gg].resize(nb_internal_variables,false);
627  noalias(commonData.internalFluxes[gg]) = cP.internalFluxes;
628  commonData.deltaGamma[gg] = cP.deltaGamma;
629  }
630 
631  if(getFEMethod()->snes_ctx == SnesMethod::CTX_SNESSETJACOBIAN) {
632  int iter;
633  ierr = SNESGetIterationNumber(getFEMethod()->snes,&iter); CHKERRQ(ierr);
634  commonData.materialTangentOperator[gg].resize(6,6,false);
635  if(iter>0 && cP.deltaGamma>0) {
636  ierr = cP.consistentTangent(); CHKERRQ(ierr);
637  noalias(commonData.materialTangentOperator[gg]) = cP.Cep;
638  } else {
639  noalias(commonData.materialTangentOperator[gg]) = cP.C;
640  }
641  }
642 
643  if(getFEMethod()->snes_ctx == SnesMethod::CTX_SNESSETFUNCTION) {
644  int iter;
645  ierr = SNESGetIterationNumber(getFEMethod()->snes,&iter); CHKERRQ(ierr);
646  if(iter>1) {
647  ierr = SNESSetLagJacobian(getFEMethod()->snes,1); CHKERRQ(ierr);
648  }
649  }
650 
651 
652  initCp = true;
653 
654  }
655 
656  } catch (const std::exception& ex) {
657  ostringstream ss;
658  ss << "throw in method: " << ex.what() << endl;
659  SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
660  }
661 
662  PetscFunctionReturn(0);
663 }
664 
666  PetscFunctionBegin;
667  activeVariablesW.resize(12+internalVariables.size(),false);
668  for(int ii = 0;ii<6;ii++) {
669  activeVariablesW[ii] = sTrain[ii];
670  }
671  for(int ii = 0;ii<6;ii++) {
672  activeVariablesW[6+ii] = plasticStrain[ii];
673  }
674  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
675  activeVariablesW[12+ii] = internalVariables[ii];
676  }
677  PetscFunctionReturn(0);
678 }
679 
681  PetscFunctionBegin;
682  activeVariablesYH.resize(6+internalVariables.size(),false);
683  for(int ii = 0;ii<6;ii++) {
684  activeVariablesYH[ii] = sTress[ii];
685  }
686  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
687  activeVariablesYH[6+ii] = internalFluxes[ii];
688  }
689  PetscFunctionReturn(0);
690 }
691 
693  PetscFunctionBegin;
694  trace_on(tAgs[0]);
695  {
696  //active variables
697  a_sTrain.resize(6,false);
698  for(int ii = 0;ii<6;ii++) {
699  a_sTrain[ii] <<= sTrain[ii];
700  }
701  a_plasticStrain.resize(6,false);
702  for(int ii = 0;ii<6;ii++) {
703  a_plasticStrain[ii] <<= plasticStrain[ii];
704  }
705  a_internalVariables.resize(internalVariables.size(),false);
706  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
707  a_internalVariables[ii] <<= internalVariables[ii];
708  }
709  //evaluete functions
710  ierr = freeHemholtzEnergy(); CHKERRQ(ierr);
711  //return variables
712  a_w >>= w;
713  }
714  trace_off();
715  PetscFunctionReturn(0);
716 }
717 
719  PetscFunctionBegin;
720  trace_on(tAgs[1]);
721  {
722  //active variables
723  a_sTress.resize(6,false);
724  for(int ii = 0;ii<6;ii++) {
725  a_sTress[ii] <<= sTress[ii];
726  }
727  a_internalFluxes.resize(internalVariables.size(),false);
728  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
729  a_internalFluxes[ii] <<= internalFluxes[ii];
730  }
731  //evaluete functions
732  ierr = yieldFunction(); CHKERRQ(ierr);
733  //return variables
734  a_y >>= y;
735  }
736  trace_off();
737  PetscFunctionReturn(0);
738 }
739 
741  PetscFunctionBegin;
742  trace_on(tAgs[2]);
743  {
744  //active variables
745  a_sTress.resize(6,false);
746  for(int ii = 0;ii<6;ii++) {
747  a_sTress[ii] <<= sTress[ii];
748  }
749  a_internalFluxes.resize(internalVariables.size(),false);
750  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
751  a_internalFluxes[ii] <<= internalFluxes[ii];
752  }
753  //evaluete functions
754  ierr = flowPotential(); CHKERRQ(ierr);
755  //return variables
756  a_h >>= h;
757  }
758  trace_off();
759  PetscFunctionReturn(0);
760 }
761 
763  PetscFunctionBegin;
764  int r;
765  int adloc_return_value = 0;
766  r = ::function(tAgs[0],1,activeVariablesW.size(),&activeVariablesW[0],&w);
767  if(r<adloc_return_value) {
768  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
769  }
770  gradientW.resize(activeVariablesW.size(),false);
771  r = gradient(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&gradientW[0]);
772  if(r<adloc_return_value) {
773  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
774  }
775  hessianW.resize(activeVariablesW.size(),activeVariablesW.size(),false);
776  hessianW.clear();
777  vector<double*> hessian_w(activeVariablesW.size());
778  for(unsigned int dd = 0;dd<activeVariablesW.size();dd++) {
779  hessian_w[dd] = &hessianW(dd,0);
780  }
781  r = hessian(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&hessian_w[0]);
782  if(r<adloc_return_value) {
783  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
784  }
785  sTress = VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientW[0]));
786  internalFluxes = VectorAdaptor(
787  internalVariables.size(),
788  ublas::shallow_array_adaptor<double>(
789  internalVariables.size(),
790  &gradientW[12]
791  )
792  );
793  C.resize(6,6,false);
794  for(int ii = 0;ii<6;ii++) {
795  for(int jj = 0;jj<=ii;jj++) {
796  C(ii,jj) = hessianW(ii,jj);
797  }
798  }
799  partialWStrainPlasticStrain.resize(6,6,false);
800  for(int ii = 0;ii<6;ii++) {
801  for(int jj = 0;jj<6;jj++) {
802  partialWStrainPlasticStrain(ii,jj) = hessianW(6+jj,ii);
803  }
804  }
805  D.resize(internalVariables.size(),internalVariables.size(),false);
806  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
807  for(unsigned int jj = 0;jj<=ii;jj++) {
808  D(ii,jj) = hessianW(12+ii,12+jj);
809  }
810  }
811  PetscFunctionReturn(0);
812 }
814  PetscFunctionBegin;
815  int r;
816  int adloc_return_value = 0;
817  r = ::function(tAgs[0],1,activeVariablesW.size(),&activeVariablesW[0],&w);
818  if(r<adloc_return_value) {
819  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
820  }
821  gradientW.resize(activeVariablesW.size(),false);
822  r = gradient(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&gradientW[0]);
823  if(r<adloc_return_value) {
824  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
825  }
826  sTress = VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientW[0]));
827  internalFluxes = VectorAdaptor(
828  internalVariables.size(),
829  ublas::shallow_array_adaptor<double>(
830  internalVariables.size(),
831  &gradientW[12]
832  )
833  );
834  PetscFunctionReturn(0);
835 }
836 
838  PetscFunctionBegin;
839  int r;
840  int adloc_return_value = 0;
841  r = ::function(tAgs[1],1,activeVariablesYH.size(),&activeVariablesYH[0],&y);
842  if(r<adloc_return_value) {
843  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
844  }
845  gradientY.resize(activeVariablesYH.size());
846  r = gradient(tAgs[1],activeVariablesYH.size(),&activeVariablesYH[0],&gradientY[0]);
847  if(r<adloc_return_value) {
848  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
849  }
850  partialYSigma = VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientY[0]));
851  partialYFlux = VectorAdaptor(
852  internalVariables.size(),
853  ublas::shallow_array_adaptor<double>(
854  internalVariables.size(),
855  &gradientY[6]
856  )
857  );
858  PetscFunctionReturn(0);
859 }
861  PetscFunctionBegin;
862  int r;
863  int adloc_return_value = 0;
864  r = ::function(tAgs[1],1,activeVariablesYH.size(),&activeVariablesYH[0],&y);
865  if(r<adloc_return_value) {
866  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
867  }
868  PetscFunctionReturn(0);
869 }
871  PetscFunctionBegin;
872  int r;
873  int adloc_return_value = 0;
874  r = ::function(tAgs[2],1,activeVariablesYH.size(),&activeVariablesYH[0],&h);
875  if(r<adloc_return_value) {
876  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
877  }
878  gradientH.resize(activeVariablesYH.size());
879  r = gradient(tAgs[2],activeVariablesYH.size(),&activeVariablesYH[0],&gradientH[0]);
880  if(r<adloc_return_value) {
881  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
882  }
883  hessianH.resize(6+internalVariables.size(),6+internalVariables.size(),false);
884  hessianH.clear();
885  vector<double*> hessian_h(activeVariablesYH.size());
886  for(int dd = 0;dd<activeVariablesYH.size();dd++) {
887  hessian_h[dd] = &hessianH(dd,0);
888  }
889  r = hessian(tAgs[2],activeVariablesYH.size(),&activeVariablesYH[0],&hessian_h[0]);
890  if(r<adloc_return_value) {
891  SETERRQ(PETSC_COMM_SELF,MOFEM_OPERATION_UNSUCCESSFUL,"ADOL-C function evaluation with error");
892  }
893  partialHSigma = VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientH[0]));
894  partialHFlux = VectorAdaptor(
895  internalVariables.size(),
896  ublas::shallow_array_adaptor<double>(
897  internalVariables.size(),
898  &gradientH[6]
899  )
900  );
901  partialHFlux *= -1;
902  partial2HSigma.resize(6,6,false);
903  for(int ii = 0;ii<6;ii++) {
904  for(int jj = 0;jj<=ii;jj++) {
905  partial2HSigma(ii,jj) = hessianH(ii,jj);
906  }
907  }
908  partial2HFlux.resize(internalVariables.size(),internalVariables.size(),false);
909  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
910  for(unsigned int jj = 0;jj<=ii;jj++) {
911  partial2HFlux(ii,jj) = -hessianH(6+ii,6+jj);
912  }
913  }
914  partial2HSigmaFlux.resize(6,internalVariables.size(),false);
915  partial2HSigmaFlux.clear();
916  for(int ii = 0;ii<6;ii++) {
917  for(unsigned int jj = 0;jj<internalVariables.size();jj++) {
918  partial2HSigmaFlux(ii,jj) = -hessianH(6+jj,ii);
919  }
920  }
921  PetscFunctionReturn(0);
922 }
923 
925  PetscFunctionBegin;
926  PetscInt n;
927  n = 1+6+internalVariables.size();
928  dataA.resize(n,n,false);
929  ierr = MatCreateSeqDense(PETSC_COMM_SELF,n,n,&dataA(0,0),&A); CHKERRQ(ierr);
930  ierr = VecCreateSeq(PETSC_COMM_SELF,n,&R); CHKERRQ(ierr);
931  ierr = VecCreateSeq(PETSC_COMM_SELF,n,&Chi); CHKERRQ(ierr);
932  ierr = VecCreateSeq(PETSC_COMM_SELF,n,&dChi); CHKERRQ(ierr);
933  PetscFunctionReturn(0);
934 }
935 
937  PetscFunctionBegin;
938  ierr = MatDestroy(&A); CHKERRQ(ierr);
939  ierr = VecDestroy(&R); CHKERRQ(ierr);
940  ierr = VecDestroy(&Chi); CHKERRQ(ierr);
941  ierr = VecDestroy(&dChi); CHKERRQ(ierr);
942  PetscFunctionReturn(0);
943 }
944 
946  PetscFunctionBegin;
947  if(gG == 0) {
948  ierr = rEcordW(); CHKERRQ(ierr);
949  }
950  ierr = setActiveVariablesW(); CHKERRQ(ierr);
951  ierr = pLayW(); CHKERRQ(ierr);
952  if(gG == 0) {
953  ierr = rEcordY(); CHKERRQ(ierr);
954  ierr = rEcordH(); CHKERRQ(ierr);
955  }
956  ierr = setActiveVariablesYH(); CHKERRQ(ierr);
957  ierr = pLayY(); CHKERRQ(ierr);
958  ierr = pLayH(); CHKERRQ(ierr);
959  PetscFunctionReturn(0);
960 }
961 
963  PetscFunctionBegin;
964  // Residual
965  double *array;
966  ierr = VecGetArray(R,&array); CHKERRQ(ierr);
967  for(int ii = 0;ii<6;ii++) {
968  array[ii] = -plasticStrain[ii] + plasticStrain0[ii] + deltaGamma*partialHSigma[ii];
969  }
970  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
971  array[6+ii] = -internalVariables[ii] + internalVariables0[ii] + deltaGamma*partialHFlux[ii];
972  }
973  array[6+internalVariables.size()] = y;
974  ierr = VecRestoreArray(R,&array); CHKERRQ(ierr);
975  PetscFunctionReturn(0);
976 }
977 
979  PetscFunctionBegin;
980  // matrix A
981  ierr = MatZeroEntries(A); CHKERRQ(ierr);
982  // row 0
983  MatrixDouble a00 = prod(partial2HSigma,partialWStrainPlasticStrain);
984  MatrixDouble a01 = prod(partial2HSigmaFlux,D);
985  for(int ii = 0;ii<6;ii++) {
986  for(int jj = 0;jj<6;jj++) {
987  dataA(ii,jj) = deltaGamma*a00(ii,jj);
988  }
989  for(unsigned int jj = 0;jj<internalVariables.size();jj++) {
990  dataA(ii,6+jj) = deltaGamma*a01(ii,jj);
991  }
992  dataA(ii,ii) -= 1;
993  }
994  for(int ii = 0;ii<6;ii++) {
995  dataA(ii,6+internalVariables.size()) = partialHSigma[ii];
996  }
997  // row 1
998  MatrixDouble a11 = prod(partial2HFlux,D);
999  MatrixDouble a10 = prod(trans(partial2HSigmaFlux),partialWStrainPlasticStrain);
1000  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
1001  for(int jj = 0;jj<6;jj++) {
1002  dataA(6+ii,jj) += deltaGamma*a10(ii,jj);
1003  }
1004  for(unsigned int jj = 0;jj<internalVariables.size();jj++) {
1005  dataA(6+ii,6+jj) += deltaGamma*a11(ii,jj);
1006  }
1007  dataA(6+ii,6+ii) -= 1;
1008  }
1009  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
1010  dataA(6+ii,6+internalVariables.size()) = partialHFlux[ii];
1011  }
1012  // row 3
1013  VectorDouble partial_y_sigma_c = prod(trans(partialWStrainPlasticStrain),partialYSigma);
1014  VectorDouble partial_y_flux_d = prod(trans(D),partialYFlux);
1015  for(unsigned int dd = 0;dd<partial_y_sigma_c.size();dd++) {
1016  dataA(6+internalVariables.size(),dd) = partial_y_sigma_c[dd];
1017  }
1018  for(unsigned int dd = 0;dd<partial_y_flux_d.size();dd++) {
1019  dataA(6+internalVariables.size(),6+dd) = partial_y_flux_d[dd];
1020  }
1021  dataA(6+internalVariables.size(),6+internalVariables.size()) = 0;
1022  ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
1023  ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
1024  PetscFunctionReturn(0);
1025 }
1026 
1028  PetscFunctionBegin;
1029  ierr = SNESCreate(PETSC_COMM_SELF,&sNes); CHKERRQ(ierr);
1030  ierr = SNESSetFunction(sNes,R,SmallStrainPlasticityfRes,(void*)this); CHKERRQ(ierr);
1031  ierr = SNESSetJacobian(sNes,A,A,SmallStrainPlasticityfJac,(void*)this); CHKERRQ(ierr);
1032  ierr = SNESGetKSP(sNes,&kSp); CHKERRQ(ierr);
1033  ierr = KSPGetPC(kSp,&pC); CHKERRQ(ierr);
1034  ierr = KSPSetType(kSp,KSPPREONLY); CHKERRQ(ierr);
1035  ierr = PCSetType(pC,PCLU); CHKERRQ(ierr);
1036  ierr = SNESSetTolerances(sNes,tOl,1e-12,0,20,1000); CHKERRQ(ierr);
1037  ierr = SNESGetLineSearch(sNes,&lineSearch); CHKERRQ(ierr); CHKERRQ(ierr);
1038  //ierr = SNESLineSearchSetType(lineSearch,SNESLINESEARCHBASIC); CHKERRQ(ierr);
1039  ierr = SNESLineSearchSetType(lineSearch,SNESLINESEARCHBT); CHKERRQ(ierr);
1040 
1041  PetscFunctionReturn(0);
1042 }
1043 
1045  PetscFunctionBegin;
1046  ierr = SNESDestroy(&sNes); CHKERRQ(ierr);
1047  PetscFunctionReturn(0);
1048 }
1049 
1051  PetscFunctionBegin;
1052  {
1053  double *array;
1054  ierr = VecGetArray(Chi,&array); CHKERRQ(ierr);
1055  for(int ii = 0;ii<6;ii++) {
1056  array[ii] = plasticStrain[ii];
1057  }
1058  int nb_internal_variables = internalVariables.size();
1059  for(unsigned int ii = 0;ii<nb_internal_variables;ii++) {
1060  array[6+ii] = internalVariables[ii];
1061  }
1062  deltaGamma = 0;
1063  ierr = VecRestoreArray(Chi,&array); CHKERRQ(ierr);
1064  }
1065  ierr = SNESSolve(sNes,PETSC_NULL,Chi); CHKERRQ(ierr);
1066  SNESConvergedReason reason;
1067  ierr = SNESGetConvergedReason(sNes,&reason); CHKERRQ(ierr);
1068  if(reason < 0) {
1069  int its;
1070  ierr = SNESGetIterationNumber(sNes,&its); CHKERRQ(ierr);
1071 // ierr = PetscPrintf(
1072 // PETSC_COMM_SELF,
1073 // "** WARNING Plasticity Closet Point Projection - number of Newton iterations = %D\n",
1074 // its
1075 // ); CHKERRQ(ierr);
1076  noalias(plasticStrain) = plasticStrain0;
1077  noalias(internalVariables) = internalVariables0;
1078  deltaGamma = 0;
1079  } else {
1080  double *array;
1081  ierr = VecGetArray(Chi,&array); CHKERRQ(ierr);
1082  for(int ii = 0;ii<6;ii++) {
1083  plasticStrain[ii] = array[ii];
1084  }
1085  int nb_internal_variables = internalVariables.size();
1086  for(unsigned int ii = 0;ii<nb_internal_variables;ii++) {
1087  internalVariables[ii] = array[6+ii];
1088  }
1089  deltaGamma = array[6+nb_internal_variables];
1090  ierr = VecRestoreArray(Chi,&array); CHKERRQ(ierr);
1091  }
1092  PetscFunctionReturn(0);
1093 }
1094 
1096  PetscFunctionBegin;
1097  ierr = evaluatePotentials(); CHKERRQ(ierr);
1098  ierr = cAlculateA(); CHKERRQ(ierr);
1099  Ep.resize(6,6,false);
1100  Lp.resize(internalVariables.size(),6,false);
1101  Yp.resize(6,false);
1102  MatrixDouble ep_row;
1103  ep_row = deltaGamma*prod(partial2HSigma,C);
1104  MatrixDouble alpha_row;
1105  alpha_row = deltaGamma*prod(trans(partial2HSigmaFlux),C);
1106  VectorDouble y_row;
1107  y_row = prod(trans(C),partialYSigma);
1108  const int n = 6+internalVariables.size();
1109  for(int dd = 0;dd<6;dd++) {
1110  ierr = VecZeroEntries(R); CHKERRQ(ierr);
1111  double *array;
1112  ierr = VecGetArray(R,&array); CHKERRQ(ierr);
1113  {
1114  for(int ii = 0;ii<6;ii++) {
1115  array[ii] = ep_row(ii,dd);
1116  }
1117  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
1118  array[6+ii] = alpha_row(ii,dd);
1119  }
1120  array[n] = y_row[dd];
1121  }
1122  ierr = VecRestoreArray(R,&array); CHKERRQ(ierr);
1123  ierr = VecAssemblyBegin(R); CHKERRQ(ierr);
1124  ierr = VecAssemblyEnd(R); CHKERRQ(ierr);
1125  ierr = KSPSolve(kSp,R,dChi); CHKERRQ(ierr);
1126  ierr = VecGetArray(dChi,&array); CHKERRQ(ierr);
1127  {
1128  for(int ii = 0;ii<6;ii++) {
1129  Ep(ii,dd) = array[ii];
1130  }
1131  for(unsigned int ii = 0;ii<internalVariables.size();ii++) {
1132  Lp(ii,dd) = array[6+ii];
1133  }
1134  Yp[dd] = array[n];
1135  }
1136  ierr = VecRestoreArray(dChi,&array); CHKERRQ(ierr);
1137  }
1138  Cp.resize(6,6,false);
1139  noalias(Cp) = prod(C,Ep);
1140  Cep.resize(6,6,false);
1141  noalias(Cep) = C+Cp;
1142  // cout << endl;
1143  // cout << "A " << dataA << endl;
1144  // cout << "C " << C << endl;
1145  // cout << "Ep " << Ep << endl;
1146  // // cout << "Lp " << Lp << endl;
1147  // // cout << "Yp " << Yp << endl;
1148  // cout << "Cp " << Cp << endl;
1149  // cout << "Cep " << Cep << endl;
1150  PetscFunctionReturn(0);
1151 }
1152 
1153 
1154 PetscErrorCode SmallStrainPlasticityfRes(SNES snes,Vec chi,Vec r,void *ctx) {
1155  PetscFunctionBegin;
1158 
1159  //ierr = VecView(chi,PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr);
1160  {
1161  #if PETSC_VERSION_GE(3,6,0)
1162  const double *array;
1163  ierr = VecGetArrayRead(chi,&array); CHKERRQ(ierr);
1164  #else
1165  const double *array;
1166  ierr = VecGetArray(chi,&array); CHKERRQ(ierr);
1167  #endif
1168  for(int ii = 0;ii<6;ii++) {
1169  cp->plasticStrain[ii] = array[ii];
1170  }
1171  for(unsigned int ii = 0;ii<cp->internalVariables.size();ii++) {
1172  cp->internalVariables[ii] = array[6+ii];
1173  }
1174  cp->deltaGamma = array[6+cp->internalVariables.size()];
1175  #if PETSC_VERSION_GE(3,6,0)
1176  ierr = VecRestoreArrayRead(chi,&array); CHKERRQ(ierr);
1177  #else
1178  ierr = VecRestoreArray(chi,&array); CHKERRQ(ierr);
1179  #endif
1180  }
1181  ierr = cp->evaluatePotentials(); CHKERRQ(ierr);
1182  ierr = cp->cAlculateR(r); CHKERRQ(ierr);
1183  // ierr = VecView(r,PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr);
1184  // cout << "sTress " << cp->sTress << endl;
1185  // cout << "internalVariables " << cp->internalVariables << endl;
1186  // cout << "C " << cp->C << endl;
1187  // cout << "D " << cp->D << endl;
1188  // cout << "y " << cp->y << endl;
1189  // cout << "h " << cp->h << endl;
1190  // cout << "partialYSigma " << cp->partialYSigma << endl;
1191  // cout << "partialYFlux " << cp->partialYFlux << endl;
1192  // cout << "partialHSigma " << cp->partialHSigma << endl;
1193  // cout << "partialHFlux " << cp->partialHFlux << endl;
1194  // cout << "partial2HSigma " << cp->partial2HSigma << endl;
1195  // cout << "partial2HFlux " << cp->partial2HFlux << endl;
1196  // cout << "partial2HSigmaFlux " << cp->partial2HSigmaFlux << endl;
1197  // cout << "C " << cp->C << endl;
1198  // cout << "D " << cp->D << endl;
1199  // cout << "partialWStrainPlasticStrain " << cp->partialWStrainPlasticStrain << endl;
1200  // cout << "plasticStrain " << cp->plasticStrain << endl;
1201  // cout << "internalVariables " << cp->internalVariables << endl;
1202  // cout << "delta plasticStrain " << cp->plasticStrain-cp->plasticStrain0 << endl;
1203  // cout << "delta internalVariables " << cp->internalVariables-cp->internalVariables << endl;
1204  PetscFunctionReturn(0);
1205 }
1206 
1207 PetscErrorCode SmallStrainPlasticityfJac(SNES snes,Vec chi,Mat A,Mat,void *ctx) {
1208  PetscFunctionBegin;
1211 
1212  {
1213  #if PETSC_VERSION_GE(3,6,0)
1214  const double *array;
1215  ierr = VecGetArrayRead(chi,&array); CHKERRQ(ierr);
1216  #else
1217  double *array;
1218  ierr = VecGetArray(chi,&array); CHKERRQ(ierr);
1219  #endif
1220  for(int ii = 0;ii<6;ii++) {
1221  cp->plasticStrain[ii] = array[ii];
1222  }
1223  for(unsigned int ii = 0;ii<cp->internalVariables.size();ii++) {
1224  cp->internalVariables[ii] = array[6+ii];
1225  }
1226  cp->deltaGamma = array[6+cp->internalVariables.size()];
1227  #if PETSC_VERSION_GE(3,6,0)
1228  ierr = VecRestoreArrayRead(chi,&array); CHKERRQ(ierr);
1229  #else
1230  ierr = VecRestoreArray(chi,&array); CHKERRQ(ierr);
1231  #endif
1232  }
1233  ierr = cp->evaluatePotentials(); CHKERRQ(ierr);
1234  ierr = cp->cAlculateA(); CHKERRQ(ierr);
1235  PetscFunctionReturn(0);
1236 }
MoFEM::K
VectorDouble K
Definition: Projection10NodeCoordsOnField.cpp:125
SmallStrainPlasticity::ClosestPointProjection::evaluatePotentials
virtual PetscErrorCode evaluatePotentials()
Definition: SmallStrainPlasticity.cpp:945
MoFEM::MatSetValues
MoFEMErrorCode MatSetValues(Mat M, const EntitiesFieldData::EntData &row_data, const EntitiesFieldData::EntData &col_data, const double *ptr, InsertMode iora)
Assemble PETSc matrix.
Definition: EntitiesFieldData.hpp:1631
PlasticOps::w
double w(double eqiv, double dot_tau, double f, double sigma_y, double sigma_Y)
Definition: PlasticOpsGeneric.hpp:276
EntityHandle
CHKERRQ_MOAB
#define CHKERRQ_MOAB(a)
check error code of MoAB function
Definition: definitions.h:454
SmallStrainPlasticity::CommonData::sTress
vector< VectorDouble > sTress
Definition: SmallStrainPlasticity.hpp:379
SmallStrainPlasticity::ClosestPointProjection::setActiveVariablesW
virtual PetscErrorCode setActiveVariablesW()
Definition: SmallStrainPlasticity.cpp:665
SmallStrainPlasticity::OpAssembleRhs::doWork
PetscErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
Definition: SmallStrainPlasticity.cpp:227
SmallStrainPlasticity::ClosestPointProjection::pLayH
virtual PetscErrorCode pLayH()
Definition: SmallStrainPlasticity.cpp:870
SmallStrainPlasticity::ClosestPointProjection::destroyMatAVecR
virtual PetscErrorCode destroyMatAVecR()
Definition: SmallStrainPlasticity.cpp:936
SmallStrainPlasticity::ClosestPointProjection::plasticStrain
VectorDouble plasticStrain
Definition: SmallStrainPlasticity.hpp:489
SmallStrainPlasticity::OpGetCommonDataAtGaussPts::OpGetCommonDataAtGaussPts
OpGetCommonDataAtGaussPts(const string field_name, CommonData &common_data)
Definition: SmallStrainPlasticity.cpp:110
SmallStrainPlasticity::ClosestPointProjection::rEcordH
virtual PetscErrorCode rEcordH()
Definition: SmallStrainPlasticity.cpp:740
SmallStrainPlasticity::CommonData::plasticStrainSize
int plasticStrainSize
Definition: SmallStrainPlasticity.hpp:387
MoFEM::Types::MatrixDouble
UBlasMatrix< double > MatrixDouble
Definition: Types.hpp:77
SmallStrainPlasticity::CommonData::deltaGamma
vector< double > deltaGamma
Definition: SmallStrainPlasticity.hpp:384
SmallStrainPlasticity::ClosestPointProjection
Closest point projection algorithm.
Definition: SmallStrainPlasticity.hpp:482
SmallStrainPlasticity::ClosestPointProjection::solveColasetProjection
PetscErrorCode solveColasetProjection()
Definition: SmallStrainPlasticity.cpp:1050
MoFEM.hpp
A
constexpr AssemblyType A
Definition: operators_tests.cpp:30
SmallStrainPlasticity::ClosestPointProjection::rEcordY
virtual PetscErrorCode rEcordY()
Definition: SmallStrainPlasticity.cpp:718
SmallStrainPlasticity::OpUpdate::OpUpdate
OpUpdate(string field_name, CommonData &common_data)
Definition: SmallStrainPlasticity.cpp:118
SmallStrainPlasticity::ClosestPointProjection::pLayY_NoGradient
virtual PetscErrorCode pLayY_NoGradient()
Definition: SmallStrainPlasticity.cpp:860
SmallStrainPlasticity::ClosestPointProjection::snesCreate
PetscErrorCode snesCreate()
Definition: SmallStrainPlasticity.cpp:1027
MoFEM::VecSetValues
MoFEMErrorCode VecSetValues(Vec V, const EntitiesFieldData::EntData &data, const double *ptr, InsertMode iora)
Assemble PETSc vector.
Definition: EntitiesFieldData.hpp:1576
sdf.r
int r
Definition: sdf.py:8
SmallStrainPlasticity::ClosestPointProjection::createMatAVecR
virtual PetscErrorCode createMatAVecR()
Definition: SmallStrainPlasticity.cpp:924
SmallStrainPlasticity::OpAssembleLhs::doWork
PetscErrorCode doWork(int row_side, int col_side, EntityType row_type, EntityType col_type, DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
Definition: SmallStrainPlasticity.cpp:311
SmallStrainPlasticity::CommonData::internalVariablesPtr
double * internalVariablesPtr
Definition: SmallStrainPlasticity.hpp:386
SmallStrainPlasticity::CommonData::internalVariablesSize
int internalVariablesSize
Definition: SmallStrainPlasticity.hpp:388
SmallStrainPlasticityfRes
PetscErrorCode SmallStrainPlasticityfRes(SNES snes, Vec chi, Vec r, void *ctx)
Definition: SmallStrainPlasticity.cpp:1154
SmallStrainPlasticity::CommonData::plasticStrain
vector< VectorDouble > plasticStrain
Definition: SmallStrainPlasticity.hpp:381
MoFEM::Exceptions::rval
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Exceptions.hpp:74
MoFEM::CoreInterface::get_moab
virtual moab::Interface & get_moab()=0
MoFEM
implementation of Data Operators for Forces and Sources
Definition: Common.hpp:10
R
@ R
Definition: free_surface.cpp:394
SmallStrainPlasticity::ClosestPointProjection::snesDestroy
PetscErrorCode snesDestroy()
Definition: SmallStrainPlasticity.cpp:1044
MoFEM::ForcesAndSourcesCore::UserDataOperator
Definition: ForcesAndSourcesCore.hpp:549
SmallStrainPlasticity::CommonData::gradAtGaussPts
map< string, vector< MatrixDouble > > gradAtGaussPts
Definition: SmallStrainPlasticity.hpp:378
convert.type
type
Definition: convert.py:64
SmallStrainPlasticity::CommonData::internalFluxes
vector< VectorDouble > internalFluxes
Definition: SmallStrainPlasticity.hpp:383
h
double h
Definition: photon_diffusion.cpp:60
SmallStrainPlasticity::OpGetDataAtGaussPts::OpGetDataAtGaussPts
OpGetDataAtGaussPts(const string field_name, vector< VectorDouble > &values_at_gauss_pts, vector< MatrixDouble > &gardient_at_gauss_pts)
Definition: SmallStrainPlasticity.cpp:48
SmallStrainPlasticity::commonData
CommonData commonData
Definition: SmallStrainPlasticity.hpp:394
SmallStrainPlasticity::OpAssembleLhs::OpAssembleLhs
OpAssembleLhs(string field_name, CommonData &common_data)
Definition: SmallStrainPlasticity.cpp:302
MOFEM_OPERATION_UNSUCCESSFUL
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition: definitions.h:34
SmallStrainPlasticity::CommonData::materialTangentOperator
vector< MatrixDouble > materialTangentOperator
Definition: SmallStrainPlasticity.hpp:380
SmallStrainPlasticity::ClosestPointProjection::rEcordW
virtual PetscErrorCode rEcordW()
Definition: SmallStrainPlasticity.cpp:692
MoFEM::Types::VectorAdaptor
VectorShallowArrayAdaptor< double > VectorAdaptor
Definition: Types.hpp:115
MoFEM::VolumeElementForcesAndSourcesCore
Volume finite element base.
Definition: VolumeElementForcesAndSourcesCore.hpp:26
SmallStrainPlasticity::MakeB::addVolumetricB
PetscErrorCode addVolumetricB(const MatrixAdaptor &diffN, MatrixDouble &volB, double alpha)
Definition: SmallStrainPlasticity.cpp:200
SmallStrainPlasticity::thPlasticStrain
Tag thPlasticStrain
Definition: SmallStrainPlasticity.hpp:327
SmallStrainPlasticity::OpAssembleRhs::OpAssembleRhs
OpAssembleRhs(string field_name, CommonData &common_data)
Definition: SmallStrainPlasticity.cpp:219
SmallStrainPlasticity.hpp
Operators and data structures for small strain plasticity.
EntData
EntitiesFieldData::EntData EntData
Definition: child_and_parent.cpp:37
field_name
constexpr auto field_name
Definition: poisson_2d_homogeneous.cpp:13
convert.n
n
Definition: convert.py:82
SmallStrainPlasticity::ClosestPointProjection::internalVariables
VectorDouble internalVariables
Definition: SmallStrainPlasticity.hpp:486
N
const int N
Definition: speed_test.cpp:3
SmallStrainPlasticity::CommonData::plasticStrainPtr
double * plasticStrainPtr
Definition: SmallStrainPlasticity.hpp:385
v
const double v
phase velocity of light in medium (cm/ns)
Definition: initial_diffusion.cpp:40
SmallStrainPlasticity::CommonData
common data used by volume elements
Definition: SmallStrainPlasticity.hpp:376
FTensor::dd
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
SmallStrainPlasticity::OpCalculateStress::getTags
PetscErrorCode getTags()
Definition: SmallStrainPlasticity.cpp:432
SmallStrainPlasticityfJac
PetscErrorCode SmallStrainPlasticityfJac(SNES snes, Vec chi, Mat A, Mat, void *ctx)
Definition: SmallStrainPlasticity.cpp:1207
SmallStrainPlasticity::ClosestPointProjection::pLayW
virtual PetscErrorCode pLayW()
Definition: SmallStrainPlasticity.cpp:762
SmallStrainPlasticity::ClosestPointProjection::pLayW_NoHessian
virtual PetscErrorCode pLayW_NoHessian()
Definition: SmallStrainPlasticity.cpp:813
MoFEM::Exceptions::ierr
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Exceptions.hpp:76
SmallStrainPlasticity::createInternalVariablesTag
PetscErrorCode createInternalVariablesTag()
Definition: SmallStrainPlasticity.cpp:34
EigenMatrix::Vec
const FTensor::Tensor2< T, Dim, Dim > Vec
Definition: MatrixFunction.hpp:66
SmallStrainPlasticity::ClosestPointProjection::cAlculateR
virtual PetscErrorCode cAlculateR(Vec R)
Definition: SmallStrainPlasticity.cpp:962
SmallStrainPlasticity::mField
MoFEM::Interface & mField
Definition: SmallStrainPlasticity.hpp:325
SmallStrainPlasticity::thInternalVariables
Tag thInternalVariables
Definition: SmallStrainPlasticity.hpp:328
SmallStrainPlasticity::OpGetDataAtGaussPts::doWork
PetscErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
operator calculating field data and gradients
Definition: SmallStrainPlasticity.cpp:58
SmallStrainPlasticity::ClosestPointProjection::setActiveVariablesYH
virtual PetscErrorCode setActiveVariablesYH()
Definition: SmallStrainPlasticity.cpp:680
MoFEM::Types::VectorDouble
UBlasVector< double > VectorDouble
Definition: Types.hpp:68
SmallStrainPlasticity::OpCalculateStress::setTagsData
PetscErrorCode setTagsData(const EntityHandle tet, const int nb_gauss_pts, const int nb_internal_variables)
Definition: SmallStrainPlasticity.cpp:444
SmallStrainPlasticity::OpGetDataAtGaussPts
Definition: SmallStrainPlasticity.hpp:396
ReactionDiffusionEquation::D
const double D
diffusivity
Definition: reaction_diffusion.cpp:20
MoFEM::Types::MatrixAdaptor
MatrixShallowArrayAdaptor< double > MatrixAdaptor
Matrix adaptor.
Definition: Types.hpp:132
SmallStrainPlasticity::CommonData::bBar
bool bBar
Definition: SmallStrainPlasticity.hpp:389
SmallStrainPlasticity::ClosestPointProjection::deltaGamma
double deltaGamma
Definition: SmallStrainPlasticity.hpp:490
SmallStrainPlasticity::ClosestPointProjection::consistentTangent
PetscErrorCode consistentTangent()
Definition: SmallStrainPlasticity.cpp:1095
SmallStrainPlasticity::ClosestPointProjection::pLayY
virtual PetscErrorCode pLayY()
Definition: SmallStrainPlasticity.cpp:837
SmallStrainPlasticity::MakeB::makeB
PetscErrorCode makeB(const MatrixAdaptor &diffN, MatrixDouble &B)
Definition: SmallStrainPlasticity.cpp:172
SmallStrainPlasticity::ClosestPointProjection::cAlculateA
virtual PetscErrorCode cAlculateA()
Definition: SmallStrainPlasticity.cpp:978
SmallStrainPlasticity::CommonData::internalVariables
vector< VectorDouble > internalVariables
Definition: SmallStrainPlasticity.hpp:382
SmallStrainPlasticity::OpUpdate::doWork
PetscErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
Definition: SmallStrainPlasticity.cpp:126
SmallStrainPlasticity::OpCalculateStress::doWork
PetscErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
Definition: SmallStrainPlasticity.cpp:489