23 using namespace MoFEM;
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>
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
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
45 PetscFunctionReturn(0);
49 vector<VectorDouble > &values_at_gauss_pts,
50 vector<MatrixDouble > &gardient_at_gauss_pts
53 valuesAtGaussPts(values_at_gauss_pts),
54 gradientAtGaussPts(gardient_at_gauss_pts),
55 zeroAtType(MBVERTEX) {
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);
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);
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);
246 if(getHoGaussPtsDetJac().size()>0) {
247 val *= getHoGaussPtsDetJac()[gg];
251 ierr = addVolumetricB(diffN,volB,val); CHKERRQ(
ierr);
256 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
258 double val = getVolume()*getGaussPts()(3,gg);
259 if(getHoGaussPtsDetJac().size()>0) {
260 val *= getHoGaussPtsDetJac()[gg];
263 ierr = makeB(diffN,B); CHKERRQ(
ierr);
265 ierr = addVolumetricB(diffN,B,-1); CHKERRQ(
ierr);
282 indices_ptr = &data.getIndices()[0];
285 getFEMethod()->snes_f,
293 }
catch (
const std::exception& ex) {
295 ss <<
"throw in method: " << ex.what() << endl;
296 SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
299 PetscFunctionReturn(0);
312 int row_side,
int col_side,
313 EntityType row_type,EntityType col_type,
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);
325 K.resize(nb_dofs_row,nb_dofs_col,
false);
328 int nb_gauss_pts = row_data.getN().size1();
332 rowVolB.resize(6,nb_dofs_row,
false);
334 colVolB.resize(6,nb_dofs_col,
false);
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];
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);
351 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
353 double val = getVolume()*getGaussPts()(3,gg);
354 if(getHoGaussPtsDetJac().size()>0) {
355 val *= getHoGaussPtsDetJac()[gg];
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);
363 ierr = addVolumetricB(diffN_row,rowB,-1); CHKERRQ(
ierr);
364 ierr = addVolumetricB(diffN_col,colB,-1); CHKERRQ(
ierr);
369 CB.resize(6,nb_dofs_col,
false);
371 CblasRowMajor,CblasNoTrans,CblasNoTrans,
375 &colB(0,0),nb_dofs_col,
380 CblasRowMajor,CblasTrans,CblasNoTrans,
381 nb_dofs_row,nb_dofs_col,6,
383 &rowB(0,0),nb_dofs_row,
384 &CB(0,0),nb_dofs_col,
399 int *row_indices_ptr,*col_indices_ptr;
400 row_indices_ptr = &row_data.getIndices()[0];
401 col_indices_ptr = &col_data.getIndices()[0];
404 getFEMethod()->snes_B,
405 nb_dofs_row,row_indices_ptr,
406 nb_dofs_col,col_indices_ptr,
411 if(row_side != col_side || row_type != col_type) {
413 transK.resize(nb_dofs_col,nb_dofs_row,
false);
414 noalias(transK) = trans(
K);
416 getFEMethod()->snes_B,
417 nb_dofs_col,col_indices_ptr,
418 nb_dofs_row,row_indices_ptr,
419 &transK(0,0),ADD_VALUES
424 }
catch (
const std::exception& ex) {
426 ss <<
"throw in method: " << ex.what() << endl;
427 SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
429 PetscFunctionReturn(0);
441 PetscFunctionReturn(0);
445 const EntityHandle tet,
const int nb_gauss_pts,
const int nb_internal_variables
455 v.resize(6*nb_gauss_pts,
false);
458 tag_size[0] =
v.size();
459 void const* tag_data[] = { &
v[0] };
468 if(nb_internal_variables>0) {
473 v.resize(nb_internal_variables*nb_gauss_pts,
false);
476 tag_size[0] =
v.size();
477 void const* tag_data[] = { &
v[0] };
486 PetscFunctionReturn(0);
497 if(
type != MBVERTEX) PetscFunctionReturn(0);
499 int nb_dofs = data.getFieldData().size();
500 if(nb_dofs==0) PetscFunctionReturn(0);
502 int nb_gauss_pts = data.getN().size1();
503 int nb_internal_variables = cP.internalVariables.size();
507 EntityHandle tet = getNumeredEntFiniteElementPtr()->getEnt();
508 ierr = setTagsData(tet,nb_gauss_pts,nb_internal_variables); CHKERRQ(
ierr);
518 double ave_tr_strain = 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];
527 for(
int ii = 0;ii<3;ii++) {
536 for(
int gg = 0;gg<nb_gauss_pts;gg++) {
542 nb_internal_variables,
543 ublas::shallow_array_adaptor<double>(
548 cP.sTrain.resize(6,
false);
550 double tr_strain = 0;
551 for(
int ii = 0;ii<3;ii++) {
553 tr_strain += cP.sTrain[ii]/3;
556 for(
int ii = 0;ii<3;ii++) {
557 cP.sTrain[ii] += ave_tr_strain-tr_strain;
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;
590 ierr = cP.evaluatePotentials(); CHKERRQ(
ierr);
593 ierr = cP.setActiveVariablesW(); CHKERRQ(
ierr);
595 getFEMethod()->snes_ctx ==
596 SnesMethod::CTX_SNESSETJACOBIAN &&
597 (!isLinear || !hessianWCalculated)
600 hessianWCalculated =
true;
602 ierr = cP.pLayW_NoHessian(); CHKERRQ(
ierr);
604 ierr = cP.setActiveVariablesYH(); CHKERRQ(
ierr);
605 ierr = cP.pLayY_NoGradient(); CHKERRQ(
ierr);
616 ierr = cP.solveColasetProjection(); CHKERRQ(
ierr);
631 if(getFEMethod()->snes_ctx == SnesMethod::CTX_SNESSETJACOBIAN) {
633 ierr = SNESGetIterationNumber(getFEMethod()->snes,&iter); CHKERRQ(
ierr);
635 if(iter>0 && cP.deltaGamma>0) {
636 ierr = cP.consistentTangent(); CHKERRQ(
ierr);
643 if(getFEMethod()->snes_ctx == SnesMethod::CTX_SNESSETFUNCTION) {
645 ierr = SNESGetIterationNumber(getFEMethod()->snes,&iter); CHKERRQ(
ierr);
647 ierr = SNESSetLagJacobian(getFEMethod()->snes,1); CHKERRQ(
ierr);
656 }
catch (
const std::exception& ex) {
658 ss <<
"throw in method: " << ex.what() << endl;
659 SETERRQ(PETSC_COMM_SELF,1,ss.str().c_str());
662 PetscFunctionReturn(0);
667 activeVariablesW.resize(12+internalVariables.size(),
false);
668 for(
int ii = 0;ii<6;ii++) {
669 activeVariablesW[ii] = sTrain[ii];
671 for(
int ii = 0;ii<6;ii++) {
672 activeVariablesW[6+ii] = plasticStrain[ii];
674 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
675 activeVariablesW[12+ii] = internalVariables[ii];
677 PetscFunctionReturn(0);
682 activeVariablesYH.resize(6+internalVariables.size(),
false);
683 for(
int ii = 0;ii<6;ii++) {
684 activeVariablesYH[ii] = sTress[ii];
686 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
687 activeVariablesYH[6+ii] = internalFluxes[ii];
689 PetscFunctionReturn(0);
697 a_sTrain.resize(6,
false);
698 for(
int ii = 0;ii<6;ii++) {
699 a_sTrain[ii] <<= sTrain[ii];
701 a_plasticStrain.resize(6,
false);
702 for(
int ii = 0;ii<6;ii++) {
703 a_plasticStrain[ii] <<= plasticStrain[ii];
705 a_internalVariables.resize(internalVariables.size(),
false);
706 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
707 a_internalVariables[ii] <<= internalVariables[ii];
710 ierr = freeHemholtzEnergy(); CHKERRQ(
ierr);
715 PetscFunctionReturn(0);
723 a_sTress.resize(6,
false);
724 for(
int ii = 0;ii<6;ii++) {
725 a_sTress[ii] <<= sTress[ii];
727 a_internalFluxes.resize(internalVariables.size(),
false);
728 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
729 a_internalFluxes[ii] <<= internalFluxes[ii];
732 ierr = yieldFunction(); CHKERRQ(
ierr);
737 PetscFunctionReturn(0);
745 a_sTress.resize(6,
false);
746 for(
int ii = 0;ii<6;ii++) {
747 a_sTress[ii] <<= sTress[ii];
749 a_internalFluxes.resize(internalVariables.size(),
false);
750 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
751 a_internalFluxes[ii] <<= internalFluxes[ii];
754 ierr = flowPotential(); CHKERRQ(
ierr);
759 PetscFunctionReturn(0);
765 int adloc_return_value = 0;
766 r = ::function(tAgs[0],1,activeVariablesW.size(),&activeVariablesW[0],&
w);
767 if(
r<adloc_return_value) {
770 gradientW.resize(activeVariablesW.size(),
false);
771 r = gradient(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&gradientW[0]);
772 if(
r<adloc_return_value) {
775 hessianW.resize(activeVariablesW.size(),activeVariablesW.size(),
false);
777 vector<double*> hessian_w(activeVariablesW.size());
778 for(
unsigned int dd = 0;
dd<activeVariablesW.size();
dd++) {
779 hessian_w[
dd] = &hessianW(
dd,0);
781 r = hessian(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&hessian_w[0]);
782 if(
r<adloc_return_value) {
785 sTress =
VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientW[0]));
787 internalVariables.size(),
788 ublas::shallow_array_adaptor<double>(
789 internalVariables.size(),
794 for(
int ii = 0;ii<6;ii++) {
795 for(
int jj = 0;jj<=ii;jj++) {
796 C(ii,jj) = hessianW(ii,jj);
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);
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);
811 PetscFunctionReturn(0);
816 int adloc_return_value = 0;
817 r = ::function(tAgs[0],1,activeVariablesW.size(),&activeVariablesW[0],&
w);
818 if(
r<adloc_return_value) {
821 gradientW.resize(activeVariablesW.size(),
false);
822 r = gradient(tAgs[0],activeVariablesW.size(),&activeVariablesW[0],&gradientW[0]);
823 if(
r<adloc_return_value) {
826 sTress =
VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientW[0]));
828 internalVariables.size(),
829 ublas::shallow_array_adaptor<double>(
830 internalVariables.size(),
834 PetscFunctionReturn(0);
840 int adloc_return_value = 0;
841 r = ::function(tAgs[1],1,activeVariablesYH.size(),&activeVariablesYH[0],&y);
842 if(
r<adloc_return_value) {
845 gradientY.resize(activeVariablesYH.size());
846 r = gradient(tAgs[1],activeVariablesYH.size(),&activeVariablesYH[0],&gradientY[0]);
847 if(
r<adloc_return_value) {
850 partialYSigma =
VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientY[0]));
852 internalVariables.size(),
853 ublas::shallow_array_adaptor<double>(
854 internalVariables.size(),
858 PetscFunctionReturn(0);
863 int adloc_return_value = 0;
864 r = ::function(tAgs[1],1,activeVariablesYH.size(),&activeVariablesYH[0],&y);
865 if(
r<adloc_return_value) {
868 PetscFunctionReturn(0);
873 int adloc_return_value = 0;
874 r = ::function(tAgs[2],1,activeVariablesYH.size(),&activeVariablesYH[0],&
h);
875 if(
r<adloc_return_value) {
878 gradientH.resize(activeVariablesYH.size());
879 r = gradient(tAgs[2],activeVariablesYH.size(),&activeVariablesYH[0],&gradientH[0]);
880 if(
r<adloc_return_value) {
883 hessianH.resize(6+internalVariables.size(),6+internalVariables.size(),
false);
885 vector<double*> hessian_h(activeVariablesYH.size());
886 for(
int dd = 0;
dd<activeVariablesYH.size();
dd++) {
887 hessian_h[
dd] = &hessianH(
dd,0);
889 r = hessian(tAgs[2],activeVariablesYH.size(),&activeVariablesYH[0],&hessian_h[0]);
890 if(
r<adloc_return_value) {
893 partialHSigma =
VectorAdaptor(6,ublas::shallow_array_adaptor<double>(6,&gradientH[0]));
895 internalVariables.size(),
896 ublas::shallow_array_adaptor<double>(
897 internalVariables.size(),
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);
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);
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);
921 PetscFunctionReturn(0);
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);
940 ierr = VecDestroy(&Chi); CHKERRQ(
ierr);
941 ierr = VecDestroy(&dChi); CHKERRQ(
ierr);
942 PetscFunctionReturn(0);
950 ierr = setActiveVariablesW(); CHKERRQ(
ierr);
956 ierr = setActiveVariablesYH(); CHKERRQ(
ierr);
959 PetscFunctionReturn(0);
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];
970 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
971 array[6+ii] = -internalVariables[ii] + internalVariables0[ii] + deltaGamma*partialHFlux[ii];
973 array[6+internalVariables.size()] = y;
974 ierr = VecRestoreArray(
R,&array); CHKERRQ(
ierr);
975 PetscFunctionReturn(0);
983 MatrixDouble a00 = prod(partial2HSigma,partialWStrainPlasticStrain);
985 for(
int ii = 0;ii<6;ii++) {
986 for(
int jj = 0;jj<6;jj++) {
987 dataA(ii,jj) = deltaGamma*a00(ii,jj);
989 for(
unsigned int jj = 0;jj<internalVariables.size();jj++) {
990 dataA(ii,6+jj) = deltaGamma*a01(ii,jj);
994 for(
int ii = 0;ii<6;ii++) {
995 dataA(ii,6+internalVariables.size()) = partialHSigma[ii];
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);
1004 for(
unsigned int jj = 0;jj<internalVariables.size();jj++) {
1005 dataA(6+ii,6+jj) += deltaGamma*a11(ii,jj);
1007 dataA(6+ii,6+ii) -= 1;
1009 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
1010 dataA(6+ii,6+internalVariables.size()) = partialHFlux[ii];
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];
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];
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);
1029 ierr = SNESCreate(PETSC_COMM_SELF,&sNes); 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);
1039 ierr = SNESLineSearchSetType(lineSearch,SNESLINESEARCHBT); CHKERRQ(
ierr);
1041 PetscFunctionReturn(0);
1046 ierr = SNESDestroy(&sNes); CHKERRQ(
ierr);
1047 PetscFunctionReturn(0);
1054 ierr = VecGetArray(Chi,&array); CHKERRQ(
ierr);
1055 for(
int ii = 0;ii<6;ii++) {
1056 array[ii] = plasticStrain[ii];
1058 int nb_internal_variables = internalVariables.size();
1059 for(
unsigned int ii = 0;ii<nb_internal_variables;ii++) {
1060 array[6+ii] = internalVariables[ii];
1063 ierr = VecRestoreArray(Chi,&array); CHKERRQ(
ierr);
1065 ierr = SNESSolve(sNes,PETSC_NULL,Chi); CHKERRQ(
ierr);
1066 SNESConvergedReason reason;
1067 ierr = SNESGetConvergedReason(sNes,&reason); CHKERRQ(
ierr);
1070 ierr = SNESGetIterationNumber(sNes,&its); CHKERRQ(
ierr);
1076 noalias(plasticStrain) = plasticStrain0;
1077 noalias(internalVariables) = internalVariables0;
1081 ierr = VecGetArray(Chi,&array); CHKERRQ(
ierr);
1082 for(
int ii = 0;ii<6;ii++) {
1083 plasticStrain[ii] = array[ii];
1085 int nb_internal_variables = internalVariables.size();
1086 for(
unsigned int ii = 0;ii<nb_internal_variables;ii++) {
1087 internalVariables[ii] = array[6+ii];
1089 deltaGamma = array[6+nb_internal_variables];
1090 ierr = VecRestoreArray(Chi,&array); CHKERRQ(
ierr);
1092 PetscFunctionReturn(0);
1097 ierr = evaluatePotentials(); CHKERRQ(
ierr);
1098 ierr = cAlculateA(); CHKERRQ(
ierr);
1099 Ep.resize(6,6,
false);
1100 Lp.resize(internalVariables.size(),6,
false);
1103 ep_row = deltaGamma*prod(partial2HSigma,C);
1105 alpha_row = deltaGamma*prod(trans(partial2HSigmaFlux),C);
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);
1112 ierr = VecGetArray(
R,&array); CHKERRQ(
ierr);
1114 for(
int ii = 0;ii<6;ii++) {
1115 array[ii] = ep_row(ii,
dd);
1117 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
1118 array[6+ii] = alpha_row(ii,
dd);
1120 array[
n] = y_row[
dd];
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);
1128 for(
int ii = 0;ii<6;ii++) {
1129 Ep(ii,
dd) = array[ii];
1131 for(
unsigned int ii = 0;ii<internalVariables.size();ii++) {
1132 Lp(ii,
dd) = array[6+ii];
1136 ierr = VecRestoreArray(dChi,&array); CHKERRQ(
ierr);
1138 Cp.resize(6,6,
false);
1139 noalias(Cp) = prod(C,Ep);
1140 Cep.resize(6,6,
false);
1141 noalias(Cep) = C+Cp;
1150 PetscFunctionReturn(0);
1161 #if PETSC_VERSION_GE(3,6,0)
1162 const double *array;
1163 ierr = VecGetArrayRead(chi,&array); CHKERRQ(
ierr);
1165 const double *array;
1166 ierr = VecGetArray(chi,&array); CHKERRQ(
ierr);
1168 for(
int ii = 0;ii<6;ii++) {
1175 #if PETSC_VERSION_GE(3,6,0)
1176 ierr = VecRestoreArrayRead(chi,&array); CHKERRQ(
ierr);
1178 ierr = VecRestoreArray(chi,&array); CHKERRQ(
ierr);
1204 PetscFunctionReturn(0);
1213 #if PETSC_VERSION_GE(3,6,0)
1214 const double *array;
1215 ierr = VecGetArrayRead(chi,&array); CHKERRQ(
ierr);
1218 ierr = VecGetArray(chi,&array); CHKERRQ(
ierr);
1220 for(
int ii = 0;ii<6;ii++) {
1227 #if PETSC_VERSION_GE(3,6,0)
1228 ierr = VecRestoreArrayRead(chi,&array); CHKERRQ(
ierr);
1230 ierr = VecRestoreArray(chi,&array); CHKERRQ(
ierr);
1235 PetscFunctionReturn(0);