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>
31#include <adolc/adolc.h>
38 "PLASTIC_STRAIN",def_length,MB_TYPE_DOUBLE,
42 "INTERNAL_VARIABLES",def_length,MB_TYPE_DOUBLE,
45 PetscFunctionReturn(0);
49 vector<VectorDouble > &values_at_gauss_pts,
50 vector<MatrixDouble > &gardient_at_gauss_pts
53valuesAtGaussPts(values_at_gauss_pts),
54gradientAtGaussPts(gardient_at_gauss_pts),
59 int side,
EntityType type,DataForcesAndSourcesCore::EntData &data
63 int nb_dofs = data.getFieldData().size();
65 PetscFunctionReturn(0);
67 int nb_gauss_pts = data.getN().size1();
68 int rank = data.getFieldDofs()[0]->getNbOfCoeffs();
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();
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];
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;
102 }
catch (
const std::exception& ex) {
104 ss <<
"throw in method: " << ex.what() << endl;
105 SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
107 PetscFunctionReturn(0);
127 int side,
EntityType type,DataForcesAndSourcesCore::EntData &data
133 if(type != MBVERTEX) PetscFunctionReturn(0);
135 int nb_dofs = data.getFieldData().size();
136 if(nb_dofs==0) PetscFunctionReturn(0);
137 int nb_gauss_pts = data.getN().size1();
139 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
148 nb_internal_variables,
149 ublas::shallow_array_adaptor<double>(
163 }
catch (
const std::exception& ex) {
165 ss <<
"throw in method: " << ex.what() << endl;
166 SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
169 PetscFunctionReturn(0);
174 unsigned int nb_dofs = diffN.size1();
175 if(
B.size2()!=3*nb_dofs) {
176 B.resize(6,3*nb_dofs,
false);
179 for(
int dd = 0;dd<nb_dofs;dd++) {
180 const double diff[] = {
181 diffN(dd,0), diffN(dd,1), diffN(dd,2)
183 const int dd3 = 3*dd;
184 for(
int rr = 0;rr<3;rr++) {
185 B(rr,dd3+rr) = diff[rr];
188 B(3,dd3+0) = diff[1];
189 B(3,dd3+1) = diff[0];
191 B(4,dd3+1) = diff[2];
192 B(4,dd3+2) = diff[1];
194 B(5,dd3+0) = diff[2];
195 B(5,dd3+2) = diff[0];
197 PetscFunctionReturn(0);
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)
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.;
216 PetscFunctionReturn(0);
228 int side,
EntityType type,DataForcesAndSourcesCore::EntData &data
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);
242 volB.resize(6,nb_dofs,
false);
244 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
245 double val = getVolume()*getGaussPts()(3,gg);
248 ierr = addVolumetricB(diffN,volB,val); CHKERRQ(
ierr);
253 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
255 double val = getVolume()*getGaussPts()(3,gg);
259 ierr = addVolumetricB(diffN,
B,-1); CHKERRQ(
ierr);
276 indices_ptr = &data.getIndices()[0];
279 getFEMethod()->snes_f,
287 }
catch (
const std::exception& ex) {
289 ss <<
"throw in method: " << ex.what() << endl;
290 SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
293 PetscFunctionReturn(0);
306 int row_side,
int col_side,
308 DataForcesAndSourcesCore::EntData &row_data,
309 DataForcesAndSourcesCore::EntData &col_data
314 int nb_dofs_row = row_data.getFieldData().size();
315 if(nb_dofs_row==0) PetscFunctionReturn(0);
316 int nb_dofs_col = col_data.getFieldData().size();
317 if(nb_dofs_col==0) PetscFunctionReturn(0);
319 K.resize(nb_dofs_row,nb_dofs_col,
false);
322 int nb_gauss_pts = row_data.getN().size1();
326 rowVolB.resize(6,nb_dofs_row,
false);
328 colVolB.resize(6,nb_dofs_col,
false);
330 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
331 double val = getVolume()*getGaussPts()(3,gg);
333 const MatrixAdaptor &diffN_row = row_data.getDiffN(gg,nb_dofs_row/3);
334 const MatrixAdaptor &diffN_col = col_data.getDiffN(gg,nb_dofs_col/3);
335 ierr = addVolumetricB(diffN_row,rowVolB,val); CHKERRQ(
ierr);
336 ierr = addVolumetricB(diffN_col,colVolB,val); CHKERRQ(
ierr);
342 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
344 double val = getVolume()*getGaussPts()(3,gg);
346 const MatrixAdaptor &diffN_row = row_data.getDiffN(gg,nb_dofs_row/3);
347 const MatrixAdaptor &diffN_col = col_data.getDiffN(gg,nb_dofs_col/3);
348 ierr = makeB(diffN_row,rowB); CHKERRQ(
ierr);
349 ierr = makeB(diffN_col,colB); CHKERRQ(
ierr);
351 ierr = addVolumetricB(diffN_row,rowB,-1); CHKERRQ(
ierr);
352 ierr = addVolumetricB(diffN_col,colB,-1); CHKERRQ(
ierr);
357 CB.resize(6,nb_dofs_col,
false);
359 CblasRowMajor,CblasNoTrans,CblasNoTrans,
363 &colB(0,0),nb_dofs_col,
368 CblasRowMajor,CblasTrans,CblasNoTrans,
369 nb_dofs_row,nb_dofs_col,6,
371 &rowB(0,0),nb_dofs_row,
372 &CB(0,0),nb_dofs_col,
387 int *row_indices_ptr,*col_indices_ptr;
388 row_indices_ptr = &row_data.getIndices()[0];
389 col_indices_ptr = &col_data.getIndices()[0];
392 getFEMethod()->snes_B,
393 nb_dofs_row,row_indices_ptr,
394 nb_dofs_col,col_indices_ptr,
399 if(row_side != col_side || row_type != col_type) {
401 transK.resize(nb_dofs_col,nb_dofs_row,
false);
402 noalias(transK) = trans(
K);
404 getFEMethod()->snes_B,
405 nb_dofs_col,col_indices_ptr,
406 nb_dofs_row,row_indices_ptr,
407 &transK(0,0),ADD_VALUES
412 }
catch (
const std::exception& ex) {
414 ss <<
"throw in method: " << ex.what() << endl;
415 SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
417 PetscFunctionReturn(0);
429 PetscFunctionReturn(0);
433 const EntityHandle tet,
const int nb_gauss_pts,
const int nb_internal_variables
443 v.resize(6*nb_gauss_pts,
false);
446 tag_size[0] =
v.size();
447 void const* tag_data[] = { &
v[0] };
456 if(nb_internal_variables>0) {
461 v.resize(nb_internal_variables*nb_gauss_pts,
false);
464 tag_size[0] =
v.size();
465 void const* tag_data[] = { &
v[0] };
474 PetscFunctionReturn(0);
478 int side,
EntityType type,DataForcesAndSourcesCore::EntData &data
485 if(type != MBVERTEX) PetscFunctionReturn(0);
487 int nb_dofs = data.getFieldData().size();
488 if(nb_dofs==0) PetscFunctionReturn(0);
490 int nb_gauss_pts = data.getN().size1();
491 int nb_internal_variables = cP.internalVariables.size();
495 EntityHandle tet = getNumeredEntFiniteElementPtr()->getEnt();
496 ierr = setTagsData(tet,nb_gauss_pts,nb_internal_variables); CHKERRQ(
ierr);
506 double ave_tr_strain = 0;
509 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
510 double val = getVolume()*getGaussPts()(3,gg);
512 for(
int ii = 0;ii<3;ii++) {
521 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
527 nb_internal_variables,
528 ublas::shallow_array_adaptor<double>(
533 cP.sTrain.resize(6,
false);
535 double tr_strain = 0;
536 for(
int ii = 0;ii<3;ii++) {
538 tr_strain += cP.sTrain[ii]/3;
541 for(
int ii = 0;ii<3;ii++) {
542 cP.sTrain[ii] += ave_tr_strain-tr_strain;
560 cP.plasticStrain0.resize(6,
false);
561 noalias(cP.plasticStrain0) = plastic_strain;
562 cP.internalVariables0.resize(nb_internal_variables,
false);
563 noalias(cP.internalVariables0) = internal_variables;
564 cP.plasticStrain.resize(6,
false);
565 noalias(cP.plasticStrain) = plastic_strain;
566 cP.internalVariables.resize(nb_internal_variables,
false);
567 noalias(cP.internalVariables) = internal_variables;
575 ierr = cP.evaluatePotentials(); CHKERRQ(
ierr);
578 ierr = cP.setActiveVariablesW(); CHKERRQ(
ierr);
580 getFEMethod()->snes_ctx ==
582 (!isLinear || !hessianWCalculated)
585 hessianWCalculated =
true;
587 ierr = cP.pLayW_NoHessian(); CHKERRQ(
ierr);
589 ierr = cP.setActiveVariablesYH(); CHKERRQ(
ierr);
590 ierr = cP.pLayY_NoGradient(); CHKERRQ(
ierr);
601 ierr = cP.solveColasetProjection(); CHKERRQ(
ierr);
618 ierr = SNESGetIterationNumber(getFEMethod()->snes,&iter); CHKERRQ(
ierr);
620 if(iter>0 && cP.deltaGamma>0) {
621 ierr = cP.consistentTangent(); CHKERRQ(
ierr);
630 ierr = SNESGetIterationNumber(getFEMethod()->snes,&iter); CHKERRQ(
ierr);
632 ierr = SNESSetLagJacobian(getFEMethod()->snes,1); CHKERRQ(
ierr);
641 }
catch (
const std::exception& ex) {
643 ss <<
"throw in method: " << ex.what() << endl;
644 SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
647 PetscFunctionReturn(0);
652 activeVariablesW.resize(12+internalVariables.size(),
false);
653 for(
int ii = 0;ii<6;ii++) {
654 activeVariablesW[ii] = sTrain[ii];
656 for(
int ii = 0;ii<6;ii++) {
657 activeVariablesW[6+ii] = plasticStrain[ii];
659 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
660 activeVariablesW[12+ii] = internalVariables[ii];
662 PetscFunctionReturn(0);
667 activeVariablesYH.resize(6+internalVariables.size(),
false);
668 for(
int ii = 0;ii<6;ii++) {
669 activeVariablesYH[ii] = sTress[ii];
671 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
672 activeVariablesYH[6+ii] = internalFluxes[ii];
674 PetscFunctionReturn(0);
682 a_sTrain.resize(6,
false);
683 for(
int ii = 0;ii<6;ii++) {
684 a_sTrain[ii] <<= sTrain[ii];
686 a_plasticStrain.resize(6,
false);
687 for(
int ii = 0;ii<6;ii++) {
688 a_plasticStrain[ii] <<= plasticStrain[ii];
690 a_internalVariables.resize(internalVariables.size(),
false);
691 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
692 a_internalVariables[ii] <<= internalVariables[ii];
695 ierr = freeHemholtzEnergy(); CHKERRQ(
ierr);
700 PetscFunctionReturn(0);
708 a_sTress.resize(6,
false);
709 for(
int ii = 0;ii<6;ii++) {
710 a_sTress[ii] <<= sTress[ii];
712 a_internalFluxes.resize(internalVariables.size(),
false);
713 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
714 a_internalFluxes[ii] <<= internalFluxes[ii];
717 ierr = yieldFunction(); CHKERRQ(
ierr);
722 PetscFunctionReturn(0);
730 a_sTress.resize(6,
false);
731 for(
int ii = 0;ii<6;ii++) {
732 a_sTress[ii] <<= sTress[ii];
734 a_internalFluxes.resize(internalVariables.size(),
false);
735 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
736 a_internalFluxes[ii] <<= internalFluxes[ii];
739 ierr = flowPotential(); CHKERRQ(
ierr);
744 PetscFunctionReturn(0);
750 int adloc_return_value = 0;
751 r = ::function(tAgs[0],1,activeVariablesW.size(),&activeVariablesW[0],&w);
752 if(r<adloc_return_value) {
755 gradientW.resize(activeVariablesW.size(),
false);
756 r = gradient(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&gradientW[0]);
757 if(r<adloc_return_value) {
760 hessianW.resize(activeVariablesW.size(),activeVariablesW.size(),
false);
762 vector<double*> hessian_w(activeVariablesW.size());
763 for(
unsigned int dd = 0;dd<activeVariablesW.size();dd++) {
764 hessian_w[dd] = &hessianW(dd,0);
766 r = hessian(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&hessian_w[0]);
767 if(r<adloc_return_value) {
770 sTress =
VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientW[0]));
772 internalVariables.size(),
773 ublas::shallow_array_adaptor<double>(
774 internalVariables.size(),
779 for(
int ii = 0;ii<6;ii++) {
780 for(
int jj = 0;jj<=ii;jj++) {
781 C(ii,jj) = hessianW(ii,jj);
784 partialWStrainPlasticStrain.resize(6,6,
false);
785 for(
int ii = 0;ii<6;ii++) {
786 for(
int jj = 0;jj<6;jj++) {
787 partialWStrainPlasticStrain(ii,jj) = hessianW(6+jj,ii);
790 D.resize(internalVariables.size(),internalVariables.size(),
false);
791 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
792 for(
unsigned int jj = 0;jj<=ii;jj++) {
793 D(ii,jj) = hessianW(12+ii,12+jj);
796 PetscFunctionReturn(0);
801 int adloc_return_value = 0;
802 r = ::function(tAgs[0],1,activeVariablesW.size(),&activeVariablesW[0],&w);
803 if(r<adloc_return_value) {
806 gradientW.resize(activeVariablesW.size(),
false);
807 r = gradient(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&gradientW[0]);
808 if(r<adloc_return_value) {
811 sTress =
VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientW[0]));
813 internalVariables.size(),
814 ublas::shallow_array_adaptor<double>(
815 internalVariables.size(),
819 PetscFunctionReturn(0);
825 int adloc_return_value = 0;
826 r = ::function(tAgs[1],1,activeVariablesYH.size(),&activeVariablesYH[0],&y);
827 if(r<adloc_return_value) {
830 gradientY.resize(activeVariablesYH.size());
831 r = gradient(tAgs[1],activeVariablesYH.size(),&activeVariablesYH[0],&gradientY[0]);
832 if(r<adloc_return_value) {
835 partialYSigma =
VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientY[0]));
837 internalVariables.size(),
838 ublas::shallow_array_adaptor<double>(
839 internalVariables.size(),
843 PetscFunctionReturn(0);
848 int adloc_return_value = 0;
849 r = ::function(tAgs[1],1,activeVariablesYH.size(),&activeVariablesYH[0],&y);
850 if(r<adloc_return_value) {
853 PetscFunctionReturn(0);
858 int adloc_return_value = 0;
859 r = ::function(tAgs[2],1,activeVariablesYH.size(),&activeVariablesYH[0],&
h);
860 if(r<adloc_return_value) {
863 gradientH.resize(activeVariablesYH.size());
864 r = gradient(tAgs[2],activeVariablesYH.size(),&activeVariablesYH[0],&gradientH[0]);
865 if(r<adloc_return_value) {
868 hessianH.resize(6+internalVariables.size(),6+internalVariables.size(),
false);
870 vector<double*> hessian_h(activeVariablesYH.size());
871 for(
int dd = 0;dd<activeVariablesYH.size();dd++) {
872 hessian_h[dd] = &hessianH(dd,0);
874 r = hessian(tAgs[2],activeVariablesYH.size(),&activeVariablesYH[0],&hessian_h[0]);
875 if(r<adloc_return_value) {
878 partialHSigma =
VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientH[0]));
880 internalVariables.size(),
881 ublas::shallow_array_adaptor<double>(
882 internalVariables.size(),
887 partial2HSigma.resize(6,6,
false);
888 for(
int ii = 0;ii<6;ii++) {
889 for(
int jj = 0;jj<=ii;jj++) {
890 partial2HSigma(ii,jj) = hessianH(ii,jj);
893 partial2HFlux.resize(internalVariables.size(),internalVariables.size(),
false);
894 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
895 for(
unsigned int jj = 0;jj<=ii;jj++) {
896 partial2HFlux(ii,jj) = -hessianH(6+ii,6+jj);
899 partial2HSigmaFlux.resize(6,internalVariables.size(),
false);
900 partial2HSigmaFlux.clear();
901 for(
int ii = 0;ii<6;ii++) {
902 for(
unsigned int jj = 0;jj<internalVariables.size();jj++) {
903 partial2HSigmaFlux(ii,jj) = -hessianH(6+jj,ii);
906 PetscFunctionReturn(0);
912 n = 1+6+internalVariables.size();
913 dataA.resize(
n,
n,
false);
914 ierr = MatCreateSeqDense(PETSC_COMM_SELF,
n,
n,&dataA(0,0),&
A); CHKERRQ(
ierr);
915 ierr = VecCreateSeq(PETSC_COMM_SELF,
n,&
R); CHKERRQ(
ierr);
916 ierr = VecCreateSeq(PETSC_COMM_SELF,
n,&Chi); CHKERRQ(
ierr);
917 ierr = VecCreateSeq(PETSC_COMM_SELF,
n,&dChi); CHKERRQ(
ierr);
918 PetscFunctionReturn(0);
925 ierr = VecDestroy(&Chi); CHKERRQ(
ierr);
926 ierr = VecDestroy(&dChi); CHKERRQ(
ierr);
927 PetscFunctionReturn(0);
935 ierr = setActiveVariablesW(); CHKERRQ(
ierr);
941 ierr = setActiveVariablesYH(); CHKERRQ(
ierr);
944 PetscFunctionReturn(0);
951 ierr = VecGetArray(
R,&array); CHKERRQ(
ierr);
952 for(
int ii = 0;ii<6;ii++) {
953 array[ii] = -plasticStrain[ii] + plasticStrain0[ii] + deltaGamma*partialHSigma[ii];
955 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
956 array[6+ii] = -internalVariables[ii] + internalVariables0[ii] + deltaGamma*partialHFlux[ii];
958 array[6+internalVariables.size()] = y;
959 ierr = VecRestoreArray(
R,&array); CHKERRQ(
ierr);
960 PetscFunctionReturn(0);
968 MatrixDouble a00 = prod(partial2HSigma,partialWStrainPlasticStrain);
970 for(
int ii = 0;ii<6;ii++) {
971 for(
int jj = 0;jj<6;jj++) {
972 dataA(ii,jj) = deltaGamma*a00(ii,jj);
974 for(
unsigned int jj = 0;jj<internalVariables.size();jj++) {
975 dataA(ii,6+jj) = deltaGamma*a01(ii,jj);
979 for(
int ii = 0;ii<6;ii++) {
980 dataA(ii,6+internalVariables.size()) = partialHSigma[ii];
984 MatrixDouble a10 = prod(trans(partial2HSigmaFlux),partialWStrainPlasticStrain);
985 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
986 for(
int jj = 0;jj<6;jj++) {
987 dataA(6+ii,jj) += deltaGamma*a10(ii,jj);
989 for(
unsigned int jj = 0;jj<internalVariables.size();jj++) {
990 dataA(6+ii,6+jj) += deltaGamma*a11(ii,jj);
992 dataA(6+ii,6+ii) -= 1;
994 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
995 dataA(6+ii,6+internalVariables.size()) = partialHFlux[ii];
998 VectorDouble partial_y_sigma_c = prod(trans(partialWStrainPlasticStrain),partialYSigma);
1000 for(
unsigned int dd = 0;dd<partial_y_sigma_c.size();dd++) {
1001 dataA(6+internalVariables.size(),dd) = partial_y_sigma_c[dd];
1003 for(
unsigned int dd = 0;dd<partial_y_flux_d.size();dd++) {
1004 dataA(6+internalVariables.size(),6+dd) = partial_y_flux_d[dd];
1006 dataA(6+internalVariables.size(),6+internalVariables.size()) = 0;
1007 ierr = MatAssemblyBegin(
A,MAT_FINAL_ASSEMBLY); CHKERRQ(
ierr);
1008 ierr = MatAssemblyEnd(
A,MAT_FINAL_ASSEMBLY); CHKERRQ(
ierr);
1009 PetscFunctionReturn(0);
1014 ierr = SNESCreate(PETSC_COMM_SELF,&sNes); CHKERRQ(
ierr);
1017 ierr = SNESGetKSP(sNes,&kSp); CHKERRQ(
ierr);
1018 ierr = KSPGetPC(kSp,&pC); CHKERRQ(
ierr);
1019 ierr = KSPSetType(kSp,KSPPREONLY); CHKERRQ(
ierr);
1020 ierr = PCSetType(pC,PCLU); CHKERRQ(
ierr);
1021 ierr = SNESSetTolerances(sNes,tOl,1e-12,0,20,1000); CHKERRQ(
ierr);
1022 ierr = SNESGetLineSearch(sNes,&lineSearch); CHKERRQ(
ierr); CHKERRQ(
ierr);
1024 ierr = SNESLineSearchSetType(lineSearch,SNESLINESEARCHBT); CHKERRQ(
ierr);
1026 PetscFunctionReturn(0);
1031 ierr = SNESDestroy(&sNes); CHKERRQ(
ierr);
1032 PetscFunctionReturn(0);
1039 ierr = VecGetArray(Chi,&array); CHKERRQ(
ierr);
1040 for(
int ii = 0;ii<6;ii++) {
1041 array[ii] = plasticStrain[ii];
1043 int nb_internal_variables = internalVariables.size();
1044 for(
unsigned int ii = 0;ii<nb_internal_variables;ii++) {
1045 array[6+ii] = internalVariables[ii];
1048 ierr = VecRestoreArray(Chi,&array); CHKERRQ(
ierr);
1050 ierr = SNESSolve(sNes,PETSC_NULL,Chi); CHKERRQ(
ierr);
1051 SNESConvergedReason reason;
1052 ierr = SNESGetConvergedReason(sNes,&reason); CHKERRQ(
ierr);
1055 ierr = SNESGetIterationNumber(sNes,&its); CHKERRQ(
ierr);
1061 noalias(plasticStrain) = plasticStrain0;
1062 noalias(internalVariables) = internalVariables0;
1066 ierr = VecGetArray(Chi,&array); CHKERRQ(
ierr);
1067 for(
int ii = 0;ii<6;ii++) {
1068 plasticStrain[ii] = array[ii];
1070 int nb_internal_variables = internalVariables.size();
1071 for(
unsigned int ii = 0;ii<nb_internal_variables;ii++) {
1072 internalVariables[ii] = array[6+ii];
1074 deltaGamma = array[6+nb_internal_variables];
1075 ierr = VecRestoreArray(Chi,&array); CHKERRQ(
ierr);
1077 PetscFunctionReturn(0);
1082 ierr = evaluatePotentials(); CHKERRQ(
ierr);
1083 ierr = cAlculateA(); CHKERRQ(
ierr);
1084 Ep.resize(6,6,
false);
1085 Lp.resize(internalVariables.size(),6,
false);
1088 ep_row = deltaGamma*prod(partial2HSigma,C);
1090 alpha_row = deltaGamma*prod(trans(partial2HSigmaFlux),C);
1092 y_row = prod(trans(C),partialYSigma);
1093 const int n = 6+internalVariables.size();
1094 for(
int dd = 0;dd<6;dd++) {
1095 ierr = VecZeroEntries(
R); CHKERRQ(
ierr);
1097 ierr = VecGetArray(
R,&array); CHKERRQ(
ierr);
1099 for(
int ii = 0;ii<6;ii++) {
1100 array[ii] = ep_row(ii,dd);
1102 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
1103 array[6+ii] = alpha_row(ii,dd);
1105 array[
n] = y_row[dd];
1107 ierr = VecRestoreArray(
R,&array); CHKERRQ(
ierr);
1108 ierr = VecAssemblyBegin(
R); CHKERRQ(
ierr);
1109 ierr = VecAssemblyEnd(
R); CHKERRQ(
ierr);
1110 ierr = KSPSolve(kSp,
R,dChi); CHKERRQ(
ierr);
1111 ierr = VecGetArray(dChi,&array); CHKERRQ(
ierr);
1113 for(
int ii = 0;ii<6;ii++) {
1114 Ep(ii,dd) = array[ii];
1116 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
1117 Lp(ii,dd) = array[6+ii];
1121 ierr = VecRestoreArray(dChi,&array); CHKERRQ(
ierr);
1123 Cp.resize(6,6,
false);
1124 noalias(Cp) = prod(C,Ep);
1125 Cep.resize(6,6,
false);
1126 noalias(Cep) = C+Cp;
1135 PetscFunctionReturn(0);
1146 #if PETSC_VERSION_GE(3,6,0)
1147 const double *array;
1148 ierr = VecGetArrayRead(chi,&array); CHKERRQ(
ierr);
1150 const double *array;
1151 ierr = VecGetArray(chi,&array); CHKERRQ(
ierr);
1153 for(
int ii = 0;ii<6;ii++) {
1160 #if PETSC_VERSION_GE(3,6,0)
1161 ierr = VecRestoreArrayRead(chi,&array); CHKERRQ(
ierr);
1163 ierr = VecRestoreArray(chi,&array); CHKERRQ(
ierr);
1189 PetscFunctionReturn(0);
1198 #if PETSC_VERSION_GE(3,6,0)
1199 const double *array;
1200 ierr = VecGetArrayRead(chi,&array); CHKERRQ(
ierr);
1203 ierr = VecGetArray(chi,&array); CHKERRQ(
ierr);
1205 for(
int ii = 0;ii<6;ii++) {
1212 #if PETSC_VERSION_GE(3,6,0)
1213 ierr = VecRestoreArrayRead(chi,&array); CHKERRQ(
ierr);
1215 ierr = VecRestoreArray(chi,&array); CHKERRQ(
ierr);
1220 PetscFunctionReturn(0);
ForcesAndSourcesCore::UserDataOperator UserDataOperator
Operators and data structures for small strain plasticity.
PetscErrorCode SmallStrainPlasticityfJac(SNES, Vec, Mat, Mat, void *ctx)
PetscErrorCode SmallStrainPlasticityfRes(SNES snes, Vec chi, Vec r, void *ctx)
#define CHKERRQ_MOAB(a)
check error code of MoAB function
@ MOFEM_OPERATION_UNSUCCESSFUL
FTensor::Index< 'n', SPACE_DIM > n
const double v
phase velocity of light in medium (cm/ns)
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
VectorShallowArrayAdaptor< double > VectorAdaptor
MatrixShallowArrayAdaptor< double > MatrixAdaptor
Matrix adaptor.
implementation of Data Operators for Forces and Sources
MoFEMErrorCode MatSetValues(Mat M, const EntitiesFieldData::EntData &row_data, const EntitiesFieldData::EntData &col_data, const double *ptr, InsertMode iora)
Assemble PETSc matrix.
MoFEMErrorCode VecSetValues(Vec V, const EntitiesFieldData::EntData &data, const double *ptr, InsertMode iora)
Assemble PETSc vector.
constexpr auto field_name
virtual moab::Interface & get_moab()=0
Volume finite element base.
Closest point projection algorithm.
virtual PetscErrorCode cAlculateA()
virtual PetscErrorCode pLayY_NoGradient()
PetscErrorCode consistentTangent()
virtual PetscErrorCode evaluatePotentials()
virtual PetscErrorCode pLayH()
PetscErrorCode snesCreate()
VectorDouble plasticStrain
virtual PetscErrorCode createMatAVecR()
virtual PetscErrorCode pLayY()
virtual PetscErrorCode pLayW_NoHessian()
virtual PetscErrorCode destroyMatAVecR()
virtual PetscErrorCode pLayW()
PetscErrorCode solveColasetProjection()
virtual PetscErrorCode rEcordW()
virtual PetscErrorCode rEcordH()
VectorDouble internalVariables
virtual PetscErrorCode setActiveVariablesW()
virtual PetscErrorCode cAlculateR(Vec R)
virtual PetscErrorCode rEcordY()
PetscErrorCode snesDestroy()
virtual PetscErrorCode setActiveVariablesYH()
common data used by volume elements
vector< VectorDouble > plasticStrain
vector< double > deltaGamma
map< string, vector< MatrixDouble > > gradAtGaussPts
double * plasticStrainPtr
vector< VectorDouble > internalVariables
vector< VectorDouble > internalFluxes
vector< VectorDouble > sTress
double * internalVariablesPtr
vector< MatrixDouble > materialTangentOperator
int internalVariablesSize
PetscErrorCode makeB(const MatrixAdaptor &diffN, MatrixDouble &B)
PetscErrorCode addVolumetricB(const MatrixAdaptor &diffN, MatrixDouble &volB, double alpha)
PetscErrorCode doWork(int row_side, int col_side, EntityType row_type, EntityType col_type, DataForcesAndSourcesCore::EntData &row_data, DataForcesAndSourcesCore::EntData &col_data)
OpAssembleLhs(string field_name, CommonData &common_data)
OpAssembleRhs(string field_name, CommonData &common_data)
PetscErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
PetscErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
PetscErrorCode setTagsData(const EntityHandle tet, const int nb_gauss_pts, const int nb_internal_variables)
OpGetCommonDataAtGaussPts(const string field_name, CommonData &common_data)
OpGetDataAtGaussPts(const string field_name, vector< VectorDouble > &values_at_gauss_pts, vector< MatrixDouble > &gardient_at_gauss_pts)
PetscErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
operator calculating field data and gradients
PetscErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
OpUpdate(string field_name, CommonData &common_data)
MoFEM::Interface & mField
PetscErrorCode createInternalVariablesTag()